Pulse 0 Denunciar post Postado Abril 5, 2015 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
guidjos 65 Denunciar post Postado Abril 5, 2015 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
Pulse 0 Denunciar post Postado Abril 5, 2015 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
guidjos 65 Denunciar post Postado Abril 6, 2015 Justamente: quando o mês for outubro, ultimonum é 0 e 10 % 10 é 0, portanto ultimonum == mes % 10 é verdadeiro. Esse teste funciona pra outubro, e coninua funcionando pra janeiro a setembro. Compartilhar este post Link para o post Compartilhar em outros sites
Felipe-Petrópolis 11 Denunciar post Postado Abril 6, 2015 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
_Isis_ 202 Denunciar post Postado Abril 6, 2015 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-chttp://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
Felipe-Petrópolis 11 Denunciar post Postado Abril 6, 2015 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
Pulse 0 Denunciar post Postado Abril 7, 2015 Obrigado a todos! Conseguir sanar minhas dúvidas. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Abril 7, 2015 Felipe, pare de pedir tanta desculpa. ^_^ Compartilhar este post Link para o post Compartilhar em outros sites