1、C语言程序设计实验第六次上机实验报告7.第六次实验C语言程序设计 实验报告专业 计算机科学与技术 班级 信安1302班 日期 2014.5.24 成绩 实验组别 第 6 次实验 指针实验&结构与联合实验 指导教师 学生姓名 学号 同组人姓名 实验名称 指针实验&结构与联合实验 7.1实验目的1.熟练掌握指针的说明、赋值、使用。2.掌握用指针引用数组的元素,熟悉指向数组的指针的使用。3.熟练掌握字符数组与字符串的使用,掌握指针数组及字符指针数组的用法。4.掌握指针函数与函数指针的用法。5.掌握带有参数的main函数的用法。6.熟悉和掌握结构的说明和引用,结构的指针,结构数组,以及函数中使用结构的
2、方法。7.掌握动态储存分配函数的用法,掌握自引用结构和单向链表的创建,遍历,结点的增删,查找等操作。8.了解字段结构和联合的用法。7.2实验内容(一)设计一个函数reverse(a, n),将一维数组a的值逆置。如,逆置前,A:20、10、90、59、60、80、70,逆置后,A:70、80、60、59、90、10、20。源程序如下:shangji6chengxu29#include void sort(int *a,int n);int main() int x100,n,i,*p=x; printf(enter n:); scanf(%d,&n); printf(enter numbers
3、:); for(i=0;in;i+) scanf(%d,p+i); sort(x,n); for(i=0;in;i+) printf(%4d,*(p+i); return 0;void sort(int *a,int n) int i,j,t; for(i=0;in-1;i+) for(j=0;jn-1-i;j+) t=*(a+j);*(a+j)=*(a+j+1);*(a+j+1)=t; 实验步骤:1. 定义一个数组存放数据,实现数据的输入和存储。2. 定义一个子函数进行排序,用把数据两两交换来实现。调试及编译过程:测试数据:任意选取一组数据:出现的不足及修改:无 运行结果:出现预期的结果。(
4、二)设计一个函数BubbleSort(a, n),采用冒泡排序算法,实现一维数组的整数进行排序的功能。源程序如下:shangji6chengxu30#include void BubbleSort(int *a,int n);int main() int a100,n,i; printf(enter n:); scanf(%d,&n); printf(enter numbers:); for(i=0;in;i+) scanf(%d,&ai); BubbleSort(a,n); for(i=0;in;i+) printf(%6d,ai); return 0;void BubbleSort(int
5、 *a,int n) int t,*p=a,i,j; for(i=0;in-1;i+) for(j=0;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。源
6、程序如下:shangji6chengxu31#include int find(int *a,int n,int x);int main() int a100,n,x,i; printf(enter n:); scanf(%d,&n); printf(enter numbers:); for(i=0;in;i+) scanf(%d,(a+i); printf(enter x:); scanf(%d,&x); if(find(a,n,x)=-1) printf(not found!); else printf(the number is %d,find(a,n,x); return 0;int
7、find(int *a,int n,int x) int i,*p=a; for(i=0;in;i+) if(*(p+i)=x) return (i); return (-1);实验步骤:1. 定义一个数组实现数据的输入和存放。2. 定义一个子函数实现查找的功能并在主函数中调用该函数。调试及编译过程测试数据:任意选取一组数据,后来输入的数能被找到测试数据:任意选取一组数据(后来输入的数不能被找到)出现的不足及修改:无 运行结果:出现预期的结果(四)输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。如果有多对数字的和等于输入的数字,输出任意一对即可。
8、例如,输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此,输出4和11。源程序如下:shangji6chengxu32#include int main() int a100,n,x,i,j; printf(enter n:); scanf(%d,&n); printf(enter numbers:); for(i=0;in;i+) scanf(%d,a+i); printf(enter x:); scanf(%d,&x); for(i=0;in;i+) for(j=0;jn;j+) if(*(a+i)+*(a+j)=x) printf(%d+%d=%d,*(a+i),*(
9、a+j),x); return 0; return 0;实验步骤:1 定义一个数组实现数据的输入和存放。2 用两层循环逐一检验,遇到满足条件的即输出。调试及编译过程:测试数据:任意选取一组数据:出现的不足及修改:无 运行结果:出现预期的结果。(五)检验并打印魔方矩阵在下面的55阶魔方矩阵中,每一行、每一列、每一对角线上的元素之和都是相等的,试编写程序将任意55阶矩阵中的元素存储到一个二维整型数组中,然后检验其是否为魔方矩阵,并将其按如下格式显示到屏幕上。17241815235714164613202210121921311182529源程序如下:shangji6chengxu33#includ
10、e int main() int a55,i,j,s=0,s1=0,s2,s3; printf(enter numbers:); for(i=0;i5;i+) for(j=0;j5;j+) scanf(%d,*(a+i)+j); for(i=0;i5;i+) for(j=0;j5;j+) printf(%4d,*(*(a+i)+j); printf(n); for(i=0;i5;i+) s+=*(*(a+i)+i); for(i=0;i5;i+) s1+=*(*(a+i)+4-i); if(s=s1) for(i=0;i5;i+) s2=0; for(j=0;j5;j+) s2+=*(*(a+
11、i)+j); if(!(s2=s) printf(not!); return 0; for(i=0;i5;i+) s3=0; for(j=0;j5;j+) s3+=*(*(a+j)+i); if(!(s3=s) printf(not!); return 0; else printf(not!); return 0;实验步骤:1.定义数组实现数据的输入和存放。2.分别对二维矩阵的行列主次对角线进行求和运算,判断是否为魔方矩阵。调试及编译过程:测试数据:输入一组魔方矩阵的数据出现的不足及修改:无 运行结果:输出预期结果。(六)编写一个函数swap(x,y),分别采用3种不同的算法实现两个变量值的交
12、换功能。源程序1如下:shangji6chengxu34shangji6chengxu34shangji6chengxu34#include void swap(int *x,int *y);int main() int a,b; scanf(%d%d,&a,&b); swap(&a,&b); printf(%dt%d,a,b); return 0;void swap(int *x,int *y) int t; t=*x; *x=*y; *y=t;源程序2如下:#include void swap(int *a,int *b);int main() int x,y; scanf(%d%d,&x
13、,&y); swap(&x,&y); printf(%dt%d,x,y); return 0;void swap(int *x,int *y) *x=(*x)+(*y); *y=(*x)-(*y); *x=(*x)-(*y);源程序3如下:#include void swap(int *x,int *y);int main() int x,y; scanf(%d%d,&x,&y); swap(&x,&y); printf(%dt%d,x,y); return 0;void swap(int *x,int *y) *x=*x*y; *y=*x*y; *x=*x*y;实验步骤:1 选取三种合适的方
14、法进行交换。2 因为要用到子函数,于是将这三种方法中的参数均改为指针操作。调试及编译过程:测试数据:任意选取一组数据测试数据:将以上数据交换输入出现的不足及修改:无 运行结果:出现预期的结果。(七)设计一个计算MAXa,b的程序,要求a和b,以命令行中参数形式给出。源程序如下:shangji6chengxu35#includeint main(int argc,char *argv) int a=atoi(argv1); int b=atoi(argv2); if(ab) printf(%d,a); else printf(%d,b); return 0;实验步骤:直接进行比较并输出较大值调试
15、及编译过程:测试数据:任意选取一组数据测试数据:交换上面两数出现的不足及修改:刚开始没有将字符型换成整型导致错误,后来使用atoi函数解决。运行结果:改正后输出预期的结果。(八)设计一个函数create(L),其功能是建立一个“先进后出”的链表。源程序如下:shangji6chengxu36#include #include struct List int i; struct List * next;typedef struct List mylist;int main(int argc, const char * argv) struct List * h = NULL; mylist *
16、p; h = (mylist*)malloc(sizeof(mylist); h-i = 0; h-next = NULL; int n; scanf(%d,&n); while (n) int temp; scanf(%d,&temp); p = (mylist*)malloc(sizeof(mylist); p-i = temp; p-next = h; h = p; -n; while(h&(h-i!=0) printf(%8dt,h-i); h=h-next; return 0;实验步骤:1. 定义结构型的变量,创建链表。2. 循环定义链表的起点和终点,定义结构的数据域。3. 输出。调
17、试及编译结果:测试数据:任意选取一组数据测试数据:将上述数据反向输入出现的不足及修改:无 运行结果:输出预期的结果。(九)设计一个函数insert(L,i,e),其功能是在链表L中的第i个元素之间插入新元素e。源程序如下:shangji6chengxu37#include #include #include struct List int i; struct List * next;typedef struct List mylist;mylist* insert(mylist * L ,int i,int e) mylist * pri =L; int j; for (j = 1; j ne
18、xt; mylist * p = (mylist*)malloc(sizeof(mylist); p-i = e; p-next = pri-next; pri-next = p; return L;int main(int argc, const char * argv) struct List * h = NULL; int insert_number,locate; printf(enter the number you want to insert in:); scanf(%d,&insert_number); printf(enter the locate you want to i
19、nsert:); scanf(%d,&locate); mylist * p; h = (mylist*)malloc(sizeof(mylist); h-i = 0; h-next = NULL; int n; printf(enter the number of list:); scanf(%d,&n); while (n) int temp; scanf(%d,&temp); p = (mylist*)malloc(sizeof(mylist); p-i = temp; p-next = h; h = p; -n; h = insert(h,locate,insert_number);
20、mylist * temp = h; while (temp&(temp-i!=0) printf(%d ,temp-i); temp = temp-next; return 0;实验步骤:1. 根据上一个实验写出创建链表的过程。2. 定义子函数进行数据的插入,在此过程中,将要插入的数放入一个新的结构性变量中,并将此结构性变量的指针域指向原链表中的插入位置,使链表按原顺序继续下去。调试及编译过程:测试数据:任意选取一组数据测试数据:任意选取一组数据出现的不足及修改:无 运行结果:出现预期的结果。 (十)设计一个函数delete(L,i),其功能是删除在链表L中的第i个元素。源程序如下:shan
21、gji6chengxu38#include #include #include struct List int i; struct List * next;typedef struct List mylist;mylist* insert(mylist * L ,int i) mylist * pri =L; int j; for (j = 1; j next; pri-next=pri-next-next; return L;int main(int argc, const char * argv) struct List * h = NULL; int locate; printf(ent
22、er the locate you want to delete:); scanf(%d,&locate); mylist * p; h = (mylist*)malloc(sizeof(mylist); h-i = 0; h-next = NULL; int n; printf(enter the number of list:); scanf(%d,&n); while (n) int temp; scanf(%d,&temp); p = (mylist*)malloc(sizeof(mylist); p-i = temp; p-next = h; h = p; -n; h = inser
23、t(h,locate); mylist * temp = h; while (temp&(temp-i!=0) printf(%d ,temp-i); temp = temp-next; return 0;实验步骤:1. 根据第一个创建链表的程序创建链表。2. 定义一个子函数完成删除第i个元素的功能。调试及编译过程:测试数据:任意选取一组数据测试数据:任意选取一组数据出现的不足及修改:无 运行结果:出现预期的结果。(十一)设计一个程序,利用链表输出约瑟夫环的结果序列。注释:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m
24、的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。源程序如下:shangji6chengxu39#include #include struct list int data; struct list *next;struct list *create(int n) int i=1; struct list *head=NULL,*tail; head=(struct list *)malloc(sizeof(struct list); head-data=i; tail=head; while(n-1) tail-next=(struc
25、t list *)malloc(sizeof(struct list); tail=tail-next; tail-data=+i; n-; tail-next=head; return head;int main() int n,m,t=0,k=0; struct list *mylist=NULL,*mylist1=NULL; printf(enter the number of people:n); scanf(%d,&n); printf(enter m:n); scanf(%d,&m); mylist=create(n); mylist1=mylist; while(t!=n-1)
26、k+; if(k=m) mylist1-next=mylist1-next-next; t+; k=0; mylist1=mylist; mylist=mylist-next; printf(the last number is %d,mylist-data); return 0;实验步骤:1. 创建链表,将链表中各部分的数据域分别设为1,2,n,其中n又键盘端输入。2. 输入人数和需要删除的数,用到上一个程序的思想,在将要删除的数前,将上一个指针直接指向下一个而不指向该数。调试及编译过程:测试数据:任意输入一组数据测试数据:任意输入一组数据出现的不足及修改: 刚开始没有注意到若直接在删除的过程中采用一个变量进行处理,则实际上去掉的是该数的下一个数,因此在修改的过程中加上了另外一个变量,使后来加上的变量指向当前变量的前一个,利用它进行删除工作,而当前变量仍起到控制循环的作用。运行结果: 修改后能输出预期的结果。(十二)设计一个程序完成文件的复制(COPY)功能。源程序如下:shangji6chengxu40#include #include int main() char c; FILE *fin,*fout; fout=fopen(out.txt,w+); fin=fopen(in.txt,r+
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1