Ir ao conteúdo
  • Cadastre-se
Escanor

C++ Problema com função C++

Recommended Posts

Faça um procedimento que receba as três notas de um aluno como parâmetros e uma letra. Se a letra for A o procedimento calcula a média aritmética das notas do aluno, se for P calcula a média ponderada com pesos 5, 3 e 2 respectivamente. A média calculada deve ser devolvida ao programa principal para ser mostrada. 

 

Meu problema ta sendo na linha "media = media + notaaluno(&nota1, &nota2, &nota3, &medias[1]);" nela o compilador da o seguinte erro: error: cannot convert 'char*' to 'char**' for argument '4' to 'void notaaluno(int*, int*, int*, char**)'| Alguém sabe onde ta o erro? já procurei tentei trocar de void pra int, pra double, pra char, já fiz de tudo mesmo e nada resolve.

#include <iostream>

using namespace std;
void notaaluno(int *x, int *y, int *z, char *medias[1]){
   int mediaaritimetica, mediaponderada;

    if((*medias[1] == 'A') || (*medias[1] == 'a')){
        mediaaritimetica = ((*x + *y + *z) / 3);

    } else {
    } if((*medias[1] = 'P') || (*medias[1] = 'p')){
        mediaponderada = (((*x * 5) + (*y * 3) + (*z * 2)) / 10);
    }
}
int main()
{
   int nota1, nota2, nota3, media;
   char medias[1];
   cout << "Digite [A] para Media Aritmetica e [P] para Media Ponderada";
   cin >> medias;
   if((medias[1] == 'A') || (medias[1] == 'a') || (medias[1] = 'P') || (medias[1] = 'p')){
   cout << "Nota 1:";
   cin >> nota1;
   cout << "Nota 2:";
   cin >> nota2;
   cout << "Nota 3:";
   cin >> nota3;
   media = media + notaaluno(&nota1, &nota2, &nota3, &medias[1]);
   cout << media;
   }else{
       cout << "Comando nao encontrado" << endl;
   }

    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas se notaaluno retorna void como é que você ta somando void com media?

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Escanor

4 horas atrás, vangodp disse:

mas se notaaluno retorna void como é que você ta somando void com media?

 

É esse o problema. Não é possível esse cálculo. O ideal seria criar as variáveis nota1, nota2, nota3 e media como sendo do tipo ponto flutuante (float ou double) e definir o tipo de retorno da função também como sendo do tipo ponto flutuante, como também as variáveis na função. 

Se a opção for A, retorne mediaaritimetica, senão, retorne mediaponderada.

Obs: Não é necessário criar um vetor de char para armazenar a opção (medias). É apenas um caractere q vai ser lido

 

adicionado 7 minutos depois

Ou, se preferir, se a opção for A retorne o cálculo da média aritmética, senão retorne o cálculo da média ponderada

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Escanor tudo bem!

 

 

10 horas atrás, Escanor disse:

Meu problema ta sendo na linha¹ "media = media + notaaluno(&nota1, &nota2, &nota3, &medias[1]);" nela o compilador da o seguinte erro: error: cannot convert 'char*' to 'char**' for argument '4' to 'void notaaluno(int*, int*, int*, char**)'| ²Alguém sabe onde ta o erro? já procurei tentei trocar de void pra int, pra double, pra char, já fiz de tudo mesmo e nada resolve.

  • ¹ E outros mais que foram comentados em outros Posters;
  • ² Eu sei! O erre é relacionado com protótipo da função ...

Quando o interpretador vê isto: 

void notaaluno(int *x, int *y, int *z, char *medias[1])

vê realmente isto:

void notaaluno(int *, int *, int *, char **)

Assim o 4 parâmetro exige argumento do tipo Matriz Bidimensional quando associamos o números de asteriscos (*); Matriz Unitária - MU(*), Matriz Binária - MB(**), ... entende.

 

Já aqui:

notaaluno(&nota1, &nota2, &nota3, &medias[1])

no 4º argumento é acontece 2 momentos:

  1. medias[1] é uma variável que aponta [erroneamente] para próxima célula de memória [ou item da MU] depois de medias[0], sendo por tanto o mesmo que uma variável com ponteiro MU [char *].
  2. Conseguinte temos &medias[1] que e o ponteiro para variável media[1] da MU [char *] 

 

Por fim, apenas para esse trecho do código recomento as seguintes colocações a se entender:

  char * ptr;
  
  char medias[1];// é [conceitualmente] o mesmo que
  char media;
 
  
  
  ptr = &media;
  ptr = &medias[0]; // formato correta de acessar: É a índice da
  // declação menos 1, [N - 1]: na declaração o índice foi 1
  // &medias[1] configura erro de seguranção
  // porque acessa 1 item além do reservado, ou seja o 2º item, 
  // que não existe (em tese) depois de medias[0].
  

 

(X) É uma problema conceitual que geralmente se vê na teoria [lendo livros].

char *medias[] não é mesma coisa que (char * ou &medias[])
char *medias[] é igual a isso aqui (char ** e medias(*)[])

 

 

Ou seja, char* medias[] é um vetor de ponteiros para tipo char

Daí qual é o formato 'adequado' no cabeçario [protótipo] da função?

float ou double
notaaluno(int *x, int *y, int *z, char *medias)

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 13/06/2018 às 11:10, vangodp disse:

mas se notaaluno retorna void como é que você ta somando void com media?

 

Em 13/06/2018 às 11:48, giu_d disse:

@Escanor

 

É esse o problema. Não é possível esse cálculo. O ideal seria criar as variáveis nota1, nota2, nota3 e media como sendo do tipo ponto flutuante (float ou double) e definir o tipo de retorno da função também como sendo do tipo ponto flutuante, como também as variáveis na função. 

Se a opção for A, retorne mediaaritimetica, senão, retorne mediaponderada.

Obs: Não é necessário criar um vetor de char para armazenar a opção (medias). É apenas um caractere q vai ser lido

 

adicionado 7 minutos depois

Ou, se preferir, se a opção for A retorne o cálculo da média aritmética, senão retorne o cálculo da média ponderada

 

Em 13/06/2018 às 12:43, AnsiC disse:

Olá @Escanor tudo bem!

 

 

  • ¹ E outros mais que foram comentados em outros Posters;
  • ² Eu sei! O erre é relacionado com protótipo da função ...

Quando o interpretador vê isto: 


void notaaluno(int *x, int *y, int *z, char *medias[1])

vê realmente isto:


void notaaluno(int *, int *, int *, char **)

Assim o 4 parâmetro exige argumento do tipo Matriz Bidimensional quando associamos o números de asteriscos (*); Matriz Unitária - MU(*), Matriz Binária - MB(**), ... entende.

 

Já aqui:


notaaluno(&nota1, &nota2, &nota3, &medias[1])

no 4º argumento é acontece 2 momentos:

  1. medias[1] é uma variável que aponta [erroneamente] para próxima célula de memória [ou item da MU] depois de medias[0], sendo por tanto o mesmo que uma variável com ponteiro MU [char *].
  2. Conseguinte temos &medias[1] que e o ponteiro para variável media[1] da MU [char *] 

 

Por fim, apenas para esse trecho do código recomento as seguintes colocações a se entender:


  char * ptr;
  
  char medias[1];// é [conceitualmente] o mesmo que
  char media;
 
  
  
  ptr = &media;
  ptr = &medias[0]; // formato correta de acessar: É a índice da
  // declação menos 1, [N - 1]: na declaração o índice foi 1
  // &medias[1] configura erro de seguranção
  // porque acessa 1 item além do reservado, ou seja o 2º item, 
  // que não existe (em tese) depois de medias[0].
  

 

(X) É uma problema conceitual que geralmente se vê na teoria [lendo livros].


char *medias[] não é mesma coisa que (char * ou &medias[])
char *medias[] é igual a isso aqui (char ** e medias(*)[])

 

 

Ou seja, char* medias[] é um vetor de ponteiros para tipo char

Daí qual é o formato 'adequado' no cabeçario [protótipo] da função?


float ou double
notaaluno(int *x, int *y, int *z, char *medias)

 

Valeu Galera todo mundo me ajudou bastante, consegui resolver o problema e entender mais sobre a questão do índice e consegui utilizar isso em outros exercícios, Obrigado a todos :thumbsup:

 

 

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×