Advertisement
Guest User

Untitled

a guest
May 21st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 30.25 KB | None | 0 0
  1. // AlexKursach.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4.  
  5. #include "stdafx.h"
  6. #include <iostream>
  7. #include <fstream>
  8. #include <string>
  9. #include <fstream>
  10. #include <conio.h>
  11. using namespace std;
  12.  
  13. //класс, отвечающий за хранение текста и функции (методы) для оперирования им
  14. class CText {
  15. private:
  16.     string text; //наш текст
  17.     string delimeters; //строка разделителей
  18.     int numOfStrings = 0; //кол-во строк в тексте
  19. public:
  20.     void setDelimeters(string inDelimeters) { //задаем разделители
  21.         delimeters = inDelimeters;
  22.     }
  23.  
  24.     string getDelimeters() { //возвращаем строку разделителей
  25.         return delimeters;
  26.     }
  27.  
  28.  
  29.     void setText(string inText) { //задать текст
  30.         text = inText;
  31.     }
  32.  
  33.     string getText() { //возвращает наш текст
  34.         return text;
  35.     }
  36.  
  37.     void setNumOfStrings(int inNum) { //задать количество строк в тексте
  38.         numOfStrings = inNum;
  39.     }
  40.  
  41.     int getNumOfStrings() { //вернуть количество строк в тексте
  42.         return numOfStrings;
  43.     }
  44.  
  45.  
  46.     void printText() { //вывести текст на экран
  47.         cout << "Ваш текст: " << endl;
  48.         for (int i = 0; i < text.length(); i++) { //идем по строке, которая хранит текст
  49.             if (text[i] == '/n') { //если встретили перенос строки в тексте, то переходим на новую строчку
  50.                 cout << endl;
  51.             }
  52.             else { //иначе просто выводим символ из нашей строки текста
  53.                 cout << text[i];
  54.             }
  55.         }
  56.     }
  57. };
  58.  
  59. //класс, отвечающий за ввод-вывод текста
  60. class InOut {
  61. private:
  62.     string delimeters = ""; //строка разделителей
  63.     int numOfStrings = 0; //количество строк в тексте
  64. public:
  65.     //функция, которая считывает разделители с экрана. Ничего не возвращает
  66.     //входной параметр - объект типа CText(хранилище текста), передается по ссылке, т.к. нам нужно изменять его поля
  67.     void readDelimeters(CText &inText) { //считать разделители с экрана
  68.  
  69.         string temp; //временная строка, из которой мы достанем все уникальные символы
  70.  
  71.         cout << "Введите в строчку не более 5 разделителей: ";
  72.         getline(cin, temp); //считываем временную строку
  73.                             //оставляем в строке разделителей только уникальные символы
  74.         for (int i = 0; i < temp.length(); i++) { //идем по временной строке
  75.             bool b = false; //переменная, которая указывает на то, есть ли буква из временной строке в строке разделителей
  76.             for (int j = 0; j < delimeters.length(); j++) {//идем по строке разделителей
  77.                 if (temp[i] == delimeters[j]) { //если буква из временной строки уже есть в строке разделителей, то b = true
  78.                     b = true;
  79.                 }
  80.             }
  81.             if (!b) { //если b = false, т.е. буквы из временной строки не было в строке разделителей, и добавляем эту букву в строку разделителей
  82.                 delimeters += temp[i];
  83.             }
  84.         }
  85.  
  86.  
  87.  
  88.  
  89.  
  90.         if (delimeters.length() == 0) { //если пользователь ничего не ввел, то за разделитель считаем пробел
  91.             cout << endl;
  92.             cout << "Вы ввели 0 разделителей, по умолчанию будет использоваться пробел!" << endl;
  93.             cout << endl;
  94.             delimeters = " "; //присваиваем пробел к нашей строке разделителей
  95.  
  96.         }
  97.         else
  98.             if (delimeters.length() > 5) { //если пользователь ввел больше 5-ти разделителей, т.е. строка длинее пяти символов, то сохраняем только первые пять
  99.                 cout << endl;
  100.                 cout << "Вы ввели более пяти разделителей, сохранены будут только 5!" << endl;
  101.                 cout << endl;
  102.                 delimeters = delimeters.substr(0, 5); //присваиваем строке разделителей первые пять введенных символов с помощью метода substr, где 0 - это позиция, с которой берется подстрока, а 5 - кол-во символов, которое нужно взять
  103.             }
  104.             else { //если пользователь ввел 1-5 разделителей, то просто сохраняем их
  105.                 cout << endl;
  106.                 cout << "Разделители успешно сохранены!" << endl;
  107.                 cout << endl;
  108.             }
  109.  
  110.  
  111.             inText.setDelimeters(delimeters); //у объекта, который мы передали через параметр, с помощью метода setDelimeters задаем разделители delimeters
  112.     }
  113.  
  114.  
  115.     //функция, которая считывает текст из файла. Возвращает true - если файл открыт, false - если открыть не получилось
  116.     //входной параметр - объект типа CText(хранилище текста), передается по ссылке, т.к. нам нужно изменять его поля
  117.     bool readFromFile(CText &text) {
  118.         ifstream f; //создаем переменную для считывания данных из файла
  119.         bool wasOpen = false; //переменная, отвечающая за то был ли открыт файл
  120.         string str; //вспомогательная строка для считывания
  121.         string subText; //вспом. строка, для хранения текста
  122.         string name; //строка для хранения имени файла
  123.  
  124.         while (!wasOpen) { //пока wasOpen - false, цикл продолжается
  125.             cout << "Введите название файла для считывания" << endl;
  126.             cin >> name; //вводим имя файла
  127.             f.open("C:\\Alex\\kursach\\" + name + ".txt", ios::in); //открываем файл с именем name
  128.             wasOpen = f.is_open(); //wasOpen = true, если файл открылся
  129.             if (!wasOpen) { //если wasOpen - false, то ты выводим след. строку на экран
  130.                 cout << "Файл не найден!" << endl;
  131.             }
  132.             else { //если wasOpen - true, то выводим след. строку
  133.                 cout << "Файл успешно открыт" << endl;
  134.             }
  135.         }
  136.  
  137.  
  138.         //цикл, который выполняется, пока из файла f считывается строка в переменную str, с помощью функции getline
  139.         while (getline(f, str)) {
  140.            
  141.             if (isCorrect(str)) { //если разделители в начале и конце совпали
  142.                                                                  // и они не пустые, то считывание с файла заканчивается
  143.                 int key; //переменная для хранения кода нажатой клавиши
  144.                 cout << "Считана строка: " << str << endl;
  145.                 cout << "-------------------------------------------------------------" << endl;
  146.                 cout << "Найдена строка с одинаковыми разделителями в начале и в конце" << endl;
  147.                 cout << "                 Считывание из файла окончено!            " << endl;
  148.                 cout << "-------------------------------------------------------------" << endl;
  149.                 subText += str + '\n'; //добавляем к строке, хранящей текст текущую строки. Также добавляем символ переноса строки - '\n', чтобы каждая строка была с новой строчки
  150.                 numOfStrings++; //увеличиваем кол-во строк в тексте
  151.  
  152.                 cout << "Нажмите 1 для ввода двух строк с клавиатуры, или ЛЮБУЮ клавишу для продолжения" << endl;
  153.                 key = _getch(); //записываем в key код нажатой клавиши
  154.  
  155.                 if (key == 49) { //если была нажата клавиша '1', то выполняем считывание с клавиатуры
  156.                
  157.                     subText += readFromKeyboard(); //к строке, хранящей текст, добавляем результат функции считывания с клавиатуры (т.к. она возвращает строку, которая содержит текст, введенный с клавиатуры)
  158.                 }
  159.  
  160.                 break; //выход из общего цикла считывания, т.к. по условию считывание должно быть прекращено
  161.             }
  162.             else { //если разделители с начала и конца не совпали, то просто продолжаем цикл
  163.                 cout << "Считана строка: " << str << endl; //выводим этот текст и саму строку для наглядности
  164.                 numOfStrings++; //увеличиваем кол-во строк в тексте
  165.             }
  166.             subText += str + '\n'; //считанную строка с файла добавляем к строке, хранящей текст. Добавляем символ переноса строки '\n'.
  167.            
  168.         }
  169.         text.setNumOfStrings(numOfStrings); //у объекта хранилища текста вызываем метод для задания кол-ва строк в тексте
  170.         text.setText(subText); //у него же с помощью метода задаем текст, который мы считали из файла и с клавиатуры
  171.         f.close(); //закрываем файл f
  172.         return wasOpen; //возвращаем то был ли открыт файл
  173.     }
  174.  
  175.     //функция для проверки строки на одинаковые последовательности разделителей в начале и конце
  176.     //возвращает true - если в начале и конце строки одинаковые последовательности разделителей
  177.     //           false - если нет
  178.     //параметр s - строка, которую нужно проверить
  179.     bool isCorrect(string s) {
  180.         string firstDelimeters = ""; //строка для хранения разделителей с начала строки
  181.         string lastDelimeters = ""; //строка для хранения разделителей с конца строки
  182.         string temp = ""; //вспомогательная строка для переворота строки
  183.  
  184.         for (int i = 0; i < s.length(); i++) { //идем по нашей строке
  185.             if (isDelimeter(s[i])) { //если встретили разделитель, то накапливаем разделители в переменную
  186.                 firstDelimeters += s[i];
  187.             }
  188.             else {
  189.                 break; //если встретили не разделитель, то либо в начале строки идет сразу слово, либо последовательность разделителей кончилась. Выходим из цикла
  190.             }
  191.         }
  192.  
  193.         if (firstDelimeters == "") { //если мы не встретили разделители в начале строки, то возвращаем false, т.к. пустые последовательности разделителей не подходят
  194.             return false;
  195.         }
  196.  
  197.         for (int i = s.length() - 1; i >= 0; i--) { //переворачиваем нашу строку
  198.             temp += s[i];
  199.         }
  200.  
  201.  
  202.         for (int i = 0; i < temp.length(); i++) {  //идем по нашей строке
  203.             if (isDelimeter(temp[i])) {//если встретили разделитель, то накапливаем разделители в переменную
  204.                 lastDelimeters += temp[i];
  205.             }
  206.             else {
  207.                 break; //если встретили не разделитель, то либо в начале строки идет сразу слово, либо последовательность разделителей кончилась. Выходим из цикла
  208.             }
  209.         }
  210.  
  211.         if (lastDelimeters == "") { //если мы не встретили разделители в начале строки, то возвращаем false, т.к. пустые последовательности разделителей не подходят
  212.             return false;
  213.         }
  214.  
  215.         temp = ""; //обнуляем вспомогательную строку
  216.  
  217.         for (int i = lastDelimeters.length() - 1; i >= 0; i--) { //переворачиваем строку конечных разделителей, т.к. мы получили их в обратном порядке
  218.             temp += lastDelimeters[i];
  219.         }
  220.  
  221.         lastDelimeters = temp; //присваиваем конечные разделители
  222.  
  223.  
  224.         if (lastDelimeters == firstDelimeters) { //если последовательности совпадают, то возвращаем тру
  225.             return true;
  226.         }
  227.         else {
  228.             return false; //иначе false
  229.         }
  230.     }
  231.  
  232.     //функция, которая считывает две строки с клавиатуры
  233.     //возвращает строку, содержащую две строки, разделенные символов переноса строки '\n'
  234.     string readFromKeyboard() {
  235.         cin.ignore(std::numeric_limits<size_t>::max(), '\n');  //эта строка нужна для игнорирования символа переноса строки, брал из гугла, без нее не работает
  236.         string result = ""; //результирующая строка, которую вернет функция
  237.         string str; //вспомогательная строка
  238.         cout << "Идет считывание с клавиатуры!" << endl;
  239.         for (int i = 0; i < 2; i++) { //цикл, проводящий 2 итерации (задано по условию)
  240.             cout << "Введите " << i + 1 << "-ую строку: "; //выводим доп. информацию для наглядности и удобства
  241.             getline(cin, str); //с помощью getline считываем строку с клавиатуры в переменную str
  242.             numOfStrings++; //увеличиваем кол-во строк
  243.             result += str + '\n'; //к результирующей строке добавляем считанную и после нее символ переноса строки
  244.         }
  245.         cout << "Считывание с клавиатуры окончено!" << endl;
  246.         return result; //функция возвращает результирующую строку
  247.     }
  248.  
  249.     //функция, которая записывает текст в файл
  250.     //параметр - объект хранилища текста
  251.     //возвращает true - при удачном сохранении, false - при неудачном
  252.     bool writeInFile(CText inText) { //метод, отвечающий за запись нашего текста из хранилища(inText) в файл
  253.         bool wasOpen = false; //
  254.         ofstream f; //переменная f, для записи текста в файл
  255.         string name; //имя файла
  256.  
  257.         cout << "Введите имя файла, в котором нужно сохранить текст: ";
  258.         cin >> name;
  259.        
  260.         while (!fileCheck(name)) { //выполняем цикл до тех пор, пока существует файл с именем, которое вводит пользователь
  261.             cout << endl;
  262.             cout << "Такой файл уже существует" << endl;
  263.             cout << "Нажмите 1, чтобы перезаписать его или любую клавишу для создания нового файла. . ." << endl;
  264.             int key = _getch(); //храним код нажатой клавиши
  265.             if (key == 49) { //если нажата 1, то просто перезаписываем файл и выходим из цикла
  266.                 f.open("C:\\Alex\\kursach\\" + name + ".txt", ios::out);
  267.                 break;
  268.             }
  269.             else {//иначе просим пользователя ввести новое имя файла
  270.                 cout << "Введите имя файла, в котором нужно сохранить текст: ";
  271.                 cin >> name;
  272.                 if (fileCheck(name)) { //если файла с таким именем нет, то он создается
  273.                     f.open("C:\\Alex\\kursach\\" + name + ".txt", ios::out);
  274.                     break; //выходим из цикла
  275.                 }
  276.             }
  277.  
  278.         }
  279.  
  280.        
  281.         wasOpen = f.is_open(); //wasOpen = true, если файл открылся, иначе false
  282.  
  283.  
  284.         f << inText.getText(); //записываем текст из хранилища в файл
  285.  
  286.  
  287.         f.close(); //закрываем файл f
  288.         if (wasOpen == true) { //если wasOpen - true
  289.             cout << endl;
  290.             cout << "Ваш текст успешно записан в файл " + name + ".txt" << endl;
  291.             cout << endl;
  292.         }
  293.         else { //если wasOpen - false
  294.             cout << endl;
  295.             cout << "Ошибка при записи текста в файл" << endl;
  296.             cout << endl;
  297.         }
  298.         return wasOpen; //возвращаем переменную wasOpen
  299.     }
  300.  
  301.     bool fileCheck(string name) {
  302.         ifstream check;
  303.         check.open("C:\\Alex\\kursach\\" + name + ".txt", ios::in);
  304.         if (check.is_open()) {
  305.             check.close();
  306.             return false;
  307.         }
  308.         else {
  309.             check.close();
  310.             return true;
  311.         }
  312.     }
  313.  
  314.     //функция, которая проверяет входящий символ на разделитель
  315.     //параметр - символ c, который нужно проверить
  316.     //возвращает true - если c - разделитель
  317.     //          false - c - не разделитель
  318.     bool isDelimeter(char c) {
  319.         for (int i = 0; i < delimeters.length(); i++) { //идем в цикле по строке разделителй
  320.             if (c == delimeters[i]) { //если символ c равен символу из строки разделителей, то он разделитель
  321.                 return true; //функция прекращает работу, возвращает true
  322.             }
  323.         }
  324.         return false; //если cимвол c не совпал ни с одним символом из строки разделителей, то он не разделителей.
  325.                       //функция прекращает работу, возвращает false
  326.     }
  327. };
  328.  
  329. //класс для редактирования текста
  330. class TextEditor {
  331. private:
  332.     string delimeters = ""; //строка разделителей
  333. public:
  334.  
  335.     //функция, отвечающая за редактирования текста
  336.     //параметр - объект хранилища текста
  337.     void textEdit(CText &text) {
  338.         delimeters = text.getDelimeters(); //строке разделителей приравниваем разделители объекта хранилища текста, с помощью метода getDelimeters()
  339.  
  340.         int lineCounter = 1; //переменная для хранения номера строки. Изначало равна 1. т.к. изначально мы находимся на первой строке
  341.         int charCounter = 0; //переменная для хранения номера символа
  342.         string subText = text.getText(); //строка для хранения текста. приравниваем текст из хранилища с помощью метода getText
  343.         string changedText = ""; //строка для хранения измененного текста и последующего его сохранения в объект хранилища
  344.         string str; //вспомонательная строка
  345.         string userWord = ""; //строка для хранения слова, на которое нужно заменять первое слово в необрезанных строках
  346.  
  347.         int maxStrLength = 0; //максимальная длина строки
  348.         int userCutLength = 0; //длина строки до которой нужно обрезать строки, выходящие за максимальную длину
  349.  
  350.         cout << "Введите максимальную длину строки: ";
  351.         cin >> maxStrLength;
  352.         cout << "Введите длину до которой нужно обрезать строки, выходящие за максимульную длину: ";
  353.         cin >> userCutLength;
  354.         cout << "Введите слово для замены, если строка не будет обрезана: ";
  355.         cin >> userWord;
  356.        
  357.  
  358.                     //цикл для прохода по тексту
  359.                     //выполняется до тех пор пока lineCounter не будет равна номеру последней строки
  360.         while (lineCounter <= text.getNumOfStrings()) {
  361.             while (subText[charCounter] != '\n') { //цикл для накопления строки, выполняется до тех пор пока мы не встретим символ переноса строки. т.е. конец строчки
  362.                 str += subText[charCounter]; //к вспом. строке добавляем символ из строки с текстом
  363.                 charCounter++; //накапливаем переменную с кол-вом символов в строке
  364.             }
  365.  
  366.            
  367.             if (isOddBigger(subText, text.getNumOfStrings())) { //если кол-во слов в нечетных строках больше чем в четных
  368.                
  369.                 cout << "Имеет длину: " << str.length() << endl;
  370.                 if (str.length() > maxStrLength) { //проверяем длину строки
  371.                     str = str.substr(0, userCutLength); //если она больше максимальной, то обрезаем
  372.                     cout << "Выходит за границу максимальной длины. Обрезана до " << userCutLength << "-ти символов" << endl;
  373.                 }
  374.                 else {//если она меньше максимальной, то заменяем в ней первое слово
  375.                     str = wordExchange(str, userWord);
  376.                     cout << "В ней заменено первое слово" << endl;
  377.                 }
  378.             }
  379.             else { //если кол-во слов в четных строках больше
  380.                 cout << "Строка: " << str << endl; //выводим инфу для наглядности
  381.                 str = wordExchange(str, userWord);
  382.                 cout << "В ней заменено первое слово" << endl;
  383.             }
  384.  
  385.             changedText += str + '\n'; //в переменную для хранения измененного текста добавляем строку, по которой мы шли и добавляем символ переноса строки
  386.             str = ""; //обнуляем вспом. строку для чтения следующей
  387.             lineCounter++; //увеличиваем номер строки на 1
  388.             charCounter++; //увеличиваем номер символа на 1
  389.         }
  390.        
  391.  
  392.         text.setText(changedText); //с помощью метода setText задаем новый текст - changedText
  393.     }
  394.  
  395.     //функция, которая проверяет входящий символ на разделитель
  396.     //параметр - символ c, который нужно проверить
  397.     //возвращает true - если c - разделитель
  398.     //          false - c - не разделитель
  399.     bool isDelimeter(char c) {
  400.         for (int i = 0; i < delimeters.length(); i++) { //идем в цикле по строке разделителй
  401.             if (c == delimeters[i]) { //если символ c равен символу из строки разделителей, то он разделитель
  402.                 return true; //функция прекращает работу, возвращает true
  403.             }
  404.         }
  405.         return false; //если cимвол c не совпал ни с одним символом из строки разделителей, то он не разделителей.
  406.                       //функция прекращает работу, возвращает false
  407.     }
  408.  
  409.     //функция, которая проверяет на равенство кол-во слов в четных и нечетных строках
  410.     //параметры: text - строка, хранящая текст
  411.     //           numOfStrings - кол-во строк в тексте
  412.     //возвращает true - если кол-во слов в нечетных строках больше
  413.     //           false - в других случаях
  414.     bool isOddBigger(string text, int numOfStrings) {
  415.         int oddWordCounter = 0; //счетчик слов в нечетных строках
  416.         int notOddWordCounter = 0; //счетчик слов в четных строках
  417.         int charCounter = 0; //вспомогательный счетчик символов для продвижения по тексту
  418.         string str = ""; //вспомогательная строка, для хранения отдельной строки из текста
  419.         int lineCounter = 1; //счетчик номера строки
  420.  
  421.         while (lineCounter <= numOfStrings) { //идем по тексту, пока не дойдем до последней сроки
  422.             while (text[charCounter] != '\n') { //цикл для накопления строки, выполняется до тех пор пока мы не встретим символ переноса строки. т.е. конец строчки
  423.                 str += text[charCounter]; //к вспом. строке добавляем символ из строки с текстом
  424.                 charCounter++; //накапливаем переменную с кол-вом символов в строке
  425.             }
  426.  
  427.            
  428.            
  429.             bool wordIsFound = false; //переменная, говорящая о том, встречено ли слово в строке
  430.             for (int i = 0; i < str.length(); i++) {//идем по строке
  431.                 if (!isDelimeter(str[i])) {//если встречаем неразделитель, то либо мы встретили слово, либо еще движемся по слову. Для того, чтобы это понять
  432.                     if (!wordIsFound) { //смотрим переменную wordIsFound
  433.                         if (lineCounter % 2 != 0) { //если строка нечетная, то накапливаем нужный счетчик
  434.                             oddWordCounter++;
  435.                         }
  436.                         else {//иначе накапливаем другой счетчик
  437.                             notOddWordCounter++;
  438.                         }
  439.                         wordIsFound = true; //переключаем переменную wordIsFound
  440.  
  441.                     }
  442.                
  443.                 }
  444.                 else { //иначе переключаем wordIsFound
  445.                     wordIsFound = false;
  446.                 }
  447.                    
  448.             }
  449.  
  450.            
  451.  
  452.            
  453.             str = ""; //обнуляем вспом. строку для чтения следующей
  454.             lineCounter++; //увеличиваем номер строки на 1
  455.             charCounter++; //увеличиваем номер символа на 1
  456.         }
  457.         if (oddWordCounter > notOddWordCounter) { //если кол-во слов в нечетных строках больше, то возвращаем true
  458.             return true;
  459.         }
  460.         return false; //иначе false
  461.     }
  462.  
  463.     //функция для того, чтобы поменять первое слово в строке
  464.     //параметры: str - строка
  465.     //           exchangeWord - слово, на которое нужно поменять
  466.     //возвращаем измененную строку
  467.     string wordExchange(string str, string exchangeWord) {
  468.         bool wordIsFound = false; //вспом. переменная
  469.        
  470.         string result = ""; //результирующая строка, которую мы вернем
  471.         for (int i = 0; i < str.length(); i++) { //идем по строке
  472.             if (!isDelimeter(str[i])) { //если встретили неразделитель, то мы встретили слово, либо еще идем по слову
  473.                 if (wordIsFound) {//если слово найдено, то накапливаем строку в result
  474.                     result += str[i];
  475.                 }
  476.                 else { //иначе переключаем wordIsFound
  477.                     wordIsFound = true;
  478.                     while (!isDelimeter(str[i]) && i < str.length()) { //цикл, в котором мы проскочим первое слово, и не добавим его в result
  479.                         i++; //просто переходим к след. символу
  480.                     }
  481.                     result += exchangeWord; //добавляем в result нужное слово
  482.                     if (str[i] != '\n' && i < str.length()) { //условие, для того, чтобы добавить разделитель после слова
  483.                         result += str[i];
  484.                     }
  485.                 }
  486.             }
  487.             else { //иначе просто накапливаем result
  488.                 result += str[i];
  489.             }
  490.            
  491.            
  492.         }
  493.         return result; //возвращаем результат
  494.     }
  495.  
  496.  
  497. };
  498.  
  499. int main()
  500. {
  501.     setlocale(0, "");
  502.  
  503.     CText text; //создаем объекта хранилища текста
  504.     InOut io; //создаем объект ввода-вывода
  505.     TextEditor te; //создаем объект редактирования
  506.  
  507.  
  508.     io.readDelimeters(text); //считываем разделители, сохраняем в объект хранилища
  509.     io.readFromFile(text); //считываем текст из файла и клавы, сохраняем в объект хранилища
  510.     te.textEdit(text); //редактируем текст из объекта хранилища, сохраняем в объект хранилища
  511.     io.writeInFile(text); //записываем текст из объекта хринилища в файл
  512.     text.printText(); //выводим текст из объекта хранилища на экран
  513.  
  514.  
  515.  
  516.     system("pause");
  517.     return 0;
  518. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement