
$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
#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)
- $B==J,$KBg$-$J%5%$%:$NG[Ns$r3NJ]$7$F$*$/(B($B40A4$JJ}K!$G$O$J$$(B)
- $BF0E*$K%5%$%:$rJQ99$G$-$kG[Ns$rMQ0U$9$k(B
($BF0E*%a%b%j3NJ]$N$?$a$N;29M;qNA!J%W%m%0%i%_%s%01i=,#22]Bj#2!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

#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$rarray2d_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#1array_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); }