# Array-Aufgabe Bücher



## JimmyFly (2. Mai 2012)

Hallo, 

wir sollen eine Datenbank Bücher erstellen. Als Inhalt soll Titel, Autor (Vorname und Nachname), ISBN, Jahr und Preis zusammengefasst sein und über die Konsole eingegeben werden. Als Bedingung sollen Bücher die nach 1995 und weniger als 50 Euro kosten angezeigt werden. Die Datenbank soll maximal 100 Bücher umfassen. 

ich habe mir jetzt schon etwas überlegt: 


```
import java.util.Scanner;
main (){
	class Bibo{
		String Vorname; 
		String Nachname; 
		String titel; 
		int ISBN;
		int jahr; 
		int preis;
		}
		
		AutoT buchDB[] = new BuchT[5]; 
		
		 Scanner i = new Scanner (System.in);
		
		for (int i = 0; i > 100; i++) {
		
		buchDB[i].Vorname = in.next (); 
		buchDB[i].Nachname = in.next ();
		buchDB[i].titel = in.next ();
		buchDB[i].jahr = in.nextInt();
		buchDB[i].ISBN = in.nextInt();
		buchDB[i].preis = in.nextInt();
		}
		
		for (int i = 0; i > 100; i ++) {
		
		if (autoDB[i].jahr <= 1999){ 
		if (autoDB[i].jahr >= 50){ 
		System.out.println("Titel"+ buchDB[i].titel);
		System.out.println("Vorname"+ buchDB[i].Vorname);
		System.out.println("Nachname"+ buchDB[i].Nachname);
		System.out.println("ISBN"+ buchDB[i].ISBN);
		System.out.println("Preis"+ buchDB[i].preis);
		System.out.println("Jahr"+ buchDB[i].jahr);
		
		
		}
		}
		}
```

Mit der Eingabe in der Konsole würde ich das mit einer while Schleife angehen. Aber weiss nicht ganz genau wo ich sie einbinden soll. 



Aber dennoch komme ich noch nicht ganz auf den grünen Zweig. Vielleicht kann mir jemand weiter helfen.


----------



## profkalas (2. Mai 2012)

Solltest dein Array dann mit 100 festlegen, für die Anzahl der Bücher.
Desweiteren if Abfrage mit && verknüpfen.


----------



## HimBromBeere (2. Mai 2012)

> ```
> for (int i = 0; i > 100; i++)
> ```


Diese Schleife wird nicht ein enziges Mal ausgeführt, weil die Bedingung i > 100 nicht erfüllt ist. Da sollte sicherlich sowas stehen: 
	
	
	
	





```
int i = 0; i < 100; i++
```


----------



## JimmyFly (2. Mai 2012)

HimBromBeere hat gesagt.:


> Diese Schleife wird nicht ein enziges Mal ausgeführt, weil die Bedingung i > 100 nicht erfüllt ist. Da sollte sicherlich sowas stehen:
> 
> 
> 
> ...



Das stimmt da habe ich vertan


----------



## JimmyFly (2. Mai 2012)

profkalas hat gesagt.:


> Solltest dein Array dann mit 100 festlegen, für die Anzahl der Bücher.
> Desweiteren if Abfrage mit && verknüpfen.



warum geht das nicht mit der for Schleife? Zum Schluss macht doch die if Bedingung das gleiche?


----------



## profkalas (2. Mai 2012)

Wenn du deinem Array sagst dass es nur 5 Werte speichern darf (0-4) kannst du keine 100 einfügen, auch nicht durch eine for schleife.


----------



## profkalas (2. Mai 2012)

Abgesehen davon finde ich es nicht gut, den Scanner i zu nennen wenn deine Laufvariable i ist  .

Wie du mit dem Scanner nachher was einliest..


```
String eingabe;
Scanner scan= new Scanner(System.in);
System.out.print("Bitte Werte eingeben: ");
eingabe= scan.next();
```

Wenn du halt ne Zahl haben willst noch parsen.


----------



## JimmyFly (2. Mai 2012)

Habe es nochmal bearbeitet



```
main (){
	class Bibo{
		String Vorname; 
		String Nachname; 
		String titel; 
		int ISBN;
		int jahr; 
		int preis;
		}
		
		Bibo buchDB[] = new Buch[100]; 
		
		 Scanner i = new Scanner (System.in);
		
		for (int i = 0; i < 100; i++) {
		
		buchDB[i].Vorname = in.next (); 
		buchDB[i].Nachname = in.next ();
		buchDB[i].titel = in.next ();
		buchDB[i].jahr = in.nextInt();
		buchDB[i].ISBN = in.nextInt();
		buchDB[i].preis = in.nextInt();
		}
		
		for (int i = 0; i < 100; i++) {
		
		if (buchDB[i].jahr <= 1999){ 
		if (buchDB[i].jahr >= 50){ 
		
		System.out.println("Titel"+ buchDB[i].titel);
		System.out.println("Vorname"+ buchDB[i].Vorname);
		System.out.println("Nachname"+ buchDB[i].Nachname);
		System.out.println("ISBN"+ buchDB[i].ISBN);
		System.out.println("Preis"+ buchDB[i].preis);
		System.out.println("Jahr"+ buchDB[i].jahr);
		
		
		}
		}
		}
```


----------



## JaninaSt (2. Mai 2012)

Also deine zwei If-Bedingungen stimmen glaub ich nicht ganz mit deiner Angabe überein. (Größer - Kleiner Zeichen vertauscht)
Außerdem prüfst du den Preis auch beim Eintrag des Jahres statt des Preises.

Und du kannst statt den beiden if-Bedingungen, deine beiden Bedingungen in eine zusammenfassen, mit einem && dazwischen. So kommt es nur zur Ausgabe, wenn beide gleichzeitig erfüllt sind.

So zum Beispiel:

```
if(auto.DB[i].jahr >=1995 && auto.DB[i].preis < 50[/]

Hilft dir das?

Oder brauchst du noch was bestimmtes?
```


----------



## profkalas (2. Mai 2012)

[OT]Sinnvoll die vorherigen Posts zu lesen[/OT]

besser mit gettern arbeiten.


----------



## profkalas (2. Mai 2012)

Was mir grade auffällt.. was soll das:

```
main (){
```

ganz oben?
Wenn das Programm nicht funktioniert deiner Meinung nach probiers aus


----------



## JimmyFly (2. Mai 2012)

am besten ihr ändert das gleich in meinem Quelltext


----------



## Firephoenix (2. Mai 2012)

Compiliert der Code überhaupt?

da steht eine main() ohne Parameter direkt unter den imports, in der Methode wird eine Klasse angelegt, das Array vom Typ Bibo wird mit dem Typ Buch initialisiert, Bibo erbt aber nicht von Buch, in der for-schleife werden im Array keine Objekte angelegt, die zugriffe dannach müssten daher NPE werfen.

Gruß


----------



## profkalas (2. Mai 2012)

mir fällt grad noch was auf...


```
buchDB[i].Vorname = in.next (); 
        buchDB[i].Nachname = in.next ();
        buchDB[i].titel = in.next ();
        buchDB[i].jahr = in.nextInt();
        buchDB[i].ISBN = in.nextInt();
        buchDB[i].preis = in.nextInt();
```

was willst du hier mit in.next() bezwecken?
Muss heissen nach meinem Beispiel scan.next();

dann zum Thema deiner Integer..:


```
buchDB[i].jahr = in.nextInt();
        buchDB[i].ISBN = in.nextInt();
        buchDB[i].preis = in.nextInt();
```

muss heissen:


```
buchDB[i].jahr = Integer.parseInt(scan.next());
        buchDB[i].ISBN = Integer.parseInt(scan.next());
        buchDB[i].preis = Integer.parseInt(scan.next());
```

greetz


----------



## JimmyFly (2. Mai 2012)

nein es compleliert nicht ... 

main (){   soll   public static void main(String[] args) {     sein


----------



## profkalas (2. Mai 2012)

Firephoenix hat gesagt.:


> Compiliert der Code überhaupt?
> 
> da steht eine main() ohne Parameter direkt unter den imports, in der Methode wird eine Klasse angelegt, das Array vom Typ Bibo wird mit dem Typ Buch initialisiert, Bibo erbt aber nicht von Buch, in der for-schleife werden im Array keine Objekte angelegt, die zugriffe dannach müssten daher NPE werfen.
> 
> Gruß



In dem Code compiliert nichts..
Nochmal basiswissen aneignen..


----------



## JaninaSt (2. Mai 2012)

Stimmt, das main() ganz oben passt auch nicht.

Prinzipieller Aufbau wär zum Beispiel :


```
import java.util.Scanner.*;

class Bibo {
	public static void main(String[] args) {
	
	//Hauptmethode 
	
	}
 }
```

Probier das einfach mal zu ändern.


----------



## profkalas (2. Mai 2012)

JimmyFly hat gesagt.:


> nein es compleliert nicht ...
> 
> main (){   soll   public static void main(String[] args) {     sein



Schau meinen vorletzten Post an, ist schonmal die Behebung eines Fehlers.


----------



## profkalas (2. Mai 2012)

Brauchst sowieso mehr Arrays, kannst nem Array nicht soviele Sachen zuweisen.

Das wird nichts, dir fehlen Kenntnisse.


----------



## JimmyFly (2. Mai 2012)

Ich habe jetzt mal versucht alle Beitrage bzw. Verbesserungen einzufügen. Aber es funktioniert immer noch nicht. Es passt irgendwas an der for schleife noch nicht ... 


```
import java.util.Scanner.*;
 
class Bibo {
    public static void main(String[] args) {
    
    String eingabe;
	Scanner scan= new Scanner(System.in);
	System.out.print("Bitte Werte eingeben: ");
	eingabe= scan.next();
    
		String Vorname; 
		String Nachname; 
		String titel; 
		int ISBN;
		int jahr; 
		int preis;
		}
		
		Bibo buchDB[] = new Buch[100]; 
		
		 
		
		for (int i=0;i<100;i++) {
		
		buchDB[i].Vorname = scan.next (); 
		buchDB[i].Nachname = scan.next ();
		buchDB[i].titel = scan.next ();
		buchDB[i].jahr = Integer.parseInt(scan.next());
        buchDB[i].ISBN = Integer.parseInt(scan.next());
        buchDB[i].preis = Integer.parseInt(scan.next());
		}
		
		for (int i=0;i<100;i++); {
		
		if (buchDB[i].jahr <= 1999 && buchDB[i].jahr > 50){ 
		
		
		System.out.println("Titel"+ buchDB[i].titel);
		System.out.println("Vorname"+ buchDB[i].Vorname);
		System.out.println("Nachname"+ buchDB[i].Nachname);
		System.out.println("ISBN"+ buchDB[i].ISBN);
		System.out.println("Preis"+ buchDB[i].preis);
		System.out.println("Jahr"+ buchDB[i].jahr);
		
		
		
		}
		}
		}
```


----------



## Firephoenix (2. Mai 2012)

Da passt so einiges noch nicht,
das Problem ist in etwa das gleiche als würdest du versuchen ein Auto zu bauen und wirfst dafür ne grobe Form aus Pappe und ein paar Bilder aus Automagazinen in einen Mixer und wunderst dich warum es nicht losfährt - der Code sieht zwar so ähnlich aus wie eine Lösung, aber ähnlich aussehen ist dem Compiler und eventuellen Tests egal, entweder es passt oder es passt nicht.

Nun aber konkret zur Aufgabe um das ganze hier mal etwas ins Rollen zu bringen.

Zerleg erstmal dein Problem:
1. Du brauchst sowas wie ein Buch mit den passenden Attributen (OOP sollte hier als Begriff fallen)
2. Du musst aus Benutzereingaben heraus ein Buch (oder mehrere) erzeugen können
3. Du musst 100 Bücher im Programm speichern (Arrays/Listen?)
4. Du musst die Bücher nach einem Auswahlkriterium ausgeben

Eine Klasse für das Buch könnte etwa so aussehen (ich halte mich bewusst in der klasse mal nicht an englische Namen um an dem beispiel von dem TO zu bleiben)

```
public class Buch
{

    String titel;

    String autorVorname;

    String autorNachname;

    String isbn;

    int jahr;

    int preis;

    public Buch( String titel, String autorVorname, String autorNachname, String isbn, int jahr, int preis )
    {
        this.titel = titel;
        this.autorVorname = autorVorname;
        this.autorNachname = autorNachname;
        this.isbn = isbn;
    }
}
```

jetz könntest du z.B. mit 
	
	
	
	





```
new Buch("Buchtitel", "Max", "Mustermann","978-3-86680-192-9",1942,9);
```
ein neues Buch erzeugen (die isbn habe ich mal als string gewählt, ich kenne mich mit isbn nicht aus, glaube aber als int wäre die nummer nicht mehr eindeutig)

Zu dem Inputproblem könnte man sich doch so etwas vorstellen (die Klassen die ich hier benutze gibt es (noch) nicht, aber man kann sie ja schreiben):

```
Buch[] buecher = InputToBookParser.parseBooksFromCommandLine(5);
```
Die Methode kriegt als eingabe die Zahl wieviele Bücher erstellt werden sollen (in dem Fall 5) und gibt dir ein entsprechend großes Array zurück, allerdings nie mehr als 100 Bücher im Array.

Die Klasse InputToBookParser könnte grob so aussehen, es fehlt die Methode die ein einzelnes Buch von der Kommandozeile ließt

```
public class InputToBookParser
{

    public static Buch[] parseBooksFromCommandLine( int bookCount )
    {
        if ( bookCount > 100 )
        {
            // Warnung hierzu: es ist generell schlechter Stil Eingabeparameter neu zu setzen
            // besser wäre eine neue Variable anzulegen und sie z.b. so anzulegen:
            // int newBookCount = bookCount > 100 ? 100 : bookCount;
            // ich finde es hier trotzdem übersichtlicher für anfänger einfach den parameter
            // neu zu setzen, seiteneffekte nach außen hat es in dem Fall ja nicht
            bookCount = 100;
        }
        Buch[] bookArray = new Buch[bookCount];

        for ( int i = 0; i < bookArray.length; i++ )
        {
            bookArray[i] = parseSingleBookFromCommandLine();
        }

        return bookArray;

    }

    private static Buch parseSingleBookFromCommandLine()
    {
        String titel = null;
        String autorVorname = null;
        String autorNachname = null;
        String isbn = null;
        int jahr = 0;
        int preis = 0;
        
        // Eingabeparameter passend von der Kommandozeile lesen (z.B. mit Scanner)
        
        return new Buch( titel, autorVorname, autorNachname, isbn, jahr, preis );

    }

}
```

Jetzt musst du dich nur noch um die Verwaltung und die Ausgabe kümmern, außerdem muss man das Programm starten können, das könnte grob so aussehen:

```
public class BookDatabase
{

    public static void main( String[] args )
    {
        Buch[] books = InputToBookParser.parseBooksFromCommandLine( 3 );
        printMatchingBooks( books );
    }

    private static void printMatchingBooks( Buch[] books )
    {
        for(Buch actualBook : books){
            if(bookMatches(actualBook)){
                printBook(actualBook);
            }
        }
        
    }

    private static boolean bookMatches( Buch actualBook )
    {
        // Die Methode muss true zurückgeben wenn das Buch den Filteranforderungen entspricht
        return false;
    }

    private static void printBook( Buch actualBook )
    {
        // Übergebenes Buch auf der Konsole ausgeben
        // (alternativ toString in Buch überschreiben und das Buch direkt als Ausabe benutzen)

    }
}
```

Jetzt würdest du 3 Bücher von der Kommandozeile lesen, diese in dem Array books speichern und anschließend alle bücher auf der Konsole ausgeben die den Anforderungen entsprechen.

Dein großes Problem kann also relativ leicht zerlegt werden wenn man sich kurz Gedanken darüber macht wie man das ganze auf einige wenige Klassen aufteilt. 
Hierfür benötigst du auch lediglich einfache Java-Kenntnisse (Klassen, Konstruktoren, Methoden, static, nicht-static), das implementieren dieser kleinen Methoden sind dagegen wieder überschaubare Probleme, besonders da du dich mit Benutzereingaben schon beschäftigt hast.

(das ganze ist natürlich nur ein Ansatz wie ich grob Nachts um 23 Uhr anfangen würde - Methodennamen, Datentypen etc muss man so mit Sicherheit nicht festnageln und die Aufgabe kann ohne weiteres auch mit anderen Ansätzen gelöst werden - ich hoffe es hilft trotzdem dabei etwas Übersicht zu gewinnen)

Gruß


----------



## JimmyFly (3. Mai 2012)

profkalas hat gesagt.:


> Brauchst sowieso mehr Arrays, kannst nem Array nicht soviele Sachen zuweisen.
> /QUOTE]
> 
> Heute habe ich nochmal nachgefragt und mein Tutor hat gesagt das man mehrere Bedingungen bzw. Variablen in einen Array einfügen kann


----------



## ARadauer (3. Mai 2012)

profkalas hat gesagt.:


> Brauchst sowieso mehr Arrays, kannst nem Array nicht soviele Sachen zuweisen.
> 
> Das wird nichts, dir fehlen Kenntnisse.



Dir auch....


----------

