打印

昨晚老大出个题目,让10分钟做完,结果我想了半个小时……

[复制链接]
4303|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ytfdhb|  楼主 | 2013-8-30 21:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ytfdhb 于 2013-8-30 21:05 编辑

昨晚老大出个题目,让10分钟做完,结果我想了半个小时……

题目是这样的:
    有四个按键,四个灯,
    KEY1 -- 电源开关,按下此键,电源灯亮,再按一下,所有灯灭
    KEY2 -- 亮灯键,按一下亮一下灯
    KEY3 -- 灭灯键,按一下灭一下灯
    LED0 -- 电源指示灯
    LED1-3 -- 指示灯,
    要求:先开的灯先灭,轮流上岗,比如,第1次,按下K2,则LED1亮,第二次按下K2则LED2亮,如果此时按下K3则应该LED1灭,如果再按下K1,则LED3应该亮,再按下K2则LED2灭,依次类推
       坛子里面的高手,说说你们的方法与思路,可以考虑冒泡法或队列,最好自己找个板子动手试一下,这个题目的意义就是,如果一个水池有四个水泵供水,则他们的使用寿命会比较平均……
       好了,高手们,开始吧,或许这对你来说只是个简单的逻辑问题哦^_^

相关帖子

沙发
ytfdhb|  楼主 | 2013-8-30 21:16 | 只看该作者
有没有做出来的,可否把代码贴出来共享一下俺也学习学习……

使用特权

评论回复
板凳
受不了了| | 2013-8-30 22:32 | 只看该作者
就纯粹的逻辑关系,又没啥速度要求,有啥花哨的

使用特权

评论回复
地板
sunhq02| | 2013-8-31 08:48 | 只看该作者
不明白这题目难点在哪里

使用特权

评论回复
5
xyz549040622| | 2013-8-31 10:48 | 只看该作者
算法上的逻辑,回去玩玩

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ytfdhb + 1
6
中军电子| | 2013-8-31 12:08 | 只看该作者
算是锻炼新手逻辑和兴趣的一题,楼主多练习,形成逻辑体系就快了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ytfdhb + 1 赞一个!
7
icecut| | 2013-8-31 12:15 | 只看该作者
没什么难度.又没有统计亮灯时间做规划.
应该这么说1-3,优先级1最高.相同亮灯时间先开优先级高的.
关灯键:将亮灯时间最长的灯关闭.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ytfdhb + 1
8
icecut| | 2013-8-31 12:19 | 只看该作者
本帖最后由 icecut 于 2013-8-31 12:21 编辑

两个四进制循环.亮灯就将下一个灭的点亮.灭灯就将下一个亮的关闭.全部亮就禁用亮灯键.全部灭就禁用灭灯键
电源键按一下,如果开就全关闭,如果关就点亮电源灯.

你们公司是做智能家居的吧?
你们老大的问题还是不实用.看起来是正确的.问题出在电源灯上.关机状态所有灯关闭,电源灯亮起.这样晚上很容易找到电源开关.开灯状态,电源灯关闭.因为开灯就更容易找到电源开关了.如果所有灯都不亮,肯定是跳闸了.

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
ytfdhb + 2 赞一个!
9
ytfdhb|  楼主 | 2013-8-31 17:36 | 只看该作者
icecut 发表于 2013-8-31 12:15
没什么难度.又没有统计亮灯时间做规划.
应该这么说1-3,优先级1最高.相同亮灯时间先开优先级高的.
关灯键:将 ...

是的,优先把亮灯时间长的熄灭,把熄灯时间长的打开……

使用特权

评论回复
10
江枫渔火| | 2013-8-31 19:06 | 只看该作者
做两个环。
一个点亮环,一个熄灭环。
两个环都只往一个方向轮动。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
ytfdhb + 2 赞一个!
11
ytfdhb|  楼主 | 2013-9-1 12:38 | 只看该作者
本帖最后由 ytfdhb 于 2013-9-1 12:45 编辑

不知道大家动手试了没有,下面是我当时写的,不知道大家有没有更好的方法,如果有,请交流一下,谢谢!
下面这段程序是在圈圈的51开发板上做的试验:
电路连线是这样的:
S1 - LED开灯键
S2 - LED关灯键
S3- 电源键
如果有板子的话可以试一下,俺是菜鸟,希望大家不要鄙视,但也请大家不要眼高手低,虽然是简单的题目,你不好好想一下,就不知道会有更好的方法,
我当时看这题目时也觉得没什么,可是越写逻辑越混乱,后来静下心来,慢慢整理了一下,才写出来的。我同事有用冒泡法写的,也不错,还有其它方法,
所以,我还是希望大家能想更多的解决办法,而不是一看这个题目就觉得没水平,解决这个小问题浪费时间,觉得在这个论坛问这个问题的人,就是弱智,我是来与大家讨论的,希望大家不要人身攻击,谢谢!
同时也希望,那些像我一样的菜鸟能多动动脑,多动动手,多思考思考看有没有更好的方法,谢谢!

顺便说一下,我做的时候多加了一个灯,效果是一样的!

//----------------------------------------------------------------------------------------------------------------------------------------------
// 存储亮灯的队列
unsigned char box[4] = {1,2,3,4};    // 就绪队列
unsigned char on_seq[4] = {0,0,0,0}; // 已开灯队列(完成队列)

// led_inc - 开灯键按下标志
// led_de  - 关灯键按下标志
// power_st - 电源按键标志
unsigned char led_inc,led_de,power_st;

//*********************************************************************
// 执行相关任务
//*********************************************************************
void on_off_deal( void )
{
   unsigned char seq_sum,item_swap;
   unsigned char i;

   // 系统电源按键
   if(power_st == TRUE){
      OnLed8();  // 打开power灯
   }
   else
   {
     led_all_off();   // 关闭所有的灯

     for(i=0;i<4;i++) // reset the state of leds
         {
       on_seq = 0;  // 开灯队列清空
       box = (i+1); // box 队列复位
       led_de = FALSE; // 开灯键无效
       led_inc = FALSE; // 关灯键无效
     }

         return;
   }

   // 开灯按键
   if((led_inc & power_st) == TRUE)
    {
        seq_sum = on_seq[0]+on_seq[1]+on_seq[2]+on_seq[3];
        if(seq_sum < 10)  // 检测是否全开,如果没有全开,则执行开的动作
        {
           item_swap = box[3];
           box[3] = box[2];
           box[2] = box[1];
           box[1] = box[0];
           box[0] = item_swap;

           // 点亮的灯入队列
           if(on_seq[3] == FALSE )
           {
             on_seq[3] = on_seq[2];
             on_seq[2] = on_seq[1];
             on_seq[1] = on_seq[0];
             on_seq[0] = item_swap;
           }

           led_sw(on_seq[0],TURN_ON); // 开灯,每次只开队尾的灯

         }

     }
     led_inc = FALSE; // 保证按键每次只执行一次

    // 关灯按键
    if((led_de&power_st) == TRUE)
    {
        seq_sum = on_seq[0]+on_seq[1]+on_seq[2]+on_seq[3];

        if(seq_sum >= 10)   // 如果开灯队列已满,关最先排在队头的
        {
            item_swap = on_seq[3];
            on_seq[3] = 0;
        }
        else
        {
                    if(seq_sum != 0)        // 如果开灯队列没有满,且不为空
                        {
                if(on_seq[2] != FALSE)
                                {
                    item_swap = on_seq[2];
                    on_seq[2] = 0;
                }
                else{
                    if(on_seq[1] != FALSE){
                        item_swap = on_seq[1];
                        on_seq[1] = 0;
                    }
                    else{
                        if(on_seq[0] != FALSE){
                            item_swap = on_seq[0];
                            on_seq[0] = 0;
                        }
                    }
                // 容错检测,以保证box队列中没有空位,将熄灭的灯,装入就绪队列
                if(box[0]==0){
                   if(box[1]==0){
                        if(box[2]==0){
                            if(box[3] == 0){
                                 box[3] = item_swap;
                              }
                              else{
                                box[2] = item_swap;
                              }
                           }
                           else{
                             box[1]=item_swap;
                           }
                       }
                       else
                       {
                         box[0]=item_swap;
                       }
                    }
                 }
                        }
        }

            led_sw(item_swap,TURN_OFF); // 执行关灯动作
   }

   led_de = FALSE; // 保证按键只执行一次

}


使用特权

评论回复
12
ytfdhb|  楼主 | 2013-9-1 12:43 | 只看该作者
icecut 发表于 2013-8-31 12:19
两个四进制循环.亮灯就将下一个灭的点亮.灭灯就将下一个亮的关闭.全部亮就禁用亮灯键.全部灭就禁用灭灯键
...

我们不是做智能家居的,我们是做空调的,这个题目的意义在于,如果有一个空调上有四个风机,那么它们使用的寿命会比较平均……

使用特权

评论回复
13
Simon21ic| | 2013-9-1 15:46 | 只看该作者
圆的FIFO

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
ytfdhb + 2 赞一个!
14
Simon21ic| | 2013-9-1 15:46 | 只看该作者
圆的FIFO

使用特权

评论回复
15
qqcaiyin| | 2013-9-2 11:05 | 只看该作者
4个2进制,0000,亮灯《-,灭灯-》

使用特权

评论回复
16
cubasa| | 2013-9-2 12:39 | 只看该作者
要寿命平均的话,定时切换四个风机不好么,并且自动统计每台风机运行总时间,作为风机寿命的参考。到一定时间还能提醒更换……
省得人工切麻烦,万一人工没切,会存在长时间运行同一台风机的可能。

使用特权

评论回复
17
lbj0052| | 2013-9-3 17:31 | 只看该作者
有点像循环队列

使用特权

评论回复
18
outstanding| | 2013-9-4 00:51 | 只看该作者

使用特权

评论回复
19
lanchong1980| | 2013-9-4 15:22 | 只看该作者
学习来了

使用特权

评论回复
20
ytfdhb|  楼主 | 2013-9-6 16:22 | 只看该作者
cubasa 发表于 2013-9-2 12:39
要寿命平均的话,定时切换四个风机不好么,并且自动统计每台风机运行总时间,作为风机寿命的参考。到一定时 ...

有时只开一台,有时要同时开多台,这个是根据个人需要调节的……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:爱我所爱,思我所思……

34

主题

517

帖子

1

粉丝