Загрузка данных


// ========== ЛАБОРАТОРНАЯ РАБОТА 1 (СТАТИЧЕСКИЙ МАССИВ) ==========
int Lab1_Static() {
    system("cls");
    info();
    SetColor(11, 0);
    cout << "===============================================================================\n";
    cout << "Лабораторная работа №1 (Статический массив)\n";
    cout << "===============================================================================\n";
    SetColor(7, 0);
    cout << "Задача: Задан массив x1, x2, …, x15 (15 элементов).\n";
    cout << "        Определить номер первого отрицательного xi и номер последнего\n";
    cout << "        отрицательного xi.\n";
    cout << "===============================================================================\n\n";
    SetColor(7, 0);

    const int SIZE = 15;
    double arr[SIZE];
    cout << "Введите 15 чисел:\n";
    COORD coord = GetCursorPosition();
    COORD errorPos;

    for (int i = 0; i < SIZE; i++) {
        SetCursorPosition(coord.Y, coord.X);
        SPACEBACK(50);
        cout << "x[" << i + 1 << "] = ";
        while (true) {
            if (!ReadDoubleWithESC(arr[i])) return 0;
            // Проверка пройдена — стираем возможное сообщение об ошибке
            if (i > 0) { // очищаем строку с предыдущей ошибкой, если была
                SetCursorPosition(errorPos.Y, errorPos.X);
                SPACEBACK(50);
            }
            break;
        }
    }

    // Вывод массива через запятую
    cout << "\nМассив: ";
    for (int i = 0; i < SIZE; i++) {
        cout << arr[i];
        if (i < SIZE - 1) cout << ", ";
    }
    cout << endl;

    int firstNeg = -1;
    for (int i = 0; i < SIZE; i++) {
        if (arr[i] < 0) {
            firstNeg = i + 1;
            break;
        }
    }

    int lastNeg = -1;
    for (int i = SIZE - 1; i >= 0; i--) {
        if (arr[i] < 0) {
            lastNeg = i + 1;
            break;
        }
    }

    if (firstNeg == -1) {
        cout << "\nВ массиве нет отрицательных чисел.\n";
    }
    else {
        cout << "\nНомер первого отрицательного: " << firstNeg << endl;
        cout << "Номер последнего отрицательного: " << lastNeg << endl;
    }

    cout << "\nНажмите любую клавишу для возврата в меню...";
    (void)_getch();
    return 0;
}

// ========== ЛАБОРАТОРНАЯ РАБОТА 2 (ДИНАМИЧЕСКИЙ МАССИВ) ==========
int Lab2_Dynamic() {
    system("cls");
    info();
    SetColor(11, 0);
    cout << "===============================================================================\n";
    cout << "Лабораторная работа №2 (Динамический массив)\n";
    cout << "===============================================================================\n";
    SetColor(7, 0);
    cout << "Задача: Задан массив x1, x2, …, xN (размер N вводит пользователь).\n";
    cout << "        Определить номер первого отрицательного xi и номер последнего\n";
    cout << "        отрицательного xi.\n";
    cout << "===============================================================================\n\n";
    SetColor(7, 0);

    int N;
    cout << "Введите количество элементов массива N: ";
    if (!ReadIntWithESC(N) || N <= 0) return 0;

    double* arr = new double[N];
    cout << "Введите " << N << " чисел:\n";
    COORD coord = GetCursorPosition();
    COORD errorPos;

    for (int i = 0; i < N; i++) {
        SetCursorPosition(coord.Y, coord.X);
        SPACEBACK(50);
        cout << "x[" << i + 1 << "] = ";
        while (true) {
            if (!ReadDoubleWithESC(arr[i])) { delete[] arr; return 0; }
            break;
        }
    }

    // Вывод массива через запятую
    cout << "\nМассив: ";
    for (int i = 0; i < N; i++) {
        cout << arr[i];
        if (i < N - 1) cout << ", ";
    }
    cout << endl;

    int firstNeg = -1;
    for (int i = 0; i < N; i++) {
        if (arr[i] < 0) {
            firstNeg = i + 1;
            break;
        }
    }

    int lastNeg = -1;
    for (int i = N - 1; i >= 0; i--) {
        if (arr[i] < 0) {
            lastNeg = i + 1;
            break;
        }
    }

    if (firstNeg == -1) {
        cout << "\nВ массиве нет отрицательных чисел.\n";
    }
    else {
        cout << "\nНомер первого отрицательного: " << firstNeg << endl;
        cout << "Номер последнего отрицательного: " << lastNeg << endl;
    }

    delete[] arr;
    cout << "\nНажмите любую клавишу для возврата в меню...";
    (void)_getch();
    return 0;
}

