算法的重要性
已经学了一段时间的C语言,开始慢慢接触linux开发基础(初学者)下面分享一下我这两天遇到的一些问题以及解决办法
。
屏幕检测
上周接触了6818开发板,学了图片传输以及显示还有屏幕检测(就是传输坐标)于是就想着,要不自己写一个屏幕锁(现在手机的触屏解锁)
我是用了2种方法来做这个屏幕键盘
第一种:
int X,Y;
int keyvalue; //接收键值
if (X>252 && X<333 && Y>116 && Y<196)
k=1;
else if(X>361 && X<442 && Y>116 && Y<196)
k=2;
else if(X>469 && X<550 && Y>116 && Y<196)
k=3;
else if(X>252 && X<333 && Y>209 && Y<290)
k=4;
else if(X>361 && X<442 && Y>209 && Y<290)
k=5;
else if(X>469 && X<550 && Y>209 && Y<290)
k=6;
else if(X>252 && X<333 && Y>304 && Y<384)
k=7;
else if(X>361 && X<442 && Y>304 && Y<384)
k=8;
else if(X>469 && X<550 && Y>304 && Y<384)
k=9;
else if(X>361 && X<442 && Y>398 && Y<478)
k=0;
else if(X>485 && X<536 && Y>420 && Y<449)
k=-1;
可以说是最笨的方法了,一个一个划定好指定范围,但是代码长度不说,虽然代码明了是够明了了,但是不够简单。难道我以后加一个键位,就要继续重新加一个新的范围判定了吗?那肯定不行,这样太费时费力了。
并且不知道什么原因(目前还没找到),连续按删除键(-1),会出现bug,输出值是一长串没有规律的数组,貌似把0-9全都输出出来了。
第二种
后面我想起来自己以前学校比赛的时候写过的密码键盘(基于51单片机),用运算来“找到键位值”。
计算公式:((X - x)/(80+27)):(Y - y)/(80+10)-1
说一下思路:首先我们可以确定不变的值有:键长,键宽,键位间隔。
假定键长键宽均为80,X轴间隔27,Y轴间隔10
x是x轴的初始值,y是y轴的初始值;X,Y分别是触摸的实际值
初始值是用来帮助我们缩小计算范围用的,因此初始值其实也是一个不变的值,只不过需要通过计算来获取:
到这里不难看出,这个方法其实是通过寻找坐标与键长关系来计算出键位值,(实际值-初始值)/(键长/宽+间隔长度)=键位值
初始值计算:与第一个键位的最前范围:比如1的范围是250-330,键长是80,那初始值与250的间距必定不能超过80也就是初始值必须要大于170,(整型运算只会返回整数部分)如果小于170,那么再1的范围内,沃恩有可能会输出到2,不符合我们的标准,加上间隔主要是为了拓展键宽,(我还没找到如何用算法实现间隔无效化)因此就把间隔对半分给了两个按键。
代码如下:
int X,Y;
int keyvalue; //接收键值
int x = 157, y = 30; // 键位检测初始值设定
keyvalue = (X - x)/(80+27); //检测行
keyvalue += ((Y - y)/(80+10)-1)*3; //检测列
Y轴从第二列开始比上一列+3;
没错,就三行代码,而且虽然无法实现间隔,但是基本功能实现了,并且返回的键值可以再后续随意添加功能。同时也缩小了代码进程。
第三种
这种方法是老师教的,将第一与第二中方法结合起来了
但又不完全相同,利用了二维数组,具体代码如下:
大家自己看把,就不细说了
int func_pwd(void)
{
char input_ch;
char passwd_arr[4][3] = {{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'e', '0', 'd'}}; //密码盘
int i_pos=0;
while(1)
{
// 3.检测触摸屏
struct input_event ts_buf;
int n=0;
while(1)
{
bzero(&ts_buf, sizeof(ts_buf));
read(ts_fd, &ts_buf, sizeof(ts_buf));
if(ts_buf.type == EV_ABS)
{
if(ts_buf.code == ABS_X)
{
X = ts_buf.value*(800/1024);
n++;
}
if(ts_buf.code == ABS_Y)
{
Y = ts_buf.value*(8/10);
n++;
}
}
if(n==2)
break;
}
// printf("(%d, %d)\n", X, Y);
// 4.判断用户点击
if(pos_x>200&& pos_x<=800) //x:0-599 y:0-479
{
input_ch = passwd_arr[pos_y/120][(pos_x-200)/200];
}
总结
编程讲究的是逻辑,而运算就是简化逻辑思维的重要途经,上描述三个方法是最好的例子,第一种方法(本人初学很菜)逻辑是有的,而且很“耿直”,很直接,直来直去,虽然完成了目标功能,但是后续需求添加是一件麻烦的事情,也会导致代码长度越来越长,且不利于封装,影响程序美观,也体现不出来思维性。
第二第三种运用算法简化代码,优化功能,而且也给后续拓展留了足够的空间。
可见算法的重要性(妈妈再也不用担心我不学数学啦)
~
刚学接近一个月,各个方面还不够熟练,代码整洁与习惯还没有养好,有什么纰漏欢迎大家指出,在此也希望得到大佬们的指点与建议(因为目前学的很迷茫,没有一个明确的计划)
小白一枚,正在为成为一个标准的程序员努力