C语言与数据结构实验指导_第1页
C语言与数据结构实验指导_第2页
C语言与数据结构实验指导_第3页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Harbin Institute of TechnologyC 语言与数据结构实验指导书刘梅 索莹 田文龙哈工大电子与信息工程学院电子工程系1 PAGE PAGE 44实验 1 实验平台一、实验目的MicrosoftVisualC+6.0集成环境的使用方法。CMicrosoftVisualC+6.0开发环境中的编辑、编译、链接和运行全过程二、实验内容双击桌面应用程序图标或云兄“开始”菜单程序组中的 Microsoft Visual C+6.0 双击桌面应用程序图标或云兄“开始”菜单程序组中的 Microsoft Visual C+6.0 VC+,如图所示图 1.1 VC+初始界面方法 1:单机

2、工具栏的“新建文本文件方法 1:单机工具栏的“新建文本文件”按钮 ,打开文本文件编辑界面如下图所示图 1.2 文本文件编辑界面2“文件”-“新建”“文件”C+ Source File 文件C “确定”1.4 所示。C“.c”,名为“.cpp”C+文件。编辑源文件1.2 1.5 21.4 C 所示。图 1.3 新建文件图 1.4 C 源程序文件编辑界面图 1.5 文本文件编辑界面编辑源文件图 1.6 C 源程序编辑界面编辑源文件保存源文件源文件编辑结束后,执行“文件”-“保存”命令保存文件,文本文件编辑界面中编辑的源文件保存时必须在文件名后加上扩展名“.c”,否则保存的是扩展名为txt 的文本文

3、件,不能编译运行。组件文件执行“组建”-“组建”F7 Build 按钮,可以“组建”-“编译快Ctrl+F7)命令编译文件,再执行“组建”-“组建”(F7)命令链接文件。VC+有工作区的要求,所以组建时,系统提示需要建立工作区,如图1.7“是”1.8所示。1.7 提示建立工作区1.8 组建源程序结果1.8证错误(error(s))0运行文件执行“组建”-“执行”命令或直接按Ctrl+F5 键或单机工具栏BuildExecute 按钮, 可以运行程序, 结果显示在用户输出窗口中,如图 1.9 所示。图 1.9 用户输出窗口注意:CVC+,CVC+自动建立工作区。运行“加法”程序在 VC+环境中建

4、立并编辑实现加法运算的源程序,然后组建该文件,结果如图 1.10 所示。运行该文件,并按要求输入数据,得到运行结果。图 1.10 VC+环境下组建“加法”程序后的界面实验 2 顺序结构程序设计一、实验目的C 程序的全过程。掌握各种格式说明符的使用方法。scanf()printf()的用法。getchar()putchar()二、实验内容格式说明符的使用。创建并编辑输入输出各个类型数据的程序,分析各个格式说明符的作用。getchar()printf()scanf()putchar()函数显示。a、b、c,则该三角形的面积公式为:09okms (a b c ) / 2 。r=2.5h=5.0sca

5、nf()三、实验指导(参考教材)“输入输出字符”程序1)编程分析需要定义字符型变量存放输入的数据;scanf()2)参考程序#include stdio.h main()char a,b,c;printf(1.Input a character:n); a=getchar();c=getchar();c=getchar();printf(The character is:%cnn,a);printf(2.Input a character:n); scanf(%c,&b);printf(The character is:); putchar(b);putchar(n);“求三角形面积”程序编程

6、分析该问题的解决过程如下:定义变量定义变量输入三角形三边边长计算面积输出结果需要定义实型(float double)变量存放相应的数据;sqrt(),该函数原型包含在头文件math.h中,因此需要在程序开始将头文件包含进来;根据实际情况确定各个变量在输出时的宽度和小数位数。参考程序#include “stdio.h” #include “math.h” main()float a,b,c,s,area; printf(“Input a,b,c:n”);scanf(“%f ,%f,%f”,&a,&b,&c); s=(a+b+c)/2;area=sqrt(s*s(s-a)*(s-b)*(s-c);

7、printf(“a=%7.2f,b=%7.2f,c=%7.2fn”,a,b,c); printf(“area=%9.2fn”,area);3. “圆柱体”程序编程分析该问题的解决过程如下:定义变量定义变量输入半径和高计算表面积和体积输出结果需要定义实型(float double)变量存放相应的数据;计算过程中需要用到常数,为使用方便,在程序开始用宏定义命令 define将常数3.14159(即)用PI表示;输出数据时根据要求确定各个变量的宽度和小数位数(10.2 2)参考程序#include “stdio.h” #define PI 3.14159 main()float r,h; doubl

8、e s,v;printf(“Input the value of r and h:n”); scanf(“%f ,%f”,&r,&h); s=2*PI*r*r+2*PI*r*h;v=PI*r*r*h;printf(“The value of s is:%10.2fn”,s); printf(“The value of v is:%10.2fn”,v);实验 3 选择结构程序设计一、实验目的1.学会使用逻辑表达式表示条件的方法。2.掌握 switch 语句的用法。二、实验内容1.switch 语句的应用动完成运算后输出结果。三、实验指导1.switch 语句的应用1)编程分析四则运算共有加+、减

9、-、乘*、除/4switch语句。示信息。当使用提示信息时,switchdefault子句。参考程序#include “stdio.h” void main()float x,y; char p;scanf(“%f,%f”,&x,&y); p=getchar();switch(p)case +:printf(“%f+%f=%fn”,x,y,x+y);break; case -:printf(“%f-%f=%fn”,x,y,x-y);break;case *:printf(“%f*%f=%fn”,x,y,x*y);break; case /:printf(“%f/%f=%fn”,x,y,x/y)

10、;break; default:printf(“Input is error!n”);程序调试调试程序时,+、-、*、/及非四则运算符的情况都应予以调试。实验 4 循环结构程序设计一、实验目的通过本实验,加深对循环控制结构有关概念的理解。二、实验内容1!+2!+3!+n!的值。12 个黄色,从中任意取n2n1,求出所有不同的取法。三、实验指导 11)编程分析(1)本实验内容为求解阶乘问题。(2)求 n!用一个循环即可实现。(31!+2!+3!+n!的值,需要在求阶乘程序之外增加一个外重循环。2)参考程序#include “stdio.h” void main()long int s=1,t;

11、int i,j,n; printf(“n=”);scanf(“%d”,&n); for(i=2;i=n;i+)for(t=1,j=1;j=i;j+) t*=j;s+=t;printf(“s=%ldn”,s);3)程序调试(1)输入一个不大的正整数,分析程序执行结果。(2)输入一个零或者负数,分析程序执行结果。(3)输入一个很大的正整数,分析程序执行结果。(4)当程序结果不符合要求时,修改程序,直到对任何输入数据都能输出正确的执行结果,或者给出一个明确的提示信息。例如,当输入数据非法时,给出一个错误的提示信息。2.取彩球问题编程分析参考程序#incude “stdio.h” void main(

12、)int n,white,red,yellow,count=0; printf(“Input”);scanf(“%d”,&n); printf(“white redyellown”);for(white=1;white=3;white+) for(red=1;red=1&yellow=4)printf(“%5d%5d%5dn”,white,red,yellow); count+;printf(“Total:%dn”,count);程序调试(12 12 (22 12 的整数值,查看并分析程序结果。(32n1实验 5 数组一、实验目的了解数组的特点,掌握一维数组的定义、初始化及其使用方法。掌握二维

13、数组的定义、初始化及其使用方法。二、实验内容鞍点问题找出来。选择法排序问题10 三、实验指导鞍点问题1)编程分析对二维数组按行处理。则找到一个鞍点。2)参考程序#define M 3#define N 4 void main()int aMN,i,j,k;printf(“请输入二维数组的数据:n”); for(i=0;iM;i+)for(j=0;jN;j+) scanf(“%d”,&aij);for(i=0;iM;i+)k=0;for(j=1;jaik)k=j;for(j=0;jM;j+) if(ajkaik)break; if(j=M)printf(“%d %d %dn”,aik,I,k);

14、3)程序调试输入有鞍点的一组数据,查看并分析程序的运行结果。例如:9802154060-60891210-310189输入没有鞍点的一组数据,查看并分析程序的运行结果。例如:9802154060-601891210-310189选择法排序问题编程分析换的次数越多,效率越低。选择法的基本思路是:第一趟,从所有元素中选择一个最小元素后放在a1a1M-1法少得多。参考程序#define M 10 #include “stdio.h” void main()int aM,n,i,j,min,temp;printf(“for(i=0;iM;i+)scanf(“%d”,&ai); printf(“for(

15、i=0;iM;i+)printf(“%d”,ai); for(i=0;iM-1;i+)min=i; for(j=i+1;jM;j+)if(ajamin) min=j;temp=ai; ai=amin; printf(“n for(i=0;iM;i+)printf(“%d”,ai);程序调试(110 个整数,查看并分析程序执行结果。(210 (3)运行程序,输入一组升序排列的有序整数,查看并分析程序执行结果。(4)运行程序,输入一组降序排列的有序的整数,查看并分析程序执行结果。实验 6 函数一、实验目的掌握自定义函数的一般结构及定义函数和函数调用的方法。维数组问题的函数定义及调用方法。二、实验内

16、容1.选择法排序函数的定义及使用20 个整数的排序。三、实验指导1. 1)编程分析这是一维数组作函数参数的问题。nselect()select()函select()void 型。2)参考程序#define M 20 #include “stdio.h”void select(int,inta); voidmain()/*函数声明*/int aM,n,i;printf(“for(i=0;iM;i+)scanf(“%d”,&ai); printf(“for(i=0;iM;i+)printf(“%d”,ai); select(M,a);printf(“n 排序后数列:n”); for(i=0;iM;

17、i+)printf(“%d”,ai);void select(int n,int a)int I,j,min,temp; for(i=0;in-1;i+)min=i; for(j=i+1;jn;j+)if(ajamin) min=j;temp=ai; ai=amin; amin=temp;3)程序调试20 个整数,查看并分析程序执行结果。select(M,a)select(M,&a0),用(1)中使用的数据运行程序,查看并分析程序执行结果。select(M,a)select(M,a0),用(1)中使用的数据运行程序,查看并分析程序执行结果。select(M,a)select(a,M),用(1)

18、中使用的数据运行程序,查看并分析程序执行结果。实验 7 指针一、实验目的掌握指针变量的定义和基本使用方法。熟悉指针和一维数组的关系,熟练使用指针变量访问一维数组元素。熟练掌握用简单指针变量作函数的参数时函数的定义和调用方法。函数定义和调用。二、实验内容1.用指针法在一维有序数组中插入数据如下是具有 10 个整数的升序数列,存储在一维数组中,要求在其中插入任意一个整数后数列仍然有序。数列:10,20,30,40,50,60,70,80,90,99。2.数据插入函数编写在一维有序数组中插入数据的函数 insert(),并调用该函数实现数据插入。要求插入数据后的数组仍然有序。三、实验指导用指针法在一

19、维有序数组中插入数据编程分析按照下标访问数组元素的方法,用指针解决该问题。2)参考程序#define M 10 #include “stdio.h” void main()int aM+1=10,20,30,40,50,60,70,80,90,99;int i,n,*p,*q;printf(“请输入要插入的数据:n”); scanf(“%d”,&n);aM=n;/*将要插入的数据放在数组的最后位置*/for(p=a,i=0;i=M;i+) if(n=p;q-)/*元素后移*/*(q+1)=*q;*p=n;/*插入数据*/printf(“n 插入数据后的数列:n”); for(p=a,i=0;i

20、=M;i+)printf(“%d”,*(p+i);数据插入函数1)编程分析1 需对数据的插入处理部分函数化即可。insert()intint int 型指针形参,它将指向一个一维数组。insert()数组数据个数;第三个实参是数组名,即数组首地址。参考程序#define M 10 #include “stdio.h”void insert(int,int,int *); /*函数声明*/void main()int aM+1=10,20,30,40,50,60,70,80,90,99;int i,x;printf(“请输入要插入的数据:n”); scanf(“%d”,&x);insert(x,

21、M,a);/*M aprintf(“n插入数据后的数列:n”);for(i=0;i=M;i+) printf(“%d”,ai);void insert(int x,int ,n,int* p)int *t,*q,i;t=p+n;/*将要插入的数据放在数组的最后位置*/for(i=0;i=n;i+)/*p*/if(x=tq -)/*元素后移*/*(q+1)=*q*t=x/*插入数据*/实验 8 线性表的顺序存储系统维护一、实验目的掌握线性表的顺序存储的定义和基本使用方法。掌握线性表的顺序存储存储单元的排列特点。关的函数定义和调用。二、实验内容建立一个顺序表。switch case 语句构成主菜单

