四、实验结论:
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. 对于一些重复性的代码要记得编写特定函数来方便使用(或者活用已有函数库中的函数,减少工作量),同时精简代码页面,避免人读起来有疲劳感