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

killer_joe

[Ajuda] Menu em C

6 mensagens neste tópico

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);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

> 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?

> }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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':

(....)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora