Ir ao conteúdo

Posts recomendados

Postado

Boa noite! Essa é minha primeira vez utilizando o fórum, embora eu já o tenha consultado diversas vezes no passado.

Estou tendo um problema em parte do desenvolvimento de um programa para uma tarefa da disciplina de Programação 1. A entrega dela é só pra daqui a 2 semanas, então estou tranquilo quanto ao prazo.

 

Parte da tarefa:

Implementar um programa C que recebe as três cores de um resistor e imprime o valor do mesmo em ohms. Não usar arranjos ou repetições (ainda não tivemos). USAR comando switch e variáveis do tipo char para receber a cor. Fazer somente as cores preto, marrom, vermelho e amarelo. Usar caracteres 'p', 'm', 'v' e 'a' para identificar as cores.

 

Bom... Meu código está basicamente pronto. Escrevi ele no Visual Studio Code e compilei com o GCC.

O programa lê corretamente a primeira cor, mas ele pula a leitura da segunda cor e vai direto para a leitura da terceira. Aí ele acaba fazendo o cálculo da resistência apenas com a primeira e terceira cor. Fiz uma função printf para mostrar o que está dentro da variável cor2, e está aparecendo que é um espaço em branco, o que acaba jogando pro caso default, retornando a frase "Valor inválido2".

 

Sou iniciante em C. Estou começando há poucos dias e essa foi minha primeira dificuldade, mas não consegui resolver de forma alguma. Estou utilizando uma sequência de três comandos switch, cada um com 4 casos (p, m, v e a). Já chequei, não está faltando ponto e vírgula e todos os casos estão sendo fechados por "break;". Não tenho ideia de qual é o problema.

 

Segue o arquivo do meu programa em anexo.

 

É isso... Agradeço desde já! 😃

resistor2.txt

Postado

siwtch é um comando e não uma estrutura. case é o label. Não existe switch/case apesar de eu já ter visto muito essa expressão.

 

Por favor, poste o programa inteiro. Aqui. O forum é público para alguns ajudarem alguns. E é estranho esperar que alguém faça um download de algo para aí sim tentar ajudar você e apenas outros que também tenham feito o mesmo download... 

 

Use esse tal botão code <> aí acima

  • Curtir 1
Postado

Bom, agradeço as respostas. Como disse, sou novo no fórum e em programação também. Um colega meu que estava com o mesmo problema conseguiu encontrar o erro.

Caso alguém esteja com o mesmo problema que eu e venha a achar esse tópico futuramente, era só colocar um \n antes do %c no scanf, aí ficaria assim:

scanf("\n%c", &cor1);
scanf("\n%c", &cor2);
scanf("\n%c", &cor3);

Meu código está errado na questão das cores, esqueci que o laranja vem antes do amarelo, mas já corrigi.

 

Agradeço pelas dicas do uso do fórum, na próxima vou fazer uso do botão code.

  • Curtir 1
Postado

@AndreyBR

17 minutos atrás, AndreyBR disse:

Caso alguém esteja com o mesmo problema que eu e venha a achar esse tópico futuramente, era só colocar um \n antes do %c no scanf

E sabe o motivo disso?

Se estava com problemas para ler um caractere com scanf(), é porque havia algo sobrando na stdin, provavelmente de alguma leitura anterior, e isso é um erro que a gente vê muito por aí.

Acho que você poderia usar o subespecificador asterisco junto ao especificador de caracteres (%*c) para ler o \n que você insere quando dá um Enter e ignorar, então isso viria logo depois de todos os especificadores, um exemplo:

#include <stdio.h>

int main()
{
    int x;
    char c;
    
    printf("Insira um numero inteiro: ");
    // Teste tirar o %*c e veja o que acontece
    scanf("%d%*c", &x);
    
    printf("\nInsira um caractere: ");
    scanf("%c%*c", &c);
    
    printf("\nRespostas: %d, %c", x, c);

    return 0;
}

