Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Матрица, генератор случайных чисел (С++)

4.7K
24 ноября 2007 года
bobik02
140 / / 11.09.2007
вот такая задача:

Сделать алгоритм и программу для обработки двухмерных массивов.
1.) Элементы матрицы A сделать с помощью генератора случайных чисел.
2.) Сделать новую матрицу B , в которой удалить с матрицы А ряд, в котором минимальный элемент среди элементов главной диагонали .


меня затрудняет что бы сделать эту задачу:
Как сгенерить матрицу с помощью генератора случайных чисел ?

сделать матрицу B с удалением с матрицы А рядка - не проблема, проблема: пробежатся по диагонали матрицы (я могу пробежатся в цыкле по диагонали только в том случаи если матрица квадратичная (типа 4*4, 5*5 и т.к.) ), а что будет если матрица не квадратическая,ну скажем 5*3 .... может существует некая "формула" что бы по диагонали пробежатся ?
245
24 ноября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
ну для случайных чисел я обычно юзаю rand

 
Код:
rand()%a


генерит число от 0 до a

а насчет диагонали, я че-то не припомню, чтобы у неквадратной матрицы была главная диагональ.
320
24 ноября 2007 года
m_Valery
1.0K / / 08.01.2007
Для кого пишется FAQ ? Почему не смотришь - там ведь есть пример на создание двумерного массива и функции добавления-удаления столбцов и строк ?
1.8K
24 ноября 2007 года
ViToBrother
149 / / 13.05.2007
CTime Time=CTime::GetCurTime();
Сначала можеш написать srand(Time.GetMonth() + Time.GetSecond() + Time. GetMinute());
Чтоб генерация была случайной !!!:cool:
4.7K
25 ноября 2007 года
bobik02
140 / / 11.09.2007
не все так просто оказалось как хотелось :(

вот что получилось сделать по задачке:
Код:
#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
}


так вот я не могу понять как можно в матрицу B загнать значения с матрицы A но без того рядка (тот где по диагонали мы находим минимальный елемет)...

думал сначала так получится сделать:
Код:
....
for ( int i = 0; i < n; i++)
   {
     for ( int j = 0 ; j < m ; j++ )
     {
        if (row != i  )
       {
       arrayB[j] = arrayA[j] ;
       }
       
     }
   }
....

но оказалось плохо думал ...

дальше начал думать: записать сначала значения до row (ряд которого надо удалить), и после row , ага .... и что ж тада если минимум по диагонали например окажется последний ряд или первый ряд , то наверное будет не хорошая ошибочка....

а дальше "думалка" сломалась... помогите разобратся пожалуйста ?
320
25 ноября 2007 года
m_Valery
1.0K / / 08.01.2007
Ну вот хотя бы так сделай.
Код:
#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;
}
274
25 ноября 2007 года
Lone Wolf
1.3K / / 26.11.2006
Цитата: 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 (i<row  )
           arrayB[j] = arrayA[j] ;
       else if(i>row)
           arrayB[i-1][j] = arrayA[j] ;
     }
   }
....

не проверял, но вроде правильно
4.7K
25 ноября 2007 года
bobik02
140 / / 11.09.2007
спасибо но я сделал таким образом:
Код:
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++;

    }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог