C语言程序设计第四次28实验报告材料.docx
- 文档编号:5005249
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:21
- 大小:98.19KB
C语言程序设计第四次28实验报告材料.docx
《C语言程序设计第四次28实验报告材料.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第四次28实验报告材料.docx(21页珍藏版)》请在冰豆网上搜索。
C语言程序设计第四次28实验报告材料
C语言程序设计实验报告
专业班级日期11月26日成绩
实验组别第3(2.7)次实验指导教师李开
学生姓名学号同组人姓名
实验名称实验8指针实验
一、实验目的
(1)熟练掌握指针的说明、赋值、使用。
(2)掌握用指针引用数组的元素,熟悉指向数组的指针的使用。
(3)熟练掌握字符数组与字符串的使用,掌握指针数组及字符指针数组的用法。
(4)掌握指针函数与函数指针的用法。
(5)掌握带有参数的main函数的用法。
二、实验任务
8.2实验内容及要求
1.源程序改错
2.源程序完善、修改、替换
3.跟踪调试
4.程序设计
5.选做题
8.3指定main函数的参数
三、实验步骤及结果
(要求给出源程序和程序运行结果。
另外,根据实验内容,记录编辑、编译、链接、调试程序的操作过程和实验现象)
8.2实验内容及要求
1.源程序改错
下面程序是否存在错误?
如果存在,原因是什么?
如果存在错误,要求在计算机上对这个例子程序进行调试修改,使之能够正确执行。
#include
voidmain(void)
{
float*p;
scanf("%f",p);
printf("%f\n",*p);
}
存在,错误为指针一开始没有初始化,而sacnf传入的是float型指针指向的地址,我们并不知道系统能给我们分配什么地址,所以说我们输入的地址很有可能使程序崩溃。
修改后代码:
#include
intmain(void)
{
float*p;
floata[10];//这里可以换成其他数字
p=&a[0];
scanf("%f",p);
printf("%f\n",*p);
return0;
}
2.源程序完善、修改、替换
(1)下面的程序通过函数指针和菜单选择来调用字符串拷贝函数或字符串连接函数,请在下划线处填写合适的表达式、语句、或代码片段来完善该程序。
#include
#include
voidmain(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-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;
gets(a);
printf("inputthesecondstringplease!
\n");
i=0;
gets(b);
result=p(a,b);
printf("theresultis%s\n",result);
down:
;
}
(2)请上机运行第
(1)题程序,使之能按要求输出下面结果:
((输入)表示该数据是键盘输入数据)
1copystring.
2connectstring.
3exit.
inputanumber(1-3)please!
2(输入)
inputthefirststringplease!
themoreyoulearn,(输入)
inputthesecondstringplease!
themoreyouget.(输入)
theresultisthemoreyoulearn,themoreyouget.
3.跟踪调试
#include
char*strcpy(char*,char*);
voidmain(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为何值?
进入strcpy时:
返回main时:
(2)排除错误,使程序输出结果为:
thereisaboatonthelake.
#include
void*strcpy(char*,char*);
intmain(void)
{
chara[30],b[60]="thereisaboatonthelake.";
strcpy(a,b);
printf("%s\n",a);
return0;
}
void*strcpy(char*s,char*t)
{
while(*t!
='\0')
{
*s++=*t++;
}
*s='\0';//将函数类型设置为void型,然后不再返回直接打印a字符串即可
}
4.程序设计
(1)一个长整型变量占4个字节,其中每个字节又分成高4位和低4位。
试从该长整型变量的高字节开始,依次取出每个字节的高4位和低4位并以数字字符的形式进行显示。
#include
intmain(void)
{
intn,i;
scanf("%x",&n);
char*p=(char*)&n;
inthigh_half,low_half;
for(i=3;i>=0;i--){
low_half=p[i]&0x0f;
if(low_half<10)
low_half+='0';
else
low_half+='A'-10;
high_half=(p[i]&0xf0)>>4;
if(high_half<10)
high_half+='0';
else
high_half+='A'-10;
printf("%c%c\n",high_half,low_half);
}
return0;
}
(2)利用大小为n的指针数组指向用gets函数输入的n行,每行不超过80个字符。
编写一个函数,它将每一行中连续的多个空格字符压缩为一个空格字符。
在调用函数中输出压缩空格后的各行,空行不予输出。
#include
#defineN10
voidreducespace(char*p,intn);
intmain()
{
inti;
char*p[N],arr[N][81];
printf("Input%d-linestrings:
\n",N);
for(i=0;i { *(p+i)=arr[i]; printf("the%dline: ",i+1); gets(*(p+i)); } printf("\n\naftercompression: \n"); for(i=0;i { reducespace(*(p+i),i); } putchar(10); return0; } voidreducespace(char*p,intn)//削减空格的函数,将多行空格压缩成一个空格 { intflag=1,i,j=0,sum=0; chartemp[81]; for(i=0;*(p+i)! ='\0';i++) { if(*(p+i)! =''&&flag) { temp[j++]=*(p+i); sum++; } if(*(p+i)==''&&flag) flag=0; if(*(p+i)! =''&&! flag) { temp[j++]=''; temp[j++]=*(p+i); flag=1; sum++; } temp[j]='\0'; } if(sum) printf("The%dline: %s\n",n+1,temp); else printf("Ofthe%dlinethereareallspaces\n",n+1); } (3)输入n个整数,排序后输出。 排序的原则由命令行可选参数-d决定,有参数-d时按递减顺序排序,否则按递增顺序排序。 要求将排序算法定义成函数,利用指向函数的指针使该函数实现递增或递减排序。 (main函数参数的处理见8.3节) #include #include #include intmain(intargc,char*argv[]) { voiddownsort(char**p,intm); voidupsort(char**q,intk); intn=0; while(n { printf("%s",argv[n]); n++; } printf("\n"); if(! strcmp(argv[1],"-d")) downsort(&argv[2],n-2); elseupsort(&argv[1],n-1); return0; } voiddownsort(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]); } } 注: 我的电脑总是缺少一个插件,当我把这个插件安装到C盘指定目录下仍然没有效果,所以只能无法得知写的程序是否正确。 (4)设某个班有N个学生,每个学生修了M门课程(用#define定义N、M)。 输入M门课程的名称,然后依次输入N个学生中每个学生所修的M门课程的成绩并且都存放到相应的数组中。 编写下列函数: a.计算每个学生各门课程平均成绩; b.计算全班每门课程的平均成绩; c.分别统计低于全班各门课程平均成绩的人数; d.分别统计全班各门课程不及格的人数和90分以上(含90分)的人数。 在调用函数中输出上面各函数的计算结果。 (要求都用指针操作,不得使用下标操作。 ) #include #defineM2//course #defineN2//students intmain(void) { charcourses[M][30],students[N][20]; floattables[N][M]; intc,s; char*co=&courses[0][0];//courses[2]co+2*30 char*st=&students[0][0]; float*gr=&tables[0][0]; for(c=0;c { printf("PleaseInputThe%dCourse\n",c+1); scanf("%s",courses[c]); }//coursenames for(s=0;s { printf("PleaseInputThe%dStudent\n",s+1); scanf("%s",students[s]); }//studentsnames for(s=0;s { printf("Forstudents: %s\n",students[s]); printf("Inputhis/hergrades: \n"); for(c=0;c { printf("PleaseInputThe%s\n",courses[c]); scanf("%f",&tables[s][c]); } }//tables floatsum=0; for(s=0;s { sum=0; printf("theaveragegradesof%s: \n",st+s*20); for(c=0;c { sum+=*(gr+s*M+c); } printf("%f\n",sum/M); }// (1) floatsum_=0; for(c=0;c { sum_=0; printf("theaveragegradesof%s: \n",co+c*30); for(s=0;s { sum_+=*(gr+s*M+c); } printf("%f\n",sum_/N); }// (2) for(c=0;c { sum_=0; printf("thenumberwhosegradesunderaverageof%s\n",co+c*30); intcou=0; for(s=0;s { sum_+=*(gr+s*M+c); } for(s=0;s { if(*(gr+s*M+c) {cou++;} } printf("%d\n",cou); cou=0; }//(3) for(c=0;c { printf("thenumberwhosegradesunder60of%s\n",co+c*30); intcou=0; for(s=0;s { if(*(gr+s*M+c)<60) cou++; } printf("%d\n",cou); cou=0; } for(c=0;c printf("thenumberwhosegradeshigherthan90of%s\n",co+c*30); intcou=0; for(s=0;s { if(*(gr+s*M+c)>=90) cou++; } printf("%d\n",cou); cou=0; } return0; } 5.选做题 (1)设有N位整数和M位小数(N=20,M=10)的数据a,b。 编程计算a+b并输出结果。 如: 12345678912345678912.1234567891+98765432109876543210.0123456789 #include"stdio.h" #include"ctype.h" #defineN100/*N表示参与运算数据最长的长度*/ voidadd_decimals(char*a,char*b,int*c,intn,char*d); voidadd_inte(char*a,char*b,intc,intn,char*d); intmain(void) { chara1[N],b1[N],c1[N+1],a2[N],b2[N],c2[N+1]; charc; intq,w,e,r;//tocount q=0; while((c=getchar())! ='.') { if(isdigit(c)) *(a1+q)=c; q++; } *(a1+q)='\0'; w=0; while((c=getchar())! ='\n') { if(isdigit(c)) *(b1+w)=c; w++; } *(b1+w)='\0'; e=0; chard; while((d=getchar())! ='.') { if(isdigit(d)) *(a2+e)=d; e++; } *(a2+e)='\0'; r=0; while((d=getchar())! ='\n') { if(isdigit(d)) *(b2+r)=d; r++; } *(b2+r)='\0';//input intmax,max_; if(w>r) { max=w; intt; for(t=r;t *(b2+t)='0'; } else { max=r; intt; for(t=w;t *(b1+t)='0'; }//decimals! if(q>e) { max_=q; inty; for(y=0;y { *(a2+y+q-e)=*(a2+y); } for(y=0;y {*(a2+y)='0';} *(a2+q)='\0'; } else { max_=e; inty; for(y=0;y { *(a1+y+e-q)=*(a1+y); } for(y=0;y {*(a1+y)='0';} *(a1+e)='\0'; }//zhengshu intjinwei=0; int*p=&jinwei; char*pc1=&a1[0]; char*pc2=&a2[0]; char*pc3=&b1[0]; char*pc4=&b2[0]; char*pc5=&c1[0]; char*pc6=&c2[0]; printf("a1=%s\n",a1); printf("a2=%s\n",a2); printf("b1=%s\n",b1); printf("b2=%s\n",b2); add_decimals(pc3,pc4,p,max,pc6); add_inte(pc1,pc2,jinwei,max_,pc5); printf("theresultis: \n"); printf("%s.%s\n",c1,c2); return0; } voidadd_decimals(char*a,char*b,int*c,intn,char*d) { into,jin=0; for(o=n-1;o>-1;o--) { if(*(a+o)+*(b+o)-2*'0'+jin>=10) {*(d+o)=*(a+o)+*(b+o)+jin-1*'0'-10; jin=1; } else { *(d+o)=*(a+o)+*(b+o)-'0'; jin=0; } } *(d+n)='\0'; *c=jin; } voidadd_inte(char*a,char*b,intc,intn,char*d) { into; for(o=n-1;o>0;o--) { if(*(a+o)+*(b+o)-2*'0'+c>=10) {*(d+o+1)=*(a+o)+*(b+o)-1*'0'-10; c=1; } else { *(d+o+1)=*(a+o)+*(b+o)-1*'0'; c=0; } } if(*a+*b+c-2*'0'>=10) { *(d+1)=*a+*b+c-'0'-10; *d='1'; } else {*(d+1)=*a+*b+c-'0'; *d='';} } (2)编写使用复杂声明char*(*p[2])(constchar*,constchar*);的程序。 提示: p中元素可为strcmp、strstr等函数名。 8.3指定main函数的参数 选择“project/setprograms'arguments…”菜单命令,即可打开图2.12所示的对话框,在“Programarguments”文本框中输入main函数的参数。 注意只输入命令行中文件名后的参数,文件名不输人。 图2.12输入main函数的参数 四、实验体会 好好写代码,不该跟老师吵,星期三的晚上应该按课程来讲只是写代码,不能干其他事情,对此我深刻检讨。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 第四 28 实验 报告 材料