关键源程序及其详细的注释
- 格式:doc
- 大小:389.00 KB
- 文档页数:15
程序设计源代码程序设计源代码是软件开发过程中的核心组成部分,它包含了实现软件功能的所有指令和逻辑。
源代码通常以文本形式存在,使用特定的编程语言编写,如Java、Python、C++等。
以下是对程序设计源代码的详细讨论。
源代码的结构1. 注释:源代码中的注释用于解释代码的功能,帮助开发者理解代码逻辑。
注释通常不会被编译器执行。
2. 变量:变量用于存储数据,它们可以是整数、浮点数、字符、字符串等。
3. 数据类型:不同的编程语言有不同的数据类型,用于定义变量可以存储的数据种类。
4. 控制结构:包括条件语句(如if-else)和循环语句(如for、while),用于控制程序的执行流程。
5. 函数/方法:函数是一段可重复使用的代码,用于执行特定的任务。
方法通常与对象相关联,是对象的行为。
6. 类和对象:在面向对象编程中,类是创建对象的蓝图,而对象是类的实例。
7. 库和模块:库是一组预先编写好的代码,可以被多个程序共享和使用。
模块是组织代码的一种方式,通常包含一组相关的函数和类。
源代码的编写规范1. 命名规范:变量、函数、类等应该使用有意义的名字,以提高代码的可读性。
2. 格式规范:代码应该遵循一定的格式,如缩进、括号的使用等,以保持一致性和可读性。
3. 代码复用:尽量避免重复代码,通过函数和模块来实现代码的复用。
4. 错误处理:源代码应该包含错误处理机制,以确保程序在遇到问题时能够优雅地处理。
5. 安全性:编写源代码时,需要考虑到安全性,避免潜在的安全漏洞。
源代码的版本控制版本控制是一种记录源代码变更历史的方法,它允许开发者跟踪每次的更改,并在必要时回退到旧版本。
常见的版本控制系统包括Git、SVN等。
1. 分支管理:允许开发者在不影响主分支的情况下,进行新功能的实验和开发。
2. 合并和冲突解决:当多个开发者同时工作在同一个项目上时,版本控制系统提供了合并不同分支的功能,并在出现冲突时提供解决方案。
3. 历史追踪:版本控制系统记录了每次提交的详细信息,包括作者、时间、更改内容等。
《数据结构》课程设计指导书课程设计名称:数据结构课程设计09102版服务课程名称:数据结构课程设计适用班级:BX0805、BX0806 课程设计周数:1-2周指导老师:王中华(wangzh@)指导方式:集体辅导与个别答疑相结合课程设计授课单位:上海电机学院电子信息学院计算机基础教学部课程设计教材及主要参考资料:陈元春等编著的《实用数据结构基础》,中国铁道出版社严蔚敏,吴伟民编著的《数据结构》,清华大学出版社一、课程设计教学目的及基本要求1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5.设计的题目要求达到一定工作量,并具有一定的深度和难度。
6.编写出课程设计报告,报告正文不得少于10页(其中正文文字部分不得少于七页,代码不算页数)。
二、课程设计内容及安排1.问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么?2.逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。
逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;3.详细设计:定义相应的存储结构并写出各函数的伪码算法。
在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。
详细设计的结果是对数据结构和基本操作作出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;4.程序编码:把详细设计的结果进一步求精为程序设计语言程序。
某企业旳库存管理系统1.设计内容:对课程《算法与程序设计》中旳有关内容进行综合设计或应用(详细课题题目见背面旳供选题目)。
(一)、课程设计题目:某企业旳库存管理系统(二)、目旳与规定:1、目旳:(1)规定学生到达纯熟掌握C++语言旳基本知识和技能;(2)基本掌握面向对象程序设计旳基本思绪和措施;(3)可以运用所学旳基本知识和技能,处理简朴旳面向对象程序设计问题。
2、基本规定:(1)规定运用面向对象旳措施以及C++旳编程思想来完毕系统旳设计;(2)规定在设计旳过程中,建立清晰旳类层次;(3)在系统中至少要定义四个类,每个类中要有各自旳属性和措施;(4)在系统旳设计中,至少要用到面向对象旳一种机制。
3、创新规定:基本规定到达后,可进行创新设计,如根据查找成果进行修改旳功能。
4、写出设计阐明书(三)、设计措施和基本原理:1、问题描述(功能规定):某企业既有如下设备:一般电视机、DVD、带DVD旳电视机,带DVD旳电视机旳售价为一般电视机和DVD单价之和旳80%,规定对所有旳库存设备都能按照品名进行显示、查找、增长和删除、保留旳功能。
2、问题旳处理方案:根据系统功能规定,可以将问题处理分为如下环节:(1)分析系统中旳各个实体之间旳关系及其属性和行为;(2)根据问题描述,设计系统旳类层次;(3)完毕类层次中各个类旳描述(包括属性和措施);(4)完毕类中各个组员函数旳定义;(5)完毕系统旳应用模块;(6)功能调试;(7)完毕系统总结汇报以及系统使用阐明书。
2.设计规定:课程设计汇报正文内容(包括系统设计规定,设计思绪,系统功能模块图,系统流程图,类旳层次图(包括类组员列表),调试过程,关键程序代码,总结,参照书目等)。
(一)需求分析系统设计目旳与意义;系统功能需求(系统流程图);输入输出旳规定;(二)总体设计系统功能分析;系统功能模块划分与设计(系统功能模块图)。
(三)详细设计数据库需求分析;数据库概念构造设计(E-R图);数据库逻辑构造设计;类层次图。
图书管理系统1.课程设计目的全面熟悉、掌握信息系统项目管理基本知识,增强对不同的问题运用和灵活选择合适的数据结构以及项目管理描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,增强面向对象程序设计概念,熟悉java语言编程,养成提供文档资料的习惯和规范编程的思想,为后继课程的实验以及课程设计打下较扎实的基础。
进一步提高上机动手能力,培养使用计算机解决实际问题的能力,为后继课程的实验以及课程设计,特别是自学、毕业论文的完成打下扎实的基础。
2.课题题目⑴进销存管理系统⑵酒店管理系统⑶企业门户网站⑷图书馆管理系统3.设计要求:⑴设计课题题目:按学号顺序(每15位学生选择一题)选择相应题号的课题。
换题者不记成绩。
⑵根据自己对应的课题完成以下主要工作:①完成系统需求分析:包括系统设计目的与意义;系统功能需求(系统流程图);输入输出的要求。
②完成系统总体设计:包括系统功能分析;系统功能模块划分与设计(系统功能模块图)。
③完成系统详细设计:包括数据库需求分析;类层次图;界面设计与各功能模块实现。
④系统调试:调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。
⑤使用说明书及编程体会:说明如何使用你编写的程序,详细列出每一步的操作步骤。
⑥关键源程序(带注释)⑶按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档。
⑷不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。
二、进度安排第15周星期一上午 8:00星期四下午 14:00 晚上6:30第16周星期四晚上 6:30 星期五晚上 6:30课题4:图书馆管理系统(一)、课程设计题目:图书馆管理系统(二)、目的与要求:1、目的:(1)要求学生达到熟练掌握java语言的基本知识和技能;(2)基本掌握面向对象程序设计的基本思路和方法;(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
PL/0语言编译程序分析PL/0语言是Pascal语言的一个子集,我们这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。
PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。
词法分析和代码生成作为独立的子程序供语法分析程序调用。
语法分析的同时,提供了出错报告和出错恢复的功能。
在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE代码。
词法分析子程序分析:词法分析子程序名为getsym,功能是从源程序中读出一个单词符号(token),把它的信息放入全局变量sym、id和num中,语法分析器需要单词时,直接从这三个变量中获得。
(注意:语法分析器每次用完这三个变量的值就立即调用getsym子程序获取新的单词供下一次使用。
而不是在需要新单词时才调用getsym过程)。
getsym过程通过反复调用getch子过程从源程序过获取字符,并把它们拼成单词。
getch过程中使用了行缓冲区技术以提高程序运行效率。
词法分析器的分析过程:调用getsym时,它通过getch过程从源程序中获得一个字符。
如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到则为保留字,把sym变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把sym 置为ident,把这个单词存入id变量。
查保留字表时使用了二分法查找以提高效率。
如果getch获得的字符是数字,则继续用getch获取数字,并把它们拼成一个整数,然后把sym置为number,并把拼成的数值放入num变量。
如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把sym则成相应的类型。
如果遇到不合法的字符,把sym置成nul。
语法分析子程序分析:语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语意生成相应的代码,并提供了出错处理的机制。
《数据结构》课程设计实践指导书一、实践的目的和任务《数据结构》课程设计是计算机科学技术专业集中实践性环节之一,是学习完《数据结构》课程后进行的一次全面的综合练习。
开设本课程设计实践的主要目的就是要达到理论与实际应用相结合,提高学生的动手能力,完成计算机应用能力的培养;主要任务是通过对给定问题的求解,使学生在运用《数据结构》、程序设计以及其它所学课程中的各种基本技术和理论,在建立问题模型、构造求解算法、设计数据结构、编程及上机调试等方面得到全面的锻炼,从而能更深刻地理解《数据结构》的精髓,为后续软件课程的学习及软件设计能力的提高奠定良好的基础。
二、实践的内容和要求(一)实践内容实践内容为数据结构课程完成后,运用《数据结构》、程序设计以及其它所学课程中的知识和技术来解决实际的问题。
在解决实际应用性问题时,按照计算机解决问题的步骤进行以下几个方面的工作:采用简明、严格的问题描述,建立模型,设计求解方法,用计算机实现求解方法,最后进行测试和文档制作。
1、建立模型许多问题的最初描述既不精确又不简练,还有一些问题不可能简单而精确地用计算机可求解的形式来描述,即使有些可用计算机求解的问题,也需要在很大范围内确定问题的参数,而那些合理的参数值只有通过实验才能确定。
因此,要用计算机解决问题,必须首先要以简明、严格的方式将问题描述清楚。
数学或其它科学中的几乎所有分支都可作为某一类具体问题的抽象模型。
例如,在涉及到若干对象及其相互间关系的问题时所用的数学模型为图论;数值计算问题中常用的数学模型为线性方程组(用于求解电路的电流强度或结构中的应力)或微分方程(用于预报人口增长情况或化学反应速度等);在符号与文本处理问题时常用字符串及形式语法作为模型(如编译系统)。
《数据结构》课程中所介绍的各种结构均可作为一种模型。
2、构造算法对问题建立了适当的数学模型后,就可以依据这一模型求解。
最初的目标是给出一个算法形式的解法,这是设计的核心部分。
上机实验的目的、要求和评分标准一、实验目的上机实践是各位对本门课程所学知识的一种全面、综合的能力训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节,也是对课堂教学与实践教学效果的一种检验。
通常,实验题中的问题比平时的习题复杂得多,也更接近实际。
实验着眼于原理与应用的结合,使你们学会如何把书上学到的知识运用于解决实际问题的过程中去,培养从事软件开发设计工作所必需的基本技能;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时的练习较偏重于如何编写功能单一的“小”算法,而实验题是软件设计的综合训练,包括问题分析(需求分析)、总体结构设计和用户界面设计(概要设计)、程序设计基本技能和技巧等,即一整套软件工程规范的训练和科学作风的培养。
此外,还有很重要的一点是:机器是比任何教师都严厉的主考者。
为了达到上述目的,本课程共安排了10个实验单元,各单元的训练重点在于基本的数据结构,而不强调面面俱到。
各实验单元与教科书的各章具有紧密的对应关系。
二、要求:⒈做好每一次上机前的准备以提高上机效率:①预先认真阅读相关实验内容,做到心中有明确的目的要求和任务,要有备而来,应该自己独立的思考和设计你的算法和程序,并争取在规定的时间内如期完成上机工作任务。
对于个别目前基础较差的同学,实在是没法完成任务的建议你先参考其他同学的算法,勤学好问,最终自己独立完成,以增强你的感性认识,强化你的实践基础,提高你的实践能力。
②按照实验内容规定的习题题目,事先在实验预习报告上编写好源程序及运行程序所需的典型数据,并经人工静态检查认为无误;手编程序应书写整齐,应在每个题目之间留出一定的空间,以备记录上机调试情况和运行结果等;对程序中自己有疑问的地方,应作出记号,以便上机时给以注意。
③将想要上机验证的问题草拟提纲;制定一个简捷的程序调试计划。
⒉上机时输入和调式自己所编写的程序。
对“出错信息”,应善于自己分析判断,并充分利用开发工具提供的错误信息和调试手段解决出现的问题,及时修改与完善算法、源程序,随时记录有价值的内容。
《数值分析》计算实习作业《一》北航第一题 设有501501⨯的矩阵⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=501500499321a bc b a b cc b a b ccb a bc c b a b c b a A其中.064.0,16.0);501,2,1(64.0)2.0sin()024.064.1(1.0-===--=c b i e i i a i i 矩阵的特征值)501,,2,1( =i i λ满足||min ||,501150121i i s λλλλλ≤≤=<<<试求1. 5011,λλ和s λ的值2. 的与数4015011λλκλμ-+=k 最接近的特征值)39,,2,1( =K κλi3. 的(谱范数)条件数2)A (cond 和行列式A det 要求1. 算法的设计方案(A 的所有零元素都不能存储)2. 全部源程序(详细注释)。
变量为double ,精度-1210=ε,输出为e 型12位有效数字3. 特征值s 5011,,λλλ和)39,,2,1( =K κλi 以及A cond det ,)A (2的值4. 讨论迭代初始向量的选取对计算结果的影响,并说明原因解答:1. 算法设计对于s λ满足||min ||5011i i s λλ≤≤=,所以s λ是按模最小的特征值,直接运用反幂法可求得。
对于5011,λλ,一个是最大的特征值,一个是最小的特征值,不能确定两者的绝对值是否相等,因此必须首先假设||||5011λλ≠,然后运用幂法,看能否求得一个特征值,如果可以求得一个,证明A 是收敛的,求得的结果是正确的,然后对A 进行带原点平移的幂法,偏移量是前面求得的特征值,可以求得另一个特征值,最后比较这两个特征值,较大的特征值是501λ,较小的特征值就是1λ。
如果在假设的前提下,无法运用幂法求得按模最大的特征值,即此时A 不收敛,则需要将A 进行带原点平移的幂法,平移量可以选取1,再重复上述步骤即可求得两个特征值。
注释规则:1:一般情况下,源程序有效注释量必须在20%以上。
说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。
主要函数及其功能、修改日志等。
示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。
说明:Description一项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它文件关系等。
History是修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。
2:注释的内容要清楚、明了,含义准确,防止注释二义性。
说明:错误的注释不但无益反而有害。
3:避免在注释中使用缩写,特别是非常用缩写。
说明:在使用缩写时或之前,应对缩写进行必要的说明。
4:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
示例:如下例子不符合规范。
例1:/* get replicate sub system index and net indicator */repssn_ind = ssn_data[index].repssn_index;repssn_ni = ssn_data[index].ni;例2:repssn_ind = ssn_data[index].repssn_index;repssn_ni = ssn_data[index].ni;/* get replicate sub system index and net indicator */应如下书写/* get replicate sub system index and net indicator */repssn_ind = ssn_data[index].repssn_index;repssn_ni = ssn_data[index].ni;5:对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。
在C语言中,注释是用来为代码添加说明或解释,帮助程序员理解代码的功能和作用。
注释不会被编译器编译,因此对程序的运行没有任何影响。
C语言中有两种类型的注释:
1.单行注释:使用双斜杠(//)开头,后面跟着注释内容。
例如:
// 这是一个单行注释int x = 5; // 这也是一个单行注释
2.多行注释:使用/* 开始,使用*/ 结束。
例如:
/* 这是一个多行注释
它可以跨越多行*/
使用注释是一种良好的编程习惯,因为它可以帮助你和其他人更好地理解代码。
注释应该简洁明了,描述代码的功能和作用,而不是解释代码是如何工作的。
如果代码本身已经很清晰,那么可能不需要添加注释。
课程设计题目产生随机数并运算的程序设计学院自动化专业电气工程及其自动化班级电气0903班姓名李闯指导教师张丹红2012 年 1 月12 日课程设计任务书学生姓名:李闯专业班级:电气0903指导教师:张丹红工作单位:自动化学院题目:产生随机数并运算的程序设计初始条件:带有编辑器、汇编程序、连接程序和调试程序的电脑一台。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)采用汇编语言设计一个程序, 显示任意两个16进制数的加法或减法表达式及其运算结果。
按Q 退出程序。
(1)设计任务及要求分析(2)方案比较及认证说明(3)系统原理阐述(4)软件设计课题需要说明:软件思想,流程图,源程序及程序注释(5)调试记录及结果分析(6)总结(7)参考资料(8)附录:芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图时间安排:1月4日~1月5日:收集资料,方案选择1月6日~1月9日:整体流程,程序细节1月10日~1月12日:调试程序,报告撰写1月13日:交设计报告,程序演示,答辩指导教师签名:年月日系主任(或责任教师)签名:年月日摘要 (1)产生随机数并运算的程序设计 (2)1.设计任务及要求分析 (2)2.原理说明 (2)2.1 随机数产生 (2)2.2 随机数转化成16进制ASCII码字符 (2)2.3利用随机数判断随机数加减 (3)2.4将表达式结果输出 (3)2.5保持输出与提示语 (3)2.6 汇编程序流程图 (4)3.源程序及注释 (4)4.调试记录及结果分析 (9)5.总结 (11)6.参考文献 (12)《微机原理及接口技术》是一门很重要的学科,同时也是许多先进技术的基石,合理的运用课本知识进行汇编,可以实现许多精彩实用,奇妙而又方便的功能,本课设利用汇编语言在DOS环境下,实现产生随机数进行相加减的功能,每运行一次就会产生任意俩个十六进制数的相加或者相减,并且在屏幕上显示表达式。
任务书(学生成绩管理系统)计算机科学与技术专业C程序设计课程设计任务书(10级)题目: 学生成绩管理系统学生姓名:学号:班级:计算机科学与技术四班题目类型:软件工程(R)指导教师: 一( 课程设计的题目简介该设计要求学生以学校学生成绩管理业务为背景~设计、开发一套“学生成绩管理系统”软件.通过该题目的设计过程~可以培养学生结构化程序设计的思想~加深对高级语言基本语言要素和控制结构的理解~针对c语言中的重点和难点内容进行训练~独立完成有一定工作量的程序设计任务~同时强调好的程序设计风格.得到软件工程的综合训练~提高解决实际问题的能力。
二( 课程设计的任务1、查阅文献资料~一般在5篇以上,2、以学生成绩管理业务为背景~通过调研、分析现有的管理模式和已有的管理软件~建立系统模型,3、完成软件结构设计和算法设计,4、完成系统的软件开发和测试工作,5、撰写设计说明书,6、做好答辩工作.三(课程设计的主要内容、功能及技术指标1、问题分析及解决方案框架确定:充分地分析和理解问题本身~弄清要求做什么。
在确定解决方案框架过程中~综合考虑系统功能~考虑怎样使系统结构清晰、合理、简单和易于调试。
最后确定每个过程和函数的简单功能~以及过程,或函数,之间的调用关系~并画出函数之间的调用关系图.2、详细设计和编码:定义相应的存储结构~确定各个函数的算法~并画出流程图~在此基础上进行代码设计~每个明确的功能模块程序一般不超过60行~否则要进一步划分.3、上机前程序静态检查:上机前程序静态检查可有效提高调试效率~减少上机调试程序时的无谓错误。
静态检查主要有两种途径:用一组测试数据手工执行程序,通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑。
把程序中的明显错误事先排除。
4、程序调试与测试:采用自底向上~分模块进行~即先调试低层函数。
能够熟练掌握调试工具的各种功能~设计测试数据确定疑点~通过修改程序来证实它或绕过它。
调试正确后~认真整理源程序及其注释~形成格式和风格良好的源程序清单和结果。
竭诚为您提供优质文档/双击可除c,注释规范篇一:c语言编写规范之注释1、头文件包含includes2、私有类型定义privatetypedef3、私有定义privatedefine4、私有宏定义privatemacro5、私有变量privatevariables6、私有函数原型privatefunctionprototypes7、私有函数privatefunctions8、私有函数前注释/************************************************** ******************************Functionname:Fsmc_noR_init*description:configurestheFsmcandgpiostointerfacewiththenoRmemory.*thisfunctionmustbecalledbeforeanywr ite/readoperation*onthenoR.*input:none*output:none*Return:none*************************************************** ****************************/9、程序块采用缩进风格编写,缩进空格为4。
10、相对独立的程序块之间、变量说明之后必须加空行;11、较长的字符(>80字符)要分成多行书写,长表达式要在低优先级操作符划分新行,操作符放在新行之首,新行要恰当缩进,保持排版整齐;12、循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首;13、若函数或过程中的参数较长,则要进行适当的划分。
14、不允许把多个短语句写在一行中,即一行只写一条语句。
15、if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。
《面向对象程序设计》大作业要求和任务书一、目的和要求检验学生学习《面向对象程序设计》课程后的学习成果,对于软件程序设计主流方法和思想——面向对象程序设计方法和思想的牢固掌握和熟练应用是一个非常重要的检测,是后续实践课程得以顺利进行的必要保证,对学生的程序设计能力培养和软件工程能力的培养具有重要的作用和意义。
要求学生综合应用已学的相关知识,例如程序设计基本思想和方法、C++语言、面向对象程序设计思想和方法,通过对真实世界的模拟和抽象来解决一些比较简单的实际问题。
要求学生针对比较系统的题目进行编码、测试,并进行设计说明书的撰写,从而培养和锻炼学生初步的工程意识和做法。
加深对所学知识的理解和掌握,巩固课程学习的内容,培养学生掌握面向对象程序设计(OOP)的思想,锻炼其使用面向对象的程序设计思想分析和解决实际问题的能力,培养上机动手能力,培养文档报告书面表达和思辨的能力。
要求学生对自己学过的C++知识进行综合运用,要求要用到类的特性:即类的封装、类的抽象、继承和多态,编写一些小型的具有一定应用价值的程序,通过对真实世界的模拟和抽象来解决一些比较简单的实际问题;掌握在Visual C++集成开发环境下编辑、编译、链接和运行一个C++程序的基本方法。
二、任务内容参考后附的大作业题目,规定每位同学完成两道题目(第一个题目是计算机类,第二个题目从第2-4题中任选一题)。
针对所选题目完成如下具体任务:1. 问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?对功能进行说明;2. 类设计:综合考虑系统功能,对问题描述中涉及的操作对象定义相应的数据类型。
抽象数据类型的实现尽可能做到数据封装,充分运用继承、派生、多态等知识,给出用UML描述的类之间的关系图;3. 详细设计:给出各个主要模块的算法,并画出模块之间的调用关系图;要使得系统结构清晰、合理、简单和易于调试,写出主要函数的算法框架;4. 程序编码:把详细设计的结果进一步求精为程序设计语言程序。
上机实验要求及规范《数据结构》课程具有比较强的理论性,同时也具有较强的可应用性和实践性,因此上机实验是一个重要的教学环节。
一般情况下学生能够重视实验环节,对于编写程序上机练习具有一定的积极性,但是容易忽略实验的总结,忽略实验报告的撰写。
对于一名大学生必须严格训练分析总结能力、书面表达能力。
需要逐步培养书写科学实验报告以及科技论文的能力。
拿到一个题目,一般不要急于编程,而是应该按照面向过程的程序设计思路(关于面向对象的训练将在其它后继课程中进行),首先理解问题,明确给定的条件和要求解决的问题,然后按照自顶向下,逐步求精,分而治之的策略,逐一地解决子问题。
具体步骤如下:1.问题分析与系统结构设计充分地分析和理解问题本身,弄清要求做什么(而不是怎么做),限制条件是什么。
按照以数据结构为中心的原则划分模块,搞清数据的逻辑结构(是线性表还是树、图?),确定数据的存储结构(是顺序结构还是链表结构?),然后设计有关操作的函数。
在每个函数模块中,要综合考虑系统功能,使系统结构清晰、合理、简单和易于调试。
最后写出每个模块的算法头和规格说明,列出模块之间的调用关系(可以用图表示),便完成了系统结构设计。
2.详细设计和编码详细设计是对函数(模块)的进一步求精,用伪高级语言(如类C语言)或自然语言写出算法框架,这时不必确定很多结构和变量。
编码,即程序设计,是对详细设计结果的进一步求精,即用某种高级语言(如C/C++语言)表达出来。
尽量多设一些注释语句,清晰易懂。
尽量临时增加一些输出语句,便于差错矫正,在程序成功后再删去它们。
3.上机准备熟悉高级语言用法,如C语言。
熟悉机器(即操作系统),基本的常用命令。
静态检查主要有两条路径,一是用一组测试数据手工执行程序(或分模块进行);二是通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑,在这个过程中再加入一些注释和断言。
如果程序中逻辑概念清楚,后者将比前者有效。
4.上机调试程序调试最好分块进行,自底向上,即先调试底层函数,必要时可以另写一个调用驱动程序,表面上的麻烦工作可以大大降低调试时所面临的复杂性,提高工作效率。
源程序(带注释)#include "stdio.h"#include "stdlib.h"#include "string.h"#define MAX 3 /*车库容量*/#define price 0.05 /*每车每分钟费用*/ typedef struct time{int hour;int min;}Time; /*时间结点*/typedef struct node{char num[10];Time reach;Time leave;}CarNode; /*车辆信息结点*/typedef struct NODE{CarNode *stack[MAX+1];int top;}SeqStackCar; /*模拟车站*/typedef struct car{CarNode *data;struct car *next;}QueueNode;typedef struct Node{QueueNode *head;QueueNode *rear;}LinkQueueCar; /*模拟通道*/void InitStack(SeqStackCar *); /*初始化栈*/int InitQueue(LinkQueueCar *); /*初始化便道*/int Arrival(SeqStackCar *,LinkQueueCar *); /*车辆到达*/ void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /*车辆离开*/void List(SeqStackCar,LinkQueueCar); /*显示存车信息*/ void main(){SeqStackCar Enter,Temp;LinkQueueCar Wait;int ch;InitStack(&Enter); /*初始化车站*/InitStack(&Temp); /*初始化让路的临时栈*/InitQueue(&Wait); /*初始化通道*/while(1){printf("***************************************");printf("\n1.the car arrive");printf("\t2.the car leave");printf("\n\n\n3.the schedule");printf("\t\t4.out\n");printf("***************************************\n"); while(1){scanf("%d",&ch);if(ch>=1&&ch<=4) break;else printf("\n please choose:1|2|3|4.");}switch (ch){case 1:Arrival(&Enter,&Wait);break; /*车辆到达*/case 2:Leave(&Enter,&Temp,&Wait);break; /*车辆离开*/ case 3:List(Enter,Wait);break; /*列表打印信息*/case 4:exit(0); /*退出主程序*/default:break;}}}void InitStack(SeqStackCar *s) /*初始化栈*/{int i;s->top=0;for(i=0;i<=MAX;i++)s->stack[s->top]=NULL;}int InitQueue(LinkQueueCar *Q) /*初始化便道*/{Q->head->next=NULL;Q->rear=Q->head;return(1);}void PRINT(CarNode *p) /*打印出栈车的信息*/{int room;int A1,A2,B1,B2;printf("\n please input the depart time: ");scanf("%d:%d",&(p->leave.hour),&(p->leave.min));printf("\n the number of the car:");puts(p->num);printf("\n the time the car arrive:%d:%d",p->reach.hour,p->reach.min);printf("thedeparttime:%d:%d",p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf("\nthefee:%2.1fyuan",((B1-A1)*60+(B2-A2))*price) ;free(p);}int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/{CarNode *p;QueueNode *t;p=(CarNode *)malloc(sizeof(CarNode));flushall();printf("\n input the number of the car:");gets(p->num);if(Enter->top<MAX) /*车场未满,车进车场*/{Enter->top++;/* printf("\n the place of the car:",Enter->top); */ printf("\n the time the car arrive:");scanf("%d:%d",&(p->reach.hour),&(p->reach.min));Enter->stack[Enter->top]=p;return(1);}else /*车场已满,车进便道*/{printf("\n gai che xu zai bian dao dengdai!\n");t=(QueueNode *)malloc(sizeof(QueueNode));t->data=p;t->next=NULL;W->rear->next=t;W->rear=t;return(1);}}void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W){ /*车辆离开*/int i,room;CarNode *p,*t;QueueNode *q;/*判断车场内是否有车*/if(Enter->top>0) /*有车*/{while(1) /*输入离开车辆的信息*/{printf("\n qing shuru che zai chechang de weizhi/1--%d/:",Enter->top);scanf("%d",&room);if(room>=1&&room<=Enter->top)break;}while(Enter->top>room) /*车辆离开*/{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1){Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p);/*判断通道上是否有车及车站是否已满*/if((W->head!=W->rear)&&Enter->top<MAX) /*便道的车辆进入车场*/{q=W->head->next;t=q->data;Enter->top++;printf("\n biandao de %s haoche jinru chechang di %d weizhi",t->num,Enter->top);/* printf("\n qing shuru xianzai de shijian:"); */scanf("%d:%d",&(t->reach.hour),&(t->reach.min));W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;free(q);}else printf("]n biandaoli meiyou che. \n");}else printf("chechangli meiyou che."); /*没车*/}void List1(SeqStackCar *S) /*列表显示车场信息*/{ int i;if(S->top>0) /*判断车站内是否有车*/{printf("\n chechang:");printf("\n weizhi daodashijian chepaihao\n");for(i=1;i<=S->top;i++){printf("%d",i);printf("%d:%d",S->stack[i]->reach.hour,S->stack[i]->rea ch.min);puts(S->stack[i]->num);}}else printf("\n chechangli meiyou che");}void List2(LinkQueueCar *W) /*列表显示便道信息*/{QueueNode *p;p=W->head->next;if(W->head!=W->rear) /*判断通道上是否有车*/{printf("\n dengdai chelian de haoma wei:");while(p!=NULL){puts(p->data->num);p=p->next;}}else printf("\n biandaoli meiyou che.");}void List(SeqStackCar S,LinkQueueCar W){int flag,tag;flag=1;while(flag){printf("\n qingxuanze 1|2|3:");printf("\n 1.chechang\n 2.biandao\n 3.fanhui\n"); while(1){scanf("%d",&tag);if(tag>=1||tag<=3)break;else printf("\n qingxuanze 1|2|3:");}switch(tag){case 1:List1(&S);break; /*列表显示车场信息*/case 2:List2(&W);break; /*列表显示便道信息*/case 3:flag=0;break;default:break;}}}。
关键源程序及其详细的注释<一>、服务器端:1、Socket初始化//初始化对话框BOOL CCSocketDlg::OnInitDialog(){count=0;m_list.InsertColumn(0,"消息");m_list.SetColumnWidth(0,435);m_edit.SetLimitText(99);for (int i=0;i<50;i++)//初始化SOCKET数组msgsock=NULL;serv.sin_addr.s_addr=htonl(INADDR_ANY); //设定地址serv.sin_family=AF_INET;serv.sin_port=5000;//htons(5000);addlen=sizeof(serv);m_button.EnableWindow(FALSE);sock=socket(AF_INET,SOCK_STREAM,0); //创建socket if (bind(sock,(sockaddr*)&serv,addlen)) //绑定{m_edit.SetWindowText("绑定错误");}else{m_edit.SetWindowText("服务器创建成功");//显示提示信息,表示服务器创建成功listen(sock,5); //开始侦听AfxBeginThread(&thread,0); //调用线程}return TRUE;}2、接收线程//服务器线程UINT thread(LPVOID p){char buff[100];//定义缓冲区CSize size;size.cx=0;size.cy=30;int s=1,msgcount,loop=1,flag=0;CCSocketDlg *dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd();//获得当前运行对话框句柄msgcount=dlg->getcount();//获取还没有被占用的数组序号if (msgcount==-1)//如果不等于-1,则表示,还有空缺SOCKETloop=0;if(loop){s=1;dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen) );//用空缺的SOCKET等待客户连接if (dlg->msgsock[msgcount]==INVALID_SOCKET){dlg->m_edit.SetWindowText("Error accept");//如果返回错误,则提示错误}else{AfxBeginThread(thread,0);//如果和客户端连接成功,则再次启动一个线程dlg->SetForegroundWindow();//显示连机成功信息em(dlg->count++,"连接成功");dlg->m_list.InsertItdlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr));dlg->m_list.Scroll(size);dlg->m_button.EnableWindow(TRUE);while(s!=SOCKET_ERROR)//如果没有发生错误,则一直循环等待数据的到来{s=recv(dlg->msgsock[msgcount],buff,100,0); //循环接收数据dlg->SetForegroundWindow();if (s!=SOCKET_ERROR)如果接收成功,则显示接收到的数据{dlg->m_list.InsertItem(dlg->count++,buff);dlg->m_list.Scroll(size);dlg->sendtoall(dlg->msgsock[msgcount],buff);//发送信息到所有的客户端}}send(dlg->msgsock[msgcount],"Disconnected",100,0);//如果发生错误,发送连接中断消息到客户端dlg->m_list.InsertItem(dlg->count++,"Disconnected");//显示相关信息dlg->m_list.Scroll(size);dlg->msgsock[msgcount]=NULL;//将该SOCKET设定为空for (int i=0;i<50;i++)//判断是否还有其他客户在保持连接if (dlg->msgsock!=NULL)flag=1;if (flag!=1)//如果没有客户连接了,则将发送按钮设置为不可用dlg->m_button.EnableWindow(FALSE);closesocket(dlg->msgsock[msgcount]);//关闭连接}}AfxEndThread(0); //终止线程return 0;}3、数据发送当用户在文本框中输入要发送的信息后,然后单击“发送”按钮,则执行以下代码。
//发送数据void CCSocketDlg::OnButton1(){char buff[100];m_edit.GetWindowText(buff,99);//获得当前文本框中的信息m_edit.SetWindowText("");//清空文本框的信息m_list.InsertItem(count++,buff);//向列表框中插入要发送的数据CSize size;size.cx=0;size.cy=30;m_list.Scroll(size);for (int i=0;i<50;i++)//循环向所有客户发送信息{if (msgsock!=NULL)send(msgsock,buff,100,0);}}<二>、客户端1、连接服务器连接服务器的程序是在“连接”按扭的单击事件中处理的。
//连接服务器,连接按扭处理事件void CCSocketcliDlg::OnButton2(){char ipaddress[35];//定义标量以保存服务器地址m_edit2.GetWindowText(ipaddress,30);//获得服务器地址cli.sin_addr.s_addr=inet_addr(ipaddress);//设定SOCKET需要连接的地址cli.sin_family=AF_INET;cli.sin_port=5000;//htons(5000);//设定服务器端口clisock=socket(AF_INET,SOCK_STREAM,0);//创建socketee=1;AfxBeginThread(thread,0); //启动线程}2、接收数据线程当用户单击“连接”按钮以后,程序进行相关设定,最后调用了“AfxBeginThread(thread,0);”启动了该线程。
UINT thread(LPVOID v){char buff[100];char array[25][30]=//定义数组用来存放一些IP地址{"192.168.0.3",…(这里省略了部分IP)"192.168.0.30"};CSize size;size.cx=0;size.cy=30;int s=1,addcount=0;CCSocketcliDlg *dlg=(CCSocketcliDlg*) AfxGetApp()->GetMainWnd();//获得对话框dlg->m_connect.EnableWindow(FALSE);dlg->m_disconnect.EnableWindow(TRUE);while(connect(dlg->clisock,(sockaddr*)&(dlg->cli),sizeof(dlg->cli)) &&dlg->ee!=0) //连接到服务器{dlg->m_edit.SetWindowText("等待.....");for (int i=0;i<=65000;i++)//空循环for(int j=0;j<=200;j++);if (addcount==25)addcount=0;dlg->cli.sin_addr.s_addr=inet_addr(array[addcount++]);//如果连接不成功,则连接下一个地址}if (dlg->ee==1)//如果连接成功,则显示相关信息dlg->m_list.InsertItem(dlg->count++,"连接成功");dlg->m_button1.EnableWindow(TRUE);//设定发送按钮为可用状态dlg->SetForegroundWindow();while(s!=SOCKET_ERROR && dlg->ee!=0) //循环获得数据{s=recv(dlg->clisock,buff,100,0); //调用recv函数接收数据dlg->SetForegroundWindow();if (s!=SOCKET_ERROR && dlg->ee!=0)//如果没有发生错误,同时没有断开连接,则显示接收到的数据dlg->m_list.InsertItem(dlg->count++,buff);dlg->m_list.Scroll(size);}send(dlg->clisock,"Disconnected",100,0);//如果发生错误,发送断开命令dlg->m_button1.EnableWindow(FALSE);//设定相关控件属性dlg->m_connect.EnableWindow(TRUE);dlg->m_disconnect.EnableWindow(FALSE);closesocket(dlg->clisock);//关闭SOCKETAfxEndThread(0);//终止该线程return 0;}3、数据发送数据发送就是客户端向服务器及其他客户端发送信息,其中向其他用户发送信息是通过服务器实现的,因此,客户只需要将消息发送到服务器就可以了。