Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <stdlib.h>
- #include <Windows.h>
- #include <string>
- #include <fstream>
- #include <iomanip>
- using namespace std;
- bool onlyNum(const string s)
- {
- bool decimal = false; //Переменная, отвечающая за наличие символа - разделителя разрядов в числе
- bool sign = false; //Переменная, отвечающая за наличие знака у числа
- bool pow = false;//Переменная, отвечающая за наличие сокращения экспоненциальной степени у числа
- for (int i = 0; i < s.length(); i++) //Перебирая все символы строки
- {
- if (s.at(i) == 'e' || s.at(i) == 'E')//Если находим символ степени
- if (!pow && i != 0 && i != s.length() - 1)//Если у него хотя бы теоретически есть валидные значения основания и степени и мы его еще не находили
- pow = true;//Отмечаем, что нашли
- else//Иначе
- return false;//Неверный ввод
- else if (s.at(i) == '+' || s.at(i) == '-')//Если находим знак
- if (!sign && i == 0 && s.length() > 1)//Если он еще не был найден и мы находимся на 1 символе
- sign = true;//Отмечаем, что нашли его
- else//Иначе
- return false;//Неверный ввод
- else if (s.at(i) == '.' || s.at(i) == ',') //Если находим символ-разделитель разрядов
- if (!decimal) //Если он еще не был найден
- decimal = true; //Отмечаем, что нашли его
- else //Если мы его уже находили и нашли еще раз
- return false; //Неверный ввод
- else if ((s.at(i) < '0' || s.at(i) > '9') && s.at(i) != ' ' && s.at(i) != '\t') //Если встречаем не число и при этом не символ-разделитель
- return false; //Неверный ввод
- }
- return true; //Верный ввод
- }
- double *createFile(unsigned int &size) {
- string s;
- string c;
- string fileName;
- ofstream fout;
- bool failed = false;
- while (true) {
- cout << "Введите количество элементов массива" << endl;
- getline(cin, s); //Считываем количество элементов
- if (atoi(s.c_str()) == atof(s.c_str()) && onlyNum(s) && atoi(s.c_str()) > -1) { //Если число целое, валидное и как минимум 0
- size = atoi(s.c_str()); //Записываем его
- break;
- }
- else //Иначе невалидный ввод
- cout << "Неверный ввод\n\n";
- }
- cout << '\n';
- double* arr = new(std::nothrow) double[size]; //Выделяем память под массив, флаг nothrow скидывает обработку возможных проблем выделения памяти на нас
- if (arr == nullptr) { //Если память не выделилась
- delete(arr); //Очищаем указатель
- cout << "Неудачная попытка выделения памяти под массив\n";
- getchar();
- return nullptr; //Возвращаем нулевой указатель
- }
- for (int i = 0; i < size; i++) { //Цикл чтения массива
- cout << "Введите " << i + 1 << " элемент массива : ";
- getline(cin, s); //Считываем очередной элемент
- while (!onlyNum(s)) { //Пока он не валиден
- cout << "Неверный ввод " << i + 1 << " элемента массива, попробуйте ещё раз : ";
- getline(cin, s); //Считываем ещё один
- }
- while (true) {
- try {
- while (s.find(",") != s.npos)
- s.replace(s.find(","), 1, ".");
- arr[i] = stod(s.c_str()); //Пытаемся перевести в double
- break;
- }
- catch (out_of_range err) { //Обрабатываем переполнение
- cout << "Переполнение типа " << i + 1 << " элемента массива, попробуйте ещё раз : ";
- getline(cin, s); //Считываем ещё один
- }
- }
- }
- while (!fout.is_open()) { //Работа с файлом
- cout << "\nВведите имя файла : ";
- getline(cin, fileName); //Считываем имя
- fout.open(fileName, ios::_Nocreate | ios::binary); //Открываем без удаления существующего в бинарном режиме
- if (fout.is_open()) { //Если смогли открыть
- cout << "Обнаружен файл с таким именем, разрешить перезаписать? (y - да, n - нет)\n";
- getline(cin, c); //Считываем ответ пользователя
- while (c.at(0) != 'y' && c.at(0) != 'Y' && c.at(0) != 'у' && c.at(0) != 'У' && c.at(0) != 'n' && c.at(0) != 'N' && c.length() > 1) { //Если он не валидный
- cout << "Введен неправильный ответ, попробуйте еще раз" << endl;
- getline(cin, c); //Считываем ещё один
- }
- switch (c.at(0)) { //Обрабатываем ответ пользователя
- case 'y':
- case 'Y':
- case 'у':
- case 'У':
- fout.close();
- fout.open(fileName, ios::trunc | ios::binary); //Если он да, то перезаписываем файл
- break;
- case 'n':
- case 'N':
- fout.close(); //Если нет, то просто закрываем поток
- break;
- default:
- break;
- }
- }
- else {
- fout.close();
- fout.open(fileName, ios::binary); //Если не открыли, значит такого файла нет и просто создаем его
- }
- }
- fout.write((char*)arr, size * sizeof(double)); //Записываем в файл массив
- fout.close(); //Закрываем поток
- return arr;
- }
- double *loadFile(unsigned int &size) {
- string fileName;
- ifstream fin;
- int t;
- double a;
- bool failed = false;
- while (!fin.is_open()) { //Пока не открыли файл
- if (failed)
- cout << "Неудачная попытка открытия\n";
- cout << "Введите имя файла: ";
- getline(cin, fileName); //Считываем имя
- fin.open(fileName, ios::binary); //Пытаемся открыть
- failed = true; //Если файл открылся, цикл не запустится ещё раз, в другом случае скажем об этом в начала следующей итерации
- }
- fin.seekg(0, ios::end); //Двигаем указател ьв конец файла
- t = fin.tellg(); //Берем его позицию
- size = t / sizeof(double); //Узнаем размер массива
- fin.seekg(0, ios::beg); //Двигаем указатель в начало
- double* arr = new(std::nothrow) double[size]; //Выделяем память под массив
- if (arr == nullptr) { //Обработка проблем с выделением памяти
- delete(arr);
- cout << "Неудачная попытка выделения памяти под массив\n";
- fin.close();
- getchar();
- return nullptr;
- }
- fin.clear();
- fin.read((char*)arr, size * sizeof(double)); //Считываем массив без проверки входных данных
- fin.close(); //Закрываем поток
- return arr;
- }
- void showData(double *arr, unsigned int size) {
- cout << setw(10) << "Номера: ";
- for (unsigned int i = 0; i < size; i++) { //Выводим номера элементов массива
- cout << setw(8) << i << ' ';
- }
- cout << setw(10) << "\nЭлементы: ";
- for (unsigned int i = 0; i < size; i++) { //Выводим элементы массива
- cout << setw(8) << arr[i] << ' ';
- }
- cout << '\n';
- }
- void workWithFile(double *arr, unsigned int size) {
- double min = arr[0]; //Изначально минимальный элемент - первый
- for (unsigned int i = 1; i < size; i++) //Проходя по всему циклу, находим минимальынй элемент
- if (min < arr[i])
- min = arr[i];
- min = (min > 18.3) ? (2) : (0.5); //Если он больше 18.3, то наш множитель 2, в другом случае 1/2
- for (unsigned int i = 0; i < size; i++)//Применяем множитель к каждому элементу массива
- arr[i] = arr[i] * min;
- showData(arr, size); //Выводим измененный массив
- }
- void menu() {
- cout << "1. Создать файл с исходными данными\n"
- << "2. Загрузить исходные данные\n"
- << "3. Вывести исходные данные\n"
- << "4. Обработать данные\n"
- << "5. Завершить работу с программой\n";
- }
- double *menu_select(string c, double *arr, unsigned int &size) {
- if (c.length() != 1) //Если введен не 1 символ, то ввод не валиден
- cout << "Неверный ввод\n\n";
- else
- switch (c.c_str()[0]) {
- case '1':
- {
- system("cls");//Очищаем экран
- arr = createFile(size);//Создаем файл и возвращаем считанный массив
- if (arr == nullptr) //Проверяем, что память под него выделилась
- exit(1); //Если нет, то выходим из программы
- break;
- }
- case '2':
- {
- system("cls");//Очищаем экран
- arr = loadFile(size);//Читаем файл и возвращаем считанный массив
- if (arr == nullptr) //Проверям, что памят ьвыделена
- exit(1); //Если нет, то выходим
- showData(arr, size); //Выводим считанные данные
- break;
- }
- case '3':
- {
- system("cls");//Очищаем экран
- if (arr != nullptr) //Если данные уже были считаны
- showData(arr, size); //Выводим их
- else//Иначе
- cout << "Не обнаружены данные для работы\n";
- break;
- }
- case '4':
- {
- system("cls");//Очищаем экран
- if (arr != nullptr)//Если данные уже были считаны
- workWithFile(arr, size);//Работаем с ними
- else//Иначе
- cout << "Не обнаружены данные для работы\n";
- break;
- }
- case '5':
- {
- delete(arr);//очищаем выделенную память
- exit(1);//Выходим из программы
- break;
- }
- default:
- {
- cout << "Неверный ввод\n";
- break;
- }
- }
- return arr;
- }
- int main() {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);//Русский язык))
- string c;
- double *arr = nullptr;
- unsigned int size = 0;
- while (true)
- {
- system("cls");//Очищаем экран
- menu();//Выводим меню
- getline(cin, c);//Считываем ответ пользователя
- arr = menu_select(c, arr, size);//Выполняем нужное действие
- cout << "Нажмите любую кнопку чтобы продолжить...\n";
- getchar();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement