Jump to content
psgg

menu

Recommended Posts

psgg

Boas malta, primeira vez que escrevo aqui, sou um noob em C : minha dúvida deve ser bastante simples de resolver, mas não estou a conseguir...

... basicamente eu tenho que fazer na opção 6, é fazer com q ela mostre o menu de novo ... passo a citar o que a minha prof pediu (para ser mais simples de compreensão do que através de palavras minhas) :

"6 - Introduzir dois novos inteiros positivos, num1 e num2

Permite ao utilizador introduzir dois inteiros positivos que ficam guardados em variáveis do programa e volta a apresentar o menu, para que o utilizador se relembre das opções disponíveis.

Note portanto que o que deve ser efectuado nesta opção 6 é basicamente o mesmo que deve ser efectuado no início da execução do programa, quando o utilizador vai introduzir pela primeira vez dois números.

Ao conceber o programa, deve assumir que o utilizador é bem comportado e só introduz inteiros positivos.

Após executar qualquer das opções, excepto a opção 0 que faz terminar a execução, o programa deve avisar o utilizador que está pronto a ler um novo valor de opção, em seguida ler esse valor e prosseguir com a execução dessa nova opção.

Isto é, o programa irá efectuar repetidamente a leitura de uma opção e o processamento dessa opção, enquanto a opção indicada for diferente de 0 (e diferente de opção inexistente)."

e eu estava a tentar fazer isso através dum if ... mas não consigo, pois quando meto 6 na opcao, ele salta por cima não reconhece

#include <stdio.h>
#include <stdlib.h>

/* funcao main inicia a execucao do programa*/
int main(void)
{
    int num1; /* primeiro inteiro dado pelo utilizador */
    int num2; /* segundo inteiro dado pelo utilizador */
    int opcao; /* opcao a executar */ 
    
    /* processar opcao 6 */
    printf( "Escreva os dois inteiros positivos:  \n");
    scanf( "%d%d", &num1, &num2);
    
    printf( "Menu:\n");
    printf( "1 - Divisao inteira de num1 por num2\n" );
    printf( "2 - Divisao real de num1 por num2\n" );
    printf( "3 - Multiplo de num2 mais proximo de num1\n" );
    printf( "4 - Lista de multiplos positivos de num1 e num2\n" );
    printf( "5 - Menor multiplo comum positivo de num1 e num2\n" );
    printf( "6 - Introduzir dois novos inteiros positivos, num1 e num2\n" );
    printf( "0 - Terminar\n" );
    
    
    if ( opcao == 6 ) {
    
    printf( "Escreva os dois inteiros positivos:  \n");
    scanf( "%d%d", &num1, &num2);
    
    printf( "Menu:\n");
    printf( "1 - Divisao inteira de num1 por num2\n" );
    printf( "2 - Divisao real de num1 por num2\n" );
    printf( "3 - Multiplo de num2 mais proximo de num1\n" );
    printf( "4 - Lista de multiplos positivos de num1 e num2\n" );
    printf( "5 - Menor multiplo comum positivo de num1 e num2\n" );
    printf( "6 - Introduzir dois novos inteiros positivos, num1 e num2\n" );
    printf( "0 - Terminar\n" );}
    
    
    
    /* inicializar opcao com valor != 0 para que o ciclo nao termine logo */
    
    /* ciclo de leitura a execucao da opcao ate que essa opcao seja 0 */
    while ( opcao != 0 ) {
          /* ler valor para opcao */
          printf("Opcao:\n");
          scanf("%d", &opcao);
          
          /* Processar opcao */
    if ( opcao < 0 || opcao > 6 )
      opcao = 0
      ;
    else if ( opcao == 0 )
         printf("Fim.\n");  /* nao faz nada: instrucao nula */
    else if ( opcao == 1 ) {
         printf( "resultado = %d\n", num1/num2 );

        
    }
  }
    

   
    
  
system("PAUSE");
return 0;
} /* fim da funcao main */

até agora só tenho as opções 1 e 0 a funcionar, pois estou a fazer pelos passos que a prof recomenda .... ja estou á dois dias para tentar resolver isto, e tá complicado...tenho firma a certeza que é uma coisa super banal...mas pronto como disse sou noob nisto.... se der para dar uma ajudazinha e umas dicas era bacano  :P

