Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [СИ] Массив


Автор: Steven 19.12.2007, 19:45
В двумерном N*K массиве целых чисел поменять местами строку, содержащую минимальный элемент массива, со строкой, содержащей максимальный элемент массива.

Код

#include <iostream>

const int MAX_SIZE = 5;

int B[MAX_SIZE][MAX_SIZE] = {0};

int max_x, max_y = 0;
int min_x, min_y = 0;

int main ()
{
    // ввод массива
    for ( int i = 0; i < MAX_SIZE; ++i)
    {
        for ( int j = 0; j < MAX_SIZE; ++j)
        {
            std::cin >> B[i][j];
        }
    }

    //поиск макс
    for ( int i = 0; i < MAX_SIZE; ++i)
    {
        for ( int j = 0; j < MAX_SIZE; ++j)
        {
            if ( B[i][j] > B[max_y][max_x] && B[i][j] % 2 != 0 )
            {
                max_y = i;
                max_x = j;
            }
        }
    }

    //поиск мин 
    for ( int i = 0; i < MAX_SIZE; ++i)
    {
        for ( int j = 0; j < MAX_SIZE; ++j)
        {
            if ( B[i][j] < B[min_y][min_x] && B[i][j] != 0 )
            {
                min_y = i;
                min_x = j;
            }
        }
    }

    // swap
    int tmp = B[max_y][max_x];
    B[max_y][max_x] = B[min_y][min_x];
    B[min_y][min_x] = tmp;



}


Правильный это код??? если да, то подпишите пожалуйста подробнее по операторам!

Автор: GoshaNahui 19.12.2007, 22:40
неправильный. странные проверки на максимум и минимум
if ( B[i][j] > B[max_y][max_x] && B[i][j] % 2 != 0 )
а должно быть просто
if ( B[i][j] > B[max_y][max_x])

да и обмен через жопу
сам писал?
поправь, не сможешь - напиши и я поправлю

Автор: Steven 19.12.2007, 22:43
GoshaNahui, 
Помоги пожалуйста, у меня всякая фигня получается!!! smile 

Код

#include <iostream>

const int MAX_SIZE = 5;

int B[MAX_SIZE][MAX_SIZE] = {0};

int max_x, max_y = 0;
int min_x, min_y = 0;

int main ()
{
    // ввод массива
    for ( int i = 0; i < MAX_SIZE; ++i)
    {
        for ( int j = 0; j < MAX_SIZE; ++j)
        {
            std::cin >> B[i][j];
        }
    }

    //поиск макс
    for ( int i = 0; i < MAX_SIZE; ++i)
    {
        for ( int j = 0; j < MAX_SIZE; ++j)
        {
            if ( B[i][j] > B[max_y][max_x])
            {
                max_y = i;
                max_x = j;
            }
        }
    }

    //поиск мин 
    for ( int i = 0; i < MAX_SIZE; ++i)
    {
        for ( int j = 0; j < MAX_SIZE; ++j)
        {
            if ( B[i][j] > B[max_y][max_x])
            {
                min_y = i;
                min_x = j;
            }
        }
    }

    // swap
    int tmp = B[max_y][max_x];
    B[max_y][max_x] = B[min_y][min_x];
    B[min_y][min_x] = tmp;


}


Что это за ошибки: 
(22) : error C2374: 'i' : redefinition; multiple initialization
(13) : see declaration of 'i'
(35) : error C2374: 'i' : redefinition; multiple initialization
(53) : warning C4508: 'main' : function should return a value; 'void' return type assumed

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

Автор: GoshaNahui 19.12.2007, 23:06
Для начала брось писать чушь. Если ты не умеешь кодить то для начала прочти хорошую книжку по Си
Но это потом, а пока:
Код
#include <iostream.h>
const int MAX_SIZE = 4;
int B[MAX_SIZE][MAX_SIZE];

int mx = 0, max_s = 0;
int mn = 0, min_s = 0;
int i, j;

int main (){
// ââîä ìàññèâà
  for (i = 0; i < MAX_SIZE; i++){
    for (j = 0; j < MAX_SIZE; j++)
      cin>>B[i][j];
      cout<<endl;
      }
//ïîèñê ìàêñ
  for (i = 0; i < MAX_SIZE; i++)
    for (j = 0; j < MAX_SIZE; j++)
      if (B[i][j] > mx){
        mx = B[i][j];
        max_s = i; /////////////////
        }
//ïîèñê ìèí
  for (i = 0; i < MAX_SIZE; i++)
    for (j = 0; j < MAX_SIZE; j++)
      if ( B[i][j] < mn){
        mn = B[i][j];
        min_s = i;
        }
  int temp[MAX_SIZE];
  for(i = 0; i < MAX_SIZE; i++) temp[i] = B[max_s][i];
  for(i = 0; i < MAX_SIZE; i++) B[max_s][i] = B[min_s][i];
  for(i = 0; i < MAX_SIZE; i++) B[min_s][i] = temp[i];

  for (i = 0; i < MAX_SIZE; i++){
    for (j = 0; j < MAX_SIZE; j++)
      cout<<B[i][j]<<" ";
      cout<<endl;
      }
  cin>>i;
}



