数据结构期末课程设计
- 格式:doc
- 大小:891.88 KB
- 文档页数:39
南京信息工程大学课程设计形式期末考试要求和评分标准2018-2019 学年第 1 学期课程名称:数据结构课程设计备注:本表作为不以试卷考试形式进行期末考试的课程使用。
附:《数据结构》课程设计题目1. 排序算法的性能分析问题描述设计一个测试程序,比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。
基本要求(1)对冒泡排序、直接排序、选择排序、箱子排序、堆排序、快速排序及归并排序算法进行比较。
(2)待排序表的表长不小于100,表中数据随机产生,至少用5组不同数据作比较,比较指标:关键字参加比较次数和关键字的移动次数(关键字交换记为3次移动)。
(3)输出比较结果。
选做内容(1)对不同表长进行比较。
(2)验证各算法的稳定性。
(3)输出界面的优化。
2. 排序算法思想的可视化演示—1基本要求排序数据随机产生,针对随机案例,对冒泡排序、箱子排序、堆排序、归并算法,提供排序执行过程的动态图形演示。
3. 排序算法思想的可视化演示—2基本要求排序数据随机产生,针对随机案例,,对插入排序、选择排序、基数排序、快速排序算法,提供排序执行过程的动态图形演示。
4. 线性表的实现与分析基本要求①设计并实现线性表。
②线性表分别采取数组(公式化描述)、单链表、双向链表、间接寻址存储方式③针对随机产生的线性表实例,实现线性表的插入、删除、搜索操作动态演示(图形演示)。
5. 等价类实现及其应用问题描述:某工厂有一台机器能够执行n个任务,任务i的释放时间为r i(是一个整数),最后期限为d i(也是整数)。
在该机上完成每个任务都需要一个单元的时间。
一种可行的调度方案是为每个任务分配相应的时间段,使得任务i的时间段正好位于释放时间和最后期限之间。
一个时间段不允许分配给多个任务。
基本要求:使用等价类实现以上机器调度问题。
等价类分别采取两种数据结构实现。
6. 一元稀疏多项式计算器问题描述设计一个一元稀疏多项式简单计算器。
基本要求一元稀疏多项式简单计算器的基本功能是:(1)输入并建立多项式;(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,c n,e n,其中n是多项式的项数,c i,e i,分别是第i项的系数和指数,序列按指数降序排序;(3)多项式a和b相加,建立多项式a+b;(4)多项式a和b相减,建立多项式a-b;(5)计算多项式在x处的值;(6)计算器的仿真界面(选做)7. 长整数的代数计算问题描述应用线性数据结构解决长整数的计算问题。
目录1问题描述 (2)2基本要求 (2)2.1问题分析及解决法案框架确定 (2)2.2程序设计 (2)2.3详细设计和编码 (2)3算法思想 (2)4模块划分 (3)4.1对各个模块进行功能的描述 (3)4.2模块之间关系及其相互调用 (3)5数据结构 (5)5.1定义栈 (5)5.2定义队列 (5)5.3栈的基本操作 (5)5.4队列的基本操作 (6)6测试数据 (6)7测试情况 (6)8总结 (9)1 问题描述试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。
其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。
例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。
栈和队列是一种常见的数据结构,是两种非常重要的线性结构,也都是线性表,它们是操作受限的的线性表,有顺序栈、链式栈、链式队列和循环队列等形式。
它们广泛应用在各种软件系统中。
本题就是要用这些线性结构先完成基本的应用,如回文,逆置。
2 基本要求2.1问题分析及解决法案框架确定充分地分析和理解问题本身,使程序结构清晰合理简单和易于调试,并确定每个函数的简单功能,以及函数之间的调用关系。
2.2程序设计1、选择顺序栈和链队列,完成回文判断、字符串的逆置;2、选择链栈和循环队列,完成回文判断、字符串的逆置;3、运用掌握C语言编写程序,实现所编程序的各个模块功能。
2.3详细设计和编码给出所有源程序清单,要求程序有充分的注释语句,至少要注释每个函数参数的含义和函数返回值的含义。
3 算法思想运用栈和队列算法,在序列依次输入时将序列分别入栈和入队列,利用栈FILO 和队列FIFO的特点,通过出栈和出队列实现序列顺序和逆序的比较,根据题目描述的回文序列判断并输出结果。
定义顺序栈和链队列及关于它们的基本操作,如定义栈和队列、求栈和队列的长度、入栈出栈、入队列出队列等。
福建工程学院课程设计课程:数据结构课程设计题目: 1.综合应用2.折半查找3.快速排序专业:软件工程班级:1101座号:3110305129姓名:潘聪2012 年 6 月26 日设计题目1:综合应用一、问题描述有N名学生,每名学生含有如下信息:学号、姓名、某四门课的成绩,并计算其总分,用一结构数组表示之。
然后实现以下功能:(1)将这些数据存放至文件stuf.dat中;(2)将文件中的数据读出至结构数组中,并显示之;(3)输出总分最高分和最低分的名字;(4)输出总分在340分,单科成绩不低于80分的名单;(5)求出各科平均分数;(6)按总分排名;(7)输出补考名单。
二、解决问题的算法思想描述(1)子函数:首先确定需要的子函数,总共7个,对应的功能分别是题目要求的七项(2)主函数:主函数中,要设计出易于使用的人机界面,就必须要用到switch 。
(3)文件的存放读取,必须要用到文件的函数,fopen,fread,fclose等。
(4)把每个学生的信息定义在一个结构数组中,利用结构数组更加方便。
(5)各科成绩排名用冒泡排序即可。
(6)输出总分,补考名单,各科的平均分都比较简单。
三、设计1. 数据结构的设计和说明//定义结构体typedef struct{int num; //学号char name[10]; //姓名int score1; //语文int score2; //数学int score3; //物理int score4; //化学}student;student stu[MAX]; //结构数组2.模块结构图及各模块的功能:3. 关键算法的设计(必须画出流程图)打印最高成绩和最低成绩的名单算法流程图:四、测试数据及测试结果:五、课程设计总结注意细节方面,任何一个小问题都不能忽视,才能最终解决问题。
六、关键源程序的清单关键算法一:按照总成绩排名:void paiming(){read();student x;int sum[MAX],t=0,i,m,n,j;for(i=0;i<MAX; i++){sum[i]=stu[i].score1+stu[i].score2+stu[i].score3+stu[i].score4;}for(m=0;m<MAX-1;m++)for(n=m+1;n<MAX;n++)if(sum[n]>sum[m]){t=sum[n];sum[n]=sum[m]; //总成绩交换sum[m]=t;x=stu[n];stu[n]=stu[m]; //总成绩对应的学生也要同时交换stu[m]=x;}printf("学号\t姓名\t语文\t数学\t英语\t物理\t总分\t名次\n");for(j=0;j<MAX;j++){printf("%-8d%-8s%-8d%-8d%-8d%-8d%-8d%-8d\n",stu[j].num,stu[j].name,stu[j].score1,stu[j].sc ore2,stu[j].score3,stu[j].score4,sum[j],j+1);}}关键算法二:打印出最高成绩和最低成绩的姓名:void maxmin(){int sum[MAX],i,j,m=0,n=0,max,min;read();for(i=0;i<MAX; i++){sum[i]=stu[i].score1+stu[i].score2+stu[i].score3+stu[i].score4;} //求书每个人的总分max=min=sum[0]; //用一维数组保存成绩,并且先令第一位学生的成绩作为最高分和最低分for(j=0;j<MAX;j++){if(sum[j]>max){m=j;max=sum[j]; //定义变量m,n分别保存最高分和最低分的下标}else if(sum[j]<min){n=j;min=sum[j];}}printf("\n最高分:%s 总分%d\n",stu[m].name,sum[m]);printf("\n最低分:%s 总分%d\n\n",stu[n].name,sum[n]);}设计题目2:折半查找一、问题描述用折半查找法,实现对任意一组数据的查找。
数据库期末课程设计一、课程目标知识目标:1. 理解并掌握数据库的基本概念、原理及其应用场景;2. 学会使用至少一种数据库管理系统,如MySQL、Oracle等,进行数据库的创建、管理与维护;3. 掌握SQL语言的基本语法,能够独立完成数据表的创建、修改、删除及数据查询、插入、更新、删除等操作;4. 了解数据库设计的基本原则,能够根据实际问题设计合理的数据库结构。
技能目标:1. 能够运用所学知识,结合实际需求,完成小型数据库系统的设计、开发与测试;2. 培养良好的数据库编程习惯,提高编程效率,降低错误率;3. 学会使用数据库技术解决实际问题,提高解决问题的能力。
情感态度价值观目标:1. 培养学生对数据库技术的兴趣,激发学习积极性;2. 培养学生的团队协作精神,提高沟通与协作能力;3. 培养学生严谨、细致、负责的学习态度,养成良好的学习习惯;4. 使学生认识到数据库技术在现代社会中的重要作用,增强学生的社会责任感和使命感。
课程性质:本课程为信息技术学科,旨在让学生掌握数据库的基本知识、技能,并能够运用所学解决实际问题。
学生特点:学生处于高年级阶段,已具备一定的计算机操作能力和逻辑思维能力。
教学要求:结合学生特点,注重理论与实践相结合,以实际操作为主,培养学生的实际应用能力。
在教学过程中,关注学生的学习进度,及时调整教学策略,确保课程目标的达成。
将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 数据库基本概念:介绍数据库的定义、作用、发展历程以及数据库系统的基本组成;2. 数据库管理系统:学习MySQL、Oracle等数据库管理系统的基本使用方法;3. SQL语言:讲解SQL语言的语法、数据类型、数据定义、数据操纵、数据查询等功能;4. 数据库设计:学习实体-关系模型、关系模型等数据库设计方法,了解范式理论;5. 数据库应用:结合实际案例,进行数据库设计、开发、测试与维护;6. 数据库安全与保护:介绍数据库安全性的重要性,学习用户权限管理、备份与恢复等操作。
第一章链表的应用线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后继课程的学习。
线性表的顺序存储结构,即顺序表的概念相对比较简单,因此,本章的主要任务是使用有关单链表的操作来实现通讯录信息系统的管理。
1.1设计要求本章的设计实验要求使用有关链表的操作来实现通讯录信息系统的管理。
为了验证算法,通讯录管理包括单通讯录链表的建立、通讯者的插入、通讯者的删除、通讯者的查询及通讯录表的输出等。
主控菜单的设计要求使用数字0—5来选择菜单项,其他输入则不起作用。
程序运行后,给出6个菜单项的内容和输入提示:1.通讯录链表的建立2. 通讯者结点的插入3. 通讯者结点的查询4. 通讯者结点的删除5. 通讯录链表的输出0. 退出管理系统请选择0—5:1.2设计分析1.2.1主控菜单函数设计分析1.实现循环和功能选择首先编写一个主控菜单驱动程序,输入0—5以进入相应选择项。
假设输入选择用变量sn存储,它作为menu_select函数的返回值给switch语句。
使用for循环实现重复选择,并在主函数main()中实现。
实际使用时,只有选择大于5或小于0的值,程序才能结束运行,这就要使用循环控制。
这里使用for循环语句实现菜单的循环选择,为了结束程序的运行,使用了“return”语句,也可以使用“exit(0);”语句。
2.得到sn的合理值如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。
假设函数名为menu_select,对于sn的输入值,在switch 中case语句对应数字1—5,对于不符合要求的输入,提示输入错误并要求重新输入。
将该函数与主函数合在一起,编译运行程序,即可检查并验证菜单选择是否正确。
1.2.2功能函数设计分析1.建立通讯录链表的设计这里实际上是要求建立一个带头结点的单链表。
建立单链表有两种方法,一种称之为头插法,另一种称为尾插法。
数据结构与算法课程设计报告题目:学院:专业班级:学生姓名:指导教师:2016 年06 月2 9日目录一、课程设计目的 (3)二、课程设计步骤 (3)三、课程设计内容 (5)四、课程设计报告...................................................................... 错误!未定义书签。
五、提交材料 (6)六、考核方式与评分标准 (7)七、参考文献 (9)附录1 齐齐哈尔大学软件工程系课程设计说明书(报告)撰写规范 (10)一、课程设计目的及要求《数据结构与算法分析》课程设计培养计算机专业的学生的算法程序设计能力。
通过上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对数据结构课程和算法的理解。
使学生更好地掌握数据结构的基本概念、基本原理、及基本算法,具有分析算法、设计算法、构造和开发较复杂算法的基本能力。
要求学生能综合运用《数据结构与算法分析》的相关知识,培养学生上机解决一些与实际应用结合紧密的、规模较大的问题的能力,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析实际问题的能力并提高C语言编程技巧,培养良好的编程风格。
课程设计要求独立完成,题目自选(参考题目见三,也可自拟),但需要老师确认(6月16日前定题),一人一题,要求程序有能采用交互式工作方式的界面进行功能的选择,只能用文件存储数据和处理数据不能使用数据库。
要求在教学周的第18周前完成。
二、课程设计步骤随着计算机性能的提高,它所面临的软件开发的复杂度也日趋增加。
然而,编制一个10000行的程序的难度绝不仅仅是一个5000行的程序的两倍,因此软件开发需要系统的方法。
一种常用的软件开发方法,是将软件开发过程分为分析、设计、实现和维护四个阶段。
虽然数据结构课程中的课程设计的复杂度远不如(从实际问题中提出来的)一个“真正的”软件,但为了培养一个软件工作者所应具备的科学工作的方法和作风,完成课程设计的应有如下的5个步骤:1.问题分析和任务定义通常,课程设计题目的陈述比较简洁,或者说是有模棱两可的含义。
*****数据结构课程设计题目: 赫夫曼树的建立运动会分数统计订票系统猴子选大王图的建立与输出姓名:***学号 ****专业:计算机科学与技术指导教师:****2006年9月20日目录一:绪言 (3)1.1课题设计背景 (3)1.2课题研究的目的和意义…………………………….3.1.3课题研究的内容 (4)二:主菜单设计 (4)2.1主菜单 (4)2.2主菜单源代码 (4)2.3主菜单流程图 (5)三:具体程序设计 (6)3.1赫夫曼树的建立 (6)3.2运动会设计 (8)3.3订票系统 (12)3.4猴子选大王 (15)3.5图的建立及输出 (16)四:总结与展望 (19)五:参考文献 (19).1.绪言1.1 课题背景《数据结构》作为一门独立的课程最早是美国的一些大学开设的,1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。
从60年代末到70年代初,出现了大型程序,软件也相对独立,结构程序设计成为程序设计方法学的主要内容,人们就越来越重视数据结构,认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法。
从70年代中期到80年代初,各种版本的数据结构著作就相继出现。
目前在我国,《数据结构》也已经不仅仅是计算机专业的教学计划中的核心课程之一,而且是其它非计算机专业的主要选修课程之一。
《数据结构》在计算机科学中是一门综合性的专业基础课。
数据结构的研究不仅涉及到计算机硬件(特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。
在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。
因此,可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程,在计算机科学中,数据结构不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统、数据系统及其它系统程序和大型应用程序的重要基础。
数据结构课程设计python一、课程目标知识目标:1. 理解数据结构的基本概念,掌握常用数据结构如列表、元组、字典和集合的特点及应用场景。
2. 学习并掌握栈和队列的操作原理及其在Python中的实现方法。
3. 掌握树和图的基本概念,了解二叉树、遍历算法及图的表示方法。
技能目标:1. 能够运用Python语言实现基本数据结构,并对其进行增、删、改、查等操作。
2. 能够利用栈和队列解决实际问题,如递归、函数调用栈、任务调度等。
3. 能够运用树和图解决实际问题,如查找算法、路径规划等。
情感态度价值观目标:1. 培养学生严谨的逻辑思维,提高分析问题和解决问题的能力。
2. 激发学生对数据结构和算法的兴趣,培养良好的编程习惯。
3. 引导学生认识到数据结构在实际应用中的重要性,增强学习热情和责任感。
课程性质:本课程为高年级数据结构课程,旨在使学生掌握Python语言实现数据结构的方法,提高编程能力和解决问题的能力。
学生特点:学生具备一定的Python编程基础,具有较强的逻辑思维能力,对数据结构有一定的了解。
教学要求:结合实际案例,采用任务驱动法,引导学生通过实践掌握数据结构的基本原理和应用方法。
注重培养学生的动手能力和团队协作精神,提高学生的综合素质。
通过本课程的学习,使学生能够具备独立设计和实现小型项目的能力。
二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,结合Python语言特点,分析各类数据结构在实际应用中的优势。
- 列表、元组、字典和集合的原理与应用- 栈与队列的操作原理及实现2. 线性表:讲解线性表的概念,重点掌握顺序表和链表的操作方法。
- 顺序表和链表的实现及操作- 线性表的查找和排序算法3. 树与二叉树:介绍树的基本概念,重点讲解二叉树的结构及其遍历算法。
- 树的基本概念和表示方法- 二叉树的性质、存储结构、遍历方法4. 图:讲解图的基本概念,掌握图的存储结构及遍历方法。
- 图的基本概念和表示方法- 图的遍历算法(深度优先搜索、广度优先搜索)- 最短路径和最小生成树算法5. 算法分析与设计:结合实例,分析算法性能,掌握基本的算法设计方法。
数据结构课程设计报告一元多项式的计算目录一、内容综述 (2)1.1 项目背景 (2)1.2 项目目标 (3)1.3 项目内容概述 (4)二、一元多项式的基本概念 (5)2.1 一元多项式的定义 (6)2.2 一元多项式的表示方法 (6)2.3 一元多项式的基本运算 (8)三、数据结构的选择与设计 (8)3.1 数据结构的选择 (9)3.2 数据结构的设计 (10)3.2.1 节点结构设计 (10)3.2.2 多项式结构设计 (11)四、一元多项式的计算实现 (11)4.1 多项式相加 (12)4.1.1 算法描述 (12)4.1.2 代码实现 (13)4.2 多项式相乘 (13)4.2.1 算法描述 (14)4.2.2 代码实现 (15)4.3 多项式除法 (16)4.3.1 算法描述 (16)4.3.2 代码实现 (17)五、实验与测试 (17)5.1 实验环境 (19)5.2 测试用例 (19)5.3 测试结果分析 (20)六、性能分析 (21)七、结论 (22)7.1 项目总结 (23)7.2 项目不足与展望 (24)一、内容综述本课程设计报告主要围绕一元多项式的计算展开,旨在深入探讨一元多项式的定义、表示方法及其在计算机中的存储与操作。
报告首先对一元多项式的概念进行了详细的阐述,包括其基本性质和常见类型。
随后,介绍了多种一元多项式的表示方法,如系数表示法、点值表示法等,并分析了各自优缺点。
在此基础上,针对一元多项式的基本运算,如加法、减法、乘法和除法等,详细介绍了算法实现过程,并分析了算法的时间复杂度和空间复杂度。
此外,本报告还涉及一元多项式的应用领域,如数值计算、符号计算等,并探讨了如何利用一元多项式解决实际问题。
通过本次课程设计,旨在培养学生的数据结构应用能力和编程实践能力,提高学生在计算机科学领域的综合素质。
1.1 项目背景随着计算机技术的飞速发展,数据结构作为计算机科学中的基础课程,其重要性日益凸显。
目录第一章课程设计的目的和意义 (1)第二章需求分析 ...................................................................... 错误!未定义书签。
第三章系统设计 (3)3.1 概要设计 (3)3.2详细设计 (5)第四章系统测试 (5)4.1系统运行初始界面 (6)4.2录入航班、客户信息界面 (6)4.3 查看所有航班信息界面 (6)4.4 买票、退票界面 (7)第五章心得体会 (7)第六章参考文献 (8)致谢 (8)附录 (9)源程序: (9)第一章课程设计的目的和意义《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:一:了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;二:初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;三:提高综合运用所学的理论知识和方法独立分析和解决问题的能力;四:训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
五:锻炼动手操作能力,培养我们的创新思维能力。
从编写代码,到调试程序,再到运行程序,这是设计的最重要环节,它需要我们用逻辑思维将我们所学知识和实际相结合,并在对方案的分析过程中能够有所创新,从而使运行方案更严谨更简洁。
培养好良好的思维,便要将这种思维赋予实践,即动手操作能力。
期末数据库课程设计一、课程目标知识目标:1. 理解数据库的基本概念,掌握数据库的设计原则和步骤。
2. 学会使用至少一种数据库管理系统(如MySQL、Access等),并能进行基本的数据库操作。
3. 掌握SQL语言的基本语法,能够编写简单的查询、插入、删除和更新语句。
4. 了解数据库的安全性和一致性,学会使用事务处理和锁定机制。
技能目标:1. 能够独立设计一个小型的数据库系统,包括需求分析、概念结构设计、逻辑结构设计和物理结构设计。
2. 能够运用所学数据库管理系统的功能,进行数据的有效存储、查询和管理。
3. 能够运用SQL语言,实现对数据库数据的查询、插入、删除和更新操作。
4. 能够分析并解决数据库中可能出现的问题,如性能优化、安全性控制等。
情感态度价值观目标:1. 培养学生严谨、细致的学习态度,养成良好的数据库设计和管理习惯。
2. 培养学生的团队合作精神,学会与他人共同分析问题、解决问题。
3. 增强学生对数据库技术在实际应用中的认识,激发学生学习兴趣和探究欲望。
4. 培养学生遵守数据库道德规范,尊重知识产权,养成良好的信息素养。
本课程旨在帮助学生掌握数据库的基本知识和技能,通过实际操作和实践,使学生在完成课程学习后,能够独立设计、使用和管理小型的数据库系统。
同时,注重培养学生的团队合作意识、严谨的学习态度和良好的信息素养,为将来的学习和工作打下坚实基础。
二、教学内容1. 数据库基础知识:包括数据库的基本概念、发展历程、数据库管理系统(DBMS)的类型和功能。
- 课本章节:第一章 数据库基础- 内容:数据库定义、数据库管理系统、数据库系统架构、关系数据库基本概念。
2. 数据库设计:需求分析、概念结构设计、逻辑结构设计、物理结构设计。
- 课本章节:第二章 数据库设计- 内容:E-R模型、关系模型、范式理论、数据库设计步骤与实践。
3. 数据库操作:学习使用数据库管理系统进行数据操作。
- 课本章节:第三章 数据库操作- 内容:创建数据库、表、索引;数据查询、插入、删除、更新操作。
设计1----约瑟夫环问题一、需求分析1、问题描述:设编号为1,2…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。
开始时任意给出一个报数上限值m,从第一人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺指针方向上的下一个人起重新自1起顺序报数;下去,直到所有人全部出列为止。
2、首先指定报数上限值,建立循环链表中不需要头结点,注意空表与非空表的界限。
3、程序执行的命令包括:创建链表;删除结点;输出出列顺序;结束。
二、概要设计1、为实现上述程序功能,应以不带头结点的循环链表存储密码与编号。
为此,需要一个抽象数据类型:循环链表。
如下:数据关系:R1={<ai-1,ai>|ai-1,ai∈D,ai-1<ai,i=1,2,……,n}基本操作:creat(&L,n)操作结果:构造长度为n的循环链表。
Listdelete(&L, e)初始条件:线性表L存在。
操作结果:删去报数为e的元素L长度减一。
2、本程序包括三个模块:一是主程序模块;Void main(){初始化L 调用linklist creat(linklist L)调用void deletenode(linklist L)}二是链表的建立;三是删除指定链表元素。
三、详细设计主要程序:typedef struct LNode {int number;int password;struct LNode *next; }LNode,*LinkList;LinkList create(int n)//建立一个没有头结点的循环链表{LinkList head,p1,p2;int i;for(i=1;i<=n;i++){p1=(LinkList)malloc(sizeof(LNode));printf("第%d个人的密码为:",i);scanf("%d",&p1->password);p1->number=i;if(i==1)head=p1;elsep2->next=p1;p2=p1;}p2->next=head;return(head);}int main()//主函数{LinkList head,p,s;int m,N,j,k,count=0;printf("输入总的人数:");scanf("%d",&N);printf("输入初始密码:");scanf("%d",&m);head=create(N);for(j=N;j>=1;j--){count++;p=head;for(k=1;k<m+j;k++){s=p;p=p->next;}m=p->password;printf("第%d个退出的是编号为%d的人,密码为%d\n",count,p->number,m);s->next=p->next;head=p->next;free(p);}return 0;}四、运行结果及分析五、总结通过这次课程设计,让我对单循环链表有了更深刻的体会,掌握了单循环链表的初始化,创建,删除,遍历等操作。
在调试程序的时候,可以逐块的检查,遇到程序报错时,可以手工操作模拟程序的运行,需要跟踪某个变量时,可以在函数适当的位置加入输出语句,查看变量的值的变化情况。
经常会将链表中的指针所指的位置混淆,以致在头结点的位置上徘徊多时,今后应多注意这方面的问题。
设计2----迷宫问题一、需求分析1、问题描述:迷宫是一些互相连通的交叉路口的集合,给定一个迷宫入口,一个迷宫出口,当从入口到出口存在通路时输出其中的一条通路,当从入口到出口不存在通路时输出无通路存在。
2、要求:利用随机方法产生一个m n的迷宫,0和1分别表示迷宫中的通路和障碍。
存在回路时能记住已经走过的路口,不重复已经走过的路口。
3、程序执行命令包括:创建迷宫;创建空栈;销毁栈;寻找通路;输出迷宫。
二、概要设计1、设定栈的抽象数据类型定义:ADT Stack{数据对象:D={ai|ai∈CharSet,i=1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}}2、求解迷宫的算法:设定当前位置的初值为入口位置;do{若当前位置可通则{将当前位置插入栈顶;若当前位置是出口位置,则结束;否则切换当前位置的相邻位置为新的当前位置;}否则{若栈不空且栈顶位置尚有其他方向未被探索;则设定新的位置为沿顺时针方向旋转找到的栈顶位置的下一邻块;若栈不空且栈顶位置的四周均不可通;则{删去栈顶位置;若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或栈空; }}}while (栈不空);3、以结构的形式来表示迷宫矩阵的每个点以及后续的整个通路的点struct{int i; //行号int j; //列号int di; //下一个可走相邻方位的方位号} Stack[MaxSize]; //定义栈三、详细设计主要程序:#include <stdio.h>#define MaxSize 100#define M 4#define N 4迷宫初始化:int mg[6][6]={{1,1,1,1,1,1},{1,0,1,1,1,1},{1,0,1,1,1,1},{1,0,0,1,1,1},{1,1,0,0,0,1},{1,1,1,1,1,1}};int top=-1; //初始化栈顶int count=1; //路径数计数迷宫函数:void MgPath(){int i,j,k,di,find;top++; //初始方块进入栈Stack[top].i=1;Stack[top].j=1;Stack[top].di=-1;mg[1][1]=-1;while (top>-1) //栈不空时循环{i=Stack[top].i;j=Stack[top].j;di=Stack[top].di; //取栈顶if (i==M && j==N&&count>=1) //找到了出口,输出路径{printf("%d:",count++);for (k=0;k<=top;k++){printf("(%d,%d)",Stack[k].i,Stack[k].j);}printf("\n");mg[Stack[top].i][Stack[top].j]=0; //让该位置变为其他路径可走方块top--;i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;}find=0;while (di<4 && find==0) //找(i,j)方块下一个可走方块{di++;switch(di){case 0:i=Stack[top].i-1;j=Stack[top].j;break;case 1:i=Stack[top].i;j=Stack[top].j+1;break;case 2:i=Stack[top].i+1;j=Stack[top].j;break;case 3:i=Stack[top].i,j=Stack[top].j-1;break;}if (mg[i][j]==0)find=1;}if (find==1) //找到了一个可走的相邻方块{Stack[top].di=di; //修改原栈顶元素的di值top++; //将可走相邻方块进栈Stack[top].i=i;Stack[top].j=j;Stack[top].di=-1;mg[i][j]=-1; //避免重复走到该方块,将其置为-1}else //没有相邻方块可走,则退栈{mg[Stack[top].i][Stack[top].j]=0; //让该位置变为其他路径可走方块top--;}}if(count==1)printf("迷宫无通路\n");}主函数:int main(){printf("从(1,1)到(4,4)的通路为:\n");MgPath();return 0;}四、运行结果及分析五、总结开始对栈的构造以及出栈入栈函数不清楚,而且定义的出栈函数繁琐,定义的函数有逻辑上的错误。
通过迷宫求解的编程练习思考数据结构的使用,比如对栈、指针、链表等的深入了解,让我们感受到了数据结构及其算法的重要。
此外还熟悉了各种函数的应用。
对于我们初学者来说,学习编写迷宫求解,对我们掌握了解数据结构的知识有很大的帮助。
我们通过编程实践,还能拓展思路,让我们主动去寻找所需要的算法,怎样提高程序的质量等。
设计3----表达式求值问题一、需求分析1、问题描述:键盘输入表达式,求该表达式的后缀表达式、再求该表达式的值。
2、要求:分别测试表达式中运算符为一位数、多位数、小数时的值。
3、为了实现算符优先算法。
可以使用两个工作栈。
一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。
二、概要设计1、首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)。
2、ADT描述:ADT Stack{数据对象:D={ai|ai∈ElemSet,i=1,2,…,n, n≧0}数据对象:R1={<ai,ai-1>|ai-1,ai∈D,i=2,…,n}约定an端为栈顶,ai端为栈底;基本操作:InitStack(&S) 操作结果:构造一个空栈S。
GetTop(S) 初始条件:栈S已存在。
操作结果:用P返回S的栈顶元素。
Push(&S,ch) 初始条件:栈S已存在。
操作结果:插入元素ch为新的栈顶元素。
Pop(&S) 初始条件:栈S已存在。
操作结果:删除S的栈顶元素。
In(ch) 操作结果:判断字符是否是运算符,运算符即返回1。
Precede(c1, c2) 初始条件:c1,c2为运算符。
操作结果:判断运算符优先权,返回优先权高的。
Operate(a,op,b) 初始条件:a,b为整数,op为运算符。
操作结果:a与b进行运算,op为运算符,返回其值。