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

Объяснение кода листинга программы

  1. Объявлены переменные:
    • buf - символ, в который считывается строка из стандартного ввода;
    • L - константа, определяющая максимальную длину buf;
    • a - двумерный массив, в который считываются числа;
    • j и i - индексы для обращения к элементам массива a.
  2. Введен цикл do, который будет выполняться до тех пор, пока условие в while не станет ложным.
  3. Внутри цикла проверяется, успешно ли считали строку из стандартного ввода. Если нет, то программа возвращает 1 и завершается.
  4. Если строка успешно считерирована, то проверяется, удалось ли прочитать из нее число и записать его в соответствующий элемент массива a. Если да, то цикл прерывается.
  5. Если в sscanf вернулось значение 0, то это означает, что в строке нет числа, и в консоль выводится сообщение об ошибке.
  6. Цикл продолжается до тех пор, пока условие в while не станет ложным.

Оцени полезность:

14   голосов , оценка 4.286 из 5
Похожие ответы