C言語でのプログラムで関数hanteiの部分で正しく条件判定がされない問題

このQ&Aのポイント
  • C言語のプログラムで、関数hanteiの部分で条件判定が正しく行われない問題が発生しています。
  • プログラムの中でs0とsikii0の値を比較し、s0がsikii0以上であればz0に1を代入するようになっていますが、IC=7 ID=7の場合、s0=1.20でsikii0=0.9なのにも関わらずz0に1が代入されていない状況です。
  • 問題の原因が分からないため、他の箇所を確認しましたが、問題の解決策が見つかりませんでした。何かアドバイスや指針をいただけると助かります。
回答を見る
  • ベストアンサー

代入されません(C言語)

こんにちは。 早速質問させていただきます。 申し訳ありませんが、問題の概要など話し始めるととても時間がかかってしまう為省略させていただきます。 下記のプログラムなのですが(私はプロではないため醜いプログラムですがご了承ください)、 #include <stdio.h> int num[8][5] = {{0,0,0,0,0},{0,0,1,0,0},{0,1,0,0,0},{0,1,1,0,0}, {1,0,0,0,0},{1,0,1,0,1},{1,1,0,1,0},{1,1,1,0,0}}; int ic = 0; int i=0, j=0; int id=0;//IDナンバー int m0=0, m1=0, m2=0; //中間層 int z0=0, z1=0; int t0=0, t1=0; double s0=0,s1=0; //総和 double w00=0, w01=0, w02=0, w10=0, w11=0, w12=0;//重み double sikii0=1, sikii1=1; //しきい値(θ) θ0とθ1 int t; //正解 double hoge = 0.1; double mm0, mm1, mm2; //p2. 4)学習 で使用 //プロトタイプ宣言 void input(void); void tyukan(void); void souwa(void); //総和 void hantei(void); void seikai(void); void omomi1(void); void omomi2(void); main(){ while(ic<70){ if(id > 7){ id=0; i=0; j=0; } getchar(); printf("IC = %d ID = %d\n", ic, id); input(); tyukan(); souwa(); hantei(); seikai(); if(z0 != t0) omomi1(); else if(z1 != t1) omomi2(); i++; ic++; id++; } return 0; } void input(){ printf("入力データ M=%d A=%d B=%d\n", num[i][j], num[i][j+1], num[i][j+2]); } void tyukan(){ if(id == 0){ m0=0; m1=0; m2=0; mm0=0; mm1=0; mm2=0; s0=0; s1=0; } m0=num[i][0]+num[i][1]+num[i][2]; m1=num[i][0]+num[i][1]; m2=num[i][0]+num[i][2]; //中間層m0m1m2に代入 mm0 = (double)m0; mm1 = (double)m1; mm2 = (double)m2; printf("中間層 m0=%d m1=%d m2=%d \n", num[i][0]+num[i][1]+num[i][2], num[i][0]+num[i][1], num[i][0]+num[i][2]); } void souwa(void){ printf("総和 s0=%f s1=%f\n",(double)m0*w00 + (double)m1*w01 + (double)m1*w02, (double)m0*w10 + (double)m1*w11 + (double)m2*w12); } //*****関数判定***************************************** void hantei(void){ printf("判定は "); if(s0 >= sikii0){ printf("z0 = 1 "); z0=1; } else{ printf("z0 = 0 "); z0=0; } if(s1 >= sikii1){ printf("z1 = 1\n"); z1=1; } else{ printf("z1 = 0\n"); z0=0; printf("sikii1 %f\n",sikii1); printf("sikii0 %f\n",sikii0); } } void seikai(void){ printf("正解は "); printf("t0 = %d t1 = %d\n", num[id][3], num[id][4]); t0=num[id][3]; t1=num[id][4]; } void omomi1(void){ if(z0 == 0 && t0 == 1){ w00 = w00 + (hoge*mm0); w01 = w01 + (hoge*mm1); w02 = w02 + (hoge*mm2); sikii0 = sikii0-hoge; printf("重み変更 00 %f\n重み変更 01 %f\n重み変更 02 %f\n", w00, w01, w02); printf("閾値 %f\n", sikii0); } else if(z0 == 1 && t0 == 0){ w00 = w00 - (hoge*mm0); w01 = w01 - (hoge*mm1); w02 = w02 - (hoge*mm2); sikii0 = sikii0+hoge; printf("重み変更 00 %f\n重み変更 01 %f\n重み変更 02 %f\n", w00, w01, w02); printf("閾値 %f\n", sikii0); } } void omomi2(void){ if(z1 == 0 && t1 == 1){ w10 = w10 + (hoge*mm0); w11 = w11 + (hoge*mm1); w12 = w12 + (hoge*mm2); sikii1 = sikii1-hoge; printf("重み変更 10 %f\n重み変更 11 %f\n重み変更 12 %f\n", w10, w11, w12); printf("閾値 %f\n", sikii1); } else if(z1 == 1 && t1 == 0){ w10 = w10 - (hoge*mm0); w11 = w11 - (hoge*mm1); w12 = w12 - (hoge*mm2); sikii1 = sikii1+hoge; printf("重み変更 10 %f\n重み変更 11 %f\n重み変更 12 %f\n", w10, w11, w12); printf("閾値 %f\n", sikii1); } } 問題はこのプログラムがID7になった時に発生します。 関数hanteiの部分で s0 >= sikii0とs1 >= sikii1がそれぞれ真だったらz0(またはz1)に1を代入するように 作ったのですが、 IC=7 ID=7の部分では,s0が1.20でsikii0が0.9(s0>=sikii0)にもかかわらず z0に1が代入されません(s1とsikii1も同様)。 いろいろ考えてみましたが、原因が分かりませんでした。 どなたかよろしくお願いします。

noname#39315
noname#39315

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.2

No.1の回答をした者です。 s0とs1には、ゼロを代入したきりですので、 souwa関数かどこかで s0 = (double)m0*w00 + (double)m1*w01 + (double)m1*w02; s1 = (double)m0*w10 + (double)m1*w11 + (double)m2*w12; のような処理が必要かもしれません。 これらの処理が正しいかどうかは、確認してください。

noname#39315
質問者

お礼

早速のご回答ありがとうございます! s0,s1の表示はしているのだけど、代入が抜けていました。 結構悩んだわりにはしっかりトレースして考えてないことがよくわかりました・・・。 ありがとうございました^^

その他の回答 (1)

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

> void souwa(void){ > printf("総和 s0=%f s1=%f\n",(double)m0*w00 + (double)m1*w01 + (double)m1*w02, > (double)m0*w10 + (double)m1*w11 + (double)m2*w12); > } souwa関数で上記のように出力しています。 メッセージは確かに "s0=何とか s1=何とか" ですが、 実際に出力しているのはs0やs1の値ではない、別の内容ですね。 hantei関数の中で、if文で比較する直前の s0, sikii0, s1, sikii1の値を出力してみてください。

関連するQ&A

  • フーリエ変換のC言語プログラムについて

    正弦波(およびガウス性雑音)をフーリエ変換(離散)→逆フーリエ変換するというプログラムを組みました。正弦波をフーリエ変換すると実部は2回ピークがくるはずなのですが、すべて「0.000000」または「-0.000000」と表示されてしまいます。虚部は正常なようで実装の仕方もさほど違わないので、何が問題なのかわからずにいます。念のためコードはすべて載せますが、該当箇所は関数Fourierの fp = fopen("reX.txt", "w"); //書き込む あたりです。問題点を教えていただけないでしょうか。お願いします。 //gauss.txt, sin.txt:発生させたガウス性雑音&正弦波 //reX, imX:フーリエ変換の実部と虚部 //re-1, im-1:逆フーリエ変換の実部と虚部 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define PI 3.14159265358979323846 #define N 256 //n:長さ, w:角周波数, p:位相(phase), a:振幅 void SinCurve(int n, double w, double p, double a) { FILE *fp; double x; int t; fp = fopen("sin.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x = a * sin( w*(double)t + p ); fprintf(fp, "%f\n", x); } } fclose(fp); } //n:長さ, s:分散, m:平均 void Gauss(int n, double s, double m) { FILE *fp; double x, x1, x2, y1; int t; srand((unsigned) time(NULL)); fp = fopen("gauss.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x1 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); x2 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); y1 = pow(-2.0*log(x1), 0.5) * cos(2.0*PI*x2); y1 = s * y1 + m; fprintf(fp, "%f\n", y1); } } fclose(fp); } //ファイル名sのデータをフーリエ変換し、実部と虚部をreX, imXに保存 void Fourier(int num, char *s) { FILE *fp; int k, n; double largeX, x[N+100], t; fp = fopen(s, "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { // printf("%s\n", s); for(k = 0; k < num; k++) { fscanf(fp, "%lf", &x[k]); printf("x[%d]=%f\n", k, x[k]); } } fp = fopen("reX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*(double)k / (double)N; for(n = 0; n < num; n++) { largeX += x[n] * cos((double)n*t); // printf("%f\n", largeX); } fprintf(fp, "%f\n", largeX); printf("reX[%d]=%f\n", k, largeX); } } fp = fopen("imX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*k / (double)N; for(n = 0; n < num; n++) { largeX -= x[n] * sin(n*t); } fprintf(fp, "%f\n", largeX); } } fclose(fp); } void InverseFourier(int num) { FILE *fp; int k, n; double a[N+100], b[N+100], x, t; //a:reX, b:imX fp = fopen("reX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &a[k]); // printf("a[%d]=%f\n", k, a[k]); } } fp = fopen("imX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &b[k]); // printf("b[%d]=%f\n", k, b[k]); } } fp = fopen("re-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; t = 2.0*PI*(double)n / (double)N; for(k = 0; k < num; k++) { x +=a[k] *cos(k*t) - b[k] *sin(k*t); } x /= (double)N; fprintf(fp, "%f\n", x); // printf("x[%d]=%f\n", n, x); } } /* fp = fopen("im-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; for(k = 0; k < num; k++) { t = 2.0*PI*(double)k / (double)N; x = x + a[k] *sin(n*t) + b[k] *cos(n*t); } x /= (double)N; fprintf(fp, "%f\n", x); } } */ fclose(fp); } int main(void) { SinCurve(N, PI/8.0, 0.0, 1.0); // Gauss(N, 1.0, 0.0); Fourier(N, "sin.txt"); // Fourier(N, "gauss.txt"); InverseFourier(N); return 0; }

  • C言語

    文を繰り返すときに、『続けますか(Y=続行。N=終了)』と表示して、Yが入力されたら文を繰り返すようにしたいのですが、わからないので教えてください。 #include<stdio.h> int main(void) { int m,s,r,num; char moji; num=1; do{ printf("距離を入力してください。\n"); scanf("%d",&m); printf("平均速度を入力してください。\n"); scanf("%d",&s); r=m/s; printf("所要時間は%dです。\n",r); printf("続けますか?(Y=続行。N=終了)\n");/*このあたりがどうすればいいのかわかりません*/ moji=getchar(); }while(num) printf("終了します。\n"); return 0; }

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • 基本的なC言語のプログラム

    C言語を勉強中です・・・ 0秒から1.0秒まで0.01秒刻みでデータ(s[i])を配列から表示させていく簡単なプログラムです。 0から0.2までは"30" 0.2から0.4までは"29" 0.4から1.0までは"30"と表示させたいのですが、 全て"30"と表示されてしまいます。 配列の仕方が悪いのでしょうか?? すごく基本的な質問かもしれませんが、どなたか分かる方、よろしくお願いします。 #include <stdio.h> #include <math.h> #define number0 (100) #define h (0.01) #define f1 (30.0) #define f2 (29.0) void main(void){ double s[number0]={0}; int i; double t; for(i=0; i<number0; i++){ t=h*i; if(0<=i<20){ s[i]=f1; } else { if (20<=i<40){ s[i]=f2; } else { s[i]=f1; } } printf("%g %g\n",t,s[i]); } }

  • Cプログラミング 初歩

    #include <stdio.h> int main (void){ double num; printf("実数を入力して下さい:"); scanf("%lf",&num); printf("あなたは%fと入力しましたね\n",num); return(0); } のプログラミングがコンパイル出来ません↓ printf("あなたは%fと入力しましたね\n",num); をprintf("%f\n",num);のようにすると上手くいくのですが、 どうしたらコンパイルできるか分かる人はいますか?

  • C言語の添削

    「C言語基礎課題1」 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <tchar.h> #include <ctype.h>                                       #include <string.h> #define MAX 100 /*点数*/ int flag; double avg(double t[],int n); int str_check(char s[]);                                        int main() { int number; //人数 double score[MAX]; //点数 char temp[MAX]; char str[MAX]; //名前 double ans; //平均成績 int i=0; //カウンタ変数 //人数の決める printf("人数を入力して下さい。\n"); scanf("%d",&number); //名前の入力 for(i=0;i<number;i++) { printf("%d番様の名前を入力して下さい。\n",i+1); scanf("%s",&str[i]); } //点数の入力 for(i=0;i<number;i++) { printf("%d番様の点数を入力して下さい。\n",i+1); scanf("%s",&temp); str_check(temp); if(flag==1) { score[i]=atoi(temp); //点数入力で有効範囲をチェック if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } if(flag==0) { printf("点数を数字で入力して下さい。\n"); i--; } } ans =avg(score,number); printf("\n=====入力内容一覧と成績平均値======\n"); for(i=0;i<number;i++) { printf("%d番の点数は%3.2lfです。\n",i+1,score[i]); } printf("平均点は%3.2lfです。\n",ans); printf("=====================================\n"); getch(); return 0; } /*avg関数の定義*/ double avg(double t[],int n) { int i; double sum; sum = 0.0; for(i=0;i<n;i++) { sum += t[i]; } return sum/n; } /*点数入力で文字か数字かチェック*/ int str_check(char s[]) { int i=0,n; //カウンタ変数 n=strlen(s); while(s!='\0') { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { i++; } else { break; } } if(i==n) { flag=1; } else { flag=0; } return flag; } [最初に組んだソースプログラム] #include<stdio.h> #include<stdio.h> #define NUM 3 /*点数*/ #define Name 3 /*人数*/ #include<conio.h> double avg(int t[]); struct stList{ char str[Name][100]; int score[NUM]; int i,j; }; int main(void) { int score[NUM]; //char str[Name]; char str[100]; int i,j; double ans; printf("名前を入力して下さい。\n",Name); for(i=0;i<Name;i++){ scanf("%s",&str[Name]); } // if(score[NUM]=0 || score[NUM]<=100) //{ // printf("点数を入力して下さい。\n",NUM); //} printf("点数を入力して下さい。\n",NUM); for(i=0;i<NUM;i++) { scanf("%d",&score[i]); if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } for(j=0;j<NUM;j++){ printf("%d番目の人の点数は%dです。\n",j+1,score[j]); } ans =avg(score); printf("平均点は%3.2lfです。\n",ans); getch(); return 0; } /* avg関数の定義 */ double avg(int t[]) { int i; double sum; sum = 0.0; for(i=0;i<3;i++){ sum += t[i]; } return sum/Name; } 「一人分のデータを保持する構造体(文字列と整数の変数をメンバに持つ)を用意し、3人分の名前と成績 (最大値100、最小値0)を入力でき、入力が終了したら、入力内容一覧と成績の平均値を表示する プログラムを作成せよ。 ※考えうる限りの異常系処理の導入、関数化を行うこと。」 研修で以下の指摘を受けました。 (1)compare関数が使われていない。 (2)名前入れる変数が3つ不明 (3)カウンタ変数がi,j,s,tになっている理由は? (4)名前を入力しなかった時の処理 (5)点数を処理しなかった時の処理 (6)定数NUMで人数3を指定できるようにしているのにプログラムはそれを利用仕切れていない(名前入力が固定3人)ので無意味 (7)if(tmp=0 || tmp<=100)←これなんでしょうか? (8)平均点表示の少数点以下有効桁数はどうなっているのか? (9)点数入力で文字を入れたときの処理 (10)点数入力で有効範囲外の数字を入れた時の処理 ちなみに最大値、最小値はdefineして欲しいです。理由は(2)に読めば分かる (11)変数名が謎なのが多い 課題のキーワードのどこにも出て来ないですし言葉だから 後、添付ファイルを添付します。 最初のソースプログラム名「最初に組んだもの」修正したものが「C言語基礎課題1」と名付けています。 いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?

  • C言語について質問です。

    前に質問した訂正です。前の質問に関しては質問の意図が伝わりにくい文章で本当に申し訳ないと思っています。 乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力させることはできたんですが、単位がわかりません。教えてください。 以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); clock_t start , finish; double duration; start = clock(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); finish = clock(); duration = (double)(finish-start) / CLOCKS_PER_SEC; printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); printf ( "%lf\n" , duration ); return 0; } 実行結果: >gcc rand.c bubblesort.c (ソートは省略) count of comparisons : 499500 count of swap : 14848 2.950000 と出力されたのですが読み方?単位が分かりません。教えてください。自分の答えとしては2分55秒だと思うんですが合ってますか?連続質問ですいません。

  • 台形公式・シンプソン公式についての質問

    以前質問させていただき実際にプログラミングを作ったのですが、なぜか間違った答えが出てしまいます。 区分求積法・台形公式・シンプソンの公式を用いて、1/1+x*xを求めたいのですが、 1)台形公式の答えが区分求積法の答えより精度がが悪くなってしまう。 2)シンプソン公式が答えに収束しない。 となってしまいます。 以下がそのプログラム↓ #include <stdio.h> #define FROM 0.0 #define TO 1.0 double func(double x) { double out; out = 1.0 / ( 1.0 + x * x ); return (out); } double kubun(double start, double end, int num) { int i; double h, s; h = ( end - start ) / num; s = 0.0; for(i=0; i<num; i++) s += func( start + i * h + h / 2.0 ); return ( s * h ); } double daikei(double start,double end,int num) { int i; double h,s; h = ( end - start ) / num; s = 0.0; for(i=1; i<num-1; i++) s += func( start + i * h ); return ((func(start) / 2.0 + s + func(end) / 2.0) * h ); } double simpson(double start,double end,int num) { int i; double h,s; h = ( end - start ) / num; s = 0.0; for(i=1;i<num;i+=2) s += 4.0 * func(start + h * i); for(i=2;i<num;i+=2) s += 2.0 * func(start + h * i); return ( (func(start) + s + func(end))/ 3 ); } int main() { double func(double); double kubun(double, double, int); double daikei(double, double, int); double simpson(double, double, int); printf("\n"); printf("### Square Integration\n"); printf(" ++ Partition = 10\t Answer = %10.6f\n", kubun(FROM, TO, 10)); printf(" ++ Partition = 50\t Answer = %10.6f\n", kubun(FROM, TO, 50)); printf("\n"); printf("### daikei Integration\n"); printf(" ++ Partition = 10\t Answer = %10.6f\n", daikei(FROM, TO, 10)); printf(" ++ Partition = 50\t Answer = %10.6f\n", daikei(FROM, TO, 50)); printf("\n"); printf("### simpson Integration\n"); printf(" ++ Partition = 10\t Answer = %10.6f\n", simpson(FROM, TO, 10)); printf(" ++ Partition = 50\t Answer = %10.6f\n", simpson(FROM, TO, 50)); return (0); } 画面に表示する際に、それぞれ分割数を10と50にした際の値を表示するように作りました。 細かい点までご指摘いただけると幸いです。 よろしくお願いします。

  • C言語のポインタのことで

    int num=15; int *p=&num; char h= 'A'; char *p=&h; って、数字や一文字の時は変数を用意しなくてはならないのに、 char *z="K"; ←ダブルクォーテーションで囲むと1文字もOK printf("%c\n",*z); とか、 char *name="名前"; printf("%s\n",*name); とかの場合、変数を用意しなくてもできますよね。 文字はどこか別の場所に保管されているのでしょうか?

  • C言語によるチェビシェフ窓の計算について

    現在、C言語でチェビシェフ窓を計算することを考えてます。 一応、エラーもなく実行できるのですが、中央の値が1になりません。 これで正しいのかどうかもわからないので、どなたか教えていただけないでしょうか。 よろしくお願いいたします。 ///////////////////以下 プログラム ///////////////// #include <stdio.h> #include <math.h> /** * 逆双曲余弦関数の定義 */ double Acosh(double x); /** *チェビシェフ関数の定義 * n:関数の次数 */ double Chev(int n, double x); void main(void) { int i, N=128, k, M=(int)floor((N-1)/2); ///data:入力 w:出力(ウィンドウ係数) ii ,kk インデックスの倍精度型, nn サンプル数の倍精度型 double data[128], w[128], ii, kk, nn; // s :メインローブ対サイドローブの比 double t0, s, u, sum; ////円周率の定義 const double pi=3.1415926; nn=(double)N, s=1000.0; //入力をすべて1に初期化 for(i=0;i<N;i++){data[i]=1.0;} /////チェビシェフ窓の計算ルーチンと出力 t0=cosh((1.0/(nn-1))*Acosh(s)); for(i=0;i<N;i++){ ii=(double)i; for(k=1;k<=M;k++){ kk=(double)k; u=ii-(nn-1)/2.0; if(k==1){ sum=Chev(N-1,t0*cos(kk*pi/nn))*cos(2.0*pi*kk*u/nn); }else{ sum+=Chev(N-1,t0*cos(kk*pi/nn))*cos(2.0*pi*kk*u/nn); } } w[i]=data[i]*(s+2.0*sum)/nn; printf("w[%d]=%4.3f\n",i,w[i]); } } double Acosh(double x) { double x2=x*x; return log(x+sqrt(x2-1)); } double Chev(int n, double x) { if(fabs(x)<=1){ return cos((double)n*acos(x)); }else{ return cosh((double)n*Acosh(x)); } } /////////////// ここまで /////////////////// //////////////////以下出力結果///////////// w[0]=0.628 w[1]=0.285 w[2]=0.348 w[3]=0.419 w[4]=0.499 w[5]=0.588 w[6]=0.686 w[7]=0.795 w[8]=0.914 w[9]=1.044 [中略] w[50]=14.268 w[51]=14.559 w[52]=14.832 w[53]=15.085 w[54]=15.320 w[55]=15.533 w[56]=15.725 w[57]=15.895 w[58]=16.041 w[59]=16.164 w[60]=16.264 w[61]=16.338 w[62]=16.388 w[63]=16.413<-中央値 w[64]=16.413<-中央値 w[65]=16.388 [中略] w[121]=0.686 w[122]=0.588 w[123]=0.499 w[124]=0.419 w[125]=0.348 w[126]=0.285 w[127]=0.628

専門家に質問してみよう