Comments
Transcript
プログラミング論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