Share this post


Link to post
Share on other sites
Diutsu

estás a pensar mal na execução do programa

o que tu estás a fazer é:

1. pedir numeros e apresentar as opções,

2. verificar se "opcao" é 6

3. - se sim, pedir os numeros e apresentar as opçoes novamente

4. Se o utilizador não for 0 continua, se for 0 vai para 8.

5. pede "opção" ao utilizador

6. processar "opção" (0 ou 1)

7 voltar a 4.

8. Sai do programa

Agora tenta descobrir com é que após teres inserido 6 consegues chegar a 2.


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
psgg

estás a pensar mal na execução do programa

o que tu estás a fazer é:

1. pedir numeros e apresentar as opções,

2. verificar se "opcao" é 6

3. - se sim, pedir os numeros e apresentar as opçoes novamente

4. Se o utilizador não for 0 continua, se for 0 vai para 8.

5. pede "opção" ao utilizador

6. processar "opção" (0 ou 1)

7 voltar a 4.

8. Sai do programa

Agora tenta descobrir com é que após teres inserido 6 consegues chegar a 2.

eu não percebi bem... ou seja tenho q repensar a "opcao 6" ... tenho que a restruturar?? ... o que me veio logo a cabeça é usar um if, já experimentei acresentar um else a seguir para continuar, mas não dá na mesma ... já pensei que podesse ser dentro do ciclo while (este ciclo a prof indica para fazer) , mas não pode ser pq ela diz para fazer a opção 6 antes .... estou a usar os comandos errados?

Share this post


Link to post
Share on other sites
Diutsu

Pensa em papel. Escreve os passo que queres que o programa execute. Os vários casos possiveis de serem executados.

E o enunciado já tem uma grande ajuda:

o que deve ser efectuado nesta opção 6 é basicamente o mesmo que deve ser efectuado no início da execução do programa, quando o utilizador vai introduzir pela primeira vez dois números.
(basta voltares ao inicio)

Quanto tiveres essa parte resolvida é que começas a pensar em código.


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
psgg

Pensa em papel. Escreve os passo que queres que o programa execute. Os vários casos possiveis de serem executados.

E o enunciado já tem uma grande ajuda: (basta voltares ao inicio)

Quanto tiveres essa parte resolvida é que começas a pensar em código.

não estou a conseguir... vamos por passos, para ver se o meu raciocinio esta correcto

1: faço o menu, como fiz com os printfs etc

.......nesse menu não estou a incorporar

   printf("Opcao:\n");
    scanf("%d", &opcao);

para depois não me pedir duas vezes a "opcao"

2: inicio um if... ja pensei usar o switch/case penso q seria mais simples, mas como a minha prof ainda nao chegou a essa parte da materia deduzo q não seja para usar isso;

3: agora devia consegur fazer algo para ler esse if, e não saltar por cima, como o programa esta a fazer, ja pensei introduzir um scanf, antes do if, mas assim troca-me o output ... não estou mesmo a perceber  :P

Share this post


Link to post
Share on other sites
psgg

por exemplo, se eu puser o menu dentro do clico while, assim ja corre bem

#include <stdio.h>
#include <stdlib.h>

