後学期のまとめ

第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,&amp,&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コマにすれば、人間は動いている
ように認識する。)