Как проверить программу на языке си

Здравствуйте, возникла такая проблема — в программе, на языке Си, необходимо реализовать проверку корректности введенных пользователем данных, то бишь чтобы например если пользователь вводит с клавиатуры вместо цифры букву, то выскакивала ошибка. Попробовал реализовать её через try/catch, но если ввести букву, то программа все равно продолжает работать и в итоге просто выдает ошибочные значения. Подскажите пожалуйста что необходимо добавить/исправить чтобы все заработало так как надо, или может быть какой-нибудь другой метод реализации такой проверки. Используемый компилятор Visual Studio 2010.Вот сам код программы:

#include «stdafx.h» #include «conio.h» #include #include #define N 5 void matrix_n_vector (float m[][N], float v[],float res[],int n) < for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) < res[i] = 0; for(int k = 0; k < n; k++) res[i] += (m[i][k] * v[k]); >> int _tmain(int argc, _TCHAR* argv[]) < int n,i,j; float v, a[N][N]; printf («Vvedite poryadok matrici: «); scanf(«%d», if ( N < n ) < printf( «Slishkom bolshoi poryadok matricin» ); getch(); return 0; >printf(«nVvedite sistemun»); for (i=0; i catch(. ) < printf(«Error»); >> system(«cls»); printf(«matrix:n»); for(i=0; i int iter=0; float L=0, Lprov, Xn1[N],Xn[N]; for (int i=0; i while ((fabs(L-Lprov))>=0.1); printf(«nnvektor:n»); for(i=0; i printf («nnL = «); printf («%f», L); printf («nniteracii = «); printf («%d», iter); getch(); return 0; >

Источник: studassistent.ru

Как работает C/C++?

Тестирование функции в Си

Как проверить как ведет себя функция на разных данных в Си? Скажем, есть функция, которая определяет по трём сторонам, что это треугольник.

void tr(float a, float b, float c) < if(a+b>c b+c>a a+c>b) < printf(«Треугольник!»); >>
int tr(float a, float b, float c) < if(cif(a+b>c b+c>a a+c>b) < return 0; >else < return 1; >>
Покажите пример теста.
Отслеживать
задан 24 фев 2014 в 12:43
25 4 4 бронзовых знака

Читайте также:
Программа похожая на reflector

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Вообще говоря, необходимо различать blackbox- и whitebox-тестирование: имеет ли право тестирующий код опираться на знание того, как устроена функция?

В вашем случае функция не является чистой: она ничего не выдаёт, а сама изменяет внешний объект (пишет на консоль). Это неверно, такие функции тестировать невозможно. Перепишите функцию так, чтобы она выдавала результат, а уж в какой форме и куда его выводить (и выводить ли вовсе), пусть заботится внешний код.

Когда переделаете, можно будет тестировать. В любом случае, blackbox или whitebox, стоит проверить, как работает функция на различных входных данных:

Создание сборщика мусора | С

  1. Неприятные частные случаи: если одна из длин сторон — ноль или отрицательная, или специальное значение NaN, или бесконечность, как ведёт себя функция? Какое значение она возвращает? Сообщает ли она о недопустимых входных данных?
  2. Величины сторон удовлетворяют неравенству треугольника: сообщает ли функция, что из данных трёх сторон можно построить треугольник? Попробуйте разный порядок аргументов: не изменится ли ответ?
  3. Величины сторон не удовлетворяют неравенству треугольника, одна из сторон равна сумме двух других. Сообщает ли функция, что из данных трёх сторон нельзя построить треугольник? Попробуйте разный порядок аргументов: сумма на первом месте, на втором и на третьем.
  4. Величины сторон не удовлетворяют неравенству треугольника, одна из сторон больше сумме двух других. Сообщает ли функция, что из данных трёх сторон нельзя построить треугольник?

Пример теста, реализующего проверку 3:

// где-то в начале программы: srand(time(NULL)); или что-то похожее float getRandomFloat(float from, float to) < assert(from < to); return from + (to — from) * (float)rand()/(float)RAND_MAX; >int getRandomInt(int from, int to) < assert(from < to); return (int)(from + (to — from + 1) * (double)rand()/(double)RAND_MAX); >int test3() < float addend1 = getRandomFloat(1, FLT_MAX/2); float addend2 = getRandomFloat(1, FLT_MAX/2); float sum = addend1 + addend2; if (tr(addend1, addend2, sum) != 0) return 0; // test failed if (tr(addend1, sum, addend2) != 0) return 0; // test failed if (tr(sum, addend1, addend2) != 0) return 0; // test failed return 1; // test passed >

Читайте также:
Как правильно утвердить программу

Пример теста, реализующего часть проверок пункта 1:

#include int test1_NaN() < float args[3]; args[0] = getRandomFloat(1, FLT_MAX); args[1] = getRandomFloat(1, FLT_MAX); args[2] = getRandomFloat(1, FLT_MAX); int numberOfNanEntries = getRandomInt(1, 3); // тут надо бы выборку, но мне лень switch (numberOfNanEntries) < case 1: args[getRandomInt(0, 2)] = NAN; break; case 2: < int goodIdx = getRandomInt(0, 2); for (int i = 0; i < 2; i++) if (i != goodIdx) args[i] = NAN; >case 3: for (int i = 0; i < 2; i++) args[i] = NAN; >if (tr(args[0], args[1], args[2]) != 2) return 0; // test failed return 1; // test passed >

Аналогичные тесты на пункт 2 (например, если оба слагаемых больше FLT_MAX/2 , код должен правильно работать.

struct test_entry < const char* description; int (*test)(); >entries[] = < < «NaN arguments», test1_NaN >, < «One argument is a sum of other two», test3 >// . >; const size_t number_of_entries = sizeof(entries) / sizeof(*entries); int test_coordinator(char*** failed_test_descriptions) < char** failed_descriptions = malloc(number_of_entries * sizeof(char*)); int failed_curr_idx = 0; for (int i = 0; i < number_of_entries; i++) < if (!entries[i]->test()) failed_descriptions[failed_curr_idx++] = entries[i].description; > if (!failed_curr_idx) < *failed_test_descriptions = NULL; free(failed_descriptions); return 1; >else < *failed_test_descriptions = realloc(failed_descriptions, failed_curr_idx * sizeof(char*)); return 0; >>

Источник: ru.stackoverflow.com

Как проверить программу на языке си

: 2

Си. Проверить программу на работоспособность и синтаксис

Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.
A5.png
Вот что у меня получилось, но говорят, что можно объединить 3 функции в одну, но не знаю как.

#include #include #include float func1(float x, float a, float b, float c); float func2(float x, float a, float b, float c); float func3(float x, float a, float b, float c); int main() 0 b==0) f=func2(x,a,b,c); else f=func3(x,a,b,c); printf(«n |_%f_|_%f_|»,f, x); printf(«n |_____________________|»); x+=dx; > while(x1>=x); getch(); return 0; > float func1(float x, float a, float b, float c) float func2(float x, float a, float b, float c) float func3(float x, float a, float b, float c)

Читайте также:
В какой программе делать книгу

Источник: www.programmersforum.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru