C语言程序设计第四次28试验报告.docx
- 文档编号:11509365
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:26
- 大小:81.40KB
C语言程序设计第四次28试验报告.docx
《C语言程序设计第四次28试验报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第四次28试验报告.docx(26页珍藏版)》请在冰点文库上搜索。
C语言程序设计第四次28试验报告
实验报告语言程序设计C
专业班级日期11月26日成绩
实验组别第3(2.7)次实验指导教师李开
学生姓名学号同组人姓名
实验名称指针实验8实验
一、实验目的
(1)熟练掌握指针的说明、赋值、使用。
(2)掌握用指针引用数组的元素,熟悉指向数组的指针的使用。
(3)熟练掌握字符数组与字符串的使用,掌握指针数组及字符指针数组的用法。
(4)掌握指针函数与函数指针的用法。
函数的用法。
main5)掌握带有参数的(
二、实验任务
8.2实验内容及要求
1.源程序改错
2.源程序完善、修改、替换
3.跟踪调试
4.程序设计
.选做题58.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(\\t1copystring.\n);
printf(\\t2connectstring.\n);
printf(\\t3exit.\n);
printf(\\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(heresultis%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]=hereisaboatonthelake.;
printf(%s\n,strcpy(a,b));
}
char*strcpy(char*s,char*t)
{
while(*s++=*t++)
;
return(s);
}
为s时main,watch窗口中窗口中)单步执行。
进入(1strcpy时watchs为何值?
返回何值?
strcpy进入时:
返回main时:
错除)排2(.
误,使程序输出结果为:
thereisaboatonthelake.
#include
void*strcpy(char*,char*);
intmain(void)
{
chara[30],b[60]=hereisaboatonthelake.;
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;
}
个字符。
编写80函数输入的getsn行,每行不超过
(2)利用大小为n的指针数组指向用在调用函数中输出压缩它将每一行中连续的多个空格字符压缩为一个空格字符。
一个函数,空格后的各行,空行不予输出。
#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(he%dline: i+1); gets(*(p+i)); } printf(\ \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); } 时按递-d决定,有参数个整数,)输入n排序后输出。 排序的原则由命令行可选参数-d(3利用指向函数的指针使该否则按递增顺序排序。 要求将排序算法定义成函数,减顺序排序,节)8.3(main函数参数的处理见函数实现递增或递减排序。 #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(\ ); 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(heaveragegradesof%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(heaveragegradesof%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(henumberwhosegradesunderaverageof%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(henumberwhosegradesunder60of%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(henumberwhosegradeshigherthan90of%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; }.选做题5a+b并输出结果。 )的数据,M=10a,b。 编程计算位小数()设有(1N位整数和MN=2012345678912345678912.1234567891+98765432109876543210.0123456789如: #includestdio.h #includectype.h */表示参与运算数据最长的长度#defineN100/*Nvoidadd_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(1=%s\n,b1); printf(2=%s\n,b2); add_decimals(pc3,pc4,p,max,pc6); add_inte(pc1,pc2,jinwei,max_,pc5); printf(heresultis: \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*);的程序。 等函数名。 strstr、p中元素可为strcmp提示: 8.3参数函数的指定main选择“project/setprograms'arguments…”菜单命令,即可打开图2.12所示的对话框,在“Programarguments”文本框中输入main函数的参数。 注意只输入命令行中文件名后的参数,文件名不输人。 main输入图2.12 函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 第四 28 试验报告