FileName.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //решить задачу для нахождения корней квадратного уравнения средствами языка си.
  2. //
  3. //коэффициенты находятся в текстовом файле(разделителями могут быть как знак пробела, так и перенос строки)
  4. //
  5. //коэффициенты могут быть вещественными(но если вы претендуете на оценку "Удовлетворительно", то достаточно решить эту задачу для целочисленных коэффициентов)
  6. //
  7. //сама программа должна учитывать и корректно обрабатывать все возможные исключительные ситуации, связанны с коэффициентами(например, если некоторые из коэффициентов равны 0).а также осуществлять проверку на корректный ввод(введены неполные данные или нечисловые символы)
  8. //
  9. //корни уравнения должны быть записаны в другой текстовый файл.помимо самих корней должна быть записана и справочная информация(например о количестве корней, дискриминанте).если действительных корней нет, то это также должно быть отражено в файле с результатом.
  10. //
  11. //все пути к используемым файлам должны быть относительными.
  12. //
  13. //в качестве ответа прислать текстовый файл с программным кодом решенной задачи.
  14. #define _CRT_SECURE_NO_WARNINGS
  15. #include <stdio.h>
  16. #include <conio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <ctype.h>
  20. int is_valid_double(const char* str) {
  21. char* endptr;
  22. // Проверяем, можно ли преобразовать строку в число типа double
  23. strtod(str, &endptr);
  24. // Если endptr указывает на начало строки или не на конец строки, значит, это не число
  25. return *endptr == '\0' && endptr != str;
  26. }
  27. int main() {
  28. system("chcp 1251>nul");
  29. // С помощью переменной file будем осуществлять доступ к файлу
  30. FILE* file;
  31. // Открываем текстовый файл с правами на чтение
  32. file = fopen("test.txt", "r");
  33. double a, b, c;
  34. if (file == NULL) {
  35. fprintf(stderr, "Ошибка открытия файла для чтения коэффициентов.\n");
  36. return 1;
  37. }
  38. char line[256];
  39. int count = 0;
  40. // Считываем значения из файла по строкам
  41. while (fgets(line, sizeof(line), file) != NULL) {
  42. char* token = strtok(line, " \n");
  43. while (token != NULL) {
  44. if (is_valid_double(token)) {
  45. if (count == 0) {
  46. a = strtod(token, NULL);
  47. }
  48. else if (count == 1) {
  49. b = strtod(token, NULL);
  50. }
  51. else if (count == 2) {
  52. c = strtod(token, NULL);
  53. }
  54. count++;
  55. }
  56. else {
  57. fprintf(stderr, "Ошибка: '%s' не является допустимым числом.\n", token);
  58. fclose(file);
  59. return 1;
  60. }
  61. token = strtok(NULL, " \n");
  62. }
  63. }
  64. // Закрываем файл
  65. fclose(file);
  66. printf("Коэффициенты: a = %lf, b = %lf, c = %lf\n", a, b, c);
  67. double D = b * b - 4 * a * c;
  68. // Открываем файл для записи результатов
  69. FILE* file1 = fopen("otvet.txt", "w");
  70. if (file1 == NULL) {
  71. fprintf(stderr, "Ошибка открытия файла для записи результатов.\n");
  72. return 1;
  73. }
  74. if (D > 0) {
  75. double x1 = (-b + sqrt(D)) / (2 * a);
  76. double x2 = (-b - sqrt(D)) / (2 * a);
  77. fprintf(file1, "Корни уравнения: %.2f и %.2f\n", x1, x2);
  78. }
  79. else if (D == 0) {
  80. double x = -b / (2 * a);
  81. fprintf(file1, "Корень уравнения: %.2f\n", x);
  82. }
  83. else {
  84. fprintf(file1, "Нет действительных корней\n");
  85. }
  86. fprintf(file1, "Дискриминант: %.2f\n", D);
  87. fclose(file1);
  88. _getch();
  89. return 0;
  90. }