Ir ao conteúdo
  • Cadastre-se

C Problemas no meu codigo C


Posts recomendados

#include<stdio.h>

int main()
{
	// Seção de Declarações das variáveis

	float a, b, c, area;
	
	// Seção de Comandos, procedimento, funções, operadores, etc...
	
	printf("----------------AREA TRAPEZIO----------------------\n");
    
	printf("Digite o maior lado do trapezio: \n");
    scanf("%d\n",&a);
    
    printf("Digite o menor lado do trapezio: \n");
    scanf("%d\n",&b);
    
    printf("Digite a altura do trapezio: \n");
    scanf("%d\n",&c);
    area = (a+b)*c/2;
    printf("---------------------------------------------------\n");
    printf("A area do trapezio e %.2f",area);
    
    return 0;
    
}

Ola pessoal!! Tudo bem ? Gostaria de uma ajuda na compilação do código que pede os lados de um trapézio e dá como resultado a área na tela. Mas, quando executo o programa, não sei por qual razão, ele lê  primeiro printf e recebe o valor através do scanf, mas não executa a próxima linha de comando, a nao ser que eu digite alguma tecla antes.... Alguém poderia me dizer por que isso está acontecendo ? OBRIGADO PELA ATENÇÂO DE VCS!  

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Não acho que tenha problemas na compilação do código. Está ok. Mas deve ter recebido uns warnings no momento da compilação.

Ou deveria, já que scanf() retorna um int e você não está tratando, como nunca vejo ninguém tratando nos programas que leio nesse forum... E %d é para ler um int e você declarou os 3 campos como float

// declaração de scanf()

int scanf ( const char * format, ... );

 

33 minutos atrás, MATEUS GOMES85 disse:

quando executo o programa, não sei por qual razão, ele lê  primeiro printf e recebe o valor através do scanf, mas não executa a próxima linha de comando, a nao ser que eu digite alguma tecla antes

 

Pois é. Veja o seu comando: 

scanf("%d\n",&a);

Que pretendia com esse "\n" por exemplo? Não é assim que essa função funciona. scanf() é uma função ativa, no sentido em que ela consome entrada. Você precisa consumir o resto da linha.

 

E "%d" é o argumento para ler um int e você declarou a como float... Tem um livro de referência? Um manual ou algo assim?

 

Citação

O nome scanf() vem de Scan Formatted Input 

 

E scanf() consome a entrada de acordo com a máscara. A máscara é o primeiro campo, "%d\n" no seu caso, e não está certo.

 

veja essa saída do programa que vou te mostrar:


Digite o maior lado do trapezio: 1.2
scanf() retornou 2. Maior lado A=1.200000, delimitador=10

Digite o menor lado do trapezio: 2.3
scanf() retornou 2. Menor lado B=2.300000, delimitador=10

Digite a altura do trapezio: 3.4
scanf() retornou 2. Altura H=3.400000, delimitador=10

Até funciona mas é frágil ainda. Mas já vai ajudar você a entender a mecânica eu acho 

 

Qual a máscara nesse caso?
 

Citação

"%f%c"

 

A diferença é que assim vai ler algo a mais depois do número. Se o usuário for legal e teclar só o valor, tipo 1.23 vai estar OK. Note o valor de delim = 10 que é o código do "\n". Se ele não for e dependendo do que ele digitar vai cancelar seu programa...

 

Eis o programa

 

#define  _CRT_SECURE_NO_WARNINGS
#include "stdio.h"

int main()
{
    float a, b, c;
    char  delim;
    const char* mascara = "%f%c"; 
    int n;
    printf("\nDigite o maior lado do trapezio: ");
    n = scanf(mascara, &a, &delim);
    printf("scanf() retornou %d. Maior lado A=%f, delimitador=%d\n",
        n, a, delim);

    printf("\nDigite o menor lado do trapezio: ");
    n = scanf(mascara, &b, &delim);
    printf("scanf() retornou %d. Menor lado B=%f, delimitador=%d\n",
        n, b, delim);

    printf("\nDigite a altura do trapezio: ");
    n = scanf(mascara, &c, &delim);
    printf("scanf() retornou %d. Altura H=%f, delimitador=%d\n",
        n, c, delim);

    return 0;
}   // main()

 

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

#include<stdio.h>

int main()
{
	// Seção de Declarações das variáveis

	float a, b, c, area;
	
	// Seção de Comandos, procedimento, funções, operadores, etc...
	
	printf("----------------AREA TRAPEZIO----------------------\n");
    
	printf("Digite o maior lado do trapezio: \n");
    scanf("%f",&a);
    
    printf("Digite o menor lado do trapezio: \n");
    scanf("%f",&b);
    
    printf("Digite a altura do trapezio: \n");
    scanf("%f",&c);
    area = (a+b)*c/2;
    printf("---------------------------------------------------\n");
    printf("A area do trapezio e %.2f",area);
    
    return 0;
    
}

 

 

@Luís Roberto C. da Silva @arfneto  Valeu galera!! Deu tudo certo!! Fiz confusão com o uso do "\n", e acabou comprometendo .😅

 

Obrigado pela dica!@arfneto

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

54 minutos atrás, MATEUS GOMES85 disse:

Obrigado pela dica!

 

Entendeu que mesmo assim está errado e frágil, certo? Não perguntou nada.

 

7 horas atrás, Luís Roberto C. da Silva disse:

@arfneto Resumindo, no scanf retire o \n e e escreva "%f" no lugar de "%d"

 

Não, não resuma assim. Não acho sequer que seja um bom caminho para quem está aprendendo. Me dei ao trabalho de até mostrar um programa de teste e discutir o problema, sem mostrar uma suposta solução, claro.
 

Mas como parece que @MATEUS GOMES85 (o autor do tópico) considerou como solução simplesmente trocar o especificador de formato --- que estava errado ---  e claramente @Luís Roberto C. da Silva também viu como solução, vou explicar de novo com mais algum detalhe porque isso é mesmo um senso comum. E está errado.

 

Sempre vale a pena ler a documentação, ou não se vai muito longe com essas coisas. Hoje em dia pra programar tem que ler muito :( 

 

Scanf() é uma rotina genial, mas foi escrita para tratar entrada formatada. Está no nome por exemplo: scan formatted Input(). Para ler dados em forma tabular por exemplo, onde cada linha era um "registro" e cada "registro" tinha um certo número de "campos". Essa é a nomenclatura até hoje: tabelas, registros, campos --- tables, records, fields. Pense pro exemplo em arquivos csv e vai entender do que estou falando. scanf() é perfeita para ler arquivos CSV.

 

Ler dados do teclado não é assim algo formatado. Não dá pra imaginar o que o usuário vai digitar. E para usar scanf() --- ou qualquer outra rotina --- você tem que se defender.

 

EXEMPLO

 

Usando a máscara "%f" que você usou

  • O caso da boa esperança: o cara teclou tudo direitinho

    ok.png.18ad352ce425451d97977b2756afe7ff.png
     
  • Um caso menos feliz: Ao rodar esse programa, se o usuário digitar 1.2 3.4 5 logo na primeira linha e enter scanf() vai aceitar os 3 valores e imprimir tudo torto na tela e passar reto pelos outros scanf() sem dar tempo de ler. Zoando toda a tela

    123E.png.be571e83949e3bda54a321f0f7460983.png
     
  • Outro caso menos feliz: Se o cara teclar um monte de enter e depois um monte de letras e enter o programa vai terminar com a leitura de 0.0 para os 3 valores. E a tela cheia de lixo. scanf() retornou 0 nas 3 vezes, mas seu programa não leu...

vazio.png.0e0af157b044a007c004d4ff6157cb6b.png
 

Um programa de correção automática claro vai pegar isso como erro. Um instrutor sério também. Provavelmente seria o primeiro teste que ele faria: só teclar uma linha em branco e um monte de m$%da. E seu programa já era. E sua nota. 

 

Eu não sou seu instrutor nem seu programa corretor mas fica a mensagem.

 

Então

  1. Entenda que scanf() retorna um valor por uma razão. Essas rotinas foram escritas inicialmente por programadores lendários como Ken Thompson e D. Ritchie. os caras que escreveram entre outras coisas o Unix e a linguagem C.
    Use o valor e teste pra ver se leu de fato algo. Eles tinham razão.
     
  2. Entenda que scanf() consome dados até ficar satisfeita com os %isso e %aquilo. e se sobrar alguma coisa ela pode guardar pra usar depois e isso quer dizer alimentar próximos scanf() de um modo que você não tinha imaginado...
    E seu programa não vai funcionar como você queira... Tem milhões que queixas nos foruns e milhões de programas que cancelam assim. Queixas como "meu programa dá certo mas se eu digitar um espaço..." :D

Eu postei aqui neste forum um exemplo para ler um CPF com scanf() e calcular os DV. Dá para pesquisar no forum pelo conteúdo. E outro com um uso de scanf() para ler entrada formatada ;) de uma tabela de código morse. Podem servir como exemplos adicionais.

 

Uma máscara um pouco mais segura "%f%*[^\n]%1c"

 

