Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include "string.h"
  4. #include "windows.h"
  5.  
  6. //Это - стек, LIFO
  7.  
  8. typedef struct snd
  9. {
  10. snd *n;
  11. char str[10];
  12. } ListString;
  13.  
  14. using namespace std;
  15.  
  16. class List //Класс списка
  17. {
  18. private:
  19. snd *Head; //Указатель на последний элемент стека
  20. int last_length; //Величина, показывающая, насколько заполнен последний элемент стека
  21. int length; //Длина строки, лежащей в стеке
  22. public:
  23. List()//Конструктор
  24. {
  25. Head = NULL;
  26. length = 0;
  27. last_length = 0;
  28. }
  29. List(char * text); //Конструктор, в который мы можем передавать текст
  30. ~List(); //Деструктор вынесем за класс
  31. void Fill(char* x); //Функция, обновляющая текст в списке
  32. void Add(char* x); //Функция, добавляющая текст в конец списка
  33. void Show(); //Функция, выводящая текст в консоль
  34. void Reverse(); //Функция, меняющая регистр букв
  35. int getLength(); //Получение длины текста, лежащего в списке
  36. char * getString(); //Получение указателя на строку
  37.  
  38. };
  39.  
  40. List::getLength() //Просто вернули length
  41. {
  42. return length;
  43. }
  44.  
  45. void List::Reverse()
  46. {
  47.  
  48. snd *temp=Head; //Прицелились в начало стека
  49.  
  50. string out = "";
  51.  
  52. while (temp != NULL) //Идём по стеку
  53. {
  54. for(int i = 0; i < 10; i++) //Для каждого элемента стека проверяем каждый символ строки
  55. {
  56. if(temp->str[i] == 0)
  57. break;
  58. if(isalpha(temp->str[i])) //если это буква, то меняем её регист
  59. {
  60. if(isupper(temp->str[i]))
  61. {
  62. temp->str[i] = tolower(temp->str[i]);
  63. }
  64. else
  65. {
  66. temp->str[i] = toupper(temp->str[i]);
  67. }
  68. }
  69. }
  70. temp = temp->n;
  71. }
  72. }
  73.  
  74. List::~List() //Деструктор, освобождает память
  75. {
  76. while (Head != NULL) //Бежим по стеку и очищаем указатели
  77. {
  78. snd *temp = Head->n;
  79. delete Head;
  80. Head = temp;
  81. }
  82. }
  83.  
  84. List::List(char * text) //Почти как обычный конструктор, просто мы сразу вызываем фукнцию Fill, заполняющую наш стек
  85. {
  86. Head = NULL;
  87.  
  88. Fill(text);
  89. }
  90.  
  91. void List::Fill(char* text) //Функция, заполняющая стек новыми элементами
  92. {
  93. while (Head != NULL) //бежим по стеку и удаляем всё старое
  94. {
  95. snd *temp = Head->n;
  96. delete Head;
  97. Head = temp;
  98. }
  99. length = 0;
  100. last_length = 0;
  101.  
  102. Add(text); //После того, как стек пуст, заполняем его
  103. }
  104.  
  105. void List::Add(char* text) //Функция добавления текста в стек
  106. {
  107. int i, text_length = strlen(text);
  108. snd *temp;
  109. string temp_text = text;
  110.  
  111. //Сначала необходимо посмотреть, заполнен ли текущий элемент стека до конца, и заполнить и его до конца
  112.  
  113. if(last_length != 0) //Не заполнен до конца
  114. {
  115. if(text_length + last_length < 10) //Если добавление нового текста не заполнит элемент стека до конца (было "AB", добавили "CD")
  116. {
  117. memccpy(Head->str + last_length, &temp_text[0], 0, text_length); //Дописываем в конец текущего элемента новую строку
  118. Head->str[text_length + last_length] = 0; //Записали символ конца строки
  119.  
  120. last_length += text_length; //Обновили счётчик заполненности
  121.  
  122. length += text_length; //Счётчик длины строки
  123. return;
  124. }
  125. else //Если заполнит ( строка длины 9, к ней дописывают строку длины 4 - 1 элемент нужно дописать в конец текущего
  126. {
  127. memccpy(Head->str + last_length, &temp_text[0], 0, 10 - last_length); //Дописали текущий элемент
  128.  
  129. temp_text = temp_text.substr(10-last_length); //Удалили из строки уже записанное
  130. text_length = temp_text.length(); //Обновили локальную переменную, отвечающую за длину добавляемого текста
  131. }
  132. }
  133.  
  134. length += text_length; //Обновили длину
  135.  
  136. for(i = 0; i < text_length / 10; i++) //Разбиваем входной текст на куски длиной в 10 символов
  137. {
  138. temp = new snd;
  139. memccpy(temp->str, &temp_text[i*10], 0, 10); //Заполняем структуру (каждый раз прыгаем на 10 символов)
  140. temp->n = Head; //Теперь temp указывает на верхушку списка
  141. Head = temp; //temp становится верхушкой списка
  142. }
  143.  
  144. if(text_length % 10 != 0) //Если появляется остаток, то мы должны его тоже записать
  145. {
  146. last_length = text_length - i*10; //находим длину неполного элемента
  147.  
  148. temp = new snd;
  149. memccpy(temp->str, &temp_text[i*10], 0, text_length - i*10);
  150. temp->str[text_length % 10] = 0; //Добавляем строковый ноль в конец строки
  151. temp->n = Head; //Закидываем в верхушку стека
  152. Head = temp;
  153. }
  154.  
  155. }
  156.  
  157. void List::Show() //Вывод строки из стека в консоль
  158. {
  159. snd *temp=Head; //Получили ссылку на верхушку стека
  160.  
  161. string out = "";
  162.  
  163. while (temp != NULL) //Бежим по стеку и заполняем строку
  164. {
  165. out = string(temp->str).substr(0,10) + "" + out ;
  166. temp = temp->n;
  167. }
  168. cout << out << endl; //выводим строку
  169. }
  170.  
  171. char* List::getString()
  172. {
  173. snd *temp=Head; //Принцип тот же, что и в выводе строки - бежим по стеку, собираем строку, но тут мы возвращаем указатель
  174. char * result = new char[length];
  175.  
  176. string out = "";
  177.  
  178. while (temp != NULL) //?? ??? ??? ???? ?? ???????? ?????? ????????
  179. {
  180. out = string(temp->str).substr(0,10) + "" + out ;
  181. temp = temp->n;
  182. }
  183.  
  184. strcpy(result, out.c_str()); //Скопировали строку в указатель на массив
  185.  
  186. return result;
  187. }
  188.  
  189. int main()
  190. {
  191. //system ("chcp 1251");
  192.  
  193. char *str = "Tasks";
  194. List *a = new List(str);
  195.  
  196. a->Show();
  197. a->Add("MUST");
  198. a->Show();
  199. a->Add("Be");
  200. a->Show();
  201. a->Add("Done");
  202. a->Show();
  203. a->Add("By");
  204. a->Show();
  205. a->Add("Yourself");
  206. a->Show();
  207. a->Add("And only by yourself");
  208. a->Show();
  209.  
  210. cout << "Length - " << a->getLength()<<endl;
  211.  
  212. a->Reverse();
  213. cout << "Reverse - ";
  214. a->Show();
  215.  
  216. char * arr = new char [a->getLength() + 1]; //+1 потому как нужно выделить память под '0'
  217. strcpy(arr, a->getString());
  218.  
  219. cout << "Get string - " <<arr << endl;
  220.  
  221. a->Fill("Overrided text");
  222. a->Show();
  223.  
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement