Метод Гаусса (добавить проверку на правильность ввода) - C (СИ)
Формулировка задачи:
нужно сделать проверку на правильность ввода. я не знаю в чем моя ошибка
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <math.h>
- #include <windows.h>
- #define N 10
- int main(void)
- {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- system("cls");
- float t, a[N][N + 1], x[N];
- int i, j,res, k, n, j_max, count = 0;
- do
- {
- printf("Введите размерность матрицы:\n");
- scanf("%d", &n);
- if (n>N)
- printf("Слишком большое число уравнений. Повторите ввод.\n");
- else
- printf("N = %d\n", n);
- } while (n>N);
- printf("Введите СЛАУ:\n");
- for (j = 0; j < n; j++)
- for (i = 0; i < n + 1; i++)
- {
- printf("a[%d][%d] = ", j, i);
- do
- {
- res = scanf("%f", &a[j][i]);
- fflush(stdin);
- if (res == 1);
- else {
- printf(" Error! Do not worry if you enter the number of all will be fine! \n");
- printf("a[%d][%d] = ", j, i);
- }
- } while (res != 1);
- count++;
- if (count == (n + 1))
- printf("\n", count = 0);
- }
- system("cls");
- printf("Исходная матрица:\n");
- for (j = 0; j < n; j++)
- {
- for (i = 0; i < n + 1; i++)
- printf("%6.2f\t", a[j][i]);
- printf("\n");
- }
- for (k = 0; k < n; k++)
- {
- j_max = k;
- for (j = k; j < n; j++)
- if (fabs(a[j_max][k]) < fabs(a[j][k]))
- j_max = j;
- for (i = 0; i < n + 1; i++)
- {
- t = a[k][i];
- a[k][i] = a[j_max][i];
- a[j_max][i] = t;
- }
- printf("матрица после %d преобразований\n", k + 1);
- for (j = 0; j < n; j++)
- {
- for (i = 0; i < n + 1; i++)
- printf("%6.2f\t", a[j][i]);
- printf("\n");
- }
- if (a[j_max][k] == 0)
- {
- count = 0;
- for (i = 0; i < n; i++)
- {
- if (a[k][i] == 0)
- count++;
- printf("кол-во нулей: %d\n", count);
- if (count == n && a[k][n + 1] == 0)
- {
- printf("СЛАУ имеет множество решений\n");
- system("pause");
- return(0);
- }
- else if (count == n && a[k][n + 1] != 0)
- {
- printf("СЛАУ не имеет решений\n");
- system("pause");
- return(0);
- }
- }
- }
- for (j = n; j >= k; j--)
- a[k][j] = a[k][j] / a[k][k];
- for (i = k + 1; i < n; i++)
- for (j = n; j >= k; j--)
- a[i][j] = a[i][j] - a[i][k] * a[k][j];
- }
- printf("Матрица приведенная к треугольному виду:\n");
- for (j = 0; j < n; j++)
- {
- for (i = 0; i < n + 1; i++)
- printf("%6.2f\t", a[j][i]);
- printf("\n");
- }
- for (i = 0; i < n; i++)
- x[i] = a[i][n];
- for (i = n - 2; i >= 0; i--)
- for (j = i + 1; j < n; j++)
- x[i] = x[i] - x[j] * a[i][j];
- printf("Корни СЛАУ:\n");
- for (i = 0; i < n; i++)
- printf("x[%d] = %6.2f\n", i, x[i]);
- system("pause");
- return(0);
- }
Решение задачи: «Метод Гаусса (добавить проверку на правильность ввода)»
textual
Листинг программы
- do {
- if (!fgets(buf, L, stdin))
- return 1;
- if (sscanf(buf, "%f", &a[j][i]) == 1)
- break;
- printf(" \n Ошибка! Не волнуйтесь, если вы укажете число, все будет хорошо! \n");
- } while (1);
Объяснение кода листинга программы
- Объявлены переменные:
buf
- символ, в который считывается строка из стандартного ввода;L
- константа, определяющая максимальную длинуbuf
;a
- двумерный массив, в который считываются числа;j
иi
- индексы для обращения к элементам массиваa
.
- Введен цикл
do
, который будет выполняться до тех пор, пока условие вwhile
не станет ложным. - Внутри цикла проверяется, успешно ли считали строку из стандартного ввода. Если нет, то программа возвращает 1 и завершается.
- Если строка успешно считерирована, то проверяется, удалось ли прочитать из нее число и записать его в соответствующий элемент массива
a
. Если да, то цикл прерывается. - Если в
sscanf
вернулось значение 0, то это означает, что в строке нет числа, и в консоль выводится сообщение об ошибке. - Цикл продолжается до тех пор, пока условие в
while
не станет ложным.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д