第一次博客作业

一:思维导图

 

 

 

二:写出自己对以下语法的认识

1. if-else

     用法1:

if (条件){
    语句1;
}

     用法2:

if (条件){
    语句1;
}else{
    语句2;
}

         *以用法2为例,如果条件表达式的值为“1(真)”,则执行语句1;如果为“0(假)”,则执行语句2、

2.switch

  用法

switch(表达式)
{
    case 常量表达式1:  
        语句1;
        break;
    case 常量表达式2:    
        语句2;
        break;
    case ...:
        ....;
    default:
        语句n;
        break;
}

 注意点:

       1.switch后面括号内的表达式,可以是整型,字符型,枚举型数据

       2.当表达式的值与某个case条件相等,就执行里面的语句;若所有都不匹配,就执行default条件里面的语句

       3.每个case的常量表达式的值必须互不相同,否则会相互矛盾

       4.执行完一个case后面的语句后,流程控制会转移到下一个case继续执行,所以正常会配合break语句使用

       5.case 常量表达式只是起语句标号作用,并不是在该处进行条件判断
3.for

    用法:

for (表达式1;表达式2;表达式3)
{
  循环体;
}

      *其中:表达式1 给循环变量赋初值
                  表达式2 为循环条件
                  表达式3 用来修改循环变量的值,称为循环步长

 注意点:

       1.for循环中的表达式1、表达式2和表达式3都是选择项,可以省略,但分号表达式中间的分号(;)不能省略,也不能写成逗号(,)

       2.省略了表达式1,表示不对循环控制变量赋初值。

       3.省略了表达式2,则不做其它处理时便成为死循环

       4.省略了表达式3,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句

       6.3个表达式都可以省略,      例如:for( ; ; )      语句相当于: while(1) 

       7.表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体

4.while

    用法:

while(表达式){
        循环体;
    }

注意点:

       1.while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环

       2.循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句

5.do-while

    用法:

 

do
{
  循环体;
}while(表达式);

 

        *这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。

          因此,do-while循环至少要执行一次循环语句、

6.break&continue

      用法:

          1.当break关键字用于while、for循环时,会终止循环而执行整个循环语句后面的代码。break关键字通常和if语句一起使用,即满足条件时便跳出循环

          2.continue语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在while、for循环中,常与if条件语句一起使用,判断条件是否成立

注意点:

        break与continue的对比:break 用来结束所有循环,循环语句不再有执行的机会;

                                                   continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环

三. pta分数截图

 

四. pta代码分析

 1 #include <stdio.h>
 2 int main (){
 3     double sum=0,part=1;
 4     int i,n;
 5     scanf("%d",&n);
 6     for (i=1;i<=n;i++){
 7         part*=i;
 8         sum+=part;
 9     }
10     printf("%.0f",sum);
11     return 0;
12 }

思路:首先从变量的定义开始,先分析题目可知,要定义一个变量储存总和,但是12!已经快超过int类型的范围,所以应该定义成范围更大的double

          观察题目,可知从1!到 n!都是有规律的,所以可以用for循环在表达式3的位置,循环步长设为1;由于累加起来每一项都是阶乘,可以定义函数做题,

          但是定义函数用时较长,所以可以先定义一个部分(变量part),计算各个部分阶乘的值,再累加到sum这个变量里面,即得出最后结果、

 

 1 #include <stdio.h>
 2 int mypow(int a,int b);
 3 int main(){
 4     int n,a,b,i;
 5     int t,p,sum;
 6     scanf("%d",&n);
 7     a=mypow(10,n-1);
 8     b=mypow(10,n)-1;
 9     for(i=a;i<=b;i++){
10         t=i;
11         sum=0;
12         do{
13             p=t%10;
14             t=t/10;
15             sum+=mypow(p,n);
16         }while (t!=0);
17         if(sum==i){
18             printf("%d\n",i);
19         }
20     }
21     return 0; 
22 }
23 int mypow(int a,int b){
24     int sum=1,i;
25     for(i=0;i<b;i++){
26         sum*=a;
27     }
28     return sum;
29 }

思路:输入完n位数后,将n位数的最大最小值分别先求出来,用for循环遍历,然后求出i的每一位数,用水仙花数的定义求出来后跟原来的i比较,若相等则输出;

           并且不用调用到pow函数,使用自己定义的mypow函数,可以提高效率。

反思:这个代码让我知道..原来内置pow函数的效率并不高,以后最好自己写一个函数计算x的n次方。

 

 1 #include <stdio.h>
 2 #include <math.h>
 3 int prime (int p);
 4 int primesum (int m,int n);
 5 int main()
 6 {
 7     int m,n,i,count=0;
 8     scanf("%d %d",&m,&n);
 9     for (i=m;i<=n;i++){
10         if (prime(i)!=0)
11             count++;
12     }
13     printf("%d %d",count,primesum(m, n));
14     return 0;
15 }
16 int prime (int p){
17     int i,t;
18     if (p<=1) return 0;
19     if (p==2) return 1;
20     for (i=2;i<=sprt(p);i++){
21         if (p%i==0){
22             t = 0;
23             break;
24         }else t = 1;
25     }
26     return t;
27 }
28 int primesum (int m,int n){
29     int i,sum=0;
30     for (i=m;i<=n;i++){
31         if (prime(i)==1) {
32             sum+=i;
33         }
34     }
35     return sum;
36 }

 

思路:定义两个函数,一个是判断素数,另一个是求和,首先第一个判断素数函数先按照素数的定义,若从2开始到根号p存在能被i整除的数,那就不是素数;在第二个函数中,从输入的范围一一遍历,

           调用写完的第一个函数,若返回值为1,则用变量sum存放素数和,最后将其输出。

反思:在判断素数的函数中,只需要遍历到sprt(p),这样可以省去不必要的时间,提高效率。

posted @ 2019-10-15 20:29  Sogger  阅读(250)  评论(0编辑  收藏  举报