Форум программистов, компьютерный форум CyberForum.ru

Небольшое тестовое задание в финской компании. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Маленькая задачка. http://www.cyberforum.ru/cpp-beginners/thread351869.html
Дано действительное число h. Выяснить, имеет ли уравнение ax2 + bx + c = 0 действительные корни, если a=sqrt((abs(sin(8*h))+17)/(pow((1-sin(4*h)*cos(h*h)+(18*18)),2))) b=1-sqrt(3/3+abs(tan(a*(pow(h,2)))-sin(a*h))) c=a*pow(h,2)*sin(b*h)+b*(h*h*h)*cos(a*h) Если действительные корни существуют, то найти их. В противном случае ответом должно служить сообщение, что действительных корней нет.
C++ Потоки Пытаюсь создать поток #include<windows.h> #include<iostream> #include <stdio.h> #include <process.h> #include <fstream> using namespace std; WIN32_FIND_DATAA FindFileData;//структура файла FILE *stream; http://www.cyberforum.ru/cpp-beginners/thread351846.html
Задачи по С++ C++
Здравствуйте уважаемые форумчане. Необходимо решить три задачи, нарисовать алгоритм в виде блок схемы и комментарии написать, в общем, всё по порядку: Задача № 1 Определить, встречается ли введённая цифра среди первых трёх цифр дробной части заданного вещественного числа. Задача № 2 Составить алгоритм и программу вычисления выражения http://s54.***********/i146/1109/d2/c954bc6d9df7.png ...
C++ Методом Гаусса решить систему n линейных алгебраических уравнений
Помогите пожалуйста написать на с++ методом Гаусса решить систему n линейных алгебраических уравнений. Отсюда нашла именно ту тему там есть один код, он у меня нормально выходит. Только проблема в том что не могу разобрать код. помогите разобрать?! #include <iostream> #include <iomanip> void swap(double &a, double &b) { double temp = a; a = b; b = temp; }
C++ Какой учебник посоветуете мнедля изучения c++. http://www.cyberforum.ru/cpp-beginners/thread351802.html
Здравствуйте я новичек на этом форуме и вообще в c++. Какой учебник посоветуете мнедля изучения c++. (Я скачал wxdevcpp_7.3.1 )
C++ Время работы программы (алгоритма) не получается посчитать время работы алгоритма программы! #include <iostream> using std::cout; using std::cin; using std::endl; #include <cstdlib> using std::rand; using std::srand; подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4947 / 3023 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.09.2011, 19:04     Небольшое тестовое задание в финской компании.
Какие символы следует экранировать? Понятно, что \n - перевод строки, \t - табуляция. Ну и служебные символы надо экранировать. А вот экранировать, скажем, \ или " я не вижу смысла, эти символы и так будут восприняты парсером как обычные.

Добавлено через 1 минуту
А, не, \ тоже надо экранировать, естественно. А остальное, мне кажется, нет смысла.

Добавлено через 2 часа 56 минут
Эх, написал... но код меня что-то совсем не радует... Какой-то он незрелый, что-ли, получился...

service_functions.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifndef SERVICE_FUNCTIONS_H
#define SERVICE_FUNCTIONS_H
 
#include <stdio.h>
#include <stdlib.h>
 
typedef char char_t;
typedef char_t * str_t;
 
#define false 0
#define true !0
 
void error(str_t msg);
 
void *allocate(size_t size);
void *reallocate(void *mem, size_t size);
void deallocate(void *mem);
 
str_t get_str(FILE *stream);
 
int str_to_int(str_t number, size_t radix);
 
size_t str_len(str_t str);
int str_cmp(str_t str1, str_t str2);
str_t str_n_cpy(str_t dest, str_t src, size_t n);
str_t str_cpy(str_t dest, str_t src);
str_t str_chr(str_t str, char_t ch);
str_t str_str(str_t where_str, str_t what_str);
void str_replace(str_t *str, str_t dest, str_t src);
 
#endif
service_functions.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#include "service_functions.h"
 
void error(str_t msg)
{
    fprintf(stderr, "%s", msg);
 
    exit(-1);
}
 
void *allocate(size_t size)
{
    void *mem = malloc(size);
 
    if (mem == NULL)
        error("Memory allocate error!\n");
 
    return mem;
}
 
void *reallocate(void *mem, size_t size)
{
    void *new_mem = realloc(mem, size);
 
    if (new_mem == NULL)
        error("Memory reallocate error!\n");
 
    return mem;
}
 
void deallocate(void *mem)
{
    free(mem);
}
 
str_t get_str(FILE *stream)
{
#define QUANTUM 32
 
    str_t str = (str_t)allocate(QUANTUM * sizeof(char_t));
 
    size_t multiplier = 1;
 
    size_t i = 0;
 
    while (true)
    {
        if (i >= multiplier * QUANTUM)
            str = (str_t)reallocate(str, ++multiplier * QUANTUM * sizeof(char_t));
 
        fread(str + i++, sizeof(char_t), 1, stream);
 
        if (str[i - 1] == '\n')
        {
            str[i - 1] = '\0';
 
            break;
        }
    }
 
    return str;
 
#undef QUANTUM
}
 
int str_to_int(str_t num, size_t radix)
{
    int result = 0;
    size_t len = str_len(num);
 
    size_t i;
 
    for (i = 0; i < len; ++i)
    {
        if (num[i] >= '0' && num[i] <= '9')
            result = result * radix + (num[i] - '0');
        else
            result = result * radix + (num[i] + 10 - 'A');
    }
 
    return result;
}
 
size_t str_len(str_t str)
{
    size_t len = 0;
 
    while (*str++ != '\0')
        ++len;
 
    return len;
}
 
int str_cmp(str_t str1, str_t str2)
{
    size_t len1 = str_len(str1);
    size_t len2 = str_len(str2);
 
    size_t i;
 
    if (len1 != len2)
        return len1 < len2 ? -1 : 1;
 
    for (i = 0; i < len1; ++i)
    {
        if (str1[i] < str2[i])
        {
            return -1;
        }
        else
        {
            if (str1[i] > str2[i])
                return 1;
        }
    }
 
    return 0;
}
 
str_t str_n_cpy(str_t dest, str_t src, size_t n)
{
    size_t i;
 
    for (i = 0; i < n; ++i)
        dest[i] = src[i];
 
    return dest;
}
 
str_t str_cpy(str_t dest, str_t src)
{
    size_t src_len = str_len(src);
 
    dest[src_len] = '\0';
 
    return str_n_cpy(dest, src, src_len);
}
 
str_t str_chr(str_t str, char_t ch)
{
    while (*str != '\0')
        if (*str++ == ch)
            return str - 1;
 
    return NULL;
}
 
str_t str_str(str_t where_str, str_t what_str)
{
    int key;
 
    size_t i;
 
    while (*where_str != '\0')
    {
        key = 1;
 
        for (i = 0; what_str[i] != '\0'; ++i)
        {
            if (where_str[i] != what_str[i])
            {
                key = -1;
 
                break;
            }
        }
 
        if (key == 1)
            return where_str;
 
        ++where_str;
    }
 
    return NULL;
}
 
void str_replace(str_t *str, str_t dest, str_t src)
{
    str_t substr = str_str(*str, dest);
    size_t substr_pos = substr - *str;
 
    size_t old_len = str_len(*str);
    size_t dest_len = str_len(dest);
    size_t src_len = str_len(src);
    
    str_t new_str;
    size_t new_len = old_len + src_len - dest_len + 1;
 
    if (substr == NULL)
        return;
 
    new_str = (str_t)allocate(new_len * sizeof(char_t));
 
    str_n_cpy(new_str, *str, substr_pos);
    str_n_cpy(new_str + substr_pos, src, src_len);
    str_n_cpy(new_str + substr_pos + src_len, *str + substr_pos + dest_len, old_len - substr_pos - dest_len);
 
    new_str[new_len - 1] = '\0';
 
    deallocate(*str);
 
    *str = new_str;
}
var.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef VAR_H
#define VAR_H
 
#include "service_functions.h"
 
#define BUF_SIZE 32
 
typedef struct
{
    char_t name[BUF_SIZE];
    char_t value[BUF_SIZE];
} var_t;
 
extern var_t vars[];
static size_t vars_top = 0;
 
size_t search_var(str_t name);
size_t add_var(str_t name, str_t value);
 
#endif
var.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "var.h"
 
size_t search_var(str_t name)
{
    size_t i;
 
    for (i = 0; i < vars_top; ++i)
        if (str_cmp(name, vars[i].name) == 0)
            return i;
 
    return -1;
}
 
size_t add_var(str_t name, str_t value)
{
    if (search_var(name) == -1)
    {
        str_cpy(vars[vars_top].name, name);
        str_cpy(vars[vars_top].value, value);
    }
 
    return vars_top++;
}
interpreter.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef INTERPRETER_H
#define INTERPRETER_H
 
#include <stdio.h>
#include <stdlib.h>
 
#include "service_functions.h"
#include "var.h"
 
extern var_t vars[BUF_SIZE * 2];
 
int check_brackets(str_t src_code);
void var_sub(str_t *src_code, FILE *input);
void parse(str_t src_code, FILE *output, FILE *err);
 
void interpret(str_t src_code, FILE *input, FILE *output, FILE *err);
 
#endif
interpreter.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
#include "interpreter.h"
 
var_t vars[BUF_SIZE * 2];
 
int check_brackets(str_t src_code)
{
    size_t src_len = str_len(src_code);
 
    str_t stack = (str_t)allocate(src_len * sizeof(char_t));
    size_t top = 0;
 
    size_t i;
 
    for (i = 0; i < src_len; ++i)
    {
        switch (src_code[i])
        {
        case '[':
        case '{':
        case '(':
            stack[top++] = src_code[i];
 
            break;
 
        case ']':
            if (stack[--top] != '[')
            {
                deallocate(stack);
 
                return -1;
            }
 
            break;
 
        case '}':
            if (stack[--top] != '{')
            {
                deallocate(stack);
 
                return -1;
            }
 
            break;
 
        case ')':
            if (stack[--top] != '(')
            {
                deallocate(stack);
 
                return -1;
            }
 
            break;
        }
    }
 
    deallocate(stack);
 
    if (top != 0)
        return -1;
 
    return 0;
}
 
void var_sub(str_t *src_code, FILE *input)
{
    str_t var_start_pos, var_end_pos;
 
    char_t var_name[BUF_SIZE];
    char_t var_value[BUF_SIZE];
    size_t var_index;
 
    size_t i;
 
    for (i = 0; i < str_len(*src_code); ++i)
    {
        var_start_pos = str_str(*src_code + i, "$(");
        var_end_pos = str_chr(*src_code + i, ')');
 
        if (var_start_pos == NULL || var_end_pos == NULL)
            break;
 
        if (var_start_pos != *src_code && *(var_start_pos - 1) == '\\')
        {
            i = var_start_pos - *src_code + 1;
 
            continue;
        }
 
        str_n_cpy(var_name, var_start_pos, var_end_pos - var_start_pos + 1);
 
        var_name[var_end_pos - var_start_pos + 1] = '\0';
 
        if ((var_index = search_var(var_name)) == -1)
        {
            if (input == stdin)
                printf("%s = ", var_name);
 
            str_cpy(var_value, get_str(input));
 
            var_index = add_var(var_name, var_value);
        }
        else
        {
            str_cpy(var_value, vars[var_index].value);
        }
 
        str_replace(src_code, var_name, vars[var_index].value);
    }
}
 
