Ir ao conteúdo

Posts recomendados

Postado

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;
}

 

Postado

@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

Postado

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 1
Postado
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 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!