电子科技大学软件技术基础实验报告4
《软件技术基础》实验指导书_实验三、四
《软件技术基础》实验指导书电子商务教研室2009年9月实验三队列的应用◆实验目的与基本要求1、掌握队列的顺序存储和链式存储结构。
2、掌握队列的特点。
3、掌握队列的基本运算。
◆实验条件1、硬件:一台微机2、软件:操作系统和C语言系统◆实验方法确定存储结构后,上机调试实现队列的基本运算。
◆实验内容1、写出队列的出队和入队算法。
2、设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚,依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已停放n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。
编制一个程序模拟该停车场的管理。
◆性质:必做◆类型:验证◆2h队列是从日常排队现象抽象出来的一种数学模型。
当然数据结构中的队列远没有生活中的排队灵活。
数据结构中的队列规定:数据只能从队尾进,从队首出来。
已经进入队列的数据次序不能再做改变。
这就叫做“先进先出”(FIFO)或者说“后进后出”(LILO)。
允许插入的一端称为队尾,通常用一个称为尾指针(rear)的指针指向队尾元素,即尾指针总是指向最后被插入的元素;允许删除的一端称为队首,通常也用一个队首指针(front)指向队首元素的前一个位置(当然也可以直接指向队首元素,只是许多数据结构的书上都习惯这么定义)。
与队列类似,我们可以用一维数组来模拟队列这种数据结构,也可以用链表来模拟。
根据以上描述,队列可以可以有以下基本操作:1、创建初始化:按约定置队列为空状态。
【参考文档】《软件技术基础》实验报告 (1000字)-精选word文档 (16页)
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==《软件技术基础》实验报告 (1000字)《软件技术基础》实验报告学院:XXXXXXXXX班级: XXXXXXX学号:XXXXXXXXXX姓名: XXXXXX指导老师: XXXXXX实验一顺序表的操作班级 XXXXX 学号 XXXXXXX 姓名 XXXX第 X 周星期 X 、 XXX 节成绩一、实验目的:1、掌握顺序表结构的实现方式;2、掌握顺序表常用算法的实现;3、熟悉利用顺序表解决问题的一般思路;4、参照给定的顺序表的程序样例,验证给出的顺序表的常见算法,领会顺序表结构的优点和不足。
二、实验内容:1、设计一个静态数组存储结构的顺序表,要求编程实现如下任务:(1)建立一个顺序表,首先依次输人整数数据元素(个数根据需要键盘给定)。
(2)删除指定位置的数据元素(指定元素位置通过键盘输入),再依次显示删除后的顺序表中的数据元素。
(3)查找指定数据的数据元素(指定数据由键盘输入),若找到则显示位置,若没有找到则显示0。
2、使用顺序表实现一个电话本的管理程序,电话本中的每条记录包括学号、姓名、手机号码和固定电话四项。
要求实现菜单、初始化、添加、删除和显示等功能。
三、实验结果:四、实验中遇到的问题及解决方法:相关函数书上都有一样的或类似的,因此并未遇到什么问题。
五、实验心得体会:书上的例程是含有两个元素的,改为一个元素的时候花了一些时间。
参考了书本,对书上的函数有了比较深刻的理解。
附:部分源程序#include<iostream.h>const int maxsize=100;struct stu{int id;char name[20];};struct SeqList{stu data[maxsize];int length;};//主函数int main(){SeqList L;L.length=0;stu s;cout<<"请输入三个学生的学号、姓名:\n";} for(int i=0;i<3;i++) { cin>>s.id>>; Insert(&L,s); }cout<<endl; Display(&L); int ID; cout<<"请输入要删除的学生的学号"; cin>>ID; Delete(&L,ID); cout<<endl; Display(&L); return 0;实验二链表的操作(一)班级 XXXXX 学号 XXXXXXX 姓名 XXXX第 X 周星期 X 、 XXX 节成绩一、实验目的:1、掌握单链表结构的实现方式;2、掌握单链表常用算法的实现。
电子科技大学软件技术基础调试报告
软件技术基础上机实验调试报告
(学生姓名)(学号)
调试报告
*******************************************************************************说明:调试过程在代码注释中
一、顺序表:
1.插入和删除
1.1插入函数:
1.2删除函数:
2.插入:
3.插入:
4删除所有负数:
二.链表:
1.插入:
2.删除
3.寻找x时
4.插入
5插入
5.1教师设计的:
5.2.学生设计的:
6.链点空间
7.链点使用内存
8.删除
三.栈和队列3_1
3-2
该程序在计算乘除时没有错误错误在于计算加减混合运算:出现问题的代码块如下:
演算经过:
调试结果:
出现问题的原因是:先取数值再取符号而且把后取的数值放在符号左边,而忽略了后面取的数值前面的符号,从而导致结果出错;
解决办法:第一次先取符号再取数再取一个符号和一个数,并且符号均在数的左边,先取的数也在左边(有点类似把加减号当做正负号),然后再取一个符号和一个数,符号和先取的数在左,以此类推。
3-3
出错的地方:遍历队列时,最后一个元素没有遍历到
3-4
队尾号出错,比正确的队尾多1
3-5
错误1:插入到最后一个位置之后时,覆盖了原最后一个元素。
计算机软件技术基础实验报告
学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年11月22日成绩:实验四二叉树的建立与遍历一、实验目的1.掌握二叉树的建立、显示、节点数目、树深度等操作的程序实现。
2.掌握二叉树的先序、中序、后序遍历操作的程序实现。
3.加深对树的基本概念,基本理论及相应遍历算法的掌握与理解。
二、实验用软件和工具实验软件 VC++ 6.0三、实验步骤建立一棵二叉树、设计二叉树的节点数目、树深度等操作实现算法、调试并输出一棵树及其节点数目、树深度;编写一个程序实现如下功能:二叉树的先序、中序、后序遍历操作的程序实现,调试并输出结果。
1.定义一个二叉树结构体。
2.建立并显示一棵二叉树。
3.求二叉树的节点数目、树深度。
4.计算度为2,度为1的结点。
5.二叉树的先序、中序、后序遍历。
四、实验程序与程序运行结果/*二叉树的基本操作*/#include <stdio.h>#include <malloc.h>#define MaxSize 100#define MaxWidth 40typedef char ElemType;typedef struct node{ElemType data;struct node *left,*right;} BTree;void creatree(BTree **BT,char *str){BTree *stack[MaxSize],*p;int top=-1,k,j=0;/*top为栈指针,k指定是左还是右孩子,j为str指针*/char ch;学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年11月22日成绩:*BT=NULL;ch=str[j];while (ch!='\0'){switch(ch){case '(':top++;stack[top]=p;k=1; /*为左结点*/break;case ')':top--;break;case ',':k=2; /*为右结点*/break;default: p=(BTree *)malloc(sizeof(BTree));p->data=ch;p->left=p->right=NULL;if (*BT==NULL) /*根结点*/*BT=p;else{switch(k){case 1:stack[top]->left=p;break;case 2:stack[top]->right=p;}}}j++;ch=str[j];}}void disptree(BTree *BT){BTree *stack[MaxSize],*p;int level[MaxSize][2],top,n,i,width=4;if (BT!=NULL){printf("\n凹入表示法:\n");top=1;stack[top]=BT; /*根结点入栈*/level[top][0]=width;while (top>0){p=stack[top]; /*退栈并凹入显示该结点值*/n=level[top][0];for (i=1;i<=n;i++) /*其中n为显示场宽,字符以右对齐显示*/printf(" ");printf("%c",p->data);for (i=n+1;i<=MaxWidth;i+=2)printf("━");printf("\n");学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年11月22日成绩:top--;if (p->right!=NULL){ /*将右子树根结点入栈*/top++;stack[top]=p->right;level[top][0]=n+width; /*显示场宽增width*/level[top][1]=2;}if (p->left!=NULL){ /*将左子树根结点入栈*/top++;stack[top]=p->left;level[top][0]=n+width; /*显示场宽增width*/level[top][1]=1;}}}}int BTreeDepth(BTree *BT){int leftdep,rightdep;if (BT==NULL)return(0);else{leftdep=BTreeDepth(BT->left);rightdep=BTreeDepth(BT->right);if (leftdep>rightdep)return(leftdep+1);elsereturn(rightdep+1);}}int nodecount(BTree *BT){if (BT==NULL)return(0);elsereturn(nodecount(BT->left)+nodecount(BT->right)+1);}int leafcount(BTree *BT){if (BT==NULL)return(0);else if (BT->left==NULL && BT->right==NULL)return(1);elsereturn(leafcount(BT->left)+leafcount(BT->right));}int notleafcount(BTree *BT){学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年11月22日成绩:if (BT==NULL)return(0);else if (BT->left==NULL && BT->right==NULL)return(0);elsereturn(notleafcount(BT->left)+notleafcount(BT->right)+1);}int onesoncount(BTree *BT){if (BT==NULL)return(0);else if ((BT->left==NULL && BT->right!=NULL) ||(BT->left!=NULL && BT->right==NULL))return(onesoncount(BT->left)+onesoncount(BT->right)+1);elsereturn(onesoncount(BT->left)+onesoncount(BT->right));}int twosoncount(BTree *BT){if (BT==NULL)return(0);else if (BT->left==NULL || BT->right==NULL)return(twosoncount(BT->left)+twosoncount(BT->right));else if (BT->left!=NULL && BT->right!=NULL)return(twosoncount(BT->left)+twosoncount(BT->right)+1);}void printree(BTree *BT){if (BT!=NULL){printf("%c",BT->data);if (BT->left!=NULL || BT->right!=NULL){printf("(");printree(BT->left);if (BT->right!=NULL)printf(",");printree(BT->right);printf(")");}}}main(){BTree *B;char *s="A(B(D,E(H,I)),C(G))";creatree(&B,s);disptree(B);printf("二叉树括号表示:");printree(B);printf("\n二叉树深度:%d\n",BTreeDepth(B));学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年11月22日成绩:printf("总结点个数:%d\n",nodecount(B));printf("叶子结点个数:%d\n",leafcount(B));printf("非叶子结点个数:%d\n",notleafcount(B));printf("具有双孩子结点个数:%d\n",twosoncount(B));printf("具有单孩子结点个数:%d\n",onesoncount(B));}/*二叉树遍历*/#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct node{ElemType data;struct node *left,*right;} BTree;void creatree(BTree **BT,char *str){BTree *stack[MaxSize],*p;int top=-1,k,j=0;/*top为栈指针,k指定是左还是右孩子,j为str指针*/char ch;*BT=NULL;ch=str[j];while (ch!='\0'){switch(ch){case '(':top++;stack[top]=p;k=1; /*为左结点*/break;case ')':top--;break;case ',':k=2; /*为右结点*/break;default: p=(BTree *)malloc(sizeof(BTree));p->data=ch;p->left=p->right=NULL;if (*BT==NULL) /*根结点*/*BT=p;else{switch(k){case 1:stack[top]->left=p;break;case 2:stack[top]->right=p;}}}j++;ch=str[j];}学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年11月22日成绩:}void preorder(BTree *BT){if (BT!=NULL){printf("%c",BT->data);preorder(BT->left);preorder(BT->right);}}void inorder(BTree *BT){if (BT!=NULL){inorder(BT->left);printf("%c",BT->data);inorder(BT->right);}}void postorder(BTree *BT){if (BT!=NULL){postorder(BT->left);postorder(BT->right);printf("%c",BT->data);}}main(){BTree *B;char *s="A(B(D,E(H,I)),C(G))";creatree(&B,s);printf("\n先序遍历:");preorder(B);printf("\n中序遍历:");inorder(B);printf("\n后序遍历:");postorder(B);}试验运行结果如图:学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年11月22日成绩:学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年11月22日成绩:五、实验心得与体会通过本次上机实验,我掌握了二叉树的建立、显示、节点数目、树深度等操作的程序实现,以及二叉树的先序、中序、后序遍历操作的程序实现,对树与二叉树的遍历,尤其是广度优先遍历和深度优先遍历的理解进一步加深,收获很多啊。
非计算机专业《软件技术基础》教学实践
的计 算机 专业课 程 ,在本 专业领 域拥 有更 高 的计算 机水 平 ,对 日后来自踏上 工作 岗位非 常有 利 。
好 ,做起事来事倍功半。实际上 ,学生的非智力因
素 ,如学 习 的动机 、意 志 、情 感 、兴趣 等在 学习 中 起着 非 常 重 要 的 作 用 j 。尤 其 是 大 1 、大 2的 学 生 ,他们 已经 从高 中 的被动读 书 、为升 学而 学 习前
学 生反 馈 ,本文从 以下 5个 方 面人手 ,初 步探讨 了 提升 软件 技术 基础课 程教 学成 效 的方法 。
l 强 调 思 想 上 的 重 视
思想上 重 视 ,行 动 ( 习 ) 才 能 投 入 。 由 于 学 上
本 门课 程 一般 开在 大 1或大 2 ,此 时 的 大学 生 还 不 清楚 基础 课 程 的 重 要 性 ,总 想 着 学 了就 要 看 到 效
第1 O卷
第 2期
实 验 科 学 与 技 术
Exp rme cin e a d Te hn lg e i ntS e c n c o o y
V 11 . o . 0 No 2
Apr 2 2 . 01
21 0 2年 4月
非计 算 机 专 业《 件 技 术 基 础 》 学 实践 软 教
a mi g t p l ain i n o a p i t ”,d s u ss me meh d o i rv e c ig ef c n w y o o g t e c i g c ne t e c ig meh d,c u s c o i s o t o st mp o e t a h n f t a ft u h ,ta h n o tn ,t a h n t o c e i h o re
计算机软件技术基础实验报告
学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年11月22日成绩:实验七SQL 简单查询、连接查询和子查询一、实验目的1.掌握在查询分析器中使用SELECT语句进行简单查询。
2.熟练掌握简单表的数据查询、数据排序和数据连接查询的操作方法。
3.熟练掌握数据查询中的分组、统计、计算和组合的操作方法。
4.观察查询结果, 体会SELECT语句实际应用二、实验用软件和工具1.计算机。
实验软件 VC++ 6.02.SQL Server2005软件。
三、实验步骤1 简单查询操作此部分查询包括投影、选择条件表达、数据排序、使用临时表等。
对EDUC(shiyan6)数据库实现以下查询:(1)求信电学院的学生学号和姓名;(2)求选修了课程的学生学号;(3)求选修C1 课程的学生学号和成绩,并要求对查询结果按成绩的降序排列,如果成绩相同则按学号的升序排列;(4)求选修课程C1 且成绩在80-90 之间的学生学号和成绩,并将成绩乘以系数0.75 输出;(5)求计算机系和数学系的姓张的学生的信息;(6)求缺少了成绩的学生的学号和课程号。
2 连接查询操作对EDUC(shiyan6)数据库实现以下查询:(1)查询每个学生的情况以及他(她)所选修的课程;(2)求学生的学号、姓名、选修的课程名及成绩;(3)求选修C1 课程且成绩在90 分以上的学生学号、姓名及成绩;(4)查询每一门课的间接先行课。
3.子查询操作,在数据库EDUC(shiyan6)中实现查询:学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年11月22日成绩:(1)求选修了高等数学的学生学号和姓名;(2)求C1 课程的成绩高于张三的学生学号和成绩;(3)求其他系中比计算机系某一学生年龄小的学生信息(即求其它系中年龄小于计算机系年龄最大者的学生);(4)求其他系中比计算机系学生年龄都小的学生信息;(5)求选修了C2 课程的学生姓名;(6)求没有选修C2 课程的学生姓名;(7)查询选修了全部课程的学生的姓名;(8)求至少选修了学号为“S2”的学生所选修的全部课程的学生学号和姓名。
计算机软件技术基础实验报告
《计算机软件技术基础》实验报告专业_____________年级_____________学号_____________学生姓名_____________指导老师_____________南华大学计算机学院编I 实验要求1.每次实验中有若干习题,每个学生至少应该完成其中的两道习题。
2.上机之前应作好充分的准备工作,预先编好程序,经过人工检查无误后,才能上机,以提高上机效率。
3.独立上机输入和调试自己所编的程序,切忌抄袭、拷贝他人程序。
4.上机结束后,应整理出实验报告。
书写实验报告时,重点放在调试过程和小节部分,总结出本次实验中的得与失,以达到巩固课堂学习、提高动手能力的目的。
实验一线性表【实验目的】1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。
2.通过编程、上机调试,进一步理解线性表的基本概念,熟练运用C语言实现线性表基本操作。
3.熟练掌握线性表的综合应用问题。
【实验内容】必做:1.一个线性表有n个元素(n<MAXSIZE, MAXSIZE指线性表的最大长度),且递增有序。
(1)现有一元素x要插入到线性表的适当位置上,并保持线性表原有的顺序不变。
采用链式存储表示方法实现,设计程序实现(2)从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。
要求:①指定的值x由键盘输入;②程序能处理空链表的情况。
选做:3.设有头结点的单链表,编程对表中的作一值只保留一个结点,删除其余值相同的结点。
要求:①该算法用函数(非主函数)实现;②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。
4.已知非空单链表第一个结点由head指出,请写一算法,交换p所指结点与其下一个结点在链表中的位置。
要求:①该算法用函数Reverse(head,p)实现,其中head为表头指针,p指向要交换的结点;②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。
计算机软件技术基础实验报告
学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期: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日成绩:五、实验心得与体会通过本次上机实验,我掌握了栈的顺序和链式存储存表示与入栈、出栈操作的程序实现,以及队列的链式存储表示与入队、出队基本操作算法实现。
电子科技大学实验报告
(一)用WinDLX模拟器执行求阶乘程序fact.s。
这个程序说明浮点指令的使用。该程序从标准输入读入一个整数,求其阶乘,然后将结果输出。
该程序中调用了input.s中的输入子程序,这个子程序用于读入正整数。
(二)用WinDLX模拟器执行程序gcm.s。
该程序从标准输入读入两个整数,求他们的greatest common measure,然后将结果写到标准输出。
该程序中调用了input.s中的输入子程序。
(三)用WinDLX模拟器执行求素数程序prim.s。
这个程序计算若干个整数的素数。
六、实验器材(设备、元器件):
PC微机一台
七、实验步骤及操作:
1.双击WinDLX图标运行WinDLX。装入测试程序之前,先初始化WinDLX模拟器:点击File菜单中的Reset all菜单项,弹出一个“Reset DLX”对话框。然后点击窗口中的“确认”按钮即可。
1.2.选择File/Load Code or Data,按如下步骤操作,可将fact.s和input.s这两个程序装入主存:
◆点击fact.s
◆点击select按钮
◆点击input.s
◆点击select按钮
◆点击load按钮
3.点击主窗口中的Execution开始运行。
4.程序gcm.s和prim.s的运行过程同上。
八、实验数据及结果分析:
九、实验结论:
十、总结及心得体会:
十一、对本实验过程及方法、手段的改进建议:
报告评分:
指导教师签字:
电子科技大学
实验报告
学生姓名:
学号:
一、实验室名称:计算机学院计算心
二、实验项目名称:熟悉WinDLX的使用
计算机软件技术基础实验报告
学院:信电学院班级姓名:学号:课程:计算机软件技术基础实验日期:2013年11月24日成绩:实验九建立结构图和程序流程图一、实验目的1、掌握Microsoft visio环境。
2、掌握4种类型的模块;3、掌握建立系统结构图;4、掌握程序流程图的建立。
二、实验用软件和工具1.计算机。
2.VISIO软件。
三、实验步骤1 Microsoft OfficeVisio 环境和使用。
(1)模板:通过打开一个模板来开始创建Microsoft Office Visio图表。
模板在绘图页的左侧打开一个或多个模具。
模具包含创建图表所需的形状。
模板还包括创建特定的图表类型所需的所有样式、设置和工具。
(2)模具和形状:打开模板后,从模具中将形状拖到绘图页上来创建您的图表。
模具上的形状专门用于特定的绘图类型,并且其中的许多形状是“智能”的 - 它们具有感知绘图环境的内置行为。
(3)绘图环境:打开模板后,您将看到 Microsoft Office Visio 绘图环境,它包括菜单、工具栏、包含形状的模具、绘图页和位于绘图页右侧的任务窗格。
您在绘图页上创建绘图,所创学院:信电学院班级姓名:学号:课程:计算机软件技术基础实验日期:2013年11月24日成绩:建的绘图表示打印页面,并包含帮助调整形状位置的网格。
Visio 菜单和工具栏与其他Microsoft Office 系统程序中的菜单和工具栏类似,因此您可以用熟悉的方法打开、打印和保存图表。
(4)开始创建图表:1)打开模板:在“文件”菜单上,指向“新建”,然后单击“选择绘图类型”。
在“选择绘图类型”窗口的“类别”下,单击“软件”。
在“模板”下,单击“数据流模型图”。
2)添加形状:通过将“形状”窗口中模具上的形状拖到绘图页上,可以将形状添加到图表中。
把进程,接口,数据存储和数据流拖动到绘图页上。
3)删除形状:删除形状很容易。
只需单击绘图页上形状,然后按 DELETE 键。
单击图表中的最后一个“进程”形状,然后按 DELETE 键。
电子科技大学软件开发环境实验报告
计算机专业类课程实验报告课程名称:软件开发环境学院:计算机科学与工程专业:计算机科学与技术学生姓名:孙健学号:2010060030016指导教师:胡成华日期:2012年12月3日电子科技大学实验报告实验一代码清单2解释:先把3赋值给i(dword ptr [i]),cmp指令则是比较i(dword ptr[i])和3的大小,jie比较结果是相等,就跳转到01291382地址处,完成程序运行。
代码清单3和2类似,不同的是jge指令时第一个操作数大于或第二个操作数时跳转.代码清单4的反汇编代码,当执行到jne时,jne是如果第一个操作数和第二个操作数不相等时,就跳转至指令地址。
2.3 if/else语句的反汇编反汇编里面的判断语句和源码的是相反的编写代码清单7,并给出其反汇编代码首先mov指令把3赋值给dword ptr [i],cmp比较3和1EH(30)的大小,jle指令3小于30 跳转到411394h,在继续比较14H,3也小于20,在跳转到004113A3h 在比较3小于5,符合要求,mov指令把6赋值给dword ptr[i],跳转至4113D7.if-else分支用的都是反比,先进行比较根据结果进行跳转。
根据对代码清单9的分析,总结出for循环的反汇编代码规律先赋初值,根据cmp来进行判断,看是否应该跳出循环,如果不跳出则利用add 或sub指令进行重新赋值,知道跳出循环为止。
代码清单10 首先先把0赋值给dword ptr [i];,把0赋值给dword ptr[j];,cmp指令比较dword ptr [i]和0AH(10)的大小,通过jge指令,如果i的值大于或等于10就跳转至4113A6H,执行地址00411392处、地址00411395处、地址00411398处的机器码。
这三条指令的含义是对j做加1运算,同理,041139B,041139E,04113A1对i做加一运算。
代码清单11首先先把0赋值给dword ptr [i];,把0赋值给dword ptr[j];041138C,041138F,0411392三条地址指令对j进行加一运算,0411395,0411398,041139B对i进行加一运算,到地址041139E处,cmp 指令比较i与0AH(10)的大小,jl不大于就回跳到41138C的地址,继续执行循环.计算机专业类课程实验报告课程名称:软件开发环境学院:计算机科学与工程学院专业:计算机科学与技术学生姓名:孙健学号:2010060030016指导教师:胡成华日期:2012年12月8日电子科技大学实验报告实验二代码清单2的反汇编解释:保存ebp,将esp放入ebp中,此时ebp和esp相同,把esp往上移动一个范围0C0H;等于在栈中空出一片空间来存局部变量。
电子科技大学 软件开发环境 实验报告
int isEqual(const char *s) const; //判断s是否存在于编码系统中,若存在则返回s在编码系统中的位置,否则返回-1
void reverse(char arr[]);
void insert(const char&, const double&); //插入结点
void createHuffmanTree(); //创建哈夫曼树
void createHuffmanCode(); //创建哈夫曼编码
void writeCodeToFile(const char *);//将Huffman编码写入到词频表文件当中
六、实验器材(设备、元器件):
PC机,vs 2008软件平台。
七、实验数据及结果分析:
代码见附件。
huffmanForC
文件中函数列表如下:
///统计词频时用于查找是否已经记录过,记录过的话返回下标,没有则返回0
int isInNode(int value)
//获取文件词频,记录在Node huffmanNode[260]的节点数组当中
int swap(int data)
/*进行文件的解压*/
void uncompress_file(char* file1,char* file2)
//主函数
int main(int argc, char **argv)
函数关系调用图:
向下箭头为顺序依次调用,斜线为函数内调用
输入-c argv[2] argv[3]
(4)根据编码表信息再次逐字节的的读取带压缩文件并且压缩文件。
电子科技大学软件技术基础实验报告5
电子科技大学通信与信息工程学院标准实验报告(实验)课程名称软件技术基础实验电子科技大学教务处制表电子科技大学实验报告一、实验室名称:校公共机房二、实验项目名称:查找与排序三、实验学时: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种排序函数,输出每趟排序结果。
软件技术基础综合实验报告
实验3 使用 Select 语句进行数据查询一、实验目的1.观察查询结果, 体会 SELECT 语句实际应用;2.要求学生能够在查询分析器中使用 SELECT 语句进行简单查询;3. 熟练掌握简单表的数据查询、数据排序和数据连接查询的操作方法;4. 加深对 SQL 语言的嵌套查询语句的理解;5. 熟练掌握数据查询中的分组、统计、计算和组合的操作方法。
二、实验准备1. 完成实验二,成功建立了基本表;2. 了解简单 SELECT 语句的用法;3. 了解 SELECT 语句的 GROUP BY 和 ORDER BY 子句的作用;4. 了解统计函数和分组统计函数的使用方法。
三、实验要求完成实验,并验收实验结果提交实验报告。
四、实验内容写出相应的语句。
所有的查询全部用 Transact-SQL 语句实现。
1.查询学生的所有信息。
2.查询所有姓‘张’的学生的信息。
3.查询所有姓张的学生的信息,在列标题之间显示3行。
4.查询编号“00000001”的姓名信息。
5.查询表“Course”所有信息。
6.查询学生信息前6条记录。
7.将“Course”表中字段名做以下修改:'课程编码'替换CouNo‘课程名称'替换CouName'教师'替换Teacher‘上课时间'替换SchoolTime'限制选课人数'替换LimitNum‘报名人数'替换WIllNum。
8.查询《Linux操作系统》课程教师信息。
9.查询“Course”表,平均报名人数。
10.查询“Course”表,报名人数与限选人数之比。
11.查询编号'004','007','013'课程名称。
12.查询所有含字母‘D’的课程名程信息。
13.查询所有含‘制作’的课程名称信息。
14.查询所有名字含“宝”的学生信息。
15.查询排除“刘”姓的所有学生信息。
电子科技大学 TCPIP lab4实验报告
电子科技大学实验报告学生姓名:学号:指导教师:日期:年月日实验项目名称:1报告评分:教师签字:RIP协议(RFC1058)是一个基于距离向量路由选择的内部网关协议:每台路由器定期与邻居路由器交换各自路由表中的所有路由信息,使用Bellman-Ford算法计算路由表。
RIP,最大跳数值为15。
协议的路由度量(Metric)是到目的网络的跳数(hop count)运行RIP 协议的路由器初始接入到网络上时,它的路由表中只有根据其接口上的IP 配置信息获得的直连网络的直连路由。
随着RIP路由信息的不断交换,互联网中的每台RIP路由器最终会掌握整个互联网的知识,即RIP协议收敛。
RIP协议有2 种类型的报文:RIP请求报文和RIP响应报文,它们都封装在UDP数据报中广播发送。
- RIP请求报文可以询问特定路由项目或所有路由项目。
当运行RIP协议的路由器刚接入网络中时,会广播发送一份询问所有路由项目的RIP请求报文。
- RIP响应报文可以是询问或非询问的。
询问的RIP 响应报文仅在回应RIP 请求报文时单播发送给请求者,发送的内容是请求报文中所请求的特定路由项目或整个路由表的路由项目。
非询问的RIP响应报文则是定期的广播发送,发送的内容是整个路由表中的路由项目。
RIP响应报文中携带的RIP 路由通告信息只有目的网络地址和跳数值。
RIP协议使用3个计时器来支持RIP协议的操作。
- 定期计时器(30秒)控制定期的RIP路由通告,但为了避免出现整个互联网中的路由器同时更新而引起的过载问题,实际实现中路由器的RIP路由通告间隔通常是25~35之间的一个随机数。
- 截止期计时器(180秒)管理RIP路由的有效性,路由器每次收到一条RIP路由的更新信息,就复位该路由的截止期计时器。
如果一条RIP路由的截止期计时器期满,则将该路由标记为无效,即将其跳数设置为16,表示该路由的目的不可达。
- 路由器收到邻居通告的一条无效路由,或因为截至计时器期满而产生一条无效路由时,并不立即从路由表中清除无效路由,而是为该无效路由启动一个无用信息收集计时器(120秒),并继续在定期的路由通告中通告跳数为16的无效路由。
计算机软件技术基础实验报告
计算机软件技术基础实验报告计算机软件基础实验报告学号实验⽬的1. 掌握C语⾔程序设计⽅法,并学会上机调试。
2. 熟悉Huffman编码源程序,并构造Huffman树。
实验内容1.试设计⼀算法,从包括n个元素的数组中,求最⼤和最⼩元素,并使得当n个元素为有序排列时,元素之间的⽐较次数仅为n-1次。
2.在给出的Huffman编码源程序基础上,要求画出Huffman树,求出与等长编码相⽐时的压缩⽐。
实验要求1.根据实验内容编写算法,并⽤C 语⾔进⾏程序设计。
2. 将所编程序在计算机上调试通过,并全⾯测试。
实验结果1.以⼀个含有8个元素的⼀维数组{1,2,3,5,7,8,9,12}为例,设计程序如下:#includeint maxArray(int x ,int y);int minArray(int x ,int y);int main(void){int i = 0 ;int array[8]={ 1,2,3,5,7,8,9,12} ;printf;do{scanf("%d",&array[i]);i++;} while(i < 8);int maxTemp = array[0];int minTemp = array[0];int maxIndex = 0;int minIndex = 0;for(i=1;i<8;i++){maxTemp = maxArray(array[i] , maxTemp);minTemp = minArray(array[i] , minTemp);}for(i=0;i<8;i++){if (maxTemp == array[i]){maxIndex = i;}if (minTemp == array[i]){minIndex = i;}}printf;return 0;}运⾏结果如下:2.Huffman编码源程序#include#include#include#include#includetypedef struct{unsigned int weight; //结点权值unsigned int parent,lchild,rchild; //结点的⽗指针,左右孩⼦指针}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树typedef char **HuffmanCode; //动态分配数组存储哈夫曼编码表void CreateHuffmanTree(HuffmanTree &,unsigned int*,int ); //⽣成哈夫曼树void HuffmanCoding(HuffmanTree,HuffmanCode &,int ); //对哈夫曼树进⾏编码void PrintHuffmanCode(HuffmanCode,unsigned int*,int); //显⽰哈夫曼编码void Select(HuffmanTree,int,int&,int&); //在数组中寻找权值最⼩的两个结点void main() {HuffmanTree HT; //哈夫曼树HTHuffmanCode HC; //哈夫曼编码表HCint n,i; //n是哈夫曼树叶⼦结点数unsigned int *w; //w存放叶⼦结点权值char j='y';printf("演⽰构造哈夫曼树.\n");printf("输⼊需要进⾏编码的字符数⽬.\n例如:8\n");printf("然后输⼊每个字符出现的次数/权值.\n");printf("例如:5 29 7 8 14 23 3 11\n");printf("⾃动构造⼀棵哈夫曼树并显⽰哈夫曼编码.\n");printf(" 5---0110\n 29---10\n 7---1110\n 8---1111\n 14---110\n"); printf(" 23---00\n 3---0111\n 11---010\n");while(j!='N'&&j!='n'){printf("请输⼊字符数⽬:");scanf("%d",&n); //输⼊字符数⽬if(n<=1) {printf("该数不合理!\n");continue;}w=(unsigned int*)malloc(n*sizeof(unsigned int)); //开辟空间存放权值printf("请输⼊各字符出现的次数/权值:\n");for(i=0;iCreateHuffmanTree(HT,w,n); //⽣成哈夫曼树HuffmanCoding(HT,HC,n); //进⾏哈夫曼编码PrintHuffmanCode(HC,w,n); //显⽰哈夫曼编码printf("哈夫曼树构造完毕,还要继续吗?(Y/N)");scanf(" %c",&j);}}void CreateHuffmanTree(HuffmanTree &HT,unsigned int *w,int n){//w存放n个结点的权值,将构造⼀棵哈夫曼树HTint i,m;int s1,s2;HuffmanTree p;if(n<=1) return;m=2*n-1; //n个叶⼦结点的哈夫曼树,有2*n-1个结点HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //开辟2*n各结点空间for(p=HT+1,i=1;i<=n;++i,++p,++w) //进⾏初始化{p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;}for(;i<=m;++i,++p){p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}for(i=n+1;i<=m;++i) //建哈夫曼树{Select(HT,i-1,s1,s2);//从HT[1...i-1]中选择parent为0且weight最⼩的两个结点,其序号分别为s1和s2HT[s1].parent=i; HT[s2].parent=i; //修改s1和s2结点的⽗指针parentHT[i].lchild=s1; HT[i].rchild=s2; //修改i结点的左右孩⼦指针HT[i].weight=HT[s1].weight+HT[s2].weight; //修改权值}}void HuffmanCoding(HuffmanTree HT,HuffmanCode &HC,int n){//将有n个叶⼦结点的哈夫曼树HT进⾏编码,所编的码存放在HC中//⽅法是从叶⼦到根逆向求每个叶⼦结点的哈夫曼编码int i,c,f,start;char *cd;HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); //分配n个编码的头指针向量cd=(char *)malloc(n*sizeof(char)); //开辟⼀个求编码的⼯作空间cd[n-1]='\0'; //编码结束符for(i=1;i<=n;++i) //逐个地求哈夫曼编码{start=n-1; //编码结束位置for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) //从叶⼦到根逆向求编码if(HT[f].lchild==c) cd[--start]='0'; //若是左孩⼦编为'0' else cd[--start]='1'; //若是右孩⼦编为'1'HC[i]=(char *)malloc((n-start)*sizeof(char)); //为第i个编码分配空间strcpy(HC[i],&cd[start]); //将编码从cd复制到HC中}free(cd); //释放⼯作空间}void PrintHuffmanCode(HuffmanCode HC,unsigned int *w,int n){//显⽰有n个叶⼦结点的哈夫曼树的编码表int i;printf("HuffmanCode is :\n");for(i=1;i<=n;i++){printf(" %3d---",w[i-1]);puts(HC[i]);}printf("\n");}void Select(HuffmanTree HT,int t,int&s1,int&s2){//在HT[1...t]中选择parent不为0且权值最⼩的两个结点,其序号分别为s1和s2 int i,m,n;m=n=10000;for(i=1;i<=t;i++){if(HT[i].parent==0&&(HT[i].weightif(m{n=HT[i].weight;s2=i;}else {m=HT[i].weight;s1=i;}。
软件技术技术实验报告
电子科技大学通信学院标准实验报告(实验)课程名称软件技术基础实验名称软件技术基础设计学生姓名雷宏伟学号2015010910001指导老师孟中楼电子科技大学教务处制表一、实验室名称:基础实验大楼506二、项目名称:顺序表三、实验学时:4学时四、设计目的:通过建立顺序表,熟悉顺序表的建立,在顺序表中插入,删除元素等用法。
五、设计原理:六、设计内容:1)首先创建一个顺序表:从键盘读入一组整数(长度小于等于11),按输入顺序放入顺序表,输入以-1结束(注意-1不放到顺序表内);将创建好的顺序表元素依次输出到屏幕上。
2)在已创建好的顺序表中插入一个元素:从键盘读入需插入的元素值和插入位置,调用插入函数完成插入操作;然后将顺序表元素依次输出到屏幕上。
3)在已创建好的顺序表中删除一个元素:从键盘读入欲删除的元素位置(序号),调用删除函数完成删除操作;然后将顺序表元素依次输出到屏幕上。
4)删除顺序表中元素值为负数的所有元素,然后将顺序表元素依次输出到屏幕上。
七、实验器材(设备、元器件):计算机,vc实验平台八、测试步骤:1)编写语句2)运行测试3)查看结果九、测试数据及结果分析:十、设计与测试结论:十一、总结及心得体会:通过实验深刻了解了顺序表的用法,并实现了顺序表的插入,元素的删除等功能。
十二、对本实验过程及方法、手段的改进建议:1)对于程序编写生疏了,由于原先用的是vs,首次用vc不太习惯,应多加练习,对于顺序表掌握还不够完全,课余应多交流。
2)第四个内容刚开始不能运行,后来改进后成功。
报告评分:指导教师签字:。
计算机软件技术基础实验报告
计算机软件实验报告姓名:班级:学号:指导教师:实验一线性表的基本操作一、实验目的与基本要求1.掌握数据结构中的一些基本概念。
数据、数据项、数据元素、数据类型和数据结构,以及它们之间的关系。
2.了解数据的逻辑结构和数据的存储结构之间的区别与联系;数据的运算与数据的逻辑结构的关系。
3.掌握线性表的基本操作:插入、删除、查找以及线性表的合并等运算。
4.掌握运用C语言上机调试线性表的基本方法。
二、实验条件1.硬件:一台微机2.软件:操作系统和C语言系统三、实验方法确定存储结构后,上机调试实现线性表的基本运算。
四、实验内容1.试编写在无头结点的单链表上实现线性表基本运算LOCATE(L,X),INSERT (L,X,1)和DELETE(L,1)的算法。
2.假设有两个按数据元素值递增有序排列的线性表A和B,均以单链表作为存储结构。
编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C,并要求利用原表(即A表和B表)结点空间存放表C。
3.将一个线性表中的值就地逆置。
4.在线性表的顺序存储结构的第一个位置上插入一个元素。
(注意区分链表和顺序表)实验代码:#include"stdlib.h"#include"stdio.h"struct node //定义结构体{int d;struct node *next;};struct node *head1,*head2,*p,*q;void pre(struct node *head) //打印数据{printf("链表中的数据为:\n");p=head;while(p!=NULL){printf("%5d",p->d);q=p;p=p->next;}printf("\n");}struct node *creat() //建立链表{struct node *head;int x;printf("输入你要储存的数据:\n");head=NULL;q=NULL;scanf("%d",&x);while(x>0){p=(struct node *)malloc(sizeof(struct node));p->d=x;p->next=NULL;if(head==NULL) head=p;else q->next=p;q=p;scanf("%d",&x);getchar();}pre(head);return (head);}void locate(struct node *head,int x) //查找链表中的数据{int u=1;p=head;while (p->next!= NULL){if (p->d==x)break;else{ p=p->next;u++;}}if(p->d!= x)printf("无此结点");printf("在链表中的位置为:");printf("%d",u);}void insert(struct node *head,int x, int i) //插入数据{ p = head;int j=1;q=(struct node *)malloc(sizeof(struct node));q->d=x;if(i==1){ q->next=head;head=q;}else{while((j<i-1)&&(p->next !=NULL)){j++;p=p->next;}q->next=p->next;p->next=q;}}void delet(struct node *head,int i) //删除数据{ p=head;int j=1;if(i<0) printf("无此位置");if(i==1){q=head; head=head->next; free(q);}else{while((j<i-1) && (p->next != NULL)){ p=p->next;j++;}q=p->next;p->next=q->next;free(q);}}void hebing(struct node *x,struct node *y) //合并两个链表{p=x;q=y;while(p->next!=NULL)p=p->next;p->next=q;pre(x);}void paixu(struct node *head) //对链表中的数据进行排序{int m,n,i=1,t;p=head;while(p->next!=NULL){p=p->next;i++;}p=head;for(n=i;n>1;n--){p=head;for(m=1;m<n;m++){q=p->next;if(p->d<q->d){t=p->d;p->d=q->d;q->d=t;}p=p->next;}}}void caozuo(struct node *head) //操作界面{int m,n;char t;printf("输入你要的操作:,查找 2,插入 3,删除\n");scanf("%c",&t);switch(t){case'1':{printf("输入你要查找的元素的值:\n");scanf("%d",&m);locate(head,m);}break;case'2':{printf("输入你要插入的元素的值和位置:\n");scanf("%d",&m);scanf("%d",&n);insert(head,m,n);pre(head);}break;case'3':{printf("输入你要删除的元素的位置:\n");scanf("%d",&m);delet(head,m);pre(head);}break;default:printf("error\n");}}void main() //主函数{char frag='y',n=NULL;printf("输入你要建立的第A链表中的元素:\n");head1=creat();printf("输入你要建立的第B链表中的元素:\n");head2=creat();do{printf("选择你要操作的链表A/B或者合并排序操作C:\n"); //选择操作scanf("%c",&n);getchar();switch(n){case'A':{caozuo(head1);}break;case'B':{caozuo(head2);}break;case'C':{hebing(head1,head2);paixu(head1);pre(head1);}break;default:printf("error\n");}printf("\n是否继续y/n:\n");scanf("%c",&frag);getchar();}while(frag=='y');}实验2 栈和队列的基本操作一、实验目的与基本要求1.掌握栈和队列的顺序存储和链式存储结构2.掌握栈和队列的特点。
计算机软件技术基础实验报告
学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月18日成绩:实验一顺序表的基本操作及学生信息管理实现一、实验目的1.掌握顺序表结构的实现方式。
2.掌握顺序表常用算法初始化、插入、删除等操作的程序实现。
2.熟悉利用顺序表解决问题的一般思路。
3.学习体会顺序表结构的优点与不足。
二、实验用软件和工具实验软件 VC++ 6.0三、实验步骤利用顺序表实现学生信息管理。
学生的信息包括学号、姓名、性别、班级和联系电话,功能要求:信息浏览:显示所有学生信息列表;插入信息:在线性表的头部插入一个学生信息;删除信息:按照学号删除某个学生的信息;修改信息:实现按照学号修改某个学生信息;退出程序。
编写程序调试并输出结果。
(1)建立一个顺序表、设计顺序表表的基本操作实现算法、调试并输出结果。
(2)参考顺序表的算法描述和算法的实现,在本程序中修改顺序表的插入、删除、修改等算法的实现函数。
①信息的浏览②利用插入功能插入学生信息。
③利用删除功能删除学生信息。
④利用修改功能修改学生信息。
(3)编写主函数,可通过在while循环结构中嵌入switch分支结构实现操作选择功能。
(4)可以增加学生的课程成绩,实现成绩的统计分析功能。
四、实验程序与程序运行结果#include <stdio.h>#include <string.h>struct data{int number;char name[10];char sex[5];char classes[5];int tel;};int insert(struct data st[5],int n); /*申明插入函数*/void scanning(struct data st[5],int n); /*申明浏览函数*/学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月18日成绩:int del(struct data st[5],int n); /*申明删除函数*/void fix(struct data st[5],int n); /*申明修改函数*/int main(){struct data st[5];int chioce,flag=1;int n;n=0;while(flag){printf("请选择功能:\n 1—信息浏览\n 2—插入信息\n 3—删除信息\n 4-修改信息\n 0—退出程序\n");scanf("%d",&chioce);switch(chioce){case 1:scanning(st,n);break;case 2:n=insert(st,n);break;case 3:n=del(st,n);break;case 4:fix(st,n);break;case 0:flag=0;break;}}printf("\n");printf("谢谢使用!\n");return 0;}void scanning(struct data st[5],int n) /*定义浏览函数*/{int i;if(n==0) /*无元素*/{printf("请选择功能键,先插入名单!\n");printf("\n");printf("\n");}else{学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月18日成绩:for(i=1;i<=n;i++){printf(" 学号:%d\n ",st[i].number);printf(" 姓名:%s\n",st[i].name);printf(" 性别:%s\n",st[i].sex);printf(" 班级:%s\n",st[i].classes);printf("联系方式:%d\n",st[i].tel);printf("\n");}}}int insert(struct data st[5],int n) /*定义插入函数*/{int i,p;struct data t;if(n>=5){printf("内存已满!\n");printf("\n");}else{printf("请输入学号:\n");scanf("%d",&t.number);printf("请输入姓名:\n");scanf("%s",);printf("请输入性别:\n");scanf("%s",t.sex);printf("请输入班级:\n");scanf("%s",t.classes);printf("请输入号码:\n");scanf("%d",&t.tel);}for(i=n;i>0;i--) /*所有元素后移*/{st[i+1].number=st[n].number;strcpy(st[i+1].classes,st[i].classes);strcpy(st[i+1].name,st[i].name);strcpy(st[i+1].sex,st[i].sex);st[i+1].tel=st[i].tel;}st[1].number=t.number;strcpy(st[1].classes,t.classes);strcpy(st[1].name,);strcpy(st[1].sex,t.sex);学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月18日成绩:st[1].tel=t.tel;p=n+1;return p;}int del(struct data st[5],int n) /*定义删除函数*/{int m,i,q,t;printf("请输入你要删除的同学的学号:\n");scanf("%d",&m);for(i=1;i<=n;i++){if(st[i].number==m){t=i;break;}}for(i=t;i<n;i++) /*删除结点后的所有元素后移*/{st[i].number=st[i+1].number;st[i].tel=st[i+1].tel;strcpy(st[i].classes,st[i+1].classes);strcpy(st[i].name,st[i+1].name);strcpy(st[i].sex,st[i+1].sex);}q=n-1;return q;}void fix(struct data st[5],int n) /*定义修改函数*/{int i,m,p,t=1;struct data s;printf("请输入你要修改的学生的学号:\n");scanf("%d",&m);for(i=1;i<=n;i++){if(st[i].number==m){while(t){printf("你想要修改哪项数据?\n 1代表学号\n 2代表姓名\n 3代表性别\n 4代表班级\n 5代表联系方式\n (注意:修改完毕请输入)\n");scanf("%d",&p);switch(p)学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月18日成绩:{case 1:printf("请输入修改后的学号!\n");scanf("%d",&s.number);st[i].number=s.number;break;case 2:printf("请输入修改后的姓名!\n");scanf("%s",);strcpy(st[i].name,);break;case 3:printf("请输入修改的性别!\n");scanf("%s",s.sex);strcpy(st[i].sex,s.sex);break;case 4:printf("请输入修改的班级!\n");scanf("%s",s.classes);strcpy(st[i].classes,s.classes);break;case 5:printf("请输入修改后的联系方式!\n");scanf("%d",&s.tel);st[i].tel=s.tel;break;case 0:t=0;break;}}}}}试验运行结果如图:学院:信电学院班级:姓名:学号:课程:计算机软件技术基础实验日期:2013年10月18日成绩:五、实验心得与体会掌握了顺序表的创建与数据的添加、删除、修改等操作;在设计功能性程序的过程中,对顺序表中的数据进行写入、查询实在很方便,正是其优点所在。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学通信与信息工程学院标准实验报告(实验)课程名称软件技术基础实验电子科技大学教务处制表电子科技大学实验报告一、实验室名称:校公共机房二、实验项目名称:二叉树和哈夫曼树三、实验学时:4学时四、实验原理:使用VS2010等C语言集成开发环境(IDE),在微型计算机上对程序进行编辑、编译、连接与运行。
通过上机练习掌握二叉树的建立、插入删除,遍历等方法和过程,掌握递归函数在二叉树建立,遍历中的应用,掌握哈夫曼树的最小路径和建立过程。
五、实验目的:1.熟练二叉树和哈夫曼树的概念和基本操作方法。
2.掌握课程平台使用方法。
六、实验内容:上机完成所有函数,编程实验,调试运行程序并完成报告。
七、实验器材(设备、元器件):硬件要求:普通pc机,1G内存,100G硬盘空间即可。
软件要求:Windows 7,包括C编译器的IDE。
八、实验步骤、实验编程与运行结果:下面建立该二叉树并展示输出结果:#include<stdio.h>#include<stdlib.h>typedef struct bnode{int data;struct bnode *lc,*rc;};struct bnode* create(){struct bnode *tree=NULL;char ch;ch=getchar();if(ch=='_')tree=NULL;else{tree=(struct bnode *)malloc(sizeof(struct bnode));tree->data=ch;tree->lc=create();tree->rc=create();}return tree;}//先序遍历(根左右)--递归int preorder(struct bnode *root){putchar(root->data);if(root->lc!=NULL)preorder(root->lc);if(root->rc!=NULL)preorder(root->rc);}//中序遍历--递归int inorder(struct bnode *root){if(root->lc!=NULL)inorder(root->lc);putchar(root->data);if(root->rc!=NULL)inorder(root->rc);}//后序遍历--递归int postorder(struct bnode *root){if(root->lc!=NULL)postorder(root->lc);if(root->rc!=NULL)postorder(root->rc);putchar(root->data);}int main(){struct bnode *root=NULL;printf("先序建立二叉树,输入变量: (下划线为NULL):");root=create(); //输入(ABC DE G F )printf("先序遍历输出:");preorder(root);printf("\n");printf("中序遍历输出:");inorder(root);printf("\n");printf("后序遍历输出:");postorder(root);printf("\n");}下面建立该二叉树并展示输出结果:#include<stdio.h>#include<stdlib.h>struct hftree{int data;struct hftree *left;struct hftree *right;};struct hftree *CreateHuffman(int a[], int n){int i, j;struct hftree *b[100], *q;//假设哈弗曼书最大为100个节点for (i = 0; i < n; i++) //初始化b指针数组,使每个指针元素指向a数组中对应的元素结点{b[i]=(struct hftree*)malloc(sizeof(struct hftree));b[i]->data=a[i];b[i]->left=NULL;b[i]->right=NULL;}for (i = 1; i < n; i++)//进行n-1 次循环建立哈夫曼树{//k1表示森林中具有最小权值的树根结点的下标,k2为次最小的下标int k1 = -1, k2;for (j = 0; j < n; j++)//让k1初始指向森林中第一棵树,k2指向第二棵{if (b[j] != NULL && k1 == -1){k1 = j;continue;}if (b[j] != NULL){k2 = j;break;}}for (j = k2; j < n; j++)//从当前森林中求出最小权值树和次最小{if (b[j] != NULL){if (b[j]->data < b[k1]->data){k2 = k1;k1 = j;}else if (b[j]->data < b[k2]->data)k2 = j;}}//由最小权值树和次最小权值树建立一棵新树,q指向树根结点q = (struct hftree*)malloc(sizeof(struct hftree));q->data = b[k1]->data + b[k2]->data;q->left = b[k1];q->right = b[k2];b[k1] = q;//将指向新树的指针赋给b指针数组中k1位置b[k2] = NULL;//k2位置为空}free(b); //删除动态建立的数组breturn q; //返回整个哈夫曼树的树根指针}//求哈夫曼树的带权路径长度int WeightPathLength(struct hftree* T, int len)//len初始为0{if (T == NULL) //空树返回0return 0;else{if (T->left == NULL && T->right == NULL)//访问到叶子结点return T->data * len;else //访问到非叶子结点,进行递归调用,返回左右子树的带权路径长度之和,len 递增return WeightPathLength(T->left,len+1)+WeightPathLength(T->right,len+1);}}//哈夫曼编码(可以根据哈夫曼树带权路径长度的算法基础上进行修改)void HuffManCoding(struct hftree* T, int len)//len初始值为0{static int a[10];//定义静态数组a,保存每个叶子的编码,数组长度至少是树深度减一if (T != NULL)//访问到叶子结点时输出其保存在数组a中的0和1序列编码{if (T->left == NULL && T->right == NULL){int i;printf("结点权值为%d的编码:", T->data);for (i = 0; i < len; i++)printf("%d", a[i]);printf("\n");}else{a[len] = 0;HuffManCoding(T->left, len + 1);a[len] = 1;HuffManCoding(T->right, len + 1);}}}int main(){int n, i;int a[100];struct hftree* t;printf("从键盘输入待构造的哈夫曼树中带权叶子结点数n:");scanf("%d", &n);printf("从键盘输入%d个整数作为权值:", n);for (i = 0; i < n; i++)scanf(" %d", &a[i]);t = CreateHuffman(a, n);printf("哈夫曼树的带权路径长度:");printf("%d\n", WeightPathLength(t, 0));printf("各个数据的哈夫曼编码:\n");HuffManCoding(t, 0);}。