Palindroom checker

Status
Niet open voor verdere reacties.

TangensTinus

Gebruiker
Lid geworden
9 apr 2009
Berichten
6
Ik wil graag een Palindroom checker maken. Ik heb eindeloos veel dingen geprobeerd, maar niets schijnt te werken. Mijn script is als volgd:

Code:
/**
 * @(#)Palindroom.java
 *
 * Sample Applet application
 *
 * @author 
 * @version 1.00 09/04/02
 */
 
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Palindroom extends Applet
implements ActionListener {
		TextField invoer;
		Button check;
		String woord;

	public void init() {
		setLayout(null);
		setBackground(Color.yellow);
		invoer = new TextField(20);
		invoer.setBounds(60,100,140,20);
		check = new Button("CHECK!");
		check.setBounds(240,100,100,20);
		add(invoer);
		add(check);
	}

	public void paint(Graphics g) {
		g.fillRect(120,120,4,60);
		g.drawLine(120,120,95,145);
		g.drawLine(124,120,149,145);	
		g.setFont(new Font("Verdana",Font.BOLD,26));
		g.drawString("PALINDROOM",100,40);
		g.setFont(new Font("VERDANA",Font.ITALIC,14));
		g.drawString("checker...",200,55);
		g.drawString("Type hier uw woord",54,195);
		
		if(Palindroom(woord)) {
			g.drawString("Dit woord is geen palindroom",160,250);
		}
		else {
			g.drawString("Dit woord is een palindroom",160,250);
			}
		}

	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == check) {
			woord = invoer.getText();
			repaint();
		}
	}

	boolean Palindroom (String woord) {
		int links = 0; // Het tellen in Java begint bij 0. De EERSTE letter links, benoem ik dus 0.
		int rechts = woord.length() - 1; // De laatste letter is het lengte van het woord - 1 (want het tellen begint bij 0)
		while (links <= rechts) { // Net zolang totdat links <= aan rechts...
			if (woord.charAt(links) == woord.charAt(rechts)) { // Als de letter links gelijk is aan de letter rechts, dan ...
				links++; // Schuif de linkerletter eentje op naar rechts
				rechts--; // Schuif de rechterletter eentje op naar links
			}
		else { // Anders
			return false; // Het woord is geen palindroom (false)
			}
		}
		return true; // Het woord is een palindroom
	} 	
}

Dit ziet er zo uit:
palindroom.png


Het werkt maar niet! Hopelijk kan iemand me helpen!
 
om het zo snel mogelijk te doen werken:

1) je applet implementeert ActionListener correct maar je moet ze nog toevoegen als ActionListener voor je knop.
Voeg in init dus dit toe:
Code:
check.addActionListener(this);

2) nullpointerexception in boolean Palindroom(String woord): woord is nog niet geïnitialiseerd en dus wordt null meegegeven. Verander vb de aanroep:
Code:
van
if(Palindroom(woord)) {
naar
if(woord != null && Palindroom(woord)) {

3) je hebt je tekst omgewisseld. Maak 'geen palindroom' van 'een palindroom' en omgekeerd ;).

Mocht je geïnteresseerd zijn:
- niets invullen is ook een palindroom?
- StringBuffer heeft een reverse() methode waarmee je met minder code kan controleren
- conventie in Java: methodes beginnen met een kleine letter. De constructor is een uitzondering, deze heeft geen return type en heeft dezelfde naam als de klasse, Palindroom dus. Noem je methode dan ook niet Palindroom(woord) maar bijvoorbeeld isPalindroom(woord)
 
om het zo snel mogelijk te doen werken:

1) je applet implementeert ActionListener correct maar je moet ze nog toevoegen als ActionListener voor je knop.
Voeg in init dus dit toe:
Code:
check.addActionListener(this);

2) nullpointerexception in boolean Palindroom(String woord): woord is nog niet geïnitialiseerd en dus wordt null meegegeven. Verander vb de aanroep:
Code:
van
if(Palindroom(woord)) {
naar
if(woord != null && Palindroom(woord)) {

3) je hebt je tekst omgewisseld. Maak 'geen palindroom' van 'een palindroom' en omgekeerd ;).

Mocht je geïnteresseerd zijn:
- niets invullen is ook een palindroom?
- StringBuffer heeft een reverse() methode waarmee je met minder code kan controleren
- conventie in Java: methodes beginnen met een kleine letter. De constructor is een uitzondering, deze heeft geen return type en heeft dezelfde naam als de klasse, Palindroom dus. Noem je methode dan ook niet Palindroom(woord) maar bijvoorbeeld isPalindroom(woord)
Dat reverse klinkt ook wel interessant. Ik vind het altijd fijn om zo efficiënt mogelijk te programmeren, dus misschien kan je dat nog uitleggen! Alvast heel erg bedankt voor dit :D:thumb:
 
Komt neer op de Java API doornemen en eruit gebruiken wat je nodig hebt.

Een woord is een palindroom als het gelijk is aan z'n omgekeerde. Doornemen van de klasse String toont dat er geen methode voor het omgekeerde bestaat, maar de klasse StringBuffer heeft een methode reverse():
Code:
 StringBuffer 	reverse()
          Causes this character sequence to be replaced by the reverse of the sequence.

Je maakt blijkbaar een StringBuffer aan met een van volgende constructors:
Code:
StringBuffer()
          Constructs a string buffer with no characters in it and an initial capacity of 16 characters.
StringBuffer(CharSequence seq)
          Constructs a string buffer that contains the same characters as the specified CharSequence.
StringBuffer(int capacity)
          Constructs a string buffer with no characters in it and the specified initial capacity.
StringBuffer(String str)
          Constructs a string buffer initialized to the contents of the specified string.

StringBuffer(String str) is hier duidelijk het eenvoudigst. Ok, je kan een StringBuffer aanmaken met het gegeven woord en er het omgekeerde van maken. Nu moet je nog vinden hoe je de waarde er terug uithaalt:

Code:
 String 	toString() 
          Returns a string representing the data in this sequence.

Nu heb je alles:
Code:
boolean isPalindroom (String woord) {
          String omgekeerdWoord = new StringBuffer(woord).reverse().toString();
          return woord.equals(omgekeerdWoord);
}

Er zijn bij wijze van spreken 1001 manieren om de test uit te voeren, de een al 'efficiënter' dan de andere. Stel jezelf gewoon de vraag wat het duidelijkst is om door te nemen ;).
 
Laatst bewerkt:
Nou, dat werkt nu dus! Ik heb echter 2 (hopelijk) kleine probleempjes waar ik niet uitkom...

De code is nu als volgt:
Code:
/**
 * @(#)Palindroom.java
 *
 * Sample Applet application
 *
 * @author 
 * @version 1.00 09/04/02
 */
 
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Palindroom extends Applet
implements ActionListener {
		TextField invoer; // Een tekstvak genaamd 'invoer'
		Button check; // Een button genaamd 'check'
		String woord; // Een string genaamd 'woord'
		int woordlengte; // Een int genaamd 'woordlengte'

	public void init() {
		setLayout(null); // Zet de layout uit
		setBackground(Color.orange); // De achtergrond kleur is oranje
		invoer = new TextField(100); // Tekstvak 'invoer' is een nieuw tekstvak
		invoer.setBounds(60,100,160,20); // De coördinaten van het tekstvak
		check = new Button("CHECK!"); // Button 'check' is een nieuwe button
		check.setBounds(240,100,100,20); // De coördinaten van de button
		check.addActionListener(this); // Voeg een 'ActionListener' toe aan de button
		add(invoer); // Voeg het tekstvak toe
		add(check); // Voeg de button toe
	}

	public void paint(Graphics g) {
		g.fillRect(120,120,4,60); // De rechthoek van de pijl
		g.drawLine(120,120,95,145); // Het linksboven gedeelte van de pijl
		g.drawLine(124,120,149,145); // Het rechtsboven gedeelte van de pijl
		g.setFont(new Font("Verdana",Font.BOLD,26)); // Het lettertype is Verdana, Vetgedrukt, 26 groot
		g.setColor(new Color(255,0,0)); // Maak een nieuwe kleur rood
	;	g.drawString("PALINDROOM",100,40); // Schrijf 'PALINDROOM'
		g.setColor(new Color(20,170,0)); // Maak een nieuwe kleur groen
		g.setFont(new Font("VERDANA",Font.ITALIC,14)); // Het lettertype is Verdana, Schuingedrukt, 14 groot
		g.drawString("checker...",200,55); // Schrijf 'checker...'
		g.setFont(new Font("Comic Sans MS",Font.BOLD,14)); // Het lettertype is Comic Sans MS, Vetgedrukt, 14 groot
		g.setColor(new Color(0,0,200)); // Maak een nieuwe kleur blauw
		g.drawString("Type hier uw woord",54,195); // Schrijf 'Type hier uw woord'
		g.setColor(new Color(255,0,0)); // Maak een nieuwe kleur rood
		g.setFont(new Font("Verdana",Font.BOLD,20)); // Het lettertype is Verdana, Vetgedrukt, 20 groot 
		
		if(woord == null) { // Als er niets ingevoerd is ...
			g.drawString("",100,250); // Schrijf niets
		}
		if(woord != null && hetPalindroom(woord) && woordlengte <= 20) { // Als er iets ingevoerd is, gebruik de palindroom checker en de woordlengte is kleiner of gelijk aan dan 20
			g.drawString("Dit woord is een palindroom",100,250); // Schrijf 'Dit woord is een palindroom'
			}
		if(woord != null &! hetPalindroom(woord) && woordlengte <= 20) { // Als er iets ingevoerd is en het woord is geen palindroom en de woordlengte is kleiner of gelijk aan 20
			g.drawString("Dit woord is geen palindroom",100,250); // Schrijf 'Dit woord is geen palindroom'

			}
		}


	public void actionPerformed(ActionEvent e) { 
		if(e.getSource() == check) { // Als de button ingedrukt is
			woord = invoer.getText(); // woord = wat er in het invoervak staat
			repaint(); // Teken opnieuw
		}
	}

	boolean hetPalindroom (String woord) {
          String omgekeerdWoord = new StringBuffer(woord).reverse().toString();
          return woord.equals(omgekeerdWoord);
    }
}