код понятен или нужна растолковка операторов?

Автор: Steven 19.12.2007, 23:14
GoshaNahui,
Если тебе не лень, то огромная посьба растолковать операторы! я просто только начинаю изучать, так что в голове у меня всякая чушь!!smile 
 

Автор: GoshaNahui 19.12.2007, 23:33
Цитата
только начинаю изучать, так что в голове у меня всякая чушь!!

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

теперь в жопу прога:

Код

int main (){
  for (i = 0; i < MAX_SIZE; i++){  
    for (j = 0; j < MAX_SIZE; j++)
      cin>>B[i][j];
      cout<<endl;
      }

тута мы нах вводим массив. При каждом выполнении внешнего цикла сначала выполняется внутренний цикл, затем  в операторе 
cout<<endl; происходит перевод строки на новую, чтобы мы видели что вводим следующую строку
Код

  for (i = 0; i < MAX_SIZE; i++)
    for (j = 0; j < MAX_SIZE; j++)
      if (B[i][j] > mx){
        mx = B[i][j];
        max_s = i;
        }

тута просматриваем массив по строкам и столбцам, и если очередной элемент больше максимума то мы записываем в переменную mx значение элемента а в max_s пишем номер текущей строки, чтоб знать в какой строке максимум

потом то же самое для минимума

Код
  int temp[MAX_SIZE];
  for(i = 0; i < MAX_SIZE; i++) temp[i] = B[max_s][i];
  for(i = 0; i < MAX_SIZE; i++) B[max_s][i] = B[min_s][i];
  for(i = 0; i < MAX_SIZE; i++) B[min_s][i] = temp[i];

тут мы создаём одномерный массив - строчку. затем
for(i = 0; i < MAX_SIZE; i++) temp[i] = B[max_s][i]; - копируем в этот массив содержимое строчки с максимумом
for(i = 0; i < MAX_SIZE; i++) B[max_s][i] = B[min_s][i]; - заменяем строчку с максимумом на строчку с минимумом
for(i = 0; i < MAX_SIZE; i++) B[min_s][i] = temp[i]; - заменяем строчку с минимумом на содержимое массива, то есть на запомненную строчку с максимумом

Код
  for (i = 0; i < MAX_SIZE; i++){
    for (j = 0; j < MAX_SIZE; j++)
      cout<<B[i][j]<<" ";
      cout<<endl;
      }

а тут выводим массив. cout<<B[i][j]<<" "; выводит элемент и пробел после него
после вывода каждой строчки выполняется cout<<endl чтобы перевести строку

вот и всё... давай мля вперёд!

Автор: Steven 20.12.2007, 00:30
Код

#include <iostream.h>
const int MAX_SIZE = 4;
int B[MAX_SIZE][MAX_SIZE];



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

Автор: NiDaY 20.12.2007, 07:13
Цитата

N*K массиве

Steven у тебя для начала массив N*K, а не N*N!   N и K могут быть разными!

Добавлено @ 07:15
Код

#include <iostream>
#include <conio.h>
#define N 40
#define K 40
using namespace std;
int main ()
{
    int mass[N][K];
    int max_el=0, min_el=1000000;
    int num_str_max=0, num_str_min=0;
    int i, j, n ,k;
    cout<<"vvedite kolichestvo strok: ";
    cin>>n;
    while(1)
    {
        if((n>N)||(n<1))
        {
            cout<<"vvedite kolichestvo strok: ";
            cin>>n;
        }
        else
            break;
    }
    cout<<"vvedite kolichestvo stolbcov: ";
    cin>>k;
    while(1)
    {
        if((k>K)||(k<1))
        {
            cout<<"vvedite kolichestvo stolbcov: ";
            cin>>k;
        }
        else
            break;
    }
    cout<<endl; 
    for (i=0;i<n;i++)
    {
        for(j=0;j<k;j++)
        {
            cin>>mass[i][j];
        }
    }
    cout<<endl;
    for (i=0;i<n;i++)
    {
        for(j=0;j<k;j++)
        {
            printf("%6d",mass[i][j]);
        }
        cout<<endl;
    }
    for (i=0;i<n;i++)
    {
        for(j=0;j<k;j++)
        {
            if(mass[i][j]>max_el)
            {
                max_el=mass[i][j];
                num_str_max=i;
            }
        }
    }
    for (i=0;i<n;i++)
    {
        for(j=0;j<k;j++)
        {
            if(mass[i][j]<min_el)
            {
                min_el=mass[i][j];
                num_str_min=i;
            }
        }
    }
    int arr[K];
    for(j=0;j<k;j++)
    {
        arr[j]=mass[num_str_max][j];
    }
    for(j=0;j<k;j++)
    {
        mass[num_str_max][j]=mass[num_str_min][j];
        mass[num_str_min][j]=arr[j];
    }
    cout<<endl;
    for (i=0;i<n;i++)
    {
        for(j=0;j<k;j++)
        {
            printf("%6d",mass[i][j]);
        }
        cout<<endl;
    }
    getch();
    return 0;
}

Вот попробуй!

Автор: Steven 20.12.2007, 23:55
Всем спасибо! smile  smile  smile 
Тема закрыта! topic is off

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)