1. 设计目的
《软件设计基础-C++》设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖C++的知识点,又接近工程实际需要。目的是通过设计的综合训练,培养学生实际分析问题、解决问题的能力,以及编程和动手能力,最终目标是通过课程设计这种形式,帮助学生系统掌握C++这门课程的主要内容,养成良好的编程习惯,更好的完成教学任务。
2. 设计任务与要求
要求:
本次课程设计利用《软件设计基础-C++》课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,独立完成所布置的任务。
要求:
- 对系统进行功能需求分析
- 设计合理的数据结构和系统框架
- 界面设计美观、清楚、合理
- 编程简练,程序功能齐全,能正确运行
- 具有一定的创新性
- 说明书、流程图要清楚
- 课题完成后必须按要求提交课程设计报告
任务:
- 子任务1:顺序查找
- 子任务2:升序排序的二分查找
- 子任务3:降序排序的二分查找
3. 课程设计说明书
⑴功能描述
功能1:顺序查找数据中的某个元素
功能2:升序排序的二分查找数据中的某个元素
功能3:降序排序的二分查找数据中的某个元素
⑵概要设计
模块结构图如下:
根据功能分析,建立系统的体系结构,即将整个系统分解为3个模块,分成三个模块,分别是顺序查找模块,升序数组的二分查找模块,降序数组的二分查找模块。
⑶详细设计:
总体流程图:
各功能模块流程图:
3.1 顺序查找流程图:
3.2升序数组二分查找流程图:
3.3降序数组二分查找流程图:
⑷代码实现
初始界面
作用:提示用户进行选择。
设计思路:使用switch语句来实现,用户选择不同的选项,调用不同的函数
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(){
int choice = 0;
while(1) {
printf("\n\n\n");
printf("****查找类算法应用****\n");
printf("\n");
printf(" 1.顺序查找\n");
printf(" 2.升序排序的二分查找 \n");
printf(" 3.降序排序的二分查找 \n");
printf(" 0.退出\n");
printf("\n");
printf("***********************\n");
printf("please choice(0-3):");
scanf("%d",&choice);
switch(choice){
case 1: Sequential_search(); break;
case 2: Ascendind_order(); break;
case 3: Descending_order(); break;
case 0: exit(0);
break;
}
}
return 0;
}
顺序查找元素功能
作用:根据用户的输入,进行顺序查找目标元素。
设计思路:先提示用户输入数据,然后提示用户输入目标元素。最后使用for循环来查找目标元素,如果存在返回其位置,若不存在,则提示用户不存在。
代码如下:
void Sequential_search(){
int n,target;
int index = -1;
int i;
printf("请输入数据的数量:");
scanf("%d",&n);
int data[n];
printf("请输入数据,使用空格隔开!\n");
for(i = 0; i < n; i++){
scanf("%d",&data[i]);
}
printf("请输入你要查找的目标数据:");
scanf("%d",&target);
for(i = 0; i < n; i++){
if(target == data[i]){
index = i+1;
break;
}
}
if(index == -1){
printf("没有查找到该元素!");
}else{
printf("该元素位于数据的第%d个位置",index);
}
}
升序数组二分查找元素功能
作用:根据用户的输入的升序数组,来使用二分查找法,查询目标元素。
设计思路:先提示用户输入数据,此时用户的输入顺序必须时升序的,然后提示用户输入目标元素。使用head指向用户输入的第一个元素,tail指向最后一个元素。Mid=(head+tail)/2,当下标为mid的元素==用户输入的元素,返回下标程序退出,当下标为mid的元素>=用户输入的元素,tail=mid-1,继续下一轮循环。当下标为mid的元素<=用户输入的元素,head=mid+1,继续下一轮循环.直到找到元素的位置,或者head>tail时程序退出。
代码如下:
void Descending_order(){
int n,target;
int index = -1;
int i;
printf("请输入数据的数量:");
scanf("%d",&n);
int data[n];
printf("请输入数据,使用空格隔开!(数据必须降序)");
for(i = 0; i < n; i++){
scanf("%d",&data[i]);
}
printf("请输入你要查找的目标数据:");
scanf("%d",&target);
int head,tail,mid;
head = 0;
tail = n-1;
// 这里是关键
while(head <= tail){
mid = (head+tail)/2;
if(data[mid] == target){
index = mid;
break;
}else if(data[mid] < target){
tail = mid-1;
}else if(data[mid] > target){
head = mid+1;
}
}
if(index == -1){
printf("没有查找到该元素!\n");
}else{
printf("该元素位于数据的第%d个位置\n",index+1);
}
}
降序数组二分查找元素功能
作用:根据用户的输入的降序数组,来使用二分查找法,查询目标元素。
设计思路:先提示用户输入数据,此时用户的输入顺序必须时降序的,然后提示用户输入目标元素。程序上整体上与升序数组二分查找元素相似,使用head指向用户输入的第一个元素,tail指向最后一个元素。Mid=(head+tail)/2,当下标为mid的元素==用户输入的元素,返回下标程序退出,当下标为mid的元素>=用户输入的元素,head=mid+1,继续下一轮循环。当下标为mid的元素<=用户输入的元素,tail=mid-1,继续下一轮循环.直到找到元素的位置,或者head>tail时程序退出。
代码如下:
void Descending_order(){
int n,target;
int index = -1;
int i;
printf("请输入数据的数量:");
scanf("%d",&n);
int data[n];
printf("请输入数据,使用空格隔开!(数据必须降序)");
for(i = 0; i < n; i++){
scanf("%d",&data[i]);
}
printf("请输入你要查找的目标数据:");
scanf("%d",&target);
int head,tail,mid;
head = 0;
tail = n-1;
// 这里是关键
while(head <= tail){
mid = (head+tail)/2;
if(data[mid] == target){
index = mid;
break;
}else if(data[mid] < target){
tail = mid-1;
}else if(data[mid] > target){
head = mid+1;
}
}
if(index == -1){
printf("没有查找到该元素!\n");
}else{
printf("该元素位于数据的第%d个位置\n",index+1);
}
}
4. 课程设计成果
运行结果1.顺序查找数据元素
运行结果2.对升序数组进行二分查找数据元素
运行结果3.对降序数组进行二分查找数据元素
5. 程序调试过程
遇到的问题:
在二分查找时,边界元素无法查找到。
程序调试步骤:
我先进行思考为什么不到该元素,先输入4个元素,通过增加断点的方式进行调试。最终发现由于程序中while循环的判断条件时head<tail导致程序中还有一个元素没有进行比对,从而退出元素,最终导致算法的失败。最后通过将while的条件改成head<=tail使得程序顺利运行。
6. 设计问题的不足和改进方案
设计问题不足:
此次设计要求在用户输入数组时必须有顺序必须时升序,或者是降序,如果用户不符合输入规定很有可能查找不到用户输入的数据。
针对设计问题的不足的改进方案:
针对如上问题,可以在用户输入后,进行遍历一遍用户输入的数据,起到检查的作用,这样如果用户输入的不正确可以提示用户输入的有问题。这样可以有效的避免用户以为程序出错误的问题。
7. 课程设计心得
这次实验对我来说这一个非常有意义的算法程序编写的实践活动,顺序查找非常简单,就不过多赘述了,而对于二分查找来说。二分查找的思想其实非常简单,但是我在使用程序实现的过程中,可谓时错误百出。二分查找的思想虽然简单,但是二分查找的细节却是魔鬼。但是经过我不断的研究,犯错。最终成功掌握了二分查找算法。
8. 参考文献
- 刘汝佳 算法竞赛入门经典 北京:清华大学出版社2014.6
- 啊哈磊 啊哈算法 北京 人民邮电出版社 2014
- [Thomas H.Cormen](https://book.douban.com/search/Thomas H.Cormen)/[Charles E.Leiserson](https://book.douban.com/search/Charles E.Leiserson)/[Ronald L.Rivest](https://book.douban.com/search/Ronald L.Rivest)/[Clifford Stein](https://book.douban.com/search/Clifford Stein) 算法导论 北京 机械工业出版社 2012.12
- 潭浩强 C程序设计.北京:清华大学出版社,2017.12
Thomas H.Cormen)/[Charles E.Leiserson](https://book.douban.com/search/Charles E.Leiserson)/[Ronald L.Rivest](https://book.douban.com/search/Ronald L.Rivest)/[Clifford Stein](https://book.douban.com/search/Clifford Stein) 算法导论 北京 机械工业出版社 2012.12 - 潭浩强 C程序设计.北京:清华大学出版社,2017.12
- C++程序设计基础教程学生用书 北京 清华大学出版社 2011.6