这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的。贴出来纯粹是聊胜于无。
实验题目:Linux环境下系统函数综合实验
实验目的:熟悉并掌握Linux环境下数学函数、字符函数、系统时间与日期函数、环境控制函数、内存分配函数以及数据结构中常用函数的使用方法。
一、Linux环境下数学函数的使用
设计程序,满足如下要求:
1、使用rand函数产生10个介于1到10之间的随机数值。要求在程序中对每行代码添加注释。
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 int i,j; 6 srand((int)time(0)); 7 for(i=0;i<10;i++) 8 { 9 j=1+(int)(10.0*rand()/(RAND_MAX + 1.0)); 10 printf(" %d",j); 11 } 12 printf("\n"); 13 return 0; 14 }
2、使用srandom函数对上题中的程序进行修改,实现相同功能。
#include<stdio.h> #include<time.h> #include<stdlib.h> int main() { srandom(time(NULL)); int i; for(i=0;i<10;i++) { printf("%ld ",random()%10); } printf("\n"); return 0; }
二、Linux环境下字符函数的使用
设计程序,满足如下要求:
从键盘中输入一行字符,同时测试读入字符是否为1)大写字符;2)十六进制数字符号;3)标点符号或特殊符号。
1 #include<stdio.h> 2 #include<ctype.h> 3 int main() 4 { 5 char c; 6 while((c=getchar())!='\n') 7 { 8 if(isupper(c)) 9 printf("%c is an uppercase character\n",c); 10 11 if(isxdigit(c)) 12 printf("%c is an hexadecimal digits\n",c); 13 if(ispunct(c)) 14 printf("%c is an punct\n",c); 15 } 16 return 0; 17 }
三、Linux环境下系统时间与日期函数的使用
设计程序,满足如下要求:
1、使用time、localtime、gmtime等时间相关的系统函数分别显示当前的系统时间。
1 #include<time.h> 2 #include<stdio.h> 3 int main() 4 { 5 time_t timep; 6 char * wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; 7 struct tm *p; 8 time(&timep); 9 printf("%s",asctime (gmtime(&timep))); 10 p=localtime (&timep); 11 printf("%d年 %d月 %d日",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday); 12 printf("%s %d :%d:%d\n",wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec); 13 return 0; 14 }
2、应用结构体struct timeval的成员tv_sec与tv_usec显示系统时间的秒与微妙,并测试输出成员tv_sec与tv_usec这段程序所用的时间。
1 #include<stdio.h> 2 #include<sys/time.h> 3 #include<unistd.h> 4 int main() 5 { 6 struct timeval tv1,tv2; 7 struct timezone tz; 8 gettimeofday(&tv1,&tz); 9 printf("tv_sec; %d\n",tv1.tv_sec); 10 printf("tv_usec; %d\n",tv1.tv_usec); 11 gettimeofday(&tv2,&tz); 12 printf("tv_usec-tv1_usec; %d\n",tv2.tv_usec-tv1.tv_usec); 13 14 return 0; 15 }
3、设计一个程序,计算机屏幕随机呈现一个字符,持续0.5s后字符消失,此时取得结构体timeval成员tv_sec与tv_usec的值,然后作出按键正确反应后再取得tv_sec与tv_usec的值,循环5次,计算正确反应率以及正确反应的平均时间。
1 #include<stdio.h> 2 #include<sys/time.h> 3 #include<unistd.h> 4 #include<stdlib.h> 5 #include<ctype.h> 6 int main() 7 { 8 int i,j; 9 struct timeval tv1,tv2; 10 struct timezone tz; 11 float ave,sum; 12 ave=0;sum =0; 13 int a,b; 14 for(a=0;a<5;a++){ 15 srand(int time (0)); 16 while(1){ 17 j=1+(int)(122.0* rand()/(RAND_MAX +1.0)); 18 if (j>=65 && j<=90 || j<=122 && j>=97){ 19 printf("%c",char(j)); 20 break; 21 } 22 } 23 system(sleep(0.5)); 24 gettimeofday(&tv1,&tz); 25 char c; 26 while(1){ 27 c=getchar(); 28 sum++; 29 if (c==char(j)) 30 break; 31 } 32 gettimeofday(&tv2,&tz); 33 ave=tv2.tv_usec-tv1.tv_usec; 34 } 35 sum =5/sum; 36 ave=ave/5; 37 printf("%f",sum); 38 printf("%f",ave); 39 return 0; 40 }
四、Linux环境下环境控制函数的使用
设计程序,满足如下要求:
显示当前所登录的用户,并使用环境控制函数分别将登录用户修改为zhangsan或null,同时输出系统中所有的环境变量及其值。
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 char *p; 6 if((p=getenv("USER"))) 7 printf("USER =%s\n",p); 8 setenv ("USER","zhangsan",1); 9 printf("USER =%s\n",getenv("USER")); 10 unsetenv("USER"); 11 printf("USER =%s\n",getenv("USER")); 12 printf("===============所有环境变量=================\n"); 13 extern char ** environ; 14 int i; 15 for(i=0;environ[i]!=NULL;i++) 16 printf("%s\n",environ[i]); 17 return 0; 18 }
五、Linux环境下内存分配函数的使用
设计程序,满足如下要求:
1、用单向链表实现下述功能。某手机用户要增加通讯录,通讯录的结构体定义如下:
struct co
{
int index;
char name[8];
char htel[12];
char tel[12];
};
其中,index为用户在通讯录中的序号;name存放用户名;htel存放手机号;tel存放电话号码。如果要增加一用户,就分配一存储空间,输入数据,请编写一程序进行模拟,最后检测此内存的大小。
2、利用mmap()来读取/etc/passwd文件内容,把文件中的内容映射到内存中的区域,可读取此区域中的内容,对映射区域的写入操作会产生一个映射文件。要求在程序中对每行代码添加注释。
六、综合部分
设计程序,满足如下要求:
1、从键盘读入不多于50个数的int型数据,组成一个数组,应用qsort函数进行排序。
2、编一个程序:求2~n间的素数,n由键盘输入,循环变量分别从2到n、2到(int)sqrt(n),分别测出两个循环的所用时间。
1 #include<stdio.h> 2 #include<sys/time.h> 3 #include<stdlib.h> 4 #include<math.h> 5 #include<unistd.h> 6 void prime1(int n) 7 { 8 int i; 9 for(i=2;i<n;i++) 10 { 11 if(n%i==0) 12 break; 13 } 14 if(i>=n) 15 printf("%d\n",n); 16 } 17 void prime2(int n) 18 { 19 int i; 20 for(i=2;i<=(int)sqrt(n);i++) 21 if(n%i==0) 22 break; 23 if(i>(int)sqrt(n)) 24 printf("%d\n",n); 25 } 26 27 int main() 28 { 29 int n; 30 struct timeval tv1,tv2,tv3,tv4; 31 struct timezone tz; 32 int i; 33 printf("Please input a number :\n"); 34 scanf("%d",&n); 35 printf("================Test1==============\n"); 36 gettimeofday(&tv1,&tz); 37 for(i=2;i<=n;i++){ 38 prime1(i); 39 } 40 gettimeofday(&tv2,&tz); 41 printf("Use time : %f\n",tv2.tv_sec-tv1.tv_sec+0.000001*(tv2.tv_usec-tv1.tv_usec)); 42 printf("================END==============\n"); 43 printf("================Test2==============\n"); 44 gettimeofday(&tv3,&tz); 45 for(i=2;i<=n;i++){ 46 prime2(i); 47 } 48 gettimeofday(&tv4,&tz); 49 printf("Use time : %f\n",tv4.tv_sec-tv3.tv_sec+0.000001*(tv4.tv_usec-tv3.tv_usec)); 50 return 0; 51 }
3、编写程序,类似于猜数游戏,程序产生一随机数,对游戏者输入的数据通过比较,在计算机屏幕上能提示太大了、太小了或恭喜你猜中了等。
4、编写一个简单的C语言程序,用随机数函数产生两个整型数,根据输入的字符‘+’、‘-’、‘*’、‘/’作算术运算。