Метод Гаусса (добавить проверку на правильность ввода) - 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не станет ложным.