北航计软实验报告一
北航计算机网络实验1组网实验

BGP BGP BGP 路 由 策 略 路 由 性 、 路 由 聚 属 协 议 基 本 析 、 状 态 换 、 转 分
IPv6
IGMP
的 编 程 、
协 议 、
组 网 设 计
邻 居 建
网 络 布 线 测 试
网 络 协 议 测 试
网 络 故 障 诊 断
、
端 口 技 术 、
协 议 分 析 、 基
协 议
构 、 SPF 计 算 法 、 算
10.1.2.254
10.2.3.254
ls2 S3526
OSPF
10.1.3.3 10.0.0.245 10.1.2.4 10.1.3.4 10.0.0.241 10.1.2.5 10.1.3.5 10.0.0.237
10.1.2.3
总行 数据 中心
rt5 R2610
ls7 S5516-1
ls8 S5516-2
10
北航计算机网络实验
主要内容
课程介绍 规章制度 实验环境 常用操作 组网实验
11
北航计算机网络实验
课程实验环境(1/4) 课程实验环境(1/4)
与华为公司共同建设北航-华为网络实验室, 与华为公司共同建设北航-华为网络实验室, 北航方面近几年投资约600万元; 万元; 北航方面近几年投资约 万元 实验设备 高端设备:核心路由器、交换机10 10台 高端设备:核心路由器、交换机10台; 中低端路由器40 40台 三层交换机48 48台 中低端路由器40台,三层交换机48台; 自行研制了部分实验设备, 机柜; 自行研制了部分实验设备,如机柜; 实验室网络布线 4人一组,每组 台路由器和两台三层交换机, 人一组, 台路由器和两台三层交换机, 人一组 每组2台路由器和两台三层交换机 4台PC;可最多同时容纳 人进行实验 台 ;可最多同时容纳70人进行实验
北航大软报告

北京航空航天大学航空学院微机原理与应用专业班级:140511 学号:14051004 姓名:张佳奇实验一Debug程序的使用一实验目的1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。
2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二实验内容1、启动DOS操作系统2、运行程序(若当前盘为C)C:>DEBUG↙– ;(“–”为DEBUG提示符,仅当屏幕出现该提示符后,才可输入DEBUG命令)3、用“A”命令编辑和汇编源程序–A ↙2A7D: 0100 MOV AX,02012A7D: 0103 MOV BX,02002A7D: 0106 MOV CX,00012A7D: 0109 MOV DX,00002A7D: 010C INT 132A7D:010E INT 32A7D:010F4、用“U”命令反汇编验证源程序–U 100↙5、程序未执行前,用“R”命令观察,相关寄存器的内容。
–R↙如:(AX)= 0000,(BX)= 0000,(SI)= 0000 ,(DI)= 0000 ,(CS)= 13B0 ,(IP)= 0100。
6、用“G”命令运行源程序7、再用“D”命令观察DS:0100H~DS:010BH字节单元中的内容–D 100 10B8、用“T”单步操作命令对源程序单步执行,观察AX、BX、CS、IP寄存器内容的变化,并与预计的结果相比较。
注意:●D命令显示内存数据,注意观察多字节数据在内存中的存放方式。
●指令执行的时候,IP寄存器随着变化,注意观察。
三实验结果(截屏)实验结果表明,AX、BX、CS、IP寄存器内容与预计的结果一致。
实验二汇编语言程序设计A 1、显示hello world!实验结果(包括必要截图)实验截图B 1、找出从无符号字节数据存储变量V AR开始存放的6个数_2_,_4_,_1_,_1_,_3_,_9_中最大数放在BH中。
(2,4,1,1,3,9)2、用文字编辑工具edit或记事本将程序输入,扩展名为.asm,使用masm type link 产生exe 并使用debug检查3、写出实验程序A. 显示hello world!DATAS SEGMENTSTRING DB 13,10,'Hello World!',13,10,'$'DA TAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DA TASMOV DS,AXLEA DX,STRINGMOV AH,9INT 21HMOV AH,4CHINT 21HCODES ENDSEND STARTB.找出从无符号字节数据存储变量V AR开始存放的N个数中最大数放在BH中DSEG SEGMENTV AR DB 2,4,1,1,3,9N EQU $-V ARANSWER DB 2 DUP(?)DSEG ENDSSTACKS SEGMENT PARA STACK 'STACK'DB 200 DUP(?)STACKS ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,SS:STACKSBG: MOV AX,DSEGMOV DS,AXMOV CX,N-1MOV SI,0MOV BH,V AR[SI]JCXZ LASTAGIN: INC SICMP BH,V AR[SI]JAE NEXTMOV BH,V AR[SI]NEXT: LOOP AGINLAST: MOV AH,BHMOV DI,OFFSET ANSWERADD AH,48MOV [DI],AHPUSH AXMOV DL,[DI]MOV AH,02H;MOV SI,0INT 21HPOP AXMOV AH,4CHINT 21HCSEG ENDSEND BG4、实验结果(包括必要截图)实验截图。
北航计算机软件技术基础实验报告计软实验报告3——冒泡排序和快速排序

