Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
killer_joe

Menu em C

Recommended Posts

killer_joe

Ola a todos.

Gostaria de saber se me podem ajudar numa questão.

Por exemplo tenho um menu em c, se a opcao for 7 (neste caso) escreve 123456, se nao for nenhuma das opcoes diz, opcao invalida.

Agora  a minha questão é: como faria, se por exemplo, quando tinha de digitar uma opcao eu apenas pressionar enter (nao digitei nada) e eu queria que ele só com enter desse tb opcao invalida...

nao sei se a minha questao foi clara...Espero que me possam ajudar. Obrigado

em baixo o exemplo:

 int op;
scanf("%c",&op);
do
  {
       (...)
      case 7:
         printf("123456");
      break; 
     default:
         system("cls");   
        printf("opcao invalida!\n");
      } 
   }while(op!=1 && op!=2 && op!=3 && op!=4 && op!=5 && op!=6 && op!=7);

Share this post


Link to post
Share on other sites
pmg

Usa fgets() em vez do scanf.

http://www.opengroup.org/onlinepubs/007908799/xsh/fgets.html

O fgets() precisa dum array em vez dum caracter. Se confias nos utilizadores do teu programa podes fazer um array de char com 3 elementos (espaço para '7', '\n', e '\0') e verificar somente o primeiro elemento. Se não confias nos utilizadores (é sempre bom desconfiar dos utilizadores) a gestão do 'stream' de input dá-te um bocado mais trabalho.

#include <stdio.h>

