Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

поменять местами строки двухмерного массива(си/cи++).

28K
02 мая 2008 года
petrol1um
19 / / 31.12.2007
с толкнулся с такой загвоздкой. вообщем есть двухмерный массив(динамический, типа сhar) строки которого различной длины. и мне надо поменять местами строки(с помощью указателей). хотелось бы увидеть это на каком-то примере. заранее спасибо!
360
03 мая 2008 года
P*t*
474 / / 15.02.2007
 
Код:
vector<vector<char>* > X;
.........
vector<char>* o = X[a];
X[a] = X;
X = o;
320
03 мая 2008 года
m_Valery
1.0K / / 08.01.2007
Цитата: petrol1um
с толкнулся с такой загвоздкой. вообщем есть двухмерный массив(динамический, типа сhar) строки которого различной длины. и мне надо поменять местами строки(с помощью указателей). хотелось бы увидеть это на каком-то примере. заранее спасибо!


Язык С или С++ ? Топикстартер,покажи как ты двумерный массив создаешь.Уверен никакие вектора тут не прокатят,студенты не учат STL,все делается в С-style.

28K
03 мая 2008 года
petrol1um
19 / / 31.12.2007
да действительно без STL.
360
03 мая 2008 года
P*t*
474 / / 15.02.2007
Что тогда из себя представляет динамический массив?
9
03 мая 2008 года
Lerkin
3.0K / / 25.03.2003
Вообщем, petrol1um. Если твой "динамический двухмерный" массив имеет вид:
 
Код:
char* massiv[KOLICHESTVO_STROK_MASSIVA];

тогда строки в нем менять нужно так:
 
Код:
char* p;    // временный указатель

p = massiv[0];
massiv[0] = massiv[1];     // меняем местами
massiv[1] = p;             // строки 0 и 1
28K
03 мая 2008 года
petrol1um
19 / / 31.12.2007
как с одномерным действовать мне понятно, а вот как с двухмерным?
9
03 мая 2008 года
Lerkin
3.0K / / 25.03.2003
Цитата: petrol1um
как с одномерным действовать мне понятно, а вот как с двухмерным?


Тебе ж сказали, покажи реализацию своего двумерного массива.

2.0K
05 мая 2008 года
BroKeR
163 / / 04.05.2006
Цитата: petrol1um
как с одномерным действовать мне понятно, а вот как с двухмерным?

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

360
05 мая 2008 года
P*t*
474 / / 15.02.2007
Цитата: BroKeR
самый простой способ,это развернуть двумерный массив в одномерный. И делать так, как понятно.



Непонял мысль.
В одномерном массиве поменять местами 2 строчки ну никак не получится:D

1.8K
05 мая 2008 года
igor_nf
256 / / 13.12.2006
Цитата: P*t*
Непонял мысль.
В одномерном массиве поменять местами 2 строчки ну никак не получится:D



Скорее всего имелся ввиду тот факт, что

 
Код:
int arr[NROWS][NCOLUMNS];

arr[x][y] = ..


эквивалентно

 
Код:
arr[x * NCOLUMNS + y] = ..


Но почему это удобнее для BroKeR, мне непонятно.
4.7K
05 мая 2008 года
bobik02
140 / / 11.09.2007
Цитата:
Но почему это удобнее для BroKeR, мне непонятно.


igor_nf,
автор темы сказал:

Цитата:
как с одномерным действовать мне понятно, а вот как с двухмерным?


вот и BroKeR посоветовал один из вариантов (действительно если автору понятно как действовать с одномерными массивами, так можно делать так, как понятно. т.е. разобрать двухмерный массив на одномерные) какая разница трехмерный,двухмерный, это все равно можно представить(разбить) на вложеные одномерные массивы :)

2.0K
05 мая 2008 года
BroKeR
163 / / 04.05.2006
Цитата: igor_nf


Но почему это удобнее для BroKeR, мне непонятно.



Потому что автору темы понятно как делать перестановку в одномерном массиве. Первое. Второе, размерность массива не имеет значения, т.к в памяти элементы располагаются компактно, от первого до последнего.

28K
05 мая 2008 года
petrol1um
19 / / 31.12.2007
ну строки можно поменять с помощью дополнитешьного массива и циклов. а мне порекомендовали с помощью указатлей это сделать, и вот здесь у меня загвоздка.
320
05 мая 2008 года
m_Valery
1.0K / / 08.01.2007
Ещё раз повторю - покажи свою реализацию двумерного массива,тогда тебе и помогут.
28K
05 мая 2008 года
petrol1um
19 / / 31.12.2007
всем огромное спасибо! проблемма решенна!
я хотел получить примерно такой ответ:
Код:
void main(void)
{
char **s = new char* [10], *t;
int i, j, n;
for(i=0; i<10; i++)
        s = new char [10];
for(i=0; i<10; i++)
        for(j=0; j<10; j++)
                s[j]=i;
for(i=0; i<10; i++)
        {
        for(j=0; j<10; j++)
                printf("%i  ", s[j]);
        printf("\n");      
        }
t = s[2];
s[2] = s[3];
s[3] = t;
printf("\n\n");
for(i=0; i<10; i++)
        {
        for(j=0; j<10; j++)
                printf("%i  ", s[j]);
        printf("\n");      
        }
}
320
05 мая 2008 года
m_Valery
1.0K / / 08.01.2007
Так это,то что тебе Lerkin предлагал.Но...ты сам говорил,что длина строк должна быть разной.Хотя если тебя устраивает такая реализация - дело хозяйское.Память только освобождать не забывай;)
9
05 мая 2008 года
Lerkin
3.0K / / 25.03.2003
Я так понял, что молодой человек ожидал увидеть полный вариант решения этой "задачи". Очевидно, что никакого варианта реализации двумерного, главное, динамического массива, у него до сего момента не было (да и сейчас нету).

