Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <fstream>
- #include <string>
- #include <conio.h>
- #include <Windows.h>
- using namespace std;
- int main()
- {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- int m;
- int n;
- fstream f;
- string FN;
- int* arr = NULL;
- do {
- cout << "Выберите действие:\n" << "1.Создать файл с исходными данными\n" << "2.Загрузить исходные данные\n" << "3.Вывести исходные данные\n" << "4.Обработать данные\n" << "5.Завершить работу с программой";
- do {
- cout << "\nВведите номер необходимого действия: ";
- cin.ignore(cin.rdbuf()->in_avail(), '\n');
- cin >> m;
- if (cin.peek() != '\n') {
- cin.clear();
- cout << "Введённое значение некорректно.";
- continue;
- }
- if (m < 1 || m>6) {
- cout << "Введённое значение недопустимо.";
- continue;
- }
- break;
- } while (true);
- system("cls");
- bool I = true;
- switch (m) {
- case 1:
- {
- do {
- cout << "Введите количество элементов для записи, для возврата в меню введите \"*\:\n";
- cin >> ws;
- if (cin.rdbuf()->in_avail() == 2 && cin.peek() == '*')
- {
- I = false;
- break;
- }
- cin >> n;
- if (cin.peek() != '\n') {
- cin.clear();
- cin.ignore(cin.rdbuf()->in_avail(), '\n');
- cout << "Введённое значение некорректно.\n";
- continue;
- }
- if (n <= 0) {
- cout << "Введённое значение недопустимо.\n";
- continue;
- }
- if (arr != NULL) delete[]arr;
- arr = new (nothrow) int[n];
- if (!arr) {
- cout << "Ошибка выделения памяти.\n";
- continue;
- }
- I = true;
- cout << "Введите значение всех элементов массива, разделяя их Enter, для возврата в меню введите \"*\":\n";
- for (int i = 0; i < n;) {
- cout << "[" << i + 1 << "]: ";
- cin >> ws;
- if (cin.rdbuf()->in_avail() == 2 && cin.peek() == '*') {
- I = false;
- break;
- }
- cin >> arr[i];
- if (cin.peek() != '\n') {
- cin.clear();
- cout << "Введённое значение некорректно, если хотите вернуться в меню, введите \"*\",\n" << "Если хотите продолжить, то введите значение снова: ";
- cin.ignore(cin.rdbuf()->in_avail(), '\n');
- continue;
- }
- i++;
- }
- if (I == false) {
- delete[]arr;
- arr = NULL;
- break;
- }
- int b;
- do {
- cout << "Введите название файла, если хотите вернуться в меню, то введите \"*\":";
- cin.ignore(cin.rdbuf()->in_avail(), '\n');
- b = 0;
- getline(cin, FN);
- if (FN == "*") {
- I = false;
- break;
- }
- f.open(FN, ios::in);
- if (f.is_open()) {
- f.close();
- cout << "Файл с таким названием уже существует, если хотите перезаписать его, то введите \"1\", \nесли хотите ввести название снова, то \"2\", для возврата в меню введите \"*\": ";
- do {
- cin >> ws;
- if (cin.rdbuf()->in_avail() == 2 && cin.peek() == '*') {
- I = false;
- break;
- }
- cin >> b;
- if (b == 1 || b == 2) break;
- cin.clear();
- cin.ignore(cin.rdbuf()->in_avail(), '\n');
- cout << "Введённое значение недопустимо, введите его заново: " << endl;
- } while (true);
- }
- if (I == false) break;
- if (b == 2) continue;
- f.open(FN, ios_base::out | ios_base::binary);
- if (f.is_open())
- break;
- cout << "Не удалось сохранить массив в файл\n";
- } while (true);
- if (I == false)
- break;
- f.write((char*)&n, sizeof(n));
- if (f.fail()) {
- f.close();
- cout << "Данные не сохранены.";
- break;
- }
- f.write((char*)arr, n*sizeof(arr[0]));
- if (f.fail()) {
- f.close();
- cout << "Данные не сохранены.";
- break;
- }
- f.close();
- cout << "Данные сохранены.";
- break;
- } while (true);
- break;
- }
- case 2:
- {
- I = true;
- cin.ignore(1, '\n');
- do {
- cout << "Введите название файла, для возврата в меню введите \"*\":";
- getline(cin, FN);
- if (FN == "*") {
- if (arr != NULL)
- cout << "В памяти остался старый массив.";
- I = false;
- break;
- }
- f.open(FN, ios_base::in | ios_base::binary);
- if (!f.is_open()) {
- cout << "Файл \"" << FN << "\"не открылся.\n";
- continue;
- }
- f.read((char*)&n, sizeof(n));
- f.seekg(0, ios::end);
- int k;
- k = f.tellg();
- k -= sizeof(n);
- if (n * sizeof(arr[0]) != k) {
- f.close();
- cout << "Файл \"" << FN << "\"содержит некорректные данные.\n";
- continue;
- }
- if (arr != NULL) delete[]arr;
- arr = new (nothrow) int[n];
- if (!arr) {
- f.close();
- cout << "Ошибка выделения памяти.\n";
- continue;
- }
- f.seekg(sizeof(n));
- f.read((char*)arr, n * sizeof(arr[0]));
- f.close();
- break;
- } while (true);
- if (I == false) break;
- }
- case 3:
- {
- if (arr == NULL) {
- cout << "Массив не существует, выберите пункт 1 или 2";
- break;
- }
- cout << "Номер: ";
- for (int i = 1; i <= n; i++) {
- cout << setw(7) << i;
- }
- cout << "\nЭлемент:";
- for (int i = 0; i < n; i++) {
- cout << setw(7) << arr[i];
- }
- break;
- }
- case 4:
- {
- if (arr == NULL) {
- cout << "Массив не существует, выберите пункт 1 или 2";
- break;
- }
- int zeroElements = 0;
- int* D = new (nothrow) int[n];
- if (!D) {
- delete[]arr;
- f.close();
- system("cls");
- cout << "Ошибка выделения памяти!\n\n";
- system("pause");
- continue;
- }
- for (int i = 0; i < n; i++) {
- D[i] = arr[i];
- if (arr[i] == 0)
- zeroElements++;
- }
- zeroElements -= 1;
- int i = 0;
- bool isZero = false;
- while (zeroElements > 0) {
- if (D[i] == 0 && isZero) {
- zeroElements--;
- isZero = false;
- }
- else
- if (isZero)
- D[i] = 1;
- if (D[i] == 0) {
- isZero = true;
- i++;
- continue;
- }
- if (isZero)
- D[i] = 1;
- i++;
- }
- //вывод нового массива
- cout << setw(10) << "Новый массив D\n";
- cout << setw(10) << "Номер";
- for (int i = 1; i <= n; i++)
- cout << setw(4) << i;
- cout << endl << setw(10) << "Элемент";
- for (int i = 0; i < n; i++)
- cout << setw(4) << D[i];
- delete[] D;
- cout << endl << endl;
- }
- case 5:
- {
- delete[]arr;
- return 0;
- }
- }
- if (I == true) {
- cout << "\nДля продолжения нажмите любую клавишу...";
- _getch();
- }
- system("cls");
- } while (true);
- }
Advertisement
Add Comment
Please, Sign In to add comment