#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <Windows.h>

HANDLE CreateFile(
    LPCTSTR lpFileName, // Указатель на имя файла (устройства)
    DWORD dwDesiredAccess, //Параметры доступа
    DWORD dwShareMode, //Разделяемый доступ
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, //безопасность
    DWORD dwCreationDistribution,// Описание
    DWORD dwFlagsAndAttributes, // Атрибуты файла
    HANDLE hTemplateFile // Файл шаблона
);

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* D, 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) и второй корень
    }

    *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 D, root1, root2;
        int num_roots = find_roots(a, b, c, &D, &root1, &root2); // Получаем количество корней
        // Записываем результаты в файл
        write_results("output.txt", a, b, c, D, root1, root2, num_roots);
    }
    else {
        printf("Ошибка при чтении коэффициентов\n");
        return -1;
    }
    return 0;
}
