Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda Num Programinha


rodfraga

Pergunta

Galera, aí está o primeiro código:

import java.io.*;

public class transf {

	public static final int GRAUS = 90;
	public static final int GRADOS = 100;
	public static int result;
	private static boolean emgraus(int auxgrados) {
  	result = (GRAUS * auxgrados) / GRADOS;
  	System.out.println("São " + result + " graus!");
  	return true;
	}
	private static boolean emgrados(int auxgraus) {
  	result = (GRADOS * auxgraus) / GRAUS;
  	System.out.println("São " + result + " grados!");
  	return true;
	}
	public static void main(String a[]){
  int x;
  int z;
  while (x!=0){
  	System.out.println("1 para graus - grados, 2 para grados - graus e 0 para sair!");
  	try{
    x = System.in.read();
  	} catch (IOException ioe) {
    System.out.println("Excessao: " + ioe);
  	}
  	if (x!=0){
    if (x==1){
    	System.out.println("Digite o correspondente em graus.");
    	try{
      z = System.in.read();
    	} catch (IOException ioe) {
      System.out.println("Excessao: " + ioe);
    	}
    	emgrados(z);
    } else if (x==2){
    	System.out.println("Digite o correspondente em grados.");
    	try{
      z = System.in.read();
    	} catch (IOException ioe) {
      System.out.println("Excessao: " + ioe);
    	}
    	emgraus(z);
    }      
  	} else {
    System.exit(0);
  	}
  }
	}
}

Nesse código, ele aponta que as variáveis x e y não foram inicializadas. Realmente, creio que seja um erro, já que o primeiro if não pode ser realizado(porém no C++ eu consegui fazer isso). Inicializei o x com um valor qualquer então(3 por exemplo). Aí, ele reclama do z. Só pra testar(sabendo que não rodaria de uma maneira correta) inicializei o z com o 3 também. Então rodou. Porém, não funcionou nem perto da maneira correta. Ele fica dando loops na primeira sentença("1 para bla-bla, 2 para bla-bla e 0para sair"). Qualquer número que eu forneça ele escreve 3 vezes essa frase na tela. Talvez o método exit da classe System esteja errado, não tenho certeza(acho que não). Mas eu acho que o erro está no System.in.read() e em outra parte do programa.

Já que não consegui achar o erro, alguém pode me ajudar?

Valeu pela atenção galera!

Rodrigo

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Sim você não pode declarar a variável no metodo main sem inicializa-la ou deixala Statica.

Esse código ta bem doido..hehehe você abre o if(X!=0) e logo dentro desse if já outro if.... sem {}

esse while(x!=0) então enquanto não for 0 ele vai ficar imprimindo isso

System.out.println("1 para graus - grados, 2 para grados - graus e 0 para sair!");

e nunca vai passar ao ouytro loop , porque não tem nada que faça ele ir para lá, só se for digitado 0 certo?? ta bem estranha essa lógica , você pode melhora-la....

tente separar melhor as coisas os ifs, ou use um switch case...

tipo faça o while (X!=0){

if (x==1){

System.out.println("Digite o correspondente em graus.");

try{

z = System.in.read();

} catch (IOException ioe) {

System.out.println("Excessao: " + ioe);

}

else if(

e etc...

}

Link para o comentário
Compartilhar em outros sites

  • 0

eis o codigo corrigido:

import java.io.*;

public class Transf {

public static final int GRAUS = 90;
public static final int GRADOS = 100;
public static int result;

private static boolean emgraus(int auxgrados) {
	result = (GRAUS * auxgrados) / GRADOS;
	System.out.println("São " + result + " graus!");
	return true;
}

private static boolean emgrados(int auxgraus) {
	result = (GRADOS * auxgraus) / GRAUS;
	System.out.println("São " + result + " grados!");
	return true;
}

// A criacao de uma tabela de codigos
// facilita muito a leitura final do source.

public static final int MENU_SAIR    = 0;
public static final int MENU_GRAU    = 1;
public static final int MENU_GRADO   = 2;

public static final int NAO_DEFINIDO = 4;
public static final int ERRO         = 5;

public static void main(String a[]){
	int x = NAO_DEFINIDO;
	int z = 1;
	BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

	while (x != MENU_SAIR && x!= ERRO){
  System.out.println("1 para graus - grados, 2 para grados - graus e 0 para sair!");
  try{
  	x = Integer.parseInt(bf.readLine());
  } catch (Exception ioe) {
  	System.out.println("Excessao: " + ioe);
  	x = ERRO;
  }

  if (x == MENU_SAIR || x == ERRO){
  	System.exit(0);
  }

  if (x == MENU_GRAU){
  	System.out.println("Digite o correspondente em graus.");
  	
  	try{
    z = Integer.parseInt(bf.readLine());
  	} catch (Exception ioe) {
    System.out.println("Excessao: " + ioe);
  	}
  	emgrados(z);

  } else if (x==MENU_GRADO){
  	System.out.println("Digite o correspondente em grados.");
  	try{
    z = Integer.parseInt(bf.readLine());
  	} catch (Exception ioe) {
    System.out.println("Excessao: " + ioe);
  	}
  	emgraus(z);
  }      
	}
}

}

Alterei todos as chamadas para o read().

Alem disso, corrigi o nome da classe, que estava em minusculo. smile.gif

falou!

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu iSoron, vou rodar aqui. Mas eu tenho uma mania de querer que o código final seja meu sabe, copiar o que os outros fazem não é jeito de aprender na minha opinião.

Eu queria apenas que vocês me explicassem o porque do erro. sad.gif

Eu fiz o seguinte código para não precisar inicializar o x nem o y:(antes de ler o do iSoron.

import java.io.*;
import transf.transf2;

public class transf2u {
	public static void main(String a[]) throws IOException {
  transf2 gg = new transf2();
  int x;
  int y;
  do {
  	System.out.println("1 para grados-graus, 2 para graus-grados e 0 para sair");
  	x = System.in.read();
  	if (x==1){
    System.out.println("Digite o auxiliar em grados.");
    y = System.in.read();
    gg.emgraus(y);
  	} else if (x==2){
    System.out.println("Digite o auxiliar em graus");
    y = System.in.read();
    gg.emgrados(y);
  	} else if (x==0) {
    System.exit(0);
  	}
  } while (x!=0);  	
	}
}
Sendo que na classe transf2, estão os métodos emgrados e emgraus, assim como as constantes graus e grados. Porém ele continua dando aquele loop irritante. Fiz também com switch e deu na mesma. Percebi que o erro está no System.in.read(), já que fiz o seguinte teste:
import java.io.*;

public class testeIOS{
	public static void main(String a[]) throws IOException {
  int x;
  	x = System.in.read();
  	System.out.println(x);
	}
}

E digitando 1, ele retorna 49. dry.gif

O que há de errado? É errado usar o System.in.read()?

Bem, vou ler o código do iSoron, mas se alguém puder me explicar as perguntas a cima ficarei agradecido. tongue.gif

Obrigado

Rodrigo

EDITADO:

Li sobre isso na documentação da Sun e entendi um pouco. P System.in.read() retorna em bytes, ou algo assim, certo? É que como vocês podem ver eu sou novo no café. tongue.gif

Fiz o meu código e agora deu certo. biggrin.gif E o código ficou menor biggrin.gif

Agora me digam... Faz diferença utilizar a instrução throws no início do método em vez de usar blocos try...catch?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

Foi mal não ter comentado mais sobre o codigo ontem, é que estava sem tempo. Como já tinha conseguido fazer funcionar, postei logo. tongue.gif

Esclarecendo: conforme documentação, o método read() lê somente bytes. Não que eles sejam inuteis, mas, nesse caso, são incovenientes, no minimo! tongue.gif Ficar convertendo de byte pra inteiro, string, float não é nada pratico. Já o BufferedReader nos oferece um leque bem maior de metodos para ler o console (ok, exagerei... só tem 1 metodo a mais). Não sei se são todos, mas eu prefiro ler tudo como String e dpois converter. Pra fazer isso, basta usar o metodo readLine().

Só um detalhe: se voce digitar no menu um numero de 3 algarismos, ele vai imprimir na tela 4 linhas. Uma para cada algarismo e outra para o Enter. Já o .readLine() não traz o Enter. Bem melhor!

A diferença entre usar um try catch para um throw é a seguinte: no primeiro, você capturou o erro (catch). Nessa captura, você pode especificar o que fazer. No segundo método, você passou o erro pra frente, pra classe que chamou esse metodo. Se ela souber cuidar do erro, ótimo. Senão, o erro pode ficar pulando de mao em mao até estourar numa classe despreparada e fazer seu programa morrer rapidinho. então, o melhor a fazer é capturar e tratar o erro o quanto antes, a menos que você trabalhe pra Microsoft. biggrin.gif

Té +!

ps.: O método read() retorna um numero inteiro, ainda que leia um byte. Para fazer essa conversão, é utilizada a tabela ASCII. Por essa tabela, o caractere '1' possui código 49. Se quiser consultar a tabela inteira, www.asciitable.com.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...