Метод Гаусса (добавить проверку на правильность ввода) - 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
не станет ложным.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д