我搜到这个代码,请问怎么修改能变成学生的学号由自己输入,统计名单时显示的也是学号,这个代码是默认的序号。而且各个分段的百分比部分运行是错的,是哪里的问题
要求效果:1)统计不及格人数并打印其学生名单。
2)统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单。
3)统计各分数段的学生人数及所占百分比。
#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
这是这个代码我运行的结果。
获取学号,可以使用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";
}
输入的地方改了,另外百分比计算部分出错的问题,是因为没有初始化百分比数组
改之后
#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;
}
}
编写回溯算法代码时,要先考虑这个问题是一个什么搜索树,然后套用那个搜索树模板就行了。(例如:子集树就是:判断是否满足约束条件——计算、x[i]=1——递归左子树——归还——x[i]=0、递归右子树(注意限界思想))
(例如:排列树就是:循环——判断是否满足约束条件——交换——计算——递归(注意限界思想)——归还)
当然具体算法要具体分析
还要注意及时更新解和存储解,别忘了进入右子树、循环结束前,要将你算的、交换过的东西,要归还回去。注意到达叶结点干什么,没有到达怎么做
而分支限界算法的代码编写,首先编写三个类:活结点类、活结点属性类、入队类。然后选择好什么样的队列方式。一定要考虑好属性,然后什么时候添加结点、以及出队、和存储最优解
两个算法编写,还要注意限界函数的设置,怎么设计一个好的代价函数可以裁掉更多的空间。这就是两个算法的优化思想。
当然最重要的还要考虑好约束条件。
具体逻辑代码还是多写多练。多去总结。这里也就只讲个大体思路。
这段代码实现了用Prim算法构建最小生成树的功能。以下是对这段代码的修改和错误修复:
#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;
}
完整的修改后的代码如下:
#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;
}
注意:上述修改的代码是根据问题描述进行