/* funcao main inicia a execucao do programa*/
int main(void)
{
    int num1; /* primeiro inteiro dado pelo utilizador */
    int num2; /* segundo inteiro dado pelo utilizador */
    int opcao; /* opcao a executar */ 
    
    /* processar opcao 6 */
    printf( "Escreva os dois inteiros positivos:  \n");
    scanf( "%d%d", &num1, &num2);
    
    printf( "Menu:\n");
    printf( "1 - Divisao inteira de num1 por num2\n" );
    printf( "2 - Divisao real de num1 por num2\n" );
    printf( "3 - Multiplo de num2 mais proximo de num1\n" );
    printf( "4 - Lista de multiplos positivos de num1 e num2\n" );
    printf( "5 - Menor multiplo comum positivo de num1 e num2\n" );
    printf( "6 - Introduzir dois novos inteiros positivos, num1 e num2\n" );
    printf( "0 - Terminar\n" );
        

    /* inicializar opcao com valor != 0 para que o ciclo nao termine logo */
    
    /* ciclo de leitura a execucao da opcao ate que essa opcao seja 0 */
    while ( opcao != 0 ) {
          /* ler valor para opcao */
          printf("Opcao:\n");
          scanf("%d", &opcao);
          
          /* Processar opcao */
    if ( opcao < 0 || opcao > 6 )
      opcao = 0;
    else if ( opcao == 0 )
         printf("Fim.\n");  /* nao faz nada: instrucao nula */
    else if ( opcao == 1 ) {
         printf( "resultado = %d\n", num1/num2 );}
    else if ( opcao == 6 ) {
             printf( "Escreva os dois inteiros positivos:  \n");
             scanf( "%d%d", &num1, &num2);
    
             printf( "Menu:\n");
             printf( "1 - Divisao inteira de num1 por num2\n" );
             printf( "2 - Divisao real de num1 por num2\n" );
             printf( "3 - Multiplo de num2 mais proximo de num1\n" );
             printf( "4 - Lista de multiplos positivos de num1 e num2\n" );
             printf( "5 - Menor multiplo comum positivo de num1 e num2\n" );
             printf( "6 - Introduzir dois novos inteiros positivos, num1 e num2\n" );
             printf( "0 - Terminar\n" );
         

         
    }
  }
    
system("PAUSE");
return 0;
} /* fim da funcao main */

mas não sei se é isto q ela quer, pois ele diz para fazer opcão 6 antes do while, pelo esqueleto q ela dá ... ou será q sou eu q estou a perceber mal a coisa?

Share this post


Link to post
Share on other sites
pmg

psgg: experimenta meter o menu numa funcao propria ... numa primeira versao essa funcao nao precisa de parametros, escreve o menu no ecra e devolve uma tacle valida. Se, enquanto estiveres a processar a funcao do menu, detectares uma tecla invalida, simplesmente ignora essa tecla.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
Cronometro

psgg: experimenta meter o menu numa funcao propria ... numa primeira versao essa funcao nao precisa de parametros, escreve o menu no ecra e devolve uma tacle valida. Se, enquanto estiveres a processar a funcao do menu, detectares uma tecla invalida, simplesmente ignora essa tecla.

ele ainda não deve ter aprendido funções, o melhor é um ciclo.


Software is like sex: It’s better when it’s free.

Share this post


Link to post
Share on other sites
psgg

ele ainda não deve ter aprendido funções, o melhor é um ciclo.

eu sei que dava para fazer numa função...mas ainda não cheguei a essa parte da materia...então estou a seguir-me pelo q já demos... sei disso, porque não é a primeira vez que estou a repetir a cadeira, aliás é o terceiro ano  😳 .. mas os anos anteriores sempre dei prioridade ás outras cadeiras, não sei se é pelo meto de ensino q aplicam na minha faculdade, mas não nunca consegui entender bem a logica de estruturação dos programas ...pior é que no meu curso tenho duas cadeiras em linguagem C , prog I e prog II ...mas este ano com jeitinho passo ás duas!!

o agora os grandes dificuldades neste projecto vêem nas proximas "opções" ehehehe ...se precisar de ajuda depois inicio um novo topico por aqui

Share this post


Link to post
Share on other sites
psgg

mas assim é que resulta como querias inicialmente.

é mesmo assim que eles estão a pedir no projecto, já confimei

obrigado pela dica inicial que deste  :) ao ínicio não estava a perceber, mas depois consegui perceber onde querias chegar.... eu tinha a noção que era um erro primário o que eu estava a fazer, mas demorei a percebe-lo

Share this post


Link to post
Share on other sites
mundo

Não conheces switchs ainda? Talvez seja a melhor opção para isto e o codigo nao fica tao confuso.

Share this post


Link to post
Share on other sites
Cronometro

Epa, eu aconselho-te a treinar algoritmia.

Eu quando comecei a programar (o ano passado), os primeiros exercicios eram quase só de algoritmia, para nós aprendermos a pensar quando nos pedem um programa.


Software is like sex: It’s better when it’s free.

Share this post


Link to post
Share on other sites
emanueloki

Para fazer um menu, normalmente usa-se um do/while e o respectivo switch case para verificar as opçoes!

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.