Меню сайта
Категории раздела
HTML [44] |
Visual C++ и MFC [21] |
c++ [78] |
php [19] |
Javascript [15] |
C# [51] |
загрузки [0] |
XNA
[10]
создание игр с помощью xna
|
Наш опрос
Друзья сайта
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Главная » Статьи » c++ |
Пример на многомерные динамические массивы
/* Рассмотрим следующую задачу: необходимо создать массив, позволяющий создавать строки и работать с ними (аналог справочника). Для работы с этим массивом строк определен такой набор операций:
*/ #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; } /* На экран выводится приглашение пользователю выбрать тот или иной пункт меню, после выбора которого выполняется соответствующее действие. */ | |
Просмотров: 4194 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |