计算机科学导论实验指导书-609_第1页
计算机科学导论实验指导书-609_第2页
计算机科学导论实验指导书-609_第3页
计算机科学导论实验指导书-609_第4页
计算机科学导论实验指导书-609_第5页
已阅读5页,还剩30页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、计算机科学导论实验指导实验1 SimpSim模拟器环境及Visual C+编译调试环境1实验2数据操作10实验3结构化程序设计12实验4递归与迭代14实验5算法综合练习16实验6算法复杂度分析*21实验7背包问题与启发式算法*23实验1 SimpSim模拟器环境及Visual C+编译调试环境【实验目的】1了解自然语言到机器语言的翻译过程2熟悉Simple Simulator模拟器环境,掌握使用Simple Simulator模拟程序的执行。3掌握SimpSim的单步运行方法,学会单步运行时对存储单元和各寄存器中值的进行 观察。4熟悉Visual C+编译调试环境,掌握C语言源程序的建立、编辑

2、、修改、保存。5掌握C语言程序的编译和程序调试。【实验准备】(1) 自然语言到机器语言的翻译过程任何计算机内部都是用0和1的序列来表示的,这可以很容易地被汁算机理解,但人 们却不容易理解,另一方而,无论什么时候,在用像Visual C+这样高级语言编写程序的 时候,我们使用了能被程序员所理解的一组指令或命令,但计算机却不容易理解。为了在人 和机器之间搭建通信的桥梁,制立一个翻译过程是很有必要的。因为每台计算机只能理解它 自己的语言(机器语言),所以最终必须将每个程序翻译为用机器语言书写的等价程序,这 样计算机就能够理解并执行程序所指左的指令。执行这个翻译过程的汁算机程序叫做翻译 器,如图1所示

3、。翻译器通常对指立的语言进行工作。也就是说,C程序的翻译器不能 翻译Java语言程序,反之亦然。有两种特龙类型的翻译器用来执行髙级语言的转换过程: 编译器和解释器。图1.1翻译器的基本作用编译器翻译过程本身包含一系列对输入语言的转换。图1.2显示了编译器的通用阶段。虽然 对包含在每个阶段的行为的具体讨论超出了本书的范围,但了解翻译过程的一些方面,以及 如何与编写的程序进行联系,有利于对计算机程序编译调试过程的理解。在将程序递交到任何翻译器前,需要使用编辑器或文字处理程序来创建源程序。大部 分翻译器需要文件扩展名,将程序保存为特定的类型。例如C编译器要求包含C程序的文 件以“.C”作为扩展需。如

4、果提交给翻译器的程序没有这个程序没有这个扩展名,编译器就 不会对它进行翻译。一旦创建了程序,它就被递交给预处理程序。正如其名字所指明的一样,该程序在“处 理器”或编译器之前进行工作。它可能是一个独立于编译器的程序,也可能是具有不同需称 的相同的编译器。预处理程序执行这样的任务,例如将一个或多个文件的内容合并入程序中, 并在整个程序中用一个字符串取代另一个字符串。预处理程序扫描整个源代码,寻找“预处 理指令二这些指令以特左的字符或字符组合开始。例如,C编译器当遇到# include时就将 文件并入。同样的编译器在遇到像#define这样的常量左义时就执行字符串替换操作。图1.2编译过程以及连接和

5、装载当预处理程序完成英任务后,编译器开始执行。编译器的第一个阶段(词法分析阶段) 检查源程序中每个单独的字符并将它们组合成叫着token或Lexem的逻辑单元。例如,当 C编译器读取下而的一系列字符时If (ab)a+;编译器读取到序列后紧跟着在遇到左圆括号后就是一个叫着“if的逻借单元,这个 “if”和后而的每个字符都被识别并翻译为预左义的数字代码集。这一阶段的逻辑允许编译 器识別C程序中每个可能的有效序列。从程序员的角度来看,这一阶段是很重要的,因为 在这里编译器会产生类似“unidentified characters/ (不可识别的字符)这样的错误。例如, 考虑在C程序中,程序员输入类

6、似,这样不符合字母表的字符。当编译器“看到”这 个字符时,会产生一个错误,通知程序员已经发现了一个不可识别的符号。这种类型的错误 属于“fatal errors ” (致命的错误),因为在检测到这样的错误后编译器就停止处理程序 并退出。在这一阶段编译器产生的苴他错误还有:“program too big*, unexpected end of file”。后一个错误通常是由于多行注释语句没有结朿。编译器的第二阶段由语法分析器来执行,从程序员的角度来看也是很有意义的,因为在 这时编译器要寻找C代码的任何语法错误。可以把这一阶段看作是英文的语法检查功能。 例如,假泄程序员想要输入赋值语句a=b:但

7、是却输入成了 a+b:语法分析的内置逻辑就 会把这看作是“无效表达式”并产生错误。在这一阶段遇到的其他错误还有“missing;缺 少分号) *Unmatched number of parentlessM (圆括号数不匹配),“missing funcution prototype M (没有函数原型等)。编译器的语义分析阶段,作为一个单独的阶段显示在图1.2中,该阶段有时和语法分析 阶段结合在一起。在这一阶段编译器鉴別语句,看是否虽然语法上正确,但却在语言中没有 意义。例如,若a是一个布尔类型的变量,则赋值语句“a=a+2”,在语法上说是正确的, 而在语义上是没有意义的。代码产生器和代码优

8、化器将最终翻译的程序成为响应的机器语言。根据编译环境中缺 省的或已设置的选项,可以在大小方而或速度方面对生成的代码进行优化。大部分编译器喜 欢提髙速度胜于提高缩短代码。但是,对于编译器来说试图去寻找这两个不兼容选项之间的 平衡很寻常。编译器最后的阶段是目标文件。该文件具有与源文件相同的名字,但扩展划是.obj”。 这个目标文件通常需要涉及驻留在系统中的程序库。就这点而言,程序并没有有做好运行的 准备,因为它还有缺少的部分。换句话说,目标文件“知道”仍然需要那些部分但不知逍在 那里可以找到它们。解决这个问题是另一个系统工具的任务。这个工具叫做连接程序,它找 出这些缺少的部分并将其放在合适的地址处

9、。如果连接程序找不到相关的程序,就会产生错 误,通知用户并将这一个错误看作是致命的错误,于是中止连接过程。如果连接过程成功了, 连接程序输出一个与源文件具有同样名字的文件,但扩展名是cxc”。这个文件叫做可执 行镜象或执行文件。执行程序时程序及其所需要驻留在内存中,这是一个叫做装载程序的另一个系统工具 的任务,它在内存中寻找一个区域并把程序装进来。通常把这个过程称为“装载”可执行镜 像到内存中。最后,装载程序给CPU发一个信号,于是程序开始执行。当程序在运行时,可能会出项“run time(运行时)错误。这是最难发现的错误,因为一 般来说,这是程序逻辑中的错误。这种类型中最通常的错误时访问数组

10、的地址超过了数组的 最后一个地址,或者除数是0,根据编译器所提供的支持不同,这些错误可能很容易发现, 也可能很难发现。在程序编译、连接或运行中出现错误时,程序员应该纠正特泄的错误所造成的问题。 在计算机术语中,我们把这个过程称为调试。一旦程序员已经找到了错误所在,就需要在编 译器中修改源程序,并重新开始编译过程。解释器除了编译器,还有叫做解释器的翻译程序。从操作的角度来看,它们之间的主要不同 是编译器在程序执行前翻译整个程序。但列一方而,解释器每翻译一条程序语句就执行一条 语句。至于考虑这两个翻译器执行的内部处理过程,它们的任务很相似。解释器相对于翻译 器的优点是由于编译程序只被翻译一次,所以

11、编译的程序运行速度快。为了描述这两个程序 的不同,考虑假想语言编写的循环:While (aini r aLor|tti RegistersPC IR冷 Qpcn P.O R102 (MR2m;R33R403R503R603R703R803R903RA03RB0RC3RD03REOTRFm.c .0.BMain Memory.567.0 1D ci 妙.0303OJ03OJOJ030303030303030J030388om0303sOJ8o038mOJ0303 0303OD0303ODODOJOD030303(rlol0309 o o o o OOOOODOOOOOO o o o.u oooo

12、oooooon-o 丄ri厶一宀il十 丨。厶_ DDOO OODDDDDDOOOD o o o o o o oo o o o o on- OO s o o o OOOOODOOOOOO o o o o oooooooooooo 120 0 0 oooooooooooo A o o Q o o o o o o o Q Q o o o 2 000 000000000000 3000000000000 000 1 o o o oooooooooooo o o Q fl OOOOOOOQOOOOAlmcocommgmcommmcocomm Hmcocommcococococomcom m Msmms

13、ssss&8 m ro m roI1O88 8888888IO28IQJSS8 (U1OB 如405oe07o8393MB0CDDOE0FOSZ,O1st ore P2Z(A2ICO “00 halt0106OC:00,00invalidK:oozooinvalid r m、 AAddexz 161 Mocilisd 卜卅匕 d图1.3实验结果(5)单击Clear.弹岀如图1.4的对话框,清空所有数据。图1.4清空数据(6)单击Open,打开刚刚保存的test.prg文件。得到图1.2的界而。(7)单击Step,程序单步运行,观察每一次PCJR的变化及RO. RK R2、A2的值。2. Vis

14、ual C卄编译调试环境(1)进入Visual C+坏境后,选择File-New菜单弹出New对话框,在Project页面中 选择 Win32 Console Application 项,在 Location 处选择工程保存路径 E:VCProject,在 Project name中填入工程需HelloWorld, Location处的路径会自动添加为E:VCProjectHelloWorld 如图1.5,单击0K继续。图1.5创建新控制台工程(2) 在出现如图1.6所示的Win32 Console Application Step 1 of 1对话框后,单击 Finish按钮岀现如图1.7的

15、New Project Information对话框,单击Ok按钮完成工程创建。图 1.6 Win32 Console Application Step 1 of 1 对话框图 1.7 New Project Information 对话框(3) 选择File-New菜单,在New对话框的File页选择C+ Source File,在File编 辑框中输入文件名hello.6如图1.8所示。He图1.8在工程中加入hello.c源程序(4)单击0K按钮,开始对源文件进行编写,输入如下代码。ttinclude i,stdio .hvoid main()Build菜单项或按F7键进行编译,系统将会

16、在Output窗口给出所有岀错 和警告信息。当调试无错误后,选择Build-Execute菜单项,或Ctrl+F5执行程序,得到如 图1.9的DOS窗口图1.9 Hello World实验结果实验2数据操作【实验目的】理解指令系统的组成掌握机器指令的格式理解程序的执行过程【实验准备】(1)认真阅读教材3.7.2小节的内容,回答以下问题: 一条机器指令由几部分组成,分别代表什么含义? 存储器中的数据是否能直接进行运算,如不能该如何操作? CPU中的程序寄存器和指令寄存器在程序的执行过程中分别起什么作用? 请简述程序的执行过程。(2)熟悉教材第70页表3.1的内容(机器指令集),对照指令集回答以下

17、问题: 表3.1中的第二条指令和第三条指令都用来“存放”数据,它们之间的区别是什么? 确窪能够读懂此表,试解释23B2、4013、5356所表示的意思。【实验内容】(1)验证教材课后习题3.21,要求单步运行,记录每一步寄存器或存储器值的变化(2)设计机器代码,完成以下功能,并在SimpSim上进行验证:机器代码的首地址从B0开始,单元地址为2F的值为03,寄存器R2的值为05,将 2F中的值与R2中的值进行OR运算,结果存入4F中。【实验步骤】(1)打开Simpsim.exe,将习题3.21中的机器码及初值输入模拟器中,如图2.1Sisolatorile d)t fiiui Help.0 .

18、1Main Memory3 .Q . .5 “6 . 7Registersoooooooooo012 34 56?89550:18030:13030:130311000000000000000000L68COCO8COCO8COCOB1o:l303o:l0D0Doj0D0D00000000000000000000CO8COCO8COCO10COCOmcoco 000000 0303们 rococo 000000 030303 Icoco!co ODO ABCC03C0000000030D0JCOCOLO000000100303Locolco o o o def03J03003030J0303O

19、T0303J03038.9.A.B,.c.D.E.FOD00D3OD00w00000000OJ0000030000OD00ro0000JOD0000ao03OD000300000000OJ0000OJ0000OD0003OD000OD0000aoM00GOm00000000030000OJ0000OD00M0000w000000aoM0000M00000000OT0000OT0000OD00OTOD0003OD000000M0000M0000OD00ro00aoOD000000D3000003OD0000000000(B0000RF卜 fiun |tin曲皿ROcoR1COR2coR3coR4

20、coR5coR6coR?coRScoR9coRAcoRBcoRCcoRDcoREcoD ripen.D 0I 00:10ZOEload105z oz:1105Load P.lr 105104:BlOOjnpxq R12R0,DO06:COzOOnalt08:OOzOOinvalidox:叫00LnuAlid冷Sekcted 7建 辔 DiosxnAdd彩:7Modfed图2.1习题6(2)不断单击Step,观察PC、IR中值的变化(3)单击Run,观察模拟器的运行。(4)单击Break终止运行,解释程序不能终止的原因。(5)单击Clear.淸空所有存储单元和寄存器的值(6)填写如下机器码中【代

21、码1】部分,并输入到SimpSim中112F【代码1】334FC000(7)将PC的值设为B0,将2F的值设为03,将R2的值设为05,如图2.2fileg KelpRegistersROFC I BO-D|R1IR |C(COR2R3R4IS Elrw-R5 zKbR7R8R9|R4zIRBRCRDGORED Cler .RFcocoiilcococoCOCOCOCO8 8COcococoMain Memory.0 “2 .3 7 .5 .6 .7 .8 .9 A .8 C D .E .FOOOOOOOOOOODODOOOOOOODOOOOODOOOD逻l亦逐|Dimmo o o o -u

22、o o o o o o o0000000000000000000000000000000000000000000000000000cocorocococoC0C08 8 8 8 3cococoOOOOOOOOOOODODOOOOOOODOOOOODOOODo o o o .u oo 0 0 0 0 0000000ODOOOOODODOOm 8888COOOOOOOOOOOODOOOOOOOOOOODmcoscoLOm0D1D2O3D4O50rom raw WK w OOOOODOOODIHIOD com 8 8C04FC0000000000039000000000000co0000ODOD00

23、2FODCO8CO8CO11CO6D7D8O9OM8O03ODOOODcococoODOOOD000000ODDnV o oIcom 8 )00 D DEF29:0000invalidAZA:0000invalKlZCt0000Invftlidex:0003invalid30:0000invalid32:f 0000r* oanvolLd 7Add 伦谿 182;Sekcled 102图2.2(8) 单步运行程序,直到程序结束,记录PC、IR、各寄存器值的变化。实验3结构化程序设计【实验目的】熟悉顺序、选择、循环3种程序结构掌握C语言编写选择、循环语句的方法【实验准备】(1 认真阅读教材2.4

24、小节、4.2小节的内容,了解算法的有关内容(2)将图3所示的流程图片段转换为C语言在屏幕上分别打印 出a和b的值在屏幕上打印图31(3) 根据下而的C语言程序,画出其流程图# include stdio.hmain()int sum = 0;int i = 0;while(i10)sum = sum+i;i卄;【实验内容】编写程序,求数组a=5,348566中最大的数?【实验步骤】(1)新建 Win32 Console Application 工程,工程名为 Exp3_l(2)在Exp3工程中,新建cxp3c(3)填写【代码1】【代码2】后,编译.运行并调试源程序#includc Hstdio

25、.hM main()int a =5,34,&56,6;int i=O;int max=O;while(【代码1】)if(【代码2】) max = ai;i+;primf(”数组a5中最大的数是%dnmax);16实验4递归与迭代【实验目的】 加深理解递归及迭代的槪念 掌握用C语言编写递归及迭代程序的方法 能够区别递归和迭代之间的差别【实验准备】(1) 认真阅读教材5.6小肖的内容,理解递归和迭代的概念,回答以下问题: 递归和迭代方法,哪一个的时间复杂度高? 递归和迭代方法是否可以相互转换,转换的意义何在?(2) 斐波那契数列是一个描述了动物繁殖数量、植物花序变化等自然规律的经典数学问 题。认

26、真阅读教材423小节斐波那契问题及5.6小节,思考如何用递归和迭代来 求解斐波那契数列。【实验内容】(1) 用递归的方法求解斐波那契数列(2) 用迭代的方法求解斐波那契数列【实验步骤】(1) 新建 Win32 Console Application 工程,工程名为 Exp4_l(2) 在Exp3_l工程中,新建cxp4.c(3) 填写【代码1】后,编译、运行并调试源程序include Mstdio.hHunsigned long F(int n)if(n=l)return n;else【代码1】;main()int n;unsigned long sum;printfCn=);scanf(H%

27、du.&n);sum = F(n);printf(Hwhen n=%d, sum=%dnn,sum);(4) 新建 Win32 Console Application 工程,工程乞为 Exp4_2(5) 在Exp4_2工程中,新建cxp4_2c(6) 填写【代码2】【代码3】【代码4】后,编译.运行并调试源程序include Hstdio.hHunsigned long F(int n)int i;unsigned long a = 0. b = 1, c;if (n = 1)【代码2】elsefor(【代码3】)c = a + b;a = b; 【代码4】return c;main()(in

28、t n;unsigned long sum:printf(,n=H); scanf(N%d&n); sum = F(n);printf(Hwhen n=%d, sum=%dn,n,sum);实验5 算法综合练习【实验目的】熟悉结构化程序设计在算法中的应用理解二分查找法的思想【实验准备】(1)复习结构化程序设计(2)复习递归的思想和编写方法(3)掌握二分查找法二分査找法又称折半査找法,是一种效率较高的在有序数组中査找特左元素的方 法。二分査找法的查找方法是:设有序的为数组aO.n-l(这里我们假设为递增,递 减的情况与此类似),要査询的元素为x,令m = L(n-l)/2,将x与数组中间的数am

29、 进行比较,若x=am,则査找成功;若xam,则只需在数组的后半段(即区间m+l,nl 中)用同样的方法查找x。当相等时,则查找成功;当不相等时,则把下一次査找的区 间划分成两半,根据大于和小于的不同情况在不同的区间查找。知道出现区间长度为1 的情况时,算法终止。例1已知如下11个元素的数组:a0.nl=4,5,8,10,13,17,20,40,43,48,50,现在要查找元素 10 和 45。假设指针low和high分别指示待查元素所在范圉的下界和上界,指针mid指示区 间的中间位置,即mid = L (low+high)/2。在此例中,low和high的初值分别为1和 11。下面给出x=1

30、0的查找过程:4 5 8 10 1317 20 40 43 48 50tttlowmidhigh首先amid与査询值10进行比较,此时amid=17, amidx,说明待査元素若存在 一定在amid的左边,于是缩小范围,将high指到mid-1的位置,重新计算中间位置,此 时,amid=8o4 5 810 13 17 20 40 43 48 50tt tlow midhigh将amid与查询值10进行比较,an】idx,说明待查元素若存在一泄在amid的右 边,于是缩小范围,将low指到mid+1的位置,重新计算中间位置,此时amid=104 5 8 10 1317 20 40 43 48 5

31、0low hightmid将amid与查询值10进行比较,结果相等,查找成功。再看x=45的査找过程:4 5 810 1317 20 40 43 48 50tttlowmidhigh首先amid与查询值45进行比较,此时an】id=17, amidx,说明待查元素若存在一 定在afmid的右边,于是缩小范国,将low指到mid+1的位置,重新汁算中间位置,此时, amid=43o4 5 8101317 20 40 43 48 50t ttlowmidhigh再次将amid与查询值45进行比较,amidx,说明待査元素若存在一左在amid的左边,于是缩小范I丙将high指 到mid-1的位宜,此

32、时因为下界lov上界high,则说明表中没有元素等于45,查找不成功。4 5 810 13 17 20 40 43 48 50high low【实验内容】编写二分査找的C语言程序并进行调试运行【实验步骤】(1) 新建 Win32 Console Application 工程,工程名为 Exp5_l(2) 在Exp5工程中,新建cxp5c(3) 填写【代码1】【代码2】后,编译、运行并调试源程序include Hstdio.hM#include 兀tring.hint BSearch(int xjnt n)int lowjiigh.mid:low = 0;high = n-1:whi

33、le(low=high)mid = (low+high)/2;if(amid=x)return mid;else if【代码1 )low = mid+1:else【代码2】;return -1;main()int a=4,5,8,103,17,20.40.43,48.50;int x=40;int bn;printf(请输入要査询的数字.x=“);scanf(”cf,&x);bn = BSearch(a,x J1);if(bn=-l)printf(N%d在数组a中不存在!nx);elseprintf(%d为数组a的第d个元素n”,x,bn);(4) 输入不同的数,单步运行,观察low、high

34、、mid值如何变化。.11111! 2! 3! 4!试用C语言求解c的近似值。#include Hstdio.hHint Factor(int N) / 求解 N!if(N=l)return 1;elsereturn N*Factor(N-l );double f(int n) / 求解 e= 1 + 1/1 !+l/2!+. + l/n!int i;double x;x=1.0;for(i=l;i=n;i+)x= x+1.0/Factor(i);return(x);int main(void)int n;double e;printf(Hplease enter n:M); scanf(H%

35、d&n);e=f(n);printf(HThe value of e is about:%fe);例3若氐N为两个整数,试用C语言实现求乩N的最大公因子。 include int Gcd(int max, int min) /*求 max 与 min 最大公因数*/int temp;if(max 认真阅读教材2.3.2小节、2.3.3小节,了解算法中的难解性问题,明确用递归方法 求解梵天塔问题属于哪类问题。(2)复习递归的求解思想【实验内容】(1) 用递归的方法,编写C程序,求解梵天塔问题(2) 通过运行程序,直观上理解算法的时间复杂性【实验步骤】(1) 新建 Win32 Console Ap

36、plication 工程,工程名为 Exp6_l(2) 在Exp6_l工程中,新建exp6_l.c(3) 填写【代码1】【代码2】后,编译、运行并调试源程序#includc ustdio.hM#includc 吐imc.h”void move(char x,char y)primf(%cn”,x,y);void hanoi(int nxhar onexhar two,char three)/*将n个盘从one座借助two座,移到three座*/if(n=l)【代码1】;elsehanoi(n-1 ,one,three,two);move(one,three);【代码2】main()int n;

37、clockj start.finish;double time:printf(Hinput the number of diskes:”);scanf(H%d&n);printf(HThe step to moving %3d diskes:n,n);start = clock();hanoi(n;A,/B,;C,);finish = clock();time = (doub!e)(finish-start)/CLOCKS_PER_SEC;printfCMoving Finished!】”);printf(HThe program is cost %f seconds】”,time);(4)

38、有文曲星的同学可以试着根据程序给出的结果,看看效果如何(5) 记录n=5, n=10, n=15, n=20的运行时间,他们是线性增长的吗?30实验7背包问题与启发式算法*【实验目的】了解什么是启发式算法;了解贪婪算法求解背包问题的不同准则;【实验准备】(1)认真阅读教材23.7小节的内容,理解什么是背包问题:(2)认真阅读教材2.3.7小节的内容,理解什么是贪婪算法:(3)认貞阅读教材2.3.7小节的内容,理解用贪婪算法求解背包问题的三种准则:【实验内容】给左n种物品和一个背包,物品i的重量为W“英价值背包的重量容量为C, 要求在重量容星的限制下,尽可能使装入的物品总价最大,这就是背包问题。

39、背包问题是一 个典型的NP复杂性问题,也是一个在算法设让与分析”教学中,一般都要提到的一个典 型问题。为便于讨论,本试验所指的是一类物品不可分割的背包问题,即0/1背包问题,在 这类问题中,物品只有装入和不装入两种情况。贪婪算法是一种传统的启发式算法,它采用逐步构造最优解的方法,即在算法的每个阶 段,都作出在当时看上去最好的决策,以获得最大的“好处S换言之,就是在每一个决策 过程中都要尽可能的“贪S 直到算法中的某一步不能继续前进时,算法才停止。在算法的过程中,“贪”的决策一旦作出,就不可再更改,作出“贪”的决策的依据称 为贪婪准则。用贪婪算法解决背包问题,有以下3种常用的贪婪准则(1)每次都

40、选择价值最大的物品装包:(2)每次都选择重量最小的物品装包。(3)每次都选择V: /Wx值(价值密度)最大的物品装 请利用C语言实现上述三种贪婪准则求解背包问题。【实验步骤】1、每次都选择价值最大的物品装包(1)新建 Win32 Console Application 工程,工程名为 Exp7_l(2)在Exp6_l工程中,新建cxp7.c(3)填写【代码1】后,编译、运行并调试源程序#includc #dcfine MAX 100typcdcf stnictffloat w; /*物体的重量*/float v; /*物体的价值勺 Object;void sort( Object aJJnt

41、n) /*按照物体的价值v的降序的排列物体旬 int i,j;Object temp;for(i=0;in;i+)for(j=n-l;ijy-)if(aj-l.vaj.v)temp=aj;aUJ=ai;ai=temp;float Geedy_knapsack(Object a,int x(,float M Jnt n) int i;float m=M.value=0;for(i=0;in;i+)xi=O;sort(a.n);primf(放入背包中物体的价值分別是:n);for(i=0;in;i+)if(ai.w=m)printf(,%fnai.v);x(i=l;m=m-ai.w;else break;for(i=0;in;i+)value=value+(ai.v*xi);return value;)niain()int n,i,xMAXJ;Object aMAX;float M;/背包的总重量;float SumValue; /背包的总价值: printf(输入背包的总重量:n); scanf(,r%f&M);printf(输入物体的个数:n); s

温馨提示

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

最新文档

评论

0/150

提交评论