| 後学期のまとめ |
第8回 2次元配列,文字列配列,応用問題(成績表の作成)
第9回 関数,変数の有効範囲と記憶クラス
第10回 ポインタと関数の引数,プリプロセッサ(マクロプログラム)
第11回 配列とポインタ処理,応用問題(波形データの作成と表示)
第12回 ファイル処理,データの内部表現,バイナリファイル
第13回 グラフィック(波形データのグラフィック表示)
第14回 ボールの運動,アニメーション
| 第8回 2次元配列,文字列配列,応用問題(成績表の作成) |
■2次元配列
宣言: データ型 配列名[行の数][列の数];
例 int a[5][3]
使い方 a[i][j]=‥‥ 代入
(a[i][j]+‥‥) 式の中の値参照
■文字列配列
1要素に1文字がはいる。
代入の仕方 char a[5]="book"; 型宣言の初期化のところで代入する
2次元の文字配列
char country[6][8]={"USA", "Japan", "Germany", "France","China","Korea"};
エクセルのシートのような表の、各行に文字列が並んでいる。
■応用問題(成績表の作成)
| 第9回 関数,変数の有効範囲と記憶クラス |
■関数
関数呼び出しの流れ
プログラム中に関数が現れると、関数が呼ばれる。
--> 呼び出し側の引数を関数本体の引数にコピーする
--> 関数本体のルーチンを実行
--> 戻り値に値を代入
--> 呼び出したところに戻って、直後の処理を続ける。
関数の呼び出しの例
a=sin(PI/4.0); 引数をPI/4.0として、sin()を呼び出す。結果(戻り値)をaに代入。 c=2.0*(sin(PI/6.0)+4.0);
printf("Hello!!\n"); (void型を含めて) 戻り値を必要としない関数呼び出し。
func(x);
と書いた場合、引数の値をxにおいて、関数func(x)を呼び出す。
■変数の有効範囲と記憶クラス
記憶クラス: 自動変数とスタティック変数の2種類がある。
有効範囲: 関数の{ }の中で宣言されている変数は、その{}の中だけで有効。
main()の前のプログラムの先頭で宣言すると、どの関数の{}にも属さないから、
プログラム全体で有効。
| 第10回 ポインタと関数の引数,プリプロセッサ(マクロプログラム) |
■ポインタ
&a :aのメモリアドレス
*a :aをアドレスと解釈して,アドレスa番地に書き込まれているデータ
引数を介して、関数側から値を受け取りたい場合、変数のアドレスを関数に渡す。
関数はアドレスのメモリの中身を書き換える(これは、呼び出し側の変数の中身を書き変えることと同じ)。
例: henkan(a,b,&,&phase);
■プリプロセッサ
#include #define 文の約束。
マクロ文
#define マクロ名(x,y‥‥) x, y‥‥を含んだ式
例
#define AREA(r) 4.0*PI*r*r /*半径rの球の表面積 */
| 第11回 配列とポインタ処理,応用問題(波形データの作成と表示) |
■配列とポインタ処理
配列 a[10] の
aはポインタ変数になっていて、aには配列aの先頭番地が入っている。
*(a+i)はa[i]と同じ。
引数に配列a を渡して、関数sindata()を呼び出す場合
sindata(len,a);
は、配列aの先頭番地のアドレスを渡している。
関数 sindata() 本体は、渡してもらった、アドレスをたよりに、
a[i]=****
のような処理により、呼び出し側の配列aの各要素に値を代入することができる。
■応用問題 波形データの作成と画面表示
(サイン波、高調波のサイン波の足し算、方形波、のこぎり波)
| 第12回 ファイル処理,データの内部表現,バイナリファイル |
■ファイル処理
@ファイルオープン、
ファイルのアクセスはファイルポインタを介して行う。
FILE *fp; ファイルポインタfpの宣言
fp = fopen("ファイル名","rまたはw"); 読み書きしたいファイル名のファイルを、
ファイルポインタfpに関連付ける。
Aファイルデータの読み書き
fprintf(fp,"‥‥",a,b) (ファイルポインタfpのファイルへデータを書き込む)
fscanf(fp,"‥‥",&a,&b) (ファイルポインタfpのファイルからデータを読みこむ)
Bファイルクローズ
fclose(fp); ファイルポインタfpのファイルをクローズする。
■応用問題
・波形データのファイル書き込み
・ファイルから読み込んだデータの画面表示
■データの内部表現
・char 型データ(アスキーコード)
・short型 2Byte=16bit 0〜(2^16-1) (=65,535)
・long(int)型 4Byte= 32bit 0〜(2^32-1) (=4,294,967,294)
・float型、double型
整数データの16進表示(例:0x0A)
整数データの表現
(−のデータの表現方法、2の補数表現)
■バイナリ形式のファイルの読み書き
@ファイルオープン
fp=fopen("file.bin","wb")
Afpに1バイト書き込み putc(d,fp)
fpから1バイト読み込み ds=getc(fp)
例えば、short int型データを読み書きする場合、
上位バイト、下位バイトに分解して読み書きする。
| 第13回 グラフィック(波形データのグラフィック表示) |
■グラフィック関数の使い方
スクリーン座標の定義(VGAモードでは、600×400の大きさ)
指定されたスクリーン座標に指定された色の点を打つ。
指定された2点(スクリーン座標)間を指定された線を引く。
のような働きをする関数がライブラリ関数として用意されている。
#include<gucc/gucc.h> グラフィック描画用ヘッダファイルをインクルードする
G_INIT(); グラフィック関数の初期化
グラフィック関数の呼び出し
getch(); 最後、画面が消えないようにするために入れる
■練習問題:四角の模様を描く
■数値データのグラフ表示
配列データ y[i]のグラフを描く手順。
i=0からN-1まで順番に次の描画処理を繰り替えす。
@i番目のデータのx座標:iΔx、y座標は y[i]より、原座標(xi,yi)をセットする。
A原座標(xi,yi)=(iΔx,y[i]) をスクリーン座標(Wxi,Wyi)に変換する。
B一つ前と現在のスクリーン座標の2点間((Wxi-1,Wyi-1)と(Wxi,Wyi))を
線で結ぶ。
■応用問題 サイン波の波形、高調波を足し算した波形の描画
| 第14回 ボールの放物運動,アニメーション |
■ボールの放物運動
質量m[kg]の物体を初速度v0[m/s]で角度α[rad]の方向に投げ上げる問題
ボールの運動方程式をたてる。
時間tにおけるボールの位置(ux,uy)は、
ux= v0t cos(θ)
uy=v0t sin(θ)−gt^2/2
となる。時間を変化させていって、(ux,uy)を計算。
数値データをグラフ表示した場合と同じ考え方を使って、
座標位置の点を線で結んでいけば、運動軌跡を画面に描画できる。
■アニメーション
ボールの軌跡を線で描くかわりに円で描く。
@前時刻の円を消す --> A時間待ち --> B現時刻の円を描く
を繰り返すことにより、アニメーションの絵を書くことができる。
(繰り返りし周期は、例えば1秒間に30コマにすれば、人間は動いている
ように認識する。)