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门课程的成绩,并且都存放到相应的数组中,试编写以下函数:
(5)①计算每个学生各门课程平均成绩
(6)②计算全班每门课程的平均成绩
(7)③分别统计低于全班各门课程平均成绩的人数
(8)④分别统计全班各门课程不及格的人数和90分以上(包含90)的人数。
(9)在调用函数中输出结果(要求都用指针操作,不得用下标)
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;iif(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(iscanf("%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(iscanf("%d",&s[i++]);
qsort(s,0,MAX-1);
for(i=0;iprintf("%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;iif(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;kscanf("%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;kif(*((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;
}
四、实验体会
知道了指向数组的指针的用法,明白了指向函数的指针的用途