打印
[C语言]

在线紧急求助高手判断逻辑问题

[复制链接]
1875|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cl234583745|  楼主 | 2014-3-27 09:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 cl234583745 于 2014-3-27 09:25 编辑

abcdefgh8个数据,求判断条件以来分别对各种情况处理。
判断条件为:分别判断8个数据变量中分别有且仅有1.2.3.4.5.6.7个为0()的情况。

例如8个数据变量有且仅有3个为真的;
if( a==0 && b==0 && c==0 && d!=0 && e!=0 && f!=0 && g!=0 && h!=0 )//abc
{};
if(  a==0 && b==0 && c!=0 && d==0 && e!=0 && f!=0 && g!=0 && h!=0   )//abd
{};
这样的话就有C(8,3) = 56种情况,我要分别处理,

所有的情况就是C(8,1) C(8,2) C(8,3) C(8,4) C(8,5) C(8,6) C(8,7) ,  计算出来就相当多了,有没有更好的办法呢,能简化7中情况的,这7中情况不用展开,只要变量循环就好,处理函数也可以循环。

相关帖子

沙发
草民| | 2014-3-27 23:20 | 只看该作者
7个值相加,直接判断和不就知道有几个0了?

使用特权

评论回复
板凳
ayb_ice| | 2014-3-28 08:46 | 只看该作者
这不简单吗
U8 counter;

        counter = 0;
        if(!a){
                counter++;
        }
        if(!b){
                counter++;
        }
        ...
       
        switch(counter){
        case 0:
                break;
        ...
        case 8:
                break;
       
        }

使用特权

评论回复
地板
banalmaster| | 2014-3-28 10:45 | 只看该作者
只计算变量为0的个数时,楼上的程序可以;
另外提醒下楼主的代码是错误的,逻辑与前部分的表达式为0时不执行后面的语句。此乃“短路求值”。

使用特权

评论回复
5
cl234583745|  楼主 | 2014-3-28 11:46 | 只看该作者
ayb_ice 发表于 2014-3-28 08:46
这不简单吗
U8 counter;

你发的什么意思,我我没有看明白。
我的意思是比如 8个中有3个为0的情况,还要分别判断各种可能情况呢,因为要不同处理

使用特权

评论回复
6
ayb_ice| | 2014-3-28 12:19 | 只看该作者
这不简单吗
#define BIT0        (1<<0)
...
#define BIT7        (1<<7)

U8 counter;
U8 flag;

        counter = 0;
                flag = 0;
        if(!a){
                counter++;
                                flag |= BIT0;
        }
        if(!b){
                counter++;
                                flag |= BIT1;
        }
        ...
        
        switch(counter){
        case 0:
                break;
        ...
               
                case 3:                // 3个零
                        if(flag == 0b00000111){                // abc=0
                       
                        }
                        break;
                       
        case 8:
                break;
        
        }

使用特权

评论回复
7
cl234583745|  楼主 | 2014-3-28 15:08 | 只看该作者
ayb_ice 发表于 2014-3-28 12:19
这不简单吗
#define BIT0        (1

我明白你写的了,我写的也是哪个意思,只是你写的看起来有层次。
但我问的是说:case3就有56中 case4有70中,全部都列出来的却是能,但太麻烦了,一共有近200种呢?全部列出来,我试过了,flash都要不够用了,还很容易写错。我要的是简化。能否就7大种。里面的详细的,能否用个循环什么的来简化。

使用特权

评论回复
8
ayb_ice| | 2014-3-28 15:15 | 只看该作者
如果每种情况处理都是不同的,没有比这更高效的方法了

你那个代码就算了吧

使用特权

评论回复
9
十月风城| | 2014-3-29 09:07 | 只看该作者
你的目的:
1、判断8个数中0值的个数
2、对应0值的数也需要知道
解决思路:
1、用一个字节的每一位来表示不同的寄存器(Record_Byte)
2、用bit=1代表对应寄存器的值是0,用bit=0代表对应寄存器的值!0
3、用bit=1的总位数,代表8个寄存器中有几个是0

使用特权

评论回复
10
wolension| | 2014-3-29 17:31 | 只看该作者
如果每种情况处理都不同,那你就有255种不同的处理,这也是没办法的事。
我的想法跟楼上一样,整理一下,你看看。

u8 a[8];
u8 i,data;
data = 0;
for(i=0;i<8;i++)
{
        data <<= 1;
        if(a[i] != 0) data |= 1;
}
switch(data)
{
  //case 0: function(); break;  //8个0,不用处理。   
  case 1: function1(); break;  //
  case 2: function2(); break;  //       
  case 3: function3(); break;  //
  .
  .
  .
  case 254: function254(); break;  //
//case 255: function355();break;  //没有0,不用处理。
default:  function(); break;
}
  


其实我觉得你没讲清楚,你把要求讲出来,每种情况怎么个处理法,也许大家还能想到法子。

使用特权

评论回复
11
NE5532| | 2014-3-29 17:38 | 只看该作者
呵呵,楼主犯了低级错误,“有3个变量为零”的情况,需要区分是“哪三个”么?把8个变量遍历一次,对其中等于0的计数,就可以分出7个分支处理了三

使用特权

评论回复
12
cl234583745|  楼主 | 2014-3-31 09:48 | 只看该作者
ayb_ice 发表于 2014-3-28 15:15
如果每种情况处理都是不同的,没有比这更高效的方法了

你那个代码就算了吧 ...

最后只判断了 连续的情况,比如 12 234 4567 ,算一起也没有几种了。这样的基本都可以概括大多数情况了,其他的就不判断了

使用特权

评论回复
13
bald| | 2014-3-31 22:17 | 只看该作者
数据做一下预处理,把变量做成二值化的位变量,组合后调用函数数组。

使用特权

评论回复
14
liub_2014| | 2014-4-11 14:42 | 只看该作者
楼上的办法到时挺好的,是否可行还需看实际情况了。

使用特权

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

本版积分规则

99

主题

644

帖子

1

粉丝