Ir ao conteúdo
  • Cadastre-se

C++ Retornar a um menu


heitorfarias_

Posts recomendados

Olá, bom dia, estou com a seguinte dúvida, é possível usar um goto dentro de uma função para retornar ao código fonte?

 

 

ex: 

#include <iostream>
#include <stdlib.h>
  
using namespace std;

void Calc();

int main (void ){
inicio: 
Calc();
  
  
return 0;
}

void Calc(){
  
 int n1, n2, op=0;
 cout << "Digite dois num\n";
 cin >> n1 >> n2;
  
 do {
 cout << "\nGostaria de fazer novamente? (1.Sim 2.Nao)";
 cin >> op;
  if (op==1){
    goto inicio;
  }
 }while (op>2 || op<1)

}

 

Link para o comentário
Compartilhar em outros sites

35 minutos atrás, heitorfarias_ disse:

Olá, bom dia, estou com a seguinte dúvida, é possível usar um goto dentro de uma função para retornar ao código fonte?

Para usar o goto o marcador deve estar na mesma função. Um exemplo do código sem o goto.

 

#include <iostream>
#include <cstdlib>

using namespace std;

int Calc();

int main (void )
{
    int retorno = 1;
    while ( retorno == 1)
    {
        system("cls");
        cout << "\nMenu!";
        retorno = Calc();
    }

    return 0;
}

