首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C中反转数组中非负整数的运行?

如何在C中反转数组中非负整数的运行?
EN

Stack Overflow用户
提问于 2021-04-19 00:54:03
回答 1查看 59关注 0票数 0

我需要在C中创建一个随机数组,找到其中的非负值,当一行中至少有2个时,反转它们。例如,如果我有一个随机数组5 6 -7 -8 9 -4 7 8 2 -2,我需要获取6 5 -7 -8 9 -4 2 8 7 -2。这就是我到目前为止所尝试的:

代码语言:javascript
运行
复制
    #include <stdio.h>
#include <stdlib.h>
 int ARRAY[100];
int main(void) {
 int i;
 int nn; 
 int temp = ARRAY[i];
 rand();
 
 for (i=0; i<100; ARRAY[i++]=rand()%100-50 );

 printf("FIRST ARRAY:\n");
 for (i=0; i<100; i++)
    printf("%3d ",ARRAY[i]);
 putchar('\n');
 putchar('\n');



for(i=0; i<100; i++){
    if (ARRAY[i]<0) {
        if(!nn) {
            nn = 1;

        }
    }

        else {
            temp=ARRAY[i];
            ARRAY[i] = ARRAY[nn - 1];
            ARRAY[nn - 1] = temp;


            }
    }







 printf("Result:\n");

 putchar('\n');
 for (i=0; i<100; printf("%3d ",ARRAY[i++]));
 putchar('\n');
 return 0;
}

但没那么走运。

EN

回答 1

Stack Overflow用户

发布于 2021-04-19 01:25:49

对于初学者来说,不需要全局声明数组

代码语言:javascript
运行
复制
int ARRAY[100];

另外,永远不要使用像100这样的神奇数字。使用命名常量。

除了所有大写字母的常量之外,命名变量是一种糟糕的编程风格。

您可以编写一个单独的函数,如下面的演示程序所示。

代码语言:javascript
运行
复制
#include <stdio.h>

void reverse_non_negative( int a[], size_t n )
{
    for (size_t i = 0; i < n; )
    {
        while (i < n && a[i] < 0) i++;

        size_t j = i;

        while (i < n && !( a[i] < 0 )) i++;

        for (size_t k = 0; k < ( i - j ) / 2; k++)
        {
            int tmp = a[j + k];
            a[j + k] = a[i - k - 1];
            a[i - k - 1] = tmp;
        }
    }
}

int main()
{
    int a[] = { 5, 6, -7, -8, 9, -4, 7, 8, 2, -2 };
    const size_t N = sizeof( a ) / sizeof( *a );

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

    reverse_non_negative( a, N );

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

程序输出为

代码语言:javascript
运行
复制
5 6 -7 -8 9 -4 7 8 2 -2
6 5 -7 -8 9 -4 2 8 7 -2

更一般的方法可以看起来像下面这样

代码语言:javascript
运行
复制
#include <stdio.h>

void reverse_sub_ranges( int a[], size_t n, int predicate( int ) )
{
    for (size_t i = 0; i < n; )
    {
        while (i < n && !predicate( a[i] )) i++;

        size_t j = i;

        while (i < n && predicate( a[i] )) i++;

        for (size_t k = 0; k < ( i - j ) / 2; k++)
        {
            int tmp = a[j + k];
            a[j + k] = a[i - k - 1];
            a[i - k - 1] = tmp;
        }
    }
}

int non_negative( int value )
{
    return !( value < 0 );
}

int main()
{
    int a[] = { 5, 6, -7, -8, 9, -4, 7, 8, 2, -2 };
    const size_t N = sizeof( a ) / sizeof( *a );

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

    reverse_sub_ranges( a, N, non_negative );

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

程序输出与上面显示的相同,即

代码语言:javascript
运行
复制
5 6 -7 -8 9 -4 7 8 2 -2
6 5 -7 -8 9 -4 2 8 7 -2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67151168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档