bp04

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
vt  x(t  t )  x(t )
x(t  t )  x(t )  v(t )t
速度と加速度の関係も同様
v(t  t )  v(t )  at
簡単なシミュレーションの話
数式なら
y (t  t )  y (t )  v(t )t
v(t  t )  v(t )  gt
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秒待つ
ここで止
まります。