Ir ao conteúdo
  • Cadastre-se

C Meu código está dando erro em apenas uma parte.


Visitante

Posts recomendados

Meu código está dando erro na parte do convênio, o convênio simplesmente não quer funciona.

LINGUAGEM C

 

#include <locale.h>

#include <stdio.h>

main()

{

setlocale (LC_ALL,"Portuguese");

//Variáveis:

int ano_fabricacao;

char nome_veiculo[20];

char convenio/*[4]*/;

float preco, preco_final, desconto;

//Entrada de dados:

printf("Informe o nome do veículo: ");

scanf("%s", nome_veiculo);

printf("Informe o ano de fabricação: ");

scanf("%d", &ano_fabricacao);

printf("Informe o preço do veículo: ");

scanf("%f", &preco);

printf("Possui convênio?\n< S / N > : ");

scanf("%c", &convenio);

convenio = (convenio);

//Casos:

if(ano_fabricacao <= 2000)

{

preco_final = preco - preco * 0.12;

desconto = preco * 0.12;

}

if(ano_fabricacao >= 2000 && ano_fabricacao <= 2010)

{

preco_final = preco - (preco*0.08);

desconto = preco * 0.08;

}

if(ano_fabricacao >= 2011 && ano_fabricacao <= 2015)

{

preco_final = preco - preco*0.06;

desconto = preco * 0.06;

}

if(ano_fabricacao >= 2016 && ano_fabricacao <= 2020)

{

preco_final = preco - preco*0.04;

desconto = preco * 0.04;

}

if ( convenio == 'S' )

{

preco_final -= preco_final * 0.05;

desconto += preco_final * 0.05;

}

printf("\nPREÇO COM DESCONTO --: R$ %.2f\n", preco_final);

//Saída de dados:

printf("\n\n");

printf("Veículo-: %s\n", nome_veiculo );

printf("Ano-: %d\n", ano_fabricacao);

printf("Preço com convênio-: %c", convenio);

printf("Preço final-: R$ %.2f\n",preco_final);

printf("Desconto de-: R$ %.2f\n", desconto );

system("pause");

}

Sem título.png

Link para o comentário
Compartilhar em outros sites

 

scanf() não foi escrita para ler do teclado. scanf() foi escrita para ler entrada formatada --- scan formatted data --- mas se vai usar TESTE sempre o valor de retorno. É ingênuo seguir se não leu nada

 

Enquanto está testando mostre logo em seguida o que leu... Pode ter surpresas...

 

Evite ler com %c usando scanf(). É problemático. Prefira:
 

char convenio[4];
printf("Possui convênio?\n< S / N > : ");
scanf("%s", convenio);
printf("Preço com convênio-: %c", convenio[0]);

 

Lendo a string e usando a primeira letra...

 

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

@Andrielli Use a estrutura condicional com if-else, assim quando uma condição for satisfeita não terá outro teste. Acho que assim fica mais simples,

 

#include <stdio.h>

int main(){
    int ano_fabricacao;
    char nome_veiculo[20];
    char convenio;
    float preco;
    float preco_final;
    float desconto = 0;

    printf("Informe o nome do veículo: ");
    fgets(nome_veiculo, 20, stdin);
    printf("Informe o ano de fabricação: ");
    scanf("%d%*c", &ano_fabricacao);
    printf("Informe o preço do veículo: ");
    scanf("%f%*c", &preco);
    printf("Possui convênio? < S / N > : ");
    scanf("%c%*c", &convenio);

    if(ano_fabricacao <= 2000){
        desconto = 0.12;
    }else if(ano_fabricacao > 2000 && ano_fabricacao <= 2010){
        desconto = 0.08;
    }else if(ano_fabricacao > 2010 && ano_fabricacao <= 2015){
        desconto = 0.06;
    }else if(ano_fabricacao > 2015 && ano_fabricacao <= 2020){
        desconto = 0.04;
    }
    
    preco_final = preco * (1 - desconto);
    if(convenio == 'S' || convenio == 's'){
        preco_final *= 0.95;
    }
    printf(
        "\nVeiculo: %s"
        "Ano: %d\n"
        "Preco com convenio: %c\n"
        "Preco final: %.2f\n"
        "Desconto de: %.2f\n",
        nome_veiculo, ano_fabricacao,
        convenio, preco_final, 
        preco - preco_final
    );
    return 0;
} 

 

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

@arfneto

#include <locale.h>

#include <stdio.h>

main()

{

setlocale (LC_ALL,"Portuguese");

//Variáveis:

int ano_fabricacao;

char nome_veiculo[20];

char convenio[4];

float preco, preco_final, desconto;

//Entrada de dados:

printf("Informe o nome do veículo: ");

scanf("%s", nome_veiculo);

printf("Informe o ano de fabricação: ");

scanf("%d", &ano_fabricacao);

printf("Informe o preço do veículo: ");

scanf("%f", &preco);

printf("Possui convênio?\n< S / N > : ");

scanf("%s", convenio);

//Casos:

if(ano_fabricacao <= 2000)

{

preco_final = preco - preco * 0.12;

desconto = preco * 0.12;

}

if(ano_fabricacao >= 2000 && ano_fabricacao <= 2010)

{

preco_final = preco - (preco*0.08);

desconto = preco * 0.08;

}

if(ano_fabricacao >= 2011 && ano_fabricacao <= 2015)

{

preco_final = preco - preco*0.06;

desconto = preco * 0.06;

}

if(ano_fabricacao >= 2016 && ano_fabricacao <= 2020)

{

preco_final = preco - preco*0.04;

desconto = preco * 0.04;

}

if ( convenio == 'S' )

{

preco_final -= preco_final * 0.05;

desconto += preco_final * 0.05;

}

printf("\nPREÇO COM DESCONTO --: R$ %.2f\n", preco_final);

//Saída de dados:

printf("\n\n");

printf("Veículo-: %s\n", nome_veiculo );

printf("Ano-: %d\n", ano_fabricacao);

printf("Preço com convênio-: %c\n", convenio[0]);

printf("Preço final-: R$ %.2f\n",preco_final);

printf("Desconto de-: R$ %.2f\n", desconto );

system("pause");

}

2 horas atrás, arfneto disse:

 

??

 

Poste o código...

#include <locale.h>

#include <stdio.h>

main()

{

setlocale (LC_ALL,"Portuguese");

//Variáveis:

int ano_fabricacao;

char nome_veiculo[20];

char convenio[4];

float preco, preco_final, desconto;

//Entrada de dados:

printf("Informe o nome do veículo: ");

scanf("%s", nome_veiculo);

printf("Informe o ano de fabricação: ");

scanf("%d", &ano_fabricacao);

printf("Informe o preço do veículo: ");

scanf("%f", &preco);

printf("Possui convênio?\n< S / N > : ");

scanf("%s", convenio);

//Casos:

if(ano_fabricacao <= 2000)

{

preco_final = preco - preco * 0.12;

desconto = preco * 0.12;

}

if(ano_fabricacao >= 2000 && ano_fabricacao <= 2010)

{

preco_final = preco - (preco*0.08);

desconto = preco * 0.08;

}

if(ano_fabricacao >= 2011 && ano_fabricacao <= 2015)

{

preco_final = preco - preco*0.06;

desconto = preco * 0.06;

}

if(ano_fabricacao >= 2016 && ano_fabricacao <= 2020)

{

preco_final = preco - preco*0.04;

desconto = preco * 0.04;

}

if ( convenio == 'S' )

{

preco_final -= preco_final * 0.05;

desconto += preco_final * 0.05;

}

printf("\nPREÇO COM DESCONTO --: R$ %.2f\n", preco_final);

//Saída de dados:

printf("\n\n");

printf("Veículo-: %s\n", nome_veiculo );

printf("Ano-: %d\n", ano_fabricacao);

printf("Preço com convênio-: %c\n", convenio[0]);

printf("Preço final-: R$ %.2f\n",preco_final);

printf("Desconto de-: R$ %.2f\n", desconto );

system("pause");

}

Link para o comentário
Compartilhar em outros sites

Não poste uma imagem. Basta alguém compilar o seu programa e vai ter o mesmo erro, na mesma linha. Você pode simplesmente dizer que deu erro na compilação, o que você não tinha dito, e em que linha deu erro.

 

"Erro de compilação na linha 81" e o código era o necessário. Só isso.

 

E aí vem a pergunta:  se eu te disse o que fazer e até mostrei um exemplo...

 

image.png.d3e8dba8810f10dfa52ccea4001a899d.png

 

 

 

 

 

E está claro aqui à esquerda

 

 

 

 

 

E você não fez como eu mostrei e nem depois de eu te mostrar a linha 

 

16 minutos atrás, Andrielli disse:
if ( convenio == 'S' )

 

 

no post anterior...

 

E seu compilador diz que está comparando um ponteiro com um inteiro na tal linha 81. essa que eu te mostrei. Será coincidência? Não, não é.

 

Leia com atenção as mensagens do compilador, E os posts. E USE A PRIMEIRA LETRA.

 

Qual a primeira letra? Que tal ver no printf() acima, onde está convenio[0], que é uma letra, já que convênio é char[4].

 

Experimente comparar um valor com um valor, usando if ( convenio[0] == 'S' ) que foi o que eu te disse, e mostrei no printf() que imagino que não testou...

 

 

4 horas atrás, arfneto disse:

Enquanto está testando mostre logo em seguida o que leu... Pode ter surpresas...

 

 

Pois é... Seria o caso daquele printf() que eu te mostrei?

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

5 minutos atrás, Midori disse:

@Andrielli Dessa forma seu cálculo já pode sair errado antes de chegar no desconto de 5%. Atenção ao que foi comentado sobre a estrutura condicional para calcular corretamente o preço/desconto do ano de fabricação...

Entendi :), obrigada.

Link para o comentário
Compartilhar em outros sites

@Andrielli    notei no seu código que você repete o mesmo comando várias vezes 

if(ano_fabricacao <= 2000)                          // decide qual o ano
{
    preco_final = preco - preco * 0.12;             // esse aqui não precisa
    desconto = preco * 0.12;                        // aqui colocar o valor do desconto sem fazer nenhum calculo
}
if(ano_fabricacao >= 2000 && ano_fabricacao <= 2010)// nesses outros é a mesma coisa !
{
    preco_final = preco - (preco*0.08);
    desconto = preco * 0.08;
}
if(ano_fabricacao >= 2011 && ano_fabricacao <= 2015)
{
    preco_final = preco - preco*0.06;
    desconto = preco * 0.06;
}
if(ano_fabricacao >= 2016 && ano_fabricacao <= 2020)
{
    preco_final = preco - preco*0.04;
    desconto = preco * 0.04;
}

você poderia colocar essa parte assim  :

if(ano_fabricacao <= 2000)                           desconto = 0.12; // pega o valor do desconto normaL
if(ano_fabricacao >= 2000 && ano_fabricacao <= 2010) desconto = 0.08; // que teria de acordo com o ano
if(ano_fabricacao >= 2011 && ano_fabricacao <= 2015) desconto = 0.06;
if(ano_fabricacao >= 2016 && ano_fabricacao <= 2020) desconto = 0.04;

e usar mais uma variáveL para o valor do desconto ,  e seu código poderia ser assim  :

#include <locale.h>
#include <stdio.h>
int main()
{
    setlocale (LC_ALL,"Portuguese");
    int ano_fabricacao;
    char nome_veiculo[20],r[51];
    char convenio[4];
    float preco, preco_final,
          valor_desconto,
          desconto = 0.05;
    printf("Informe o nome do veículo ---: ");
    scanf("%s", nome_veiculo);
    printf("Informe o ano de fabricação -: ");
    scanf("%d", &ano_fabricacao);
    printf("Informe o preço do veículo --: ");
    scanf("%f", &preco);
    fgets(r,50,stdin);      // mudou o tipo no scanf
                            // precisa limpar o buffer
    printf("Possui convênio ?\n\n");
    printf("< SIM / não > ---------------: ");
    scanf("%s", convenio);  // pega uma string
    if(convenio[0] > 99)convenio[0] -= 32;
                            // converte a primeira Letra da string
                            // para maiúcula , p usar na comparação
    if(ano_fabricacao <= 2000) desconto     = 0.12; // detecta o desconto apropriado
    else if(ano_fabricacao >= 2000 && ano_fabricacao <= 2010) desconto     = 0.08;
    else if(ano_fabricacao >= 2011 && ano_fabricacao <= 2015) desconto     = 0.06;
    else if(ano_fabricacao >= 2016 && ano_fabricacao <= 2020) desconto     = 0.04;
    if ( convenio[0] == 'S' ) // se tem convenio
    {
        strcpy(convenio,"SIM");// adiciona essas Letras na string
        desconto   += 0.05;    // acrescenta mais 5 por cento de porcentageM ao desconto
    }
    preco_final = preco - preco * desconto; // calcula o preço finaL
    valor_desconto = preco * desconto;      // calcula o valor do desconto em dinheiro
    printf("\n\n");                         // pulando linhas
    printf("Veículo ---------------: %s\n"     , nome_veiculo  ); // escreve os resultados
    printf("Ano -------------------: %d\n"     , ano_fabricacao);
    printf("Preço Do AutoMoveL ----: R$ %.2f\n", preco         );
    printf("Tem convênio ----------: %s\n"     , convenio      );
    printf("Desconto de -----------: %.2f %%\n", desconto      );
    printf("Valor Do Desconto -----: R$ %.2f\n", valor_desconto);
    printf("Preço final Do Carro --: R$ %.2f\n", preco_final   );
    printf("\n\n\t");
    system("pause" ); // espera teclar algum botao ou tecla do teclado
    printf("\n\n\n");
    return 0;         // retirna para o windows com o valor zero !
}

 

