演習課題は,それをただ提出するよりも,その内容を理解することが重要です! それが,そのまま,学期末試験(総合成績の7割)の試験勉強に,なります! |
main()
関数のなかに命令文を組み立てていくということです。printf(), scanf(), puts(), putchar()
などがありましたね。
関数の返却値の型 関数名(引数1の型宣言, 引数2の型宣言, ...)
{
この関数の中だけで使用する変数の型宣言 ;
この関数で行う計算手続きの命令文 ;
.
.
.
return(この関数の返却値) ;
}
/* double型の引数x, yの平均値をdouble型として返却する関数の定義 */
double average(double x, double y)
{
double answer ; /* この関数の中だけで使用する変数としてanswerを型宣言 */
answer = (x + y) / 2. ; /* xとyの平均値を計算してanswerに代入 */
return(answer) ; /* 関数の返却値としてanswerを返却 */
}
/* 引数を全く受け取らない関数の定義の形式,voidは空(から)の意味 */
関数の返却値の型 関数名(void)
{
この関数の中だけで使用する変数の型宣言 ;
この関数で行う計算手続きの命令文;
.
.
.
return(この関数の返却値) ;
}
int main(void)
から始まる以下の文です。main()
関数の定義文だったということです。
/* 引数を全く受け取らない関数,main()関数の定義 */
int main(void)
{
main()関数の中だけで使用する変数の型宣言;
計算手続きの命令文;
.
.
.
return(0) ; /* 関数の返却値として0を返却(この値はOSに返される) */
}
/* 返却値を持たない関数の定義の形式 */
void 関数名(引数1の型宣言, 引数2の型宣言, ...)
{
この関数の中だけで使用する変数の型宣言 ;
この関数で行う計算手続きの命令文;
.
.
.
/* 返却値を持たないので,return() は書かなくてよい */
}
average()
関数を,main()
関数の中で,以下のような形式で呼び出すことができます。
int main(void)
{
double a, b, c;
.
.
.
c = average(a, b); /* aとbの平均値を計算して,cに代入 */
.
.
.
}
average()
関数を呼び出したときを例にとってまとめるとすれば,以下のようになります。x, y
用のメモリ領域が確保される。
x = a ; /* 呼び出し側(main() 関数のこと)の変数aが,average()関数の引数xに代入される */
y = b ; /* 呼び出し側(main() 関数のこと)の変数bが,average()関数の引数yに代入される */
このように,呼び出し側の変数が,呼び出された関数の引数に代入(コピー)されることによって,その関数に受け渡されることを,引数の“値渡し”と言います(Cf. テキスト135ページFig.6-4)。average()
関数の中では,代入されたほうの引数 x, y
が使用されますから,average()
関数の中で x, y
の値を変えても,呼び出し側の変数である a, b
の値は変化しません。answer
用のメモリ領域が確保される。
answer = (x + y) / 2. ;
c = answer ; /* average()関数の返却値answerが,呼び出し側(main() 関数のこと)の変数cに代入される */
x, y
用に確保されていたメモリ領域と,関数の中で型宣言した answer
用に確保されていたメモリ領域が解放される。x, y, answer
という変数は使用できない。
average()
関数を呼び出せば,よいわけです。{ }
でくくって複合文とする,ということを学びましたね。{ }
を使って幾つかの命令文を一かたまりとしていますから,これも複合文であると言うことができます。{ }
の内側だけで有効であり,その外側からは見ることができない,という規則があります。average()
関数の場合には,その引数である x, y
と,answer
という名前の変数は,average()
関数を定義している { }
の内側だけで使用することができ,その外側(例えば main()
関数の中)では使用することができません。{ }
の中で型宣言された変数は,その { }
内でしか見えませんから,例えば別々の関数の中で,同じ名前の変数を型宣言すると,それらの変数は,別々の変数として取り扱われる,ということになります。average()
関数を,以下のような main()
関数の中で呼び出すとします。
int main(void)
{
double x, y, c;
.
.
.
c = average(x, y); /* xとyの平均値を計算して,cに代入 */
.
.
.
}
main()
関数の中で型宣言されている変数 x, y
と,average()
関数の中で型宣言されている変数 x, y
は,名前は全く同じなのですが,プログラム全体の中では別物として扱われる,ということになります。main()
関数の中で使用する変数名を付けることができるというわけです。printf()
関数が,中でどんな変数を使っているのか,どんな計算手続きをしているのかは分かりませんね。)$ PATH=$PATH:.(enter)
$ ./list1-3(enter)
$ list1-3(enter)
プログラム名: command not found
ls
コマンドでしたね。今回は,ls
の -a オプションの使い方を覚えて下さい。以下のように入力してみて下さい。$ ls -a(enter)
ls
の -a オプションにより,これらの隠しファイルも含めて全てのファイルの一覧を表示することができます。(-aオプションなしでls
コマンドを入力してみて下さい。隠しファイルは表示されないはずです。)mv
| ファイル(や ディレクトリ)を移動する |
$ mv 旧ファイル名 新ファイル名 と入力すると,旧ファイルの名前が,新ファイル名に変更されます。 $ mv 移動元ファイル名 移動先ディレクトリ名 と入力すると,移動元ファイルが,移動先ディレクトリの中に移動します。 |
mv
コマンドで,.bash_profileを,例えばtmpというファイル名に変更します。$ mv .bash_profile tmp(enter)
PATH=$PATH:.
$ mv tmp .bash_profile(enter)
$ echo $PATH(enter)
単に手を動かすだけでなく,頭を使って“理解”することが重要です! |
(重要) 出席登録のための実習問題は,授業時間中に必ず提出して下さい。
num % 10
→ num を10で割った余りが返される。(numが28の場合,8が返される。)
num /= 10
→ num = num / 10 という計算が実行される。(複合代入演算子)
tmp * 10 + num % 10
の式文は,以下の値をとることになる。
double average(int va[], int no)
{
double ans;
.
.
.
return(ans);
}
double variance(int va[], int no, double heikin)
{
double ans;
.
.
.
return(ans);
}
average()
関数で求めた値を使えば,よいですよね!
10個の整数を入力してください
1個目の整数:3
2個目の整数:-5
3個目の整数:-18
4個目の整数:30
5個目の整数:22
6個目の整数:4
7個目の整数:-27
8個目の整数:7
9個目の整数:19
10個目の整数:17
平均:5.200, 分散:291.560
(重要) 宿題の締切は次の授業が始まる前までとします。きちんと動作をチェックしてから,提出してください。