Ir para o conteúdo
Cypher

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

Mensagens Recomendadas

Cypher    0
Cypher

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Hipnoted    6
Hipnoted

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    310
Rui Carlos

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Cypher    0
Cypher

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Cypher    0
Cypher

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Warrior    68
Warrior

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    310
Rui Carlos

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Warrior    68
Warrior

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

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade