any012 发表于 2019-1-28 17:08:57

如何计算一个数组里的最大值,并且知道序号。

请教个问题,现在我有4路报警信息,存放到了一个数组里,比如是alarm,其中每一路的报警等级分为4等吧。
而现在我需要一个总的报警等级,总的报警等级是各路报警等级里的最高值,并且还要判断出来是那一路,进而进行报警处理。
我现在是做了4个for循环,第一个for循环里判断各路报警等级是不是有1,如果有1的话,则置总报警等级为1,第二个for循环判断各路报警等级里是不是又2,如果有2的话,则置总报警等级为2...
这样做能实现想要的功能,但是觉得有些繁琐。
请教下,有什么好的方法来计算下?
冒泡法排序?感觉也挺麻烦的。

子曰好人 发表于 2019-1-28 17:08:58

用一个临时变量去赋值和比较咯
int i;
int tmp;
int ch;
tmp =alarm;
for(i=0;i<4;i++)
{
if(tmp <=alarm)
{
tmp = alarm;
ch=i;
}
}

radio2radio 发表于 2019-1-28 17:55:16

本帖最后由 radio2radio 于 2019-1-28 17:58 编辑

如果有alarm的源头,好办。
设两个变量,比如叫alarmMax和alarmMXno,在存入alarm[]的任何一个值的时候,比较一下alarmMax,只要大于它就同时存入它和编号。适当的时候清零。

如果只能后期查询,也是一个for循环就够了,留取最大值和编号。而不是比较1,比较2,,,,

radio2radio 发表于 2019-1-28 18:05:10

楼主小心,如果有两路或以上同时为最大(相等),你怎么分?

hujjj 发表于 2019-1-28 18:08:31

一个循环足够了,用一个变量来保存最大等级的,如果还需要知道最大等级是哪路的,则再添加一个变量就行。等级变量开始置最低值,每次循环进行比较,若等级高则保留相关数据,循环结束后这个变量就是最高的等级。

stm1024 发表于 2019-1-28 21:44:00

看样子题主偏向于搞硬件的?

any012 发表于 2019-1-29 09:08:43

谢谢各位的回复。

我一开始是写了5个for循环,依次判断数组里的数是否是0、1、2、3、4;
现在改了下,弄成两层for循环了,外层for循环是0-4,里层for循环判断数组。
想了想,这样其实和以前一样,只是写法上简洁了些。
   for (i = 0; i < 5; i++)
    {
      for (j = 0; j < CHANNEL_NUMBER; j++)
      {
            if (alarm == i)
            {
                alarmLevel = i;
                if (4 == alarmLevel)
                {
                  OpenYout(j);
                }
            }
      }
3楼的朋友给的代码感觉挺好的,一会试下。

子曰好人 发表于 2019-1-29 09:18:05

本帖最后由 子曰好人 于 2019-1-29 09:19 编辑

回复5楼
@stm1024
老哥吓得我赶紧去验证了一下代码,应该没有你说的那个bug,不过有另外的bug,当数组的值是相同的时候ch是最后一个,还需另外处理



any012 发表于 2019-1-29 10:10:14

stm1024 发表于 2019-1-28 21:44
看样子题主偏向于搞硬件的?

相对来说,画板子多点,编程经验少些。

stm1024 发表于 2019-1-29 10:14:59

any012 发表于 2019-1-29 10:10
相对来说,画板子多点,编程经验少些。

嗯,因为这个问题应该是一个非常简单的编程问题,其实你还要考虑的是,同时在两个通道出现故障等级相同的情况该如何处理。
页: [1] 2
查看完整版本: 如何计算一个数组里的最大值,并且知道序号。