Kann hier jemand Java?

Joined
Aug 8, 2005
Messages
1,201
Points
0
Hallo Leute,

ich bin so langsam echt am Verzweifeln. Ich studiere ja Wirtschaftsinformatik im ersten Semester und wir haben nun mit Java angefangen.

Ich habe mittlerweile die Grundzüge verstanden. Z.B. wie das mit den Konstruktoren funktioniert, was Methoden sind und wie man die verwendet. Ja, ich habe wohl auch schon verstanden, wie man mehrere Objekte einer Klasse interagieren lassen kann.

Aber nun kommt´s: Wir haben diese Woche eine Vorlesung zu int-Arrays gehabt und sollen nun die Aufgaben im Anhang lösen.


Die erste Aufgabe ist ja recht simpel mit der main-Methode und System.out.println zu lösen.


Die zweite Aufgabe kann ich nicht.... Mir fehlt da komplett der Durchblick. Hat jemand Hinweise, Ansätze, irgendwas?

Ich frag mich langsam wirklich, ob ich hier das Richtige studiere....


Schon jetzt recht herzlichen Dank für jede Hilfe!


Meine bisherigen Versuche sind wohl eher peinlich, aber ich stelle sie trotzdem mal hierein:


public class EndlicherAutomat
{
int[][] grammatik = new int[x][y];

public boolean akzeptiert?(String eingabe)
{
if(eingabe = grammatik[int x][2])
{true;}
else
{false;}
}




}

Das wird ja nicht mal kompiliert... Kommt ne Fehlermeldung, dass angeblich ein ";" fehlt... aber wo denn bitte?!
 

Attachments

  • 2008WiSe-InfoI-Uebungsblatt09.zip
    63.1 KB · Views: 12
also allgemein ich bin auch im ersten Semester ... und wir machen auch gerade Arrays bloss halt Angewandte Informatik ... man muss halt sehr am Ball bleiben und am Besten kein Eclipse benutzen das nen Fehler von mir ^^ weil die Prüfungen sind auf Papier und Eclipse macht viel alleine^^ ... ich machs immer so, dass ich nur mit Editor progge und dann in Eclipse kopiere um zugucken was läuft weil am 16.Jan. muss ich es eh Schriftlich können ... zu deiner Aufgabe ich werde sie mir mal angucken is ja auch Übung für mich, ich versuche dir weiterzuhelfen ... aber kann noch nix garantieren, da ich mit Arrays auch noch etwas auf Kriegsfuß stehe :D

ich sehe euer Proggen is kombiniert mit Theoretische Informatik^^ sowas bekommen wir im 3ten mit C & Mathe ... und der Prof is richtig krass drauf 0o hoffe der is dann weg :P
Zu deiner Aufgabe bisher:

deiner Methode fehlt return, damit du den Wert zurück gibst obs jetzt True oder False

muss ne Static Methode sein, da du ja kein Objekt benutzt sondern nur String Wert mitlieferst... weiterhin darf das "?" nicht in der Methode stehen dann kompiliert er bei mir auch nix weil er das nicht erkennt....

also so wie ich die Aufgabe verstanden habe bekommt deine Methode halt einen String Wert übergeben den du in deinr Methode abarbeiten musst nach der Übergangsfunktion ... und wenn dein Zustand der Endzustand 1 ist ... musst du ein True zurück geben und wenn der Zustand 0 oder 2 ein False ... also musst du es so hinbekommen, dass er dein Array abarbeitet sich immer merkt, inwelchem Zustand du bist, welches Zeichen er liesst und in welchen Zustand er dann gehen muss und dann musst du den "Endzustand" nach dem Gelesenen Wort vergleichen, ob er Akzeptiert wird oder nicht....

wie gesagt stehe mit Arrays auch noch auf dem Kriegsfuß wenn ich irgendwie scheisse geschrieben hab könnt ihr mich gerne Verbessern ;)
 
Last edited:
Schon mal ganz herzlichen Dank für dein Bemühen.

Wir arbeiten mit BlueJ. Das ist denke ich ein guter Kompromiss zwischen Programmen wie Eclipse und dem Editor. Denn hier wird das mit der Objektorientierung klar und man bekommt trotzdem nicht alles vorgegeben wie bei Eclipse.

Nach deinen Änderungen säh es nun so aus:

public class EndlicherAutomat
{
int[][] grammatik = new int[x][y];

public static boolean akzeptiert(String eingabe)
{
if(eingabe = grammatik[int x][2])
{
return true;
}
else
{
return false;
}
}


}

Theoretische Informatik haben wir als Wirtschaftsinformatiker zum Glück nicht noch mal als eigenes Fach im höheren Semester. Sonst wär ich wohl schon durchgedreht.

Ich denke, dass mein if-Ausdruck völlig falsch ist.... Aber auch keine Ahnung, wie man´s besser macht. Ich habe einfach 0 Ideen, wie ein sinnvoller Ansatz wäre. Auch, was bei weiterem Vorgehen im Konstruktor verlangt ist, weiß ich nicht.... "Menge der Endzustände und Anfangszustand"???? Deswegen hab ich den auch noch nicht hingeschrieben. Am besten ist es wohl, wenn man meinen "Ansatz" völlig außen vorlässt....

Glücklicherweise muss ich diesen Zettel erst bis Januar fertig haben. Normal geht das wöchentlich, während man noch die ganzen Wirtschafts- und Mathesachen hat....
 
Last edited:
Moin Derksowitch
Der Vergleichsoperator in Java ist == und nicht =
Klingt komisch, ist aber soo :D
SO wird das nicht mit Zuweisungen verwechselt
 
Was versuchst du denn in der if-Abfrage zu tun? oO

Du kannst dein Array nicht in einer if-Abfrage definieren ([int x]). Das hast du ja schon in den Zeilen davor gemacht. Außerdem muss es auch "==" heißen, was bei Strings aber nicht immer so nützlich ist.

Wenn ich Zeit hab, schau ich mir mal die Aufgabe noch an.

Ahja und mach dir kein Kopf wegen Wirtschaftsinformatik, du kannst damit später soviel machen ohne jemals wieder ein Stück Code anrühren zu müssen ;)
 
Theoretische Informatik macht richtig Spass und is einfach außer Pumping Lemma :D... aber ihr habt ja auch glaub ich 7 oder 8 Fächer wo ihr Prüfungen schreibt wir zum Glück nur 4 ^^

guck mal hier ... da les ich immer wenn ich was erklärt haben will ....
http://www.programmersbase.net/Content/Java/Content/Tutorial/Java/Array.htm

aber Proggen lernt man nicht durch erzählt bekommen, Vorlesungen man muss echt selber proggen und Fehler machen nur dann lernt man es musste ich leider auch schon erleben und wenn ich einmal dabei bin hab ich auch Spass aber erstmal überwinden gerade wenn man was zu Hause versucht kommen immer 23123123 andere Dinge dazwischen darum versuch ich auch vor den Prüfungen in der FH zu bleiben um zu lernen damit wenn ich nachhause komme ich nix mehr machne brauche bzw. nur nochmal drüber gucken.... und zu deinen Arrays ich denke, da musst du eher mit Schleifen dran gehen
 
Das Pumping Lemma halte ich für etwas überbewertet, genau wie Vorlesungen in Software-Technik. Wirklich Spaß macht es eine objektorientierte Sprache mit LOOP oder GOTO zu entwerfen :wub

Die Aufgabenstellung von Aufgabe 35 ist mal wieder üblicher Overkill und unnötig kompliziert, aber gut, dass Bild ist auch unvollständig, da der Startpfeil fehlt ...
Was weißt du denn über endliche Automaten ?

Also im Prinzip ist es so, dass
uebergang[0][0]=0;
sagt, dass wenn du im Zustand 0 bist und eine 0 als Wert übergeben wude du zum Zustand 0 gehst. Oder ein anderes Beispiel:
uebergang[1][0]=2;
Dies Bedeutet, dass wenn du in Zustand 1 Bist und eine 0 kommst du in Zustand 2 gehst.

Wir können also ferner sagen, dass
uebergang[uebergang[1][0]] = uebergang[2]
ist.

Damit solltest du die Eingabe verarbeiten können.
Zum Schluss musst du nur Prüfen, dass em ende
uebergang[1]
rauskommt.

Denn dies ist doppelt eingekreist und somit der einzige gültige Endzustand.
Alle andere Eingaben welche nicht bei s_1 enden werden vom Automaten aus dem Beispiel nicht akzptiert.

Schreib es am besten erstmal nur für dieses Beispiel, danach kann man es immernoch recht simpel verallg.

(Man baut dann einfach einen Array mit Endzuständen und prüft ob ob der letzte Zustand der Ruaskommt in diesem Array ist)


Hier mal ein kleines Beispiel wie man von einer Eingabe zum letzten Zustand kommt:
Code:
public class myclass
{
	public static void main(String[] args)
	{
       int[][] uebergang = new int[3][2];
		uebergang[0][0]=0;
		uebergang[0][1]=1;
		uebergang[1][0]=2;
		uebergang[1][1]=1;
		uebergang[2][0]=2;
		uebergang[2][1]=2;
	
		int[] end = {1};
	
		EndlicherAutomat automat = new EndlicherAutomat(uebergang, 0, end);
		System.out.println(automat.end("100011001"));
   }
}

class EndlicherAutomat
{
	int[][] uebergang;
	int position;
	int[] end;
	
	public EndlicherAutomat(int[][] uebergang, int start, int[] end)
	{
		this.uebergang = uebergang;
		this.position = start;
		this.end = end;
   }
 
   public int end(String eingabe)
   {
		int position = this.position;
		for(int i=0; i < eingabe.length(); i++)
		{
			position = uebergang[position][Character.getNumericValue(eingabe.charAt(i))];
		}
		
		return position;
   }
}

Damit solltest du dein Problem lösen können.
Es ist so übrigens auch sehr unschön und prüft nicht ob die Eingabe überhaupt im Array liegt, dies solltest du selbst verbessern.
Ganz davon abgesehen, dass der Automat noch ein paar mehr Dinge akzeptieren muss (anderes Alphabet etc).
 
@BSE: Ja, wenn ich das erste Semester durch habe, kommt auch nichts so Schlimmes mehr. Höchstens noch Datenbanken. Nur: ich hab langsam echt Schiss vor dieser Klausur in Informatik.... Ich mein, das Scheme-Zeug klappt mittlerweile einigermaßen, Grammatiken und mathematische Beweise kann ich mittlerweile sogar ganz gut. Aber das hier - und das ist nun mal das Wichtigste - ist bei mir absolut nicht drin.

Es ist einfach frustrierend. Natürlich versteh ich auch mal in Mathe was nicht, aber dann setz ich mich dran und es kommt auch nach und nach und irgendwann ist man an dem Punkt, wo es sogar relativ simpel erscheint. Nur hier: Ich sitze da stundenlang dran ohne einen minimalen Fortschritt. Ich weiß auch nicht, was die da erwarten!?
Wie soll ich das jetzt schon können bzw. erarbeiten können?

Wenn ich Wirtschaftsinformatik bis zum Ende packe, dann sieht´s auf dem Jobmarkt sehr gut aus, das weiß ich. Nur: Ich frag mich mittlerweile, ob ich überhaupt ne Chance habe, dieses erste Semester hier durchzustehen....




@Osbes:

public class myclass
{
public static void main(String[] args)
{
int[][] uebergang = new int[3][2];
uebergang[0][0]=0;
uebergang[0][1]=1;
uebergang[1][0]=2;
uebergang[1][1]=1;
uebergang[2][0]=2;
uebergang[2][1]=2;

int[] end = {1};

EndlicherAutomat automat = new EndlicherAutomat(uebergang, 0, end);
System.out.println(automat.end("100011001"));
}
}

Also wenn ich das richtig sehe, ist in dieser Zeile int[][] uebergang = new int[3][2] die Size von dem Array definiert und in den Zeilen darunter werden dann die einzelnen "Plättchen" gefüllt.
Dann kapiere ich nicht, was das int[] end = {1} soll.... Warum nur ein []? und wieso {1} ?


Und danach wendest du dann die Klasse EndlicherAutomat an mit dem Startpunkt 0, richtig? Wieso ist start ein int und nicht [0][0]? Und die Zeile danach kapiere ich dann überhaupt nicht mehr....


Danke euch schon mal für eure Hilfen!!!!!!!!
 
Er definiert noch ein zweites Array, ein eindimensionales.
int[] end

und dieses hat genau ein Element, die 1.
Ist halt eine andere Möglichkeit Arrays zu initialisieren. Kannst z.b. auch
String[] farben = { "Rot", "Gruen", "Gelb", "Blau" } machen ;)


System.out.println gibt schlicht eine Zeile auf der Konsole auf. In dem Fall gibt sie das Ergebnis der Funktion end() im Autmaten aus, also den Ergebnis-int.
 
genau, man könnte also

int[][] uebergang = new int[3][2];
uebergang[0][0]=0;
uebergang[0][1]=1;
uebergang[1][0]=2;
uebergang[1][1]=1;
uebergang[2][0]=2;
uebergang[2][1]=2;

auch so aufschreiben:
int[][] uebergang = {{0,1},{2,1},{2,2}};

oder
int[] end = {1};

auch so:
int[] end = new int[1];
end[0] = 1;

Es sind halt zwei vers. Schreibweisen die das gleiche bedeuten.
Jedoch halte ich die {} Notation bei sehr wenigen Werten für übersichtlicher.

#####

Für start habe ich einen int gewählt, da ich nur den Index der ersten Dimension des Arrays angeben wollte, da ja nur dieser den Zustand angibt.
 
.... ich hab auch nochmal ne Frage zu Java stelle ich auch mal hier....

ich hab nen Array da stehen 10x 6 Lottozahlen drin....
und ich hab nen Array welches 6 eingegebene Lottozahlen beinhaltet....
und ich soll jetzt ausgeben wieviel Treffer ich pro Lottoziehung mit meinen Zahlen habe...
aber ich weiss nicht wie ich das machen soll ... ich kann abfragen, ob eine Zahl an einer bestimmten Stelle getroffen wurde also z.b. if array[1] == array[2] aber wie kann ich alle testen ... da müsste ich ja irgendwie 13123 Schleifen machen ... aber ich wüsste auch net genau wie ich die Anordnen sollte 0o
 
Warum schaut ihr nicht einfach in der Definition von Java nach ?
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#binarySearch(int[], int)

Searches the specified array of ints for the specified value using the binary search algorithm. The array must be sorted (as by the sort method, above) prior to making this call. If it is not sorted, the results are undefined. If the array contains multiple elements with the specified value, there is no guarantee which one will be found.

Code:
import java.util.Arrays;
public class myclass
{
	public static void main(String[] args)
	{
		int[] a1 = {1,2,3,4,5,6};
	
		Arrays.sort(a1);
		System.out.println(Arrays.binarySearch(a1, 0));
		System.out.println(Arrays.binarySearch(a1, 1));
		System.out.println(Arrays.binarySearch(a1, 2));
		System.out.println(Arrays.binarySearch(a1, 3));
		System.out.println(Arrays.binarySearch(a1, 4));
		System.out.println(Arrays.binarySearch(a1, 5));
		System.out.println(Arrays.binarySearch(a1, 6));
		System.out.println(Arrays.binarySearch(a1, 7));
   }
}
Die Ausgabe von binarySearch gibt immer die den Schlüssel an, also ist die 0 ein gültiges Ergebnis.
Da es für Arrays in Java jedoch keine negativen Schlüssel gibt, gibt binarySearch ein negatives Ergebnis zurück, wenn er nichts gefunden hat.
 
So, danke euch Leute.


Hab das grad mit nem Kollegen nachvollzogen und auch so halbwegs verstanden. So langsam dämmert´s.


Hier jetzt unsere vorläufige Endlösung:

Code:
public class EndlicherAutomat
{
    int[][] uebergang;
    int startwert;
    int ende;

    public EndlicherAutomat(int[][] uebergang1, int startwert1, int ende1)
    {
      this.uebergang = uebergang1;
      this.ende = ende1;
      this.startwert = startwert1;
      
        
        
        
    }
  
    public boolean akzeptiert(String eingabe)
    {
       int rechnung = this.startwert;
        for (int n=0; n < eingabe.length(); n++)
       {
        if(eingabe.charAt(n) != 1 || eingabe.charAt(n) != 0)
        {
            return false;
        }
        else
        {
        rechnung = this.uebergang[rechnung][Character.getNumericValue(eingabe.charAt(n))];
        } 
       }
       if (rechnung == this.ende)
       { 
           return true;
       }
       else 
       {
           return false;
       }
    }  
    
    public static void main (String[] args)
    {
        int[][] uebergang = new int[3][2];
		uebergang[0][0]=0;
		uebergang[0][1]=1;
		uebergang[1][0]=2;
		uebergang[1][1]=1;
		uebergang[2][0]=2;
		uebergang[2][1]=2;
	
		int end = 1;
        int startwert = 0;
        
        EndlicherAutomat scheiße = new EndlicherAutomat(uebergang, startwert, end);
        
        System.out.println(scheiße.akzeptiert("000001000"));
    }
}


Wir haben den Endwert allerdings als normalen int genommen, um erstmal klar zu kommen. Das werden wir noch ändern.
 
nice :top

Ihr solltet noch
Code:
if(eingabe.charAt(n) != 1 || eingabe.charAt(n) != 0)
ändern.

Denn das Alphabet eines endlichen Automaten könnte auch "1234" (oder ähnlich) sein.
Daher müsstet ihr dann in "new EndlicherAutomat()" noch einen Wert Alphabet hinzufügen.

Wenn ihr es komplett machen wollt müsst ihr auch den Fall "ABCD" (usw.) bedenken, dann könnt ihr jedoch nicht mehr
Code:
this.uebergang[rechnung][Character.getNumericValue(eingabe.charAt(n))]
nutzen, sondern müsst es mit einem assoziativen Array lösen. Aber ich weiß nicht ob dies gefragt ist (wobei es eigentlich schade wäre wenn nicht).
 
In der Aufgabe ist als Alphabet nur 1/0 definiert, von daher sollte das passen ;)
 
gerade so ne aufgabe ist für nen wirtschaftsinformatiker einfach totaler quatsch :D
 
Äh ich steh grad total aufm Schlauch. Bitte NICHT den Stil beachten und ja ich weiß um die Möglichkeit eines Iterators, aber den hab ich vorher probiert und der hatte den gleichen Fehler, also dacht ich mir, dass ichs mal mit ner for-Schleife probier.
Ich hab Vokabeln in der Array-List, die jeweils nen Getter für English oder German haben
Und ich will halt ein 2-dimensionales String-Array haben, welches wie folgt ausschaut
[[bier][beer]]
[[scheiß][shitty]]
[[quelltext]
Code:
], naja das dürft soweit logisch sein und auch am Methodenkopf erkennbar sein.
Das Problem ist, ich bekomme gnadenlos eine Liste zurück, die im obigen Beispiel so aussähe:
[[quelltext][code]]
[[quelltext][code]]
[[quelltext][code]]
Also die Anzahl der Elemente stimmt und das letzte Element ist immer an allen Punkten. Ich steh total aufm Schlauch und die Lösung ist sicherlich total peinlich...Hier mein Code

[CODE]public String[][] getAllVocs() {
	String[][] allvocs = new String[vocs.size()][2];
	for(int i=0; i<vocs.size(); i++)
	{
			allvocs[i][0] = vocs.get(i).getGerman();
			allvocs[i][1] = vocs.get(i).getEnglish();
	}
	return allvocs;
}
 
bist dir sicher, dass
vocs.get(i).getGerman()
und
vocs.get(i).getEnglish()
richtig funktionieren?

und bist dir auch sicher, dass in vocs verschiedene zeilen stehen? :D

sonst sieht das für mich eigentlich richtig aus.
 
:D Danke für die Mühe, der Fehler war wie vermutet, viel dümmer. :D
Eclipse hatte "German" und "English" in der Vokabel selbst als static deklariert *g*
 
Back
Top Bottom