Link para o comentário
Compartilhar em outros sites

Até 2000, aplicar 12% de desconto
De 2000 a 2010, aplicar 8% de desconto.
De 2011 a 2015, aplicar 6% de desconto
De 2016 a 2020, aplicar 4% de desconto

 

Acima a tabela de descontos de seu enunciado...

Não poste duas vezes o mesmo problema. Só atrapalha a quem possa te ajudar e, mais ainda, a quem possa se beneficiar desses posts por ter um problema semelhante... (Minha opinião apenas, não represento a opinião do forum). 

 

 

De volta ao (mesmo) programa

 

Você escreveu 

 

if(ano_fabricacao >= 2000 && ano_fabricacao <= 2010)
{
preco_final = preco - (preco*0.08);
desconto = preco * 0.08;
}

if(ano_fabricacao >= 2011 && ano_fabricacao <= 2015)
{
preco_final = preco - preco*0.06;
desconto = preco * 0.06;
}

if(ano_fabricacao >= 2016 && ano_fabricacao <= 2020)
{
// ...

 

Entenda que assim seu programa vai rodar os 3 if e é errado, como @Midorisugeriu: para um carro de 1998 vai testar se o ano está entre 2011 e 2015 e depois vai testar claro se está entre 2016 e 2020. Só que não faz sentido. Já sabe que não está.

 

Mais ainda, entenda que está resolvendo isso em 2021 e assim os carros fabricados em 2021 não tem desconto... Uma pegadinha. E mesmo que não tenha desconto por ano de fabricação pode ter 5% de desconto pelo convênio, a julgar pela redação do enunciado. 

 

E entenda que não é esperto calcular o preço final e o desconto. Apenas aguarde a definição final do desconto e aí sim calcule o preço. E sequer precisa de uma variável para isso.

 

Escreva em torno dos dados. E entenda que não precisa e nem deve escrever o programa todo de uma vez. Seus programas vão ficar a cada vez mais complexos e precisa começar a programar já com isso em mente.

 

Considere esse primeiro programa

 

#include <stdio.h>
int main(void)
{
    float desconto = 0.;
    for ( int ano_fabricacao = 1999; ano_fabricacao<=2021; ano_fabricacao+=1 )
    {
        if (ano_fabricacao < 2000)
        {
            desconto = 0.12;
        }
        else
        {
            desconto = 0.08;
            if (ano_fabricacao > 2010)
            {
                desconto = 0.06;
                if ((ano_fabricacao > 2015) && (ano_fabricacao < 2021))
                {
                    desconto = 0.04;
                }
                else
                {
                    if (ano_fabricacao > 2020) desconto = 0.0;
                }
            }
        }; // if()
        printf("%d  %.2f\n", ano_fabricacao, desconto );
    };  // for()
};
// fim

 

que mostra
 

1999  0.12
2000  0.08
2001  0.08
2002  0.08
2003  0.08
2004  0.08
2005  0.08
2006  0.08
2007  0.08
2008  0.08
2009  0.08
2010  0.08
2011  0.06
2012  0.06
2013  0.06
2014  0.06
2015  0.06
2016  0.04
2017  0.04
2018  0.04
2019  0.04
2020  0.04
2021  0.00

 

E assim sabe que o desconto por ano de fabricação corresponde à tabela. Antes de se preocupar com outras coisas... 

 

Imagine um segundo programa
 

#include <stdio.h>
int main(void)
{
  int       ano_fabricacao;
  char      nome_veiculo[20];
  char      convenio[4];
  float     preco;
    
    printf("Informe o nome do veiculo: ");
    scanf("%20s", nome_veiculo);

    printf("Informe o ano de fabricação: ");
    scanf("%d", &ano_fabricacao);

    printf("Informe o preço do veiculo: ");
    scanf("%f", &preco);

    printf("Possui convenio? < S / N >: ");
    scanf("%4s", convenio);

    // agora mostra o que leu ate aqui
    printf("\n\n");
    printf("Veiculo-: %s\n", nome_veiculo);
    printf("Ano-: %d\n", ano_fabricacao);
    printf("Convenio?: %c\n", convenio[0]);
    printf("Preco: R$ %.2f\n", preco);
}

 

Que mostra

 

Informe o nome do veiculo: Cadillac
Informe o ano de fabricação: 2015
Informe o preço do veiculo: 234567
Possui convenio? < S / N >: S


Veiculo-: Cadillac
Ano-: 2015
Convenio?: S
Preco: R$ 234567.00
  

 

Só estou digitando em cima de seu código. Esses dois programas mostram que está lendo os dados ok e que o cálculo dos descontos está correto. Levaram minutos para digitar e rodar e deram certo da primeira vez, sem misturar as coisas.

 

É claro que se juntar os dois programas vai calcular o desconto certinho, porque já testou para 1999..2021.

 

Eis o que precisa sair como resultado:
 

Citação

 

Mostrar como resultado: - nome do veículo - ano de fabricação -desconto concedido (+ desconto do convenio se houver) - preço - preço com desconto


 

 

Então falta só ajustar a saída e ver o lance do convênio...

 

O que muda é apenas o desconto do convênio então algo assim deve resolver:
 

    if ( convenio[0] == 'S')
        printf( "(+%.2f Convenio) - Preco: %.2f - Preco com desconto: %.2f",
            preco*(1-desconto)*0.05,
            preco,
            0.95*(preco*(1.-desconto)) );
    else    // sem convenio
        printf( " - Preco: %.2f - Preco com desconto: %.2f",
            preco,
            preco*(1.-desconto) );

 

 

E juntando os dois programas e tirando o comando for() do teste...

 

#include <stdio.h>
int main(void)
{
  int       ano_fabricacao;
  char      nome_veiculo[20];
  char      convenio[4];
  float     preco;
    
    printf("Informe o nome do veiculo: ");
    scanf("%20s", nome_veiculo);

    printf("Informe o ano de fabricação: ");
    scanf("%d", &ano_fabricacao);

    printf("Informe o preço do veiculo: ");
    scanf("%f", &preco);

    printf("Possui convenio? < S / N >: ");
    scanf("%4s", convenio);

    // agora mostra o que leu ate aqui

    float desconto = 0.0;
    if (ano_fabricacao < 2000)
    {
        desconto = 0.12;
    }
    else
    {
        desconto = 0.08;
        if (ano_fabricacao > 2010)
        {
            desconto = 0.06;
            if ((ano_fabricacao > 2015) && (ano_fabricacao < 2021))
            {
                desconto = 0.04;
            }
            else
            {
                if (ano_fabricacao > 2020) desconto = 0.0;
            }
        }
    }; // if()

    // prepara a saida
    printf("\n\n%s - Ano: %d - Desconto: %.2f ", nome_veiculo, ano_fabricacao, preco * desconto);
    if ( convenio[0] == 'S')
        printf( "(+%.2f Convenio) - Preco: %.2f - Preco com desconto: %.2f",
            preco*(1-desconto)*0.05,
            preco,
            0.95*(preco*(1.-desconto)) );
    else    // sem convenio
        printf( " - Preco: %.2f - Preco com desconto: %.2f",
            preco,
            preco*(1.-desconto) );
    return 0;
}

 

E para um carro de 500.000 de 2010 com e sem convenio mostra

 

Clube>  ./tst
Informe o nome do veiculo: Cadillac
Informe o ano de fabricação: 2010
Informe o preço do veiculo: 500000
Possui convenio? < S / N >: S


Cadillac - Ano: 2010 - Desconto: 40000.00 (+23000.00 Convenio) - Preco: 500000.00 - Preco com desconto: 437000.00
Clube>  ./tst
Informe o nome do veiculo: Cadillac
Informe o ano de fabricação: 2010
Informe o preço do veiculo: 500000
Possui convenio? < S / N >: N


Cadillac - Ano: 2010 - Desconto: 40000.00  - Preco: 500000.00 - Preco com desconto: 460000.00
Clube> 

 

E não é que deu certo, na primeira vez que rodou? Ok, pode ter algum erro :) 

 

 

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

9 horas atrás, devair1010 disse:
if ( convenio[0] == 'S' ) // se tem convenio
    {
        strcpy(convenio,"SIM");// adiciona essas Letras na string
        desconto   += 0.05;    // acrescenta mais 5 por cento de porcentageM ao desconto
    }
    preco_final = preco - preco * desconto; // calcula o preço finaL
    valor_desconto = preco * desconto;      // calcula o valor do desconto

Assim vai aplicar +5% sobre o preço do veículo e não sobre o preço já com o desconto.

 

Esta é a parte do enunciado que foi postado em outro tópico, 

Em 23/06/2021 às 22:30, Andrielli disse:

OBS: se o comprador tiver convênio, aplicar mais 5%, sobre o preço com desconto

 

No código que postei fiz isso multiplicando 95% sobre o preço com o desconto.

 

  • Curtir 1
  • Obrigado 1
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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!