123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- //решить задачу для нахождения корней квадратного уравнения средствами языка си.
- //
- //коэффициенты находятся в текстовом файле(разделителями могут быть как знак пробела, так и перенос строки)
- //
- //коэффициенты могут быть вещественными(но если вы претендуете на оценку "Удовлетворительно", то достаточно решить эту задачу для целочисленных коэффициентов)
- //
- //сама программа должна учитывать и корректно обрабатывать все возможные исключительные ситуации, связанны с коэффициентами(например, если некоторые из коэффициентов равны 0).а также осуществлять проверку на корректный ввод(введены неполные данные или нечисловые символы)
- //
- //корни уравнения должны быть записаны в другой текстовый файл.помимо самих корней должна быть записана и справочная информация(например о количестве корней, дискриминанте).если действительных корней нет, то это также должно быть отражено в файле с результатом.
- //
- //все пути к используемым файлам должны быть относительными.
- //
- //в качестве ответа прислать текстовый файл с программным кодом решенной задачи.
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <conio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- int is_valid_double(const char* str) {
- char* endptr;
- // Проверяем, можно ли преобразовать строку в число типа double
- strtod(str, &endptr);
- // Если endptr указывает на начало строки или не на конец строки, значит, это не число
- return *endptr == '\0' && endptr != str;
- }
- int main() {
- system("chcp 1251>nul");
- // С помощью переменной file будем осуществлять доступ к файлу
- FILE* file;
- // Открываем текстовый файл с правами на чтение
- file = fopen("test.txt", "r");
- double a, b, c;
- if (file == NULL) {
- fprintf(stderr, "Ошибка открытия файла для чтения коэффициентов.\n");
- return 1;
- }
- char line[256];
- int count = 0;
- // Считываем значения из файла по строкам
- while (fgets(line, sizeof(line), file) != NULL) {
- char* token = strtok(line, " \n");
- while (token != NULL) {
- if (is_valid_double(token)) {
- if (count == 0) {
- a = strtod(token, NULL);
- }
- else if (count == 1) {
- b = strtod(token, NULL);
- }
- else if (count == 2) {
- c = strtod(token, NULL);
- }
- count++;
- }
- else {
- fprintf(stderr, "Ошибка: '%s' не является допустимым числом.\n", token);
- fclose(file);
- return 1;
- }
- token = strtok(NULL, " \n");
- }
- }
- // Закрываем файл
- fclose(file);
- printf("Коэффициенты: a = %lf, b = %lf, c = %lf\n", a, b, c);
- double D = b * b - 4 * a * c;
- // Открываем файл для записи результатов
- FILE* file1 = fopen("otvet.txt", "w");
- if (file1 == NULL) {
- fprintf(stderr, "Ошибка открытия файла для записи результатов.\n");
- return 1;
- }
- if (D > 0) {
- double x1 = (-b + sqrt(D)) / (2 * a);
- double x2 = (-b - sqrt(D)) / (2 * a);
- fprintf(file1, "Корни уравнения: %.2f и %.2f\n", x1, x2);
- }
- else if (D == 0) {
- double x = -b / (2 * a);
- fprintf(file1, "Корень уравнения: %.2f\n", x);
- }
- else {
- fprintf(file1, "Нет действительных корней\n");
- }
- fprintf(file1, "Дискриминант: %.2f\n", D);
- fclose(file1);
- _getch();
- return 0;
- }
|