Programa com problema

5 respostas
C

PessoALL, mais uma vez estou com dúvidas. Relutei mto em postar esse programa aqui, mas confesso que esgotei minhas fontes de pesquisas… Quem puder, dá uma compilada nele e se der, me passa uma orientação em como corrigi-lo.

//Programa que formula uma sentença e obtem uma resposta da criança.
//Compara e exibe a resposta

import javax.swing.JOptionPane;

public class Tabuada
{
   String nome, a, b, auxS, op;
   int x, y, auxI, resp_sistema, resp_aluno;
   Tabuada Aluno = new Tabuada();

   public void Inicia()//Método onde acontece a formulação e obtenção das respostas
   {
      JOptionPane.showMessageDialog(null, "Vamos lá, " + Aluno.nome + "! Estou sorteando a sentença...");
      Aluno.x = (int)(Math.random()*10);//Randomizo o multiplicando
      Aluno.y = (int)(Math.random()*10);//Randomizo o multiplicador
      Aluno.resp_sistema = (Aluno.x * Aluno.y);//Faço a conta e obtenho a resposta do sistema
      Aluno.a = Integer.toString(Aluno.x);//Converto o valor do multiplicando para String
      Aluno.b = Integer.toString(Aluno.y);//Converto o valor do multiplicador para String
      Aluno.auxS = JOptionPane.showInputDialog("Resolva: " + Aluno.a + " X " + Aluno.b); //Armazena a resposta do aluno
      Aluno.resp_aluno = Integer.parseInt(Aluno.auxS); //Converti a resposta do aluno para inteiro
      if (Aluno.auxI != Aluno.resp_aluno)//Aqui, comparamos as respostas (Sistema x Aluno)
      {
         Aluno.op = JOptionPane.showInputDialog("EI!!!! Esta não é a resposta. Quer tentar novamente?(S/N)");
         if (Aluno.op.equals("S"))//Comparamos a resposta (S/N)
         {
            Denovo(); //Caso positivo, executamos Denovo()
         }
         else //Caso negativo
         {
            JOptionPane.showMessageDialog(null, "Obrigado por participar,  " + Aluno.nome);
            System.exit(0); //Encerramos o programa
         }
      }
      else
      {
         Aluno.op = JOptionPane.showInputDialog("CARACA!! A resposta está correta! Quer tentar novamente?(S/N)");
         if (Aluno.op.equals("S"))
         {
            Denovo();
         }
         else
         {
            JOptionPane.showMessageDialog(null, "Obrigado por participar,  " + Aluno.nome);
            System.exit(0);
         }
      }
   }

   public void Denovo()
   {
      Inicia();
   }

   public static void main (String args[])
   {
      Aluno.nome = JOptionPane.showInputDialog("Oi... me diz o seu nome:");
      Inicia();
   }
}

Esse programa deveria criar uma sentença, (multiplicação), exibí-la e solicitar a resposta. Após compará-la, iria exibir se estaria certa ou errada. O problema, (teoricamente), está nos métodos… Inicia() e Denovo(). O compilador que eu estou usando é o GEL no ruindows 98. Ele me apresenta 2 erros. Diz algo como não poder chamar um método não estático dentro de um método estático.

Valeu a todos…

5 Respostas

Bani

Você não pode chamar um método não estático de dentro de um estático por ele não saber que objeto utilizar. Ou você coloca tudo static (horrível) ou faz assim:

public static void main (String args[]) { Tabuada tabuada = new Tabuada(); tabuada.Aluno.nome = JOptionPane.showInputDialog("Oi... me diz o seu nome:"); tabuada.Inicia(); }

Bom, assim pelo menos compila, mas claro que de modo geral também está feio (e além disso não funciona)… mas entendendo esse negócio de precisar ter um objeto para usar membros não static acho que você consegue pensar em um modo melhor de fazer a sua classe.

D

Ok, vamos por partes.

Em primeiro lugar está clarro que vc conhece C ou Pascal e agora esta começando a estudar Java.

A programação em Java requer uma abordagem totalmente diferente, é um outro mundo, vc tem que parar de pensar em lógica de programação como vc conhece e começar a pensar Orientado a Objeto, e isso não é exagero.

Antes de fazer quanquer tipo de programinha vc deve ter muito bem definido todos os paradigmas de Java, caso contrário vc vai programar com uma estrutura de C em Java, que é oq aconteceu no seu exemplo, e provavelmente oq acontece com todos que começam a estudar Java por conta própria, inclusive eu!

Se vc quer aprender Java (Sábia decisão) então começe do princípio, já que vc está se propondo a ser auto didata presumo que vc tenha facilidade para estudar sozinho, então recomendo que entre no site java.sun.com/tutorial e realmente começe o tutorial do inicio, como se vc nunca tivesse programado em nenhuma outra linguagem antes (não estou disendo que tudo que vc aprendeu vc vai jogar fora, isso nunca, vc vai apenas conhecer novos mundos, onde vc vai utilizar oq aprendeu, mas com uma outra abordagem). Quando vc ja estiver familiarizado com os conceitos básicos de Orientação a Objeto, compre o livro Java Como Programar, vc pode achar caro de início, mas garanto que na relação custo X benefício sai de graça.

Estude sem pressa de programar, faça exercícios (e mais importante ENTENDA os exercícios) e realmente esgote suas fontes de pesquisas para tentar responder sozinho suas dúvidas, caso não consiga esse fórum está aki pra isso!

Sempre a melhor fonte de pesquisa é a propria fonte do recurso, portanto navege bastante pelo site java.sun.com

