簡體   English   中英

C ++代碼可以編譯,但是輸出錯誤……初始化函數是錯誤的嗎?

[英]C++ code compiles, but gives wrong output…initialize function is wrong?

我知道聲明丟失了,但是代碼可以很好地編譯,但是輸出不能正確輸出...而不是字母,而是得到了¿。 我相信問題出在初始化函數中,我似乎無法弄清楚它是什么。

void printResult(ofstream& outFile, letterType letterList[], int listSize)
{
    int i;
    int sum = 0;
    double Percentage = 0;

    cout << "PRINT" << endl;

    for (i = 0; i < 52; i++)
    sum += letterList[i].count;

    outFile << fixed << showpoint << setprecision(2) << endl;

    outFile << "Letter  Count   Percentage of Occurrence" << endl;

    for (i = 0; i < 52; i++)
    {
    outFile << "  " << letterList[i].letter << "     "
    << setw(5) << letterList[i].count;

    if (sum > 0)
        Percentage = static_cast<double>(letterList[i].count) /
        static_cast<double>(sum) * 100;
    /*
     Calculates the number of Occurrence by dividing by the total number of
     Letters in the document.
     */
    outFile << setw(15) << Percentage << "%" << endl;
    }

    outFile << endl;
}


void openFile(ifstream& inFile, ofstream& outFile)
{
    string inFileName;
string outFileName;

cout << "Enter the path and name of the input file (with extension): ";
getline(cin, inFileName);

    inFile.open(inFileName);
cout << endl;

    cout << "Your input file is " << inFileName << endl;
    cout << endl;

cout << "Enter the path and name of the output file (with extension): ";
getline(cin, outFileName);

outFile.open(outFileName);
cout << endl;

    cout << "The name of your output file is " << outFileName << endl;
    cout << endl;

}

void initialize(letterType letterList[])
{

    //Loop to initialize the array of structs; set count to zero
    for(int i = 0; i < 26; i++)
    {
    //This segment sets the uppercase letters
    letterList[i].letter = static_cast<char>('A' + i);
    letterList[i].count = 0;

    //This segment sets the lowercase letters
    letterList[i + 26].letter = static_cast<char>('a' + i);
    letterList[i + 26].count = 0;
    }

}

void count(ifstream& inFile, letterType letterList[], int& totalBig, int& totalSmall)
{

cout << "COUNT WORKING" << endl;
char ch;
//read first character
inFile >> ch;

//Keep reading until end of file is reached
while( !inFile.eof() )
{
    //If uppercase letter or lowercase letter is found, update data
    if('A' <= ch && ch <= 'Z')
    {
        letterList[static_cast<int>(ch) - 65].count++;
    }
    else if('a' <= ch && ch <= 'z')
    {
        letterList[static_cast<int>(ch) - 97].count++;
    }

    //read the next character

    inFile >> ch;


} //end while
} //end function

===============

驅動程式碼

int main()
{
    struct letterType letterList[52]; //stores the 52 char we are going to track stats on

    int totalBig = 0; //variable to store the total number of uppercase
    int totalSmall = 0; //variable to store the total number of lowercase

    ifstream inFile;
    //defines the file pointer for the text document
    ofstream outFile;
    //the file pointer for the output file
    cout << "MAIN WORKING" << endl;

    openFile(inFile, outFile);
    //allow the user to specify a file for reading and outputting the stats

    /*if (!inFile || !outFile)
    {
        cout << "***ERROR*** /n No such file found" << endl;
        return 1;
    }
    else
        return 1;
    *///Check if the files are valid

    initialize(&letterList[52]);
    //initalizes the letter A-Z, and a-z */


    count(inFile, &letterList[52], totalBig, totalSmall);
    // counts the letters

    printResult(outFile, letterList, 52);
    //writes out the stats

    //Close files
    inFile.close();
    outFile.close();



    return 0;
}

=====================

全計數功能

void count(ifstream& inFile, letterType letterList[], int& totalBig, int& totalSmall)
{

cout << "COUNT WORKING" << endl;
char ch;
//read first character
inFile >> ch;

//Keep reading until end of file is reached
while( !inFile.eof() )
{
    //If uppercase letter or lowercase letter is found, update data
    if('A' >= ch && ch <= 'Z')
    {
        letterList[ch - 'A'].count++;
    }
    else if('a' >= ch && ch <= 'z')
    {
        letterList[(ch - 'a') + 26].count++;
    }

    //read the next character

    inFile >> ch;


} //end while
} //end function

計數邏輯的編寫令人困惑,並且掩蓋了一個錯誤(它會折疊情況):

if('A' <= ch && ch <= 'Z')
{
    letterList[static_cast<int>(ch) - 65].count++;
}
else if('a' <= ch && ch <= 'z')
{
    letterList[static_cast<int>(ch) - 97].count++;  // <--- a bug here
}

這通過增加第一個元素的計數來對'a'作出反應,看起來它打算作為'A'的計數。 可以通過抵消小寫字母來輕松解決此問題,也可以重寫小寫字母,以便更清楚地了解正在執行的操作:

if ('A' <= ch  &&  ch <= 'Z')
{
    letterList[static_cast<int>(ch - 'A')].count++;  // count uppercase
}
else if ('a' <= ch  &&  ch <= 'z')
{
    letterList[static_cast<int>(ch - 'a') + 26].count++;  // count lowercase
}

至於主要的錯誤,在任何地方都不會調用initialize()

初始化被錯誤地調用為initialize(&letterList[52]); 這將嘗試初始化條目52、53 ...103。我很驚訝它沒有段錯誤。

它應該被稱為

initialize(letterList);

您的功能運行正常。

在驅動程序代碼中,您使用錯誤的argumnets調用了這些函數

檢查這些行,他們應該像這樣

initialize(&letterList[0]);
//initalizes the letter A-Z, and a-z */


count(inFile, &letterList[0], totalBig, totalSmall);

在將letterList數組傳遞給函數時,應將指針傳遞到數組中的第一個元素。 您應該通過&letterList[0]或簡單地通過letterList

暫無
暫無

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

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