22、,再根据提示进行相应操作。C三、实验指导1)编程分析在线性表的建立时,可直接用数组赋初值;到时返回-1;修改功能是在查找的基础上,将找到的值加以修改;能插入,当线性表不满时,插入数据;位置错误,其他情形进行删除操作。2)参考程序#include #define max 20 intlast=20;int nodemax=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19;int find(int find_num);void insert(int insert_pot,int insert_num); void delet(int delete_

23、pot);void modify(int renew_pot,int renew_num); void list_printf();int main()printf(please enter number:n1,查找n2,删除n3,修改n4,插入n5,退出系统n);int flag=0;int find_num,delete_pot; int renew_pot,renew_num; int insert_pot,insert_num; int findresult;int choice; doscanf(%d,&choice); switch(choice)case 1:printf(ple

24、ase enter the find_numn); scanf(%d,&find_num);findresult =find(find_num); printf(findresult=%dn, findresult); break;case 2:printf(please enter the delete_pot n); scanf(%d,&delete_pot);list_printf(); printf(n); delet(delete_pot); printf(after deleten); list_printf();break; case 3:printf(please enter

25、the renew_pot and renew_num n); scanf(%d %d,& renew_pot,& renew_num); printf(before modifyn);list_printf();modify(renew_pot,renew_num); printf(after modifyn); list_printf();break; case 4:printf(please enter the insert_pot and insert_num n); scanf(%d %d,& insert_pot,& insert_num); printf(before inser

26、tn);list_printf();insert(insert_pot,insert_num); printf(after insertn); list_printf();break; case 5:flag=1; break;default:printf(input errorn); break;while(!flag); return(0);int find(int find_num)/*查找值为 find_num 的节点*/int k=0,findi; int flag=0; findi=0;while(klast-1| delete_pot 0) printf(wrong positi

27、on!n);elsefor(i= delete_pot;i= insert_pot-1;i-) nodei+1=nodei;nodep-1= insert_num; last=last+1;void list_printf()/*输出表的内容*/int i;for(i=0;i=last-1;i+) printf(%d ,nodei);printf(n);实验 9 线性表的链式存储系统维护一、实验目的掌握线性表的链式存储的定义和基本使用方法。掌握线性表的链式存储存储单元的排列特点。关的函数定义和调用。二、实验内容建立一个链表。switch case 语句构成主菜单,再根据提示进行相应操作。C三、

28、实验指导1)编程要求(1)以循环的方式建立一个有表头的链表; (2)遍历链表,并计算链表结点个数;找到”;在插入功能中要实现:在某个特定的结点之后插入一个结点;2)参考程序#include #includestruct Nodestruct Nodeint data;struct Node *next;int data;struct Node *next;void Build(struct Node * /*建立一个带头结点的单链表*/int n;struct Node *p,*q; p=L;printf(请输入 n 和 n 个数据元素:n);scanf(%d,&n);while(n-)q=(

