Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Помогите профану с C++

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Помогите профану с C++
Имя
Сообщение << Старые топики   Новые топики >>
Помогите профану с C++ - 2011-11-24 03:27:23.260000   
tarkys

Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
Кому не сложно помогите пожалуйста с програмой. "Переставить столбцы матрицы в соответствии с возрастанием елементов второго рядка" (матрица - динамический массив размером n на m)
Post #: 1
RE: Помогите профану с C++ - 2011-11-24 10:58:50.276666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Не сложно многим. Интересует, что ты уже сделал и в чём застрял.
Post #: 2
RE: Помогите профану с C++ - 2011-11-24 15:33:28.406666   
tarkys

Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
Я создал динамический двухмерный масив и динамический одномерный. Зделал ввод елементов двухмерного массива с клавиатуры, а застрял на том что не могу скопировать 3 строку двухмерного массива в одномерный для сортировки, также не могу понять как потом переставить строки…
Post #: 3
RE: Помогите профану с C++ - 2011-11-24 15:58:35.483333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Я, похоже, очень неясно выражаюсь… Покажи код, где и как ты создаёшь и заполняешь двумерные массивы и где ты пытаешься переставлять строки. Строки можно менять местами поэлементно, если они одинаковой длины.

З.Ы. я где-то в соседней теме только что ответил на вопрос записи строки из матрицы в массив
Post #: 4
RE: Помогите профану с C++ - 2011-11-24 16:30:52.653333   
tarkys

Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
#include&lt;iostream&gt; using namespace std; int main() { int n,m,i,a; int **mas; cout&lt;&lt;"Vvedite Kol-vo strok (n) i stolbcov (m)"&lt;&lt;endl; cin&gt;&gt;n&gt;&gt;m; mas2=new int*[n]; mas=new int*[n];// Создание масива показателей for(i=0;i&lt;n;i++) mas[i]=new int[m];//Создание динамических строк cout&lt;&lt;"Vvedite "&lt;&lt;n&lt;&lt;"x"&lt;&lt;m &lt;&lt;" elementi massiva"&lt;&lt;endl; for(i=0;i&lt;n;i++)// Ввод масива for(int j=0;j&lt;m;j++) cin&gt;&gt;mas[i][j]; for(i=0;i&lt;n;i++,cout&lt;&lt;endl)// Вывод исходного массива for(int j=0;j&lt;m;j++) cout&lt;&lt;mas[i][j]&lt;&lt;"\t"; cin.get(); cin.get(); return 0; } перестановку строки из двумерного в одномерный не смог зделать….. поетому и прошу помочь…
Post #: 5
RE: Помогите профану с C++ - 2011-11-24 16:35:36.970000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Теги [code], а то нифига не понятно. И выдели комментариями // место, где ты переставляешь строки
Post #: 6
RE: Помогите профану с C++ - 2011-11-24 16:43:43.836666   
shkolote attake

Сообщений: 268
Оценки: 0
Присоединился: 2010-10-19 05:37:44.873333
видно что парень что то волочёт,только не понятно что…
Post #: 7
RE: Помогите профану с C++ - 2011-11-24 17:06:19.446666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: tarkys

перестановку строки из двумерного в одномерный не смог зделать….. поетому и прошу помочь…

Не смог или не пытался?

Зачем ты используешь сишные массивы, если пишешь на с++? Какой язык вы изучаете: с или с++?

как-то так…
void swapLines( int a1[], int a2[], size_t len ) { for ( size_t i = 0; i &lt; len; i++ ) a1[i] ^= a2[i] ^= a1[i] ^= a2[i]; } int **m; //... swapLines( m[2], m[4], 5 ); // меняем третью и пятую строку, длина строки - 5 элементов
Post #: 8
RE: Помогите профану с C++ - 2011-11-24 17:10:32.050000   
tarkys

Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
Учусь писать на C++,
quote:

