多次读入数组

时间:2016-04-30 04:52:49

标签: c++ arrays search indexing

我的代码有点麻烦。它几乎应该打开两个文件,并比较文件的前二十行" StudentAnswers.txt" [作为char输入char数组]对照(另一个文件的每一行)中的char值" CorrectAnswers.txt"在同一位置(索引)的另一个数组中。它类似于线性搜索,但在数组中的位置相同。然后应该显示一份报告,详细说明学生错过了哪个问题,给定答案,正确答案,以及学生是否通过(得到> = 70%),如下所示:

学生X的报告:  2(A / D),3(C / D),5(D / A) 这名学生通过了考试!

然后它应该清除SAArray,并从StudentAnswers.txt中提供接下来的20行,然后重新开始这个过程。我想该程序必须确定学生人数(#And; StudentAnswers.txt' file / 20)。

我在显示报告时遇到问题,并且在程序结束后让阵列自行清除。我猜这可以用一个while循环和一个累加器来完成学生数量(由上面的等式确定)。 此外,Visual Studio似乎转到"错过__问题总共___%",然后继续循环-858993460。

任何帮助都将不胜感激。

#include <iostream>
#include <fstream>
#include <string>
#include <array>
#include <algorithm>

using namespace std;

void GradeReturn(char[], char[], int, int, int);
string PassFail(float);

int main()
{
    ifstream SA("StudentAnswers.txt");
    ifstream CA("CorrectAnswers.txt");char CAArray[20];
    char SAArray[20];
    // char SA2Array[20];
    bool isCorrect;
    int correct;
    int incorrect;
    int counter;

    correct = 0;incorrect = 0;
    counter = 0;

    cout << endl;


    if (!SA.fail())
    {
        cout << "'StudentAnswers.txt' file opened successfully." << endl;
        cout << "'CorrectAnswers.txt' file opened successfully." << endl << endl;

        int a = 0;
        int b = 0;

        while (a < 20)
        {
            CA >> CAArray[a];
            a++;
        } // while loop to feed char into the array

        while (b < 20)
        {
            SA >> SAArray[b];
            b++;

        }
    } // while loop to feed char into array

    CA.close(); // closing "CorrectAnswers.txt"
    SA.close(); // closing "StudentAnswers.txt"

    GradeReturn(&CAArray[counter], &SAArray[counter], correct, incorrect, counter);

    return 0;
}

void GradeReturn(char CAArray[], char SAArray[], int correct, int incorrect, int counter)
{
    float percent;
    float hundred;
    int student;
    int catcher[20];
    int writeCatcher;   int starter;
    int catcher_size;

    student = 0;
    writeCatcher = 0;
    catcher_size = ((sizeof catcher) / 4);

    while (counter < 20)
    {

        if ((CAArray[counter]) == (SAArray[counter]))
        {
            correct++;
            cout << "Good job!" << endl;
        } // correct handling
        else
        {
            incorrect++;
            cout << "You got question " << counter << " wrong." << endl;
            counter >> catcher[writeCatcher];

            writeCatcher++;
        } // incorrect handling

        counter++;
    } // while loop to determine if a student got a question right or wrong

    static_cast <float> (incorrect); // float conversion

    cout << endl; // for cleanliness

    percent = ((static_cast <float> (correct)) / 20); // percentage
    hundred = percent * 100;

    PassFail(percent);


    if (PassFail(percent) == "pass")
    {
        student++;
        cout << "Report for Student " << student << ":" << endl;
        cout << "-----------------------------" << endl;

        cout << "Missed " << incorrect << " questions out of 20 for ";
        cout << hundred << " % correct." << endl << endl;

        starter = 0;

        while (starter < (sizeof catcher)
        {
            if(1=1)
            {
                catcher_size
            }

            else
            {
                cout << "";
                starter++;
            }
        }

    }
    else if (PassFail(percent) == "fail")
        {
            student++;
            cout << "Missed " << incorrect << " questions out of 20 for ";
            cout << hundred << " % correct." << endl << endl;

            while (starter < catcher_size)
            {
                if ((catcher[starter]) == -858993460)
                {
                    starter++;
                }
                else
                {
                    cout << "";
                    starter++;
                }
            }

        }

    return;
}

string PassFail(float percent)
{
    if (percent >= 0.70) // if <pass>
    {
        return "pass";
    }
    else // if <fail>
    {
        return "fail";
    }
    cout << endl;
}

2 个答案:

答案 0 :(得分:0)

要获得循环,您应该保持流打开,而不是在读取20行后关闭它们。

作为伪代码:

a = 0;
while(streams_not_empty)
{
    CA >> CAArray[a];
    SA >> SAArray[a];
    ++a;
    if (a == 20)
    {
        GradeReturn(&CAArray[counter], &SAArray[counter], correct, incorrect, counter);

        a = 0;   // Reset a
     }
}

CA.close(); // closing "CorrectAnswers.txt"
SA.close(); // closing "StudentAnswers.txt"

您还需要通过引用传递correct, incorrect, counter,以便GradeReturn可以通过累积来更改其值及其值。

像:

void GradeReturn(char CAArray[], char SAArray[], int& correct, int& incorrect, int& counter)

此外,您不应该依赖每次都能从文件中准确读取Nx20行。一个文件可以有,例如108(5x20 + 8)行,所以你的代码应该只能处理8行。换句话说,不要在函数中硬编码20,如while (counter < 20)。而是传递要处理的行数并执行while (counter < number_to_handle)

像这样的伪代码:

a = 0;
while(streams_not_empty)
{
    CA >> CAArray[a];
    SA >> SAArray[a];
    ++a;
    if (a == 20)
    {
        GradeReturn(&CAArray[counter], &SAArray[counter], correct, incorrect, counter, a);
                                                                                              // ^

        a = 0;   // Reset a
     }
}

if (a != 0)
{
    // Process the rest
    GradeReturn(&CAArray[counter], &SAArray[counter], correct, incorrect, counter, a);
}

CA.close(); // closing "CorrectAnswers.txt"
SA.close(); // closing "StudentAnswers.txt"

答案 1 :(得分:0)

您遇到的一个问题是您正在尝试将C风格的字符串与==运算符进行比较。这将比较它们,就好像它们是指向char的指针,即比较它们是否指向内存中的相同位置,而不是比较字符串的内容。我建议您查看数组衰减和c-string变量以了解更多信息。

具体来说,if (PassFail(percent) == "pass")不会按照您的意愿行事。 strcomp docstrncmp doc使用std::string变量而不是c风格的字符串都可以正常工作,但最好只比较{{1}一个值,即percent直接而不是调用PassFail并比较一个字符串。

此处还有许多其他问题,您一度调用PassFail但不对返回值执行任何操作。 PassFail的唯一副作用是if(percent >= 0.70,如果这是你想要的,这是一个糟糕的决定,并且难以阅读将新行放在控制台上的方法。

尝试向编译器询问更多警告,这通常有助于查找这些类型的问题。 -Wall -Wextra为gcc工作,你可能需要阅读编译器手册......