29、 struct Node *)malloc(sizeof(struct Node); scanf(%d,&q-data);q-next=NULL; p-next=q;p=q;void Print(struct Node *L)/*计算单链表的长度,然后遍历输出单链表*/int num=0; struct Node * p; p=L-next; while(p)num+;printf(%d ,p-data); p=p-next;printf(n 长度为%d:n,num);void Tips()/*选择函数*/printf(按数字键选择相应操作n); printf( 输出单链表及其长度:n); p

30、rintf( x 的前驱结点printf( x 的结点:n);printf( y x 的结点printf( 退出:n);void Find(struct Node * L,intx)/*查找值为 x 的直接前驱结点p*/struct Node * p; p=L;while( p-next &p-next-data!=x) p=p-next;if(p-next)printf(%d 的前驱结点为:%dn,x,p-data);elseprintf(没找到!n);void Delete(struct Node * L,intx)/*删除值为 x 的结点*/struct Node * p,*q; p=L

31、;while( p-next &p-next-data!=x) p=p-next;if(p-next)elseif(p-next-next)q=p-next;p-next=q-next; free(q);q=p-next;next=NULL;free(q);printf(删除成功!n);elseprintf(链表中没有%dn,x);void Insert(struct Node *L, struct Node *x,int y)/*yx 的结点struct Node*p;p=L;while(p-next!=NULL& p-data!=y) p=p-next;if(p-data!=y)elsep

32、rintf(No Find Y !);x-next= p-next; p-next=x;printf(插入成功!n);int main()int choice,x,y,flag; struct Node * L,*p;L=(struct Node *)malloc(sizeof(struct Node);L=(struct Node *)malloc(sizeof(struct Node);L-next=NULL; L-data=-1; Build(L);Tips();scanf(%d,&choice); while(choice)/*建立一个带头结点的单链表*/*选择函数*/switch(c

33、hoice)case 1:Print(L);/*break;case 2:printf(X:n); scanf(%d,&x);Find(L,x);/*查找*/break; case 3:printf(请输入要删除的元素 X:n);scanf(%d,&x);break;case 4:/*删除*/p=(struct Node *)malloc(sizeof(struct Node);printf(X Y(X,Y)n); scanf(%d,%d,&x,&y);p=(struct Node *)malloc(sizeof(struct Node);p-data=x;Insert(L,p,y);/*插入

34、break;default:break;Tips(); /*下一步操作选择*/return 0;实验 10 二叉树的遍历一、实验目的理解二叉树的原理,掌握二叉树的存储方法。掌握二叉树前、中、后序顺序遍历的过程。二、实验内容输入数据建立一棵二叉树。输出其前、中、后序遍历的结果,分别用递归与非递归方法实现。C三、实验指导 1)编程分析据项,当输入为#时,所对应的节点为空;2)参考程序#include #include #define MAX 100 structnodeint data;struct node *llink; struct node *rlink;*shutree=NULL;voi

35、d preorder(struct node *t); int main()struct node *createtree(struct node *tree); shutree=createtree(shutree); preorder(shutree);return(0);void preorder(struct node *tree)struct node*p;struct node*sMAX; int top;top=-1; p=tree; dowhile(p!=NULL)printf( %c,p-data); if(p-rlink!=NULL)top=top+1; stop=p-rl

36、ink;p=p-llink;if(top!=-1)p=stop; top=top-1;while(p!=NULL | top!=-1);struct node *createtree(struct node *tree)char ch; scanf(%c,&ch); if(ch=) tree=NULL;elsetree=(struct node *)malloc(sizeof(struct node); tree-data=ch;createtree(tree-llink);createtree(tree-rlink);return(tree);前序递归遍历二叉树void PreOrder(s

37、truct node *tree)struct node *p; p=tree; if(p!=NULL)printf(%c , root-data); PreOrder(p-lchild); PreOrder(p-rchild);中序非递归遍历二叉树void Inorder(struct node struct node*p;struct node*sMAX; int top;top=-1; p=tree; dowhile(p!=NULL)if(p-rlink!=NULL)top=top+1; stop=p;p=p-llink;if(top!=-1)p=stop;printf( %c,p-da

38、ta); top=top-1;p=p-rlink;while(p!=NULL | top!=-1);中序递归遍历二叉树void InOrder(struct node *tree)struct node *p; p=tree; if(p!=NULL)InOder(p-lchild); printf(%c , root-data); InOrder(p-rchild);后序非递归遍历二叉树 void postorder(struct node struct node*p;struct node*q=NULL; struct node*sMAX; int top;top=-1; p=tree; d

39、owhile(p!=NULL)if(p-rlink!=NULL)top=top+1; stop=p-rlink;p=p-llink;p= stop; top=top-1;if(p-rlink=NULL| p-rlink=q)elseprintf( %c,p-data); q=p;p=NULL;p=p-rlink;while(p!=NULL | top!=-1);后序递归遍历二叉树void PostOrder(struct node *tree)struct node *p; p=tree; if(p!=NULL)PostOrder(p-lchild); PostOrder(p-rchild);

40、 printf(%c , root-data);实验 11 二叉排序树系统维护一、实验目的掌握二叉排序树定义和基本使用方法。掌握二叉排序树存储数据的排列特点。数定义和调用。二、实验内容输入数据自行建立一棵二叉排序树。switch case 语句构成主菜单, 再根据提示进行相应操作。C三、实验指导1)编程分析建立完成;并打印“没找到”;子女,是否有双亲;2)参考程序#include #include #include #define MAX 9int aMAX; struct nodeint data;struct node *llink; struct node *rlink;*shutree

41、=NULL,*f,*fp; int main()int n,i,k,x,y; int flag1=0;struct node *find(struct node*tree,intx);/*查找*/struct node *findparents(struct node *tree,int x); struct node *insertree(struct node *tree,int x);/*查找双亲*/*插入*/struct node *detree(struct node *t,struct node *f,struct node *p); /*删除*/void preorder(struct node *tree); printf(input datan);for(i=0;i MAX;i+)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论