繁体   English   中英

C 初学者,如何简化此代码?

[英]Beginner to C, How can i simplify this code?

这是一个函数,用于将两个相同大小的整数数组的元素相加并返回指向第三个数组的指针。

这是必需的 /

int *addTwoArrays(int *a1, int *b1, int size);

该函数应遵循以下规则:

  • 如果任何元素的总和为负,则将其设为零。
  • 如果 a1 和 b1 指向同一个数组,则返回 NULL
  • 如果任何输入数组为 NULL,则返回 NULL。

并且我需要使用以下数组调用此函数并打印总和(对于下面的情况 i,ii 在单独的行中打印和数组元素)。

情况一。

int a1[] = {1, -15, 2, 14, 3, -13, 0};
int b1[] = {0, 16, 2, -15, -3, 10, 0};

情况二。

int a2[] = {100, 101, 200, -3011};
int b2[] = {1000, 1010, -300, 10000};

我也不能使用任何外部库(除了默认的 stdio.h)

#include<stdio.h>

int sum[];

int * addTwoArrays(int * a1, int * b1, int size) {
    if (a1 == b1) {
        return NULL;
    }
    if ((a1 == NULL) || (b1 == NULL)) {
        return NULL;
    }
    for (int i = 0; i < size; i++) {
        sum[i] = 0;
    }
    for (int i = 0; i < size; i++) {
        sum[i] = a1[i] + b1[i];
    }
    printf("Sum is: ");
    for (int i = 0; i < size; i++) {
        if (sum[i] < 0) {
            sum[i] = 0;
        }
        printf("\t%d\t", sum[i]);
    }

}
int main() {
    int i;

    //for the execution of case1
    int a1[] = {1, -15, 2, 14, 3, -13, 0};
    int b1[] = {0, 16, 2, -15, -3, 10, 0};
    int size = 7;
    printf("\ncase 1:\n");
    addTwoArrays(a1, b1, size);

    //for the execution of case2
    int a2[] = {100, 101, 200, -3011};
    int b2[] = {1000, 1010, -300, 10000};
    size = 4;
    printf("\n\ncase 2:\n");
    addTwoArrays(a2, b2, size);
}

我确信有更好的方法(更紧凑的方法),但我是 c 的新手,我需要尽可能地压缩它。

你的函数是错误的,因为你没有返回任何对象

你必须知道的第一件事是,如果你想动态地构建一个数组,你必须使用

malloc

函数,但以更简单的方式,如果我想编写您的示例,您可以将 sum 数组作为输入参数,我更喜欢这样写

#include <stdio.h>

int* addArray(int* sum, int* a, int* b, int len) {
    int i;
    // check input params
    if (sum == NULL ||
        a == NULL ||
        b == NULL ||
        a == b) {
        return NULL;
    }
    // calculate sum
    for (i = 0; i < len; i++) {
        sum[i] = a[i] + b[i];
        if (sum[i] < 0) {
            sum[i] = 0;
        }
    }
    return sum;
}

int main(){
    int i;
    int arr1[5] = {10, 20, 30, 40, 50};
    int arr2[5] = {-10, 100, 20, -200, 10};
    int sum[5];
    int len;

    len = sizeof(sum) / sizeof(sum[0]);

    addArray(sum, arr1, arr2, len);
    printf("Sum: ");
    for (i = 0; i < len; i++) {
        printf("%d,", sum[i]);
    }

}

使用 malloc 函数创建动态数组,您可以看到以下代码,不幸的是您必须使用 stdlib.h

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

int* addArray(int* a, int* b, int len) {
    int i;
    int* sum;
    // check input params
    if (a == NULL ||
        b == NULL ||
        a == b) {
        return NULL;
    }
    sum = (int*) malloc(sizeof(int) * len);
    // calculate sum
    for (i = 0; i < len; i++) {
        sum[i] = a[i] + b[i];
        if (sum[i] < 0) {
            sum[i] = 0;
        }
    }
    return sum;
}

int main(){
    int i;
    int arr1[5] = {10, 20, 30, 40, 50};
    int arr2[5] = {-10, 100, 20, -200, 10};
    int* sum;
    int len;

    len = sizeof(arr1) / sizeof(arr1[0]);

    sum = addArray(arr1, arr2, len);
    printf("Sum: ");
    for (i = 0; i < len; i++) {
        printf("%d,", sum[i]);
    }

}

是的,但是在原始代码中,在 main 函数中,它没有获取 addTwoArrays() 函数的返回值。 所以我们可以像这样更改代码。

#include<stdio.h>
    
    void addTwoArrays(int * a1, int * b1, int size) {
        if (a1 == b1 || a1 == NULL || b1 == NULL) {
            return NULL;
        }
        printf("Sum is: "); 
        int sum;
        for (int i = 0; i < size; i++) {
           sum = a1[i] + b1[i];
            if (sum < 0) {
                sum = 0;
            }
            printf("\t%d\t", sum);
        }
    
    }

如果我们不能使用 stdio.h 以外的库,为什么“addTwoArrays”函数有一个返回值“int *”?

假设返回值仅用于检查。 (如果函数成功与否。)

#include<stdio.h>

int * addTwoArrays(int * a1, int * b1, int *c1, int size) {
    if ((a1 == NULL) || (b1 == NULL)||(a1 == b1)) return NULL;
    
    int i;

    for (i = 0; i < size; i++) {
        c1[i] = a1[i] + b1[i];

        if (c[i] < 0) c[i] = 0;
    }

    return c1;
}

int main() {
    int i, size;

    //for the execution of case1
    int a1[] = {1, -15, 2, 14, 3, -13, 0};
    int b1[] = {0, 16, 2, -15, -3, 10, 0};
    int c1[7];
    size = 7;

    printf("Case 1:\n\tSum1:"); 
    if (addTwoArrays(a1, b1, c1, size)!=NULL) for (i=0; i<size; i++) printf(" %d", c1[i]);
    puts("");

    //for the execution of case2
    int a2[] = {100, 101, 200, -3011};
    int b2[] = {1000, 1010, -300, 10000};
    int c2[4];
    size = 4;

    printf("Case 2:\n\tSum2:"); 
    if (addTwoArrays(a2, b2, c2, size)!=NULL) for (i=0; i<size; i++) printf(" %d", c2[i]);
    puts("");

    return 0;
}

stdlib.h 的答案:

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

int * addTwoArrays(int * a1, int * b1, int size) {
    if ((a1 == NULL) || (b1 == NULL)||(a1 == b1)) return NULL;
    
    int i, *sum=malloc(size*sizeof(int));

    if (sum==NULL) return NULL;

    for (i = 0; i < size; i++) {
        sum[i] = a1[i] + b1[i];

        if (sum[i] < 0) sum[i] = 0;
    }

    return sum;
}

int main() {
    int i, size, *sum;

    //for the execution of case1
    int a1[] = {1, -15, 2, 14, 3, -13, 0};
    int b1[] = {0, 16, 2, -15, -3, 10, 0};
    size = 7;

    printf("Case 1:\n\tSum1: ");
    if ((sum=addTwoArrays(a1, b1, size))!=NULL){
       for (i=0; i<size; i++) printf(" %d", sum[i]);
       free(sum);
    }
    puts("");

    //for the execution of case2
    int a2[] = {100, 101, 200, -3011};
    int b2[] = {1000, 1010, -300, 10000};
    size = 4;

    printf("Case 2:\n\tSum2: ");
    if ((sum=addTwoArrays(a2, b2, size))!=NULL){
       for (i=0; i<size; i++) printf(" %d", sum[i]);
       free(sum);
    }
    puts("");

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM