杭电软件技术基础实验报告
- 格式:docx
- 大小:517.33 KB
- 文档页数:25
学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:实验二栈和队列的基本操作一、实验目的1.掌握栈与队列的数据类型描述及特点;2.掌握栈和队列的存储;3.掌握栈的顺序和链式存储存表示与入栈、出栈操作的程序实现;4. 掌握队列的链式存储表示与入队、出队基本操作算法实现。
二、实验用软件和工具实验软件 VC++ 6.0三、实验步骤1.根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等),定义一个顺序栈和链栈结构体(队列结构体)。
2.利用入栈功能保存数据。
3.利用出栈删除弹出栈内信息。
4.根据队列数据结构,分别建立链队列和循环队列,并完成其上的基本操作(出入队列等),利用入队功能保存数据。
5.利用出队删除队列信息。
四、实验程序与程序运行结果顺序栈程序:sxz.h#include <iostream>using namespace std;template <class T>class sq_Stack{private:int mm;int top;T *s;public:sq_Stack(int);void prt_sq_Stack();void ins_sq_Stack(T x);T del_sq_Stack();T read_sq_Stack();学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:};template <class T>sq_Stack<T>::sq_Stack(int m){mm=m;s = new T[mm];top=0;return;}template <class T>void sq_Stack<T>::prt_sq_Stack(){int i;cout<<"top="<<top<<endl;for (i=top;i>0;i--) cout<<s[i-1]<<endl;return;}template <class T>void sq_Stack<T>::ins_sq_Stack(T x){if (top==mm){cout<<"overflow!"<<endl; return;}//存储空间已满,上溢错误top=top+1; //s[top-1]=x; //插入新元素return;}template<class T>T sq_Stack<T>::del_sq_Stack(){T y;if(top==0) //空,下溢错误{cout<<"underflow!"<<endl; return(0);}y=s[top-1]; //top=top-1; //长度减1return(y);}template<class T>T sq_Stack<T>::read_sq_Stack(){if(top==0) //空,下溢错误{cout<<"underflow!"<<endl; return(0);}return(s[top-1]);学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:}sxz.cpp#include "sq_Stack.h"int main(){sq_Stack<int> s(10);s.ins_sq_Stack(50);s.ins_sq_Stack(60);s.ins_sq_Stack(70);s.ins_sq_Stack(80);s.ins_sq_Stack(90);s.ins_sq_Stack(100);cout<<"第1次输出栈顶指针与栈中的元素:"<<endl;s.prt_sq_Stack();cout<<"输出栈顶元素:"<<s.read_sq_Stack()<<endl;cout<<"输出退栈的元素:"<<endl;cout<<s.del_sq_Stack()<<endl;cout<<s.del_sq_Stack()<<endl;cout<<s.del_sq_Stack()<<endl;cout<<"再输出栈顶指针与栈中的元素:"<<endl;s.prt_sq_Stack();return 0;}顺序队列程序:sq_Queue.h#include <iostream>using namespace std;template <class T>class sq_Queue{private:int mm;int front;int rear;int s;T *q;public:sq_Queue(int) ;void prt_sq_Queue();void ins_sq_Queue(T x);T del_sq_Queue();};template <class T>sq_Queue<T>::sq_Queue(int m){mm=m;q = new T[mm];front=mm;学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:rear=mm;s=0;return;}template <class T>void sq_Queue<T>::prt_sq_Queue(){int i;cout<<"front="<<front<<endl;cout<<"rear="<<rear<<endl;if ((s==0)&&(rear==front)){cout<<"队列空!"<<endl; return;}i=front;if (front>=mm)front=i%mm ;for (i=front; i<rear;i++){ cout<<q[i]<<endl;}return;}template <class T>void sq_Queue<T>::ins_sq_Queue(T x){if ((s==1)&&(rear==front)){cout<<"Queue_overflow!"<<endl; return;}//存储空间已满,上溢错误rear=rear+1; //if (rear==mm+1)rear=1;q[rear-1]=x; //插入新元素s=1;return;}template <class T>T sq_Queue<T>::del_sq_Queue(){T y;if (s=0){cout<<"Queue_underflow!"<<endl; return(0);}//存储空间已满,上溢错误front=front+1; //if (front==mm+1)front=1;y=q[front-1]; //插入新元素if (rear==front)s=0;return(y);}sq_Queue.cpp学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:#include "sq_Queue.h"int main(){sq_Queue<int> q(10);q.prt_sq_Queue();q.ins_sq_Queue(50);q.ins_sq_Queue(60);q.ins_sq_Queue(70);q.ins_sq_Queue(80);q.ins_sq_Queue(90);q.ins_sq_Queue(100);cout<<"输出队头与队尾指针及队列中的元素:"<<endl;q.prt_sq_Queue();cout<<"输出退队元素:"<<endl;cout<<q.del_sq_Queue()<<endl;cout<<q.del_sq_Queue()<<endl;cout<<q.del_sq_Queue()<<endl;cout<<"再输出队头与队尾指针及队列中的元素:"<<endl;q.prt_sq_Queue();return 0;}链栈:#include <iostream.h>#include <stdio.h>#include <stdlib.h>typedef char DateType;typedef struct node{DateType data;struct node* next;}LinkStack;LinkStack *top;void InitStack(){top=(LinkStack*)malloc(sizeof(LinkStack));top->next=NULL;top->data=0;cout<<"初始化链栈成功!";}void push(DateType x){LinkStack* s;s=(LinkStack*)malloc(sizeof(LinkStack));s->data=x;s->next=top;top=s;cout<<"入栈成功!";}学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:void pop(){LinkStack* s;s=top;if(s->next==NULL){cout<<"栈为空!";}else{top=s->next;free(s);cout<<"出栈成功";}}void readTop(){if(top==NULL){cout<<"栈为空!";}else{cout<<"栈顶元素为:"<<top->data;}}void showStack(){LinkStack* s;s=top;if(s->next==NULL){cout<<"栈为空!";}else{cout<<"链栈元素为:\n";cout<<"\t\t\t";while(s!=NULL){cout<<" "<<s->data;s=s->next;}}}void main(){int i,j;DateType x;while(j)学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:{cout<<"\n\n\n\n";cout<<"****************************************************************"<<endl; cout<<"*** 菜单:***"<<endl;cout<<"*** ①创建链栈②入栈③读栈顶元***"<<endl;cout<<"*** ④出栈⑤显示链栈元素⑥退出***"<<endl;cout<<"****************************************************************"<<endl; cout<<"请选择您所希望的操作:";cin>>i;if(i==1){InitStack();}else if(i==2){if(top==NULL){cout<<"请先初始化链表!";}else{cout<<"请输入要入栈的元素:";cin>>x;push(x);}}else if(i==3){pop();}else if(i==4){readTop();}else if(i==5){showStack();}else if(i==6){j=0;cout<<"程序结束\n";}}}链队列:#include <stdlib.h>#include<iostream.h>#define TRUE 1#define FALSE 0学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:typedef int QElemType;typedef struct LNode{QElemType data;struct LNode *next;}LNode , *LinkList;typedef struct{LinkList front;LinkList rear;}LinkQueue;//链式队列void InitQueue_L(LinkQueue &Q)//引用做参数,Q为结构体{//初始化队列Q.front=Q.rear=new LNode;if(!Q.front) {cout<<"存储分配失败!"<<endl; exit(1);}Q.front->next=NULL;}int IsEmpty(LinkQueue &Q){if(Q.front==Q.rear){return TRUE;}else{return FALSE;}}//创建队列,数据元素由键盘输入void CreateQueue_L(LinkQueue &Q){QElemType temp;LNode *p;cout<<"输入要插入的队列值(输入-1结束)"<<endl;cin>>temp;while(temp != -1){p=new LNode;p->data=temp;p->next=NULL;Q.rear->next=p;学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:Q.rear=p;cin>>temp;}cout<<"创建成功!"<<endl;}//入队操作int EnterQueue(LinkQueue &Q,QElemType x){//将数据元素x插入到队列Q中LNode *NewNode=new LNode;if(!NewNode) {cout<<"存储分配失败!"<<endl; exit(1);}if(NewNode!=NULL){NewNode->data=x;NewNode->next=NULL;Q.rear->next=NewNode;Q.rear=NewNode;cout<<"入队成功!"<<endl<<endl;return(TRUE);}else return(FALSE); //溢出}//出队操作int DeleteQueue(LinkQueue &Q,QElemType &x){//将队列Q的队头元素出队,并存放到x所指的存储空间中LNode *p;/*if(Q.front==Q.rear){cout<<"该队列为空!"<<endl;return(FALSE);}*/p=Q.front->next;x=p->data;Q.front->next=p->next; //队头元素p出队if(Q.rear==p) //如果队中只有一个元素p,则p出队后成为空队Q.rear=Q.front;free(p); //释放存储空间cout<<"出队成功!"<<endl<<endl;return(TRUE);}//队列长度int QueueLength_L(LinkQueue Q){int length=0;if(IsEmpty(Q)) cout<<"该队列为空!"<<endl;else学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:{LNode *p=new LNode;p=Q.front->next;while(p){length++;p=p->next;}}return length;}//输出队列元素void OutputQueue_L(LinkQueue Q){LNode *p=new LNode;if(!p) {cout<<"存储分配失败!"<<endl; exit(1);}if(Q.front==Q.rear) cout<<"该队列为空!"<<endl;else{p=Q.front->next;cout<<endl;cout<<"队列的元素依次为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl<<endl;}}QElemType SearchQueue(LinkQueue &Q,int &i){LNode *p=new LNode;if(!p) {cout<<"存储分配失败!"<<endl; exit(1);}//if(Q.front==Q.rear) cout<<"该队列为空!"<<endl;int j=1;p=Q.front->next;while(p&&j<i){j++;p=p->next;}return p->data;}学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩://销毁队列void DestroyQueue_L(LinkQueue &Q){while(Q.front){Q.rear=Q.front->next;delete Q.front;Q.front=Q.rear;}}void main(){int flag=1,select;LinkQueue Q;int x;while(flag){cout<<" ☆☆链式队列基本操作☆☆"<<endl;cout<<" ☆1.创建队列☆"<<endl;cout<<" ☆2.判断链队列是否为空☆"<<endl;cout<<" ☆3.队头元素出队☆"<<endl;cout<<" ☆4.新元素入队☆"<<endl;cout<<" ☆5.求队列长度☆"<<endl;cout<<" ☆6.输出队列元素☆"<<endl;cout<<" ☆7.查找第i个位置元素☆"<<endl;cout<<" ☆8.销毁队列☆"<<endl;cout<<" ☆9.其他键退出☆"<<endl;cout<<endl;cout<<"请选择操作:";cin>>select;switch(select){case 1:InitQueue_L(Q);CreateQueue_L(Q);OutputQueue_L(Q);break;case 2:if(IsEmpty(Q)) cout<<"该队列为空!"<<endl;else cout<<"该队列不为空!"<<endl;break;case 3:if(IsEmpty(Q)) {cout<<"队列为空!"<<endl; break;}学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:DeleteQueue(Q,x);OutputQueue_L(Q);break;case 4:if(IsEmpty(Q)) {cout<<"队列还未创建!"<<endl; break;}cout<<"输入要入队的元素x:";cin>>x;EnterQueue(Q,x);OutputQueue_L(Q);break;case 5:if(IsEmpty(Q)) {cout<<"队列还未创建!"<<endl; break;}cout<<"该链队列的长度为:"<<QueueLength_L(Q)<<endl<<endl;break;case 8:if(IsEmpty(Q)) {cout<<"队列还未创建!"<<endl; break;}DestroyQueue_L(Q);cout<<"销毁成功!"<<endl<<endl;break;case 7:cout<<"请输入要查找的位置i:";cin>>x;if(x<1||x>QueueLength_L(Q)) {cout<<"i值不合法!"<<endl; break;}cout<<"该元素为:"<<SearchQueue(Q,x)<<endl<<endl;break;case 6:OutputQueue_L(Q);break;default:flag=0;break;}}}试验运行结果如图:栈:学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:队列:链栈:学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:链队列:学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月25日成绩:五、实验心得与体会通过本次上机实验,我掌握了栈的顺序和链式存储存表示与入栈、出栈操作的程序实现,以及队列的链式存储表示与入队、出队基本操作算法实现。
软件技术实验报告软件技术实验报告实验序号一名称BVB的感性认识--BVB基本控件班级学号姓名实验内容及完成情况:实验内容:11)在屏幕上开辟一个窗口(文本框),窗口的上部放置一个标签,标签中显示:“欢迎使用0VisualBasic6.0中文版”。
窗口的下部有三个按钮,左边按钮中标有“开始显示”,中间按钮中标有“清屏”,右边按钮中标有“结束”。
当鼠标单击左边按钮时,文本框中显示“欲穷千里目,更上一层楼!”如果单击中间按钮,则清除文本框中显示的内容,单击右边按钮则程序结束。
22)单击“清屏”后,让光标出现在文本框中,此时往文本框中输入若干文字,例如“您好”,然后单击窗体,使得在窗体的指定位置上显示在文本框中输入的文字。
33)如果将11)中单击左边按钮后文本框中显示的“欲穷千里目,更上一层楼!”改为“白日依山尽,黄河入海流,欲穷千里目,更上一层楼!”此时文本框在一行中将显示不下所有文本,请试调整该文本框的“Multiline”属性,并将文本框纵向距离调整到可容纳两行以上文字。
此时再次执行程序,观察执行结果所发生的变化。
完成情况:顺利完成。
实验中遇到的问题及解决方法:实验中所涉及的知识及技术:文本框的双向作用(即输入与输出);窗体的双重作用(容器与输出);事件过程的编写;输入输出的简单实现;窗体、文本框、标签、命令按钮等基本控件的常用属性的动、静态设置等。
实验中的创新及功能扩充:实验收获与体会:备注:文章信息量很大!《软件开发技术基础》实验报告学院:XX学院班级:XX姓名:XX学号:XX《软件开发技术基础》实验报告实验名称:实验一顺序表的操作班级学号姓名第周星期节成绩一、实验目的:1、掌握顺序表结构的实现方式;2、掌握顺序表常用算法的实现;3、熟悉利用顺序表解决问题的一般思路;4、参照给定的顺序表的程序样例,验证给出的顺序表的常见算法,领会顺序表结构的优点和不足。
二、实验要求:1、掌握顺序表的特点及常见算法。
哈尔滨工程大学实验报告线性表对应元素相加实验名称:________________________________班级:________________________________学号:________________________________姓名:________________________________实验时间:________________________________成绩:________________________________指导教师:________________________________实验室名称:自动控制实验教学中心哈尔滨工程大学1.实验名称:线性表对应元素相加2.实验目的:1、掌握线性表的顺序存储方式2、熟练掌握对线性表元素的基本操作3.实验内容编写程序,将两个线性表中对应元素相加,线性表的长度要求可变,且不同;从键盘输入线性表的每个元素;和放在第三个线性表中,并显示。
线性表可用顺序存储(数组)实现,也可用链式结构。
4.实验环境:微机,vc6.05.实验设计过程6.实验结果分析1.程序实现了将两个线性表对应元素相加并存储到第三个线性表中。
2.程序利用线性表这一数据结构解决问题,通过本实验体会到了线性表的逻辑结构、存储结构和操作的深刻含义。
初步体会了线性表的应用需求。
3.1)在实验过程中,出现了XXXX情况,经过算法分析和代码检查,发现XXX存在问题,通过增加XX指令或调整算法,解决了xxx问题;2)XXXXXXYYY;4.通过本次实验,对算法设计、程序编写规范化XXX等问题有了一定的体会。
哈尔滨工程大学实验报告栈空间共享实验名称:________________________________班级:________________________________学号:________________________________姓名:________________________________实验时间:________________________________成绩:________________________________指导教师:________________________________实验室名称:自动控制实验教学中心哈尔滨工程大学1.实验名称:栈空间共享2.实验目的:1、理解栈类型的定义和操作特点,应注意栈空和栈满的判断条件2、理解栈空间共享的思想,掌握其实现方法3.实验内容编写程序,分别建两个堆栈,要求共享一连续空间(数组),输入一整数序列,将奇数和偶数分别存放在两个栈中,栈满后打印。
软件工程实习报告一、实习概况本次实习是我在某软件公司进行的为期三个月的实习。
实习期间,我被分配到了软件开发部门,参与了一个基于Java的项目的开发工作。
在这个项目中,我主要负责了功能模块的设计、编码和测试工作。
通过这次实习,我深入了解了软件开发的流程和方法,并学习到了许多实用的技术和工具。
二、实习内容1. 需求分析与设计在项目启动前,我参与了需求分析的工作。
通过与产品部门的沟通和确认,我明确了项目的功能需求和业务逻辑。
然后,我和团队成员们一起进行了系统设计。
我们使用UML建模工具进行了类图和时序图的绘制,以明确系统的结构和交互流程。
2. 编码与调试在需求分析和设计完成后,我开始了编码和调试工作。
我们项目采用了Java作为开发语言,所以我使用了Eclipse作为开发工具。
我根据需求文档和设计图,先编写了基础代码框架,然后逐步完善各个功能模块。
在编码过程中,我遵循了代码规范和设计原则,并积极参与了代码评审和重构工作。
3. 测试与集成在编码完成后,我进行了功能测试和集成测试。
我使用Junit进行了单元测试,并通过Mockito框架进行了模拟和验证工作。
在测试中,我发现了一些潜在的问题,并及时修复了它们。
在集成测试中,我与其他成员合作,测试了系统各个模块之间的交互和兼容性。
4. 文档编写与维护在实习期间,我还负责了部分文档的编写和维护工作。
我参与了用户手册和技术文档的编写,以便使用人员和开发人员可以更好地理解项目的功能和实现细节。
我还负责了项目的版本控制和文档管理工作,确保了项目资料的安全和可追溯性。
三、实习收获1. 技术能力的提升在实习期间,我得到了大量的实践机会,提升了自己的技术能力。
我学会了使用Eclipse进行项目开发,掌握了Java语言的常用库和框架,并熟悉了常见的设计模式和软件开发方法。
我还学会了使用Git进行版本控制和团队协作,以及使用Junit和Mockito进行测试和调试。
2. 项目管理和沟通能力的提升在实习期间,我参与了团队的讨论和决策,学会了如何与他人进行有效的沟通和协作。
软件基础实验报告计算机软件技术基础实验报告姓名:XXX班级:XX 0X01学号:30X05050XX实验一线性表:1、建立单向链表,表长任意;2、可交互输出单链表中的内容;3、编写算法计算出自己所建单链表的长度并输出;4、删除自己所建单链表中的第K个结点,并将剩余结点输出;5、将单链表倒排,输出结果。
源程序如下:#include<stdio.h>#include<malloc.h>typedef int datatype;typedef struct node //链表结构体//{datatype data;struct node *next;}linklist;linklist *creatlist() //建立链表//{int x;linklist *head, *s;head=NULL;printf("\n 输入链表数据:");scanf("%d",&x);while(x!=0){s=malloc(sizeof(linklist)); //为链表开辟一系列的空间//s->data=x;s->next=head;head=s;printf("\n 输入链表数据:");scanf("%d",&x);}return head;}void listContent(linklist *h) //输出链表内容//{linklist *s;s=h;while(s!=NULL){printf("%4d",s->data);s=s->next;}}int listLong(linklist *h) //计算链表长度//{int i=0;linklist *s;s=h;while(s!=NULL){i++;s=s->next;}return(i);}void DeleteNode(linklist *h,int k) //删除第K个节点//{int i=0;linklist *p,*q;p=h;if(k==1){h=h->next;free(p);}else{while(i<k-1&&p!=NULL){i++;q=p;p=p->next;}q->next=p->next;free(p);}}linklist *DaoXu(linklist *h) //逆序排列链表 //{linklist *r,*q,*p;r=h;p=r->next;q=p->next;if(h==NULL)printf("链表为空\n"); while(q!=NULL&&h!=NULL) {p->next=r;r=p;p=q;q=q->next;}h->next=NULL;p->next=r;return(p);}main() {int k,x;linklist *h;do{printf("\n功能:\n");printf("1.建立链表\n");printf("2.输出链表内容;\n");printf("3.获得链表长度\n");printf("4.删除第K个节点\n");printf("5.将链表倒序输出\n");printf("6.退出\n");printf("请输入功能号:\n");scanf("%d",&x);if(x<1||x>6)printf("错误!\n");elseswitch(x){case 1:h=creatlist();break;case 2:listLong(h);break;case 3:printf("链表的长度是: %d",listLong(h));break; case 4:printf("请输入要删除的节点:\n");scanf("%d",&k);DeleteNode(h,k);listContent(h);break;case 5:h=DaoXu(h);listContent(h);break;case 6:exit(0);break;}}while(1);}运行结果:实验总结:1.在编写倒排链表的程序时,对于循环的计数的控制没有搞好,以致无法得到想要的链表;2.要给一个指针创立空间之后才能调用它,否则会出错。
百分制和五分制的换算如下:90—100 :A80—89 :B70—79 :C60—69 :D0—59 :E输入一个百分制成绩,输出对应的五分制成绩,分别用if-else if 、switch结构实现。
①#include <stdio.h> main() { float a; printf("输入一个百分制成绩:");scanf("%f",&a); if(a>=90&&a<=100) printf("A"); else if(a>=80&&a<=89)printf("B"); else if(a>=70&&a<=79) printf("C"); else if(a>=60&&a<=69)printf("D"); else printf("E"); }从键盘输入3个整数,输出其中最大的数。
#include <stdio.h> main() { int a,b,c,max; printf("请输入三个整数:");scanf("%d,%d,%d",&a,&b,&c); if(a-b>=0) max=a; else max=b; {if(max-c>=0) printf("最大整数为:%d",max); else{ max=c;printf("最大整数为:%d",max); } }}循环结构求2+4+6+…+100#include <stdio.h> main() { int i,s; for(i=2,s=0;i<=100;i+=2) s+=i;printf("%d",s); }求20!#include <stdio.h> main() { int i=1; float s=1.0; do{ s*=i; i++;} while(i<=20); printf("%f",s); }素数从键盘输入一个数,判断其是否是素数#include<stdio.h> main() {int a,i; printf("请输入一个数字"); scanf("%d",&a);for(i=2;i<a;i++) {if(a%i==0) {printf("%d不是素数",a); return; }}printf("%d是素数",a);}从键盘输入10个整数,求其中的最大值和最小值#include <stdio.h> main() { int i,a,max,min; scanf("%d",&a); min=a, max=a; for(i=2;i<=10;i++) { scanf("%d",&a); if(min>a)min=a; if(max<a)max=a; }printf("Max=%d,Min=%d\n",max,min); }求100以内的素数#include <stdio.h> main() { int m,i,flag; for(m=3;m<=100;m++) {flag=1;for(i=2;i<m;i++) if(m%i==0) { flag=0;break; } if(flag)printf("%d",m);}}求前100个素数#include<stdio.h> main() { int i; int j=2; int n=0; while(1) { for(i=2;i<j;i++){ if(j%i==0)break; } if(j==i){printf("%d ",j);n++;} if(n==100)break; j++; }}求两个数的最大公约数和最小公倍数#include <stdio.h> main() { int r,a,b; scanf("%d%d",&a,&b); if(a>b) {r=a;a=b;b=r;}r=a%b; while(r) { a=b;b=r;r=a%b; } printf("%d\n",b);}从键盘输入10个整数,将最大数调到最前面,最小数调到最后面。
数据为{1,0,9,2,0,3,8,9,0,8,0,3} 1依次做如下操作: 建立一棵二叉排序树如下:
一个哈希表长12,试用模除求余法设计哈希算法,用线性探测法解决冲突,并求平均查找长度ASL; 解: M=12,P取11 地址 0 1 2 3 4 5 6 7 8 9 10 11
9 9 0 2
8 8 3 8 0
0 0
1 3 关键字 0 1 2 0 3 0 0 3 8 9 9 8 查找次数 1 1 1 4 2 6 7 5 1 1 2 4
平均查找长度: ADSL=(1+1+1+4+2+6+7+5+1+1+2+4)/12 =35/12 写出进行直接插入排序、简单选择排序、冒泡排序、快速排序的前两趟趟结果,并构造一个小堆;(排序时重复数据忽略) 解: 重复数据忽略后为{1,0,9,2,3,8} 直接插入排序: 【1】 0 9 2 3 8 【0 1】9 2 3 8 【0 1 9】2 3 8 简单选择排序: 【0 0 9 2 3 8】 0 【1 9 2 3 8】 0 1【9 2 3 8】 冒泡排序: 【1 0 9 2 3 8】 【0 1 2 3 8】9 【0 1 2 3】8 9 快速排序 【1 0 9 2 3 8】 【0】1 【9 2 3 8】 【0】1 【9 2 3 8】 小堆:
将每一位数据作为一个页面调用,若在分页方式下的内存分块数为4块,试求出用FIFO进行页面淘汰时的缺页中断率,要求有过程。
0 1 3 2
8 9 解: 调用顺序 1 0 9 2 0 3 8 9 0 8 0 3
内存块1 1 0 9 2 2 3 8 8 0 0 0 0 内存块2 1 0 9 9 2 3 3 8 8 8 8 内存块3 1 0 0 9 2 2 3 3 3 3 内存块4 1 1 0 9 9 2 2 2 2 是否缺页(“+”表示缺页) + + + + + + +
缺页中断率为: 缺页中断7次,引用页面次数12次, 所以,缺页中断率f=7/12=58.3%
电子科技大学通信与信息工程学院标准实验报告(实验)课程名称软件技术基础实验电子科技大学教务处制表电子科技大学实验报告一、实验室名称:校公共机房二、实验项目名称:查找与排序三、实验学时:4学时四、实验原理:使用VS2010等C语言集成开发环境(IDE),在微型计算机上对程序进行编辑、编译、连接与运行。
通过上机练习掌握顺序查找、二分查找函数、简单选择法、直接插入法、冒泡法排序、快速排序等方法、过程和实际应用。
五、实验目的:1.熟练掌握顺序查找、二分查找函数、简单选择法、直接插入法、冒泡法排序、快速排序等算法方法并实现。
2.掌握课程平台使用方法。
六、实验内容:ex5_1:查找设有序序列的数据元素为:(3,10,13,17,40,43,50,70)1)编写顺序查找函数2)编写二分查找函数3)在主程序中输入关键字(43和5),分别调用两种查找函数,输出结果。
//第一题#include <stdio.h>#define maxnum 20typedef struct{int data[maxnum];int length;}list_type;void create(list_type *l){l->length=8;l->data[0]=3;l->data[1]=10;l->data[2]=13;l->data[3]=17;l->data[4]=40;l->data[5]=43;l->data[6]=50;l->data[7]=70;}void shunxucz(list_type *l,int a1,int a2){int i,flag=0;printf("-----------------------------------------------\n");printf("顺序查找法:\n");for(i=0;i<l->length;i++){if(a1==l->data[i]){printf("%d是第%d个元素\n",a1,(i+1));flag=flag+1;} }if(flag==0) printf("表中没有大小为%d的元素\n",a1);flag=0;for(i=0;i<l->length;i++){if(a2==l->data[i]){printf("%d是第%d个元素\n",a2,(i+1));flag=flag+1;} }if(flag==0) printf("表中没有大小为%d的元素\n",a2);}void erfencz(list_type *l,int a1,int a2){printf("-----------------------------------------------\n");printf("二分查找法:\n");int low,h,m,flag=0,i;low=0;h=l->length-1;for(i=0;i<l->length;i++){m=(low+h)/2; //如果有小数就向小的数字取值9/2=4if(l->data[m]==a1){printf("%d是第%d个元素\n",a1,(m+1));flag=1;break;}else if(l->data[m]<22) low=m+1;else if(l->data[m]>22) h=m-1;}if(flag!=1)printf("表中没有大小为%d的元素\n",a1);flag=0;low=0;h=l->length-1;for(i=0;i<l->length;i++){m=(low+h)/2; //如果有小数就向小的数字取值9/2=4if(l->data[m]==a2){printf("%d是第%d个元素\n",a2,(m+1));flag=1;break;}else if(l->data[m]<22) low=m+1;else if(l->data[m]>22) h=m-1;}if(flag!=1)printf("表中没有大小为%d的元素\n",a2);}int main(){int flag1=43,flag2=5;list_type list,list1,list2;create(&list);create(&list1);create(&list2);shunxucz(&list1,flag1,flag2);erfencz(&list1,flag1,flag2);printf("-----------------------------------------------\n");}ex5_2:排序1)编写简单选择法函数2)编写直接插入法函数3)编写冒泡法排序函数4)编写快速排序函数5)在主程序中输入一组数据元素(513,87,512,61,908,170,897,275,653,462),分别调用4种排序函数,输出每趟排序结果。
《软件技术基础》 上机实验报告
2018至2019学年,第1学期
学生姓名: *** 班 级: *** 学 号: *** 授课教师: *** 指导教师: ***
报告完成时间:2018年12月9日 实验一:链式二叉排序树的创建和遍历 一.实验目的和要求 1. 加深理解数据结构的目的和概念,以及逻辑结构和物理结构的关系; 2. 练习数据结构操作算法的编程实现; 3. 练习链表的程序设计,掌握二叉链表的设计技术; 4. 练习递归函数的设计方法; 5. 巩固二叉排序树的概念; 6. 熟悉软件功能的分析设计方法。
二.功能分析与设计 利用C或C++,设计程序,定义二叉链表,存储二叉排序树,声明并定义相应的函数,实现链式二叉排序树的下列操作: 1. 输入数据个数DataCount(要求在10和20之间)和数据最大值MaxData(在50和100之间)。 算法实现:该任务需要限制输入的DataCount在10和20之间,MaxData在50和100之间,只有当两者均满足要求时,程序才会向下执行。若不满足时,会提示“输入不正确,请重新输入!”,并继续输入DataCount和MaxData,直至满足要求。这里用while(1)死循环,不得到正确输入不退出。 部分代码如下: while(1) { printf("请输入DataCount:"); scanf("%d",&DataCount); printf("请输入Maxdata:"); scanf("%d",&Maxdata); if(DataCount>=10&&DataCount<=20&&Maxdata>=50&&Maxdata<=100) break; printf("输入不正确,请重新输入! \n"); fflush(stdin); //清空输入 }
2. 在0和MaxData之间,随机产生DataCount个不重复的整数,按产生先后顺序形成一个数据序列,并输出该序列。 算法实现:因为输入的DataCount具有随机性,数组的长度无法确定,因此想到要申请分配动态数组。这里需要在0和MaxData之间,随机产生DataCount个不重复的整数,使用c语言中的rand语句,生成一组随机数,并赋值给数组。要保证不重复,引入下表j,若两数相等,则i自减,继续产生数据。 部分代码如下: if((arr=(int *)malloc(DataCount*sizeof(int)))==NULL) //申请动态数组 { printf("分配内存空间失败,程序退出!"); return 0; } for(i=0;i{ arr[i]=rand()%(Maxdata+1); for(j=0;jif(arr[i]==arr[j]) i--; } printf("输出不重复的数据序列:\n"); for(i=0;iprintf("%d \t",arr[i]);
3. 利用上述数据序列,创建一个二叉排序树。 算法实现:首先需要定义节点数据结构,然后根据二叉排序树的特点(左子树节点值小于根节点值,右子树节点值大于等于根节点值),定义插入二叉排序树的insertTree函数,最后定义Creatree函数,并在其中调用insertTree函数,实现了二叉排序树的创建。 部分代码如下: void insertTree(Tnode **r,int data){ //插入二叉排序树 if(*r==NULL){ //如果树为空,则建树 *r=(Tnode *)malloc(sizeof(Tnode)); (*r)->data = data; (*r)->lchild=NULL; (*r)->rchild=NULL; } else if(data<(*r)->data) //当前值小于根结点,建左子树 insertTree(&((*r)->lchild),data); else if(data>(*r)->data) //当前值大于根结点,建右子树 insertTree(&((*r)->rchild),data); } void Creatree(Tnode **r,int a[],int n){ //调用插入函数,实现二叉排序树的创建 int i; for(i=0;iinsertTree(&(*r),a[i]); } 4. 设计函数,统计该二叉树的高度。 算法实现:二叉树的高度为二叉树中节点层次的最大值,因此需要分别遍历左、右子树,并求高度。二叉树的高度为左子树高度、右子树高度中较大的那个。 部分代码如下: int GetHeight(Tnode *r){ //定义统计二叉树的高度的函数 int hl, hr, max; if (r!= NULL){ hl = GetHeight(r->lchild); //求左子树高度 hr = GetHeight(r->rchild); //求右子树高度 max = hl > hr ? hl : hr; return (max + 1); } else return 0; }
5. 设计函数,输出该二叉树的叶子节点。 算法实现:当节点的左右子树同时为空时,即为叶子结点。对二叉树进行遍历,判断被访问的节点是否为叶子节点,若是,将叶子节点对应的数值输出。 部分代码如下: if(r==0) return ; else if(r->lchild==NULL&&r->rchild==NULL) //节点的左右子树同时为空,即为叶子 printf("%d ",r->data); outleaf(r->lchild) ; outleaf(r->rchild) ; }
6. 设计中序遍历函数,遍历该二叉排序树,输出遍历序列,验证创建的二叉排序树是否正确。 算法实现:首先按中序遍历的顺序递归左子树,然后访问根节点,最后按中序遍历的顺序递归遍历右子树,即可设计中序遍历函数。由于二叉排序树的中序遍历结果应为从小到大排序,所以只需观察中序遍历序列,即可验证正确性。 部分代码如下: void inorder(Tnode *r){ //定义实现中序遍历的函数 if(r){ inorder(r->lchild); printf("%d ",r->data); inorder(r->rchild); } } 三.算法流程图 根据上述功能的分析,设计出本实验的算法流程图如下所示:
图1 算法流程图 四.程序源代码
#include #include #include typedef struct node{ //节点数据类型 int data; struct node *lchild,*rchild; }Tnode;
void insertTree(Tnode **r,int data){ //插入二叉排序树 if(*r==NULL){ //如果树为空,则建树 *r=(Tnode *)malloc(sizeof(Tnode)); (*r)->data = data; (*r)->lchild=NULL; (*r)->rchild=NULL; } else if(data<(*r)->data) //当前值小于根结点,建左子树 insertTree(&((*r)->lchild),data); else if(data>(*r)->data) //当前值大于根结点,建右子树 insertTree(&((*r)->rchild),data); } void Creatree(Tnode **r,int a[],int n){ //调用插入函数,实现二叉排序树的创建 int i; for(i=0;iinsertTree(&(*r),a[i]); }
int GetHeight(Tnode *r){ //定义统计二叉树的高度的函数 int hl, hr, max; if (r!= NULL){ hl = GetHeight(r->lchild); //求左子树高度 hr = GetHeight(r->rchild); //求右子树高度 max = hl > hr ? hl : hr; return (max + 1); } else return 0; } void outleaf(Tnode *r){ //定义输出二叉树的叶子节点的函数 if(r==0) return ; else if(r->lchild==NULL&&r->rchild==NULL) //节点的左右子树同时为空,即为叶子 printf("%d ",r->data); outleaf(r->lchild) ; outleaf(r->rchild) ; }
void inorder(Tnode *r){ //定义实现中序遍历的函数 if(r){ inorder(r->lchild); printf("%d ",r->data); inorder(r->rchild); } }
int main() { srand(time(NULL)); Tnode *r=NULL; int DataCount,Maxdata,i,j; int *arr; while(1) //死循环,不得到正确输入不退出 { printf("请输入DataCount:"); scanf("%d",&DataCount); printf("请输入Maxdata:"); scanf("%d",&Maxdata); if(DataCount>=10&&DataCount<=20&&Maxdata>=50&&Maxdata<=100) break; printf("输入不正确,请重新输入! \n"); fflush(stdin); //清空输入 } if((arr=(int *)malloc(DataCount*sizeof(int)))==NULL) //申请动态数组 { printf("分配内存空间失败,程序退出!"); return 0; } for(i=0;i