$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$Ncomplex.c ,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#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$Ncomplex_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]$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); }