Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
1

Написать программу реализующую проверку функции с помощью юнит-тестов

24.04.2011, 17:14. Просмотров 845. Ответов 5
Метки нет (Все метки)


Здравствуйте. У меня есть проблема. По программированию задали такую задачу. Написать программу реализующую проверку функции с помощью юнит-тестов, и если функция некорректна то найти ошибку и исправить. Даны были две функции. Я написал к ним юнит-тесты, в одной функции через трассировку нашел проблему. Исправил. А вот во второй не могу понять, где значение начинает вычисляться неправильно. Помогите пожалуйста.

Вот основной код с юнит-тестами и заголовками функций:
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
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
#include "stdafx.h"
#include "testing.h"
#include "for_unit_test.h"
#include "04_first_func.h"
#include "04_add_func.h"
#include "04_second_func.h"
 
#define MAX_SIZE 10
 
/*!
* Найти элементы пересечения двух матриц
* \param [in] matr1 - первая матрица
* \param [in] height1, width1 - ширина и высота первой матрицы [1, MAX_SIZE]
* \param [in] matr2 - вторая матрица
* \param [in] height2, width2 -  ширина и высота второй матрицы [1, MAX_SIZE]
* \param [out] intersection - массив, содержащий элементы множества пересечения двух матриц
* \return - размер массива intersection
*/
 
void unit_tests_intersectionOfMatrix_1()
{
     puts("Тестирование функции intersectionOfMatrix ..."); 
     // Кол-во тестов
     const int test_count = 12; 
     // Названия тестов (длиной не более 100 символов)
     char test_name[test_count][101] = 
     {  "Матрицы 3 на 3 и матрица 3 на 3. Все элементы",
        "Матрицы 3 на 3 и матрица 3 на 3. Несколько элементов",
        "Матрицы 3 на 3 и матрица 3 на 3. 1 элемент",
        "Матрицы MAX_SIZE на 1 и MAX_SIZE на 1. Один элемент",
        "Матрицы MAX_SIZE на 1 и MAX_SIZE на 1. Несколько элементов",
        "Матрицы MAX_SIZE на 1 и MAX_SIZE на 1. Нет элементов",
        "Матрицы 1 на MAX_SIZE и 1 на MAX_SIZE. Один элемент",
        "Матрицы 1 на MAX_SIZE и 1 на MAX_SIZE. Несколько элементов",
        "Матрицы 1 на MAX_SIZE и 1 на MAX_SIZE. Нет элементов",
        "Матрицы 1 на 1 и 1 на 1. Есть элементы",
        "Матрицы 1 на 1 и 1 на 1. Нет элементов",
                
     }; 
     // Входные данные для тестирования
     int input_height1[test_count] = { 3, 3, 3, MAX_SIZE, MAX_SIZE, MAX_SIZE, 1, 1, 1, 1, 1 };
         int input_width1[test_count] = { 3, 3, 3, 1, 1, 1, MAX_SIZE, MAX_SIZE, MAX_SIZE, 1, 1 };
         int input_height2[test_count] = { 3, 3, 3, MAX_SIZE, MAX_SIZE, MAX_SIZE, 1, 1, 1, 1, 1 };
         int input_width2[test_count] = { 3, 3, 3, 1, 1, 1, MAX_SIZE, MAX_SIZE, MAX_SIZE, 1, 1 };
         const int input_matr1[test_count][MAX_SIZE][MAX_SIZE] = 
         {
             {
         {2,2,2},
         {2,2,2},
         {2,2,2}
             },
             {
                 {2,1,5},
                 {3,4,1},
                 {2,8,6}
             },
             {
                 {2,1,7},
                 {3,8,1},
                 {9,4,6}
             },
             {
                 {2},
                 {3},
                 {9},
                 {5},
                 {6},
                 {7},
                 {9},
                 {5},
                 {1},
                 {3}
             },
             {
                 {1},
                 {3},
                 {3},
                 {4},
                 {6},
                 {7},
                 {9},
                 {5},
                 {1},
                 {2}
             },
             {
                 {7},
                 {8},
                 {9},
                 {4},
                 {6},
                 {7},
                 {9},
                 {5},
                 {4},
                 {3}
             },
             {
                 {7,3,4,5,6,5,4,9,3,2}
             },
             {
                 {8,2,2,5,1,5,4,9,3,1}
             },
             {
                 {3,4,1,6,7,3,2,3,5,1}
             },
             {
                 {3}
             },
             {
                 {8}
             },
     }; 
    const int input_matr2[test_count][MAX_SIZE][MAX_SIZE] = 
         {
             {
         {2,2,2},
         {2,2,2},
         {2,2,2}
             },
             {
                 {2,7,3},
                 {6,4,2},
                 {4,8,1}
             },
             {
                 {3,2,1},
                 {4,5,6},
                 {8,7,9}
             },
             {
                 {3},
                 {3},
                 {4},
                 {6},
                 {8},
                 {9},
                 {4},
                 {3},
                 {2},
                 {1}
             },
             {
                 {1},
                 {5},
                 {3},
                 {6},
                 {7},
                 {78},
                 {98},
                 {53},
                 {2},
                 {1}
             },
             {
                 {6},
                 {9},
                 {55},
                 {45},
                 {65},
                 {75},
                 {95},
                 {55},
                 {45},
                 {35}
             },
             {
                 {75,35,45,57,68,59,42,94,31,2}
             },
             {
                 {8,22,32,45,1,75,94,9,43,12}
             },
             {
                 {22,44,78,8,9,53,22,33,45,10}
             },
             {
                 {3}
             },
             {
                 {7}
             },
     }; 
          // Ожидаемые выходные данные
     int output_intersection[test_count][100] =  
     {
         {2,2,2,2,2,2,2,2,2},
         {2,4,8},
         {},
         {3},
         {1,3},
         {},
         {2},
         {8,1,9,12},
         {},
         {3},
         {}
     }; 
     int expect_result[test_count] =  
     {
         9,
         3,
         0,
         1,
         2,
         0,
         1,
         4,
         0,
         1,
         0
     }; 
         // Собственно тестирование
         int real_result;
         int is_Ok = 1;
         for(int i = 0 ; i < test_count; i++)
         {
         // ВЫЗЫВАЕМ ТЕСТИРУЕМУЮ ФУНКЦИЮ
             real_result=intersectionOfMatrix_1(input_matr1[i], input_height1[i], input_width1[i], input_matr2 [i],input_height2[i],input_width2[i],output_intersection[i] );
             if(real_result!=expect_result[i]) // тест не пройден
             {
                 is_Ok = 0;
                 // Печатаем неудачный тест ...
                 // ...разделитель
                 puts("\n----------------------------------------------------------------");
                 // ...номер и название
                 printf("%d %s\n", i+1, test_name[i]);
                 printf("Expected result: %d\nReal result: %d", expect_result[i], real_result);
             }
            }
 
     // общие результаты тестирования
            puts("\n----------------------------------------------------------------");
            if(is_Ok)  
            { 
                puts("\nfunction correct");
            }
            else       
            { 
                puts("\nfunction incorrect");
            }
}
 
 
 
