C语言程序设计实验报告专业:班级:日期:成绩:实验组别:第次实验:指导教师:学生姓名:学号:同组人姓名:实验名称:指针实验一、实验目的(1)熟练掌握指针的说明、赋值、使用。
(2)掌握用指针引用数组的元素,熟悉指向数组的指针的使用。
(3)熟练掌握字符数组与字符串的使用,掌握指针数组及字符指针数组的用法。
(4)掌握带有参数的main函数的用法。
二、实验内容及要求1.源程序改错下面的源程序中是否存在错误?如果存在,原因是什么?如果存在错误要求在计算机上对这个源程序进行调试修改,是之能够正确执行。
源程序:#include <stdio.h>int main(void){float * p;scanf("%f",p);printf("%f\n",*p);return 0;}2.源程序修改替换(1)下面源程序的功能是,通过函数指针和菜单选择来调用字符串拷贝函数或字符串连接函数。
请在程序中的下划线处填写合适的表达式、语句或代码片段来完善该程序。
源程序:#include <stdio.h>#include <string.h>int main(void){____________________________char a[80],b[80],c[160],*result=c;int choice,i;do{printf("\t\t1 copy string.\n");printf("\t\t2 connect string.\n");printf("\t\t3 exit.\n");printf("\t\tinput a number(1-3)please! \n");scanf("%d",&choice);}while(choice<1||choice>5);switch (choice){case 1:p=strcpy;break;case 2:p=strcat;break;case 3:goto down;}getchar();printf("input the first string please! \n");i=0;_______________________printf("input the second string please!\n");i=0;_______________________result=____(a,b);printf("the result is %s\n",result);down:;return 0;}(2)请上机运行第(1)题程序使之能按下面要求输出结果(注:(输入)表示该行数据是键盘数据):1.copy string。
2.Connect string。
3.Exit。
Input a number(1-3)please!2(输入)Input the first string please!The more you learn,(输入)Input the second string please!The more you get.(输入)The result is the more you learn,the more you get.3.跟踪调试程序请按下面的要求对所给源程序进行操作,并回答问题和排除错误。
(1)单步执行源程序。
进入strcpy时,watches窗口中s为何值?返回main时,watches窗口中s为何值?(2)排除源程序中的错误,使程序输出结果为:there is a boat on the lake.源程序:#include <stdio.h>char * strcpy(char*,char*);int main(void){char a[20],b[60]="there is a boat on the lack.";printf("%s\n",strcpy(a,b));return 0;}char *strcpy(char*s,char*t){while(*s++=*t++);return (s);}4.程序设计编写并上机调试运行能实现以下功能的程序或函数:(1)已知一个长整形变量占四个字符,其中每个字节又分高四位和低四位。
试编写一个程序,从该长整形变量的高字节开始,依次取出每个字节的高四位和低四位并以数字字符的形式进行显示。
(2)利用大小为n的指针数组指向用gets函数输入的n行,每行不超过80个字符。
试编写一个函数,它将每一行中连续的多个空格字符压缩为一个空格字符。
在调用函数中输出压缩空格后的各行,空行不予输出。
(3)编写一个程序,输入n个整数,排序后输出。
排序的原则由命令行可选参数-d决定,并且有参数-d时按递减顺序,否则按递增顺序排序。
要求将排序算法定义成函数,利用指向函数的指针是该函数实现递增或递减排序。
(4)设每个班有n个学生,每个学生所修的M门课程的成绩,并且都存放到相应的数组中,试编写以下函数:①计算每个学生各门课程平均成绩②计算全班每门课程的平均成绩③分别统计低于全班各门课程平均成绩的人数④分别统计全班各门课程不及格的人数和90分以上(包含90)的人数。
在调用函数中输出结果(要求都用指针操作,不得用下标)5.选做题(1)编写并上机调试运行能实现以下功能的程序:设有N位整数和M位小数(N=20,M=10)的两个数据a,b。
编程计算a+b并输出结果。
如:12345678912345678912.1234567891+98765432109876543210.0123456789(2)编写一个使用复杂声明的“char *(*p[2])(const char*,const char *);”的程序。
提示:p中元素可为strcmp,strstr等函数名。
三、实验步骤及结果1.源程序改错错误:悬挂指针,指针未初始化改后程序:#include<stdio.h>int main(void){float *p,a;p=&a;scanf("%f",p);printf("%f\n",*p);return 0;}2.源程序完善、修改、替换#include<stdio.h>#include<string.h>int main(void){char *(*p)(char *a,char *b);char a[80],b[80],c[160],*result=c;int choice,i;do{printf("\t\t1 copy string.\n");printf("\t\t2 connect string.\n");printf("\t\t3 exit.\n");printf("\t\tinput a number(1-3)please!\n");scanf("%d",&choice);}while(choice<1||choice>5);switch(choice){case 1:p=strcpy;break;case 2:p=strcat;break;case 3:goto down;}getchar();printf("input the first string please!\n");i=0;while((a[i]=getchar())!='\n')i++;a[i]='\0';printf("input the second string please!\n");i=0;while((b[i]=getchar())!='\n')i++;b[i]='\0';result=(*p)(a,b);printf("the result is %s\n",result);down:;return 0;}3.跟踪调试程序#include <stdio.h>char * strcpy(char*,char*); int main(void){char a[20],b[60]="there is a boat on the lack.";printf("%s\n",strcpy(a,b));return 0;}char *strcpy(char*s,char*t){char *m;m=s;while(*s++=*t++);return (m);}4.程序设计(1)#include<stdio.h>#include<math.h>#define MAX 32int main(){long int n;int i;char s[MAX];printf("please input a number:\n");scanf("%ld",&n);if(n>=-2147483647&&n<=2147483647) ;else{printf("wrong:the number is too large");return -1;}if(n>=0){for(i=0;n!=0;i++){s[i]=n%2+'0';n/=2;}for(;i<=MAX-1;i++)s[i]='0';}else{n=-(n+1);for(i=0;n!=0;i++){s[i]=n%2+'0';n/=2;}for(;i<=MAX-2;i++)s[i]='0';for(i=0;i<MAX-1;i++)if(s[i]=='1')s[i]='0';else if(s[i]=='0')s[i]='1';s[i]='1';}for(i=31;i>=28;i--)putchar(s[i]);putchar('\t');for(i=27;i>=24;i--)putchar(s[i]);putchar('\t');for(i=23;i>=20;i--)putchar(s[i]);putchar('\t');for(i=19;i>=16;i--)putchar(s[i]);putchar('\t');for(i=15;i>=12;i--)putchar(s[i]);putchar('\t');for(i=11;i>=8;i--)putchar(s[i]);putchar('\t');for(i=7;i>=4;i--)putchar(s[i]);putchar('\t');for(i=3;i>=0;i--)putchar(s[i]);putchar('\t');return 0;}(2)#include<stdio.h>#include<stdlib.h>#include<ctype.h>#define N 3void output(char*s);int main(void){int i;char *s[N];printf("please input your massage:\n");for(i=0;i<N;i++){s[i]=malloc(80);gets(s[i]);}printf("your massage has been changed into;\n");for(i=0;i<N;i++){output(s[i]);printf("%s\n",s[i]);}return 0;}void output(char*s){int i,j;for(i=0,j=0;s[i]!='\0';i++,j++){if(isspace(s[i])){for(;isspace(s[i]);i++);s[j++]=' ';s[j]=s[i];}elses[j]=s[i];}s[j]=s[i];}(3)#include<stdio.h>#define MAX 5void swap(int v[],int i,int j);void qsort(int v[],int left,int right);int main(int argc,char *argv[]){int i=0,s[MAX];if(--argc>0&&(*++argv)[0]=='-'){if((*argv)[1]=='d'){while(i<MAX)scanf("%d",&s[i++]);qsort(s,0,MAX-1);for(i=MAX-1;i>=0;i--)printf("%d\t",s[i]);}elseprintf("wrong:\n");}else{while(i<MAX)scanf("%d",&s[i++]);qsort(s,0,MAX-1);for(i=0;i<MAX;i++)printf("%d\t",s[i]);}return 0;}void qsort(int v[],int left,int right) {int i,last;void swap(int v[],int i,int j);if(left>right)return;swap(v,left,(left+right)/2);last=left;for(i=left+1;i<=right;i++)if(v[i]<v[left])swap(v,++last,i);swap(v,left,last);qsort(v,left,last-1);qsort(v,last+1,right);}void swap(int v[],int i,int j){int temp;temp=v[i];v[i]=v[j];v[j]=temp;}(4)#include <stdio.h>#define N 5#define M 3struct course{char *s;int d[N];} sm[M];void saverage(struct course *sm);void caverage(struct course *sm);void summary_below(struct course *sm);void summary_both(struct course *sm);int main(void){int i;printf("Please input the names of the %d courses.\n",M);for(i=0;i<M;i++)if(gets((sm+i)->s=malloc(10))==NULL)printf("ERROR");for(i=0;i<M;i++){int k;printf("Please input the grades of %d students of the %s subject\n",N,(sm+i)->s);for(k=0;k<N;k++)scanf("%d",(sm+i)->d+k);}saverage(sm);caverage(sm);summary_below(sm);summary_both(sm);return 0;}void saverage(struct course *sm){double sum=0,av;int i,k;for(i=0;i<N;i++){printf("This is the %d student's average grade\t",i+1);for(k=0;k<M;k++){sum+=*((sm+k)->d+i);}av=sum/M;printf("%lf\n",av);sum=0;}}void caverage(struct course *sm){double sum=0,av;int i,k;for(i=0;i<M;i++){printf("This is the average grade of %s\t",(sm+i)->s);for(k=0;k<N;k++){sum+=*((sm+i)->d+k);}av=sum/N;printf("%lf\n",av);sum=0;}}void summary_below(struct course *sm){double sum=0,av;int i,k;for(i=0;i<M;i++){for(k=0;k<N;k++){sum+=*((sm+i)->d+k);}av=sum/N;printf("In %s the number of below-average student is\t",(sm+i)->s);for(sum=0,k=0;k<N;k++)if(*((sm+i)->d+k)<av)sum++;printf("%d\n",(int)sum);sum=0;}}void summary_both(struct course *sm){int i,k;int fsum=0,esum=0;for(i=0;i<M;i++){printf("The course is %s\t",(*(sm+i)).s);for(k=0;k<N;k++){if(*((sm+i)->d+k)<60)fsum++;if(*((sm+i)->d+k)>90)esum++;}printf("the failed is %d,while the above 90 is %d\n",fsum,esum);fsum=0,esum=0;}}5.选做题(1)#include<stdio.h>int main(void){int i,t=0;char a[]="12345678912345678912.1234567891";char b[]="98765432109876543210.0123456789";int s[32];s[0]=0;for(i=0;i<32;i++)s[i]=0;for(i=30;i>=0;i--){if(a[i]=='.')i--;int m,n,k;m=a[i]-'0'+t;n=b[i]-'0';k=m+n;if(k>=10){t=k/10;s[i+1]=k%10;}else{s[i+1]=k%10;t=0;}k=0;}s[0]=t;for(i=0;i<32;i++){if(i==21)printf(".");elseprintf("%d",s[i]);}return 0;}(2)#include<stdio.h>#include<string.h>#include<stdlib.h>int main(void){int n;char *(*p[2])(const char*,const char*);char *a;char *b;char *c;printf("please input string one:\n");a=malloc(20);gets(a);printf("please input string two:\n");b=malloc(20);gets(b);printf("please input a number:\n0 to choose the strcpy\n1 to choose the strcat\n");scanf("%d",&n);p[0]=strcpy;p[1]=strcat;if(n>2||n<0){printf("wrong");return -1;}elsec=(*p[n])(a,b);printf("now the string is:\n%s\n",c);return 0;}四、实验体会知道了指向数组的指针的用法,明白了指向函数的指针的用途。