实验2 C语言控制语句应用编程

四、实验结论:

task1:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 
 5 #define N 5
 6 
 7 int main()      /*随机选取 5个2018届~2021届的学生学号*/ 
 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、2019、2020、2021*/ 
17         number=rand()%999+1;      /*随机选取[1,999]中的整数*/ 
18         printf("%d8330%04d\n",grade, number);
19     }
20     
21     return 0;
22  } 

 

Q1:随机选取2018、2019、2020、2021

Q2:随机选取[1,999]中的整数

Q3:随机选取 5个2018届~2021届的学生学号

 

 

task2:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 
 5 #define N 3       /*猜测的次数*/
 6 
 7 int main()
 8 {
 9     int lucky_day,guess_day,flag,i;
10     
11     srand(time(0));
12     lucky_day=rand()%30+1;
13     flag=1;
14     
15     printf("猜猜2022年4月哪一天会是你的Lucky day.\n\n开始喽,你有%d次机会,猜吧(1~30):  ",N);
16     
17     for(i=N;i>0;i--)
18     {
19         scanf("%4d",&guess_day);
20         if(guess_day==lucky_day)
21             {
22                 printf("\n哇,猜中了:-)\n");
23                 flag=0;
24                 break;
25             }
26         else if(guess_day!=lucky_day)
27                 {
28                     if(guess_day<lucky_day)
29                         printf("\n你猜的日期早了,你的Lucky day还没到呢\n\n");
30                     else printf("\n你猜的日期晚了,你的Lucky day已经过啦\n\n");
31                     
32                     if(i!=1) printf("再猜(1~30): ");
33                 }
34     }
35     
36     if(flag)
37     printf("\n次数用完啦,偷偷告诉你:4月,你的Lucky day是%d号",lucky_day);
38     
39     return 0;
40  } 

 

 

task3:

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int light;
 6     
 7     while((light=getchar())!=EOF)      /* EOF在数值上为 -1,之所以在第五行中使用 int 来定义 light ,是因为字符型变量是无符号的,无法把-1这个值赋给字符型变量*/
 8     {
 9         getchar();
10         
11         switch(light)
12         {
13             case 'y':printf("wait a minute\n");break;
14             case 'r':printf("stop!\n");break;
15             case 'g':printf("go go go\n");break;
16             
17             default :printf("something must be wrong...\n");break;
18         }
19     }
20     
21     return 0;
22 }

 

 

task4:

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int a,n,t;
 6     double s,m;
 7     
 8     while(scanf("%d%d",&n,&a)!=EOF)
 9     {
10         s=0;
11         int i, j;
12         
13         for(i=1;i<=n;i++)
14         {
15             t=a;
16             m=0;
17             
18             for(j=1;j<=i;j++)
19             {
20                 m+=t;
21                 t=t*10;
22             }
23             
24             m=1.0/m;
25             s+=(i*m);
26         }
27         
28         printf("n = %d, a = %d, s = %lf\n\n",n,a,s);
29     }
30     
31     return 0;
32  } 

 

 

task5:

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int line[9]={1,2,3,4,5,6,7,8,9};
 6     int row[9]={1,2,3,4,5,6,7,8,9};
 7     int value;
 8     
 9     int i,j;
10     
11     for(i=0;i<9;i++)
12     {
13         for(j=0;j<=i;j++)
14         {
15             printf("%2d ×%2d = %-3d",row[j],line[i],row[j]*line[i]);
16         }
17         
18         printf("\n");
19     } 
20     
21     return 0;
22  } 

 

 

task6_1:

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

 

 

task6_2:

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int n,i;
 6     
 7     printf("Input n: ");
 8     scanf("%d",&n);
 9     
10     for(i=0;i<n;i++)
11     {
12         printf(" O ");
13         printf("    ");
14     }
15     printf("\n");
16     
17     for(i=0;i<n;i++)
18     {
19         printf("<H>");
20         printf("    ");
21     }
22     printf("\n");
23     
24     for(i=0;i<n;i++)
25     {
26         printf("I I");
27         printf("    ");
28     }
29     printf("\n");
30     
31     return 0;
32 }

 

 

task6_3:

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int n,i,indent,line;
 6     
 7     printf("Input n: ");
 8     scanf("%d",&n);
 9     
10     int m=n;
11     
12     for(line=0,indent=0;line<n;line++,indent++,m--)
13     {
14         for(i=0;i<indent;i++)
15         {
16             printf("   ");
17             printf("    ");
18         }
19         for(i=0;i<2*m-1;i++)
20         {
21             printf(" O ");
22             printf("    ");
23         }
24         printf("\n");
25     
26         for(i=0;i<indent;i++)
27         {
28             printf("   ");
29             printf("    ");
30         }
31         for(i=0;i<2*m-1;i++)
32         {
33             printf("<H>");
34             printf("    ");
35         } 
36         printf("\n");
37     
38         for(i=0;i<indent;i++)
39         {
40             printf("   ");
41             printf("    ");
42         }
43         for(i=0;i<2*m-1;i++)
44         {
45             printf("I I");
46             printf("    ");
47         }
48         printf("\n\n");
49         
50         }
51     return 0;
52 }

 

 

五、实验总结:

1. EOF被宏定义为 -1,所以在诸如scanf()!=EOF、(ch=getchar())!=EOF等用法中,ch使用int类型而不是char类型

理由如下:

(以下内容查找自CSDN论坛)

首先要说明的是有些编译器将char当作有符号数来处理,而有些编译器则把char看成无符号类型的,并且像getchar()之类的函数的返回值的类型是int。

一、假如char是无符号类型:

当读取结束,getchar()返回EOF(-1)
此时执行c=getchar(),发生类型转换(int—>unsignd char),0xFFFFFFFF(有符号表示:-1)截断为0xFF(无符号表示:255)
执行判断c!=EOF,因为EOF是int类型,发生类型转换(unsigned char—>int)
,0xFF无符号数零扩展为0x000000FF(有符号数255),0x000000FF!=0xFFFFFFFF,继续循环
因此若char是无符号类型则会导致无限循环
二、假如char是有符号类型:

假如getchar()读入字节0xFF
此时执行c=getchar(),发生类型转换(int—>signed char),0x000000FF截取高24位后,c=0xFF
执行判断c!=EOF,发生类型转换(signed char—>int),有符号数c(0xFF)符号位扩展为0xFFFFFFFF(-1),此时c==EOF,跳出循环
因此若char是有符号类型则有可能会提前结束读取操作
————————————————
版权声明:本文为CSDN博主「少年与剑客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45732995/article/details/108559323

 

2. 在编写代码时,要尽可能使变量名与其所具有的作用相关,或者在行末做出注释,防止自己不知道该变量的作用

                             要尽可能使变量名与其所具有的作用相关,或者在行末做出注释

                             要尽可能使变量名与其所具有的作用相关,或者在行末做出注释(重要的事说三遍!)

 

3. 对于一些重复性的代码要记得编写特定函数来方便使用(或者活用已有函数库中的函数,减少工作量),同时精简代码页面,避免人读起来有疲劳感

 

posted @ 2022-04-14 01:04  Nixmout  阅读(32)  评论(1编辑  收藏  举报