实验二:C语言控制语句应用编程
*实验任务1
task1.c
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 5 #define N 5 6 7 int main() 8 { 9 int grade ,number; 10 int i; 11 12 srand(time(0)); 13 14 for(i=0;i<N;++i) 15 { 16 grade=rand()%4+2018; /*随机得到一个值在【2018,2021】之间*/ 17 number=rand()%999+1; /*随机得到一个值在【1,999】之间*/ 18 printf("%d8330%04d\n",grade,number); /*程序功能即输出四个不同但人数都为999人的年级里随机的五个人的学号*/ 19 } 20 21 return 0; 22 }

*实验任务2
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 int main() 5 { 6 printf("猜猜2022年4月哪一天会是你的Lucky day\n开始咯,你有三次机会,猜吧(1~30\n"); /*其实”猜猜“和”再猜“的结构很相似且可以说作用相同平行,都是后面跟一个输入,只是一个在一开始,一个在以后每一次输入前*/ 7 int x,i=0,s; /*所以要将第一次判断啊和后几次区分开来,不能共用一个循环*/ 8 srand(time(0)); /*以时间为种子,为后面生成随机数做铺垫*/ 9 s=rand()%29+1; 10 11 scanf("%d",&x); 12 if(x<s) 13 printf("你猜的日期早了,你的lucky day还没到呢\n(1~30):"); 14 15 if(x>s) 16 printf("你猜的日期晚了,你的lucky day已经过啦\n(1~30):"); 17 18 if(x==s) 19 { 20 printf("哇,猜中了:)"); 21 exit(0); } 22 23 do 24 { 25 printf("再猜:"); /*因为“再猜”不能跟在任何一个输出后面,不然就会出现虽然次数已经用完还出现“再猜”字眼并且后面立马结束的情况,所以要独立门户*/ 26 scanf("%d",&x); 27 if(x<s) 28 printf("你猜的日期早了,你的lucky day还没到呢\n(1~30):"); 29 30 if(x>s) 31 printf("你猜的日期晚了,你的lucky day已经过啦\n(1~30):"); 32 33 if(x==s) 34 { 35 printf("哇,猜中了:)"); 36 exit(0); 37 } i++; 38 39 }while (i<2); /*因为是do{}while;循环,所以其实已经做了两次循环了,如果用while语句,则条件变为(i<=2)*/ 40 printf("次数用完啦,偷偷告诉你:4月,你的幸运数字是%d号",x); 41 }

实验三
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main () 4 { 5 char c; 6 while(scanf("%c",&c)!=EOF,getchar()) 7 { 8 if(c=='r') 9 printf("stop!\n"); 10 11 else if(c=='g') 12 printf("go go go\n"); 13 14 else if(c=='y') 15 printf("wait a minute\n"); 16 17 else 18 printf("something must be wrong\n"); 19 20 } 21 return 0; 22 }

实验四
1 #include<stdio.h> 2 int main() 3 { 4 int n,a,i,j,m; 5 double s,p; 6 while(scanf("%d %d",&n,&a)!=EOF) 7 { 8 s=0.0; 9 for(i=1;i<=n;i++) 10 { 11 m=0; /*需要在每次进入这个算m的循环前,将m归零*/ 12 for(j=1;j<=i;j++) 13 { 14 m=m*10+a;} /*得到分母m*/ 15 p=(double)i/m; /*注意要加double将p变为浮点型*/ 16 s=s+p; 17 } 18 printf("%lf\n",s); 19 20 } 21 }

实验五
1 #include<stdio.h> 2 int main() 3 { 4 int i,j; 5 for(i=1;i<=9;i++) /*表示第几行*/ 6 { 7 for(j=1;j<=i;j++) /*每行要输出几次,观察同一行的表达式之间,后一个都是i*/ 8 { 9 printf("%d*%d=%d ",j,i,i*j); 10 } 11 printf("\n"); 12 } 13 return 0; 14 }

实验六
task6_1
1 #include<stdio.h> 2 3 int main() 4 { 5 int n,i=1; 6 scanf("%d",&n); 7 do 8 { 9 i++; 10 printf(" o\n<H>\nI I\n \n"); 11 }while(i<=(n+1)); 12 13 }

task6_2
1 #include<stdio.h> 2 3 int main() 4 { 5 int n,i=1; 6 scanf("%d",&n); 7 for(i=1;i<=n;i++) 8 { 9 printf(" o "); 10 } 11 printf("\n"); 12 for(i=1;i<=n;i++) 13 { 14 printf("<H> "); 15 } 16 printf("\n"); 17 for(i=1;i<=n;i++) 18 { 19 printf("I I "); 20 } 21 22 }

task6_3
1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int n,i,j,k=0; 6 scanf("%d",&n); 7 for(i=1;i<=n;i++) /*这里的i表示当把一排完整小人看成一个整体后,执行自己这样的命令,输出几次*/ 8 { 9 k=0; 10 while(k<(i-1)) /*第一行输出时不执行空格语句,所以选用while{}而不用do{}while;不然即使条件不满足也会先执行一次*/ 11 { 12 printf(" "); 13 k++; 14 } 15 for(j=1;j<=((abs(i-n-1)-1)*2+1);j++) 16 printf(" o "); 17 printf("\n"); /*当某个部位全部输出完成,需要换行,且不能直接加在”o \n",这样每个循环都会执行一次换行*/ 18 19 k=0; /*与实验四的分母的计算一样,要及时赋值0再进行循环,注意赋值0语句的位置!*/ 20 while(k<(i-1)) /*注意每个身体部位输出前都要有相同的空格,所以相同的语句会出现在每个部位执行之前*/ 21 { 22 printf(" "); 23 k++; 24 } 25 for(j=1;j<=((abs(i-n-1)-1)*2+1);j++) 26 printf("<H> "); 27 printf("\n"); 28 29 k=0; 30 while(k<(i-1)) 31 { 32 printf(" "); 33 k++; 34 } 35 for(j=1;j<=((abs(i-n-1)-1)*2+1);j++) 36 printf("I I "); 37 printf("\n"); 38 } 39 40 }

当尝试另一种对 i 的定义,使表达式简单一些
1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int n,i,j,k=0; 6 scanf("%d",&n); 7 for(i=n;i>0;i--) /*i从n开始,逐次递减,但是总循环的次数和改前一样*/ 8 { 9 k=0; 10 while(k<(n-i)) /*相应的空格的语句也要记得改变*/ 11 { 12 printf(" "); 13 k++; 14 } 15 for(j=1;j<=((i-1)*2+1);j++) /*改变的开始->观察每行小人的个数,发现是从最后一行往上每行增加两个,所以系数为2,且直接定义最后一行为i=1,转到写最大的循环的定义,即第7行*/ 16 printf(" o "); 17 printf("\n"); 18 19 20 k=0; 21 while(k<(n-i)) 22 { 23 printf(" "); 24 k++; 25 } 26 for(j=1;j<=((i-1)*2+1);j++) 27 printf("<H> "); 28 printf("\n"); 29 30 31 k=0; 32 while(k<(n-i)) 33 { 34 printf(" "); 35 k++; 36 } 37 for(j=1;j<=((i-1)*2+1);j++) 38 printf("I I "); 39 printf("\n"); 40 } 41 42 }

实验总结
1.在实验三中,输入字符时按下的回车键也会被当成一个字符,所以需要再加一个getchar()储存回车字符;
2.在计算实验四的分母m时,采用一个循环,需要注意命令每次循环前m归零的位置,要写在紧挨for语句前,如果写在main函数开头,则执行每次for语句时,不会执行m=0,的命令;
3.实验六的第三问,当遇到某个表达式太复杂时,尝试另一种定义方法
浙公网安备 33010602011771号