C Program to Multiply Two Complex Number Using Structure, Typedef & Pointer

This C program multiplies two complex number given by user using the concept of structure and pointer.

C Source Code: Complex Multiplication


#include<stdio.h>

/* Declaring Structure */
typedef struct
{
    float real;
    float imaginary;
}complex;

/* Function Prototype */
complex multiply(complex *p, complex *q);

int main()
{
    /* Declaring structure variable using struct complex */
    complex cnum1, cnum2, mul;
    printf("Enter real and imaginary part of first complex number:\n");
    scanf("%f%f", &cnum1.real, &cnum1.imaginary);
    printf("Enter real and imaginary part of second complex number:\n");
    scanf("%f%f", &cnum2.real, &cnum2.imaginary);

    mul = multiply(&cnum1, &cnum2);

    printf("PRODUCT = %0.2f + i %0.2f", mul.real, mul.imaginary);

    return 0;
}

/* Function Definition */
complex multiply(complex *p, complex *q)
{
    complex temp;
    temp.real = p->real * q->real - p->imaginary * q->imaginary;
    temp.imaginary = p->real * q->imaginary + q->real * p->imaginary;
    return temp;
}

Code Explanation

Here complex is new data type which has been used to create structure variables cnum1, cnum2, mul & temp and pointers to structure i.e. p & q.

When using pointer with structure, structure elements are accessed using -> (called ARROW operator). To understand it more clearly, consider following code along with explanation:

complex cnum1, cnum2, *p, *q;
p = &cnum1; /* p is pointing cnum1 */
q = &cnum2; /* q is pointing cnum2 */

----------------
WITH NO POINTER 
----------------
cnum1.real & cnum1.imaginary gives member value.
cnum2.real & cnum2.imaginary gives member value.
----------------
WITH POINTER 
----------------
From the concept of pointer 
referencing & dereferencing 
member value looks like: 

*p.real & *p.imaginary gives member value
BUT IT IS NOT CORRECT

You need to use parentheses in 
name of pointer to structure
like this:
(*p).real and (*p).imaginary

WAIT , in C there is a better way!

(*p).real is equivalent to p->real, and
(*p).imaginary is equivalent to p->imaginary

SO
p->real, p->imaginary, q->real & q->imaginary
ARE CORRECT WAY OF ACCESSING MEMEBR VALUE
in this example.

Output

Enter real and imaginary part of first complex number:
1
2
Enter real and imaginary part of second complex number:
3
4
PRODUCT = -5.00 + i 10.00