Четверг, 09.01.2025, 11:11
Главная Регистрация RSS поиск
Приветствую Вас, Гость
Меню сайта
Категории раздела
HTML [44]
Visual C++ и MFC [21]
c++ [78]
php [19]
Javascript [15]
C# [51]
загрузки [0]
XNA [10]
создание игр с помощью xna
Наш опрос
Каким языком программирования вы увлекаетесь
Всего ответов: 2420
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Главная » Статьи » c++

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

/*

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

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

/*

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

*/

Категория: c++ | Добавил: slava (30.05.2011)
Просмотров: 4194 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]