Здравствуйте, возникла такая проблема — в программе, на языке Си, необходимо реализовать проверку корректности введенных пользователем данных, то бишь чтобы например если пользователь вводит с клавиатуры вместо цифры букву, то выскакивала ошибка. Попробовал реализовать её через 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 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Вообще говоря, необходимо различать blackbox- и whitebox-тестирование: имеет ли право тестирующий код опираться на знание того, как устроена функция?
В вашем случае функция не является чистой: она ничего не выдаёт, а сама изменяет внешний объект (пишет на консоль). Это неверно, такие функции тестировать невозможно. Перепишите функцию так, чтобы она выдавала результат, а уж в какой форме и куда его выводить (и выводить ли вовсе), пусть заботится внешний код.
Когда переделаете, можно будет тестировать. В любом случае, blackbox или whitebox, стоит проверить, как работает функция на различных входных данных:
Создание сборщика мусора | С
- Неприятные частные случаи: если одна из длин сторон — ноль или отрицательная, или специальное значение NaN, или бесконечность, как ведёт себя функция? Какое значение она возвращает? Сообщает ли она о недопустимых входных данных?
- Величины сторон удовлетворяют неравенству треугольника: сообщает ли функция, что из данных трёх сторон можно построить треугольник? Попробуйте разный порядок аргументов: не изменится ли ответ?
- Величины сторон не удовлетворяют неравенству треугольника, одна из сторон равна сумме двух других. Сообщает ли функция, что из данных трёх сторон нельзя построить треугольник? Попробуйте разный порядок аргументов: сумма на первом месте, на втором и на третьем.
- Величины сторон не удовлетворяют неравенству треугольника, одна из сторон больше сумме двух других. Сообщает ли функция, что из данных трёх сторон нельзя построить треугольник?
Пример теста, реализующего проверку 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