How do I insert a menu?

Asked

Viewed 82 times

0

To with a project, and the final part of it is inserting the menu of choice for user.

I will leave the original code, because of several attempts, all were unsuccessful. Even includes the case, switch.

How would be the insertion of the menu inside the code, because already exists the command of printf, would only need to replace.

How do I insert this part here:

printf("\n 1 - Inserir Mensagem ");
printf("\n 2 - Ver mensagem Criptografada ");
printf("\n 3 - Ver Mensagem Descriptografada ");
printf("\n 4 - Fechar Programa ");
printf("\n\nEscolha-----------\n--------uma-------\n------------opcao: ");
scanf("%d",&escolha);

In that code here:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define tam 250


typedef struct{
    char mensagem[tam];


}urna;

void criptografa(urna *criptografia);
void descriptografar(urna *cripto);

void criptografa(urna *cripto) {
    printf("Insira sua mensagem: ");
    gets(cripto->mensagem);



    int m;
    for(m = 0; m < strlen(cripto->mensagem); m++)
    {
        if(cripto->mensagem[m] >= 65 && cripto->mensagem[m] <= 90)
        {
            cripto->mensagem[m] = cripto->mensagem[m] + 3;

            if (cripto->mensagem[m] > 90)
                cripto->mensagem[m] = cripto->mensagem[m] - 26;
        }

        else if(cripto->mensagem[m] >= 97 && cripto->mensagem[m] <= 122)
        {
            cripto->mensagem[m] = cripto->mensagem[m] + 3;

            if (cripto->mensagem[m] > 122)
                cripto->mensagem[m] = cripto->mensagem[m] - 26;
        }

        else if(cripto->mensagem[m] >= 48 && cripto->mensagem[m] <= 57)
        {
            cripto->mensagem[m] = cripto->mensagem[m] - 5;

            if (cripto->mensagem[m] < 48)
                cripto->mensagem[m] = cripto->mensagem[m] + 10;
        }
    }

    printf("\nMensagem criptografada: ");
    printf("%s ", cripto->mensagem);
    printf("\n");
}

void descriptografar(urna *cripto) {

    int m;
    for(m = 0; m < strlen(cripto->mensagem); m++)
    {
        if(cripto->mensagem[m] >= 65 && cripto->mensagem[m] <= 90)
        {
            cripto->mensagem[m] = cripto->mensagem[m] - 3;

            if (cripto->mensagem[m] < 65)
                cripto->mensagem[m] = cripto->mensagem[m] + 26;
        }

        else if(cripto->mensagem[m] >= 97 && cripto->mensagem[m] <= 122)
        {
            cripto->mensagem[m] = cripto->mensagem[m] - 3;

            if (cripto->mensagem[m] < 97)
                cripto->mensagem[m] = cripto->mensagem[m] + 26;
        }

        else if(cripto->mensagem[m] >= 48 && cripto->mensagem[m] <= 57)
        {
            cripto->mensagem[m] = cripto->mensagem[m] + 5;

            if (cripto->mensagem[m] > 57)
                cripto->mensagem[m] = cripto->mensagem[m] - 10;
        }
    }

    printf("\nMensagem original: ");
    printf("%s ", cripto->mensagem);
    printf("\n");
}

int main() {
    urna mensagem;
    criptografa(&mensagem);
    descriptografar(&mensagem);
    printf("\n");

    system("pause");
    return 0;
}

3 answers

2

You have the following menu:

printf("\n 1 - Inserir Mensagem ");
printf("\n 2 - Ver mensagem Criptografada ");
printf("\n 3 - Ver Mensagem Descriptografada ");
printf("\n 4 - Fechar Programa ");
printf("\n\nEscolha-----------\n--------uma-------\n------------opcao: ");
scanf("%d",&escolha);

You can reduce it to:

int escolha = 0;

printf("\n 1 - Inserir Mensagem \n 2 - Ver mensagem Criptografada \n 3 - Ver Mensagem Descriptografada \n 4 - Fechar Programa");
printf("\n\nEscolha uma opcao: ");
scanf("%d",&escolha);

Now to reuse the menu, we can create a method and insert the menu into it:

void menuEscolha() {
    int escolha = 0;

    printf("\n 1 - Inserir Mensagem \n 2 - Ver mensagem Criptografada \n 3 - Ver Mensagem Descriptografada \n 4 - Fechar Programa");
    printf("\n\nEscolha uma opcao: ");
    scanf("%d",&escolha);
}

So this function can be initialized in the place you want, for example:

int main() {
    menuEscolha();
}

OBS: Remember that the function void menuEscolha(); should be inserted before the location you will use using the above example:

void menuEscolha() {}

int main() {
    menuEscolha();
} 

NOTE:

Then the value of the attribute escolha should be used, as you did not detail your question, explaining "what?" and "as?" should really be done with this menu, I finish my answer here.

1

Greetings

Probably what is missing from your source code is the correct initialization of the message variable.

In C, when you want to create a variable of a structure type it is necessary to request the dynamic allocation of that data type. There’ll be something like this.

    urna* mensagem = (urna*) malloc(sizeof(urna));

where urn* means that you want to create a pointer to the urn type, message is the variable name (urn*) is a cast for C to know that the data type allocated is pointer to urn, and the malloc that will allocate the amount of bytes in memory referring to the type of data passed as parameter.

Without doing malloc you are probably getting a Segmentation fault!

The other details, as the pointer is being dynamically allocated when calling the encryption and decryption functions will not need to put the & before variable name, will look something like this:

      criptografa(mensagem);

Good luck with your exercise, any questions put there!

  • Note that in C (not C++) you don’t have to cast, it’s actually recommended that you don’t.

0

Hello, all right?

A menu can be easily implemented using the do-while and switch structures.

To improve readability, I recommend creating a specific function to read the message and insert it into the ballot box, for example:

void lerMensagem(urna* cripto){
    printf("Insira sua mensagem: ");
    fgets(cripto->mensagem, sizeof(cripto->mensagem), stdin);
}

Exemplifying, in the proposed scenario, the implemented menu would be as follows:

void menu(urna* cripto){
    int escolha = 0;

    do {
        printf("\n 1 - Inserir Mensagem ");
        printf("\n 2 - Ver mensagem Criptografada ");
        printf("\n 3 - Ver Mensagem Descriptografada ");
        printf("\n 4 - Fechar Programa ");
        printf("\n\nEscolha-----------\n--------uma-------\n------------opcao: ");

        scanf("%d",&escolha);

        switch(escolha){
            case 1: lerMensagem(urna* cripto); break;
            case 2: criptografa(urna* cripto); break;
            case 3: descriptografar(urna* cripto); break;
            case 4: exit(0); break;
            default: printf("\nOpção invalida, tente novamente.\n\n"); break;
        }
    } while(1);
}

already in main, it would only be necessary to call the menu function by passing the struct as parameter.

int main(){
    urna mensagem;

    menu(&mensagem);

    return 0;
}

Browser other questions tagged

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