1. Ik wil graag weten hoe ik kan tellen hoe lang een woord is. Dus, als ik een woord met bijvoorbeeld 25 tekens invoer, dat het script dan controleerd of dit langer is dan 20 tekens en zoja, dat ie dan zegt dat je een woord met minder dan 20 tekens moet invoeren.

2. Ik krijg een error in m'n java commando window:
errorpls.png
 
1. de variabele 'woord' is een String. Je vind in m'n vorige post een link naar de documentatie van String, ga eens na of je van een String z'n lengte kan opvragen...

2. Nullpointerexception:
lees gewoon even na wat je intikt, er staat ... woord != null &! hetPalindroom(woord) ... ipv ... woord != null && hetPalindroom(woord) ...
 
Je zal wel helemaal gek worden van de domme vragen, maar...

Code:
	boolean hetPalindroom (String woord) {
          String omgekeerdWoord = new StringBuffer(woord).reverse().toString();
          return woord.equals(omgekeerdWoord);
    }
}

Hier komt alleen maar uit: "Ja, het is een palindroom".

Code:
		if(woord == null) { // Als er niets ingevoerd is ...
			g.drawString("",100,250); // Schrijf niets
		}
		if(woord != null && woordlengte >= 20) { // Als er iets ingevoerd is en het woord is groter of gelijk aan 20
			g.drawString("Voer een woord met minder dan 20 letters in!",100,250); // Schrijf 'Voer een woord met minder dan 20 letters in'
		}
		if(woord != null && hetPalindroom(woord) && woordlengte <= 20 && woordlengte >= 1) { // Als er iets ingevoerd is, gebruik de palindroom checker en de woordlengte is kleiner of gelijk aan dan 20
			g.drawString("Dit woord is een palindroom",100,250); // Schrijf 'Dit woord is een palindroom'
		}

Hoe maak ik dan dat hij daar zegt dat het geen palindroom is?
 