int main(void) {
  char input[3];
  for (; {
    fgets(input, 3, stdin);
    switch (input[0]) {
      /* ... */
      case '7':
        printf("123456");
        break;
      default:
        /* system("cls"); */
        printf("opcao invalida!\n");
        break;
      case '\n':
        printf("Nada? Impossivel adivinhar a opcao sem o modulo \"bola-de-cristal\".\n");
        printf("Esse modulo esta a venda em http://bola-de-cristal.com/ (2,000,000 EUR).\n");
        break;
    }
  }
  return 0;
}


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
killer_joe

Desde já obrigado pela ajuda.. Mas ainda estou um pouco confuso, como sou ainda um novato nisto :D

é que isto é uma função que vou chamar no main.

então sabendo que:

PESSOA é uma struct

e a variável escola pertence a uma enumeração que é ESCOLA.

que alterações faria a este código, para ter em conta o problema anterior?

Pus o código anterior de ajuda neste programa e pus como comentário, e a minha dúvida. Se puderes explicar e apagar o meu código que está mal e aplicar esse ficava te muito grato.

Mais uma vez agradeço a disponibilidade e desculpa a minha burrice.

void inserir(PESSOA *inf_pessoa)
{
   int op;
   //char input[3];  //neste caso porquê de ser input[3]?

   printf("\n\n\tNome: ");
   fflush(stdin);
   scanf("%99[^\n]",inf_pessoa->nome);
   printf("\n\tBI: ");
   fflush(stdin);
   scanf("%d",&inf_pessoa->bi);
   
   do
   {
       printf("\n\tInsira a escola a que pertence:\n\t(1)-escola1\n\t(2)-escola2\n\t(3)-escola3\n");
       printf("\n\tOpcao: ");
       fflush(stdin);
       scanf("%d", &op);
  
    //for (; {    //como ficaria o for e porquê de usar um for?
    //fgets(input, 3, stdin); //Esta é a forma de fazer o fgets, percebi
   // switch (input[0]) { //esta instrução não percebi o porquê de ser 0

       switch(op)
       {
           case 1:
                inf_pessoa->escola=escola1;
           break;
           
           case 2:
                inf_pessoa->escola=escola2;
           break;
      
           case 3:
                inf_pessoa->escola=escola3;
           break;
              
           default:
                system("cls");   
                printf("\tOpcao Invalida!\n");   
           case '\n':
                printf("\ninsira uma opcao valida!");
          break;
      } 
   return 0;
   }while(op!=1 && op!=2 && op!=3);
   
   
   printf("\n\tData de Nascimento: ");
   fflush(stdin);
   scanf("%d",&inf_pessoa->data_nasc);
}

Share this post


Link to post
Share on other sites
pmg

> Pus o código anterior de ajuda neste programa e pus como

> comentário, e a minha dúvida. Se puderes explicar e apagar

> o meu código que está mal e aplicar esse ficava te muito grato.

Ok, com mais código é mais fácil ter uma visão global do teu programa :D

A parte de explicar vou tentar ...

A parte de apagar o que está mal e aplicar a minha versão, deixo a teu cargo.

> void inserir(PESSOA *inf_pessoa)

> {

>    int op;

>    //char input[3];  //neste caso porquê de ser input[3]?

Porque a minha ideia é usar um array de char em vez do int para controlar a opção.

Sendo um array de char, 3 elementos é o mínimo para poder ter um caracter para a opção propriamente dita (o '7'), um caracter para o ENTER (o fgets() guarda o ENTER), e o terminador da string.

>    printf("\n\n\tNome: ");

>    fflush(stdin);

fflush(stdin); não funciona em todos os compiladores. Só conheço 1 que faz o que tu queres. Se pretenderes compilar o teu programa com outro compilador ou noutro sistema operativo não há garantia que esta instrução funcione.

>    scanf("%99[^\n]",inf_pessoa->nome);

>    printf("\n\tBI: ");

>    fflush(stdin);

>    scanf("%d",&inf_pessoa->bi);

Um número de BI cabe num int?

 

>    do

>    {

>        printf("\n\tInsira a escola a que pertence:\n\t(1)-escola1\n\t(2)-escola2\n\t(3)-escola3\n");

>        printf("\n\tOpcao: ");

>        fflush(stdin);

>        scanf("%d", &op);

>    //for (;:) {    //como ficaria o for e porquê de usar um for?

Bem ... o for() afinal não é preciso. Eu estava a usá-lo em substituição do ciclo "do /*...*/ while".

>    //fgets(input, 3, stdin); //Esta é a forma de fazer o fgets, percebi

>    // switch (input[0]) { //esta instrução não percebi o porquê de ser 0

É 0 para aceder ao primeiro elemento do array `input`.

Se o utilizador escolher a opção 7, o `input` fica com

input[0] == '7';

input[1] == '\n';

input[2] == '\0';

Se o utilizador carregar em ENTER sem escolher nenhuma opção, o `input` fica com

input[0] == '\n';

input[1] == '\0';

input[2] == irrelevante;

>        switch(op)

>        {

>            case 1:

Usando fgets() e switch(input[0]) os cases não são inteiros: são caracteres. Por isso precisas de mudar para

          case '1':

>                inf_pessoa->escola=escola1;

>            break;

>           

>            case 2:

          case '2':

>                inf_pessoa->escola=escola2;

>            break;

>     

>            case 3:

          case '3':

>                inf_pessoa->escola=escola3;

>            break;

>             

>            default:

>                system("cls"); 

>                printf("\tOpcao Invalida!\n"); 

Não tens break no default. Sem o break ele faz também a opção do case '\n'. Acrescenta um break ou troca a ordem dos cases.

>            case '\n':

>                printf("\ninsira uma opcao valida!");

>          break;

>      }

>    return 0;

? ? ?

return 0; já? tão cedo? e o resto da função? Não é para executar? :)

>    }while(op!=1 && op!=2 && op!=3);

>   

>   

>    printf("\n\tData de Nascimento: ");

>    fflush(stdin);

>    scanf("%d",&inf_pessoa->data_nasc);

A data de nascimento cabe num int?

> }


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
killer_joe

Obrigado por essa grande ajuda, vou então experimentar essas alterações, mais logo meto aqui como correu e o código:)

O compilador que uso é o devc++, costumo pôr o fflush (stdin) para limpar a memória se não, por vezes, não mostrava o scanf.

Pois, tens razão quando dizes se o bi cabe num inteiro. devia de mudar isso, porque o utilizador não pode pôr mais de 8 números para o bi. Ainda não sei bem como fazer essa parte do bi. Na data é que estava a pensar pedir o dias, mes e ano, porque se o utilizador se engana a meter uma data tem que dar erro, por exemplo o caso de Fevereiro, quando o ano é bissexto.

Bem, vou então fazer as alterações ao código, espero conseguir... Com a tua explicação já percebi a forma de utilizar o array.. vamos lá ver :P

Share this post


Link to post
Share on other sites
killer_joe

Boas.. Tive aqui a testar uma melhor forma para dar mensagem de erro quando faço enter e não escolho nenhuma opção.

ponho 

char op;

e retiro o scanf ("%c",&op); e ponho op=getch();

Parece ser uma melhor opção. :cheesygrin:

ou seja:

(...)

op=getch();

    switch(op)

    {

      case '1':

(....)

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
Sign in to follow this  

×

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.