第一次博客作业
一:思维导图
二:写出自己对以下语法的认识
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),这样可以省去不必要的时间,提高效率。