Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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

Editado por giu_d
corrigir comentário
  • 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)

 

Editado por AnsiC
  • 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






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

×