Jump to content

Archived

This topic is now archived and is closed to further replies.

GuilhermeLeobas

Problemas com tipo char

Recommended Posts

Olá a todos,

 

Estou estudando um pouco de funções em C e me deparei com um "problema":

 

Estou fazendo o exercicio 2)

http://www.inf.pucrs...ncoes/lista.htm

 

A minha duvida não está relacionada ao exercicio mas sim a um bug no compilador que eu uso.

 

#include <stdio.h>
#include <stdlib.h>

float resultado;

int calculo (int n1, int n2, int n3){
resultado = n1+n2+n3;
resultado = resultado/3;
return resultado;
}

int main (){
int a,b,c;
char op;

printf ("Digite os numeros e de ENTER\n");
scanf ("%d", &a);
scanf ("%d", &B);
scanf ("%d", &c);
system ("cls");

printf ("digite o parametro A-P");
scanf ("%s", &op);

calculo (a, b, c);

printf ("O resultado e: %f", resultado);

return 0;
}

 

Se eu não comento essas duas linhas abaixo, o compilador ignora o valor que eu digito para a variavel "c" (atribui 0). No entanto, isso não acontece se eu comentar essas linhas. Estou fazendo algo errado?

//printf ("digite o parametro A-P");
//scanf ("%s", &op);

 

Me descupem pela legibilidade do codigo, fiz esse algoritmo as pressas. :D

Share this post


Link to post
Share on other sites

Sim, você declarou um caracter e não uma string.

 

Uma string é terminada com o '\0', logo o scanf coloca o terminador e preencheu o caracter. Não sei se fui claro.

Mas para funcionar essas linhas que você comentou, deve declara um vetor de char(char string[10]) ou mudar o parâmetro do scanf para %c.

 

Espero ter ajudado. FLW!

Share this post


Link to post
Share on other sites

Nos Scanf's você pode usar uma técnica.

scanf("%d", &a);
scanf("%d", &B);
scanf("%d", &c);

 

Troque por:

 

printf ("Digite a Primeira Nota: \n");
scanf("%*d", &a);
printf ("Digite a Segunda Nota: \n");
scanf("%*d", &B);
printf ("Digite a Terceira Nota: \n");
scanf("%*d", &c);

 

Notou o '*' ? Quando faz isso, você indica para o Scanf() ignorar tudo o que vem depois do digito, no caso o '\n'.

 

Outra coisa, faça assim, mais bonito:

scanf("%*d", &a);
scanf("%*d", &B);
scanf("%*d", &c);

 

Neste caso acima você pode até tirar o '*'.

 

--------------------------------

 

Já neste trecho tem uns poréns.

printf ("digite o parametro A-P");
scanf ("%s", &op);
calculo (a, b, c);
printf ("O resultado e: %f", resultado);
[/vode]

Não pode ser '%s', visto que não é uma string que você digitando, ou um texto com mais de 1 caractere. É só uma letra. Então use '%c', C de Char. 

Na função que você chama abaixo você tem que igualar ela a uma variável, visto que você mostra ela em baixo.

Então você pode declarar outra variável com outro nome, por exemplo: 
[code]double media;

 

E fazer:

media = calculo(a, b, c, op);

 

E na função Calculo() você faz o IF para saber qual conta você irá fazer, a média aritmética ou ponderada como diz o exercício.

Share this post


Link to post
Share on other sites

O codigo acima é apenas um esboço para exemplificar o que eu estava tentando dizer.

 

Tentei novamente mas mesmo assim o IF não faz a comparação dentro da função calculo ()

 

#include <stdio.h>
#include <stdlib.h>

float resultado;

void calculo (int nota1,int nota2,int nota3, char aux[5]){
printf ("%s", aux);

if (aux == 'A' || aux == 'a'){
	resultado = (nota1+nota2+nota3)/3;
}
if (aux == 'P' || aux == 'c'){
	resultado = (5*nota1)+(3*nota2)+(2*nota3)/10;
}
}

int main(){
int n1, n2, n3;
char op[5];

printf ("Digite a 1a nota: ");
scanf ("%d", &n1);
printf ("\nDigite a 2a nota: ");
scanf ("%d", &n2);
printf ("\nDigite a 3a nota: ");
scanf ("%d", &n3);
printf ("\nDigite a operacao (1 = A) (2 = P): ");	
scanf ("%s", &op);
system ("cls");

calculo (n1, n2, n3, op);

printf ("%f", resultado);

return 0;
}

Share this post


Link to post
Share on other sites

#include <stdio.h>
#include <stdlib.h>

float resultado;

float calculo (int nota1,int nota2,int nota3, char aux){  
   if (aux == 'A' || aux == 'a'){
      resultado = (nota1+nota2+nota3)/3;
   }
   else if (aux == 'P' || aux == 'p'){
      resultado = (5*nota1)+(3*nota2)+(2*nota3)/10;
   }
   return resultado;
}

int main(){
   int n1, n2, n3;
   char op;
   float media;

   printf ("Digite a 1a nota: ");
   scanf ("%d", &n1);
   printf ("\nDigite a 2a nota: ");
   scanf ("%d", &n2);
   printf ("\nDigite a 3a nota: ");
   scanf ("%d", &n3);
   printf ("\nDigite a operacao (1 = A) (2 = P): ");       
   op = getche();
   system ("cls");

   media = calculo (n1, n2, n3, op);

   printf ("%5.2f \n\n", media);
   system("Pause");
   return 0;
}

 

 

Void não Retorna NADA !

 

Então seu PrintF ia retornar 0 sempre.

 

Coloquei um System Pause no final para poder ver a nota, senão o programa mostra e fecha, nem dá tempo de ver.

 

No mais coloquei as variáveis das notas para Float, visto que a nota pode ser decimal (5.5).

 

Tirei o colchetes do Char[], visto que você vai passar somente um caractere e não uma string.

 

Igualei a função em uma variável para você poder mostrar no PrintF...

 

Tudo que falei no meu post anterior...

Share this post


Link to post
Share on other sites

Desculpa a demora.

 

op = getche();

Estou fazendo com a scanf.

 

Na sexta eu tive uma aula sobre como o C interpreta um arranjo (vetor) no argumento e deu para resolver:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

float resultado; 

float calculo (int nota1,int nota2,int nota3, char aux[1]){ 

if (aux[0] == 'A' || aux[0] == 'a'){ 
	resultado = (nota1+nota2+nota3)/3; 
} 
if (aux[0] == 'P' || aux[0] == 'p'){ 
	resultado = (5*nota1)+(3*nota2)+(2*nota3)/10; 
} 

return resultado; 
} 

int main(){ 
int n1, n2, n3; 
char op[1]; 

printf ("Digite a 1a nota: "); 
scanf ("%d", &n1); 
printf ("\nDigite a 2a nota: "); 
scanf ("%d", &n2); 
printf ("\nDigite a 3a nota: "); 
scanf ("%d", &n3); 
printf ("\nDigite a operacao (1 = A) (2 = P): ");	 
scanf ("%s", op); 
system ("cls"); 

calculo (n1, n2, n3, &op); 

printf ("%f", resultado); 

system ("pause"); 

return 0; 
} 

 

Obrigado pela ajuda.

 

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.