123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- #include <sys/stat.h> //содержатся флаги режимов доступа к файлам (mode)
- #include <fcntl.h> //содержатся флаги открытия файлов (flags)
- /*
- КОДЫ ЗАВЕРШЕНИЯ РАБОТЫ
- 0 - удачное завершение работы
- 1 - нет пути к файлу
- 2 - не удалось найти файл
- 3 - не удалось прочитать файл
- 4 - не удалось записать в файл
- 5 - некорректные данные
- */
- char* readFile(char* path)
- {
- int flags = O_RDONLY;
- int mode = S_IRWXU|S_IRWXG|S_IRWXO;
- int fd = open(path, flags, mode); //Создание файлового дискриптора, для работы с файлом
- if(fd == -1)
- {
- printf("\nНе удалось открыть файл\n");
- exit(2);
- }
- int size_ = 1000;
- char* buffer = calloc(size_,sizeof(char)); //буфер для записи содержимого файла
-
- int numread = read (fd, buffer, 1000); //считывание файла buffer размером с size_
- if(numread < 0)
- {
- printf("\nНе удалось прочитать файл\n");
- exit(3);
- }
- close(fd);//закрытие файлового дискриптора
- return buffer;
- }
- void writeFile(char* path, char* answer)
- {
- int flags = O_WRONLY;
- int mode = S_IRWXU|S_IRWXG|S_IRWXO;
- int fd = open(path, flags, mode); //Создание файлового дискриптора, для работы с файлом
- if(fd == -1)
- {
- printf("\nНе удалось открыть файл\n");
- exit(2);
- }
-
- int numwrite = write(fd, answer, strlen(answer)); //запись в файл path - answer
- if(numwrite < 0)
- {
- printf("\nНе удалось записать в файл\n");
- exit(4);
- }
- close(fd);//закрытие файлового дискриптора
- }
- void countArg(int count)
- {
- switch (count)//обработка количества параметров
- {
- case -1:
- case 0:
- {
- printf("В файле отсутствуют параметры\n");//вывод ошибки в консоль
- exit(5);//код ошибки
- break;
- }
- case 1:
- case 2:
- {
- printf("Параметры введенны некорректны или их количества недостаточно\n");//вывод ошибки в консоль
- exit(5);//код ошибки
- break;
- }
- case 3:
- break;
- default:
- break;
- }
- }
- int main(int argc, char *argv[])
- {
- if(!argv[1] || !argv[2])
- {
- printf("\nНе удалось найти пкть к файлу\n");
- exit(1); //заканчиваем программу если путь к файлу пустой
- }
- char* pathname = argv[1];//путь к файлу с аргументами
-
- char* buffer = readFile(pathname);//чтение данных из файла
- double a;
- double b;
- double c;
- int CODE_PARAM = sscanf(buffer, "%lf%lf%lf", &a, &b, &c);//заполнение переменных
- countArg(CODE_PARAM);//проверка количества параметров
- double Discriminant = b * b - 4 * c * a;//нахождение дискриминанта
- char* thisAnswer = argv[2];//путь к файлу с ответом
- char* answer = calloc(1000, sizeof(char));
- if (Discriminant < 0)//если дискриминант отрицательный
- {
- printf("Дискриминант меньше 0. Решения нет\n");//вывод ошибки в консоль
- sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s %5.3f", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0\nРешения не имеет, поскольку имеет отрицательный дискриминант = ", Discriminant);//запись строки
- writeFile(thisAnswer, answer);
- exit(3);//код ошибки
- }
- //проверка первого аргумента на плешивость
- if (a == 0)
- {
- printf("Попытка деления на 0\n");
- sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0\n Попытка деления на 0");//запись строки
- writeFile(thisAnswer, answer);
- exit(4);
- }
- //решение квадратного уравнения
- if (Discriminant == 0)
- {
- double x = -b / (2 * a);//нахождение корней уравнения
- sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s %5.3f %s %5.3f", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0 имеет 1 решение \nx = ", x, "\nДискриминант = ", Discriminant);//запись строки
- writeFile(thisAnswer, answer);
- printf("Решение вида (%5.3f)*x^2 + (%5.3f)*x + (%5.3f) = 0 имеет 1 решение \nx = %5.3f\nДискриминант = %5.3f\n", a, b, c, x, Discriminant);
- }
- else
- {
- //нахождение корней уравнения
- double x1 = (-b + sqrt(Discriminant)) / (2 * a);
- double x2 = (-b - sqrt(Discriminant)) / (2 * a);
- sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s %5.3f %s %5.3f %s %5.3f", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0 имеет 2 решения \nx1 = ", x1, ", x2 = ", x2, "\nДискриминант = ", Discriminant);//запись строки
- writeFile(thisAnswer, answer);
- printf("Решение вида (%5.3f)*x^2 + (%5.3f)*x + (%5.3f) = 0 имеет 2 решения \nx1 = %5.3f, x2 = %5.3f\nДискриминант = %5.3f\n", a, b, c, x1, x2, Discriminant);
- }
- return 0;
- }
|