Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- #include <stdlib.h>
- using namespace std;
- string convertToRoman(int);
- bool checkText(const string&);
- bool checkNum(char);
- void searchNumbers(const string&, int*&);
- int chooseWay(const int);
- void inputText(string&, const int);
- string inputFileName(const int);
- void inputFromFile(string&, string&);
- void inputFromConsole(string&);
- void outputNumbers(const int*, const int);
- void outputInFile(string&, const int*);
- void outputInConsole(const int*);
- bool checkColonInFileName(string&);
- const int INPUT = 1,
- OUTPUT = 2,
- NULL_CODE = 48,
- NINE_CODE = 57;
- int main()
- {
- system("chcp 1251 > nul");
- string text;
- int choice, *numbers;
- cout << "Программа выводит содержащиеся в тексте (текст должен содержать от 1 до 4 цифровых символов, отображающих целые числа от 1 до 2000) числа в десятичной и римской системах счисления.\n";
- choice = chooseWay(INPUT);
- inputText(text, choice);
- searchNumbers(text, numbers);
- choice = chooseWay(OUTPUT);
- outputNumbers(numbers, choice);
- return 0;
- }
- string convertToRoman(int number)
- {
- const string romanNumbers[10][4] {{"", "", "", ""},
- {"M", "C,", "X", "I"},
- {"MM", "CC", "XX", "II"},
- {"", "CCC", "XXX", "III"},
- {"", "CD", "XL", "IV"},
- {"", "D", "L", "V"},
- {"", "DC", "LX", "VI"},
- {"", "DCC", "LXX", "VII"},
- {"", "DCCC", "LXXX", "VIII"},
- {"", "CM", "XC", "IX"}};
- int counter;
- string convertedNum;
- convertedNum = "";
- counter = 3;
- while (number != 0) {
- convertedNum = romanNumbers[number % 10][counter] + convertedNum;
- number = number / 10;
- counter--;
- }
- return convertedNum;
- }
- bool checkText(const string& text)
- {
- string foundedNum;
- bool isCorrect;
- int quantityNumbers, position;
- quantityNumbers = 0;
- position = 0;
- isCorrect = true;
- while (isCorrect && position < text.length()) {
- if (checkNum(text[position])) {
- foundedNum = foundedNum + text[position];
- quantityNumbers++;
- position++;
- while (quantityNumbers <= 4 && position < text.length() && checkNum(text[position])) {
- foundedNum = foundedNum + text[position];
- position++;
- quantityNumbers++;
- }
- if ((quantityNumbers > 4) || (stoi(foundedNum) == 0) || stoi(foundedNum) > 2000)
- isCorrect = false;
- foundedNum = "";
- }
- position++;
- }
- if (quantityNumbers == 0)
- isCorrect = false;
- return isCorrect;
- }
- bool checkNum(char verifiableNum)
- {
- bool isNum;
- int i;
- isNum = false;
- i = NULL_CODE;
- while (!isNum && (i <= NINE_CODE)) {
- isNum = verifiableNum == i;
- i++;
- }
- return isNum;
- }
- void searchNumbers(const string& text, int *& arrayNumbers)
- {
- string foundedNum;
- int position, length;
- position = 0;
- length = 0;
- arrayNumbers = new int[4] {0, 0, 0, 0};
- while (position < text.length()) {
- if (checkNum(text[position])) {
- foundedNum = foundedNum + text[position];
- length++;
- position++;
- while (position < text.length() && checkNum(text[position])) {
- foundedNum = foundedNum + text[position];
- position++;
- }
- arrayNumbers[length - 1] = stoi(foundedNum);
- foundedNum = "";
- }
- position++;
- }
- }
- int chooseWay(const int IorOput)
- {
- int choice;
- bool isNotCorrect;
- switch (IorOput) {
- case INPUT:
- cout << "Выберите вариант ввода:\n";
- cout << "1.Данные вводятся из текстового файла.\n";
- cout << "2.Данные вводятся через консоль.\n";
- break;
- default:
- cout << "Выберите вариант вывода:\n";
- cout << "1.Данные выводятся в текстовый файл.\n";
- cout << "2.Данные выводятся в консоль.\n";
- }
- do {
- cin >> choice;
- if (cin.fail() || cin.get() != '\n') {
- isNotCorrect = true;
- cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
- cin.clear();
- while (cin.get() != '\n');
- }
- else if ((choice < 1) || (choice > 2)) {
- cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
- isNotCorrect = true;
- }
- else
- isNotCorrect = false;
- } while (isNotCorrect);
- return choice;
- }
- void inputText(string& text, const int choice)
- {
- text = "";
- switch (choice) {
- case 1: {
- string fileName;
- bool isCorrect;
- do {
- fileName = inputFileName(INPUT);
- inputFromFile(text, fileName);
- isCorrect = checkText(text);
- if (!isCorrect)
- cout << "Введенный текст не соответствует условию! Повторите ввод имени файла.\n";
- } while (!isCorrect);
- break;
- }
- default:
- inputFromConsole(text);
- }
- }
- string inputFileName(const int inOrOut)
- {
- string fileName;
- switch (inOrOut) {
- case INPUT: {
- cout << "Введите имя файла, из которого будут вводиться данные:\n";
- ifstream in;
- do {
- getline(cin, fileName);
- if (fileName.ends_with(".txt")) {
- in.open(fileName);
- if (in.is_open()) {
- in.close();
- return fileName;
- }
- else
- cout << "Невозможно открыть файл с таким именем! Повторите ввод имени файла:\n";
- }
- else
- cout << "Файл должен иметь расширение .txt! Повторите ввод имени файла:\n";
- } while (true);
- break;
- }
- default: {
- cout << "Введите имя файла, в который будут выводиться полученные данные (если файл вводится без расширения, то ему автоматически будет добавлено расширение .txt):\n";
- ofstream out;
- do {
- getline(cin, fileName);
- if (fileName.find(".") == string::npos)
- fileName = fileName + ".txt";
- out.open(fileName);
- if (out.is_open()) {
- out.close();
- return fileName;
- }
- else
- cout << "Невозможно открыть или создать файл с таким именем! Повторите ввод имени файла:\n";
- } while (true);
- }
- }
- }
- void inputFromFile(string& text, string& fileName)
- {
- ifstream in;
- string fileString;
- text = "";
- in.open(fileName);
- while (!in.eof()) {
- getline(in, fileString);
- text = text + fileString;
- }
- }
- void inputFromConsole(string& text)
- {
- bool isCorrect;
- do {
- cout << "Введите строку для обработки:\n";
- getline(cin, text);
- isCorrect = checkText(text);
- if (!isCorrect)
- cout << "Введенная строка не соответствует условию! Повторите ввод.\n";
- } while (!isCorrect);
- }
- void outputNumbers(const int* numbers, const int choice)
- {
- switch (choice) {
- case 1: {
- string fileName;
- fileName = inputFileName(OUTPUT);
- outputInFile(fileName, numbers);
- cout << "Искомые данные выведены в файл " << fileName;
- break;
- }
- default:
- outputInConsole(numbers);
- }
- }
- void outputInFile(string& fileName, const int* numbers)
- {
- int i;
- ofstream out;
- out.open(fileName);
- i = 0;
- while ((numbers[i] != 0) && (i < 4)) {
- out << numbers[i] << ' ';
- i++;
- }
- out << '\n';
- i = 0;
- while ((numbers[i] != 0) && (i < 4)) {
- out << convertToRoman(numbers[i]) << ' ';
- i++;
- }
- out.close();
- }
- void outputInConsole(const int* numbers)
- {
- int i;
- cout << "Искомые числа:\n";
- i = 0;
- while ((numbers[i] != 0) && (i < 4)) {
- cout << numbers[i] << ' ';
- i++;
- }
- cout << '\n';
- cout << "Их представление в римской системе счисления:\n";
- i = 0;
- while ((numbers[i] != 0) && (i < 4)) {
- cout << convertToRoman(numbers[i]) << ' ';
- i++;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement