123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <math.h>
- #include <malloc.h>
- #include <string.h>
- #include <stdlib.h>
- #include <fcntl.h> //работа с файлами
- #include <unistd.h> // закрытие файла
- #include <sys/stat.h> //S_IRWXU
- #include <sys/wait.h> //wait
- 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)
- {
- int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU);
- char* message = malloc(50);
- int countRoot = 0;
- if (a == 0) // проверка корректности
- {
- if (b == 0)
- {
- if (c == 0)
- message = "Уравнение имеет бесконечно много решений.";
- else
- message = "Уравнение не имеет решений.";
- }
- else
- {
- double x = -c / b; // Линейное уравнение
- sprintf(message, "Уравнение имеет одно решение: x = %.2lf", x);
- countRoot = 1;
- }
- }
- 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);
- countRoot = 1;
- }
- else
- {
- double x1 = (-b + sqrt(D)) / (2 * a);
- double x2 = (-b - sqrt(D)) / (2 * a);
- sprintf(message, "Корни уравнения: %0.2lf, %0.2lf", x1, x2);
- countRoot = 2;
- }
- }
- else message = "Корней нет";
- }
- write(file, message, strlen(message));
- close(file);
- switch (countRoot)
- {
- case 0: exit(0);
- case 1: exit(1);
- case 2: exit(2);
- default: exit(-1);
- }
- }
- char *readFileResult(char *name)
- {
- int file = open(name, O_RDONLY);
- if (file == -1) printf("Ошибка чтения файла результата");
- else
- {
- struct stat buf;
- fstat(file, &buf);
- int size = buf.st_size;
- char *arr = malloc(size * sizeof(char));
- read(file, arr, size);
- close(file);
- return arr;
- }
- }
- int main()
- {
- printf("Родитель %d считывает информацию\n", getpid());
- char *fileResult = "result.txt";
- double *arr = readFile("coefficients.txt");
- int status;
- char* show;
- switch (fork())
- {
- case -1: exit(-1); break; //ошибка
- case 0: //выполняется у дочернего процесса
- printf("Ребенок %d записывает ответ в файл\n", getpid());
- if (arr)
- writeRootsToFile(fileResult, arr[0], arr[1], arr[2]);
- else
- error(fileResult);
- break;
- }
- wait(&status); //Ожидание завершения дочернего процесса
- switch (status)
- {
- case 0: printf("Корней нет\n"); break;
- case 1:
- show = readFileResult(fileResult);
- printf("%s", show);
- break;
- case 2:
- show = readFileResult(fileResult);
- printf("%s", show);
- break;
- default: printf("Что-то пошло не так\n"); break;
- }
- return 0;
- }
|