我错过了使用数组的意义吗?

dar*_*rko 2 c++ arrays

我刚刚使用数组完成了我的第一个任务,我觉得它比它必须要复杂一点.该程序读取与分数它一个文件,并计数在一定范围内的分数的发生,然后输出出现的次数.

我想知道是否有更有效的方法来完成此任务(仅使用数组).我理解数组使我不必制作8个单独的变量,但仍有很多if语句!

#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED

#include <iostream>
#include <iomanip>
#include <fstream>
#include <cctype>
#include <cstdlib>

using namespace std;

void extern input(ifstream&, ofstream&, int&, int*);
void extern calculate (int, int*);
void extern output (ofstream&, int*);


#endif // HEADER_H_INCLUDED
Run Code Online (Sandbox Code Playgroud)

主要

#include "header.h"

int main()
{
    int grade;
    int array[8] = {0};
    ifstream inData;
    ofstream outData;

    inData.open("Ch9_Ex4Data.txt");

    if (!inData)
    {
        cout << "Cannot open the input file."
             << endl;
            return 1;
    }

    outData.open("DataOut.txt");

    while (inData)
    {
        input(inData, outData, grade, array);
    }

    output (outData, array);

    system("PAUSE");
    return EXIT_SUCCESS;

}
Run Code Online (Sandbox Code Playgroud)

输入

#include "header.h"

void input(ifstream& inData, ofstream& outData, int& grade, int array[])
{
    while(inData >> grade)  // while a grade is read
    {
     calculate(grade, array);
    }
}
Run Code Online (Sandbox Code Playgroud)

计算

#include "header.h"

void calculate (int grade, int array[])
{
    int index;

        if (grade >= 0 && grade < 25)
        {
        index = 0;
        array[index]++;
        }
        else if (grade >= 25 && grade < 50)
        {
        index = 1;
        array[index]++;
        }
        else if (grade >= 50 && grade < 75)
        {
        index = 2;
        array[index]++;
        }
        else if (grade >= 75 && grade < 100)
        {
        index = 3;
        array[index]++;
        }
        else if (grade >= 100 && grade < 125)
        {
        index = 4;
        array[index]++;
        }
        else if (grade >= 125 && grade < 150)
        {
        index = 5;
        array[index]++;
        }
        else if (grade >= 150 && grade < 175)
        {
        index = 6;
        array[index]++;
        }
        else if (grade >= 175 && grade <= 200)
        {
        index = 7;
        array[index]++;
        }
}
Run Code Online (Sandbox Code Playgroud)

产量

#include "header.h"

void output (ofstream& outData, int array [])
{
    outData << "number of students with score of 0-24 is " << array[0] << endl;
    outData << "number of students with score of 25-49 is " << array[1] << endl;
    outData << "number of students with score of 50-74 is " << array[2] << endl;
    outData << "number of students with score of 75-99 is " << array[3] << endl;
    outData << "number of students with score of 100-124 is " << array[4] << endl;
    outData << "number of students with score of 125-149 is " << array[5] << endl;
    outData << "number of students with score of 150-174 is " << array[6] << endl;
    outData << "number of students with score of 175-200 is " << array[7] << endl;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 12

你是对的,因为它们间隔均匀,可能比较短,例如

void calculate (int grade, int array[])
{
    if (grade >= 0 && grade < 200) {
        index = grade / 25;
        array[index]++;
    }
    else if (grade == 200)
        array[7]++;
}
Run Code Online (Sandbox Code Playgroud)

output() 可以变成一个循环,每个bin的高和低的计算是直截了当的(使用乘法).

如果垃圾箱的间隔不均匀,则需要使用像Serge建议的查找表.

  • 即使它们的间距不均匀,通常也可以缩短它们 - 你只需要另一个阵列. (3认同)
  • 它只需要对梯子进行一次非连续的更改,这就会中断. (2认同)

nos*_*nos 8

由于所有等级都相邻,您可以使用另一个数组来查找数组索引.

void calculate (int grade, int array[])
{
  int indexMap[] = {25,50,75,100,125,150,175,201};
  int i;

  for(i = 0; i < 8 ; i++) {
    if(grade < indexMap[i]) {
       array[i]++;
       break;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)