编程珠玑第五章习题五——C++实现二分搜索时进行错误检测
一,概述
主要讲解如何保证编程的正确性。在程序中加入断言(assert(断言内容) //如果错误,则终止程序。否则正常执行)。
typdef //声明自定义类型
typedef int size; //声明int 型整数的别名
size array[4];
- typedef struct tagNode
- {
- char *pItem;
- pNode *pNext;
- } *pNode;
测试结构题大小的程序
- #include "stdio.h"
- typedef struct tagNode
- {
- char *pItem; //32位
- struct tagNode *pNext;//32位
- } *pNode;
- int main()
- {
- printf("%d\n",sizeof(struct tagNode));
- return 0;
- }
二,习题
5)测试、断言优化过程
- for (i = 0; i < n - 1; ++i)
- assert(a[i] < a[i+1]);
如何利用二分的性质来进行处理还是一个问题。
一种办法是:
- int bs(int *a, int b, int e, int v)
- {
- int *begin = a + b, *end = a + e, *mid;
- if (!a || b >= e) return -1;
- while (begin < end)
- {
- mid = begin + ((end - begin) >> 1);
- assert(*begin <= *mid && *mid <= *end);
- if (*mid > v) end = mid;
- else if (*mid < v) begin = mid + 1;
- else return mid - a;
- }
- return -1;
- }
但是这个方法需要多次使用才能检测出来,也就是可能在查找某两个数的时候不会报错,可能在查找别的几个数的时候就报错了。很多时候,这不是一种好选择。
根据第五题的题意,可以写如下代码来减少每次检测的量。
- int bs(int *a, int b, int e, int v)
- {
- int *begin = a + b, *end = a + e, *mid, i = b;
- static int *record = 0;
- if (!a || b >= e) return -1;
- if (!record || record != a)
- {
- while (i < e && a[i] < a[i+1]) ++i;
- assert(i == e);
- }
- while (begin < end)
- {
- mid = begin + ((end - begin) >> 1);
- assert(*begin <= *mid && *mid <= *end);
- if (*mid > v) end = mid;
- else if (*mid < v) begin = mid + 1;
- else return mid - a;
- }
- return -1;
- }
加一个static变量来记录这个数组是否经过检测,来决定以后的检测还需要进行。
当然对于多个数组的检测,可以利用hash来处理,因为一般来说,数组的下标地址都是不一样的。
编程珠玑第五章习题五——C++实现二分搜索时进行错误检测相关推荐
- 编程珠玑之第二章习题5
问题描述: n元一维向量旋转问题数将向量ab变为ba.如何将向量abc变为cba? (这对交换非相邻内存块问题进行了建模) 问题解析: 1.这里需要用到一个重要的性质:CBA=(ArBrCr)r ...
- 编程珠玑第12章习题
内容来自互联网,做了一些修改 参考: http://blog.csdn.net/tianshuai1111/article/details/7583297 http://blog.csdn.net/t ...
- 编程珠玑第三章习题答案
1 税收问题 .if-else语句的每个分支的形式都差不多,我们可以用数组来使循环简单一点.数组中每个点表明一个阶段,用level[i]表示阶段i的起始点,tax[i]表示阶段i的税率.然后就是输入一 ...
- 编程珠玑第六章习题二——C++实现一个数的因子分解
引申为一道题目: 将大于1的自然数N进行因式分解,满足N=a1*a2*a3-am 编一程序,对任意的自然数N, 求N的所有形式不同的因式分解方案总数. 如N=12,共有8种分解方案,它们分别是: 12 ...
- 编程珠玑第四章习题答案
主要内容来自于互联网,自己做了一定的修改 1.为了保证范围不超过范围,我们需要在初始化的时候,让变量不超出范围.这样每次循环得到的新的范围是慢慢缩小的,不会越界. 2 返回t在数组x中第一次出现的位置 ...
- 编程珠玑之第二章习题10
问题描述: 10.某一天,一个新研究员向托马斯·爱迪生报到.爱迪生要求他计算出一个空灯泡盒的容积.在使用测径仪和微积分进行数小时的计算后,这个新员工给出了一个答案--150立方厘米.而爱迪生在几秒钟之 ...
- java第5版的课后答案_java第五章习题及答案.doc
java第五章习题及答案 第五章习题 填空题: 1.小应用程序是存储于----上的java程序,它是在--端运行的. 2.小应用程序的生命期中包括如下几个阶段:--.--.--.--. 3.程序包ja ...
- 《学习Opencv》第五章 习题6
这是第五章 习题5.6的结合版,其中实现了摄像头抓拍功能,能够成功运行. #include "stdafx.h" #include "cv.h" #includ ...
- 工程伦理第五章习题答案
工程伦理 第五章习题 工程伦理 1 选择题 2 讨论题 1 选择题 1-5 BDCBB 6 ABC 7 ACD 8 AB 9 BCD 10 ABCD 11 × × √ √ √ 2 讨论题 1.结合自己 ...
最新文章
- oracle修改备库状态,Oracle-CRSCTL命令显示备库状态不正确
- 四面体的表面积_JACS:武汉大学汪成课题组利用从平面至四面体的扭曲单体来合成COFs材料...
- 【转】ABAP BASE64编码与解码练习
- seaborn pairplot ax_强者致胜 AX电竞叛客RTX3070显卡发布_
- 用好这个数据分析工具,BI平台建设少费一半力
- 遍历mysql大表的小技巧
- mysql建表影响效率_关于MySQL建表对DML的影响【转】
- 【论文阅读】Abdominal multi-organ segmentation with organ-attention networks and statistical fusion
- radius认证服务器无响应,squid radius认证“RADIUS服务器没有响应”
- matlab函数句柄介绍
- linux在线汇编编译器,Linux 汇编 Hello World
- 使用pyspider爬取巨量淘宝MM图片 1
- php 科学计数法 运算,php弱语言特性-计算科学计数法
- 余秋雨大师描写我的家乡
- 海量向量搜索引擎 Milvus 开源啦
- 播音计算机论文,播音主持论文的题目或论文内容
- python爬虫爬取京东_python爬取京东价格
- 55.【Java 线程】
- Word中如何从中间的某一页开始编页码
- signature=e9c3e111e2374143dfad8bd5f3d2024c,XFA: Faster Signature Matching with Extended Automata
热门文章
- 组装肩部带有减速器双轴机械臂组装与调试
- 一款蓝牙音频无线传输设备上拆下的光电管
- 关于2020年第十五届全国大学生智能汽车竞赛山东赛区技术答辩的相关规则
- 聊聊那些令人惋惜的车模
- 浅谈python语言_浅谈Python语言基础知识点!
- cmd文件打开闪退_批处理闪退、运行中断等问题的处理
- css实现提示信息,单纯使用CSS实现动态提示信息
- php5.6 64位配置,centos(64位) 安装PHP5.6,配置LNMP
- mapreduce将key相同的value结合在一起_个人理解Hadoop中MapReduce
- java final 接口_Java自学-接口与继承 final