5回目課題解答
基本課題1 以下のような関数ができればよい.
void zero_y(double* y,int n) /*配列yのデータn個全て0にする*/ { int i; for(i=0;i<n;i++){ y[i] = 0; } } |
int ipow2(int l) /*2のl乗を返す*/ { int i,a = 1; for(i=0;i<l;i++){ a *= 2; } return a; } |
int inv2pow(int n) /*nが2の何乗になるかを返す*/ { int count = 1; while(n!=2){ n = n / 2; count++; if(n < 2){ printf("error\n"); break; } } return count; } |
また,波形に関しては以下のようになる.
void square_wave(double* x, int n) /*一周期をn個のデータとして短形波を出力*/ { int i; for(i=0;i<n;i++){ if(i <= n/2){ /*n/2まで-1を出力*/ x[i] = -1; }else{ /*n/2からは1を出力*/ x[i] = 1; } } } |
void saw_wave(double* x, int n) /*一周期をn個のデータとして鋸波を出力*/ { int i; for(i=0;i<n;i++){ x[i] = 2 / (n-1) * i - 1; } } |
/*t:周期 d:無駄時間 = ずれ*/ /*3種類の正弦波を足し合わせる関数*/ void sines_2(double* x, int n, double t1, double t2, double t3, double d1, double d2, double d3) { int i; for(i=0;i<n;i++){ x[i] = ( sin( (double)i * (2 * M_PI / t1) + (2 * M_PI * d1) ) + 0.5 * sin( (double)i * (2 * M_PI / t2) + (2 * M_PI * d2) ) + 0.25 * sin( (double)i * (2 * M_PI / t3) + (2 * M_PI * d3) ); } } |