Помогите профану с C++
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Помогите профану с C++ - 2011-11-24 03:27:23.260000
|
|
|
tarkys
Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
|
Кому не сложно помогите пожалуйста с програмой. "Переставить столбцы матрицы в соответствии с возрастанием елементов второго рядка" (матрица - динамический массив размером n на m)
|
|
|
RE: Помогите профану с C++ - 2011-11-24 10:58:50.276666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Не сложно многим. Интересует, что ты уже сделал и в чём застрял.
|
|
|
RE: Помогите профану с C++ - 2011-11-24 15:33:28.406666
|
|
|
tarkys
Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
|
Я создал динамический двухмерный масив и динамический одномерный. Зделал ввод елементов двухмерного массива с клавиатуры, а застрял на том что не могу скопировать 3 строку двухмерного массива в одномерный для сортировки, также не могу понять как потом переставить строки…
|
|
|
RE: Помогите профану с C++ - 2011-11-24 15:58:35.483333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Я, похоже, очень неясно выражаюсь… Покажи код, где и как ты создаёшь и заполняешь двумерные массивы и где ты пытаешься переставлять строки. Строки можно менять местами поэлементно, если они одинаковой длины. З.Ы. я где-то в соседней теме только что ответил на вопрос записи строки из матрицы в массив
|
|
|
RE: Помогите профану с C++ - 2011-11-24 16:30:52.653333
|
|
|
tarkys
Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
|
#include<iostream>
using namespace std;
int main()
{
int n,m,i,a;
int **mas;
cout<<"Vvedite Kol-vo strok (n) i stolbcov (m)"<<endl;
cin>>n>>m;
mas2=new int*[n];
mas=new int*[n];// Создание масива показателей
for(i=0;i<n;i++)
mas[i]=new int[m];//Создание динамических строк
cout<<"Vvedite "<<n<<"x"<<m <<" elementi massiva"<<endl;
for(i=0;i<n;i++)// Ввод масива
for(int j=0;j<m;j++)
cin>>mas[i][j];
for(i=0;i<n;i++,cout<<endl)// Вывод исходного массива
for(int j=0;j<m;j++)
cout<<mas[i][j]<<"\t";
cin.get();
cin.get();
return 0;
}
перестановку строки из двумерного в одномерный не смог зделать….. поетому и прошу помочь…
|
|
|
RE: Помогите профану с C++ - 2011-11-24 16:35:36.970000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Теги [code], а то нифига не понятно. И выдели комментариями // место, где ты переставляешь строки
|
|
|
RE: Помогите профану с C++ - 2011-11-24 16:43:43.836666
|
|
|
shkolote attake
Сообщений: 268
Оценки: 0
Присоединился: 2010-10-19 05:37:44.873333
|
видно что парень что то волочёт,только не понятно что…
|
|
|
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 < len; i++ )
a1[i] ^= a2[i] ^= a1[i] ^= a2[i];
}
int **m;
//...
swapLines( m[2], m[4], 5 ); // меняем третью и пятую строку, длина строки - 5 элементов
|
|
|
RE: Помогите профану с C++ - 2011-11-24 17:10:32.050000
|
|
|
tarkys
Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
|
Учусь писать на C++, quote:
Зачем ты используешь сишные массивы, если пишешь на с++? - пишу так как учат в универе, по другому увы не умею =(
|
|
|
RE: Помогите профану с C++ - 2011-11-24 17:12:43.326666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Я на изначальный вопрос ответил? P.S. на будущее - спроси у препода, можно ли использовать std::vector. Хотя для тренировки и самому полезно повыделять/поосвобождать память.
|
|
|
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. Хотя для тренировки и самому полезно повыделять/поосвобождать память. Скорее всего использовать векторы нельзя, так как мы их не учили, и, если не сложно, хотелось бы увидеть еще какой-нибудь вариат написания етого действия. Возможно ето как-то можно зделать через указатели???
|
|
|
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 < len; i++, p1++, p2++ )
*p1 ^= *p2 ^= *p1 ^= *p2;
}
void swapLines2( int *p1, int *p2, size_t len )
{
for ( size_t i = 0; i < 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 < n; i++ )
{
delete [] m[i];
}
delete [] m;
|
|
|
RE: Помогите профану с C++ - 2011-11-24 17:40:34.693333
|
|
|
tarkys
Сообщений: 7
Оценки: 0
Присоединился: 2011-11-24 03:06:07.640000
|
Большое спасибо за исчерпываюший ответ!
|
|
|
RE: Помогите профану с C++ - 2011-11-24 18:44:53.676666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Почитал, что тебе надо столбцы менять, а не строки… Ну думаю, справишься, там почти тоже самое ;). Чтобы заточить мои реализации, можно использовать транспонированные матрицы (вместо строк создавать столбцы). Вообще "в лоб", на с++ задача решается как-то так:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef vector< int > Array;
typedef vector< Array > Matrix;
// Установка размера контейнера
template< typename T >
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< Matrix >( static_cast<size_t>(m) )( a );
for_each( a.begin(), a.end(), ResizeContainer< Array >( n ) );
}
// Проверка элементов с указанным индексом
template< size_t pos >
bool isLessInIndex( Array l1, Array l2 )
{
return l1[pos] < 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 < m; i++ )
for ( size_t j = 0; j < n; j++ )
b[j][i] = a[i][j];
return b;
}
int main()
{
size_t m, n;
Matrix a;
cin >> m >> n;
setMatrixSize( a, m, n );
for ( size_t i = 0; i < m; i++ )
for ( size_t j = 0; j < n; j++ )
cin >> a[i][j];
a = transposeMatrix( a ); // Меняем строки и столбцы
sort( a.begin(), a.end(), isLessInIndex<1> ); // Сортируем
a = transposeMatrix( a ); // Возвращаем всё назад
for ( size_t i = 0; i < m; i++ )
{
for ( size_t j = 0; j < n; j++ )
cout << a[i][j] << ' ';
cout << endl;
}
system( "pause >nul" );
return 0;
}
|
|
|
|
|