我刚刚使用数组完成了我的第一个任务,我觉得它比它必须要复杂一点。程序读取其中包含分数的文件,并计算某个范围内分数的出现次数,然后输出出现次数。
我想知道是否有更有效的方法来完成此任务(仅使用数组)。 我理解数组使我不必制作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;
}
答案 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行文本编写,并且代码将更加可自定义