如何使用函数在此程序中使用模块化

时间:2014-12-01 07:42:20

标签: c pointers

如何使用各种功能重写此程序。 程序找到两个动态矩阵的和与差。 对于矩阵的动态大小,它使用指向指针而不是二维矩阵

#include<stdio.h>
#include<stdlib.h>
int main()
{   int i, n, j, **a, **b, **c, **d;
    printf("Input the size of matrix [if n x n, input n]: ");
    scanf("%d", &n);
    printf("\nInput matrix A\n");
    a=(int**)calloc(n, sizeof(int*));
    for(i=0; i<n; i++)
    {   *(a+i)=(int*)calloc(n, sizeof(int));
        if(!*a)
        {   printf("\nInsufficient memory");
            exit(0);
        }
        for(j=0; j<n; j++)
        {   
            printf("Enter [%d][%d] element: ", i, j);
            scanf("%d", (*(a+i)+j));
            printf("%d", *(*(a+i)+j));
        }
    }
    printf("\nInput matrix B\n");
    b=(int**)calloc(n, sizeof(int*));
    for(i=0; i<n; i++)
    {   *(b+i)=(int*)calloc(n, sizeof(int));
        if(!*b)
        {   printf("\nInsufficient memory");
            exit(0);
        }
        for(j=0; j<n; j++)
        {   
            printf("Enter [%d][%d] element: ", i, j);
            scanf("%d", (*(b+i)+j));
            printf("%d", *(*(b+i)+j));
        }
    }
    c=(int**)calloc(n, sizeof(int*));
    d=(int**)calloc(n, sizeof(int*));
    for(i=0; i<n; i++)
    {   *(c+i)=(int*)calloc(n, sizeof(int));
        *(d+i)=(int*)calloc(n, sizeof(int));
        if(!(*c&&*d))
        {   printf("Insufficient memory");
            exit(0);
        }
        for(j=0; j<n; j++)
        {   *(*(c+i)+j)=(*(*(a+i)+j))+(*(*(b+i)+j));
            *(*(d+i)+j)=(*(*(a+i)+j))-(*(*(b+i)+j));
            printf("\nA[%d][%d]= %d   B[%d][%d]= %d \t Sum= %d \t Diff= %d", i, j, *(*(a+i)+j),     i, j, *(*(b+i)+j), *(*(c+i)+j), *(*(d+i)+j));
        }
    }
    free(c);
    free(d);
    free(a);
    free(b);
    return 0;
}

我已编写此代码,但无法正常工作

#include<stdio.h>
#include<stdlib.h>
void input(int n, int **a);
void operation(int n, int **a, int **b);
int main()
{   int i, n, j, **a, **b, **c, **d;
    printf("Input the size of matrix [if n x n, input n]: ");
    scanf("%d", &n);
    printf("\nInput matrix A\n");
    input(n, a);
    printf("\nInput matrix B\n");
    input(n, b);
    operation(n, a, b);
    free(c);
    free(d);
    free(a);
    free(b);
    return 0;
}
void input(int n, int **a)
{   int i, j;
    a=(int**)calloc(n, sizeof(int*));
    for(i=0; i<n; i++)
    {   *(a+i)=(int*)calloc(n, sizeof(int));
        if(!*a)
        {   printf("\nInsufficient memory");
            exit(0);
        }
        for(j=0; j<n; j++)
        {   
            printf("Enter [%d][%d] element: ", i, j);
            scanf("%d", (*(a+i)+j));
            printf("%d", *(*(a+i)+j));
        }
    }
}
void operation(int n, int**a, int**b)
{   int i, j, **c, **d;
    a=(int**)calloc(n, sizeof(int*));
    b=(int**)calloc(n, sizeof(int*));
    c=(int**)calloc(n, sizeof(int*));
    d=(int**)calloc(n, sizeof(int*));
    for(i=0; i<n; i++)
    {   *(a+i)=(int*)calloc(n, sizeof(int));
        *(b+i)=(int*)calloc(n, sizeof(int));
        *(c+i)=(int*)calloc(n, sizeof(int));
        *(d+i)=(int*)calloc(n, sizeof(int));
        if(!(*a&&*b&&*c&&*d))
        {   printf("Insufficient memory");
            exit(0);
        }
        for(j=0; j<n; j++)
        {   *(*(c+i)+j)=(*(*(a+i)+j))+(*(*(b+i)+j));
            *(*(d+i)+j)=(*(*(a+i)+j))-(*(*(b+i)+j));
            printf("\nA[%d][%d]= %d   B[%d][%d]= %d \t Sum= %d \t Diff= %d", i, j, *(*(a+i)+j), i, j, *(*(b+i)+j), *(*(c+i)+j), *(*(d+i)+j));
        }
    }
    free(c);
    free(d);
}

