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) );
 }
}