1/13C语言程序设计实验报告(八)专业计算机科学与技术班级卓越工程师班日期2011年12月16日实验组别第一组成绩第八次实验指针实验指导教师李开学生姓名邱金源学号U201114493实验名称指针实验(一)实验目的(1)熟练掌握指针的说明、赋值、使用。(2)掌握用指针引用数组的元素,熟悉指向数组的指针的使用。(3)熟练掌握字符数组与字符串的使用,掌握指针数组及字符指针数组的用法。(4)掌握指针函数与函数指针的用法。(5)掌握带有参数的main函数的用法。(二)实验内容及要求1.源程序改错下面的源程序中是否存在错误?如果存在,原因是什么?如果存在错误,要求在计算机上对这个源程序进行调试修改,使之能够正确执行。源程序1#includestdio.hintmain(void){float*p;scanf(%f,p);printf(%f\n,*p);return0;}2.源程序完善、修改、替换(1)下面的源程序的功能是:通过函数指针和菜单选择来调用字符串拷贝函数或字符串连接函数。请在程序中的下划线处填写合适的表达式、语句或代码片段来完善该程序。#includestdio.h#includestring.hintmain(void){chara[80],b[80],c[160],*result=c;intchoice,i;do{printf(\t\t1copystring.\n);printf(\t\t2connectstring.\n);printf(\t\t3exit.\n);2/13printf(\t\tinputanumber(1-3)please!\n);scanf(%d,&choice);}while(choice1||choice5);switch(choice){case1:p=strcpy;break;case2:p=strcat;break;case3:gotodowm;}getchar();printf(inputthefirststringplease!\n);i=0;printf(inputthesecondstringplease!\n);i=0;result=(a,b);printf(theresultis%s\n,result);dowm:;return0;}(2)请上机运行第(1)题程序,使之能按下面要求输出结果:1copystring.2connetstring.3exitinputanumber(1-2)please!2(输入)Inputthefirststringplease!themoreyoulearn,(输入)inputthesecondstringplease!themoreyouget.(输入)theresultisthemoreyoulearn,themoreyouget.3.跟踪调试源程序请按下面的要求对所给的源程序进行操作,并回答问题和排除错误。(1)单步执行源程序。进入strcpy时,watches窗口中s为何值?返回main时,watches窗口中s为何值?(2)排除源程序中的错误,使程序输出结果为:thereisaboteonthelake.源程序3#includestdio.hchar*strcpy(char*,char*);intmain(void){chara[20],b[60]=thereisaboatonthelake.;3/13printf(%s\n,strcpy(a,b));return0;}char*strcpy(char*s,char*t){while(*s++=*t++);return(s);}4.程序设计编写并上机调试运行能实现以下功能的程序或函数:(1)已知一个长整型变量占4个字节,其中每个字节又分成高4位和低4位。试编写一个程序,从该长整型变量的高字节开始,依次取出每个字节的高4位和低4位并以数字字符的形式记性显示。(2)利用大小为n的指针数组指向用gets函数输入的n行,每行不超过80个字符。试编写一个函数,它将每一行中连续的多个空格字符压缩为一个空格字符。在调用函数中输出压缩空格后的各行,空行不予输出。(3)编写一个程序,输入n个整数,排序后输出。排序的原则由命令行可选参数-的-d决定,并且有参数-d时按递减顺序排序,否则按递增顺序排序。要求将排序算法定义成函数,利用指向函数的指针使该函数实现递增或递减排序。(4)设某个班有N个学生,每个学生修了M门课程。输入M门课程的名称,然后依次输入N个学生中每个学生所修M门课程的成绩,并且都存放到相应的数组中。试编写下列函数:1计算每个学生各门课程平均成绩。2计算全班没门课程的平均成绩。3分别统计低于全班各门课程平均成绩的人数。4分别统计全班各门课程不及格的人数和90分以上的人数。在调用函数中输出上面各函数的计算结果(要求都用指针操作,不得使用下下标操作)5.选做题编写并上机调试运行能实现以下功能的程序:(1)设有N位整数和M位小数(N=20,M=10)的两个数据a,b。编程计算a+b并输出结果。(2)编写一个使用复杂声明“char*(*p[2])(constchar*,constchar*);”的程序。(三)实验步骤及结果1.源程序改错的实验步骤及结果(1)创建一个工程建立名为aaa的工程。(2)编辑源文件和保存用源程序1替换aaa工程中的main.c的源代码,编辑完毕后保存。分析:由程序知,该程序要输出地址值,所以printf语句中应为“%p”,而不是“%f”,再将printf语句中的“*p”改为“p”。修改后的程序和运行结果如图所示:4/13结果正确!2.源程序完善、修改、替换的实验步骤及结果(1)经分析,第一处应定义一个函数指针,再根据函数strcpy和strcat的返回值,所以所填代码应为后三处所填代码应为完善后的程序及运行结果如图所示#includestdio.h#includestring.hintmain(void){char*(*p)(char*a,char*b);chara[80],b[80],c[160],*result=c;intchoice,i;do{printf(\t\t1copystring.\n);printf(\t\t2connectstring.\n);printf(\t\t3exit.\n);printf(\t\tinputanumber(1-3)please!\n);scanf(%d,&choice);}while(choice1||choice5);switch(choice){case1:p=strcpy;break;5/13case2:p=strcat;break;case3:gotodowm;}getchar();printf(inputthefirststringplease!\n);i=0;while((a[i]=getchar())!='\n')i++;a[i]='\0';printf(inputthesecondstringplease!\n);i=0;while((b[i]=getchar())!='\n')i++;b[i]='\0';result=p(a,b);printf(theresultis%s\n,result);dowm:;return0;}结果正确!3.跟踪调试源程序的实验步骤及结果(1)在aaa工程下创建一个新文件并编辑源程序3。(2)单步执行源程序。1.进入函数strcpy时,s为何值?返回main时,s为何值?6/13(3)分析:while语句结束后,返回的是a[0]的地址,所以应声明一个指向s的指针。修改后的程序和运行结果如图所示。结果正确!4程序设计的实验步骤及结果(1)1)创建一个工程建立名为prj2的工程。2)编辑源文件和保存程序如下#includestdio.hvoidf(longint);intmain(){longinta=123456789;f(a);return0;}voidf(longinta){char*p,x,y;p=&a;p=p+3;inti;for(i=0;i4;i++)7/13{x=(*p)&0x0f;if(x10)x=x+'0';elsex=x+'A'-10;y=(*p4)&0x0f;if(y10)y=y+'0';elsey=y+'A'-10;printf(%c%c\n,y,x);p--;}}该程序运行结果如图所示:结果正确!(2)1)创建一个工程建立名为prj3工程。2)编辑源文件和保存程序如下#includestdio.h#includestring.h#definen3#defineMAX80voidf(char*);intmain(){chara[n][MAX];inti;printf(input%dÐÐ×Ö·û:\n,n);for(i=0;in;i++){gets(a[i]);f(a[i]);}8/13printf(ѹËõºó£º\n);for(i=0;in;i++)if(strlen(a[i])0)puts(a[i]);return0;}voidf(char*p){inti,j;for(i=0,j=0;*(p+i)!='\0';){*(p+j)=*(p+i);i++;j++;if((*p+i-1)==''){while(*(p+i)=='')i++;}}*(p+j)='\0';}运行结果如图所示结果正确!(3)1)创建一个工程建立名为prj4程。2)编辑源文件和保存程序如下#includestdio.h#includestring.h#definen5voidsort1(int*,int);voidsort2(int*,int);9/13intmain(intargc,char*argv[]){inta[n];inti;void(*p)(int*,int);printf(input%dintegers:\n,n);for(i=0;in;i++)scanf(%d,&a[i]);if(argc1&&!strcmp(argv[1],-d))p=sort1;elsep=sort2;p(a,n);printf(aftersort:\n);for(i=0;in;i++)printf(%d,a[i]);return0;}voidsort1(int*a,intm){inti,j,t;for(i=0;im-1;i++)for(j=0;jm-1-i;j++){if(*(a+j)*(a+j+1)){t=*(a+j);*(a+j)=*(a+j+1);*(a+j+1)=t;}}}voidsort2(int*a,intm){inti,j,t;for(i=0;im-1;i++)for(j=0;jm-1-i;j++){if(*(a+j)*(a+j+1)){t=*(a+j);*(a+j)=*(a+j+1);*(a+j+1)=t;}10/13}}程序运行结果如图所示未输入“-d”输入“-d”后结果正确!(4)1)创建一个工程建立名为prj5程。2)编辑源文件和保存程序如下#includestdio.h#includestring.h#defineN3#defineM3doublef1(int*p1);doublef2(int*p2);intf3(int*p3);intf4(int*p4);intf5(int*p5);intmain(){inti,j;inta[M][N];charb[M][10];char(*pb)[10]=b;printf(输入%d门课程名称:\n,M);11/13for(i=0;iM;i++)gets(pb[i]);printf(输入%d个学生%d门课程的成绩:\n,N,M);for(i=0;iN;i++)for(j=0;jM;j++)scanf(%d,&a[i][j]);printf(个人平均成绩:\n);for(i=0;iN;i++)printf(%lf\t,f1(*a+i*M)