动态规划 第1关:数塔问题

任务描述

本关任务:编写用动态规划解决数塔问题。

相关知识

为了完成本关任务,你需要掌握:动态规划。

编程要求

求上图从顶层到顶层的一个路径,使路径上的数字和最大。要求输出最大的数字和max和数值和最大的路径。

解题思路:

原始信息有层数和数塔中的数据,层数用一个整型变量n存储,数塔中的数据用二维数组data,存储成如下的下三角阵: 

  1. 9
  2. 12 15
  3. 10 6 8
  4. 2 18 9 5
  5. 19 7 10 4 16

测试输入:

  1. 5
  2. 9
  3. 12 15
  4. 10 6 8
  5. 2 18 9 5
  6. 19 7 10 4 16

输出示例:

  1. max=59
  2. 数值和最大的路径是:9->12->10->18->10
#include <stdio.h> 

/********** Begin **********/
#define MAX(a,b)((a) > (b) ? (a) : (b))//宏定义
int main() {
	int a[50][50][4];    
    a[1][1][1]=9;
    a[2][1][1]=12, a[2][2][1]=15;
    a[3][1][1]=10, a[3][2][1]=6,  a[3][3][1]=8;
    a[4][1][1]=2,  a[4][2][1]=18, a[4][3][1]=9,  a[4][4][1]=5;
    a[5][1][1]=19, a[5][2][1]=7,  a[5][3][1]=10, a[5][4][1]=4, a[5][5][1]=16; 
	int dp[50][50];
	int i,j,num[50];
	int g,h,e;
	//把第5行数据放入dp[5][]中 
	for(j=1;j<=5;j++) {
		dp[5][j] = a[5][j][1]; 
	}
	//使用动态规划寻找出最大路径和 
	for(i=4;i>=1;i--) {
		for(j=1;j<=i+1;j++){
			dp[i][j] = MAX(dp[i+1][j],dp[i+1][j+1]) + a[i][j][1];
		}	
	}
	//找出n-2前所有路径值 
	num[4] = dp[4][1];
	for(i=4;i>=1;i--) {
		for(j=1;j<=i;j++) {
			num[i] = MAX(num[i],dp[i][j]);
			//找出n-1行经过路径的值 
			if(dp[i][j] == 28) {
//				printf("i=%d\n",i);
//				printf("j=%d\n",j);
				g = i;
				h = j;
//				printf("%d\n",a[4][2][1]); 
//				printf("%d\n",a[5][3][1]); 
			}
		}
	}
	//找出n行经过路径的值
	for(j=1;j<=5;j++) {
			if(a[g][h][1] + a[5][j][1] == 28) {
				e = j;
			}
	}
	//输出最大路径和 
	printf("max=%d\n",dp[1][1]);
	//遍历输出各行路径值 
	printf("数值和最大的路径是:"); 
	for(i=1;i<=5;i++) {
		if(i <= 3) {
			printf("%d->",num[i]-num[i+1]);
		} else if(i==4) {
			num[4] = a[g][h][1];
			printf("%d->",num[i]);
		} else if(i==5) {
			num[5] = a[5][e][1];
			printf("%d\n",num[i]);
			}
	}
    return 0;
}
/********** End **********/

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
16进制10进制.txt 32.txt asm.txt Crctable.txt C标志符命名源程序.txt erre.txt erre2.txt ff.txt for循环的.txt list.log N皇后问题回溯算法.txt ping.txt re.txt source.txt winsock2.txt ww.txt 万年历.txt 万年历的算法 .txt 乘方函数桃子猴.txt 乘法矩阵.txt 二分查找1.txt 二分查找2.txt 二叉排序树.txt 二叉树.txt 二叉树实例.txt 二进制数.txt 二进制数2.txt 余弦曲线.txt 余弦直线.txt 傻瓜递归.txt 冒泡排序.txt 冒泡法改进.txt 动态计算网络最长最短路线.txt 十五人排序.txt 单循环链表.txt 单词倒转.txt 单链表.txt 单链表1.txt 单链表2.txt 单链表倒序.txt 单链表的处理全集.txt 双链表正排序.txt 反出字符.txt 叠代整除.txt 各种排序法.txt 哈夫曼算法.txt 哈慢树.txt 四分砝码.txt 四塔1.txt 四塔2.txt 回文.txt 图.txt 圆周率.txt 多位阶乘.txt 多位阶乘2.txt 大加数.txt 大小倍约.txt 大整数.txt 字符串查找.txt 字符编辑.txt 字符编辑技术(插入和删除) .txt 完数.txt 定长串.txt 实例1.txt 实例2.txt 实例3.txt 小写数字转换成大写数字1.txt 小写数字转换成大写数字2.txt 小写数字转换成大写数字3.txt 小字库DIY-.txt 小字库DIY.txt 小孩分糖果.txt 小明买书.txt 小白鼠钻迷宫.txt 带头结点双链循环线性表.txt 平方根.txt 建树和遍历.txt 建立链表1.txt 扫描码.txt 挽救软盘.txt 换位递归.txt 排序法.txt 推箱子.txt 数字移动.txt 数据结构.txt 数据结构2.txt 数据结构3.txt 数组完全单元.txt 数组操作.txt 数组递归退出.txt 数组递归退出2.txt 文件加密.txt 文件复制.txt 文件连接.txt 无向图.txt 时间陷阱.txt 杨辉三角形.txt 栈单元加.txt 栈操作.txt 桃子猴.txt 桶排序.txt 检出错误.txt 检测鼠标.txt 汉字字模.txt 汉诺塔.txt 汉诺塔2.txt 灯塔问题.txt 猴子和桃.txt 百鸡百钱.txt 矩阵乘法动态规划.txt 矩阵转换.txt 硬币分法.txt 神经元模型.txt 穷举搜索法.txt 符号图形.txt 简单数据库.txt 简单计算器.txt 简单逆阵.txt 线性顺序存储结构.txt 线索化二叉树.txt 绘制圆.txt 编随机数.txt 网络最短路径Dijkstra算法.txt 自我复制.txt 节点.txt 苹果分法.txt 螺旋数组1.txt 螺旋数组2.txt 试题.txt 诺汉塔画图版.txt 读写文本文件.txt 货郎担分枝限界图形演示.txt 货郎担限界算法.txt 质因子.txt 输出自已.txt 迷宫.txt 迷宫问题.txt 逆波兰计算器.txt 逆矩阵.txt 逆阵.txt 递堆法.txt 递归桃猴.txt 递归车厢.txt 递推.txt 逻辑移动.txt 链串.txt 链栈.txt 链表十五人排序.txt 链表(递归).txt 链队列.txt 队列.txt 阶乘递归.txt 阿姆斯特朗数.txt 非递归.txt 顺序栈.txt 顺序表.txt 顺序队列.txt 骑士遍历1.txt 骑士遍历2.txt 骑士遍历回逆.txt 黑白.txt
1. C语言和汇编语言在开发单片机时各有哪些优缺点? 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。 C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。 对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什幺动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在单片机开发中,我们还是建议采用汇编语言比较好。 如果对单片机C语言有兴趣,HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK的单片机就有提供C编译器,可以到HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK的网站(www.holtek.com.cn )免费下载使用。 2. C或汇编语言可以用于单片机,C++能吗? 答:在单片机开发中,主要是汇编和C,没有用C++的。 3. 搞单片机开发,一定要会C吗? 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。 对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什么动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在资源较少单片机开发中,我们还是建议采用汇编语言比较好。 而C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此,使用C语言进行程序设计已成为软件开发的一个主流。用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统。 综上所述,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以作为一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基本的C语言编程。 4. 当开发一个较复杂而又开发时间短的项目时,用C还是用汇编开发好? 答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其C语言编译系统是有所差别的,特别是在一些特殊功能模块的操作上。如果对这些特性不了解,那调试起来就有的烦了,到头来可能还不如用汇编来的快。 5. 在教学中要用到8088和196芯片单片机教材,请问那里可以找到于这方面的书或资料? 答:有这方面的教材,大学里常用的一本是《IBM-PC汇编语言程序设计》清华大学出版社出版的,在网上以及书店都是可以找到的,另外网上还可以搜索到很多其他的教材如:《微机原理及汇编语言教程》(杨延双 张晓冬 等编著 )和《16/32 位微机原理、汇编语言及接口技术》(作者: 钟晓捷 陈涛 ,机械工业出版社 出版)等,可以在较大型的科技书店里查找或者直接从网上订购。 6. 初学者到底是应该先学C还是汇编? 答:对于单片机的初学者来说,应该从汇编学起。因为汇编语言是最接近机器码的一种语言,可以加深初学者对单片机各个功能模块的了解,从而打好扎实的基础。 7. 我是一名武汉大学电子科技大3的学生,学了电子线路、数字逻辑、汇编和接口、C语言,但是总是感觉很迷茫,觉好象什么都不会。怎么办? 答:大学过程是一个理论过程,实践的机会比较少,往往会造成理论与实践相脱节,这是国内大学教育系统的通病,不过对于学生来说切不可好高骛远。一般从大三会开始接触到一些专业课程,电子相专业会开设相的单片机应用课程并且会有简单的实验项目,那么要充分把握实验课的机会,多多地实际上机操作练习。平时可以多看看相的电子技术杂志网站,看看别人的开发经验,硬件设计方案以及他人的软件设计经验。有可能的话,还可以参加一些电子设计大赛,借此机会2--3个人合作做一个完整系统,会更有帮助。到了大四毕业设计阶段,也可以选择相的课题作些实际案例增长经验。做什么事情都有个经验的积累过程,循序渐进。 8. 请问作为学生,如何学好单片机? 答:学习好单片机,最主要的是实践,在实践中增长经验。在校学生的话,实践机会的确会比较少,但是有机会的话,可以毕业实习选择相的课题,这样就可以接触到实际的项目。而且如果单片机微机原理是一门主课的话,相信学校会安排比较多的实践上机机会。有能力的话,可以找一些相兼职工作做做,会更有帮助。而且单片机开发应用需要软硬件结合,所以不能只满足于编程技巧如何完美,平时也要注意硬件知识的积累,多上上电子论坛网站,买一些相杂志。可能的话,可以到ic37去买一些小零件,自己搭一个小系统让它工作起来。 HOTLEK的单片机是RISC结构的8位单片机,它可以广泛应用在家用电器、安全系统、掌上游戏等方面。大概来说可以分成I/O型单片机、LCD型单片机、A/D型单片机、A/D with LCD型单片机等等。这些单片机的中文资料我们都公开在HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK网站www.holtek.com.cn 。 HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK各类单片机的使用手册下载地址: http://www.holtek.com.cn/referanc/htk_book.htm HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK单片机软件/硬件应用范例下载地址: http://www.holtek.com.cn/tech/appnote/appnote.htm HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK单片机支持工具下载地址: http://www.holtek.com.cn/tech/tool/tool.htm 9. 如何才能才为单片机的高手啊? 答:要成为单片机高手,应该多实践,时常注单片机的发展趋势;经常上一些相网站,从那里可以找到许多有用的资料。 10. 女性是否适合单片机软件编程这个行业? 答:要根据自己的兴趣,配合自己对软件编程的耐性,男女皆适合这个行业。 11. Holtek的数据手册在哪里下载? 答:如果对Holtek的IC感兴趣的话,相应的数据手册可以到网站上http://www.holtek.com.cn/products/index.htm去选IC资料下载。 12. 8位机还能延续多久! 答:以现在MCU产品主力还是在8位领域,主要应用于汽车应用、消费性电子、电脑及PC周边、电信与通讯、办公室自动化、工业控制等六大市场,其中车用市场多在欧、美地区,而亚太地区则以消费性电子为主, 并以量大低单价为产品主流,目前16位MCU与8位产品,还有相当幅度的价差,新的应用领域也仍在开发,业界预计,至少在2005年前8位的MCU仍是MCU产品的主流。 13. 学习ARM及嵌入式系统是否比学习其它一般单片机更有使用前景?对于一个初学者应当具备哪些相知识? 答:一般在8位单片机与ARM方面的嵌入式系统是有层次上的差别,ARM适用于系统复杂度较大的高级产品,如PDA、手机等应用。而8位单片机因架构简单,硬件资源相对较少,适用于一般的工业控制、消费性家电等等。对于一个单片机方面的软件编程初学者,应以HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK系列或8051等8位单片机来做入门练习。而初学者应当具备软件编程相知识,单片机一般软件编程是以汇编语言为主,各家有各家的语法,但大都以RISC的MCU架构为主,其中 RISC (Reduced Instruction Set Computer) 代表MCU的所有指令。都是利用一些简单的指令组成的,简单的指令代表 MCU 的线路可以尽量做到最佳化,而提高执行速率。另外初学者要具备单片机I/O接口的应用知识,这在于周边应用电路及各种元器件的使用,须配合自己所学的电子学及电路学等。 14. 符合44PIN的80系列8位单片机的MCU有哪些? 答:符合44PIN的80系列8位单片机有Z8674312FSC、Z86E2112FSC、Z86E2116FSC。 15. 请介绍一下MCU的测试方法。 答: MCU从生产出来到封装出货的每个不同的阶段会有不同的测试方法,其中主要会有两种:中测和成测。 所谓中测即是WAFER的测试,它会包含产品的功能验证及AC、DC的测试。项目相当繁多,以HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK产品为例最主要的几项如下:  接续性测试:检测每一根I/OPIN内接的保护用二极管是否功能无误。  功能测试:以产品设计者所提供测试资料(TEST PATTERN)灌入IC,检查其结果是否与当时SIMULATION时状态一样。  STANDBY电流测试:测量IC处于HALT模式时即每一个接点(PAD)在1态0态或Z态保持不变时的漏电流是否符合最低之规格。  耗电测试:整颗IC的静态耗电与动态耗电。  输入电压测试:测量每个输入接脚的输入电压反应特性。  输出电压测试:测量每个输出接脚的输出电压位准。  相频率特性(AC)测试,也是通过外灌一定频率,从I/O口来看输出是否与之匹配。  为了保证IC生产的长期且稳定品质,还会做产品的可靠性测试,这些测试包括ESD测试,LATCH UP测试,温度循环测试,高温贮存测试,湿度贮存测试等。 成测则是产品封装好后的测试,即PACKAGE测试。即是所有通过中测的产品封装后的测试,方法主要是机台自动测试,但测试项目仍与WAFER TEST相同。PACKAGE TEST的目的是在确定IC在封装过程中是否有任何损坏。 16. 能否利用单片来检测手机电池的充放电时间及充放电时的电压电流变化,并利用一个I/O端口使检测结果在电脑上显示出来? 答:目前市场上的各类智能充电器,大部分都采用MCU进行充电电流和电压的控制。至于要在电脑上显示,好象并不实用,可能只有在一些专门的电池检测仪器中才会用到;对于一般的手机用户来说,谁会在充电时还需要用一台电脑来做显示呢?要实现单片机与电脑的连接,最简单的方式就是采用串口通讯,但需要加一颗RS-232芯片。 17. 在ARM编程中又应当如何? 答:就以嵌入式系统观念为例,一般嵌入式处理器可以分为三类:嵌入式微处理器、嵌入式微控制器、嵌入式DSP(Digital Signal Processor)。 嵌入式微处理器就是和通用计算机的微处理器对应的CPU。在应用中,一般是将微处理器装配在专门设计的电路板上,在母板上只保留和嵌入式相的功能即可,这样可以满足嵌入式系统体积小和功耗低的要求。目前的嵌入式处理器主要包括:PowerPC、Motorola 68000、ARM系列等等。 嵌入式微控制器又称为单片机,它将CPU、存储器(少量的RAM、ROM或两者都有)和其它接口I/O封装在同一片集成电路里。常见的有HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK MCU系列、Microchip MCU系列及8051等。 嵌入式DSP专门用来处理对离散时间信号进行极快的处理计算,提高编译效率和执行速度。在数字滤波、FFT(Fast Fourier Transform)、频谱分析、图像处理的分析等领域,DSP正在大量进入嵌入式市场。 18. MCU在射频控制时,MCU的时钟(晶振)、数据线会辐射基频或基频的倍频,被低噪放LNA放大后进入混频,出现带内的Spur,无法滤除。除了用layout、选择低辐射MCU的方法可以减少一些以外,还有什么别的方法? 答:在设计高频电路用电路板有许多注意事项,尤其是GHz等级的高频电路,更需要注意各电子组件pad与印刷pattern的长度对电路特性所造成的影响。最近几年高频电路与数位电路共享相同电路板,构成所谓的混载电路系统似乎有增加的趋势,类似如此的设计经常会造成数位电路动作时,高频电路却发生动作不稳定等现象,其中原因之一是数位电路产生的噪讯,影响高频电路正常动作所致。为了避免上述问题除了设法分割两电路block之外,设计电路板之前充分检讨设计构想,才是根本应有的手法,基本上设计高频电路用电路板必需掌握下列三大原则:  高质感。  不可取巧。  不可仓促抢时间。 以下是设计高频电路板的一些建议: (1)印刷pattern的长度会影响电路特性。尤其是传输速度为GHz高速数位电路的传输线路,通常会使用strip line,同时藉由调整配线长度补正传输延迟时间,其实这也意味着电子组件的设置位置对电路特性具有绝对性的影响。 (2)Ground作大better。铜箔面整体设置ground层,而连接via的better ground则是高频电路板与高速数位电路板共同的特征,此外高频电路板最忌讳使用幅宽细窄的印刷pattern描绘ground。 (2)电子组件的ground端子,以最短的长度与电路板的ground连接。具体方法是在电子组件的ground端子pad附近设置via,使电子组件能以最短的长度与电路板的ground连接。 (3)信号线作短配线设计。不可任意加大配线长度,尽量缩短配线长度。 (4)减少电路之间的结合。尤其是filter与amplifier输出入之间作电路分割非常重要,它相当于audio电路的cross talk对策。 (5)MCU回路Layout考量:震荡电路仅可能接近IC震荡脚位;震荡电路与VDD & VSS保持足够的距离;震荡频率大于1MHz时不需加 osc1 & osc2 电容;电源与地间要最短位置并尽量拉等宽与等距的线,于节点位置加上104/103/102等陶瓷电容。 19. Intel系列的96单片机80c196KB开发系统时,都有那些注意事项? 答:一个即时系统的软体由即时操作系统加上应用程序构成。应用程序与作业系统的接口通过系统调用来实现。用80C196KB-p.htm" target="_blank" title="80C196KB货源和PDF资料">80C196KB作业系统的MCU,只能用内部RAM作为TCB和所有系统记忆体(含各种控制表)以及各个任务的工作和资料单元。因此一定要注意以下几点: (1)对各个任务分配各自的堆迭区,该堆迭区既作为任务的工作单元,也作为任务控制块的保护单元。 (2)系统的任务控制块只存放各任务的堆迭指标,而任务的状态均存放于任务椎栈中。在一个任务退出运行时,通过中断把它的状态进栈,然后把它的堆迭指标保存于系统的TCB中;再根据优先取出优先顺序最高的已就绪任务的堆迭指标SP映象值送入SP中;最后执行中断返回指令转去执行新任务。 (3)各任务的资料和工作单元尽量用堆迭实现,这样可以允许各任务使用同一个子程序。使用堆迭实现参数传递并作为工作单元,而不使用绝对地址的RAM,可实现可重入子程序。该子程序既可为各个任务所调用,也可实现递回调用。 20. 在demo板上采样电压时,不稳定,采样结果有波动,如何消除? 答:一般来说,仿真器都是工作在一个稳压的环境(通常为5V)。如果用仿真器的A/D时,要注意其A/D参考电压是由仿真器内部给出,还是需要外部提供。A/D转换需要一个连续的时钟周期,所以在仿真时不能用单步调试的方法,否则会造成A/D采样值不准。至于A/D采样不稳定,可以在A/D输入口加一电容,起到滤波作用;在软件处理时采用中值滤波的方法。 21. 在车载DVD系统中,如何设计电子防震系统? 答:在车载DVD系统,最好选择高档DVD机,因为高档DVD机都采用电子防震系统(ADVANCEDESP),当记忆缓冲区内的读数降低,先进的电子防震设计会以双速读数系统,做出比正常速度快两倍的读数速率,以减低噪声,即使连续震荡仍可避免跳线情况出现,现在就说说什幺叫电子防震。简单地说:电子防震就是一个信号的储存--释放过程,首先CD要先把信号进行提前读取,也就是我们见到机子的加速,再把信号储存在RAM中,而我们在开防震的时候所听到的就是经过RAM的声音,这样就是它的过程。当没有防震时是由于信号是1比1读取的,所以当受到冲击后,就会出现跳音。而当开了防震时,机子受到冲击后,由RAM释放出来的声音使音乐不停地播放,而与此同时,光头迅速进行复位检索,当检索到信号后立即补充,所以不会出现跳音。大概的情况就是这样。但是这样还没有满足用家的要求,由于这种的方法带来的时间短,通常只有3秒,所以跳音的机会还是蛮高,如果增大RAM又带来造价的增高因为RAM这东西价格较贵,尤其是质量好的。 22. 在电子防震技术中,有那些IC或器件可供选择? 答:在电子防震技术中,最重要的技术之一要数是RAM技术,而一直以来都是因为它的成本问题,所以防震时间都一直不能增加,也就是说RAM本身就有限制,RAM的容量越大,造价就越高。而许多厂家就如何在RAM的限制里得到最大限度的记忆时间展开了开发研究。 23. 如何进行编程可以减少程序的bug? 答:在此提供一些建议,因系统中实际运行的参数都是有范围的。系统运行中要考虑的超范围管理参数有:  物理参数。这些参数主要是系统的输入参数,它包括激励参数、采集处理中的运行参数和处理结束的结果参数。合理设定这些边界,将超出边界的参数都视为非正常激励或非正常回应进行出错处理。  资源参数。这些参数主要是系统中的电路、器件、功能单元的资源,如记忆体容量、存储单元长度、堆迭深度。在程序设计中,对资源参数不允许超范围使用。  应用参数。这些应用参数常表现为一些单片机、功能单元的应用条件。如E2PROM的擦写次数与资料存储时间等应用参数界限。  过程参数。指系统运行中的有序变化的参数。 在上述参数群对一程序编写者而言,须养成良好习惯,在程序的开头,有顺序的用自己喜欢文字参数对应列表来替代,然后用自己定义的文字参数来编写程序,这样在做程序的修改及维护时只在程序的开头做变动即可,不用修改到程序段,才比较容易且不会出错。 24. 有人认为单片机将被ARM等系列结构的嵌入式系统所取代。单片机的生命期还有多长? 答:因为8位单片机与嵌入式系统的ARM在功能结构和单价的差异,故应用层次上就有很大的不同。 ARM适用于系统复杂度较大的高级产品,如PDA、手机等应用。 而8位单片机因架构简单,硬件资源相对较少,适用于一般的工业控制,消费性家电……等等。评估单片机近期是否会给ARM取代,要观察两个因素:  芯片成本 因ARM的工作频率较高,电路较庞大,所需的芯片制造工艺要求在0。25U以上,成本较高。8位单片机工作频率相对较低,电路较小,所需的芯片制造工艺在0。5U 即可,成本较低。  功能定位 ARM的功能较单片机强,但两者定位不同。就如现阶段不会有人用ARM去作一个简单的工业定时开。当然,如果两者单价相同也无不可,但现实是有很大的单价差距。 至于将来,因芯片制造成本会不断下降,上述的成本差异影响愈来愈少!但我估计在往后5年单片机仍有价格优势,仍能存活!但ARM是否会精简架构,降低成本,抢夺低阶市场?我想可能性不大,ARM应该会向上发展。同样,单片机也只能向上发展,如16位,高功能……等。 原因就是因为芯片制造工艺进步太快。压迫芯片设计往高集成发展。 25. 在单片机C编成时,如何才能使生成的代码具有和汇编一样的效率? 答:如果是使用C语言编程时,不太可能生成的代码具有1:1和汇编一样的效率。 C语言命令要被硬件识别并执行,必须通过编译器编译。编译器分为前端、中端、后端。前端与各种计算机语言写的程序打交道,后端与处理器的基本指令集接轨。所以如果使用C编程时,要达到最高的效率,最好能够很了解所使用的C编译器。先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句,这样就能确保单片机C编程的时候同样的功能不同的C程序,编译效率最高。但是各家的C编译器都会有一定的差异,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言编写的同样功能程度长5-20%,所以不同厂家的C编译器的编译效率也会有所不同。 26. ARM单片机和哪种内核的单片机比较接近? 答:严格的说,ARM不是单片机,是一个嵌入式的实时操作系统。ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相技术及软件。ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的都是一套独一无二的ARM相技术及服务。所以市场上像Intel、IBM、LG半导体、NEC、SONY、菲利浦和国半这样的大公司都有ARM系列,现在不存在什幺ARM单片机和哪种内核的单片机比较接近的问题。而且由于厂家购买内核后会根据自己芯片应用方向的不同,自行添加不同的外挂功能模块,所以,同样内核的芯片其提供的功能是不同的。 27. 从51转到ARM会有困难吗? 答:从51转到ARM,其实编程之类的原理都是一样的,但是要注意的是ARM是一个RISC的架构,在ARM的应用开放源代码的程序很多,要想提高自己,就要多看别人的程序,linux,uc/os-II等等这些都是很好的源码。 28. 我学过MCS51单片机教材,很有兴趣,但缺乏实践经验,手头没有任何道具可供演练,资金又有限,请问该怎么办? 答:在没有任何条件进行实践时,如果真的有兴趣,可以下载一些具有软件仿真功能仿真软件进行一些编程,像一些做得比较好的51仿真软件应该具有这种功能。HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK的仿真软件HT-IDE3000也具有相应的功能,同时它还具有LCD软件仿真,周边电路的软件仿真。有兴趣的话,也可以去免费下载使用:http://www.holtek.com.cn/tech/tool/ide.htm。同时可以到一些ic37去购买一些简单器件自己练习搭一下电路以加强硬件方面的知识。 29. 如果已经有了针对某MCU的C实现的某个算法,保持框架不变,对核心的部分用汇编优化,有没有一些比较通用的原则? 答:每个人的编程都有自己的风格与习惯,如果要利用别人的程序,在其中修修改改,如果他的程序并没有很好的模块化的话,建议最好不要这幺做,否则本来预期达到事倍功半,说不定反而事半功倍了。要参考他人的程序当然可以,但是首要是要看懂并理解他人程序的算法精髓,而不是在他的基础上打补丁。而算法方面的优化,可以购买一些数据结构的书籍,上面有比较详细的说明。 30. 如果准备估计一个算法的MIPS,有什么好的途径? 答:算法的运行时间是指一个算法在计算机上运算所花费的时间。它大致等于计算机执行简单操作(如赋值操作,比较操作等)所需要的时间与算法中进行简单操作次数的乘积。通常把算法中包含简单操作次数的多少叫做算法的时间复杂性。它是一个算法运行时间的相对量度,一般用数量级的形式给出。度量一个程序的执行时间通常有两种方法:  一种是事后统计的方法。因为很多计算机内部都有计时功能,不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺陷:一是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用另一种事前分析估算的方法。  一种是事前分析估算的方法。一个程序在计算机上运行时所消耗的时间取决于下列因素: (1)依据的算法选用何种策略; (2)问题的规模。例如求100以内还是1000以内的素数; (3)书写程序的语言。对于同一个算法,实现语言的级别越高,执行效率就越低; (4)编译程序所产生的机器代码的质量。这个跟编译器有; (5)机器执行指令的速度。 显然,同一个算法用不同的语言实现,或者用不同的编译程序进行编译,或者在不同的计算机上运行时,效率均不相同。这表明使用绝对的时间单位衡量算法的效率是不合适的。撇开这些与计算机硬件、软件有的因素,可以认为一个特定算法"运行工作量"的大小,只依赖于问题的规模(通常用整数量n表示),或者说,它是问题规模的函数。 一个算法是由控制结构(顺序、分支和循环三种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本运算的原操作,以该基本操作重复执行的次数作为算法的时间度量。 算法的MIPS有专门的一门学问,可以去好好参考相数据结构书籍。 31. 遥控的编解码思路和设计流程是怎样的? 答:一般来说完整的遥控码分为头码、地址码、数据码和校验码四个组成部分。头码根据不同的厂家各不相同,地址码和数据码都由逻辑“1”和逻辑“0”组成。编码的设计目的,就是按照编码规则发送不同的码值。我们最常见的码型有SONY、松下、NEC等厂家型号。遥控编码芯片最常用的是在空调、DVD、车库门等遥控器上。 设计编码程序可以分为三个部分。 第一部分是了解码型的特性。遥控码的头码和地址码(也称为客户码)是固定不变的,数据码和校验码根据不同的键值而改变。 第二部分是计算发码时间。遥控码大部分都是由逻辑“1”和逻辑“0”组成,也就是由一串固定占空比、固定周期的方波所组成。通常这些方波的周期是毫秒甚至微秒等级,需要在时间上计算的比较精确。所以选择发码单片机型号的时候,就要考虑到单片机的运行速度是不是够快,以及程序运行时间够不够。 第三部分就是程序的编写。选定单片机型号之后,开始设计程序流程。一般来说我们使用I/O口就可以做发码的输出端口。发码程序一般由几个子程序组成,头码子程序、逻辑1子程序,逻辑0子程序以及校验码的算法子程序。一旦我们得到要发送码的命令后,首先调用头码子程序,然后根据客户码和键值调用逻辑1子程序或者逻辑0子程序,最后调用校验码算法子程序输出校验码。 HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK公司的HT48CA0/HT48RA0、HT48CA3/HT48RA3和HT48CA6是专为遥控器设计的单片机,它们具有专门红外输出口,可以实现绝大部分发码的要求。 设计解码程序也可以分为三部分。 第一部分了解编码波形特性。从分析编码的高、低脉冲宽度入手,了解逻辑“1”和逻辑“0”的波形占空比、周期。了解头码的特性。 第二部分确定接收方式。一般我们可以用I/O口查询方法或者INT口中断响应方法来接收编码。这两者的区别是I/O口查询方式比较耗费单片机的运行时间资源,需要不断的去侦测I/O的电平变化,以免漏掉有效的码值;而INT口中断接收方式则比较节省资源,当外部有电平变化时,单片机才需要去处理,不需要时刻进行侦测。但是INT口中断接收方式不能辨别相同周期不同占空比的波形特性,当编码所携带的逻辑“1”和逻辑“0”具有这种特性时,就无法通过INT口中断接收方式来辨别了,因为INT中断只是在上升沿或者下降沿的时候才触发。 第三部分将接收的码值存储并分析执行。根据判断高低电平的宽度(定时器或者延时),可以得到码值,也就是我们所说的解码。一般我们连续收到3个相同的完整码值,就确认此码的确被发出,并接收成功。当解码结束,根据码值我们可以判断出是哪个按键被按下,由此去执行相对的按键功能。 HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK公司的HT48以及HT49(带LCD)系列单片机,都可以符合大多数解码的任务。 32. 在学习单片机的过程中,如何理解预分频,12时钟模式(6时钟模型)等概念? 答:预分频器的英文是prescaler。它就是将输入的频率信号分频,然后再输出。HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK公司有一款最基本的8位I/O型单片机HT48R05A-1,我们就以这款单片机为例说明。HT48R05A-1有一个8位向上计数的定时器Counter。系统时钟Fsys(4MHz)进入八阶预分频器(8-stage Prescaler)进行分频,再进入定时计数器Counter计数。根据软件设置,预分频器可以将Fsys进行2的n次方分频(n=1~8)。举例来说,如果软件设置为预分频器2分频,那幺预分频器输出的频率就是Fsys/2=2MHz,这个2MHz信号再进入定时计数器Counter。 如果需要HT48R05A-1或者其它各类HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK单片机的详细资料,可以在如下地址下载:http://www.holtek.com.cn/referanc/htk_book.htm 。 12时钟模式(6时钟模型)应该就是在MCS51系列中,12个系统时钟为一个机器周期,2个系统时钟为一个状态,即一个机器周期有6个状态。 33. A/D、D/A的采样速率与其它单片机相比有什么优势? 答:HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK A/D Tyep MCU内嵌逐位逼近的A/D转换电路,精度有8bit/9bit/10bit,A/D转换时间最快为76us。 至于D/A,一般是指PWM输出,HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK A/D Type MCU都带有8bit的PWM输出,但HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK PWM的特点是其输出频率由系统频率决定(既系统频率选定后,PWM频率也就定了),其占空比通过对[PWM]寄存器赋值进行控制,不需要占用定时/计数器资源。 34. 采用AT89S51时,出现了按了复位按钮,RAM中的数据被修改了。这是怎么回事?注:数据放在特殊寄存器之外。 答:如果是RESET脚的复位按钮:一般MCU的RESET复位,其特殊寄存器会被重新初始化,而通用寄存器的值保持不变。 如果复位按钮是电源复位:那就是MCU的上电复位,其特殊寄存器会被初始化,而通用寄存器的值是随机数。 35. 将P2.7用来驱动一个NPN三极管,中间串接了一个1K的电阻。问题是:当我尝试向P2.7写’1’时,发现管脚只能输出大约0.5V的一个电平。这个电路的使用得妥当么?如何正确的使用IO功能? 答:是在仿真时遇到的问题,还是烧录芯片后遇到的问题? 可以先将P2.7的外部电路断开,测量输出电压是否正常。如果断开后输出电压正常,那就说明P2.7的驱动能力不够,不能驱动NPN三极管,应该改用PNP三极管(一般在MCU应用中,都采用PNP方式驱动)。如果断开后输出电压还不正常,那有可能是仿真器(或芯片)已经损坏。 36. 在做充电管理的时候,提高pwm的频率往往以牺牲精度为代价,如果用的AT90S4433(avr)、78P458(elan)频率分别做到16kHz(8bit)和32kHz(8bit),而希望做到的是100kHz(8bit以上),诸如atiny15那样。怎么办? 答:你所说的PWM是通过定时/计数器来控制其频率和占空比的,所以要提高频率,必然会降低精度。如果要提高PWM的频率,只能通过提高系统振荡频率来解决。 37. 汽车电子用的单片机是8位多,还是32位?如何看待单片机在汽车ic37中的前景? 答:现今汽车制造也是一个进步很快的工业,特别是电子应用于汽车上,令多种新功能得以实现。 总的来说,汽车电子应用分三部份。  汽车发动机控制:限速控制,涡轮增压,燃料喷注控制等。  汽车舒适装置:遥控防盗系统,自动空调系统,影音播放系统,卫星导航系统等。  汽车操控和制动:刹车防抱死系统(ABS),循迹系统(TCS),防滑系统(ASR),电子稳定系统(ESP)等。 汽车上的各系统繁多,且日新月异,故利用何种单片机是依各系统规格,要求不一,但有一样可肯定是该单片机要符工业规格,才能忍受汽车应用的恶劣环境,高温,电源干扰,可靠度要求。不同档次的汽车其功能配置相对亦有差别,故8位单片机在较低阶的系统如机械控制,遥控防盗等应该还有空间,但高阶的系统如影音、导航及将来的无人驾驶,就非一般单片机能实现。 因汽车工业现阶段由欧美日数个大集团所把持,相的汽车电子配件各集团会挑选单片机大厂合作, 故汽车内置的电子系统亦由单片机大厂把持,市场只剩外置系统如遥控防盗,影音导航供小厂开发。 38. 在使用三星的s3c72n4时,觉得它的time/counter不够用。现在要同时用到3个counter,该怎么办? 答:您是需要三个外部counter还是需要三个定时器?如果是三个定时器标志的话,可以取这三个定时最基本的时基作为timer的基础计数,然后以这个时基来计算这三个需要的计数标志的flag,在程序中只需要查询flag是否到,再采取动作。 如果要3个外部脉冲计数的话,这个有一定的难度,如果外部脉冲不是很频繁,可以考虑通过外部中断进行,但是这个方法必须是外部脉冲的频率与MCU执行速度有一定的数量级差,否则mcu可能无法处理其它程序,一直在处理外部中断。 39. 在芯片集成技术日益进步的今天,单片机的集成技术发展也很迅速,在传统的40引脚的基础上,飞利浦公司推出20引脚的单片机系列,使很多的引脚可以复用,这种复用技术的使用在实际应用中会不会影响其功能的执行? 答:现在有很多品牌的单片机都有引脚复用功能,不止飞利浦一家,应该说这个方式前几年就已经有了。在实际应用中不会影响其功能的执行,但是要注意的是,有的MCU如果采用复用引脚的话,该引脚会有一些应用上的限制,这在相应的datasheet里面都会有描述,所以在系统规划的时候都要予以注意。 40. Delta-Sigma软件测量方式,是什么概念? 答:Delta-Sigma原理一般应用在ADC应用中。具体来说,Delta-Sigma ADC的工作原理是由差动器、积分器和比较器构成调制器,它们一起构成一个反馈环路。调制器以大大高于模拟输入信号带宽的速率运行,以便提供过采样。模拟输入与反馈信号(误差信号)进行差动 (delta)比较。该比较产生的差动输出馈送到积分器(sigma)中。然后将积分器的输出馈送到比较器中。比较器的输出同时将反馈信号(误差信号)传送到差动器,而自身被馈送到数字滤波器中。这种反馈环路的目的是使反馈信号(误差信号)趋于零。比较器输出的结果就是1/0 流。该流如果1密度较高,则意味着模拟输入电压较高;反之,0密度较高,则意味着模拟输入电压较低。接着将1/0流馈送到数字滤波器中,该滤波器通过过采样与抽样,将1/0流从高速率、低精度位流转换成低速率、高精度数字输出。 简而言之,Delta就是差动,Sigma就是积分的意思。Delta-Sigma软件测试,我的理解应该是通过软件模拟差动积分的过程。具体来说,就是侦测外部输入的电压(或者电流)信号变化,然后通过软件积分运算,得出外部信号随时间变化的基本状况。 41. 通常采用什么方法来测试单片机系统的可靠性? 答:单片机系统可以分为软件和硬件两个方面,我们要保证单片机系统可靠性就必须从这两方面入手。 首先在设计单片机系统时,就应该充分考虑到外部的各种各样可能干扰,尽量利用单片机提供的一切手段去割断或者解决不良外部干扰造成的影响。我们以HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK最基本的I/O单片机HT48R05A-1为例,它内部提供了看门狗定时器WDT防止单片机内部程序乱跑出错;提供了低电压复位系统LVR,当电压低于某个允许值时,单片机会自动RESET防止芯片被锁死;HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK也提供了最佳的外围电路连接方案,最大可能的避免外部干扰对芯片的影响。 当一个单片机系统设计完成,对于不同的单片机系统产品会有不同的测试项目和方法,但是有一些是必须测试的:  测试单片机软件功能的完善性。 这是针对所有单片机系统功能的测试,测试软件是否写的正确完整。  上电掉电测试。在使用中用户必然会遇到上电和掉电的情况,可以进行多次开电源,测试单片机系统的可靠性。  老化测试。测试长时间工作情况下,单片机系统的可靠性。必要的话可以放置在高温,高压以及强电磁干扰的环境下测试。  ESD和EFT等测试。可以使用各种干扰模拟器来测试单片机系统的可靠性。例如使用静电模拟器测试单片机系统的抗静电ESD能力;使用突波杂讯模拟器进行快速脉冲抗干扰EFT测试等等。 当然如果没有此类条件,可以模拟人为使用中,可能发生的破坏情况。例如用人体或者衣服织物故意摩擦单片机系统的接触端口,由此测试抗静电的能力。用大功率电钻靠近单片机系统工作,由此测试抗电磁干扰能力等。 42. 在开发单片机的系统时,具体有那些是衡量系统的稳定性的标准? 答:从工业的角度来看,衡量系统稳定性的标准有很多,也针对不同的产品标准不同。下面我们大概介绍单片机系统最常用的标准。  电试验(ESD) 参考标准: IEC 61000-4-2 本试验目的为测试试件承受直接来自操作者及相对对象所产生之静电放电效应的程度。  空间辐射耐受试验(RS) 参考标准:IEC 61000-4-3 本试验为验证试件对射频产生器透过空间散射之噪声耐受程度。 测试频率:80 MHz~1000 MHz  快速脉冲抗扰测试(EFT/B) 参考标准:IEC 61000-4-4 本试验目的为验证试件之电源线,信号线(控制线)遭受重复出现之快速瞬时丛讯时之耐受程度。  雷击试验(Surge) 参考标准 : IEC 61000-4-5 本试验为针对试件在操作状态下,承受对于开或雷击瞬时之过电压/电流产生突波之耐受程度。  传导抗扰耐受性(CS) 参考标准:IEC 61000-4-6 本试验为验证试件对射频产生器透过电源线传导之噪声耐受程度。 测试频率范围:150 kHz~80 MHz  Impulse 脉冲经由耦合注入电源线或控制线所作的杂抗扰性试验。 43. 在设计软体时,大多单片机都设有看门狗,需要在软体适当的位置去喂狗,以防止软体复位和软体进入死循环,如何适当的喂狗,即如何精确判定软体的运行时间? 答:大多数单片机都有看门狗定时器功能(WDT,Watch Dog Timer)以避免程序跑错。HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK有一款基本I/O型单片机--HT48R05A-1,我们就以它为例做个说明吧。 首先了解一下WDT的基本结构,它其实是一个定时器,所谓的喂狗是指将此定时器清零。喂狗分为软件和硬件两种方法。软件喂狗就是用指令来清除WDT,即CLR WDT;硬件喂狗就是硬件复位RESET。当定时器溢出时,会造成WDT复位,也就是我们常说的看门狗起作用了。在程序正常执行时,我们并不希望WDT复位,所以要在看门狗溢出之前使用软件指令喂狗,也就是要计算WDT相隔多久时间会溢出一次。HT48R05A-1的WDT溢出时间计算公式是:256*Div*Tclock。其中Div是指wdt预分频数1~128,Tclock是指时钟来源周期。如果使用内部RC振荡作为WDT的时钟来源(RC时钟周期为65us/5V),最大的WDT溢出时间为2.1秒。 当我们得到了WDT溢出时间Twdt后,一般选择在Twdt/2左右的时间进行喂狗,以保证看门狗不会溢出,同时喂狗次数不会过多。 软件运行时间是根据不同的运行路线来决定的,如果可以预见软件运行的路线,那么可以根据T=n*T1来计算软件的运行时间。n是指运行的机器周期数,T1是指机器周期。HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK单片机是RISC结构,大部分指令由一个机器周期组成,只需要知道软件运行了多少条指令,就可以算出运行时间了。HOLTEK-p.htm" target="_blank" title="HOLTEK货源和PDF资料">HOLTEK的编译软件HT-IDE3000中,就有计算运行时间的工具。但是对于CISC结构的单片机,一条指令可以由若干个机器周期组成,那么就需要根据具体执行的指令来计算了。 44. 我们是一家开发数控系统的专业厂,利用各种单片机和CPU开发了很多产品,在软件开发上也采用了很多通用的抗干扰技术,如:软件陷阱、指令允余、看门狗和数字滤波等等,但实际运用中还是很不可靠,如:经常莫名其妙地死机、程序跳段、I/O数据错误等,并且故障的重复性很不确定,也不是周期性地重复。往往用户使用中出现故障,但又无法重现,很让人头痛。反复检查硬件也设查出原因,所以对软件的可靠性很是怀疑。怎么办? 答:防止干扰最有效的方法是去除干扰源、隔断干扰路径,但往往很难做到,所以只能看单片机抗干扰能力够不够强了。单片机干扰最常见的现象就是复位;至于程序跑飞,其实也可以用软件陷阱和看门狗将程序拉回到复位状态;所以单片机软件抗干扰最重要的是处理好复位状态。 一般单片机都会有一些标志寄存器,可以用来判断复位原因;另外也可以自己在RAM中埋一些标志。在每次程序复位时,通过判断这些标志,可以判断出不同的复位原因;还可以根据不同的标志直接跳到相应的程序。这样可以使程序运行有连续性,用户在使用时也不会察觉到程序被重新复位过。 可以在定时中断里面设置一些暂存器累加,然后加到预先设定的值(一个比较长的时间),SET标志位,这些动作都在中断程序里面。而主程序只需要查询标志位就好了,但是注意标志位使用后,记得清除,还有中断里面的时基累加器使用以后也要记得清除。
资源简介 第1章 数据结构. 1 1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 范例1-4 显示杨辉三角 7 ∷相函数:c函数 8 1.1.5 魔方阵 9 范例1-5 魔方阵 9 1.1.6 三维数组的表示 14 范例1-6 三维数组的表示 14 ∷相函数:InitArray函数 1.1.7 多项式的数组表示 17 范例1-7 多项式数组的表示 17 1.1.8 查找矩阵的马鞍点 19 范例1-8 查找矩阵的马鞍点 19 ∷相函数:Get_Saddle函数 1.1.9 对角矩阵建立 21 范例1-9 对角矩阵建立 21 ∷相函数:Store函数 1.1.10 三对角矩阵的建立 22 范例1-10 三对角矩阵的建立 22 ∷相函数:Store函数 1.1.11 三角矩阵建立 24 范例1-11 三角矩阵建立 24 ∷相函数:Store函数 1.1.12 对称矩阵的建立 25 范例1-12 对称矩阵的建立 25 ∷相函数:store函数 1.1.13 字符串长度的计算 28 范例1-13 字符串长度的计算 28 ∷相函数:strlen函数 1.1.14 字符串的复制 29 范例1-14 字符串的复制 29 ∷相函数:strcpy函数 1.1.15 字符串的替换 31 范例1-15 字符串的替换 31 ∷相函数:strrep函数 1.1.16 字符串的删除 33 范例1-16 字符串的删除 33 ∷相函数:strdel函数 1.1.17 字符串的比较 35 范例1-17 字符串的比较 35 ∷相函数:strcmp函数 1.1.18 字符串的抽取 36 范例1-18 字符串的抽取 36 ∷相函数:substr函数 1.1.19 字符串的分割 38 范例1-19 字符串的分割 38 ∷相函数:partition函数 1.1.20 字符串的插入 40 范例1-20 字符串的插入 40 ∷相函数:insert函数 1.1.21 字符串的匹配 42 范例1-21 字符串的匹配 42 ∷相函数:nfind函数 1.1.22 字符串的合并 43 范例1-22 字符串的合并 43 ∷相函数:catstr函数 1.1.23 文本编辑 45 范例1-23 文本编辑 45 ∷相函数:StrAssign函数 1.2 栈和队列 54 1.2.1 用数组仿真堆栈 54 范例1-24 用数组仿真堆栈 54 ∷相函数:push函数 pop函数 1.2.2 用链表仿真堆栈 57 范例1-25 用链表仿真堆栈 57 ∷相函数:push函数 pop函数 1.2.3 顺序栈公用 59 范例1-26 顺序栈公用 59 ∷相函数:push函数 pop函数 1.2.4 进制转换问题 61 范例1-27 进制转换问题 61 ∷相函数:MultiBaseOutput函数 1.2.5 顺序队列操作 64 范例1-28 顺序队列操作 64 ∷相函数:push函数 pop函数 1.2.6 循环队列 66 范例1-29 循环队列 66 ∷相函数:EnQueue函数 DeQueue函数 1.2.7 链队列的入队、出队 69 范例1-30 链队列入队、出队 69 ∷相函数:push函数 pop函数 1.2.8 舞伴问题 71 范例1-31 舞伴问题 71 ∷相函数:EnQueue函数 DeQueue函数 DancePartner函数 1.3 链表 75 1.3.1 头插法建立单链表 75 范例1-32 头插法建立单链表 75 ∷相函数:createlist函数 1.3.2 限制链表长度建立单链表 77 范例1-33 限制链表长度建立长单链表 77 ∷相函数:createlist函数 1.3.3 尾插法建立单链表 79 范例1-34 尾插法建立单链表 79 ∷相函数:createlist函数 1.3.4 按序号查找单链表 80 范例1-35 按序号查找单链表 80 ∷相函数:getnode函数 1.3.5 按值查找单链表 82 范例1-36 按值查找单链表 82 ∷相函数:locatenode函数 1.3.6 链表的插入 84 范例1-37 链表的插入 84 ∷相函数:insertnode函数 1.3.7 链表的删除 86 范例1-38 链表的删除 86 ∷相函数:deletelist函数 1.3.8 归并两个单链表 88 范例1-39 归并两个单链表 88 ∷相函数:concatenate函数 1.3.9 动态堆栈 90 范例1-40 动态堆栈 90 ∷相函数:push函数 Pop函数 1.3.10 动态队列 93 范例1-41 动态队列 93 ∷相函数:Enqueue函数 1.3.11 初始化单循环链表 95 范例1-42 初始化单循环链表 95 ∷相函数:ListLength_CL函数 1.3.12 查询元素的前驱和后继 98 范例1-43 查询元素的前驱和后继 98 ∷相函数:PriorElem_CL函数 NextElem_CL函数 1.3.13 单循环链表中元素的删除 101 范例1-44 单循环链表中元素的删除 101 ∷相函数:ListDelete_CL函数 1.3.14 单循环链表的清除和销毁 107 范例1-45 单循环链表的清除和销毁 107 ∷相函数:DestroyList函数 1.3.15 仅设表尾指针循环链表的合并 110 范例1-46 仅设表尾指针循环链表的合并 110 ∷相函数:MergeList_CL函数 1.3.16 正序输出双向链表 113 范例1-47 正序输出双向链表 113 ∷相函数:ListInsert函数 ListTraverse函数 1.3.17 逆向输出双向链表 116 范例1-48 三角矩阵建立 116 ∷相函数:ListTraverseBack函数 1.3.18 删除双向链表中的节点 121 范例1-49 删除双向链表中的节点 121 ∷相函数:ListDelete函数 1.3.19 双向链表的元素个数 124 范例1-50 双向链表的元素个数 124 ∷相函数:ListLength函数 1.3.20 判断双向链表是否为空 126 范例1-51 判断双向链表是否为空 126 ∷相函数:ListEmpty函数 1.3.21 双向链表元素值的查询 129 范例1-52 双向链表元素值的查询 129 ∷相函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立 136 ∷相函数:Create函数 1.3.23 稀疏矩阵的删除 138 范例1-54 稀疏矩阵的删除 138 ∷相函数:erase函数 1.4 树和二叉树 141 1.4.1 获得二叉树的深度和根(顺序结构) 141 范例1-55 获得二叉树的深度和根 141 ∷相函数:BiTreeDepth函数 Root函数 1.4.2 获得二叉树的深度和根(链表结构) 144 范例1-56 获得二叉树的深度和根 144 ∷相函数:BiTreeDepth函数 Root函数 1.4.3 树的插入(顺序结构) 147 范例1-57 树的插入 147 ∷相函数:InsertChild函数 1.4.4 节点的修改(顺序结构) 150 范例1-58 节点的修改 150 ∷相函数:Assign函数 1.4.5 节点的修改(链式结构) 154 范例1-59 节点的修改 154 ∷相函数:Assign函数 1.4.6 双亲、孩子和兄弟节点的查询(顺序结构) 158 范例1-60 双亲、孩子和兄弟节点的查询 158 ∷相函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.8 中序遍历二叉树(顺序结构) 169 范例1-62 中序遍历二叉树 169 ∷相函数:InOrderTraverse函数 1.4.9 中序遍历二叉树(链式结构) 171 范例1-63 中序遍历二叉树 171 ∷相函数:InOrderTraverse函数 1.4.10 中序非递归遍历二叉树(链式结构)(1) 174 范例1-64 中序非递归遍历二叉树 174 ∷相函数:InOrderTraverse函数 1.4.11 中序非递归遍历二叉树(链式结构)(2) 177 范例1-65 中序非递归遍历二叉树 177 ∷相函数:InOrderTraverse2函数 1.4.12 后序遍历二叉树(顺序结构) 180 范例1-66 后序遍历二叉树 180 ∷相函数:PostOrderTraverse函数 1.4.13 后序遍历二叉树(链式结构) 183 范例1-67 后序遍历二叉树 183 ∷相函数:PostOrderTraverse函数 1.4.14 层次遍历二叉树(顺序结构) 186 范例1-68 层次遍历二叉树 186 ∷相函数:LevelOrderTraverse函数 1.4.15 层次遍历二叉树(链式结构) 188 范例1-68 层次遍历二叉树 188 ∷相函数:LevelOrderTraverse函数 1.4.16 树的合并 191 范例1-70 树的合并 191 ∷相函数:Find函数 Union函数 1.4.17 树的二叉链表存储的基本操作 193 范例1-71 树的二叉链表存储的基本操作 193 ∷相函数:LevelOrderTraverse函数 1.4.18 二叉树的三叉链表存储的基本操作 201 范例1-72 二叉树的三叉链表存储表示 201 ∷相函数:CreateBiTree函数 1.4.19 二叉树的二叉线索存储的基本操作 212 范例1-73 二叉树的二叉线索存储 212 ∷相函数:CreateBiThrTree函数 1.4.20 树的双亲表存储的基本操作 215 范例1-74 树的双亲表存储的基本操作 215 ∷相函数:CreateTree函数 1.4.21 哈夫曼编码(1) 223 范例1-75 哈夫曼编码(1) 223 ∷相函数:HuffmanCoding函数 1.4.22 哈夫曼编码(2) 226 范例1-76 哈夫曼编码(2) 226 ∷相函数:HuffmanCoding函数 1.5 排序 229 1.5.1 直接插入排序 229 范例1-77 直接插入排序 229 ∷相函数:InsertSort函数 1.5.2 折半插入排序(顺序结构) 231 范例1-78 折半插入排序(顺序结构) 231 ∷相函数:BInsertSort函数 1.5.3 2—路插入排序(顺序结构) 233 范例1-79 2—路插入排序(顺序结构) 233 ∷相函数:P2_InsertSort函数 1.5.4 折半插入排序(链式结构) 235 范例1-80 折半插入排序(链式结构) 235 ∷相函数:Arrange函数 1.5.5 2—路插入排序(链式结构) 238 范例1-81 2—路插入排序(链式结构) 238 ∷相函数:Rearrange函数 1.5.6 希尔排序 241 范例1-82 希尔排序 241 ∷相函数:ShellSort函数 1.5.7 冒泡排序 243 范例1-83 冒泡排序 243 ∷相函数:bubble_sort函数 1.5.8 一趟快速排序 246 范例1-84 一趟快速排序 246 ∷相函数:QSort函数 1.5.9 一趟快速排序的改进算法 248 范例1-85 一趟快速排序的改进算法 248 ∷相函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相函数:sort函数 1.5.12 树型选择排序 254 范例1-88 树型选择排序 254 ∷相函数:TreeSort函数 1.5.13 堆排序 256 范例1-89 堆排序 256 ∷相函数:HeapSort函数 1.5.14 归并排序 258 范例1-90 归并排序 258 ∷相函数:MergeSort函数 1.5.15 多路平衡归并排序 260 范例1-91 多路平衡归并排序 260 ∷相函数:K_Merge函数 1.5.16 置换—选择排序 265 范例1-92 置换—选择排序 265 ∷相函数:Replace_Selection函数 1.5.17 文件的归并 269 范例1-93 文件的归并 269 ∷相函数:K_Merge函数 1.6 查找 272 1.6.1 顺序表的查找 273 范例1-94 顺序表的查找 273 ∷相函数:Search_Seq函数 1.6.2 静态树表的查找 276 范例1-95 静态树表的查找 276 ∷相函数:Search_SOSTree函数 1.6.3 二叉排序树的基本操作 280 范例1-96 二叉排序树的基本操作 280 ∷相函数:InsertBST函数 1.6.4 平衡二叉树的基本操作 285 范例1-97 平衡二叉树的基本操作 285 ∷相函数:SearchBST函数 1.6.5 B树的基本操作 290 范例1-98 B树的基本操作 290 ∷相函数:SearchBTree函数 1.6.6 按键字符串的遍历双链键树 295 范例1-99 按键字符串遍历双链键树 295 ∷相函数:SearchDLTree函数 1.6.7 按键字符串的遍历Trie树 301 范例1-100 按键字符串遍历Trie树 301 ∷相函数:SearchTrie函数 1.6.8 哈希表的基本操作 306 范例1-101 哈希表的基本操作 306 ∷相函数:SearchHash函数 1.7 图 311 1.7.1 图的邻接矩阵存储表示 311 范例1-102 图的邻接矩阵存储表示 ∷相函数:CreateFAG函数 CreateDG函数 1.7.2 图的邻接表存储表示 324 范例1-103 图的邻接表存储表示 324 ∷相函数:CreateFAG函数 1.7.3 有向图的十字链表存储表示 335 范例1-104 有向图的十字链表存储表示 335 ∷相函数:CreateDG函数 1.7.4 无向图的邻接多重表存储表示 344 范例1-105 无向图的邻接多重表存储表示 344 ∷相函数:CreateGraph函数 1.7.5 最小生成树 355 范例1-106 最小生成树 355 ∷相函数:MiniSpanTree_PRIM函数 1.7.6 节点和重连通分量 359 范例1-107 节点和重连通分量 359 ∷相函数:FindArticul函数 1.7.7 拓扑排序 366 范例1-108 拓扑排序 366 ∷相函数:TopologicalSort函数 1.7.8 键路径 374 范例1-109 键路径 374 ∷相函数:CriticalPath函数 1.7.9 最短路径 383 范例1-110 最短路径 383 ∷相函数:ShortestPath_DIJ函数 1.7.10 每一对顶点之间的最短路径 387 范例1-111 每一对顶点之间的最短路径 387 ∷相函数:ShortestPath_FLOYD函数 1.8 本章小结 395 第2章 数值计算 397 2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 399 ∷相函数:labs函数 2.1.2 求浮点数的绝对值 400 范例2-2 求浮点数的绝对值 400 ∷相函数:fabs函数 2.1.4 求反余弦 400 范例2-4 求反余弦 400 ∷相函数:acos函数 2.1.5 求反正弦 401 范例2-5 求反正弦 401 ∷相函数:asin函数 2.1.6 求反正切 402 范例2-6 求反正切 402 ∷相函数:atan函数 2.1.7 对浮点数进行舍入 403 范例2-7 对浮点数进行舍入 403 ∷相函数:ceil函数 2.1.8 求余弦 404 范例2-8 求余弦 404 ∷相函数:cos函数 2.1.9 求双曲余弦 405 范例2-9 求双曲余弦 405 ∷相函数:cosh函数 2.1.10 求正弦 406 范例2-10 求正弦 406 ∷相函数:sin函数 2.1.11 求双曲正弦 406 范例2-11 求双曲正弦 406 ∷相函数:sinh函数 2.1.12 求正切 407 范例2-12 求正切 407 ∷相函数:tan函数 2.1.13 求双曲正切 408 范例2-13 求双曲正切 408 ∷相函数:tanh函数 2.1.14 获得整数相除的商和余数 409 范例2-14 获得整数相除的商和余数 409 ∷相函数:div函数 2.1.15 求ex 410 范例2-15 求ex 410 ∷相函数:exp函数 2.1.16 获取浮点相除的余数 411 范例2-16 获取浮点数相除的余数 411 ∷相函数:fmod函数 2.1.17 获取浮点数的尾数和指数 412 范例2-17 获取浮点数的尾数和指数 412 ∷相函数:frexp函数 2.1.18 求x2exponent 413 范例2-18 一维多项式求值 413 ∷相函数:ldexp函数 2.1.19 求自然对数 413 范例2-19 求自然对数 413 ∷相函数:log 函数 2.1.20 求lgx 414 范例2-20 求lgx 414 ∷相函数:log10函数 2.1.21 获取浮点数的整数部分和小数部分 415 范例2-21 第二类椭圆积分 415 ∷相函数:modf函数 2.1.22 求xy 416 范例2-22 求xy 416 ∷相函数:pow函数 2.1.23 求10x 417 范例2-23 求10x 417 ∷相函数:pow10函数 2.1.24 获取随机数 418 范例2-24 获取随机数 418 ∷相函数:rand函数 2.1.25 设置随机数生成器初值 418 范例2-25 设置随机数生成器初值 418 ∷相函数:srand函数 2.1.26 获取最大值和最小值 419 范例2-26 获取最大值和最小值 419 ∷相函数:max函数 min函数 2.1.27 求直角三角形的斜边长 421 范例2-27 求直角三角形的斜边长 421 ∷相函数:hypot函数 2.1.28 获取多项式的值 421 范例2-28 获取多项式的值 421 ∷相函数:poly函数 2.2 多项式的计算 422 2.2.1 一维多项式求值 422 范例2-29 一维多项式求值 422 ∷相函数:polyval函数 2.2.2 二维多项式求值 424 范例2-30 二维多项式求值 424 ∷相函数:tdpolyval函数 2.2.3 复系数一维多项式求值 425 范例2-31 复系数一维多项式求值 425 ∷相函数:cppolyval函数 2.2.4 多项式相乘 427 范例2-32 多项式相乘 427 ∷相函数:polymul函数 2.2.5 复系数多项式相乘 428 范例2-33 复系数多项式相乘 428 ∷相函数:cppolymul函数 2.2.6 多项式除法 430 范例2-34 多项式除法 430 ∷相函数:polydiv函数 2.2.7 复数多项式相除 432 范例2-35 复数多项式相除 432 ∷相函数:cppolydiv函数 2.3 复数运算 435 2.3.1 复数乘法 435 范例2-36 复数乘法 435 ∷相函数:cpmul函数 2.3.2 复数除法 436 范例2-37 复数除法 436 ∷相函数:cpdiv函数 2.3.3 复数乘幂 437 范例2-38 复数乘幂 437 ∷相函数:cppower函数 2.3.4 复数的n次方根 439 范例2-39 复数乘法 439 ∷相函数:cproot函数 2.3.5 复数指数 441 范例2-40 复数指数 441 ∷相函数:polyval函数 2.3.6 复数对数 442 范例2-41 复数对数 442 ∷相函数:cplog函数 2.3.7 复数正弦 443 范例2-42 复数正弦 443 ∷相函数:cpsin函数 2.3.8 复数余弦 444 范例2-43 复数余弦 444 ∷相函数:cpcos函数 2.4 随机数的产生 445 2.4.1 产生0~1之间均匀分布的随机数 446 范例2-44 0~1之间均匀分布的随机数 446 ∷相函数:edisrnd函数 2.4.2 产生0~1之间均匀分布的随机数序列数 447 范例2-45 0~1之间均匀分布的随机数序列 447 ∷相函数:edisrndsq函数 2.4.3 产生任意区间内均匀分布的随机数 448 范例2-46 产生任意区间内均匀分布的随机数 448 ∷相函数:itervalrnd函数 2.4.4 产生任意区间内均匀分布的随机数序列 450 范例2-47 产生任意区间内均匀分布的随机数序列 450 ∷相函数:itervalrndsq函数 2.4.5 产生任意均值与方差的正态分布的随机数 451 范例2-48 任意均值与方差的正态分布的随机数 451 ∷相函数:nordisrnd函数 2.4.6 产生任意均值与方差的正态分布的随机数序列 453 范例2-49 任意均值与方差的正态分布随机数序列 453 ∷相函数:nordisrndsq函数 2.5 矩阵运算 454 2.5.1 实矩阵相乘 454 范例2-50 实矩阵相乘 454 ∷相函数:matrixmul函数 2.5.2 复矩阵相乘 456 范例2-51 复矩阵相乘 456 ∷相函数:cpmatrixmul函数 2.5.3 一般实矩阵求逆 458 范例2-52 一般实矩阵求逆 458 ∷相函数:matrix_inverse函数 2.5.4 一般复矩阵求逆 462 范例2-53 一般复矩阵求逆 462 ∷相函数:multi_matrix_inverse函数 2.5.5 对称正定矩阵的求逆 465 范例2-54 对称正定矩阵的求逆 465 ∷相函数:symmetric_positive_definite_matrix函数 2.5.6 托伯利兹矩阵求逆的特兰持方法 467 范例2-55 托伯利兹矩阵求逆的特兰持方法 467 ∷相函数:toeplitz_inv函数 2.5.7 求一般行列式的值 470 范例2-56 求一般行列式的值 470 ∷相函数:determinant_value函数 2.5.8 求矩阵的秩 472 范例2-57 求矩阵的秩 472 ∷相函数:determinant_rank函数 2.5.9 对称正定矩阵的乔里斯基分解与行列式求值 474 范例2-58 对称正定矩阵的乔里斯基分解 474 ∷相函数:cholesky_method函数 2.5.10 矩阵的三角分解 476 范例2-59 矩阵的三角分解 476 ∷相函数:triangular_decomposition函数 2.5.11 一般实矩阵的QR分解 478 范例2-60 一般实矩阵的QR分解 478 ∷相函数:qr_decomposition函数 2.5.12 求广义逆的奇异值分解法 480 范例2-61 求广义逆的奇异值分解法 480 ∷相函数:singular_value_decomposition函数 generalized_inverses函数 2.6 矩阵特征值与特征向量的计算 489 2.6.1 约化对称矩阵为对称三对角阵的豪斯荷尔德变换法 489 范例2-62 约化对称矩阵为对称三对角阵 489 ∷相函数:Householder_method函数 2.6.2 求对称三对角阵的全部特征值与特征向量 492 范例2-63 求对称三对角阵的全部特征值 492 ∷相函数:def_qr函数 2.6.3 约化一般实矩阵为赫申伯格矩阵的初等相似变换法 496 范例2-64 约化实矩阵为赫申伯格矩阵 496 ∷相函数:trans_hessenbreg函数 2.6.4 求赫申伯格矩阵全部特征值的QR方法 498 范例2-65 求赫申伯格矩阵全部特征值 498 ∷相函数:hessenbreg_qr函数 2.6.5 求实对称矩阵特征值与特征向量的雅可比法 502 范例2-66 雅可比法求特征值与特征向量 502 ∷相函数:jacobi_method函数 2.6.6 求实对称矩阵特征值与特征向量的雅可比过法 505 范例2-67 雅可比过法 505 ∷相函数:jacobi_clearance函数 2.7 线性代数方程组的求解 507 2.7.1 求解实系数方程组的全选主元高斯消去法 508 范例2-68 全选主元高斯消去法 508 ∷相函数:gauss_elimination函数 2.7.2 求解实系数方程组的全选主元高斯—约当消去法 510 范例2-69 全选主元高斯—约当消去法 510 ∷相函数:gauss_jordan_elimination函数 2.7.3 求解复系数方程组的全选主元高斯消去法 513 范例2-70 求解复系数方程组(方法一) 513 ∷相函数:plu_gauss函数 2.7.4 求解复系数方程组的全选主元高斯—约当消去法 516 范例2-71 求解复系数方程组(方法二) 516 ∷相函数:plu_gauss_jordan函数 2.7.5 求解三对角线方程组的追赶法 519 范例2-72 求解三对角线方程组的追赶法 519 ∷相函数:tridiagonal_chase函数 2.7.6 求解一般带型方程组 521 范例2-73 求解一般带型方程组 521 ∷相函数:principal_gauss函数 2.7.7 求解对称方程组的分解法 523 范例2-74 求解对称方程组的分解法 523 ∷相函数:equations_decomposition函数 2.7.8 求解对称正定方程组的平方根法 526 范例2-75 求解对称正定方程组的平方根法 526 ∷相函数:equations_square_root函数 2.7.9 求解大型稀疏方程组 528 范例2-76 求解大型稀疏方程组 528 ∷相函数:sparse_gauss_jordan函数 2.7.10 求解托伯利兹方程组的列文逊方法 531 范例2-77 求解托伯利兹方程组 531 ∷相函数:toeplitz_levinson函数 2.7.11 高斯—赛德尔迭代法 533 范例2-78 高斯—赛德尔迭代法 533 ∷相函数:gauss_seidel_iteration函数 2.7.12 求解对称正定方程组的共轭梯度法 535 范例2-79 求解对称正定方程组的共轭梯度法 535 ∷相函数:conjugate_gradient_method函数 2.7.13 求解线性最小二乘问题的豪斯荷尔德变换法 537 范例2-80 求解线性最小二乘问题 537 ∷相函数:least_square_householder函数 2.7.14 求解线性最小二乘问题的广义逆法 540 范例2-81 求解线性最小二乘问题的广义逆法 540 ∷相函数:least_squares_reversion函数 2.7.15 求解病态方程组 549 范例2-82 求解病态方程组 549 ∷相函数:morbid_equations函数 2.8 非线性方程与方程组的求解 553 2.8.1 求非线性方程一个实根的对分法 553 范例2-83 对分法 553 ∷相函数:nonlinear_dichotomy函数 2.8.2 求非线性方程一个实根的牛顿法 555 范例2-84 牛顿法 555 ∷相函数:newton_iterative函数 2.8.3 求非线性方程一个实根的埃特金迭代法 557 范例2-85 埃特金迭代法 557 ∷相函数:aitken_iterative函数 2.8.4 求非线性方程一个实根的连分式法 558 范例2-86 连分式法 558 ∷相函数:continued_fraction函数 2.8.5 求实系数代数方程全部根的QR方法 560 范例2-87 QR方法 560 ∷相函数:qr_all函数 2.8.6 求实系数代数方程全部根的牛顿下山法 563 范例2-88 求实系数代数方程全部根的牛顿下山法 563 ∷相函数:newton_descent_all函数 2.8.7 求复系数代数方程全部根的牛顿下山法 568 范例2-89 求复系数代数方程全部根的牛顿下山法 568 ∷相函数:newton_descent_complex函数 2.8.8 求非线性方程组一组实根的梯度法 572 范例2-90 求非线性方程组一组实根的梯度法 572 ∷相函数:gradient_nonlinear函数 2.8.9 求非线性方程组一组实根的拟牛顿法 574 范例2-91 求非线性方程组一组实根的拟牛顿法 574 ∷相函数:quasi_newton_nonlinear函数 2.8.10 求非线性方程一个实根的蒙特卡洛法 577 范例2-92 求非线性方程的蒙特卡洛法 577 ∷相函数:monte_carlo_nonlinear函数 2.8.11 求实函数或复函数方程一个复根的蒙特卡洛法 579 范例2-93 第二类椭圆积分 579 ∷相函数:monte_carlo_realplex函数 2.8.12 求非线性方程组一组实根的蒙特卡洛法 581 范例2-94 第二类椭圆积分 581 ∷相函数:monte_carlo_equation函数 2.9 插值与逼近 583 2.9.1 一元全区间插值 583 范例2-95 一元全区间插值 583 ∷相函数:interpolation_total函数 2.9.2 一元三点插值 585 范例2-96 一元三点插值 585 ∷相函数:interpolation_three函数 2.9.3 连分式插值 586 范例2-97 连分式插值 586 ∷相函数:interpolation_continued函数 2.9.4 埃尔米特插值 588 范例2-98 埃尔米特插值 588 ∷相函数:interpolation_hermite函数 2.9.5 埃特金逐步插值 590 范例2-99 第二类椭圆积分 590 ∷相函数:interpolation_aitken函数 2.9.6 光滑插值 592 范例2-100 光滑插值 592 ∷相函数:interpolation_akima函数 2.9.7 第一种边界条件的三次样条函数插值、微商与积分 595 范例2-101 第一种边界条件的三次样条函数 595 ∷相函数:cubic_spline_first函数 2.9.8 第二种边界条件的三次样条函数插值、微商与积分 598 范例2-102 第二种边界条件的三次样条函数 598 ∷相函数:cubic_spline_second函数 2.9.9 第三种边界条件的三次样条函数插值、微商与积分 600 范例2-103 第三种边界条件的三次样条函数 600 ∷相函数:cubic_spline_third函数 2.9.10 二元三点插值 604 范例2-104 二元三点插值 604 ∷相函数:interpolation_point函数 2.9.11 二元全区间插值 606 范例2-105 二元全区间插值 606 ∷相函数:interpolation_total函数 2.9.12 最小二乘曲线拟合 608 范例2-106 最小二乘曲线拟合 608 ∷相函数:least_squares_fitting函数 2.9.13 切比雪夫曲线拟合 611 范例2-107 切比雪夫曲线拟合 611 ∷相函数:chebyshev_fitting函数 2.9.14 最佳一致逼近的里米兹方法 614 范例2-108 最佳一致逼近的里米兹方法 614 ∷相函数:remez_method函数 2.9.15 矩形域的最小二乘曲面拟合 616 范例2-109 矩形域的最小二乘曲面拟合 616 ∷相函数:rec_fitting函数 2.10 数值积分 621 2.10.1 变步长梯形求积法 621 范例2-110 变步长梯形求积法 621 ∷相函数:integration_ladder函数 2.10.2 变步长辛卜生求积法 623 范例2-111 变步长辛卜生求积法 623 ∷相函数:integration_simpson函数 2.10.3 自适应梯形求积法 624 范例2-112 自适应梯形求积法 624 ∷相函数:integration_self_adaptive函数 2.10.4 龙贝格求积法 626 范例2-113 龙贝格求积法 626 ∷相函数:integration_romberg函数 2.10.5 计算一维积分的连分式法 627 范例2-114 计算一维积分的连分式法 627 ∷相函数:continued_fractions函数 2.10.6 高振荡函数求积法 629 范例2-115 高振荡函数求积法 629 ∷相函数:higher_oscillatory_integration函数 2.10.7 勒让德—高斯求积法 631 范例2-116 勒让德—高斯求积法 631 ∷相函数:legendre_gauss函数 2.10.8 拉盖尔—高斯求积法 633 范例2-117 拉盖尔—高斯求积法 633 ∷相函数:laguerre_gauss函数 2.10.9 埃尔米特—高斯求积法 634 范例2-118 埃尔米特—高斯求积法 634 ∷相函数:hermite_gauss函数 2.10.10 切比雪夫求积法 635 范例2-119 切比雪夫求积法 635 ∷相函数:chebyshev函数 2.10.11 计算一维积分的蒙特卡洛法 637 范例2-120 计算一维积分的蒙特卡洛法 637 ∷相函数:monte_carlo函数 2.10.12 变步长辛卜生二重积分法 638 范例2-121 变步长辛卜生二重积分法 638 ∷相函数:simpson函数 2.10.13 计算多重积分的高斯方法 640 范例2-122 计算多重积分的高斯方法 640 ∷相函数:gauss函数 2.10.14 计算二重积分的连分式法 643 范例2-123 计算二重积分的连分式法 643 ∷相函数:continued_fractions_dual函数 2.10.15 计算多重积分的蒙特卡洛法 645 范例2-124 计算多重积分的蒙特卡洛法 645 ∷相函数:monte_carlo_multi函数 2.11 常微分方程组的求解 647 2.11.1 全区间积分的定步长欧拉方法 647 范例2-125 全区间积分的定步长欧拉方法 647 ∷相函数:euler_step函数.. 2.11.2 积分一步的变步长欧拉方法 649 范例2-126 积分一步的变步长欧拉方法 649 ∷相函数:euler_variable函数 2.11.3 全区间积分的维梯方法 651 范例2-127 全区间积分的维梯方法 651 ∷相函数:witty函数 2.11.4 全区间积分的定步长龙格—库塔方法 653 范例2-128 全区间积分的定步长龙格—库塔方法实例位置 653 ∷相函数:runge_kutta函数 2.11.5 积分一步的变步长龙格—库塔方法 655 范例2-129 积分一步的变步长龙格—库塔方法实例位置 655 ∷相函数:runge_kutta_steps函数 2.11.6 积分一步的变步长基尔方法 657 范例2-130 积分一步的变步长基尔方法 657 ∷相函数:gill函数 2.11.7 全区间积分的变步长默森方法 659 范例2-131 全区间积分的变步长默森方法 659 ∷相函数:merson函数 2.11.8 积分一步的连分式法 662 范例2-132 积分一步的连分式法 662 ∷相函数:continued_step函数 2.11.9 全区间积分的双边法 665 范例2-133 全区间积分的双边法 665 ∷相函数:bilateral函数 2.11.10 全区间积分的阿当姆斯预报校正法 668 范例2-134 阿当姆斯预报校正法 668 ∷相函数:adams函数 2.11.11 全区间积分的哈明方法 671 范例2-135 全区间积分的哈明方法 671 ∷相函数:hamming函数 2.11.12 积分一步的特雷纳方法 675 范例2-136 积分一步的特雷纳方法 675 ∷相函数:treanor函数 2.11.13 二阶微分方程边值问题的数值解法 678 范例2-137 二阶微分方程边值问题的数值解法 678 ∷相函数:finite_difference函数 2.12 数据处理与回归分析 680 2.12.1 随机样本分析 680 范例2-138 随机样本分析 680 ∷相函数:rndsplanalysis函数 2.12.2 一元线性回归分析 683 范例2-139 一元线性回归分析 683 ∷相函数:liregression函数 2.12.3 多元线性回归分析 685 范例2-140 多元线性回归分析 685 ∷相函数:mulliregression函数 2.12.4 半对数数据相 688 范例2-141 半对数数据相 688 ∷相函数:fittinglogt函数 2.12.5 对数数据相 690 范例2-142 对数数据相 690 ∷相函数:fittingln函数 2.13 极值问题的求解 691 2.13.1 一维极值连分式法 691 范例2-143 一维极值连分式法 691 ∷相函数:extremum函数 2.13.2 n维极值连分式法 693 范例2-144 n维极值连分式法 693 ∷相函数:nextremum函数 2.13.3 不等式约束线性规划问题 696 范例2-145 不等式约束线性规划问题 696 ∷相函数:linearprogram函数 2.14 数学变换与滤波 700 2.14.1 傅里叶级数逼近 700 范例2-146 傅里叶级数逼近 700 ∷相函数:seriesfour函数 2.14.2 快速傅里叶变换 702 范例2-147 快速傅里叶变换 702 ∷相函数:quickfft函数 2.14.3 快速沃什变换 705 范例2-148 快速沃什变换 705 ∷相函数:quickfwt函数 2.14.4 五点三次平滑 706 范例2-149 五点三次平滑 706 ∷相函数:smoothness函数 2.14.5 卡尔曼滤波 708 范例2-150 卡尔曼滤波 708 ∷相函数:kalfilter函数 2.14.6 α-β-γ滤波 713 范例2-151 α-β-γ滤波 713 ∷相函数:alphabgfilter函数 2.15 特殊函数 714 2.15.1 Gamma函数 715 范例2-152 Gamma函数 715 ∷相函数:Gamma函数 2.15.2 不完全Gamma函数 716 范例2-153 不完全Gamma函数 716 ∷相函数:incomgam函数 2.15.3 误差函数 719 范例2-154 误差函数 719 ∷相函数:errorfun函数 2.15.4 第一类整数Bessel函数 721 范例2-155 第一类整数Bessel函数 721 ∷相函数:bessel1函数 2.15.5 第二类整数Bessel函数 724 范例2-156 第二类整数Bessel函数 724 ∷相函数:bessel2函数 2.15.6 变形第一类整数Bessel函数 727 范例2-157 变形第二类整数Bessel函数 727 ∷相函数:varbessel1函数 2.15.7 变形第二类整数Bessel函数 729 范例2-158 变形第二类整数Bessel函数 729 ∷相函数:varbessel2函数 2.15.8 不完全Beta函数 734 范例2-159 不完全Beta函数 734 ∷相函数:beta函数 2.15.9 正态分布函数 736 范例2-160 正态分布函数 736 ∷相函数:gauss函数 2.15.10 t-分布函数 739 范例2-161 t-分布函数 739 ∷相函数:tdistribution函数 2.15.11 2-分布函数 742 范例2-162 2-分布函数 742 ∷相函数:xdistribution函数 2.15.12 F-分布函数 744 范例2-163 F-分布函数 744 ∷相函数:fdistribution函数 2.15.13 正弦积分 747 范例2-164 正弦积分 747 ∷相函数:sinintegral函数 2.15.14 余弦积分 749 范例2-165 余弦积分 749 ∷相函数:cosintegral函数 2.15.15 指数积分 750 范例2-166 指数积分 750 ∷相函数:expintegral函数 2.15.16 第一类椭圆积分 752 范例2-167 第一类椭圆积分 752 ∷相函数:ellipseintegral1函数 2.15.17 第二类椭圆积分 754 范例2-168 第二类椭圆积分 754 ∷相函数:ellipseintegral2函数 2.16 本章小结 756 第3章 图形图像处理 757 3.1 字符屏幕 758 3.1.1 文本的输入与输出 758 范例3-1 文本的输入与输出 758 ∷相函数:printf函数 scanf函数 3.1.2 outtext、outtextxy函数输出 759 范例3-2 outtext, outtextxy函数输出 759 ∷相函数:outtext函数 outtextxy函数 3.1.3 设置文本格式 761 范例3-3 设置文本格式 761 ∷相函数:settextstyle函数 3.1.4 设置图形文本排列方式 763 范例3-4 设置图形文本排列方式 763 ∷相函数:settextjustify函数 3.1.5 设置用户字符比例 765 范例3-5 设置用户字符比例 765 ∷相函数:setusercharsize函数 3.1.6 控制文本的明暗度 766 范例3-6 控制文本的明暗度 766 ∷相函数:highvideo函数 normvideo函数 lowvideo函数 3.1.7 设置文本的前景色和背景色 767 范例3-7 设置文本的前景色和背景色 767 ∷相函数:textcolor函数 textbackground函数 3.1.8 字符窗口 770 范例3-8 字符窗口 770 ∷相函数:clrscr函数 window函数 gotoxy函数 3.1.9 清除光标行尾字符 772 范例3-9 清除光标行尾字符 772 ∷相函数:clreol函数 3.1.10 插入与删除行 773 范例3-10 插入与删除行 773 ∷相函数:insline函数 delline函数 3.1.11 屏幕参数检测 774 范例3-11 屏幕参数检测 774 ∷相函数:getgraphmode函数 getmaxx函数 getmaxy函数 getmaxcolor函数 cleardevice函数 3.2 图形图像处理基础 777 3.2.1 绘制像素点 777 范例3-12 绘制像素点 777 ∷相函数:putpixel函数 3.2.2 绘制直线 778 范例3-13 绘制直线 778 ∷相函数:line函数 lineto函数 linerel函数 moveto函数 moverel函数 3.2.3 绘制矩形 780 范例3-14 绘制矩形 780 ∷相函数:rectangle函数 3.2.4 绘制多边形 781 范例3-15 绘制多边形 781 ∷相函数:drawpoly函数 3.2.5 绘制圆 783 范例3-16 绘制圆 783 ∷相函数:circle函数 3.2.6 绘制椭圆 784 范例3-17 绘制椭圆 784 ∷相函数:ellipse函数 fillellipse函数 3.2.7 绘制圆弧 786 范例3-18 绘制圆弧 786 ∷相函数:arc函数 3.2.8 绘制扇区 787 范例3-19 绘制扇区 787 ∷相函数:pieslice函数 sector函数 3.2.9 绘制条块 788 范例3-20 绘制条块 788 ∷相函数:bar函数 bar3d函数 3.2.10 图设置线型 790 范例3-21 设置线型 790 ∷相函数:Setlinestyle函数 3.2.11 绘制填充矩形 792 范例3-22 绘制填充矩形 792 ∷相函数:setfillstyle函数 floodfill函数 3.2.12 填充多边形 795 范例3-23 填充多边形 795 ∷相函数:fillpoly函数 3.2.14 设置用户图样 796 范例3-24 设置用户图样 796 ∷相函数:setfillpattern函数 3.3 图形图像处理进阶 798 3.3.1 绘制彩色点云 798 范例3-25 绘制彩色点云 798 ∷相函数:rand函数 kbhit函数 3.3.2 绘制正多边形 799 范例3-26 绘制正多边形 799 ∷相函数:sin函数 cos函数 3.3.3 图形法绘制圆 801 范例3-27 图形法绘制圆 801 ∷相函数:drawCircle函数 3.3.4 图形法绘制椭圆 803 范例3-28 图形法绘制椭圆 803 ∷相函数:ellipse1函数 3.3.5 绘制正弦曲线 805 范例3-29 绘制正弦曲线 805 ∷相函数:lineto函数 3.3.6 绘制抛物样条曲线 806 范例3-30 绘制抛物样条曲线 806 ∷相函数:parspl函数 marking函数 3.3.7 绘制布朗曲线 809 范例3-31 绘制布朗曲线 809 ∷相函数:CreateFractalImage函数 Gauss函数 3.3.8 动态绘制256色线条 811 范例3-32 动态绘制256色线条 811 ∷相函数:int86函数 3.3.9 三原色亮度渐变 813 范例3-33 三原色亮度渐变 813 ∷相函数:geninterrupt函数 3.3.10 三视图模拟 815 范例3-34 三视图模拟 815 ∷相函数:front_view函数 top_view函数 left_view函数 perspective_view函数 3.3.11 空间椭球模拟 817 范例3-35 空间椭球模拟 817 ∷相函数:trans函数 draw函数 3.3.12 百叶窗效果 820 范例3-36 百叶窗效果 820 ∷相函数:putpoint函数 3.3.13 视觉欺骗 822 范例3-37 视觉欺骗 822 ∷相函数:dot函数 circ函数 bulb函数 3.3.14 三维建筑物 824 范例3-38 三维建筑物 824 ∷相函数:liner函数 rightlead函数 leftlead函数 shadow函数 identifier函数 3.4 组合图案绘制 830 3.4.1 一箭穿心图案 830 范例3-39 重新打开文件流 830 ∷相函数:draw函数 arrow函数 3.4.2 六叶图案 832 范例3-40 六叶图案 832 ∷相函数:arc函数 3.4.3 花瓣形图案 833 范例3-41 花瓣形图案 833 ∷相函数:line函数 3.4.4 雪花图案 835 范例3-42 雪花图案 835 ∷相函数:setviewport函数 3.4.5 布艺图案 837 范例3-43 布艺图案 837 ∷相函数:fractal函数 3.4.6 飘带图案 838 范例3-44 飘带图案 838 ∷相函数:line函数 3.4.7 金刚石图案 840 范例3-45 金刚石图案 840 ∷相函数:line函数 3.4.8 圆环图案 841 范例3-46 圆环图案 841 ∷相函数:circles函数 3.4.9 肾型图案 843 范例3-47 肾型图案 843 ∷相函数:circle函数 3.4.10 心脏型图案 844 范例3-48 心脏型图案 844 ∷相函数:circle函数 3.4.11 鱼网图案 846 范例3-49 重新打开文件流 846 ∷相函数:arc函数 3.4.12 沙丘图案 848 范例3-50 沙丘图案 848 ∷相函数:lineto函数 3.4.13 正六边形螺旋图案 849 范例3-51 正六边形螺旋图案 849 ∷相函数:polygonc函数 3.4.14 正方形螺旋拼块图案 851 范例3-52 正方形螺旋拼块图案 851 ∷相函数:polygonc函数 block函数 3.4.15 递归法绘制三角形图案 853 范例3-53 递归法绘制三角形图案 853 ∷相函数:elli函数 3.4.16 玫瑰图案 855 范例3-54 玫瑰图案 855 ∷相函数:elli函数 draw函数 3.4.17 天空图案 859 范例3-55 天空图案 859 ∷相函数:int86函数 3.4.18 Mandelbrot分形图案 864 范例3-56 Mandelbrot分形图案 864 ∷相函数:mandelbrot函数 iterate函数 3.5 窗体界面与报表设计 866 3.5.1 窗体设计 866 范例3-57 窗体设计 866 ∷相函数:mainform函数 windowborder函数 controls函数 3.5.2 简单菜单设计 871 范例3-58 简单菜单设计 871 ∷相函数:initm函数 showItems函数 process 函数 process3函数 process1函数 3.5.3 制作表格 877 范例3-59 制作表格 877 ∷相函数:putpixel函数 3.5.4 折线图 878 范例3-60 折线图 878 ∷相函数:itoa函数 settextjustify函数 3.5.5 饼状图 880 范例3-61 饼状图 880 ∷相函数:pieslice函数 3.5.6 柱状图 881 范例3-62 柱状图 881 ∷相函数:Funscore函数 Drowxy 函数 Fundrow函数 3.6 动画制作 884 3.6.1 旋转的立体椭球 884 范例3-63 旋转的立体椭球 884 ∷相函数:setactivepage函数 setvisualpage函数 3.6.2 小球碰撞演示 887 范例3-64 小球碰撞演示 887 ∷相函数:imagsize函数 getimage函数 putimage函数 3.6.3 飘动的旗帜 889 范例3-65 飘动的旗帜 889 ∷相函数:hor_wave_line函数 ver_wave_line函数 3.6.4 行驶中的小车 891 范例3-66 行驶中的小车 891 ∷相函数:imagsize函数 getimage函数 putimage函数 3.6.5 不停动嘴巴的头 893 范例3-67 不停动嘴巴的头 893 ∷相函数:getaspectratio函数 setaspectratio函数 setactivepage函数 setvisualpage函数 3.6.6 旋转的太极图 898 范例3-68 旋转的太极图 898 ∷相函数:getpalette函数 sector函数 3.6.7 螺旋运动的圆斑 901 范例3-69 螺旋运动的圆斑 901 ∷相函数:drawgoal函数 3.6.8 闪动的彩色圆斑 903 范例3-70 闪动的彩色圆斑 903 ∷相函数:drawgoal函数 3.6.9 奔跑的小人 904 范例3-71 奔跑的小人 904 ∷相函数:line函数 circle函数 3.6.10 发射火箭 907 范例3-72 发射火箭 907 ∷相函数:DrawStar函数 DrawGun函数 DrawPlan函数 3.6.11 擦玻璃 911 范例3-73 擦玻璃 911 ∷相函数:pieslice函数 bioskey函数 3.6.12 流星球 914 范例3-74 流星球 914 ∷相函数:getimage函数 putimage函数 3.6.13 简单时钟 916 范例3-75 简单时钟 916 ∷相函数:gettime函数 3.6.14 立体时钟 918 范例3-76 立体时钟 918 ∷相函数:time函数 3.6.15 飘雪 920 范例3-77 飘雪 920 ∷相函数:DrawSnow函数 Pr函数 3.6.16 制作火焰 923 范例3-78 制作火焰 923 ∷相函数:outportb函数 pokeb函数 3.6.17 天体系统 926 范例3-79 天体系统 926 ∷相函数:init_start函数 roll函数 3.6.18 扇动翅膀的蝴蝶 935 范例3-80 扇动翅膀的蝴蝶 935 ∷相函数:putpixel函数 3.6.19 米奇 936 范例3-81 重新打开文件流 936 ∷相函数:imagsize函数 getimage函数 putimage函数 3.7 本章小结 940 第4章 磁盘、目录和文件的操作 941 4.1 磁盘的操作 942 4.1.1 获取当前盘驱动器 942 范例4-1 获取当前盘驱动器 942 ∷相函数:getdisk函数 4.1.2 设置当前驱动器 943 范例4-2 设置当前驱动器 943 ∷相函数:setdisk函数 4.1.3 获取磁盘的可用空间 945 范例4-3 获取磁盘的可用空间 945 ∷相函数:getdfree函数 4.1.4 测试软驱是否可用 946 范例4-4 测试软驱是否可用 946 ∷相函数:biosdisk函数 4.2 目录的操作 948 4.2.1 创建目录 948 范例4-5 创建目录 948 ∷相函数:mkdir函数 4.2.2 改变当前目录 950 范例4-6 改变当前目录 950 ∷相函数:chdir函数 4.2.3 删除目录 952 范例4-7 删除目录 952 ∷相函数:rmdir函数 4.3 文件的操作 953 4.3.1 用fopen函数打开文件 953 范例4-8 用fopen函数打开文件 953 ∷相函数:fopen函数 4.3.2 打开系统temp目录中的文件 955 范例4-9 打开系统temp目录中的文件 955 ∷相函数:getenv函数 4.3.2 使用低级函数打开和闭文件 957 范例4-10 使用低级函数打开和闭文件 957 ∷相函数:open函数 close函数 4.3.3 用fclose函数闭文件 959 范例4-11 用fclose函数闭文件 959 ∷相函数:fclose函数 4.3.4 一次性闭所有被打开的文件 961 范例4-12 一次性闭所有被打开的文件 961 ∷相函数:fcloseall函数 4.3.5 以字符为单位读写文件 963 范例4-13 以字符为单位读写文件 963 ∷相函数:fgetc函数 fputc函数 4.3.6 以字为单位读写文件 965 范例4-14 以字为单位读写文件 965 ∷相函数:getw函数 putw函数 4.3.7 以低级的方式读写文件 967 范例4-15 以低级的方式读写文件 967 ∷相函数:read函数 write函数 4.3.8 按结构读写文件 969 范例4-16 按结构读写文件 969 ∷相函数:read函数 write函数 4.3.9 格式化写文件 971 范例4-17 格式化写文件 971 ∷相函数:fprintf函数 4.3.10 格式化读文件 972 范例4-18 格式化读文件 972 ∷相函数:fscanf函数 4.3.11 以行为单位写文件 974 范例4-19 以行为单位写文件 974 ∷相函数:fputs函数 4.3.12 以行为单位读文件 975 范例4-20 以行为单位读文件 975 ∷相函数:fgets函数 4.3.13 将缓冲区内容写入文件 977 范例4-21 将缓冲区内容写入文件 977 ∷相函数:setbuf函数 4.3.14 用lseek函数定位文件指针 978 范例4-22 用lseek函数定位文件指针 978 ∷相函数:lseek函数 4.3.15 获取文件流的文件句柄 980 范例4-23 获取文件流的文件句柄 980 ∷相函数:fileno函数 4.3.16 从文件流指针中导出文件句柄 982 范例4-24 从文件流指针中导出文件句柄 982 ∷相函数:fopen函数 4.3.17 利用eof函数判断文件是否结束 984 范例4-25 利用eof函数判断文件是否结束 984 ∷相函数:eof函数 4.3.18 利用feof函数判断文件结尾 986 范例4-26 利用feof函数判断文件结尾 986 ∷相函数:feof函数 4.3.19 刷新I/O流 988 范例4-27 刷新I/O流 988 ∷相函数:fflush函数 4.3.20 利用tmpnam函数创建临时文件名 990 范例4-28 利用tmpnam函数创建临时文件名 990 ∷相函数:tmpnam函数 4.3.21 创建真正的临时文件 992 范例4-29 创建真正的临时文件 992 ∷相函数:tmpfile函数 4.3.22 创建文件 993 范例4-30 创建文件 993 ∷相函数:creat函数 4.3.23 在指定目录中创建唯一文件 995 范例4-31 在指定目录中创建唯一文件 995 ∷相函数:creattemp函数 4.3.24 利用creatnew函数创建新文件 996 范例4-32 利用creatnew函数创建新文件 996 ∷相函数:creatnew函数 4.3.25 删除文件 998 范例4-33 删除文件 998 ∷相函数:remove函数 4.3.26 查找文件获取文件的路径 1000 范例4-34 查找文件获取文件的路径 1000 ∷相函数:searchpath函数 4.3.27 分解文件路径 1001 范例4-35 分解文件路径 1001 ∷相函数:fnsplit函数 4.3.28 建立文件完全路径名 1003 范例4-36 建立文件完全路径名 1003 ∷相函数:fnmerge 函数 4.3.29 读取文件分配表信息 1005 范例4-37 读取文件分配表信息 1005 ∷相函数:getfat函数 getfatd函数 4.3.30 判断读写所在的文件的位置 1007 范例4-38 判断读写所在的文件的位置 1007 ∷相函数:ftell函数 4.3.31 重命名文件 1009 范例4-39 重命名文件 1009 ∷相函数:rename函数 4.3.32 判断访问文件的模式 1011 范例4-40 判断访问文件的模式 1011 ∷相函数:access函数 4.3.34 设置文件访问模式 1013 范例4-41 设置文件访问模式 1013 ∷相函数:chmod函数 4.3.35 显示文件的属性 1015 范例4-42 显示文件的属性 1015 ∷相函数:_chmod函数 4.3.36 检测文件流的错误 1017 范例4-43 检测文件流的错误 1017 ∷相函数:ferror函数 4.3.37 判断文件的长度 1019 范例4-44 判断文件的长度 1019 ∷相函数:filelength函数 4.3.38 通过句柄设置打开文件的方式 1022 范例4-45 通过句柄设置打开文件的方式 1022 ∷相函数:setmode函数 4.3.39 读取文件的时间和日期标记 1023 范例4-46 读取文件的时间和日期标记 1023 ∷相函数:getftime函数 4.3.40 设置文件的时间和日期标记 1026 范例4-47 设置文件的时间和日期标记 1026 ∷相函数:setftimet函数 4.3.41 改变文件的长度 1028 范例4-48 改变文件的长度 1028 ∷相函数:chsize函数 4.3.42 控制文件打开操作的读写模式 1029 范例4-49 控制文件打开操作的读写模式 1029 ∷相函数:umask函数 4.3.43 复制文件句柄 1032 范例4-50 复制文件句柄 1032 ∷相函数:dup函数 4.3.44 强制复制文件句柄 1033 范例4-51 强制复制文件句柄 1033 ∷相函数:dup2函数 4.3.45 用句柄判断读写所在的文件的位置 1036 范例4-52 用句柄判断当前文件指针的位置 1036 ∷相函数:tell函数 4.3.46 根据当前位置定位文件指针 1038 范例4-53 根据当前位置定位文件指针 1038 ∷相函数:fseek函数 4.3.47 获取文件句柄的信息 1039 范例4-54 获取文件句柄的信息 1039 ∷相函数:fstat函数 4.3.48 重新打开文件流 1041 范例4-55 重新打开文件流 1041 ∷相函数:freopen函数 4.4 本章小结 1043 第5章 系统调用 1045 5.1 时间和日期的操作 1046 5.1.1 获取当前的时间和日期 1046 范例5-1 获取当前时间和日期 1046 ∷相函数:time函数 5.1.2 让程序延时指定的时间段 1047 范例5-2 让程序延时指定的时间段 1047 ∷相函数:delay函数 5.1.3 比较两个时间 1048 范例5-3 比较两个时间 1048 ∷相函数:difftime函数 5.1.4 读BIOS计时器 1050 范例5-4 读BIOS计时器 1050 ∷相函数:biostime函数 5.1.5 比较两个时间获取当地时间 1051 范例5-5 获取当地时间 1051 ∷相函数:localtime函数 5.1.6 获取格林威治平时 1052 范例5-6 获取格林威治平时 1052 ∷相函数:gmtime函数 5.1.7 获取DOS系统时间 1054 范例5-7 获取DOS系统时间 1054 ∷相函数:gettime函数 5.1.8 获取DOS系统日期 1055 范例5-8 获取DOS系统日期 1055 ∷相函数:getdate函数 5.1.9 设置DOS系统时间 1057 范例5-9 设置DOS系统时间 1057 ∷相函数:settime函数 5.1.10 设置DOS系统日期 1059 范例5-10 设置DOS系统日期 1059 ∷相函数:setdate函数 5.1.11 获取时区信息 1061 范例5-11 获取时区信息 1061 ∷相函数:ftime函数 5.2 BIOS的操作 1062 5.2.1 利用BIOS获取打印机的状态 1062 范例5-12 利用BIOS获取打印机的状态 1062 ∷相函数:biosprint函数 5.2.2 获取Ctrl+Break信息 1064 范例5-13 获取CTRL+BREAK信息 1064 ∷相函数:getcbrk函数 5.2.3 暂时挂起程序 1066 范例5-14 暂时挂起程序 1066 ∷相函数:sleep函数 5.2.4 控制声音 1067 范例5-15 控制声音 1067 5.2.5 利用bdos函数访问DOS服务 1068 范例5-16 利用bdos函数访问DOS服务 1068 ∷相函数:bdos函数 5.2.6 获取BIOS常规内存数量 1071 范例5-17 获取BIOS常规内存数量 1071 ∷相函数:biosmemory函数 5.2.7 获取寄存器设置信息 1072 范例5-18 获取寄存器设置信息 1072 ∷相函数:segread函数 5.3 内存的操作 1074 5.3.1 给内存区域赋值 1074 范例5-19 给内存区域赋值 1074 ∷相函数:memset函数 5.3.2 获取时区信息复制内存区域 1076 范例5-20 复制内存区域 1076 5.3.3 复制内存区域指定的字节 1078 范例5-21 复制内存区域指定的字节 1078 ∷相函数:memccpy函数 5.3.4 获取时区信息 1080 范例5-22 比较两个无符号字符数组 1080 5.3.5 交换字符串的两个相邻字节内容 1082 范例5-23 交换字符串的两个相邻字节内容 1082 ∷相函数:swab函数 5.3.6 利用brk函数改变堆的大小 1084 范例5-24 利用brk函数改变堆的大小 1084 ∷相函数:brk函数 5.3.7 获取指定内存单元内容 1086 范例5-25 获取指定内存单元内容 1086 5.3.8 设置指定内存单元内容 1088 范例5-26 设置指定内存单元内容 1088 5.4 本章小结 1090 索引... 1091

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值