Проблемы с тем, что кажется бесконечными циклами при вызове функций в операторе switch (даже если функция не содержит l oop) - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь создать действительно простое текстовое меню, используя операторы switch для назначения класса. Проблема заключается в том, что при вызове различных функций, которые я сделал в разных случаях оператора switch, кажется, что никогда не заканчивается.

Учитывая, что одна и та же проблема, кажется, происходит со всеми функциями в моем операторе switch. думаю, что это может быть связано с самим оператором switch, а не с отдельными функциями, хотя я, честно говоря, пока не знаю.

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

Пример вывода:


==================
1. Admission's Office
2. Student
3. End Program
==================
Enter your choice: 1

Enter the password: 123

******************
1. Add a new student
2. Add new students from a file
3. Drop a student
4. View one students info
5. View all students info
******************
Enter your choice: 1

Enter the first name: First Name

Enter the last name: Last Name

Enter the gender: m

Enter the first name: It should only ask me once

Enter the last name: Why is this looping?

Enter the gender: ????

Enter the first name:
Enter the last name: ???????

Enter the gender: a

Enter the first name: ^C

Код

//main.cpp
int main() {
  Student stuAr[SIZE];
  int choice, password, userInput;
  int numStu = 0;
  bool valid;

  do {
    userMenu();
    cin>>choice;
    cout<<endl;

    switch(choice){
    case 1:
      cout<<"Enter the password: ";
      cin>>password;
      cout<<endl;

      valid = checkPass(password);
      if (valid) {
        adminMenu();
        cin>>choice;
        cout<<endl;

        do {
          switch(choice) {
          case 1:
            addStu(stuAr, numStu);
            break;

          case 2:
            addStuFile(stuAr, numStu);
            break;

          case 3:
            cout<<"Enter the student ID: ";
            cin>>userInput;
            cout<<endl;
            dropStu(stuAr, numStu, userInput);
            break;

          case 4:
            cout<<"Enter the student ID: ";
            cin>>userInput;
            cout<<endl;
            viewStu(stuAr, numStu, userInput);
            break;

          case 5:
            viewAllStu(stuAr, numStu);
            break;
          }
        }while(choice != 6);
      }
      else {
        cout<<"The password is wrong."<<endl;
      }
      break;

    case 2:

      break;
    }
  }while(choice != 3);

  return 0;
//still main.cpp
//addStu function for case 1 of the nested switch statement
void addStu(Student stuAr[], int& numStu) {
  cin.ignore();
  cout<<"Enter the first name: ";
  stuAr[numStu].setFN();
  cout<<endl;

  //cin.ignore();
  cout<<"Enter the last name: ";
  stuAr[numStu].setLN();
  cout<<endl;

  cout<<"Enter the gender: ";
  stuAr[numStu].setGender();
  cout<<endl;

  numStu++;
  return;
}

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вы никогда не перечитываете choice в своем внутреннем l oop.

if (valid) {
adminMenu();
cin>>choice; // only done once, therefore do loop never terminates
cout<<endl;
do {
  switch(choice) {
  case 1:
    addStu(stuAr, numStu);
    break;
  // ...
  }
  // after switch-case, add:
  cin >> choice;
  cout << endl;
0 голосов
/ 20 февраля 2020

Вы никогда не измените choice во внутреннем do..while l oop, и поэтому условие choice != 6 всегда будет истинным, если вы не введете его в первый раз.

...