Array-Aufgabe Bücher

JimmyFly

Mitglied
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:

Java:
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.
 
Zuletzt bearbeitet von einem Moderator:
P

profkalas

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

HimBromBeere

Top Contributor
Java:
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:
Code:
int i = 0; i < 100; i++
 
P

profkalas

Gast
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.
 
P

profkalas

Gast
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..

Java:
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

Mitglied
Habe es nochmal bearbeitet


Java:
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

Aktives Mitglied
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:
Code:
if(auto.DB[i].jahr >=1995 && auto.DB[i].preis < 50[/]

Hilft dir das?

Oder brauchst du noch was bestimmtes?
 
Zuletzt bearbeitet:
P

profkalas

Gast
Was mir grade auffällt.. was soll das:
Java:
main (){

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

Firephoenix

Gast
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ß
 
P

profkalas

Gast
mir fällt grad noch was auf...

Java:
        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..:

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

muss heissen:

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

greetz
 
P

profkalas

Gast
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

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

Prinzipieller Aufbau wär zum Beispiel :

Java:
import java.util.Scanner.*;

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

Probier das einfach mal zu ändern.
 
Zuletzt bearbeitet:
P

profkalas

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

Das wird nichts, dir fehlen Kenntnisse.
 

JimmyFly

Mitglied
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 ...

Java:
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);
		
		
		
		}
		}
		}
 
F

Firephoenix

Gast
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)
Java:
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
Java:
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):
Java:
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
Java:
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:
Java:
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ß
 

Neue Themen


Oben