Uma outra saida mais rápida (e mais cara) é um bom curso de Java, mas não procure qualquer um, tem que ser um BOM curso de Java, e existem varios, se vc procurar “curso” nesse forum vc vai encontrar bastante coisa.


Quanto ao seu código:

Um método (ou variavel) “static” é um método que pode ser utilizado sem vc ter instanciado almenos um objeto com ele, quer diser, assim que a definição da classe esta na memoria o proprio metodo ja esta na memoria, sem a necessidade de vc ter uma instancia dessa classe. Portanto poderiamos groseiramente dizer que esse método não pertence a nenhum objeto e sim a classe do objeto. Logo, mesmo que vc tenho 10 instancias de um objeto com um método static, vc só vai ter 1 método static na memoria.

Quando vc escreve Aluno.nome ou Inicia(), vc está utilizando uma variavel e um método “non-statics”, logo essa variavel e esse método pertencem a um objeto, mas o método main é executado assim que é carregado na memoria, e isso acontece sem ao menos vc ter instanciado algum objeto.

Agora vc deve estar pensando “mas eu instanciei o objeto lá no começo, usei Tabuada Aluno = new Tabuada();…”. Certo, essa “variavel” que contem o objeto Aluno pertence ao objeto Tabuada, isso significa que cada objeto Tabuada va conter um Objeto “Tabuada” na variavel Aluno. Mas para que as variaveis de um objeto sejam inicializadas o objeto precisa ser instanciado, e no seu caso para o objeto ser instanciado a variavel precisa ser inicializada, portanto um depende do outro e nenhum ocorre.

Agora sim, já que temos o método static main, que pode ser executado sem vc precisar instanciar algum objeto, é ele que vc vai utilizar para quebrar esse circulo vicioso de dependência citado a cima, portanto vc instancia o seu objeto Tabuada no metodo main, apartir dai vc vai ter o objeto e vai trabalhar com ele ± como vc estava fazendo.

E Lembre-se, um método static não pode referenciar um método ou variavel que não seja static.

Não vou colocar uma solução aki pra vc, pq senão vc não vai aprender nada copiando. Caso não consiga resolver isso responda a essa mensagem q eu passo o código como deveria ser.

E lembrese: Sempre a melhor fonte de pesquisa é a propria fonte do recurso, portanto navege bastante pelo site java.sun.com

Qualquer coisa grita!!

C

Entendo o seu ponto de vista… realmente vc acertou, programo um pouco em C e estou tentando dar minhas olhadinhas em Java. Baixei algumas apostilas, imprimi e tenho feito alguns exercícios. Sempre que posso e tenho tempo, dou uma volta por aqui no GUJ e tento acompanhar o que vcs falam. A bem da verdade, esse papo de ser auto-didata é uma faca de dois gumes… eu até consigo entender algumas coisas, mas a grande teroria da OOP é uma coisa mto nova pra mim. Concordo tb que a pesquisa é a melhor arma para o auto-didata. Acredite, tenho feito isso. Mas como já havia dito, certos conceitos, (como o que vc acabou de explicar), são um tanto qto complexos para quem sai da programação estruturada e tenta se enfiar na OOP. Mas de qq forma valeu pela dica e pelos conselhos.

[ ]'s Marcos

D

Eu tb sou iniciante em Java, faz 6 meses que estou estudando, devorei o livro que eu indequei e alguns tutoriais da Sun.
E somente agora, essa semana, com muito sofrimento e dor de cabeça eu consequi fazer uma aplicação de verdade em Java, com BD cleiente-servidor para de 5 a 7 usuários. E ainda estou consertando uns pauzinho para uma “versão 1.1”. hehehe

Oq eu tentei passar na minha resposta foi o inicio do caminho das pedras que eu pastei um pouco para encontra até que alguem me disse para começar do começo, lá no primero tutorial da Sun.

Mas realmente o melhor lugar para começar é com um BOM curso de java, mas para isso vc precisa ter algum tempo e uma graninha extra.

Esse fórum, e outros, são com certeza uma ótima ajuda, aki vc vai encontrar várias pessoas como nós, mas tb tem muitos veteranos, e com certeza sempre alguem responde.

De qualquer modo é sempre bom trocar esperiências com os outros, isso me mostra que eu todo pelo que estou passando é normal e não pq sou burro. hehehe

boa sorte e até mais!

e como diria um cara por aki:
QUER MOLEZA, SENTA NO PUDIM!!

Jair_Rillo_Junior

Opa Daniel, a frase do quer Moleza é minha, heheheheh, na verdade eu copiei de um fórum de Ultima OnLine quando eu ainda jogava isso, hehehehe

Calvin, eu não sou experiente em Java, ainda estou em estudos, mas posso te dizer que ja passei pelo começo dos caminhos da pedra…

Tudo que o Daniel falou esta certo…

só uma dica, o seu código talves pode até funcionar, mas vai funcionar como uma programação estruturada… O Principal objetivo da OOP é criar classes, sub classes, Interfaces e etc para poder reaproveitar o código e isso que faltou no seu código… é um código simples? SIM, mas dos simples que a gente pega idéia para gerar os complexos…

Pense um pouco mais em reutilização de Código, Criar Classes que podem ser genéricas… usar os modificadores visiveis corretamente para ter um bom encapsulamento, usar Interface e etc… se vc viajou em tudo que eu falei, então é melhor “devorar” a teoria, antes de começar na prática…

Mas isso ae, sempre que precisar de ajuda tem um povo aqui que ajuda, eu só nao ajudo muito porque eu acesso aqui só de noite depois que volto da facul que geralmente to morrendo de sono e tb nao sou tao bom assim

falow ae

Criado 1 de maio de 2003
Ultima resposta 2 de mai. de 2003
Respostas 5
Participantes 4