Program.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6. int read_coef(const char* filename, double* a, double* b, double* c) {
  7. FILE* input = fopen(filename, "r");
  8. if (input == NULL) {
  9. printf("Ошибка, не удалось открыть файл. \n");
  10. return -1;
  11. }
  12. // Проверка на считывание трех вещественных чисел
  13. int count = fscanf(input, "%lf %lf %lf", a, b, c);
  14. if (count != 3) {
  15. printf("Ошибка, файл должен содержать три числовых значения\n");
  16. fclose(input);
  17. return -2;
  18. }
  19. // Проверка на лишние символы
  20. char extra;
  21. if (fscanf(input, " %c", &extra) == 1) {
  22. printf("Ошибка! Файл содержит лишние символы\n");
  23. fclose(input);
  24. return -3;
  25. }
  26. fclose(input);
  27. return 0; // Успешное чтение
  28. }
  29. int find_roots(double a, double b, double c, double* root1, double* root2) {
  30. if (a == 0) {
  31. printf("Коэффициент а не может быть равен нулю. Уравнение не является квадратным\n");
  32. return -1; // Ошибка
  33. }
  34. // Проверка на случаи, когда b или c равны 0
  35. if (b == 0 && c == 0) {
  36. printf("Уравнение имеет бесконечно много решений (0 = 0)\n");
  37. return -2; // Бесконечно много решений
  38. }
  39. else if (b == 0) {
  40. printf("Уравнение не имеет действительных корней\n");
  41. return 0; // Нет корней
  42. }
  43. else if (c == 0) {
  44. *root1 = 0; // Первый корень
  45. *root2 = -b / a; // Второй корень
  46. printf("Корни уравнения: x1 = 0 и x2 = %.2f\n", *root2);
  47. return 1; // Один корень (0) и второй корень
  48. }
  49. double D = b * b - 4 * a * c; // Вычисление дискриминанта
  50. if (D > 0) {
  51. *root1 = (-b + sqrt(D)) / (2 * a);
  52. *root2 = (-b - sqrt(D)) / (2 * a);
  53. printf("Два корня: %.2f и %.2f\n", *root1, *root2);
  54. printf("Данные успешно записаны в файл!\n");
  55. return 2; // Два корня
  56. }
  57. else if (D == 0) {
  58. *root1 = -b / (2 * a);
  59. printf("Один корень: %.2f\n", *root1);
  60. printf("Данные успешно записаны в файл!\n");
  61. return 1; // Один корень
  62. }
  63. else {
  64. printf("Корней нет\n");
  65. printf("Данные успешно записаны в файл!\n");
  66. return 0; // Нет корней
  67. }
  68. }
  69. void write_results(const char* filename, double a, double b, double c, double D, double root1, double root2, int num_roots) {
  70. FILE* output = fopen(filename, "w");
  71. if (output == NULL) {
  72. printf("Ошибка записи файла\n");
  73. return;
  74. }
  75. fprintf(output, "Коэффициенты уравнения: a = %.2f, b = %.2f, c = %.2f\n", a, b, c);
  76. fprintf(output, "Дискриминант D = %.2f\n", D);
  77. if (num_roots == 2) {
  78. fprintf(output, "Два корня: %.2f и %.2f\n", root1, root2);
  79. }
  80. else if (num_roots == 1) {
  81. fprintf(output, "Корни уравнения: x1 = %.2f и x2 = %.2f\n", root1, root2);
  82. }
  83. else {
  84. fprintf(output, "Корней нет\n");
  85. }
  86. fclose(output);
  87. }
  88. int main() {
  89. system("chcp 1251>null");
  90. double a, b, c;
  91. int result = read_coef("input.txt", &a, &b, &c);
  92. if (result == 0) {
  93. printf("Коэффициенты успешно считаны: a = %.2f, b = %.2f, c = %.2f\n", a, b, c);
  94. double root1, root2;
  95. double D = b * b - 4 * a * c; // Считаем дискриминант
  96. int num_roots = find_roots(a, b, c, &root1, &root2); // Получаем количество корней
  97. // Записываем результаты в файл
  98. write_results("output.txt", a, b, c, D, root1, root2, num_roots);
  99. }
  100. else {
  101. printf("Ошибка при чтении коэффициентов\n");
  102. return -1;
  103. }
  104. return 0;
  105. }