C++实验五:学生成绩统计 实验内容:从键盘输入一个班(最多30人)的某门课程的学生成绩,当输入为负值时或 已达30人时输入结束,分别统计下列内容:

我搜到这个代码,请问怎么修改能变成学生的学号由自己输入,统计名单时显示的也是学号,这个代码是默认的序号。而且各个分段的百分比部分运行是错的,是哪里的问题
要求效果:1)统计不及格人数并打印其学生名单。
2)统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单。
3)统计各分数段的学生人数及所占百分比。

img

#include<iostream>
using namespace std;
#include<iomanip>
int main()
{
    void Percent(float allGrades[],int m); 
    void step(float allGrades[],float aver,int m);
    int i,m;
    float allGrades[30],aver=0;
    cout<<"请输入一个班学生某门课的成绩(每输一次按一下回车,输入的成绩为负数时将结束输入):"<<endl;
    for(i=0;i<30;i++)
    {
        cout<<i+1<<":";
        cin>>allGrades[i];
        if(allGrades[i]<=0)
            break;
    }                                   //首先输入信息    
    m=i;
    for(i=0;i<m;i++)
    {
        aver=aver+allGrades[i];  
    } 
    aver=aver/m;                         //计算平均分 
    step(allGrades,aver,m);              //调用函数 
    Percent(allGrades,m);
}
void step(float allGrades[],float aver,int m)//计算 不及格还有与平均分相关的值 
{
    int i,j=0,k=0,failNum=0,upNum=0;
    int failNames[30],upNames[30];
    for(i=0;i<m;i++)
    {
        if(allGrades[i]>=aver)            //高于平均分 
        {
            upNames[j++]=i+1;
            upNum++;
        }
        if(allGrades[i]<60)               //不及格 
        {
            failNames[k++]=i+1;
            failNum++;
        }
    }
    cout<<"******************************************************************************************"<<endl;
    cout<<"不及格人数:"<<failNum<<endl;   //输出信息 
    cout<<"不及格名单:";
    for(i=0;i<k;i++)
        cout<<failNames[i]<<"号 ";
    cout<<endl; 
    cout<<"高于平均分的人数:"<<upNum<<endl; 
    cout<<"高于平均分的人的名单:";
    for(i=0;i<j;i++)
        cout<<upNames[i]<<"号 ";
    cout<<endl;
} 
void Percent(float allGrades[],int m)          //计算百分比 
{
    int i;
    float percent[6];
    for(i=0;i<m;i++)
    {
        if(allGrades[i]<60)
            (percent[0])++;
        if((60<=allGrades[i])&&(allGrades[i]<70))
            (percent[1])++;    
        if((70<=allGrades[i])&&(allGrades[i]<80))
            (percent[2])++;    
        if((80<=allGrades[i])&&(allGrades[i]<90))
            (percent[3])++;    
        if((90<=allGrades[i])&&(allGrades[i]<100))
            (percent[4])++;    
        if(allGrades[i]==100)
            (percent[5])++;        
    }
      for(i=0;i<6;i++)
    {
        percent[i]=(percent[i]/m)*100;
    } 
    cout<<"各个分段的人数:"<<endl;
    for(i=0;i<6;i++) 
    {
        cout<<"第"<<i<<"段:"<<fixed<<setprecision(2)<<percent[i]<<"%"<<endl; 
    }
} 
————————————————
版权声明:本文为CSDN博主「冰糖糖糖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44037213/article/details/106505501

img

这是这个代码我运行的结果。

获取学号,可以使用cin从输入获取存入一个数组;

百分比那里,数组perfect没有初始化为0,初始化一下应该就可以了;

最后,再把输入的格式修改下即可。

修改如下:


#include<iostream>
using namespace std;
#include<iomanip>
int main()
{
    void Percent(float allGrades[],int m); 
    void step(float allGrades[],int ids[],float aver,int m);  // 增加传入存储了学号的数组地址 参数 
    int i,m;
    float allGrades[30],aver=0;
    int ids[30];
    cout<<"请输入一个班学生某门课的成绩(每输一次按一下回车,输入的成绩为负数时将结束输入):"<<endl;
    for(i=0;i<30;i++)
    {
        //cout<<i+1<<":";
        cin>>ids[i];  // 获取学号存入学号数组 
        cin>>allGrades[i];
        if(allGrades[i]<=0)
            break;
    }                                   //首先输入信息    
    m=i;
    for(i=0;i<m;i++)
    {
        aver=aver+allGrades[i];  
    } 
    aver=aver/m;                         //计算平均分 
    step(allGrades,ids,aver,m);              //调用函数 
    Percent(allGrades,m);
}
void step(float allGrades[],int ids[], float aver,int m)//计算 不及格还有与平均分相关的值 
{
    int i,j=0,k=0,failNum=0,upNum=0;
    int failNames[30],upNames[30];
    for(i=0;i<m;i++)
    {
        if(allGrades[i]>=aver)            //高于平均分 
        {
            upNames[j++]=ids[i];
            upNum++;
        }
        if(allGrades[i]<60)               //不及格 
        {
            failNames[k++]=ids[i];
            failNum++;
        }
    }
    cout<<"******************************************************************************************"<<endl;
    cout<<"不及格人数:"<<failNum<<" ";   //输出信息 
    cout<<"名单:";
    for(i=0;i<k;i++)
        cout<<failNames[i]<<" ";
    cout<<endl; 
    cout<<"平均分:"<<fixed<<setprecision(1)<<aver<<endl;
    cout<<"平均分及平均分之上的学生:"; 
    for(i=0;i<j;i++){
        if(i<(j-1)){
            cout<<upNames[i]<<",";
        }else{
            cout<<upNames[i]<<endl;
        }
    }
        
} 
void Percent(float allGrades[],int m)          //计算百分比 
{
    int i;
    float percent[6]={0.0f};  // 各区段人数初始化为0 
    
    for(i=0;i<m;i++)
    {
        if(allGrades[i]<60)
            (percent[0])++;
        if((60<=allGrades[i])&&(allGrades[i]<70))
            (percent[1])++;    
        if((70<=allGrades[i])&&(allGrades[i]<80))
            (percent[2])++;    
        if((80<=allGrades[i])&&(allGrades[i]<90))
            (percent[3])++;    
        if((90<=allGrades[i])&&(allGrades[i]<=100))
            (percent[4])++;    
           
    }
      for(i=0;i<5;i++)
    {
        percent[i]=(percent[i]/m)*100;
    } 
   ;
    
    cout<<"不及格:"<<fixed<<setprecision(1)<<percent[0]<<"%"<<"\t"; 
    cout<<"60-69分:"<<fixed<<setprecision(1)<<percent[1]<<"%"<<"\t"; 
    cout<<"70-79分:"<<fixed<<setprecision(1)<<percent[2]<<"%"<<"\t"; 
    cout<<"80-89分:"<<fixed<<setprecision(1)<<percent[3]<<"%"<<"\t"; 
    cout<<"90-100分:"<<fixed<<setprecision(1)<<percent[4]<<"%"<<"\t"; 
    
} 


img

输入的地方改了,另外百分比计算部分出错的问题,是因为没有初始化百分比数组
改之后

img

#include<iostream>
using namespace std;
#include<iomanip>
int main()
{
    void Percent(float allGrades[],int m); 
    void step(float allGrades[],float aver,int m);
    int i,m;
    float allGrades[30],aver=0;
    cout<<"请输入一个班学生某门课的成绩(每输一次按一下回车,输入的成绩为负数时将结束输入):"<<endl;
   for(i=0;i<30;i++)
{
    cout << "请输入学号 " << i+1 << " 的成绩(输入的成绩为负数时将结束输入):";
    cin >> allGrades[i];
    if(allGrades[i]<=0)
        break;
}                                  //首先输入信息    
    m=i;
    for(i=0;i<m;i++)
    {
        aver=aver+allGrades[i];  
    } 
    aver=aver/m;                         //计算平均分 
    step(allGrades,aver,m);              //调用函数 
    Percent(allGrades,m);
}
void step(float allGrades[],float aver,int m)//计算 不及格还有与平均分相关的值 
{
    int i,j=0,k=0,failNum=0,upNum=0;
    int failNames[30],upNames[30];
    for(i=0;i<m;i++)
    {
        if(allGrades[i]>=aver)            //高于平均分 
        {
            upNames[j++]=i+1;
            upNum++;
        }
        if(allGrades[i]<60)               //不及格 
        {
            failNames[k++]=i+1;
            failNum++;
        }
    }
    cout<<"******************************************************************************************"<<endl;
    cout<<"不及格人数:"<<failNum<<endl;   //输出信息 
    cout<<"不及格名单:";
    for(i=0;i<k;i++)
        cout<<failNames[i]<<"号 ";
    cout<<endl; 
    cout<<"高于平均分的人数:"<<upNum<<endl; 
    cout<<"高于平均分的人的名单:";
    for(i=0;i<j;i++)
        cout<<upNames[i]<<"号 ";
    cout<<endl;
} 
void Percent(float allGrades[],int m)          //计算百分比 
{
    int i;
    float percent[6] = {0};
    for(i=0;i<m;i++)
    {
        if(allGrades[i]<60)
            (percent[0])++;
        if((60<=allGrades[i])&&(allGrades[i]<70))
            (percent[1])++;    
        if((70<=allGrades[i])&&(allGrades[i]<80))
            (percent[2])++;    
        if((80<=allGrades[i])&&(allGrades[i]<90))
            (percent[3])++;    
        if((90<=allGrades[i])&&(allGrades[i]<100))
            (percent[4])++;    
        if(allGrades[i]==100)
            (percent[5])++;        
    }
      for(i=0;i<6;i++)
    {
        percent[i]=(percent[i]/m)*100;
    } 
    cout<<"各个分段的人数:"<<endl;
    for(i=0;i<6;i++) 
    {
        cout<<"第"<<i<<"段:"<<fixed<<setprecision(2)<<percent[i]<<"%"<<endl; 
    }
} 


  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7448721
  • 除此之外, 这篇博客: 回溯法与分支限界法的总结中的 在当前节点(扩展节点)处,先生成其所有的子节点(分支),然后再从当前的活节点(当前节点的子节点)表中选择下一个扩展节点。为了有效地选择下一个扩展节点,加速搜索的进程,在每一个活节点处,计算一个函数值(限界),并根据函数值,从当前活节点表中选择一个最有利的节点作为扩展节点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。分支限界法解决了大量离散最优化的问题。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 编写回溯算法代码时,要先考虑这个问题是一个什么搜索树,然后套用那个搜索树模板就行了。(例如:子集树就是:判断是否满足约束条件——计算、x[i]=1——递归左子树——归还——x[i]=0、递归右子树(注意限界思想))
    (例如:排列树就是:循环——判断是否满足约束条件——交换——计算——递归(注意限界思想)——归还)
    当然具体算法要具体分析
    还要注意及时更新解和存储解,别忘了进入右子树、循环结束前,要将你算的、交换过的东西,要归还回去。注意到达叶结点干什么,没有到达怎么做

    而分支限界算法的代码编写,首先编写三个类:活结点类、活结点属性类、入队类。然后选择好什么样的队列方式。一定要考虑好属性,然后什么时候添加结点、以及出队、和存储最优解

    两个算法编写,还要注意限界函数的设置,怎么设计一个好的代价函数可以裁掉更多的空间。这就是两个算法的优化思想。

    当然最重要的还要考虑好约束条件。

    具体逻辑代码还是多写多练。多去总结。这里也就只讲个大体思路。

  • 以下回答由chatgpt基于相关博客总结生成:

    这段代码实现了用Prim算法构建最小生成树的功能。以下是对这段代码的修改和错误修复:

    1. 修改让学生可以自己输入学号:参考资料中的代码没有给出学生名单的输入部分。为了让学生可以输入学号,我们需要添加一个输入函数,让学生依次输入每个学生的学号和成绩。修改后的代码如下:
    #include<iostream>
    #include<vector>
    using namespace std;
    
    struct Student {
        string studentID;
        int score;
    };
    
    vector<Student> inputScore() {
        vector<Student> students;
        int n;
        cout << "请输入学生个数:";
        cin >> n;
        for (int i = 0; i < n; i++) {
            Student student;
            cout << "请输入第" << i+1 << "个学生的学号和成绩:";
            cin >> student.studentID >> student.score;
            students.push_back(student);
        }
        return students;
    }
    
    1. 修改统计不及格人数并打印其学生名单:代码中没有进行成绩统计和打印学生名单的部分。我们可以通过遍历学生列表,统计不及格人数并将其学生信息存储到一个新的列表中,然后逐个打印该列表中的学生信息。修改后的代码如下:
    void printFailingStudents(const vector<Student>& students) {
        vector<Student> failingStudents;
        for (const auto& student : students) {
            if (student.score < 60) {
                failingStudents.push_back(student);
            }
        }
        cout << "不及格人数:" << failingStudents.size() << endl;
        cout << "不及格学生名单:" << endl;
        for (const auto& student : failingStudents) {
            cout << "学号:" << student.studentID << " 成绩:" << student.score << endl;
        }
    }
    
    1. 修改统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单:代码中没有进行成绩统计和打印学生名单的部分。我们可以通过遍历学生列表,计算全班平均分,并统计成绩高于平均分的人数,将其学生信息存储到一个新的列表中,然后逐个打印该列表中的学生信息。修改后的代码如下:
    void printAboveAverageStudents(const vector<Student>& students) {
        int sum = 0;
        for (const auto& student : students) {
            sum += student.score;
        }
        double average = sum / students.size();
        cout << "全班平均分:" << average << endl;
    
        vector<Student> aboveAverageStudents;
        for (const auto& student : students) {
            if (student.score > average) {
                aboveAverageStudents.push_back(student);
            }
        }
        cout << "成绩高于平均分的人数:" << aboveAverageStudents.size() << endl;
        cout << "成绩高于平均分的学生名单:" << endl;
        for (const auto& student : aboveAverageStudents) {
            cout << "学号:" << student.studentID << " 成绩:" << student.score << endl;
        }
    }
    
    1. 修改统计各分数段的学生人数及所占百分比:代码中没有进行各分数段的统计和百分比计算。我们可以通过设置不同分数段的上下限,统计每个分数段的学生人数,并计算所占百分比。最后打印出各分数段的统计结果。以下是修改后的代码:
    void printScoreDistribution(const vector<Student>& students) {
        int failCount = 0;
        int passCount = 0;
        int goodCount = 0;
        int excellentCount = 0;
        int totalCount = students.size();
    
        for (const auto& student : students) {
            if (student.score < 60) {
                failCount++;
            } else if (student.score < 80) {
                passCount++;
            } else if (student.score < 90) {
                goodCount++;
            } else {
                excellentCount++;
            }
        }
    
        cout << "不及格人数:" << failCount << " 占比:" << (double)failCount / totalCount * 100 << "%" << endl;
        cout << "及格人数:" << passCount << " 占比:" << (double)passCount / totalCount * 100 << "%" << endl;
        cout << "良好人数:" << goodCount << " 占比:" << (double)goodCount / totalCount * 100 << "%" << endl;
        cout << "优秀人数:" << excellentCount << " 占比:" << (double)excellentCount / totalCount * 100 << "%" << endl;
    }
    
    1. 运行函数:在主函数中调用上述函数来实现相应的功能。

    完整的修改后的代码如下:

    #include<iostream>
    #include<vector>
    using namespace std;
    
    struct Student {
        string studentID;
        int score;
    };
    
    vector<Student> inputScore() {
        vector<Student> students;
        int n;
        cout << "请输入学生个数:";
        cin >> n;
        for (int i = 0; i < n; i++) {
            Student student;
            cout << "请输入第" << i+1 << "个学生的学号和成绩:";
            cin >> student.studentID >> student.score;
            students.push_back(student);
        }
        return students;
    }
    
    void printFailingStudents(const vector<Student>& students) {
        vector<Student> failingStudents;
        for (const auto& student : students) {
            if (student.score < 60) {
                failingStudents.push_back(student);
            }
        }
        cout << "不及格人数:" << failingStudents.size() << endl;
        cout << "不及格学生名单:" << endl;
        for (const auto& student : failingStudents) {
            cout << "学号:" << student.studentID << " 成绩:" << student.score << endl;
        }
    }
    
    void printAboveAverageStudents(const vector<Student>& students) {
        int sum = 0;
        for (const auto& student : students) {
            sum += student.score;
        }
        double average = sum / students.size();
        cout << "全班平均分:" << average << endl;
    
        vector<Student> aboveAverageStudents;
        for (const auto& student : students) {
            if (student.score > average) {
                aboveAverageStudents.push_back(student);
            }
        }
        cout << "成绩高于平均分的人数:" << aboveAverageStudents.size() << endl;
        cout << "成绩高于平均分的学生名单:" << endl;
        for (const auto& student : aboveAverageStudents) {
            cout << "学号:" << student.studentID << " 成绩:" << student.score << endl;
        }
    }
    
    void printScoreDistribution(const vector<Student>& students) {
        int failCount = 0;
        int passCount = 0;
        int goodCount = 0;
        int excellentCount = 0;
        int totalCount = students.size();
    
        for (const auto& student : students) {
            if (student.score < 60) {
                failCount++;
            } else if (student.score < 80) {
                passCount++;
            } else if (student.score < 90) {
                goodCount++;
            } else {
                excellentCount++;
            }
        }
    
        cout << "不及格人数:" << failCount << " 占比:" << (double)failCount / totalCount * 100 << "%" << endl;
        cout << "及格人数:" << passCount << " 占比:" << (double)passCount / totalCount * 100 << "%" << endl;
        cout << "良好人数:" << goodCount << " 占比:" << (double)goodCount / totalCount * 100 << "%" << endl;
        cout << "优秀人数:" << excellentCount << " 占比:" << (double)excellentCount / totalCount * 100 << "%" << endl;
    }
    
    int main() {
        vector<Student> students = inputScore();
    
        printFailingStudents(students);
    
        printAboveAverageStudents(students);
    
        printScoreDistribution(students);
    
        return 0;
    }
    

    注意:上述修改的代码是根据问题描述进行