プログラミング論I - 兵庫県立大学 工学部・大学院工学研究科 University

プログラミング論I
担当
小橋(情報システムコース)
講義担当者
• 小橋昌司
– 情報システムコース所属
– [email protected]
– http://www.eng.u-hyogo.ac.jp/eecs/kobashi/index-j.html
• 他担当科目
Brain
1
– プログラミング演習(1年後期)
– 電気系工学実験II(3年生通年)
• 研究内容
Cerebral Aneurysm
これまでの研究成果
3
Brain Function
Lung Lobe
膵管
Liver
S
R
L
I
Artificial Hip Joint
Foot Bone
Artificial Knee Joint
– 医用画像処理
Meniscus(半月板)
L
P
A
兵庫県立大学
R
プログラミング論Ⅰ
2
2
講義の達成目標
• プログラミングの考え方(アルゴリズム)を理解
• アルゴリズムを実現するC言語文法の基礎
プログラミング論Ⅰ
3
講義の進め方
• プログラミング演習と連携して行います.
• 授業中にQuizを出します.
Quiz中は周囲の人との相談,教員,TAへの相談を
積極的に行ってください.
プログラミング論Ⅰ
4
オリエンテーション
• 授業スライド
– Webページに掲載するので,各自印刷して持参すること
http://www.eng.u-hyogo.ac.jp/eecs/kobashi/study/ProgrammingI
• テスト
– 理解度テスト
– 期末テスト
• 成績評価
– テストの点数(理解度テストおよび期末テスト)のみ
• 出席
– 授業開始10分までにパソコンにログインしておくこと
– 自動的に出席を取ります
プログラミング論Ⅰ
5
オフィスアワー
•
•
•
時間: 毎週水曜日3時限(13:00から14:30)
場所 6号館3階6313室
内容
– C言語が苦手な人へ
• 講義内容の補足説明
• 簡単な練習用Q&A
• 試験対策
– C言語が得意な人へ
• より発展的な内容の説明
• 実プログラムの問題提示
• 実プログラミングのアドバイス
プログラミング論Ⅰ
6
プログラミングって?
• Wikiより
– 「コンピュータプログラムを作成すること」
– 「コンピュータプログラム」とは「コンピュータの分
野におけるプログラム(コンピュータプログラム、
英:computer programs、ソフトウェアプログラム
、英:software programs)とは、コンピュータに対
する命令(処理)を記述したものである [1] 。」
• JIS規格
– 問題を解決する方法およびその手順(アルゴリズ
ム)を,コンピュータが理解できる言語で記述する
7
プログラミング論Ⅰ
こと
何に使われる
• ゲーム開発,ソフトウェア開発
• Webアプリ,携帯アプリ(android, iOS, etc)
• 組込みプログラミング.マイコン電子機器に
内蔵されたMPU(microprocessor unit)用の
プログラミング.
• 電子回路(LSI)設計.
プログラミング論Ⅰ
非常に多くの場所で使われおり,
プログラミングが必要でない分野は
8
考えられない
組み込みプログラミング
PSoC
プログラミング論Ⅰ
9
電子回路設計
FPGAボード
プログラミング論Ⅰ
10
プログラミングに必要なもの
1. プログラミング言語
2. アルゴリズム
3. アルゴリズムを作成する基礎学力
プログラミング論Ⅰ
11
プログラミングに必要なこと
① プログラミング言語
•
•
•
•
•
C, C++
JAVA
VBA
Fortran
HDL(ハードウェア記述言語)など
プログラミング論Ⅰ
12
本学でのプログラミング関連授業
~電子情報電気工学科情報システムコースの場合~
• 1年生
– 前期: 情報科学
– 後期: プログラミング論I,
プログラミング演習
• 2年生
– 前期: プログラミング論II,
コンピュータ実習A
– 後期: コンピュータ実習B
• 大学院(修士・博士)
– 修士研究
– 博士研究
• その他
– プロコンサークル
• 3年生
– 前期: アルゴリズム,
コンピュータ実習C,
電気系工学実験C
– 後期: コンピュータ実習D,
電気系工学実験D
「問題を解く力」を養成する科目は,
数学,電気電子回路,電磁気,情
報理論,などすべての科目
• 4年生
– 卒業研究
プログラミング論Ⅰ
13
電気系工学実験CD(3年生)
~psocプログラミング~
• 指定されたコースをより短時間で走行する
自律走行ロボットカーを作成
• 規則
– psoc(組込みマイコン)を使う
– 予算(3,000円以下)
– スタート後は接触,リモコン等の禁止,等
• 評価
– 走行時間
– 作成コンセプトの面白さ
(プレゼンテーションで評価)
プログラミング論Ⅰ
14
オリエンテーション・準備
プログラミング論Ⅰ
15
走行前の最終調整
プログラミング論Ⅰ
16
走行風景(動画)
プログラミング論Ⅰ
17
最優秀者の表彰式
プログラミング論Ⅰ
18
計算機実習(3年生)
• プログラミング言語(C,C++,JAVA等任意)
を使って,自由にアプリケーションを企画,作
成.
プログラミング論Ⅰ
学生の作成アプリの一例 (自炊のために,カメラで撮影した
画像から,本の部分のみを自動切り出しするソフト)
19
ACMプログラミングコンテスト
• 国内予選(2013年7月12日) (結果) 通過
!!
• アジア地区予選(2013年11月23-24日@会津
大学)
• 世界大会(2014年6月3-4日@インド)
プログラミング論Ⅰ
20
インターネット予選(学内)の風景
2013年国内予選問題の一部
• デモクラティア共和国の大統領は,以下のような複数段階の選挙により
選ばれる.
–
–
–
–
大統領選挙の候補者は2名である.
第1段階の選挙では,有権者は選挙区ごとに投票する.有権者の過半数の票を得た候補者がその選挙区の勝者と
なる.有権者が投票するのはこの第1段階だけである.
第k段階 (k > 1) の選挙区は,複数の第k − 1段階の選挙区を含む.一方,第k − 1段階の各選挙区は,ちょうど一
つの第k段階の選挙区に含まれる.そして,第k段階の選挙区の勝者は,この選挙区に含まれる第k − 1段階の選
挙区のうち過半数で勝った候補者である.
最終段階の選挙区は全国区であり一つしかない.ここでの勝者が大統領に選ばれる.
• この国の大統領選挙では,以下の仮定が成り立つ.
–
–
–
–
すべての有権者が,それぞれ一票を投じる.
第1段階の各選挙区の有権者数は奇数である.
第k段階 (k >1) の各選挙区に含まれる第k − 1段階の選挙区の数も奇数である.
したがって,すべての段階のすべての選挙区で,必ずどちらかの候補が勝つ (引き分けはない).
• あなたの仕事は,なるべく少ない得票数で大統領選挙に勝つ方法を求め
るプログラムを作成することである. たとえば,最終段階の選挙区がちょ
うど三つの第1段階の選挙区を含んでおり,これらの第1段階の選挙区
の有権者数がそれぞれ123名,4567名,89名だったとする. この場合,
最初の選挙区で62票,3番目の選挙区で45票の計107票を獲得するの
21
プログラミング論Ⅰ
が,最も少ない得票数で勝つ方法になる.
研究
• 卒業研究
– 4年生の1年間で,指導教員の指導の下,学術
研究を実施し,その研究成果を年度末に口頭発
表し,卒業論文を提出する
• 大学院研究
– 修士2年間で,・・・以下同文
– 積極的に国内外学会で発表
プログラミング論Ⅰ
学生の発表風景
22
WCCI@バルセロナ,2010
研究の例
~卒業研究,修士論文の題目より抜粋~
•
•
•
•
•
•
•
•
•
•
•
断層画像データからの3次元モデル再構
築
オートマトンモデルによる非同期論理素
子回路の構築
ホップフィールドニューラルネットワークに
よる想起
外来患者待ち時間予測システム
強化学習を用いた戦略決定
サポートベクタマシンを用いたにおい識
別
ファジィ理論による歩行レベル推定法
超音波装置を用いた筋肉厚さ測定
ファジィ医用画像処理
ぜんそく発作数の地域別要因分析と予測
計算機シミュレーションによるラマン分光
法
プログラミング論Ⅰ
•
•
•
•
•
•
•
•
•
•
PSoCを用いた生体情報モニタリングシス
テム
身体活動モニタリングシステムの低消費
電力化
無線LANを用いた屋内位置推定
自立移動ロボットの自己推定と障害物回
避
3次元断層顕微鏡による局面画像再生
ホログラフィック顕微鏡を用いた生体試料
観察
Web検索での網羅度を用いた未閲覧情
報の表示
看護ケアテキスト評価支援
方程式誤差法による音源方向推定
パンの画像識別
情報システムコースの多くの研究テーマ
はプログラミングが基本技術
23
第1回
プログラムとフローチャート
Agenda
• アルゴリズムとは
• フローチャート
– 部品
– 記述方法
プログラミング論Ⅰ
25
アルゴリズムとは
•
JIS規格:「問題を解くためのものであって、
明確に定義され、順序付けられた有限個の
規則からなる集合」
プログラミング論Ⅰ
26
Quiz 1-1: アルゴリズム
• [問題] 金額73円を,この金額を50円硬貨
,10円硬貨,5円硬貨,1円硬貨で出すとき,
それぞれの枚数を求めよ.ただし,全体の硬
貨枚数を最小になるように,各硬貨の枚数を
求めなければならない.
プログラミング論Ⅰ
27
Answer 1-1: アルゴリズム
•
•
•
•
50円玉
10円玉
5円玉
1円玉
プログラミング論Ⅰ
1枚
2枚
0枚
3枚
28
Answer 1-1: アルゴリズム
1. 73÷50=1 余り 23
2. 23÷10=2 余り 3
3. 3÷ 5=0 余り 3
4. 3÷ 1=3 余り 0
プログラミング論Ⅰ
50円硬貨
10円硬貨
5円硬貨
1円硬貨
1枚
2枚
0枚
3枚
29
Quiz 1-2: アルゴリズム
• [問題] 金額Y円を,この金額を50円硬貨,
10円硬貨,5円硬貨,1円硬貨で出すとき,
それぞれの枚数を求めよ.ただし,全体の硬
貨枚数を最小になるように,各硬貨の枚数を
求めなければならない.
プログラミング論Ⅰ
30
Answer 1-2: アルゴリズム
1.
2.
3.
4.
Y÷50=C50 余り X
X÷10=C10 余り X
X÷ 5=C5 余り X
X
プログラミング論Ⅰ
50円硬貨
10円硬貨
5円硬貨
1円硬貨
C50枚
C10枚
C5枚
C1枚
31
Answer 1-2: アルゴリズム
1.
Y÷50=C50 余り X
50円硬貨 C50枚
1.
2.
Y÷50の商C50を求める
1の余りをXに代入する
2.
X÷10=C10 余り X
10円硬貨 C10枚
3.
4.
X÷10の商C10を求める
3の余りをXに代入する
3.
X÷ 5=C5 余り C1
5円硬貨 C5枚
5.
6.
X÷ 5の商C5を求める
5の余りをC1に代入する
すべての計算手順を明らかにする
値はすべて変数に代入する
プログラミング論Ⅰ
32
C言語プログラミング
アルゴリズム
C言語
1.
2.
3.
4.
5.
6.
#include <stdio.h>
int main()
{
Y÷50の商C50を求める
1の余りをXに代入する
X÷10の商C10を求める
3の余りをXに代入する
X÷ 5の商C5を求める
5の余りをC1に代入する
プログラミング論Ⅰ
int X, Y, C1, C5, C10, C50;
Y=73;
C50 = Y / 50;
X = Y % 50;
C10 = X / 10;
X = C10 % 10;
C5 = X / 5;
C1 = X % 5;
printf(“%d, %d, %d, %d¥n”,
C50, C10, C5, C1);
return 0;
}
33
アルゴリズムを記述する方法
• フローチャート
• NSチャート
• PAD
プログラミング論Ⅰ
34
アルゴリズムの例
• 問題「3値(a,b,c)の最大値(max)を求める」
• 自然言語による記述(これが重要)
1.maxにaを代入
2.bの値がmaxより大きいとき、maxにbを代入
3.cの値がmaxより大きいとき、maxにcを代入
プログラミング論Ⅰ
35
フローチャートの例
• 問題「3値(a,b,c)の最大値
(max)を求める」
開始
max=a
• 自然言語による記述
1. maxにaを代入
2. bの値がmaxより大きい
とき、maxにbを代入
3. cの値がmaxより大きい
とき、maxにcを代入
b>max
yes
max=b
No
c>max
No
yes
max=c
終了
プログラミング論Ⅰ
36
主な部品1
• 端子(開始、終了など)
• 入出力(データ)
データ
端子
• 処理(数値計算など)
• 手作業入力
処理
手作業入力
• 判断(2つ以上の条件分岐)
判断
JIS規格より抜粋
プログラミング論Ⅰ
37
主な部品2
• ループ端
• 結合子(他の場所へつ
なげる)
ループ端(開始)
ループ端(終了)
• 表示(画面への表示など) • 流れ線
プログラミング論Ⅰ
38
主な書き方1
• 上から下へ流れる
開始
処理1
処理2
終了
プログラミング論Ⅰ
39
Quiz 1-3: アルゴリズム
• 以下を行うフローチャートを示せ.
• 金額Y円を,この金額を50円硬貨,10円硬
貨,5円硬貨,1円硬貨で出すとき,それぞれ
の枚数を求めよ.ただし,全体の硬貨枚数を
最小になるように,各硬貨の枚数を求めなけ
ればならない.
– ただし,X÷Yの商Zは, Z = X / Y
X÷Yの余りZは, Z = X % Y
で求められるとする
プログラミング論Ⅰ
40
Answer 1-3: アルゴリズム
開始
1.
2.
Y÷50の商C50を求める
1の余りをXに代入する
3.
4.
X÷10の商C10を求める
3の余りをXに代入する
5.
6.
X÷ 5の商C5を求める
5の余りをC1に代入する
C50 = Y / 50
1
X = Y % 50
2
C10 = X / 10
3
X = X % 10
4
C5= X / 5
5
C1 = X % 5
6
終了
プログラミング論Ⅰ
41
主な書き方2
• 分岐がある場合
開始
判断
no
yes
処理1
処理2
終了
プログラミング論Ⅰ
42
主な書き方3
開始
• 複数分岐
判断
1
処理1
2
処理2
それ以外
処理3
処理4
終了
プログラミング論Ⅰ
43
主な書き方4
• 繰り返し
開始
ループ端
条件
処理1
ループ端(終了)
プログラミング論Ⅰ
終了
44
Quiz 1-4: フローチャート記述
• 1から10までの整数の合計(sum)を計算する
アルゴリズムを自然言語による記述で示せ.
プログラミング論Ⅰ
45
Answer 1-4: フローチャート記述
• 自然言語による記述
1.
2.
3.
4.
5.
6.
プログラミング論Ⅰ
sumに0を代入
iに1を代入する
iが10より大きいとき終了する
sumにsumとiの和を代入する
iにiと1の和を代入する
3に戻る
46
Quiz 1-5: フローチャート記述
• Quiz1-4(以下)のフローチャートをループを
用いずに示せ.
• 1から10までの整数の合計(sum)を計算する
アルゴリズムを自然言語による記述で示せ.
プログラミング論Ⅰ
47
Answer 1-5: フローチャート記述
自然言語による記述
1. sumに0を代入
2. iに1を代入する
3. iが10より大きいと
き終了する
4. sumにsumとiの
和を代入する
5. iにiと1の和を代入
する
6. 3に戻る
開始
sum=0
i=1
no
i ≤10
yes
sum=sum+i
i=i+1
プログラミング論Ⅰ
終了
48
Quiz 1-6: フローチャート記述
• Quiz1-4(以下)のフローチャートをループを
用いて示せ.
• 1から10までの整数の合計(sum)を計算する
アルゴリズムを自然言語による記述で示せ.
プログラミング論Ⅰ
49
Answer 1-6: フローチャート記述
開始
自然言語による記述
1. sumに0を代入
2. iに1を代入する
3. iが10より大きいと
き終了する
4. sumにsumとiの
和を代入する
5. iにiと1の和を代入
する
6. 3に戻る
sum=0
i=1
ループ1
i ≤10
sum=sum+i
自然言語による記述
1. sumに0を代入
2. iに1を代入する
3. iが10以下の時
ループ1を繰り返す
4. sumにsumとiの和
を代入する
5. iにiと1の和を代入
する
i=i+1
ループ1
プログラミング論Ⅰ
終了
50
C言語プログラムの構造
#include <stdio.h>
main()
{
printf("hello world¥n");
return 0;
}
プログラミング論Ⅰ
必ず覚える
注意
1.括弧()
2.セミコロン(;)
← 実行文
この箇所に任意の
プログラムを記述する
51
変数
• アルゴリズムでは,値を必ず変数に代入する
• C言語における変数について
– 変数は使用前に必ず定義が必要
– 値の違い(整数,小数など)により定義方法が異
なる
プログラミング論Ⅰ
52
変数の定義
• 整数(integer)の場合
int a;
char a;
文の最後
• 小数(float)の場合
float a;
文の最後
変数の種類
変数の種類
変数名
変数名
違い:格納可能な値の範囲が異なる
int は -231 から +231-1
0 から 255
charは
プログラミング論Ⅰ
53
変数への代入
• 変数の定義
int a, b;
複数の変数を一度に定義できる
変数を , で区切る
• 数値の代入
a = 5;
各命令の最後は必ず ;
• 数値の計算
b = a / 5;
プログラミング論Ⅰ
割り算は / と記述
54
Quiz 3-1: 初めてのプログラミング
• 3つの変数x, y, zを定義し,xに5を代入,yに
10を代入し,zにxとyの和を代入するプログ
ラムを作成せよ.
プログラミング論Ⅰ
55
Answer 3-1: 初めてのプログラミング
• 3つの変数x, y, zを定
義し,xに5を代入,yに
10を代入し,zにxとy
の和を代入するプログ
ラムを作成せよ.
プログラミング論Ⅰ
#include <stdio.h>
main()
{
int x, y, z;
x = 5;
y = 10;
z = x + y;
return 0;
}
56
プログラミング演習受講者への
アナウンス
• クラス分けとWebサイトのURLについては掲
示
• Webサイトで公開している資料については熟
読してきていることを前提に実習を行う
• 不明な点があれば実習の際に質問の時間を
設けるのでその際に質問を受け付ける
プログラミング論Ⅰ
57