第5章阅读和完善程序概述 5.1阅读和完善程序 从本章开始,本书分析试题的后两道大题: 第三题“阅读程序写结果”和第四题“完善程序”。阅读程序写结果每年有4题,每题8分,共32分,是NOIP考试中的一大拉分点。该题型考查的知识点非常多,主要包括计算机语言、多重循环的嵌套、数组的操作等。对于阅读程序题,考生一定要细心,程序从主函数main开始顺序执行,要注意循环的判断条件以及程序的输入和输出细节。 完善程序每年2题,每题14分,共28分。该部分的成败也直接决定了是否能够通过NOIP的初赛。完善程序题主要考查考生对于各类算法的理解,以及基本的函数、字符串、数组的操作。补充完善程序题的首要点就是要弄清楚出题者的意图,了解程序要实现什么样的功能,对于要实现这样的功能,需要考生将程序补充完整。完善程序所要填写的部分一般不会很难,只要弄清楚所在程序段要实现的功能就可以将程序补充完整。 5.2常用解题方法 阅读程序写结果和完善程序题主要考查学生以下几个方面的能力。  程序设计语言的掌握情况。  程序中基本算法的掌握情况。  数学的知识面及运算能力。  细心、耐心的计算思维。 该部分的解题也是有规律可循的,本书主要总结了以下几种解题方法。 5.2.1模拟法 在NOIP的阅读程序题中有相当一部分基础题,主要考查考生对程序设计语言的基本语法的掌握,这类题目利用纯“模拟法”就可以得出答案。 所谓“模拟法”就是利用人脑完全模拟程序的执行过程,只要题目不是很复杂,这种方法就比较奏效。但在模拟过程中,特别要注意各个变量的变化以及书写的认真和整洁,因为一个变量的计算错误就会引起整个程序结果的错误。 案例展示: #include using namespace std; int main(){ int i,a,b,c,d,f\[4\]; for(i=0;i<4;i++) cin>>f\[i\]; a=f\[0\]+f\[1\]+f\[2\]+f\[3\]; a=a/f\[0\]; b=f\[0\]+f\[2\]+f\[3\]; b=b/a; c=(bf\[1\]+a)/f\[2\]; d=f\[(b/c)%4\]; if(f\[(a+b+c+d)%4\]>f\[2\]) cout<>f\[i\];a=f\[0\]+f\[1\]+f\[2\]+f\[3\]=9+19+29+39=96a=f\[0\]+f\[1\]+f\[2\]+f\[3\];a=a/f\[0\]=96/9=10a=a/f\[0\];b=f\[0\]+f\[2\]+f\[3\]=9+29+39=77b=f\[0\]+f\[2\]+f\[3\]b=b/a=77/10=7b=b/a;c=(bf\[1\]+a)/f\[2\]=(719+10)/29=4d=f\[(b/c)%4\]=f\[(7/4)%4\]=f\[1\]=19(a+b+c+d)%4=0if(f\[(a+b+c+d)%4\]>f\[2\])if(f\[0\]>f\[2\]) f\[(a+b+c+d)%4\]>f\[2\]f\[0\]>f\[2\]9>29 不成立 执行 c+dcout< #include using namespace std; #define MAX 100 void solve(char first\[\], int spos_f, int epos_f, char mid\[\], int spos_m, int epos_m) { int i,root_m; if(spos_f>epos_f) return; for(i=spos_m;i<=epos_m;i++) if(first\[spos_f\]==mid\[i\]) { root_m=i; break; } solve(first,spos_f+1,spos_f+(root_m-spos_m),mid,spos_m,root_m-1); solve(first, spos_f+(root_m-spos_m)+1,epos_f,mid,root_m+1,epos_m); cout<>len; cin>>first>>mid; solve(first,0,len-1,mid,0,len-1); cout< using namespace std; int main(){ int i,j,sum; sum=0; for(i=1;i<=4;i++) for(j=1;j<=4;j++) { sum=sum+ij; cout<; 标志常用格式<标志>:<语句>goto语句的作用是使程序执行流程跳转到标记的语句处。 6.2历年真题解析与知识点巩固 题目12018年阅读程序第1题#include char st\[100\]; int main() { scanf("%s",st); for(int i=0;st\[i\];++i) { if('A'<=st\[i\]&&st\[i\]<='Z') st\[i\]+=1; } printf("%s\\n",st); return 0; }输入:QuanGuoLianSai输出: 【分析】该题目实现的功能是: 大写字母加1,其他字符不变。 【参考答案】RuanHuoMianTai 【核心知识点】字符串或字符数组中大写字母的处理。if('A'<=st\[i\]&&st\[i\]<='Z') st\[i\]+=1; 【巩固】编写程序实现功能: 输入一串字符,将其中的小写字母变成大写字母,大写字母变成小写字母,其余字符保持不变。 题目22018年阅读程序第2题#include int main() { int x; scanf("%d",&x); int res=0; for(int i=0;i