/*!
* Тестируем функцию  amountOfValueInMatrix
*/
void unit_tests_amountOfValueInMatrix(void);
 
/*!
* Найти количество элементов равных заданному значению в матрице 
* \param [in] value - искомое значение
* \param [in] matr - матрица элементов
* \param [in] height, width - размеры матрицы [1, MAX_SIZE]
* \return - количество элементов раных значению value в матрице matr
*/
 
int _tmain(int argc, _TCHAR* argv[])
{
     TESTING 
     unit_tests_amountOfValueInMatrix();
     unit_tests_intersectionOfMatrix_1();
     WAIT_ANY_KEY
     return 0;
}
 
 
void unit_tests_amountOfValueInMatrix()
{
     puts("Тестирование функции amountOfValueInMatrix ..."); 
     // Кол-во тестов
     const int test_count = 11; 
     // Названия тестов (длиной не более 100 символов)
     char test_name[test_count][101] = 
     {   "Матрица 3 на 3. Несколько элементов",
         "Матрица 3 на 3. Один элемент",
         "Матрица 3 на 3. Нет искомых значений",
         "Матрица MAX_SIZE на 1. Один элемент",
                 "Матрица MAX_SIZE на 1. Несколько элементов",
                 "Матрица MAX_SIZE на 1. Нет элементов",
                 "Матрица 1 на MAX_SIZE. Один элемент",
                 "Матрица 1 на MAX_SIZE. Несколько элементов",
                 "Матрица 1 на MAX_SIZE. Нет элементов",
                 "Матрица 1 на 1. Есть элементы",
                 "Матрица 1 на 1. Нет элементов"
     }; 
     // Входные данные для тестирования
     int input_height[test_count] = { 3, 3, 3, MAX_SIZE, MAX_SIZE, MAX_SIZE, 1, 1, 1, 1, 1 };
         int input_width[test_count] = { 3, 3, 3, 1, 1, 1, MAX_SIZE, MAX_SIZE, MAX_SIZE, 1, 1 };
         int input_value[test_count] = {2, 3, 5, 2, 3, 1, 6, 2, 8, 3, 6};
         const int input_matr[test_count][MAX_SIZE][MAX_SIZE] = 
         {
             {
         {2,3,4},
         {5,6,1},
         {3,2,4}
             },
             {
                 {2,1,5},
                 {3,4,1},
                 {2,4,6}
             },
             {
                 {2,1,7},
                 {3,8,1},
                 {9,4,6}
             },
             {
                 {2},
                 {3},
                 {9},
                 {5},
                 {6},
                 {7},
                 {9},
                 {5},
                 {1},
                 {3}
             },
             {
                 {1},
                 {3},
                 {3},
                 {4},
                 {6},
                 {7},
                 {9},
                 {5},
                 {1},
                 {2}
             },
             {
                 {7},
                 {8},
                 {9},
                 {4},
                 {6},
                 {7},
                 {9},
                 {5},
                 {4},
                 {3}
             },
             {
                 {7,3,4,5,6,5,4,9,3,2}
             },
             {
                 {8,2,2,5,1,5,4,9,3,1}
             },
             {
                 {3,4,1,6,7,3,2,3,5,1}
             },
             {
                 {3}
             },
             {
                 {8}
             },
     }; 
          // Ожидаемые выходные данные
     int expect_result[test_count] =  
     {
         2,
         1,
         0,
         1,
                 2,
                 0,
                 1,
                 2,
                 0,
                 1,
                 0
     }; 
         // Собственно тестирование
         int real_result;
         int is_Ok = 1;
         for(int i = 0 ; i < test_count; i++)
         {
         // ВЫЗЫВАЕМ ТЕСТИРУЕМУЮ ФУНКЦИЮ
             real_result=amountOfValueInMatrix_4(input_value[i], input_matr[i], input_height[i], input_width[i]);
             if(real_result!=expect_result[i]) // тест не пройден
             {
                 is_Ok = 0;
                 // Печатаем неудачный тест ...
                 // ...разделитель
                 puts("\n----------------------------------------------------------------");
                 // ...номер и название
                 printf("%d %s\n", i+1, test_name[i]);
                 printf("Expected result: %d\nReal result: %d", expect_result[i], real_result);
             }
            }
 
     // общие результаты тестирования
            puts("\n----------------------------------------------------------------");
            if(is_Ok)  
            { 
                puts("\nfunction correct\n");
            }
            else       
            { 
                puts("\nfunction incorrect\n\n\n");
            }
}
Вот первая функция (уже отлаженная - работает):
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
#include "stdafx.h"
#include "04_first_func.h"
 
