簡體   English   中英

我的程序中的無限循環

[英]Infinite loop in my program

好的,所以對於我的學校項目,我們基本上制作了一個最多 20 人的菜單,可以輸入信息並在需要時進行更改。 一切正常。 然而,我們的任務讓我們檢查郵政編碼的輸入和整數值的帳戶余額。 我使用 do-while 循環進行 ZipCode 驗證,直到輸入一個正數和一個數字。 但是,我得到了一個似乎無法修復的無限循環。 這是我的代碼。 如果放入編譯器,則錯誤位於第 57-68 行。 每次我輸入一個字母而不是一個整數時,我都會得到一個無限循環。 但我想不通為什么。 謝謝!

#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>

using namespace std;

struct Account //Structure to be used throughout
{
     string CustomerName; 
     string CustomerAddress;
     string City;
     string State;
     int ZIPCode;
     string Telephone;
     int AccountBalance;
     string DateOfLastPayment;

};



//function prototypes 
void valueChangeFunc(string, Account[], int);//This function will be used in option 2 for editing a certain customer information



int main()
{
    Account array[20]; //Array to hold up to 20 customers 
    int choice;  //this will hold which option the user decides to make 1-4
    bool flagZip = false; //This will be used later on as a flag for a do-while loop
    bool flag = false; //This will be used as a flag for the do-while loop right now
    int index = 0; //Index for our customers. This tells how many customers have been entered
    do //This do while loop will continue to ask the user what option to do until array fills up with 20 people and 4 is not entered
    {
    cout << "1. Enter new account information \n" <<endl 
     << "2. Change account information \n" << endl
     << "3. Display all account information\n" <<endl
     << "4. Exit the program \n" <<endl;
     cin >> choice; 
if (choice > 4 || choice <= 0)//If user enters a number bigger than 4 or less then or equal to 0. Error! 
cout << "Please enter a number between 1 and 4" << endl;

else if(choice == 1)
{
cout << "CustomerName: ";
        cin.ignore();
    getline(cin, array[index].CustomerName);
    cout << "CustomerAddress ";
    getline(cin, array[index].CustomerAddress);
    cout << "City: ";
    getline(cin, array[index].City);
    cout << "State: ";
    getline(cin, array[index].State);

    do
    {
    cout << "Zip Code: ";
    cin >> array[index].ZIPCode;
    cin.ignore();
    if (!isdigit(array[index].ZIPCode) && array[index].ZIPCode <= 0)
    cout << "Please enter a valid entry " << endl;

    else 
    flagZip = true;

    }while(flagZip == false);

    cout << "Telephone: ";
    getline(cin, array[index].Telephone);

    flagZip = false;

    do 
    {
    cout << "AccountBalance: ";
    cin >> array[index].AccountBalance;
    cin.ignore();
    if (array[index].AccountBalance <= 0)
    cout << "Please enter a valid entry " << endl;

    else
    flagZip = true;
    }while(flagZip == false); 

    cout << "DateOfLastPayment: ";
    getline(cin, array[index].DateOfLastPayment);


    cout << "\n\nCustomerName: " << array[index].CustomerName << endl;
    cout << "CustomerAddress " << array[index].CustomerAddress <<endl;
    cout << "City: " << array[index].City << endl;
    cout << "State: " << array[index].State << endl;
    cout << "Zip Code: " << array[index].ZIPCode << endl;
    cout << "Telephone: " << array[index].Telephone <<endl;
    cout << "AccountBalance: " << array[index].AccountBalance << endl;
    cout << "DateOfLastPayment: " << array[index].DateOfLastPayment << endl;
    cout << "You have entered information for customer number " << index << endl << endl;

    index++;
}
else if(choice == 2 && index != 0)
{
int num;
string valueChange;
do
{
cout << "  Customer number: ";
cin >> num;

if (num > (index-1) || num < 0)
cout << " There is no customer with that number " << endl;

}while (num > (index-1));
    cout << "\n\nCustomer Name: " << array[num].CustomerName << endl;
    cout << "Customer Address " << array[num].CustomerAddress <<endl;
    cout << "City: " << array[num].City << endl;
    cout << "State: " << array[num].State << endl;
    cout << "ZIPCode: " << array[num].ZIPCode << endl;
    cout << "Telephone: " << array[num].Telephone <<endl;
    cout << "Account Balance: " << array[num].AccountBalance << endl;
    cout << "Date of last payment: " << array[num].DateOfLastPayment << endl;
    cout << "You have requested information for customer number " << num << endl << endl;

    cout << "What value do you want to change? (press 4 to change 'Date of last payment') \n"; 
    cin.ignore();
    getline(cin,valueChange);

    valueChangeFunc(valueChange, array, num);

    cout << "\nHere is the new value you entered for " << valueChange << endl;

    cout << "\n\nCustomer Name: " << array[num].CustomerName << endl;
    cout << "Customer Address " << array[num].CustomerAddress <<endl;
    cout << "City: " << array[num].City << endl;
    cout << "State: " << array[num].State << endl;
    cout << "ZIPCode: " << array[num].ZIPCode << endl;
    cout << "Telephone: " << array[num].Telephone <<endl;
    cout << "Account Balance: " << array[num].AccountBalance << endl;
    cout << "Date of last payment: " << array[num].DateOfLastPayment << endl << endl;

}

else if(choice == 3 && index != 0)
{
    int num2;
do
{
    cout << "Enter the Customer Number to display information regarding that customer" << endl;
    cin >> num2; 
if (num2 > (index-1) || num2 < 0)
cout << "That Customer does not exist " <<endl; 
}
while(num2 > (index-1));


    cout << "\n\nCustomerName: " << array[num2].CustomerName << endl;
    cout << "CustomerAddress " << array[num2].CustomerAddress <<endl;
    cout << "City: " << array[num2].City << endl;
    cout << "State: " << array[num2].State << endl;
    cout << "Zip Code: " << array[num2].ZIPCode << endl;
    cout << "Telephone: " << array[num2].Telephone <<endl;
    cout << "AccountBalance: " << array[num2].AccountBalance << endl;
    cout << "DateOfLastPayment: " << array[num2].DateOfLastPayment << endl;
    cout << "You have entered information for customer number " << index << endl << endl;

}

else 
flag = true;

}while (flag == false);

    return 0;
}