// ========== ЛАБОРАТОРНАЯ РАБОТА 3 (ФАЙЛОВЫЙ ВВОД, ДИНАМИЧЕСКИЙ МАССИВ) ==========
int Lab3_File() {
    system("cls");
    info();
    SetColor(11, 0);
    cout << "===============================================================================\n";
    cout << "Лабораторная работа №3 (Файловый ввод, динамический массив)\n";
    cout << "===============================================================================\n";
    SetColor(7, 0);
    cout << "Задача: Прочитать из файла массив чисел. Первое число файла – размер N,\n";
    cout << "        затем N чисел. Определить номер первого отрицательного элемента\n";
    cout << "        и номер последнего отрицательного. Предусмотреть произвольный\n";
    cout << "        доступ к элементам по индексу.\n";
    cout << "===============================================================================\n\n";
    SetColor(7, 0);

    string path;
    cout << "Введите название файла (например, 1.txt): ";
    if (!ReadStringWithESC(path)) return 0;
    if (path.empty()) {
        cout << "Имя файла не может быть пустым.\n";
        system("pause");
        return 1;
    }

    ifstream fs(path);
    if (!fs.is_open()) {
        cout << "\nОшибка открытия файла \"" << path << "\"\n";
        cerr << "Детали ошибки: " << strerror(errno) << " (код " << errno << ")" << endl;
        system("pause");
        return 1;
    }
    cout << "Файл открыт.\n\n";

    int N = 0;
    fs >> N;
    if (fs.fail() || N <= 0) {
        cout << "Ошибка: некорректный размер массива. Ожидается положительное целое число.\n";
        system("pause");
        return 1;
    }

    double* arr = new (nothrow) double[N];
    if (!arr) {
        cout << "Ошибка выделения памяти.\n";
        system("pause");
        return 1;
    }

    bool error = false;
    for (int i = 0; i < N; i++) {
        string token;
        if (!(fs >> token)) {
            cout << "Ошибка: недостаточно чисел в файле (ожидалось " << N 
                 << ", прочитано " << i << ").\n";
            error = true;
            break;
        }
        for (char& c : token) if (c == '.') c = ',';
        size_t pos = 0;
        try {
            arr[i] = stod(token, &pos);
            if (pos != token.length())
                throw invalid_argument("trailing characters");
        }
        catch (...) {
            cout << "Ошибка: элемент " << i+1 << " (\"" << token 
                 << "\") не является числом.\n";
            error = true;
            break;
        }
    }

    if (error) {
        delete[] arr;
        system("pause");
        return 1;
    }

    // Вывод массива через запятую
    cout << "\nМассив: ";
    for (int i = 0; i < N; i++) {
        cout << arr[i];
        if (i < N - 1) cout << ", ";
    }
    cout << endl;

    int firstNeg = -1, lastNeg = -1;
    for (int i = 0; i < N; i++) {
        if (arr[i] < 0) {
            if (firstNeg == -1) firstNeg = i + 1;
            lastNeg = i + 1;
        }
    }

    cout << "\nРезультат:\n";
    if (firstNeg == -1) {
        cout << "Отрицательные элементы отсутствуют.\n";
    }
    else {
        cout << "Номер первого отрицательного: " << firstNeg << endl;
        cout << "Номер последнего отрицательного: " << lastNeg << endl;
    }

    // Произвольный доступ
    cout << "\nДемонстрация произвольного доступа.\n";
    while (true) {
        cout << "Введите номер элемента (1.." << N << "): ";
        int idx;
        if (!ReadIntWithESC(idx)) break;
        if (idx >= 1 && idx <= N) {
            cout << "  arr[" << idx << "] = " << arr[idx - 1] << endl;
        }
        else {
            SetColor(12, 0);
            cout << "Ошибка! Допустимый диапазон: 1.." << N << "\n";
            SetColor(7, 0);
        }
    }

    delete[] arr;
    cout << "\nНажмите любую клавишу для возврата в меню...";
    (void)_getch();
    return 0;
}

// ========== МАКРОСЫ ==========
int Macros() {
    system("cls");
    info();
    SetColor(11, 0);
    cout << "===============================================================================\n";
    cout << "Задание: Макросы Hi, Lo, Swap\n";
    cout << "===============================================================================\n";
    SetColor(7, 0);
    cout << "Задача: Продемонстировать работу макросов, выделяющих старшие и младшие\n";
    cout << "        биты числа, а также меняющих старшие и младшие биты местами.\n";
    cout << "===============================================================================\n\n";
    SetColor(7, 0);

    const unsigned char B = 230;
    const unsigned short Sh = 15678;
    const unsigned int I = 564872844;
    const unsigned long long LL = 9903331736939477691ULL;

    ENDL;
    cout << "byte: " << dec << static_cast<int>(B) << " / " << hex << static_cast<int>(B) << endl;
    cout << "--"; cout << "Размер byte: " << sizeof(B) << " байт" << endl;
    cout << "Старшие биты: " << hex << Hi(B) << "\n";
    cout << "Младшие биты: " << hex << Lo(B) << "\n";
    cout << "Старшие и младшие биты, поменянные местами: " << hex << Swap(B) << endl;

    ENDL;
    cout << "short: " << dec << Sh << " / " << hex << Sh << endl;
    cout << "--"; cout << "Размер short: " << sizeof(Sh) << " байта" << endl;
    cout << "Старшие биты: " << hex << Hi(Sh) << "\n";
    cout << "Младшие биты: " << hex << Lo(Sh) << "\n";
    cout << "Старшие и младшие биты, поменянные местами: " << hex << Swap(Sh) << endl;

    ENDL;
    cout << "integer: " << dec << I << " / " << hex << I << endl;
    cout << "--"; cout << "Размер integer: " << sizeof(I) << " байта" << endl;
    cout << "Старшие биты: " << hex << Hi(I) << "\n";
    cout << "Младшие биты: " << hex << Lo(I) << "\n";
    cout << "Старшие и младшие биты, поменянные местами: " << hex << Swap(I) << endl;

    ENDL;
    cout << "long long: " << dec << LL << " / " << hex << LL << endl;
    cout << "--"; cout << "Размер long long: " << sizeof(LL) << " байт" << endl;
    cout << "Старшие биты: " << hex << Hi(LL) << "\n";
    cout << "Младшие биты: " << hex << Lo(LL) << "\n";
    cout << "Старшие и младшие биты, поменянные местами: " << hex << Swap(LL) << endl;

    ENDL;
    system("pause");
    return 0;
}