поменять местами строки двухмерного массива(си/cи++).
.........
vector<char>* o = X[a];
X[a] = X;
X = o;
Язык С или С++ ? Топикстартер,покажи как ты двумерный массив создаешь.Уверен никакие вектора тут не прокатят,студенты не учат STL,все делается в С-style.
тогда строки в нем менять нужно так:
p = massiv[0];
massiv[0] = massiv[1]; // меняем местами
massiv[1] = p; // строки 0 и 1
Тебе ж сказали, покажи реализацию своего двумерного массива.
самый простой способ,это развернуть двумерный массив в одномерный. И делать так, как понятно.
Непонял мысль.
В одномерном массиве поменять местами 2 строчки ну никак не получится:D
В одномерном массиве поменять местами 2 строчки ну никак не получится:D
Скорее всего имелся ввиду тот факт, что
arr[x][y] = ..
эквивалентно
Но почему это удобнее для BroKeR, мне непонятно.
igor_nf,
автор темы сказал:
вот и BroKeR посоветовал один из вариантов (действительно если автору понятно как действовать с одномерными массивами, так можно делать так, как понятно. т.е. разобрать двухмерный массив на одномерные) какая разница трехмерный,двухмерный, это все равно можно представить(разбить) на вложеные одномерные массивы :)
Но почему это удобнее для BroKeR, мне непонятно.
Потому что автору темы понятно как делать перестановку в одномерном массиве. Первое. Второе, размерность массива не имеет значения, т.к в памяти элементы располагаются компактно, от первого до последнего.
я хотел получить примерно такой ответ:
{
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");
}
}
А вот вызывает интерес вот такой еще разрез:
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. И все же интересно - на каком языке эту хрень надо было изобразить?
Не знаю,не знаю...Такая реализация,имхо,не пройдет,не примут у тебя это.Поменять местами строки в 2 мерном массиве - элементарно.Вся "изюминка" этой задачи,думаю, в том.чтобы создать такой массив char **mass; где строки разной длины.Возможно ошибаюсь.Все это в С++ заняло бы 5-6 строк:создаем вектор строк,заполняем и меняем местами при помощи стандартной функции swap.А создать такой массив как у тебя надо бы так: обьявить, установить начальное количество строк равное нулю и написать несколько функций,а именно функции - меню,добавления строки в конец массива,печать массива,проверка не является массив пустым и собственно функцию,которая меняет местами строки.Ну вот что то в таком духе...
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;
}