$B%W%m%0%i%_%s%01i=,-6!J2]Bj#3!$Bh#22s!K(B

$B%b%8%e!<%k2=$N#1$D$NL\E*$O!$HFMQ$J%i%$%V%i%j$r:n@.$7!$MM!9$J%W%m%0%i%`$GN.MQ$9$k$3$H$G$"$k!%(B
$B$3$3$G$O!$J#AG?t!$%Y%/%H%k!$9TNs$rHFMQ$K07$&$?$a$N%b%8%e!<%k$r:n@.$9$k!%(B

$BJ#AG?t%b%8%e!<%k$N:n@.(B


$BN}=,LdBj#1!K(B$BJ#AG?t9=B$BN$d4X?t%W%m%H%?%$%W$,5-:\$5$l$F$$$k(Bcomplex.h$B$r;29M$K$7$F!"(Bcomplex.c$B$rJT=8$7$F!$0J2<$N4X?t$r:n@.$;$h(B(complex.h$B$OJT=8ITMW(B).
$B%F%9%H$N$?$a$N(Bmain$B4X?t$H$7$F(Bcomplex_test.c$B$rMxMQ$9$k$3$H!J(Bcomplex_test.c$B$NFbMF$OI,MW$K1~$8$F2~JQ2D!K(B

$B?t3X4X?t$K4X$7$F$O(B$B%W%m%0%i%_%s%01i=,#12]Bj#4(B$B$r;2>H(B


complex.h
#ifndef COMPLEX_H
#define COMPLEX_H

#include <stdio.h>
#include <math.h>

/*******************************************************************************
 * $BJ#AG?t$rI=8=$9$k9=B$BN(B
 ******************************************************************************/
struct complex_number { 
    double real; /**< $Bh;;(B
 * @param a $BJ#AG?t(Ba
 * @param b $BJ#AG?t(Bb
 * @return a * b
 ******************************************************************************/
struct complex_number
complex_number_mul(struct complex_number a, struct complex_number b);

/*******************************************************************************
 * $BJ#AG?t$N=|;;(B
 * @param a $BJ#AG?t(Ba
 * @param b $BJ#AG?t(Bb
 * @return a / b
 ******************************************************************************/
struct complex_number
complex_number_div(struct complex_number a, struct complex_number b);

/*******************************************************************************
 * $BJ#AG?t$N
complex.c
#include "complex.h"

void
complex_number_print(struct complex_number a) {
    if (a.imag < 0) {
        printf("%f%fi", a.real, a.imag);
    } else {
        printf("%f+%fi", a.real, a.imag);
    }
}

struct complex_number
complex_number_add(struct complex_number a, struct complex_number b) {
    struct complex_number result;

    result.real = a.real + b.real;
    result.imag = a.imag + b.imag;

    return result;
}

struct complex_number
complex_number_sub(struct complex_number a, struct complex_number b) {
    struct complex_number result;

    result.real = a.real - b.real;
    result.imag = a.imag - b.imag;

    return result;
}

struct complex_number
complex_number_mul(struct complex_number a, struct complex_number b) {
    struct complex_number result;

    result.real = a.real * b.real - a.imag * b.imag;
    result.imag = a.real * b.imag + a.imag * b.real;

    return result;
}

struct complex_number
complex_number_div(struct complex_number a, struct complex_number b) {
    struct complex_number result = {0.0, 0.0};
    double d;

    d = b.real * b.real + b.imag * b.imag;
    if (d == 0.0) {
        printf("divided by zero\n");
        return result;
    }

    result.real = (a.real * b.real + a.imag * b.imag) / d;
    result.imag = (-a.real * b.imag + a.imag * b.real) / d;

    return result;
}

struct complex_number
complex_number_new(double real, double imag) {
    /* $BJ#AG?t$N
complex_test.c ($B%F%9%H$N$?$a$N%a%$%s4X?t(B)
#include <stdlib.h>
#include "complex.h"

int
main(void) {
    struct complex_number z;
    double abs, arg;

    /* $BE,Ev$JJ#AG?t$r@_Dj(B */
    z = complex_number_new(3.0, 4.0);

    /* z$B$rI=<((B */
    /* $B!Z2rEzNc![(B z = 3.000000+4.000000i */
    printf("z = ");
    complex_number_print(z); 
    printf("\n");


    /* z$B$NJ#AG6&Lr$rI=<((B */
    /* $B!Z2rEzNc![(B conj(z) = 3.000000-4.000000i */
    printf("conj(z) = ");
    complex_number_print(complex_number_conj(z)); 
    printf("\n");

    /* z$B$N@dBPCM$rI=<((B */
    /* $B!Z2rEzNc![(B abs(z) = 5.000000 */
    abs = complex_number_abs(z); 
    printf("abs(z) = %f\n", abs);

    /* z$B$NJP3Q$rI=<((B */ 
    /* $B!Z2rEzNc![(B arg(z) = 0.927295 */
    arg = complex_number_arg(z); 
    printf("arg(z) = %f\n", arg);

    /* abs$B$H(Barg$B$rM?$($FJ#AG?t$rI=<((B */
    /* $B!Z2rEzNc![(B polar(abs,arg) = 3.000000+4.000000i */
    printf("polar(abs,arg) = ");
    complex_number_print(complex_number_polar(abs, arg)); 
    printf("\n");

    return (EXIT_SUCCESS);
}

$B%Y%/%H%k!$9TNs%b%8%e!<%k$N:n@.(B

$B%Y%/%H%k!$9TNs$rHFMQ$K07$&>l9g$NLdBjE@(B

  • $B$"$i$+$8$aG[Ns$N%5%$%:$O$o$+$C$F$$$k$,2DJQ$N>l9g(B
    • $B%=!<%9%3!<%I$r=q$-49$($F:F%3%s%Q%$%k$,I,MW(B
  • $B$"$i$+$8$aG[Ns$N%5%$%:$,$o$+$C$F$$$J$$>l9g(B ($BNc$($P!$I8=`F~NO!$%U%!%$%k$+$i%Q%i%a%?$,EO$5$l$k(B)

$BG[Ns$r4X?t$KEO$9>l9g$NLdBjE@(B

  • $B#185G[Ns$r4X?t$KEO$9>l9g$O$=$NMWAG?t$O>JN,$G$-$k$N$G!"G[Ns$ND9$5$KBP$7$FHFMQ$J4X?t$r:n@.$9$k$3$H$,2DG=(B
  • $B#2e$NG[Ns$r4X?t$KEO$9>l9g!$G[Ns$N9=B$$r4X?t$N0z?t$K;X<($7$F$d$kI,MW$,$"$k$N$GHFMQ$J4X?t$r:n@.$9$k$3$H$OIT2DG=(B
    • $B4X?t$KEO$5$l$k$N$O$=$N@hF,%"%I%l%9$@$1$J$N$G!$4X?tB&$G$O%G!<%?$N6h@Z$j$,H=$i$J$$!%(B
/* $B#1l9g!"$=$NMWAG?t$O>JN,$G$-$k$N$G!"G[Ns$ND9$5$KBP$7$FHFMQ$J4X?t$r:n@.$9$k$3$H$,2DG=(B
	int i;
	int x = 0;
	for(i=0;i<m;i++) {
		x += a[i];
	}
	return x;
}
/* $B#2a[][3],int n){ // $B#2e$NG[Ns$r4X?t$KEO$9>l9g!$G[Ns$N9=B$$r4X?t$N0z?t$K;X<($7$F$d$kI,MW$,$"$k$N$GHFMQ$J4X?t$r:n@.$9$k$3$H$OIT2DG=(B(a[][]$B$H$O=PMh$J$$(B)
	int i,j;
	int x = 0;
	for(i=0;i<n;i++) {
		for(j=0;j<3;j++) {
			x += a[i][j];
		}
	}
	return x;
}

int
main(void){
	int M = 3;
	int N = 2;
	int a[3] = {1,2,3};
	int b[2][3] = {{1,2,3},{4,5,6}};

	printf("$B#1

$B#1

$BN}=,LdBj#2!K(B $B0J2<$N(Barray1d.c, array1d.h, array1d_test.c$B$G9=@.$5$l$k(Barray1d$B$H$$$&%W%m%8%'%/%H$r:n@.$7!$F0:n$N3NG'$r$;$h!%(B


array1d.h
#ifndef ARRAY1D_H
#define ARRAY1D_H

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

typedef double* vector;

/*******************************************************************************
 * $BMWAG?t(Bn$B$N#1$C$FI8=`=PNO$KI=<((B
 * @param ptr $B=PNO$9$k#1
array1d.c
#include "array1d.h"

vector
ARRAY1D_new(int n) {
    vector ptr;
    ptr = (vector) malloc(n * sizeof (double));
    if (ptr == NULL) { // $B3dEv$K<:GT$7$?$i(B
        printf("allocation failure in ARRAY1D_new()\n");
        exit(EXIT_FAILURE);
    }
    return ptr;
}

void
ARRAY1D_delete(vector ptr) {
    free(ptr);
}

void
ARRAY1D_copy(vector ptr1, const vector ptr2, int n) {
    int i;
    for (i = 0; i < n; i++) {
        ptr1[i] = ptr2[i];
    }
}

void
ARRAY1D_print(const vector ptr, int n, char* format) {
    int i;
    printf("[");
    for (i = 0; i < n; i++) {
        printf(format, ptr[i]);
        if (i < n - 1) {
            printf(",");
        }
    }
    printf("]\n");
}
array1d_test.c ($B%F%9%H$N$?$a$N%a%$%s4X?t(B)
#include <stdio.h>
#include <stdlib.h>
#include "array1d.h"

int
main(int argc, char** argv) {
    int N;
    vector vec1, vec2;

    /* $B#1

$B#2

$BN}=,LdBj#3!K(B array1d.c$B$r;29M$K$7$F!$(Barray2d.h$B$N4X?t%W%m%H%?%$%W$K=>$C$F!"(Barray2d.c$B$K0J2<$N4X?t$r:n@.$;$h!J(Barray2d.h$B$OJT=8ITMW!K(B

  • m$B!_(Bn$B$N#2
  • m$B!_(Bn$B$N#2$C$F=PNO$9$k4X?t(B(ARRAY2D_print)

array2d.h
#ifndef ARRAY2D_H
#define ARRAY2D_H

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

typedef double** matrix;

/*******************************************************************************
 * m$B!_(Bn$B$N#2$C$FI8=`=PNO$KI=<((B
 * @param ptr $B=PNO$9$k#2
array2d.c
#include "array2d.h"

matrix
ARRAY2D_new(int m, int n) {
    int i;
    matrix ptr;
    ptr = (double**) malloc(m * sizeof (double*));
    if (ptr == NULL) { /* $B3dEv$K<:GT$7$?$i(B */
        printf("allocation failure in ARRAY2D_new()\n");
        exit(EXIT_FAILURE);
    }
    for (i = 0; i < m; i++) {
        ptr[i] = (double*) malloc(n * sizeof (double));
        if (ptr[i] == NULL) { /* $B3dEv$K<:GT$7$?$i(B */
            while (--i >= 0) {
                free(ptr[i]);
            }
            free(ptr);
            printf("allocation failure in ARRAY2D_new()\n");
            exit(EXIT_FAILURE);
        }
    }
    return ptr;
}

void
ARRAY2D_delete(matrix ptr, int m) {
    int i;
    for (i = 0; i < m; i++) {
        free(ptr[i]);
    }
    free(ptr);
}

void
ARRAY2D_copy(matrix ptr1, const matrix ptr2, int m, int n) {
    /* m$B!_(Bn$B$N#2$C$F=PNO$9$k4X?t$r
array2d_test.c ($B%F%9%H$N$?$a$N%a%$%s4X?t(B)
#include <stdio.h>
#include <stdlib.h>
#include "array2d.h"

int
main(int argc, char** argv) {
    int M, N;
    matrix mat1;
    matrix mat2;

    /* $B9TNs$NBg$-$5(B */
    M = 3;
    N = 4;

    /* $BNN0h$N3NJ](B */
    mat1 = ARRAY2D_new(M, N);
    mat2 = ARRAY2D_new(M, N);

    /* $BMWAG$NBeF~(B */
    mat1[0][0] = 1.9;
    mat1[0][1] = 2.8;
    mat1[0][2] = 3.7;
    mat1[0][3] = 4.6;
    mat1[1][0] = 7.1;
    mat1[1][1] = 6.2;
    mat1[1][2] = 5.3;
    mat1[1][3] = 4.4;
    mat1[2][0] = 2.3;
    mat1[2][1] = 4.6;
    mat1[2][2] = 6.9;
    mat1[2][3] = 8.1;

    /* mat1$B$NMWAG$NI=<((B */
    /* $B!Z2rEzNc![(B mat1 = [1.900000,2.800000,3.700000,4.600000,
     * 7.100000,6.200000,5.300000,4.400000,
     * 2.300000,4.600000,6.900000,8.100000] */
    printf("mat1 = ");
    ARRAY2D_print(mat1, M, N, "%f");

    /* $B#2

$B%Y%/%H%k!$9TNs1i;;$N%b%8%e!<%k$N:n@.(B

$BN}=,LdBj#4!K(B array_utils.h$B$N4X?t%W%m%H%?%$%W$K=>$C$F!$?t $B%Y%/%H%k!$9TNs$N1i;;$N;29M;qNA(B


array_utils.h

#ifndef ARRAY_UTILS_H
#define ARRAY_UTILS_H

#include "array1d.h"
#include "array2d.h"

/*******************************************************************************
 * n$B!_(B1$B$N#1e=q$-$5$l$k!K(B
 * @param a $BMWAG(Bn$B$N#1e=q$-$5$l$k!K(B
 * @param a $BMWAG(Bn$B$N#1e=q$-$5$l$k!K(B
 * @param a m$B!_(Bn$B$N#2e=q$-$5$l$k!K(B
 * @param a m$B!_(Bn$B$N#2e=q$-$5$l$k!K(B
 * @param a l$B!_(Bm$B$N#2e=q$-$5$l$k!K(B
 * @param a m$B!_(Bn$B$N#2
array_utils.c
#include "array_utils.h"

void
ARRAY_UTILS_vec_add(vector c, const vector a, const vector b, int n) {
    /* n$B!_(B1$B$N#1
array_test.c$B!!(B($B%F%9%H$N$?$a$N%a%$%s4X?t(B)
#include <stdio.h>
#include <stdlib.h>
#include "array1d.h"
#include "array2d.h"
#include "array_utils.h"

int
main(void) {
    int i, j;

    /* $B%Y%/%H%k!&9TNs$N%5%$%:(B */
    int L = 3;
    int M = 2;
    int N = 3;

    /* $B%Y%/%H%k(B */
    vector vec1 = ARRAY1D_new(N);
    vector vec2 = ARRAY1D_new(N);
    vector vec3 = ARRAY1D_new(N);
    vector vec4 = ARRAY1D_new(M);

    /* $B9TNs(B */
    matrix mat1 = ARRAY2D_new(M, N);
    matrix mat2 = ARRAY2D_new(M, N);
    matrix mat3 = ARRAY2D_new(M, N);
    matrix mat4 = ARRAY2D_new(L, M);
    matrix mat5 = ARRAY2D_new(L, N);

    /* vec1$B$N=i4|2=(B */
    for (i = 0; i < N; i++) {
        vec1[i] = 3 * i + 1;
    }

    /* vec1$B$NI=<((B */
    /* $B!Z2rEzNc![(B vec1 = [1.000000,4.000000,7.000000] */
    printf("vec1 = ");
    ARRAY1D_print(vec1, N, "%f");

    /* $B#1h;;!!(Bmat5 = mat4 * mat1 */
    ARRAY_UTILS_mat_mul(mat5, mat4, mat1, L, M, N);

    /* mat5$B$NI=<((B */
    /* $B!Z2rEzNc![(B mat5 = mat4 * mat1 =
     * [1.000000,2.000000,3.000000,
     * 2.000000,5.000000,8.000000,
     * 3.000000,8.000000,13.000000] */
    printf("mat5 = mat4 * mat1 =\n");
    ARRAY2D_print(mat5, L, N, "%f");

    /* $B#2h;;!!(Bvec4 = mat1 * vec1 */
    ARRAY_UTILS_mat_vec_mul(vec4, mat1, vec1, M, N);

    /* vec4$B$NI=<((B */
    /* $B!Z2rEzNc![(B vec4 = mat1 * vec1 = [18.000000,30.000000] */
    printf("vec4 = mat1 * vec1 = ");
    ARRAY1D_print(vec4, M, "%f");

    return (EXIT_SUCCESS);
}