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:  
Niedson Santana

C Lendo um char com scanf

Recommended Posts

Estou aprendendo a programar e estou quebrando a cabeça para fazer uma estrutura de repetição onde a condição seria um dado do tipo char. 

 

A estrutura deveria se repetir se o valor da variável do tipo char car for igual a 's'. O meu problema é que o valor de char só é lido na primeira execução da estrutura de repetição nas demais acontece como se não existisse a linha 6 como se o programa pulasse a linha 6. 

 

Desde já agradeço a ajuda.

 

segue o código:

#include<stdio.h>
1  main(){
2    float velocidade, velmedia=0, maiorvel=0;
3    int ano, maiorano=0,cont=0;
4    char car;
5    while(car!='n'){
6        scanf("%c",&car); 
7        if(car=='n' )
8        break;
9        cont++;
10        scanf("%i%f", &ano , &velocidade);
11            if(velocidade>maiorvel)
12             maiorvel=velocidade;
13             velmedia+=velocidade;
14             if(ano>maiorano)
15             maiorano=ano;
16             
17        
18        
19    }
20    if(cont!=0 && car=='s')
21    printf("%.2f\n%i\n%.2f", maiorvel ,maiorano ,velmedia/cont);
22    else
23    printf("zero");
24 } 

 

Editado por Simon Viegas
Ao postar um código, antes pressione o botão "<>" na barra de ferramentas
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, para começar, organizar o código.

#include<stdio.h>

 int main(){

   float velocidade, velmedia=0, maiorvel=0;
   int ano, maiorano=0,cont=0;
   char car;

   while(car!='n'){

       scanf("%c",&car);
       if(car=='n'){ // precisa ser if(car=='n' || car=='s') para executar o IF lá em baixo
          break;
       }else{
        cont++;
        scanf("%d%f", &ano , &velocidade);
           if(velocidade>maiorvel){
            maiorvel=velocidade;
             velmedia+=velocidade;
            }
            if(ano>maiorano){
               maiorano=ano;
            }


       }
    }
    // NUNCA VAI CAIR NESSE IF!!!! o while só para se car == n, então car nunca vai ser igual a s;
    if(cont!=0 && car=='s'){
        printf("%.2f\n%i\n%.2f", maiorvel ,maiorano ,velmedia/cont);
    }else{
      printf("zero");
    }
    return 0;
 }

 

Uma Dica, faça debug?

Qual a forma mais simples de fazer debug? printf!!! Coloque printf em toda parte que você quer saber se chegou.

A a melhor forma é a IDE fazer o DEBUG linha por linha e você ver a execução.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para resolver isso você precisar limpar o buffer do teclado após o segundo scanf usando fflush para Windows.

fflush(stdin);

 

Editado por iHollyZinhO
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aliás!

 

if(car=='n'){  break; }

Esse if não serve pra nada, o while já checa isso...

 

Use:

while(car!='n' || car!='s')

Se car for igual a n ou s, sai do while.

 

Pegue o meu código acima, remova o if, atualize o while e teste.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Alison Barreiro @Niedson Santana Se deixarmos a lógica de lado, o que importa é manter a sintaxe de acordo com as necessidades, assim como a performance e indentação, portanto certas coisas precisam ser removidas:

 

#include<stdio.h>

int main(){
	float velocidade, velmedia=0, maiorvel=0;
	int ano, maiorano=0,cont=0;
	char car = 's';

 	while(car!='n'){
      		fflush(stdin);
		scanf(" %c",&car);
    	        if(car == 's'){
    			cont++;
        		scanf("%d%f", &ano , &velocidade);
        		if(velocidade>maiorvel){
        			maiorvel=velocidade;
        			velmedia+=velocidade;
        		}
        		if(ano>maiorano){
        			maiorano=ano;
       			}
       		}
    	}
    if(cont!=0){
        printf("%.2f\n%i\n%.2f\n\n", maiorvel ,maiorano ,velmedia/cont);
    }else{
      printf("zero");
    }
    return 0;
 }

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@TYSQUARE89

 

No caso de performance, deveria ser assim:

If tem custo de clock, sempre deve-se evitar ao máximo o uso do if, é regra básica para métodos de projeto de software.

int main(){
	float velocidade, velmedia=0, maiorvel=0;
	int ano, maiorano=0,cont=0;
	char car;
	printf("Digite n para sair ou s para continuar!\n");
    scanf(" %c",&car);
  	// Se for n, nem exucuta o while, passa direto.

 	while(car!='n'){
            printf("Digite o ano e a velocidade!\n");
            scanf("%d%f", &ano , &velocidade);
            if(velocidade>maiorvel){
        		maiorvel=velocidade;
        		velmedia+=velocidade;
            }
            if(ano>maiorano){
                maiorano=ano;
            }
            cont++;
      		// Aguardar usuario digitar n para fechar o porgrama ou qualquer outra coisa e repetir o while
      		printf("Digite n para sair ou s para continuar!\n");
            scanf(" %c",&car);
    	}
    if(cont!=0){
        printf("%.2f\n%i\n%.2f\n\n", maiorvel ,maiorano ,velmedia/cont);
    }else{
      printf("zero");
    }
    return 0;
 }

Coloquei um printf para seu código ficar mais fácil de usar.

 

Só precisa usar flush se você for manipular stream de saída.

 

Código TESTADO.

adicionado 4 minutos depois

E se você tem certeza que vai executar pelo menos uma vez o while, faça assim:

int main(){
	float velocidade, velmedia=0, maiorvel=0;
	int ano, maiorano=0,cont=0;
	char car;

 	do{
            printf("Digite o ano e a velocidade!\n");
            scanf("%d%f", &ano , &velocidade);
            if(velocidade>maiorvel){
        		maiorvel=velocidade;
        		velmedia+=velocidade;
            }
            if(ano>maiorano){
                maiorano=ano;
            }
            cont++;
      		// Aguardar usuario digitar n para fechar o porgrama ou qualquer outra coisa e repetir o while
      		printf("Digite n para sair ou s para continuar!\n");
            scanf(" %c",&car);
    	}while(car!='n');
    if(cont!=0){
        printf("%.2f\n%i\n%.2f\n\n", maiorvel ,maiorano ,velmedia/cont);
    }else{
      printf("zero");
    }
    return 0;
 }

 

  • Curtir 1

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

×