3回目課題解答
課題1について
#include <stdio.h>
#include <math.h>
#include "complex.h"
/*複素数を2つの変数の構造体として定義する*/
/*構造体というと分かりにくくなるが,実部変数,虚部変数をセットにして変数にしたようなもの*/
Complex ToComplex(double x, double y) /*複素数のパラメータを与える*/
{
Complex z; /*Complex型の変数を用意*/
z.re = x;
z.im = y;
return z; /*構造体として返す(実部,虚部をパラメータとして持つ)*/
}
/*Complex型の引数aと引数bを渡す*/
Complex Cadd(Complex a, Complex b) /*複素数の足し算*/
{
Complex z;
z.re = a.re + b.re;/*複素数aの実部と複素数bの実部を足す.*/
z.im = a.im + b.im;
return z;
}
Complex Csub(Complex a, Complex b) /*複素数の引き算*/
{
Complex z;
z.re = a.re - b.re;
z.im = a.im - b.im;
return z;
}
Complex Cmul(Complex a, Complex b) /*複素数の掛け算*/
{
Complex z;
z.re = (a.re * b.re) - (a.im * b.im);
z.im = (a.re * b.im) + (b.re * a.im);
return z;
}
Complex Cdiv(Complex a, Complex b) /*複素数の割り算*/
{
Complex z;
z.re = ( (a.re * b.re) + (a.im * b.im) )/( (b.re * b.re) + (b.im * b.im)
);
z.im = ( (b.re * a.im) - (a.re * b.im) )/( (b.re * b.re) + (b.im * b.im)
);
return z;
}
double Cabs(Complex a) /*絶対値*/
{
double x;
x = sqrt(a.re * a.re + a.im * a.im);
return x;
}
double Carg(Complex a) /*偏角*/
{
double x;
x = atan(a.im / a.re);
return x;
}
Complex Conj(Complex a) /*共役複素数*/
{
a.im = -a.im; /*虚数部だけを呼び出し,符号を入れ替える*/
return a;
}
課題3について
ヒント
確保すべき領域A*B*C*型
任意の要素の定義((a)*(B)+(b))*(C)+(c)
#include <stdio.h>
#include <stdlib.h>
#define A 4
#define B 2
#define M(a, b, c) m[((a)*(B)+(b))*(C)+(c)]
main(){
int a, b;
int *m=(int *)malloc(A*B*C*sizeof(int));
if(m==NULL){
puts("メモリ不足!");
exit(EXIT_FAILURE);
}
M(0,0,0)=0x000; M(0,0,1)=0x001;
M(0,1,0)=0x010; M(0,1,1)=0x011;
M(0,2,0)=0x020; M(0,2,1)=0x021;
M(1,0,0)=0x100; M(1,0,1)=0x101;
M(1,1,0)=0x110; M(1,1,1)=0x111;
M(1,2,0)=0x120; M(1,2,1)=0x121;
M(2,0,0)=0x200; M(2,0,1)=0x201;
M(2,1,0)=0x210; M(2,1,1)=0x211;
M(2,2,0)=0x220; M(2,2,1)=0x221;
M(3,0,0)=0x300; M(3,0,1)=0x301;
M(3,1,0)=0x310; M(3,1,1)=0x311;
M(3,2,0)=0x320; M(3,2,1)=0x321;
for(a=0; a<A; a++){
for(b=0; b<B; b++){
for(c=0; c<C; c++){
printf("d[%d][%d]=%02X\n", a, b, M(a, b, c));
printf("\n");
}
free(m);
exit(EXIT_SUCCESS);
}