Code:
/**
 * @(#)Palindroom.java
 *
 * Sample Applet application
 *
 * @author 
 * @version 1.00 09/04/02
 */
 
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Palindroom extends Applet
implements ActionListener {
		TextField invoer; // Een tekstvak genaamd 'invoer'
		Button check; // Een button genaamd 'check'
		String woord; // Een string genaamd 'woord'
		int woordlengte; 

	public void init() {
		setLayout(null); // Zet de layout uit
		setBackground(Color.orange); // De achtergrond kleur is oranje
		invoer = new TextField(100); // Tekstvak 'invoer' is een nieuw tekstvak
		invoer.setBounds(60,100,160,20); // De coördinaten van het tekstvak
		check = new Button("CHECK!"); // Button 'check' is een nieuwe button
		check.setBounds(240,100,100,20); // De coördinaten van de button
		check.addActionListener(this); // Voeg een 'ActionListener' toe aan de button
		add(invoer); // Voeg het tekstvak toe
		add(check); // Voeg de button toe
	}

	public void paint(Graphics g) {
		g.fillRect(120,120,4,60); // De rechthoek van de pijl
		g.drawLine(120,120,95,145); // Het linksboven gedeelte van de pijl
		g.drawLine(124,120,149,145); // Het rechtsboven gedeelte van de pijl
		g.setFont(new Font("Verdana",Font.BOLD,26)); // Het lettertype is Verdana, Vetgedrukt, 26 groot
		g.setColor(new Color(255,0,0)); // Maak een nieuwe kleur rood
	;	g.drawString("PALINDROOM",100,40); // Schrijf 'PALINDROOM'
	
		g.setColor(new Color(20,170,0)); // Maak een nieuwe kleur groen
		g.setFont(new Font("VERDANA",Font.ITALIC,14)); // Het lettertype is Verdana, Schuingedrukt, 14 groot
		g.drawString("checker...",200,55); // Schrijf 'checker...'
		g.setFont(new Font("Comic Sans MS",Font.BOLD,14)); // Het lettertype is Comic Sans MS, Vetgedrukt, 14 groot
		g.setColor(new Color(0,0,200)); // Maak een nieuwe kleur blauw
		g.drawString("Type hier uw woord",54,195); // Schrijf 'Type hier uw woord'
		g.setColor(new Color(255,0,0)); // Maak een nieuwe kleur rood
		g.setFont(new Font("Verdana",Font.BOLD,20)); // Het lettertype is Verdana, Vetgedrukt, 20 groot 
		
		if(woord == null) { // Als er niets ingevoerd is ...
			g.drawString("",100,250); // Schrijf niets
		}
		if(woord != null && woordlengte >= 20) { // Als er iets ingevoerd is en het woord is groter of gelijk aan 20
			g.drawString("Voer een woord met minder dan 20 letters in!",100,250); // Schrijf 'Voer een woord met minder dan 20 letters in'
		}
		if(woord != null && hetPalindroom(woord) && woordlengte <= 20) { // Als er iets ingevoerd is, gebruik de palindroom checker en de woordlengte is kleiner of gelijk aan dan 20
			g.drawString("Dit woord is een palindroom",100,270); // Schrijf 'Dit woord is een palindroom'
			g.setColor(new Color(127,255,0));
			g.fillRoundRect(260,163,50,30,5,5);
			g.setColor(new Color(139,69,19));
			g.fillRoundRect(260,160,5,80,5,5);
		}
	}
	
	public void actionPerformed(ActionEvent e) { 
		if(e.getSource() == check) { // Als de button ingedrukt is
			woord = invoer.getText(); // woord = wat er in het invoervak staat
			int woordlengte = woord.length();
			repaint(); // Teken opnieuw
		}
	}

	boolean hetPalindroom (String woord) {
          String omgekeerdWoord = new StringBuffer(woord).reverse().toString();
          return woord.equals(omgekeerdWoord);
    }
}

Dat is alles op het moment. Hij doet het al wel als het WEL een palindroom is, maar niet als het GEEN palindroom is en hij geeft ook nog geen melding als het woord groter of gelijk aan 20 letters is ...
Ik had al wat geprobeerd met int woordlengte = woord.length(); maar dat werkte niet ...

Ik realiseer me dat ik geen if ... != hetPalindroom heb gebruikt want dit werkte niet dus heb ik het weer verwijdert.
 
Laatst bewerkt:
Hmm, met een goeie IDE zou je al een probleem moeten opgemerkt hebben.

Ik zet de code even in Eclipse en die geeft mij aan op lijn 69 bij "int woordlengte = woord.length();" de volgende melding: "Local variable is never read"

Dat klopt ook, doordat je "int woordlengte = ..." schrijft in plaats van "woordlengte = ..." maak je een nieuwe lokale variabele aan, die enkel binnen de huidige lus geldt. In de plaats daarvan moet je de globale variabele woordlengte wijzigen.

Op lijn 69 moet er dus komen: "woordlengte = woord.length();"


Ook even opletten met het volgende:
Code:
	if(woord == null) { // Als er niets ingevoerd is ...
			g.drawString("",100,250); // Schrijf niets
		}

woord is enkel null als er nog nooit geklikt is, omdat die variabele dan nog niet geïnitialiseerd is. Als er niets in het tekstvak staat dan is woord niet null, maar een string met lengte 0.

Het is trouwens ook bij je controles veel logischer om met "else if" te werken, zo moet je niet telkens controleren of de vorige controles niet waar waren. Dat zou dan zoiets worden:

Code:
		if(woord == null) { // Als er niets ingevoerd is ...
			g.drawString("",100,250); // Schrijf niets
		} else if (woordlengte == 0) { // Als er niets ingevoerd is ...
			g.drawString("Geen woord ingegeven",100,250); // Schrijf niets
		} else if (woordlengte >= 20) { // Als er iets ingevoerd is en het woord is groter of gelijk aan 20
			g.drawString("Voer een woord met minder dan 20 letters in!",100,250); // Schrijf 'Voer een woord met minder dan 20 letters in'
		} else if (hetPalindroom(woord)) { // Als er iets ingevoerd is, gebruik de palindroom checker en de woordlengte is kleiner of gelijk aan dan 20
			g.drawString("Dit woord is een palindroom",100,270); // Schrijf 'Dit woord is een palindroom'
			g.setColor(new Color(127,255,0));
			g.fillRoundRect(260,163,50,30,5,5);
			g.setColor(new Color(139,69,19));
			g.fillRoundRect(260,160,5,80,5,5);
		}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan