题目如下:
正确代码:
//周老师讲的法一:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char str[21]; //用来存储学生姓名
int N,a_score,c_score,papersnum; //N存储学生个数,a_scare为平均成绩,c_score为班级评议成绩
//papersnum为论文数
char flag_leader,flag_west; //flag_leader标识是否为班干部,flag_west是否为西部省份学生
int sum=0,count; //sum用来存储所有学生奖学金的和,count为学生奖金的和
int max=0; //max用来存储最多的奖金数目
char name[21]; //用来储存最多奖学金的学生姓名
int i,j;
//freopen("in.txt","r",stdin); 对输入文件做个测试
scanf("%d",&N);
for(i=0;i<N;i++)
{
count=0;
scanf("%s%d%d %c %c %d",str,&a_score,&c_score,&flag_leader,&flag_west,&papersnum);
//统计一个学生可获得的奖学金
if(a_score>85&&c_score>80)
count+=4000;
if(a_score>80&&papersnum>=1)
count+=8000;
if(a_score>90)
count+=2000;
if(a_score>85&&flag_west=='Y')
count+=1000;
if(c_score&&flag_leader=='Y')
count+=850; //注意5个if语句是并列的,没有上下层之分,不是else if,是 if
if(count>max)
{
max=count;
for(j=0;j<21;j++)
{
name[j]=str[j]; //把名字换为当前这个最大奖学金人的名字
}
}
sum+=count;
}
cout<<name<<endl;
cout<<max<<endl;
cout<<sum<<endl;
return 0;
}
//周老师讲的法二:
//采用结构体来实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct stu
{
int id;
char name[21];
int sc_avg;
int sc_class;
char ch_gb;
char ch_xb;
int cnt_essay;
int money;
} S[101];
//下面是一个比较,也就是排序
//下面呢,是一个比较函数,是用const函数
int cmp(const void *a,const void *b)
{
//同等奖金数最多的两个人,就看谁最先出现;即奖金相同的话,
//就按照id来排序
if((*(struct stu *)b).money==(*(struct stu *)a).money)
return (*(struct stu *)a).id-(*(struct stu *)b).id;
else
//如果奖金数量不同的话,就按照奖金来排序
return (*(struct stu *)b).money-(*(struct stu *)a).money;
}
int main()
{
int n;
int i;
while(scanf("%d",&n)!=EOF) //n个,一直读到文件尾
{
int sum=0;
for(i=0;i<n;i++)
{ //读到这个n,就有n个学生,然后就开始循环,作为结构体成员来读进去
scanf("%s%d%d %c %c %d",&S[i].name,&S[i].sc_avg,&S[i].sc_class,&S[i].ch_gb,&S[i].ch_xb,&S[i].cnt_essay);
S[i].money=0; //把它初始成0
S[i].id=i; //对应上面说的第几个人
//五个判断的条件,满足什么条件,奖金数就++
if(S[i].sc_avg>80&&S[i].cnt_essay>0)
{
S[i].money+=8000;
sum+=8000;
}
if(S[i].sc_avg>85&&S[i].sc_class>80)
{
S[i].money+=4000;
sum+=4000;
}
if(S[i].sc_avg>90)
{
S[i].money+=2000;
sum+=2000;
}
if(S[i].sc_avg>85&&S[i].ch_xb=='Y')
{
S[i].money+=1000;
sum+=1000;
}
if(S[i].sc_class>80&&S[i].ch_gb=='Y')
{
S[i].money+=850;
sum+=850;
}
}
//用qsort函数,也就是说根据这n个人的奖金数来排序,如果
//奖金数一样的话,就按照id来排序
qsort(S,n,sizeof(struct stu),cmp);
//因为它排序了,而且它是逆序排的, 那么也就是第一个人是最多的那个
//第一个人是奖金数最多的,那么这个问题就解决了
//输出即可
cout<<S[0].name<<endl<<S[0].money<<endl<<sum<<endl;
}
return 0;
}
//自己写的:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int N;
cin>>N;
char str[21],name[21];
int a,b,paper;
char leader,west;
int sum=0,count,max=0;
int i,j;
for(i=0;i<N;i++)
{
count=0;
scanf("%s%d%d %c %c %d",str,&a,&b,&leader,&west,&paper);
if(a>80&&paper>=1)
count+=8000;
if(a>85&&b>80)
count+=4000;
if(a>90)
count+=2000;
if(a>85&&west=='Y')
count+=1000;
if(leader=='Y')
count+=850;
if(count>max)
{
max=count;
for(j=0;j<21;j++)
{
name[j]=str[j];
}
}
sum+=count;
}
cout<<name<<endl;
cout<<max<<endl;
cout<<sum<<endl;
return 0;
}
注意字符串的输入
char line[100];
scanf("%s",line); //注意,不是&line
printf("%s",line);
注意呀!!!