第一次博客园作业 2019.10.13

一.思维导图[思维导图]

二.对以下语法的认识

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(循环条件)
{
    循环体语句
}

问题:忘记初始化变量,导致循环无法进入。
解决:先对条件初始化。

技巧:循环条件,当循环到自己想要的结果时,用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;
}
posted @ 2019-10-13 21:36  Leesu  阅读(171)  评论(0编辑  收藏  举报