#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include //работа с файлами #include // закрытие файла #include //S_IRWXU double *getCoeff(int start, int end, char *arr) { double *coeff = malloc(sizeof(double)); *coeff = 0; int znak = 1, drob = 0, step = 0; if (arr[start] == '-') { znak = -1; start++; } for (int k = start; k < end; k++) { if ((arr[k] >= '0' && arr[k] <= '9') || arr[k] == '.') { if (drob == 0 && arr[k] == '.') drob = 1; else if (arr[k] >= '0' && arr[k] <= '9') { if (drob == 0) { *coeff = (*coeff * pow(10, step)) + (arr[k] - '0'); step++; } else { *coeff += (arr[k] - '0') / pow(10, drob); drob++; } } else return NULL; } else return NULL; } *coeff = *coeff * znak; return coeff; } double *readFile(char *name) { int file = open(name, O_RDONLY); // Открытие файла только для чтения NULL if (file == -1) { printf("Ошибка чтения файла"); } else { struct stat buf; //структура из файла stat.h fstat(file, &buf); int size = buf.st_size; char *arr = malloc(size * sizeof(char)); read(file, arr, size); close(file); double *coeff = malloc(3 * sizeof(double)); int countSpace = 0; int *index = malloc(size * sizeof(int)); for (int i = 0; i < size; i++) { if (arr[i] == ' ') { countSpace++; index = realloc(index, countSpace * sizeof(int)); index[countSpace - 1] = i; } } if (countSpace > 2) return NULL; int startIndex = 0; // начинается с 0, далее - все ячейки после пробела double *pointer; for (int i = 0; i < countSpace; i++) { pointer = getCoeff(startIndex, index[i], arr); startIndex = index[i] + 1; if (pointer) coeff[i] = *pointer; else return NULL; } pointer = getCoeff(startIndex, size, arr); if (pointer) coeff[countSpace] = *pointer; else return NULL; return coeff; } } int error(char *name) { int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU); // Создать файл на чтение и запись и стереть данные если существует char *message = "Файл содержит символы или другие некорректные данные"; write(file, message, strlen(message)); close(file); return 0; } int writeRootsToFile(char *name, double a, double b, double c) { char* message = malloc(50); if (a == 0) // проверка корректности { if (b == 0) { if (c == 0) message = "Уравнение имеет бесконечно много решений."; else message = "Уравнение не имеет решений."; } else { double x = -c / b; // Линейное уравнение sprintf(message, "Уравнение имеет одно решение: x = %.2lf", x); } } else { double D = pow(b, 2) - (double)4 * a * c; if (D >= 0) { if (D == 0) { double x = (-b) / (2 * a); sprintf(message, "Корень один: %0.2lf", x); } else { double x1 = (-b + sqrt(D)) / (2 * a); double x2 = (-b - sqrt(D)) / (2 * a); sprintf(message, "Корни уравнения: %0.2lf, %0.2lf", x1, x2); } } else message = "Корней нет"; } int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU); write(file, message, strlen(message)); close(file); return 0; } int main() { char *fileResult = "result.txt"; double *arr = readFile("coefficients.txt"); if (arr) writeRootsToFile(fileResult, arr[0], arr[1], arr[2]); else error(fileResult); return 0; }