プログラミング技法 演習 1 演習 1 1 数値計算の基礎 演習 実習 1 1 以下のプログラムを実行し, 結果がプログラムの意図通りのものか確認せよ. 1:#include <stdio.h> 2:int main() 3:{ 4: double x = 0; 5: int i; 6: for (

Size: px
Start display at page:

Download "プログラミング技法 演習 1 演習 1 1 数値計算の基礎 演習 実習 1 1 以下のプログラムを実行し, 結果がプログラムの意図通りのものか確認せよ. 1:#include <stdio.h> 2:int main() 3:{ 4: double x = 0; 5: int i; 6: for ("

Transcription

1 プログラミング技法 演習 1 演習 1 1 数値計算の基礎 演習 実習 1 1 以下のプログラムを実行し, 結果がプログラムの意図通りのものか確認せよ. 1:#include <stdio.h> 2:int main() 3: 4: double x = 0; 5: int i; 6: for (i = 0; i < 100; i++) 7: x += 0.1; 8: 9: printf("%2.15lf\n", x); 10: return 0; 11: 実習 1 2 以下のプログラムを入力実行せよ. 次に, 途中の計算順を d = a - c; e = d + b; として同様に実行せよ. さらに, この 2 つの結果の差違について原因を考えよ. 1:#include <stdio.h> 2:int main() 3: 4: double a = 1234e10, b = 2e-4; 5: double c = 1233e10, d,e; 6: d = a + b; 7: e = d - c; 8: printf("%.4lf\n",e); 9: return 0; 10: 実習 1 3 教材プリントの問題 1 2,1 3 のプログラムを実行し結果を確認せよ.

2 演習 2 1 計算機の基礎 実習 1 4 以下のプログラムは 10 進数を 2 進数に変換するためのプログラムである. 1:#include <stdio.h> 2: 3:int main() 4: 5: int dec, work,i; 6: char bin[8]; 7: 8: printf("0 255 の値を入力 :"); 9: scanf("%d",&dec); 10: work = dec; 11: for (i = 0; i < 8; i++) 12: if (work % 2!= 0) 13: bin[i] = '1'; 14: else 15: bin[i] = '0'; 16: 17: work /= 2; 18: 19: printf("%d = ",dec); 20: for (i = 7; i >= 0; i--) 21: printf("%c",bin[i]); 22: 23: printf("\n"); 24: 1. プログラムを実行し, 適当な値を入力し動作を確認せよ. 2. ( やや難 ) 上記のプログラムを参考に小数の 10 進数を 2 進数に変換するプログラムを作成せよ.(2 進数は小数点以下 15 桁程度とし, それ以下は無視してよい ) 3. 作成したプログラムを用いて,10 進の 0.1 が授業で説明したような値になるか確認せよ.

3 プログラミング技法 演習 1 演習 3 演習 1 解説, プログラム例 実習 1 1 以下の実行結果の例のように正確に 1.0 になることはありません.( 実行環境により結果は若干変る場合があります.) 実行結果例 実習 1 2 実行結果の例を以下に示します. 実行結果例 ( 変更前 ) 実行結果例 ( 変更後 ) 解説 変更前の計算は ( ) であり, 括弧の計算は情報落ちの誤差により となります. 結果として計算は となります. 変更後は ( ) となり, 結果として計算内容は, となり左の項の桁が下がります. このため, 情報落ちの誤差が発生しない演算となり, 正しい結果が得られることになります. 上記のように計算順によっても, 各種誤差が発生する場合としない場合があり, 精密な計算をする場合は計算順にも気を使う必要があります. 実習 1 3 プログラムのみを示します. 問題 1-2 のプログラム 1:#include <stdio.h> 2:int main() 3: 4: int sum = 0,i; 5: for (i = 1; i <= 100; i++) 6: sum += i; 7: 8: printf("%d\n", sum); 9: return 0; 10:

4 演習 4 1 計算機の基礎 問題 1-3 のプログラム 1:#include <stdio.h> 2:int main() 3: 4: int a,b,c,i; 5: a = 1; b = 2; 6: for (i = 3; i<=6; i++) 7: c = 2 * a + b; 8: a = b; b = c; 9: 10: printf("%d", c); 11: return 0; 12: 実習 のプログラムのみ示します. 1:#include <stdio.h> 2:#define N 20 // 小数点以下の桁数 3:int main() 4: 5: double dec, work; 6: int i; 7: char bin[n]; 8: printf("0 1 の間の小数を入力 "); 9: scanf("%lf",&dec); 10: work = dec; 11: for (i = 0; i < N; i++) 12: work *= 2; 13: if (work >= 1) 14: bin[i] = '1'; 15: work -= 1; 16: else 17: bin[i] = '0'; 18: 19: 20: printf("%f = 0.",dec); 21: for (i = 0; i < N; i++) 22: printf("%c",bin[i]); 23: 24: return 0; 25:

5 プログラミング技法 演習 2 演習 5 2 方程式 f(x) = 0 の解法 演習 実習 2 1 二分法による f(x) = 0 の解の導出について 教材プリント 10 ページの問題 2 2 の, 結果を確認せよ. また, 下に示したように, 計算途中の a,b,c,f(c) の値を表示できるようプログラムを修正し, 二分法による計算の様子を確認せよ. 2. プログラムは関数が右肩下りの場合でも正常に解を求めることができる. 目的関数を sin x, 初期値を a = 3, b = 5 として, 実行し動作を確認せよ. a b c func(c) 略 答えは です. 実習 2 2 ニュートン法のプログラムについて. 1. 教材プリント 15 ページの問題 2 4 のプログラムを実行し確認せよ. また, 計算途中の x n, x n+1 を表示できるよう, プログラムを修正し, 実行確認せよ. 2. ニュートン法のプログラムは, 初期値が解と離れ過ぎていると, 収束しない場合がある. 以下の 3 次方程式を初期値を 2 として計算を行え. この場合, ニュートン法では解に収束しないことを確認せよ.( プログラムは 1. で修正した途中経過が見えるものを用いよ ) x 3 3x 2 x + 7 = 0 3. 一定回数 (20 回程度 ) 繰り返し計算をしても終了条件を満たさない場合, 画面に 収束しませんでした と表示し終了するように修正せよ. また,2. の式を用いて, 動作を確認せよ. 1 以下の演習は終端条件 ε = 程度として行うこと

6 演習 6 実習 2 3 ニュートン法は解を求めたい関数の導関数を予め求めておく必要があり, やや手間が増えることが難点である. この点を回避するための計算方法として, 割線法と呼ばれる方法がある. 図のように, 点 P 1, P 2 の 2 点を通る直線を接線の近似線として, ニュートン法と同様の処理を行う方法である. y f(x 1 ) f(x 2 ) 2 方程式 f(x) = 0 の解法 y = f(x) P 1 P 2 1. P 1, P 2 を通る直線の方程式を求める. 以下の空白を埋めよ. x 3 x 2 x 1 x 直線の傾き m は m = ある点 (x p, y p ) を通る傾き m の直線は y y p = m(x x p ) で表わされる. これより, 点 P 1 を通る直線の方程式を求めよ. y = この結果より,x 1, x 2 から x 3 を求める式を求めよ. また,x n 2, x n 1 より,x n を求める式を求めよ. x 3 = 2. 上記の内容を参考に x n 2, x n 1 より,x n を求める式を求めよ. x n = 3. f(x) を問題 2 4 の x + log x, 初期値を x 1 = 2, x 2 = 1.8 として,x 10 を計算せよ.(Excel を用いると簡単にできる ) 4. 割線法の考え方を用い,3. と同様の条件で x + log x = 0 の解を求めるプログラムを作成, 実行せよ.

7 プログラミング技法 演習 2 演習 7 実習 2 4 ( やや難 ) 複数の解を自動的に求めるようなプログラムを作成する. 1. 二分法の部分を関数化せよ. 下に示したような形の関数として,a,b には二分法に必要な初期値, 返り値は f(x) = 0 の解となるように関数を作成せよ. なお, 求める関数は別に f という名前で定義されているものとする. double solve(double a, double b) 2. ある y = f(x) の区間 (x, x+dx) の間に f(x) = 0 の解 x 0 が存在する場合,f(x)f(x+dx) < 0 の関係が成り立つ. 以下の手順により, 指定した区間 (x s, x e ) の間にある, 解が, おおよそどこにあるのか調べることができる. (a) 調査区間 (x s, x e ), 調査間隔 dx を指定 (b) f(x)f(x + dx) の符号をチェック 0 以下だったら何らかのメッセージを表示 正ならなにもしない (c) x x + dt として,x が x e になるまで 2 へもどる この手順に従ったプログラムを作成し実行せよ. 関数と調査区間は適当なものを選ぶこと.( 例えば,(x 1)(x 3)(x + 1), 区間は ( 5, 5) など ) 3. (1) の二分法による求解関数と,(2) の解の存在確認のプログラムを組合せて, 区間を指定したら, その区間の関数 f(x) = 0 の解を自動的に計算, 表示するようなプログラムを作成せよ.

8 演習 8 2 方程式 f(x) = 0 の解法 Memo

9 プログラミング技法 演習 2 演習 9 演習 2 解説, プログラム例 実習 2 1 略 実習 以下のような計算を繰り返し, 値は収束しない. x_n x_n プログラム例を以下に示す.cnt という変数を用いて計算回数を記憶し, 規定回数を超えたら break 文で終了するようにしてあります. #include <stdio.h> #include <math.h> #define EPS 1.0e-8 // 終端条件の値 double f(double); // 対象関数 double df(double); // f(x) の導関数 int main(void) double x0, x1; int cnt = 0; x0=2; // 初期値の設定 while(1) // 無限に繰り返します x1 = x0 - f(x0) / df(x0); printf("%f %f\n", x0,x1); if (fabs(f(x1)) < EPS) // 終端条件 printf(" 解は %f です.\n", x1); break; else if (cnt > 20) // 非収束の場合 printf(" 収束しませんでした \n"); break; 以下略 cnt++; x0 = x1; // 求めた x1 を次は x0 とする 実習 P 1 と P 2 を通る直線の傾き m = f(x 2) f(x 1 ) x 2 x 1 直線の方程式 y = f(x 2) f(x 1 ) x 2 x 1 (x x 1 ) + f(x 1 ) 2. x n と x n 1, x n 2 の関係式 x 3 = x 1f(x 2 ) x 2 f(x 1 ) f(x 2 ) f(x 1 ) x n = x n 2f(x n 1 ) x n 1 f(x n 2 ) f(x n 1 ) f(x n 2 ) 4. 割線法によるプログラムニュートン法のプログラムと異なり, 導関数 f は必要ありません. /* 割線法による f(x)=0 の解を求める */ #include <stdio.h> #include <math.h> #define EPS 1.0e-8 // 終端条件の値 double f(double); // 対象関数 int main(void) double x0, x1, x2; int cnt = 0; x0 = 2; x1 =1.8;// 初期値の設定 while (true) x2 = x1 - (x1 - x0) / (f(x1) - f(x0))*f(x1); //printf("%f %f %f\n",x1,f(x1),x2); if (fabs(f(x1)) < EPS) // 終端条件 printf("x = %f\n", x1); break; else if (cnt >= 10) printf(" 収束しませんでした."); break; x0 = x1; x1 = x2; cnt++; return 0; double f(double x) return x + log (x); // 求めた x1 を次は x0 とする

10 演習 10 2 方程式 f(x) = 0 の解法 実習 二分法による求解関数 double solve(double a, double b) double c; while(1) // 無条件に繰り返し続けます c = (a + b) / 2; if (f(c)*f(a) < 0) b = c; if (f(c)*f(b) < 0) a = c; if (fabs(f(c)) < EPS) break; return c; 2. 解の探索プログラム #include <stdio.h> double f(double x); int main() double x_s, x_e, x, dx; scanf("%lf %lf %lf", &x_s, &x_e, &dx); for (x = x_s; x <= x_e; x += dx) if (f(x) * f(x+dx) < 0) printf("%f - %f の間に解あり \n",x, x+dx); return 0; double f(double x) return (x-3)*(x-1)*(x+3); 3. 自動求解プログラム #include <stdio.h> #include <math.h> #define EPS 1.0e-8 double f(double x); double solve(double a, double b); int main() double x_s, x_e, x, dx, x0; printf(" 開始点, 終了点, 刻み幅 "); scanf("%lf %lf %lf", &x_s, &x_e, &dx); for (x = x_s; x <= x_e; x += dx) if (f(x) * f(x+dx) < 0) x0 = solve(x, x+dx); printf(" 解 :%f\n",x0); return 0; double solve(double a, double b) double c; for (;;) // 無条件に繰り返し続けます c = (a + b) / 2; if (f(c)*f(a) < 0) b = c; if (f(c)*f(b) < 0) a = c; if (fabs(f(c)) < EPS) break; return c; double f(double x) return (x-3)*(x-1)*(x+3);

