Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pulse

Placa

Recommended Posts

Criar um algoritmo em C que leia o número correspondente ao mês atual e

os dígitos (somente os quatro números) de uma placa de veículo, e através do número

finalizador da placa (algarismo da casa das unidades) determine se o IPVA do veículo

vence no mês corrente.

Final 1 – mês (1) – Janeiro Final 6 – mês (6) – Junho

Final 2 – mês (2) – Fevereiro Final 7 – mês (7) – Julho

Final 3 – mês (3) – Março Final 8 – mês (8) – Agosto

Final 4 – mês (4) – Abril Final 9 – mês (9) – Setembro

Final 5 – mês (5) – Maio Final 0 – mês (10) – Outubro




#include <stdio.h>


int main ()

{


int placa, ultimonum, mes;



printf("Digite a placa");

scanf("%d", &placa);


printf("Digite o mes");

scanf("%d", &mes);


ultimonum = placa%10;


if (ultimonum == mes)

{

printf("Vence nesse mes");

}

else if ((ultimonum == 0) && (mes == 10))

{

printf("Vence nesse mes");

}

else

{

printf("Nao vence nesse mes");

}

}




Meu problema é que o programa executa ainda que o usuário digite um número de placa inválido (5 dígitos por exemplo). Como faço para solucionar isso? Além disso queria saber se vocês podem dar uma olhada no fluxograma que eu fiz do programa, sei que essa categoria do fórum não é adequada para isso mas é que tô com um pouco de dúvida e farei uma prova na qual vai cair isso essa semana. (http://i.imgur.com/OT8yaMw.jpg)


Obrigado desde já!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá e bem-vindo/a!

 

 

Sobre o porquê de seu programa não acusar números inválidos: você não considera isso em seu fluxo. Sugiro sempre validar que placa E [0000; 9999].

 

 

Sobre seu fluxograma, não entendi o que é o estado em que você escreve "0". Ele me parece desnecessário.

Além disso, você escreveu "ultimonum = mes / 1000". Claramente a lógica não é essa, como você disse em C.

 

Além disso, uma forma de torná-lo mais simples é comparar ultimonum com mes % 10. Isso reduz o problema a uma condicional, ao invés das atuais duas (quando ultimonum != mes).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, guidjos. O caso do "ultimonum = mes/1000" realmente está errado, eu fiz confusão, na verdade é ultimonum = mes%10.

Quanto à comparação entre ultimonum e mes%10 é inviável, já que quando o último número é 0 corresponde ao mês Outubro que é 10, por isso precisei colocar as duas condições. E o "0" na verdade é pra juntar o fluxo e seguir para o final, eu fazia antes sem juntar o fluxo mas me disseram que é errado.
Obrigadão!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Pulse não sei se ainda lhe interessa, mesmo porque eu mesmo acredito que o meu codigo não deve ser dos melhores mas eu fiz o seguinte:

#include <stdio.h>

int main ()
{

    int placa, ultimonum, mes;

{

do 
   {
    printf("Digite a placa:\n");
    scanf("%d", &placa);

    if(placa<=10000)
    {
    printf("Digite o mes:\n");
    scanf("%d", &mes);
    }

    else
    {
        printf("Placa invalida!");
        return (0);
    }

    ultimonum = placa%10;


    if (ultimonum == mes)
    {
        printf("Vence nesse mes\n");
    }
    else
        if ((ultimonum == 0) && (mes == 10))
    {
        printf("Vence nesse mes!\n");
    }
    else
    {
        printf("Nao vence nesse mes!\n");
    }
}

while (placa > 0000 || placa < 10000);
                                       
   }                                   

return 0;

}

Espero que ao mesnos lhe dê alguma luz, mesmo o codigo sendo um pouco Torto!

 

Quanto ao fluxograma não vou lhe ser util pois sou pessimo nisso ! ! !

 

 

Espero ter ajudado!

 

 

Obs.: se alguem que ler este topico puder me responder aqui eu ficaria muito grato, posso abrir um topico se acharem necessario!

 

Como eu havia dito sou iniciante em C e meu codigo não deve ser dos melhores, eu estava tentando quebrar a cabeça para saber como fazer o programa voltar a receber o numero da placa caso o usuario digite um numero invalido.

 

Me surgiu então de por dentro do return a função main(), e o programa fez exatamente o que eu queria.

if(placa<=10000)
    {
    printf("Digite o mes\n");
    scanf("%d", &mes);
    }

    else
    {
        printf("Numero invalido - Tente outra Vez\n");
        return (main());
    }

Gostaria de saber se esse return que fiz é realmente valido em C e principalmente se funcionaria em outros programas do genero!

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Felipe,
1- Não há necessidade de colocar o do-while entre chaves.

2- A condição (if placa <=10000) está errada. As placas contém 4 dígitos (máx:9999)

3- Evite chamar o main. Em C++, por exemplo, é listado como algo tendo um comportamento indefinido.

4- Não há necessidade de recursão.

http://stackoverflow.com/questions/2128321/can-main-function-call-itself-in-c
http://blog.regehr.org/archives/213

#include <stdio.h>
int main (void) {
    int placa, mes;
    int digito_unidade;
 
    while(1) { // Loop infinito. P/ sair, pressione Ctrl+C (Linux)
       printf("Digite a placa");
       scanf("%d", &placa);
 
       if (placa == 0 || placa > 9999) {
           printf("Placa inválida.\n");
       } else {
          printf("Digite o mes");
          scanf("%d", &mes);
 
          digito_unidade = placa%10;
 
          if (digito_unidade == mes%10) {
             printf("Vence nesse mes");
          } else {
             printf("Nao vence nesse mes");
          }
       }
   }
   return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

 

_Isis_ muito obrigado pelas suas observações, realmente como eu disse sou inciante e ainda tenho muito o que aprender.

 

- Sobre o main() já tinha em mente que era algo a ser evitado, e que caso funcionasse deveria vir a causar erros inesperados, mas como funcionou vou tentar buscar mais informações sobre isso em meus estudos futuros, foi só por curiosidade mesmo.

 

- Sobre ( if placa <=10000 ) peço desculpas já havia percebido o erro mais cedo, so tive mesmo preguiça de editar o post, desculpem !

 

- Com relação ao restante das observações muito obrigado, vou prestar um pouco mais de atenção a esses detalhes!

 

- Sobre os Links vou estuda-los assim que possivel, valeu!

 

 

Obrigado e ate mais ! ! !

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.