int Calc()
{
    int n1, n2, op=0;

    do
    {
        cout << "\nDigite dois num\n";
        cin >> n1 >> n2;
        cout << "\nGostaria de fazer novamente? (1.Sim 2.Nao)";
        cin >> op;
        if (op==1)
            return 1;
        else if(op==2)
            return 0;
    }
    while (op>2 || op<1);

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@heitorfarias_ Mostre o código, chamar a função main pode ser um erro, pois é como se você abrisse outro programa.

Se você quer que uma determinada função altere variáveis de outra função ou da função main, você terá que passar essas variáveis como parâmetro da função, ex:

#include <iostream>

using namespace std;

//passa o endereço da variavel
void alteraX(int *x)
{
    *x = 999;
}

int main (void )
{
    int num = 111;
    alteraX(&num);
    cout << "\nNum: " << num;

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@CiroboyBR O Código é esse abaixo, é uma torre de hanoi. 

 

Estou apanhando pra colocar esse "Jogar Novamente".

 

Estou colocando dentro da void Menu(), logo abaixo da verificação de movimentos do jogador. 

 

#include <iostream>
#include <stdlib.h>
#include <math.h> // Para Usar Potencia na verificação

using namespace std;


int cont =0, tamanho =0, dificuldade=0, v1[7]={1,2,3,4,5,6,7}, v2[7]={0,0,0,0,0,0,0}, v3[7]={0,0,0,0,0,0,0};
void test();
void Dificuldade();
void Torres();
void mDiscos();
void Menu();
void instrucoes();
int Novamente();
int vTorre(int Torre[7]);
int dTorre (int Torre[7]);
int Final();


int main (void){
int op=1;
while (op!=3){
cout << "1.Jogar\n2.Instrucoes\n3.Sair\n";
cin >> op;

    switch (op){

        case 1:

            Dificuldade();
            Torres();
            Menu();

        break;
        case 2:
            instrucoes();
            break;
        default:
            if (op!=3){
                cout << "Opcao Invalida.\n";
                system ("PAUSE");
                system ("CLS");
                }
            break;
    }
}
    return 0;

}

int vTorre(int Torre[]){ //Ultimo valor do Vetor
    int   aux=0;
    for (int i=tamanho-1; i>=0; i--){
        if (Torre[i]!=0){
            aux=i;
        }
        if (Torre[tamanho-1]==0){
            aux=0;
        }
    }
    return (aux);
}

int dTorre (int Torre[]){ //Torre Destino
    int   aux=0;
    for (int i=0; i<tamanho; i++){
        if (Torre[i]==0){
            aux =i;
        }
    }
return (aux);
}

void mDiscos(int origem, int destino){
int a,b,c;
    // ORIGEM 11
    if (origem ==1){

        // *DESTINO - TORRE 2
        if (destino ==2){

            a = v1[vTorre(v1)];
            b = v2[dTorre(v2)+1];
            c = v2[vTorre(v2)];
            if (c<a && c != 0){
                cout << "Disco da Origem" << a << "eh maior que o disco do destino " << c;
                system ("PAUSE");

            }else {
                if (a==0){
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }else {

                    v1[vTorre(v1)] = 0;
                    v2[dTorre(v2)] = a;
                    cont++;
                }
            }
            // **DESTINO - TORRE 3
        }else{
            a = v1[vTorre(v1)];
            b = v3[dTorre(v3)+1];
            c = v3[vTorre(v3)];
            if (c<a && c != 0){
                cout << "Disco da Origem" << a << "eh maior que o disco do destino " << c;
                system ("PAUSE");

            }else {
                if (a==0){
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }else {

                    v1[vTorre(v1)] = 0;
                    v3[dTorre(v3)] = a;
                    cont++;
                        }
                    }
                }
            }

        //ORIGEM 2
        if (origem == 2){
                // DESTINO - TORRE 1
                 if (destino ==1){

            a = v2[vTorre(v2)];
            b = v1[dTorre(v1)+1];
            c = v1[vTorre(v1)];
            if (c<a && c != 0){
                cout << "Disco da Origem " << a << " eh maior que o disco do destino " << c;
                system ("PAUSE");

            }else {
                if (a==0){
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }else {

                    v2[vTorre(v2)] = 0;
                    v1[dTorre(v1)] = a;
                    cont++;
                }
            }
        // DESTINO - TORRE 3
        }else{
            a = v2[vTorre(v2)];
            b = v3[dTorre(v3)+1];
            c = v3[vTorre(v3)];
            if (c<a && c != 0){
                cout << "Disco da Origem " << a << "eh maior que o disco do destino " << c;
                system ("PAUSE");

            }else {
                if (a==0){
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }else {

                    v2[vTorre(v3)] = 0;
                    v3[dTorre(v3)] = a;
                    cont++;
                        }
                    }
                }
            }
        // ORIGEM 3
        if (origem ==3){

        // *DESTINO - TORRE 1
        if (destino ==1){

            a = v3[vTorre(v3)];
            b = v1[dTorre(v1)+1];
            c = v1[vTorre(v1)];
            if (c<a && c != 0){
                cout << "Disco da Origem " << a << " eh maior que o disco do destino " << c;
                system ("PAUSE");

            }else {
                if (a==0){
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }else {

                    v3[vTorre(v3)] = 0;
                    v1[dTorre(v1)] = a;
                    cont++;
                }
            }
            // **DESTINO - TORRE 2
        }else{
            a = v3[vTorre(v3)];
            b = v2[dTorre(v2)+1];
            c = v2[vTorre(v2)];
            if (c<a && c != 0){
                cout << "Disco da Origem " << a << " eh maior que o disco do destino " << c;
                system ("PAUSE");

            }else {
                if (a==0){
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }else {

                    v3[vTorre(v3)] = 0;
                    v2[dTorre(v2)] = a;
                    cont++;
                        }
                    }
                }
            }
        Torres();

}


void Menu(){
int origem, destino, teste =0, aux2;

do{
    if (Final()==1){
        aux2 = pow(2,tamanho)-1;
        if (cont == aux2){
            cout << "\nVoce ganhou, sua pontuacao foi: " << cont << " de " << aux2 << ". Excelente!\n\n";


        }else if (cont > aux2 && cont < aux2+5){
            cout << "\nVoce ganhou, sua pontuacao foi: " << cont << " de " << aux2 << ". voce pode melhorar.\n\n";


        }else {
            cout << "\nVoce ganhou, sua pontuacao foi: " << cont << " de " << aux2 << ". Pessimo!\n\n";

        }
        system ("pause");
        system ("CLS");

        if (Novamente()==1){
            main (); // Pergunta para o user se quer jogar novamente.
        }
        else {
            exit(0);
        }

    }


    cout <<"\nQual Torre de Origem ?\n";
    cin >> origem;

    do{
        if (origem <1 || origem >3){
            cout << "\nTorre de origem inexistente.";
            cout <<"\nQual Torre de Origem ?";
            cin >> origem;
        }
    }while(origem <1 || origem >3);

    Torres();
    cout << "\nQual Torre de Destino?\n";
    cin >> destino;
    do {
            if (destino < 1|| destino >3){
                cout << "\nTorre de destino inexistente.";
                cout << "\nQual Torre de Destino?\n";
                cin >> destino;
            }
            if (destino == origem){

                cout << "\nA torre destino nao pode ser a mesma que a torre de origem\n";
                cout << "\nQual Torre de Destino?\n";
                cin >> destino;

            }
    }while (destino <1 || destino >3 || destino == origem);

    mDiscos(origem, destino);

}while (teste!=1);


}

void Dificuldade(){

system ("CLS");
do{
cout << "Qual Dificuldade?\n";
cout << "1.fácil(3 Discos)\n2.Normal(5 Discos)\n3.difícil(7 Discos)\n\nDigite: ";
cin >> dificuldade;
}while (dificuldade < 1 || dificuldade > 3);
    switch (dificuldade){
        case 1:
            tamanho = 3;
        break;
        case 2:
            tamanho = 5;
        break;
        case 3:
            tamanho = 7;
        break;
    }
}

void Torres(){ // Imprime "Torres"
system("CLS");
    for (int i=0; i < tamanho; i++){
    cout << "|" << v1[i] << "|" << "\t|"<< v2[i] << "|" << "\t|" << v3[i]<< "|\n";
    }
    cout << "\nNumero de jogadas:";
    if (cont < 10){
        cout << ""<<cont;
    }else {
        cout << "\n" << cont;
    }

}

int Final(){
int opc =0;
    if (v3[0]==1){
    opc =1;
}
    return (opc);
}

int Novamente (){

int op2 = 0;
do{
cout << "Gostaria de Jogar novamente?\t(1.Sim 2.Nao)\nDigite: ";
cin >> op2;
if (op2==1){
    return 1;
}
else if (op2 ==2){
    return 0;
}
}while (op2>2 || op2 <1);

}


void instrucoes(){

system ("CLS");
cout << "O objetivo deste jogo consiste em deslocar todos os discos da haste onde se encontram para uma haste diferente,\n";
cout << "respeitando as seguintes regras:\n";
cout << "1.deslocar um disco de cada vez, o qual devera ser o do topo de uma das tres hastes\n";
cout << "2.cada disco nunca poderá ser colocado sobre outro de diametro mais pequeno.\n\n";
system ("PAUSE");
system ("CLS");

}

 

Link para o comentário
Compartilhar em outros sites

@heitorfarias_ Como eu citei anteriormente, ao chamar a função main() você acaba por iniciar um programa novo do zero. veja o exemplo:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>

using namespace std;

int Calc();

int main (void )
{

   for ( int i = 1; i < 5000; i++)
    {
        cout << "\nChamada: " << i;
        Calc();
    }
    getchar();
    return 0;
}

int Calc()
{
    cout << "  -Calc" ;
    return main();
}

O ideal, excetuando-se programas recursivos, é que se utilize dos retornos para voltar a função pai:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>

using namespace std;

int Calc();

int main (void )
{

   for ( int i = 1; i < 5000; i++)
    {
        cout << "\nChamada: " << i;
        Calc();
    }
    getchar();
    return 0;
}

int Calc()
{
    cout << "  -Calc" ;
    return 0;
}

 

 

Abaixo eu fiz umas alterações no seu código, especificamente nas funções menu(), Novamente() e main().

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <math.h> // Para Usar Potencia na verificação

using namespace std;


int cont =0, tamanho =0, dificuldade=0, v1[7]= {3,2,1,4,5,6,7}, v2[7]= {0,0,0,0,0,0,0}, v3[7]= {0,0,0,0,0,0,0};
void test();
void Dificuldade();
void Torres();
void mDiscos();
bool Menu();
void instrucoes();
int Novamente();
int vTorre(int Torre[7]);
int dTorre (int Torre[7]);
int Final();


int main (void)
{
    int op=1;
    bool termina = false;
    while (op!=3)
    {
        //se o menu retornar verdadeiro termina a função main
        if (termina == false)
        {

            cout << "1.Jogar\n2.Instrucoes\n3.Sair\n";
            cin >> op;

            if(op == 1)
            {

                Dificuldade();
                Torres();
                //termina recebe o retorno da fução menu
                termina = Menu();
            }
            else if(op == 2)
            {
                instrucoes();
            }
            else if (op == 3)
            {
                return 0;
            }
            else
            {
                cout << "Opcao Invalida.\n";
                system ("PAUSE");
                system ("CLS");
            }
        }
        else {break;}
    }

    return 0;

}

int vTorre(int Torre[])  //Ultimo valor do Vetor
{
    int   aux=0;
    for (int i=tamanho-1; i>=0; i--)
    {
        if (Torre[i]!=0)
        {
            aux=i;
        }
        if (Torre[tamanho-1]==0)
        {
            aux=0;
        }
    }
    return (aux);
}

int dTorre (int Torre[])  //Torre Destino
{
    int   aux=0;
    for (int i=0; i<tamanho; i++)
    {
        if (Torre[i]==0)
        {
            aux =i;
        }
    }
    return (aux);
}

void mDiscos(int origem, int destino)
{
    int a,b,c;
    // ORIGEM 11
    if (origem ==1)
    {

        // *DESTINO - TORRE 2
        if (destino ==2)
        {

            a = v1[vTorre(v1)];
            b = v2[dTorre(v2)+1];
            c = v2[vTorre(v2)];
            if (c<a && c != 0)
            {
                cout << "Disco da Origem" << a << "eh maior que o disco do destino " << c;
                system ("PAUSE");

            }
            else
            {
                if (a==0)
                {
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }
                else
                {

                    v1[vTorre(v1)] = 0;
                    v2[dTorre(v2)] = a;
                    cont++;
                }
            }
            // **DESTINO - TORRE 3
        }
        else
        {
            a = v1[vTorre(v1)];
            b = v3[dTorre(v3)+1];
            c = v3[vTorre(v3)];
            if (c<a && c != 0)
            {
                cout << "Disco da Origem" << a << "eh maior que o disco do destino " << c;
                system ("PAUSE");

            }
            else
            {
                if (a==0)
                {
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }
                else
                {

                    v1[vTorre(v1)] = 0;
                    v3[dTorre(v3)] = a;
                    cont++;
                }
            }
        }
    }

    //ORIGEM 2
    if (origem == 2)
    {
        // DESTINO - TORRE 1
        if (destino ==1)
        {

            a = v2[vTorre(v2)];
            b = v1[dTorre(v1)+1];
            c = v1[vTorre(v1)];
            if (c<a && c != 0)
            {
                cout << "Disco da Origem " << a << " eh maior que o disco do destino " << c;
                system ("PAUSE");

            }
            else
            {
                if (a==0)
                {
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }
                else
                {

                    v2[vTorre(v2)] = 0;
                    v1[dTorre(v1)] = a;
                    cont++;
                }
            }
            // DESTINO - TORRE 3
        }
        else
        {
            a = v2[vTorre(v2)];
            b = v3[dTorre(v3)+1];
            c = v3[vTorre(v3)];
            if (c<a && c != 0)
            {
                cout << "Disco da Origem " << a << "eh maior que o disco do destino " << c;
                system ("PAUSE");

            }
            else
            {
                if (a==0)
                {
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }
                else
                {

                    v2[vTorre(v3)] = 0;
                    v3[dTorre(v3)] = a;
                    cont++;
                }
            }
        }
    }
    // ORIGEM 3
    if (origem ==3)
    {

        // *DESTINO - TORRE 1
        if (destino ==1)
        {

            a = v3[vTorre(v3)];
            b = v1[dTorre(v1)+1];
            c = v1[vTorre(v1)];
            if (c<a && c != 0)
            {
                cout << "Disco da Origem " << a << " eh maior que o disco do destino " << c;
                system ("PAUSE");

            }
            else
            {
                if (a==0)
                {
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }
                else
                {

                    v3[vTorre(v3)] = 0;
                    v1[dTorre(v1)] = a;
                    cont++;
                }
            }
            // **DESTINO - TORRE 2
        }
        else
        {
            a = v3[vTorre(v3)];
            b = v2[dTorre(v2)+1];
            c = v2[vTorre(v2)];
            if (c<a && c != 0)
            {
                cout << "Disco da Origem " << a << " eh maior que o disco do destino " << c;
                system ("PAUSE");

            }
            else
            {
                if (a==0)
                {
                    cout << "Torre de origem vazia\n";
                    system ("PAUSE");
                }
                else
                {

                    v3[vTorre(v3)] = 0;
                    v2[dTorre(v2)] = a;
                    cont++;
                }
            }
        }
    }
    Torres();

}


bool Menu()
{
    int origem, destino, teste =0, aux2;

    do
    {
        if (Final()==1)
        {
            aux2 = pow(2,tamanho)-1;
            if (cont == aux2)
            {
                cout << "\nVoce ganhou, sua pontuacao foi: " << cont << " de " << aux2 << ". Excelente!\n\n";


            }
            else if (cont > aux2 && cont < aux2+5)
            {
                cout << "\nVoce ganhou, sua pontuacao foi: " << cont << " de " << aux2 << ". voce pode melhorar.\n\n";


            }
            else
            {
                cout << "\nVoce ganhou, sua pontuacao foi: " << cont << " de " << aux2 << ". Pessimo!\n\n";

            }
            system ("pause");
            system ("CLS");

            //se escolher jogar novamente retorna para a função que chamou essa.
            if (Novamente()==1)
            {
                return false; // Pergunta para o user se quer jogar novamente.
            }
            else //Se nao quiser repetir termina tudo;
            {
                return true;
            }

        }


        cout <<"\nQual Torre de Origem ?\n";
        cin >> origem;

        do
        {
            if (origem <1 || origem >3)
            {
                cout << "\nTorre de origem inexistente.";
                cout <<"\nQual Torre de Origem ?";
                cin >> origem;
            }
        }
        while(origem <1 || origem >3);

        Torres();
        cout << "\nQual Torre de Destino?\n";
        cin >> destino;
        do
        {
            if (destino < 1|| destino >3)
            {
                cout << "\nTorre de destino inexistente.";
                cout << "\nQual Torre de Destino?\n";
                cin >> destino;
            }
            if (destino == origem)
            {

                cout << "\nA torre destino nao pode ser a mesma que a torre de origem\n";
                cout << "\nQual Torre de Destino?\n";
                cin >> destino;

            }
        }
        while (destino <1 || destino >3 || destino == origem);

        mDiscos(origem, destino);

    }
    while (teste!=1);


}

void Dificuldade()
{

    system ("CLS");
    do
    {
        cout << "Qual Dificuldade?\n";
        cout << "1.fácil(3 Discos)\n2.Normal(5 Discos)\n3.difícil(7 Discos)\n\nDigite: ";
        cin >> dificuldade;
    }
    while (dificuldade < 1 || dificuldade > 3);
    switch (dificuldade)
    {
    case 1:
        tamanho = 3;
        break;
    case 2:
        tamanho = 5;
        break;
    case 3:
        tamanho = 7;
        break;
    }
}

void Torres()  // Imprime "Torres"
{
    system("CLS");
    for (int i=0; i < tamanho; i++)
    {
        cout << "|" << v1[i] << "|" << "\t|"<< v2[i] << "|" << "\t|" << v3[i]<< "|\n";
    }
    cout << "\nNumero de jogadas:";
    if (cont < 10)
    {
        cout << ""<<cont;
    }
    else
    {
        cout << "\n" << cont;
    }

}

int Final()
{
    int opc =0;
    if (v3[0]==1)
    {
        opc =1;
    }
    return (opc);
}

int Novamente ()
{

    int op2 = 0;
    do
    {
        cout << "Gostaria de Jogar novamente?\t(1.Sim 2.Nao)\nDigite: ";
        cin >> op2;
        if (op2==1)
        {
            return 1;
        }

    }
    while (op2 !=2); //Repete até a opção for 2

  return 0;
}


void instrucoes()
{

    system ("CLS");
    cout << "O objetivo deste jogo consiste em deslocar todos os discos da haste onde se encontram para uma haste diferente,\n";
    cout << "respeitando as seguintes regras:\n";
    cout << "1.deslocar um disco de cada vez, o qual devera ser o do topo de uma das tres hastes\n";
    cout << "2.cada disco nunca poderá ser colocado sobre outro de diametro mais pequeno.\n\n";
    system ("PAUSE");
    system ("CLS");

}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...