基于C++的查找类算法应用

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

猜你喜欢

转载自blog.csdn.net/newlw/article/details/125190351