「PAT乙级真题解析」Basic Level 1038 统计同成绩学生 (问题分析+完整步骤+伪代码描述+提交通过代码)
如题设所说,这道题目的核心需求是进行统计。 统计意味着考虑数据存储, 由于不是统计某个值(比如最值), 而是要统计之后用于一组给定分数的查询, 所以需要把所有统计数据存储下来.
#算法#数据结构#需求分析#pat考试#c语言
Table of Contents
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
问题分析
如题设所说,这道题目的核心需求是进行统计。 统计意味着考虑数据存储, 由于不是统计某个值(比如最值), 而是要统计之后用于一组给定分数的查询, 所以需要把所有统计数据存储下来.
统计数据存储
如果使用的编程语言有用于计数的键值对类型, 比如Map, 则可以直接用来存储统计数据. 在C语言中, 需要用数组来存储, 由于分数是整数, 所以可以直接用数组索引作为键, 数组元素值作为值.Map
完整描述步骤
- 获取成绩数目, 查询数目
- 初始化计数器
- 对于每一个成绩:
- 在计数器中将对应成绩的计数值+1
- 对于每一个查询:
- 获取计数器中所查询分数的对应值作为查询结果
伪代码描述
- get input of score_amount, query_amount;
- init counter[101] = {0}
- for each score: counter[score] +=1;
- for each query: print(count[score queried])
完整提交代码
/*
# 问题分析
如题设所说,这道题目的核心需求是进行统计。
统计意味着考虑数据存储, 由于不是统计某个值(比如最值), 而是要统计之后用于一组给定分数的查询,
所以需要把所有统计数据存储下来.
# 统计数据存储
如果使用的编程语言有用于计数的键值对类型, 比如Map, 则可以直接用来存储统计数据.
在C语言中, 需要用数组来存储, 由于分数是整数, 所以可以直接用数组索引作为键, 数组元素值作为值.Map
# 完整描述步骤
1. 获取成绩数目, 查询数目
2. 初始化计数器
3. 对于每一个成绩:
- 在计数器中将对应成绩的计数值+1
4. 对于每一个查询:
- 获取计数器中所查询分数的对应值作为查询结果
# 伪代码描述
1. get input of score_amount, query_amount;
2. init counter[101] = {0}
3. for each score:
counter[score] +=1;
4. for each query:
print(count[score queried])
*/
int main(){
int student_amount;
scanf("%d\n", &student_amount);
int score_frequency[101] = {0};
int score;
for (int i = 0; i < student_amount; i++){
scanf("%d", &score);
score_frequency[score]++;
}
int target_amount;
scanf("%d", &target_amount);
int target;
for (int i = 0; i < target_amount; i++){
scanf("%d", &target);
printf("%d", score_frequency[target]);
if (i+1 != target_amount)
printf(" ");
}
return 0;
}