Матрица, генератор случайных чисел (С++)
Сделать алгоритм и программу для обработки двухмерных массивов.
1.) Элементы матрицы A сделать с помощью генератора случайных чисел.
2.) Сделать новую матрицу B , в которой удалить с матрицы А ряд, в котором минимальный элемент среди элементов главной диагонали .
меня затрудняет что бы сделать эту задачу:
Как сгенерить матрицу с помощью генератора случайных чисел ?
сделать матрицу B с удалением с матрицы А рядка - не проблема, проблема: пробежатся по диагонали матрицы (я могу пробежатся в цыкле по диагонали только в том случаи если матрица квадратичная (типа 4*4, 5*5 и т.к.) ), а что будет если матрица не квадратическая,ну скажем 5*3 .... может существует некая "формула" что бы по диагонали пробежатся ?
Код:
rand()%a
генерит число от 0 до a
а насчет диагонали, я че-то не припомню, чтобы у неквадратной матрицы была главная диагональ.
пример на создание двумерного массива и функции добавления-удаления столбцов и строк ?
Для кого пишется FAQ ? Почему не смотришь - там ведь есть
Сначала можеш написать srand(Time.GetMonth() + Time.GetSecond() + Time. GetMinute());
Чтоб генерация была случайной !!!:cool:
вот что получилось сделать по задачке:
Код:
#include <iostream>
#include <conio>
#include <iomanip> // setw()
using namespace std;
const n = 4;
const m = 4;
int main(int argc, char* argv[])
{
clrscr();
unsigned short arrayA[n][m];
unsigned short arrayB[n-1][m];
// генерим матрицу
for ( int i = 0 ; i < n; i++ )
{
for ( int j = 0 ; j < m ; j++ )
{
arrayA[j] = rand() % 50 ; // случайным образом до 50
}
}
//------------------------------------
// Выводим матрицу А на дисплей
cout << "Matrix A: \n" << endl;
for( int i = 0; i<n ; i++ )
{
for( int j = 0 ; j < m ; j++ )
cout << setw(4) << arrayA[j];
cout << "\n\n";
}
//------------------------------------
// ищем на главной диагонали минимальный элемент
unsigned short min;
int row;
min = arrayA[0][0]; // first
for ( int i = 0 ; i < n; i++ )
{
for ( int j = 0 ; j < m ; j++ )
{
if ( min > arrayA[i=i+1][j=i+1] ) // ищем по диагонали минимум
{
min = arrayA[j]; // минимальный елемент по диагонали
row = i; // запоминаем ряд который надо del
}
}
}
//------------------------------------
// а тут надо сделать матрицу B без рядка в котором минимальный елемент по диагонали в матрице А , только вот как ? я затрудняюсь :confused:
cout << "min po diagonali: " << min ;
cout << " row : " << row << endl ;
getch();
return 0; // ok
}
#include <conio>
#include <iomanip> // setw()
using namespace std;
const n = 4;
const m = 4;
int main(int argc, char* argv[])
{
clrscr();
unsigned short arrayA[n][m];
unsigned short arrayB[n-1][m];
// генерим матрицу
for ( int i = 0 ; i < n; i++ )
{
for ( int j = 0 ; j < m ; j++ )
{
arrayA[j] = rand() % 50 ; // случайным образом до 50
}
}
//------------------------------------
// Выводим матрицу А на дисплей
cout << "Matrix A: \n" << endl;
for( int i = 0; i<n ; i++ )
{
for( int j = 0 ; j < m ; j++ )
cout << setw(4) << arrayA[j];
cout << "\n\n";
}
//------------------------------------
// ищем на главной диагонали минимальный элемент
unsigned short min;
int row;
min = arrayA[0][0]; // first
for ( int i = 0 ; i < n; i++ )
{
for ( int j = 0 ; j < m ; j++ )
{
if ( min > arrayA[i=i+1][j=i+1] ) // ищем по диагонали минимум
{
min = arrayA[j]; // минимальный елемент по диагонали
row = i; // запоминаем ряд который надо del
}
}
}
//------------------------------------
// а тут надо сделать матрицу B без рядка в котором минимальный елемент по диагонали в матрице А , только вот как ? я затрудняюсь :confused:
cout << "min po diagonali: " << min ;
cout << " row : " << row << endl ;
getch();
return 0; // ok
}
так вот я не могу понять как можно в матрицу B загнать значения с матрицы A но без того рядка (тот где по диагонали мы находим минимальный елемет)...
думал сначала так получится сделать:
Код:
....
for ( int i = 0; i < n; i++)
{
for ( int j = 0 ; j < m ; j++ )
{
if (row != i )
{
arrayB[j] = arrayA[j] ;
}
}
}
....
for ( int i = 0; i < n; i++)
{
for ( int j = 0 ; j < m ; j++ )
{
if (row != i )
{
arrayB[j] = arrayA[j] ;
}
}
}
....
но оказалось плохо думал ...
дальше начал думать: записать сначала значения до row (ряд которого надо удалить), и после row , ага .... и что ж тада если минимум по диагонали например окажется последний ряд или первый ряд , то наверное будет не хорошая ошибочка....
а дальше "думалка" сломалась... помогите разобратся пожалуйста ?
Код:
#include <iostream>
#include <iomanip>
#include <ctime>
#include <vector>
#include <algorithm>
using namespace std;
void OutMatrix(int**, int, int);// Вывод на экран матрицы
int** DelRow(int**, int&, int, int);// Удалить строку
int _tmain(int argc, _TCHAR* argv[])
{
wcout.imbue(locale(".866"));//Руссификация консоли
srand(time(0));
int row,col,menu = 0,index = 0;
do{
wcout<<L"Введите количество строк"<<endl;
cin>>row;
}while(row <= 0);
do{
wcout<<L"Введите количество столбцов"<<endl;
cin>>col;
}while(col <= 0);
int **m = new int*[row];// матрица
// Создаем матрицу
for(int i = 0;i < row;++i){
m = new int[col];
for(int j = 0;j < col;++j)
m[j] = rand() %100;// заполняем случ.числами
}
system("cls");// очистка консоли
OutMatrix(m, row, col);
vector<int> coll;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(i == j)
coll.push_back(m[j]);
}
}
for(int i=0;i < coll.size();i++)
cout<<coll<<' ';
cout<<endl;
int count;
vector<int>::iterator res = min_element(coll.begin(),coll.end());
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(m[j] == *res)
count = i;
}
}
wcout<<L"Минимальный элемент = "<<*res<<endl;
wcout<<L"Cтрока № "<<count<<endl;
int **mass = new int*[row - 1];
m = DelRow(m,row,col,count);
for(int i = 0;i < row ;++i){
mass = new int[col];
for(int j = 0;j < col;++j)
mass[j] = m[j];
}
OutMatrix(mass,row,col);
for(int i=0;i<row;i++)
{// Освобождение памяти
delete[] m;
delete[] mass;
}
delete[] m;
delete[] mass;
return 0;
}
void OutMatrix(int **m, int row, int col){
wcout<<L"\tМатрица"<<"\n\n";
for(int i=0;i<row;i++){
for(int j=0;j<col;j++)
cout<<setw(4)<<m[j];
cout<<"\n\n";
}
}
int** DelRow(int **m, int &row, int col, int index){
if(index >= row){
system("cls");
return m;
}
int **temp = new int*[--row];
for(int i=0;i<row+1;i++){
if(i < index) temp = m;
else if(i > index) temp[i-1] = m;
else delete[] m;
}
delete[] m;
return temp;
}
#include <iomanip>
#include <ctime>
#include <vector>
#include <algorithm>
using namespace std;
void OutMatrix(int**, int, int);// Вывод на экран матрицы
int** DelRow(int**, int&, int, int);// Удалить строку
int _tmain(int argc, _TCHAR* argv[])
{
wcout.imbue(locale(".866"));//Руссификация консоли
srand(time(0));
int row,col,menu = 0,index = 0;
do{
wcout<<L"Введите количество строк"<<endl;
cin>>row;
}while(row <= 0);
do{
wcout<<L"Введите количество столбцов"<<endl;
cin>>col;
}while(col <= 0);
int **m = new int*[row];// матрица
// Создаем матрицу
for(int i = 0;i < row;++i){
m = new int[col];
for(int j = 0;j < col;++j)
m[j] = rand() %100;// заполняем случ.числами
}
system("cls");// очистка консоли
OutMatrix(m, row, col);
vector<int> coll;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(i == j)
coll.push_back(m[j]);
}
}
for(int i=0;i < coll.size();i++)
cout<<coll<<' ';
cout<<endl;
int count;
vector<int>::iterator res = min_element(coll.begin(),coll.end());
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(m[j] == *res)
count = i;
}
}
wcout<<L"Минимальный элемент = "<<*res<<endl;
wcout<<L"Cтрока № "<<count<<endl;
int **mass = new int*[row - 1];
m = DelRow(m,row,col,count);
for(int i = 0;i < row ;++i){
mass = new int[col];
for(int j = 0;j < col;++j)
mass[j] = m[j];
}
OutMatrix(mass,row,col);
for(int i=0;i<row;i++)
{// Освобождение памяти
delete[] m;
delete[] mass;
}
delete[] m;
delete[] mass;
return 0;
}
void OutMatrix(int **m, int row, int col){
wcout<<L"\tМатрица"<<"\n\n";
for(int i=0;i<row;i++){
for(int j=0;j<col;j++)
cout<<setw(4)<<m[j];
cout<<"\n\n";
}
}
int** DelRow(int **m, int &row, int col, int index){
if(index >= row){
system("cls");
return m;
}
int **temp = new int*[--row];
for(int i=0;i<row+1;i++){
if(i < index) temp = m;
else if(i > index) temp[i-1] = m;
else delete[] m;
}
delete[] m;
return temp;
}
Цитата: bobik02
думал сначала так получится сделать:
но оказалось плохо думал ...
Код:
....
for ( int i = 0; i < n; i++)
{
for ( int j = 0 ; j < m ; j++ )
{
if (row != i )
{
arrayB[j] = arrayA[j] ;
}
}
}
....
for ( int i = 0; i < n; i++)
{
for ( int j = 0 ; j < m ; j++ )
{
if (row != i )
{
arrayB[j] = arrayA[j] ;
}
}
}
....
но оказалось плохо думал ...
Код:
....
for ( int i = 0; i < n; i++)
{
for ( int j = 0 ; j < m ; j++ )
{
if (i<row )
arrayB[j] = arrayA[j] ;
else if(i>row)
arrayB[i-1][j] = arrayA[j] ;
}
}
....
for ( int i = 0; i < n; i++)
{
for ( int j = 0 ; j < m ; j++ )
{
if (i<row )
arrayB[j] = arrayA[j] ;
else if(i>row)
arrayB[i-1][j] = arrayA[j] ;
}
}
....
не проверял, но вроде правильно
Код:
int writeRow = 0;
for ( int i = 0; i < n; i++)
{
if (row == i) continue;
for ( int j = 0 ; j < m ; j++ )
{
arrayB[writeRow][j] = arrayA[j];
}
writeRow++;
}
for ( int i = 0; i < n; i++)
{
if (row == i) continue;
for ( int j = 0 ; j < m ; j++ )
{
arrayB[writeRow][j] = arrayA[j];
}
writeRow++;
}