Форум программистов, компьютерный форум CyberForum.ru

Передача массива в функцию. Не могу понять что не так - C++

Восстановить пароль Регистрация
 
Влад1986
1 / 1 / 0
Регистрация: 01.02.2014
Сообщений: 8
06.02.2014, 16:08     Передача массива в функцию. Не могу понять что не так #1
Добрый вечер.
Помогите, пожалуйста, решить проблему.
Задание такое:
Дана целочисленная прямоугольная матрица, все элементы которой различны. Поменять местами столбцы, содержащие минимальный и максимальный элементы матрицы. Найти количество строк, среднее арифметическое элементов которых меньше заданной величины.
Необходимо выполнить в двух вариантах:
1. Используя локальные массивы. Размерности локальных массивов задавать именованными константами, значения элементов массива — в списке инициализации.
2. Используя динамические массивы. Ввод данных в динамический массив выполнять с клавиатуры.

Пример создания кода взял тут Матрица, поменять столбцы, найти количество строк. [CPP]

Вот что у меня получилось для статического массива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <cstdlib>
#include <ctime>
#include<climits>
using namespace std;
 
//void arrprint(int *a, int n, int m) {
//  for(int i = 0; i < m; i++) {
//      for(int j = 0; j < n; j++) {
//          cout << *(a + i*n + j) << ' ';
//      }
//      cout << endl;
//  }
//}
int SearchMaxColumn(int **a,int n,int m); // функция поиска максимального элемента
int SearchMinColumn(int **a,int n,int m); // функция поиска минимального элемента
int Average(int **a,int n,int m,int value); // Функция поиска среднего арифметического строки массива, возвращает количество строк, среднее арифметическое которх меньше value
void ExchangeColumn(int **a,int n,int p,int q); //Функция меняет столбцы местами
void PrintMatrix(int **a,int m,int n); // Функция вывода матрицы
int main() {
    
    const int n=3, m=6;
    int a[n][m]={3,7,8,0,1,4,2,9,1,4,7,6,5,2,7,6,1,9};
    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            cout << *(a + i*n + j) << ' ';
        }
        cout << endl;
    }
//  arrprint(&a[0][0], n, m);
    int q, p;
    q=SearchMaxColumn(a,n,m);
    p=SearchMinColumn(a,n,m);
    ExchangeColumn(a,n,p,q);
    PrintMatrix(a,n,m);
    std::cout<<"Enter value:";
    int value;
    std::cin>>value;
    int Answer=Average(a,n,m,value);
    std::cout<<"Answer: "<<Answer<<std::endl;
    return 0;
}
int Average(int **a,int n,int m,int value)
{
    int sum=0,k=0;
    for (int i=0;i<n;++i)
    {
    for(int j=0;j<m;++j)
    {
        sum+=a[i][j];
    }
    if (sum>value)
        k++;
    }
    return k;
}
int SearchMaxColumn(int **a,int n,int m)
{
    int max=INT_MIN,jmax;
    for (int i=0;i<n;++i)
    {
    for (int j=0;j<m;++j)
    if (max<a[i][j])
    {
    max=a[i][j];
    jmax=j;
    }
    }
    std::cout<<jmax<<" "<<max<<std::endl;
    return jmax;
}
int SearchMinColumn(int **a,int n,int m)
{
    int min=INT_MIN,jmin;
    for (int i=0;i<n;++i)
    {
    for (int j=0;j<m;++j)
    if (min>a[i][j])
    {
    min=a[i][j];
    jmin=j;
    }
    }
    std::cout<<jmin<<" "<<min<<std::endl;
    return jmin;
}
Код компилироваться не хочет. Я понимаю, что ошибка связана с проблемой преобразования массива. Но как это исправить я не знаю. Объясните, пожалуйста, что нужно сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2014, 16:08     Передача массива в функцию. Не могу понять что не так
Посмотрите здесь:

