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

时间:2011-02-26 22:58:51

标签: 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

主要

#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;

}

输入

#include "header.h"

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

计算

#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]++;
        }
}

输出

#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;
}

5 个答案:

答案 0 :(得分:12)

你是对的,因为它们间隔均匀,可能会短得多,例如

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

output()可以变成一个循环,每个bin的高低的计算都很简单(使用乘法)。

如果垃圾箱间隔不均,则需要使用a lookup table like Serge's suggestion

答案 1 :(得分: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;
    }
  }
}

答案 2 :(得分:3)

你应该使用功能。代码更好阅读。

int computeIndex(int grade)
{
    if (grade >= 0 && grade < 25) return 0;
    if (grade >= 25 && grade < 50) return 1;
    if (grade >= 50 && grade < 75) return 2;
    if (grade >= 75 && grade < 100) return 3;
    if (grade >= 100 && grade < 125) return 4;
     //...
    if (grade >= 175 && grade <= 200) return 7;
}

void calculate (int grade, int array[])
{
    int index = computeIndex(grade);
    array[index]++;
}

你应该更好地使用std::vector<int>而不是int array[8],即使用STL又称标准C ++库。这真的值得学习。

答案 3 :(得分:0)

  

我理解这个数组使我免于必须制作8个单独的变量......

这是数组解决的问题。它们允许您通过一个索引名称引用数据集合。

  

......但仍然有很多if语句!!

对于这部分问题,单个阵列对您没有多大帮助。如果你的成绩没有被分成甚至桶,那么你仍然需要if ... else ... else if if将数据放入正确的数组槽中。

答案 4 :(得分:0)

我得到的第一个想法 - 创建一个常量whitch定义索引的数量和每个索引的分割值 -


const int numIndexes = 8;
const int[] minValues = { 0, 25, 50 ... }

然后使用for statment

运行

您将消除if ... else语句和8行文本编写,并且代码将更加可自定义