University of Electro-Communications Human Interface section 基礎プログラミングおよび演習 第4回 担当:花岡 5階522/520 復習 式と変数 C言語の変数は、メモリに作られます。 #include <stdio.h> int main(){ int x; int a: a = 2; x = a*a; printf (”%d”, x); a = 3; printf (”%d”, x); } x 2 2*2 メモリ x a メモリ x a メモリ 2 x a 4 3 x a メモリ メモリ 復習 数学の=と違うところ1 代入(let)と 数学の=(equal)はぜんぜん違う 数学 C言語 #include <stdio.h> int main(){ int x; int a: a = 2; x = a*a; printf (”%d”, x); a = 3; printf (”%d”, x); } を代入 整数 x を宣言 整数 a を宣言 aに2を代入 xに a*aを代入 (xは4) aに3を代入 (xは4のまま) を代入 よく考えると、 数学の = は 意味がいろいろ 復習 数学の=と違うところ2 Cの=はいつも代入の意味 int x; x = 3; これはOK 3 = x; これはエラー invalid lvalue in assignment 代入で左辺値が無効です = は、 右辺を左辺に代入する演算です。 なので、右辺は変数でないとだめです。 。 int x; 3*x = 30; これもエラー。 x=10とはならない。 =は、方程式を解いてはくれない。 復習:式と文 C言語では、「式; 」を文と言います。 他にも文がいくつかあります。 文の例 式の文→式を計算する 3 * 10 ; 式 式の終わりを表すセミコロン 式の文 宣言文→整数の変数iを宣言する 宣言文→実数の変数dを宣言する 宣言文→整数の変数xを宣言し、 3*10を代入(で初期化)する 型名 変数名 初期化の式 セミコロン int i; double d; int x = 3*10; 宣言文 復習: if文 式の値によって分岐する特殊な文 if (条件式) 式が0以外の時に実行する文かブロック else 式が0の時に実行する文かブロック #include <stdio.h> int main(){ if (10/3) printf(”0以外のとき\n”); else printf(”0の時\n”); } 0以外の時 無くてもOK #include <stdio.h> int main(){ if (10/3) printf(”0以外のとき\n”); } 0以外のとき 復習: while 文 何度も繰り返す特殊な文が while 文です。 #include <stdio.h> while(式) int main(){ 文かブロック int i=5; iが0になるまで while(i){ 式の値が0になるまで、文かブロックを printf(”i = %d\n”, i); 繰り返す 繰り返し実行します。具体的には、 i = i–1; } } 1. まず、式を計算します。 2. 式の値が0以外なら、 文かブロックを実行します。 式の値が0なら、4に進みます。 3. 1に戻ります。 4. while文を終わり次に進みます。 i=5 i=4 i=3 i=2 i=1 課題6の if 文 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 a<b a>b a <= b a >= b aとbが等しければ1 異なれば0 aとbが等しければ0 異なれば1 a<b ならば 1 そうでなければ 0 a>b ならば 1 そうでなければ 0 a≦bならば 1 そうでなければ 0 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 (a<b || c<d){ // a<bcまたは<dのときここを実行 } if (x || y){ // x か yのどちらかが // 0でなければ実行 } 条件を書くために便利な演算子 論理演算子(つづき) !a aが0のとき1 そうでなければ 0 +-*/ == != > < && || などは、左右に値が必要 例:a+b a-b a/b a*b a==bなど ! は、右だけに値をとる 例: !a !0 + !1 !(a<b && b<c) 値は1 計算順の優先度(優先順位)がとても高い !a*b は、 (!a)*bの意味 !0*3 は 3 !(0*3)は1 %演算子 割り算の余りを求める演算子です。 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); 0 1 2 0 1 2 0 優先順位は、*/と同じ 10 + 10%3 は 11, (10+10)%3は 2 演算子の優先順位 1. 2. 3. 4. 5. 6. 7. 8. ! 0なら1、0以外は1 */% 積商 mod(余り) +和差 < > <= >= 比較 == != 比較 && 両方0以外なら1(論理積) || 片方以外なら1 = 代入 10 || !1*10<1 == 2>1 && 0 != 0 は、 10 || ( ((!1*10)<1) == (2>1) && (0 != 0) ) 簡単なシミュレーションの話 速度と位置の関係 dx x(t t ) x(t ) v lim dt t 0 t x(t t ) x(t ) v t vt x(t t ) x(t ) x(t t ) x(t ) v(t )t 速度と加速度の関係も同様 v(t t ) v(t ) at 簡単なシミュレーションの話 数式なら y (t t ) y (t ) v(t )t v(t t ) v(t ) gt C言語だと double x=0; double v=0; double dt=0.01; double g=9.8; x = x+v*dt; v = v+g*dt; g y 投げ上げ運動のシミュレーション #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:床で跳ね返るシミュレーション ボールの投げ上げ運動のシミュレーションのプロ グラムを課題のページに置いておきます. 床でボールが跳ね返るように改造してください. できたら次のことにもチャレンジしてください. 跳ね返り係数. 画面の左右端でも跳ね返る. そのほか思いつくこと. ターミナルで動くプログラムのデバッグ ターミナルで動くプログラムも一工夫すると デバッガを使ってデバッグすることができます。 手順の概要 1. 先にターミナルでプログラムを動かす 2. プログラムにデバッガを接続する デバッガ接続の手順 ターミナルでデバッグ対象のプログラム (ここでは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秒待つ ここで止 まります。
© Copyright 2024 ExpyDoc