|
题目:
有10个学生,每个学生的数据包括学号,姓名,三门课的成绩,从键盘输入10个学生的数据
要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号,姓名,3门课成绩,平均分)
附加要求:按总成绩从大到小排序,以自己的姓名+学号存起来(xiaoyan.txt) 实现代码如下:
#include <iostream>
#include <iomanip>
#include <cassert>
#include <fstream>
using namespace std;
const int n = 10; //这是学生数量
//下面开始构建一个学生类
struct student
{
char num[10]; //学号
char name[8]; //姓名
int score[3]; //成绩
float avr;//平均成绩
}stu[n];
int main(){
void input(student stu[]);
input(stu);
float average = 0;
int max = 0;
int maxi = 0;
int i, j;
for (int i = 0; i < n;i++){
int sum = 0;
for (int j = 0; j < 3;j++)
sum += stu.score[j];
stu.avr= (sum / 3.0);
average += stu.avr;
if(sum>max){
max = sum;
maxi = i;
}
}
//这里开始打印
cout << &#34;学号 姓名 语文 数学 英语 平均成绩&#34; << endl;
for (i = 0; i < n;i++){
for(int m=i+1;m<n;m++){
if(stu.avr<stu[m].avr){
int k =stu.avr;
stu.avr = stu[m].avr;
stu[m].avr = k;
}
}
cout << stu.num << &#34; &#34; << setw(8) << stu.name << &#34; &#34;; //打印学号姓名
for (j = 0; j < 3;j++)
cout << setw(3) << stu.score[j] << &#34; &#34;; //打印三科成绩
cout << &#34; &#34;<<stu.avr << endl;
cout << endl;
}
cout << endl;
cout << &#34;三科的总平均成绩为: &#34; << (average/n) << endl;
cout << endl;
int maxsum = (stu[maxi].score[0] + stu[maxi].score[1] + stu[maxi].score[2]);
cout << &#34;最高分是学生:&#34; << stu[maxi].name << &#34;学号为: &#34; << stu[maxi].num << &#34; 各科成绩为 &#34; << stu[maxi].score[0] << &#34; &#34; << stu[maxi].score[1] << &#34; &#34; << stu[maxi].score[2] << &#34;平均分为:&#34; << stu[maxi].avr << &#34;总分为: &#34; << maxsum << endl;
cout << endl;
return 0;
}
//输入函数
void input(student stu[]){
ofstream ofile(&#34;xiaoyan.txt&#34;);
assert(ofile);
int i, j;
for ( i = 0; i < n; i++)
{
cout << &#34;学号8位: &#34;; //提示输入八位的学号
cin >> stu.num; //将学号加到第i个的num的位置
cout << &#34;姓名: &#34;; //提示输入姓名
cin >> stu.name; //将姓名加到第i个的name的位置
for ( j = 0; j < 3; j++) //一个for循环,用来获取三科的成绩
{
cout << &#34;成绩&#34; << j+1 << &#34;: &#34;;
cin >> stu.score[j];
}
cout << endl;
ofile << stu.num << &#34; &#34; << stu.name << &#34; &#34; << stu.score[0] << &#34; &#34; << stu.score[1]<< &#34; &#34; << stu.score[2]<< endl;
}
ofile.close();
}

当n=2的时候(只有两个学生)的效果图
涉及的部分知识点:
- assert()断言函数,用于在调试过程中捕捉程序错误
( assert() 的用法很简单,我们只要传入一个表达式,它会计算这个表达式的结果:如果表达式的结果为“假”,assert() 会打印出断言失败的信息,并调用 abort() 函数终止程序的执行;如果表达式的结果为“真”,assert() 就什么也不做,程序继续往后执行。)
2. setw()的意思是输出数据的占位宽度而不是数据与数据之间的间隔。它由头文件iomanip定义。
例如:
cout<<&#39;s&#39;<<setw(8)<<&#39;a&#39;<<endl;
则在屏幕显示
s a
//s与a之间有7个空格,setw()只对其后面紧跟的输出产生作用,如上例中,表示&#39;a&#39;共占8个位置,不足的用空格填充。若输入的内容超过setw()设置的长度,则按实际长度输出。
setw()默认填充的内容为空格,可以setfill()配合使用设置其他字符填充。
如
cout<<setfill(&#39;*&#39;)<<setw(5)<<&#39;a&#39;<<endl;
则输出:
****a //4个*和字符a共占5个位置。 |
|