一.思维导图[思维导图]
二.语法认识
1.if_else语句 使用方法:
if(条件1) { 语句1; } else { 语句2; }
遇到的问题:对于if和else的两两配对理解不够,导致程序判断结构异常。
解决方法:牢记else和if的匹配准则:else与最靠近它的、没有与别的else匹配过的if相匹配。并在编辑代码时采用多层缩进的书写格式,使判断结构层次分明。
注意事项:else后无需再编辑条件,为养成良好的编辑习惯,if-else语句的大括号要打出来。
2.switch语句 使用方法:
switch(整形表达式) { case 常量表达式1: 语句1;break; case 常量表达式2: 语句2;break; … case 常量表达式n: 语句n;break; default: 语句n+1; }
遇到的问题:过于依赖switch,导致有时编辑出的代码质量不好,不便于检查和后期的程序维护。
解决方法:在解决问题时只在switch语句的优势十分明显时使用switch语句,慎用、智用switch语句。
注意事项:switch语句中的break语句并不是每个case语句后都必须有, 这个机制可以让switch语句的用途大大增加,所以要在switch语句中智慧的安排break的位置。
3.for语句 使用方法:
for(表达式1; 表达式2; 表达式3) { 循环体语句 }
遇到的问题:在某些问题中,经常会控制不好for语句的循环次数,导致运算结果错位。
解决方法:在运用for语句前,先在纸上写出程序模拟图,计算无误后再打代码。
注意事项:for语句中的表达式1只是负责在开始时提供一个起点,只运算一次。表达式2是是否再一次执行循环的判断条件。表达式3为循环提供变量,避免程序陷入死循环。
4.while语句 使用方法:
while(循环条件) { 循环体语句 }
注意事项:while语句是循环语句的一员,其他循环语句写出的代码几乎都能化为while语句,所以在自己读不懂某个循环代码时,将其化为while语句不失为一种方法,一来可以换一种方式看问题,二来可以增进自己对这个代码的理解度。
5.do-while语句 使用方法:
do { 循环体语句 }while(循环条件);
遇到的问题:此语句与前两个循环语句的循环思路并不一样,相同的条件在此循环语句中很可能会输出不一样的结果。
解决方法:理解此语句的循环原理和特殊的循环顺序,多加训练,当自己一看到问题就能判断出是否用do-while语句时,就意味着对do-while有了比较正确的理解。
注意事项:需要注意的是,do-while语句的循环顺序与前两个循环语句都不一样,先循环再判断的顺序决定了它至少循环一次的特性,这种特性在解决如“计算一个数的位数”的这种问题时显得得心应手,要善用此特性,而且要记得在语句的最后加上分号。
6.break以及continue 使用方法:
switch(整形表达式) { case 常量表达式1: 语句1;break; … case 常量表达式n: 语句n;break; default: 语句n+1; } for(表达式1; 表达式2; 表达式3) { 语句1; continue; 语句2; }
注意事项:break语句可以出现在选择结构和循环结构里,但continue语句只能用在循环语句中,continue语句使用后,本次循环直接结束,不再执行continue之后的语句,直接进行下一轮循环。break语句是跳出当前执行行的语句,二者各有特色,各有各的作用。
三.PTA分数截图
2.3、2.4作业:
第三章作业:
4.1作业:
四.PTA代码分析
题目①:
思路:
(1)本题是求交错序列前N项和的变形题,此题比较特殊的一点就是引入了正负交替求和的问题,这就对循环体做出了进一步的要求,我们可以利用循环使程序自行完成正负转换。
(2)在程序中定义一个flag,可以使其初始值为1,然后在循环体中可以利用如“flag=-flag”让flag在进行下一次循环时变为-1,下下次循环时又变回到1。
(3)定义一个j=1然后利用如“sum=sum+flag*1.0/(j+3)”的语句以此来实现求得正负1/(j+3)的和的目的。
(4)最后注意输出的数据精确到小数点后三位哦~。
代码:
#include <stdio.h> int main(void) { int i, j, flag, N; double num, sum; scanf("%d", &N); //输入N// flag=1; j=1; sum=0; //初始化变量的值// for(i=1; i<=N; i++) { num=flag*1.0/j; sum=sum+num; flag=-flag; j=j+3; } //求交错序列前N项和// printf("sum = %.3f\n", sum); return 0; }
错误归纳:
①在刚开始时,没有仔细看到题目要求,结果打完代码后只能推倒重来。
②编程时忘记了最后输出的数值要保留三位小数。
收获:
本题教会了我编辑程序前一定要看准题目要求,了解题目想让你做一个什么给它,以什么样的形式输入,以什么样的形式输出。
题目②:
思路:
(1)本题涉及《C语言程序设计》3.1.3的多分支结构和if-else语句的相关知识点,以及字符型数据的输入、判断方面的相关知识,只要充分理解了上述两条知识点,把这道题做出来就不是难事。
(2)首先我们应定义两个整型变量以及一个字符型变量用以存放用户输入的信息。
(3)其次运用if-else语句实现多分支结构,比如如果输入的字符为‘+’,则计算两个值的和并打印到显示器上,否则看如果字符为‘-’时,则计算两个值的差并打印······
(4)在最后的else语句中,我们应该注意到如果用户没有输入四则运算符中的某一个而是输入了其他不相关的字符时,我们应给程序一种“集错误之大成“的输出选择,那就是最后的”ERROR“,只要不符合以上四个条件,一律按ERROR处置。
代码:
#include <stdio.h> int main() { int a,b; char ch; scanf("%d %c %d",&a,&ch,&b); //输入数值和需要进行运算的运算符// if(ch=='+')printf("%d",a+b); else if(ch=='-')printf("%d",a-b); else if(ch=='*')printf("%d",a*b); else if(ch=='/')printf("%d",a/b); else if(ch=='%')printf("%d",a%b); else printf("ERROR"); //运用if-else的多分支结构// return 0; }
错误归纳:
①在初次编程时,将if后括号内的条件中的‘+’错写成了”+“,从而导致编译错误。
收获:
本题让我开始注意自己的程序在一些细节的点上出现的问题,同时使我对于多分支结构有了比较直观的认识。
题目③:
思路:
(1)本题涉及到与判断素数和循环嵌套有关的知识。
(2)本题最大的问题就是怎样解决素数的筛选和个数计数、素数累加以及在一些特殊情况下程序计算出的结果是否会出错的问题。
(3)1不是素数,但是当M=1时,稍有不慎程序就会把1也当作素数,所以特殊情况特殊对待,当M=1时,帮程序转换成M=2,这样因为1不是素数,所以直接跳过1不会对结果造成影响。
(4)注意循环中不是每个数都是素数,所以在第一层循环中我们还应该加入一个控制条件,当本次循环的某个值是我们所希望的,即它是素数,循环才做累计和累加的动作。
(5)这里我们可以引入一个flag,以它作为循环自行判断是否做额外行为的条件,比方说先定义flag=1,当循环输出的一个数是素数时,它依旧等于1,再在第一层循环中写下以此为条件才能执行的命令,比如素数的个数+1,素数总和加上本次循环得到的数(其实就是一个素数),这样我们就能让程序做出自动筛选出素数进行计数和累加的动作,如果输出的数不是素数,则flag变为0,不符合条件,程序就会进行下一轮循环,不做多余动作。
(6)最后输出素数的个数和这些素数的总和,整个问题迎刃而解。
代码:
#include <stdio.h> int main() { int m,n,i,j; int count=0; int sum=0; scanf("%d %d",&m,&n); //输入范围// if(m==1) m=2; //对于特殊情况的处理方法// for(i=m;i<=n;i++) { int flag=1; int j; for(j=2;j<i-1;j++) //判断数值是否为素数// { if(i%j==0) { flag=0; break; } } if(flag) //若flag=1,证明本次的i为素数// { count++; sum+=i; } } printf("%d %d\n",count,sum); return 0; }
错误归纳:
①在初次编程时,没有思考过如果M和N取到某些比较特殊的值时会不会对程序的判断产生影响。
②在编辑关于素数判断这一部分的代码时,给j的初始值为1,忽略了循环需从j=2开始的要点。
收获:
本题使我锻炼了自己对于”怎样在一堆数据中找出自己想要的一些数据并对它们做一些处理“这类问题的解决能力,也为我对解决这类问题积攒了一个比较典型的模版。