算法三:奖学金计算 C++

本文介绍了一种计算学生奖学金的方法,并通过两种方式实现了学生奖学金的计算和最多奖学金学生的确定,包括使用数组和结构体进行数据存储,以及通过if语句判断奖学金条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目如下:
在这里插入图片描述
在这里插入图片描述
正确代码:

//周老师讲的法一:
#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);
注意呀!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值