Зачем ты используешь сишные массивы, если пишешь на с++?
- пишу так как учат в универе, по другому увы не умею =(
Post #: 9
RE: Помогите профану с C++ - 2011-11-24 17:12:43.326666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Я на изначальный вопрос ответил?

P.S. на будущее - спроси у препода, можно ли использовать std::vector. Хотя для тренировки и самому полезно повыделять/поосвобождать память.
Post #: 10
RE: Помогите профану с C++ - 2011-11-24 17:21:13.613333   
tarkys

Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
quote:

Я на изначальный вопрос ответил?

Впиринципи да.
quote:

P.S. на будущее - спроси у препода, можно ли использовать std::vector. Хотя для тренировки и самому полезно повыделять/поосвобождать память.

Скорее всего использовать векторы нельзя, так как мы их не учили, и, если не сложно, хотелось бы увидеть еще какой-нибудь
вариат написания етого действия.

Возможно ето как-то можно зделать через указатели???
Post #: 11
RE: Помогите профану с C++ - 2011-11-24 17:38:17.456666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: tarkys
Возможно ето как-то можно зделать через указатели???


Да будет тебе известно, что следующие записи абсолютно эквивалентны:
m[2] — *(m + 2) — 2[m] — *(2 + m)

void swapLines1( int *p1, int *p2, size_t len ) { for ( size_t i = 0; i &lt; len; i++, p1++, p2++ ) *p1 ^= *p2 ^= *p1 ^= *p2; } void swapLines2( int *p1, int *p2, size_t len ) { for ( size_t i = 0; i &lt; len; i++ ) *(p1 + i) ^= *(p2 + i) ^= *(p1 + i) ^= *(p2 + i); } void superSwapLines( int **m, int l1, int l2 ) { int *p; // Меняем значения указателей на строки, сами элементы не двигаем p = *(m + l1); *(m + l1) = *(m + l2); *(m + l2) = p; } void swapWithMemcpy( int *p1, int *p2, size_t len ) { int *tmp = new int[ len ]; memcpy( tmp, p1, len * sizeof( int ) ); memcpy( p1, p2, len * sizeof( int ) ); memcpy( p2, tmp, len * sizeof( int ) ); delete [] tmp; }
И не забывай освобождать память…
for( size_t i = 0; i &lt; n; i++ ) { delete [] m[i]; } delete [] m;
Post #: 12
RE: Помогите профану с C++ - 2011-11-24 17:40:34.693333   
tarkys

Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
Большое спасибо за исчерпываюший ответ!
Post #: 13
RE: Помогите профану с C++ - 2011-11-24 18:44:53.676666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Почитал, что тебе надо столбцы менять, а не строки… Ну думаю, справишься, там почти тоже самое ;).
Чтобы заточить мои реализации, можно использовать транспонированные матрицы (вместо строк создавать столбцы).
Вообще "в лоб", на с++ задача решается как-то так:
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace std; typedef vector&lt; int &gt; Array; typedef vector&lt; Array &gt; Matrix; // Установка размера контейнера template&lt; typename T &gt; struct ResizeContainer { size_t m_size; ResizeContainer( size_t size ) : m_size( size ) {} void operator() ( T& item ) { item.resize( m_size ); } }; // Установка размера матрицы void setMatrixSize( Matrix& a, size_t m, size_t n ) { ResizeContainer&lt; Matrix &gt;( static_cast&lt;size_t&gt;(m) )( a ); for_each( a.begin(), a.end(), ResizeContainer&lt; Array &gt;( n ) ); } // Проверка элементов с указанным индексом template&lt; size_t pos &gt; bool isLessInIndex( Array l1, Array l2 ) { return l1[pos] &lt; l2[pos]; } // Транспонирование матрицы, чтобы со столбцами рбаотать как со строками Matrix transposeMatrix( Matrix& a ) { const size_t m = a.size(); const size_t n = a.at(0).size(); Matrix b; setMatrixSize( b, n, m ); for ( size_t i = 0; i &lt; m; i++ ) for ( size_t j = 0; j &lt; n; j++ ) b[j][i] = a[i][j]; return b; } int main() { size_t m, n; Matrix a; cin &gt;&gt; m &gt;&gt; n; setMatrixSize( a, m, n ); for ( size_t i = 0; i &lt; m; i++ ) for ( size_t j = 0; j &lt; n; j++ ) cin &gt;&gt; a[i][j]; a = transposeMatrix( a ); // Меняем строки и столбцы sort( a.begin(), a.end(), isLessInIndex&lt;1&gt; ); // Сортируем a = transposeMatrix( a ); // Возвращаем всё назад for ( size_t i = 0; i &lt; m; i++ ) { for ( size_t j = 0; j &lt; n; j++ ) cout &lt;&lt; a[i][j] &lt;&lt; ' '; cout &lt;&lt; endl; } system( "pause &gt;nul" ); return 0; }
Post #: 14
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Помогите профану с C++







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.