基礎プログラミングおよび演習 第4回 担当:花岡 5階522/520
復習 式と変数 2 2 2*2 4 3 C言語の変数は、メモリに作られます。 x x a x a x a x a #include <stdio.h> int main(){ int x; int a: a = 2; x = a*a; printf (”%d”, x); a = 3; } メモリ x a メモリ 2 x a メモリ 2 2*2 x a メモリ 4 3 x a メモリ
復習 数学の=と違うところ1 代入(let)と 数学の=(equal)はぜんぜん違う 数学 C言語 を代入 よく考えると、 復習 数学の=と違うところ1 代入(let)と 数学の=(equal)はぜんぜん違う C言語 数学 #include <stdio.h> int main(){ int x; int a: a = 2; x = a*a; printf (”%d”, x); a = 3; } を代入 整数 x を宣言 整数 a を宣言 aに2を代入 xに a*aを代入 aに3を代入 (xは4) (xは4のまま) よく考えると、 数学の = は 意味がいろいろ
復習 数学の=と違うところ2 Cの=はいつも代入の意味 = は、 右辺を左辺に代入する演算です。 なので、右辺は変数でないとだめです。 。 = は、 右辺を左辺に代入する演算です。 なので、右辺は変数でないとだめです。 。 int x; x = 3; 3 = x; これはOK これはエラー invalid lvalue in assignment 代入で左辺値が無効です int x; 3*x = 30; これもエラー。 x=10とはならない。 =は、方程式を解いてはくれない。
復習:式と文 C言語では、「式; 」を文と言います。 文の例 他にも文がいくつかあります。 式の文→式を計算する 3 * 10 ; int i; double d; int x = 3*10; 式 式の終わりを表すセミコロン 式の文 宣言文→整数の変数iを宣言する 宣言文→実数の変数dを宣言する 宣言文→整数の変数xを宣言し、 3*10を代入(で初期化)する 型名 変数名 初期化の式 セミコロン 宣言文
復習: if文 式の値によって分岐する特殊な文 if (条件式) 式が0以外の時に実行する文かブロック else 式が0以外の時に実行する文かブロック else 式が0の時に実行する文かブロック 無くてもOK #include <stdio.h> int main(){ if (10/3) printf(”0以外のとき\n”); else printf(”0の時\n”); } #include <stdio.h> int main(){ if (10/3) printf(”0以外のとき\n”); } 0以外のとき 0以外の時
復習: while 文 何度も繰り返す特殊な文が while 文です。 式の値が0になるまで、文かブロックを #include <stdio.h> int main(){ int i=5; while(i){ printf(”i = %d\n”, i); i = i–1; } while(式) 文かブロック iが0になるまで 式の値が0になるまで、文かブロックを 繰り返し実行します。具体的には、 まず、式を計算します。 式の値が0以外なら、 文かブロックを実行します。 式の値が0なら、4に進みます。 1に戻ります。 while文を終わり次に進みます。 繰り返す i = 5 i = 4 i = 3 i = 2 i = 1
課題6の if 文 if のあとに空の文とelse 本当は、 if (r==0)か、 if (r<1) と書きたい int i=100000; int in = 0; while(i){ double x = rand() / 2147483647.0; double y = rand() / 2147483647.0; int r = x*x + y*y; if ( r ) ; else in = in +1; i = i–1; } if のあとに空の文とelse 本当は、 if (r==0)か、 if (r<1) と書きたい
条件を書くために便利な演算子 演算子とは、* / + - = … のこと。 式の計算は、演算子によって行われている。 a+b は、add(a, b)という関数にも見える 四則演算以外にCにはいろいろな演算子がある。 比較演算子 = =, !=, <, >, <=, >=, a = = b aとbが等しければ1 異なれば0 a ! = b aとbが等しければ0 異なれば1 a < b a<b ならば 1 そうでなければ 0 a > b a>b ならば 1 そうでなければ 0 a <= b a≦bならば 1 そうでなければ 0 a >= b a≧bならば 1 そうでなければ 0 計算順の優先度(優先順位)は、四則より低い a < b + c は、 a < (b+c) の意味 0 < 1+2 の値は1 (0 < 1) + 2 の値は3
条件を書くために便利な演算子 論理演算子 and と or a && b aとbが両方0以外のとき 1 そうでなければ 0 「条件 1かつ 条件2のとき」をあらわすのに便利 a || b aとbのどちらかが0以外のとき 1 そうでなければ 0 四則演算子との比較 0<1 && 5 の値は 1 (0<1) * 5 の値は 5 0>1 || 5 の値は 1 (0>1) + 5 の値は 5 if (a<b && c<d){ // a<bかつc<dのときここを実行 } if (x || y){ // x か yのどちらかが // 0でなければ実行 } if (a<b || c<d){ // a<bcまたは<dのときここを実行 }
条件を書くために便利な演算子 論理演算子(つづき) !a aが0のとき1 そうでなければ 0 +-*/ == != > < && || などは、左右に値が必要 例:a+b a-b a/b a*b a==bなど ! は、右だけに値をとる 例: !a !(a<b && b<c) !0 + !1 値は1 計算順の優先度(優先順位)がとても高い !a*b は、 (!a)*bの意味 !0*3 は 3 !(0*3)は1
%演算子 割り算の余りを求める演算子です。 優先順位は、*/と同じ 10 + 10%3 は 11, (10+10)%3は 2 10 + 10%3 は 11, (10+10)%3は 2 printf(”%d\n”, 0%3); printf(”%d\n”, 1%3); printf(”%d\n”, 2%3); printf(”%d\n”, 3%3); printf(”%d\n”, 4%3); printf(”%d\n”, 5%3); printf(”%d\n”, 6%3); 1 2
演算子の優先順位 ! 0なら1、0以外は1 * / % 積商 mod(余り) + - 和差 < > <= >= 比較 ! 0なら1、0以外は1 * / % 積商 mod(余り) + - 和差 < > <= >= 比較 == != 比較 && 両方0以外なら1(論理積) || 片方以外なら1 = 代入 10 || !1*10<1 == 2>1 && 0 != 0 は、 10 || ( ((!1*10)<1) == (2>1) && (0 != 0) )
簡単なシミュレーションの話 速度と位置の関係 速度と加速度の関係も同様
簡単なシミュレーションの話 数式なら C言語だと double x=0; g double v=0; double dt=0.01; double g=9.8; x = x+v*dt; v = v+g*dt; g y
投げ上げ運動のシミュレーション x g =9.8 * y カーソルを動かす ための関数 move() を使うために必要 です. #include “curses_subset.h“ int main(){ double vx = 5; double vy = -20; // 質点の速度 double px = 5; double py = 24; // 質点の位置 double dt = 0.05; //シミュレーションの時間刻み(秒) double g = 9.8; // 重力加速度(m/s^2) while(!kbhit()){ // 何かキーが押されたら終了 // 位置の更新: 位置=位置+速度 px =px+vx*dt; py =py+vy*dt; vy = vy+g*dt; clear(); // 画面クリア move(py, px); // カーソルを移動 printf("*\n"); // 表示 sleep_ms(50); // 0.05秒待つ } カーソルを動かす ための関数 move() を使うために必要 です. x g =9.8 * y
課題7:床で跳ね返るシミュレーション ボールの投げ上げ運動のシミュレーションのプログラムを課題のページに置いておきます. 床でボールが跳ね返るように改造してください. できたら次のことにもチャレンジしてください. 跳ね返り係数. 画面の左右端でも跳ね返る. そのほか思いつくこと.
ターミナルで動くプログラムのデバッグ ターミナルで動くプログラムも一工夫すると デバッガを使ってデバッグすることができます。 手順の概要 先にターミナルでプログラムを動かす プログラムにデバッガを接続する
デバッガ接続の手順 ターミナルでデバッグ対象のプログラム (ここではex7sample)を起動 もうひとつターミナルを起動
デバッガ接続の手順 新しいターミナルで ps コマンドを実行 プロセスID(PID)を調べる
デバッガ接続の手順 Xcodeを起動してプロジェクトを開く ファインダで ex7sample.xcodeproj を開くのでもOK [デバッグ]-[接続]-[プロセスID]を選択
デバッガ接続の手順 先ほど調べたプロセスIDを入力 OKを押すとデバッガがプログラムに接続され、 プログラムは一時停止状態になる。
デバッガ接続の手順 ソースコード(main.c)を開き、ブレークポイントを追加する。
デバッガ接続の手順 デバッガの続けるボタンを押してプログラムを実行状態にする。 ターミナルをクリックし、シミュレーションを開始する(何かキーを押す)
デバッガ接続の手順 ブレークポイントでプログラムが一時停止する 後は、普通のデバッガの使い方で続けられます。
プログラムを最初からデバッグするには? プログラムの最初に getchar() をいれて、とめておいてください。 ここで止 まります。 #include “curses_subset.h“ int main(){ double vx = 5; double vy = -20; // 質点の速度 double px = 5; double py = 24; // 質点の位置 double dt = 0.05; //シミュレーションの時間刻み(秒) double g = 9.8; // 重力加速度(m/s^2) getchar(); while(!kbhit()){ // 何かキーが押されたら終了 // 位置の更新: 位置=位置+速度 px =px+vx*dt; py =py+vy*dt; vy = vy+g*dt; clear(); // 画面クリア move(py, px); // カーソルを移動 printf("*\n"); // 表示 sleep_ms(50); // 0.05秒待つ } ここで止 まります。