c - 主循环设置什么参数

标签 c arrays algorithm for-loop numbers

好的,所以我有一个家庭作业问题,如下所示:从数组中生成对 (b, c),其中 b 是最小的偶数,c 是最大的。在输出中写入数字,将它们从数组中移除并继续循环,直到没有更多的偶数,或者数组为空。

编辑:如果只有 1 个偶数,同时将其输出为最大和最小数,以便最终数组没有偶数。

这是我现在所做的:

int a[100], b, c, n;
b = 9999999;
c = -9999999;

printf("Input array length: ");
scanf("%d", &n);
printf("Input elements of array: ");

for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
}

    for (int i = 0; i < n; i++) {
        if (a[i] < b && a[i] % 2 == 0)
            b = a[i];
    }

    for (int i = 0; i < n; i++) {
        if (a[i] > c && a[i] % 2 == 0)
            c = a[i];
    }

    printf("\n%d %d\n", b, c);

return 0;

我在开始时为 b 和 c 设置了荒谬的值,这样我 99% 确定数组中的数字会比这些值低/高(我试图将它们设置为 NULL,但没有)。所以我的问题是如何设置将循环直到没有偶数或数组为空的主循环?还有另一种方法可以初始化 b 和 c。

此外,为了删除偶数,我正在考虑做这样的事情:

for (int i = pos; i < n; i++) 
    a[i] = a[i+1];
n--;

其中 pos 是偶数元素的索引。

最佳答案

您无法调整数组的大小,但可以跟踪其实际元素的大小。

我假设如果数组中只有一个偶数元素,那么数组中就没有一对最小和最大偶数元素。所以在这种情况下,没有任何东西从数组中“移除”并且进程停止。但是,您可以更改方法并“删除”甚至单个偶数元素。

而要求移除元素的赋值意味着必须保持数组中元素的顺序。您可能无法对数组进行排序。 也就是说,当您被要求从数组中删除一个元素时,这并不意味着您要对数组进行排序。:)

这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

struct Pair
{
    size_t min;
    size_t max;
};

struct Pair minmax_element( const int a[], size_t n )
{
    struct Pair p = { n, n };

    for ( size_t i = 0; i < n; i++ )
    {
        if ( a[i] % 2 == 0 )
        {
            if ( p.min == n || a[i] < a[p.min] ) p.min = i;
            if ( p.max == n || a[p.max] < a[i] ) p.max = i;
        }           
    }

    return p;
}

int main(void) 
{
    enum { N = 20 };
    int a[N];

    srand( ( unsigned int )time( NULL ) );

    for ( size_t i = 0; i < N; i++ ) a[i] = rand() % N;

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", a[i] );
    }

    putchar( '\n' );

    int success = 1;
    size_t n = N;

    while ( success )
    {
        struct Pair p = minmax_element( a, n );

        success = p.min != n && p.max != n;

        if ( success )
        {
            printf( "minimum even number = %d, maximum even number = %d\n",
                    a[p.min], a[p.max] );

            if ( p.max < p.min )
            {
                size_t tmp = p.min;
                p.min = p.max;
                p.max = tmp;
            }

            memmove( a + p.max, a + p.max + 1, ( n - p.max - 1 ) * sizeof( int ) );
            --n;
            memmove( a + p.min, a + p.min + 1, ( n - p.min - 1 ) * sizeof( int ) );
            --n;
        }
    }

    for ( size_t i = 0; i < n; i++ )
    {
        printf( "%d ", a[i] );
    }

    putchar( '\n' );

    return 0;
}

它的输出可能看起来像

8 3 6 16 3 4 9 8 1 4 15 9 16 12 3 7 10 19 15 15 
minimum even number = 4, maximum even number = 16
minimum even number = 4, maximum even number = 16
minimum even number = 6, maximum even number = 12
minimum even number = 8, maximum even number = 10
3 3 9 8 1 15 9 3 7 19 15 15 

正如在结果数组中看到的那样,有一个值为 8 的偶数元素,因为该数组没有更多的偶数元素来构成一对。

编辑:考虑您的评论

Oh sorry, I forgot to mention that if there is only 1 element (in this example 8), you simply output it 2 times at the and, as the lowest and biggest number, so that the final output has no even numbers.

演示程序如下所示

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

struct Pair
{
    size_t min;
    size_t max;
};

struct Pair minmax_element( const int a[], size_t n )
{
    struct Pair p = { n, n };

    for ( size_t i = 0; i < n; i++ )
    {
        if ( a[i] % 2 == 0 )
        {
            if ( p.min == n || a[i] < a[p.min] ) p.min = i;
            if ( p.max == n || a[p.max] < a[i] ) p.max = i;
        }           
    }

    return p;
}

int main(void) 
{
    enum { N = 20 };
    int a[N];

    srand( ( unsigned int )time( NULL ) );

    for ( size_t i = 0; i < N; i++ ) a[i] = rand() % N;

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", a[i] );
    }

    putchar( '\n' );

    int success = 1;
    size_t n = N;

    while ( success )
    {
        struct Pair p = minmax_element( a, n );

        success = p.min != n;

        if ( success )
        {
            if ( p.max == n ) p.max = p.min;

            printf( "minimum even number = %d, maximum even number = %d\n",
                    a[p.min], a[p.max] );

            if ( p.max < p.min )
            {
                size_t tmp = p.min;
                p.min = p.max;
                p.max = tmp;
            }

            memmove( a + p.max, a + p.max + 1, ( n - p.max - 1 ) * sizeof( int ) );
            --n;

            if ( p.min != p.max )
            {
                memmove( a + p.min, a + p.min + 1, ( n - p.min - 1 ) * sizeof( int ) );
            --  n;
            }
        }
    }

    for ( size_t i = 0; i < n; i++ )
    {
        printf( "%d ", a[i] );
    }

    putchar( '\n' );

    return 0;
}

它的输出可能看起来像

3 10 0 12 16 0 13 11 15 16 6 8 11 10 11 12 4 14 4 3 
minimum even number = 0, maximum even number = 16
minimum even number = 0, maximum even number = 16
minimum even number = 4, maximum even number = 14
minimum even number = 4, maximum even number = 12
minimum even number = 6, maximum even number = 12
minimum even number = 8, maximum even number = 10
minimum even number = 10, maximum even number = 10
3 13 11 15 11 11 3 

关于c - 主循环设置什么参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61000946/

相关文章:

java - 二维数组,如何以编程方式添加新的数组元素? java

c - 可以在单个 malloc 中分配 2D 数组并且仍然可以使用 [ ][ ] 语法吗?

c# - 从颜色列表中,如何获得同时在每种颜色上可见的浅色或深色?

java - 确定最坏情况算法的时间复杂度

Python:为给定列表查找随机 k 子集分区

C: 数组下标低于数组边界

c - 命名空间和 extern 'C' 编译错误

c++ - 以有效的方式计算数组的切片总和

c - 如何知道为union设置了哪个变量值?

c - 将小 (1.0E-12) 数字存储为科学记数法中的 double