void parse(str_t src_code, FILE *output, FILE *err)
{
    size_t src_len = str_len(src_code);
 
    str_t block;
    size_t block_size;
    
    char_t num[BUF_SIZE];
 
    int level;
    
    size_t loop_count;
 
    char_t ch;
 
    size_t i, j;
 
    for (i = 0; i < src_len; ++i)
    {
        if (src_code[i] == '[')
        {
            for (j = i + 1, level = 1; level != 0; ++j)
            {
                if (src_code[j] == '[')
                {
                    ++level;
                }
                else
                {
                    if (src_code[j] == ']')
                        --level;
                }
            }
 
            block_size = j - i - 1;
 
            block = (str_t)allocate(block_size * sizeof(char_t));
 
            str_n_cpy(block, src_code + i + 1, block_size - 1);
 
            block[block_size - 1] = '\0';
 
            loop_count = 1;
 
            i = j;
 
            if (src_code[i] == '{')
            {
                j = str_chr(src_code + i + 1, '}') - src_code;
 
                if (i == j - 1)
                {
                    fprintf(err, "Syntax error!\n");
 
                    exit(-1);
                }
 
                str_n_cpy(num, src_code + i + 1, j - i - 1);
 
                num[j - i - 1] = '\0';
 
                loop_count = str_to_int(num, 10);
            }
 
            i = j;
 
            for (j = 0; j < loop_count; ++j)
                parse(block, output, err);
 
            deallocate(block);
        }
        else
        {
            if (src_code[i] == ']')
                continue;
            
            if (src_code[i] == '{' || src_code[i] == '}')
            {
                fprintf(err, "Syntax error!\n");
 
                exit(-1);
            }
 
            if (src_code[i] == '\\')
            {
                switch (src_code[i + 1])
                {
                case 't':
                    ch = '\t';
 
                    break;
 
                case 'n':
                    ch = '\n';
 
                    break;
 
                case '\\':
                    ch = '\\';
 
                    break;
 
                case 'x':
                    str_n_cpy(num, src_code + i + 2, 4);
 
                    num[4] = '\0';
 
                    ch = (char_t)str_to_int(num, 16);
 
                    i += 4;
 
                    break;
 
                default:
                    ch = src_code[i + 1];
 
                    break;
                }
 
                i += 2;
            }
            else
            {
                ch = src_code[i++];
            }
 
            loop_count = 1;
 
            if (src_code[i] == '{')
            {
                j = str_chr(src_code + i + 1, '}') - src_code;
 
                if (i == j - 1)
                {
                    fprintf(err, "Syntax error!\n");
 
                    exit(-1);
                }
 
                str_n_cpy(num, src_code + i + 1, j - i - 1);
 
                num[j - i - 1] = '\0';
 
                loop_count = str_to_int(num, 10);
 
                i = j + 1;
            }
 
            for (j = 0; j < loop_count; ++j)
                fprintf(output, "%c", ch);
 
            --i;
        }
    }
}
 
void interpret(str_t src_code, FILE *input, FILE *output, FILE *err)
{
    size_t src_len = str_len(src_code);
    str_t src_copy = (str_t)allocate((src_len + 1) * sizeof(char_t));
 
    str_cpy(src_copy, src_code);
 
    if (check_brackets(src_copy) != 0)
    {
        printf("Brackets is unbalanced!\n");
 
        deallocate(src_copy);
 
        exit(-1);
    }
    else
    {
        var_sub(&src_copy, input);
        parse(src_copy, output, err);
    }
 
    printf("\n");
 
    deallocate(src_copy);
}
main.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
#include "service_functions.h"
#include "var.h"
#include "interpreter.h"
 
int main(void)
{
    str_t code = get_str(stdin);
 
    interpret(code, stdin, stdout, stderr);
 
    return 0;
}
 
Текущее время: 04:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru