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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.91
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
#1

Передача матрицы в функцию - C++

20.08.2012, 11:50. Просмотров 7474. Ответов 6
Метки нет (Все метки)

Доброго времени суток.
Возникло несколько вопросов:
  • Почему при вызове Matrix1 выдаётся ошибка, но в то же время Matrix2 работает нормально?
    C++
    1
    2
    3
    4
    5
    6
    
    const int M=10;
    const int N=7;
    void Matrix1(int N, int a[][N]);
    void Matrix2(int N, int a[][M]);
    int main()
    {......}
  • Есть ф-я подсчёта суммы элементов одномерно массива(напр.
    C++ (Qt)
    1
    
    int Sum(int N, int *a);
    Хочу применить её для матрицы и подсчитать сумму 2-х строк, допустим 0-ой и 1-ой
    C++
    1
    
     Sum(2*M,a[0]);
    .
    Пробовал подавать статическую матрицу - всё работает, однако при подаче динамической(т.е. объявленной как **a c послед. выделением памяти ф-ей new) ф-ия запускается, но выдает неверный результат(какое - то большое отр. число). В чём причина?
Буду благодарен за разъяснения.
P.S. исп. MV C++ 2010 экспресс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pahanuch
324 / 159 / 13
Регистрация: 03.11.2010
Сообщений: 923
20.08.2012, 12:03     Передача матрицы в функцию #2
Цитата Сообщение от PG94 Посмотреть сообщение
Почему при вызове Matrix1 выдаётся ошибка, но в то же время Matrix2 работает нормально?
что за ошибка?
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
20.08.2012, 12:10  [ТС]     Передача матрицы в функцию #3
error C2057: требуется константное выражение
Но если поставить вместо N число, то работает.
-=ЮрА=-
Заблокирован
Автор FAQ
20.08.2012, 12:12     Передача матрицы в функцию #4
PG94, разрабатывать и писать нужно универсатьные функции и поэтому лучше передавать не статические 2-мерные массивы а указатели на них. Это позволит писать функции вида fun(int n, int * arr) либо для 2-х мерных массивов fun(int m, int n, int ** arr).Ниже приём со статическими указателями позволяющими рабоать далее с массивом как с динамическим
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
#include <ctime>
#include <iostream>
using namespace std;
 
const int M = 5;
const int N = 4;
 
//ÑêГ*æåì ГҐГ±ГІГј ГґГіГ*êöèÿ Г*Г*õîæäåГ*ГЁГї ñóììû ýëåìåГ*òîâ Г¬Г*Г±Г±ГЁГўГ*
int Summ(int m, int n, int **arr);
 
int main()
{
    int i, j;
    int staticArr[M][N]   = {0};//Âûäåëèëè ГЇГ*ìÿòü ïîä äâóìåðГ*ûé
    //Г±ГІГ*ГІГЁГ·ГҐГ±ГЄГЁГ© Г¬Г*Г±Г±ГЁГў
    int * staticArrPtr[M] = {0};//ГЂ ГЅГІГЁГ¬ âûäåëèëè ГЇГ*ìÿòü ïîä
    //Г¬Г*Г±Г±ГЁГў ГіГЄГ*Г§Г*òåëåé
    srand(time(0));
    for(i = 0; i < M; i++)
    {
        for(j = 0; j < N; j++)
            cout<<(staticArr[i][j] = rand()%9)<<" ";
        cout<<endl;
        staticArrPtr[i] = staticArr[i];
    }
    cout<<"Sum of elements : "<<Summ(M, N, &staticArrPtr[0])<<endl;
    return 0;
}
 
int Summ(int m, int n, int **arr)
{
    int i, j;
    int sum = 0;
    for(i = 0; i < m; i++)
    for(j = 0; j < n; j++)
        sum += arr[i][j];
    return sum;
}
http://liveworkspace.org/code/57e1b5...c496aaec5888c2
Миниатюры
Передача матрицы в функцию  
Thinker
Эксперт C++
4219 / 2193 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
20.08.2012, 12:23     Передача матрицы в функцию #5
А почему у вас в функциях
void Matrix1(int N, int a[][N]);
void Matrix2(int N, int a[][M]);
в одном случае M, а в другом N? Всю программу покажите лучше, тогда все ясно будет

Вот смотрите, все работает:
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
#include<stdio.h>
#include<stdlib.h>
#define M 5
#define N 10
 
int Sum(int *a, int n)
{
   int i, s = 0;
   for (i = 0; i < n; i++)
      s += a[i];
   return s;
}
 
int main()
{
   int i, j, a[M][N];
   srand(time(NULL));
   for(i = 0; i < M; i++)
   {
      for(j = 0; j < N; j++)
         printf("%d ", a[i][j] = rand()%10);
      putchar('\n');
   }
   printf("sum = %d\n", Sum(*a, 2*N)); // сумма 1 и 2 строки
   printf("sum = %d\n", Sum(*a + 2*N, 2*N)); // сумма 3 и 4 строки
   return 0;
}
Кажется, что вы с M и N просто запутались
-=ЮрА=-
Заблокирован
Автор FAQ
20.08.2012, 12:24     Передача матрицы в функцию #6
Касательно данного задания - ниже вывод построчных сумм массива
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
#include <ctime>
#include <iostream>
using namespace std;
 
const int M = 5;
const int N = 4;
 
int Sumr(int n, int *arr);
 
int main()
{
    int i, j;
    int staticArr[M][N]   = {0};//Âûäåëèëè ГЇГ*ìÿòü ïîä äâóìåðГ*ûé
    //Г±ГІГ*ГІГЁГ·ГҐГ±ГЄГЁГ© Г¬Г*Г±Г±ГЁГў
    srand(time(0));
    for(i = 0; i < M; i++)
    {
        for(j = 0; j < N; j++)
            cout<<(staticArr[i][j] = rand()%9)<<" ";
        cout<<endl;
    }
    //Ïîñòðî÷Г*ûå ñóììû
    cout<<"Rows sum : \n";
    for(i = 0; i < M; i++)
        cout<<"Row : "<<i + 1<<" : "<<Sumr(N, staticArr[i])<<endl;
    return 0;
}
 
int Sumr(int n, int *arr)
{
    int sum = 0;
    for(int j = 0; j < n; j++)
        sum += arr[j];
    return sum;
}
http://liveworkspace.org/code/2866a9...93ec2d17c36527
Миниатюры
Передача матрицы в функцию  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2012, 14:45     Передача матрицы в функцию
Еще ссылки по теме:

C++ Передача объекта в функцию или функцию друга
C++ Передача в функцию и возврат из функции динамической матрицы
Передача массива в функцию используя указатель на функцию C++
C++ Разработать программу, которая содержит функцию замены местами первого и последнего столбцов матрицы и функцию
C++ Передача указателя на шаблонную функцию в другую функцию

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

Или воспользуйтесь поиском по форуму:
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
20.08.2012, 14:45  [ТС]     Передача матрицы в функцию #7
Вот одна программа( будет работать при замене N на M, т.е. int Sum_Matrix(int N, int a[][M]);):
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
#include<iostream>
#include<conio.h>
using namespace std;
const int N=7;
const int M=7;
int Sum_Matrix(int N, int a[][N]);
int main()
{   int a[N][N];
    int i,j,sum;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            a[i][j]=rand()%10;
    for(i=0;i<N;i++)
    {   for(j=0;j<N;j++)
            printf("%5d",a[i][j]);
        printf("\n\n");
    }
    sum=Sum_Matrix(N,a);
    cout<<sum<<endl;
    getch();
    return 0;
}
int Sum_Matrix(int N, int a[][N])
{   int i,j,s=0;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            s+=a[i][j];
    return s;
}
Что касается исп. ф-ии для одномерного массива:
1)Работает:
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
#include<iostream>
#include<conio.h>
using namespace std;
const int N=7;
int Sum(int N, int *a);
int main()
{   int a[N][N];
    int i,j,sum;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            a[i][j]=rand()%10;
    for(i=0;i<N;i++)
    {   for(j=0;j<N;j++)
            printf("%5d",a[i][j]);
        printf("\n\n");
    }
    sum=Sum(2*N,a[0]);//сумма 0 и 1 строк
    cout<<sum<<endl;
    getch();
    return 0;
}
int Sum(int N, int *a)
{   int i,s=0;
    for(i=0;i<N;i++)
        s+=a[i];
    return s;
}
2)Не работает:
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
#include<iostream>
#include<conio.h>
using namespace std;
const int N=7;
int Sum(int N, int *a);
int main()
{   int **a;
    int i,j,sum;
    //выделение памяти, матрица-динамическая
    a=new int *[N];
    for(i=0;i<N;i++)
        a[i]=new int [N];
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            a[i][j]=rand()%10;
    for(i=0;i<N;i++)
    {   for(j=0;j<N;j++)
            printf("%5d",a[i][j]);
        printf("\n\n");
    }
    sum=Sum(2*N,a);//сумма 0 и 1 строк
    cout<<sum<<endl;
    for(i=0;i<N;i++)
        delete []a[i];
    delete []a;
    getch();
    return 0;
}
int Sum(int N, int *a)
{   int i,s=0;
    for(i=0;i<N;i++)
        s+=a[i];
    return s;
}
P.S. Я в программировании новичок, о дин. матрицах узнал недавно и приём исп. ф-ии для одномерного массива к матрице применяю впервые. Однако в нюансах хочется разобраться как можно быстрее, заранее спасибо за помощь.

Добавлено через 11 минут
Не в тему: буду также благодарен, если кто-нибудь поделиться ссылкой на хорошее пособие по языку.
Особенно интересует присутствие интересных задач с решениями или предшествующим разбором типовых задач(объяснение важных приёмов).
Уровень знания языка низкий, математики - выпускника средней школы. В этом году поступаю и хочу поднабрать материала для самообразования и разбора непонятных тем.
Yandex
Объявления
20.08.2012, 14:45     Передача матрицы в функцию
Ответ Создать тему
Опции темы

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