/*!
* Найти количество искомых значений в одномерном массиве
* \param [in] value - искомое значение
* \param [in] arr - массив, в котором считается количество элементов с заданным значением
* \param [in] size - размер массива [1, MAX_SIZE]
* \return - количество элементов в массиве arr равных значению value 
*/
int amountOfValueInArray_4( int value, const int arr[ MAX_SIZE ], int size )
{
    int amountOfValue = 0;    // счётчик элементов в массиве равных искомому значению
 
    // Найти количество элементов в массиве arr, равных value
    for ( int i = 0; i < size; i++ )
    {
        if ( arr [ i ] == value )
        {
            amountOfValue++;            
        }
    }
 
    return amountOfValue;
}
 
int amountOfValueInMatrix_4( int value, const int matr[MAX_SIZE][MAX_SIZE], int height, int width )
{                             
    int amountOfValue = 0;    // Количество элементов в матрице равных искомому
    int amountOfValueInRow;   // Количество элементов в одном ряде матрицы равных искомому
    
    // Для каждого ряда матрицы
    for ( int i = 0; i < height; i++ )
    {
        // Найти количество искомых значений в ряде...
        amountOfValueInRow = amountOfValueInArray_4( value, matr [ i ], width );
 
        // ...добавить их к общему количеству значений в матрице
        amountOfValue += amountOfValueInRow; 
    }
 
    return amountOfValue;
}
А вот вторая, которую я не могу починить (в ней еще была синтаксическая ошибка, функция не возвращала значение, это я поправил):
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
int intersectionOfMatrix_1( const int matr1 [MAX_SIZE][MAX_SIZE], int height1, int width1, const int matr2 [MAX_SIZE][MAX_SIZE], int height2, int width2, int intersection[MAX_SIZE] )
{
    int size = 0;              // Размер массива intersection
    int amountElementInMatr2;  // Количество встречи элемента из первой матрице во второй
 
    // Для каждого элемента из первой матрицы
    for ( int i = 0; i < height1; i++ )
    {
        for ( int j = 0; j < width1; j++ )
        {
 
            amountElementInMatr2 = amountOfValueInMatrix_4( matr1 [i][j], matr1, height2, width2);
 
            // Если элемент из первой матрицы встречается во второй и
            // его количество во второй матрице больше чем в массиве пересечений intersection 
            if( amountElementInMatr2 && amountOfValueInArray_4( matr1 [i][j], intersection, size ) < amountElementInMatr2 )
            {  
                // Добавить элемент из первой матрицы в массив пересечения intersection
                intersection [ size ] = matr1 [i][j];
                size++;
            }
        }
    }
    return size;
}
По моим юнит-тестам можно увидеть на каких входных данных она косячит.

К теме прикрепил архив, со всеми нужными файлами для компиляции программы, их сунуть просто в корневую программы. А 04_first_func.dll надо сунуть в Debug.
Hepl me

Очень надеюсь что откликнитесь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2011, 17:14
Ответы с готовыми решениями:

Написать программу реализующую проверку кодов Хемминга
Написать программу реализующую проверку кодов Хемминга, данные задаются рандомом или с клавиатуры....

Написать программу, реализующую следующие функции работы с массивом строк (путем ввода соответствующих команд в консоли)
Помогите с решением на C#: 1. Создание строки и добавление её строки в массив на заданную...

Написать программу для вычисления выражения с помощью рекурсивной функции
Помогите написать программу C++ для вычисления выражения an. Вычисление организовать в виде...

Как написать проверку портов с помощью PortChecker?
Не подскажите как написать проверку портов?

__________________
Помогаю в написании курсовых работ и дипломов здесь.
5
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
24.04.2011, 17:21  [ТС] 2
Вот файлы для компиляции. Что куда засунуть я выше написал
0
Вложения
Тип файла: rar 04_first_func.rar (56.3 Кб, 9 просмотров)
Тип файла: rar Остальные хедеры.rar (2.03 Мб, 17 просмотров)
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
25.04.2011, 10:29  [ТС] 3
Ап
0
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
25.04.2011, 12:18 4
Нажимаешь F5 и в отладчике по шагам ищешь, где же именно начинает считать не правильно.
Цитата Сообщение от Konkin Посмотреть сообщение
int intersectionOfMatrix_1( const int matr1 [MAX_SIZE][MAX_SIZE], int height1, int width1, const int matr2 [MAX_SIZE][MAX_SIZE], int height2, int width2, int intersection[MAX_SIZE] )
Размер intersection должен быть MAX_SIZE*MAX_SIZE. Сейчас практически 100% вероятность выхода за пределы массива.
0
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 30
28.04.2011, 01:09  [ТС] 5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Нажимаешь F5 и в отладчике по шагам ищешь, где же именно начинает считать не правильно.

Размер intersection должен быть MAX_SIZE*MAX_SIZE. Сейчас практически 100% вероятность выхода за пределы массива.
Уточнил у преподавателя.. Рабочая версия функции тоже просто MAX_SIZE. Там смысл таков он мне сказал, что если элемент пересекается дважды то записывается в множество пересечения только один. То есть в intersection могут быть элементы от 0 до 9 и они не повторяются. Поэтому MAX_SIZE вполне хватает.

Про F5. Это то понятно, проблема в том что я видимо не правильно написал юнит-тест. Функция на выходе выдает количество элементов в массиве и + сам массив образованный пересечением матриц. А я проверяю якобы только количество элементов.. Если не сложно, посмотрите юнит-тесты ко второй функции. Как сделать так чтобы в условном выражении ожидаемый результат сравнивался не только с реальным количеством элементов в пересечении, но еще и с самим пересечением?
0
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
28.04.2011, 06:00 6
Многабукаф.
Реши на бумажке (маткаде, экселе) и сравни стем, что делает твоя прога. Где будут расхождения, там и ошибка.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2011, 06:00

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Написать программу для нахождения значения функции с помощью ряда Тейлора
Добрый день всем. Прошу помощи у более опытных товарищей. Не могу решить задачу. Вычислить и...

Написать программу поиска максимального элемента массива с помощью рекурсии и обычной функции
Здравствуйте. Мне нужно написать программу поиска максимального элемента массива с помощью рекурсии...

Написать программу, реализующую авиасправочник
Здравствуйте! Помогите пожалуйста!!! Текст задачи: Написать программу, реализующую...

Написать программу генератор тестов
Здравствуйте, Помогите пожалуйста написать программу генератор тестов на консоли С#


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.