Загрузка данных
// ========== ЛАБОРАТОРНАЯ РАБОТА 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;
}