算法的重要性

算法的重要性

已经学了一段时间的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];
   }

总结

编程讲究的是逻辑,而运算就是简化逻辑思维的重要途经,上描述三个方法是最好的例子,第一种方法(本人初学很菜)逻辑是有的,而且很“耿直”,很直接,直来直去,虽然完成了目标功能,但是后续需求添加是一件麻烦的事情,也会导致代码长度越来越长,且不利于封装,影响程序美观,也体现不出来思维性。
第二第三种运用算法简化代码,优化功能,而且也给后续拓展留了足够的空间。

可见算法的重要性(妈妈再也不用担心我不学数学啦)

~
刚学接近一个月,各个方面还不够熟练,代码整洁与习惯还没有养好,有什么纰漏欢迎大家指出,在此也希望得到大佬们的指点与建议(因为目前学的很迷茫,没有一个明确的计划)

小白一枚,正在为成为一个标准的程序员努力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值