Метод Гаусса (добавить проверку на правильность ввода) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

нужно сделать проверку на правильность ввода. я не знаю в чем моя ошибка
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <math.h>
  5. #include <windows.h>
  6. #define N 10
  7. int main(void)
  8. {
  9. SetConsoleCP(1251);
  10. SetConsoleOutputCP(1251);
  11. system("cls");
  12. float t, a[N][N + 1], x[N];
  13. int i, j,res, k, n, j_max, count = 0;
  14. do
  15. {
  16. printf("Введите размерность матрицы:\n");
  17. scanf("%d", &n);
  18. if (n>N)
  19. printf("Слишком большое число уравнений. Повторите ввод.\n");
  20. else
  21. printf("N = %d\n", n);
  22. } while (n>N);
  23. printf("Введите СЛАУ:\n");
  24. for (j = 0; j < n; j++)
  25. for (i = 0; i < n + 1; i++)
  26. {
  27. printf("a[%d][%d] = ", j, i);
  28. do
  29. {
  30. res = scanf("%f", &a[j][i]);
  31. fflush(stdin);
  32. if (res == 1);
  33. else {
  34. printf(" Error! Do not worry if you enter the number of all will be fine! \n");
  35. printf("a[%d][%d] = ", j, i);
  36. }
  37. } while (res != 1);
  38. count++;
  39. if (count == (n + 1))
  40. printf("\n", count = 0);
  41. }
  42. system("cls");
  43. printf("Исходная матрица:\n");
  44. for (j = 0; j < n; j++)
  45. {
  46. for (i = 0; i < n + 1; i++)
  47. printf("%6.2f\t", a[j][i]);
  48. printf("\n");
  49. }
  50. for (k = 0; k < n; k++)
  51. {
  52. j_max = k;
  53. for (j = k; j < n; j++)
  54. if (fabs(a[j_max][k]) < fabs(a[j][k]))
  55. j_max = j;
  56. for (i = 0; i < n + 1; i++)
  57. {
  58. t = a[k][i];
  59. a[k][i] = a[j_max][i];
  60. a[j_max][i] = t;
  61. }
  62. printf("матрица после %d преобразований\n", k + 1);
  63. for (j = 0; j < n; j++)
  64. {
  65. for (i = 0; i < n + 1; i++)
  66. printf("%6.2f\t", a[j][i]);
  67. printf("\n");
  68. }
  69. if (a[j_max][k] == 0)
  70. {
  71. count = 0;
  72. for (i = 0; i < n; i++)
  73. {
  74. if (a[k][i] == 0)
  75. count++;
  76. printf("кол-во нулей: %d\n", count);
  77. if (count == n && a[k][n + 1] == 0)
  78. {
  79. printf("СЛАУ имеет множество решений\n");
  80. system("pause");
  81. return(0);
  82. }
  83. else if (count == n && a[k][n + 1] != 0)
  84. {
  85. printf("СЛАУ не имеет решений\n");
  86. system("pause");
  87. return(0);
  88. }
  89. }
  90. }
  91. for (j = n; j >= k; j--)
  92. a[k][j] = a[k][j] / a[k][k];
  93. for (i = k + 1; i < n; i++)
  94. for (j = n; j >= k; j--)
  95. a[i][j] = a[i][j] - a[i][k] * a[k][j];
  96. }
  97. printf("Матрица приведенная к треугольному виду:\n");
  98. for (j = 0; j < n; j++)
  99. {
  100. for (i = 0; i < n + 1; i++)
  101. printf("%6.2f\t", a[j][i]);
  102. printf("\n");
  103. }
  104. for (i = 0; i < n; i++)
  105. x[i] = a[i][n];
  106. for (i = n - 2; i >= 0; i--)
  107. for (j = i + 1; j < n; j++)
  108. x[i] = x[i] - x[j] * a[i][j];
  109. printf("Корни СЛАУ:\n");
  110. for (i = 0; i < n; i++)
  111. printf("x[%d] = %6.2f\n", i, x[i]);
  112. system("pause");
  113. return(0);
  114. }

Решение задачи: «Метод Гаусса (добавить проверку на правильность ввода)»

textual
Листинг программы
  1.     do {
  2.  
  3.         if (!fgets(buf, L, stdin))
  4.             return 1;
  5.        
  6.         if (sscanf(buf, "%f", &a[j][i]) == 1)
  7.             break;
  8.        
  9.         printf(" \n Ошибка! Не волнуйтесь, если вы укажете число, все будет хорошо! \n");
  10.     } 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы