# Programmähnliche Datenbank



## mexas450 (14. Jun 2014)

Hallo Leute,

soll von der Uni aus ein Programm schreiben was einer Datenbank ähnlich ist. Quasi wo man Namen mit Datum usw. einpflegen kann bzw auch nach bestimmten Personen suchen kann und sich dann die eingepflegten Daten sich anzeigen lassen kann. Weiß nicht so recht ob das hier der richtige Bereich für dieses Thema ist!?!?! Wenn nicht bitte einfach verschieben. Wie wäre nach eurer Meinung nach der richtige Weg zum beginnen.

Ansonsten hätte ich noch ne Frage! Ist es möglich in java,wenn ein Passwort verlangt wird, dass dieses durch **** auf der Konsole angezeigt wird und nicht die Zahlen?

Danke schon mal für die Tipps....


----------



## JavaMeister (14. Jun 2014)

1. Tipp vielleicht mal das Problem mit googel chekcen?


----------



## turtle (14. Jun 2014)

> wo man Namen mit Datum usw. einpflegen kann


Trivialerwiese kann ich mir vorstellen, die Daten in einer Properties-Datei zu halten.


Attribut1.bezeichnung = Vorname
Attribut1.wert = Turtle
Attribut2.bezeichnung = Datum
Attribut2.wert  = 02.06.2003

Attribut1.bezeichnung = Vorname
Attribut1.wert  = Merkel
Attribut2.bezeichnung = Datum
Attribut2.wert = 17.07.1954

Also eine Liste 1..n von Tupeln mit Attribut-Namen(Bezeichnungen)/Werten. Kann erweitert werden, (bei dir oben das usw.), und kann Namen,Datum bereithalten. Du kannst darin suchen und editieren. 



> wenn ein Passwort verlangt wird, dass dieses durch **** auf der Konsole


Da fehlen Informationen, wie der Input gemacht wird. Konsole, Swing, JavaFX,..?


----------



## ChristianK (14. Jun 2014)

@turtle: Da speicherst du tonnenweise redundante Informationen, die zu inkonsitenz führen werden.

Wie wäre es mit XML?


----------



## ARadauer (14. Jun 2014)

Warum nicht einfach im Speicher halten... um nix anderes wirds bei der Aufgabe gehen

Einfach ein paar Datensätze in einer liste abelgen und methoden schreiben um darin zu suchen...

@mexas450: weißt du was ein objekt ist?


----------



## mexas450 (20. Jun 2014)

Hallo Leute,

sorry das ich jetzt erst anworte. Menge zu tun gehabt für Uni.
Ich hatte schon etwas zusammen bekommen, was dem Dozenten aber nicht gefiel.
Hatte vier Datenbanken für die jeweiligen Person(Studenten, Professoren, Studentische Hilfskräfte, sonstige Mitarbeiter) geschrieben. Nun sollte ich aber eine Datenbank für alle zutreffende Personen schreiben. Bin jetzt soweit das ich eine Oberklasse Person geschrieben habe wo gewisse Daten immer gleich sind.

Unterklasse zu Person ist bei mir erstmal zur Student, andere Unterklassen folgenden später. Komme jetzt aber nicht weiter. Ich weiß nicht wie ich der Person die zusatzlichen Information vom Studenten zuordnen kann.

Hier mal mein Programm was ich bis jetzt geschrieben habe.

Main-Programm

[Java]
package SWT1;

import java.util.*;

public class Main
{   
    public static Scanner sc = new Scanner(System.in);
    // Hauptprogramm
    private static final String Begruessung_STR = "\nWillkommen. Welche Art von Datensatz möchten Sie eingeben:"; 
    private static final String Wahl1_STR = "(1) Studierende";
    private static final String Wahl2_STR = "(2) Studentische Hilfskraft";
    private static final String Wahl3_STR = "(3) Professor";
    private static final String Wahl4_STR = "(4) Sonstiger Mitarbeiter";
    private static final String Wahl5_STR = "(5) Drucken";
    private static final String Wahl6_STR = "(9) Datenbank beenden";

    private static final String Begruessung1_STR = "\nWillkommen im Bereich für Studenten!\n";
    private static final String Untermenue1_1_STR = "(1) Neuen Studenten anlegen:";
    private static final String Untermenue1_2_STR = "(2) Hauptmenue:";

    private static final String Nachn_STR = "Nachname:";
    private static final String Vorn_STR = "Vorname:";
    private static final String Mtn_STR = "Matrikelnummer:";
    private static final String StG_STR = "Studiengang:";
    private static final String Alt_STR = "Alter:";
    private static final String Passw_STR = "Password:";
    private static final String Rec_STR = "Rechte:";

    private static final String Untermenue1_3_STR = "\n Ein neuer Student/in wurde in die Datenbank eingepflegt:";

    private static final String Eingabe1_STR = "\nBitte wählen Sie:";
    private static final String Fehleingabe_STR = "Flasche Eingabe!!!";

    private static final Database DBank = new Database(10);                     // Größe der Datenbank


    public static void main(String[] args) 
    {
        DBank.addPerson("Der","Test","qas","admim");                            // zur Probe zum drucken werden 4 Person erzeugt
        DBank.addPerson("Der2","Test2","qas","admim");             
        DBank.addPerson("Hallo","Du","wie","admin");                       
        DBank.addPerson("Hallo2","Du2","wie2","admin");                    

        do
        {
            Hauptmenue();

            int Auswahl = sc.nextInt();
            switch(Auswahl)
            {
                case 1: Menue_Studenten();
                break;

                case 5: DBank.printPerson();
                break;    

                case 9: return; 

                default: print_Fehler();
            }

        }while(true);    

    }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Beginn der Funktion_Methoden
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static void Hauptmenue()
{
    System.out.println(Begruessung_STR);
    System.out.println(Wahl1_STR);
    System.out.println(Wahl2_STR);
    System.out.println(Wahl3_STR);
    System.out.println(Wahl4_STR);
    System.out.println(Wahl5_STR);
    System.out.println(Wahl6_STR);
    System.out.println(Eingabe1_STR);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static void Menue_Studenten()
{
    System.out.println(Begruessung1_STR);
    System.out.println(Untermenue1_1_STR);
    System.out.println(Untermenue1_2_STR);

    int Auswahl = sc.nextInt();

    switch(Auswahl)
    {
        case 1: Eingabe_Studenten();
        break;

        case 2:
        break;

        default: print_Fehler();
    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static void Eingabe_Studenten()
{
    int a;

    do
    {
        System.out.print(Nachn_STR);
        String Nachname = sc.next();

        System.out.print(Vorn_STR);
        String Vorname = sc.next();

        System.out.print(Passw_STR);
        String Password = sc.next();                        

        System.out.print(Rec_STR);
        String Rechte = sc.next();

        System.out.print(StG_STR);
        String Studiengang = sc.next();

        System.out.print(Alt_STR);
        int Alter = sc.nextInt();

        System.out.print(Mtn_STR);
        int Matrikelnummer = sc.nextInt();

        DBank.addPerson(Nachname,Vorname,Password,Rechte);
   //   myStudent.Student(Matrikelnummer,Studiengang,Alter);

        System.out.println(Untermenue1_3_STR);
        System.out.println(Vorname+" "+Nachname+","+Passw_STR+"****"+Rec_STR+Rechte);  
        System.out.println("Weiteren Student anlegen? (1)");
        a = sc.nextInt();

    }while(a == 1);
}  
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static void print_Fehler()
{
    System.out.println (Fehleingabe_STR);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
}
[/Java]

class-Person

[Java]
package SWT1;

public class Person 
{
    private String Nachname,Vorname,Password,Rechte;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public Person(String Nachname,String Vorname,String Password,String Rechte) 
{
    this.Nachname = Nachname;
    this.Vorname = Vorname;
    this.Password = Password;
    this.Rechte = Rechte;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void printPerson() 
{
    System.out.println("\n  | Nachname: " + Nachname + 
                       "\n  | Vorname: " + Vorname +  
                       "\n  | Password: " + Password + 
                       "\n  | Rechte: " + Rechte );                  
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[/Java]

class-Student

[Java]
package SWT1;

public  class Student extends Person
{
    private String Studiengang;
    private int Matrikelnummer,Alter;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
public Student(String Nachname,String Vorname,String Password,String Rechte,int Matrikelnummer,String Studiengang,int Alter) 
{
    super(Nachname,Vorname,Password,Rechte);

    this.Matrikelnummer = Matrikelnummer;
    this.Studiengang = Studiengang;
    this.Alter = Alter;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
public void printStudent() 
{
    System.out.println("\n  | Matrikelnummer: " + Matrikelnummer + 
                       "\n  | Studiengang: " + Studiengang +  
                       "\n  | Alter: " + Alter );                  
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
}

[/Java]

class-Database

[Java]
package SWT1;

public class Database 
{
    private final Person[] Persons;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public Database(int size) 
{
    Persons = new Person[size];
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void printPerson()                                                       // Gibt alle Personen auf der Konsole aus
{
    for (Person s : Persons)                                                    // Felder im Array, die keinen Eintrag haben, werden ignoriert.
    {
        if (s != null) 
        {
            s.printPerson();
        }
    }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Wenn noch Platz in der Datenbank ist, wird eine neue Person erzeugt und
 * in die Datenbank eingefügt. Wenn die DB voll ist, wird eine Fehlermeldung ausgegeben.*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void addPerson(String Nachname,String Vorname,String Password,String Rechte) 
{
    int firstFreeIndex = -1;                                                    // Im Array wird das erste freie Feld gesucht

    for (int i = 0; i < Persons.length; i++) 
    {
            if (Persons_ == null)                                             // Gefunden!
            {

                    firstFreeIndex = i;
                    break;
            }
    }

    if (firstFreeIndex == -1)                                                   // Wenn firstFreeIndex immer noch -1 ist, wurde kein freies Feld gefunden -> Datenbank ist voll!
    {
        System.out.println("Datenbank voll!");
    } 
    else 
    {
        Persons[firstFreeIndex] = new Person(Nachname,Vorname,Password,Rechte); // Ansonsten genau an dieser Stelle eine neue Studierende einfügen.
    }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[/Java]_


----------



## mexas450 (20. Jun 2014)

Oder gibt es eine andere Möglichkeit dir Ihr mir zur Aufgabenlösung empfehlen könnt?


----------



## mexas450 (20. Jun 2014)

Versuche die Aufgabe jetzt über eine ArrayList zu lösen. Jedoch bekomme ich die Ausgabe der Objekte nicht hin.


```
package SWT1;

import java.util.ArrayList;


public class Main
{
    private static final ArrayList<Student> myStudent = new ArrayList<Student>(); 
    private static final ArrayList<Professor> myProfessor = new ArrayList<Professor>(); 
    private static final ArrayList<Assistant> myAssistant = new ArrayList<Assistant>(); 
    private static final ArrayList<Worker> myWorker = new ArrayList<Worker>(); 
    
    public static void main(String[] args) 
    {
        Student Student01 = new Student("Nachname","Vorname","Password","Rechte","Studiengang",28,59613);
        myStudent.add(Student01);
        
        Student Student0 = new Student("Nachname1","Vorname1","Password1","Rechte1","Studiengang1",28,59613);
        myStudent.add(Student0);
        
       
 
        System.out.println(myStudent);

    }
```

Ausgabe:

run:
[SWT1.Student@a32b, SWT1.Student@1d8957f]
BUILD SUCCESSFUL (total time: 0 seconds)


----------



## turtle (20. Jun 2014)

Student.toString() überschreiben


----------



## mexas450 (20. Jun 2014)

Sorry steh total auf den Schlauch!
Wie mach ich das?


----------



## mexas450 (20. Jun 2014)

Ok habs hinbekommen!!! Danke für den Tipp...


----------



## turtle (20. Jun 2014)

> private static final ArrayList<Student> myStudent = new ArrayList<Student>();


DAS ist kein guter Programmierstil.:noe:
Üblicherweise programmiert gegen Interfaces und daher schreibt man die Zeile:

```
List<Student> myStudent = new ArrayList<Student>();
```

Und über static und final solltest du auch noch mal nachdenken


----------



## MR_UNIX (20. Jun 2014)

Auch wenn es ein wenig Off-Topic ist: gibt es gute Gründe, gegen ein Interface zu programmieren? Ich habe es schon sehr oft in meiner Zeit mit Java gelesen aber bisher immer aus purer Boshaftigkeit ignoriert. Klar, man kann Zuweisungen schneller ändern, aber wenn ich nun eine spezielle Methode aufrufen möchte, die im Interface nicht vorgesehen ist? Soll ich dann eher casten oder doch die spezifische Implementierung nutzen?


----------



## ChristianK (21. Jun 2014)

Ja, es gibt gute Gründe. Allen voran die Austauschbarkeit. Sobald du anstelle einer ArrayList eine LinkedList möchtest, musst du den halben Code ändern. Wenn du jedoch stets gegen List programmierst nur eine Zeile.

Soweit mir bekannt ist, sind die Interfaces komplett, wenn sie das nicht sind ist es ein schlechtes Interface.


----------



## mexas450 (21. Jun 2014)

Ok also soll ich lieber anstatt:

[Java]
public static final List<Student> myStudent = new ArrayList<Student>(); 
[/Java]
 lieber das verwenden?
[Java]
List<Student> myStudent = new ArrayList<Student>(); 
[/Java]

jetzt habe ich aber das Problem das der Compiler meckern tut! Warum?

[Java]
Student Student = new Student("Nachname","Vorname","Password","Rechte","Studiengang",28,59613);
myStudent.add(Student);
[/Java]

myStudent.add(Student); ist jetzt ROT unterstrichen. Sieht man leider nicht. Fehlermeldung: non-static variable myStudent cannot be referenced from a static context.

Wenn ich es so schreibe:
[Java]
static List<Student> myStudent = new ArrayList<Student>(); 
[/Java]
ist die Fehlermeldung halt weg.

Soll ich es mit static ändern? Von Interface habe ich bis jetzt nur 30 min in der Vorlesung kurz gehört, aber nicht so wirklich verstanden. Müsste ich mich nochmal belesen.

Oder könnte mir das einer kurz erklären???

Hätte da noch ne Frage! Ich lege ja eine Liste mit dem Namen myStudent an! Die myStudent Liste hat mehrere Objekte mit dem Namen Student und Student hat wiederrum mehrere Eigenschaften, wie Nachname, Vorname usw.

Bin jetzt schon wieder am machen und tun, aber ich komm einfach nicht darauf wie ich in der Liste jetzt zum Bsp. nach einen bestimmten Nachnamen durchsuchen kann. wenn ich 

[Java]
if ("Nachname".equals(Student.Nachname))
{
      System.out.println("gefunden");
}
[/Java]

dann findet er mir den Nachnamen, aber ich will ja das er mir die komplette myStudent Liste durchsucht! Es muss ja irgendwie vorm Student.Nachname noch myStudent stehen. Habe auch schon einige Befehle ausprobiert die er mir vorschlägt wenn ich "myStudent. " eingebe. Bis jetzt bin ich aber noch nicht auf die Lösung gestossen.


----------



## turtle (21. Jun 2014)

Von Vorne

```
public class Main
{
    private static final ArrayList<Student> myStudent = new ArrayList<Student>(); 
    private static final ArrayList<Professor> myProfessor = new ArrayList<Professor>(); 
    private static final ArrayList<Assistant> myAssistant = new ArrayList<Assistant>(); 
    private static final ArrayList<Worker> myWorker = new ArrayList<Worker>();
```
Dies bedeutet, dass myStudent und die anderen Objekte, zur Klasse gehören und NICHT zur Instanz!

Wenn du also zwei Objekte vom Typ Main instanzierst, hast du trotzdem nur die ArrayListen EINMAL.

Daher kannst du aus einer statischen Methode (main) auch nicht auf eine Instanzvariable (myStudent) zugreifen, weil es ja gar kein Objekt gibt sondern "nur" die Klasse.

Du musst also ein Objekt vom Typ Main erstellen und kannst dann "normal" zugreifen.

```
public class Main {
    private List<Student> myStudent;

    public Main() {
	myStudent = new ArrayList<Student>();
	Student Student01 = new Student("Nachname", "Vorname", "Password", "Rechte", "Studiengang", 28, 59613);
	myStudent.add(Student01);

	Student Student0 = new Student("Nachname1", "Vorname1", "Password1", "Rechte1", "Studiengang1", 28, 59613);
	myStudent.add(Student0);

	System.out.println(myStudent);
    }

    public static void main(String[] args) {
	new Main();
    }
```


----------



## mexas450 (21. Jun 2014)

Man das ist doch alles eine F... S... wenn man keine Ahnung von der Materie hat. 

Aber glaube langsam bekomme ich das hin. Super Forum!!!!:toll::toll::toll:

Weitere Fragen werden auf jedenfall folgen!


----------



## mexas450 (21. Jun 2014)

Heißt das jetzt eigentlich das ich mein gesamtes Programm in der Main()-Methode schreibe?
Oder kann ich gewisse Abfragen die mit Student zu tun haben in main schreiben.


----------



## mexas450 (21. Jun 2014)

Wieso print er mir jetzt den Student0 2x? Student01 kommt in der print Anweisung gar nicht vor!


----------



## turtle (21. Jun 2014)

> Heißt das jetzt eigentlich das ich mein gesamtes Programm in der Main()-Methode schreibe?


Natürlich NICHT

Dies war "nur" zur Verdeutlichung von static Variablen, die du gemacht hast. Das machte hier aber wenig Sinn. Daher habe ich ein Objekt benötigt und da habe ich Main genommen und dann den Code im Konstruktor abgelegt.

Java-Programme bestehen aus einer Vielzahl von Objekten, die miteinander koopieren, um eine Lösung zu erstellen. 

Daher baut man Objekte die normalerweise nur EINE Sache können, keine zwei oder drei. Aber diese eine Sache machen sie richtig gut. Daher ist es blöd ein Objekt zu basteln, das ALLES kann, weil dann dieses Objekt sehr gross, schlecht wartbar und zudem fast nirgends weiter verwendet werden kann.



> Oder kann ich gewisse Abfragen die mit Student zu tun haben in main schreiben.


Das habe ich schon angedeutet. Der Name Main ist auch deshalb doof, weil er nicht vermittelt, was diese eine Sache ist, die diese Klasse kann. das nennt sich Abstraktion und mir ist nicht klar, welches Konzept Main abstrahiert. Die Klasse Student ist da besser, weil ich mir vorstellen kann, was ein Student ausmacht (Name,Alter, Matrikelnummer) und auch gewisse Operationen kann ich mir vorstellen (einschreiben, exmatrikulieren, etc.)  Wenn es in Main beispielsweise darum geht, eine Menge/Liste von Studenten zu manipulieren, wäre der Name ListStudent besser.

Das irgendwo mal eine main()-Methode existeren muss, die die gesamte Applikation "hoch fährt" ist ja klar. Diese kann aber in jeder geeigneten Klasse existieren.


----------



## turtle (21. Jun 2014)

In meiner Main sehe ich nur EINE Ausgabe

```
System.out.println(myStudent);
```


----------

