我可以使用啥算法来计算有多少学生的分数相同?

Posted

技术标签:

【中文标题】我可以使用啥算法来计算有多少学生的分数相同?【英文标题】:What algorithm can I use to count how many students have the same score?我可以使用什么算法来计算有多少学生的分数相同? 【发布时间】:2012-02-09 20:36:49 【问题描述】:

我目前正在学习我的 C++ 课程中的指针。下面的代码有点混乱,但我最终明白了,我目前的问题是我的逻辑。

有人告诉我,我可以找到分数相同的学生数量,而无需排序或搜索并使用单个索引,但我终其一生都无法弄清楚。

我将分数存储在 scoresArray 中,元素编号标识它属于哪个学生。

#include <iostream>
using namespace std;

const int maxStudents = 30;
void readScores(double[]);
void gradeCounter(double[],int&,int&,int&,int&,int&);
void sameScore(double[]);

int main()

    int As = 0, Bs = 0, Cs = 0, Ds = 0, Fs = 0; // Distribution of scores

    double scoreArray[maxStudents];
    readScores(scoreArray);
    gradeCounter(scoreArray, As, Bs, Cs, Ds, Fs);

   system ("PAUSE");
    return 0;



void readScores(double scoreArray[])

    double *scorePTR;
    scorePTR = scoreArray;

    for(int count = 0; count < maxStudents; count++)
    
        cout<<"Please enter score for student "<<count+1<<" or -999 to end.\n";
        cin>>*(scorePTR+count);
        if(*(scorePTR+count) == -999)
        break;
    



void gradeCounter(double scoreArray[],int &As,int &Bs,int &Cs,int &Ds,int &Fs)

double *scorePTR2;
scorePTR2 = scoreArray;

    for(int count = 0; count < maxStudents; count++)
    
        if(scoreArray[count] >= 90)
            As+=1;
        else if(*(scorePTR2+count) >= 80 && *(scorePTR2+count) < 90)
            Bs+=1;      
        else if(*(scorePTR2+count) >= 70 && *(scorePTR2+count) < 80)
            Cs+=1;
        else if(*(scorePTR2+count) >= 60 && *(scorePTR2+count) < 70)
            Ds+=1;
        else if(*(scorePTR2+count) >= 0 && *(scorePTR2+count) < 60)
            Fs+=1;
    


void sameScore(double scoreArray[])



【问题讨论】:

与答案无关,*(scorePTR+count)与scorePTR[count]相同 我可以将此重新标记为[c]吗? 根据您的解释,我不确定您到底想做什么。但是,如果给您一些分数范围为 0 到 100 的学生。您可以使用桶排序找出有多少学生的分数相同。只需创建一个大小为 101 的数组。对于每个具有特定分数的学生,将 1 添加到相同索引的数组槽中。最后,查看您的数组并将所有值大于 1 的元素的值相加。这就是具有相同分数的学生的数量。这不需要排序并在 O(n) 中运行。 【参考方案1】:

您可以创建第二个包含 101 个元素(从 0 到 100)的数组,将其全部初始化为 0,并使用当前学生的分数作为该数组的索引

因此,如果当前学生的分数为 87,那么您将 this_new_array[87] 加 1。

最后,索引 X 处的数组将包含得分为 X 的学生人数。

【讨论】:

如何在元素 1 中获取分数 87 并让编译器知道我希望它指向 new_array[87]? 我的意思是,我知道如何访问 scoreArray,我会使用 for 循环来遍历它并读取每个分数。我不明白的是,我如何获取分数并让编译器知道我想增加与该分数匹配的元素。 this_new_array[scoreArray[count]]++ @BojinLi 当我尝试这个时,我在 scoreArray 下得到一个红色波浪线,上面写着“表达式必须具有整数或枚举类型” 这意味着您的 scoreArray 是 float 或 double (它是...)。此方法仅在您的所有分数都是整数(即整数)时才有效。例如,如果您允许保留一位小数,您可以将分数乘以 10,并且仍然使用相同的方法。

以上是关于我可以使用啥算法来计算有多少学生的分数相同?的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法

shell脚本,计算学生分数的题目。

oracle如何查询分数最高同学的信息并且计算记录的条数

数据结构与算法之深入解析“解出数学表达式的学生分数”的求解思路与算法示例

数据结构与算法之深入解析“解出数学表达式的学生分数”的求解思路与算法示例

mysql中的用户按他们的分数排名