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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Влад1986
1 / 1 / 0
Регистрация: 01.02.2014
Сообщений: 8
#1

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

06.02.2014, 16:08. Просмотров 391. Ответов 10
Метки нет (Все метки)

Добрый вечер.
Помогите, пожалуйста, решить проблему.
Задание такое:
Дана целочисленная прямоугольная матрица, все элементы которой различны. Поменять местами столбцы, содержащие минимальный и максимальный элементы матрицы. Найти количество строк, среднее арифметическое элементов которых меньше заданной величины.
Необходимо выполнить в двух вариантах:
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;
}
Код компилироваться не хочет. Я понимаю, что ошибка связана с проблемой преобразования массива. Но как это исправить я не знаю. Объясните, пожалуйста, что нужно сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2014, 16:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача массива в функцию. Не могу понять что не так (C++):

не могу понять что не так - C++
задание такое : Структура &quot;книга почтой&quot;:-наименование книги;-ФИО автора;-номер по каталогу;-издательство;-колличество в...

не могу понять что не так((((( - C++
привет всем! у меня проблемка возникла компиятор никак не проглатывает мой код #include &lt;iostream&gt; using namespace std; int main() ...

Обьясните что не так не могу понять - C++
программа должна менять цвет bmp файла но при запуске выдает ошибку что 2 неразрешимых внешних элемента есть и все я пробовал разобраться...

Не могу понять, что не так в коде - C++
Целый день маюсь с этой прогой и ничё не выходит. #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main() { ...

C2061 ошибка, не могу понять что не так - C++
Заголовочный файл: Forces.h #ifndef _FORCES_ #define _FORCES_ #include &quot;ParticleSystem.h&quot; // Абстрактный класс силы class...

не могу понять что не так ( подскажите пожалста - C++
#include &lt;iostream&gt; using namespace std; double vvid_chusla( char*a) { cout&lt;&lt; &quot; Введiть &quot;&lt;&lt;a&lt;&lt;&quot;=&quot;; char b; cin.getline(b,9); ...

10
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, а вообще все возможные варианты написаны тут
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 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 ]);
1
Влад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;
    }
}
1
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
07.02.2014, 20:19 #5
В варианте с динамическим массивом память надо в конце освободить:
C++
1
2
3
for (int i = 0; i < n; ++i) 
    delete[] a[i];
delete[] a;
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 20:30 #6
Цитата Сообщение от DrOffset Посмотреть сообщение
В варианте с динамическим массивом память надо в конце освободить:
а Вы в этом уверены? или может в том коде она сама освободится?
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
07.02.2014, 20:35 #7
Цитата Сообщение от metaluga145 Посмотреть сообщение
а Вы в этом уверены? или может в том коде она сама освободится?
Не надо пожалуйста учить человека плохому. Да, после завершения приложения она освободится "сама". Но это абсолютно не значит, что delete для выделенной памяти не нужно вызывать.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 20:41 #8
DrOffset, конечно, значит. Я почему-то уверен, что это сократит время работы приложения. Пускай не в этом случае, пускай на мало, но сократит. Так что надо подумать что хуже
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
07.02.2014, 20:53 #9
Цитата Сообщение от metaluga145 Посмотреть сообщение
DrOffset, конечно, значит. Я почему-то уверен, что это сократит время работы приложения. Пускай не в этом случае, пускай на мало, но сократит. Так что надо подумать что хуже
Это называется экономить на спичках. И если он когда-нибудь решит связать свою профессиональную деятельность с программированием, то скажет мне спасибо. Лучше сразу приучать себя к правильному стилю.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 20:57 #10
Цитата Сообщение от DrOffset Посмотреть сообщение
Это называется экономить на спичках. И если он когда-нибудь решит связать свою профессиональную деятельность с программированием, то скажет мне спасибо. Лучше сразу приучать себя к правильному стилю.
ничего личного, но я связал свою жизнь с программированием, и я бы не сказал спасибо за это на мой стиль пока еще никто не жаловался Кроме того, 10 раз экономии на спичках дает неплохой результат)
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
07.02.2014, 21:20 #11
Цитата Сообщение от metaluga145 Посмотреть сообщение
ничего личного, но я связал свою жизнь с программированием, и я бы не сказал спасибо за это на мой стиль пока еще никто не жаловался Кроме того, 10 раз экономии на спичках дает неплохой результат)
Если хочется продолжить дискуссию, то лучше сменить площадку.
А насчет результата. Самый лучший результат по скорости достигается подбором правильных алгоритмов, изучением предметной области, оценкой граничных условий и многими другими вещами, но никак не экономией на спичках.

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

Пусть тс, и все кто это читают сами делают выводы. Если есть что ответить, прошу в личку.
0
07.02.2014, 21:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2014, 21:20
Привет! Вот еще темы с ответами:

Определить класс Gradebook: Не могу понять что не так - C++
Учусь по книге &quot;Дейтел Х., Дейтел П. Как программировать на C++ (5-е издание, 2008)&quot; учусь 2 дня, не ругайтесь пожалуйста если что то...

Проверьте программу на ошибку, не могу понять что не так - C++
#include &lt;iostream.h&gt; main() { int a, i, j, t; for(i = 0; i &lt;=10; i++) for(j = 0; i &lt;=10; i++) {if j&lt;=i || j&gt;=(11-i) a=1; ...

Ткните, пожалуйста, носом в ошибку. я не могу понять где, что не так - C++
#include &lt;iostream&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;RUSSIAN&quot;); cout &lt;&lt; &quot;Сколько чисел мы будем...

Передача массива в функцию - что на самом деле предается? - C++
Имя массива это константный указатель. Когда мы передаем его в функциюvoid f1(int *iArray) f1 это происходит как pass by reference. В...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru