Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_10_Строки.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
171 Кб
Скачать
☆

Пример на многомерные динамические массивы

/*

Рассмотрим следующую задачу: необходимо создать массив, позволяющий создавать строки и работать с ними (аналог справочника). Для работы с этим массивом строк определен такой набор операций:

  • 1) добавление строки в конец массива;

  • 2) вставка строки в массив по заданному индексу;

  • 3) удаление строки из массива по заданному индексу;

  • 4) очистка массива (удаление всех строк);

  • 5) вывод на экран содержимого массива.

*/

#include <iostream.h>

#include <string.h>

// Набор констант, представляющих различные пункты меню

enum {ChoiceAddEnd=1, ChoiceInsert, ChoiceDelete, ChoiceDeleteAll, ChoicePrint, ChoiceQuit};

int Menu(); // Вывод меню

char** AddLine(char**, int&); // Добавление строки в конец массива

char** InsLine(char**, int&); // Вставка строки в массив

char** DelLine(char**, int&); // Удаление указанной строки из массива

void DelAllLines(char**, int&); // Удаление всех строк массива

void Print(char**, int); // Распечатка строк массива

bool IsArrayEmpty(int&); // Проверка на наличие строк в массиве

void main()

{

char **c; // Массив строк

int m = 0; // Начальное количество строк массива

int choice = ChoiceAddEnd;

while (choice != ChoiceQuit) // Пока не выбран пункт ВЫХОД

{

choice = Menu(); // Вывод меню

cin.ignore(1); // Очистка потока ввода

switch (choice) // Выбор пункта меню

{

case ChoiceAddEnd:

c = AddLine(c, m); // Добавление строки в конец массива

break;

case ChoiceInsert:

c = InsLine(c, m); // Вставка строки в массив

break;

case ChoiceDelete:

if (!IsArrayEmpty(m)) // Если массив не пуст

c = DelLine(c, m); // Удаление строки

break;

case ChoiceDeleteAll:

if (!IsArrayEmpty(m)) // Если массив не пуст

DelAllLines(c, m); // Удаление всех строк массива

break;

case ChoicePrint:

if (!IsArrayEmpty(m)) // Если массив не пуст

Print(c, m); // Распечатка массива

break;

case ChoiceQuit:

break;

default: // В остальных случаях

cout<<"Error in choice!\n";

break;

}

}

}

char** AddLine(char **c, int &m)

// Добавление строки в конец массива

{

char str[256]; // Массив для ввода новой строки

int n; // Длина введенной строки

int i;

cout<<"Input string: ";

cin.getline(str, 256); // Ввод строки

n = strlen(str); // Вычисление длины новой строки

if (m == 0) // Если массив строк пуст

{

m++;

c = new char*[m];

c[0] = new char[n + 1]; // Создаем новую строку в массиве строк

strcpy(c[0], str);

return c;

}

else

{

m++;

char** t = new char*[m];// Новый массив строк

for(i = 0; i < m - 1; i++)

{

t[i] = c[i];

}

t[m - 1] = new char[n + 1];

strcpy(t[m - 1], str); // Копирование новой строки

delete [] c;

return t; // Возврат нового адреса массива строк }

}

}

char** InsLine(char **c, int &m)

// Вставка строки в массив

{

char str[256]; // Массив для ввода новой строки

int n; // Длина введенной строки

int k; // Позиция новой строки в массиве

int i, j = 0;

cout<<"Input string: ";

cin.getline(str, 256);

cout<<"Input position # (0-"<<m<<"): ";

cin >> k;

while(k < 0 || k > m) // Проверка на ошибочный ввод

{

cout<<"Error !!!\nInput position # (0-"<<m<<"): ";

cin >> k;

}

n = strlen(str); // Длина новой строки

if (m == 0) // Если массив строк пуст

{

m++;

c = new char*[m];

c[0] = new char[n + 1]; // Создаем новую строку в массиве строк

strcpy(c[0], str);

return c; // Возврат нового адреса массива строк

}

else

{

m++;

char** t = new char*[m];// Новый массив строк

for(i = 0; i < m; i++)

{

if (i == k)

{

t[i] = new char[n + 1];

strcpy(t[i], str);

j = 1;

}

else

{

t[i] = c[i - j];

}

}

delete [] c; // Удаление массива строк

return t; // Возврат нового адреса массива строк

}

}

char** DelLine(char **c, int &m)

// Удаление указанной строки из массива

{

int k; // Индекс удаляемой строки

int i, j = 0;

cout<<"Input position # (0-"<<m - 1<<"): ";

cin >> k;

while(k < 0 || k >= m) // Проверка на ошибочный ввод

{

cout<<"Error !!!\nInput deleting position #: ";

cin >> k;

}

m--;

char** t = new char*[m];// Создание нового массива строк

for(i = 0; i < m; i++)

{

if (i == k)

j = 1;

t[i] = c[i + j];

}

delete [] c; // Удаление массива строк

return t; // Возврат нового адреса массива строк

}

void DelAllLines(char **c, int &m)

// Удаление всех строк массива

{

for(int i = 0; i < m; i++)

delete [] c[i];

delete [] c; // Удаление всех строк массива

m = 0;

}

bool IsArrayEmpty(int &m)

// Возвращает истину, если массив строк пуст; в обратном случае - ложь

{

if (m == 0)

{

cout<<"Your line array is empty.\n";

return true;

}

else

return false;

}

int Menu()

// Вывод меню

{

int choice;

cout<<"\n******* Menu *******\n";

cout<<"1-Add 2-Insert 3-Delete 4-Delete All 5-Print 6-Quit\n";

cin >> choice; // Выбор пункта меню

if(choice < 0 || choice > 6) // Проверка выбора

choice = 0;

return choice; // Возвращение выбранного пункта

}

void Print(char **c, int m)

// Распечатка массива строк

{

for(int i = 0; i < m; i++)

cout<<i<<": "<<c[i]<<endl;

}

/*

На экран выводится приглашение пользователю выбрать тот или иной пункт меню, после выбора которого выполняется соответствующее действие.*/