• 検索結果がありません。

Microsoft PowerPoint - 11th.ppt [互換モード]

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint - 11th.ppt [互換モード]"

Copied!
21
0
0

読み込み中.... (全文を見る)

全文

(1)

1

情報処理演習

第11回

2010年12月16日

(2)

#include <stdio.h> #include <math.h> #define nn 90000 #define pi 3.1415 main() { int i,j,N; float sound[nn],ei[nn],er[nn]; float f[nn],Sr[nn],Si[nn]; fp=fopen("./b0tb****.txt","r"); fscanf(fp,"%d",&N); for(i=0;i<N;++i) fscanf(fp,"%f",&sound[i]); fclose(fp); 続く

課題R1-20101125 の解答例

続き for(j=0;j<N/10;++j){ f[j]=22050.*j/N; Sr[j]=0.0; Si[j]=0.0; for(i=0;i<N;++i){ er[i]=cos(2.*pi*f[j]*i/22050.); ei[i]=-sin(2.*pi*f[j]*i/22050.); Sr[j]=Sr[j]+sound[i]*er[i]; Si[j]=Si[j]+sound[i]*ei[i]; } Sr[j]=Sr[j]/(float)N; Si[j]=Si[j]/(float)N; } }

(3)

3

前ページのプログラムを用いれば,周波数f[j] (j = 0, 1,

2, …, N/10: つまり22050/10=2205 Hzまで)について

周波数スペクトルS(f[j])の実部Sr[j]および虚部Si[j]

が求まります.

計算された各周波数f[j]における実部Sr[j]と虚部Si[j]

からそれらの振幅a[j]を計算し,横軸をf[j],縦軸を

a[j] (jは0からN/10まで)としてgnuplotで確認できるよう

ファイルに出力するプログラムを作成して下さい.

※ a[j]=sqrt(Sr[j]*Sr[j]+Si[j]*Si[j])を計算する

だけです.

※ xの平方根: sqrt(x)

課題Q10-20101209a

(4)

#include <stdio.h> #include <math.h> #define nn 90000 #define pi 3.1415 main() { int i,j,N; float sound[nn],ei[nn],er[nn]; float f[nn],Sr[nn],Si[nn],a; FILE *fp; fp=fopen("./b0tb****.txt","r"); fscanf(fp,"%d",&N); for(i=0;i<N;++i) fscanf(fp,"%f",&sound[i]); fclose(fp); 続く

課題Q10-20101209a の解答例

続き for(j=0;j<N/10;++j){ f[j]=22050.*j/N; Sr[j]=0.0; Si[j]=0.0; for(i=0;i<N;++i){ er[i]=cos(2.*pi*f[j]*i/22050.); ei[i]=-sin(2.*pi*f[j]*i/22050.); Sr[j]=Sr[j]+sound[i]*er[i]; Si[j]=Si[j]+sound[i]*ei[i]; } Sr[j]=Sr[j]/(float)N; Si[j]=Si[j]/(float)N; } fp=fopen(”amp.txt”,”w”); for(j=0;j<N/10;++j){ a=sqrt(Sr[j]*Sr[j]+Si[j]*Si[j]); fprintf(fp,”%f %f¥n”,f[j],a); } fclose(fp); }

(5)

5

課題Q10-20101209aの計算結果例

周波数 [Hz]

(6)

main関数以外に所望の処理を行う関数(サブルーチン)

を定義して,その関数をmain関数の中で呼び出して

仕事をさせること.

これも重要な概念です.頑張って理解して下さい.

(7)

7

#include <stdio.h>

int sumdata(int a,int b)

{

int n;

n=a+b;

return(n);

}

main()

{

int a,b,c;

printf(”Input two integers.¥n”);

scanf(”%d %d”,&a,&b);

c=sumdata(a,b);

printf(”result=%d¥n”,c);

}

プログラムh10.c

関数呼び出しを使用した例

(8)

#include <stdio.h>

int sumdata(int a,int b)

{

int n;

n=a+b;

return(n);

}

main()

{

int a,b,c;

printf(”Input two integers.¥n”);

scanf(”

%d %d”,&a,&b);

c=sumdata(a,b);

printf(”result=

%d¥n”,c);

}

プログラムh10.c

main関数以外にsumdataという関数を定義

計算結果nを返す.関数sumdataはint型の関数と定義

したため,返す値nもint型である必要がある.

関数sumdataに変数a, bの値を渡して

所望の処理を行い,sumdataが返した

値をint型変数cに代入.

関数呼び出しを使用した例

(9)

9

int sumdata(int a,int b){

int n;

n=a+b;

return(n);

}

C言語のプログラムでは,main関数は必須であるが,main以外に所望の処理を行う ための関数を定義することができる.定義方法はmain関数と同様だが,

int sumdata(int a,int b){ }

のように,関数の型は,返される処理結果の型(前ページの場合は2つの int 型変数 の和をint型として返す)と一致している必要がある. 関数sumdataが呼び出されたときに渡されるデータの型を 定義.この例の場合,2つのint型のデータが受け渡される. 関数sumdataの定義部分の説明 関数sumdataの呼び出し部分の説明

sumdataはint型関数として定義したため,int型のデータを

返す(return)必要がある.int型変数nを返すようにする

ことで,関数sumdataに所望の処理(加算)を行わせること

ができる.変数aもint型なので,return(a);とすることも

可能だが,その場合はaの内容をそのまま返すだけ.

c=sumdata(a,b);

関数sumdataを呼び出し,int型変数aとbの内容を引き渡す. sumdataの実行結果(返されたint型の値)をint型変数cに代入.

関数

(10)

組み込み関数 c=sumdata(a,b); の書き方で思い出すのは, z=pow(x,y); や y=sin(x); などの使い方だと思います.powやsinはいずれもfloat型の関数で,呼び出された ときに引き渡される変数がfloat型変数x,yです. これらの関数は,コンパイル時に –lm というオプションを付けることで使えるよう になります.つまり,-lm オプションは,自分で作成したmain関数にpow,sin関数 をくっつけるということを意味しています.powやsinなどのようにもともと組み込 まれている関数を,組み込み関数と言います.自分で作成する関数には,これら組み 込み関数とは異なる名前を付ける必要があります(この例の場合はsumdata). 配列と関数の書式 配列を使う場合は a[i] のように中括弧[ ]を使います.a( )と書いてしまうと,aという関数を呼び出す ことになってしまいます.書き方が似ているので注意して下さい.

関数呼び出しを知ったことによって分かること

(11)

11 #include <stdio.h> long factorial(int x) { int i; long f; i=0; f=1; while(i<x){ ++i; f=f*i; } return(f); } main() { int n,r; long ncr; scanf(”%d %d”,&n,&r); ncr=factorial(n)/(factorial(r)*factorial(n-r)); printf(”n=%d, r=%d, nCr=%ld¥n”,n,r,ncr); }

プログラムh10-2.c

教科書にあるifとexit(1)のセットは,nとrに 関する誤入力を避けるためのもの.オペレータが 誤入力に注意すれば無くとも動作はする. factorial(n)はn!を返すので, この行はn!/(r!×(n-r)!)を示す. mainで呼び出されて返した値はlong型変数ncrに代入されるため, 関数factorialはlong型で定義.引き渡される数(引数 int x) は,main関数にあるとおりn,r,n-rであるためint型である. 計算内容については次ページ参照

関数呼び出しによる組合せの計算(教科書P. 56の必要最小)

(12)

i=0; f=1; while(i<x){ ++i; f=f*i; } factorialがmain中で呼び出されたときの引数の値がxに 引き渡される.例えば,main中でfactorial(n)と呼び 出した場合は,xの値はnとなる. 1. iとfの値をそれぞれ0と1に設定 2. i<xである限り, ++i; f=f*i; を繰り返す. x=3の場合 iの値 fの値 0 1 whileループ開始 1 1 2 2 3 6 i=x となり i<x を満たさ ないためwhileループ終了 return(f)で 返されるfの値は6

関数factorialの計算内容(

n!)

(13)

13 if(scanf(”%d %d”,&n,&r)!=2){ printf(”Input 2 integers¥n”); exit(1); } scanfも組み込み関数なので,返り値が ある.scanfは読み込んだ値の「個数」 を返すことになっている.入力した値の 数が2でないときは,2以外の値を返す ので,きちんと2つの値が入力されたか どうか判断できる. プログラムを終了させる.exit(0);は正常終了, exit(1);は異常終了を示す.この場合は,2つの 整数が入力されない場合(!=2)なので異常終了 させる.

誤入力を避けるための処理部分の説明(教科書の例)

(14)

14 #include <stdio.h> int a,b; int func(int x) { int m; m=2; a=4; printf(”m, a = %d, %d¥n”,m,a); return(m*x); } main() { int m; m=5; a=2; printf(”m, a = %d, %d¥n”,m,a); b=func(a); printf(”m, a = %d, %d¥n”,m,a); printf(”b = %d¥n”,b);

プログラムh10-3.c

このプログラムで言いたいこと 局所変数と大域変数 局所変数 従来のように関数の{}内で定義された 変数(左の例では関数mainとfuncの 中の変数m) → その関数の中でのみ有効 大域変数 関数の{}の外で定義された変数 (左の例では変数aとb) → ソースプログラムに含まれる関数 全てで共通に使用される.

変数の有効範囲の説明のプログラム(教科書P. 60の類似)

(15)

15 #include <stdio.h> int a,b; int func(int x) { int m; m=2; a=4; printf(”m, a = %d, %d¥n”,m,a); return(m*x); } main() { int m; m=5; a=2; printf(”m, a = %d, %d¥n”,m,a); b=func(a); printf(”m, a = %d, %d¥n”,m,a); printf(”b = %d¥n”,b); }

プログラムh10-3.c

大域変数はこのように関数の外で定義 同じ文字mを使用して2回変数定義が なされているが,それぞれmainと funcの中でのみしか有効でないため, 重複して定義したことにはならない (局所変数).

変数の有効範囲の説明のプログラム(教科書P. 60の類似)

(16)

16 #include <stdio.h> int a,b; int func(int x) { int m; m=2; a=4; printf(”m, a = %d, %d¥n”,m,a); return(m*x); } main() { int m; m=5; a=2; printf(”m, a = %d, %d¥n”,m,a); b=func(a); printf(”m, a = %d, %d¥n”,m,a); printf(”b = %d¥n”,b);

プログラムh10-3.c

変数mの値を5に設定 ここで関数funcが呼び出されるので, func中の変数mは2にセットされるが, main中のmの値は変わらず5である. 関数main中で変数mの内容を 表示してみると,相変わらず 値は5であるはず.それに対 し,bはa=2と関数func中の m=2の積であるから4になる.

変数の有効範囲の説明のプログラム(教科書P. 60の類似)

(17)

17 return(m*x); これまで, int m,f; f=m*x; return(f); としていたものと同じ意味.

これまでと異なる用法

(18)

#include <stdio.h> long factorial(int x) { printf(”called: x=%2d¥n”,x); if(x==0) return(1); else return(x*factorial(x-1)); } main() { int n,r; long ncr; scanf(”%d %d”,&n,&r); ncr=factorial(n)/(factorial(r)*factorial(n-r)); printf(”n=%d, r=%d, nCr=%ld¥n”,n,r,ncr); }

プログラムh10-4.c

動作の説明は次ページ

再帰的関数呼び出しによる組合せの計算(教科書p. 62の必要最小)

(19)

19 例えば,n=3のときにfactorial(n)が呼び出されると次のような動作をする. 3*factorial(2) 3*2*factorial(1) 3*2*1*factorial(0) 3*2*1*1 factorial(2)=2*factorial(1) なので factorial(1)=1*factorial(0) なので factorial(0)=1 なので long factorial(int x) { printf(”called: x=%2d¥n”,x); if(x==0) return(1); else return(x*factorial(x-1)); } 漸化式の処理などに有用ですが,使うには十分習熟することが必要でしょう. まず本資料7ページの使い方ができれば良いと思います.

前ページの再帰的呼び出しの説明

(20)

20

課題Q10-20101209aで周波数f[j]におけるスペクト

ルS(f[j])の振幅a[j]を計算しました.

ここでは,周波数スペクトルS(j)の実部Sr[j]と虚部

Si[j]の値を受け取って振幅a[j]の値を計算する部分をサ

ブルーチン化して下さい.サブルーチン(main以外の関数)

名はcalcampなど何でも良いです.

※ h10.c,h10-2.cあたりが参考になると思います.

※ 配列データを関数に渡すのはまだ説明していないため,

main中で関数calcampを呼び出すところは,

for(j=0;j<N/10;++j){

re=Sr[j]; im=Si[j];

a=calcamp(re,im);

}

などとして下さい(re,im はfloat型の変数).

課題Q10-20101209b

(21)

21 #include <stdio.h> #include <math.h> #define nn 90000 #define pi 3.1415 main() { int i,j,N; float sound[nn],ei[nn],er[nn]; float f[nn],Sr[nn],Si[nn],a; FILE *fp; fp=fopen("./b0tb****.txt","r"); fscanf(fp,"%d",&N); for(i=0;i<N;++i) fscanf(fp,"%f",&sound[i]); fclose(fp); 続く

課題Q10-20101209a の解答例

続き for(j=0;j<N/10;++j){ f[j]=22050.*j/N; Sr[j]=0.0; Si[j]=0.0; for(i=0;i<N;++i){ er[i]=cos(2.*pi*f[j]*i/22050.); ei[i]=-sin(2.*pi*f[j]*i/22050.); Sr[j]=Sr[j]+sound[i]*er[i]; Si[j]=Si[j]+sound[i]*ei[i]; } Sr[j]=Sr[j]/(float)N; Si[j]=Si[j]/(float)N; } fp=fopen(”amp.txt”,”w”); for(j=0;j<N/10;++j){ a=sqrt(Sr[j]*Sr[j]+Si[j]*Si[j]); fprintf(fp,”%f %f¥n”,f[j],a); } fclose(fp); } 赤字の部分を関数化

参照

関連したドキュメント

We study a Neumann boundary-value problem on the half line for a second order equation, in which the nonlinearity depends on the (unknown) Dirichlet boundary data of the solution..

Lang, The generalized Hardy operators with kernel and variable integral limits in Banach function spaces, J.. Sinnamon, Mapping properties of integral averaging operators,

Algebraic curvature tensor satisfying the condition of type (1.2) If ∇J ̸= 0, the anti-K¨ ahler condition (1.2) does not hold.. Yet, for any almost anti-Hermitian manifold there

In this paper, for each real number k greater than or equal to 3 we will construct a family of k-sum-free subsets (0, 1], each of which is the union of finitely many intervals

Some of the known oscillation criteria are established by making use of a technique introduced by Kartsatos [5] where it is assumed that there exists a second derivative function

of absolute CR -epic spaces: a Tychonoff space X is absolute CR -epic if for any dense embedding X  // Y into another Tychonoff space, the induced C(Y ) // C(X) is an epimorphism in

Using the previous results as well as the general interpolation theorem to be given below, in this section we are able to obtain a solution of the problem, to give a full description

本装置は OS のブート方法として、Secure Boot をサポートしています。 Secure Boot とは、UEFI Boot