---恢复内容开始---
一.思维导图
二.对以下语法的认识
(1)if-else:
1 if ( 条件 ) 2 { 3 语句一 4 }else { 5 语句二 6 }
用法:如果条件成立,则执行语句一,否则执行语句二;
遇到的问题:条件设置错误使其恒成立或恒不成立,如原本条件应是a==1错写成a=1。(所以打代码时可以将a==1打成1==a,这样如果少打一个等号编译器会提示你编译错误)
注意事项:1.如果出现if—else的嵌套结构,则if和最近的else配对。
(2)switch:
1 switch(表达式) { 2 case 常量表达式1:语句段1;break; 3 4 … 5 6 case 常量表达式n:语句段n; break; 7 8 default: 语句段n+1; break; 9 10 }
用法:根据表达式来在常量表达式中寻找相同,然后执行相应case后的语句段,最后在break跳出。
遇到的问题:switch()误加分号和case后的冒号打成分号导致编译错误。(代码完成后认真检查一遍)
注意事项:1.case语句之后即使需要执行多条语句,也不需要加大括号。
2.case后的常量必须互不相同。
3.switch中break是可选的,break语句会立即终止switch语句的执行。
4.switch语句是顺序检查,但每种情况的次序是无关紧要的,例如,可以先出现default语句,再出现case语句。
(3)for:
1 for(语句1;条件;语句2)
2 { 3 循环体语句 4 }
用法:语句1通常赋值一个初始量,利用初始量进行条件的判断,如成立则运行循环体语句,跳出循环后再次进行条件判断,接着进行语句2,然后再一次进去循环体语句直到条件不成立。
遇到的问题:条件设立错误,导致结果与答案不同。(如果一时想不出问题根源,可以用笔在纸上模拟一遍程序的运行流程)
注意事项:1.for循环中的语句1、条件。语句2都可以省略,分别表示不初始化、不判断、省略后什么也不执行。
(4)while:
1 while(条件){ 2 循环体语句 3 }
用法:进行条件的判断,如成立则进行循环体语句,直到条件不成立则退出循环。
遇到的问题:while循环的括号后面误加分号,导致编译错误;while循环控制的条件变量未能使其随循环进行而更新,导致陷入死循环。
(代码完成后认真检查;while循环控制的条件变量一定要更新,保证循环能够正常结束)
注意事项:1.while的大括号{}后加不加;都一样,均能通过编译。
2.如果条件不满足,while循环一次都不执行。
(5)do-while:
1 do{ 2 循环体语句 3 4 }while(条件)
用法:与while循环类似。
遇到的问题:do-while循环和while循环非常相似却又略有不同,编写代码有时会混淆。(多尝试运行while与do-while语句,领会其不同)
注意事项:1.就算条件不满足,do-while循环也会至少执行一次。
其他与while相似。
(6)break,continue:
1 switch(整形表达式) 2 { 3 case 常量表达式1: 语句1;break; 4 … 5 case 常量表达式n: 语句n;break; 6 default: 语句n+1; 7 8 } 9 10 for(语句1; 语句2; 语句3) 11 { 12 语句1; 13 continue; 14 语句2; 15 16 }
用法:break,用来跳出最近的一整个循环。
continue,跳过其后续的循环语句。
遇到的问题:对break和continue各自的用法不够明确,出现错用的情况。(在本地编译器自行运行,发现规律)
注意事项:暂时未遇到明显需要注意的地方。
三.PTA成绩截图
2.3、2.4
第三章
4.1
四.PTA代码分析
1.
1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int i,flag; 6 double item=1.0,s,eps; 7 sum=0; 8 flag=1; 9 i=1; 10 scanf("%lf",&eps); 11 if(eps>=1){ 12 printf("sum = 1.000000"); 13 } 14 else{ 15 while(fabs(item)>eps) 16 { 17 item=flag*1.0/i; 18 sum=sum+item; 19 i=i+3; 20 flag=-flag; 21 } 22 printf("sum = %.6f",sum); 23 } 24 return 0; 25 }
(1). 代码分析:首先,考虑到eps大于等于1和小于1时是两种不同的情况,所以先用if-else语句分支出这两种情况分别要执行的代码。
eps>=1时,依题目要求显然输出1.000000。
eps<1时,分别假设题目中各个分式的分母为i,各个分式的值为item,所有项和为sum。又考虑到每一项的正负是交错改变的,所以增加一个flag来控制每一项前的符号。
题目要求最后一项的绝对值不大于eps,循环次数不可知,应该采用while循环。由关键词“最后一项”易知应用item的值和eps的值相比,并先用fabs函数求item的绝对值。
(2).出现的错误:刚开始未能弄清给定精度eps的含义,直接计算该式总和。(审题要仔细,避免因审题错误浪费大量时间)
未考虑到eps大于等于1的情况,导致答案部分正确。(要有全局观念,考虑问题要全面)
printf函数写到了while函数里面。(这个比较傻......)(打代码过程中要细心,避免出现低级错误浪费时间)
(3).收获感悟(见上红字与下)
学会了使用fabs函数。
(4).代码已修改规范,如仍有不规范恳请指出。
2.
1 #include <stdio.h> 2 #include <math.h> 3 int main() 4 { 5 int m,n,i,j; 6 double sum=0; 7 double M=0; 8 double N=0; 9 scanf("%d %d",&m,&n); 10 11 for(i=m;i<=n;i++){ 12 M=M+1.0*pow(i,2); 13 } 14 for(j=m;j<=n;j++){ 15 N=N+1.0/j; 16 } 17 sum=M+N; 18 printf("sum = %lf",sum); 19 return 0; 20 21 }
(1) .代码分析:题中式子初看较复杂,但其实可以拆为两部分,m的平方到n的平方的和与m分之一到n分之一的和,所以分别设M与N两个变量存放它们和的值。
又因为该式中要用到的两个循环的循环次数可知,故采用for循环。将两个for循环得到的M和N相加赋给sum,即可得到答案。
(2).出现的错误:搞错了两个for循环中的边界数,导致答案错误。(使用for循环时要考虑边界问题,实在难以搞清可以用笔在纸上演算一遍)
(3).收获感悟(见上红字与下)
较为正式的接触到了接触到了pow函数。(ps:pow函数计算效率较低,所以在不是计算较为复杂的次方时,可以自己编写一串代码来计算)
(4).同1(4)。
3.
1 #include <stdio.h> 2 int main() 3 { 4 int a,b,c,t; 5 scanf("%d %d %d",&a,&b,&c); 6 if(a > b) 7 { 8 t = a; 9 a = b; 10 b = t; 11 } 12 if(a > c) 13 { 14 t = a; 15 a = c; 16 c = t; 17 } 18 if(b > c) 19 { 20 t = b; 21 b = c; 22 c = t; 23 } 24 printf("%d->%d->%d ",a,b,c); 25 return 0; 26 }
(1).码思路:题目要求将随机三个整数由小到大排序,第一时间想到的就是if-else的分支结构。定义a、b、c、t这四个变量,其中t作为中间变量。
首先,判断a是否大于b,是就交换a、b的值,否就不变。同理,再分别判断a与c、b与c的关系,始终使a为最小值,c为最大值,最后按题目要求分别输出a、b、c。
(2).出现的错误:无。
(3).收获与感悟:灵活运用中间参数可以大大简化代码。
(4).同1(4)。
---恢复内容结束---