1. 课程设计目标
《软件设计基础-C++》的课程设计作为该课程的重要实践环节,旨在将理论知识与实际应用相结合。本次设计不仅涵盖C++核心知识点,还贴近工程实践需求。通过综合性的项目训练,提升学生在问题分析、逻辑思维、程序编写和动手实现方面的能力。最终目的在于帮助学生全面掌握本课程内容,培养良好的编程规范,从而高效达成教学目标。
2. 设计任务与基本要求
主要任务:
- 子任务1:实现顺序查找功能
- 子任务2:针对升序排列的数据实现二分查找
- 子任务3:针对降序排列的数据实现二分查找
具体要求如下:
- 对系统功能进行详细的需求分析;
- 构建合理且高效的系统架构与数据结构;
- 界面布局清晰、美观、操作直观;
- 代码简洁明了,功能完整,并能稳定运行;
- 具备一定的创新性和扩展性;
- 设计文档、流程图等材料表达清楚、逻辑严谨;
- 课程结束后须按规定提交完整的课程设计报告。
3. 系统设计说明
⑴ 功能概述
- 功能1: 在无序数组中执行顺序查找,定位指定元素;
- 功能2: 对已按升序排列的数组使用二分法查找目标值;
- 功能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 位置元素与目标值:
- 相等时返回下标并结束;
- 当前元素大于目标值时,调整 tail = mid - 1;
- 当前元素小于目标值时,调整 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,导致当 head == tail 时仍有一个元素未参与比较即退出循环,造成遗漏。
解决方案:
将循环条件修改为 head <= tail,确保所有可能位置都被检测,修复后程序运行正常。
6. 存在不足与优化建议
现存问题:
当前设计强制要求用户在输入数组时必须严格按照升序或降序排列。一旦输入顺序不符合规定,可能导致查找失败,容易让用户误以为程序存在缺陷。
改进方案:
可在用户完成数据输入后,增加一次预处理检查步骤,遍历整个数组判断其是否满足升序或降序条件。若不满足,则给出明确提示信息,指导用户重新输入。此举可显著提升用户体验,减少误解,增强系统的健壮性。
7. 课程设计总结与体会
通过本次课程设计,深入理解了C++语言中查找算法的基本原理与实现方式,尤其是顺序查找与二分查找的应用场景及差异。在编码实践中,提升了对程序结构设计、调试技巧以及边界条件处理的能力。同时认识到良好的用户交互设计和输入验证机制对于程序可靠性的重要性。整个过程不仅是知识的巩固,更是工程思维的锻炼,为后续学习更复杂的软件开发任务打下了坚实基础。
本次实验是一次极具意义的算法编程实践经历。在实现过程中,我先后完成了顺序查找与二分查找两种算法的编码工作。其中,顺序查找逻辑直观、实现简便,因此不再展开详细说明。
相比之下,二分查找虽然其核心思想十分清晰——通过不断缩小搜索区间来快速定位目标元素,但在实际编写代码时却充满了挑战。看似简单的流程,在边界条件的处理、循环终止条件的设定以及中点索引的计算等细节上极易出错。我在初次实现时便频繁遭遇死循环、漏检或数组越界等问题。
然而,正是通过反复调试、分析错误案例并不断优化代码逻辑,我逐步理清了各个关键环节的处理方式。每一次失败都加深了我对算法运行机制的理解。最终,经过多次尝试与修正,我成功实现了稳定且高效的二分查找算法,并深刻体会到“思想简单,细节复杂”这一说法的真正含义。

参考文献
- 刘汝佳. 算法竞赛入门经典. 北京: 清华大学出版社, 2014.6
- 啊哈磊. 啊哈算法. 北京: 人民邮电出版社, 2014
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. 算法导论. 北京: 机械工业出版社, 2012.12
- 潭浩强. C程序设计. 北京: 清华大学出版社, 2017.12
- C++程序设计基础教程学生用书. 北京: 清华大学出版社, 2011.6


雷达卡


京公网安备 11010802022788号