11 プログラミング技法 演習 3 演習 11 3 曲線の積分 演習 実習 3 1 長方形の和, 台形則, シンプソン法の 3 つの手法により積分を求めよ. なお, 積分区間を 40 分割して近似計算を行うこと. (1) (2) 5 1 π 0 (x 3 9x x 15) dx (= 0) sin tdt (= 2) 実習 3 2 シンプソン法は曲線を曲線上の 3 点を通る 2 次曲線で近似を行い, その近似曲線から得られる面積を, 面積の近似値として用いる. これに対して, 曲線上の 4 点を通る 3 次曲線で元の曲線を近似する方法が存在する. これはシンプソン法を拡張したもので,1 区画の面積 s k は s k = 3 x 8 (f(x k) + 3f(x k+1 ) + 3f(x k+2 ) + f(x k+3 )) s で表され,x 0 x n の面積 S は S = S 1 + S 4 + S 7 + として計算される 2. なお, この公式を用いる場合は区間の分割数は 3 の倍数である必要がある. この公式を用いて, 演習 3 1 の積分について計算を行え. 積分区間の分割数は 39 とすること. 2 2 次式で近似されたものをシンプソンの 1/3 則公式,3 次式で近似されたものをシンプソンの 3/8 則公式と区 別して呼ぶ場合がある.

12 演習 12 3 曲線の積分 実習 3 3 ある物体が, 下に示したグラフのように速度を変化させながら移動した. この物体の移動距離を考える. 移動距離はグラフ上の面積として表わされる. この計算を区分求積法により行なう. 1. 区間 t = 0 2 および区間 t = 2 4 における速度の式を求めよ. 2. 移動距離を計算せよ.( 区分求積ではなく, 一般的な方法で ) 3. 次のページのプログラムの空欄を埋め, 移動距離を区分求積によって求めるプログラムを完成せよ. v t #include <stdio.h> double func(double); int main() double start = 0, end = 4; // 積分区間 double t, dt = 0.1; double s = 0; for (t = start; t < end; t += dt) (a) ; printf(" 移動距離は %.8f です.\n",s); return 0; double func(double t) // 移動速度の関数 double ret = 0; if ( (b) ) (c) ; else if ( (d) ) (e) ; return ret;

13 プログラミング技法 演習 3 演習 13 実習 3 4 真空中に 1µC の点電荷が存在する. この点電荷から 2m 離れた地点より,1m 離れた地点の電位差計算する. 1μC 1m 2m V[V] 1. 点電荷から r[m] 離れた地点での, 電解中から受ける力を示せ. 2. 求める値を導くための積分式を示せ. 3. 上記の結果に基づいて, シンプソン法を用いて, 積分値を算出せよ. なお, 積分間隔は x = 1cm とすること. 真空中の誘電率は ε 0 = とする. 実習 3 5 数値積分は積分区間を細かくするほど, 正確な積分値を求めることが出来る. 長方形の和, 台形公式, シンプソン法によって ln x を [1, e] の区間で積分したとき, 何分割すれば必要な精度が得えられるのか調べよ. 必要な精度はここでは, 真値に対して誤差が 以下であるものとして考えること. なお, 式中 ln x 関数は,C 言語では log(x) 関数を用いる.

14 演習 14 3 曲線の積分 実習 3 6 ( やや難 ) 積分により面積を求める場合, 図のような場合を考えると式は b a f(x) dx についての演算を行うこととなる. しかしシンプソン法などの区分求積法を用いると, 点 c 付近の正負の処理がいい加減になる場合が考えられる. これに関して,f(x) = 0 の点 c の値を正確に求め, c a f(x)dx + b c f(x)dx のような形で分割した積分を行う必要があると思われる. 上記のような考え方を元に, 自動的に x 軸と関数の交点を求め, 面積を求めるプログラムを作成する. 1. ( 実習 2 3 の 2. と同じです.) ある y = f(x) の区間 (x, x + dx) の間に f(x) = 0 の解 x 0 が存在する場合,f(x)f(x + dx) < 0 の関係が成り立つ. 以下の手順により, 指定した区間 (x s, x e ) の間にある, 解が, おおよそどこにあるのか調べることができる. (a) 調査区間 (x s, x e ), 調査間隔 dx を指定 (b) f(x)f(x + dx) の符号をチェック 0 以下だったら何らかのメッセージを表示 正ならなにもしない (c) x x + dt として,x が x e になるまで 2 へもどる の結果と以下の 2 つの関数を用いて面積を求めるプログラムを完成せよ. 3. また, 作成した面積計算プログラムを用い, 区間 [0:6] における f(x) = x 3 9x x 15 と x 軸とで囲まれた面積を求めよ. シンプソン法の求積関数 二分法による求解関数 double simpson(double st, double ed) double x, s = 0, h; int k, n = ((int)(10 * (ed - st)))*2; h = (ed - st) / n; for (k = 0; k < n; k += 2) x = st + h*k; s += h/3 * (fabs(f(x)) + 4 * fabs(f(x+h)) + fabs(f(x + h*2))); return s; double solve(double a, double b) double c; for (;;) // 無条件に繰り返し続けます c = (a + b) / 2; if (f(c)*f(a) < 0) b = c; if (f(c)*f(b) < 0) a = c; if (fabs(f(c)) < EPS) break; return c; Note! 関数 simpson の n = ((int)(10 * (ed - st)))*2; の式は刻み幅をおおよそ 0.05 程度にするための式です.

15 プログラミング技法 演習 3 演習 15 演習 3 解説, プログラム例 実習 3 1 計算結果を示します. 長方形の和 台形公式 シンプソン法 (1) (2) 実習 3 2 ループ内のみ示します. for (k = 0; k < n; k += 3) s += 3*h/8 * (func(x) + 3*func(x+h) + 3*func(x+2*h) + func(x+3*h)); x += 3*h; 積分値は,(1) , (2) 実習 以下の通り v = t (0 t 2) v = 3 t/2 (2 t 4) 空欄部分のみ示す. (a) s += dt * func(t) (b) t >= 0 && t < 2 (c) ret = t (d) t >= 2 && t < 4 (e) ret = 3-t/2 実習 3 4 電位の計算は,l[C] の電荷がクーロン力に逆らって動かす仕事なので, クーロン力は, F = Qq 4πε 0 r 2 であるから, 以下のような積分計算を行えばよいことになります. 1 Q V = 2 4πε 0 r 2 dr Q = 1[µC], ε 0 = とすると, 電位差は V = [V] になります. 実習 3 5 おおよそ, 以下の分割数で精度が出でます. 長方形の和 : 8592 分割台形公式 : 40 分割シンプソン法 : 6 分割 実習 3 6 最終的なプログラムの例を示します. #include <stdio.h> #include <math.h> #define EPS 1e-10 double solve(double a, double b); double simpson(double s, double e); double f(double x); int main() double start, end, step; double x, x1, x2; double s = 0, ss; printf(" 初期値, 終端値, 間隔 "); scanf("%lf %lf %lf", &start, &end, &step); x1 = start; for (x = start; x < end; x += step) if (f(x) * f(x+step) < 0) x2 = solve(x, x+step); ss = simpson(x1,x2); printf("%f - %f 間の面積 =%f\n",x1,x2,ss); s += ss; x1 = x2; else if (x+step >= end) ss = simpson(x1,end); printf("%f - %f 間の面積 =%f\n",x1,end,ss); s += ss; printf(" 面積は %f\n", s); double solve(double a, double b) double c; for (;;) // 無条件に繰り返し続けます c = (a + b) / 2; if (f(c)*f(a) < 0) b = c; if (f(c)*f(b) < 0) a = c; if (fabs(f(c)) < EPS) break; return c; double simpson(double st, double ed) double x, s = 0, h; int k, n = ((int)(10 * (ed - st)))*2; h = (ed - st) / n; for (k = 0; k < n; k += 2) x = st + h*k; s += h/3 * (fabs(f(x)) + 4 * fabs(f(x+h)) + fabs(f(x + h*2))); return s; double f(double x) return x*x*x - 9*x*x + 23*x - 15;

16 演習 16 3 曲線の積分 MEMO

17 プログラミング技法 演習 4 演習 17 4 微分方程式の解法 演習 実習 4 1 教材プリント 4 節の問題 4 2,4 5 のプログラム, および下のファイルへの書き込みプログラムをもとに, オイラー法, 改良オイラー法, ルンゲ クッタ法を用いて,dx/dt = x の解曲線を計算し, 曲線をグラフ表示せよ. 初期値は適当に幾つかの値で試すこと.( プログラムは適宜変更すること ) また, 同じプログラムを用いて, 以下の方程式の解曲線を計算せよ. dx dt = cos t ( 解軌跡は sin 関数の形状になるはずである ) ファイル書き込みプログラム #include <stdio.h> int main(void) FILE *fp; int i; fp = fopen("testfile.csv","w"); for (i = 0; i < 10; i++) fprintf(fp, "%d,%d\n",i, 10 - i); fclose(fp); return 0; 実習 4 2 回路のシミュレーション右図のような RC 回路についてシミュレーションを行なう. コンデンサには q 0 の電荷 ( 通常は 0) が蓄えられているとし, 時刻 t = 0 でスイッチをオンにしたときの, 回路の動作について計算を行なう. 電流 i の回路方程式は Ri + 1 idt = E C と表わせる. ここで,i = dq/dt を用いて上式を書き替えると, dq dt + q RC = E R となる. この微分方程式より, コンデンサに掛かる電圧 v c を計算 (v c = q/c) することができる. 1. この考え方を用いて,v c の計算をせよ. なお,R = 100[Ω],C = 100[µF],E = 5[V] とし, コンデンサの初期電荷は以下の 2 通りとする. (a)q 0 = 0[C], (b)q 0 = 5[mC] 2. 結果を t v c グラフとして表示せよ.

18 演習 18 4 微分方程式の解法 実習 4 3 教材プリントの問題 4 3 で用いた連立微分方程式を解くプログラムを用いて, 自由落下のシミュレーションを行う. 1. 自由落下の運動を表わす微分方程式 d y dt = v m d v dt = mg (m はこの場合は任意の値 ) の解軌跡の計算をせよ. また,t v 平面,t y 平面のグラフを表示し, 自由落下の現象がみられるか確認せよ. 2. 落下時に物体に働く空気の抵抗を考慮すると, 方程式は d y dt = v m d v = mg + kv dt となる.k は粘性係数であり, 抵抗が強ければ k の値が大きくなる. 適当な m, k を定めて,1. の場合と比較せよ. 実習 4 4 振り子のシミュレーション初等物理で扱う単振り子は, 振幅が小さい場合など, 制約がある状態で近似的に議論をしている. 計算機を用いた初期値問題では, このような近似をせずに, 振り子の状態を計算することができる. 鉛直方向からの角度 θ に注目し, 微分方程式を組み立てると, m d2 (lθ) dt 2 = mg sin θ θ l ω m のような 2 階の微分方程式となる. ここで, 角度と角速度 ω の関係式 dθ/dt = ω を用いると, 微分方程式は以下のようになる. dθ dt = ω dω dt = g l sin θ 1. 上記の振り子の微分方程式の考え方を用いて, 以下の場合について, シミュレーションを行なえ. t = 0.01 とし,200 ステップ程度計算すること. (a) (θ, ω) = (π/6, 0), l = 1 (b) (θ, ω) = (0, 10), l = 1 2. 結果を t ω および,t θ のグラフとして表示せよ.

19 プログラミング技法 演習 4 演習 19 実習 4 5 以下の式は, ローレンツ方程式と呼ばれる特殊な解軌跡が表われる微分方程式である. 問題 4 3 で用いた連立微分方程式を解くプログラムを 3 元の連立微分方程式用に拡張し, 下記の微分方程式について, 解曲線を計算せよ. 刻み幅, 初期値などは適当に定めること. dx = σ(y x) dt dy = ρx y xz dt dz = βz + xy, ただしβ = 8/3, σ = 10, ρ = 24 dt 実習 4 6 斜方投射のシミュレーション図のように物体を斜めに投げ上げた場合について考える. このような場合は, 横方向と縦方向が独立した運動になり, それぞれ y v 0 m F F x = ma x = 0 F y = ma y = mg のような運動方程式となる. この式は, 以下のような 4 元の連立微分方程式と表すことができる. v 0y (x 0, y 0 ) v 0x x dx dt = v x, dy dt = v y, dv x dt = 0 dv y dt = g 1. 上記の考え方に基いて, 初期位置 (0,0), 初速度 (1[m/s],1[m/s]) として, 軌跡を計算せよ. 2. プログラムを修正し, 初速度と打ち出し角度を指定して, シミュレーションを行なうようにせよ. 3. 初速度 10[m/s] とし, 角度を 30,45,60 度 ( ラジアンに変換の必要あり ) とし, 到達距離を比較せよ.

