プログラミング入門 第8回講義 フローチャート 今回の講義と演習について(2) プログラムは構造を考えて(3) 講義と演習の方法(6) 問題1のフローチャート作成(7) 問題1のプログラム作成(16) 問題2(20) Prog-0 2013 Lec08-1 Copyright (C) 1999 – 2013 by Programming-0 Group 今回の講義と演習について • 今回の演習では、いつもとは異なり、プログラムの構造を 理解することを学びます。 • そのため、プログラムを書くのではなく、フローチャートとい う、プログラムの構造を表す図を手で実際に書いてみて、 プログラムを設計することを学びます。 • そのフローチャートを元に、実際にプログラムを作ってみ て、動作させてみます。 Prog-0 2013 Lec08-2 Copyright (C) 1999 – 2013 by Programming-0 Group プログラムを設計することの重要性 長いプログラムを書くようになると、最初に設計すること が重要になる。 いきなりプログラムを書き始めると、後から変数や処理の追加 や修正を次々に行うことになり、結局作業時間が長くかかるこ とになる。 プログラムを最初に設計することで、コーディング(実際にプロ グラムを画面に向かって書く作業)の時間を減らすことができる。 プログラムを設計する方法の一つとして、フローチャート と呼ばれる、プログラムの内容を表す記号を使う。 Prog-0 2013 Lec08-3 Copyright (C) 1999 – 2013 by Programming-0 Group フローチャート(p.60) 第5回の講義で登場しているが、改めて。 下のような図形を有向線でつないで処理 の手順(アルゴリズム)を表す ループ開始 ループ終了 キー入力 条件分岐 処理 起点・終点 真 真の場合 の処理 偽 偽の場合 の処理 入出力 分岐 画面出力 Prog-0 2013 Lec08-4 Copyright (C) 1999 – 2013 by Programming-0 Group 今日の演習で重視すること まず、問題について、どのような処理が必要な のかを洗い出してみる。 変数(配列?)、ループ処理(for? while?)、条件分岐 (どのような条件?) 洗い出せたら、それをフローチャートに表現して みる。 処理の順番、変数の内容など、細かい点が重要。 フローチャートは、いわば設計図。家が設計図なしで建てられない ように、プログラムもフローチャートがないと作るのが大変だ。 Prog-0 2013 Lec08-5 Copyright (C) 1999 – 2013 by Programming-0 Group 今回の講義と演習の方法 講義では、これから、実際にフローチャートを使った プログラム設計の例を見せます。 その後、講義でも皆さんに1問、その作業を行ってもらいます。 演習では、与えられた課題をフローチャートで書き、 それをもとにしてプログラムを書きます。 フローチャートとプログラムを提出してもらいます。 問題と実行例は講義当日別紙にてお渡しします Prog-0 2013 Lec08-6 Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: ブロックへの分割 始め 問題文(仕様)と実行例をよく読み、 プログラムが実行すべき処理を読 み取る。 2の0乗から2の9乗までの値 を順に作り、配列に格納する プログラムが実行すべき処理を、い くつかのブロックに分割する。 この配列のすべての要素の 値を1行に出力する ブロックをつなげて、プログラムの フローチャートを作る。 1以上511以下の整数をキー ボードから入力する ブロックごとにフローチャートを作る ことで詳細化。 入力された数を、2のべき乗 の値をもつ配列を用いて分 解し、その結果を出力する Prog-0 2013 Lec08-7 終わり Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 1つ目のブロック 始め 2の0乗から2の9乗までの値 を順に作り、配列に格納する この配列のすべての要素の 値を1行に出力する 1以上511以下の整数をキー ボードから入力する 入力された数を、2のべき乗 の値をもつ配列を用いて分 解し、その結果を出力する Prog-0 2013 Lec08-8 終わり ~から~まで(~順に) ループ処理(for)を使う 配列に格納する値の計算 20=1 2i=2×2i-1(i>0) 必要な変数 • 20から29を保管する配列data ここでループ処理 • ループ変数i (i=1からi=9まで) Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 1つ目のブロック 始め 2の0乗から2の9乗までの値 を順に作り、配列に格納する data[0]←1 この配列のすべての要素の 値を1行に出力する i を1から9まで 1ずつ増加 1以上511以下の整数をキー ボードから入力する data[i]←data[i-1]*2 入力された数を、2のべき乗 の値をもつ配列を用いて分 解し、その結果を出力する Prog-0 2013 Lec08-9 終わり Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 2つ目のブロック 始め 2の0乗から2の9乗までの値 を順に作り、配列に格納する この配列のすべての要素の 値を1行に出力する 1以上511以下の整数をキー ボードから入力する 入力された数を、2のべき乗 の値をもつ配列を用いて分 解し、その結果を出力する Prog-0 2013 Lec08-10 終わり 配列のすべての~ ループ処理(for)を使う。 (0から配列の要素数-1まで 1つずつ増加) 必要な変数 • ループ変数i Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 2つ目のブロック 始め 2の0乗から2の9乗までの値 を順に作り、配列に格納する この配列のすべての要素の 値を1行に出力する i を0から9まで 1ずつ増加 data[i]を 出力 1以上511以下の整数をキー ボードから入力する 入力された数を、2のべき乗 の値をもつ配列を用いて分 解し、その結果を出力する Prog-0 2013 Lec08-11 終わり 改行を 出力 Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 3つ目のブロック 始め 2の0乗から2の9乗までの値 を順に作り、配列に格納する この配列のすべての要素の 値を1行に出力する 必要な変数 • 入力された整数を 格納する変数 v 1以上511以下の整数をキー ボードから入力する vの値を入力 入力された数を、2のべき乗 の値をもつ配列を用いて分 解し、その結果を出力する vの値を出力 Prog-0 2013 Lec08-12 終わり Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 4つ目のブロック 始め 2の0乗から2の9乗までの値 を順に作り、配列に格納する 2i-1≦vかつv<2i なら、vを2 のべき乗で分解したときの最 大の数は2i-1。 この配列のすべての要素の 値を1行に出力する このとき、v-2i-1<2i-1 1以上511以下の整数をキー ボードから入力する 入力された数を、2のべき乗 の値をもつ配列を用いて分 解し、その結果を出力する Prog-0 2013 Lec08-13 終わり iが大きい方から小さい方へ 処理していく。 2i-1≦vかつv<2i なら、2i1を出力し、vをv-2i-1に更 新。 Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 4つ目のブロック 始め i を9から1まで1ずつ減少 2の0乗から2の9乗までの値 を順に作り、配列に格納する この配列のすべての要素の 値を1行に出力する 1以上511以下の整数をキー ボードから入力する 入力された数を、2のべき乗 の値をもつ配列を用いて分 解し、その結果を出力する Prog-0 2013 Lec08-14 終わり data[i] > v かつ data[i-1] ≦ v ? no yes data[i-1]を出力 v ← v – data[i-1] 改行を出力 Copyright (C) 1999 – 2013 by Programming-0 Group 問題1のフローチャート 始め data[0]←1 i を1から9まで1 ずつ増加 data[i]←data[i-1]*2 i を0から9まで1 ずつ増加 data[i]を 出力 data[i] > v かつ data[i-1] ≦ v ? no yes data[i-1]を出力 改行を 出力 v ← v – data[i-1] vの値を入力 vの値を出力 改行を出力 i を9から1まで1 ずつ減少 Prog-0 2013 Lec08-15 終わり Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 1つ目のブロックのプログラム data[0]←1 i を1から9まで 1ずつ増加 data[i]←data[i-1]*2 Prog-0 2013 Lec08-16 必要な変数 • 20から29を保管する配列data • ループ変数i data[0] = 1; for(i = 1 ; i < 10; i++ ){ data[i] = 2 * data[i - 1]; } Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 2つ目のブロックのプログラム i を0から9まで 1ずつ増加 data[i]を 出力 改行を 出力 Prog-0 2013 Lec08-17 必要な変数 • ループ変数i for(i = 0; i < 10; i++ ){ printf("%d ", data[i]); } printf("\n"); Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 3つ目のブロックのプログラム 必要な変数 vの値を入力 vの値を出力 • 入力された整数を格納する 変数 v scanf("%d", &v); printf("%d >> ", v); Prog-0 2013 Lec08-18 Copyright (C) 1999 – 2013 by Programming-0 Group 問題1: 4つ目のブロックのプログラム i を9から1まで1ずつ減少 data[i] > v かつ data[i-1] ≦ v ? yes data[i-1]を出力 v ← v – data[i-1] for (i = 9 ; i > 0; i-- ) { no if ((v < data[i]) && (v >= data[i-1])) { printf("%d ", data[i-1]); v -= data[i-1]; } } printf("\n"); 改行を出力 Prog-0 2013 Lec08-19 Copyright (C) 1999 – 2013 by Programming-0 Group 問題2: ベクトルの内積の計算 2次元のベクトル(x0,x1)と(y0,y1)の内積 x0y0+x1y1 3次元のベクトル(x0,x1,x2)と(y0,y1,y2)の内積 x0y0+x1y1+x2y2 5次元のベクトル(x0,x1,x2,x3,x4)と (y0,y1,y2,y3,y4)の内積 x0y0+x1y1+x2y2+x3y3+x4y4 問題と実行例は講義当日別紙にてお渡しします Prog-0 2013 Lec08-20 Copyright (C) 1999 – 2013 by Programming-0 Group
© Copyright 2024 ExpyDoc