A complex number is a number, say, z, such that z = realPart + i * imaginaryPart, where i is the imaginary unit, sometimes denoted by j. Also, i * i = -1, and this is important when finding the product/division of two complex numbers.
Naturally, we can implement a complex number as a struct:
Expand|Select|Wrap|Line Numbers
- /* Definition of a Complex number: */
- typedef struct complex {
- double realPart;
- double imaginaryPart;
- } Complex;
First, we have the header Complex.h, which defines the Complex structure and contains the prototypes for the functions that manipulate one or more Complex numbers:
Expand|Select|Wrap|Line Numbers
- /* Complex.h */
- #ifndef COMPLEX_H
- #define COMPLEX_H
- /* Definition of a Complex number: */
- typedef struct complex {
- double realPart;
- double imaginaryPart;
- } Complex;
- /* Prototypes for functions to manipulate Complex number(s) (these functions are implemented in file Complex.c): */
- Complex addition( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 );
- Complex subtraction( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 );
- Complex multiplication( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 );
- Complex division( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 );
- void print( const Complex *pointerToComplexNumber );
- #endif
Expand|Select|Wrap|Line Numbers
- /* Complex.c */
- #include <stdio.h>
- #include "Complex.h"
- /* Adds two Complex numbers, returning a new one, without modifying the ones received: */
- Complex addition( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 )
- {
- Complex complexNumber3;
- complexNumber3.realPart = pointerToComplexNumber1->realPart + pointerToComplexNumber2->realPart;
- complexNumber3.imaginaryPart = pointerToComplexNumber1->imaginaryPart + pointerToComplexNumber2->imaginaryPart;
- return complexNumber3;
- }
- /* Subtracts two Complex numbers, returning a new one, without modifying the ones received: */
- Complex subtraction( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 )
- {
- Complex complexNumber3;
- complexNumber3.realPart = pointerToComplexNumber1->realPart - pointerToComplexNumber2->realPart;
- complexNumber3.imaginaryPart = pointerToComplexNumber1->imaginaryPart - pointerToComplexNumber2->imaginaryPart;
- return complexNumber3;
- }
- /* Multiplies two Complex numbers, returning a new one, without modifying the ones received: */
- Complex multiplication( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 )
- {
- Complex complexNumber3;
- complexNumber3.realPart = pointerToComplexNumber1->realPart * pointerToComplexNumber2->realPart -
- pointerToComplexNumber1->imaginaryPart * pointerToComplexNumber2->imaginaryPart;
- complexNumber3.imaginaryPart = pointerToComplexNumber1->realPart * pointerToComplexNumber2->imaginaryPart +
- pointerToComplexNumber1->imaginaryPart * pointerToComplexNumber2->realPart;
- return complexNumber3;
- }
- /* Divides two Complex numbers, returning a new one, without modifying the ones received: */
- Complex division( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 )
- {
- Complex complexNumber3;
- double commonDenominator = pointerToComplexNumber2->realPart * pointerToComplexNumber2->realPart +
- pointerToComplexNumber2->imaginaryPart * pointerToComplexNumber2->imaginaryPart;
- complexNumber3.realPart = ( pointerToComplexNumber1->realPart * pointerToComplexNumber2->realPart +
- pointerToComplexNumber1->imaginaryPart * pointerToComplexNumber2->imaginaryPart ) / commonDenominator;
- complexNumber3.imaginaryPart = ( pointerToComplexNumber1->imaginaryPart * pointerToComplexNumber2->realPart -
- pointerToComplexNumber1->realPart * pointerToComplexNumber2->imaginaryPart ) / commonDenominator;
- return complexNumber3;
- }
- /* Prints a Complex number in the form ( realPart ) + i( imaginaryPart ), without modifying it: */
- void print( const Complex *pointerToComplexNumber )
- {
- printf( "( %.4f ) + i( %.4f )", pointerToComplexNumber->realPart, pointerToComplexNumber->imaginaryPart );
- }
Expand|Select|Wrap|Line Numbers
- /* ComplexTest.c */
- #include <stdio.h>
- #include "Complex.h"
- int main( void )
- {
- Complex number1;
- Complex number2;
- Complex sumOfNumber1WithNumber2;
- Complex subtractionOfNumber2FromNumber1;
- Complex multiplicationOfNumber1WithNumber2;
- Complex divisionOfNumber1PerNumber2;
- number1.realPart = 1.2343;
- number1.imaginaryPart = 4.7621;
- number2.realPart = -3.213;
- number2.imaginaryPart = -9.8;
- sumOfNumber1WithNumber2 = addition( &number1, &number2 );
- subtractionOfNumber2FromNumber1 = subtraction( &number1, &number2 );
- multiplicationOfNumber1WithNumber2 = multiplication( &number1, &number2 );
- divisionOfNumber1PerNumber2 = division( &number1, &number2 );
- printf( "Number1 = " );
- print( &number1 );
- printf( "\nNumber2 = " );
- print( &number2 );
- printf( "\nNumber1 + Number2 = " );
- print( &sumOfNumber1WithNumber2 );
- printf( "\nNumber1 - Number2 = " );
- print( &subtractionOfNumber2FromNumber1 );
- printf( "\nNumber1 * Number2 = " );
- print( &multiplicationOfNumber1WithNumber2 );
- printf( "\nNumber1 / Number2 = " );
- print( &divisionOfNumber1PerNumber2 );
- putchar( '\n' );
- return 0;
- }
cl ComplexTest.c Complex.c
Then, run the program with the command
ComplexTest