0
votes

I am trying to write a program in C to add two arrays of complex numbers.

I am using the following code :

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

typedef struct cplx
{
    int re;
    int im;
} cplx;

cplx* sum(cplx *x, cplx *y,int n)
{
    int i;
    cplx *z = malloc(n * sizeof(cplx));
    if (z == NULL) {return NULL;}
    for(i=0;i<n;i++)
    {
    z[i].re=x[i].re+y[i].re;
    z[i].im=x[i].im+y[i].im;
    }
    return z;
}

cplx* difference(cplx *x, cplx *y, int n)
{
    int i;
    cplx *z = malloc(n * sizeof(cplx));
    if (z == NULL) {return NULL;}
    for(i=0;i<n;i++)
    {
    z[i].re=x[i].re-y[i].re;
    z[i].im=x[i].im-y[i].im;
    }
    return z;
}

cplx* sumdiff(cplx *x,cplx *y, int n,cplx* (*op)())
{
    return(op(x,y,n));
}

int main(void)
{
    cplx *z1,*z2,*s,*diff;
    int m,n,i;
    printf("Give the number of complex numbers to add and subtract:");
    scanf("%d",&n);
    z1=malloc(n*sizeof(cplx));
    z2=malloc(n*sizeof(cplx));
    s=malloc(n*sizeof(cplx));
    diff=malloc(n*sizeof(cplx));
    if ( z1==NULL || z2==NULL || s==NULL || diff==NULL)
    {
        printf("Allocation failed.\nEnding program.");
        exit(0);
    }
    printf("Give the numbers of the first vector:\n");
    for(i=0;i<n;i++)
    {
        printf("Re(z1[%d])=",i+1); scanf("%d",&m);
        z1[i].re=m;
        printf("Im(z1[%d])=",i+1); scanf("%d",&(z1[i].im));
    }
    printf("Give the numbers of the second vector:\n");
    for(i=0;i<n;i++)
    {
        printf("Re(z2[%d])=",i+1); scanf("%d",&(z2[i].re));
        printf("Im(z2[%d])=",i+1); scanf("%d",&(z2[i].im));
    }
    s=sum(z1,z2,n);
    diff=difference(z1,z2,n);
    s=sumdiff(z1,z2,n,sum);
    diff=sumdiff(z1,z2,n,difference);
    for(i=0;i<n;i++)
    {
        printf("z1[%d]+z2[%d]=%d+j(%d)\nz1[%d]+z2[%d]=%d+j(%d)\n",i+1,i+1,s[i+1].re,s[i+1].im,i,i,diff[i+1].re,diff[i+1].im);
    }
    free(z1); free(z2); free(s); free(diff);
return 0;
}

But when I input :

Give the number of complex numbers to add and subtract:1
Give the numbers of the first vector:
Re(z1[1])=1
Im(z1[1])=1
Give the numbers of the second vector:
Re(z2[1])=1
Im(z2[1])=1

The output is :

z1[1]+z2[1]=760368231+j(134222413)
z1[1]+z2[1]=1884507195+j(4685)

I get only random numbers.

What am I doing wrong?

1
You need to develop the skill of testing parts of your program. It's no good writing an entire program, running it, and finding it doesn't work. Isolate and test individual functions and operations so you can fix any errors in them. Then you will be able to narrow down the problem. - paddy
How would I do that ? - James Dean
This is only for educational purposes :) - James Dean

1 Answers

1
votes

change

printf("z1[%d]+z2[%d]=%d+j(%d)\nz1[%d]+z2[%d]=%d+j(%d)\n",i+1,i+1,s[i+1].re,s[i+1].im,i,i,diff[i+1].re,diff[i+1].im);

to

printf("z1[%d]+z2[%d]=%d+j(%d)\nz1[%d]-z2[%d]=%d+j(%d)\n",i+1,i+1,s[i].re,s[i].im,i+1,i+1,diff[i].re,diff[i].im);

caution: duplicate.

s=sum(z1,z2,n);
diff=difference(z1,z2,n);
s=sumdiff(z1,z2,n,sum);
diff=sumdiff(z1,z2,n,difference);