University of Electro-Communications Human Interface section 基礎プログラミングおよび演 習 第7回.

Slides:



Advertisements
Similar presentations
第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
Advertisements

C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
ループで実行する文が一つならこれでもOK
4章 制御の流れ-3.
プログラミング基礎I(再) 山元進.
プログラミング言語としてのR 情報知能学科 白井 英俊.
基礎プログラミングおよび演習 第4回 担当:花岡 5階522/520.
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
6/26 前回復習 for文、while文による繰り返し計算
基礎プログラミングおよび演習 第9回
第2回ネットワークプログラミング 中村 修.
基礎プログラミングおよび演習 第8回.
C言語講座 第4回 ポインタ.
第6章 2重ループ&配列 2重ループと配列をやります.
関数 関数とスタック.
第7回 条件による繰り返し.
プログラムの制御構造 選択・繰り返し.
プログラミング2 関数
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
繰り返し計算 while文, for文.
関数の定義.
プログラミング応用 printfと変数.
第10回関数 Ⅱ (ローカル変数とスコープ).
電気・機械・情報概論 VBAプログラミング 第2回 2018年7月2日
Cプログラミング演習 第7回 メモリ内でのデータの配置.
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング序論 2. n人のインディアン.
第10章 これはかなり大変な事項!! ~ポインタ~
第7回 条件による繰り返し.
第6回:ラケットを動かそう! (キーボードによる物体の操作)
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
高度プログラミング演習 (05).
高度プログラミング演習 (05).
プログラムの制御構造 配列・繰り返し.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
疑似乱数, モンテカルロ法によるシミュレーション
C言語 はじめに 2016年 吉田研究室.
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
基礎プログラミング演習 第6回.
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミングⅡ 第2回.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
C#プログラミング実習 第2回.
地域情報学 C言語プログラミング 第4回 while文、do~while文、switch文、 2次元配列、ポインタ 2017年11月10日
第5回 プログラミングⅡ 第5回
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
C言語講座 制御(選択) 2006年 計算技術研究会.
プログラミング基礎演習 第4回.
ループだよ!難しいよ! 第5章 while(ループ);.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
プログラミング 4 文字列.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
第10回 関数と再帰.
プログラミング1 プログラミング演習I 第2回.
プログラミング序論演習.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
第2章 数値の入力と変数 scanfと変数をやります.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
C言語講座 四則演算  if ,  switch 制御文.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
ファーストイヤー・セミナーⅡ 第10回 if文による選択処理(2).
Presentation transcript:

University of Electro-Communications Human Interface section 基礎プログラミングおよび演 習 第7回

University of Electro-Communications Human Interface section 関数と変数のスコープ

復習: ブロックと変数の有効範囲 ( ス コープ ) 変数はブロック ({ から } の間 ) の中だけで有効です。 変数の有効範囲をスコープといいます。 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

関数とブロックと変数のスコープ #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

グローバル変数とスコープ グローバル変数⇒関数の外に書く変数 #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 が 見えなくなる。

グローバル変数とスコープ #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

University of Electro-Communications Human Interface section 雑多な文法

代入と計算のまとめ書き演算子 なくても困らない演算子 だが、他人の書いたソースを読むた めに必要 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 先に ++ して後で計算

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”);

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; と組み合わせて使う。

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”); プログラムの流れが分かりにくく なるので多用するとよくない。上 の例のようなときぐらいにしてお くのが良い。

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"); }

課題 11 ターミナルで動くゲームを 作る 課題のページにターミナルで動くシューティング ゲーム? の雛形があります. まずは ex11sample プロジェクトを作って, コンパイルして動かしてみてください. スクロールの向きを変えてください. ついでに  構造体と関数を使って書いてください.  使用するキーと機能を増やしてください. (例えば倍速移動とか) どんなゲームにしたのか,説明を必ず書いてくださ い. 説明がないと採点時に見落としてしまうので.

課題 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 ミリ秒プログラムを停止する。

文字コード 実は、文字には番号がつけられています。 getchar() が返す整数はこの文字の番号です。 文字をシングルクォーテーション (’) で囲むと、文 字コード値のことになります。 printf() の文字列に %c を入れておくと、整数を文字 コードだと解釈したときの、文字が表示されます。 int main(){ int charCode = ’A’; // charCode には、 A の文字コード 65 が入る。 printf(”%d\n”, charCode); // 65 と表示される。 printf(”%c\n”, charCode); // A と表示される。 } 65 A

課題 12 :文字コード表を作る 文字コードの表を作ってみてください。 文字コードは(たぶん) 0 から 255 までの整数です。  機種や OS や言語モードによります。  表示できない文字や改行してしまう文字もあります。  に英語文字コード表があります。 文字コードの整数と文字を表示させてください。 8 文字ごとに改行を入れると見やすいです。 桁数をそろえて表示するには、 printf の %d の代わりに %3d などを使います。 詳しくは BasicP04.pdf を参照 表示例の抜粋: ! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * , / : 59 ; ?