C++ не могу понять что не так
C2061 ошибка, не могу понять что не так C++
не могу понять что не так((((( C++
C++ Определить класс Gradebook: Не могу понять что не так
C++ Не могу понять, что не так в коде
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
06.02.2014, 16:22     Передача массива в функцию. Не могу понять что не так #2
Влад1986, сделайте массив не статическим, а динамическим.
C++
1
2
3
int ** a = new int* [n];
for (int i = 0; i<n;++i)
    a[i] = new int [m];
Тогда Вы сможете его передавать в Ваши функции.

Добавлено через 1 минуту
Влад1986, а вообще все возможные варианты написаны тут
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.02.2014, 16:25     Передача массива в функцию. Не могу понять что не так #3
Указатель на указатель ( int ** ) это не одно и тоже, что и статический двумерный массив ( arr[][] ).
Или создавайте массив динамически в куче, или изменяйте параметры функции на ( int [][ m ] ). Можете использовать шаблон:
C++
1
2
template< std::size_t n, std::size_t m >
void test( int ( &arr )[ n ][ m ]);
Влад1986
1 / 1 / 0
Регистрация: 01.02.2014
Сообщений: 8
07.02.2014, 20:12  [ТС]     Передача массива в функцию. Не могу понять что не так #4
Вот что у меня получилось. Может кому-нибудь пригодится.

СТАТИЧЕСКИЙ МАССИВ:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <cstdlib>
#include <ctime>
#include<climits>
using namespace std;
const int n = 3;
const int m = 3;
void massiv(int a[][m]) {
  for(int i = 0; i < m; i++) {
     for(int j = 0; j < n; j++) {
           cout << a[i][j] <<' ';
     }
   cout << endl;
}
}
int SearchMaxColumn(int a[][m],int n,int m); // функция поиска максимального элемента
int SearchMinColumn(int a[][m],int n,int m); // функция поиска минимального элемента
int Average(int a[][m],int n,int m,int value); // Функция поиска среднего арифметического строки массива, возвращает количество строк, среднее арифметическое которых меньше value
void ExchangeColumn(int a[][m],int n,int p,int q); //Функция меняет столбцы местами
void PrintMatrix(int a[][m],int m,int n); // Функция вывода матрицы
int main() {
    int a[n][m]={3,7,8,9,1,4,5,10,6};
    std::cout<<"Dannyj massiv: \n";
    massiv(a);
    int p, q;
    q=SearchMaxColumn(a,n,m);
    p=SearchMinColumn(a,n,m);
    cout<<'\n';
    ExchangeColumn(a,n,p,q);
    PrintMatrix(a,n,m);
    std::cout<<"Enter value:";
    int value;
    std::cin>>value;
    double Answer=Average(a,n,m,value);
    std::cout<<"Answer: "<<Answer<<std::endl;
    return 0;
}
int Average(int a[][m],int n,int m,int value)
{
    double sum=0,k=0;
    for (int i=0;i<n;++i)
    {
    for(int j=0;j<m;++j)
    {
        sum+=a[i][j];
    }
    sum=sum/m;
    if (sum<value)
        k++;
    }
    return k;
}
int SearchMaxColumn(int a[][m],int n,int m)
{
    int max=INT_MIN,jmax;
    for (int i=0;i<n;++i)
    {
    for (int j=0;j<m;++j)
    if (max<a[i][j])
    {
    max=a[i][j];
    jmax=j;
    }
    }
    std::cout<<"Max element: "<<max<<std::endl;
    return jmax;
}
int SearchMinColumn(int a[][m],int n,int m)
{
    int min=INT_MAX,jmin;
    for (int i=0;i<n;++i)
    {
    for (int j=0;j<m;++j)
    if (min>a[i][j])
    {
    min=a[i][j];
    jmin=j;
    }
    }
    std::cout<<"Min element: "<<min<<std::endl;
    return jmin;
}
void ExchangeColumn(int a[][m],int n,int p,int q)
{
    int s;
    for (int i=0;i<n;++i)
    {
    s=a[i][p];
    a[i][p]=a[i][q];
    a[i][q]=s;
    }
}
void PrintMatrix(int a[][m],int n,int m)
{
    for (int i=0;i<n;++i)
    {
    for(int j=0;j<m;++j)
    {
    std::cout<<a[i][j]<<" ";
    }
    std::cout<<std::endl;
    }
}
ДИНАМИЧЕСКИЙ МАССИВ:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <cstdlib>
#include <ctime>
#include<climits>
using namespace std;
int SearchMaxColumn(int **a,int n,int m); // функция поиска максимального элемента
int SearchMinColumn(int **a,int n,int m); // функция поиска минимального элемента
int Average(int **a,int n,int m,int value); // Функция поиска среднего арифметического строки массива, возвращает количество строк, среднее арифметическое которх меньше value
void ExchangeColumn(int **a,int n,int p,int q); //Функция меняет столбцы местами
void PrintMatrix(int **a,int m,int n); // Функция вывода матрицы
int main() {
    int n, m, p, q;
    cout << "Vvedite kol-vo strok:\n";
    std::cin >> n;
    cout << "Vvedite kol-vo stolbcov:\n";
    std::cin >> m;
    int **a = new int* [n];
        for (int i = 0; i<n;++i) a[i] = new int [m];
        cout << "Vvedite massiv:\n";
        for (int i=0; i<n; i++)
            for (int j=0; j<m; j++) cin>> a[i][j];
        cout << "Poluchennyi massiv:\n";
        for (int i=0; i<n; i++){
            for (int j=0; j<m; j++) cout<< a[i][j]<<"  ";
            std::cout<<std::endl;
        }
    q=SearchMaxColumn(a,n,m);
    p=SearchMinColumn(a,n,m);
    cout<<'\n';
    ExchangeColumn(a,n,p,q);
    PrintMatrix(a,n,m);
    std::cout<<"Enter value:";
    int value;
    std::cin>>value;
    double Answer=Average(a,n,m,value);
    std::cout<<"Answer: "<<Answer<<std::endl;
    return 0;
}
int Average(int **a,int n,int m,int value)
{
    int sum=0,k=0;
    for (int i=0;i<n;++i)
    {
    for(int j=0;j<m;++j)
    {
        sum+=a[i][j];
    }
    sum=sum/m;
    if (sum<value)
        k++;
    }
    return k;
}
int SearchMaxColumn(int **a,int n,int m)
{
    int max=INT_MIN,jmax;
    for (int i=0;i<n;++i)
    {
    for (int j=0;j<m;++j)
    if (max<a[i][j])
    {
    max=a[i][j];
    jmax=j;
    }
    }
    std::cout<<"Max element: "<<max<<std::endl;
    return jmax;
}
int SearchMinColumn(int **a,int n,int m)
{
    int min=INT_MAX,jmin;
    for (int i=0;i<n;++i)
    {
    for (int j=0;j<m;++j)
    if (min>a[i][j])
    {
    min=a[i][j];
    jmin=j;
    }
    }
    std::cout<<"Min element: "<<min<<std::endl;
    return jmin;
}
void ExchangeColumn(int **a,int n,int p,int q)
{
    int s;
    for (int i=0;i<n;++i)
    {
    s=a[i][p];
    a[i][p]=a[i][q];
    a[i][q]=s;
    }
}
void PrintMatrix(int **a,int n,int m)
{
    for (int i=0;i<n;++i)
    {
    for(int j=0;j<m;++j)
    {
    std::cout<<a[i][j]<<" ";
    }
    std::cout<<std::endl;
    }
}
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
07.02.2014, 20:19     Передача массива в функцию. Не могу понять что не так #5
В варианте с динамическим массивом память надо в конце освободить:
C++
1
2
3
for (int i = 0; i < n; ++i) 
    delete[] a[i];
delete[] a;
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 20:30     Передача массива в функцию. Не могу понять что не так #6
Цитата Сообщение от DrOffset Посмотреть сообщение
В варианте с динамическим массивом память надо в конце освободить:
а Вы в этом уверены? или может в том коде она сама освободится?
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
07.02.2014, 20:35     Передача массива в функцию. Не могу понять что не так #7
Цитата Сообщение от metaluga145 Посмотреть сообщение
а Вы в этом уверены? или может в том коде она сама освободится?
Не надо пожалуйста учить человека плохому. Да, после завершения приложения она освободится "сама". Но это абсолютно не значит, что delete для выделенной памяти не нужно вызывать.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 20:41     Передача массива в функцию. Не могу понять что не так #8
DrOffset, конечно, значит. Я почему-то уверен, что это сократит время работы приложения. Пускай не в этом случае, пускай на мало, но сократит. Так что надо подумать что хуже
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
07.02.2014, 20:53     Передача массива в функцию. Не могу понять что не так #9
Цитата Сообщение от metaluga145 Посмотреть сообщение
DrOffset, конечно, значит. Я почему-то уверен, что это сократит время работы приложения. Пускай не в этом случае, пускай на мало, но сократит. Так что надо подумать что хуже
Это называется экономить на спичках. И если он когда-нибудь решит связать свою профессиональную деятельность с программированием, то скажет мне спасибо. Лучше сразу приучать себя к правильному стилю.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 20:57     Передача массива в функцию. Не могу понять что не так #10
Цитата Сообщение от DrOffset Посмотреть сообщение
Это называется экономить на спичках. И если он когда-нибудь решит связать свою профессиональную деятельность с программированием, то скажет мне спасибо. Лучше сразу приучать себя к правильному стилю.
ничего личного, но я связал свою жизнь с программированием, и я бы не сказал спасибо за это на мой стиль пока еще никто не жаловался Кроме того, 10 раз экономии на спичках дает неплохой результат)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2014, 21:20     Передача массива в функцию. Не могу понять что не так
Еще ссылки по теме:

C++ не могу понять что не так ( подскажите пожалста
Обьясните что не так не могу понять C++
Ткните, пожалуйста, носом в ошибку. я не могу понять где, что не так C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
07.02.2014, 21:20     Передача массива в функцию. Не могу понять что не так #11
Цитата Сообщение от metaluga145 Посмотреть сообщение
ничего личного, но я связал свою жизнь с программированием, и я бы не сказал спасибо за это на мой стиль пока еще никто не жаловался Кроме того, 10 раз экономии на спичках дает неплохой результат)
Если хочется продолжить дискуссию, то лучше сменить площадку.
А насчет результата. Самый лучший результат по скорости достигается подбором правильных алгоритмов, изучением предметной области, оценкой граничных условий и многими другими вещами, но никак не экономией на спичках.

В С++ new и delete могут быть переопределены через кастомные аллокаторы. Память выделенная через них может уже освобождаться системой так просто (например если это одна из моделей shared memory).
Помимо памяти есть и другие ресурсы. Например сокеты. Их тоже не нужно закрывать? Никогда не сталкивались с проблемой, что новое приложение не может открыть сокет потому что они кончились? Я вот буквально месяц назад в огромном проекте как раз искал и исправлял такие баги. Вообще один из самых распространенных косяков, с которыми постоянно приходится бороться - это утечки ресурсов (память, сокеты, дескрипторы). За такой код спасибо уже не скажут вам.

Пусть тс, и все кто это читают сами делают выводы. Если есть что ответить, прошу в личку.
Yandex
Объявления
07.02.2014, 21:20     Передача массива в функцию. Не могу понять что не так
Ответ Создать тему
Опции темы

Текущее время: 18:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru