i=1

プログラミング入門
第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