实验报告实验名称冒泡排序和快速排序班级学号姓名成绩#include<stdio.h>#include<stdlib.h>#define N 20//定义用于比较和交换计数的全局变量static int compare, move;int main(){int data1[N], data2[N];int i;void bubbleSort(int[20]);void quickSort(int[20], int, int);//创建两个相同的数组用于两种排序方法for (i = 0; i<N; i++){data1[i] = rand() % 100 + 1;data2[i] = data1[i];}printf("The original array:\n");for (i = 0; i<N; i++)printf("%d ", data1[i]);//调用冒泡排序法bubbleSort(data1);//计数器置零compare = 0;move = 0;//调用快速排序法quickSort(data2, 0, N - 1);printf("Quicksort completed!The results are as follows:\n");for (i = 0; i<N; i++)printf("%d ", data2[i]);printf("\nCompare times:%d\n", compare);printf("Move times:%d", move);return 0;}//冒泡排序法void bubbleSort(int a[N]){int i, j, temp;compare = 0;move = 0;//总共循环N-2轮for (i = 0; i<N - 1; i++){//每轮循环从头开始,到有序序列前结束for (j = 0; j<N - i - 1; j++){//比较交换,将较大的数放到后面if (a[j + 1]<a[j]){temp = a[j + 1];a[j + 1] = a[j];a[j] = temp;move++;}compare++;}}printf("\n\nBubblesort completed!The results are as follows:\n");for (i = 0; i<N; i++)printf("%d ", a[i]);printf("\nCompare times:%d\n", compare);printf("Move times:%d\n\n", move);}//快速排序法void quickSort(int a[N], int left, int right){//将数组一分为二的键值int pivotkey;if (left < right){//第一次排序将数组一分为二pivotkey = partition(a, left, right);//递归调用,对数据比键值小的数组排序quickSort(a, left, pivotkey - 1);//递归调用,对数据比键值大的数组排序quickSort(a, pivotkey + 1, right);}}//进行一次快速排序int partition(int a[N], int left, int right){int key, i, low = left, high = right;//设置基准key = a[low];while (low<high){//high中数据比基准大,则向前依次查找while ((low < high) && (a[high] > key)){high--;compare++;}//如果不是两指针相遇,说明存在需要交换到low的值if (low < high){a[low] = a[high];move++;}//low中数据比基准小,则向后依次查找while ((low < high) && (a[low] <= key)){low++;compare++;}//如果不是两指针相遇,说明存在需要交换到high的值if (low<high){a[high] = a[low];move++;}}//首尾指针相遇后,将基准放入空位a[low] = key;//返回此时的键值return low;}运行结果:【结论】(结果)1.由实验结果知,编写的冒泡排序法和快速排序法都成功的将一个无序的数组排成了一个有序数组并打印输出,说明这两种算法是可行的。
北航计算机控制系统实验报告

北航计算机控制系统实验报告一、实验目的通过本实验,旨在加深对计算机控制系统的理解,熟悉计算机控制系统的基本组成和原理,并能够运用所学知识进行实际的控制系统设计与调试。
二、实验原理计算机控制系统是一种通过计算机对实际物体或过程进行控制的系统。
其基本组成包括传感器、执行机构、人机界面、控制算法和控制器等。
传感器负责将物理量转换成电信号,输入给计算机;执行机构根据计算机的控制信号完成相应的动作;人机界面提供了与计算机进行交互的方式;控制算法基于传感器采集到的信息和用户的输入,计算出执行机构所需的控制信号;控制器根据控制算法输出的控制信号与执行机构进行交互。
三、实验内容本实验的主要内容为设计一个自动化温控系统。
系统包括一个温度传感器、一个加热器和一个温度控制器。
温度传感器负责采集环境温度,并将其转换成模拟电信号输入给温度控制器;加热器根据温度控制器输出的控制信号控制加热功率,从而调节环境温度;温度控制器根据温度传感器采集到的温度信号和用户设定的目标温度,计算出加热功率控制信号。
四、实验步骤1.连接硬件设备将温度传感器的输出接口与温度控制器的输入接口相连;将温度控制器的输出接口与加热器的输入接口相连。
2.设计控制算法根据用户设定的目标温度和实际温度,设计一个控制算法,计算出加热功率控制信号。
常见的控制算法包括PID控制算法、模糊控制算法等。
3.编写控制程序使用编程语言编写一个控制程序,根据控制算法计算出的控制信号,通过温度控制器的输出接口发送给加热器。
4.调试控制系统运行控制程序,观察温度控制系统的运行情况。
根据实际温度与目标温度的偏差调整控制算法的参数,使系统达到较好的控制效果。
五、实验结果分析运行实验过程中,通过观察实际温度与目标温度的偏差,可以评估系统的控制效果。
根据实际情况,调整控制算法的参数,使系统的响应速度更快、稳定性更好。
六、实验总结通过本实验,我对计算机控制系统的基本原理和组成有了更深入的理解,掌握了控制系统的设计与调试方法,并在实践中提高了解决实际问题的能力。
北航计算机控制系统实验报告

北航计算机控制系统实验报告计算机控制系统实验报告实验一模拟式小功率随动系统的实验调试实验二 A/D、D/A接口的使用和数据采集实验三中断及采样周期的调试实验四计算机控制系统的实验调试姓名:陈启航学号: 13031144 同组人:吴振环陈秋鹏李恺指导教师:袁少强日期: 2016年6月16日实验一二阶系统的电子模拟及时域响应的动态测试一、实验目的1. 熟悉反馈控制系统的结构和工作原理,进一步了解位置随动系统的特点。
2. 掌握判别闭环系统的反馈极性的方法。
3. 了解开环放大倍数对稳定性的影响及对系统动态特性的影响,对静态误差的影响。
二、实验内容1. 连接元件构成位置随动系统;2. 利用计算机内的采样及显示程序,显示并分析输出的响应结果;3. 反复调试达到设计要求。
三、实验设备XSJ-3 小功率直流随动系统学习机一台、DH1718 双路直流稳压电源一台、4 1/2 数字多用表一台四、实验原理模拟式小功率随动系统如下图所示:1. 实验前需进行零位调整,反馈极性判断,反馈极性判断又包括速度反馈极性判断和位置反馈极性判断,须使反馈为负反馈。
2. 动态闭环实验系统调试。
按下面电路图连线,通过改变变阻器大小来改变闭环系统放大倍数,通过一路A/D把输出相应采入计算机进行绘图,同时测量输入电压和反馈电位计输入电压,算出稳态误差。
五、实验结果滑阻阻值(千欧)7.118.324.138.3比例系数 1 1.52.753.7 给定角度(度)30 60 120输出角度(度)38 66 129静差角度(度) 3 1 4静态误差(mv)-146.7-6.2-193.5过度过程曲线见下图1.K=1时的过渡过程曲线2.K=1.5时的过渡过程曲线3.K=2.75时的过渡过程曲线4.K=3.7时的过渡过程曲线六、思考题及实验感想1 如果速度反馈极性不对应如何处理?如果位置反馈极性不对应如何处理?答:首先判断测速机反馈极性。
在一级运放处加一电压,记住电机转向,然后断开输入,用手旋转电机按同一转向转动,测量测速机输出电压,如与前电机所加电压极性相同,则可将该信号接入运放二的负端;否则应把测速机输出极性倒置,即把另一信号接入运放二的负相端。
(完整版)北航微机原理实验报告

微计算机原理及运用实验报告目录实验一:I/O地址译码实验 (4)一、实验目的 (4)二、实验原理和内容 (4)三、实验程序 (4)四.实验总结 (5)实验二:8255并行接口实验 (6)一、实验目的 (6)二、实验原理和内容 (6)三、程序框图 (7)四.实验程序 (7)五.实验总结 (8)实验三:键盘显示控制实验 (9)一、实验目的 (9)二、实验内容及原理 (9)三、流程图 (10)四.程序 (10)五.实验总结 (13)实验四:8254定时器/计数器实验 (14)一、实验目的 (14)二、实验原理和内容 (14)三、实验程序 (14)四.实验总结 (15)实验五:继电器控制实验 (16)一、实验目的 (16)二、实验原理和内容 (16)三、实验中使用的程序 (16)四.实验总结 (18)实验六:DMA传送 (18)一、实验目的 (18)二、实验原理和内容 (18)三、程序 (19)四.实验总结 (20)实验七:8259 中断控制实验 (20)一、实验目的 (20)二、实验原理和内容 (21)三、流程图 (21)四.程序 (21)五.实验总结 (25)实验八:8255中断实验 (25)一、实验目的 (25)二、实验原理和内容 (25)三.实验程序 (26)四.实验总结 (27)实验一:I/O地址译码实验一、实验目的掌握I/O地址译码电路的工作原理。
二、实验原理和内容实验电路如附图1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。
译码输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:280H~287H,Y1:288H~28FH,……当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。
附图1 I/O地址译码电路利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。
北航计算机软件技术基础实验报告计软实验报告4-1——多媒体关系型数据库的建立

实验报告实验名称多媒体关系型数据库的建立班级学号姓名成绩图片OleObject)Create Table 客户数据(客户ID char(3) primary key,公司名称varchar(20),联系人姓名varchar(20),联系人头衔varchar(10),城市varchar(15),地区char(15),邮政编码char(6),电话char(8),传真char(8))Create Table 订单数据(订单ID char(4) primary key,客户ID char(3),雇员ID varchar(3),产品ID varchar(4),数量int,订购日期datetime,发货日期datetime,备注varchar(40))运行结果:关联数据库SQL语言建表雇员数据商品数据客户数据订单数据2.查询:(1)查询“客户数据”中在杭州或武汉的联系人姓名、电话、城市SELECT 联系人姓名,电话,城市FROM 客户数据WHERE (城市='杭州' OR 城市='武汉')运行结果:(2)查询“商品数据”中类别为光盘、耳机和外放设备的产品的产品名称、单价和库存量并根据单价递减顺序排列SELECT 产品名称,单价,库存量FROM商品数据WHERE 类别IN('光盘','耳机','外放设备')ORDER BY 单价DESC运行结果:3.插入:(1)在“雇员数据”中插入性别列,只能输入男或女ALTER TABLE 雇员数据ADD 性别char(1)运行结果:插入前插入后(2)在“商品数据”中插入一种产品名称为MP3的产品INSERT INTO商品数据(产品ID,产品名称,类别,单价,库存量)VALUES (‘150’,’MP3’,’外放设备’,’’260,’30’)运行结果:插入前插入后4.删除:(1)从“客户数据”中删除E商店的信息DELECT FROM 客户数据WHERE 公司名称=’E商店’运行结果:删除前删除后5.更改:(1)在“订单数据”中将订单ID为140810的订单的数量加3 UPDATE 订单数据SET 数量= 数量+ 3 WHERE 订单ID='140810'运行结果:更改前更改后实验三:在ACCESS数据库管理系统平台上建立查询表(视图)源代码:1.查找出三种最贵的商品SELECT TOP 3 * FROM 商品数据ORDER BY 单价DESC实验结果:2.统计某一雇员的销售额SELECT 雇员ID,SUM(数量*单价) AS 总销售额FROM 订单数据INNER JOIN 商品数据ON 订单数据.产品ID=商品数据.产品ID WHERE 雇员ID=[请输入要查询的雇员ID:] GROUP BY 雇员ID实验结果:【结论】(结果)1.由实验结果可知,利用SQL语句进行数据库的创建和维护是简洁高效的。
北航计算机软件技术基础实验报告计软实验报告2——二叉树

实验报告实验名称二叉树班级学号姓名成绩栈,将根结点入栈。
每次弹出栈顶元素,并判断左右子树的值。
如果头元素中存放的结点的左/右子树不为空,则入栈,直到栈顶指针为空。
4. 用栈结构来实现查找并交换子树的值。
先创建一个包含数据区域、顶部指针的栈,将根结点入栈。
每次弹出栈顶元素,并交换栈顶元素指向的结点的左右子树指针。
如果头元素中存放的结点的左/右子树不为空,则入栈,直到栈顶指针为空。
5.整理实验结果,写出实验报告【实验过程】(实验步骤、记录、数据、分析)实验一:源代码:/*实验内容:1:对给定二叉树用链式链式存储结构,利用队列与栈对二叉树进行运算。
2:按层次输出所有结点。
3:输出所有叶子结点。
4:将所有左右子树值交换。
*/#include<stdio.h>#include<stdlib.h>#define MAXSIZE 31//定义二叉树结构体,用一维数组模拟数据域,用两个一维数组模拟左、右链域typedef struct BinaryTree{int data[MAXSIZE];int leftChild[MAXSIZE];int rightChild[MAXSIZE];int head;}BTree;int main(){//声明及调用相关函数struct BinaryTree initBinaryTree(struct BinaryTree);struct BinaryTree createBinaryTree(struct BinaryTree);void levelOrder(struct BinaryTree);void leafNode(struct BinaryTree);void exchangeBranch(struct BinaryTree);printf("Exercise 1\n");BTree bt;bt = initBinaryTree(bt);bt = createBinaryTree(bt);printf("A binary tree has been created!\n\n\n");printf("Exercise 2\n");levelOrder(bt);printf("Exercise 3\n");leafNode(bt);printf("Exercise 4\n");exchangeBranch(bt);return 0;}//实验1:初始化二叉树struct BinaryTree initBinaryTree(struct BinaryTree bt) {int i;//数据域认为0为空,左右链域认为-1为空for (i = 0; i<MAXSIZE; i++){bt.data[i] = 0;bt.leftChild[i] = -1;bt.rightChild[i] = -1;}bt.head = -1;return bt;}//创建含有数据的二叉树struct BinaryTree createBinaryTree(struct BinaryTree bt) {int i;printf("Please enter all nodes:\n");//将数据放入数据域for (i = 0; i<MAXSIZE; i++)scanf("%d", &bt.data[i]);//形成链式存储for (i = 0; i < (MAXSIZE - 1) / 2; i++){if (bt.data[2 * i + 1] != 0)bt.leftChild[i] = 2 * i + 1;if (bt.data[2 * i + 2] != 0)bt.rightChild[i] = 2 * i + 2;}bt.head = 0;return bt;}//实验2:按层次输出各节点void levelOrder(struct BinaryTree bt){//创建一个空队列,包含存放二叉树结点地址的一维数组和头尾指针int queue[MAXSIZE];int front = -1, rear = -1, i = bt.head;int addQueue(int[MAXSIZE], int, int);int delQueue(int);//判定二叉树是否为空if (i == -1)printf("This tree is empty!Please create one!");//根结点入队rear = addQueue(queue, i, rear);printf("All existed nodes are as follows:\n");//当队列不为空时(队列不满的前提下)while (front != rear){//头元素出队,并将其中地址值赋给ifront = delQueue(front);i = queue[front];printf("%d ", bt.data[i]);//如果头元素中存放的结点的左/右子树不为空,则入队if (bt.leftChild[i] != -1)rear = addQueue(queue, bt.leftChild[i], rear);if (bt.rightChild[i] != -1)rear = addQueue(queue, bt.rightChild[i], rear);}printf("\n\n\n");}//元素入队int addQueue(int queue[MAXSIZE], int i, int rear){rear++;//循环队列指针处理方法if (rear == MAXSIZE) rear = 0;queue[rear] = i;return rear;}//元素出队int delQueue(int front){front++;//循环队列指针处理方法if (front == MAXSIZE) front = 0;return front;}//实验3:查找所有叶子结点void leafNode(struct BinaryTree bt){//新建一个空栈,包含存放二叉树结点地址的一维数组和栈顶指针int stack[MAXSIZE];int top = -1, i = bt.head;int pushStack(struct BinaryTree, int[MAXSIZE], int, int);int popStack(int);//判定二叉树是否为空if (i == -1)printf("This tree is empty!Please create one!");//根结点入栈top = pushStack(bt, stack, top, i);printf("All leaf nodes are as follows:\n");while (top != -1){//栈顶元素出栈top = popStack(top);//取出存放的地址值i = stack[top + 1];//判断是否为叶子结点if (bt.leftChild[i] == -1 && bt.rightChild[i] == -1) printf("%d ", bt.data[i]);//如果头元素中存放的结点的左/右子树不为空,则入栈else{if (bt.rightChild[i] != -1)top = pushStack(bt, stack, top, bt.rightChild[i]);if (bt.leftChild[i] != -1)top = pushStack(bt, stack, top, bt.leftChild[i]);}}printf("\n\n\n");}//入栈操作int pushStack(struct BinaryTree bt, int stack[MAXSIZE], int top, int i){top++;stack[top] = i;return top;}//出栈操作int popStack(int top){top--;return top;}//实验4:交换左右子树的值void exchangeBranch(struct BinaryTree bt){//新建一个空栈,包含存放二叉树结点地址的一维数组和栈顶指针int stack[MAXSIZE];int top = -1, i = bt.head, temp;//判定二叉树是否为空if (i == -1)printf("This tree is empty!Please create one!");//根结点入栈top = pushStack(bt, stack, top, i);printf("All branches have been changed!\n");printf("The results are as follows:\n");while (top != -1){//栈顶元素出栈top = popStack(top);//取出存放的地址值i = stack[top + 1];//判断存放的结点的左右子树是否均不为空,是则入栈if (bt.leftChild[i] != -1 && bt.rightChild[i] != -1){top = pushStack(bt, stack, top, bt.rightChild[i]);top = pushStack(bt, stack, top, bt.leftChild[i]);}//将所有非叶子结点的左右子树指针交换temp = bt.leftChild[i];bt.leftChild[i] = bt.rightChild[i];bt.rightChild[i] = temp;}//层次遍历输出交换后的二叉树levelOrder(bt);}运行结果:(从键盘输入15 98 6 20 10 45 0 30 40 0 0 0 60 0 0 0 0 0 0 0 0 0 0 0 0 70 0 0 0 0 0)实验二:自行设计的二叉树如下运行结果:(从键盘输入24 30 6 5 17 63 4 0 26 1 0 0 0 31 10 0 0 16 27 0 0 0 0 0 0 0 0 50 0 13 9)【结论】(结果)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北航计软实验报告一
————————————————————————————————作者: ————————————————————————————————日期:
计算机软件基础上机实验报告(一)
XXXXXX班XXX
1.实验目的
掌握线性表在顺序分配下的插入与删除运算;掌握线性表的链式存储结构;掌握插入排序的方法;并掌握一种产生随机数的方法。
2.实验内容
1.产生1000个0至999间的随机整数,并以产生的次序存入一个数据文件中。
2.编制一个程序,依次实现以下功能:
(1)ﻩ定义一个有序(非递减)线性表,其最大容量为1000,初始时为空。
(2)ﻩ从由1产生的数据文件中依次取前N个随机整数,陆续插入到此线性表中,并要求在每次插入后保持线性表的有序性。
最后将此有序线性表打印输出。
(3)ﻩ在由(2)产生的线性表中,依在1中产生的次序逐个将元素删除,直至表空为止。
3. 以N=100及N=400分别运行2的程序,并比较它们的运行时间。
4. 编写一个程序,用插入排序依次将1中产生的1000个随机整数链接成有序链表(不改变原随机数在存储空间中的顺序)。
3.源代码与运行结果
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/**
1_1
产生1000个0至999间的随机整数,并以产生的次序存入一个数据文件(1_1.txt)中。
**/
main()
{
FILE *fo=fopen("1_1.txt","w");
int i,j;
srand((unsigned)time(0));
for(i=0;i<=999;i++)fprintf(fo,"%d\n",rand()%1000);
fclose(fo);
printf("1000个随机数已输出至目录下1_1.txt文件\n");
system("pause");
}
输出文件1_1.txt如下:(因输出文本长度缘故,此处只截了一幅图)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/**
1_2
从数据文件(1_1.txt)中读取数据,进行插入排序,然后屏幕输出。
再依序删除。
1_3
以N=100及N=400分别运行2的程序,并比较它们的运行时间。
**/
#define N 1000
main()
{
int a[N]={0};
int i,j,m,w,num=0;
FILE *fi=fopen("1_1.txt","r");
clock_t start,finish;
doubleduration;
//Part 1 :
start=clock();
m=0;
fscanf(fi,"%d",&num);
a[0]=num;
w=m;
for (j=1;j<=N-1;j++)
{
w=m;
fscanf(fi,"%d",&num);
while ((a[w]>num)&&(w>=0))w--;
w++;
for(i=m;i>=w;i--)a[i+1]=a[i];
a[w]=num;
m++;
}
finish=clock();
duration=(double)(finish -start)/CLOCKS_PER_SEC;
printf("执行%d 个数据插入操作完成!用时:%f 秒,得到线性表如下:\n",m+1,duration);
for(i=0;i<N;i++) printf("%d",a[i]);
fclose(fi);
//Part 2:
start=clock();
for (j=0;j<=N-1;j++)
{
w=0;
fscanf(fi,"%d",&num);
while (a[w]<num) w++;
for(i=m;i<m;i++) a[i]=a[i+1];
a[m]=0;
m--;
}
finish=clock();
duration=(double)(finish -start)/CLOCKS_PER_SEC;
printf("\n\n删除操作完成!用时:%f秒,得到线性表如下:\n",duration);
for (i=0;i<N;i++) printf("%d ",a[i]);
printf("\n");
fclose(fi);
system("pause");
}
程序运行输出结果如下:(因输出文本长度缘故,此处只截了两幅图)
#include<stdio.h>
#include<stdlib.h>
/**
1_4
编写一个程序,用插入排序依次将1_1.txt中的1000个随机整数链接成有序链表
(不改变原随机数在存储空间中的顺序)
**/
#defineN 1000
main()
{
struct data
ﻩ{
ﻩint num;
ﻩstruct data *next;
};
struct data*n,*head,*temp;
ﻩFILE*fi=fopen("1_1.txt","rt");
ﻩint i,a=0;
n=(struct data*)malloc(sizeof(structdata));
n->next=NULL;
fscanf(fi,"%d",&a);
ﻩn->num=a;
ﻩhead=n;
for (i=1;i<=N-1;i++)
{
ﻩﻩn=(struct data*)malloc(sizeof(structdata));n->next=NULL;
ﻩfscanf(fi,"%d",&a);
ﻩﻩn->num=a;
ﻩtemp=head;
if ((n->num)<=(temp->num)) // n为目前最小值
ﻩ{
n->next=temp;
ﻩﻩhead=n;
ﻩﻩ}
ﻩﻩelse
ﻩ{
ﻩﻩwhile (((temp->next)!=NULL)&&((n->num) > ((temp->next)->num)) ) ﻩtemp=temp->next;
ﻩﻩﻩif (temp->next==NULL)temp->next=n; // n为目前最大值ﻩﻩelse //n插入链表
ﻩﻩ{
n->next=temp->next;
ﻩﻩﻩtemp->next=n;
ﻩﻩ}
ﻩ}
}
printf("插入排序完成\n");
printf("数据最小元素:%d\n",head->num);
printf("完整数据输出:\n");
temp=head;
while (temp->next!=NULL){printf("%d ",temp->num);temp=temp->next;}
fclose(fi);
system("pause");
}
程序运行输出结果如下:(因输出文本长度缘故,此处只截了一幅图)
4.实验总结
通过本次试验,我熟练掌握了线性表在顺序分配下的插入与删除运算,还有链表的存储结构、插入排序的方法,并且学习了产生随机数、文件数据输入输出、取得当前系统时间的方法。
➢srand函数用来将系统随机种子设定为当前时间(强制转化为unsigned),否则得到的伪随机数每次都相同,而rand()%1000则用来产生1-999的伪随机数。
➢在添加time.h库函数后,可以使用clock_t类型变量和clock()函数获取当前时间,从而进行程序运行时间计算(但精度貌似较低)。
到每过千分之一秒,clock()函数的返回值就会增加1,而常量CLOCKS_PER_SEC,它用来表示一秒钟有多少个时钟计时单元,故duration=(double)(finish-s tart)/CLOCKS_PER_SEC即可得到程序运行的时间(秒)。
➢文件读取输出可以通过以下语句简单完成:FILE*fi=fopen("fi.txt","r");
FILE*fo=fopen("fo.txt","w");
fscanf(fi,"%d",int);
fprintf(fo,"文件输出\n");
fclose(fi);
fclose(fo);。