-
2021-05-20 04:44:36
在设计内存管理器时,经常需要根据内存的size找到对应的数组index,查表是个不错的解决办法。
假设有一个数组,数组中每个元素代表一个范围,任意给定一个数,要尽可能快得找到其对应的数组索引,有什么好的办法么?
例如,数组为范围 [0,1) [1,2) [2,4) [4,8) [8,16) [16,32) [32,64) [64,128)
索引 0 1 2 3 4 5 6 7
给定一个数37,那么由于在[32,64)范围内,故应返回索引6.通过以下程序可生成一张索引表:
#include
#define MIN_MASK 5
#define MAX_MASK 12
#define MIN_VALUE (1<
#define MAX_VALUE (1<
#define DIF_VAL (1<
#define ONELINE_MASK 4
#define ONELINE (1<
int main(void)
{
FILE* fp=fopen("data.txt","w");
fprintf(fp,"static char index_table[]={\n\t");
int idx=0,idv=1,lnc=1,i;
for(i=0;i
{
if(i>=idv)
{
idx++;idv<<=1;
}
if(lnc>ONELINE)
{
fprintf(fp,"\n\t");
lnc=1;
}
fprintf(fp,"%d, ",idx);
}
fprintf(fp,"\n};");
fclose(fp);
return 0;
}
生成如下查找表
static char index_table[]={
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
};
~
则可通过size_to_index完成从size到index的转换int size_to_index(unsigned int
size)
{ return index_table[size >> MIN_MASK];}
更多相关内容 -
C语言二维数组中的查找的实例
2020-08-29 23:19:05主要介绍了C语言二维数组中的查找的实例的相关资料,需要的朋友可以参考下 -
c语言数组练习题
2021-10-24 13:38:221)定义大小为100的整型数组, 使用随机函数给数组元素赋值。数值范围1..100, 并且排序,使用冒泡排随机函数 2)定义大小为100的整型数组,使用随机函数给数组元素赋值。数值的范围是1.. 100,并且不容许重复 (两题...1)定义大小为100的整型数组, 使用随机函数给数组元素赋值。数值范围1..100, 并且排序,使用冒泡排随机函数
2)定义大小为100的整型数组,使用随机函数给数组元素赋值。数值的范围是1.. 100,并且不容许重复
(两题类似都用同一种方法,只不过第二题,进行了数字筛选)
#include<stdio.h> #include<stdlib.h> #include<time.h> #define ARSIZE 100 //int FindValue(int ar[], int n, int val) //{ // int i = 0; // for (i = 0; i <= n - 1; i++) // { // if (val == ar[i]) // { // return i; // } // if (val != ar[i]) // { // return -1; // } // } //} int main() { int ar[ARSIZE] = { 0 }; int br[ARSIZE + 1] = { 0 }; int i = 0; srand(unsigned int(time(NULL)));//随机种子 while (i < ARSIZE) { int ret = rand() % 100 + 1;//伪随机数 if (br[ret] == 0) { ar[i++] = ret;//有两个数组,都初始化为0且大小都为100,把br下标填进ar中,查表法 br[ret] = 1; } } for (int i = 1; i <ARSIZE; i++)//冒泡排序法:比较的趟数 { int flag = 1;//设立一个标签,如果是有序的就不进行冒泡排序 for (int n = 0; n < ARSIZE-i; n++)//每一趟比较的次数 { if (ar[n] > ar[n + 1]) { int tmp = 0; tmp = ar[n + 1]; ar[n + 1] = ar[n]; ar[n] = tmp; flag = 0; } } if (flag == 1) { break; } } for (i = 0; i <ARSIZE; i++)//打印以及制表 { printf("%3d", ar[i]); if ((i+1) % 10 == 0)//每十个一行 { printf("\n"); } } return 0; }
3)统计字符串中每个英文字符出现的次数, 不区分大小写, 只统计英文字符。
#include<stdio.h> #include<ctype.h> #define ARSIZE 26 int main() { int arr[ARSIZE] = { 0 }; char ch; while ((ch = getchar()) != EOF) { if (isalpha(ch))//如果得到的字符是英文字符就进入if语句 { arr[tolower(ch) - 'a'] += 1;//由于是不区分大小写,所以要用tolower将大写英文字符转换成小写英文字符 } } for (int i = 0; i < ARSIZE; i++) { printf("%c=>%d\n", i+'a', arr[i]); } printf("\n"); return 0; }
4)统计字符串中每个英文字符出现的次数, 区分大小写,只统计英文字符。
#include<stdio.h> #include<stdlib.h> #include<ctype.h> #define ARSIZE 26 int main() { int arr[ARSIZE] = { 0 }; int brr[ARSIZE] = { 0 }; char ch; while ((ch = getchar()) != EOF) { if (isalpha(ch)) { if (islower(ch)) { arr[ch - 'a'] += 1; } if (isupper(ch)) { brr[ch - 'A'] += 1; } } } for (int i = 0; i < ARSIZE; i++) { printf("%c=>%d\n", i + 'a', arr[i]); } for (int i = 0; i < ARSIZE; i++) { printf("%c=>%d\n", i + 'A', brr[i]); } printf("\n"); return 0; }
-
【C语言】顺序表,数组
2021-05-24 05:37:18顺序表的搭建,就是一个本身的结构,利用的是数组,开辟的内存空间大小是固定的。没有链式结构那样的开辟空间的可控性。最基本的数据结构认知。然后我们来看看数据结构中的基本实现和思想:#include"seqList.h"#...顺序表的搭建,就是一个本身的结构,利用的是数组,开辟的内存空间大小是固定的。没有链式结构那样的开辟空间的可控性。最基本的数据结构认知。
然后我们来看看数据结构中的基本实现和思想:
#include "seqList.h"
#include
#include
//顺序表的初始化
void InitSeqList(SeqList* seq)
{
int _index = 0;
assert(seq);
for(;_index
{
seq->_array[_index] = 0;
}
seq->_size = 0;
}
//打印顺序表
void PrintSeqList(SeqList* seq)
{
int _index = 0;
assert(seq);
if(0 == seq->_size)
{
printf("顺序表没有数据\n");
return;
}
for(;_index_size;++_index)
{
printf("%d ",seq->_array[_index]);
}
printf("\n");
}
//尾部插入
void PushBack(SeqList* seq, DataType x)
{
int _CheckSeq;
assert(seq);
if(1 == (_CheckSeq = CheckSeqList(seq)))
{
printf("顺序表已满");
return;
}
seq->_array[seq->_size++] = x;
}
//尾部删除
void PopBack(SeqList* seq)
{
int _CheckSeq;
assert(seq);
if(0 == (_CheckSeq = CheckSeqList(seq)))
{
printf("顺序表为空\n");
return;
}
seq->_array[--seq->_size] = 0;
}
//头部插入
void PushFront(SeqList* seq, DataType x)
{
int _index = 0;
int _CheckSeq;
assert(seq);
if(1 == (_CheckSeq = CheckSeqList(seq)))
{
printf("顺序表已满");
return;
}
for(;_index _size;++_index)
{
seq->_array[seq->_size-_index] = seq->_array[seq->_size - _index - 1];
}
seq->_array[0] = x;
seq->_size++;
}
//头部删除
void PopFront(SeqList* seq)
{
int _index = 0;
int _CheckSeq;
assert(seq);
if(0 == (_CheckSeq = CheckSeqList(seq)))
{
printf("顺序表为空\n");
return;
}
for(;_index_size-1;++_index)
{
seq->_array[_index] = seq->_array[_index+1];
}
seq->_size--;
}
//插入操作
void Insert(SeqList* seq, size_t pos, DataType x)
{
int _index = seq->_size;
int _CheckSeq;
assert(seq);
if(1 == (_CheckSeq = CheckSeqList(seq)))
{
printf("顺序表已满");
return;
}
if(pos seq->_size)
{
printf("修改位置超出边界");
return;
}
for(;_index > pos;--_index)
{
seq->_array[_index] = seq->_array[_index - 1];
}
seq->_array[pos] = x;
seq->_size++;
}
//寻找。
// 返回-1表示未找到数据
int Find(SeqList* seq, DataType x)
{
int _endIndex = 0;
assert(seq);
for(; _endIndex _size;++ _endIndex)
{
if(x == seq->_array[_endIndex])
{
return _endIndex;
}
}
return -1;
}
//擦除输入坐标的数据
void Erase(SeqList* seq, size_t pos)
{
int _index = pos;
assert(seq);
if(pos seq->_size)
{
printf("修改位置超出边界");
return;
}
for(;_index _size-1;++_index)
{
seq->_array[_index] = seq->_array[_index+1];
}
}
//移除查找到的第一个函数
void Remove(SeqList* seq, DataType x)
{
int _pos = 0;
int _index = -1;
for(;_pos _size;++_pos)
{
if(x == seq->_array[_pos])
{
_index = _pos;
break;
}
}
if(-1 != _index)
{
for(;_index _size - 1;++_index)
{
seq->_array[_index] = seq->_array[_index + 1];
}
seq->_size--;
}
else
{
printf("没有这个数");
}
}
//移除所有查询到的数据,这个算法比较优质。直接移动替换。
void RemoveAll(SeqList* seq, DataType x)
{
int _pos = 0;
int _index = 0;
for(;_pos _size;++_pos)
{
if(x != seq->_array[_pos])
{
seq->_array[_index] = seq->_array[_pos];
_index++;
}
}
}
//修改函数。
void Modify(SeqList* seq, size_t pos, DataType x)
{
assert(seq);
if(pos seq->_size)
{
printf("修改位置超出边界");
return;
}
seq->_array[pos] = x;
}
int CheckSeqList(SeqList *seq)
{
if(MAX_SIZE == seq->_size)
{
return 1;
}
if(0 == seq->_size)
{
return 0;
}
}
就这么多了。其实就是一些简单的数据结构的基本思维。增删改插的基本思维。
-
ntc 测温 单片机 C语言 查表 表格 温度系数表 计算公式
2021-05-22 16:01:35一般大家都会查表,其实不用查表也可以计算,看下面2个公式就直接搞定了://g_shunt_dat.tmp_val[1]=(float)((1/(log(g_shunt_dat.r_val[1]/10000.0)/3950.0+1/(25.0+273.15))-273.15)*10+0.5);//10kg_shunt_dat.tmp...一般大家都会查表,其实不用查表也可以计算,看下面2个公式就直接搞定了:
//g_shunt_dat.tmp_val[1]=(float)((1/(log(g_shunt_dat.r_val[1]/10000.0)/3950.0 + 1/(25.0+273.15))-273.15)*10+0.5); // 10k
g_shunt_dat.tmp_val[1]=(float)(1/(log(g_shunt_dat.r_val[1]/100000.0)/3950.0 + 1/(25.0+273.15))-273.15+0.5); // 100k
怎么样,不用老去找什么表格了吧?跟600块钱的fluke万用表实测对比要高1.2度左右
。
不过呢,我也找到一个excel的表格数据,大家拿去happy吧,10k、100k的:
如果查表呢就要考虑到速度,这个兄弟介绍了一个二分法,参考一下:
==============有朋友问那上面的表达式是什么含义,我这里放上来==================
Rt = R *EXP(B*(1/T1-1/T2))
这里T1和T2指的是K度即开尔文温度,K度=273.15(绝对温度)+摄氏度;其中T2=(273.15+25)
Rt 是热敏电阻在T1温度下的阻值,根据电路求得;
R是热敏电阻在T2常温下的标称阻值,跟厂家要;
B值是热敏电阻的重要参数,跟厂家要;
EXP是e的n次方;
所以求T1的公式就是上式。
本文为3YL原创,转载无需联系,但请注明来自labisart.com。
原创文章不易,如果觉得有帮助,可打赏或点击右侧广告支持:
-
嵌入式C语言查表法在项目中的应用
2020-12-26 09:40:35嵌入式C实战项目开发技巧:对一个有规律的数组表进行位移操作的方法 就像下面的这个表 之前写过上面这个标题的一篇文章,讲的是以位移的方式去遍历表中的数据,效率非常高,但是,如果要实现一个乱序的流水灯或者... -
C语言二维数组超细讲解
2021-05-22 15:41:10用一维数组处理二维表格,实际是可行的,但是会很复杂,特别是遇到二维表格的输入、处理和输出。在你绞尽脑汁的时候,二维数组(一维数组的大哥)像电视剧里救美的英雄一样显现在你的面前,初识数组的朋友们还等什么呢... -
闰年与数组查表法
2021-04-10 23:22:463.数组查表法的应用 里面包含了函数的升级,函数从繁琐变得短小精悍 #include<stdio.h> bool Is_Leap(int year) { if (year % 4 == 0 && year % 100!=0||year % 400 == 0) { return true; } ... -
c语言数组部分(1)
2021-10-25 10:42:001.数组的概述 数组是包含给定类型的一组数据,并将这些数据存储在连续的内存空间,每个独立的数据被称为数组的元素。元素的类型可以是任意类型=>数组的类型由元素的数量和类型决定 1.1一维数组的初始化和定义... -
c语言--查表法
2021-05-26 21:25:21定义大小为100的整型数组,使用随机函数给数组元素赋值。数值范围1…100,并且排序,使用冒泡排序实现。 我们可以将其再分开实现,先给数组赋值,然后再用冒泡排序给它排个序就欧克了。 void Print(int* br, int n) ... -
单片机中用C语言查表和移位问题
2021-05-24 02:00:08第一个是查表法比方说我有三个数据char code table={0x01,0x02,0x03}分别对应0xa,0xb,0xc,请问如何用C语言实现查表找到对应的值呢?请给位大虾写出具体的语法实现,要简洁明了。第二个问题是:比方说我有一数据 ... -
C语言知识点速查表
2021-05-22 14:22:53常量不可被修改哪些是合法的字符常量变量命名怎样才是合法的C语言中对大小写敏感,所以A和a可以命名不同的变量基本数据类型类型包括输入输出时使用备注字符型char%c %s(字符串/字符数组)本质上... -
C语言数组之冒泡排序+折半查找法(二分查找)
2021-05-20 17:14:46数组查找算法的C语言 实现-----线性查找和二分查找 线性查找 Linear Search 用户输入学生学号的成绩 二分查找 Binary Search 要求数据表是已经排好序的 程序存在小的瑕疵 jvascript 顺序查找和二分查找法 第一种:... -
C语言从数组查找元素!//查表功能
2020-11-02 17:00:10C语言从数组查找元素!//查表功能 #include<stdio.h> //查表 int main(){ int length; int data[]={11,33,55,7,78,889,9,66,0,99,22,888,880}; length=sizeof(data)/sizeof(data[0]); int can; printf... -
使用C语言的查表和移位实现简单流水灯
2021-05-24 23:46:48使用C语言的查表和移位实现简单流水灯1.查表2.移位 1.查表 其实就是建立一个数组,只是code表示这个表存储在单片机ROM中。 /*建立表格*/ uchar code seg[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; //... -
二维数组中的查找(C语言实现)
2018-03-07 21:11:36题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思考:在这个二维数组的每一... -
C语言day07-15进制查表法
2021-05-19 12:23:19定义一个数组,用于保存十六进制中所有的取值 // 规律:取出的4个二进制位得到的值,正好是数组中角标对应的值 char charValue[] = {'0','1','2','3','4','5','6','7','8', '9','a','b','c','d','e','f'}; // 表 装了是... -
二维数组的查找(C语言)
2020-09-16 16:52:44#include <stdio.h> #include <stdlib.h> #include <stdbool.h>... * 参数1:矩阵数组 * 参数2:行 * 参数3:列 * 参数4:要查找的元素*/ bool Find(int* matrix, int rows, int colum -
C语言之二维数组(示例代码)
2021-05-21 11:29:00二维数组及其指针1 ) 在了解二维数组之前,我们先来了解一维数组及其指针我们知道,一维数组中:数组名代表-->数组首元素的首地址(千万不要认为是数组的首地址(&a),绝对不是)在内存中,该代码的表现形式如下... -
C语言查表设计和指针的指针
2022-01-05 17:43:47最近在做一个控制器项目,在控制器开发过程中遇到一个动态查表的问题,需要采集传感器的值,通过判断传感器值所在区间来获取相关的阈值,这样就可以为后续代码提供动态阈值。 问题描述: 这里遇到的问题是内存... -
【C语言】二分查找求数组下标
2022-04-23 19:42:28有n个数存放在一个数组a[]中,输入一个数k,要求用折半查找求出k是数组中第几个元素的值,求该元素的下标;若k不属于数组中任何一个元素,则输出“None”。 方法一:不利用函数利用数组循环等求下标 #include<... -
剑指offer:二维数组中的查找(C语言)
2018-10-29 23:17:55题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一行都按从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判读数组中是否含有该整数。 分析:首先想到的是遍历整个数组... -
多级菜单(C++)
2019-10-03 22:49:15这个我没去尝试它的功能,所以不是很清楚具体情况,代码我放到这里,感兴趣的就看看,同样需要建一个项目,因为要用到一些学生的信息,需要外界导入。 #include<iostream> #include<... -
C语言 数组
2016-01-14 18:50:46- 在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。 >+ 注意:只能存放一种类型的数据 - 数组的几个名词 +数组:一组具有相同数据类型的数据的有序... -
用C语言储存数组后读取失败
2021-05-24 02:31:51#include#include#includeint main(){int a[10][10];srand(time(NULL));int i,j;for(i=0;i<10;i++){for(j=0;j<10;j++){a[i][j]=rand()%10;printf("%d\t",a[i][j]);}printf("\n");...FILE *fp=fopen... -
C语言以指针数组的方式实现map
2021-10-15 12:25:06最近在Linux内核中看到一种指针数组的写法,实现了类似“键值对”的功能,代码非常精炼。 首先回顾一下函数指针的定义方式: int(*func)(int, int); // 定义 func = addr; // 赋值 int x = func(a, b); // 调用 ... -
【C语言编程】找出数组中重复的数字
2019-08-27 17:05:00找出一个数组中重复的数字,例如数组{2,3,1,0,2,5,3},重复数字为2和3 思路: 使用两次for循环,第一次循环是用来遍历数组中的每个元素,第二次循环是用来遍历是否有相同的元素 源码: 运行结果如下: ... -
c语言.jpg图片转成数组_C语言基础知识归纳总结(干货)
2020-10-21 22:02:02C语言深度挖掘笔记摘要数据类型基本数据类型类型名称说明char字符类型存放字符的ASCII码int整型存放有符号整数short短整型存放有符号整数long长整型存放有符号整数long long存放有符号整数float单精度浮点型存放精度... -
51单片机查表指令的用法
2021-05-21 09:19:1951单片机具有两条查表指令,用于从 ROM 中读出预存的数据:MOVC A, @A + PCMOVC A, @A + DPTR其中前一条指令的用法,比较难,使用的时候,需要计算一个“偏移量”。不了解“指令的字节数”的人,都不清楚应该如何...