• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Cypher

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

13 mensagens neste tópico

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

passa a matriz 'vectaux' como argumento da função 'carregar'. depois na função carregar em vez de criares uma nova matrix, colocas os valores na matrix que recebeste como argumento.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

aqui

case 1: vectaux=carregar(vectaux)

devias ter apenas

case 1: carregar(vectaux)

de resto, acho que está correcto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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  :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

já não precisas de retornar nada. declara a função como void.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e so com variaveis locais ? Não dá para fazer este exercicio??

na solução que te indiquei só são usadas variáveis locais!!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas não serve sry... tenho mesmo que utilizar uma matriz!

Dei-te um exemplo com vector, para tu próprio o passares para matriz.

Hint: matriz = vector de vectores

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

thx mais uma vez. Problema resolvido !.. vou deixar tal como o Rui Carlos me mostrou!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora