北京邮电大学数值与符号计算实验报告

合集下载

北邮信通院数据结构实验报告三哈夫曼编码器.pptx

北邮信通院数据结构实验报告三哈夫曼编码器.pptx

-1
2.2 关键算法分析 (1)计算出现字符的权值
利用 ASCII 码统计出现字符的次数,再将未出现的字符进行筛选,将出现的字符及頻 数存储在数组 a[]中。
void Huffman::Init() {
int nNum[256]= {0}; //记录每一个字符出现的次数 int ch = cin.get();
第2页
北京邮电大学信息与通信工程学 院
2
-1
-1
-1
5
-1
-1
-1
6
-1
-1
-1
7
-1
-1
-1
9
-1
-1
-1
weight lchild rchild parent
2
-1
-1
5
5
-1
-1
5
6
-1
-1
6
7
-1
-1
6
9
-1
-1
7
7
0
1
7
第3页
北京邮电大学信息与通信工程学 院
13
2
3
8
16
5
4
8
29
6
7
2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每 个字符的编码输出。
3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的 字符串输出。
4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译 码,并输出译码结果。
5、打印(Print):以直观的方式打印赫夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫

北京邮电大学微机原理软件实验报告

北京邮电大学微机原理软件实验报告

北京邮电大学微机原理软件实验报告信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告实验一DEBUG 的使用一、实验目的1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用DEBUG 调试程序的方法。

二、实验内容1. 用编辑软件,输入以下汇编语言源程序:DAT SEGMENTA DB 20 ;(自定)B DB 15 ;(自定)Y DB 3 DUP (0)Z DB 0, 0DAT ENDSSTA SEGMENT STACKDW 50 DUP (?)STA ENDSCOD SEGMENTASSUME CS: COD, DS: DATSTAR PROC FARPUSH DSXOR AX, AXPUSH AXMOV AX, DATMOV DS, AXMOV AX, STAMOV SS, AXMOV AL, AMOV Z, ALMOV Z+1, ALCALL SUB1MOV AL,B微机原理软件实验·报告MOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,AMOV Z,ALMOV AL,BMOV Z+1,ALCALL SUB1ADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSTAR ENDPSUB1 PROCMOV AL, ZMOV AH, Z+1MUL AHADD WORD PTR Y, AXADC BYTE PTR[Y+2], 0RETSUB1 ENDPCOD ENDSEND STAR2. 通过编译,连接形成可执行文件。

3. 用DEBUG 将可执行文件调入,并进行调试。

1) 用D 命令观察数据区在内存中的具体内容,记录单元A 和B 的具体地址。

2) 用U 命令对目标代码反汇编,观察反汇编后的结果。

注意发现源程序的起始位置,并记录这个起始地址。

3) 用T 命令作单步跟踪调试。

比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。

北京邮电大学电路与电子学基础实验报告

北京邮电大学电路与电子学基础实验报告

《电路与电子学基础》实验报告实验名称班级学号姓名实验3交流电路的性质实验3.1 串联交流电路的阻抗 一、实验目的1.测量串联RL 电路的阻抗和交流电压与电流之间的相位,并比较测量值与计算值。

2.测量串联RC 电路的阻抗和交流电压与电流之间的相位,并比较测量值与计算值。

3.测量串联RLC 电路的阻抗和交流电压与电流之间的相位,并比较测量值与计算值。

二、实验器材双踪示波器 1台 信号发生器 1台 交流电流表 1个 交流电压表 1个 0.1µF 电容 1个 100mH 电感 1个 1K Ω电阻 1个三、实验准备两个同频率周期函数(例如正弦函数)之间的相位差,可通过测量两个曲线图之间及曲线一个周期T 的波形之间的时间差t 来确定。

因为时间t 与周期T 之比等于相位差θ(单位:度)与一周相位角的度数(360°)之比θ/360°=t/T所以,相位差可用下式计算θ=t(360°)/T在图3-1,图3-2和图3-3中交流电路的阻抗Z 满足欧姆定律,所以用阻抗两端的交流电压有效值V Z 除以交流电流有效值I Z 可算出阻抗(单位:Ω)IzVz Z =在图3-1中RL 串联电路的阻抗Z 为电阻R 和感抗XL 的向量和。

因此阻抗的大小为22LXRZ +=阻抗两端的电压VZ 与电流IZ 之间的相位差可由下式求出⎪⎭⎫⎝⎛=RXLarctan θ图3-1 RL 串联电路的阻抗在图3-2中RC 串联电路的阻抗Z 为电阻R 和容抗Xc 的向量和,所以阻抗的大小为CXR Z 22+=阻抗两段的电压Vz 和电流Iz 之间的相位差为⎪⎭⎫⎝⎛-=R X C arctan θ 当电压落后于电流时,相位差为负。

图3-2 RC 串联电路的阻抗在图3-3中RLC 串联电路的阻抗Z 为电阻 R 和电感与电容的总电抗X 之向量和,总电抗X 等于感抗XL 与容抗Xc 的向量和。

因此感抗与容抗之间有180°的相位差,所以总电抗X 为C LX XX -=这样,RLC 串联电路的阻抗大小可用下式求出22XRZ +=阻抗两端的电压Vz 与电流Iz 之间的相位差为⎪⎭⎫⎝⎛=R X arctan θ图3-3 RLC 串联电路的阻抗感抗X L 和容抗Xc 是正弦交流电频率的函数。

北邮数据结构实验报告

北邮数据结构实验报告

北邮数据结构实验报告北京邮电大学信息与通信工程学院2009级数据结构实验报告实验名称:实验三哈夫曼编/解码器的实现学生姓名:陈聪捷日期:2010年11月28日1.实验要求一、实验目的:了解哈夫曼树的思想和相关概念;二、实验内容:利用二叉树结构实现哈夫曼编/解码器1.初始化:能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈夫曼树。

2.建立编码表:利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。

3.编码:根据编码表对输入的字符串进行编码,并将编码后的字符串输出。

4.译码:利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。

5.打印:以直观的方式打印哈夫曼树。

6.计算输入的字符串编码前和编码后的长度,并进行分析,讨论哈夫曼编码的压缩效果。

7.用户界面可以设计成“菜单”方式,能进行交互,根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码。

2.程序分析2.1存储结构二叉树templateclassBiTree{public:BiTree();//构造函数,其前序序列由键盘输入~BiTree(void);//析构函数BiNode*Getroot();//获得指向根结点的指针protected:BiNode*root;//指向根结点的头指针};//声明类BiTree及定义结构BiNodeData:二叉树是由一个根结点和两棵互不相交的左右子树构成data:HCode*HCodeTable;//编码表inttSize;//编码表中的总字符数二叉树的节点结构templatestructBiNode//二叉树的结点结构{Tdata;//记录数据Tlchild;//左孩子Trchild;//右孩子Tparent;//双亲};编码表的节点结构structHCode{chardata;//编码表中的字符charcode[100];//该字符对应的编码};待编码字符串由键盘输入,输入时用链表存储,链表节点为structNode{charcharacter;//输入的字符unsignedintcount;//该字符的权值boolused;//建立树的时候该字符是否使用过Node*next;//保存下一个节点的地址};示意图:2.2关键算法分析1.初始化函数(voidHuffmanTree::Init(stringInput))算法伪代码:1.初始化链表的头结点2.获得输入字符串的第一个字符,并将其插入到链表尾部,n=1(n 记录的是链表中字符的个数)3.从字符串第2个字符开始,逐个取出字符串中的字符3.1将当前取出的字符与链表中已经存在的字符逐个比较,如果当前取出的字符与链表中已经存在的某个字符相同,则链表中该字符的权值加1。

北邮程序设计实验报告

北邮程序设计实验报告

实验名称:程序设计实验实验时间:2023年X月X日实验地点:北邮计算机实验室一、实验目的1. 熟悉C语言编程环境,掌握基本的程序设计方法。

2. 通过实际编程,提高逻辑思维和问题解决能力。

3. 理解算法设计的重要性,掌握常用的算法设计方法。

二、实验内容本次实验主要分为以下几个部分:1. 编写一个计算两个整数相加的程序。

2. 编写一个计算两个整数相减的程序。

3. 编写一个计算两个整数相乘的程序。

4. 编写一个计算两个整数相除的程序(要求考虑除数为0的情况)。

5. 编写一个判断两个整数是否相等的程序。

三、实验步骤1. 打开C语言编程环境,创建一个新的项目。

2. 编写计算两个整数相加的程序:```c#include <stdio.h>int main() {int a, b, sum;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);sum = a + b;printf("两个整数相加的结果为:%d\n", sum); return 0;}```3. 编写计算两个整数相减的程序:```c#include <stdio.h>int main() {int a, b, sub;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);sub = a - b;printf("两个整数相减的结果为:%d\n", sub); return 0;}```4. 编写计算两个整数相乘的程序:```c#include <stdio.h>int main() {int a, b, mul;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);mul = a b;printf("两个整数相乘的结果为:%d\n", mul);return 0;}```5. 编写计算两个整数相除的程序(考虑除数为0的情况):```c#include <stdio.h>int main() {int a, b, div;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);if (b == 0) {printf("除数不能为0,请重新输入。

北京邮电大学数字电路与逻辑设计实验报告.

北京邮电大学数字电路与逻辑设计实验报告.

北京邮电大学数字电路与逻辑设计实验报告学院:xxxx学院姓名:xxx班级:xxxxxxxxxx128学号:xxxxxxxxxx实验一Quartus II原理图输入法设计与实现一、实验目的(1)熟悉用Quartus II原理图输入法进行电路设计和仿真;(2)掌握Quartus II图形模块单元的生成与调用;(3)熟悉实验板的使用。

二、实验所用仪器及元器件(1)计算机;(2)直流稳压电源;(3)数字系统与逻辑设计实验开发板。

三、实验任务要求(1)用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。

(2)用实验(1)中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。

(3)用3线-8线译码器(74LS138)和逻辑门设计实现函数,仿真验证其功能,并下载到实验板测试。

要求用拨码开关设定输入信号,发光二极管显示输出信号。

四、实验原理图及仿真波形图228328(1)半加器【实验原理图】【仿真波形图】【仿真波形图分析】由波形图可以看出,真值表如下:a b so co 000001101010111由此可得,,满足半加器的设计要求。

(2)全加器428【实验原理图】【仿真波形图】【仿真波形图分析】由波形图可以看出真值表如下:ain bin cin sum cout 00000001100101001101100101115281100111111用分别表示信号ain 、bin 、cin 、sum 和cout ,则可得逻辑表达式为满足全加器的设计要求。

(3)3线-8线译码器实现函数【实验原理图】【仿真波形图】【仿真波形图分析】由波形图可得真值表如下:A B C F00010011010101101000101011001111则逻辑表达式为。

实验二用VHDL设计与实现组合逻辑电路一、实验目的(1)熟悉用VHDL语言设计组合逻辑电路的方法;(2)熟悉用Quartus II文本输入法进行电路设计;(3)熟悉不同的编码及其之间的转换。

北京邮电大学数电实验报告

北京邮电大学数电实验报告

北京邮电大学数字电路与逻辑设计实验发光二极管走马灯的电路设计与实现实验报告学院:信息与通信工程学院班级:27姓名:付莹学号:班内序号:23【实验目的】(1)进一步了解时序电路描述方法;(2)熟悉状态机的设计方法。

【实验所用仪器及元器件】(1)计算机;(2)直流稳压电源;(3)数字系统与逻辑设计实验开发板。

【实验任务要求】设计并实现一个控制8个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。

(1)单点移动模式:一个点在8个发光二极管上来回的亮(2)幕布式:从中间两个点,同时向两边依次点亮直到全亮,然后再向中间点灭,依次往复。

【实验设计思路及过程】(1)设计思路实验要求有两个,一个是单点移动模式,一个是幕布式。

通过CASE-WHEN 语句实现走马灯的变化。

分别定义一个8个变量的数据类型和一个13变量的数据类型,表示一个周期内的灯的变化,并设计一个变量在两种状态间进行切换。

此时,需要把所有状态罗列到case-when中去。

(2)VHDL代码LIBRARY IEEE;USE ABC ISPORT(A,CLK,RESET:IN STD_LOGIC;DENG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END ABC;ARCHITECTURE A OF ABC ISTYPE STATE_TEMP is(s0,s1,s2,s3,s4,s5,s6,s7);TYPE STATE_TEMP1 is(s0,s1,s2,s3,s4,s5,s6,s7,s00,s01,s02,s03,s04,s05);signal STATE:STATE_TEMP;signal STATE1:STATE_TEMP1;BEGINPROCESS(CLK,RESET)BEGINIF RESET='1' THENDENG<="00000000";ELSIF(CLK'EVENT AND CLK='0')THENIF A='0'THEN --KAIMUSHICASE STATE1 ISWHEN s0 => STATE1<=s1;DENG<="";WHEN s1 => STATE1<=s2;DENG<="01000000";WHEN s2 => STATE1<=s3;DENG<="00100000";WHEN s3 => STATE1<=s4;DENG<="00010000";WHEN s4 => STATE1<=s5;DENG<="00001000";WHEN s5 => STATE1<=s6;DENG<="00000100";WHEN s6 => STATE1<=s7;DENG<="00000010";WHEN s7 =>STATE1<=s00;DENG<="00000001";WHEN s00=>STATE1<=s01;DENG<="00000010";WHEN s01=>STATE1<=s02;DENG<="00000100";WHEN s02=>STATE1<=s03;DENG<="00001000";WHEN s03=>STATE1<=s04;DENG<="00010000";WHEN s04=>STATE1<=s05;DENG<="00100000";WHEN s05=>STATE1<=s0;DENG <="01000000";END CASE;ELSECASE STATE ISWHEN s0 => STATE<=s1;DENG<="00011000";WHEN s1 => STATE<=s2;DENG<="00111100";WHEN s2 => STATE<=s3;DENG<="01111110";WHEN s3 => STATE<=s4;DENG<="";WHEN s4 => STATE<=s5;DENG<="01111110";WHEN s5 => STATE<=s6;DENG<="00111100";WHEN s6 => STATE<=s7;DENG<="00011000";WHEN s7 => STATE<=s0;DENG<="00000000";END CASE;END IF;END IF;END PROCESS;END A;【仿真波形及分析】1.仿真波形(1)单点移动式(2)幕布式(3)复位信号2.波形分析(1)单点移动式由图可以看出,当A为0时程序实现单点移动功能,如图所示DENG[7]开始亮,之后依次为DENG[6], DENG[5], DENG[4], DENG[3], DENG[2],DENG[1], DENG[0],然后DENG[1]也开始亮,依此类推,实现了功能要求(2)幕布式由图可以看出,当A为1时,如图所示,先是中间的两个灯DENG[4], DENG[5]亮,然后扩展到四个灯亮DENG[3]至DENG[6]亮,接下来是DENG[2]~DENG[7]亮,最后全亮,接着DENG[2]~DENG[7]亮,继而循环下去。

北邮-算法设计和分析-第三章实验报告

北邮-算法设计和分析-第三章实验报告

算法设计与分析第三章程序作业源程序代码1.最长公共子序列#include<stdio.h>#include<stdlib.h>#define N 1000int e[N][N],f[N][N];void LCSLength(int m,int n,char *x,char *y,int c[][N],int b[][N])//构造数组b[i][j]{int i,j;for (i=1; i<=m;i++)c[i][0]=0; //初始化, Y[j]为空时for (i=1;i<=n;i++)c[0][i]=0; //初始化,X[i]为空时for (i=1;i<=m;i++) //两重循环,自下而上,// 计算子问题{X(i), Y(j)}for (j=1;j<=n;j++){if(x[i]==y[j]){ //情况1c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}else if(c[i-1][j]>=c[i][j-1]){ //情况2c[i][j]=c[i-1][j];b[i][j]=2;}else //情况3{c[i][j]=c[i][j-1];b[i][j]=3;}}}void LCS(int i,int j,char *x,int b[][N]){if (i==0||j==0)return;if (b[i][j]==1){LCS(i-1,j-1,x,b);printf("%c",x[i]);/*第1种情况下,X(i)和Y(j)的最长公共子序列由X(i-1)和Y(j-1)的解LCS(i-1, j-1, x, b),加上位于最后的X[i]组成*/}else if(b[i][j]==2)LCS(i-1,j,x,b);elseLCS(i,j-1,x,b); //其它2种情况下,原问题解等于子问题解}main(){char A[N],B[N],C[N],D[N];int a=1,b=1,c=1,d=1;char ch;int i;FILE * fp;if((fp=fopen("最长公共子序列输入数据.txt","r"))==NULL)//打开文件失败printf("Can't open file ");else{//读取文件内容ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!='B'&&ch!=EOF) {A[a]=ch;a++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}a--;ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!='C'&&ch!=EOF) {B[b]=ch;b++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}b--;ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!='D'&&ch!=EOF) {C[c]=ch;c++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}c--;ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!=EOF){D[d]=ch;d++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}d--;}fclose(fp);printf("文件读取完成\n");/* for(i=0;i<=a;i++)printf("%c",A[i]);printf("\n");for(i=0;i<=b;i++)printf("%c",B[i]);printf("\n");for(i=0;i<=c;i++)printf("%c",C[i]);printf("\n");for(i=0;i<=d;i++)printf("%c",D[i]);printf("\n"); */printf("\n\n\nA和B的最长公共子序列为:\n");LCSLength(a,b,A,B,e,f);LCS(a,b,A,f);printf("\n\n\nC和D的最长公共子序列为:\n");LCSLength(c,d,C,D,e,f);LCS(c,d,C,f);printf("\n\n\nA和D的最长公共子序列为:\n");LCSLength(a,d,A,D,e,f);LCS(a,d,A,f);system("pause");return 0;}2.最大子段和#include<stdio.h>#include<stdlib.h>#define N 400void MaxSum(int n,int *a){int sum=0,b=0;int i,x1=0,y1=0,x=0,y=0;for(i=1;i<=n;i++){if (b>0){b+=a[i];y1=i;}else{b=a[i];x1=i;}if(b>sum){sum=b;x=x1;y=y1;}}printf("\n该序列的最大子段和的位置为从第%d个到第%d个",x+1,y+1);printf("\n该序列的和最大子段为:\n");for(i=x;i<=y;i++)printf("%d ",a[i]);printf("\n它们的和为%d \n",sum);}main(){int A[N],B[N];int a=0,b=0;int i;FILE *fp1,*fp2;if((fp1=fopen("最大子段和输入数据-序列1.txt","r"))==NULL)//打开文件失败printf("Can't open file1 ");else //读取文件内容for(i=0;!feof(fp1);i++)fscanf(fp1,"%d\n",&A[i]);a=i-1;}if((fp2=fopen("最大子段和输入数据-序列2.txt","r"))==NULL)//打开文件失败printf("Can't open file2 ");else{for(i=0;!feof(fp2);i++)fscanf(fp2,"%d\n",&B[i]);b=i-1;}fclose(fp1);fclose(fp1);printf("文件读取成功!!!\n\n\n");printf("对于最大子段和输入数据-序列1 ");MaxSum(a,A);//计算最大子段和printf("\n\n对于最大子段和输入数据-序列2 ");MaxSum(b,B);// for(i=0;i<=b;i++)// printf("%d ",B[i]);system("pause");return 0;}3.凸多边形最优三角剖分#include<stdio.h>#include<stdlib.h>#include<math.h>#define N 30#define EARTH_RADIUS 6378.137struct Base{//基站结构体int ENODEBID;//基站标识float LONGITUDE;//基站经度float LATITUDE;//基站纬度int NUM;//基站k-dist距离};void readfile(struct Base * base,int n) //读取文件函数{FILE * fp;int i=0;if(n==21)fp=fopen("21个基站凸多边形数据.csv","rb");elsefp=fopen("29个基站凸多边形数据.csv","rb");if(fp==NULL)//打开文件失败printf("Can't open file ");else{while(EOF!=fscanf(fp,"%d,%f,%f,%d",&base[i].ENODEBID,&base[i].LO NGITUDE,&base[i].LATITUDE,&base[i].NUM)){//将数据读入结构体数组i++;//printf("%d\n",i);}// printf("文件读入成功!!!\n\n\n");fclose(fp);}float rad(float LatOrLon){return LatOrLon * 3.14/180.0;}float distance(struct Base * base,int a,int b)//求两个基站间的距离{float s;float radLat1,radLat2,radlng1,radlng2;radLat1 = rad(base[a].LATITUDE);radLat2 = rad(base[b].LATITUDE);radlng1 = rad(base[a].LONGITUDE);radlng2 = rad(base[b].LONGITUDE);//利用正弦余弦公式求距离if(radLat1==radLat2&&radlng1==radlng2)s=0;elses=acos(cos(radLat1)*cos(radLat2)*cos(radlng1-radlng2)+sin(radLat1)*s in(radLat2));s = s * EARTH_RADIUS;s=round(s*1000);}return s;}float weight(struct Base * base,int a,int b,int c){float s,s1,s2,s3;s1=distance(base,a,b);s2=distance(base,b,c);s3=distance(base,a,c);//s=distance(base,a,b)+distance(base,b,c)+distance(base,a,c);s=s1+s2+s3;return s;}float MinWeightTriangulation(struct Base * base,int n,float t[][N],int s[][N]){int i,j,r,k;float u=0;for(i=1;i<=n;i++)t[i][i]=0;for(r=2;r<=n;r++) //r为当前计算的链长(子问题规模)for(i=1;i<=n-r+1;i++)//n-r+1为最后一个r链的前边界{j=i+r-1;//计算前边界为r,链长为r的链的后边界t[i][j]=t[i+1][j]+weight(base,i-1,i,j);//将链ij划分为A(i) * ( A[i+1:j] )这里实际上就是k=is[i][j]=i;for (k=i+1;k<i+r-1;k++) //将链ij划分为( A[i:k] )* (A[k+1:j]){u=t[i][k]+t[k+1][j]+weight(base,i-1,k,j);if(u<t[i][j]){t[i][j]=u;s[i][j]=k;}}}return t[1][n];}void Traceback(int i,int j,int s[][N]){if(i==j)return;Traceback(i,s[i][j],s);Traceback(s[i][j]+1,j,s);printf("三角剖分顶点:V%d , V%d , V%d\n",i-1,j,s[i][j]); }main(){int i;float t[N][N];int s[N][N];struct Base base21[N];//结构体(N宏定义)struct Base base29[N];//结构体(N宏定义)readfile(base21,21);//将数据从文件中读到结构体中readfile(base29,29);//将数据从文件中读到结构体中printf("文件读入成功!!!\n\n\n");// for(i=0;i<=28;i++)//printf("%6d %.3f %.5f %d\n",base29[i].ENODEBID,base29[i].LONGITU DE,base29[i].LATITUDE,base29[i].NUM);printf("凸21多边形的最优三角剖分值为%f",MinWeightTriangulation(base21,20,t,s));printf("最优三角剖分结构为:\n");Traceback(1,20,s); //s[i][j]记录了Vi-1和Vj构成三角形的第3个顶点的位置printf("凸29多边形的最优三角剖分值为%f",MinWeightTriangulation(base29,28,t,s));printf("最优三角剖分结构为:\n");Traceback(1,28,s); //s[i][j]记录了Vi-1和Vj构成三角形的第3个顶点的位置system("pause");return 0;}4.01背包问题#include<stdio.h>#include<stdlib.h>#define N 100struct Goods{int weight;//物品重量int value;//物品价值};int knapsack(struct Goods *goods,int bag,int number,int p[][2],int head[]){int left=0,right=0,next=1,i,j,k,m,y;p[0][0]=0;p[0][1]=0;head[number+1]=0;head[number]=1;for(i=number;i>=1;i--){k=left;for(j=left;j<=right&&p[j][0]+goods[i-1].weight<=bag;j++){ y=p[j][0]+goods[i-1].weight;m=p[j][1]+goods[i-1].value;while(k<=right&&p[k][0]<y){p[next][0]=p[k][0];p[next][1]=p[k][1];next++;k++;}if(k<=right&&p[k][0]==y){if(m<p[k][1]){m=p[k][1];}k++;}if(m>p[next-1][1]){p[next][0]=y;p[next][1]=m;next++;}while(k<=right&&p[k][1]<=p[next-1][1]){k++;}}while(k<=right){p[next][0]=p[k][0];p[next][1]=p[k][1];next++;k++;}left=right+1;right=next-1;head[i-1]=next;}return next;}void traceback(struct Goods *goods,int number,int head[],int p[][2],int x[]){int j=p[head[0]-1][0],m=p[head[0]-1][1];int i,k,a;for(i=1;i<=number;i++){x[i]=0;a=1;// for(k=3450;k<=head[i]-1&&a==1;k++)for(k=head[i+1];k<=head[i]-1&&a==1;k++){if(p[k][0]+goods[i-1].weight==j&&p[k][1]+goods[i-1].value==m){x[i]=1;j=p[k][0];m=p[k][1];a=0;}}}}main(){int bag1,bag2;//背包容量int number1,number2;//物品数目int i,n;int p[20000][2];int h[N],x[N];struct Goods goods1[N],goods2[N];FILE *fp;char ch='0';if((fp=fopen("附件4.背包问题输入数据.txt","r"))==NULL)//打开文件失败printf("Can't open file ");else //读入背包和物品信息{fseek(fp,18,SEEK_CUR);fscanf(fp,"%d",&bag1);//背包1容量fseek(fp,18,SEEK_CUR);ch='0';for(i=0;ch!='\n';i++){fscanf(fp,"%d",&goods1[i].weight);//物品重量}number1=i;ch='0';fseek(fp,14,SEEK_CUR);for(i=0;ch!='\n'&&ch!=EOF;i++){fscanf(fp,"%d",&goods1[i].value);//物品价值ch=fgetc(fp);}if(number1!=i){printf("读取数据出错,程序将退出!\n");system("pause");}fseek(fp,22,SEEK_CUR);fscanf(fp,"%d",&bag2);//背包1容量fseek(fp,18,SEEK_CUR);ch='0';for(i=0;ch!='\n';i++){fscanf(fp,"%d",&goods2[i].weight);//物品重量}number2=i;ch='0';fseek(fp,14,SEEK_CUR);for(i=0;ch!='\n'&&ch!=EOF;i++){fscanf(fp,"%d",&goods2[i].value);//物品价值ch=fgetc(fp);}if(number2!=i){printf("读取数据出错,程序将退出!\n");system("pause");}}printf("文件读取成功!!!\n");/*打印文件的信息*/printf("\n\n第一组背包数据:\n");printf("背包容量:%d 物品数量:%d\n物品重量:\n",bag1,number1);for(i=0;i<number1;i++)printf("%d ",goods1[i].weight);printf("\n物品价值:\n");for(i=0;i<number1;i++)printf("%d ",goods1[i].value);printf("\n\n第二组背包数据:\n");printf("背包容量:%d 物品数量:%d\n物品重量:\n",bag2,number2);for(i=0;i<number2;i++)printf("%d ",goods2[i].weight);printf("\n物品价值:\n");for(i=0;i<number2;i++)printf("%d ",goods2[i].value);n=knapsack(goods1,bag1,number1,p,h);traceback(goods1,number1,h,p,x); //确定放入的物品//打印结果printf("\n\n第一组:\n背包重量为:%d 背包价值为:%d\n",p[n-1][0],p[n-1][1]);printf("放入的物品为:\n");for(i=1;i<number1;i++)if(x[i]==1)printf("物品%-2d 重量%-2d 价值%d\n",i,goods1[i-1].weight,goods1[i-1].value);//第二组数据n=knapsack(goods2,bag2,number2,p,h);traceback(goods2,number2,h,p,x);printf("\n\n第二组:\n背包重量为:%d 背包价值为:%d\n",p[n-1][0],p[n-1][1]);printf("放入的物品为:\n");for(i=1;i<number2;i++)if(x[i]==1)printf("物品%-2d 重量%-2d 价值%d\n",i,goods2[i-1].weight,goods2[i-1].value);system("pause");return 0;}运行结果1.最长公共子序列2.最大子段和3.凸多边形最优三角剖分4.01背包问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档