Ir ao conteúdo
  • Cadastre-se

C++ Alternativa ao comando goto


Posts recomendados

Fala pessoal, de boa? 

Estou fazendo uns exercícios que o professor passou e tem um cujo o enunciado é o seguinte: 

8) Receber valores de base e altura de um triângulo e verificar se são valores válidos (positivos). Em caso afirmativo, calcular a área do triângulo.

No caso, ele nos instruiu a fazer todos os exercícios dessa lista usando estrutura de decisão if. 

Eu fiz tudo certinho e tal (eu acho né) só que caso o usuário coloque valores negativos na entrada de dados, ele exibe uma mensagem de erro e fecha o programa. Pra contornar isso, eu usei o comando goto pra fazer voltar pro início, mas me disseram que não é bom usar esse tipo de comando. Aí queria saber alguma alternativa. Dei uma pesquisada da internet e vi algumas soluções com estrutura de repetição, mas como essa lista é pra exercícios com if, acabei nem me aventurando. Enfim, o código é esse:

 

float b=0, h=0;
	cout<<"Programa para calcular a area do triagulo. Entre com valores positivos.\n";
	inicio:
	cout<<"Digite em sequencia a base e depois a altura.\n";
	cin>> b;
	cin>> h;
	if ((b>0)&&(h>0)){
		b=(b*h)/2;
		cout<<"A area do triangulo eh: " << b << endl;
	}
	else{
		cout<<"Dados inseridos invalidos, insira novamente.\n";
		goto inicio;
	}
	system("PAUSE");
	return 0;

Tem como fazer ele voltar pro inicio sem utilizar o goto? Obrigado!

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Acho que a ideia seria essa:

package main

import "fmt"

func main() {
	var b float32 = -1;
	var h float32 = -1;
	var maxTry int = 3;
	var try int = 0;

	for(((b < 0) || (h < 0)) && (try < maxTry)) {
		fmt.Print("Digite o valor da base: ");
		fmt.Scanln(&b);
		fmt.Print("Digite o valor da altura: ");
		fmt.Scanln(&h);
		try++;
		if(((b < 0) || (h < 0)) && (try < maxTry)) {
			fmt.Print("Dados invalidos - ");
			fmt.Println(try);
		}
	}

	if(try < maxTry) {
		try = 0;
		b = (b*h) / 2;
		fmt.Println("Area: ", b);
	} else {
		fmt.Println("Erro !");
	}
}

Se for proibido usar for ... teria como fazer com recursividade:

package main

import "fmt"

func calcArea(try int, maxTry int) bool {
	var b float32 = -1;
	var h float32 = -1;
	var rsp bool = false;
	try++;
	if(try <= maxTry) {
		fmt.Print("Digite o valor da base: ");
		fmt.Scanln(&b);
		fmt.Print("Digite o valor da altura: ");
		fmt.Scanln(&h);
		if((b < 0) || (h < 0)) {
			fmt.Print("Dados invalidos - ");
			fmt.Println(try);
			rsp = calcArea(try, maxTry);
		} else {
			b = (b*h) / 2;
			fmt.Println("Area: ", b);
			rsp = true;
		}
	}
	return rsp;
}

func main() {
	var maxTry int = 3;
	var try int = 0;
	var rsp bool = calcArea(try, maxTry);
	if(rsp) {
		fmt.Println("Ok");
	} else {
		fmt.Println("Erro");
	}
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Marcelo Maciel de Castro    muito bom o código do  @Plástico Bolha   ,  mas é bem avançado para quem é iniciante ,  então você pode usar um mais simples , assim  :

#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
int main(){
    float b=0, h=0;
    int flag;
	cout<<"Programa para calcular a area do triagulo. Entre com valores positivos.\n";
	//inicio:
	do{
            flag=0;
	    cout<<"Digite A Base   .";
	    cin>> b;
	    cout<<"Digite A Altura .";
	    cin>> h;
	    if ((b>0)&&(h>0)){
		    b=(b*h)/2;
		    cout<<"A area do triangulo eh: " << b << endl;
	    }
	    else{
		    cout<<"Dados inseridos invalidos, insira novamente.\n";
		    //goto inicio;
		    flag=1;
	    }
	    cout<<"     Tecle !"<<endl;
	    getch();
	}while(flag!=0);
	return 0;
}

 

  • Curtir 1
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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!