C语言程序设计 第八章 查表

合集下载

C语言程序设计第8章 函数简明教程PPT课件

C语言程序设计第8章 函数简明教程PPT课件

8.1 函数的概念与定义
程序运行情况如下: Enter a and b:10 20
The max is 20
计算机科学与技术学院—— C语言程序设计
8.1 函数的概念与定义
(2)函数名类似于其它的标识符,其命名规则也与其它 标识符相同。 (3)形式参数列表(formal parameter list)用来描述 函数所需要的参数个数及其类型,它的基本形式为: (类型名1 参数名1, 类型名2 参数名2, …, 类型名n 参 数名n) 如上例中的(int x, int y)。函数的参数是函数与它的主 调函数之间发生数据交换的一个通道,即被调函数通过参 数的方式建立起它与主调函数之间所需的信息交换的一种 途径。如果函数没有形式参数,则在定义时括号内可以为 空,但最好写上void。
计算机科学与技术学院—— C语言程序设计
8.1 函数的概念与定义
函数Max()的返回值由函数体中的return语句获得。 函数也可以没有返回值类型,此时,我们最好把没有返 回值类型的函数定义成void类型,这时,函数体中的 return语句可以不写,也可以只写上return语句: return; 。
C程序的这种组成结构,反映了一种结构化程序设计的思想。 一个程序可以分解为多个模块,每个模块可以实现一定的功能。 如果一个模块过于复杂,就可以进行再分解,直到分解出来的 模块足够简单,可以方便实现为止。这种结构化的程序设计思 想,体现出一种“分而治之”(devided and conquer)的哲 学理念,也是我们日常处理事情的一种典型方法。
程序设计者,只在库函数不能满足需要的时候,才需要自己 来创建所需要的函数(自定义函数)。读者学完本章之后, 就应该能自定义一些自己所需要的函数并能正确使用它们, 当然也要学会正确使用系统提供的大量的标准库函数。有 关库函数的详细情况和使用方法可以参考附录和其它相关 资料。

查表程序设计

查表程序设计

;查表程序设计;BLOCK1为始址的块长为的LEN数据块,每个储单元的高低四位分别为两个16进制数;编程把它们转换为相应的ASCII码,放入BLOCK2开始连续存储单元;低四位ASCII码在低地址,高四位ASCII码在高地址;两次使用查表指令,注意PC调整值及DATA修正值ORG 0000HLJMP MAINORG 0500HMAIN: LEN DATA 20HBLOCK1 DATA 21HBLOCK2 DATA 51HMOV R0,#BLOCK1MOV R1,#BLOCK2LOOP: MOV A, @R0ANL A, #0FH ;取低四位ADD A, #17 ;DATA值MOVC A,@A+PC ;第一次查表MOV @R1,A ;存第一次转换结果MOV A,@R0 ;再次取出被转换数SWAP A ;高低位互换位置ANL A,#0FHADD A,#09H ;DATA值MOVC A,@A+PC ;第二次查表INC R1MOV @R1,AINC R0INC R1DJNZ LEN,LOOPSJMP $ASCTAB: DB '0','1','2','3','4'DB '5','6','7','8','9'DB 'A','B','C','D','E','F'END;有一开始地址为DTATAB的数据表格,表中放1024个元素,每个元素为2个字节,编出能根据R5,R4中元素序号查找对应元素并放入R5,R4(R5中为高8位R4中为低8位);注意表格元素为两字节,查找的元素号应扩大两倍后再和DPTR中表格始址相加ORG 0000HLJMP MAINORG 0500HMAIN: MOV DPTR, #DTATAB ;表格始址MOV A,R4 ;元素低字节送ACLR CRLC A ;2*元素序号低字节XCH A,R5RLC A ;2*元素序号高字节XCH A,R5ADD A,DPLMOV DPL,A ;2*元素序号低字节+DPL存入DPL中MOV A,DPHADDC A,R5MOV DPH,A ;2*元素序号高字节+DPH 存入DPH 中CLR AMOVC A,@A+DPTRMOV R5,AMOV A,#01HMOVC A,@A+DPTRMOV R4,ARETDTATAB: DW '1','2'DW '5','P' END。

c语言查表法程序

c语言查表法程序

c语言查表法程序摘要:1.引言a.介绍C 语言查表法的概念b.说明查表法在编程中的应用和优势2.查表法的原理a.定义表格b.设计查表算法c.实现查表功能3.查表法程序设计实例a.线性查表法i.原理介绍ii.程序代码示例b.二次查表法i.原理介绍ii.程序代码示例4.查表法程序的优化a.提高查表速度i.缓存表数据ii.减少无效查询b.降低内存占用i.压缩表格数据ii.利用数据结构优化5.总结a.回顾查表法的重要性和应用场景b.展望查表法在未来的发展趋势正文:C 语言查表法程序是一种在编程中广泛应用的数据处理技术。

通过将数据以表格的形式存储在内存中,可以实现快速查找、插入、删除等操作,大大提高程序运行效率。

本文将详细介绍C 语言查表法的原理、程序设计实例以及优化方法。

查表法的原理主要包括定义表格、设计查表算法和实现查表功能。

首先,需要根据需求定义表格的数据结构,包括表格大小、每个表格项的位数等。

接着,设计查表算法,根据不同的需求可以选择线性查表法或二次查表法。

最后,实现查表功能,将算法应用到实际程序中,实现数据查找、插入、删除等操作。

在查表法程序设计实例部分,我们以线性查表法和二次查表法为例进行讲解。

线性查表法是一种简单的查表方法,通过计算索引值直接获取对应的表格项。

二次查表法则通过计算索引值对应的行和列,间接获取表格项。

这两种方法各有优劣,适用于不同的场景。

查表法程序在实际应用中可能面临速度和内存占用的问题。

为了提高查表速度,我们可以采用缓存表数据的方法,将经常使用的数据存储在高速缓存中,减少磁盘I/O 操作。

此外,还可以通过减少无效查询来提高查表速度。

降低内存占用方面,我们可以压缩表格数据以减少内存占用,或者利用数据结构优化,如使用哈希表等。

总之,C 语言查表法程序是一种高效的数据处理技术,广泛应用于各种编程场景。

通过对查表法的原理、程序设计实例和优化方法的了解,可以帮助我们更好地利用查表法提高程序性能。

查表程序设计

查表程序设计

例4.两个无符号数比较 例4-12 求符号函数的值。 例4-13 散转
例5 :求50H单元后30个数的累加和 例4-16 测试字符串长度的程序。 例4-17 50ms 延时程序 练习:写一个延时 10ms 的子程序。(钟频 12MHz )
4.3 汇编语言实用程序设计 -分支转移程序设计
(2)分支程序设计
1000H C A,40H A,41H LED0 P1.1
;清CY为零 ;取第一个数送A ;两数比较 ;CY=0,转至LED0 ;CY=1,(40H)<(41H),点亮P1.1 LED
SJMP FINISH ;跳转到结束
LED0: CLR P1.0 ;CY=0,40H≥(41H),点亮P1.0 LED FINISH: RET
2.多分支转移结构 程序的判别部分有两个以上的出口流向。
4.3 汇编语言实用程序设计 -分支转移程序设计
4.3 汇编语言实用程序设计 -分支转移程序设计
4.3 汇编语言实用程序设计 -分支转移程序设计
条件成立?
Y
N
N
程序段A
条件成立? Y
下条指令
程序段B
程序段A
K=0? N
K=1? N
K=2? N
开始
(40H)-(41H)
N CY = 0 ?
Y (40H)≥(41H)
P1.0灯亮
(40H)<(41H) P1.1灯亮
结束
图 两个无符号数比较流程图
4.3 汇编语言实用程序设计 -分支转移程序设计
方法1:使用SUBB指令,依据借位CY状态判断两个数的大小!
ORG CLR MOV SUBB JNC CLR
4.3 汇编语言实用程序设计
一个完整的源程序必备的四个要素:

嵌入式C语言查表法

嵌入式C语言查表法

嵌⼊式C语⾔查表法就像下⾯的这个表之前写过上⾯这个标题的⼀篇⽂章,讲的是以位移的⽅式去遍历表中的数据,效率⾮常⾼,但是,如果要实现⼀个乱序的流⽔灯或者跑马灯的话,思考⼀个这样的算法是不可取的,很费时间,也很费脑⼒,于是,今天就说⼀说查表法,如果在程序中运⽤查表法,不论多么复杂的程序,只要符合⼀张表,那都可以实现,⾮常简单,体⼒活⽽已,接下来看看下⾯这个程序,对上⾯这个进⾏操作吧。

#include <stdio.h>#include <windows.h>//这⾥的⾏可以⾃由写,这样就不受限制,想做出什么样的效果都可以。

int array[][10] = {0x03,0x00,0x00,0x00,0x00,//第⼀列0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,//第⼆列0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,//第三列0x00,0x08,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,//第四列0x00,0x10,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,//第五列0x00,0x20,0x00,0x00,0x00,0xAA,0x55,0x00,0x00,0xC0,//end0x00,0x00,0x00,0x00,0x00,};void to_Q112_cmd_designator_LED(int *array){int i;for(i = 0; i < 10; i++){printf(" %3d ", *(array+i));}printf("\n");}void delay_500ms(void){Sleep(500);}int main(void){int i,j;int tick;int count = 0;while(array[count][0] != 0xAA || array[count][1] != 0x55)//如果当数组第count⾏第0列等于0xAA,或者第count⾏第1列等于0x55时,那么就退出,否则就循环执⾏遍历数据 {to_Q112_cmd_designator_LED((int *)(&array[0][0]+count*10) );//以⾸元素每次向后偏移10个字节delay_500ms();count++;}return0;}运⾏结果:3 0 0 0 0 0 2 0 0 012 0 0 0 0 0 4 0 0 016 0 0 0 0 0 8 0 0 096 0 0 0 0 0 16 0 0 0128 1 0 0 0 0 32 0 0 0。

查表程序设计

查表程序设计

查表程序设计在计算机编程的世界里,查表程序设计是一项非常实用且重要的技术。

它就像是我们日常生活中的字典,当我们需要查找某个特定的信息时,能够快速而准确地获取到。

首先,让我们来理解一下什么是查表。

简单来说,查表就是在一个预先准备好的数据集合中,通过特定的索引或者关键字,找到我们所需要的数据。

这个数据集合可以是一个数组、一个链表,甚至是一个复杂的数据结构,比如二叉树或者哈希表。

那么,为什么我们需要使用查表这种方式呢?想象一下,如果我们需要根据不同的输入值来计算一个复杂的函数结果,每次都重新计算的话,会耗费大量的时间和计算资源。

而如果我们事先将这些可能的输入值和对应的计算结果存储在一个表中,那么在需要的时候,只需要通过查找这个表,就能迅速得到结果,大大提高了程序的运行效率。

在设计查表程序时,第一步是确定表的结构和存储方式。

这取决于我们要存储的数据类型和数量,以及查找的频繁程度和效率要求。

例如,如果我们要存储的是一些固定的常量值,而且数量不多,那么一个简单的数组可能就足够了。

但如果数据量很大,而且需要频繁地进行插入、删除和查找操作,那么可能就需要使用更复杂的数据结构,如链表或者哈希表。

接下来,就是如何构建这个表。

这通常需要我们根据具体的问题和需求,将相关的数据按照一定的规则组织起来。

比如,如果是一个按照数值大小排序的表,我们可以使用二分查找算法来提高查找效率;如果是一个无序的表,可能就需要遍历整个表来查找。

在查找表中的数据时,算法的选择至关重要。

常见的查找算法有顺序查找、二分查找、哈希查找等。

顺序查找就是从表的开头依次比较每个元素,直到找到目标元素或者遍历完整个表。

这种方法简单直观,但效率较低,适用于小型的、无序的表。

二分查找则是针对有序表的一种高效查找算法,它通过不断将表中间的元素与目标元素进行比较,将查找范围缩小一半,直到找到目标元素。

哈希查找则是通过将关键字映射到一个特定的哈希值,然后在对应的哈希表位置进行查找,其查找效率通常很高,但需要处理哈希冲突的情况。

高树芳C语言程序设计--第八章

高树芳C语言程序设计--第八章

30
8.5 知识拓展
案例8-11 指针的高级应用 [案例任务] 阅读下列程序 ,分析运行结果,了解指 针的各种应用。
程序代码
31
8.5 知识拓展
相关知识:
1.有关指针的数据类型小结 2.案例说明 3.main函数的参数
32
12
8.2 指针变量
[课堂训练8-1] void swap(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; }
1.分析下面的程序,写出运行结果。 #include <stdio.h> void main() { void swap(int *p1,int *p2); int *p1,*p2,a=6,b=8; p1=&a; p2=&b; printf(" 交换前:*p1=%d,*p2=%d\n",*p1,*p2); swap(p1,p2); printf(" 交换后:*p1=%d,*p2=%d\n",*p1,*p2); }
17
8.3 指针与数组
案例8-6 [案例任务]
冒泡排序
使用指针指向一维整型数组,使用冒泡排 序法对数组元素从小到大排序并输出。
程序代码
18
8.3 指针与数组
相关知识: 1.冒泡排序法 2.指针变量的其他运算
19
8.3 指针与数组
案例8-7 [案例任务]
逆置一维数组
使用数组名或指针变量作为函数形参与实 参,完成一维数组元素的逆置。请分析程 序运行结果,并对两个方法进行比较。
6
8.2 指针变量
案例8-2 用指针交换两整数 案例8-3 用指针比较两数大小 案例8-4 用指针参数交换两整数

c语言查表法程序

c语言查表法程序

查表法是一种常见的优化技术,通常用于通过查找预先计算并存储在表中的值来提高程序的性能。

以下是一个使用查表法的简单 C 语言程序的示例,该程序计算并打印正弦值:
在这个程序中:
•initSinTable函数初始化了一个包含 360 个角度对应正弦值的表。

•lookupSin函数接受一个角度作为输入,使用查表法返回对应的正弦值。

•main函数使用查表法计算并打印一些角度的正弦值。

这个程序的关键点是使用查表法避免了重复计算正弦值,而是通过事先计算并存储在表中的方式提高了效率。

这种技术在某些情况下可以显著提高程序的性能。

请注意,实际应用中可能需要考虑内存占用和表的精度等问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

何谓查找表?查找表是由同一类型的数据元素(或记录)构成的集合。

由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。

对查找表经常进行的操作:•1)查询某个“特定的”数据元素是否在查找表中;•2)检索某个“特定的”数据元素的各种属性;•3)在查找表中插入一个数据元素;•4)从查找表中删去某个数据元素。

查找表可分为两类:静态查找表仅作查询和检索操作的查找表。

动态查找表有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入到查找表中;或者,从查找表中删除其“查询”结果为“在查找表中”的数据关键字是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。

若此关键字可以识别唯一的一个记录,则称之谓“主关键字”。

若此关键字能识别若干记录,则称之谓“次关键字”。

查找根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)。

若查找表中存在这样一个记录,则称“查找成功”。

查找结果给出整个记录的信息,或指示该记录在查找表中的位置;否则称“查找不成功”。

查找结果给出“空记录”或“空指针”。

如何进行查找?查找的方法取决于查找表的结构。

由于查找表中的数据元素之间不存在明显的组织规律,因此不便于查找。

为了提高查找的效率,需要在查找表中的元素之间人为地附加某种确定的关系,换句话说,用另外一种结构来表示查找表。

9.1 静态查找表9.2 动态查找树表9.3 哈希表9.1静态查找表数据对象D :数据关系R :D 是具有相同特性的数据元素的集合。

每个数据元素含有类型相同的关键字,可唯一标识数据元素。

数据元素同属一个集合。

ADT StaticSearchTable {基本操作P:Create(&ST, n);Destroy(&ST); Search(ST, key);Traverse(ST, Visit()); } ADT StaticSearchTable构造一个含n 个数据元素的静态查找表ST 。

Create(&ST, n);操作结果:销毁表ST 。

Destroy(&ST);初始条件:操作结果:静态查找表ST 存在;若ST 中存在其关键字等于key 的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。

Search(ST, key);初始条件:操作结果:静态查找表ST 存在,key 为和查找表中元素的关键字类型相同的给定值;按某种次序对ST 的每个元素调用函数Visit()一次且仅一次,一旦Visit()失败,则操作失败。

Traverse(ST, Visit());初始条件:操作结果:静态查找表ST 存在,Visit是对元素操作的应用函数;假设静态查找表的顺序存储结构为typedef struct {ElemType*elem;// 数据元素存储空间基址,建表时// 按实际长度分配,0号单元留空int length; // 表的长度}SSTable;数据元素类型的定义为:typedef struct {keyType key; // 关键字域… …// 其它属性域}ElemType ;, TElemType ;一、顺序查找表二、有序查找表三、索引顺序表以顺序表或线性链表表示静态查找表一、顺序查找表2137881992056456807513 0 1 2 3 4 5 6 7 8 9 10 11ST.Length ST.elem 回顾顺序表的查找过程:假设给定值e=64,要求ST.elem[k] = e, 问: k = ?k kint location( SqList L, ElemType& e,Status (*compare)(ElemType, ElemType)) { k = 1;p = L.elem;while( k<=L.length&&!(*compare)(*++p, e))) k++; if( k<= L.length) return k;else return0;}//location2137881992056456807513 0 1 2 3 4 5 6 7 8 9 10 11ST.Length ST.elem i 2137881992056456807513 0 1 2 3 4 5 6 7 8 9 10 11ST.Length ST.elem i60ikey=64key=60i64int Search_Seq(SSTable ST,KeyType key) { // 在顺序表ST中顺序查找其关键字等于// key的数据元素。

若找到,则函数值为// 该元素在表中的位置,否则为0。

ST.elem[0].key = key;// “哨兵”for(i=ST.length; ST.elem[i].key!=key;--i);// 从后往前找return i;// 找不到时,i为0}// Search_Seq定义:查找算法的平均查找长度(A verage S earch L ength)为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值其中: n 为表长,P i 为查找表中第i 个记录的概率,且,C i 为找到该记录时,曾和给定值比较过的关键字的个数。

分析顺序查找的时间性能∑==n i ii C P ASL 111=∑=n i iP在等概率查找的情况下,顺序表查找的平均查找长度为:对顺序表而言,C i = n-i+1nP i 1=21111+=+-=∑=n )i (n n ASL ni ss ASL = nP 1+(n-1)P 2+ +2P n-1+P n若查找概率无法事先测定,则查找过程采取的改进办法是,在每次查找之后,将刚刚查找到的记录直接移至表尾的位置上。

在不等概率查找的情况下,ASL ss 在P n ≥P n-1≥···≥P 2≥P 1时取极小值二、有序查找表上述顺序查找表的查找算法简单,但平均查找长度较大,特别不适用于表长较大的查找表。

若以有序表表示静态查找表,则查找过程可以基于“折半”进行。

0513192137566475808892 0 1 2 3 4 5 6 7 8 9 10 11ST.elemST.length例如: key=64的查找过程如下:low high mid low midhighmid low 指示查找区间的下界high 指示查找区间的上界mid = (low+high)/2int Search_Bin ( SSTable ST, KeyType key ) { low = 1; high = ST.length; // 置区间初值while(low <= high) {mid = (low + high) / 2;if (EQ (key , ST.elem[mid].key) )return mid; // 找到待查元素else if( LT (key , ST.elem[mid].key) )high = mid -1; // 继续在前半区间进行查找else low = mid + 1; // 继续在后半区间进行查找}return0; // 顺序表中不存在待查元素}// Search_Bin先看一个具体的情况,假设:n=11分析折半查找的平均查找长度6391425781011判定树i 1234567891011Ci 12233334444假设n=2h -1 并且查找概率相等则在n>50时,可得近似结果一般情况下,表长为n 的折半查找的判定树的深度和含有n 个结点的完全二叉树的深度相同。

1)1(log 12112111-++=⎥⎦⎤⎢⎣⎡⨯==∑∑=-=n n n j n C n ASL h j j n i i bs 1)1(log 2-+≈n ASL bs索引顺序表的查找过程:1)由索引确定记录所在区间;2)在顺序表的某个区间内进行查找。

可见,索引顺序查找,是一个“缩小区间”的查找过程。

具体实现是分块查找。

注意:索引可以根据查找表的特点来构造。

分块查找是顺序查找的一种改进,在表的基础上又建立一个“索引表”。

➢顺序表可分为若干子表,为每个子表建立一个索引项。

索引表中每个索引项包括两项内容:关键字项(其值为该子表内的最大关键字)和指针项(指示该子表的第一个记录在表中位置)➢索引表按关键字有序。

➢顺序表或者有序或者分块有序。

分块有序:在相邻的两个子表中,后一个子表中所有记录的关键字均大于前一个子表中所有记录的关键字。

例如:22121389203342443824486058744986531 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2248861713索引表最大关键字起始地址key=38key=29i j索引顺序查找的平均查找长度ASL bs =查找“索引”的平均查找长度L b + 查找“顺序表”的平均查找长度L w 设:表的长度:n 。

均匀分成的块数:b ,每块记录个数:s ,即b= . 设: 每个记录的查找概率相等,则每块查找的概率:1/b ,块中每个记录的查找概率:1/s.若用顺序查找确定所在的块,则:ASL bs =L b +L w =⎡⎤s n 1)(2121211111++=+++=+∑∑==s s n s b i s j b s i b j 当s= 时,ASL bs 最小=+1n n9.2动态查找表一、二叉排序树(二叉查找树)二、二叉平衡树三、B -树四、B+树一、二叉排序树(二叉查找树)1.定义2.查找算法3.插入算法4.删除算法5.查找性能的分析(1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值;1.定义:二叉排序树或者是一棵空树;或者是具有如下特性的二叉树:(3)它的左、右子树也都分别是二叉排序树。

(2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值;503080209010854035252388例如:是二叉排序树。

66不通常,取二叉链表作为二叉排序树的存储结构typedef struct BiTNode{// 结点结构TElemType data;struct BiTNode *l child, *r child;// 左右孩子指针}BiTNode, *BiTree;2.二叉排序树的查找算法:若二叉排序树为空,则查找不成功;否则,•1)若给定值等于根结点的关键字,则查找成功;•2)若给定值小于根结点的关键字,则继续在左子树上进行查找;•3)若给定值大于根结点的关键字,则继续在右子树上进行查找。

20858832例如:二叉排序树查找关键字== 50 ,35 ,30403590 ,50809095 ,从上述查找过程可见,在查找过程中,生成了一条查找路径:从根结点出发,沿着左分支或右分支逐层向下直至关键字等于给定值的结点;——查找成功或者从根结点出发,沿着左分支或右分支逐层向下直至指针指向空树为止。

相关文档
最新文档