Download presentation
Presentation is loading. Please wait.
Published byとしなり よしくに Modified 約 8 年前
1
University of Electro-Communications Human Interface section 基礎プログラミングおよび演 習 第7回
2
University of Electro-Communications Human Interface section 関数と変数のスコープ
3
復習: ブロックと変数の有効範囲 ( ス コープ ) 変数はブロック ({ から } の間 ) の中だけで有効です。 変数の有効範囲をスコープといいます。 int main(){ int a; { int x; x = 2*3; printf(”%d\n”, x); } printf(”%d\n”, x); return 0; } コンパイルエラー : `x' undeclared (first use in this function) x の有効範囲 (スコープ といいます) a の有効範囲 (スコープ といいます) x a
4
関数とブロックと変数のスコープ #include // 2 乗を計算する。 double square(double d){ return d*d; } // n^2 個の * を表示。 n^2 を返 す。 int printSq(int n){ int nn = square(n); int count = nn; while(count){ printf(”*”); int c = count-1; count = c; } printf(”\n”); return nn; } int main(){ printSq(5); return 0; } square のブロック double d が有効 printSq のブロック int n, int nn, int count が有効 main のブロック while のブロック int n, int nn, int count に加えて、 int c が有効 各変数のスコープ d n nn count c
5
グローバル変数とスコープ グローバル変数⇒関数の外に書く変数 #include ”curses_subset.h” #include int point=0; int sleep_by_point(){ int ms = 1000 / log(point); sleep_ms (ms); return sleep; } int main(){ int ms; while(point){ int point; sleep_by_point(); } if ( 当たり判定) { point = point – 100; } point の スコープ ms の スコープ sleep_by_point のブロック main のブロック while のブロック if のブロック どのブロックにも入ってない ⇒どのブロックでも使える 2 つの ms は まったく別の変数 2 つの point は、 まったく 別の変数。 ここの int point; のせいで、 このブロックでは、 3 行目の int point=0; の point が 見えなくなる。
6
グローバル変数とスコープ #include ”curses_subset.h” #include int point=0; int sleep_by_point(){ int ms = 1000 / log(point); sleep_ms (ms); return sleep; } int main(){ int ms; while(point){ int point; sleep_by_point(); } if ( 当たり判定) { point = point – 100; } point ms point
7
University of Electro-Communications Human Interface section 雑多な文法
8
代入と計算のまとめ書き演算子 なくても困らない演算子 だが、他人の書いたソースを読むた めに必要 n = n – 1; のような計算は、繰り返しなどで良く出てくる。 ⇒便利な代入演算子があります。 n += 2; // n=n+2; と同じ n -= 2; // n=n-2; と同じ n *= 2; // n=n*2; と同じ n /= 2; // n=n/2; と同じ n ++; // n=n+1; と同じ n --; // n=n-1; と同じ ++n; // n=n+1; と同じ --n; // n=n-1; と同じ n++ と ++n は非常に微妙に違います。 int a=1; int n; n = (a++)*10;// n=10 先に計算してさいごに ++ n = (++a)*10;// n=20 先に ++ して後で計算
9
while 以外の繰り返し なくても困らないが、 for くらいは便利かも for( 式1 ; 式2 ; 式 3 ) 文かブロック 1. 式1を実行 2. 式2の値が 0 なら 文かブロックを飛 ばして次へ 3. 文かブロックを実 行 4. 式3を実行 5.2. から繰り返し for(int c=0; c<3; c++){ printf(”*”); } *** do 文かブロック while( 式 ); 1. 文かブロックを実 行 2. 式の値が 0 なら次へ そうでなければ1 へ do{ int k = getchar(); }while(k!=100); break; continue; break 文が実行される とその時点でループ を抜ける continue 文が実行さ れると、以降を実行 せず、 ループを続ける。 while(1){ int k = getchar(); if (k==100) break; if (k==101) continue; printf(”key is not 101\n”); }; printf(”key is 100\n”);
10
switch 文 switch( 式 ){ case 数値 1: 文かブロック 1-1; 文かブロック 1-2; : case 数値 2: 文かブロック 2-1; 文かブロック 2-2; : default: 文かブロック d-1; 文かブロック d-2; : } int a = 1; switch(a){ case 1: printf(”a は 1 です。 \n”); case 2: printf(”a は 1 か 2 です。 \n”); default: printf(” 最後です。 \n"); } a は 1 です。 a は 1 か 2 です。 最後です。 1. 式の値を求める 2. 数値 n と値が等しければ、 case 数値 n: の文にジャンプ 3. 等しい数値がなければ default の 文にジャンプ case 1 にジャンプした場合、その後の、 case 2 の文も default の文も実行してしまう。 ⇒ ので、普通は break; と組み合わせて使う。
11
switch 文 / goto 文 int a = 1; switch(a){ case 1: printf(”a は 1\n”); break; case 2: printf(”a は 2\n”); break; default: printf(”1,2 ではない \n"); } a は 1 です。 case 1 にジャンプした場合、 その後の break; を実行すると switch 文を抜ける。 if 文 ; else if 文 ; … の方が便利だし分かり やすい。 while(1){ ラベル : 文 ; } goto ラベル ; goto ラベル ; を実行すると、 ラベル : 文 ; の文にジャンプす る。 同じ関数の中なら、どこにで もジャンプできる。 while( 式 ){ if ( 式 ) goto next; } next: printf(” ループを抜けました \n”); プログラムの流れが分かりにくく なるので多用するとよくない。上 の例のようなときぐらいにしてお くのが良い。
12
if else の連鎖 switch 文を使わなくても if else で同じことがかけま す。 どっちでもよいので、プログラマはその都度カッコ よいと思うほうを使っています。 int a = 1; switch(a){ case 1: printf(”a は 1\n”); break; case 2: printf(”a は 2\n”); break; default: printf(”1,2 ではない \n"); } int a = 1; if (a==1){ printf(”a は 1\n”); }else if (a==2){ printf(”a は 2\n”); }else{ printf(” 1,2 ではない \n"); }
13
課題 11 ターミナルで動くゲームを 作る 課題のページにターミナルで動くシューティング ゲーム? の雛形があります. まずは ex11sample プロジェクトを作って, コンパイルして動かしてみてください. スクロールの向きを変えてください. ついでに 構造体と関数を使って書いてください. 使用するキーと機能を増やしてください. (例えば倍速移動とか) どんなゲームにしたのか,説明を必ず書いてくださ い. 説明がないと採点時に見落としてしまうので.
14
課題 11: 資料 curses_subset.h は基礎プロの課題のために長谷川が作った独自 のヘッダファイルです. unix の curses というカーソルを動か すライブラリの機能の一部+ α を持ちます. curses_subset.h が提供する関数 initscr() ターミナルの現在のモードを記録。 endwin() ターミナルの状態を元に戻す。 cbreak() 編集なしモード。 getchar() が 1 文字ごとにすぐに返ってくる。 nocbreak() 編集ありモード。 [ENTER] まで、 getchar() が返ってこない。 echo() エコーあり。キー入力した文字を表示する。 noecho() エコーなし。キー入力した文字を表示しない。 kbhit() 待たずに読み出せるキー入力があれば 0 以外を返す。 clear() 画面クリア move(y,x) カーソルを上から y 行左から x 桁に移動する。 sleep_ms(t)t ミリ秒プログラムを停止する。
15
文字コード 実は、文字には番号がつけられています。 getchar() が返す整数はこの文字の番号です。 文字をシングルクォーテーション (’) で囲むと、文 字コード値のことになります。 printf() の文字列に %c を入れておくと、整数を文字 コードだと解釈したときの、文字が表示されます。 int main(){ int charCode = ’A’; // charCode には、 A の文字コード 65 が入る。 printf(”%d\n”, charCode); // 65 と表示される。 printf(”%c\n”, charCode); // A と表示される。 } 65 A
16
課題 12 :文字コード表を作る 文字コードの表を作ってみてください。 文字コードは(たぶん) 0 から 255 までの整数です。 機種や OS や言語モードによります。 表示できない文字や改行してしまう文字もあります。 http://ja.wikipedia.org/wiki/ASCII に英語文字コード表があります。 http://ja.wikipedia.org/wiki/ASCII 文字コードの整数と文字を表示させてください。 8 文字ごとに改行を入れると見やすいです。 桁数をそろえて表示するには、 printf の %d の代わりに %3d などを使います。 詳しくは BasicP04.pdf を参照 表示例の抜粋: 32 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44, 45 - 46. 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 63 ?
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.