Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   многомерные массивы (http://forum.oszone.net/showthread.php?t=59416)

farik 15-01-2006 14:17 392614

многомерные массивы
 
Есть прога:
Помогите написать функцию сортировки строк.
Код:


#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 392862

Очень уж коряво сделано. в смысле, так, конечно, можно, но... не делает никто, факт.

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

Код:

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

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

hasherfrog 16-01-2006 01:52 392871

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

pva 19-01-2006 11:19 394517

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


Время: 23:23.

Время: 23:23.
© OSzone.net 2001-