一 单元知识
1、单元总览(个人就之前的所学内容和本单元所学的关系梳理)
第二单元我们学习了最基础的顺序结构,了解了最基础的学习C++的方法,学到了编写程序最基础最本质的想法,即使用简洁的数学公式或者关系式来将输入和输出联系起来,以达到解决问题的目的。但是生活中的问题并不都是那么的直白可以仅用顺序结构顺利解决的。在许多情况下,一个事物需要一分为二的看待,于是第三单元我们又学习了分支结构来分别处理对待一个事物在满足不同的条件下的情况。同时我们也学会了如何表示两个事物之间的关系(与,或,非)等等。随着学习的不断深入,又出现了更多更加复杂的问题。第二三单元所学习的知识可以很好的解决执行次数有限或者说需要执行次数较少的问题。试想如果一个问题在满足条件的情况下需要不断重复执行100次,那么我们仅用之前所学的知识是否就得写100次语句来实现问题的解决呢?那如果是1000次,10000次呢?且先不说计算机能否执行的问题,就是能执行你愿意机械的重复这么多次相同的操作吗?这个特别的体现出了本单元所学内容的重要性!(不断的学习是多么的重要,不学习新的知识只是着眼于之前那一点点的所学又如何改进提升?)本单元所学内容充分的提现了我们学习C语言的一个重要的目的:解放双手,用计算机来代替人类进行不断重复的操作。同时提现了计算机最大的优势:可以模拟事物运行的过程。(为方便起见,本文以下所有代码省去开头结尾的简单固定格式,不影响读者阅读)
2、知识总结(知识模块、应用举例分析及易错点罗列)
(I)循环结构的三种实现形式:while语句、do-while语句和for语句
(II)循环嵌套
(III)break和continue语句
(IV)常见错误及解决
(I) while 语句结构
while(表达式){
循环体
}
//当循环体只是一个语句时可将花括号省去
注意:比较while和if语句,两者都是在条件成立的情况下执行下面的语句,但不用的是if语句执行一次之后不会再去判断条件再执行,而while会判断条件如果成立再执行。 再者while会多一个循环控制变量i来控制循环的次数。
EX1
int i=1;
while (i<=10) {
printf ("@") ;
i++;
}
在这个代码中i开始值为1满足循环条件,进入循环体输出一个"@"同时i的值增加1,一直重复直到i变为11不满足条件跳出循环,明显在这个循环中i从1一直递增到10即描述了该循环要执行10次。
显然当循环次数明确时可以使用这种写法,但万一循环次数不明确时需要采取以下的方法
EX2
int x,s=0;
cin>>x; //先输入一个x进行判断如果成立则进入循环体继续判断执行,不成立直接跳过循环体
while (x!=0) { //此处可简写为while(x)
if(x>0) s++;
cin>>x;
}
cout<<s<<endl;
在这个例子中可以发现两点:
1、当循环次数不确定时,我们可以将循环条件改为一般的条件,当遇到特殊情况时退出循环体实现不确定次数循环,在做题的过程中我发现了一中更加特殊的情况,当一般条件不好描述的时候,可以这样写:先将while语句中的条件写成"(cin>>x)"意思就是只要输入x就进入循环体执行指令,当特殊情况成立时再退出循环
2、在进入循环体前要先输入一个值与条件进行判断以方便进入循环体,这也是为什么这个例子中在循环体外还要在输入一个x
(I)do-while语句结构
do{
循环体
}while(表达式);
注意:1、do-while语句最后表达式后要加";"而之前的if语句和while语句都没有加
2、do-while语句较while语句最大的不同是do-while语句不论表达式成不成立都会先执行一次循环体
下给两例子进行比较感受do-while和while语句的区别
EX3 没有执行过一次循环体
int i=1;
while (i<1)
i++;
cout<<i<<endl; //结果为1
EX4 执行过一次循环体
int i=1;
do{
i++;
}
while (i<1) ;
cout<<i<<endl; //结果为2
(I)for语句结构
for (表达式1;表达式2;表达式3) { //表达式1表示循环初始化,表达式2表示循环条件,表达式3表示循环变量增值
循环体
} //循环的顺序先执行表达式1,然后执行一边循环再执行表达式3,最
后是表达式2 (三个表达式均可省略)
注意:当变量在for语句外定义时,变量可在整个程序中使用;而当变量在for语句中定义时,只能在for语句中使用。
(II) 循环嵌套
即在一个循环中在嵌入一个循环,要注意的是,在小循环执行过了一圈之后,大循环才会改变一次值,然后再执行一圈小循环。
(III) break和continue语句
在循环体中遇到break语句,就会立刻跳出循环体,执行循环结构后面的语句
在循环体中遇见continue语句,就会忽略本次循环的后续语句而去执行下一次循环
注意:跳出或忽略的是包含break或continue的最内层循环,而不是整个大的循环
(IV) 常见错误及解决
1)变量未赋初值
就比如是在常见的累加和问题中,如果用一个变量ans来表示最终要输出的结果,那么如果不赋初值只执行"ans+=x"最终的结果很容易出错 (解决方案:给相应变量赋初值)
2) 中间运算结果越界
如果程序运行过程中有一步c=b/(a*a) 其中a*a的结果可能会超出所定义的范围 (解决方案:改成c=b/a/a)
3)if-else语句混乱
if-else语句的规则:if语句可以没有else语句与之相匹配;else语句总是与它前面的、最近的if语句相匹配。
EX5
if(条件a)
if(条件b) 代码段b
else 代码段a
这个代码本意是想说当条件a不成立时执行代码段a,但因为在else语句之前有一段if(条件b) 代码段b,则根据if-else语句使用规则,else语句与if(条件b) 代码段b相结合,于原意相差甚远结果也不对。 (解决方案:在if(条件b) 代码段b这段话的前后加一对花括号使其成为条件a成立时执行的语句)
4)实数比较出错
在比较两个实数是否相等时,如果直接用等号,往往会造成错误,这是浮点运算存在误差造成的。 (解决方案:使用两数差的绝对值与一个相对极小量进行比较。例如:if(fabs(x-y) <1e-6) …或者if(fabs(x) <1e-6)…)
3、个人学习感受
本单元我们又学习了全新的运算方法——循环结构,较前两单元,我们又开启了一个全新的篇章,就我个人而言,这章的难度相对较大,也很需要时间去慢慢思考想透。就我个人做题的情况来看,我觉得循环嵌套有些不好理解,一开始时描绘一个简单字符三角形都觉得很困难(伤脑筋),不过后来在结合着书本和同学们的交流之后,我慢慢的开始模仿,后来也掌握到了一定的套路,先用两嵌套的for语句刻画出那么一个大的矩形框架,然后按照条件利用行列对应的位置找到各位置元素相对应的规律,用来刻画具有一定规律的位置。说的比较绕,举个例子,就比如要刻画矩形的两条对角线就可用"i==j"及"i+j==n+1"来表述。没有不费力的学习,所有的事包括学习要想做好都马虎不得,必定会花费你的时间和精力。就像学C++,最最根本上课得保证好听课质量,当然仅仅这样是不可能“学好的”,那不然不论谁都是成了老师口中的C++大神了,我明白要想比别人更好更优秀,最起码你得花等多的时间,想更难的问题。我知道以后的知识只会愈加困难,不过我不怕,我准备好了,在学习中不断的提高自己的能力,增长自己的知识,完善自己以成为一个更好的我,这是一件多么值得开心的事。我始终相信跟紧老师的步伐,脚踏实地一步一脚印,最后一定会成就一个无法想象的我。