Вложенные операторы if становятся очень длинными и трудными для обзора того, что на самом деле не так - PullRequest
0 голосов
/ 29 февраля 2020

Это продолжение проекта из моего последнего вопроса. Это в основном программа, которая возвращает консольные сообщения, получая пользовательский ввод со сканером. Это школьная программа, в которой есть класс, создающий оценки с помощью ArrayLists, в котором ученики хранятся в соответствующих классах. Некоторые учащиеся также могут быть выступающими в классе или учащимися, которые также хранятся в собственных списках ArrayList. Программа просит пользователя ввести категорию, которая ведет к основному пути через вложенные операторы if. Если операторы if не выполняются, сообщение об ошибке появляется на консоли и возвращается к началу.

Способ, которым я настраиваю программу, должен работать с вложенными операторами if, но это все еще вызывает проблемы, и я не знаю, что делать.

Я из Германии, поэтому прошу прощения за некоторые немецкие слова в программе.

Это код:

    package package_Fachklassen;

    import java.util.Scanner;

    public class Startklasse {

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

    Schulklasse sk1, sk2;
    sk1 = new Schulklasse("WG 13-1");
    sk2 = new Schulklasse("WG 13-2");

    Sprecher ks1, sss1;
    ks1 = new Sprecher("Klassensprecher");
    sss1 = new Sprecher("Schülersprecher");

    Spezial kS1, kS2, kS3, kS4, sS1, sS2;
    kS1 = new Spezial("Cem", "Yildiz", 19, sk2, ks1);
    kS2 = new Spezial("Fatima", "Baba", 19, sk2, ks1);
    kS3 = new Spezial("Rüveyda", "Yildiz", 20, sk1, ks1);
    kS4 = new Spezial("Zvoni", "Jogovic", 19, sk1, ks1);
    sS1 = new Spezial("Cem", "Yildiz", 19, sk2, sss1);
    sS2 = new Spezial("Fatima", "Baba", 19, sk2, sss1);

    ks1.addKlassensprecher(kS1);
    ks1.addKlassensprecher(kS2);
    ks1.addKlassensprecher(kS3);
    ks1.addKlassensprecher(kS4);
    sss1.addSchuelersprecher(sS1);
    sss1.addSchuelersprecher(sS2);


    //Klasse 13-1

    Schueler s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20;
    s1 = new Schueler("Gonzalo", "Cofre Real", 18, sk1);
    s2 = new Schueler("Swaastika", "Yogeswaran", 19, sk1);
    s3 = new Schueler("Derin", "Sipahi", 19, sk1);
    s4 = new Schueler("Henry", "Reinhold", 19, sk1);
    s5 = new Schueler("Sara", "Perkovic", 19, sk1);
    s6 = new Schueler("Honia", "Aref", 19, sk1);
    s7 = new Schueler("Finn", "Bolheimer", 17, sk1);
    s8 = new Schueler("Karoline", "Garkos", 18, sk1);
    s9 = new Schueler("Hannah", "Hirth", 18, sk1);
    s10 = new Schueler("Sarah", "Schwarz", 18, sk1);
    s11 = new Schueler("Rüveyda", "Yildiz", 20, sk1);
    s12 = new Schueler("Jibi", "Saji", 18, sk1);
    s13 = new Schueler("Rida", "Jafari", 18, sk1);
    s14 = new Schueler("Patrick", "Bruhn", 18, sk1);
    s15 = new Schueler("Andre", "Rosenau", 19, sk1);
    s16 = new Schueler("Irini", "Chrisivolanto", 19, sk1);
    s17 = new Schueler("Xenia", "Aschenbrenner", 19, sk1);
    s18 = new Schueler("Kristina", "Jokic", 19, sk1);
    s19 = new Schueler("Yavuz", "Salik", 21, sk1);
    s20 = new Schueler("Zvonimir", "Jogovic", 19, sk1);


    sk1.addSchueler(s1);
    sk1.addSchueler(s2);
    sk1.addSchueler(s3);
    sk1.addSchueler(s4);
    sk1.addSchueler(s5);
    sk1.addSchueler(s6);
    sk1.addSchueler(s7);
    sk1.addSchueler(s8);
    sk1.addSchueler(s9);
    sk1.addSchueler(s10);

    //Klasse 13-2

    Schueler ss1, ss2, ss3, ss4, ss5, ss6, ss7, ss8;
    ss1 = new Schueler("Cem", "Yildiz", 19, sk2);
    ss2 = new Schueler("Fathima", "Baba", 19, sk2);
    ss3 = new Schueler("Sanjie", "Bislimi", 19, sk2);
    ss4 = new Schueler("Jasmine", "Jaffari", 19, sk2);
    ss5 = new Schueler("Hannah", "Arent", 19, sk2);
    ss6 = new Schueler("Niklas", "Genf", 18, sk2);
    ss7 = new Schueler("Celina", "Musollaj", 18, sk2);
    ss8 = new Schueler("Naomi", "Schmidt", 19, sk2);

    sk2.addSchueler(ss1);
    sk2.addSchueler(ss2);
    sk2.addSchueler(ss3);
    sk2.addSchueler(ss4);
    sk2.addSchueler(ss5);
    sk2.addSchueler(ss6);

    String schueler = "Schüler";
    String sprecher = "Sprecher";


    String ksSuche = "KS-Suche";
    String ssSuche = "SS-Suche";
    String ksAlle = "KS-Alle";
    String ssAlle = "SS-Alle";

    while(true) 
    {   
        Scanner firstscan = new Scanner(System.in);
        System.out.println("Nach welcher Kategorie suchen Sie?");
        String f_input = firstscan.nextLine();
        boolean studentmissing = true;
            if(f_input.equals(schueler)) 
            {
                Scanner scan = new Scanner(System.in);
                System.out.println("Welche Klasse besucht der gesuchte Schüler?");
                String k_input= scan.nextLine();

                    if(k_input.equals(sk1.getBezeichnung())) 
                    {
                        System.out.println("Welchen SChüler aus Klasse 13-1 suchen Sie?");
                        String n_input = scan.nextLine();
                        for(int i = 0; i < sk1.getListenLaenge(); i++) 
                        {
                            if(n_input.equals(sk1.getSchueler(i).getName()) || n_input.equals(sk1.getSchueler(i).getNachname())) 
                            {
                                studentmissing = false;
                                System.out.println("Ihr Schüler:");
                                System.out.println(" " + sk1.getSchueler(i).getName());
                                System.out.println(" " + sk1.getSchueler(i).getNachname());
                                System.out.println(" " + sk1.getSchueler(i).getAlter());
                                break;
                            }
                        }
                        if(studentmissing) 
                        {
                        System.out.println("Schüler existiert nicht oder ist nicht in dieser Klasse!");
                        System.out.println("--------------------------------------------------------");
                        }

                    }
                    else if(k_input.equals(sk2.getBezeichnung())) 
                    {
                        System.out.println("Welchen Schüler aus Klasse 13-2 suchen Sie?");
                        String n2_input = scan.nextLine();
                        for(int i = 0; i < sk1.getListenLaenge(); i++)
                        {
                            if(n2_input.equals(sk2.getSchueler(i).getName()) || n2_input.equals(sk2.getSchueler(i).getNachname()))
                            {
                                studentmissing = false;
                                System.out.println("Ihr Schüler:");
                                System.out.println(" " + sk2.getSchueler(i).getName());
                                System.out.println(" " + sk2.getSchueler(i).getNachname());
                                System.out.println(" " + sk2.getSchueler(i).getAlter());
                                break;
                            }
                        }
                        if(studentmissing) 
                        {
                            System.out.println("Schüler existiert nicht oder ist nicht in dieser Klasse!");
                            System.out.println("--------------------------------------------------------");
                        }
                    }
                }

                else if(f_input.equals(sprecher))
                {
                    Scanner ksScanner = new Scanner(System.in);
                    System.out.println("Suchen Sie nach Klassensprechern oder Schülersprechern?");
                    String ks_input = ksScanner.nextLine();

                    if(ks_input.equals(ksSuche))
                    {
                        System.out.println("Geben sie den Namen der gesuchten Person ein!");
                        String sn_input = firstscan.nextLine();
                        boolean ksMissing = true;
                        for(int i = 0; i < ks1.getListLengthKS(); i++)
                        {
                            if(sn_input.equals(ks1.getKlassensprecher(i).getName()) || sn_input.equals(ks1.getKlassensprecher(i).getNachname()))
                            {
                                ksMissing = false;
                                System.out.println("Ihr Schüler:");
                                System.out.println(" " + ks1.getKlassensprecher(i).getName());
                                System.out.println(" " + ks1.getKlassensprecher(i).getNachname());
                                System.out.println(" " + ks1.getKlassensprecher(i).getAlter());
                                break;
                            }
                        }
                        if(ksMissing) 
                        {
                                System.out.println("Schüler ist nicht gespeichert!");
                                System.out.println("-------------------------------------------------");
                        }
                    }
                }
                else if(f_input.equals(ssSuche))
                {
                    System.out.println("Geben sie den Namen des Schülersprechers ein!");
                    String ss_Input = firstscan.nextLine();
                    boolean ssMissing = true;
                    for(int i = 0; i < sss1.getListLengthSS(); i++) 
                    {       
                        if(ss_Input.equals(sss1.getSchuelersprecher(i).getName()) || ss_Input.equals(sss1.getSchuelersprecher(i).getNachname()))
                        {
                            ssMissing = false;
                            System.out.println("Ihr Schüler:");
                            System.out.println(" " + sss1.getSchuelersprecher(i).getName());
                            System.out.println(" " + sss1.getSchuelersprecher(i).getNachname());
                            System.out.println(" " + sss1.getSchuelersprecher(i).getAlter());
                            break;
                        }

                    }
                    if(ssMissing) 
                    {
                        System.out.println("Schüler ist nicht gespeichert!");
                        System.out.println("-------------------------------------------------");
                    }
                }
                else if(f_input.equals(ksAlle)) 
                {
                    ks1.showKlassensprecher();
                }
                else if(f_input.equals(ssAlle))
                {
                    sss1.showSchuelersprecher();
                }
            }

    }           
}

Большая часть функции выполняется. Проблемы появляются в случае значения, которое не удовлетворяет условию. И каждая функция из «else if (f_input.equals (ssSuche))» просто возвращается к началу.

Вот некоторые примеры из консоли в случае поиска ученика:

    Nach welcher Kategorie suchen Sie?
    Schüler
    Welche Klasse besucht der gesuchte Schüler?
    WG 13-1
    Welchen SChüler aus Klasse 13-1 suchen Sie?
    Derin
    Ihr Schüler:
    Derin
    Sipahi
    19
    Nach welcher Kategorie suchen Sie?
    Schüler
    Welche Klasse besucht der gesuchte Schüler?
    WG 13-1
    Welchen SChüler aus Klasse 13-1 suchen Sie?
    Cem
    Schüler existiert nicht oder ist nicht in dieser Klasse!
    --------------------------------------------------------
    Nach welcher Kategorie suchen Sie?
    Schüler
    Welche Klasse besucht der gesuchte Schüler?
    WG 13-2
    Welchen Schüler aus Klasse 13-2 suchen Sie?
    Cem
    Ihr Schüler:
    Cem
    Yildiz
    19
    Nach welcher Kategorie suchen Sie?
    Schüler
    Welche Klasse besucht der gesuchte Schüler? 
    WG 13-2
    Welchen Schüler aus Klasse 13-2 suchen Sie? 
    Derin
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
         at java.util.ArrayList.rangeCheck(Unknown Source)
         at java.util.ArrayList.get(Unknown Source)
         at package_Fachklassen.Schulklasse.getSchueler(Schulklasse.java:27)
         at package_Fachklassen.Startklasse.main(Startklasse.java:144)

Это пример другого вывода консоли:

    Nach welcher Kategorie suchen Sie?
    Sprecher
    Suchen Sie nach Klassensprechern oder Schülersprechern?
    KS-Suche
    Geben sie den Namen der gesuchten Person ein!
    Cem
    Ihr Schüler:
     Cem
     Yildiz
     19
    Nach welcher Kategorie suchen Sie?
    Sprecher
    Suchen Sie nach Klassensprechern oder Schülersprechern?
    KS-Suche
    Geben sie den Namen der gesuchten Person ein!
    Derin
    Schüler ist nicht gespeichert!
    -------------------------------------------------
    Nach welcher Kategorie suchen Sie?
    Sprecher
    Suchen Sie nach Klassensprechern oder Schülersprechern?
    SS-Suche
    Nach welcher Kategorie suchen Sie?
    Sprecher
    Suchen Sie nach Klassensprechern oder Schülersprechern?
    KS-Alle
    Nach welcher Kategorie suchen Sie?
    Sprecher
    Suchen Sie nach Klassensprechern oder Schülersprechern?
    SS-Alle
    Nach welcher Kategorie suchen Sie?

1 Ответ

2 голосов
/ 29 февраля 2020

Несмотря на то, что отсутствуют классы, а ваш пример кода представляет собой код спагетти, я попытался проанализировать его в своем уме. Я заметил много ненужного дублирования кода. Когда вы программировали с помощью копирования, вставки и редактирования, вы допустили ошибку (возможно, и другие ошибки, я просто остановился на первой, которую заметил):

        else if (k_input.equals(sk2.getBezeichnung())) {
          System.out.println("Welchen Schüler aus Klasse 13-2 suchen Sie?");
          String n2_input = scan.nextLine();
          for (int i = 0; i < sk1.getListenLaenge(); i++) {
            //                ^^^
            //             Uh-oh, this should be sk2!

При попытке обработать второй класс (немецкий: Schulklasse) sk2, но итерируя по длине списка sk1 (в котором учится больше студентов, чем sk2), неудивительно, что вы получаете IndexOutOfBoundsException, потому что студент № 6 не существует в sk2, только студенты # 0 до # 5.


Обновление: Я только что заметил, что в вашем вопросе есть второй вопрос / проблема, то есть, почему поиск "Schulsprecher" не работает как и ожидалось. У вас есть структурная ошибка во вложенном if-else:

      else if (f_input.equals(ssSuche)) {
        System.out.println("Geben sie den Namen des Schülersprechers ein!");
        String ss_Input = firstscan.nextLine();

На самом деле здесь (а также в двух следующих случаях) вы не хотите сравнивать f_input с ssSuche, а использовать ks_input для сравнения. Кроме того, else if должны быть добавлены к внутреннему if, а не к внешнему. Вы понимаете о чем я?


Я вижу, что вы новичок в программировании, поэтому, пожалуйста, не беспокойтесь. Вы учитесь, делая и исправляя ошибки. :-) Но я рекомендую вам попросить кого-то более опытного помочь вам преобразовать ваш код спагетти во что-то более читаемое, менее избыточное и более удобное в обслуживании и тестируемом. У вас есть много ненужных жестко запрограммированных вещей, которые следует обобщить, чтобы вам больше не нужно было копировать и изменять код. Удачи!

PS: Если вы действительно делаете sh свой проект на GitHub, как я и предлагал, я могу показать вам, как реорганизовать этот беспорядок, используя набор небольших Git коммитов, чтобы вы могли смотрите шаг за шагом, что я делаю. Может быть, это поможет вам понять, как написать лучший код.

...