main.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <malloc.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <fcntl.h> //работа с файлами
  8. #include <unistd.h> // закрытие файла
  9. #include <sys/stat.h> //S_IRWXU
  10. double *getCoeff(int start, int end, char *arr)
  11. {
  12. double *coeff = malloc(sizeof(double));
  13. *coeff = 0;
  14. int znak = 1, drob = 0, step = 0;
  15. if (arr[start] == '-')
  16. {
  17. znak = -1;
  18. start++;
  19. }
  20. for (int k = start; k < end; k++)
  21. {
  22. if ((arr[k] >= '0' && arr[k] <= '9') || arr[k] == '.')
  23. {
  24. if (drob == 0 && arr[k] == '.')
  25. drob = 1;
  26. else if (arr[k] >= '0' && arr[k] <= '9')
  27. {
  28. if (drob == 0)
  29. {
  30. *coeff = (*coeff * pow(10, step)) + (arr[k] - '0');
  31. step++;
  32. }
  33. else
  34. {
  35. *coeff += (arr[k] - '0') / pow(10, drob);
  36. drob++;
  37. }
  38. }
  39. else
  40. return NULL;
  41. }
  42. else
  43. return NULL;
  44. }
  45. *coeff = *coeff * znak;
  46. return coeff;
  47. }
  48. double *readFile(char *name)
  49. {
  50. int file = open(name, O_RDONLY); // Открытие файла только для чтения NULL
  51. if (file == -1)
  52. {
  53. printf("Ошибка чтения файла");
  54. }
  55. else
  56. {
  57. struct stat buf; //структура из файла stat.h
  58. fstat(file, &buf);
  59. int size = buf.st_size;
  60. char *arr = malloc(size * sizeof(char));
  61. read(file, arr, size);
  62. close(file);
  63. double *coeff = malloc(3 * sizeof(double));
  64. int countSpace = 0;
  65. int *index = malloc(size * sizeof(int));
  66. for (int i = 0; i < size; i++)
  67. {
  68. if (arr[i] == ' ')
  69. {
  70. countSpace++;
  71. index = realloc(index, countSpace * sizeof(int));
  72. index[countSpace - 1] = i;
  73. }
  74. }
  75. if (countSpace > 2)
  76. return NULL;
  77. int startIndex = 0; // начинается с 0, далее - все ячейки после пробела
  78. double *pointer;
  79. for (int i = 0; i < countSpace; i++)
  80. {
  81. pointer = getCoeff(startIndex, index[i], arr);
  82. startIndex = index[i] + 1;
  83. if (pointer)
  84. coeff[i] = *pointer;
  85. else
  86. return NULL;
  87. }
  88. pointer = getCoeff(startIndex, size, arr);
  89. if (pointer)
  90. coeff[countSpace] = *pointer;
  91. else
  92. return NULL;
  93. return coeff;
  94. }
  95. }
  96. int error(char *name)
  97. {
  98. int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU); // Создать файл на чтение и запись и стереть данные если существует
  99. char *message = "Файл содержит символы или другие некорректные данные";
  100. write(file, message, strlen(message));
  101. close(file);
  102. return 0;
  103. }
  104. int writeRootsToFile(char *name, double a, double b, double c)
  105. {
  106. char* message = malloc(50);
  107. if (a == 0) // проверка корректности
  108. {
  109. if (b == 0)
  110. {
  111. if (c == 0)
  112. message = "Уравнение имеет бесконечно много решений.";
  113. else
  114. message = "Уравнение не имеет решений.";
  115. }
  116. else
  117. {
  118. double x = -c / b; // Линейное уравнение
  119. sprintf(message, "Уравнение имеет одно решение: x = %.2lf", x);
  120. }
  121. }
  122. else
  123. {
  124. double D = pow(b, 2) - (double)4 * a * c;
  125. if (D >= 0)
  126. {
  127. if (D == 0)
  128. {
  129. double x = (-b) / (2 * a);
  130. sprintf(message, "Корень один: %0.2lf", x);
  131. }
  132. else
  133. {
  134. double x1 = (-b + sqrt(D)) / (2 * a);
  135. double x2 = (-b - sqrt(D)) / (2 * a);
  136. sprintf(message, "Корни уравнения: %0.2lf, %0.2lf", x1, x2);
  137. }
  138. }
  139. else
  140. message = "Корней нет";
  141. }
  142. int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU);
  143. write(file, message, strlen(message));
  144. close(file);
  145. return 0;
  146. }
  147. int main()
  148. {
  149. char *fileResult = "result.txt";
  150. double *arr = readFile("coefficients.txt");
  151. if (arr)
  152. writeRootsToFile(fileResult, arr[0], arr[1], arr[2]);
  153. else
  154. error(fileResult);
  155. return 0;
  156. }