Presentation is loading. Please wait.

Presentation is loading. Please wait.

基礎プログラミングおよび演習 第8回.

Similar presentations


Presentation on theme: "基礎プログラミングおよび演習 第8回."— Presentation transcript:

1 基礎プログラミングおよび演習 第8回

2 配列1

3 復習: 式と変数 C言語では式に出てくる文字のことを「変数」 といいます。 #include <stdio.h>
復習: 式と変数 C言語では式に出てくる文字のことを「変数」 といいます。 #include <stdio.h> int main(){ int x; int a; a = 2; x = a * a; printf (”%d”, x); a = 3; } 整数 x を用意 (C言語用語で宣言っています) 整数 a を宣言 aに2を代入 xに a*aを代入 aに3を代入

4 復習: 式と変数 2 2 2*2 4 3 C言語の変数は、メモリに作られます。 x x a x a x a x a
復習: 式と変数 C言語の変数は、メモリに作られます。 x #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 メモリ

5 復習: 数学の=と違うところ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のまま) よく考えると、 数学の = は 意味がいろいろ

6 復習: 数学の=と違うところ2 Cの=はいつも代入の意味 = は、 右辺を左辺に代入する演算です。 なので、右辺は変数でないとだめです。
復習: 数学の=と違うところ2 Cの=はいつも代入の意味 = は、 右辺を左辺に代入する演算です。 なので、右辺は変数でないとだめです。 int x; x = 3; 3 = x; これはOK これはエラー invalid lvalue in assignment 代入で左辺値が無効です int x; 3*x = 30; これもエラー。 x=10とはならない。 =は、方程式を解いてはくれない。

7 復習: 変数の宣言 変数の宣言 宣言だけ 宣言してついでに代入 型名 変数名 型名 変数名 式
復習: 変数の宣言 変数の宣言 型名は、 int (整数 integer の略)か、 double(実数 サイズが倍 doubleなので) のどちらか。 変数名は、変数の名前。 最初は英字、2文字目以降は英数字と_なら何でもOK ただし、 int とか doubleのような、C言語で別の意味がある単語はだめ。 (コンパイルエラーがでるので分かります) 代入の式はあってもなくてもOK。 宣言ついでに代入することを、初期化と呼びます。 宣言だけ 宣言してついでに代入 int var1_Name; double var2_Name = 10*sin(1.2); 型名 変数名 型名  変数名  式

8 配列変数 配列とは 複数の変数を一気に宣言する仕組み。
数学の変数の添え字のように便利に使える 数学では、a, b, c, d の代わりに a0, a1, a2, a3と書くと           のような便利な書き方ができる。 C言語では、 int a[3]; // a[0] a[1] a[2] の3つの整数の変数を宣言 double len[2]; // len[0], len[1] の2つの実数の変数を宣言

9 配列変数の宣言と使用 宣言 使用 ここまでは普通の 変数とまったく同じ 添え字に変数が使えます
int a[3]; // a[0] a[1] a[2] の3つの整数の変数を宣言 double len[2]; // len[0], len[1] の2つの実数の変数を宣言 int a[3]; a[0] = 10; a[1]=20; a[2]=30; printf(”%d\n”, a[0]); ここまでは普通の 変数とまったく同じ int a[3]; int i; int sum=0; for(i=0; i<3; ++i){ a[i] = 10*i; } for(i=0; i<3; ++i) sum = sum + a[i]; printf(”%d\n”, sum); 添え字に変数が使えます

10 配列変数を使う 10 20 10 20 10 20 102 a[0] a[1] a[0] a[1] x[0] x[1] a[0] a[1]
#include <stdio.h> int main(){ int a[2]; int x[2]; a[0] = 10; a[1] = 20; int i; for(i=0; i<2; ++i){ // x = a^2 + 2 x[i] = a[i]*a[i] + 2; printf(”x_%d=%d\n” ,i, x[i]); } a[0] a[1] メモリ a[0] a[1] x[0] x[1] 10 20 a[0] a[1] x[0] x[1] 10 20 a[0] a[1] x[0] x[1] i 10 20 102 a[0] a[1] x[0] x[1] i x_0 = 102 x_1 = 402

11 配列での注意 やってはいけない例: a[2]は存在しないのに 無理やり書き込んでしまう。 10 a[0] a[1] i
コンパイル ⇒ 通ってしまいます。 実行 ⇒ 何が起こるかわかりません。 毎回異なる値、セグメンテーションフォールト、保護違反 etc. a[2]は存在しないのに 無理やり書き込んでしまう。 #include <stdio.h> int main(){ int a[2]; int i; a[2] = 10; printf(”%d”, a[3]); } 10 a[0] a[1] i メモリ a[3]は存在しないので、 変な場所から読んできてしまう。

12 配列を使ったプログラムの例 例1:極簡単なシミュレーションのプログラム simsim1.c
#include "curses_subset.h" int main(){ double vx = 20; double vy = 20; // 質点の速度 double px = 5; double py = 5; // 質点の位置 while(!kbhit()){ // 何かキーが押されたら終了。 // 位置の更新: 位置=位置+速度 px += vx*0.05; py += vy*0.05; // 壁との衝突判定 (壁に侵入していたら、戻して速度反転) if (px < 0){ px = 0; vx=-vx; } if (px > 60){ px = 60; vx=-vx; } if (py < 0){ py = 0; vy=-vy; } if (py > 20){ py = 20; vy=-vy; } clear(); move(py, px); printf("*\n"); // 表示 sleep_ms(50); // 0.05秒待つ }

13 例2:例1の質点を配列を使って複数に #include "curses_subset.h" simsim2.c
#define NPOINT 10 // 「以下、NPOINTを10に置換えなさい」の意味 int main(){ int i; double vx[NPOINT]; double vy[NPOINT]; // 質点の速度 double px[NPOINT]; double py[NPOINT]; // 質点の位置 for(i=0; i<NPOINT; ++i){ px[i] = rand() % 60; py[i] = rand() % 20; vx[i] = 20; vy[i] = 20; } while(!kbhit()){ // 何かキーが押されたら終了。 clear(); // 位置の更新: 位置=位置+速度 px[i] += vx[i]*0.05; py[i] += vy[i]*0.05; // 壁との衝突判定 (壁に侵入していたら、戻して速度反転) if (px[i] < 0){ px[i] = 0; vx[i]=-vx[i]; } if (px[i] > 60){ px[i] = 60; vx[i]=-vx[i]; } if (py[i] < 0){ py[i] = 0; vy[i]=-vy[i]; } if (py[i] > 20){ py[i] = 20; vy[i]=-vy[i]; } move(py[i], px[i]); printf("*\n"); // 表示 sleep_ms(50); // Δt=0.05秒待つ simsim2.c

14 例3:さらに関数・構造体も使った場合 #include "curses_subset.h" #define NPOINT 10
struct Mass{// Mass構造体 double vx; double vy; // 質点の速度 double px; double py; // 質点の速度 }; // ランダムな質点を返す関数 struct Mass initMass(){ struct Mass m; m.px = rand() % 60; m.py = rand() % 20; m.vx = 20; m.vy = 20; return m; } // 質点1つのシミュレーションを進める関数 struct Mass stepMass(struct Mass m){ // 位置の更新: 位置=位置+速度 m.px += m.vx*0.05; m.py += m.vy*0.05; // 壁との衝突判定 if (m.px < 0){ m.px = 0; m.vx=-m.vx; } if (m.px > 60){ m.px = 60; m.vx=-m.vx; } if (m.py < 0){ m.py = 0; m.vy=-m.vy; } if (m.py > 20){ m.py = 20; m.vy=-m.vy; } simsim3.c int main(){ int i; struct Mass m[NPOINT]; for(i=0; i<NPOINT; ++i) m[i] = initMass(); while(!kbhit()){ clear(); for(i=0; i<NPOINT; ++i){ // シミュレーションを進める m[i] = stepMass(m[i]); // 表示 move(m[i].py, m[I].px); printf("*\n"); } sleep_ms(50); // Δt=0.05秒待つ

15 復習:for文 他と一緒にささっと飛ばしましたが、for文は良く使うので覚えましょう。 こうすると、ちょうど上手く、
文かブロック double x[10]; for(int c=0; c<10; ++c){ x[c] = c*c; } 式1を実行 式2の値が0なら文かブロックを飛ばして次へ 文かブロックを実行 式3を実行 2.から繰り返し こうすると、ちょうど上手く、 配列のx[0],x[1],…,x[9] に 0*0, 1*1, …, 9*9 が代入されます。 配列宣言も10, for文の式2も10で ちょとうれしい。 for(int c=0; c<3; c++){ printf(”*”); } ***

16 課題13:配列を使ってみる シミュレーションの質点を配列を使って 複数にしてください。

17 課題14: テキストゲームの改良 課題11のゲームを配列を使って、障害物が同時に複数出るように改良してください。
課題11で自分が作ったものを元にしてください。 工夫して面白いゲームにしてくださいたとえば、 当たると得点が増えるアイテムを出す 障害物の数を得点に比例させる 障害物に動きをつける などなど


Download ppt "基礎プログラミングおよび演習 第8回."

Similar presentations


Ads by Google