123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- int read_coef(const char* filename, double* a, double* b, double* c) {
- FILE* input = fopen(filename, "r");
- if (input == NULL) {
- printf("Ошибка, не удалось открыть файл. \n");
- return -1;
- }
- // Проверка на считывание трех вещественных чисел
- int count = fscanf(input, "%lf %lf %lf", a, b, c);
- if (count != 3) {
- printf("Ошибка, файл должен содержать три числовых значения\n");
- fclose(input);
- return -2;
- }
- // Проверка на лишние символы
- char extra;
- if (fscanf(input, " %c", &extra) == 1) {
- printf("Ошибка! Файл содержит лишние символы\n");
- fclose(input);
- return -3;
- }
- fclose(input);
- return 0; // Успешное чтение
- }
- int find_roots(double a, double b, double c, double* root1, double* root2) {
- if (a == 0) {
- printf("Коэффициент а не может быть равен нулю. Уравнение не является квадратным\n");
- return -1; // Ошибка
- }
- // Проверка на случаи, когда b или c равны 0
- if (b == 0 && c == 0) {
- printf("Уравнение имеет бесконечно много решений (0 = 0)\n");
- return -2; // Бесконечно много решений
- }
- else if (b == 0) {
- printf("Уравнение не имеет действительных корней\n");
- return 0; // Нет корней
- }
- else if (c == 0) {
- *root1 = 0; // Первый корень
- *root2 = -b / a; // Второй корень
- printf("Корни уравнения: x1 = 0 и x2 = %.2f\n", *root2);
- return 1; // Один корень (0) и второй корень
- }
- double D = b * b - 4 * a * c; // Вычисление дискриминанта
- if (D > 0) {
- *root1 = (-b + sqrt(D)) / (2 * a);
- *root2 = (-b - sqrt(D)) / (2 * a);
- printf("Два корня: %.2f и %.2f\n", *root1, *root2);
- printf("Данные успешно записаны в файл!\n");
- return 2; // Два корня
- }
- else if (D == 0) {
- *root1 = -b / (2 * a);
- printf("Один корень: %.2f\n", *root1);
- printf("Данные успешно записаны в файл!\n");
- return 1; // Один корень
- }
- else {
- printf("Корней нет\n");
- printf("Данные успешно записаны в файл!\n");
- return 0; // Нет корней
- }
- }
- void write_results(const char* filename, double a, double b, double c, double D, double root1, double root2, int num_roots) {
- FILE* output = fopen(filename, "w");
- if (output == NULL) {
- printf("Ошибка записи файла\n");
- return;
- }
- fprintf(output, "Коэффициенты уравнения: a = %.2f, b = %.2f, c = %.2f\n", a, b, c);
- fprintf(output, "Дискриминант D = %.2f\n", D);
- if (num_roots == 2) {
- fprintf(output, "Два корня: %.2f и %.2f\n", root1, root2);
- }
- else if (num_roots == 1) {
- fprintf(output, "Корни уравнения: x1 = %.2f и x2 = %.2f\n", root1, root2);
- }
- else {
- fprintf(output, "Корней нет\n");
- }
- fclose(output);
- }
- int main() {
- system("chcp 1251>null");
- double a, b, c;
- int result = read_coef("input.txt", &a, &b, &c);
- if (result == 0) {
- printf("Коэффициенты успешно считаны: a = %.2f, b = %.2f, c = %.2f\n", a, b, c);
- double root1, root2;
- double D = b * b - 4 * a * c; // Считаем дискриминант
- int num_roots = find_roots(a, b, c, &root1, &root2); // Получаем количество корней
- // Записываем результаты в файл
- write_results("output.txt", a, b, c, D, root1, root2, num_roots);
- }
- else {
- printf("Ошибка при чтении коэффициентов\n");
- return -1;
- }
- return 0;
- }
|