AutoApp

Gebo

Mitglied
Hallo zusammen,

ich hab vor ein paar Wochen in der Uni mit Java angefangen (anfangen müssen ;)).
Am Freitag muss ich mir da einige Aufgaben testieren lassen und bin damit soweit fertig.

Allerdings komm ich mit der Objekt-Geschichte nicht ganz klar.
Also erstmal die Aufgabe:

Auto hat 2 Attribute (Modell als String, PS als int).
Klasse Auto enthält get- und set-Methoden für o.g. Attribute.
Zur Initialisierung set-Methode nutzen.
Auto enthält außerdem eine Methode getTyp(), die den String "Auto"(Datentyp/Name der Klasse) zurückgibt.
Weiteres Attribut führt Anzahl der erzeugten Objekte mit. Anzahl ist über entsprechende get-Methode abfragbar.

a) Klasse Auto erstellen
b) In App zwei Objekte von Auto erstellen, Inhalte der Attribute ausgeben

Soweit bin ich:

Klasse Auto:
Java:
package aufgabe_61;

public class Auto 
{
	
	String modell;
	String ps;
	int anzahl=0;
	
	public String getModell()
	{
		return modell;
	}
	
	public void setModell(String modell)
	{
		this.modell=modell;
	}
	
	public String getPS()
	{
		return ps;
	}
	
	public void setPS(String ps)
	{
		this.ps=ps;
	}
	
	public int getAnzahl()
	{
		return anzahl;
	}
	
	public void setAnzahl()
	{
		this.anzahl=anzahl+1;
	}
}

Auto App:
Java:
package aufgabe_61;

import javax.swing.JOptionPane;

public class AutoApp 
{
	public static void main(String args[])
	{
		
		Auto auto;
		int auswahl=0;
		
		do
		{
			auswahl = JOptionPane.showConfirmDialog(null,"Neues Auto anlegen?","Neues Auto?",JOptionPane.YES_NO_CANCEL_OPTION);
			
			if(auswahl==0)
			{	
				auto=new Auto();
		
            	auto.setModell(JOptionPane.showInputDialog("Modell?"));
            	auto.setPS(JOptionPane.showInputDialog("PS?"));
            	auto.setAnzahl();
		
            	JOptionPane.showMessageDialog(null, "Es ist ein "+auto.getModell()+" mit "+auto.getPS()+" PS! "+auto.getAnzahl()+" Autos angelegt.");
			}
			else if(auswahl==1)
			{	
				System.out.println();
				System.exit(0);
			}
			
			
		}
		while(auswahl!=2);
		{
			System.exit(0);
		}
			
			
	}
}

Wie gesagt, ich bin vollkommener JAVA-Anfänger, hab bis vor 5 Wochen nie programmiert und alles was ich da gebastelt hab kann vollkommener Quatsch sein ;)

Bis dato erstellt das Programm (nach der Frage ob ich ein weiteres Auto anlegen will) ein Objekt von Auto.
Wenn ich das allerdings mehrfach mach bleibt die Anzahl bei 1 und ich hab keine Ahnung, wie ich mir die anderen Objekte ausgeben lassen kann oder ob ich die gar überschreibe.

Wie oben erwähnt... ich versteh die Sache mit den Objekten nicht so wirklich und das, was ich an Literatur habe und Erklärungen im Netz helfen mir bei meiner Frage auch net so wirklich.

Danke schonmal für eure Mühe und Hilfe.

LG
Alex
 
Zuletzt bearbeitet von einem Moderator:

Korashen

Mitglied
Jup, kaschiks Antwort sollte dein Problem lösen.

Alternativ kannst du das Zählen der angelegten Autos auch in die Klasse
Code:
AutoApp
packen.
 

Gebo

Mitglied
Dein
Code:
int anzahl=0
in Auto sollte static sein.
Galileo Computing :: Java ist auch eine Insel - 5 Eigene Klassen schreiben

Hat für den Zähler perfekt funktioniert, danke soweit

Jetzt aber noch die Frage, wie kann ich, wenn ich z.B. 2 angelegt habe mir BEIDE ausgeben lassen?
Aktuell kommt ja direkt nach der Eingabe EINES Fahrzeugs die jeweilige Ausgabe. Wenn ich bei der Abfrage "Neues Auto anlegen?" "Nein" wähle, möchte ich mir alle angelegten Autos anzeigen lassen.

Wie mache ich das? Kann mir immer nur das letzte ausgeben lasse, egal was ich mache :(
 
S

SlaterB

Gast
speichere Autos in einer Liste oder Array,

mit einem String könntest du Textinformation iterativ zusammenbauen, z.B. die Auto-Ausgaben,
die richtigen Autos hättest du dann aber auch nicht mehr..
 

Gebo

Mitglied
speichere Autos in einer Liste oder Array

als was muss das Array in diesem Fall deklariert sein? (gerade selber überlegt: GARNICHT?RICHTIG?)
kann ich das eindimensional machen? wenn ja, speicher ich also die auto(s) innherlb der if(auswahl==0)-Schleife durch Hochzählen der Platzes im Array?

Wie gesagt... 5 Wochen Java-Erfahrung :)
Beispiel wäre super... musst mir ja ne meine Aufgabe lösen ;)

Danke gibts trotzdem schonmal
 
Zuletzt bearbeitet:
S

SlaterB

Gast
alle deine Fragen kann man grundsätzlich mit ja beantworten, falls dir diese Gewissheit besonders weiterhilft,

edit:
> als was muss das Array in diesem Fall deklariert sein? (gerade selber überlegt: GARNICHT?RICHTIG?)
wenn du ein Array haben willst, dann musst du es schon deklarieren, nach Standard,
so wie man ganz normal ein Array deklariert, irgendwas bekannt dazu?
(bedenke: auf 10.000 Seiten im Internet ausführlichste Beispiele)

-----

im weiteren aber lieber die Vorarbeit umgedreht:
arbeite du am Code, poste du die Versionen die dir Probleme machen zusammen mit Erläuterungen usw.,

if-schleife.de
 
Zuletzt bearbeitet von einem Moderator:

Gebo

Mitglied
Java:
package aufgabe_61;

import javax.swing.JOptionPane;

public class AutoApp 
{
	public static void main(String args[])
	{
		
		Auto auto;
		int auswahl=0;
		int i=0;
		Autos[] autos = Autos[5];
		
		do
		{
			auswahl = JOptionPane.showConfirmDialog(null,"Neues Auto anlegen?","Neues Auto?",JOptionPane.YES_NO_CANCEL_OPTION);
			
			if(auswahl==0)
			{	
				auto=new Auto();
		
            	auto.setModell(JOptionPane.showInputDialog("Modell?"));
            	auto.setPS(JOptionPane.showInputDialog("PS?"));
            	auto.setAnzahl();
            	autos[i]=auto;
            	i++;
            	JOptionPane.showMessageDialog(null, "Es ist ein "+auto.getModell()+" mit "+auto.getPS()+" PS! "+auto.getAnzahl()+" Autos angelegt.");
			}

so, das habe ich mir gerade mal überlegt.
Allerdings bekomm ich die Fehlermeldung: Autos cannot be resolved to a variable/Autos cannot be resolved to a type

Ich weiß nicht wie ich das anders formulieren soll, aber was hat das Array zu erwarten, wenn ich ihm Objekte übergeben will, so wie ich das verstehe, muss das erzeugte Array ja (auch wenn es leer sein soo am anfang) irgendwas enthalten (bei int Autos[] autos=Autos[5] 5 Nullen, oder? aber was sind in dem Fall leere Objekte?)

P.S.: Leider kann ich meine Änderungen im Code nicht hervorheben :(
 
S

SlaterB

Gast
die Fehlermeldung bedeutet, dass es keine Klasse Autos gibt, und das stimmt ja auch, oder?

leere Variablen können den Wert null enthalten, suche danach gegebenenfalls 'java null'

bei lokalen Variablen gibt es noch die Besonderheit 'nicht initialisierter Variablen'
auf lokaler Variable
> Auto auto;
kann vor Zuweisung gar nicht zugegriffen werden, probiere es aus,
ein Instanzattribut
> Auto auto;
wäre aber anfangs null, ähnlich im Array
 

Flown

Administrator
Mitarbeiter
Naja Zahlen sollte schon den richtigen Typ haben und das wäre nun mal eine ganze Zahl.

String auf Integer:
Java:
String s = "15";
int i = Integer.parseInt(s);

Also IMHO brauchst du dringend "Grundkenntnisse" in Java. Du kannst dich natürlich jetzt für alles durchfragen oder du gehst auf die FAQ-Seite und lest auch Galileo-Computing etwas und verstehst was du schreibst.

Edit: Das ist jetzt nicht böse gemeint :) Aber man sollte den Hintergrund verstehen
 
Zuletzt bearbeitet:

Gebo

Mitglied
Naja Zahlen sollte schon den richtigen Typ haben und das wäre nun mal eine ganze Zahl.

String auf Integer:
Java:
String s = "15";
int i = Integer.parseInt(s);

Also IMHO brauchst du dringend "Grundkenntnisse" in Java. Du kannst dich natürlich jetzt für alles durchfragen oder du gehst auf die FAQ-Seite und lest auch Galileo-Computing etwas und verstehst was du schreibst.

Edit: Das ist jetzt nicht böse gemeint :) Aber man sollte den Hintergrund verstehen

danke, aber Integer.parseInt kenn ich...
und das Variablen normalerweise Sinn machen sollten auch :)
die Frage bezog sich darauf, ob es einen Unterschied macht, ob ein ein Objekt mit (2x int und 1x String) oder (2x String und 1x int) ablege... kaum, oder seh ich das falsch?

So mein Code sieht jetzt so aus: (Klasse Auto unverändert bis auf String in int geändert bei PS)
Java:
package aufgabe_61;

import javax.swing.JOptionPane;

public class AutoApp 
{
	public static void main(String args[])
	{
		
		Auto auto;
		int auswahl=0;
		int i=0;
		Auto[] autos;
		autos= new Auto[5];
		
		do
		{
			auswahl = JOptionPane.showConfirmDialog(null,"Neues Auto anlegen?","Neues Auto?",JOptionPane.YES_NO_CANCEL_OPTION);
			
			if(auswahl==0)
			{	
				auto=new Auto();
		
            	auto.setModell(JOptionPane.showInputDialog("Modell?"));
            	auto.setPS(Integer.parseInt(JOptionPane.showInputDialog("PS?")));
            	auto.setAnzahl();
            	autos[i]=auto;
            	i++;
            	JOptionPane.showMessageDialog(null, "Es ist ein "+auto.getModell()+" mit "+auto.getPS()+" PS! "+auto.getAnzahl()+" Autos angelegt.");
			}
			else if(auswahl==1)
			{	
				for(int n=0;n<=i;n++)
				{
				System.out.println(autos[n]);
				System.exit(0);
				}
			}
			
			
		}
		while(auswahl!=2);
		{
			System.exit(0);
		}
			
			
	}
}

Die Eingabe scheint zu funktionieren und zählen tut er ja dank euch nun auch richtig.
Der exit mit der Abbrechen-Taste läuft auch.

Nur bei der Ausgabe aller Autos hakt es. Da bekomm ich bei 2 angelegten Autos: aufgabe_61.Auto@42ff1c7f (das ist wenn ich das richtig sehe die Adresse, wo ich das Auto auf dem Speicher finde, oder?)
aber ich will ja nicht die Adresse, sondern die Daten dahinter :p

tut mir leid, wenn ich ggf extrem dumme Fragen stelle, aber mehr geben 5x2Stunden Java nicht her. Mehr als das hier muss ich nicht können. Alles andere hat bei mir ja wunderbar funktioniert, nur diese Übung stellt mich vor Probleme.
Die Erklärungen, die ich über google finde beziehen sich meißt auf spezielle Probleme oder sind mir einfach zu komplex (oder ich bin zu blöd)
 
S

SlaterB

Gast
an der einen Stelle willst du ein Auto ausgeben und programmierst
Java:
"Es ist ein "+auto.getModell()+" mit "+auto.getPS()+" PS! "+auto.getAnzahl()+" Autos angelegt."
und erhälst eine schöne Ausgabe,

an einer anderen Stelle willst du wieder ein Auto ausgeben und schreibst quasi
Java:
auto
eigentlich autos[n], im wesentlichen aber eben die Variable an sich

und nun wunderst du dich, warum nicht an beiden Stellen die gleiche Ausgabe kommt?

das hat nur begrenzt mit Java-Kenntnissen zu tun..,
wenn man an einen Baum ein X malt und am nächsten ein O, dann ist das O kein X
 

Gebo

Mitglied
Danke fürs aufn Kopf hauen :)
Sowas ist peinlich und hat echt nix mit Java zu tun... waren die Finger schneller als der Kopf

System.out.println(autos[n].getModell()+autos[n].getPS()+autos[n].getAnzahl());
das funktioniert, also zumindest spuckt er was aus, mit dem man was anfangen kann...

Wenn ich aber

Mercedes 200 und Audi 150 eingebe, bekomme ich in der ersten Ausgabe "es ist ein mercedes mit 200 ps. 1 autos angelegt" in der zweiten dementsprechend "es ist ein audi mit 150 ps. 2 autos angelegt"

wenn ich dann nein(nächstes auto?) klicke kommt die ausgabe "mercedes2002"
das er mir nur das erste auto ausgibt würde ich ja verstehen(edit: oder besser akzeptieren vorerst), aber warum die 2 und nicht die 1?
 

Gebo

Mitglied
Du hast das Exit in der Schleife.

DANKE!!!!


EDIT:

Soweit läuft es jetzt, nur hab ich nen Problem mit dem Array. Bei zu vielen Einträgen kommt:
Code:
A1005Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
	at aufgabe_61.AutoApp.main(AutoApp.java:35)

B1005
C1005
D1005
E1005


bei zu wenigen eben die NullPointerException... ich versteh ja sogar warum :) aber gibt es ne Möglichkeit das Array flexiebel zu halten (mein googlen sagt nein) bzw. ne andere/bessere Methode um sowas abzulegen? ggf die Nullen mit irgendwas auffüllen? hoffe das war meine letzte frage...

DANKE SCHONMAL
 
Zuletzt bearbeitet:
S

SlaterB

Gast
anzahl ist eine statische Variable, von einzelnen Objekten unabhängig eine Eigenschaft der Klasse,
die Variable zählst du hoch, sie hat aktuell den Wert 2,
bei Ausgaben immer 2, es gibt keinen Grund dass dort je 1 kommt,

wenn du pro Auto eine Zahl speichern willst, dann verwende (zusätzlich?) eine nicht statische Variable, etwa 'nummer',
anderseits könnte der Index im Array, das n der Schleife bzw. n+1 ausreichen

Leerzeichen und/ oder Komma schaden auch nicht
 

Gebo

Mitglied
Danke, die Ausgabe war nur zu Testzwecken...
Hab gerade noch was in meinen letzten Beitrag reineditiert... ist leider natürlich nicht hinter deinem jetzt.

Deine Tips werd ich mal eben umsetzen, mals chaun was das gibt... (EDIT: mit n+1 ists am einfachsten :))
Hast du ne Idee mit dem Array?

Danke
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ein begrenzes Array liegt in der Natur der Sache,
dem kann man mit einem hohen Startwert begegnen, Millionen oder Milliarden wird schwer durch Eintippen zu füllen sein,
oder man vergrößert das Array im Bedarfsfall,
oder man verwendet eine ArrayList, die genau das erledigt,
oder man setzt auf das Konzept einer LinkedList: jedes Auto verweist mit einem Link auf das nächste,
Array/ sonstige höhere Struktur fällt zunächst weg
 

Gebo

Mitglied
ein begrenzes Array liegt in der Natur der Sache,
dem kann man mit einem hohen Startwert begegnen, Millionen oder Milliarden wird schwer durch Eintippen zu füllen sein,
oder man vergrößert das Array im Bedarfsfall,
oder man verwendet eine ArrayList, die genau das erledigt,
oder man setzt auf das Konzept einer LinkedList: jedes Auto verweist mit einem Link auf das nächste,
Array/ sonstige höhere Struktur fällt zunächst weg


Danke, aber das ist für meine Zwecke zu viel. Da wir davon nie gehört haben, wäre es besser nen Array zu machen (meinetwegen 100 groß) und am Ende aller Eingaben abzufragen, welche Plätze leer sind und die mit irgendwas zu überschreiben.


so gehts:
Java:
package aufgabe_61;

import javax.swing.JOptionPane;

public class AutoApp 
{
	public static void main(String args[])
	{
		
		Auto auto;
		int auswahl=0;
		int i=0;
		Auto[] autos;
		autos= new Auto[5];
		
		do
		{
			auswahl = JOptionPane.showConfirmDialog(null,"Neues Auto anlegen?","Neues Auto?",JOptionPane.YES_NO_CANCEL_OPTION);
			
			if(auswahl==0)
			{	
				auto=new Auto();
		
            	auto.setModell(JOptionPane.showInputDialog("Modell?"));
            	auto.setPS(Integer.parseInt(JOptionPane.showInputDialog("PS?")));
            	auto.setAnzahl();
            	autos[i]=auto;
            	i++;
            	JOptionPane.showMessageDialog(null, "Es ist ein "+auto.getModell()+" mit "+auto.getPS()+" PS! "+auto.getAnzahl()+" Autos angelegt.");
			}
			else if(auswahl==1)
			{	
				for(int n=0;n<=i;n++)
				{
					if(autos[n]==null)
					{	
						auto=new Auto();
						autos[n]=auto;
					}
					else
					{
					System.out.println("Der gesuchte "+autos[n].getModell()+" hat "+autos[n].getPS()+"PS und die Nummer: "+(n+1) );
					}
				}
			
				
			}
			
			
		}
		while(auswahl!=2);
		{
			System.exit(0);
		}
			
			
	}
}

bei 3 Eingaben liefert er mir allerdings:
Code:
Der gesuchte A hat 100PS und die Nummer: 1
Der gesuchte B hat 200PS und die Nummer: 2
Der gesuchte C hat 100PS und die Nummer: 3
Der gesuchte null hat 0PS und die Nummer: 4

Edit1: check gerade meine schleifen ...

Edit2: got it... else zweig vergessen :D obiger code ist jetzt richtig

Ich weiß, man könnte die Eingaben noch überwachen und vieles mehr, aber das ist hier gott sei dank nicht mehr gefordert.
Fällt dir trotzdem noch was auf, was nicht ok ist? (bedenke, ich bin blutiger anfänger und man erwartet kein 100%iges Programm)

DANKE AN ALLE!!!
 
Zuletzt bearbeitet:

AquaBall

Top Contributor
...
Java:
for(int n=0;n<=i;n++)
{
	if(autos[n]==null)
	{	
		auto=new Auto();
		autos[n]=auto;
	}
	else
	{
		System.out.println("Der gesuchte "+autos[n].getModell()+" hat "+autos[n].getPS()+"PS und die Nummer: "+(n+1) );
	}
}

Code:
...
Der gesuchte null hat 0PS und die Nummer: 4

Edit2: got it... else zweig vergessen :D obiger code ist jetzt richtig

Ich weiß, man könnte die Eingaben noch überwachen und vieles mehr, aber das ist hier gott sei dank nicht mehr gefordert.

Nicht optimieren, aber richtigstellen:
Deine Schleife geht zu weit,
Code:
n<i
wäre besser (
Code:
n<autos.length
wäre richtig).
Und was dein
Code:
auto=new Auto(); autos[n]=auto;
in dieser Schleife noch soll (es sind ja schon alle Autodaten erfasst) kapier ich nicht.
Wenn die Schleife richtig zählt, brauchst du auch diesen If-Zweig nicht mehr.
 
H

hüteüberhüte

Gast
Auto hat 2 Attribute (Modell als String, PS als int).
Klasse Auto enthält get- und set-Methoden für o.g. Attribute.
Zur Initialisierung set-Methode nutzen.
Auto enthält außerdem eine Methode getTyp(), die den String "Auto"(Datentyp/Name der Klasse) zurückgibt.
Weiteres Attribut führt Anzahl der erzeugten Objekte mit. Anzahl ist über entsprechende get-Methode abfragbar.

a) Klasse Auto erstellen
b) In App zwei Objekte von Auto erstellen, Inhalte der Attribute ausgeben

Hab mal die Attribute private gemacht (Datenkapselung):

Java:
public class Auto {

    private static int anzahl = 0;

    private String modell; // zwei Attribute, aber private
    private int ps;

    public Auto(String modell, int ps) { // Konstruktor, initialisiert das Objekt
        setModell(modell);
        setPs(ps);
        anzahl++;
    }

    public static int getAnzahl() { // getter...
        return anzahl;
    }

    public String getModell() {
        return modell;
    }

    public int getPs() {
        return ps;
    }

    public String getTyp() { // weiß nicht genau, wie diese Methode sein soll
        return "Auto, Modell = " + modell + ", PS = " + ps;
    }

    public void setModell(String modell) { // setter...
        this.modell = modell;
    }

    public void setPs(int ps) {
        this.ps = ps;
    }
}

In der Klasse App hab ich wie vorgeschlagen LinkedList verwendet, und JOptionPane zur Eingabe beibehalten:

Java:
import java.util.LinkedList;
import javax.swing.JOptionPane;

public class App {

    public static void main(String[] args) {
        // zwei Objekte erstellen...
        Auto a1 = new Auto("auto1", 222);
        Auto a2 = new Auto("auto2", 333);

        // Werte der Attribute ausgeben...
        System.out.println(a1.getTyp());
        System.out.println(a2.getTyp());

        // beliebig viele Auto erstellen/speichern...
        LinkedList<Auto> autoList = new LinkedList<Auto>();

        while (JOptionPane.showConfirmDialog(null, "Neues Auto anlegen?", "Neues Auto?", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { // Literale vermeiden
            autoList.add(new Auto(JOptionPane.showInputDialog("Modell?"), Integer.parseInt(JOptionPane.showInputDialog("PS?"))));
            JOptionPane.showMessageDialog(null, autoList.getLast().getTyp() + " angelegt.");
        }

        // alle ausgeben..
        for (Auto a : autoList) {
            System.out.println(a.getTyp());
        }
    }
}

[EDIT]Weiteres zur LinkedList hier: LinkedList (Java Platform SE 6)[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Gebo

Mitglied
Hey,

danke für eure Mühe und eure Codes.
Vieles von dem geht schon über meine Grenzen hinaus, habs mir trotzdem alles angeschaut und versucht nachzuvollziehen. Werde mir die Codes einfach mal kopieren und nen bisl rumspielen, vielleicht versteh ichs ja dann.

Der Code den ich gepostet hab hat gereicht. Habs vorhin per Mail versand und gerade das Testat bekommen.

Also, HERZLICHEN DANK!!! Super Forum!!!
 

Oben