Transcript Document

プログラミングⅠ(2組)
第9回
http://www.fit.ac.jp/~matsuki/lecture.html
オフィス・アワーのお知らせ
• オフィス・アワーを以下の要領で開講
– 日時:毎週月曜日、5時限目(16:20~)
– 場所:A棟 4階 41番教室
– 内容:プログラミング関連科目
タイピングソフト
• 喰人王を使用して結果を記録する
• ステージ:第一の店(中華)
• Excelのシートにスコアを毎回記録していく
– 残り時間 ⇒ FeedBackページで報告
– 総タイプ数
– ミスタイプ数
– 正確さ ⇒ FeedBackページで報告
– 喰いっぷり ⇒ FeedBackページで報告
• このシートは,途中で提出してもらいます
今日の内容
•
•
•
•
•
•
関数の概要
関数の定義
関数の呼び出し
変数のスコープ
引数の受け渡し
今日の課題
関数の概要
• これまで使った関数
– main関数・printf関数・scanf関数・sqrt関数・rand
関数...⇒ C言語は関数で構成されている
• C言語の関数とは,「一連の処理の集まり」
• プログラマが,独自の関数を作ることができる
関数の定義
• 関数とは?
– プログラマが与えた値(材料)を,
– 指示通りに処理し,
– 結果を吐き出す
引数
処理の材料
addnum()関数:
2つの整数値の
和を得る
2
a
3
b
addnum()
戻り値(返り値)
処理の結果
5
関数の定義
引数の数だけ,
「,」で区切って変
数を用意する
第1引数 第2引数
戻り値の型 関数名
型 変数名
int addnum(int a,
{
int x;
x = a + b;
return x;
}
型 変数名
int b)
a, bというint型変数が,
引数の値を受け取る
addnumの処理内容を
ここに書く
return文(関数を終了し,後に続く値(戻り値)を返す)
関数の定義
• 戻り値を持たない関数
voidは「空の」とい
う意味
– 戻り値の型にvoid(ヴォイド)と指定する
dispnum()関数:引数の整数値を表示する
void dispnum(int a)
{
printf(“引数の値は%d\n”, a);
return;
}
戻り値を指定する必要はない(この場合,return文はなくてもOK)
関数の定義
• 引数を持たない関数
hello()関数:「Hello World」と表示する
void hello(void)
「void hello()」と書いてもOK
{
printf(“Hello World\n”);
}
関数の呼び出し
• 関数呼び出しの基本
関数の定義
int dispnum( int a )
{
…
対応
}
関数の呼び出し
dispnum ( 5 ) ;
関数名
引数
aの値は5になる
#include <stdio.h>
void dispnum(int a)
{
printf(“引数の値は%d\n”, a);
}
main()
{
int x = 10;
dispnum( 5 );
dispnum( x );
}
5を引数として,
dispnum()を呼び出す
xの値10を引数として,
dispnum()を呼び出す
関数の呼び出し
• 戻り値を利用する
関数の定義
関数の
呼び出し
int addnum( int a, int b )
{
…
対応
}
関数の戻り値をnに代入する
int n;
n = addnum ( 2, 3 ) ;
#include <stdio.h>
void addnum(int a, int b)
{
int x;
x = a + b;
return x;
}
main()
addnum()関数を実行し,
{
戻り値をnに格納する
int n;
n = addnum( 2, 3 );
printf(“戻り値は%d\n”, n);
}
変数のスコープ(有効範囲)
• ローカル変数:関数の中で定義した変数
int func( )
{
int y;
…
}
main()
{
int x;
x = 3;
y = 5;
}
変数yのスコープ
変数xのスコープ
func()にあるyを
参照することはできない!
変数のスコープ(有効範囲)
• グローバル変数:関数の外で定義した変数
変数zのスコープ
int z; //グローバル変数
int func( ... )
{
変数yのスコープ
int y;
z = 2;
}
main()
{
int x;
z = 1;
}
変数xのスコープ
int y;
int z;
void myfunc(int a)
{
int z;
int x;
x = a;
y = a;
z = a;
}
main()
{
グローバル変数yとzのスコープ
グローバル変数と同じ名前の
ローカル変数があるときは,
ローカル変数が優先される
ローカル変数zとxのスコープ
同じ名前であっても,
ローカル変数は,別の変数と見なす
int x;
x = 10;
y = 10;
z = 10;
printf(“x, y, zの値は%d, %d, %d\n”,x, y, z);
func( 5 );
printf(“x, y, zの値は%d, %d, %d\n”,x, y, z);
}
ローカル変数xのスコープ
プロトタイプ宣言
関数の定義
関数の呼び出し
関数の呼び出し
関数の定義
プロトタイプ宣言:
関数のひな型を呼び出し前に宣言しておく
プロトタイプ宣言
戻り値の型 関数名
第1引数の型
プロトタイプ
宣言
int addnum(int, int);
関数の
呼び出し
n = addnum(2, 3);
関数の定義
int addnum(int a, int b)
{
…
}
第2引数の型
#include <stdio.h>
void dispnum(int a)
{
printf(“引数の値は%d\n”, a);
}
main()
{
int x = 10;
dispnum( 5 );
dispnum( x );
}
#include <stdio.h>
void dispnum(int a);
プロトタイプ宣言
main()
{
int x = 10;
dispnum( 5 );
dispnum( x );
}
void dispnum(int a)
{
printf(“引数の値は%d\n”, a);
}
繰り返し制御
• ある処理を繰り返し行う
開始
開始
処理1
処理1
処理2
処理2
処理3
処理3
終了
終了
n回
繰り返す
ある条件
の間,繰
り返す
繰り返し制御の方法
• for文を使う方法
• while文を使う方法
• do-while文を使う方法
for文
• 希望する回数だけ処理を繰り返し行う
for (初期設定式; 継続条件式; 再設定式)
{
文1;
文2;
(例)
…
for ( i = 0; i < 10; i++ )
{
}
文;
}
for文
for (初期設定式; 継続条件式; 再設定式)
•初期設定式:最初のみ実行される式
•継続条件式:繰り返し行うための条件式
(この条件式が真の間は繰り返す)
•再設定式:一回のループ終了時に実行される式
for文
次行に書いてもOK
for ( i = 0; i < 3; i++ ) {
文A;
}
3回繰り
返す
文B;
0→ i
i <3
FALSE
TRUE
文A
iを1増やす
i + 1→ i
文B
for文のプログラム
int i;
printf(“--- for文開始\n”);
for (i = 0; i < 10; i++) {
printf(“iの値は%d\n”,i);
}
printf(“--- for文終了\n”);
printf(“iの値は%d\n”,i);
--- for文開始
iの値は0
iの値は1
iの値は2
…
iの値は9
--- for文終了
iの値は10
for文のプログラム
int i;
printf(“--- for文開始\n”); ループが1回増える(11回)
for (i = 0; i <= 10; i++) {
--- for文開始
print(“iの値は%d\n”,i);
iの値は0
iの値は2
}
…
printf(“--- for文終了\n”);
iの値は8
printf(“iの値は%d\n”,i);
iの値は9
iの値は10
--- for文終了
iの値は11
for文のプログラム
int i;
printf(“--- for文開始\n”);
iは2ずつ増えている
for (i = 0; i < 10; i+=2) {
print(“iの値は%d\n”,i);
--- for文開始
iの値は0
}
iの値は2
printf(“--- for文終了\n”);
iの値は4
…
printf(“iの値は%d\n”,i);
iの値は8
--- for文終了
iの値は10
for文のプログラム
int i;
iの初期値は3になった
printf(“--- for文開始\n”);
iは2ずつ増えている
最終的にiは11
for (i = 3; i < 10; i+=2) {
print(“iの値は%d\n”,i);
--- for文開始
iの値は3
}
iの値は5
printf(“--- for文終了\n”);
iの値は7
iの値は9
printf(“iの値は%d\n”,i);
--- for文終了
iの値は11
for文のプログラム
int i;
printf(“--- for文開始\n”);
for (i = 10; i > 0; i--) {
print(“iの値は%d\n”,i);
}
printf(“--- for文終了\n”);
printf(“iの値は%d\n”,i);
iの初期値は10
iは1ずつ減少
最終的にiは0
--- for文開始
iの値は10
iの値は9
…
iの値は1
--- for文終了
iの値は0
while文のプログラム
while (継続条件式) {
文1;
文2;
…
}
継続条件式が真(0以外) ⇒ 文1,文2,…を繰り返す
継続条件式が偽にならないと,ループから抜け出せない
while文のプログラム
int n;
n = 1;
while (n < 10) {
printf(“好きな数を入力してください”);
scanf(“%d”,&n);
printf(“入力値は%d\n”,n);
}
printf(“やっとwhile文を抜けましたね\n”);
while文のプログラム(無限ループ)
TRUE
while (1) {
printf(“好きな数を入力してください”);
scanf(“%d”,&n);
printf(“入力値は%d\n”,n);
}
printf(“やっとwhile文を抜けましたね\n”);
無限ループ
(いつまで経っても抜けられないループ)
while文のプログラム(break)
無限ループ
while (1) {
printf(“好きな数を入力してください”);
scanf(“%d”,&n);
printf(“入力値は%d\n”,n);
if ( n == 1192 )
ループを強制
break;
的に抜ける
}
printf(“やっとwhile文を抜けましたね\n”);
while文のプログラム(break)
while (1) {
printf(“暗証番号は?”);
scanf(“%d”,&n);
if ( n == 1192 )
break;
else
printf(“暗証番号が間違っています\n”);
}
printf(“暗証番号を確認しました\n”);
繰り返し制御(1からnまでの和)
開始
0 → sum
1→ i
n回繰り
返す
i <= n
TRUE
FALSE
sumにiを
加える
sum + i → sum
iを1増やす
i + 1→ i
終了
繰り返し制御(1からnまでの和)
n回繰り返す
• for文を使う方法
初期値
(for文実行条件)
sum = 0;
for ( i=1; i <= n; i++ ) {
sum += i; // sum増加量
= sum + iでも同じ
}
繰り返し制御(1からnまでの和)
• while文を使う方法
sum = 0; 初期値
n回繰り返す
i = 1;
(while文実行条件)
while ( i <= n ) {
sum += i; // sum = sum + iでも同じ
i++;
増加量
}
繰り返し制御(1からnまでの和)
• for文を使う方法
for (式1;式2;式3) {
文;
}
• while文を使う方法
式1;
while(式2) {
文;
式3;
}
繰り返し制御(1からnまでの和)
開始
開始
0 → sum
0 → sum
1→ i
i <= n
FALSE
合計
i : 1, 1, n
sum + i → sum
TRUE
sum + i → sum
合計
i + 1→ i
終了
終了
繰り返し制御(1からnまでの和)
開始
0 → sum
ループ端
合計
i : 1, 1, n
増加量
合計
i : 1, 1, n
sum + i → sum
変数名
合計
初期値
終了
n回繰り返す
繰り返し(do-while文)
int main()
{
負の値が入力され
int i, n;
たときは,繰り返す
int sum = 0;
printf(“n = “); scanf(“%d”,&n);
nに負の値を入力されると,計算できない
nに正の値が入力されるまで,入力状態とする
繰り返し(do-while文)
入力部分のフローチャート
nを入力
n <=0
TRUE
FALSE
繰り返し(do-while文)
int main()
nの値によっては,
{
while文に入らない
int i, n;
こともある!
int sum = 0;
while ( n <= 0 ) {
printf(“n = “);
scanf(“%d”,&n);
}
while文 ⇒ ループの最初に条件判定が行われる
繰り返し(do-while文)
int main()
{
int i, n;
int sum = 0;
while ( n <= 0 ) {
printf(“n = “);
scanf(“%d”,&n);
}
do {
printf(“n = “);
scanf(“%d”,&n);
} while (n <= 0);
while文 ⇒ ループの最初に条件判定が行われる
do-while文 ⇒ ループの最後に条件判定が行われる