一.思维导图[思维导图]
二.对以下语法的认识
1.if - else 语句
if(条件1)
{
语句1;
}
else
{
语句2;
}
问题:if 或 else 只执行一个语句
解决方法:每一个if或else后面都接{},将要执行内容作为一个复合语句执行。
注意:if 和 else 之间不能用除执行内容外其他语句间隔(即{}复合语句与else间不能接其他语句),否则else将缺失if匹配。
2.switch语句
switch(变量表达式)
{
case 条件1: 语句1;break;
case 条件2: 语句2;break;
…
case 条件n: 语句n;break;
default: 语句n+1;break;
}
问题:漏掉break;则循环将把满足条件后的所有语句全部执行,直到下一个break。
解决:根据需要在一定条件后加上break。
注意:
1.switch语句是将变量表达式在语句中遍历,当变量表达式与条件相同时,执行对应语句,
2.如果不加入default,则循环将会在结束后自动跳出,区别就在于有没有对无关条件进行操作;
3.for语句
for(表达式1; 表达式2; 表达式3)
{
循环体语句
}
for(a;b;c)
a 初始条件 可以省去
b 循环继续条件
c 每轮结束执行动作
注意:a、b、c间要用;间隔,否则循环体无法执行。
4.while
while(循环条件)
{
循环体语句
}
问题:忘记初始化变量,导致循环无法进入。
解决:先对条件初始化。
技巧:可以用1作循环条件,当循环到自己想要的结果时,用break跳出。
注意:while语句先判断后循环,所以必须要对变量初始化。
5.do - while
do
{
循环体语句
}while(循环条件);
注意:do-while先执行后判断,所以至少可以执行一次循环体。
同时do-while语句、while语句、for语句可以相互转换。
6.break 和 continue
do
{
循环体语句
break;
}while(循环条件);
do
{
循环体语句
continue;
}while(循环条件);
break 跳出循环
continue跳过本轮循环进入下一轮
break和continue只跳出所在的循环,若为嵌套循环,并不会全部跳出。
三. PTA分数截图
2.3、2.4作业 :
第三章作业:
4.1作业:
四. PTA代码分析
题目1.
思路:该题为求1~n阶阶乘的和,因此我们需要先在脑海中确定有几个要设的变量。
1.首先题目要求输入的整数N,其次有对应n的阶乘sum和总和SUM,而对与阶乘sum,我们需要两个for循环,即设 r,j 作为for的表达式,如此我们可以预设变量:int SUM = 0,sum = 1,r,j, N;
这里只需要用 int 作类型名,因为题目表示N不超过12,int 范围已经足够。
2.然后,我们可以输入N,之后做两个for循环,即
for (j = 1; j <= N; j++)
{
for (r = 1; r <= j; r++)
{
sum *= r;
}
SUM += sum;
sum = 1;
}
第一个for是从1到N的遍历,用于确定阶数,第二个for是求出相应的阶乘,然后加到SUM上,最后要将sum初始化为1,以重新进行第二个for循环。
收获:利用for来进行累乘或累加。可以将本阶乘做一个函数调用。
#include <stdio.h>
int main()
{
int SUM = 0,sum = 1,r,j,N;
scanf("%d", &N);
for (j = 1; j <= N; j++)
{
for (r = 1; r <= j; r++)
{
sum *= r;
}
SUM += sum;
sum = 1;
}
printf("%d",SUM);
return 0;
}
题目2.
思路:这算是一道难题,一方面要确定是否为水仙花数,另一方面还要将范围内所有数输出。
因此,我们考虑使用数组对各位数字进行存储。
首先,我们先int a[7];
这一个数组足够存放7位数字,符合题示的范围。
然后我们从100到999穷举(根据样例举例),
即for(number = 100;number <= 999;number ++)
然后我们把数字number的各位数分离,并存储在数组内。
do
{
num = number%10;
a[i++] = num;
number /= 10;
}while(number>0);
i++到最后输出i = i+1,则,我们只需要做两个for循环
for(int t = 0;t<i;t++)
{
for(int j = 0;j<i;j++)
{
sum *= a[t];
}
SUM += sum;
sum = 1;
}
这里i,j,t都是用来遍历的变量,sum的初始值为1,SUM为各位数字的N次幂之和,只要SUM == number,我们就可以确定它是水仙花数,将其输出即可。
问题:如何求出SUM,验证SUM == number,以及如何分离并存储各位数。
解决:在学会数组之前,我预设了7个变量负责穷举,然后switch(N)分支,根据不同的N引入不同数量的变量遍历,虽然可以求出答案,但是代码非常长,而且到7位时明显效率不高。
当引入数组后,我可以简单的保存变量的位数,精简了代码。
收获:利用数组进行数据存放,巧用穷举法,节省空间时间。同时,不要忘了每次循环结束要将一些变量初始化。
题目3.
思路:本题考察了浮点数的应用以及思维的转换,我们先要考虑特殊情况,即弹起为零时,在空中距离sum为0,反弹高度high也为0。然后,考虑正常情况,我们分成两部分思考,一般分是落下的距离,一部分是弹起的距离,为落下距离的一半。
for (i = 1; i <= n; i++)
{
sum += high;
high = high / 2;
if (i < n) sum += high;
}
我们可以做以上的for循环,因为sum求的是n次落下的距离,所以要加一个if,对次数判断。
问题:忘记考虑特殊情况0,。
解决:加一个if进行判断即可。
#include <stdio.h>
int main()
{
double High, n;
double high;
double i = 1;
double sum;
sum = 0;
scanf("%lf %lf", &High, &n);
high = High;
if (n == 0)
{
sum = 0;
high = 0;
}
for (i = 1; i <= n; i++)
{
sum += high;
high = high / 2;
if (i < n) sum += high;
}
printf("%.1f %.1f", sum, high);
return 0;
}
收获:对于一个问题,我们需要考虑到特殊情况,为它设置特殊的返回值。