Uma outra possibilidade seria usar um loop com a função fgetc(), enfim, são 1001 jeitos de se limpar o buffer de entrada.

Postado
2 horas atrás, AndreyBR disse:

com o mesmo problema que eu e venha a achar esse tópico futuramente, era só colocar um \n antes do %c no scanf, aí ficaria assim

 

Como eu te expliquei, ninguém vai "achar esse tópico futuramente"  porque você não postou o programa. E o título nada tem a ver com o problema, e sobre o título eu te disse: o comando é switch(). switch/case não existe. case é o prefixo do label, aquilo que termina por dois pontos.

 

Para quem ficou curioso eis o programa com a suposta correção:
 

#include <stdio.h>
int main(void)
{

char cor1, cor2, cor3;
int R;

R = 0;

printf("Esse programa calcula a resistência de um resistor de 3 faixas.\
\nUtilize:\n'p' para preto\n'm' para marrom\n'v' para vermelho\n'a' para amarelo.\n\n");

printf("Entre com a primeira cor...\n");
scanf("\n%c",&cor1);

printf("Entre com a segunda cor...\n");
scanf("\n%c",&cor2);

printf("Entre com a terceira cor...\n");
scanf("\n%c",&cor3);


switch(cor1){
    case 'p':
        R = 0;
        break;
    case 'm':
        R = 10;
        break;
    case 'v':
        R = 20;
        break;
    case 'a':
        R = 30;
        break;
    default:
        printf("Valor inválido1\n");
        break;
}

switch(cor2){
    case 'p':
        R = R * 1;
        break;
    case 'm':
        R = R + 1;
        break;
    case 'v':
        R = R + 2;
        break;
    case 'a':
        R = R + 3;
        break;
    default:
        printf("Valor inválido2\n");
        break;
}

switch(cor3){
    case 'p':
        R = R * 1;
        break;
    case 'm':
        R = R * 10;
        break;
    case 'v':
        R = R * 100;
        break;
    case 'a':
        R = R * 1000;
        break;
    default:
        printf("Valor inválido3\n");
        break;
}
printf("R = %d\n",R);
return 0;
}

 

Com um '\' para evitar a linha longa que põe a barra chata de scroll no forum... Note o bug no software do forum --- InVision --- que perde a noção das cores na string do printf() mas se abre o bloco aí sim ele nota que é C e mostra direito :) 

 

Sobre a "correção":

  • continua errado e frágil. Testou isso?
     
  • Não use scanf() para ler do teclado. Não foi escrita para isso. Mas se vai MESMO usar teste o retorno. Não adianta
    seguir se não leu nada. Leia o manual.
     
  • entre com um número por engano e seu programa vai continuar loucamente na leitura
     
  • nunca leia um char em um char com scanf(). Leia em um vetor e peque a primeira letra. Assim scanf() pode calmanente consumir o resto da linha. Repito: não use scanf() para isso. Mas se vai usar use o seguro. Veja o exemplo:
     
    char linha[80];
    int res = 0;
    
    ...
      
    printf("Entre com a primeira cor: \n");
    res = scanf("%s",linha);
    if ( res != 1)
    {
      printf( "scanf() nao leu nada\n");
      return -1; // sem a cor vai calcular o que?
    };
    cor1 = linha[0];
    printf("Leu cor1: '%c'\n", cor1); // pode mostras as 3 cores apenas ao final da leitura

     

  • '\n' no início da string para scanf() de nada serve. '\n', TAB e espaços já são ignorados por definição.
     
  • se está começando, tente um novo hábito: ao ler campos sobre os quais vai calcular MOSTRE os valores antes de prosseguir. assim vai saber que o seu programa está operando com os dados que imagina.
     
  • se digitar várias letras na entrada seu programa vai consumir todas na primeira leitura. TESTE.
     
  • Use um espaço ao menos depois de um prompt na leitura. É desconfortável para o usuário começar a digitar com o cursor grudado numa mensagem.

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...