Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Параметр функции 
:(
    Опции темы
dark0ut
Дата 14.5.2004, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 20.2.2003

Репутация: нет
Всего: нет



У меня есть несколько функций, в том числе функция сортировки по возрастанию элементов мат
рицы, располож. до первого минимального элемента. Проблема в том, что функции в качестве св
оих параметров не хочет передавать двумерный массив.
Я определяю функции:

void input (int [][], int &);
void sort (int [][], int, int);
void output (int [][], int);

С одномерным массивом все ОК, а при передаче параметра в виде матрицы компилятор шлет о
шибку. Пришлось представлять двумерный массив как одномерный - a[i*n+j]. Но тогда не работ
ает сортировка:

void sort(int a[], int n, int minstr)
{
int min=0, minid=0, backup=0;
for (int i=0; i<minstr; i++)
{
for (t=0; t<n; t++)
{
min=a[i*n+t];
for (int t1=t; t1<n; t1++)
{
if (a[i*n+t1]<min)
{
min=a[i*n+t1];
minid=i*n+t1;
}
}

backup=a[i*n+t];
a[i*n+t]=a[minid];
a[minid]=backup;
}
}
}

В чем ошибка сортировки и почему матрица не передается в виде параметра функции?
PM MAIL WWW ICQ   Вверх
Anklav
Дата 15.5.2004, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.12.2003
Где: Менск

Репутация: нет
Всего: 1



При объявлении функии с массивом в качестве параметра, нужно задавать все размерности массива в явном виде, кроме первой.

Т.е. например так:
Код

void input (int [][10], int &);

PM ICQ   Вверх
mr.DUDA
Дата 15.5.2004, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Хорошим тоном будет передавать указатели в качестве аргументов функций, т.к. вполне возможно, что может понадобиться та же функция, но сортирующая массив N на M, где ни M ни N заранее не известны (их также нужно передавать через аргумент функции). Вот работающий код dark0ut-а:
Цитата
void sort(int **a, int n, int minstr)
{
   
int min=0, minid=0, backup=0;
   
for(int i=0; i<minstr; i++)
    {
       
for(int t=0; t<n; t++)
        {
           
min=a[i][t];
           
for(int t1=t; t1<n; t1++)
            {
               
if(a[i][t1]<min)
                {
                   
min=a[i][t1];
                   
minid=t1;
                }
            }
           
           
backup=a[i][t];
           
a[i][t]=a[i][minid];
           
a[i][minid]=backup;
        }
    }
}




--------------------
user posted image
PM MAIL WWW   Вверх
dark0ut
Дата 15.5.2004, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 20.2.2003

Репутация: нет
Всего: нет



Цитата(Anklav @ 14.5.2004, 16:03)
При объявлении функии с массивом в качестве параметра, нужно задавать все размерности массива в явном виде, кроме первой.

Т.е. например так:
Код

void input (int [][10], int &);

Теперь функция передается в параметрах, но вот при ее вызове - input (a, n); - все равно ошибка. -
[C++ Error] lab10.cpp(19): E2034 Cannot convert 'int *' to 'int ( *)[3]'
PM MAIL WWW ICQ   Вверх
Artiom
Дата 15.5.2004, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Код
void input (int a[][3], int b)
{
// что-то
}
main()
{
int a[3][3];
int n = 55;
input(a,n);
}

например это нормально компилится. А лучше делать так как написал сверху mr.DUDA



--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
dark0ut
Дата 15.5.2004, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 20.2.2003

Репутация: нет
Всего: нет



Ура! Я домучил прогу. smile.gif Только есть некоторые баги. Скажем, вводим матрицу 3х3:
9 6 4
7 8 5
3 0 2

По идее он должен отсортировать первые 2 строчки по возрастанию, а он сортирует первую нор

мально, а вторую по-кривому и получается вот что:
4 9 6
5 7 8
3 0 2

Не могу понять почему.

Вот полный код проги:

Код

#include "stdafx.h"
#include "iostream.h"
#include "conio.h"

const MaxN=100;

int input (int [][100], int &);
int minim (int [][100], int);
void sort (int [][100], int, int);
void output (int [][100], int);


int main()
{
int a[MaxN][MaxN];
int n,x;
int code = input (a, n);
       if (code==1)
       {
               cout << "error!";
       }
x=minim(a,n);
sort (a, n, x);
output(a,n);
       getch();
return 0;
}



int input(int a[MaxN][MaxN], int &n)
{
cout << "n=";
cin >> n;
       if (n>MaxN || n<0)
       {
               return 1;
       }

for(int i=0; i<n; i++)
{
 for (int j=0; j<n; j++)
 {
  cout <<"a["<<i<<"]["<<j<<"]= ";
  cin >> a[i][j];
 }
}
       return 0;
}



int minim(int a[MaxN][MaxN], int n)
{
int minid=0;
for (int i=0; i<n; i++)
{
 for (int j=0; j<n; j++)
 {
  int min=a[0][0];
  if (a[i][j]<min)
  {
   min=a[i][j];
   minid=i;
  }
 }
}
return minid;
}



void sort(int a[MaxN][MaxN], int n, int minstr)
{
int min=0, minid=0, backup=0;
for (int i=0; i<minstr; i++)
{
 for (int j=0; j<n; j++)
 {
  min=a[i][j];
  for (int t=j; t<n; t++)
  {
   if (a[i][t]<min)
   {
    min=a[i][t];
    minid=t;
   }
  }

  backup=a[i][j];
  a[i][j]=a[i][minid];
  a[i][minid]=backup;
 }
}
}



void output(int a[MaxN][MaxN], int n)
{
for (int i=0; i<n; i++)
{
 for (int j=0; j<n; j++)
 {
  cout << a[i][j] << ' ';
               }
               cout << endl;
}
}


PM MAIL WWW ICQ   Вверх
Anklav
Дата 15.5.2004, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.12.2003
Где: Менск

Репутация: нет
Всего: 1



Раз ты ищешь минимальный элемент в матрице, то возвращай номер столбца и номер строки, а ты возвращаешь только номер строки.

Это сообщение отредактировал(а) Anklav - 15.5.2004, 15:42
PM ICQ   Вверх
dark0ut
Дата 16.5.2004, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 20.2.2003

Репутация: нет
Всего: нет



А чем это поможет при сортировке? Напиши код, plz
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.