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:
[code]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;
}
}[/code]
Código na ClassePrincipal
[code]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;
}
}[/code]
Fico grato pela vossa ajuda.
Cumprimentos noorders
que tipo de condição vc quer fazer na linha 28?
oOrigado robsonsm!
É isso mesmo 
Abraço 
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
a classe está compilando sem erro?
Seu loop (do) ñ tem o while, como pode estar funcionando?
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.
os dados estao sendo preenchidos em algum lugar?
é melhor mandar o código todo.
Eu mandei eles serem escritos num ficheiro.txt e guardados num array:
ClassePrincipal:
[code]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);
}
}
[/code]
Classe Paises:
[code]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);
}
}
}
[/code]
Classe Pais:
public class Pais {
//campos
public String sigla="";
public String nomePais="";
public int populacao=0;
}
a condicao na linha 28 da ClassePrincipal esta invertido, troque por “>”
p1.PesquisarSigla(txt)>-1
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).
colque desta forma na classeprincipal:
posicao = p1.PesquisarSigla(txt);
if(posicao>-1){
Funciona bem agora.
Obrigadão
robsonsm você percebe muito 
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
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
[quote=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[/quote]
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.
[code]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”));
…[/code]
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.
Suas dicas funcionaram na perfeição 
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
[quote=noorders]Suas dicas funcionaram na perfeição 
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[/quote]
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.
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
[quote=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[/quote]
é 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