Консультация № 175661
27.12.2009, 17:17
35.00 руб.
0 3 3
Приветствую Вас уважаемые эксперты!
Нужно написать программу, меняющую местами в произвольной матрице две строки, номера которых задаются в диалоговом режиме.
Написать функции:
- Заполнения двумерного массива случайными числами из диапазона [-70;20].
- Вывод двумерного массива.
- Обмена значениями элементов двух произвольных строк.
Решение осуществить в консольном приложении Win32. И еще одно, решение должно быть обязательно осуществлено через функции, и по возможности все объяснить !

Обсуждение

Неизвестный
27.12.2009, 18:24
общий
это ответ
Здравствуйте, Баженов Павел Андреевич.

Код программы в приложении. Если будут вопросы, пишите в минифорум.

Приложение:
#include <iostream>
#include <ctime>
#include <conio.h>
#include <new>
using namespace std;

// выделение памяти под матрицу
int** Allocate(int &n,int &m)
{
int **mas=NULL;
try
{
mas=new int*[n];
for(int i=0;i<n;i++)
mas[i]=new int[m];
}
catch(bad_alloc ex)
{
cout<<"\nError!\nMemory allocation failed!";
cout<<endl<<ex.what()<<endl;
_getch();
return NULL; // возвращаем NULL в случае,если операция new
// возбудила исключение
}
return mas;
}

// освобождение памяти
void Del(int n,int **mas)
{
for(int i=0;i<n;i++)
delete mas[i];
delete [] mas;
}

// заполнение матрицы случайными числами
void Init(int n,int m,int **mas)
{
srand(time(0)); // инициализация генератора случайных чисел
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
mas[i][j]=-70+rand()%91; // заполняем значениями от -70 до 20
}

// вывод матрицы на экран
void Show(int n,int m,int **mas)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout.width(5); // установка ширины поля вывода
cout<<mas[i][j]<<" ";
}
cout<<"\n";
}
}

// обмен значениями в строках
void Exchange(int m,int first,int second,int **mas)
{
int tmp;
for(int i=0;i<m;i++)
{
tmp=mas[first][i];
mas[first][i]=mas[second][i];
mas[second][i]=tmp;
}
}

int main()
{
int **mas=NULL,n,m,fIndex,sIndex;

// ввод размерностей матрицы (вводимые значения должны быть от 0 до 20)
do {
cout<<"N = ";
cin>>n;
}while(n<0 || n>20);

do {
cout<<"\nM = ";
cin>>m;
}while(m<0 || m>20);

if(!(mas=Allocate(n,m)))
{
return 0;
}

cout<<"\n\nMatrix\n\n";
Init(n,m,mas);
Show(n,m,mas);

// ввод индексов строк для обмена значениями

// вводимое значения должны быть от 1 до n
do {
cout<<"\n\nFirst index = ";
cin>>fIndex;
}while(fIndex<1 || fIndex>n);

do {
cout<<"\nSecond index = ";
cin>>sIndex;
}while(sIndex<1 || sIndex>n);

Exchange(m,fIndex-1,sIndex-1,mas);
cout<<"\n\nResult\n\n";
Show(n,m,mas);

Del(n,mas);
_getch();
}

5
Благодарю!
давно
Профессор
230118
3054
27.12.2009, 19:04
общий
это ответ
Здравствуйте, Баженов Павел Андреевич.

Программа работает в консольном приложении VS 2005. Объяснения даются в комментариях

Приложение:
#include <iostream>
#include <math.h>
#include <conio.h>

#include <time.h>

using namespace std;
//-----------------------------------------------------------------------

const int n=10;
const int m=10;
void array_init(int array[n][m], int n, int m)
{
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
{
/*Заполняем элементы массива случайными числами из диапазона [-70;20]*/
array[i][j] = rand() % 91 -70;
}

}

void array_output(int array[n][m], int n, int m)
{
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
cout<<" "<<array[i][j];// Вывод элементов массива
}
cout<<" "<<endl;/*Переход на новую строчку*/
}
cout<<endl;
}

void swap_rows(int array[n][m], int row1, int row2)
{
int t;
for (int j=0;j<m;j++)
{
t=array[row1][j];// Промежуточное значение
array[row1][j]=array[row2][j];//записать вторую строку в первую
array[row2][j]=t;//записать промежуточное значение во вторую строку
}

}

int main()
{
setlocale(LC_ALL, "Rus");
srand(time(NULL)); /*Инициализация генерации случайных чисел.*/

int Array[n][m]; /*Первый массив.*/

array_init(Array,n,m);
array_output(Array,n,m);
int r1,r2;
cout<<"Введите номера строк" << endl;
cin>> r1 >> r2;
swap_rows(Array,r1,r2);
array_output(Array,n,m);
return 0;
}
5
Спасибо!
Неизвестный
27.12.2009, 19:10
общий
это ответ
Здравствуйте, Баженов Павел Андреевич.
Программа. С++. Проверял MS VS 2008.
Код:
#include <iostream>
#include <locale>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <stdexcept>

using namespace std;

// Количество строк и столбцов в матрице
const size_t ROWS=5,COLS=7;
// Диапазон для элементов согласно условия
const int LO=-70,HI=20;

// Зполняет матрицу элементами из заданного диапазона [lo..hi)
template<size_t _ROWS,size_t _COLS,class _Ty>
void fillMatrix(_Ty (&matrix)[_ROWS][_COLS],int lo,int hi)
{
//
double coeff=static_cast<double>(hi-lo)/RAND_MAX;
for(size_t i=0;i<_ROWS;++i)
{
for(size_t j=0;j<_COLS;++j)
{
matrix[i][j]=static_cast<_Ty>(lo+rand()*coeff);
}
}
}

// Выводит матрицу на экран
template<size_t _ROWS,size_t _COLS,class _Ty>
void printMatrix(const char* const message,_Ty (&matrix)[_ROWS][_COLS])
{
cout<<message<<endl;
for(size_t i=0;i<_ROWS;++i)
{
for(size_t j=0;j<_COLS;++j)
{
cout<<setw(4)<<matrix[i][j]<<' ';
}
cout<<endl;
}
}

// Меняет заданные строки местами
template<size_t _ROWS,size_t _COLS,class _Ty>
void swapRowsMatrix(_Ty (&matrix)[_ROWS][_COLS],size_t row1,size_t row2)
{
if(row1<_ROWS && row2<_ROWS)
{
for(size_t j=0;j<_COLS;++j)
{
// Меняем элементы местами
swap(matrix[row1][j],matrix[row2][j]);
}
}
else
{
throw invalid_argument("Номер строки выходит за допустимый диапазон");
}
}

int main()
{
locale::global(locale(""));
srand(static_cast<unsigned int>(time(0)));

// Матрица
int matrix[ROWS][COLS];

// Заполним матрицу
fillMatrix(matrix,LO,HI);
// Распечатаем ее
printMatrix("Матрица:",matrix);

// Вводим номера строк
cout<<"Введите номера строк для обмена:";
size_t row1,row2;
cin>>row1>>row2;
// Проверим на ошибки ввода
if(cin.fail())
{
cout<<"Ошибочный ввод"<<endl;
}
else
{
try
{
// Обменяем строки
swapRowsMatrix(matrix,row1,row2);
// Распечатаем после обмена
printMatrix("Матрица после перестановки:",matrix);
}
catch(invalid_argument& ex)
{
cout<<ex.what()<<endl;
}
}
system("PAUSE");
return 0;
}

Пример вывода:
Код:
Матрица:
10 9 -36 -30 -39 5 3
-25 17 -21 4 -21 -21 -65
-9 1 -10 -58 8 6 1
-48 0 11 -69 -10 8 -68
17 -41 9 -69 3 -18 -62
Введите номера строк для обмена:1 4
Матрица после перестановки:
10 9 -36 -30 -39 5 3
17 -41 9 -69 3 -18 -62
-9 1 -10 -58 8 6 1
-48 0 11 -69 -10 8 -68
-25 17 -21 4 -21 -21 -65
5
Спасибо!
Форма ответа