The first blog park job 2019.10.13

A. Mind map [FIG mind]

II. Understanding of the following syntax

1.if - else statements

if(条件1)
   {  
     语句1; 
   } 
else
   {
     语句2; 
   } 
问题:if 或 else 只执行一个语句
解决方法:每一个if或else后面都接{},将要执行内容作为一个复合语句执行。
注意:if 和 else 之间不能用除执行内容外其他语句间隔(即{}复合语句与else间不能接其他语句),否则else将缺失if匹配。

2.switch statement

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 statement

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只跳出所在的循环,若为嵌套循环,并不会全部跳出。

Three. PTA fraction Screenshot

2.3, 2.4 Homework:

Chapter III operations:

4.1 Assignment:

Four. PTA Code Analysis

Question 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;
}

Question 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位时明显效率不高。
当引入数组后,我可以简单的保存变量的位数,精简了代码。

收获:利用数组进行数据存放,巧用穷举法,节省空间时间。同时,不要忘了每次循环结束要将一些变量初始化。

Question 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;
}
收获:对于一个问题,我们需要考虑到特殊情况,为它设置特殊的返回值。

Guess you like

Origin www.cnblogs.com/JMU718/p/11666354.html