20 演習 20 4 微分方程式の解法 実習 4 7 ( やや難 ) n 次の連立微分方程式をオイラー法を用いて計算するプログラムについて,n の値が大きくなると変数の数が増え, プログラムが冗長になる. これを防止するために, 計算する変数を配列を用いて処理することを考える. 例えば, 以下のような微分方程式 dx 1 dt = x 2 dx 2 dt = x 1 を, 次のような関数として表わすとする. void equ(double x[],double dx[], double t) dx[0] = x[1]; dx[1] = -x[0]; 1. このような配列を用いた形のオイラー法の計算プログラムを作成せよ. 2. 作成したプログラムを用いて, 上記の微分方程式について, 初期値を (x 1, x 2 ) = (1, 0) として解曲線を計算せよ. 3. 作成したプログラムを用いて, 演習 4 5 の方程式の解曲線を計算せよ.

21 プログラミング技法 演習 4 演習 21 演習 4 解説, プログラム例 実習 4 1 dx/dt = cos t に対しては,sin 曲線が描けるはずである. ただし, t が大きいと, 正しい形にならない場合がある. 01:#include <stdio.h> 02:#include <math.h> 03:double f(double x, double t); 04:int main(void) 05: 06: FILE *fp = fopen("euler.csv","w"); 07: double x = 0, new_x; 08: double t = 0, dt = 0.01, t_end = 2*3.1415; 09: while (t <= t_end) 10: new_x = x + dt * f(x, t); 11: fprintf(fp,"%f, %f\n ", t, x); 12: x = new_x; 13: t = t + dt; 14: 15: fclose(fp); 16: return 0; 17: 18:double f(double x, double t) 19: 20: return cos(t); 21: 実習 4 2 微分方程式を表わす関数は以下のようになります. また, グラフは t q グラフを示しています. 縦軸は v c = q/c の関係から変換することができます. double f(double x, double t) double R = 100, C = 100e-6, E = 5; return E/R - x/(r*c); q-t グラフ q1 q q 実習 関数 f1,f2 を以下のようにすることで自由落下のシミュレーションが行える. t double f1(double x1, double x2, double t) return x2; double f2(double x1, double x2, double t) return -9.8; 初速度 0 からの自由落下の様子のフラフを示す.

22 演習 22 4 微分方程式の解法 y t-y グラフ t v t-v グラフ 関数 f1,f2 を以下のようにすることで自由落下のシミュレーションが行える. この場合は k = 1.0, m = 1.0 としている. double f1(double x1, double x2, double t) return x2; double f2(double x1, double x2, double t) double k = 1, m = 1; return k / m * x2; 初速度 0 からの落下の様子を示す. 重力と粘性抵抗が釣り合い, 一定速度に漸近することが分かる. t t-y グラフ t-v グラフ 0 0 y -20 v -5 実習 t 微分方程式の関数は以下のような 2 元の連立になります. グラフは, 左の場合, 普 通の揺れ方を示していますが, 右の場合, 振り子は回転しており,θ の値は増加しつづけています. t

23 プログラミング技法 演習 4 演習 23 void f1(double x1, double x2, double t) return x2; void f1(double x1, double x2, double t) double g = 9.8, l = 1; return -g/l * sin(x1); θ 0 θ t t 実習 4 5 グラフ表示例 初期値によって, 波形は大きく異なります. なお, 時間刻みを小く取らないと, 計算が上手くいかない場合があります. x t-x グラフ t y x-yグラフ x 実習 4 6 プログラム例を示します. グラフは一般的な放物線なので, ここでは割愛します.

24 演習 24 4 微分方程式の解法 1:#include <stdio.h> 2:#include <math.h> 3:double f1(double, double, double, double, double); 4:double f2(double, double, double, double, double); 5:double f3(double, double, double, double, double); 6:double f4(double, double, double, double, double); 7:int main() 8: 9: FILE *fp = fopen("euler-2d.csv","w"); 10: double t = 0, dt = 0.01, t_end = 1; 11: double x1 = 0, x2 = 1, new_x1, new_x2; 12: double x3 = 0, x4 = 1, new_x3, new_x4; 13: while (t <= t_end) 14: fprintf(fp,"%f, %f, %f, %f, %f\n ", t, x1, x2,x3,x4); 15: new_x1 = x1 + dt * f1(x1, x2, x3, x4, t); 16: new_x2 = x2 + dt * f2(x1, x2, x3, x4, t); 17: new_x3 = x3 + dt * f3(x1, x2, x3, x4, t); 18: new_x4 = x4 + dt * f4(x1, x2, x3, x4, t); 19: x1 = new_x1; x2 = new_x2; 20: x3 = new_x3; x4 = new_x4; 21: t = t + dt; 22: 23: fclose(fp); 24: return 0; 25: 26:double f1(double x1, double x2, double x3, double x4, double t) 27: 28: return x2; // dx/dt = vx 29: 30:double f2(double x1, double x2, double x3, double x4, double t) 31: 32: return 0; // dvx/dt = 0 33: 34:double f3(double x1, double x2, double x3, double x4, double t) 35: 36: return x4; // dy/dt = vy 37: 38:double f4(double x1, double x2, double x3, double x4, double t) 39: 40: return -9.8; // dvy/dt = -g 41: 2. 上記のプログラムの x2,x4 の初期値を, それぞれ x2=cos(angle); x4=cos(angle) とすればよい.angle は打ち出し角度 ( ラジアン ) です 度の場合が一番遠くへ到達します.

25 プログラミング技法 演習 5 演習 25 5 構造体 演習 実習 左のプログラムを入力実行し, 構造体の動作を確認せよ. 2. 右のプログラムは左と同様の動作を意図して作られたものである. 実行できるか確認せよ. 1:#include <stdio.h> 2: 3:struct sample 4: int a,b; 5: double x; 6:; 7: 8:int main() 9: 10: struct sample A=1,2,5.0; 11: struct sample B,C; 12: printf("a の内容の表示 \n"); 13: printf("%d %d %f\n", A.a,A.b,A.x); 14: B.a = A.a; B.b = A.b; B.x = A.x; 15: printf("a のメンバの 2 倍の値が表示 \n"); 16: printf("%d %d %f\n", 17: A.a+B.a,A.b+B.b,A.x+B.x); 18: C = A; 19: printf("a と同じ内容が表示 \n"); 20: printf("%d %d %f\n", C.a,C.b,C.x); 21: return 0; 22: 1:#include <stdio.h> 2: 3:struct sample 4: int a,b; 5: double x; 6:; 7: 8:int main() 9: 10: struct sample A=1,2,5.0; 11: struct sample B,C; 12: printf("a の内容の表示 \n"); 13: printf("%d %d %f\n", A); 14: B=1,2,5.0; 15: printf("a のメンバの 2 倍の値が表示 \n"); 16: printf("%d %d %f\n",a+b); 17: C = A; 18: printf("a と同じ内容が表示 \n"); 19: printf("%d %d %f\n", C); 20: return 0; 21: 実習 5 2 以下のプログラムは, 構造体の基本的な代入などの文法を確認するためのものである. 1. プログラムを実行し, 値の代入の文法の確認をせよ. 特に a のように配列のメンバに関連する文法に注意すること 行目のコメントをはずし,B にどのような値が代入されたか確認せよ 行目で, 構造体の配列 C の 0 番目に A を代入している.19 行目以降に,C[0] のメンバの表示するためのプログラムを追加せよ. 1:#include <stdio.h> 2: 3:struct example1 4: int a[3]; 5: double b; 6: char c; 7:; 8:int main() 9: 10: struct example1 A = 1,2,3,2.0,'a', B, C[10]; 11: printf ("%d %d %d\n", A.a[0], A.a[1], A.a[2]); 12: printf ("%f %c\n", A.b, A.c); 13: B.a[0] = 10; B.a[1] = 15; B.a[2] = 20; 14: B.b = 0.1; B.c = 'Z'; 15: //B=A; 16: printf ("%d %d %d\n", B.a[0], B.a[1], B.a[2]); 17: printf ("%f %c\n", B.b, B.c); 18: C[0] = A; 19: // (*) 20: return 0; 21:

26 演習 26 5 構造体 実習 5 3 以下は,5 人分のデータを exam 構造体の配列に読み込み, その中で最高点の人のデータを表示するプログラムである. 空白部を埋めよ. 1:#include <stdio.h> 2:#define N 5 3:struct exam // 構造体定義 4: int no, math, eng, phys; 5:; 6:int total(struct exam); // 合計を求める関数 7:int main() 8: 9: int i; 10: struct exam data[n], MAX; 11: for (i = 0; i < N; i++) 12: printf(" 番号数学英語物理 \n"); 13: scanf("%d %d %d %d", // 入力 14: 15: ); 16: 17: MAX = data[0]; 18: for (i = 1; i < N; i++) // 最高値判定 19: if ( ) 20: MAX = data[i]; 21: 22: printf(" 最高点の人は %d 番の人です. 合計は %d です.\n" 23: ); 24: return 0; 25: 26: 27:int total(struct exam data) 28: 29: 実習 5 4 BMI とは 身長からみた体重の割合を示す体格指数であり, 身長, 体重から BMI = ( 体重 [kg])/( 身長 [cm]) 2 で与えられる. 以下のプログラムは身長, 体重の値より BMI 値を計算するものである. プログラムを以下に示した構造体 bmi を用いるように書換えよ. BMI 計算プログラム 構造体 bmi 1:#include <stdio.h> 2:#include <math.h> 3:#define N 2 4: 5:int main() 6: 7: double height[n]; // 身長 8: double weight[n]; // 体重 9: double BMI[N]; //BMI 値 10: int i; 11: for (i = 0; i < N; i++) 12: printf(" 身長 [cm] 体重 [kg]\n"); 13: scanf("%lf %lf", &height[i], &weight[i]); 14: BMI[i] = weight[i] / pow(height[i],2); 15: 16: printf(" 身長体重 BMI 値 \n"); 17: for (i = 0; i < N; i++) 18: printf("%f %f %f\n",height[i], weight[i], 19: BMI[i]); 20: 21: return 0; 22: struct bmi double w; // 身長 double h; // 体重 double bmi; // BMI ;

27 プログラミング技法 演習 5 演習 27 実習 5 5 商品の売上の統計を出したい. 具体的には, 商品の型番, 売上個数を入力すると, 売上のパーセンテージを計算し,( 型番, 個数, 率 ) を表示するようなプログラムを作成する. このとき, プログラムは上記のように型番, 個数, 率をメンバを持った構造体 data を用いる. 1. 以下のプログラムの空欄をコメントを参考に埋めよ. また, プログラムを実行し, 適当なデータを入力し動作を確認せよ. 2. 総和を求める部分と, 各パーセンテージを求める部分を関数にしたい. それぞれ, int sum(struct data d[]); double percent(struct data d, int total); のような形の関数を作成せよ. さらにそれらの関数を用いる形で, プログラム全体を構成しなおせ. また,1 の問題と同様に, 実行し適当なデータを入力し動作を確認せよ. #include <stdio.h> #define N 5 // データの数 // 構造体の定義 int main() int i, total = 0; struct data dat[n]; for (i = 0; i < N; i++) // データの読み込み ; for (i = 0; i < N; i++) // 総和の計算 for (i = 0; i < N; i++) // 各パーセンテージの計算 for (i = 0; i < N; i++) // 表示 return 0;

28 演習 28 5 構造体 実習 5 6 示したプログラムは構造体を用いて, 数学のベクトルを表わしたものである. 1. 入力して実行せよ. 2. ベクトルの実数倍の計算をする関数, ベクトルの長さを計算する関数と, 内積を計算する関数を作成せよ. 関数は以下のような形にすること. struct vector mul(double a, struct vector v); double inner(struct vector v1, struct vector v2); double length(struct vector v); なお, 内積の計算は以下の式で求められる. a b = a x b x + a y b y 3. 下図のように 2 本のベクトルからなる三角形の面積を求める関数を作成せよ. 型は double triangle(struct vector A, struct vector B); とする. また, 作成した関数を用いるような, 適当な main 関数を作成し実行せよ. なお, 三角形の面積は S = a 2 b 2 (a b) 2 2 で求めることができる. 1:#include <stdio.h> 2:#include <math.h> 3:struct vector 4: double x,y; 5:; 6:struct vector add(struct vector v1, struct vector v2); 7:int main() 8: 9: struct vector v1, v2, v3; 10: printf(" ベクトル 1(x y)="); 11: scanf("%lf %lf",&v1.x, &v1.y); 12: printf(" ベクトル 2(x y)="); 13: scanf("%lf %lf",&v2.x, &v2.y); 14: v3 = add(v1,v2); 15: printf("a+b=(%f, %f)", v3.x, v3.y); 16: return 0; 17: 18:struct vector add(struct vector v1, struct vector v2) 19: 20: struct vector v; 21: v.x = v1.x + v2.x; 22: v.y = v1.y + v2.y; 23: return v; 24: ベクトルから構成される三角形

29 プログラミング技法 演習 5 演習 29 演習 5 プログラム例 実習 5 3 プログラム例です. 1:#include <stdio.h> 2:#define N 5 3:struct exam // 構造体定義 4: int no, math, eng, phys; 5:; 6:int total(struct exam); // 合計を求める関数 7:int main() 8: 9: int i; 10: struct exam data[n], MAX; 11: for (i = 0; i < N; i++) 12: printf(" 番号数学英語物理 \n"); 13: scanf("%d %d %d %d", // 入力 14: &data[i].no, &data[i].math, 15: &data[i].eng, &data[i].phys); 16: 17: MAX = data[0]; 18: for (i = 1; i < N; i++) // 最高値判定 19: if (total(max) < total(data[i])) 20: MAX = data[i]; 21: 22: printf(" 最高点の人は %d 番の人です. 合計は %d です.\n" 23:,MAX.no, total(max)); 24: return 0; 25: 26: 27:int total(struct exam data) 28: return data.math + data.eng + data.phys; 29: 実習 5 4 プログラム例です. 1:#include <stdio.h> 2:#define N 2 3:struct bmi 4: double w; // 身長 5: double h; // 体重 6: double bmi; // BMI 7:; 8: 9:int main() 10: 11: struct bmi dat[n]; 12: int i; 13: for (i = 0; i < N; i++) 14: printf(" 身長体重 \n"); 15: scanf("%lf %lf",&dat[i].h, &dat[i].w); 16: dat[i].bmi = dat[i].h / (dat[i].w * dat[i].w); 17: 18: printf(" 身長体重 BMI 値 \n"); 19: for (i = 0; i < N; i++) 20: printf("%f %f %f\n",dat[i].h, dat[i].w, 21: dat[i].bmi); 22: 23: return 0; 24: 実習 の関数実装をした例を示します. 1:#include <stdio.h> 2:#define N 10 3: 4:struct data 5: int no; 6: int score; 7: double per; 8:; 9:int sum(struct data d[]); 10:double percent(struct data d, int total); 11: 12:int main() 13: 14: int i, total = 0; 15: struct data dat[n]; 16: for (i = 0; i < N; i++) // データの読み込み 17: scanf("%d %d", &dat[i].no, &dat[i].score); 18: ; 19: for (i = 0; i < N; i++) // 総和の計算 20: total += dat[i].score; 21: 22: for (i = 0; i < N; i++) // 各パーセンテージの計算 23: dat[i].per = (double)dat[i].score / total * 100; 24: 25: for (i = 0; i < N; i++) // 表示 26: printf("%3d %5d %6.3f\n", 27: dat[i].no, dat[i].score, dat[i].per); 28: 29: return 0; 30: 31:int sum(struct data d[]) 32: 33: int total = 0, i; 34: for (i = 0; i < N; i++) 35: total += d[i].score; 36: 37: return total; 38: 39:double percent(struct data d, int total) 40: 41: return (double)d.score / total * 100; 42:

30 演習 30 5 構造体 実習 関数のみ示します. struct vector mul(double a, struct vector v) struct vector tmp; tmp.x = a * v.x; tmp.y = a * v.y; return tmp; double inner(struct vector v1, struct vector v2) return v1.x * v2.x + v1.y * v2.y; double len(struct vector v) return sqrt(v.x*v.x + v.y*v.y); 3. プログラム全体を示します.2. で作成した関数を利用していることに注目してください. #include <stdio.h> #include <math.h> struct vector double x,y; ; struct vector add(struct vector v1, struct vector v2); double inner(struct vector v1, struct vector v2); double len(struct vector v); double triangle(struct vector a, struct vector b); int main() struct vector v1, v2; double s; printf(" ベクトル 1(x y)="); scanf("%lf %lf",&v1.x, &v1.y); printf(" ベクトル 2(x y)="); scanf("%lf %lf",&v2.x, &v2.y); s = triangle(v1,v2); printf(" 三角形の面積は %f\n です.\n", s); return 0; struct vector add(struct vector v1, struct vector v2) struct vector v; v.x = v1.x + v2.x; v.y = v1.y + v2.y; return v; double inner(struct vector v1, struct vector v2) return v1.x * v2.x + v1.y * v2.y; double len(struct vector v) return sqrt(v.x*v.x + v.y*v.y); double triangle(struct vector a, struct vector b) return sqrt(pow(len(a),2)*pow(len(b),2) - pow(inner(a, b),2)) / 2.0;

31 プログラミング技法 演習 6 演習 31 6 スタック, キュー 演習 実習 6 1 せよ. 授業用プリント 45 ページ問題 6 2, 49 ページ問題 6 3 のプログラムを入力し, 実行 実習 6 2 授業用プリントの問題 6 2, 問題 6 3 のプログラムを入力を変更し, スタック, キューの配列の状態を表示する関数 print_stack ( 問題 6 2), および print_queue( 問題 6 3) を作成し, 以下の実行例のように動作するようにせよ. また, このとき, スタックの頂上や, キューの先頭, 末尾の位置が分るように表示を工夫せよ. stack_print 使用例 保存データ入力 (dat1=-1 でデータ取り出し ):1 1.0 (1, ) *(0, ) (0, ) (0, )... queue_print 使用例 保存データ入力 (dat1=-1 でデータ取り出し ):1 1.0 H (1, ) T(0, ) (0, ) (0, )... 実習 6 3 授業用プリントの問題 6 3 について, 授業で提示したプログラムでは,put を繰り返しキューが一杯になったときに, エラーをチェックするための仕組みが欠けている. エラーチェックをするように関数を修正せよ. ヒント : top と tail の位置で判断するとやりやすい. また無理に配列 queue の要素全てを用いる必要はない.

32 演習 32 6 スタック, キュー 実習 6 4 以下のプログラムは, プリンタを管理しているコンピュータに送られてくるリクエストを処理する様子を模擬している. 送られてくる信号は, 端末番号とデータ ( この場合は単なる整数 ) である. また,0 番目の端末番号はプリンタを表しており, この信号は, プリンタが印刷可能であることを示している 行目の構造体を扱うキューの関数 put と get を実装せよ. 2. 適当なリクエストデータを入力し, プログラムの動作を確認せよ. 1:#include <stdio.h> 2:#define N 20 3: 4:struct print_data 5: int no; 6: int data; 7:; 8:int head=0, tail=0; 9:print_data queue[n]; 10:void put(print_data dat); 11:print_data get(); 12: 13:int main() 14: 15: int machine_no; 16: print_data pd; 17: while (1) 18: scanf("%d", &machine_no); 19: if (machine_no!= 0) // 端末からの受信 20: pd.no = machine_no; 21: scanf("%d", &pd.data); 22: put(pd); 23: else // プリント可能の信号 24: pd = get(); 25: printf(" 端末 %d のデータ印刷 \n",pd.no); 26: printf("%d\n", pd.data); 27: 28: 29: リクエストデータの例 実習 6 5 以下のプログラムは入力された数式の括弧が, 正しく対応しているかを確認するためのプログラムである.put 関数と get 関数を追加し, プログラムを実行せよ. なお, このプログラムでは, データが 1 つしかないため, スタックは構造体ではなく,char 型の配列で表されていることに注意すること. URL: 以下にプログラム ( 一部 ) が示してある. コピーして用いること

33 プログラミング技法 演習 6 演習 33 実習 6 6 以下のプログラムは, 授業用プリント 42 ページで示した, 逆ポーラント表記による電卓プログラム ( 整数の加減算のみ ) である.int 型のスタック関数 put と get を追加し, プログラムを実行せよ. 入力例としては, 以下のようなものが考えられる = = (20 30) + 10 括弧対応チェックプログラム 01:#include <stdio.h> 02:#include <ctype.h> 03:#define N 20 04:int top=0; 05:char stack[n]; 06:void push(char dat); /*char 型のスタック */ 07:char pop(); 08: 09:int main() 10: 11: char dat; 12: while ((dat = getchar())!= EOF) 13: switch (dat) 14: case '(' : case '[': case '': /* 括弧開く */ 15: push(dat); 16: break; 17: case ')': /* 以下閉括弧の判定 */ 18: if (pop()!= '(') 19: printf(" 括弧非対応です \n"); 20: 21: break; 22: case '': 23: if (pop()!= '') 24: printf(" 括弧非対応です \n"); 25: 26: break; 27: case ']': 28: if (pop()!= '[') 29: printf(" 括弧非対応です \n"); 30: 31: break; 32: 33: 34: 逆ポーランド電卓プログラム 01:#include <stdio.h> 02:#include <ctype.h> 03:#define N 20 04:int top=0; 05:int stack[n]; 06:void push(int dat); /* int 型のスタック関数 */ 07:int pop(); 08: 09:int main() 10: 11: int input; 12: int a, b; 13: int data; 14: while (1) 15: input = (char) fgetc(stdin); 16: if (isdigit(input)) /* 数字の処理 */ 17: ungetc(input, stdin); 18: scanf("%d",&data); 19: push(data); 20: else if (isspace(input)) /* 空白, 改行の処理 */ 21: else if (ispunct(input)) /* 演算子の処理 */ 22: switch (input) 23: case '+' : /* 加算 */ 24: a = pop(); 25: b = pop(); 26: push(a+b); 27: break; 28: case '-' : /* 減算 */ 29: a = pop(); 30: b = pop(); 31: push(a+b); 32: break; 33: case '=' : /* 計算結果表示 */ 34: printf("%d\n", pop()); 35: break; 36: default : 37: printf("???\n"); 38: 39: 40: 41: return 0; 42: Note: isdigit や isspace などの, 特殊な関数を用いています. 感心のある人は, 調べてみるといいでしょう.

34 演習 34 6 スタック, キュー 演習 6 プログラム例 実習 6 2 例示したプログラムでは, スタック, キューそれぞれ print_** という関数を作成し, データ操作ごとに, その関数を呼び出す構成にしています. #include <stdio.h> #define N 10 struct Data int dat1; double dat2; ; int top=0; struct Data stack[n]; void print_stack() int i; for (i = 0; i < N; i++) if (i == top) printf("*"); else printf(" "); printf("(%d, %f)\n", stack[i].dat1, stack[i].dat2); void push(struct Data d) /* データの保存関数 */ if (top < N) stack[top] = d; top++; print_stack(); struct Data pop() /* データの取り出し関数 */ struct Data ret=0,0.0; if (top > 0) top--; ret = stack[top]; print_stack(); return ret; int main() struct Data D; while (1) printf(" 保存データ入力 \n"); printf("(dat1=-1 でデータ取り出し ):"); scanf("%d %lf", &D.dat1, &D.dat2); if (D.dat1 == -1) D = pop(); printf(" 取り出したデータ :(%d %f)\n",d.dat1, D.dat2); else push(d); return 0; #include <stdio.h> #define N 10 struct Data int dat1; double dat2; ; int head=0, tail=0; struct Data queue[n]; void print_queue() int i; for (i = 0; i < N; i++) if (i == head) printf("h"); else printf(" "); if (i == tail) printf("t"); else printf(" "); printf("(%d, %f)\n", queue[i].dat1, queue[i].dat2); void put(struct Data d) /* データの保存関数 */ queue[tail] = d; tail++; if (tail >= N) tail = 0; print_queue(); struct Data get() /* データの取り出し関数 */ struct Data ret = 0,0.0; if (head!= tail) ret = queue[head]; head++; if (head >= N) head = 0; print_queue(); return ret; int main() struct Data D; while (1) printf(" 保存データ入力 \n"); printf("(dat1=-1 でデータ取り出し ):"); scanf("%d %lf", &D.dat1, &D.dat2); if (D.dat1 == -1) D = get(); printf(" 取り出したデータ :(%d %f)\n",d.dat1, D.dat2); else put(d); return 0;

35 プログラミング技法 演習 6 演習 35 実習 6 3 以下の図のように,head+1 = tail のとき, キューが一杯であると判断します. しかし,tail = 0,head = N-1 の場合を考慮する必要があるので, プログラムに示すように, ここでは count_up という関数を用意し, チェックを行なっています. head これ以上 headが増えると head=tailとなってキューが空の状態と同じになってしまう tail head+1 = tail のとき, キューが一杯であるとして, チェックを行う int count_up(int c) c++; if (c >= N) c = 0; return c; void put(struct Data d) // データの保存関数 if (count_up(tail) == head) puts ("queue is full."); else queue[tail] = d; tail = count_up(tail); struct Data get() // データの取り出し関数 struct Data ret = 0,0.0; if (head!= tail) ret = queue[head]; head = count_up(head); return ret; 実習 6 5 問題文に記したように, データの数が 1 つなので, スタックの関数は以下のようた形になります. 基本的なプログラムの手順は同じであることに注目してください. void push(char dat) if (top < N) stack[top] = dat; top++; char pop() if (top > 0) top--; return stack[top]; else return 0;

36 演習 36 6 スタック, キュー MEMO

37 プログラミング技法 演習 7 演習 37 7 連結リスト 演習 実習 7 1,7 3 は URL: 以下にプログラム ( 一部 ) が示してある. コピーして用いること 実習 7 1 下記のプログラム 1 は連結リストの各関数の動作を確認するためのものである. 空欄を埋め, 実行せよ. なお, 未使用のセルは data が-1 の場合とする. #include <stdio.h> #define MAX 100 struct CELL int data; int next; ; int get_empty_cell(); void initialize(); void add_data(int no1, int data); void del_data(int no1); void print_data(); struct CELL list[max]; int main() int no, i; initialize(); /* リストの初期化 */ printf(" 繰り返し回数 : "); scanf("%d", &no); for (i = 0; i < no; i++) add_data(0, i); print_data(); for (i = 0; i < no; i++) del_data(0); print_data(); return 0; int get_empty_cell() int i,ret = -1; for (i = 1; i < MAX; i++) if (list[i].data == -1) ret = i; break; return ret; void initialize() void add_data(int no, int data) void del_data(int no) void print_data() int no = 0; while(list[no].next!= -1) no = list[no].next; printf("%d ", list[no].data); printf("\n"); 実習 7 2 実習 7 1 のプログラムは連結リストの先頭にデータが追加されていく. プログラム 1 を変更し, 新しいデータがリストの最後に追加されるようにせよ.

38 演習 38 7 連結リスト 実習 7 3 連結リストの中の n 番目のセルの配列番号を返す関数 position を実装せよ. 作成した関数を利用して, 下記のプログラム 2 を実行せよ. #include <stdio.h> #include <ctype.h> #define MAX 100 struct CELL char data; int next; ; int get_empty_cell(); void initialize(); void add_data(int no1, char data); void del_data(int no1); void print_data(); int list_len(); int position(int no); struct CELL list[max]; int main() int menu, no, p; char c = 0; initialize(); while (1) printf("1: 入力 2: 削除 3: 出力 4: 終了 "); scanf("%d", &menu); switch (menu) case 1: // 入力 printf(" 挿入位置 :"); scanf("%d", &no); if (no > list_len()) puts(" 範囲外です "); break; p = position(no); printf(" データ :"); while(!isprint(c=getchar())); /*1 文字入力 */ add_data(p, c); break; case 2: printf(" 削除位置 :"); scanf("%d", &no); if (no >= list_len()) printf(" 範囲外です \n"); break; p = position(no); del_data(p); break; case 3: print_data(); break; if (menu == 4) break; return 0; 以下関数群が続きます web 上のプログラムには提示されています

39 プログラミング技法 演習 7 演習 39 実習 7 4 示したプログラムは数値データが羅列されたデータファイル (numbers.dat) から, データを読み取り, その和を計算するプログラムである. 読み取ったデータはリストに保存さる. また, 和を計算する関数は再帰呼び出しによって行なっている. 適当なデータファイルを作成し, プログラムの動作を確認せよ. Note: 前半部データの読み取りは, ファイルの終了 (EOF) が来るまで, 読み込み続けるように作られています. データの数がはっきりしなくても, 読み込むために良く用いられる手法です.ungetc 関数などは有用な関数なので, 感心があれば調べると良いでしょう. #include <stdio.h> #define MAX 100 struct CELL double data; int next; ; struct CELL list[max]; int get_empty_cell(); void initialize(); void add_data(int no1, double data); double sum(int no); int main() FILE *fp; double dat; char c; fp = fopen("numbers.dat","r"); initialize(); /* ファイルのデータが無くなるまで読み込み */ while ((c = getc(fp))!= EOF) ungetc(c,fp); fscanf(fp,"%lf\n", &dat); add_data(0, dat); printf("%f\n", sum(0)); fclose(fp); return 0; int get_empty_cell() 略 void initialize() 略 void add_data(int no, double data) 略 double sum(int no) /* リストのデータの和を計算 */ double s = 0; if (list[no].next!= -1) no = list[no].next; s = list[no].data; s += sum(no); return s; 実習 7 5 ( やや難 ) 以下の図のように点がデータファイルに入力されている. この点の集りによって, 一本の曲線を表わしているものとする. この点の始点から終点の長さを求めるプログラムを作成せよ.

40 演習 40 7 連結リスト ソフトウェア技術 B 7 演習 解説 実習 7 2 メイン関数の一部を変更しています.while 文を用いて, 連結リストの最後尾を調べていますが, 他にもキューの考え方を応用し, 最後尾を別の変数に保存するなどの方法も考えられます. printf(" 繰り返し回数 : "); scanf("%d", &no); for (i = 0; i < no; i++) p = 0; while(list[p].next!= -1) p = list[p].next; add_data(p, i); print_data(); 実習 7 3 関数 position のみを示します. int position(int no) int p = 0, i; for (i = 0; i < no; i++) if (list[p].next!= -1) p = list[p].next; return p; 実習 7 5 セルのデータは x,y と 2 つのデータを持たせる形になっています. また, セルが未使用かどうかをメンバ use を用いて判断します. 曲線の距離は line_len において求めることができます. #include <stdio.h> #include <math.h> #define MAX 100 struct CELL double x,y; int use; // セルの使用状況 int next; ; int get_empty_cell(); void initialize(); void add_data(int no1, double x, double y); void del_data(int no1); double line_len(int no); struct CELL list[max]; int main() FILE *fp; double x, y; char c; fp = fopen("line.dat","r"); initialize(); while ((c = getc(fp))!= EOF) ungetc(c,fp); fscanf(fp,"%lf %lf", &x, &y); add_data(0, x, y); printf("%f\n", line_len(0)); fclose(fp); return 0; int get_empty_cell() int i,ret = -1; for (i = 1; i < MAX; i++) if (list[i].use == 0) ret = i; break; return ret; void initialize() int i; list[0].next = -1; for (i = 0; i < MAX; i++) list[i].use = 0; // use が 0 ならばセルは未使用 list[i].x = list[i].y = 0; void add_data(int no, double x, double y) int no2 = get_empty_cell(); if (no2 == -1) printf("buffer overflow\n"); return; list[no2].x = x; list[no2].y = y; list[no2].use = 1; list[no2].next = list[no].next; list[no].next = no2; void del_data(int no) int no2 = list[no].next; list[no].next = list[no2].next; list[no2].use = 0; double line_len(int no) double s; if (list[no].next!= -1) no = list[no].next; if (list[no].next!= -1) s = line_len(no); s += sqrt(pow(list[no].x - list[list[no].next].x,2) + pow(list[no].y - list[list[no].next].y,2)); return s;

41 プログラミング技法 演習 7 演習 41 MEMO

Microsoft Word - NumericalComputation.docx

Microsoft Word - NumericalComputation.docx 数値計算入門 武尾英哉. 離散数学と数値計算 数学的解法の中には理論計算では求められないものもある. 例えば, 定積分は, まずは積分 ( 被積分関数の原始関数をみつけること できなければ値を得ることはできない. また, ある関数の所定の値における微分値を得るには, まずその関数の微分ができなければならない. さらに代数方程式の解を得るためには, 解析的に代数方程式を解く必要がある. ところが, これらは必ずしも解析的に導けるとは限らない.

More information

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く 変数 入出力 演算子ここまでに C 言語プログラミングの様子を知ってもらうため printf 文 変数 scanf 文 if 文を使った簡単なプログラムを紹介した 今回は変数の詳細について習い それに併せて使い方が増える入出力処理の方法を習う また 演算子についての復習と供に新しい演算子を紹介する 変数の宣言プログラムでデータを取り扱う場合には対象となるデータを保存する必要がでてくる このデータを保存する場所のことを

More information

Taro-リストⅠ(公開版).jtd

Taro-リストⅠ(公開版).jtd 0. 目次 1. 再帰的なデータ構造によるリストの表現 1. 1 リストの作成と表示 1. 1. 1 リストの先頭に追加する方法 1. 1. 2 リストの末尾に追加する方法 1. 1. 3 昇順を保存してリストに追加する方法 1. 2 問題 問題 1 問題 2-1 - 1. 再帰的なデータ構造によるリストの表現 リストは データの一部に次のデータの記憶場所を示す情報 ( ポインタという ) を持つ構造をいう

More information

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile data.txt #define OutFile sorted.txt #def C プログラミング演習 1( 再 ) 6 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include #define InFile "data.txt" #define OutFile "sorted.txt"

More information

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; Point; 問題 18. 問題 17 の Point を用いて 2 点の座標を入力するとその 2 点間の距 離を表示するプログラムを作成せよ 平方根は

More information

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile data.txt #define OutFile surted.txt #def C プログラミング演習 1( 再 ) 6 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include #define InFile "data.txt" #define OutFile "surted.txt"

More information

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx 情報ネットワーク導入ユニット Ⅰ C 言語 演算と型 演算 代入 演算と型 +,-,*,/,% = C 言語では 代入 の意味 vx = a + b; //a+b の結果を vx に代入 型 : int 型 ( 整数 ) double 型 ( 実数 ) 演算での型変換 ( 整数, 実数の混在 ) キャスト演算子 型を一時的に変更 書式指定 :printf("%6d n", a); 加減, 剰余演算

More information

kiso2-09.key

kiso2-09.key 座席指定はありません 計算機基礎実習II 2018 のウェブページか 第9回 ら 以下の課題に自力で取り組んで下さい 計算機基礎実習II 第7回の復習課題(rev07) 第9回の基本課題(base09) 第8回試験の結果 中間試験に関するコメント コンパイルできない不完全なプログラムなど プログラミングに慣れていない あるいは複雑な問題は 要件 をバラして段階的にプログラムを作成する exam08-2.c

More information

Taro-数値計算の基礎Ⅱ(公開版)

Taro-数値計算の基礎Ⅱ(公開版) 0. 目次 1. 2 分法 2. はさみうち法 3. 割線法 4. 割線法 ( 2 次曲線近似 ) 5. ニュートン法 ( 接線近似 ) - 1 - 1. 2 分法 区間 [x0,x1] にある関数 f(x) の根を求める 区間 [x0,x1] を xm=(x0+x1)/2 で 2 等分し 区間 [x0,xm],[xm,x1] に分割する f(xm) の絶対値が十分小さい値 eps より小さいとき

More information

ゲームエンジンの構成要素

ゲームエンジンの構成要素 cp-3. 計算 (C プログラムの書き方を, パソコン演習で学ぶシリーズ ) https://www.kkaneko.jp/cc/adp/index.html 金子邦彦 1 本日の内容 例題 1. 自由落下距離四則演算例題 2. 三角形の面積浮動小数の変数, 入力文, 出力文, 代入文例題 3. sin 関数による三角形の面積ライブラリ関数 2 今日の到達目標 プログラムを使って, 自分の思い通りの計算ができるようになる

More information

kiso2-06.key

kiso2-06.key 座席指定があります Linux を起動して下さい 第6回 計算機基礎実習II 計算機基礎実習II 2018 のウェブページか ら 以下の課題に自力で取り組んで下さい 第5回の復習課題(rev05) 第6回の基本課題(base06) 第5回課題の回答例 ex05-2.c 1. キーボードから整数値 a を入力すると a*a*a の値を出力することを繰り返すプログラムを作成しなさい 2. ただし 入力された

More information

プログラミング基礎

プログラミング基礎 C プログラミング Ⅱ 演習 2-1(a) BMI による判定 文字列, 身長 height(double 型 ), 体重 weight (double 型 ) をメンバとする構造体 Data を定義し, それぞれのメンバの値をキーボードから入力した後, BMI を計算するプログラムを作成しなさい BMI の計算は関数化すること ( ) [ ] [ ] [ ] BMI = 体重 kg 身長 m 身長

More information

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63> C 言語講座第 2 回 作成 : ハルト 前回の復習基本的に main () の中カッコの中にプログラムを書く また 変数 ( int, float ) はC 言語では main() の中カッコの先頭で宣言する 1 画面へ出力 printf() 2 キーボードから入力 scanf() printf / scanf で整数を表示 / 入力 %d 小数を表示 / 入力 %f 3 整数を扱う int 型を使う

More information

Microsoft PowerPoint - 4.pptx

Microsoft PowerPoint - 4.pptx while 文 (1) 繰り返しの必要性 while の形式と動作 繰り返しにより平 根を求める ( 演習 ) 繰り返しにより 程式の解を求める ( 課題 ) Hello. をたくさん表示しよう Hello. を画面に 3 回表示するには, 以下で OK. #include int main() { printf("hello. n"); printf("hello. n");

More information

プログラミング基礎

プログラミング基礎 C プログラミング 演習 アルゴリズム基礎論 演習 第 10 回 今後の予定 12/22( 月 ) 期末試験 (60 分間 ) 場所 :A1611 時間 :16:20~17:20 課題の最終提出締切 :12/19( 金 ) これ以降の新規提出は評価されない 12/22までに最終状況を提示するので, 提出したのに や になってる人は自分の提出内容や提出先を再確認した上で12/26までに問い合わせること

More information

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 次のステップによって 徐々に難易度の高いプログラムを作成する ( 参照用の番号は よくわかる C 言語 のページ番号 ) 1. キーボード入力された整数 10 個の中から最大のものを答える 2. 整数を要素とする配列 (p.57-59) に初期値を与えておき

More information

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - kougi9.ppt C プログラミング演習 第 9 回ポインタとリンクドリストデータ構造 1 今まで説明してきた変数 #include "stdafx.h" #include int _tmain(int argc, _TCHAR* argv[]) { double x; double y; char buf[256]; int i; double start_x; double step_x; FILE*

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 4 回再帰的構造体 前回の出席確認演習 #include int main() { FILE *fp; int c, linecount, length, maxlength; fp=fopen("/usr/share/dict/words","r"); if (fp == NULL) return 1; linecount=0; length=0;

More information

gengo1-11

gengo1-11 関数の再帰定義 自然数 n の階乗 n! を計算する関数を定義してみる 引数は整数 返却値も整数 n! = 1*2*3*... * (n 1)*n である ただし 0! = 1 とする int factorial(int n) int i, tmp=1; if( n>0 ) for(i=1; i

More information

PowerPoint Presentation

PowerPoint Presentation 工学部 6 7 8 9 10 組 ( 奇数学籍番号 ) 担当 : 長谷川英之 情報処理演習 第 7 回 2010 年 11 月 18 日 1 今回のテーマ 1: ポインタ 変数に値を代入 = 記憶プログラムの記憶領域として使用されるものがメモリ ( パソコンの仕様書における 512 MB RAM などの記述はこのメモリの量 ) RAM は多数のコンデンサの集合体 : 電荷がたまっている (1)/ いない

More information

プログラミング実習I

プログラミング実習I プログラミング実習 I 03 変数と式 人間システム工学科井村誠孝 m.imura@kwansei.ac.jp 3.1 変数と型 変数とは p.60 C 言語のプログラム中で, 入力あるいは計算された数や文字を保持するには, 変数を使用する. 名前がついていて値を入れられる箱, というイメージ. 変数定義 : 変数は変数定義 ( 宣言 ) してからでないと使うことはできない. 代入 : 変数には値を代入できる.

More information

演習課題No12

演習課題No12 演習課題 No.12 ( 課題は 3 題ある ) 課題 12-1 時間内提出 従来の C 言語には複素数を直接扱うデータ型はないので (*), 構造体で複素数 ( 英語で complex) を表すことにする. 複素数を表す構造体を以下のように定義する. struct complex float r; // 実部 ( 英語で real) float i; // 虚部 ( 英語で imaginary)

More information

Taro-スタック(公開版).jtd

Taro-スタック(公開版).jtd 0. 目次 1. 1. 1 配列によるの実現 1. 2 再帰的なデータ構造によるの実現 1. 3 地図情報処理 1. 4 問題 問題 1 グラフ探索問題 - 1 - 1. は データの出し入れが一カ所で行われ 操作は追加と削除ができるデータ構造をいう 出入口 追加 削除 操作 最初 111 追加 111 222 追加 111 222 333 追加 111 222 333 444 追加 111 222

More information

CプログラミングI

CプログラミングI C プログラミング I Swap 関数を作る Stack データ構造のための準備 整数変数 x と y の値を取り替える関数 swap を作る 最初の試み : swap-01.c #include void swap(int a, int b) { int tmp; tmp = a; a = b; b = tmp; int main(void) { int x=10, y=30;

More information

cp-7. 配列

cp-7. 配列 cp-7. 配列 (C プログラムの書き方を, パソコン演習で学ぶシリーズ ) https://www.kkaneko.jp/cc/adp/index.html 金子邦彦 1 本日の内容 例題 1. 月の日数配列とは. 配列の宣言. 配列の添え字. 例題 2. ベクトルの内積例題 3. 合計点と平均点例題 4. 棒グラフを描く配列と繰り返し計算の関係例題 5. 行列の和 2 次元配列 2 今日の到達目標

More information

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a = 問 1 配列の宣言整数型配列 data1 にデータが初期設定されている この配列 data1 のデータを下図のように 整数型配列 data2 に代入しなさい また data2 の内容を printf( "data2[0] = %d\n", data2[0] ); printf( "data2[5] = %d\n", data2[5] ); を用いて出力しなさい 実行結果 data2[0] = 76

More information

情報処理演習 B8クラス

情報処理演習 B8クラス 予定スケジュール ( 全 15 回 ) 1 1. 終了 プログラミング言語の基礎 2. 終了 演算と型 3. 終了 プログラムの流れの分岐 (if 文,switch 文など ) 4. 終了 プログラムの流れの繰返し (do, while, for 文など ) 5. 終了 中間レポート1 6. 終了 配列 7. 終了 関数 8. 終了 文字列 ( 文字列の配列, 文字列の操作 ) 9. 終了 ポインタ

More information

gengo1-2

gengo1-2 変数 プログラム中で 値を格納するには変数 variable を用いる変数は 格納する値の型によって 整数型 文字型 などの型 type をもつ変数を使うには 利用に先立って変数の宣言 declaration をしなければならない 値 変数の値はコンピュータのメモリ上に格納される 具体的にメモリのどの場所に格納されるかは言語処理系が自動的に扱うので プログラマ ( 特に初級者 ) が意識する必要はない

More information

Microsoft PowerPoint - kougi2.ppt

Microsoft PowerPoint - kougi2.ppt C プログラミング演習 第 2 回 Microsoft Visual Studio.NET を使ってみよう 説明 例題 1. プログラム実行の体験 コンピュータを役に立つ道具として実感する 次ページのプログラムを使って, Microsoft Visual Studio.NETでの C++ ソースファイル編集, ビルド, テスト実行の一連の過程を体験する 例題 1 のプログラムの機能 計算の繰り返し

More information

2006年10月5日(木)実施

2006年10月5日(木)実施 2010 年 7 月 2 日 ( 金 ) 実施 ファイル処理ファイルとはファイル (file) は日常用語では紙などを綴じたものを表すが, コンピュータ用語ではデータの集合体を指す言葉である ファイルは例えば, 文書ファイルやプログラムファイルのように, 用途によって分類されることもあれば, また, テキストファイルやバイナリファイルのように, ファイルの作り方によって分類されることもある なお,

More information

Prog1_12th

Prog1_12th 2013 年 7 月 4 日 ( 木 ) 実施 ファイル処理ファイルとはファイル (file) は日常用語では紙などを綴じたものを表すが, コンピュータ用語ではデータの集合体を指す言葉である ファイルは例えば, 文書ファイルやプログラムファイルのように, 用途によって分類されることもあれば, また, テキストファイルやバイナリファイルのように, ファイルの作り方によって分類されることもある なお,

More information

Microsoft PowerPoint - program.ppt [互換モード]

Microsoft PowerPoint - program.ppt [互換モード] プログラミング演習 バージョン 1 担当教員 : 綴木馴 プログラムの決まりについて学ぶ おすすめする参考書 ザ C 戸川隼人サイエンス社 本日の予定 1. 授業の説明. 2. コンパイラーのインストール. プログラムの決まりについて学ぶ,P31 /* The most in C */ /* hello.c */ printf("hello,world n"); プログラムの決まり ( コメント )

More information

Prog1_6th

Prog1_6th 2019 年 10 月 31 日 ( 木 ) 実施配列同種のデータ型を有する複数のデータ ( 要素 ) を番号付けして, ひとまとまりの対象として扱うものを配列と呼ぶ 要素 point[0] point[1] point[2] point[3] point[4] 配列 配列の取り扱いに関して, 次のような特徴がある 1. プログラム中で用いる配列変数 ( 配列の本体を参照する参照型の変数 ) は必ず宣言しておく

More information

計算機シミュレーション

計算機シミュレーション . 運動方程式の数値解法.. ニュートン方程式の近似速度は, 位置座標 の時間微分で, d と定義されます. これを成分で書くと, d d li li とかけます. 本来は が の極限をとらなければいけませんが, 有限の小さな値とすると 秒後の位置座標は速度を用いて, と近似できます. 同様にして, 加速度は, 速度 の時間微分で, d と定義されます. これを成分で書くと, d d li li とかけます.

More information

gengo1-10

gengo1-10 関数 C 言語では 関数を組み合わせてプログラムを構成する pritnf(), scanf() などは 処理系があらかじめ備えている標準ライブラリ関数 math.h で定義されている算術関数も標準ライブラリ関数の 1 つ データを与えて それに基づき何か動作をおこなうものが関数 数学の関数 y = f(x) のイメージ f(x) x を与える f(x) を計算して返す f(x) はある意味ブラックボックス

More information

Microsoft Word - no11.docx

Microsoft Word - no11.docx 3. 関数 3.1 関数関数は数学の関数と同じようなイメージを持つと良いでしょう 例えば三角関数の様に一つの実数値 ( 角度 ) から値を求めますし 対数関数の様に二つの値から一つの値を出すものもあるでしょう これをイメージしてもらえば結構です つまり 何らかの値を渡し それをもとに何かの作業や計算を行い その結果を返すのが関数です C 言語の関数も基本は同じです 0 cos 1 cos(0) =

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング初級 第 7 回 2017 年 5 月 29 日 配列 ( 復習 )~ 文字列 1 配列とは 2 配列 : 複数の変数をグループとしてまとめて扱うもの 配列 変数 int data[10]; 整数型の配列 同種のデータ型を連続して確保したものを配列とよぶ = 整数がそれぞれにひとつずつ入る箱を 10 個用意したようなもの int data; 整数型の変数 = 整数がひとつ入る dataという名前の箱を用意したようなもの

More information

Microsoft PowerPoint - kougi4.ppt

Microsoft PowerPoint - kougi4.ppt C の実行モデル 自由落下距離 前回の授業の 例題 1 の復習と重要事項 の確認 地上で物を落とし始めた後の自由落下距離を 求める 重力加速度 g は 9.8 とする 自由落下距離を求めるために, プログラム中に, 計算式 y = ( 9.8 / 2.0 ) * x * x を書く C++ ソースファイルの編集 編集画面 編集中のファイル名 関係するファイルなどが表示される ビルド結果などが表示される画面

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 2018/10/05 竹島研究室創成課題 第 2 回 C 言語演習 変数と演算 東京工科大学 加納徹 前回の復習 Hello, world! と表示するプログラム 1 #include 2 3 int main(void) { 4 printf("hello, world! n"); 5 return 0; 6 } 2 プログラム実行の流れ 1. 作業ディレクトリへの移動 $ cd

More information

Microsoft PowerPoint - 06.pptx

Microsoft PowerPoint - 06.pptx アルゴリズムとデータ構造第 6 回 : 探索問題に対応するデータ構造 (2) 担当 : 上原隆平 (uehara) 2015/04/22 内容 スタック (stack): 最後に追加されたデータが最初に取り出される 待ち行列 / キュー (queue): 最初に追加されたデータが最初に取り出される ヒープ (heap): 蓄えられたデータのうち小さいものから順に取り出される 配列による実装 連結リストによる実装

More information

スライド 1

スライド 1 数値解析 平成 24 年度前期第 7 週 [2012 年 5 月 30 日 ] 静岡大学創造科学技術大学院情報科学専攻工学部機械工学科計測情報講座 三浦憲二郎 講義アウトライン [5 月 30 日 ] 数値積分 ニュートン コーツ公式 台形公式 シンプソン公式 多積分 数値積分の必要性 p.135 初等関数 ( しょとうかんすう ) とは 複素数を変数とする多項式関数 指数関数 対数関数主値の四則演算

More information

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - lec10.ppt 今日の内容, とポインタの組み合わせ, 例題 1. 住所録例題 2. と関数とは. を扱う関数. 例題 3. のリスト とポインタの組み合わせ 今日の到達目標 自分で を定義する 自分で定義したについて, 配列やポインタを作成する データ型 基本データ型 char 文字 (1 文字 ) int 整数 double 浮動小数など その他のデータ型配列 データの並び ( 文字列も, 文字の並び ) ポインタ

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 4 回再帰的構造体 プログラミングを 余談 : 教えることの難しさ 丁寧に説明しないと分かってもらえない 説明すると 小難しくなる学生が目指すべきところプログラム例を説明されて理解できる違うやり方でも良いので自力で解決できる おっけー 動けば良い という意識でプログラミング 正しく動くことのチェックは必要 解答例と自分のやり方との比較が勉強になる 今日のお題 再帰的構造体

More information

kiso2-03.key

kiso2-03.key 座席指定はありません Linux を起動して下さい 第3回 計算機基礎実習II 2018 のウェブページか ら 以下の課題に自力で取り組んで下さい 計算機基礎実習II 第2回の復習課題(rev02) 第3回の基本課題(base03) 第2回課題の回答例 ex02-2.c include int main { int l int v, s; /* 一辺の長さ */ /* 体積 v

More information

Microsoft PowerPoint - C1(演算と変数).ppt

Microsoft PowerPoint - C1(演算と変数).ppt C 言語プログラミング 式の計算と変数 配列の概念 50 人の生徒の点数の平均点, 最高点 最低点を求めるプログラム ( センター入試 23 年度数学 2 情報関係基礎 第 3 問 ) (01) sowa 0, saiko 0, saitei 100 代入文 : 変数に値を代入 ( 格納 ) する (02) 配列 TNin のすべての要素を 0 にするための文 (03) bango を 1 から 50

More information

NumericalProg09

NumericalProg09 数値解析および プログラミング演習 [08 第 9 回目 ] の解法 - 4. Ruge-Kua( ルンゲ クッタ 法 Ruge-Kua-Gill( ルンゲ クッタ ジル / ギル 法 5. 多段解法 解法の対象 常微分方程式 d( d 初期値条件 (, の変化に応じて変化する の値を求める. ( 0 ( 0 と 0 は,give 0 常微分方程式の初期値問題 と言う. 3 Ruge-Kua 法の導出

More information

memo

memo 数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2 プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int

More information

Microsoft Word - Cプログラミング演習(3)

Microsoft Word - Cプログラミング演習(3) 第 3 回 (5/7) 5. ループ ( 繰り返し ) 1 for 文 例題 1-15 正の数 n をキーボードから入力すると,1 から n までの整数の和を出力するプログラムをつくりなさい 出力結果 1-15 2 以上の整数を入力してください! 357 1 + + 357 = 63903 考え方合計を保持する変数を long 型で宣言し, 入力した数値 n までループ処理で累積する 正しい数値が入力されたとき

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 講座を行う前に 自己紹介 僕と上回生について 1 年生同士で少しお話しよう! オリエンテーションの宿題 アルゴロジック http://home.jeita.or.jp/is/highschool/algo/index3.html どこまでできましたか? あまりできなかった人はこれから全部クリアしよう! 2016 年度 C 言語講座 第一回目 2016/6/11 fumi 今回の目標 プログラムを書いて実行するやり方を覚える

More information

Chap3.key

Chap3.key 区分求積法. 面積 ( )/ f () > n + n, S 長方形の和集合で近似 n f (n ) リーマン和 f (n ) 区分求積法 リーマン和 S S n n / n n f ()d リーマン積分 ( + ) + S (, f ( )) 微分の心 Zoom In して局所的な性質を調べる 積分の心 Zoom Ou して大域的な性質を調べる 曲線の長さ 領域の面積や体積 ある領域に含まれる物質の質量

More information

データ構造

データ構造 アルゴリズム及び実習 7 馬青 1 表探索 定義表探索とは 表の形で格納されているデータの中から条件に合ったデータを取り出してくる操作である 但し 表は配列 ( 連結 ) リストなどで実現できるので 以降 表 の代わりに直接 配列 や リスト などの表現を用いる場合が多い 表探索をただ 探索 と呼ぶ場合が多い 用語レコード : 表の中にある個々のデータをレコード (record) と呼ぶ フィールド

More information

Microsoft Word - 3new.doc

Microsoft Word - 3new.doc プログラミング演習 II 講義資料 3 ポインタ I - ポインタの基礎 1 ポインタとは ポインタとはポインタは, アドレス ( データが格納されている場所 ) を扱うデータ型です つまり, アドレスを通してデータを間接的に処理します ポインタを使用する場合の, 処理の手順は以下のようになります 1 ポインタ変数を宣言する 2 ポインタ変数へアドレスを割り当てる 3 ポインタ変数を用いて処理 (

More information

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和 入出力処理 三池克明 関数 printf() と新たに学ぶ関数 scanf() を使ってデータの入出力処理を解説します 特に scanf() は対話式プログラム ( ユーザーに操作を促すプログラム ) を作るうえで重要です 目次 1. 関数 scanf()... 1 1.1. 2 整数の和を求める...1 1.2. 入力した文字を得る...3 2. 入出力処理と計算... 4 2.1. 2 整数の商を求める...4

More information

C 言語第 6 回 1 数値シミュレーション :2 階の微分方程式 ( シラバス10 11 回目 ) 1 2 階の微分方程式と差分方程式微分方程式を 2 d x dx + c = f ( x, t) 2 dt dt とする これを 2 つの 1 階の微分方程式に変更する ìdx = y 2 2 d

C 言語第 6 回 1 数値シミュレーション :2 階の微分方程式 ( シラバス10 11 回目 ) 1 2 階の微分方程式と差分方程式微分方程式を 2 d x dx + c = f ( x, t) 2 dt dt とする これを 2 つの 1 階の微分方程式に変更する ìdx = y 2 2 d C 言語第 6 回 1 数値シミュレーション : 階の微分方程式 ( シラバス10 11 回目 ) 1 階の微分方程式と差分方程式微分方程式を d x dx + c = f ( x, t) とする これを つの 1 階の微分方程式に変更する ìdx = y d x dx d x dx ï dt c f ( x, t) c f ( x, t) + = Þ = - + Þ í ï dy = - cy +

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング初級 第 13 回 2017 年 7 月 10 日 標準ライブラリ関数 1 標準ライブラリ関数とは 関数には (1) 自分で作る関数 (2) はじめから用意されている関数特に C 言語用用意されているもの : 標準ライブラリ関数 文字列の代入文字列の長さを求める文字列の比較文字列の連結 strcpy strlen strcmp strcat 2 文字列の操作 - 具体例を通して (141

More information

Microsoft PowerPoint - prog06.ppt

Microsoft PowerPoint - prog06.ppt プログラミング言語 2 第 06 回 (2007 年 06 月 11 日 ) 今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 1 今日やること http://www.tnlab.ice.uec.ac.jp/~s-okubo/class/language/ にアクセスすると 教材があります 2007 年 06 月 11 日分と書いてある部分が 本日の教材です 本日の内容

More information

2014計算機実験1_1

2014計算機実験1_1 H26 1 1 1 seto@ics.nara-wu.ac.jp 数学モデリングのプロセス 問題点の抽出 定義 仮定 数式化 万有引力の法則 m すべての物体は引き合う r mm F =G 2 r M モデルの検証 モデルによる 説明 将来予測 解釈 F: 万有引力 (kg m s-2) G: 万有引力定数 (m s kg ) 解析 数値計算 M: 地球の質量 (kg) により解を得る m: 落下する物質の質量

More information

Microsoft PowerPoint - lec4.ppt

Microsoft PowerPoint - lec4.ppt 本日の内容 繰り返し計算 while 文, for 文 例題 1. 最大公約数の計算例題 2. 自然数の和 while 文例題 3. フィボナッチ数列例題 4. 自然数の和 for 文例題 5. 九九の表繰り返しの入れ子 今日の到達目標 繰り返し (while 文, for 文 ) を使って, 繰り返し計算を行えるようになること ループカウンタとして, 整数の変数を使うこと 今回も, 見やすいプログラムを書くために,

More information

Microsoft Word - no15.docx

Microsoft Word - no15.docx 7. ファイルいままでは プログラムを実行したとき その結果を画面で確認していました 簡単なものならそれでもいいのですか 複雑な結果は画面で見るだけでなく ファイルに保存できればよいでしょう ここでは このファイルについて説明します 使う関数のプロトタイプは次のとおりです FILE *fopen(const char *filename, const char *mode); ファイルを読み書きできるようにする

More information

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint - prog04.ppt プログラミング言語 2 第 04 回 (2007 年 05 月 14 日 ) 今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 1 今日やること http://www.tnlab.ice.uec.ac.jp/~s-okubo/class/language/ にアクセスすると 教材があります 2007 年 05 月 14 日分と書いてある部分が 本日の教材です 本日の内容

More information

モデリングとは

モデリングとは コンピュータグラフィックス基礎 第 5 回曲線 曲面の表現 ベジェ曲線 金森由博 学習の目標 滑らかな曲線を扱う方法を学習する パラメトリック曲線について理解する 広く一般的に使われているベジェ曲線を理解する 制御点を入力することで ベジェ曲線を描画するアプリケーションの開発を行えるようになる C++ 言語の便利な機能を使えるようになる 要素数が可変な配列としての std::vector の活用 計算機による曲線の表現

More information

パソコンシミュレータの現状

パソコンシミュレータの現状 第 2 章微分 偏微分, 写像 豊橋技術科学大学森謙一郎 2. 連続関数と微分 工学において物理現象を支配する方程式は微分方程式で表されていることが多く, 有限要素法も微分方程式を解く数値解析法であり, 定式化においては微分 積分が一般的に用いられており. 数学の基礎知識が必要になる. 図 2. に示すように, 微分は連続な関数 f() の傾きを求めることであり, 微小な に対して傾きを表し, を無限に

More information

スライド 1

スライド 1 数値解析 2019 年度前期第 13 週 [7 月 11 日 ] 静岡大学創造科学技術大学院情報科学専攻工学部機械工学科計測情報講座 三浦憲二郎 講義アウトライン [7 月 11 日 ] 関数近似と補間 最小 2 乗近似による関数近似 ラグランジュ補間 T.Kanai, U.Tokyo 関数近似 p.116 複雑な関数を簡単な関数で近似する 関数近似 閉区間 [a,b] で定義された関数 f(x)

More information

情報実習Ⅱ

情報実習Ⅱ 情報実習 Ⅱ 第 7 回 ( これまでの復習 ) 課題資料 Java のクラスの概形 クラス フィールドコンストラクタメソッド main メソッドローカル変数宣言オブジェクト生成オブジェクトへのメッセージ ( メソッド呼び出し ) 変数 : 基本型, 参照型 これまでの 習得事項 まだ初歩的な内容だけだが これらを利用するだけでも多くの実用的なプログラムが記述できる キーボード入力 : Scanner

More information

Microsoft PowerPoint - 説明3_if文switch文(C_guide3)【2015新教材対応確認済み】.pptx

Microsoft PowerPoint - 説明3_if文switch文(C_guide3)【2015新教材対応確認済み】.pptx 情報ネットワーク導入ユニット Ⅰ C 言語 if 文 switch 文 3 章 : プログラムの流れの分岐 if 文 if( 条件 ) 条件が成立すれば実行 if( 条件 ) ~ else 場合分け ( 成立, 不成立 ) if( 条件 A) ~ else if( 条件 B) ~ else if( 条件 C) ~ else 場合分け ( 複数の条件での場合分け ) 等価演算子 : == ( 等しい

More information

Taro-ファイル処理(公開版).jtd

Taro-ファイル処理(公開版).jtd ファイル処理 0. 目次 1. はじめに 2. ファイル内容の表示 3. ファイル内容の複写 3. 1 文字単位 3. 2 行単位 4. 書式付き入出力 5. 文字配列への入出力 6. 課題 6. 1 課題 1 ( ファイル圧縮 復元 ) - 1 - 1. はじめに ファイル処理プログラムの形は次のようになる #include main() { FILE *fp1,*fp2; ファイルポインタの宣言

More information

Microsoft PowerPoint - prog08.ppt

Microsoft PowerPoint - prog08.ppt プログラミング言語 2 第 07 回 (2007 年 06 月 25 日 ) 1 今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 2/27 1 今日やること http://www.tnlab.ice.uec.ac.jp/~s-okubo/class/language/ にアクセスすると 教材があります 2007 年 06 月 25 日分と書いてある部分が 本日の教材です

More information

重要例題113

重要例題113 04_ 高校 数学 Ⅱ 必須基本公式 定理集 数学 Ⅱ 第 章式の計算と方程式 0 商と余り についての整式 A をについての整式 B で割ったときの商を Q, 余りを R とすると, ABQ+R (R の次数 ) > 0

More information

演算増幅器

演算増幅器 ファイルこれまでにデータの入力方法として キーボードからの入力を用いてきた 構造体を習った際に実感してもらえたと思うが 入力データ量が多いときにはその作業は大変なものとなり 入力するデータを間違えた場合には最初からやり直しになる そこで今回はこれらの問題を解決するため あらかじめ入力データをテキストエディタなどで編集し ファイルとして保存したものを入力データとして用いる方法を習っていく さらにプログラムで作成したデータをファイルに出力する方法も併せて習っていく

More information

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 ポインタ変数の扱い方 1 ポインタ変数の宣言 int *p; double *q; 2 ポインタ変数へのアドレスの代入 int *p; と宣言した時,p がポインタ変数 int x; と普通に宣言した変数に対して, p = &x; は x のアドレスのポインタ変数 p への代入 ポインタ変数の扱い方 3 間接参照 (

More information

Microsoft Word - no103.docx

Microsoft Word - no103.docx 次は 数える例です ex19.c /* Zeller の公式によって 1 日の曜日の分布を求めるプログラム */ int year, month, c, y, m, wnumber, count[7] = {0, i; for(year = 2001; year

More information

講習No.9

講習No.9 日本語は通常 2 バイトの文字コード.JIS コード, シフト JIS コード, Unicode (UTF-8) 等の様々な文字コードがある. アスキーコード表 (ASCII code) アスキーコード ( 値 ) 漢字変換無しでキーボードから直接入力できる半角文字 32 48 0 64 @ 80 P 96 ` 112 p 33! 49 1 65 A 81 Q 97 a 113 q 34 " 50

More information

Microsoft Word - Training10_プリプロセッサ.docx

Microsoft Word - Training10_プリプロセッサ.docx Training 10 プリプロセッサ 株式会社イーシーエス出版事業推進委員会 1 Lesson1 マクロ置換 Point マクロ置換を理解しよう!! マクロ置換の機能により 文字列の置き換えをすることが出来ます プログラムの可読性と保守性 ( メンテナンス性 ) を高めることができるため よく用いられます マクロ置換で値を定義しておけば マクロの値を変更するだけで 同じマクロを使用したすべての箇所が変更ができるので便利です

More information

Prog1_6th

Prog1_6th 2012 年 5 月 24 日 ( 木 ) 実施 多分岐のプログラム 前回は多段階の 2 分岐を組み合わせて 3 種類以上の場合分けを実現したが, 式の値の評価によって, 一度に多種類の場合分けを行う多分岐の利用によって見通しのよいプログラムを作成できる場合がある ( 流れ図は右図 ) 式の評価 : 値 1 : 値 2 : 値 n : 該当値無し 処理 1 処理 2 処理 n 既定の処理 switch

More information

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){ ソフトゼミ A 第 6 回 関数 プログラムは関数の組み合わせでできています 今までのゼミAでも printf や scanf など様々な関数を使ってきましたが なんと関数は自分で作ることもできるのです!! 今日は自作関数を中心に扱っていきます ゲーム制作でも自作関数は避けては通れないので頑張りましょう そもそもまず 関数とは 基本的には 受け取った値に関数によって定められた操作をして その結果の値を返す

More information

Microsoft PowerPoint - 第3回目.ppt [互換モード]

Microsoft PowerPoint - 第3回目.ppt [互換モード] 第 3 回プログラミング応用 目的ファイル入出力 1. ファイルの概念 2. ファイルの読み込み 3. ファイルの書き込み CPU 演算 判断 ファイルの概念 内部記憶装置 OS 機械語プログラム 入力装置 キーボード 出力装置 ディスプレイ ファイル 外部記憶装置ハードディスク CD-ROM CPU が外部とデータをやり取りするための媒介 printf 関数や scanf 関数でもうすでにファイルのやり取りの基本は学んでいる

More information

<4D F736F F F696E74202D20836F CC8A C58B858B4F93B982A882E682D1978E89BA814091B28BC68CA48B E >

<4D F736F F F696E74202D20836F CC8A C58B858B4F93B982A882E682D1978E89BA814091B28BC68CA48B E > バットの角度 打球軌道および落下地点の関係 T999 和田真迪 担当教員 飯田晋司 目次 1. はじめに. ボールとバットの衝突 -1 座標系 -ボールとバットの衝突の前後でのボールの速度 3. ボールの軌道の計算 4. おわりに参考文献 はじめに この研究テーマにした理由は 好きな野球での小さい頃からの疑問であるバッテングについて 角度が変わればどう打球に変化が起こるのかが大学で学んだ物理と数学んだ物理と数学を使って判明できると思ったから

More information

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt 計算機言語第 7 回 長宗高樹 目的 関数について理解する. 入力 X 関数 f 出力 Y Y=f(X) 関数の例 関数の型 #include int tasu(int a, int b); main(void) int x1, x2, y; x1 = 2; x2 = 3; y = tasu(x1,x2); 実引数 printf( %d + %d = %d, x1, x2, y);

More information

Microsoft PowerPoint - 12.ppt [互換モード]

Microsoft PowerPoint - 12.ppt [互換モード] 第 12 回構造体 1 今回の目標 構造体を理解する 構造体の定義の仕方を理解する 構造体型を理解する 構造体型の変数 引数 戻り値を理解する 複素数同士を足し算する関数を作成し その関数を利用するプログラムを作成する 2 複素数の足し算 複素数は実部と虚部の2つの実数で 表現される 表現される z = a+ bi 2 つの複素数 z 1 = a 1+ bi 1 と z2 = a2 + b2i の和

More information

数値計算

数値計算 数値計算 垣谷公徳 17 号館 3 階電子メール : kimi@ee.ous.ac.jp プログラミング言語の一般論 データ型 ( 定数と変数 配列 ) 代入 基本演算 ( 四則演算 ) 入出力 分岐 繰返処理 関数 外部手続き 1 2 入力関数 入出力 getchar, getc, fgetc ; 一文字入力 gets, fgets, fread ; 文字列 ( データ列 ) 入力 scanf,

More information

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F C 言語第 3 回 三つの基本構造 ( シラバス 5 6 回目 ) 1 1 順次処理上から順番に実行していく #include int main(void) { long x, y; 最初 長い整数がつかえる 負の数もか だいたい ±21 億まで OK なんだ 掛け算するぞ x = 1000*2000; scanf("%ld", &y); printf("%ld", x*y);

More information

講習No.10

講習No.10 2 次元配列 復習 float d[3][4]; 2 次元配列 d[i][j] 2 つのインデックス i と j でデータが指定される 縦が 3 行横が 4 列の float 型の表 4 列 横のインデックスは 3 まで j = 0 j = 1 j = 2 j = 3 3 行 i = 0 i = 1 i = 2 d[0][0] d[0][1] d[0][2] d[0][3] d[1][0] d[1][1]

More information

Microsoft Word - 微分入門.doc

Microsoft Word - 微分入門.doc 基本公式 例題 0 定義式 f( ) 数 Ⅲ 微分入門 = の導関数を定義式にもとづいて計算しなさい 基本事項 ( f( ), g( ) が微分可能ならば ) y= f( ) g( ) のとき, y = y= f( ) g( ) h( ) のとき, y = ( f( ), g( ) が微分可能で, g( ) 0 ならば ) f( ) y = のとき, y = g ( ) とくに, y = のとき,

More information

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for 4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for 文 ) */ int i, no; for (i = 0; i

More information

Microsoft Word - Cプログラミング演習(12)

Microsoft Word - Cプログラミング演習(12) 第 12 回 (7/9) 4. いくつかのトピック (5)main 関数の引数を利用したファイル処理 main 関数は, 起動する環境から引数を受け取ることができる 例えば 次に示すように,main 関数に引数を用いたプログラムを作成する 01 /* sample */ 02 /* main 関数の引数 */ 03 #include 04 05 main(int argc, char

More information

Taro-再帰関数Ⅲ(公開版).jtd

Taro-再帰関数Ⅲ(公開版).jtd 0. 目次 1 1. ソート 1 1. 1 挿入ソート 1 1. 2 クイックソート 1 1. 3 マージソート - 1 - 1 1. ソート 1 1. 1 挿入ソート 挿入ソートを再帰関数 isort を用いて書く 整列しているデータ (a[1] から a[n-1] まで ) に a[n] を挿入する操作を繰り返す 再帰的定義 isort(a[1],,a[n]) = insert(isort(a[1],,a[n-1]),a[n])

More information

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1 4. ソート ( 教科書 p.205-p.273) 整列すなわちソートは アプリケーションを作成する際には良く使われる基本的な操作であり 今までに数多くのソートのアルゴリズムが考えられてきた 今回はこれらソートのアルゴリズムについて学習していく ソートとはソートとは与えられたデータの集合をキーとなる項目の値の大小関係に基づき 一定の順序で並べ替える操作である ソートには図 1 に示すように キーの値の小さいデータを先頭に並べる

More information

Microsoft Word - Cプログラミング演習(8)

Microsoft Word - Cプログラミング演習(8) 第 8 回 (6/11) プログラミングスタイルなど [1] 名前のつけかた グローバル変数にはわかりやすい名前を, ローカル変数には短い名前を 関連性のあるものには関連性のある名前をつけて, 統一しよう 関数には能動的な名前を 名前は的確に 例題 1 次のコードの名前と値の選び方についてコメントせよ? #define TRUE 0? #define FALSE 1?? if ((ch = getchar())

More information

Taro-プログラミングの基礎Ⅱ(公

Taro-プログラミングの基礎Ⅱ(公 0. 目次 2. プログラムの作成 2. 1 コラッツ問題 自然数 n から出発して n が偶数ならば 2 で割り n が奇数ならば 3 倍して 1 を足す操作を行う この操作を繰り返すと最後に 1 になると予想されている 問題 1 自然数 aの操作回数を求めよ 問題 2 自然数 aから bまでのなかで 最大操作回数となる自然数を求めよ 2. 2 耐久数 正整数の各桁の数字を掛け 得られた結果についても同様の操作を繰り返す

More information

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード] if 文 (a と b の大きい方を表示 ) C 言語 Ⅰ の復習 条件判定 (if, 条件式 ) ループ (for[ 二重まで ], while, do) 配列 ( 次元 次元 ) トレース int a, b; printf( 整数 a: ); scanf( %d, &a); printf( 整数 b: ); scanf( %d, &b); //つのif 文で表現する場合間違えやすい どっちに =

More information

プログラミング基礎

プログラミング基礎 C プログラミング Ⅰ 条件分岐 if~else if~else 文,switch 文 条件分岐 if~else if~else 文 if~else if~else 文 複数の条件で処理を分ける if~else if~else 文の書式 if( 条件式 1){ 文 1-1; 文 1-2; else if( 条件式 2){ 文 2-1; 文 2-2; else { 文 3-1; 文 3-2; 真条件式

More information

1999年度 センター試験・数学ⅡB

1999年度 センター試験・数学ⅡB 99 センター試験数学 Ⅱ 数学 B 問題 第 問 ( 必答問題 ) [] 関数 y cos3x の周期のうち正で最小のものはアイウ 解答解説のページへ 0 x 360 のとき, 関数 y cos3x において, y となる x はエ個, y となる x はオ 個ある また, y sin x と y cos3x のグラフより, 方程式 sin x cos3x は 0 x 360のときカ個の解をもつことがわかる

More information

Microsoft PowerPoint - prog11.ppt

Microsoft PowerPoint - prog11.ppt プログラミング言語 第 回 (7 年 7 月 6 日 今日の配布物 片面の用紙 枚 今日の課題が書かれています 本日の出欠を兼ねています /33 今日やること http://www.tnlab.ice.uec.ac.jp/~s-okubo/class/language/ にアクセスすると 教材があります 7 年 7 月 6 日分と書いてある部分が 本日の教材です 本日の内容 前回の課題の解答 Romberg

More information

Microsoft PowerPoint - C_Programming(3).pptx

Microsoft PowerPoint - C_Programming(3).pptx H23 年度秋学期情報スキル活用 入門 担当 : 田中基彦 ( 工学部共通教育科 ) Email: ak_tanaka@isc.chubu.ac.jp 授業のホームページ学術情報センター > 教育支援 > 情報リテラシー 授業の日程 講義内容提出課題 連絡事項を掲載 > 定期的にアクセスして確認する C 言語によるプログラミング (3) 制御文 繰り返し文 if, while, switch, for,

More information

P02.ppt

P02.ppt int If 2 1 ,,, 3 a + b ab a - b ab a * b ab a / b ab a % b ab a + b 4 2 list0201.c /, % /*/ int vx, vy; puts(""); printf("vx"); scanf("%d", &vx); printf("vy"); scanf("%d", &vy); printf("vx + vy = %d\n",

More information

Taro-リストⅢ(公開版).jtd

Taro-リストⅢ(公開版).jtd リスト Ⅲ 0. 目次 2. 基本的な操作 2. 1 リストから要素の削除 2. 2 リストの複写 2. 3 リストの連結 2. 4 問題 問題 1 問題 2-1 - 2. 基本的な操作 2. 1 リストから要素の削除 まず 一般的な処理を書き つぎに 特別な処理を書く 一般的な処理は 処理 1 : リスト中に 削除するデータを見つけ 削除する場合への対応 特別な処理は 処理 2 : 先頭のデータを削除する場合への対応

More information

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ 4 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プログラミング技術 工業 333 実教出版 ) 共通 : 科目 プログラミング技術 のオリエンテーション プログラミング技術は

More information

プログラミングI第10回

プログラミングI第10回 プログラミング 1 第 10 回 構造体 (3) 応用 リスト操作 この資料にあるサンプルプログラムは /home/course/prog1/public_html/2007/hw/lec/sources/ 下に置いてありますから 各自自分のディレクトリにコピーして コンパイル 実行してみてください Prog1 2007 Lec 101 Programming1 Group 19992007 データ構造

More information

£Ã¥×¥í¥°¥é¥ß¥ó¥°(2018) - Âè11²ó – ½ÉÂꣲ¤Î²òÀ⡤±é½¬£² –

£Ã¥×¥í¥°¥é¥ß¥ó¥°(2018) - Âè11²ó – ½ÉÂꣲ¤Î²òÀ⡤±é½¬£² – (2018) 11 2018 12 13 2 g v dv x dt = bv x, dv y dt = g bv y (1) b v 0 θ x(t) = v 0 cos θ ( 1 e bt) (2) b y(t) = 1 ( v 0 sin θ + g ) ( 1 e bt) g b b b t (3) 11 ( ) p14 2 1 y 4 t m y > 0 y < 0 t m1 h = 0001

More information

新版明解C言語入門編

新版明解C言語入門編 175cm 60kg ( ) 175cm 175.3cm 175.869758 cm 175cm 60kg p.177 18-1 vx - vy vx vy List -1 List -1 int vx, vy; puts(""); printf(" vx "); scanf("%d", &vx); printf(" vy "); scanf("%d", &vy); printf("vx + vy

More information