todybear
Goto Top

Palindrom-Untersuchung in Java

Hallo liebe Administratoren,

Ich bin frischgebackener Azubi für SI und habe jetzt schon ein großes Problem in AWE (Anwendungsentwicklung), da unser Lehrer meiner Meinung nach viel zu schnell den Stoff abhandelt, aber auch leider nicht auf mich eingeht, da ich der einzige von 20+ Schülern bin der keinerlei Vorerfahrung auf diesem Gebiet hat. Bis jetzt hatte ich sechs mal AWE à vier Stunden. In den ersten Stunden besprechen wir meist Struktogramme und Programmablaufpläne. Da man bei diesen mehr logisch denken muss als die Programmiersprache zu kennen, werde ich dort selten vor größere Probleme gestellt.

Nun mein Problem. In der zweiten Doppelstunde programmieren wir in Java mithilfe von Eclipse. Angefangen hat es in...
Stunde 1 mit "Hallo Welt!" und leichten Rechenaufgaben - System.out.print();
Stunde 2 Ausrechnen von Urlaubstagen (nach Alter/Behinderung (und Grad)) - boolean, Scanner
Stunde 3 Schleifen - if, else, else if, for, while, continue, break
Stunde 4 u.
Stunde 5 Arrays
Stunde 6 (nur Struktogramme)

Nun sollen wir als Aufgabe über die Herbstferien ein Programm schreiben, dass es mir erlaubt ein Palindrom in die Konsole zu schreiben. Dieses Palindrom soll dann nur aus Kleinbuchstaben bestehen und anschließend in Bytes umgewandelt werden. Erst die Byte-Zahlen werden verglichen und es wird geprüft, ob es sich um ein Palindrom handelt oder nicht. Anschließend werden die Bytes als Array angelegt und umgekehrt in der Konsole ausgegeben. Ich habe keine Ahnung wie ich aus meinen Byte-Zahlen ein Array anlege und dieses dann umgekehrt ausgeben kann. Kann mir dort jemand Anregungen geben? Ich kann mir natürlich eine X-beliebige Programmierung aus dem Netz holen, aber das ist ja nicht der Sinn der Sache. Einen Teil will ich auch aus eigener Feder selbst "entwickeln".

Gruß Tody

Content-ID: 317421

Url: https://administrator.de/contentid/317421

Ausgedruckt am: 15.11.2024 um 13:11 Uhr

J-N-S.K-N-R
Lösung J-N-S.K-N-R 11.10.2016 um 10:40:33 Uhr
Goto Top
Hey,

Aus dem Array ausgeben zu lassen ist eigentlich einfach:

Du nimmst ne for-Schleife und läufst die Länger des Arrays -1 rückwärts durch. Oder mit array.reverse.
Und im Schleifen Körper packst du denn Inhalt von Array entweder in einen String
oder du druckst ihn einzelt in der Konsole aus.
Wobei Methode 1 wesentlich besser ist.


Zum Umwandeln kann ich dir leider nichts sagen.

Mir hat damals geholfen, die Java-Dokus zu lesen. Da stehen meinst Methoden drinnen, die einen helfen.


mfG

Jonas
Todybear
Todybear 11.10.2016 um 12:01:42 Uhr
Goto Top
import java.util.Arrays;
import java.util.Scanner;

public class Palindrom	{
	
	public static void main (String args)	{
	
	Scanner s = new Scanner(System.in);	
	System.out.println("Bitte ein Wort eingeben: ");  
	String p;
	p = s.nextLine();
	p = p.toLowerCase();
	byte by = p.getBytes();
	
	boolean palindrom = false;

	int z = by.length;
	
		for (int x = 1; x <= z; x++)	{
			if	(by[x] == by[z])	
				z = z - 1;
				palindrom = true;		}
											
	
	if (palindrom = true)
		System.out.println("Es handelt sich um ein Palindrom!");  
	if (palindrom = false)
		System.out.println("Es handelt sich nicht um ein Palindrom!");  
	
	
	s.close();
											}
						}
						

Ein erster Versuch. Leider kommt der Fehler

