实验六 指针实验.docx
《实验六 指针实验.docx》由会员分享,可在线阅读,更多相关《实验六 指针实验.docx(14页珍藏版)》请在冰点文库上搜索。
![实验六 指针实验.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/825fb99a-3319-4b03-8f17-43c74c21e647/825fb99a-3319-4b03-8f17-43c74c21e6471.gif)
实验六指针实验
C语言程序设计实验报告
专业信息安全班级1103日期成绩
实验组别第1次实验指导教师
学生姓名严志颖学号U201114113同组人姓名
实验名称指针实验
一、实验目的
1.熟练掌握指针的说明、赋值、使用。
2.掌握用指针引用数组的元素,熟悉指向数组的指针的使用。
3.熟练掌握字符数组与字符串的使用,掌握指针数组及字符指针数组的用法。
4.掌握指针函数与函数指针的用法。
二、实验任务
1.源程序改错题
下面程序是否存在错误?
如果存在,原因是什么?
如果存在错误,要求在计算机上对这个例子程序进行调试修改,使之能够正确执行。
#include"stdio.h"
intmain(void
{
float*p;
scanf("%f",p;
printf("%f\n",*p;
return0;
}
2.源程序完善、修改、替换题
(1)下面的程序通过函数指针和菜单选择来调用字符串拷贝函数或字符串连接函数,请在下划线处填写合适的表达式、语句、或代码片段来完善该程序。
#include"stdio.h"
#include"string.h"
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-3please!
\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)为了使程序不受scanf、getchar、gets等函数输入后回车符的影响,请修改第
(1)题程序,按要求输出下面结果:
((输入)表示该数据是键盘输入数据)
1copystring.
2connectstring.
3exit.
inputanumber(1-3please!
2(输入)
inputthefirststringplease!
themoreyoulearn,(输入)
inputthesecondstringplease!
themoreyouget.(输入)
theresultisthemoreyoulearn,themoreyouget.
3.跟踪调试源程序
#include"stdio.h"
char*strcpy(char*,char*;
intmain(void
{
chara[20],b[60]="thereisaboatonthelake.";
printf("%s\n",strcpy(a,b;
}
char*strcpy(char*s,char*t
{
while(*s++=*t++
;
return(s;
}
(1)单步执行。
进入strcpy时watch窗口中s为何值?
返回main时,watch窗口中s为何值?
(2)排除错误,使程序输出结果为:
thereisaboatonthelake.
(3)选做:
由于watch窗口中只显示s所指串的值,不显示s中存储的地址值,怎样才能观察到s值的变化呢?
4.程序设计
(1)一个长整型变量占4个字节,其中每个字节又分成高4位和低4位。
试从该长整型变量的高字节开始,依次取出每个字节的高4位和低4位并以数字字符的形式进行显示。
(2)利用大小为n的指针数组指向用gets函数输入的n行,每行不超过80个字符。
编写一个函数,它将每一行中连续的多个空格字符压缩为一个空格字符。
在调用函数中输出压缩空格后的各行,空行不予输出。
(3)编写一个程序,输入n个整数,排序后输出。
排序的原则由命令行的的可选参数-d定并且有参数-d时按递减顺序排序,否则按递增顺序排序。
要求将排序算法定义成函数,利用指向函数的指针使该函数实现递增或递减排序。
(4)设某个班有N个学生,每个学生修了M门课程(用#define定义N、M)。
输入M门课程的名称,然后依次输入N个学生中每个学生所修的M门课程的成绩并且都存放到相应的数组中。
编写下列函数:
a.计算每个学生各门课程平均成绩;
b.计算全班每门课程的平均成绩;
c.分别统计低于全班各门课程平均成绩的人数;
d.分别统计全班各门课程不及格的人数和90分以上(含90分)的人数。
在调用函数中输出上面各函数的计算结果。
(要求都用指针操作,不得使用下标操作。
)
二、实验步骤及结果
1,源程序改错
更改之后得到的程序:
#include
intmain(void
{
float*p;
floata[10];
p=&a[0];
scanf("%f",p;
printf("%f\n",*p;
return0;
}
运行结果:
2源程序完善、修改、替换
(1)完善后的代码:
#include
#include
intmain(void
{
char*(*p(chara[],charb[];
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-3please!
\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;
gets(a;
printf("inputthesecondstringplease!
\n";
i=0;
gets(b;
result=p(a,b;
printf("theresultis:
%s\n",result;
down:
;
return0;
}
(2)运行结果:
3.跟踪调试源程序
(1)单步调试
进入strcpy窗口中:
返回main时:
(2)程序正确运行结果:
4.程序设计
(1)代码如下:
(2)代码如下:
#include
#include
#include
#defineN2
intmain(
{
char*p[N],buf[82];
inti,j,k;
for(i=0;i
{
gets(buf;
p[i]=(char*malloc(sizeof(char*(strlen(buf+2;
strcpy(p[i],buf;
}
for(i=0;i
{
for(j=k=0;p[i][j];j++
if(p[i][j]!
=''
{
p[i][k]=p[i][j];
k++;
}
elseif(p[i][j+1]==''j++;
else
{
p[i][k]='';
k++;
}
p[i][k]='\0';
if(strlen(p[i]==0||strcmp(p[i],""==0;
elseputs(p[i];
}
return0;
}
运行结果:
(3)代码如下:
#include
#include
#include
intmain(intargc,char*argv[]
{
voiddown_sort(char**p,intm;
voidup_sort(char**q,intk;
intn=0;
while(n
{
printf("%s",argv[n];
n++;
}
printf("\n";
if(!
strcmp(argv[1],"-d"
down_sort(&argv[2],n-2;
elseup_sort(&argv[1],n-1;
return0;
}
voiddown_sort(char**p,intm
{
inti,j;
chart;
for(i=0;i
for(j=0;j
if(*p[j]<*p[j+1]
t=*p[j],*p[j]=*p[j+1],*p[j+1]=t;
for(i=0;i
{
*p[i]=*p[i]-'0';
printf("%d",*p[i];
}
}
voidup_sort(char**q,intk
{chart;
inti,j;
for(i=0;i
for(j=0;j
if(*q[j]>*q[j+1]
t=*q[j],*q[j]=*q[j+1],*q[j+1]=t;
for(i=0;i
{
*q[i]=*q[i]-'0';
printf("%d",*q[i];
}
}
运行结果:
(4)代码如下:
#include
#include
#include
#defineN2
#defineM3
charsname[M][50];
floata[N+1][M+1];
voidf1(
{
inti;
for(i=1;i<=N;i++
printf("%g\n",a[i][0];
}
voidf2(
{
inti;
for(i=1;i<=M;i++
printf("%s%g\n",sname[i-1],a[0][i];
}
voidf3(
{
inti,j,k;
for(i=1;i<=M;i++
{
k=0;
for(j=1;j<=N;j++
if(a[j][i]
printf("%s%d\n",sname[i-1],k;
}
}
voidf4(
{
inti,j,k,h;
for(i=1;i<=M;i++
{
k=h=0;
for(j=1;j<=N;j++
{
if(a[j][i]<60k++;
if(a[j][i]>=90h++;
}
printf("%s%d%d\n",sname[i-1],k,h;
}
}
intmain(
{
inti,j;
for(i=0;i
scanf("%s",sname[i];
for(i=1;i<=N;i++
for(j=1;j<=M;j++
{
scanf("%f",&a[i][j];
a[i][0]+=a[i][j];
a[0][j]+=a[i][j];
}
for(i=1;i<=N;i++a[i][0]/=N;
for(j=1;j<=M;j++a[0][j]/=M;
f1(;
f2(;
f3(;
f4(;
return0;
}
运行结果:
三、实验体会
指针的使用给编程效率带来了很大的提高,在本次实验中我体会到了很多指针带给程序设计不一样的体验,总的来说指针的运用比较灵活,对我而言有点难以掌握,但我相信经过一段时间的练习之后,一定会获得很大的收获。