Aqui você tem 3 '%' então vai ler 3 campos e a princípio scanf() deveria retornar... 3

  1. Campo 1: "%f" --- o óbvio, vai ler um número, aceitando um ponto decimal e um eventual sinal no início.
  2. Campo 2: "%*[^\n]" Esse um pouco mais enjoado. O significado: [abcd] indica que é pra aceitar apenas essas letras: a b c d. Um '^'  no início nega tudo e aí quer dizer que o campo aceita qualquer coisa EXCETO essas letras, e assim [ ^abcd] indica que o campo aceita qualquer coisa exceto a b c d. '\n' é o código do enter, 10. Isso quer dizer que [\n] aceita apenas enter. E assim [^\n] aceita qualquer coisa menos o enter. E o asterisco? o asterisco diz que é pra PULAR esse campo. Ou seja
     
    Citação

    "%*[^\n]" consome tudo até o ENTER, exceto o próprio, e despreza, por causa do '*'

    e assim o programa se defende de entradas como "1.23 lixo lixo lixo"
     

  3. Campo 3: "%1c": Esse campo lê um único caracter, mas como o campo anterior terminou em um ENTER é claro que esse aqui vai ler um ENTER e podreia ser desprezado também. 

Então com essa máscara você faz com que scanf() gaste uma linha inteira que começa por um número. E leia o número. E consuma o resto

E você espera que scanf() retorne 1 ou 2. Pode retornar um na última linha por causa do fim de arquivo. Se retornar 0 você sabe que algo saiu errado e pode tenatr ler de novo...

 

Sim, são 3 campos mas como tem um '*' no especificador do segundo ele vai ser lido e descartado. De um modo geral se você quer ler um único campo por linha pode escrever "%i%*[^\n]%*1c" e assim scanf() vai agir de acordo e ler seu int e descartar o resto da linha, ou retornar 0.

 

 

 

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

 

#include<stdio.h>
#define percentual 0.2; //Declaração de uma constante

int main(void)
1 {
2	float salariofixo, salariototal, valorvendas, comissao;
3	char nome[20];
4	
5	printf("Digite o nome do vendedor: \n");
6	scanf("%s",nome);
7	
8	printf("Quanto em reais %s vendeu ? \n",nome);
9	scanf("%.2f",&valorvendas);
10
11	printf("Qual o salario fixo da/do %s ? \n",nome);
12	scanf("%.2f",&salariofixo);
13	
14	
15		
16	return 0;
17	
18}

@arfneto Bom dia!!! Acompanhei as dicas sobre o uso da função scanf() e achei as informações esclarecedoras e ao mesmo tempo uma novidade pra mim. 

Talvez por isso eu não esteja conseguindo entender o por que do meu simples código acima não estar me retornando o que preciso:

 

Por exemplo, as linhas 5 e 6, 8 e 9 executam normalmente e a função scanf funciona como espero. Isso acontece até a linha 11 quando o printf pede pra o usuario inserir o valor do seu salario fixo, mas a linha 12 é desprezada e o programa é finalizado. E não importa a ordem dos comandos, a linha 12  continua sem ser executada e assim não permite ao usuario a inserção do valor do salário fixo.

 

Gostaria de saber por que isso acontece e se a razão disso tem haver com os esclarecimentos q você mencionou acima.

 

Obrigado pela atenção! Aguardo a ajuda de vcs. Valeu

 

:tw_smile:  :tw_thumbsup:

 

 

 

Link para o comentário
Compartilhar em outros sites

4 horas atrás, MATEUS GOMES85 disse:

Acompanhei as dicas sobre o uso da função scanf() e achei as informações esclarecedoras e ao mesmo tempo uma novidade pra mim

 

Você tem um livro? uma apostila? um manual? 

Que compilador você usa?

 

Leia a documentação. Sempre vale a pena. scanf() é um troço complicado e não foi escrita para ler campos do teclado. Testou o programa que eu mostrei?...

 

 

Que pretende com a máscara ".%2f"?

 

Não funciona assim. Use apenas "%f". Vocêpode omitir a parte depois do ponto, mas não pode omitir a que vem antes. Ao menos é o que está aqui:

trecho.thumb.png.6a4a3f55521a89997879c530e1ead7cf.png

E leia o manual. http://www.cplusplus.com/reference/cstdio/scanf/ por exemplo. man scanf no linux?

 

 

Você leu aquela parte em que eu escrevi para sempre ler o valor de retorno de scanf()???? 

 

que achou?

porque não fez?

 

 

Link para o comentário
Compartilhar em outros sites

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!