TiagoCP Posted December 8, 2020 at 01:17 AM Report Share #620592 Posted December 8, 2020 at 01:17 AM Olá boa noite, Estou a desenvolver um trabalho sobre uma maquina de auto atendimento, que deve de aparecer um menu e depois o utilizador escolhe o menu que quiser e deverá de aparecer o valor com o respetivo troco ou não. E eu estou com duvidas como fazer para que se possa adicionar mais um produto depois de se já ter escolhido o primeiro menu. Nesta parte foi a minha tentativa de fazer algo: case 1: printf("Escolheu o menu 'Frango sem bebida e com acompanhamento'.\n"); printf("Quer adicionar mais algum produto? (S/N)\n"); scanf("%s", &letra); switch(letra){ case 'N': printf("\nTotal: 10,89 euros \nProceda ao pagamento...\n"); scanf("%f", &dinheiro); while(dinheiro<PrecoP1){ dinheiro_falta = PrecoP1 - dinheiro; printf("\nDinheiro insuficiente, falta(m) %.2f euros\n", dinheiro_falta); scanf("%f", &falta); dinheiro = dinheiro + falta; } troco = dinheiro - PrecoP1; printf("\nRetire o seu troco...\n%.2f euros", troco); printf("\n\nAguarde a confeção do seu pedido e depois dirija-se ao balcão para o levantar, seremos rápidos, OBRIGADO!\n\n"); case 'S': printf("Insira o numero do outro produto que quer adicionar: \n"); scanf("%d", &novo_produto); } break; e este é o meu trabalho inteiro: #include<stdio.h> #include<locale.h> void escreveLinha(){ printf("\n**************************"); } void escreveTraco(){ printf("\n -------------------------------------------------------------------------------------------"); } void escreveColuna(){ printf("\t|\t|\t|\t|\t|\t"); } int main() { setlocale(LC_ALL,"Portuguese"); char letra; int menu; float troco, dinheiro, dinheiro_falta, falta, PrecoP1 = 10.89, PrecoP2 = 13.29, PrecoP3 = 15.00, PrecoP4 = 16.99, PrecoP5 = 7.50, PrecoP6 = 8.50, PrecoP7 = 3.00, PrecoP8 = 4.00, PrecoP9 = 3.50; escreveLinha(); printf("|SEJA BEM-VINDO A CHURRASQUEIRA CAMOMILA|**************************\n"); escreveTraco(); printf("\n|\t\t\t\t\t\t\t\t\t\t\t |\n| *Menu*\t *Conteúdo*\t\t\t\t\t\t *Preço*\t |\n"); printf("| 1 \t\t Frango sem bebida e com acompanhamento \t\t 10,89 euros\t |\n"); printf("| 2 \t\t Frango com bebida e acompanhamento \t\t\t 13,29 euros\t |\n"); printf("| 3 \t\t Frango com bebida, acompanhamento e sobremesa \t 15,00 euros\t |\n"); printf("| 4 \t\t Prato do dia com bebida, acompanhamento e sobremesa \t 16,99 euros\t |\n"); printf("|\t\t\t\t\t\t\t\t\t\t\t |\n"); printf("| *Unidade*\t *Conteúdo*\t\t\t\t\t\t *Preco*\t |\n"); printf("| 5 \t\t Frango \t\t\t\t\t\t 7,50 euros\t |\n"); printf("| 6 \t\t Prato do Dia \t\t\t\t\t\t 8,50 euros\t |\n"); printf("| 7 \t\t Bebida \t\t\t\t\t\t 3,00 euros\t |\n"); printf("| 8 \t\t Guarnição \t\t\t\t\t\t 4,00 euros\t |\n"); printf("| 9 \t\t Sobremesa \t\t\t\t\t\t"); printf(" 3,50 euros\t |\n"); printf("|\t\t\t\t\t\t\t\t\t\t\t |"); printf("\n| Para SAIR, marque 10 \t\t\t\t\t\t\t\t |\n"); printf("|\t\t\t\t\t\t\t\t\t\t\t |"); escreveTraco(); printf("\n\nInsira o número do produto que deseja: \n"); do{ scanf("%d",&menu); switch(menu) { case 1: printf("Escolheu o menu 'Frango sem bebida e com acompanhamento'.\n"); printf("Quer adicionar mais algum produto? (S/N)\n"); scanf("%s", &letra); switch(letra){ case 'N': printf("\nTotal: 10,89 euros \nProceda ao pagamento...\n"); scanf("%f", &dinheiro); while(dinheiro<PrecoP1){ dinheiro_falta = PrecoP1 - dinheiro; printf("\nDinheiro insuficiente, falta(m) %.2f euros\n", dinheiro_falta); scanf("%f", &falta); dinheiro = dinheiro + falta; } troco = dinheiro - PrecoP1; printf("\nRetire o seu troco...\n%.2f euros", troco); printf("\n\nAguarde a confeção do seu pedido e depois dirija-se ao balcão para o levantar, seremos rápidos, OBRIGADO!\n\n"); case 'S': printf("Insira o numero do outro produto que quer adicionar: \n"); scanf("%d", &novo_produto); } break; case 2: printf("Escolheu o menu 'Frango com bebida e acompanhamento'.\n"); printf("\nTotal: 13,29 euros \nProceda ao pagamento...\n"); scanf("%f", &dinheiro); while(dinheiro<PrecoP2){ dinheiro_falta = PrecoP2 - dinheiro; printf("\nDinheiro insuficiente, falta(m) %.2f euros\n", dinheiro_falta); scanf("%f", &falta); dinheiro = dinheiro + falta; } troco = dinheiro - PrecoP2; printf("\nRetire o seu troco...\n%.2f euros", troco); printf("\n\nAguarde a confeção do seu pedido e depois dirija-se ao balcão para o levantar, seremos rápidos, OBRIGADO!\n\n"); break; case 3: printf("Escolheu o menu 'Frango com bebida, com acompanhamento e sobremesa'.\n"); printf("\nTotal: 15,00 euros \nProceda ao pagamento...\n"); scanf("%f", &dinheiro); while(dinheiro<PrecoP3){ dinheiro_falta = PrecoP3 - dinheiro; printf("\nDinheiro insuficiente, falta(m) %.2f euros\n", dinheiro_falta); scanf("%f", &falta); dinheiro = dinheiro + falta; } troco = dinheiro - PrecoP3; printf("\nRetire o seu troco...\n%.2f euros", troco); printf("\n\nAguarde a confeção do seu pedido e depois dirija-se ao balcão para o levantar, seremos rápidos, OBRIGADO!\n\n"); break; case 4: printf("Escolheu o menu 'Prato do dia com bebida, acompanhamento e sobremesa'.\n"); printf("\nTotal: 16,99 euros \nProceda ao pagamento...\n"); scanf("%f", &dinheiro); while(dinheiro<PrecoP4){ dinheiro_falta = PrecoP4 - dinheiro; printf("\nDinheiro insuficiente, falta(m) %.2f euros\n", dinheiro_falta); scanf("%f", &falta); dinheiro = dinheiro + falta; } troco = dinheiro - PrecoP4; printf("\nRetire o seu troco...\n%.2f euros", troco); printf("\n\nAguarde a confeção do seu pedido e depois dirija-se ao balcão para o levantar, seremos rápidos, OBRIGADO!\n\n"); break; case 5: printf("Escolheu uma unidose de 'Frango'.\n"); printf("\nTotal: 7,50 euros \nProceda ao pagamento...\n"); scanf("%f", &dinheiro); while(dinheiro<PrecoP5){ dinheiro_falta = PrecoP5 - dinheiro; printf("\nDinheiro insuficiente, falta(m) %.2f euros\n", dinheiro_falta); scanf("%f", &falta); dinheiro = dinheiro + falta; } troco = dinheiro - PrecoP5; printf("\nRetire o seu troco...\n%.2f euros", troco); printf("\n\nAguarde a confeção do seu pedido e depois dirija-se ao balcão para o levantar, seremos rápidos, OBRIGADO!\n\n"); break; case 6: printf("Escolheu uma unidose de 'Prato do dia'.\n"); printf("\nTotal: 8,50 euros \nProceda ao pagamento...\n"); scanf("%f", &dinheiro); while(dinheiro<PrecoP6){ dinheiro_falta = PrecoP6 - dinheiro; printf("\nDinheiro insuficiente, falta(m) %.2f euros\n", dinheiro_falta); scanf("%f", &falta); dinheiro = dinheiro + falta; } troco = dinheiro - PrecoP6; printf("\nRetire o seu troco...\n%.2f euros", troco); printf("\n\nAguarde a confeção do seu pedido e depois dirija-se ao balcão para o levantar, seremos rápidos, OBRIGADO!\n\n"); break; case 7: printf("Escolheu uma unidose de 'Bebida'.\n"); printf("\nTotal: 3,00 euros \nProceda ao pagamento...\n"); scanf("%f", &dinheiro); while(dinheiro<PrecoP7){ dinheiro_falta = PrecoP7 - dinheiro; printf("\nDinheiro insuficiente, falta(m) %.2f euros\n", dinheiro_falta); scanf("%f", &falta); dinheiro = dinheiro + falta; } troco = dinheiro - PrecoP7; printf("\nRetire o seu troco...\n%.2f euros", troco); printf("\n\nDirija-se ao balcão para levantar o seu pedido, OBRIGADO!\n\n"); break; case 8: printf("Escolheu uma unidose de 'Acompanhamento'.\n"); printf("\nTotal: 4,00 euros \nProceda ao pagamento...\n"); scanf("%f", &dinheiro); while(dinheiro<PrecoP8){ dinheiro_falta = PrecoP8 - dinheiro; printf("\nDinheiro insuficiente, falta(m) %.2f euros\n", dinheiro_falta); scanf("%f", &falta); dinheiro = dinheiro + falta; } troco = dinheiro - PrecoP8; printf("\nRetire o seu troco...\n%.2f euros", troco); printf("\n\nAguarde a confeção do seu pedido e depois dirija-se ao balcão para o levantar, seremos rápidos, OBRIGADO!\n\n"); break; case 9: printf("Escolheu uma unidose de 'Sobremesa'.\n"); printf("\nTotal: 3,50 euros \nProceda ao pagamento...\n"); scanf("%f", &dinheiro); while(dinheiro<PrecoP9){ dinheiro_falta = PrecoP9 - dinheiro; printf("\nDinheiro insuficiente, falta(m) %.2f euros\n", dinheiro_falta); scanf("%f", &falta); dinheiro = dinheiro + falta; } troco = dinheiro - PrecoP9; printf("\nRetire o seu troco...\n%.2f euros", troco); printf("\n\nDirija-se ao balcão para levantar o seu pedido, OBRIGADO!\n\n"); break; case 10: printf("Temos muita pena que não queira continuar a operação, OBRIGADO E VOLTE SEMPRE! \n"); break; default: printf("\nNão existe o producto escolhido, volte a introduzir o número do produto que deseja: \n"); } } while(menu>10); } Cumprimentos, Link to comment Share on other sites More sharing options...
thoga31 Posted December 8, 2020 at 08:47 PM Report Share #620597 Posted December 8, 2020 at 08:47 PM Antes de mais, sugiro fortemente o uso de funções para que a função main() não fique tão grande e com o programa todo. Será, aliás, mais fácil de gerir dessa forma. Cada função seria responsável por cada uma das operações. Quanto ao problema em mãos, a ideia será a mesma que o menu: um ciclo while até que o utilizador diga que não quer inserir mais nada. do { // tarefas... do { printf("Deseja inserir mais alguma coisa? (S/N) "); // ler opção do teclado } while (opcao != 'S' && opcao != 'N'); } while (opcao == 'S'); Como bónus inseri um ciclo extra que obriga o utilizador a escrever S ou N e não outra letra ou número. Cumprimentos. Knowledge is free! Link to comment Share on other sites More sharing options...
TiagoCP Posted December 8, 2020 at 09:37 PM Author Report Share #620598 Posted December 8, 2020 at 09:37 PM Primeiramente queria agradecer imenso a ajuda. Posto isto, não entendi como posso executar a primeira dica. Sou um iniciante nesta materia da programação, mas acredito que essa dica me possa vir a ajudar, facilitando o trabalho. Depois, não consigo ligar essa ideia do ciclo while ao programa que tenho, consegui entender a ideia, mas não consigo implementá-la. Peço desculpa o incomodo. Cumprimentos. Link to comment Share on other sites More sharing options...
thoga31 Posted December 8, 2020 at 11:05 PM Report Share #620601 Posted December 8, 2020 at 11:05 PM 59 minutos atrás, TiagoCP disse: não entendi como posso executar a primeira dica Recomendo a leitura do nosso artigo na Wiki e de outros relacionados com a temática de funções. As funções podem ser reutilizadas, evitando copy-pastes de código, e permitem modular as tarefas por objectivos e passos mais pequenos. Por exemplo, ao ver o teu código vi que tens em todos os casos a mesma operação: o pagamento. É, portanto, uma excelente oportunidade para criar uma função. Por exemplo: void pagamento(float preco) { float dinheiro = 0.f, pago; printf("Total: %.2f euros\nProceda ao pagamento...\n", preco); while(dinheiro < preco) { printf("\tValor? "); scanf("%f", &pago); dinheiro += pago; if (dinheiro < preco) printf("\tFalta(m) %.2f euros!\n", preco - dinheiro); } printf("\nRetire o seu troco: %.2f euros", dinheiro - preco); } Assim, quando executares um menu, podes chamar a função assim: // Exemplo para o Menu 7 case 7: printf("Escolheu uma unidose de 'Bebida'.\n"); pagamento(PrecoP7); break; 59 minutos atrás, TiagoCP disse: não consigo ligar essa ideia do ciclo while ao programa que tenho, consegui entender a ideia, mas não consigo implementá-la Considera o seguinte esqueleto para o a função main(). Aquilo que ele alcança é: Mostrar o menu; Ler o menu desejado pelo cliente; Executar o menu desejado; Perguntar se quer mais alguma coisa. Se sim, volta ao ponto 1. do { // Mostrar menu do { printf("Qual o menu que deseja? "); // Ler menu } while (menu < 1 || menu > 10); switch (menu) { case 1: /* Exemplo COMPLETO do Menu 1 */ printf("Escolheu o menu 'Frango sem bebida e com acompanhamento'.\n"); pagamento(PrecoP1); break; case 2: // Menu 2... break; // Outros menus... } do { printf("Deseja outro menu? (S/N) "); // Ler opcao } while (opcao != 'S' && opcao != 'N'); } while (opcao == 'S'); Não dá jeito perguntar se o utilizador quer mais alguma coisa dentro do próprio case. É uma tarefa comum a todos os casos, pelo que podemos perguntar apenas no final. Se a pessoa quiser mais algum menu, o programa volta a executar os 4 pontos que enumerei. Cumprimentos. Knowledge is free! Link to comment Share on other sites More sharing options...
thoga31 Posted December 8, 2020 at 11:22 PM Report Share #620602 Posted December 8, 2020 at 11:22 PM (edited) Aproveito para deixar algumas dicas adicionais, não inerentes ao problema mas que podem contribuir para um código mais bem estruturado. Sempre que possível, evita numerar as variáveis e as constantes. Se porventura tiveres de mudar as coisas de ordem, os números deixam de fazer sentido. Podes, por exemplo, usar o nome PRECO_FRANGO em vez de PrecoP5 para te referires ao preço do frango. A vantagem imediata é que, ao leres PrecoP5, não sabes do que é, mas ao leres PRECO_FRANGO sabes de caras que é o preço do prato de frango. Para distinguir à vista desarmada as variáveis das constantes, nomeia as constantes com maiúsculas (por exemplo, PRECO_FRANGO). Define os valores constantes usando a directiva #define. No teu caso seria algo como: #define PRECO_FRANGO_A 10.89f // Frango com acompanhamento #define PRECO_FRANGO_AB 13.29f // Frango com acompanhamento e bebida #define PRECO_FRANGO_ABS 15.00f // Frango com acompanhamento, bebida e sobremesa #define PRECO_DIA_ABS 16.99f // Prato do dia com acompanhamento, bebida e sobremesa #define PRECO_FRANGO 7.50f // Frango #define PRECO_DIA 8.50f // Prato do dia #define PRECO_BEBIDA 3.00f // Bebida #define PRECO_ACOMPANHAMENTO 4.00f // Acompanhamento #define PRECO_SOBREMESA 3.50f // Sobremesa Coloca o menu numa função à parte para não encher tanto a função main(): void menu(void); int main(void) { char opcao; // Outras variáveis... do { menu(); /* Escreve o menu */ // Ler menu, executar e perguntar se quer algo mais... while (opcao == 'S'); return 0; } void menu(void) { printf("MENU\n"); printf("1 > Um delicioso frango só com acompanhamento.\n"); // etc... } Cumprimentos. Edited December 8, 2020 at 11:25 PM by thoga31 Pequena gafe no código Knowledge is free! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now