2023程序设计实验期末考试

编程题部分

1. 谁拿了最多的奖学金

问题描述
某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;
五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;
成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;
西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;
班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得。
只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。 现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。
输入
输入的第一行是一个整数N(1≤N≤100),表示学生的总数。
接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。

输出
输出包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。

输入示例
4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1

输出示例
ChenRuiyi
9000
28700

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<stdio.h>
#include<stdlib.h>

typedef struct data{
char name[21];
int avg;
int clscore;
char isleder;
char iswest;
int num;
}DATA;

int main(){
int N,i;
int count,max,all;
DATA *stu;
int *money;
scanf("%d",&N);
stu=(DATA*)malloc(sizeof(DATA)*N);
money=(int*)malloc(sizeof(int)*N);

for(i=0;i<N;i++){
scanf("%s %d %d %c %c %d",stu[i].name,&stu[i].avg,&stu[i].clscore,&stu[i].isleder,&stu[i].iswest,&stu[i].num);
}
for(i=0;i<N;i++){
money[i]=0;
if(stu[i].avg>80 && stu[i].num>=1){
money[i]+=8000;
}
if(stu[i].avg>85 && stu[i].clscore>80){
money[i]+=4000;
}
if(stu[i].avg>90){
money[i]+=2000;
}
if(stu[i].avg>85 && stu[i].iswest=='Y'){
money[i]+=1000;
}
if(stu[i].clscore>80 && stu[i].isleder=='Y'){
money[i]+=850;
}
}
max=money[0];
all=money[0];
count=0;
for(i=1;i<N;i++){
all+=money[i];
if(money[i]>max){
max=money[i];
count=i;
}
}
printf("%s\n%d\n%d",stu[count].name,money[count],all);
free(money);
free(stu);
return 0;
}

2. 陶陶摘苹果

问题描述
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

输入
输入包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

输出
输出文件包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

输入示例
100 200 150 140 129 134 167 198 200 111
110

输出示例
5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int main(){
int n=0,i;
int a,all;
int length[10];
for(i=0;i<10;i++){
scanf("%d",&length[i]);
}
scanf("%d",&a);
all=a+30;
for(i=0;i<10;i++){
if(length[i]<=all)
n++;
}
printf("%d",n);
return 0;
}