该程序运行但不正确;数字不对

时间:2010-04-30 23:52:03

标签: c++ arrays

这个程序运行但是没有正确的数字不对,我从文件中读取数字然后当我在程序中使用它们时它们是不对的。:我想要做的事情的解释可以有人告诉我,如果有什么事情看起来不对。

这就是我要做的事情:

编写一个程序,确定100名学生的成绩分散

  

您要将考试成绩读入   三个阵列,每个考试一个阵列。   然后你必须计算多少   学生得分A(90分或以上),B分   (80或以上),C(70或以上),D'   (60或以上)和F(小于60)。   为每个考试做这个并写下来   分发到屏幕上。

    // basic file operations
    #include <iostream>
    #include <fstream>
    using namespace std;
    int read_file_in_array(double exam[100][3]);
    double calculate_total(double exam1[], double exam2[], double exam3[]); // function that calcualates grades to see how many 90,80,70,60
    //void display_totals();
    double exam[100][3];
    int main()
    {
        double go,go2,go3;
        double exam[100][3],exam1[100],exam2[100],exam3[100];
        go=read_file_in_array(exam);
        go2=calculate_total(exam1,exam2,exam3);
        //go3=display_totals();
        cout << go,go2,go3;
        return 0;
    }
    /*
    int display_totals()
    {

        int grade_total;
        grade_total=calculate_total(exam1,exam2,exam3);
        return 0;
    }   */
    double calculate_total(double exam1[],double exam2[],double exam3[])
    {
        int calc_tot,above90=0, above80=0, above70=0, above60=0,i,j, fail=0;
        double exam[100][3];
        calc_tot=read_file_in_array(exam);
        for(i=0;i<100;i++)
            {
            for (j=0; j<3; j++)
                {
                exam1[i]=exam[100][0];
                exam2[i]=exam[100][1];
                exam3[i]=exam[100][2];
                if(exam[i][j] <=90 && exam[i][j] >=100)
                    {
                    above90++;
                        {
                        if(exam[i][j] <=80 && exam[i][j] >=89)
                            {
                            above80++;
                                {
                                if(exam[i][j] <=70 && exam[i][j] >=79)
                                    {
                                    above70++;
                                        {
                                        if(exam[i][j] <=60 && exam[i][j] >=69)
                                            {
                                            above60++;
                                                {
                                                if(exam[i][j] >=59)
                                                    {
                                                    fail++;
                                                }
                                                }
                                        }
                                        }
                                }
                                }
                        }
                        }
                }
            }
        }
        return 0;
    }

    int read_file_in_array(double exam[100][3])
    {
        ifstream infile;  
        int exam1[100];
        int exam2[100];
        int exam3[100];
      infile.open("grades.txt");// file containing numbers in 3 columns
        if(infile.fail()) // checks to see if file opended
            {
            cout << "error" << endl;
            }
        int num, i=0,j=0;
        while(!infile.eof()) // reads file to end of line
          {
              for(i=0;i<100;i++) // array numbers less than 100
              {
                for(j=0;j<3;j++) // while reading get 1st array or element
                infile >> exam[i][j];
                infile >> exam[i][j];
                infile >> exam[i][j];
                cout << exam[i][j] << endl;
                    {
                        if (! (infile >> exam[i][j]) )
                        cout << exam[i][j] << endl;
                    }
              exam[i][j]=exam1[i];
              exam[i][j]=exam2[i];
              exam[i][j]=exam3[i];
              }     
        infile.close();
      }
    return 0;
    }

3 个答案:

答案 0 :(得分:5)

读取代码有点困难,但是当你检查分数时,你应该使用chained else if if语句而不是嵌套ifs。

有些事情:

if(exam[i][j] >=90 && exam[i][j] <=100)
{
     above90++;
}
else if(exam[i][j] >=80 && exam[i][j] <=89)
{
     above80++;
}
else if(...)
{...}

此外,您可能希望选择单一语法并在整个代码中与其保持​​一致,在尝试解决任何问题时,或者甚至弄清楚您在做什么,它会产生巨大的差异!与你一致的 方式并不重要。


如果条件(parens中的表达式)为真,并且如果它为假,则语句允许您执行某些操作。

if( /* statement that evaluates to true */ )
{
     /* insert the commands you want to run when it's true here */
}
else
{
     /* insert the commands you want to run when it's false here */
}

您可以将'else'部分用于 If语句,如果您有两种以上的可能性,这将非常有用。比如这个:

int number = 2; // Can be a value between 0 and 2 (0, 1, or 2)
if(number == 0)
{
     cout << "The number is zero";
}
else if(number == 1)
{
     cout << "The number is one";
}
else if(number == 2)
{
     cout << "The number is two";
}
else
{
     cout << "The value wasn't an allowed value!";
}

如果number介于0和2之间,它会打印出它的数字,如果它不在该范围内,它会打印出一条消息,表明它不是。

答案 1 :(得分:2)

除了其他人所说的,你需要看看你的逻辑。

示例:

if(exam[i][j] <=90 && exam[i][j] >=100) {
...
}

想一想。数字如何&lt; = 90并且同时> = 100?

答案 2 :(得分:0)

既然你知道如何编写循环和函数,我建议你改变你的设计。

创建对考试进行操作的功能 创建三个单独的考试变量 调用每个考试的功能。换句话说,只有一个考试将作为参数传递给一个函数。

一些示例函数名称:
Exam_Calculate_Distribution
Output_Distribution

根据您提供的最少信息,数据按学生行和分数列进行组织。这将是主题的例外,因为3次考试将更容易加载。

在此分配中,使用10个部分的数组可以更容易地计算分布,每个部分代表10的范围。计算简化:

grade_index = grade / 10; 分布[grade_index] ++;

使用此方法,无需使用if-else语句。对于阵列中的额外插槽,成本是更多的存储器单元。在这种情况下,我认为简化会超出额外的使用空间。

需要再做一步:计算分布后,将区域0到5相加。这表示失败(F等级)。

你必须弄清楚如何处理完美分数的特殊情况。

请记住,如果您的程序过于复杂而无法理解,则可能需要查看设计。

程序应该尽可能简单,但不能简单。 - 解释阿尔伯特爱因斯坦。