Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

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

/*

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

  • 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);

}

else

{

char** t = new char*[m + 1];// Временный массив строк

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

{

t[i] = new char[strlen(c[i]) + 1];

strcpy(t[i], c[i]); // Копирование строк

}

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

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

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

delete [] c[i];

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

m++;

c = new char*[m];

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

{

c[i] = new char[strlen(t[i]) + 1];

strcpy(c[i], t[i]); // Создание нового массива строк

}

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

delete [] t[i];

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

}

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

}

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);

}

else

{

char** t = new char*[m + 1];// Временный массив строк

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

{

if (i == k)

{

t[i] = new char[strlen(str) + 1];

strcpy(t[i], str); // Вставка новой строки

j = 1;

}

else

{

t[i] = new char[strlen(c[i - j]) + 1];

strcpy(t[i], c[i - j]); // Копирование остальных строк

}

}

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

delete [] c[i];

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

m++;

c = new char*[m];

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

{

c[i] = new char[strlen(t[i]) + 1];

strcpy(c[i], t[i]); // Создание нового массива строк

}

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

delete [] t[i];

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

}

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

}

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

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

{

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

int i, j = 0;

cout << "Input deleting position #: ";

cin >> k;

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

{

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

cin >> k;

}

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

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

{

if (i == k)

j = 1;

t[i] = new char[strlen(c[i + j]) + 1];

strcpy(t[i], c[i + j]); // Копирование оставшихся строк массива

}

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

delete [] c[i];

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

m--;

c = new char*[m];

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

{

c[i] = new char[strlen(t[i]) + 1];

strcpy(c[i], t[i]); // Создание нового массива строк

}

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

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

delete [] t;

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

}

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;

}

/*

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

*/