А вот вызывает интерес вот такой еще разрез:
 
Код:
char **s = new char* [10], *t;
int i, j, n;
for(i=0; i<10; i++)
        s = new char [10];
for(i=0; i<10; i++)
        for(j=0; j<10; j++)
                s[j]=i;

Аффтар, это что за гадость?

P.S. И все же интересно - на каком языке эту хрень надо было изобразить?
28K
06 мая 2008 года
petrol1um
19 / / 31.12.2007
просто я не представлял как это вообще будет работать, и решил задать вопрос. решил проверить сам так сказать на примере и то что мне надо было получилось. язык Си.
320
06 мая 2008 года
m_Valery
1.0K / / 08.01.2007
Цитата: petrol1um
просто я не представлял как это вообще будет работать, и решил задать вопрос. решил проверить сам так сказать на примере и то что мне надо было получилось. язык Си.



Не знаю,не знаю...Такая реализация,имхо,не пройдет,не примут у тебя это.Поменять местами строки в 2 мерном массиве - элементарно.Вся "изюминка" этой задачи,думаю, в том.чтобы создать такой массив char **mass; где строки разной длины.Возможно ошибаюсь.Все это в С++ заняло бы 5-6 строк:создаем вектор строк,заполняем и меняем местами при помощи стандартной функции swap.А создать такой массив как у тебя надо бы так: обьявить, установить начальное количество строк равное нулю и написать несколько функций,а именно функции - меню,добавления строки в конец массива,печать массива,проверка не является массив пустым и собственно функцию,которая меняет местами строки.Ну вот что то в таком духе...

Код:
#include <iostream>
using namespace std;
enum {Add = 1, PrintArray, SwapString, ChoiceQuit};

int Menu();                 //  Вывод меню
char** AddString(char**, size_t&);   //  Добавление строки в конец массива
void Print(char**, size_t);        //  Распечатка строк массива
bool IsEmpty(size_t&);        //  Проверка на наличие строк в массиве
char **Swap(char**,size_t);
int _tmain(int argc, _TCHAR* argv[])
{
     char **mass;       // двумерный массив
    size_t size = 0;      // Начальное количество строк массива
    int choice = Add;
    while (choice != ChoiceQuit)    
    {
        choice = Menu();            
        cin.ignore(1);              
        switch (choice)            
        {
        case Add:
            mass = AddString(mass, size);      
        break;
        case PrintArray:
            if (!IsEmpty(size))  
                Print(mass, size);        
        break;
        case SwapString:
            if(!IsEmpty(size))
             mass = Swap(mass, size);
        break;
        case ChoiceQuit:
            break;
        default:                    
            cout << "Error in choice!\n";
        break;
        }
    }
    return 0;
}
char** AddString(char **c, size_t &m)
{
    char str[256];                  
    size_t n;                          
    size_t 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 = c;
        t[m - 1] = new char[n + 1];
        strcpy(t[m - 1], str);        
        delete [] c;
        return t;                      
    }
}
bool IsEmpty(size_t &m)
{
    if (m == 0)
    {
        cout << "Your array is empty.\n";
        return true;
    }
    else
        return false;
}
int Menu()
{
    int choice;
    cout << "\n******* Menu *******\n";
    cout << "1-Add  2-Print  3-Swap 4-Quit\n";
    cin >> choice;                
    if(choice < 0 || choice > 4)    
        choice = 0;
    return choice;                  
}
void Print(char **c, size_t m)
{
    for(size_t i = 0; i < m; i++)
        cout << c << endl;
}
char **Swap(char** c, size_t m)
{
    size_t k,l;                      
    cout << "Input position # (0-" << m - 1 << "): ";
    cin >> k;
    while(k < 0 || k >= m)              
    {
        cout << "Error !!!\nInput position #: ";
        cin >> k;
    }
    cout << "Input position # (0-" << m - 1 << "): ";
    cin >> l;
    while(l < 0 || l >= m)              
    {
        cout << "Error !!!\nInput position #: ";
        cin >>l;
    }
    char* p;    // временный указатель
    p = c[k];
    c[k] = c[l];     // меняем местами
    c[l] = p;             // строки 0 и 1
    return c;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог