Jump to content

Recommended Posts

Posted

Boas, estava aqui a aprender um bocadinho de recursividade e fiquei com a seguinte duvida:

- Como é que eu passo uma matriz para uma funçao que eu proprio chamei?

#include <cstdlib>
#include <iostream>
using namespace std;

[u]void process(int a,int b,int mat[100][100],int soma){[/u]
     int i,j;
     for(int i=1;i<=a;i++)
     {
             for(int j=1;j<=b;j++)
             {
              if(mat[i][j]==1)
                soma++;
              }
     }
}

int main()
{
int a,b,mat[100][100],soma=0;
cin>>a;
cin>>b;
     for(int i=1;i<=a;i++)
     {
             for(int j=1;j<=b;j++)
             {
               cin>>mat[i][j];
             }
     }
[u]process(a,b,mat[][]);[/u]
cout<<soma<<endl;

system("pause");
    return 0;
}

nao estou a consiguir enviar a matriz para a funçao em cima, alguem me pode dar uma ajudinha?

Posted

Na chamada da função, em vez de "mat[][]", mete apenas "mat" e já deve funcionar 😉

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Posted

Estive a testar e funciona, o problema é que tens outros erros.

No cabeçalho da função tens 4 argumentos e apenas passas 3 (falta a soma).

As posições num array começam em 0 e vai até T-1 (onde T representa o tamanho do array).

Só mais uma coisa, o que estás a enviar à função é uma cópia da variável soma, ou seja, ao alterares o valor da variável na função, não irá alterar o valor da variável no main, tens várias hipoteses para corrigir isso:

- Colocas função a retornar um valor inteiro que será o valor da soma.

- Usas variáveis globais.

- Se souberes usar ponteiros podes passar a variável por referência.

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Posted (edited)

A maneira mais cómoda (em C) é passares o teu array bidimensional como se fosse um array normal sem esquecer de passar os valores das dimensoes. Dentro da função fazes o cálculo explicito para indexamento em vez de ser o compilador a faze-lo.

Por exemplo (código C NAO TESTADO, não sei C++)

/* CODIGO NAO TESTADO */
/* apaguei parametros repetidos (thanks Hippo) */
int process(int *mat, size_t cols, size_t rows) {
    int soma = 0;
    size_t row, col;
    for (row = 0; row < rows; row++)
    {
        int index = row * cols;
        for (col = 0; col < cols; col++)
        {
            if (mat[index + col] == 1) soma++;
        }
    }
    return soma;
}

int main()
{
    int a, b, mat[100][100], soma;
    /* ... */
    soma = process(a, b, &mat[0][0]);
    /* ... */
Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

A maneira mais cómoda (em C) é passares o teu array bidimensional como se fosse um array normal sem esquecer de passar os valores das dimensoes. Dentro da função fazes o cálculo explicito para indexamento em vez de ser o compilador a faze-lo.

Por exemplo (código C NAO TESTADO, não sei C++)

/* CODIGO NAO TESTADO */
int process(size_t cols, size_t rows, int *mat, size_t cols, size_t rows) {
    int soma = 0;
    size_t row, col;
    for (row = 0; row < rows; row++)
    {
        int index = row * cols;
        for (col = 0; col < cols; col++)
        {
            if (mat[index + col] == 1) soma++;
        }
    }
    return soma;
}

int main()
{
    int a, b, mat[100][100], soma;
    /* ... */
    soma = process(a, b, &mat[0][0]);
    /* ... */

tens os argumentos repetidos 😉

IRC : sim, é algo que ainda existe >> #p@p
Posted

tens os argumentos repetidos 😄

Oops, é o que dá tentar manter o código original, depois pensar que afinal é melhor postar da maneira mais correcta ... e alterar sem prestar atenção. Thanks Hippo 🙂

Código alterado.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.