C语言程序设计实验报告一.docx
- 文档编号:10370132
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:27
- 大小:153.96KB
C语言程序设计实验报告一.docx
《C语言程序设计实验报告一.docx》由会员分享,可在线阅读,更多相关《C语言程序设计实验报告一.docx(27页珍藏版)》请在冰豆网上搜索。
C语言程序设计实验报告一
C语言程序设计实验报告
专业:
班级:
日期:
成绩:
实验组别:
第次实验:
指导教师:
学生姓名:
学号:
同组人姓名:
实验名称:
指针实验
一、实验目的
(1)熟练掌握指针的说明、赋值、使用。
(2)掌握用指针引用数组的元素,熟悉指向数组的指针的使用。
(3)熟练掌握字符数组与字符串的使用,掌握指针数组及字符指针数组的用法。
(4)掌握带有参数的main函数的用法。
二、实验内容及要求
1.源程序改错
下面的源程序中是否存在错误?
如果存在,原因是什么?
如果存在错误要求在计算机上对这个源程序进行调试修改,是之能够正确执行。
源程序:
#include
intmain(void)
{
float*p;
scanf("%f",p);
printf("%f\n",*p);
return0;
}
2.源程序修改替换
(1)下面源程序的功能是,通过函数指针和菜单选择来调用字符串拷贝函数或字符串连接函数。
请在程序中的下划线处填写合适的表达式、语句或代码片段来完善该程序。
源程序:
#include
#include
intmain(void)
{
____________________________
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(choice<1||choice>5);
switch(choice)
{
case1:
p=strcpy;
break;
case2:
p=strcat;
break;
case3:
gotodown;
}
getchar();
printf("inputthefirststringplease!
\n");
i=0;
_______________________
printf("inputthesecondstringplease!
\n");
i=0;
_______________________
result=____(a,b);
printf("theresultis%s\n",result);
down:
;
return0;
}
(2)请上机运行第
(1)题程序使之能按下面要求输出结果(注:
(输入)表示该行数据是键盘数据):
1.copystring。
2.Connectstring。
3.Exit。
Inputanumber(1-3)please!
2(输入)
Inputthefirststringplease!
Themoreyoulearn,(输入)
Inputthesecondstringplease!
Themoreyouget.(输入)
Theresultisthemoreyoulearn,themoreyouget.
3.跟踪调试程序
请按下面的要求对所给源程序进行操作,并回答问题和排除错误。
(1)单步执行源程序。
进入strcpy时,watches窗口中s为何值?
返回main时,watches窗口中s为何值?
(2)排除源程序中的错误,使程序输出结果为:
thereisaboatonthelake.
源程序:
#include
char*strcpy(char*,char*);
intmain(void)
{
chara[20],b[60]="thereisaboatonthelack.";
printf("%s\n",strcpy(a,b));
return0;
}
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])(constchar*,constchar*);”的程序。
提示:
p中元素可为strcmp,strstr等函数名。
三、实验步骤及结果
1.源程序改错
错误:
悬挂指针,指针未初始化
改后程序:
#include
intmain(void)
{
float*p,a;
p=&a;
scanf("%f",p);
printf("%f\n",*p);
return0;
}
2.源程序完善、修改、替换
#include
#include
intmain(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(choice<1||choice>5);
switch(choice)
{
case1:
p=strcpy;
break;
case2:
p=strcat;
break;
case3:
gotodown;
}
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);
down:
;
return0;
}
3.跟踪调试程序
#include
char*strcpy(char*,char*);
intmain(void)
{
chara[20],b[60]="thereisaboatonthelack.";
printf("%s\n",strcpy(a,b));
return0;
}
char*strcpy(char*s,char*t)
{
char*m;
m=s;
while(*s++=*t++)
;
return(m);
}
4.程序设计
(1)
#include
#include
#defineMAX32
intmain()
{
longintn;
inti;
chars[MAX];
printf("pleaseinputanumber:
\n");
scanf("%ld",&n);
if(n>=-2147483647&&n<=2147483647)
;
else
{
printf("wrong:
thenumberistoolarge");
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 if(s[i]=='1') s[i]='0'; elseif(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'); return0; } (2) #include #include #include #defineN3 voidoutput(char*s); intmain(void) { inti; char*s[N]; printf("pleaseinputyourmassage: \n"); for(i=0;i { s[i]=malloc(80); gets(s[i]); } printf("yourmassagehasbeenchangedinto;\n"); for(i=0;i { output(s[i]); printf("%s\n",s[i]); } return0; } voidoutput(char*s) { inti,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]; } else s[j]=s[i]; } s[j]=s[i]; } (3) #include #defineMAX5 voidswap(intv[],inti,intj); voidqsort(intv[],intleft,intright); intmain(intargc,char*argv[]) { inti=0,s[MAX]; if(--argc>0&&(*++argv)[0]=='-') { if((*argv)[1]=='d') { while(i scanf("%d",&s[i++]); qsort(s,0,MAX-1); for(i=MAX-1;i>=0;i--) printf("%d\t",s[i]); } else printf("wrong: \n"); } else { while(i scanf("%d",&s[i++]); qsort(s,0,MAX-1); for(i=0;i printf("%d\t",s[i]); } return0; } voidqsort(intv[],intleft,intright) { inti,last; voidswap(intv[],inti,intj); if(left>right) return; swap(v,left,(left+right)/2); last=left; for(i=left+1;i<=right;i++) if(v[i] swap(v,++last,i); swap(v,left,last); qsort(v,left,last-1); qsort(v,last+1,right); } voidswap(intv[],inti,intj) { inttemp; temp=v[i]; v[i]=v[j]; v[j]=temp; } (4) #include #defineN5 #defineM3 structcourse { char*s; intd[N]; }sm[M]; voidsaverage(structcourse*sm); voidcaverage(structcourse*sm); voidsummary_below(structcourse*sm); voidsummary_both(structcourse*sm); intmain(void) { inti; printf("Pleaseinputthenamesofthe%dcourses.\n",M); for(i=0;i if(gets((sm+i)->s=malloc(10))==NULL) printf("ERROR"); for(i=0;i { intk; printf("Pleaseinputthegradesof%dstudentsofthe%ssubject\n",N,(sm+i)->s); for(k=0;k scanf("%d",(sm+i)->d+k); } saverage(sm); caverage(sm); summary_below(sm); summary_both(sm); return0; } voidsaverage(structcourse*sm) { doublesum=0,av; inti,k; for(i=0;i { printf("Thisisthe%dstudent'saveragegrade\t",i+1); for(k=0;k { sum+=*((sm+k)->d+i); } av=sum/M; printf("%lf\n",av); sum=0; } } voidcaverage(structcourse*sm) { doublesum=0,av; inti,k; for(i=0;i { printf("Thisistheaveragegradeof%s\t",(sm+i)->s); for(k=0;k { sum+=*((sm+i)->d+k); } av=sum/N; printf("%lf\n",av); sum=0; } } voidsummary_below(structcourse*sm) { doublesum=0,av; inti,k; for(i=0;i { for(k=0;k { sum+=*((sm+i)->d+k); } av=sum/N; printf("In%sthenumberofbelow-averagestudentis\t",(sm+i)->s); for(sum=0,k=0;k if(*((sm+i)->d+k) sum++; printf("%d\n",(int)sum); sum=0; } } voidsummary_both(structcourse*sm) { inti,k; intfsum=0,esum=0; for(i=0;i { printf("Thecourseis%s\t",(*(sm+i)).s); for(k=0;k { if(*((sm+i)->d+k)<60) fsum++; if(*((sm+i)->d+k)>90) esum++; } printf("thefailedis%d,whiletheabove90is%d\n",fsum,esum); fsum=0,esum=0; } } 5.选做题 (1) #include intmain(void) { inti,t=0; chara[]="12345678912345678912.1234567891"; charb[]="98765432109876543210.0123456789"; ints[32]; s[0]=0; for(i=0;i<32;i++) s[i]=0; for(i=30;i>=0;i--) { if(a[i]=='.') i--; intm,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("."); else printf("%d",s[i]); } return0; } (2) #include #include #include intmain(void) { intn; char*(*p[2])(constchar*,constchar*); char*a;char*b;char*c; printf("pleaseinputstringone: \n"); a=malloc(20); gets(a); printf("pleaseinputstringtwo: \n"); b=malloc(20); gets(b); printf("pleaseinputanumber: \n0tochoosethestrcpy\n1tochoosethestrcat\n"); scanf("%d",&n); p[0]=strcpy; p[1]=strcat; if(n>2||n<0) { printf("wrong"); return-1; } else c=(*p[n])(a,b); printf("nowthestringis: \n%s\n",c); return0; } 四、实验体会 知道了指向数组的指针的用法,明白了指向函数的指针的用途
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 实验 报告