注册 登录
编程论坛 C语言论坛

循环语句和条件语句嵌套,还需要跳出循环

初学者_123 发布于 2022-07-06 21:27, 1385 次点击
我的数据矩阵第2:最后一列由1和-1,0,第一列是时间的数据,其余每一列代表一次模拟,0只在矩阵的后面出现,1代表一种状态,-1代表另一种状态,系统在开始时,处于1状态,一段时间后切换为-1,假设当-1这种状态能最少保持20个时间节点,就认为状态切换成功。
我需要解决的问题是:统计每次模拟的切换次数


这里,我编造了一个12*4的矩阵,假设从1切换为-1,且-1这种状态最少保持3个时间节点,就认为状态切换成功。



0.5 1 -1 -1 1;
1 1 -1 -1 1;
1.5 -1 -1 -1 1;
2 -1 -1 1 1;
2.5 -1 -1 1 -1;
3 -1 1 1 1;
3.5 1 1 1 1;
4 1 1 -1 1;
4.5 -1 1 -1 1;
5 -1 1 -1 1;
5.5 -1 1 -1 1;
6 -1 1 -1 1;

针对上面的矩阵,该如何设置程序统计切换次数,自己试过很多次,都不行
        
7 回复
#2
rjsp2022-07-06 21:35
看了三遍,听不懂
#3
初学者_1232022-07-07 08:19
回复 2楼 rjsp
可能是我没解释清楚,例子中假设时间区间[0,6],时间步长为0.5,,数据的第一列为时间节点,其余每一列代表一次模拟的数据,真实数据是随机模拟的结果,因此需要通过多次模拟发现规律。
为了简化处理,用1和-1代表两种不同的状态,系统会在两种状态之间切换,由于随机因素的存在,并不是从1变为-1就视为切换成功,它必须维持在切换后的状态至少1.5秒(假设),才视为切换成功。

即切换成功需要两个条件:(1)从1变为-1(或从-1变为1);(2)维持在切换后的状态至少1.5秒。
 
问题:现在,以例子中的数据编程,统计在每次模拟(即每列数据)中的切换次数

正确答案是:2 1 2 0
#4
rjsp2022-07-07 09:50
以下是引用初学者_123在2022-7-7 08:19:54的发言:
正确答案是:2 1 2 0


第二列数据{ +1, +1, -1, -1, -1, -1, +1, +1, -1, -1, -1, -1 } ------ 为什么你说答案是2呢?题目中说过“系统在开始时,处于1状态”,因此状态变化是 +1 -1
第三列数据{ -1, -1, -1, -1, -1, +1, +1, +1, +1, +1, +1, +1 } ------ 为什么你说答案是1呢?题目中说过“系统在开始时,处于1状态”,因此状态变化是 +1 -1 +1
第四列数据{ -1, -1, -1, +1, +1, +1, +1, -1, -1, -1, -1, -1 } ------ 为什么你说答案是2呢?题目中说过“系统在开始时,处于1状态”,因此状态变化是 +1 -1 +1 -1
第五列数据{ +1, +1, +1, +1, -1, +1, +1, +1, +1, +1, +1, +1 } ------ 为什么你说答案是0呢?题目中说过“系统在开始时,处于1状态”,因此状态变化是 +1
#5
初学者_1232022-07-07 16:02
回复 4楼 rjsp
早上有点而事,刚看见消息,回复晚了,不好意思。

真实数据在开始时确实都是1,我编造的例子不严谨,sorry,,本来想体现是四次模拟的切换次数不同,结果编的数据与文字描述矛盾了,再重新编一组数据:
第一列数据{+1, +1, +1, -1, -1, +1, +1, +1, -1, -1, -1, -1}
第二列数据{+1,+1,+1,+1,-1,-1,-1,+1,+1,+1,+1,+1}
第三列数据{+1,+1,+1,-1,-1,-1,-1,-1,+1,+1,+1,+1}
第三列数据{+1,+1,+1,+1,-1,-1,-1,-1,-1,-1,-1,-1}

正确答案是1,2,3,1。
以这个为例,该如何编程序,大神
#6
rjsp2022-07-07 16:04
第一个是1的话,那最后一个为什么还是1呢?明明最后一个比第一个少一次。

[此贴子已经被作者于2022-7-7 16:20编辑过]

#7
rjsp2022-07-07 16:21
程序代码:
#include <stdio.h>

void count_chang( const int datas[][4], size_t length, size_t counts[] )
{
    for( size_t c=0; c!=sizeof(*datas)/sizeof(**datas); ++c )
    {
        counts[c] = 0;
        int state = +1;
        size_t n = 0;
        for( size_t r=0; r!=length; ++r )
        {
            if( datas[r][c] == state )
                n = 0;
            else
            {
                ++n;
                if( n == 3 )
                {
                    ++counts[c];
                    state = datas[r][c];
                    n = 0;
                }
            }
        }
    }
}

int main( void )
{
    int datas[][4] = { { +1, -1, -1, +1 }
                     , { +1, -1, -1, +1 }
                     , { -1, -1, -1, +1 }
                     , { -1, -1, +1, +1 }
                     , { -1, -1, +1, -1 }
                     , { -1, +1, +1, +1 }
                     , { +1, +1, +1, +1 }
                     , { +1, +1, -1, +1 }
                     , { -1, +1, -1, +1 }
                     , { -1, +1, -1, +1 }
                     , { -1, +1, -1, +1 }
                     , { -1, +1, -1, +1 } };

    size_t counts[ sizeof(*datas)/sizeof(**datas) ];
    count_chang( datas, sizeof(datas)/sizeof(*datas), counts );

    for( size_t i=0; i!=sizeof(counts)/sizeof(*counts); ++i )
        printf( "Coloumn %zu, statu change count: %zu\n", i+1, counts[i] );

    return 0;
}
#8
初学者_1232022-07-07 16:29
回复 5楼 初学者_123
第一列数据是{+1, +1, +1, -1, -1, +1, +1, +1, -1, -1, -1, -1},在第四个时间节点是1是变为-1,但它只坚持了1秒(两个时间步长),不能算一次成功的切换,我上面写过,一次成功地切换必须满足两个条件:(1)状态从变为-1(或从-1变为1);(2)在切换后的状态至少维持1.5秒(即至少维持3个时间步长)。
也是因为真实数据有这个特点,所以需要满足这两个条件。可能我错误太多了,您忘记这一点了
1