C++自学两周过程中一道印象深刻的题

103 阅读2分钟

题目: 小粉兔在本学期共修读了 N 门课程,第 i 门课程的课程代码为E[i]​,每门课程都需要在结课后进行课程考试。

教务开始处理粉兔的成绩。教务共录入了 M条成绩信息,一条成绩信息由课程代码和成绩组成。由于成绩可能存在调整,一门课程的成绩可能被重复录入,后录入的成绩将覆盖先录入的成绩。课程成绩在 60分及以上,该门课程为及格;否则,为不及格。

由于粉兔记性很差,很可能忘记参加某些课程的课程考试。如果教务没有录入粉兔某门课程的成绩,则代表粉兔旷考了该门课程。旷考的课程亦为不及格。

小 F 就是这名教务,小 F 对粉兔旷考和不及格的门数非常感兴趣,请你帮助她统计。

解答:

#include<stdio.h>
int n,m;
int E[1000000],A[1000000];
int finish=0,ok=0;
int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&E[i]);
		A[i]=-1;
	}
	while(m--){
		int p,s,id;
		scanf("%d %d",&p,&s);
		for (int i=1;i<=n;i++){
			if(E[i]==p){
				id = i;
				A[id]=s;
			}
		}
		
	}
	int ans1=0,ans2=0;
	for(int i=1;i<=n;i++){
		if(A[i]==-1){ans1++;}
		if(A[i]<60){ans2++;}
	}
	printf("%d\n%d",ans1,ans2);
	return 0;
} 

感受: 全局定义的数组,在开始时,默认值均为 0。我们需要区分 没有录入成绩而导致的初始值  和 真的考了零分的 0。为了解决这个问题,我们可以将a[1∼N] 的初始值赋为 -1,这样,没有录入成绩,也就是旷考的科目就被区分出来了。