task1.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #include <sys/stat.h> //содержатся флаги режимов доступа к файлам (mode)
  5. #include <fcntl.h> //содержатся флаги открытия файлов (flags)
  6. /*
  7. КОДЫ ЗАВЕРШЕНИЯ РАБОТЫ
  8. 0 - удачное завершение работы
  9. 1 - нет пути к файлу
  10. 2 - не удалось найти файл
  11. 3 - не удалось прочитать файл
  12. 4 - не удалось записать в файл
  13. 5 - некорректные данные
  14. */
  15. char* readFile(char* path)
  16. {
  17. int flags = O_RDONLY;
  18. int mode = S_IRWXU|S_IRWXG|S_IRWXO;
  19. int fd = open(path, flags, mode); //Создание файлового дискриптора, для работы с файлом
  20. if(fd == -1)
  21. {
  22. printf("\nНе удалось открыть файл\n");
  23. exit(2);
  24. }
  25. int size_ = 1000;
  26. char* buffer = calloc(size_,sizeof(char)); //буфер для записи содержимого файла
  27. int numread = read (fd, buffer, 1000); //считывание файла buffer размером с size_
  28. if(numread < 0)
  29. {
  30. printf("\nНе удалось прочитать файл\n");
  31. exit(3);
  32. }
  33. close(fd);//закрытие файлового дискриптора
  34. return buffer;
  35. }
  36. void writeFile(char* path, char* answer)
  37. {
  38. int flags = O_WRONLY;
  39. int mode = S_IRWXU|S_IRWXG|S_IRWXO;
  40. int fd = open(path, flags, mode); //Создание файлового дискриптора, для работы с файлом
  41. if(fd == -1)
  42. {
  43. printf("\nНе удалось открыть файл\n");
  44. exit(2);
  45. }
  46. int numwrite = write(fd, answer, strlen(answer)); //запись в файл path - answer
  47. if(numwrite < 0)
  48. {
  49. printf("\nНе удалось записать в файл\n");
  50. exit(4);
  51. }
  52. close(fd);//закрытие файлового дискриптора
  53. }
  54. void countArg(int count)
  55. {
  56. switch (count)//обработка количества параметров
  57. {
  58. case -1:
  59. case 0:
  60. {
  61. printf("В файле отсутствуют параметры\n");//вывод ошибки в консоль
  62. exit(5);//код ошибки
  63. break;
  64. }
  65. case 1:
  66. case 2:
  67. {
  68. printf("Параметры введенны некорректны или их количества недостаточно\n");//вывод ошибки в консоль
  69. exit(5);//код ошибки
  70. break;
  71. }
  72. case 3:
  73. break;
  74. default:
  75. break;
  76. }
  77. }
  78. int main(int argc, char *argv[])
  79. {
  80. if(!argv[1] || !argv[2])
  81. {
  82. printf("\nНе удалось найти пкть к файлу\n");
  83. exit(1); //заканчиваем программу если путь к файлу пустой
  84. }
  85. char* pathname = argv[1];//путь к файлу с аргументами
  86. char* buffer = readFile(pathname);//чтение данных из файла
  87. double a;
  88. double b;
  89. double c;
  90. int CODE_PARAM = sscanf(buffer, "%lf%lf%lf", &a, &b, &c);//заполнение переменных
  91. countArg(CODE_PARAM);//проверка количества параметров
  92. double Discriminant = b * b - 4 * c * a;//нахождение дискриминанта
  93. char* thisAnswer = argv[2];//путь к файлу с ответом
  94. char* answer = calloc(1000, sizeof(char));
  95. if (Discriminant < 0)//если дискриминант отрицательный
  96. {
  97. printf("Дискриминант меньше 0. Решения нет\n");//вывод ошибки в консоль
  98. sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s %5.3f", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0\nРешения не имеет, поскольку имеет отрицательный дискриминант = ", Discriminant);//запись строки
  99. writeFile(thisAnswer, answer);
  100. exit(3);//код ошибки
  101. }
  102. //проверка первого аргумента на плешивость
  103. if (a == 0)
  104. {
  105. printf("Попытка деления на 0\n");
  106. sprintf(answer, "%s %5.3f %s %5.3f %s %5.3f %s", "Решение вида (", a, ")*x^2 + (", b, ")*x + (", c, ") = 0\n Попытка деления на 0");//запись строки
  107. writeFile(thisAnswer, answer);
  108. exit(4);
  109. }
  110. //решение квадратного уравнения
  111. if (Discriminant == 0)
  112. {
  113. double x = -b / (2 * a);//нахождение корней уравнения
  114. 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);//запись строки
  115. writeFile(thisAnswer, answer);
  116. printf("Решение вида (%5.3f)*x^2 + (%5.3f)*x + (%5.3f) = 0 имеет 1 решение \nx = %5.3f\nДискриминант = %5.3f\n", a, b, c, x, Discriminant);
  117. }
  118. else
  119. {
  120. //нахождение корней уравнения
  121. double x1 = (-b + sqrt(Discriminant)) / (2 * a);
  122. double x2 = (-b - sqrt(Discriminant)) / (2 * a);
  123. 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);//запись строки
  124. writeFile(thisAnswer, answer);
  125. 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);
  126. }
  127. return 0;
  128. }