Jump to content

[C] Dúvida: Funções, return de matrizes (Resolvido)


Recommended Posts

Posted

Boas pessoal... tenho aqui um pequeno problema... passar uma matriz para outra que se encontra na função main() através de um return...

#include<stdio.h>
#define T_ALUNOS 50

float carregar(){

  float turma[T_ALUNOS][2];
  int i,j;

  for (i=0;i<T_ALUNOS;i++){
    for(j=0;j<2;j++){
      if (j==0){
        printf("Introduza o seu numero: ");
        scanf("%f",&turma[i][j]);
      }
      else{
        printf("Introduza a sua nota: ");
        scanf("%f",&turma[i][j]);
      }
    }
  }
  
  return turma;  
}

multi(float vturma[T_ALUNOS][2]){
  
  int i,j,amax,amin;
  float soma,nmax,nmin;
  
  nmax=vturma[0][1];
  nmin=vturma[0][1];
  amax=vturma[0][0];
  amin=vturma[0][0];
  soma=vturma[0][1];

  for (i=1;i<T_ALUNOS;i++){
    if (nmin>vturma[i][1]){
      nmin=vturma[i][1];
      amin=vturma[i][0];
    }
    if (nmax<vturma[i][1]){
      nmax=vturma[i][1];
      amax=vturma[i][0];   
    }  
    soma=soma+vturma[i][1];
  }
  printf("O aluno nº %d tem a nota maxima de %.2f valores.\n",amax,nmax);
  printf("O aluno nº %d tem a nota minima de %.2f valores.\n",amin,nmin);
  printf("A média da turma é %.2f valores.\n",soma/T_ALUNOS);
  printf("A diferença entre a nota maxima e minima é %.2f valores.\n",nmax-nmin);
}


menu(){
  printf("1-preencher o vector\n");
  printf("2- ver medias, melhor, pior, mellhor note, pior nota e diferença entre notas\n");  
  printf("escolha um numero: ");
}

main(){
  int op;
  float vectaux[T_ALUNOS][2];
  menu();
  scanf("%d",&op);
  switch(op){
    case 1: vectaux=carregar();
    case 2: multi (vectaux);
    default: printf("Escolhe outra \n");
  }
}

o caso é o seguinte o utilizador escolhe qual a opção... mas se escolher a segunda a matriz ainda não está carregada, ou seja temos que introduzir primeiros os valores na matri, que é a opção 1 tenho que carregar a matriz com os numero do aluno e com a sua nota... ate ai tudo bem eu leio esses dados e envios para uma matriz local da função "carregar" so que para depois conseguir enviar os dados para a função "multi" tenho que enviar a matriz carregada para  o main e a partir dai enviala para a função "multi"

so que esta me a dar um erro na função carregar, mais precisamente no  return turma;

cumps...

Posted

Tu não podes retornar um array. Aliás, há forma de fazer isso mas envolve apontadores e penso que ainda não deste isso.

Podias declarar as variáveis necessárias globalmente, tratando assim na função carregar de carregar os dados para essa variável.

"Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"

Posted

então iria ter isto

#include<stdio.h>
#define T_ALUNOS 50

float carregar(float vectaux[T_ALUNOS][2]){

  
  int i,j;

  for (i=0;i<T_ALUNOS;i++){
    for(j=0;j<2;j++){
      if (j==0){
        printf("Introduza o seu numero: ");
        scanf("%f",&vectaux[i][j]);
      }
      else{
        printf("Introduza a sua nota: ");
        scanf("%f",&vectaux[i][j]);
      }
    }
  }
  
  return vectaux;
}

.
.
.


main(){
  int op;
  float vectaux[T_ALUNOS][2];
  menu();
  scanf("%d",&op);
  switch(op){
    case 1: vectaux=carregar(vectaux);
    case 2: multi (vectaux);
    default: printf("Escolhe outra \n");
  }
}

Rui Carlos era assim que te estas a referir??

Posted

desta maneira

#include<stdio.h>
#define T_ALUNOS 50

float carregar(float vectaux[T_ALUNOS][2]){

  
  int i,j;

  for (i=0;i<T_ALUNOS;i++){
    for(j=0;j<2;j++){
      if (j==0){
        printf("Introduza o seu numero: ");
        scanf("%f",&vectaux[i][j]);
      }
      else{
        printf("Introduza a sua nota: ");
        scanf("%f",&vectaux[i][j]);
      }
    }
  }
  
  return vectaux;
}

.
.
.


main(){
  int op;
  float vectaux[T_ALUNOS][2];
  menu();
  scanf("%d",&op);
  switch(op){
    case 1: carregar(vectaux);
    case 2: multi (vectaux);
    default: printf("Escolhe outra \n");
  }
}

dá erro no return  ?

Posted

Dá, através de apontadores.

Mas eu não me meteria por aí se não tivesse experiência..

Tenta primeiro fazer o mesmo com um vector, e só depois passar para uma matriz.

Tens o problema que C só te permite retornar um tipo de dados (a menos que retornes uma estrutura, também é possível) mas tu precisas de saber 2: o primeiro elemento do vector, e o tamanho do vector.

Logo, podes passar o tamanho por referência e retornar somente o apontador para a primeira posição.

Ficaria algo assim: (sem testar)

void ler(int *v,int *n) {
  int i;
  scanf("%d",n);
  for (i=0;i<(*n);i++) scanf("%d",&v[i]);
}

int main() {
  int v[10],n;
  ler(v,&n);
  return 0;
}

Ou como alternativa à função ler:

Chamas

n = ler(v);

int ler(int *v) {
  int i,n;
  scanf("%d",&n);
  for (i=0;i<n;i++) scanf("%d";&v[i]);
  return n;
}

NÃO TESTEI.

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.