Bitte ein Wort eingeben:
ANNA
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at Palindrom.main(Palindrom.java:20)
J-N-S.K-N-R
Lösung J-N-S.K-N-R 11.10.2016 um 12:13:43 Uhr
Goto Top

Ein erster Versuch. Leider kommt der Fehler

Bitte ein Wort eingeben:
ANNA
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at Palindrom.main(Palindrom.java:20)


Kleiner Tipp: Bei welchem Index fangen Arrays an und wo liegt der Unterschied zwischen array.length und dem Arrayindex.


Wenn du noch Fragen hast, kannst du bei mir nochmal melden.

mfG Jonas

PS: Das der Fehler kommt, ist ein großer Vorteil von Java, bei C++ würde er dir einen willkürlichen Wert zurück liefern
Todybear
Todybear 11.10.2016 aktualisiert um 12:37:37 Uhr
Goto Top
Kleiner Tipp: Bei welchem Index fangen Arrays an und wo liegt der Unterschied zwischen array.length und dem Arrayindex.

Oh super, daran hab ich überhaupt nicht gedacht!eins!eins!!!elf!
Habe das jetzt verbessert. face-smile

Gruß Tody

import java.util.Arrays;
import java.util.Scanner;

public class Palindrom	{
	
	public static void main (String args)	{
	
	Scanner s = new Scanner(System.in);	
	System.out.println("Bitte ein Wort eingeben: ");  
	String p;
	p = s.nextLine();
	p = p.toLowerCase();
	byte by = p.getBytes();
	
	boolean palindrom = false;

	int i;
	int b = by.length - 1;
	
		for (i = 0; i <= b; i++)	{
			if	(by[i] == by[b])	
				b = b - 1;
				palindrom = true;		
			if (by[i] != by[b])
				palindrom = false;	}
		
			System.out.println(palindrom);
	
	
	s.close();
											}
						}
						
TryAndSolve
Lösung TryAndSolve 11.10.2016 aktualisiert um 12:44:19 Uhr
Goto Top
Das sieht doch schon ganz gut aus, was du bisher gemacht hast. Bei uns in der Berufsschule (FISI) sind selbst nach mehr als 2 Jahren Ausbildung die meisten noch überfordert, eine solche Anwendung zu schreiben.

Tipps:
1) Programmiererfahrung sammeln und Code immer nachvollziehen
2) Exception-Meldungen beachten und entsprechend handeln. Wenn die Fehlermeldung unverstänlich ist, einfach mal googlen. (Zu Klassikern wie der Index-Out-Of-Bounds-Exception wird man etliche Beiträge finden). Dann verstehen, wo der Fehler war und diesen in Zukunft vermeiden.
3) In deinem Code hast du 2x eine Zuweisung anstelle eines Vergleiches benutzt ("=" ungleich "==").

Viel Erfolg!
J-N-S.K-N-R
Lösung J-N-S.K-N-R 11.10.2016 um 12:43:51 Uhr
Goto Top
Hoffe damit sind deine Fragen geklärt face-smile

Noch ein Tipp am Rande. Versuch die Variablen und hier den Scanner ordentlich zu benennen. Ich hab das am Anfang auch nie gemacht, aber je länger der Code wird, desto mehr freust du dich über aussagekräftige Benennungen.

mfG Jonas


PS. Wenn alles okay ist, setzt bitte die Frage mit dem grünen Button auf gelöst face-smile
Todybear
Todybear 11.10.2016 aktualisiert um 15:42:16 Uhr
Goto Top
import java.util.Arrays;
import java.util.Scanner;

	public class Palindrom	{
	
		public static void main (String args)	{
	
			Scanner scanner = new Scanner(System.in);	
	
				System.out.println("Bitte ein Wort eingeben: ");  
	
				String eingabe;
					eingabe = scanner.nextLine();
						eingabe = eingabe.toLowerCase();
							byte bytearray = eingabe.getBytes();
	
				boolean palindrom = false;
				
					int indexlength = bytearray.length - 1;
	
				for (int index = 0; index <= indexlength; index++)	{
					if	(bytearray[index] == bytearray[indexlength])	
						indexlength --;
							palindrom = true;		
					if (bytearray[index] != bytearray[indexlength])
							palindrom = false;					}
		
				while (indexlength >= 0){
					System.out.print(bytearray[indexlength] + " ");  
						indexlength = indexlength--;	}
				
					System.out.println();
				System.out.println(palindrom);
	
	
	scanner.close();
												}
							}
						

Das ist jetzt mein Code.

2 Probleme tauchen auf:

1. Ich weiß nicht, wie ich die Bytes wieder in die jeweiligen Buchstaben umrechne. Dies ist jedoch nur zweitrangig.

2. Es werden mir nur teilweise die Bytes ausgegeben. bei "amaoama"" wirft er nur "AOA" (als Bytes) und bei "LAGERREGAL" nur "LAGER" (als Bytes) aus. Ich dachte erst, dass es bei Lagerregal daran liegt, dass es mehr als 10 Buchstaben hat (wegen 8 Bits). In dem Moment war ich mir nicht sicher aus wievielen Bits/Bytes einem String entsprechen kann. Aber bei "amaoama" klappt es ja auch nicht. Bei Nicht-Palindromen treten soweit keinerlei Probleme auf.

Update: Ohne Änderung funktioniert das Programm nicht mehr. :DEs ist wohl in einer Endlosschleife gefangen.
Todybear
Todybear 11.10.2016 um 16:14:56 Uhr
Goto Top
28.
				while (indexlength >= 0){ 
29.
					System.out.print(bytearray[indexlength] + " ");   
30.
						indexlength = indexlength--;	} 

Ist fehlerhaft!
TryAndSolve
Lösung TryAndSolve 11.10.2016 aktualisiert um 16:40:52 Uhr
Goto Top
if (bytearray[index] == bytearray[indexlength])	 
   indexlength --; 
   palindrom = true;

1) Macht logisch nicht so viel Sinn. Da du keine geschweiften Klammern { } für den IF-Block benutzt hast, wird die Variable palindrom jeden Durchgang auf true gesetzt. Aber auch wenn es zum IF-Block gehören würde, macht es nicht immer Sinn (Wenn der letzte geprüfte Buchstabe übereinstimmt, alles andere aber nicht, wäre das bei dir trotdem ein Palindrom.

Warum setzt du nicht einfach Palindrom am Anfang auf true. Und prüfst solange, bis eine Abfrage ergeben hat, dass es sich entweder um kein Palindrom handelt (dann palindrom auf = false setzen und mittels break aus der for-schleife springen) oder bis du den ganzen String geprüft hast.

2) Zu deinem While: Du willst dir dort doch das ganze Wort ausgebene lassen?. Mit der Variable indexlength hast du aber oben bereits gearbeitet. Wenn dein Wort ein Palindrom wäre, ist indexlength zu Beginn 0 und du bekommst gar keine Ausgabe. Wenn es kein Palindrom ist, kommt es auf den spezifischen Fall an, welchen Startwert die Variable hat.
Todybear
Todybear 12.10.2016 um 09:41:10 Uhr
Goto Top
import java.util.Scanner;

	public class PalindromÜberprüfung 	{

		public static void main (String args)	{
	
			Scanner scanner = new Scanner(System.in);
	
			boolean palindrom = true;
			
			System.out.println("Bitte geben Sie ein Wort ein: ");  
				String eingabe = scanner.nextLine();
					eingabe = eingabe.toLowerCase();
						byte bytearray = eingabe.getBytes();
							
					int indexlength = bytearray.length - 1;
						
				for (int index = 0; index <= indexlength; index++)					{
						
					if (bytearray[index] == bytearray[indexlength])	{
						indexlength--;								}
							
						else if (bytearray[index] != bytearray[indexlength])	{
							palindrom = false;									}	}
			
			String ausgabe = new String(bytearray);
			        
				for(int i = ausgabe.length() - 1; i >= 0; i--)	{
			        System.out.print(ausgabe.charAt(i));		}
				
			System.out.println();
				System.out.println(palindrom);
	
			scanner.close();
												}
										}

Bin jetzt fertig! - Hoffe ich zumindest - Konnte bisher keine Fehler feststellen. Vielen Dank für die Unterstützung. Vor allem, weil diese nicht darin bestand auf irgendwelche Links oder fertigen Programmierungen hinzuweisen. face-smile

Gruß Tody