C语言程序设计实验第六次上机实验报告.docx
- 文档编号:26175490
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:46
- 大小:338.87KB
C语言程序设计实验第六次上机实验报告.docx
《C语言程序设计实验第六次上机实验报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计实验第六次上机实验报告.docx(46页珍藏版)》请在冰豆网上搜索。
C语言程序设计实验第六次上机实验报告
7.第六次实验
C语言程序设计实验报告
专业运算机科学与技术班级信安1302班日期成绩
实验组别第6次实验指针实验&结构与联合实验指导教师
学生姓名学号同组人姓名
实验名称指针实验&结构与联合实验
实验目的
1.熟练把握指针的说明、赋值、利用。
2.把握用指针引用数组的元素,熟悉指向数组的指针的利用。
3.熟练把握字符数组与字符串的利用,把握指针数组及字符指针数组的用法。
4.把握指针函数与函数指针的用法。
5.把握带有参数的main函数的用法。
6.熟悉和把握结构的说明和引用,结构的指针,结构数组,和函数中利用结构的方式。
7.把握动态贮存分派函数的用法,把握自引用结构和单向链表的创建,遍历,结点的增删,查找等操作。
8.了解字段结构和联合的用法。
实验内容
(一)设计一个函数reverse(a,n),将一维数组a的值逆置。
如,逆置前,A:
20、10、90、5九、60、80、70,
逆置后,A:
70、80、60、5九、90、10、20。
源程序如下:
#include<>
voidsort(int*a,intn);
intmain()
{
intx[100],n,i,*p=x;
printf("entern:
");
scanf("%d",&n);
printf("enternumbers:
");
for(i=0;i scanf("%d",p+i); sort(x,n); for(i=0;i printf("%4d",*(p+i)); return0; } voidsort(int*a,intn) { inti,j,t; for(i=0;i { for(j=0;j { t=*(a+j);*(a+j)=*(a+j+1);*(a+j+1)=t; } } } 实验步骤: 1.概念一个数组寄放数据,实现数据的输入和存储。 2.概念一个子函数进行排序,用把数据两两互换来实现。 调试及编译进程: 测试数据: 任意选取一组数据: 显现的不足及修改: 无运行结果: 显现预期的结果。 (二)设计一个函数BubbleSort(a, n),采纳冒泡排序算法,实现一维数组的整数进行排序的功能。 源程序如下: #include<> voidBubbleSort(int*a,intn); intmain() { inta[100],n,i; printf("entern: "); scanf("%d",&n); printf("enternumbers: "); for(i=0;i scanf("%d",&a[i]); BubbleSort(a,n); for(i=0;i printf("%6d",a[i]); return0; } voidBubbleSort(int*a,intn) { intt,*p=a,i,j; 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; } } } } 实验步骤: 1.概念数组实现数据的输入和寄放。 2.概念一个子函数实现数据的冒泡法排序。 调试及编译进程: 测试数据: 任意选取一组数据(按从小到大顺序排列) 测试数据: 任意选取一组数据(按任意顺序排列) 显现的不足及修改: 无运行结果: 显现预期的结果。 (三)设计一个一个函数find(a,n,x),实现对在一个数组的整数进行查找功能。 假设是给定值x在数组a中,返回其所在的位置(即下标值),不然返回-1。 源程序如下: #include<> intfind(int*a,intn,intx); intmain() { inta[100],n,x,i; printf("entern: "); scanf("%d",&n); printf("enternumbers: "); for(i=0;i scanf("%d",(a+i)); printf("enterx: "); scanf("%d",&x); if(find(a,n,x)==-1) printf("notfound! "); else printf("thenumberis%d",find(a,n,x)); return0; } intfind(int*a,intn,intx) { inti,*p=a; for(i=0;i { if(*(p+i)==x) return(i); } return(-1); } 实验步骤: 1.概念一个数组实现数据的输入和寄放。 2.概念一个子函数实现查找的功能并在主函数中挪用该函数。 调试及编译进程 测试数据: 任意选取一组数据,后来输入的数能被找到 测试数据: 任意选取一组数据(后来输入的数不能被找到) 显现的不足及修改: 无运行结果: 显现预期的结果 (四)输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 假设是有多对数字的和等于输入的数字,输出任意一对即可。 例如,输入数组一、二、4、7、1一、15和数字15。 由于4+11=15,因此,输出4和11。 源程序如下: #include<> intmain() { inta[100],n,x,i,j; printf("entern: "); scanf("%d",&n); printf("enternumbers: "); for(i=0;i scanf("%d",a+i); printf("enterx: "); scanf("%d",&x); for(i=0;i { for(j=0;j { if(*(a+i)+*(a+j)==x) { printf("%d+%d=%d",*(a+i),*(a+j),x); return0; } } } return0; } 实验步骤: 1.概念一个数组实现数据的输入和寄放。 2.用两层循环一一查验,碰着知足条件的即输出。 调试及编译进程: 测试数据: 任意选取一组数据: 显现的不足及修改: 无运行结果: 显现预期的结果。 (五)查验并打印魔方矩阵 在下面的5×5阶魔方矩阵中,每一行、每一列、每一对角线上的元素之和都是相等的,试编写程序将任意5×5阶矩阵中的元素存储到一个二维整型数组中,然后查验其是不是为魔方矩阵,并将其按如下格式显示到屏幕上。 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 源程序如下: #include<> intmain() { inta[5][5],i,j,s=0,s1=0,s2,s3; printf("enternumbers: "); for(i=0;i<5;i++) { for(j=0;j<5;j++) { scanf("%d",*(a+i)+j); } } for(i=0;i<5;i++) { for(j=0;j<5;j++) { printf("%4d",*(*(a+i)+j)); } printf("\n"); } for(i=0;i<5;i++) s+=*(*(a+i)+i); for(i=0;i<5;i++) s1+=*(*(a+i)+4-i); if(s==s1) { for(i=0;i<5;i++) { s2=0; for(j=0;j<5;j++) { s2+=*(*(a+i)+j); } if(! (s2==s)) { printf("not! "); return0; } } for(i=0;i<5;i++) { s3=0; for(j=0;j<5;j++) s3+=*(*(a+j)+i); } if(! (s3==s)) { printf("not! "); return0; } } else printf("not! "); return0; } 实验步骤: 1.概念数组实现数据的输入和寄放。 2.别离对二维矩阵的行列主次对角线进行求和运算,判定是不是为魔方矩阵。 调试及编译进程: 测试数据: 输入一组魔方矩阵的数据 显现的不足及修改: 无运行结果: 输出预期结果。 (六)编写一个函数swap(x,y),别离采纳3种不同的算法实现两个变量值的互换功能。 源程序1如下: #include<> voidswap(int*x,int*y); intmain() { inta,b; scanf("%d%d",&a,&b); swap(&a,&b); printf("%d\t%d",a,b); return0; } voidswap(int*x,int*y) { intt; t=*x; *x=*y; *y=t; } 源程序2如下: #include<> voidswap(int*a,int*b); intmain() { intx,y; scanf("%d%d",&x,&y); swap(&x,&y); printf("%d\t%d",x,y); return0; } voidswap(int*x,int*y) { *x=(*x)+(*y); *y=(*x)-(*y); *x=(*x)-(*y); } 源程序3如下: #include<> voidswap(int*x,int*y); intmain() { intx,y; scanf("%d%d",&x,&y); swap(&x,&y); printf("%d\t%d",x,y); return0; } voidswap(int*x,int*y) { *x=*x^*y; *y=*x^*y; *x=*x^*y; } 实验步骤: 1.选取三种适合的方式进行互换。 2.因为要用到子函数,于是将这三种方式中的参数均改成指针操作。 调试及编译进程: 测试数据: 任意选取一组数据 测试数据: 将以上数据互换输入 显现的不足及修改: 无运行结果: 显现预期的结果。 (七)设计一个计算MAX{a,b}的程序,要求a和b,以命令行中参数形式给出。 源程序如下: #include<> intmain(intargc,char*argv[]) { inta=atoi(argv[1]); intb=atoi(argv[2]); if(a>b)printf("%d",a); elseprintf("%d",b); return0; } 实验步骤: 直接进行比较并输出较大值 调试及编译进程: 测试数据: 任意选取一组数据 测试数据: 互换上面两数 显现的不足及修改: 刚开始没有将字符型换成整型致使错误,后来利用atoi函数解决。 运行结果: 更正后输出预期的结果。 (八)设计一个函数create(L),其功能是成立一个“先进后出”的链表。 源程序如下: #include<> #include<> structList{ inti; structList*next; }; typedefstructListmylist; intmain(intargc,constchar*argv[]) { structList*h=NULL; mylist*p; h=(mylist*)malloc(sizeof(mylist)); h->i=0; h->next=NULL; intn; scanf("%d",&n); while(n){ inttemp; scanf("%d",&temp); p=(mylist*)malloc(sizeof(mylist)); p->i=temp; p->next=h; h=p; --n; } while(h&&(h->i! =0)) { printf("%8d\t",h->i); h=h->next; } return0; } 实验步骤: 1.概念结构型的变量,创建链表。 2.循环概念链表的起点和终点,概念结构的数据域。 3.输出。 调试及编译结果: 测试数据: 任意选取一组数据 测试数据: 将上述数据反向输入 显现的不足及修改: 无运行结果: 输出预期的结果。 (九)设计一个函数insert(L,i,e),其功能是在链表L中的第i个元素之间插入新元素e。 源程序如下: #include<> #include<> #include<> structList{ inti; structList*next; }; typedefstructListmylist; mylist*insert(mylist*L,inti,inte){ mylist*pri=L; intj; for(j=1;j pri=pri->next; } mylist*p=(mylist*)malloc(sizeof(mylist)); p->i=e; p->next=pri->next; pri->next=p; returnL; } intmain(intargc,constchar*argv[]) { structList*h=NULL; intinsert_number,locate; printf("enterthenumberyouwanttoinsertin: "); scanf("%d",&insert_number); printf("enterthelocateyouwanttoinsert: "); scanf("%d",&locate); mylist*p; h=(mylist*)malloc(sizeof(mylist)); h->i=0; h->next=NULL; intn; printf("enterthenumberoflist: "); scanf("%d",&n); while(n){ inttemp; scanf("%d",&temp); p=(mylist*)malloc(sizeof(mylist)); p->i=temp; p->next=h; h=p; --n; } h=insert(h,locate,insert_number); mylist*temp=h; while(temp&&(temp->i! =0)){ printf("%d",temp->i); temp=temp->next; } return0; } 实验步骤: 1.依照上一个实验写出创建链表的进程。 2.概念子函数进行数据的插入,在此进程中,将要插入的数放入一个新的结构性变量中,并将此结构性变量的指针域指向原链表中的插入位置,使链表按原顺序继续下去。 调试及编译进程: 测试数据: 任意选取一组数据 测试数据: 任意选取一组数据 显现的不足及修改: 无运行结果: 显现预期的结果。 (十)设计一个函数delete(L,i),其功能是删除在链表L中的第i个元素。 源程序如下: #include<> #include<> #include<> structList{ inti; structList*next; }; typedefstructListmylist; mylist*insert(mylist*L,inti){ mylist*pri=L; intj; for(j=1;j pri=pri->next; } pri->next=pri->next->next; returnL; } intmain(intargc,constchar*argv[]) { structList*h=NULL; intlocate; printf("enterthelocateyouwanttodelete: "); scanf("%d",&locate); mylist*p; h=(mylist*)malloc(sizeof(mylist)); h->i=0; h->next=NULL; intn; printf("enterthenumberoflist: "); scanf("%d",&n); while(n){ inttemp; scanf("%d",&temp); p=(mylist*)malloc(sizeof(mylist)); p->i=temp; p->next=h; h=p; --n; } h=insert(h,locate); mylist*temp=h; while(temp&&(temp->i! =0)){ printf("%d",temp->i); temp=temp->next; } return0; } 实验步骤: 1.依照第一个创建链表的程序创建链表。 2.概念一个子函数完成删除第i个元素的功能。 调试及编译进程: 测试数据: 任意选取一组数据 测试数据: 任意选取一组数据 显现的不足及修改: 无运行结果: 显现预期的结果。 (十一)设计一个程序,利用链表输出约瑟夫环的结果序列。 注释: 约瑟夫环是一个数学的应用问题: 已知n个人(以编号1,2,3...n别离表示)围坐在一张圆桌周围。 从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全数出列。 源程序如下: #include<> #include<> structlist{ intdata; structlist*next; }; structlist*create(intn) { inti=1; structlist*head=NULL,*tail; head=(structlist*)malloc(sizeof(structlist)); head->data=i; tail=head; while(n-1) { tail->next=(structlist*)malloc(sizeof(structlist)); tail=tail->next; tail->data=++i; n--; } tail->next=head; returnhead; }; intmain() { intn,m,t=0,k=0; structlist*mylist=NULL,*mylist1=NULL; printf("enterthenumberofpeople: \n"); scanf("%d",&n); printf("enterm: \n"); scanf("%d",&m); mylist=create(n); mylist1=mylist; while(t! =n-1) { k++; if(k==m) { mylist1->next=mylist1->next->next; t++; k=0; } mylist1=mylist; mylist=mylist->next; } printf("thelastnumberis%d",mylist->data); return0; } 实验步骤: 1.创建链表,将链表中各部份的数据域别离设为1,2,…n,其中n又键盘端输入。 2.输入人数和需要删除的数,用到上一个程序的思想,在将要删除的数前,将上一个指针直接指向下一个而不指向该数。 调试及编译进程: 测试数据: 任意输入一组数据 测试数据: 任意输入一组数据 显现的不足及修改: 刚开始没有注意到假设直接在删除的进程中采纳一个变量进行处置,那么事实上去掉的是该数的下一个数,因此在修改的进程中加上了另外一个变量,使后来加上的变量指向当前变量的前一个,利用它进行删除工作,而当前变量仍起到操纵循环的作用。 运行结果: 修改后能输出预期的结果。 (十二)设计一个程序完成文件的复制(COPY)功能。 源程序如下: #include<> #include<> intmain() { charc; FILE*fin,*fout; fout=fopen("","w+"); fin=fopen("","r+"); while((c=fgetc(fin))! =EOF) fprintf(fout,"%c",c); fclose(fin); fclose(fout); return0; } 实验步骤: 1.概念两个文件,一个为只读模式,一个为只写模式。 2.将只读模式的文件中的内容复制到只写模式的文件中,这一切进程都通过函数完成。 调试及编译进程: 测试数据: 任意输入一段文字 以下是中预先留有的文本内容。 以下是在中的复制内容。 显现的不足及修改: 无运行结果: 输出预期的结果。 (十三)教材66面源程序1改错 源程序的错误在于没有使指针有具体的指向,使指针悬挂。 修改后程序如下: #include<> intmain() { floata[10],*p=a; inti; for(i=0;i<10;i++) scanf("%f",p+i); printf("%f",*p); return0; } 调试及
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 实验 第六 上机 报告