How to make a menu repeat itself until a variable option?

Asked

Viewed 315 times

0

I am making a program in C++ that must generate three numbers and organize them according to the user’s choice, two options are provided and he must choose one, but I don’t know how to make the menu ask for a valid choice and give the options again if the user chooses an invalid option, I tried to use while and while, but only got him to read the variable again and execute the sort. This is the code without my attempts with the loop of repetition:

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

int main(void){
    setlocale(LC_ALL,"");
    int x,y,z,escolha;
    printf("Digite três valores inteiros para X, Y e Z\n");
    scanf ("%d", &x);
    printf("X é igual a: %d\n",x);
    scanf("%d", &y);
    printf("Y é igual a: %d\n",y);
    scanf("%d", &z);
    printf("Z é igual a: %d\n",z);
    printf("Escolha uma das ordenações: \n1-Ordem não decrescente;\n2-Ordem não crescente.");
    scanf("%d", &escolha);
    switch (escolha){
        case 1:
        printf("Odernação escolhida: Não decrescente.\n");
            // Quando X e Y > Z
            if ((x>y) && (y>z) || (y>x) && (x>z)){
                printf("Em ordem não decrescente, temos: Z (%d), Y (%d) e X (%d).\n",z,y,x);
            }
            // Quando X e Z > Y
            else if ((x>z) && (z>y) || (z>x) && (x>y)){
                printf("Em ordem não decrescente, temos: Y (%d), Z (%d) e X (%d).\n",y,z,x);
            }
            // Quando Y e Z > X
            else if ((y>z) && (z>x) || (z>y) && (y>x)){
                printf("Em ordem não decrescente, temos: X (%d), Z (%d) e Y (%d).\n",x,z,y);
            }
        break;
        case 2:
        printf("Odernação escolhida: Não crescente.\n");
            // Quando X e Y < Z
            if ((x<y) && (y<z) || (y<x) && (x<z)){
            printf("Em ordem não crescente, temos: Z (%d), Y (%d) e X (%d).\n",z,y,x);
            }
            // Quando X e Z < Y
            else if ((x<z) && (z<y) || (z<x) && (x<y)){
            printf("Em ordem não crescente, temos: Y (%d), Z (%d) e X (%d).\n",y,z,x);
            }
            // Quando Y e Z < X
            else if ((y<z) && (z<x) || (z<y) && (y<x)){
            printf("Em ordem não crescente, temos: X (%d), Z (%d) e Y (%d).\n",x,z,y);
            }
        break;
        default:
        printf("Opção inválida, tente novamente\n");
    }

    return 0;
    system("PAUSE");
}

1 answer

1

Normally for situations like this, we use a loop, while the option is invalid the menu is displayed again.


We can choose to do this with the do/while, which will display the menu once and if the option is invalid, it will be displayed again:

#include <iostream>

int main() {
  int escolha;
  int invalido;

  do {
    printf("Opções 1, 2 ou 3:\n");
    scanf("%d", &escolha);
    invalido= 0;

    switch(escolha) {
      case 1:
        printf("Opção 1");
        break;
      case 2:
        printf("Opção 2");
        break;
      case 3:
        printf("Opção 3");
        break;
      default:
        printf("Opção inválida\n");
        invalido= 1;
        break;
    }
  } while (invalido);

  return 0;
}

See online: https://repl.it/@Dadinel/OrdinaryUnkemptDecimals

Browser other questions tagged

You are not signed in. Login or sign up in order to post.