Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include "string.h"
  4. #include "windows.h"
  5. #include "stdio.h"
  6.  
  7. //Это - стек, LIFO
  8.  
  9. typedef struct snd
  10. {
  11. snd *n;
  12. char str[10];
  13. } ListString;
  14.  
  15. using namespace std;
  16.  
  17. class List //Класс списка
  18. {
  19. private:
  20. snd *Head; //Указатель на последний элемент стека
  21. int last_length; //Величина, показывающая, насколько заполнен последний элемент стека
  22. int length; //Длина строки, лежащей в стеке
  23. public:
  24. List()//Конструктор
  25. {
  26. Head = NULL;
  27. length = 0;
  28. last_length = 0;
  29. }
  30. List(char * text); //Конструктор, в который мы можем передавать текст
  31. ~List(); //Деструктор вынесем за класс
  32. void Fill(char* x); //Функция, обновляющая текст в списке
  33. void Add(char* x); //Функция, добавляющая текст в конец списка
  34. void Show(); //Функция, выводящая текст в консоль
  35. void Reverse(); //Функция, меняющая регистр букв
  36. void ClearList(); //Зачищаем лист
  37. int getLength(); //Получение длины текста, лежащего в списке
  38. char * getString(); //Получение указателя на строку
  39.  
  40. };
  41.  
  42. List::getLength() //Просто вернули length
  43. {
  44. return length;
  45. }
  46.  
  47. void List::Reverse()
  48. {
  49.  
  50. snd *temp=Head; //Прицелились в начало стека
  51.  
  52. string out = "";
  53.  
  54. while (temp != NULL) //Идём по стеку
  55. {
  56. for(int i = 0; i < 10; i++) //Для каждого элемента стека проверяем каждый символ строки
  57. {
  58. if(temp->str[i] == 0)
  59. break;
  60. if(isalpha(temp->str[i])) //если это буква, то меняем её регист
  61. {
  62. if(isupper(temp->str[i]))
  63. {
  64. temp->str[i] = tolower(temp->str[i]);
  65. }
  66. else
  67. {
  68. temp->str[i] = toupper(temp->str[i]);
  69. }
  70. }
  71. }
  72. temp = temp->n;
  73. }
  74. }
  75.  
  76. List::~List() //Деструктор, освобождает память
  77. {
  78. ClearList();
  79. }
  80.  
  81. void List::ClearList(){ //Освобождаем всю память в стеке
  82. while (Head != NULL) //Бежим по стеку и очищаем указатели
  83. {
  84. snd *temp = Head->n;
  85. delete Head;
  86. Head = temp;
  87. }
  88. length = 0;
  89. last_length = 0;
  90. }
  91.  
  92. List::List(char * text) //Почти как обычный конструктор, просто мы сразу вызываем фукнцию Fill, заполняющую наш стек
  93. {
  94. Head = NULL;
  95.  
  96. Fill(text);
  97. }
  98.  
  99. void List::Fill(char* text) //Функция, заполняющая стек новыми элементами
  100. {
  101. ClearList();
  102. length = 0;
  103. last_length = 0;
  104.  
  105. Add(text); //После того, как стек пуст, заполняем его
  106. }
  107.  
  108. void List::Add(char* text) //Функция добавления текста в стек
  109. {
  110. int i, text_length = strlen(text);
  111. snd *temp;
  112. string temp_text = text;
  113.  
  114. //Сначала необходимо посмотреть, заполнен ли текущий элемент стека до конца, и заполнить и его до конца
  115.  
  116. if(last_length != 0) //Не заполнен до конца
  117. {
  118. if(text_length + last_length < 10) //Если добавление нового текста не заполнит элемент стека до конца (было "AB", добавили "CD")
  119. {
  120. memccpy(Head->str + last_length, &temp_text[0], 0, text_length); //Дописываем в конец текущего элемента новую строку
  121. Head->str[text_length + last_length] = 0; //Записали символ конца строки
  122.  
  123. last_length += text_length; //Обновили счётчик заполненности
  124.  
  125. length += text_length; //Счётчик длины строки
  126. return;
  127. }
  128. else //Если заполнит ( строка длины 9, к ней дописывают строку длины 4 - 1 элемент нужно дописать в конец текущего
  129. {
  130. memccpy(Head->str + last_length, &temp_text[0], 0, 10 - last_length); //Дописали текущий элемент
  131.  
  132. temp_text = temp_text.substr(10-last_length); //Удалили из строки уже записанное
  133. text_length = temp_text.length(); //Обновили локальную переменную, отвечающую за длину добавляемого текста
  134. }
  135. }
  136.  
  137. length += text_length; //Обновили длину
  138.  
  139. for(i = 0; i < text_length / 10; i++) //Разбиваем входной текст на куски длиной в 10 символов
  140. {
  141. temp = new snd;
  142. memccpy(temp->str, &temp_text[i*10], 0, 10); //Заполняем структуру (каждый раз прыгаем на 10 символов)
  143. temp->n = Head; //Теперь temp указывает на верхушку списка
  144. Head = temp; //temp становится верхушкой списка
  145. }
  146.  
  147. if(text_length % 10 != 0) //Если появляется остаток, то мы должны его тоже записать
  148. {
  149. last_length = text_length - i*10; //находим длину неполного элемента
  150.  
  151. temp = new snd;
  152. memccpy(temp->str, &temp_text[i*10], 0, text_length - i*10);
  153. temp->str[text_length % 10] = 0; //Добавляем строковый ноль в конец строки
  154. temp->n = Head; //Закидываем в верхушку стека
  155. Head = temp;
  156. }
  157.  
  158. }
  159.  
  160. void List::Show() //Вывод строки из стека в консоль
  161. {
  162. snd *temp=Head; //Получили ссылку на верхушку стека
  163.  
  164. string out = "";
  165.  
  166. while (temp != NULL) //Бежим по стеку и заполняем строку
  167. {
  168. out = string(temp->str).substr(0,10) + "" + out ;
  169. temp = temp->n;
  170. }
  171. cout << out << endl; //выводим строку
  172. }
  173.  
  174. char* List::getString()
  175. {
  176. snd *temp=Head; //Принцип тот же, что и в выводе строки - бежим по стеку, собираем строку, но тут мы возвращаем указатель
  177. char * result = new char[length];
  178.  
  179. string out = "";
  180.  
  181. while (temp != NULL) //?? ??? ??? ???? ?? ???????? ?????? ????????
  182. {
  183. out = string(temp->str).substr(0,10) + "" + out ;
  184. temp = temp->n;
  185. }
  186.  
  187. strcpy(result, out.c_str()); //Скопировали строку в указатель на массив
  188.  
  189. return result;
  190. }
  191.  
  192. void printMenu(){
  193. cout << "Menu:" << endl;
  194.  
  195. cout << "1) Create new list" <<endl;
  196.  
  197. cout << "2) Print list"<< endl;
  198.  
  199. cout << "3) List length" << endl;
  200.  
  201. cout << "4) Print list as a char *" <<endl;
  202.  
  203. cout << "5) Add string to list"<<endl;
  204.  
  205. cout << "6) Reverse letters capitalization"<<endl;
  206.  
  207. cout << "7) Clear list"<<endl;
  208.  
  209. cout << "8) Exit"<<endl;
  210. }
  211.  
  212. int getInput(){
  213. int choice;
  214. cin >> choice;
  215. return choice;
  216. }
  217.  
  218. int main()
  219. {
  220. //system ("chcp 1251");
  221. /*
  222.  
  223. char *str = "Tasks";
  224. List *a = new List(str);
  225.  
  226. a->Show();
  227. a->Add("MUST");
  228. a->Show();
  229. a->Add("Be");
  230. a->Show();
  231. a->Add("Done");
  232. a->Show();
  233. a->Add("By");
  234. a->Show();
  235. a->Add("Yourself");
  236. a->Show();
  237. a->Add("And only by yourself");
  238. a->Show();
  239.  
  240. cout << "Length - " << a->getLength()<<endl;
  241.  
  242. a->Reverse();
  243. cout << "Reverse - ";
  244. a->Show();
  245.  
  246. char * arr = new char [a->getLength() + 1]; //+1 потому как нужно выделить память под '0'
  247. strcpy(arr, a->getString());
  248.  
  249. cout << "Get string - " <<arr << endl;
  250.  
  251. a->Fill("Overrided text");
  252. a->Show();
  253.  
  254. */
  255.  
  256. int input = 0;
  257. string inputstr;
  258. char * inputcharbuffer;
  259.  
  260. List * a = new List();
  261.  
  262. do{
  263.  
  264. printMenu();
  265.  
  266. input = getInput();
  267. fflush(stdin);
  268.  
  269. cout << "Input - "<<(int)input <<endl;
  270.  
  271. switch(int(input)){
  272. case 1:
  273. cout << "Enter the string - ";
  274. getline(cin, inputstr);
  275. fflush(stdin);
  276.  
  277. inputcharbuffer = new char[inputstr.length() + 1];
  278.  
  279. strcpy(inputcharbuffer, inputstr.c_str());
  280.  
  281. a->Fill(inputcharbuffer);
  282.  
  283. break;
  284. case 2:
  285. a->Show();
  286. break;
  287. case 3:
  288. cout << "Total string length - " << a->getLength()<<endl;
  289. break;
  290. case 4:{
  291. char * arr = new char [a->getLength() + 1];
  292. strcpy(arr, a->getString());
  293. cout << "Get string as a char array - " <<arr << endl;
  294. break;
  295. }
  296. case 5:
  297. cout << "Enter the string - ";
  298. getline(cin, inputstr);
  299. fflush(stdin);
  300.  
  301. inputcharbuffer = new char[inputstr.length() + 1];
  302.  
  303. strcpy(inputcharbuffer, inputstr.c_str());
  304.  
  305. a->Add(inputcharbuffer);
  306.  
  307. break;
  308. case 6:
  309. a->Reverse();
  310. cout << "List reversed!"<<endl;
  311. break;
  312. case 7:
  313. a->ClearList();
  314. cout << "List cleared!"<<endl;
  315. break;
  316. default:
  317. break;
  318. }
  319.  
  320. }while(input != 8);
  321.  
  322. system("PAUSE");
  323. return 0;
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement