Войти

Показать полную графическую версию : многомерные массивы


farik
15-01-2006, 14:17
Есть прога:
Помогите написать функцию сортировки строк.

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

ivank
16-01-2006, 00:47
Очень уж коряво сделано. в смысле, так, конечно, можно, но... не делает никто, факт.

на тему сортировки

#include <stdlib.h>
//...
qsort(c, m, sizeof(char*), strcmp);

всё. Или тоже самое с std::sort и собственной функцией сравнения.

hasherfrog
16-01-2006, 01:52
Да, тем более, что С++.
Гляньте ещё про STL-овские string-и и vector/map/list-ы.
Если только Вы не на сдачу курсовой по С пишите, съэкономите море времени.
Эти классы (шаблоны классов) сейчас поддерживаются везде.

pva
19-01-2006, 11:19
Если нужны исходники сортировки, загляните в файл algorithm в ваших инклюдах, ищите
template<class Iterator, class Operation> sort(Iterator first, Iterator second, Operation op)




© OSzone.net 2001-2012