void valueChangeFunc(string valueChange2, Account array[], int num)
{
    if (valueChange2 == "Customer Name" || valueChange2 == "Customer name" || valueChange2 == "customer Name" || valueChange2 == "customer name")
    {
    cout << "\nEnter new value for Customer Name: " <<endl;
    getline(cin, array[num].CustomerName);

    }

    if (valueChange2 == "Customer Address" || valueChange2 == "Customer address" || valueChange2 == "customer Address" || valueChange2 == "customer address")
    {
    cout << "\nEnter new value for Customer Address: " <<endl;
    getline(cin, array[num].CustomerAddress);

    }
    else if(valueChange2 == "city" || valueChange2 == "City")
    {
        cout << "\nEnter new value for City: " << endl;
        getline(cin, array[num].City);

    }
    else if(valueChange2 == "state" || valueChange2 == "State")
    {
        cout << "Enter a value for State: " << endl;
        getline(cin,array[num].State);

    }

    else if(valueChange2 == "Zip Code" || valueChange2 == "zip Code" || valueChange2 == "Zip code" || valueChange2 == "zip code")
    {
        cout << "\nEnter a value for Zip Code: " << endl;
        cin >> array[num].ZIPCode;

    } 

    else if(valueChange2 == "telephone" || valueChange2 == "Telephone")
    {
        cout << "\nEnter a value for Telephone: " << endl;
        getline(cin, array[num].Telephone);

    }

    else if(valueChange2 == "Account Balance" || valueChange2 == "Account balance" || valueChange2 == "account Balance" || valueChange2 == "account balance")
    {
        cout << "\nEnter a value for account balance: " << endl;
        cin >> array[num].AccountBalance;

    }
    else if(valueChange2 == "4")
    {
        cout << "\nEnter the value for Date of last payment: " << endl;
        getline(cin, array[num].DateOfLastPayment);

    }

    else 
    cout << "Not entered correctly. Please enter a valid entry to edit " << endl;

}

一切正常,直到我開始使用循環來檢查 ZipCode 的數字值。 當我輸入一個字母時,循環只會無限循環。 它適用於負數和正數。

簡答可在 cplusplus.com 中找到(閱讀第三段)

長答案:

此錯誤不僅僅與 ZipCode 有關,當您在第一次調用cin時輸入字母而不是數字時,您可能會生成相同的錯誤。

cin不是類型安全的,因此使用錯誤的類型作為輸入會導致未定義的行為(例如您遇到的無限循環),這就是為什么cin有點容易出錯的原因。 此外, cin獲取輸入值,但它不會刪除換行符,而是從其他方法獲得的內容中讀取更臟的輸入。

說到其他方法,如鏈接中所述,盡可能嘗試使用getline() 您可以使用該函數來獲取cin緩沖區包含的字符串,並在必要時進行額外的類型檢查。 無錯誤程序比較短的程序更重要。

作為個人說明:盡可能使用while循環而不是do..while循環。 這不是編程的一般規則,但它看起來更具可讀性並且更容易理解(恕我直言)。

此外,嘗試使用函數將您的程序拆分為多個部分。 例如,您只是打印存儲到屏幕上的信息的cout塊可以變成一個函數。 您使用的是相同的cout結構(它會將您的代碼縮短 4 * 9 行)。

最后,如果您使用整數作為鍵值來分隔算法,請嘗試使用switch...case而不是if-else塊。 (再次,只是我的意見)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM