Programação Orientada a Objectos - Duvida na comunicação entre entre classe e ClassePrincipal

17 respostas
N

Boa tarde. Será que me podem ajudar neste código?

Estou com um pequeno erro. Tenho o código na classe Paises para pesquisar os dados do país através da introdução da sigla mesmo. O método da classePrincipal recebe os valores por parâmetro da classePrincipal mas esta dá-me erro na linha de código (que está assinalado com um comentário).

Código na classe Paises:
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Paises {
	//campos
	Pais [] p = new Pais[8];	//array da classe Pais
	Scanner ler = new Scanner(System.in);
	
	//pesquisar países através da sigla
	public int PesquisarSigla(String txt){
		for(int ps=0; ps<8;ps++){
			if(txt.equalsIgnoreCase(p[ps].sigla)){
				return ps;
			}
		}
		return -1;
	}
}
Código na ClassePrincipal
import java.io.IOException;
import java.util.Scanner;

public class ClassePrincipal {

    public static void main(String[] args) throws IOException {
        Scanner ler = new Scanner(System.in);
        int posicao = 0, opcao;
        String txt="";

        // objecto da classe Paises
        Paises p1 = new Paises();
// menu
		do {
			System.out.println("Escolha a opção pretendida:\n" +
					"1 - Pesquisa através da Sigla do País.\n" +
					"2 - Pesquisa através do nome do País.\n" +
					"3 - Total da população.\n" +
					"4 - Listagem de todos os dados.\n" +
					"5 - Sair.");
			
			opcao = Integer.valueOf(ler.nextInt()).intValue();
			switch (opcao) {
				case 1:
					System.out.println("Insira a sigla do País que pretende pesquisar: ");
					txt = ler.next();
					p1.PesquisarSigla(txt);
					if(posicao= p1.PesquisarSigla()<-1){//erro nesta linha. já meti no parâmetro txt, ps e dá sempre erro.
						System.out.println("Sigla: "+p1.p[posicao].sigla+" País: "+p1.p[posicao].nomePais+" População: "+p1.p[posicao].populacao);
					}else{
						System.out.println("Sigla não encontrada!");
					}
				break;
}
}

Fico grato pela vossa ajuda.
Cumprimentos noorders

17 Respostas

robsonsm

que tipo de condição vc quer fazer na linha 28?

N

oOrigado robsonsm!
É isso mesmo :slight_smile:

Abraço :smiley:

N

Ah… Mas falta mais uma coisa…

Se eu escolher a minha opção 1 ou 2 no menu case da ClassePrincipal ele não encontra o país com o nome nem com a sigla, dá o outup em como não existe.
Penso que o erro está nesta linha, só que eu não sei como fazer para receber o return do método PesquisarSigla() para o sitio onde está a variável posição nesta linha:

System.out.println("Sigla: "+p1.p[posicao].sigla+" País: "+p1.p[posicao].nomePais+" População: "+p1.p[posicao].populacao);

Podem ajudar? Abraço

robsonsm

a classe está compilando sem erro?
Seu loop (do) ñ tem o while, como pode estar funcionando?

N

Olá… sim esta a funcionar sem erro.

a instrução que esqueci de colocar era esta:

} while (opcao != 5);

apenas meti no primeiro post as linhas que me estavam a dar problemas, acabei por fechar com os } mas esqueci o while.

robsonsm

os dados estao sendo preenchidos em algum lugar?

N

é melhor mandar o código todo.
Eu mandei eles serem escritos num ficheiro.txt e guardados num array:

ClassePrincipal:
import java.io.IOException;
import java.util.Scanner;

public class ClassePrincipal {

    public static void main(String[] args) throws IOException {
        Scanner ler = new Scanner(System.in);
        int posicao = 0, opcao;
        String txt="";

        // objecto da classe Paises
        Paises p1 = new Paises();

        // menu
        do {
            System.out.println("\nEscolha a opção pretendida:\n" +
                    "1 - Pesquisa através da Sigla do País.\n" +
                    "2 - Pesquisa através do nome do País.\n" +
                    "3 - Total da população.\n" +
                    "4 - Listagem de todos os dados.\n" +
                    "5 - Sair.");
            
            opcao = Integer.valueOf(ler.nextInt()).intValue();
            switch (opcao) {
                case 1:
                    System.out.println("Insira a sigla do País que pretende pesquisar: ");
                    txt = ler.next();
                    if(p1.PesquisarSigla(txt)<-1){
                        System.out.println("Sigla: "+p1.p[posicao].sigla+" País: "+p1.p[posicao].nomePais+" População: "+p1.p[posicao].populacao);
                    }else{
                        System.out.println("Sigla não encontrada!");
                    }
                break;
                case 2:
                    System.out.println("Insira o nome do País que pretende pesquisar: ");
                    txt = ler.next();
                    if(p1.PesquisarNome(txt)>-1){
                        System.out.println("Sigla: "+p1.p[posicao].sigla+" País: "+p1.p[posicao].nomePais+" População: "+p1.p[posicao].populacao);
                    }else{
                        System.out.println("Nome não encontrado!");
                    }
                break;
                case 3:
                    System.out.println("Total da população existente nestes países: "+p1.Calcular());
                break;
                case 4:
                    p1.Listar();
                break;
                case 5:
                    System.out.print("Terminar programa. Xau...");
                    break;
                default:
                    System.out.println("Erro! A opção escolhida não existe!");
                    break;
            }
        } while (opcao != 5);

    }
}
Classe Paises:
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Paises {
    //campos
    Pais [] p = new Pais[8];    //array da classe Pais
    Scanner ler = new Scanner(System.in);

    //construtor
    public Paises() throws IOException {
        //criação do directorio
        File DirectorioPaises = new File("C:\teste");
        DirectorioPaises.mkdir();
        
        //criação do ficheiro
        File Paises = new File(DirectorioPaises,"Países.txt");
        Paises.createNewFile();
        
        FileWriter canalsaida = new FileWriter(Paises);//para escrever no ficheiro paises
        FileReader canalentrada = new FileReader(Paises);//para ler o conteúdo do ficheiro paises
        
        for(int i=0; i<8;i++){
            p[i] = new Pais();
        }
        canalsaida.write(p[0].sigla = "AO");
        canalsaida.write(p[0].nomePais = "Angola");
        canalsaida.write(p[0].populacao = 125313577);
        
        canalsaida.write(p[1].sigla = "BR");
        canalsaida.write(p[1].nomePais = "Brasil");
        canalsaida.write(p[1].populacao = 191908598);
        
        canalsaida.write(p[2].sigla = "CV");
        canalsaida.write(p[2].nomePais = "Cabo Verde");
        canalsaida.write(p[2].populacao = 426998);
        
        canalsaida.write(p[3].sigla ="GB");
        canalsaida.write(p[3].nomePais = "Guiné-Bissau");
        canalsaida.write(p[3].populacao = 1503182);
        
        canalsaida.write(p[4].sigla ="MZ");
        canalsaida.write(p[4].nomePais = "Moçambique");
        canalsaida.write(p[4].populacao = 21284701);
        
        canalsaida.write(p[5].sigla ="PT");
        canalsaida.write(p[5].nomePais = "Portugal");
        canalsaida.write(p[5].populacao = 10676910);
        
        canalsaida.write(p[6].sigla ="ST");
        canalsaida.write(p[6].nomePais = "São Tomé e Príncipe");
        canalsaida.write(p[6].populacao = 206178);
        
        canalsaida.write(p[7].sigla ="TL");
        canalsaida.write(p[7].nomePais = "Timor Leste");
        canalsaida.write(p[7].populacao = 1108777);
        canalsaida.close();
    }
    
    //pesquisar países através da sigla
    public int PesquisarSigla(String txt){
        for(int ps=0; ps<8;ps++){
            if(txt.equalsIgnoreCase(p[ps].sigla)){
                return ps;
            }
        }
        return -1;
    }
    
    //presquisar países através do nome
    public int PesquisarNome(String txt){
        for(int pn=0; pn<8; pn++){
            if(txt.equalsIgnoreCase(p[pn].nomePais)){
                return pn;
            }
        }
        return -1;
    }
    
    //calcular e retornar populacao
    public int Calcular(){
        int tot=0;
        for(int i = 0; i<8; i++){
            tot +=p[i].populacao;
        }
        return tot;
    }
    
    //listar todos os dados
    public void Listar(){
        for(int i=0; i<8;i++){
            System.out.println("Sigla: "+p[i].sigla+" País: "+p[i].nomePais+" População: "+p[i].populacao);
        }
    }
}
Classe Pais:
public class Pais {
    //campos
    public String sigla="";
    public String nomePais="";
    public int populacao=0;
}
robsonsm

a condicao na linha 28 da ClassePrincipal esta invertido, troque por “>”

p1.PesquisarSigla(txt)>-1
N

Já corrigi esse erro (concerteza terei mais), mas seja qual for o nome ou sigla que eu escolha aparecer sempre a informação relativa ao país angola (posição 0 do array p).

robsonsm

colque desta forma na classeprincipal:

posicao = p1.PesquisarSigla(txt); if(posicao>-1){

N

Funciona bem agora.
Obrigadão
robsonsm você percebe muito :wink:

Mais logo, se eu não conseguir acertar bem a escrita dos dados dos países no ficheiro posso perguntar a você? É que fica tudo junto e com caracteres esquisitos e não se percebe nada (método construtor da classe Paises).
Um abraço

N

robsonsm, não se importava de testar esse programa no seu pc (com as correcções que me indicou) e ver o ficheiro de textos (paises.txt) criado no directorio testes no disco C?
É que aquilo fica tudo mal escrito.

Como é que eu poderia fazer para o programa escrever no ficheiro de texto de maneira idêntica à da opção de listagem quando selecionada na classePrincipal?

Abraço

robsonsm
noorders:
robsonsm, não se importava de testar esse programa no seu pc (com as correcções que me indicou) e ver o ficheiro de textos (paises.txt) criado no directorio testes no disco C? É que aquilo fica tudo mal escrito.

Como é que eu poderia fazer para o programa escrever no ficheiro de texto de maneira idêntica à da opção de listagem quando selecionada na classePrincipal?

Abraço

Pelo q percebi ele coloca "?" no lugar de um valor int, vc pode converter ele la dentro.
Para quebrar alinha vc pode utilizar "\r\n" como no exemplo abaixo.
Adapte como preferir.

String quebra = "\r\n";
canalsaida.write("Sigla: ");  
canalsaida.write((p[0].sigla = "AO"));  
canalsaida.write("  País: "); 
canalsaida.write(p[0].nomePais = "Angola"); 
canalsaida.write("  População: "); 
canalsaida.write(String.valueOf(p[0].populacao = 125313577));  
canalsaida.write(quebra); 

canalsaida.write("Sigla: ");  
canalsaida.write((p[1].sigla = "BR"));  
...

obs: vc está atribuindo o valor aos atributos do objetos ao mesmo tempo que passa como parametro para o metodo write,
por isso que os objetos estao vindo la na classe principal e nao por estar lendo o arquivo gerado, ou seja, vc ñ está utilizando "canalentrada" em momento algum.

N

Suas dicas funcionaram na perfeição :wink:

Realmente não estou usando ao canalentrada.
Acha que o deveria usar? Se sim onde e que beneficios ele me traria?
Desculpe certas perguntas de “noob” mas estou a começar nisto do java.

Abraço

robsonsm

noorders:
Suas dicas funcionaram na perfeição :wink:

Realmente não estou usando ao canalentrada.
Acha que o deveria usar? Se sim onde e que beneficios ele me traria?
Desculpe certas perguntas de “noob” mas estou a começar nisto do java.

Abraço

Na verdade eu so fiz esta obs pq ñ entendi o motivo de ter criado o canalentrada sendo q nem estava utilizando, assim como tbm ñ entendi para q salvar em um arquivo se ñ vai precisar ler e recuperar os dados do mesmo (acredito q seja apenas por aprendizado).
Isso fica a seu critério, pois se for utilizar a leitura do arquivo isso vai ser um pouco mais complicado. A leitura so faria sentido se vc for setar os atributos do objeto com os dados do arquivo, e isso ñ é tão simples pra quem ta começando.

N

Ah… Isto era apenas um exercício que estava a fazer em casa para praticar e estava a estudar a parte da manipulação de ficheiros.
Um exemplo do que me está a dizer que iria complicar seria que quando eu escolhe-se as opçoes de listagem, pesquisar por sigla ou nome ele fosse ler no ficheiro de texto?
Se é isso não faço menor ideia de como o fazer. Teria que utilizar as classes FileReader?

Abraço

robsonsm

noorders:
Ah… Isto era apenas um exercício que estava a fazer em casa para praticar e estava a estudar a parte da manipulação de ficheiros.
Um exemplo do que me está a dizer que iria complicar seria que quando eu escolhe-se as opçoes de listagem, pesquisar por sigla ou nome ele fosse ler no ficheiro de texto?
Se é isso não faço menor ideia de como o fazer. Teria que utilizar as classes FileReader?

Abraço


é so uma idéia…
se vc esta gravando os dados num arquivo de texto, então aparentemente ele está servindo como uma espécie de bando de dados.
Ao mesmo tempo de q vc está escrevendo dados no arquivo, está atribuindo valores tbm ao seu objeto. Então qdo vc realiza a pesquisa, está buscando pelos objetos e ñ pelo arquivo, já que em nenhum momento o mesmo é lido.

Talvez seria mais interessante (por exemplo) criar uma opção para cadastro de países e este ir gravando no ficheiro, a busca poderia ser realizada lendo ele. Assim se vc fizesse alguma alteração diretamente dentro do arquivo ele pegaria essas alterações.

Neste caso sim, vc utilizaria o FileReader e seria interessante tbm utilizar BufferedReader.

Mas ao gravar no ficheiro, teria q seguir algum padrão para que fosse possível identificar e separar os campos (utilizando algum delimitador por exemplo).
Lembrando q é só uma idéia, não precisa fazer dessa forma. Mas se a intenção é focar o estudo na manipulação de arquivos, seria um bom exercício. Aqui no guj tem um tutorial sobre isso http://www.guj.com.br/article.show.logic?id=13

Criado 2 de outubro de 2010
Ultima resposta 2 de out. de 2010
Respostas 17
Participantes 2