Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include "string.h"
- #include "windows.h"
- #include "stdio.h"
- //Это - стек, LIFO
- typedef struct snd
- {
- snd *n;
- char str[10];
- } ListString;
- using namespace std;
- class List //Класс списка
- {
- private:
- snd *Head; //Указатель на последний элемент стека
- int last_length; //Величина, показывающая, насколько заполнен последний элемент стека
- int length; //Длина строки, лежащей в стеке
- public:
- List()//Конструктор
- {
- Head = NULL;
- length = 0;
- last_length = 0;
- }
- List(char * text); //Конструктор, в который мы можем передавать текст
- ~List(); //Деструктор вынесем за класс
- void Fill(char* x); //Функция, обновляющая текст в списке
- void Add(char* x); //Функция, добавляющая текст в конец списка
- void Show(); //Функция, выводящая текст в консоль
- void Reverse(); //Функция, меняющая регистр букв
- void ClearList(); //Зачищаем лист
- int getLength(); //Получение длины текста, лежащего в списке
- char * getString(); //Получение указателя на строку
- };
- List::getLength() //Просто вернули length
- {
- return length;
- }
- void List::Reverse()
- {
- snd *temp=Head; //Прицелились в начало стека
- string out = "";
- while (temp != NULL) //Идём по стеку
- {
- for(int i = 0; i < 10; i++) //Для каждого элемента стека проверяем каждый символ строки
- {
- if(temp->str[i] == 0)
- break;
- if(isalpha(temp->str[i])) //если это буква, то меняем её регист
- {
- if(isupper(temp->str[i]))
- {
- temp->str[i] = tolower(temp->str[i]);
- }
- else
- {
- temp->str[i] = toupper(temp->str[i]);
- }
- }
- }
- temp = temp->n;
- }
- }
- List::~List() //Деструктор, освобождает память
- {
- ClearList();
- }
- void List::ClearList(){ //Освобождаем всю память в стеке
- while (Head != NULL) //Бежим по стеку и очищаем указатели
- {
- snd *temp = Head->n;
- delete Head;
- Head = temp;
- }
- length = 0;
- last_length = 0;
- }
- List::List(char * text) //Почти как обычный конструктор, просто мы сразу вызываем фукнцию Fill, заполняющую наш стек
- {
- Head = NULL;
- Fill(text);
- }
- void List::Fill(char* text) //Функция, заполняющая стек новыми элементами
- {
- ClearList();
- length = 0;
- last_length = 0;
- Add(text); //После того, как стек пуст, заполняем его
- }
- void List::Add(char* text) //Функция добавления текста в стек
- {
- int i, text_length = strlen(text);
- snd *temp;
- string temp_text = text;
- //Сначала необходимо посмотреть, заполнен ли текущий элемент стека до конца, и заполнить и его до конца
- if(last_length != 0) //Не заполнен до конца
- {
- if(text_length + last_length < 10) //Если добавление нового текста не заполнит элемент стека до конца (было "AB", добавили "CD")
- {
- memccpy(Head->str + last_length, &temp_text[0], 0, text_length); //Дописываем в конец текущего элемента новую строку
- Head->str[text_length + last_length] = 0; //Записали символ конца строки
- last_length += text_length; //Обновили счётчик заполненности
- length += text_length; //Счётчик длины строки
- return;
- }
- else //Если заполнит ( строка длины 9, к ней дописывают строку длины 4 - 1 элемент нужно дописать в конец текущего
- {
- memccpy(Head->str + last_length, &temp_text[0], 0, 10 - last_length); //Дописали текущий элемент
- temp_text = temp_text.substr(10-last_length); //Удалили из строки уже записанное
- text_length = temp_text.length(); //Обновили локальную переменную, отвечающую за длину добавляемого текста
- }
- }
- length += text_length; //Обновили длину
- for(i = 0; i < text_length / 10; i++) //Разбиваем входной текст на куски длиной в 10 символов
- {
- temp = new snd;
- memccpy(temp->str, &temp_text[i*10], 0, 10); //Заполняем структуру (каждый раз прыгаем на 10 символов)
- temp->n = Head; //Теперь temp указывает на верхушку списка
- Head = temp; //temp становится верхушкой списка
- }
- if(text_length % 10 != 0) //Если появляется остаток, то мы должны его тоже записать
- {
- last_length = text_length - i*10; //находим длину неполного элемента
- temp = new snd;
- memccpy(temp->str, &temp_text[i*10], 0, text_length - i*10);
- temp->str[text_length % 10] = 0; //Добавляем строковый ноль в конец строки
- temp->n = Head; //Закидываем в верхушку стека
- Head = temp;
- }
- }
- void List::Show() //Вывод строки из стека в консоль
- {
- snd *temp=Head; //Получили ссылку на верхушку стека
- string out = "";
- while (temp != NULL) //Бежим по стеку и заполняем строку
- {
- out = string(temp->str).substr(0,10) + "" + out ;
- temp = temp->n;
- }
- cout << out << endl; //выводим строку
- }
- char* List::getString()
- {
- snd *temp=Head; //Принцип тот же, что и в выводе строки - бежим по стеку, собираем строку, но тут мы возвращаем указатель
- char * result = new char[length];
- string out = "";
- while (temp != NULL) //?? ??? ??? ???? ?? ???????? ?????? ????????
- {
- out = string(temp->str).substr(0,10) + "" + out ;
- temp = temp->n;
- }
- strcpy(result, out.c_str()); //Скопировали строку в указатель на массив
- return result;
- }
- void printMenu(){
- cout << "Menu:" << endl;
- cout << "1) Create new list" <<endl;
- cout << "2) Print list"<< endl;
- cout << "3) List length" << endl;
- cout << "4) Print list as a char *" <<endl;
- cout << "5) Add string to list"<<endl;
- cout << "6) Reverse letters capitalization"<<endl;
- cout << "7) Clear list"<<endl;
- cout << "8) Exit"<<endl;
- }
- int getInput(){
- int choice;
- cin >> choice;
- return choice;
- }
- int main()
- {
- //system ("chcp 1251");
- /*
- char *str = "Tasks";
- List *a = new List(str);
- a->Show();
- a->Add("MUST");
- a->Show();
- a->Add("Be");
- a->Show();
- a->Add("Done");
- a->Show();
- a->Add("By");
- a->Show();
- a->Add("Yourself");
- a->Show();
- a->Add("And only by yourself");
- a->Show();
- cout << "Length - " << a->getLength()<<endl;
- a->Reverse();
- cout << "Reverse - ";
- a->Show();
- char * arr = new char [a->getLength() + 1]; //+1 потому как нужно выделить память под '0'
- strcpy(arr, a->getString());
- cout << "Get string - " <<arr << endl;
- a->Fill("Overrided text");
- a->Show();
- */
- int input = 0;
- string inputstr;
- char * inputcharbuffer;
- List * a = new List();
- do{
- printMenu();
- input = getInput();
- fflush(stdin);
- cout << "Input - "<<(int)input <<endl;
- switch(int(input)){
- case 1:
- cout << "Enter the string - ";
- getline(cin, inputstr);
- fflush(stdin);
- inputcharbuffer = new char[inputstr.length() + 1];
- strcpy(inputcharbuffer, inputstr.c_str());
- a->Fill(inputcharbuffer);
- break;
- case 2:
- a->Show();
- break;
- case 3:
- cout << "Total string length - " << a->getLength()<<endl;
- break;
- case 4:{
- char * arr = new char [a->getLength() + 1];
- strcpy(arr, a->getString());
- cout << "Get string as a char array - " <<arr << endl;
- break;
- }
- case 5:
- cout << "Enter the string - ";
- getline(cin, inputstr);
- fflush(stdin);
- inputcharbuffer = new char[inputstr.length() + 1];
- strcpy(inputcharbuffer, inputstr.c_str());
- a->Add(inputcharbuffer);
- break;
- case 6:
- a->Reverse();
- cout << "List reversed!"<<endl;
- break;
- case 7:
- a->ClearList();
- cout << "List cleared!"<<endl;
- break;
- default:
- break;
- }
- }while(input != 8);
- system("PAUSE");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement