Java Hauptprogramm und Unterprogramm

Noob26

Mitglied
Hallo alle!

Habe ein kleines Problem, vielleicht könnt ihr mir helfen, denn ich stehe auf der Leitung.
Code:
Mein code:
public static void main(String[] args) {
        // TODO Auto-generated method stub

    
    
        //Im HP: Eingabe Titel , Vorname, Nachname und Geschlecht
    
        Scanner eingabe = new Scanner(System.in);
    
        System.out.println("Bitte geben Sie einen Titel ein: ");
        String titel = eingabe.next();
    
        System.out.println("Bitte geben Sie einen Vornamen ein: ");
        String vorname = eingabe.next();
    
        System.out.println("Bitte geben Sie Ihren Nachnamen ein: ");
        String nachname = eingabe.next();
    
        
        System.out.println("Bitte geben Sie Ihr Geschlecht ein: (\"m\" oder \"w\")");
        char geschlecht = eingabe.next().charAt(0);
  
static void anrede (String andrede) {
       
       
        if (geschlecht == 'm') {
           
            if (null != titel && titel == "-") {
               
                System.out.printf("Herr " + titel + " " + vorname + " " + nachname);
               
            }
            if (titel.equals("-")) {
               
                System.out.printf("Herr " + vorname + " " + nachname);
           
            }
        }
        else if (geschlecht == 'w') {
           
             if (null != titel && titel == "-") {
               
                System.out.printf("Frau " + titel + " " + vorname + " " + nachname);
               
             }
             if (titel.equals("-")) {
               
                System.out.printf("Frau " + vorname + " " + nachname);
               
             }
            
        else {
                System.out.println("Nochmals eingeben.");
       
            return;
        }
    }   
}
   
}

Jetzt soll ein Unterprogramm aufgerufen werden wo die Ausgaben stattfinden - also wenn in der Console eingegeben wird "Dr. "Max" "Mustermann" - soll ausgegeben werden "Herr Dr. Max Mustermann" wenn kein Titel vorhanden ist nur "Herr Max Mustermann". dasselbe in der weiblichen Form.
Ich habe was versucht aber ich bekomme nicht das gewünschte Ergebnis abgesehen davon ist es kein Unterprogramm...🙁

Info HP & UP können in einer Klasse sein.

Danke euch!
LG
 
Zuletzt bearbeitet:
Im 2. Thread ganz oben „Vor dem ersten Posten bitte lesen“ unter Punkt 6:

Verwende für Code-Passagen, die Java-Code enthalten die entsprechenden Syntaxhighlighting-Tags.

Danke.
 
Du vermischt hier den Aufruf und die Definition eines Unterprogrammes.
Hier einmal die Struktur, wie du sie brauchst:

Java:
public class UnterprogrammBeispiel {
    public static void main(String[] args) {
        String anrede = "Anrede";
        druckeAnrede(anrede);
        anrede = "etwas anderes";
        druckeAnrede(anrede);
    }
  
    static void druckeAnrede (String anrede) {
        if ( "Anrede".equals(anrede) ) {
            System.out.println("Es ist folgende Anrede : " + anrede);
        } else {
            System.out.println("Es ist keine Anrede, sondern : " + anrede);
        }
    }
}

Wie du siehst, wird das Unterprogramm außerhalb von main definiert. In main erfolgt (2x) der Aufruf.
In diesem Beispiel siehst du auch, dass Strings nicht mit == sondern mit equals verglichen werden.
Das Programm ist so lauffähig, sodaß du es selbst ausprobieren kannst.
Für deinen Zweck wirst du, wie mihe7 schon geschrieben hat, weitere Parameter im Unterprogramm definieren und beim Aufruf übergeben müssen...
 
Danke Dompteur für deine Hilfe -habe es gerade ausprobiert - danke dafür - ich habe auch versucht meines diesbezüglich zu adaptieren und scheitere leider jetzt bekomme ich gar keine Ausgabe mehr in der console...darf ich dir den Code zeigen: (nur zur info ich lerne gerade programmieren)


Java:
    public static void main(String[] args) {
        // TODO Auto-generated method stub

       
//Im HP: Eingabe Titel , Vorname, Nachname und Geschlecht
   
//    Scanner a = new Scanner(System.in);
//
//    System.out.println("Bitte geben Sie einen Titel ein:");
//    String titel = a.next();
//   
//    System.out.println("Bitte geben Sie einen Vornamen ein: ");
//    String vorname = a.next();
//   
//    System.out.println("Bitte geben Sie Ihren Nachnamen ein: ");
//    String nachname = a.next();
//   
//    System.out.println("Bitte geben Sie Ihr Geschlecht ein: (\"m\" oder \"w\")");
//    char geschlecht = a.next().charAt(0);
   
   
    String anrede = "Herr";
   
    druckAnrede(anrede);
   
    anrede = "Frau";
   
    druckAnrede(anrede);
   
    }
       
       
//Wenn Person keinen Titel hat soll ein Minus eingegeben werden verwendung von titel.equals("-")
       
       
//UP soll nun aus den Angaben alle sinnvollen Kombinationen ausgeben können.

    private static void druckAnrede(String anrede) {
        // TODO Auto-generated method stub
       
       
        if ("Herr".equals(anrede)) {
           
            System.out.println("Herr" + anrede);
           

        char geschlecht = 0;
       
        if (geschlecht == 'm') {
   
            String titel = null;
            String vorname = null;
            String nachname = null;
           
            if (titel != null && !titel.equals("-")) {

                System.out.printf("Herr " + titel + " " + vorname + " " + nachname);

}

        else if (titel.equals("-")) {

                System.out.printf("Herr " + vorname + " " + nachname);

}

}
        else if (geschlecht == 'w') {
           
            String titel = null;
            String vorname = null;
            String nachname = null;

            if (titel != null && !titel.equals ("-")) {

                System.out.printf("Frau " + titel + " " + vorname + " " + nachname);

}

            if (titel.equals("-")) {

                System.out.printf("Frau " + vorname + " " + nachname);

               
            } else {
               
                System.out.println("Frau" + anrede);
               
            }   
       
        }

}
}   

}
 
Wie oben schon geschrieben, kannst Du mehr als einen Parameter übergeben:

Java:
public static void main(String[] args) {
    Scanner a = new Scanner(System.in);

    System.out.println("Bitte geben Sie einen Titel ein:");
    String titel = a.next();
   
    System.out.println("Bitte geben Sie einen Vornamen ein: ");
    String vorname = a.next();
   
    System.out.println("Bitte geben Sie Ihren Nachnamen ein: ");
    String nachname = a.next();
   
    System.out.println("Bitte geben Sie Ihr Geschlecht ein: (\"m\" oder \"w\")");
    char geschlecht = a.next().charAt(0);

    zeige(geschlecht, titel, vorname, nachname);
}

static void zeige(char geschlecht, String titel, String vorname, String nachname) {
    // ... hier ausgeben
}
 
...ich habe auch versucht meines diesbezüglich zu adaptieren und scheitere leider jetzt bekomme ich gar keine Ausgabe mehr in der console...
Bei mir liefert dein Code die Ausgabe : HerrHerr
Mehr kann da auch nicht ausgegeben werden, weil deine Bedingungen in den anderen if-Anweisungen immer false ergeben.

Ich übergebe nun 2 weitere Parameter an die Methode "druckAnrede". Außerdem gebe ich (zu Testzwecken) alle Parameter in der Console aus:
Java:
    public static void main(String[] args) {
        String anrede = "Herr";
        char geschlecht = 'm';
        String titel = "-";
        druckAnrede(anrede, geschlecht, titel);

        anrede = "Frau";
        druckAnrede(anrede, geschlecht, titel);
    }

    private static void druckAnrede(String anrede, char geschlecht, String titel ) {
       System.out.println("Parameter Anrede = " + anrede);
       System.out.println("Parameter Geschlecht = " + geschlecht);
       System.out.println("Parameter Titel = " + titel);
     
        if ("Herr".equals(anrede)) {
            System.out.println("Herr" + anrede);

            if (geschlecht == 'm') {
                String vorname = null;
                String nachname = null;

                if (titel != null && !titel.equals("-")) {
                    System.out.printf("Herr " + titel + " " + vorname + " " + nachname);
                }
                else if (titel.equals("-")) {
                    System.out.printf("Herr " + vorname + " " + nachname);
                }
            }
            else if (geschlecht == 'w') {
                String vorname = null;
                String nachname = null;
                if (titel != null && !titel.equals ("-")) {
                    System.out.printf("Frau " + titel + " " + vorname + " " + nachname);
                }

                if (titel.equals("-")) {
                    System.out.printf("Frau " + vorname + " " + nachname);
                } else {
                    System.out.println("Frau" + anrede);
                }
            }
            System.out.println();            // neue Zeile beginnen.
        }
    }
Nun solltest du mehr sehen.
Als nächstes könntest du nach demselben Muster auch die restlichen 2 Namenselemente (vorname, nachname) als Parameter an die Methode übergeben.
Vergiß dabei aber nicht, die Zeilen "String vorname = null;" und jene für nachname in der Methode zu löschen.
 
Danke für eure Hilfe 🙂 Frage warum wird jetzt 2x in der Console nach Eingaben gefragt? Danke nochmals für eure Antworten 🙂 lg
Code:
Bitte geben Sie einen Titel ein:
Dr.
Bitte geben Sie einen Vornamen ein:
Maria
Bitte geben Sie Ihren Nachnamen ein:
Huber
Herr Dr. Maria HuberBitte geben Sie einen Titel ein:
Dr.
Bitte geben Sie einen Vornamen ein:
Maria
Bitte geben Sie Ihren Nachnamen ein:
Huber
Frau Dr. Maria Huber
 
Wie ist eigentlich der aktuelle Projektstand ? Ansonsten sieht man am Output, dass bei Unterscheidung männlich, weiblich (,divers) wohl etwas fehlgeschlagen ist (Herr Dr. Maria Huber)
 
Scanner eingabe = new Scanner(System.in);

System.out.println("Bitte geben Sie einen Titel ein: ");
String titel = eingabe.next();

System.out.println("Bitte geben Sie einen Vornamen ein: ");
String vorname = eingabe.next();

System.out.println("Bitte geben Sie Ihren Nachnamen ein: ");
String nachname = eingabe.next();


System.out.println("Bitte geben Sie Ihr Geschlecht ein: (\"m\" oder \"w\")");
char geschlecht = eingabe.next().charAt(0);
Die Zielsetzung deines Codes ist, sofern ich das richtig verstehe.
1) Die Eingabe gewisser Kriterien einer Person über die Konsole.
2) Ein formatierte Ausgabe dieser Kriterien.
Der Thread läuft unter dem Thema Hauptprogramm und Unterprogramm. Also wann verwende ich eine Funktion am besten. Der obige Code zeigt, wie du den Punkt 1), die Eingabe realisierst. Bei genauer Betrachtung fällt auf, dass 3x (eigentlich 4x) dasselbe passiert. Du gibst einen Hinweis aus und liest eine Zeichenkette ein. Genau hier ist eine Funktion geeignet. Die 4te Eingabe machst du auch nicht ganz richtig, da du an der Stelle nur 2 Eingaben erlaubst ( m, w) und dein Code die erwartete Eingabe nicht garantiert.
Am besten formulieren wir hier eine Funktion die, die Eingabe garantiert. Wie sollen die Parameter dieser Funktion aussehen und was gibt sie zurück.
Wir wollen einen String einlesen, einen Hinweis ausgeben und eventuell die Eingabe auf gewisse Zeichenketten eingrenzen.
Java:
public static String inputText(String label, Scanner in, String[] set){..}
Der Scanner wird für die Eingabe verwendet. Das label wird für den Hinweis benötigt. Set verwenden wir so, dass falls null übergeben wird, alle Eingaben erlaubt sind. Andernfalls wird die Eingabe so lange wiederholt bis ein gültige gemacht wurde.
Das Hauptprogramm zu Punkt 1) könnte mit dieser Funktion dann so formuliert werden.
Java:
public final static String[] geschlechtSet = { "m", "w", "inter" };
    public final static String[] anredeSet = { "Herr", "Frau", "Herr/Frau", "" };
    public final static String[] titelSet = { "Dr", "Prof", "Ing", "" };

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String bitte = "Bitte geben Sie ";
        String titel = inputText(bitte + "einen Titel ein:", in, titelSet);
        String vorname = inputText(bitte + "einen Vornamen ein:", in, null);
        String nachname = inputText(bitte + "einen Nachnamen ein:", in, null);
        String geschlecht = inputText(bitte + "das Geschlecht ein:", in, geschlechtSet);
        ..
    }
Das Ganze ist jetzt viel übersichtlicher und vor allem kann die Funktion bei weiteren Eingaben wieder verwendet werden, was das Wesentliche bei einer Funktion ist. Außerdem lässt sich die Eingabe jetzt auch auf gewisse Eingaben beschränken. Z.B. titelSet erlaubt Dr, Prof, Ing oder keinen Titel. Durch hinzufügen von weiteren Titeln lässt sich die Menge beliebig erweitern.
Mein Vorschlag. Konzentriere dich zuerst auf Punkt 1), nimm obigen Code und versuche die Funktion inputText() zu schreiben.😉
 
Danke @Blender3D - aber das ist mir schon ein bisschen noch zu fortgeschritten 🙂 habe deinen Ansatz trotzdem ausprobiert bin aber leider gescheitert 🙁

habe die andere variante jetzt finalisiert: sieht gut aus 🙂 möchte mich herzlich bei allen bedanken die so nett waren und mir geholfen haben LG Noob

Code:
        public static void main(String[] args) {
           
           
            Scanner a = new Scanner(System.in);

            System.out.println("Bitte geben Sie den Vornamen ein:");
            String vorname = a.next();

            System.out.println("Bitte geben Sie den Nachnamen ein:");
            String nachname = a.next();

            System.out.println("Bitte geben Sie m oder w für das Geschlecht ein:");
            String geschlecht = a.next();

            System.out.println("Bitte geben Sie den Titel ein. Wenn keinen Titel vorhanden, geben Sie - ein: ");
            String titel = a.next();


            System.out.println(anrede(vorname, nachname, titel, geschlecht));
              
                a.close();

            }
       
            public static String anrede(String vorname, String nachname, String titel, String geschlecht) {

            String geschlechtsoutput;

            if (geschlecht.equals("m")) {
               
            geschlechtsoutput = "Herr";
           
            } else {
               
            geschlechtsoutput = "Frau"; }
           

            String titeloutput;

            if (titel.equals("-")) {
               
            titeloutput = " ";
           
            } else {
               
            titeloutput = titel; }

            String output = geschlechtsoutput + " " + titeloutput + " " + vorname + " " + nachname;
           
            return output;


            }
           
        }
 
😉
Danke @Blender3D - aber das ist mir schon ein bisschen noch zu fortgeschritten 🙂 habe deinen Ansatz trotzdem ausprobiert bin aber leider gescheitert 🙁
Es freut mich, dass Du zu einer Lösung gekommen bist🙂. Falls Dich die Lösung mit Funktionen interessiert, dann probiere sie einfach aus und versuche sie zu verstehen. Es wird dich auf alle Fälle weiterbringen. 😉
Java:
import java.util.Scanner;

public class start {
    public final static String[] geschlechtSet = { "m", "w", "inter" };
    public final static String[] anredeSet = { "Herr", "Frau", "Herr/Frau", "" };
    public final static String[] titelSet = { "Dr", "Prof", "Ing", "" };

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String bitte = "Bitte geben Sie ";
        String titel = inputText(bitte + "einen Titel ein:", in, titelSet);
        String vorname = inputText(bitte + "einen Vornamen ein:", in, null);
        String nachname = inputText(bitte + "einen Nachnamen ein:", in, null);
        String geschlecht = inputText(bitte + "das Geschlecht ein:", in, geschlechtSet);
        System.out.println(toPersonString(titel, vorname, nachname, geschlecht));
    }

    /**
     * @param set
     *            Das Array in dem gesucht wird.
     * @param txt
     *            Der zu suchende String.
     * @return true falls txt in set enthalten ist.
     */
    public static boolean containsStr(String[] set, String txt) {
        return findStr(set, txt) >= 0;
    }

    /**
     * Sucht in einem Array nach einem String.
     *
     * @param set
     *            Das Array in dem gesucht wird.
     * @param txt
     *            Der zu suchende String.
     * @return Die Postition des Strings im Array oder -1
     */
    public static int findStr(String[] set, String txt) {
        if (set == null)
            return -1;
        for (int i = 0; i < set.length; i++) {
            if (set[i].equals(txt))
                return i;
        }
        return -1;
    }

    /**
     * Eingabe eines String. Bei gesetztem set wird die Eingabe so lange wieder holt
     * bis ein gültiger Text eingegeben wurde.
     *
     * @param label
     *            Angezeigter Text für die Eingabe.
     * @param in
     *            Scanner für die Eingabe,
     * @param set
     *            Array mit gültigen eingabe Strings Bei null ist jeder String
     *            erlaubt.
     * @return Eingegebenen String.
     */
    public static String inputText(String label, Scanner in, String[] set) {
        String txt = null;
        boolean ok = false;
        do {
            System.out.println(strArrayToString(set)); // zeige die Eingabemöglichkeiten an
            System.out.print(label); // zeige den Eingabehinweis an
            txt = in.nextLine();// lese die Eingabe
            if (set == null || set.length == 0) // bei leerem set ist alles erlaubt
                ok = true;
            else { // sonst
                if (containsStr(set, txt)) // ok bei gültiger eingbabe
                    ok = true;
            }
        } while (!ok);
        return txt;
    }

    public static String strArrayToString(String[] set) {
        if (set == null)
            return "";
        String out = "[ ";
        for (String s : set)
            out += s + " ";
        return out + "]";
    }

    public static String toPersonString(String titel, String vorname, String nachname, String geschlecht) {
        int id = findStr(geschlechtSet, geschlecht);
        String out = "";
        if (id >= 0)
            out += anredeSet[id] + " ";
        if (!titel.equals(""))
            titel += ". ";
        out += titel + vorname + " " + nachname;
        return out;
    }
}
 
Achte dabei auf die Leerzeichen, sd es dabei keine doppelten oder vergessenen Leerzeichen gibt:

Java:
Scanner scanner = new Scanner(System.in);
String buf;

String form;
String title = "Leer";
String firstname;
String surname;
String midname = "Leer";

System.out.println("Bitte Geschlecht (m/w):");
buf = scanner.nextLine();
if (buf.equals("m")) {
    form = "m";
} else {
    form = "w";
}

System.out.println("Bitte Vornamen:");
buf = scanner.nextLine();
firstname = buf;

System.out.println("Bitte Nachnamen:");
buf = scanner.nextLine();
surname = buf;

System.out.println("Bitte mittleren Namen (oder leer):");
buf = scanner.nextLine();
if (!buf.isBlank()) {
    midname = buf;
}

System.out.println("Haben Sie einen Doktortitel (j/n):");
buf = scanner.nextLine();
if (buf.equals("j")) {
    title = "Dr.";
}

System.out.println(
          "Anrede: Sehr "
        + (form.equals("m") ? "geehrter Herr " : "geehrte Frau ")
        + (title.equals("Leer") ? "" : "Dr. ")
        + firstname + " "
        + (midname.equals("Leer") ? "" : midname + " ")
        + surname + ".");

Beispiel
Bitte Geschlecht (m/w):
w
Bitte Vornamen:
Bla
Bitte Nachnamen:
Blaa
Bitte mittleren Namen (oder leer):
Blaaa
Haben Sie einen Doktortitel (j/n):
j
Anrede: Sehr geehrte Frau Dr. Bla Blaaa Blaa.
 
Was geschieht im obigen Code, wenn
Kenne mich damit nicht so gut aus (mit der aktuellen Rechtslage), aber ist das nicht im Sinne des ?

Also die Frage wäre hier einfach, welches Geschlecht standardmäßig gewählt werden sollte, zum Bleistift bei vergesslichkeit. 🙁 Einige Frauen möchten als Herr angeschrieben werden und wiederum einige als Frau. Vice versa.

Aus Sicht des Code Style sehe ich darin kaum Fehler.
 
Kenne mich damit nicht so gut aus (mit der aktuellen Rechtslage), aber ist das nicht im Sinne des ?
In Deutschland drei gesetzlich anerkannte Geschlechter, in anderen Ländern gibts andere Regelungen. Deshalb einfach gar keine Annahmen dazu hart im Code haben (was seit X Jahren schon eine Empfehlung ist, dass es mehr als nur zwei Geschlechter gibt, ist ja schon zig Jahre bekannt.)

Also die Frage wäre hier einfach, welches Geschlecht standardmäßig gewählt werden sollte, zum Bleistift bei vergesslichkeit. 🙁
Keins. Einfach das Geschlecht nicht abfragen und fertig. (Damit ist man auch Datenschutztechnisch auf der sicheren Seite.) Wenn man‘s doch braucht, macht man eine Zwangsangabe draus und fertig. Bei Name und Adresse ist man ja auch nicht per Default Max Mustermann aus 54321 Musterstadt...

Wenn man eine Anrede braucht, ...
Einige Frauen möchten als Herr angeschrieben werden und wiederum einige als Frau. Vice versa.
... dann fragt man einfach eine Anrede ab. Problem gelöst. Wenn eine Angabe erforderlich ist, dann macht man die einfach zum Zwang und braucht keinen Default.
 
Kenne mich damit nicht so gut aus (mit der aktuellen Rechtslage), aber ist das nicht im Sinne des ?
Angedacht ist hier die Auswahl zwischen 2 Möglichkeiten. Aber der gepostete Code übernimmt bei einer Fehleingabe automatisch eine vielleicht nicht gewollte Auswahl. Hier wäre eine Wiederholungsschleife sinnvoll, um die richtige Eingabe sicher zu stellen.
Im Post #18 habe ich eine Beispiel gepostet, das diese Eingabe sicherstellt und außerdem dem Thema Hauptprogramm und Unterprogramm entspricht.
Siehe auch Post #16.
 
Danke nochmals @Blender 3D habe mir deinen Code nochmals genauer unter die Lupe genommen und verstehe ihn jetzt besser. Und auch danke @Tobias-nrw für deine Unterstützung - btw wollte nie eine rechtliche Diskussion auslösen zum Thema Geschlechter 😉 jeder soll als das bezeichnet werden was er sein möchte 🙂 LG Noob
 

Zurück
Oben