Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检测一组值的变化_C - Fatal编程技术网

C 检测一组值的变化

C 检测一组值的变化,c,C,我有一个项目,其中一个程序接受许多整数值,并检测这些数值之间的变化。只接受一个不同于其他值的值,并且只接受一次。当一个错误被识别出来时,比如10 12 13…,程序需要立即停止,而不是获取其他值 e.g: 10 10 10 10 10 18 10 10 10 这是一个可接受的数据输入,因为18只使用一次,并且是唯一不同的值 e.g: 10 10 14 17 10 10 10 10 这不是可接受的数据输入,因为使用了3个不同的值 e.g: 10 10 10 10 12 12 12 12 12

我有一个项目,其中一个程序接受许多整数值,并检测这些数值之间的变化。只接受一个不同于其他值的值,并且只接受一次。当一个错误被识别出来时,比如10 12 13…,程序需要立即停止,而不是获取其他值

e.g: 10 10 10 10 10 18 10 10 10
这是一个可接受的数据输入,因为18只使用一次,并且是唯一不同的值

e.g: 10 10 14 17 10 10 10 10
这不是可接受的数据输入,因为使用了3个不同的值

e.g: 10 10 10 10 12 12 12 12 12
这也是不可接受的数据输入,因为10和12被多次使用


我只是无法为这一点创建一个算法,涵盖这3种甚至更多的情况。有什么想法吗?

我能想到的最简单的算法是计算你看到这两个不同值的次数。假设
input
是一个大小为
input\u size
的数组,当序列更改过多时,此函数返回
0
,如果检测到一个或零个更改,则返回
1

int isvalidsequence(const int *input, int input_size)
{
    int item1, item2;
    int seen1 = 0, seen2 = 0;

    for (int i = 0; i < input_size; ++i)
    {
        int item = input[i];
        if (seen1 == 0)
        {
            item1 = item;
            ++seen1;
        }
        else if (item == item1)
        {
            ++seen1;
        }
        else if (seen2 == 0)
        {
            item2 = item;
            ++seen2;
        }
        else if (item == item2)
        {
            ++seen2;
        }
        else
        {
            return 0;
        }

        /* Exit loop early if we've already seen both characters more than once */
        if (seen1 > 1 && seen2 > 1)
            return 0;
    }
    return 1;
}
int-isvalidsequence(常量int*input,int-input\u size)
{
int第1项、第2项;
int seen1=0,seen2=0;
对于(int i=0;i1&&seen2>1)
返回0;
}
返回1;
}

它存储它看到的第一个不同项和第二个不同项,然后开始计算每次看到的次数。如果它随后找到第三个不同的项,则序列更改过多。如果它发现第一个和第二个不同的项目都被多次看到,那么序列也发生了太多的变化。否则,这两个项目中至少有一个被看到了0或1次,因此序列是有效的。

我能想到的最简单的算法是计算你看到这两个不同值的次数。假设
input
是一个大小为
input\u size
的数组,当序列更改过多时,此函数返回
0
,如果检测到一个或零个更改,则返回
1

int isvalidsequence(const int *input, int input_size)
{
    int item1, item2;
    int seen1 = 0, seen2 = 0;

    for (int i = 0; i < input_size; ++i)
    {
        int item = input[i];
        if (seen1 == 0)
        {
            item1 = item;
            ++seen1;
        }
        else if (item == item1)
        {
            ++seen1;
        }
        else if (seen2 == 0)
        {
            item2 = item;
            ++seen2;
        }
        else if (item == item2)
        {
            ++seen2;
        }
        else
        {
            return 0;
        }

        /* Exit loop early if we've already seen both characters more than once */
        if (seen1 > 1 && seen2 > 1)
            return 0;
    }
    return 1;
}
int-isvalidsequence(常量int*input,int-input\u size)
{
int第1项、第2项;
int seen1=0,seen2=0;
对于(int i=0;i1&&seen2>1)
返回0;
}
返回1;
}

它存储它看到的第一个不同项和第二个不同项,然后开始计算每次看到的次数。如果它随后找到第三个不同的项,则序列更改过多。如果它发现第一个和第二个不同的项目都被多次看到,那么序列也发生了太多的变化。否则,两个项目中至少有一个已被查看0或1次,因此序列是有效的。

执行插入排序,检查(1)是否已存在特定值的重复项,以及(2)是否存在重复项。只要插入排序添加唯一值,就继续处理。一旦发现一个非唯一值,设置一个标志,以便在发现另一个非唯一值时停止处理。如何“接受”输入?它是否存储在数组中?它是从键盘读取还是从文件读取而不存储?第一个值总是参考值吗?从何处获取值?还在排队吗?读取它们?正在从键盘读取值。遗憾的是,如果是这样的话,就没有参考值。数据的顺序在目标数组中重要吗?执行插入排序,检查(1)是否已经存在特定值的副本,以及(2)是否存在副本。只要插入排序添加唯一值,就继续处理。一旦发现一个非唯一值,设置一个标志,以便在发现另一个非唯一值时停止处理。如何“接受”输入?它是否存储在数组中?它是从键盘读取还是从文件读取而不存储?第一个值总是参考值吗?从何处获取值?还在排队吗?读取它们?正在从键盘读取值。遗憾的是,如果是这样的话,就没有参考值了。数据的顺序在目标数组中重要吗?我已经编写了原始的比较字符,而它应该是整数,就像您的情况一样。修复了用于比较整数的代码/文本。请注意,如果数组可以很长,则可以通过存储所有数字(即,在静态变量中)来防止重新检查所有数字,并仅更新新值的内容。当然,它需要一个“重新初始化”命令,才能用新的值序列重新启动。@hexasoft在需要此类功能时,将其扩展到模块会很有趣。我已经编写了原始的比较字符,而它应该是整数,就像您的情况一样。修复了用于比较整数的代码/文本。请注意,如果数组可以很长,则可以通过存储所有数字(即,在静态变量中)来防止重新检查所有数字,并仅更新新值的内容。当然,它需要一个“重新初始化”命令,才能用新的值序列重新启动。@hexasoft it wo