如何使用数组制作随机分数生成器?

时间:2018-04-22 17:48:11

标签: c++ arrays pointers

我正在尝试制作一个计算课程平均分数并计算A,B,C,D学生人数的程序。现在我正在尝试另一个想法:如果将测试分数随机分配给学生(60到100之间),我如何将这些随机分数输入数组?我要求用户逐一输入所有分数。我想知道如何自动填充数组。

#include <iostream>
#include <cstdlib>
using namespace std;

double Average(double *scores, int N)
{
    int i;
    double total = 0;
    for(i = 0; i < N; i++)
    {
        total = total+scores[i];
    }
    return total / N;
}

int Agrade(double *scores, int N)
{
    int i;
    int count = 0;
    for(i = 0; i < N; i++)
    {
        if(scores[i] >= 90 && scores[i] <= 100) count++;
    }
    return count;
}

int Bgrade(double *scores, int N)
{
    int i;
    int count = 0;
    for(i=0; i < N; i++)
    {
        if(scores[i] >=80 && scores[i] < 90) count ++;
    }
    return count;
}

int Cgrade(double *scores, int N)
{
    int i;
    int count = 0;
    for(i=0; i < N; i++)
    {
        if(scores[i] >=70 && scores[i] < 80) count ++;
    }
    return count;
}

int Dgrade(double *scores, int N)
{
    int i;
    int count = 0;
    for(i=0; i < N; i++)
    {
        if(scores[i] >=60 && scores[i] < 70) count ++;
    }
    return count;
}
int Fgrade(double *scores, int N)
{
    int i;
    int count = 0;
    for(i=0; i < N; i++)
    {
        if(scores[i] < 60) count ++;
    }
    return count;
}

int main(){
int i;
int N;
double *scores; 

std::cout<<"How many test scores? "<<endl;
cin>>N;
    if(N<1){
    std::cout<<"Invalid input. try again"<<endl;
    }
    else if(N>25)
    {
    std::cout<<"1-25 only."<<endl;    
    }
    else if(N>0 && N<25){
    std::cout<<"Total number of test is: "<< N << endl;      
    }

    scores = new double[N];

    for(i = 0; i < N; i++)
    {
        cout << "Randomly generating score of students" << i + 1 << ": "; 
        cout << (rand() % 40 + 60) << endl; //Trying to give random scores between 60-100
        if(!(cin >> scores[i]) || scores[i] < 0 || scores[i] > 100)
        {
            if(!cin)
            {
                cin.clear();
                cin.ignore(1000, '\n');
            }
            cout << "Score must be between 0 to 100.\n\n"; i--; continue;
        }
    }


    double averagescore = Average(scores, N);
    int scoreAcount = Agrade(scores, N);
    int scoreBcount = Bgrade(scores, N);
    int scoreCcount = Cgrade(scores, N);
    int scoreDcount = Dgrade(scores, N);
    int scoreFcount = Fgrade(scores, N);
    cout << "The average test score : " << averagescore << endl;
    cout << "The number of A grades : " << scoreAcount << endl;
    cout << "The number of B grades : " << scoreBcount << endl;
    cout << "The number of C grades : " << scoreCcount << endl; 
    cout << "The number of D grades : " << scoreDcount << endl;
    cout << "The number of F grades : " << scoreFcount <<endl;
    cout << endl;


return 0;
} 

我可以修改此部件以使其正常工作吗?

for(i = 0; i < N; i++)
        {
            cout << "Randomly generating score of students" << i + 1 << ": "; 
            cout << (rand() % 40 + 60) << endl; //Trying to give random scores between 60-100
            if(!(cin >> scores[i]) || scores[i] < 0 || scores[i] > 100)
            {
                if(!cin)
                {
                    cin.clear();
                    cin.ignore(1000, '\n');
                }
                cout << "Score must be between 0 to 100.\n\n"; i--; continue;
            }
        }

还是需要修改所有功能?

2 个答案:

答案 0 :(得分:2)

如果你想要的是将std::rand()函数的结果分配给数组中的所有元素,你应该看看std::generate标题中的<algorithm>函数,它完全符合你的要求。看看这个简单的例子:

#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdlib>

int main() {
  std::srand(0);

  const int N = 5;
  std::vector<int> scores(N);
  std::generate(scores.begin(), scores.end(), [](){return std::rand() % 40 + 60; });

  for(auto s : scores) {
    std::cout << s << ' ';
  }
}

这将使用std :: generate函数填充向量scores,并使用std :: generate函数和lambda函数作为第三个参数返回随机数。

在你的情况下,如果你不允许使用std :: vector,你仍然可以使用普通的C数组,如下所示:

int scores[5];
std::generate(std::begin(scores), std::end(scores), [](){return std::rand() % 40 + 60; });

不幸的是,std::beginstd::end函数无法直接应用于动态分配的数组,但这仍然适用于您的情况:

const int N = 5;
double* scores = new double[N];
std::generate(scores, scores+N, [](){return std::rand() % 40 + 60; });

for(int i=0; i<N; ++i) {
  std::cout << scores[i] << ' ';
}

// remember to release memory allocated using new

答案 1 :(得分:1)

您需要为随机数生成器播种,以确保随机数具有合理随机的种子。所以你提到的for循环之前,你需要调用像srand(time(NULL))这样的东西,并在你的代码中包含time.h。那应该够了。

另外,在您的代码中,我只看到得分数组的分配。记得删除!更好的是,始终使用矢量。