2 个答案:

答案 0 :(得分:2)

<强>问题:

int **ainput函数的本地。因此,当您从函数返回时,本地a的值将丢失,amain的值将保持为垃圾。您必须传递持有矩阵的变量的地址才能生成分配。换句话说,参数应为int ***a

<强>解决方案:

但你根本不需要那个参数。你可以只返回数组:

int** input(int n)
{   
    int i, j;
    int ** a = calloc(n, sizeof(int*));
    for(i=0; i<n; i++)
    {   
        a[i] = calloc(n, sizeof(int));
        if(!a[i])

        ...

     return a;
}

其他问题:

答案 1 :(得分:1)

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

int **new_imat(int n);
void drop_imat(int n, int **mat);
void input(int n, int **mat);
void operation(int n, int **mat_a, int **mat_b);

int main(){
    int i, j, n;
    int **a, **b;
    printf("Input the size of matrix [if n x n, input n]: ");
    scanf("%d", &n);
    a = new_imat(n);
    b = new_imat(n);
    printf("\nInput matrix A\n");
    input(n, a);
    printf("\nInput matrix B\n");
    input(n, b);
    operation(n, a, b);
    drop_imat(n, a);
    drop_imat(n, b);
    return 0;
}

typedef enum opt {
    NONINIT, INIT
} OPT;

void *alloc_with_err(size_t size, size_t type_size, OPT opt){
    void *ret = opt ? calloc(size, type_size) : malloc(size*type_size);
    if(!ret){
        fprintf(stderr, "\nInsufficient memory");
        exit(EXIT_FAILURE);
    }
    return ret;
}

int **new_imat(int n){
    int r, **mat;
    mat = alloc_with_err(n, sizeof(int*), NONINIT);
    for(r = 0; r < n; ++r){
        mat[r] = alloc_with_err(n, sizeof(int), INIT);
    }
    return mat;
}
void drop_imat(int n, int **mat){
    int r;
    for(r = 0; r < n; ++r)
        free(mat[r]);
    free(mat);
}

void input(int n, int **mat){
   int r, c;
    for(r=0; r<n; r++){
        for(c=0; c<n; c++){
            printf("Enter [%d][%d] element: ", r, c);
            scanf("%d", (*(mat+r)+c));
        }
    }
}
void print(int n, int **mat){
   int r, c;
    for(r=0; r<n; r++){
        for(c=0; c<n; c++){
            printf("%d ", mat[r][c]);
        }
        printf("\n");
    }
}

void operation(int n, int **a, int **b){
    int r, c;
    int **sum=new_imat(n);
    int **dif=new_imat(n);
    for(r=0; r < n; r++){
        for(c=0; c < n; c++){
           sum[r][c] = a[r][c] + b[r][c];
           dif[r][c] = a[r][c] - b[r][c];
        }
    }
    printf("A:\n");print(n, a);
    printf("B:\n");print(n, b);
    printf("Sum:\n"); print(n, sum);
    printf("Diff:\n");print(n, dif);
    drop_imat(n, sum);
    drop_imat(n, dif);
}