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

Slides:



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

C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
1 第5回 配列. 2 今回の目標 マクロ定義の効果を理解する。 1次元配列を理解する。 2次元配列を理解する。 ☆2 × 2の行列の行列式を求めるプログラ ムを作成する.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
基礎プログラミングおよび演習 第4回 担当:花岡 5階522/520.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング論 I 行列の演算
基礎プログラミングおよび演習 第9回
プログラミング入門2 第1回 導入 情報工学科 篠埜 功.
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
第10回 プログラミングⅡ 第10回
第7回 条件による繰り返し.
C言語講座 第3回 ポインタ、配列.
プログラミング2 関数
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
基礎プログラミングおよび演習 第13回 担当:長谷川晶一5階522/520 14回は、期末テストをします。
第二回 VB講座 電卓を作ろう.
関数の定義.
プログラミング応用 printfと変数.
第10回関数 Ⅱ (ローカル変数とスコープ).
Cプログラミング演習 第7回 メモリ内でのデータの配置.
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング序論 2. n人のインディアン.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
知能情報工学演習I 第12回(後半第6回) 課題の回答
基礎プログラミングおよび演習 第3回
前回の練習問題.
第7回 条件による繰り返し.
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
C言語 はじめに 2016年 吉田研究室.
アルゴリズムとプログラミング (Algorithms and Programming)
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
精密工学科プログラミング基礎 第7回資料 (11/27実施)
第5章 まだまだ続く反復処理!! ~繰り返しその2 for~
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
プログラミング基礎演習 第4回.
ループだよ!難しいよ! 第5章 while(ループ);.
標準入出力、変数、演算子、エスケープシーケンス
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング入門2 第5回 配列 変数宣言、初期化について
第4回 配列.
知能情報工学演習I 第11回(後半第5回) 課題の回答
C言語講座第5回 2017 構造体.
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
第5回 配列.
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
第1章 文字の表示と計算 printfと演算子をやります.
Presentation transcript:

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

配列1

復習: 式と変数 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を代入

復習: 式と変数 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 メモリ

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

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

配列変数 配列とは 複数の変数を一気に宣言する仕組み。 数学の変数の添え字のように便利に使える 数学では、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つの実数の変数を宣言

配列変数の宣言と使用 宣言 使用 ここまでは普通の 変数とまったく同じ 添え字に変数が使えます 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 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

配列での注意 やってはいけない例: 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]は存在しないので、 変な場所から読んできてしまう。

配列を使ったプログラムの例 例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秒待つ }

例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

例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秒待つ

復習: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(”*”); } ***

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

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