平成26年度前期 データ構造とアルゴリズムⅠ 第2回 そもそも、アルゴリズムって何なの? アルゴリズムとは Computational Procedure (T. Cormen et.,al.) =「Computational 問題」の「処理手順」 「問題処理」のProcess 1. 問題設定 2. 問題処理法(or 解決法)の立案 3. 問題処理(or 解決法)の実施 4. 問題解決 データ構造 データに関すること • データ型と変数 構造に関すること • データの保管・管理方法 本日の講義内容 データに関すること • データ型と変数 – 「値」 – 「変数」とは – 「配列」とは – 何故、配列を使うのか? 何故、データ(Data)を学ぶの? アルゴリズム ⇒「問題」を解決し、「結果」を得るための処理手順 計算機(コンピュータ)において、 「問題」は“データ”(data)という形で入力 「結果」は“データ” (data)という形で出力 ⇒データの表現が必要 Q. データは何で表現(定義)するのか? A. 定数・変数・配列で表現 チキンカレーを作りたい レシピ=アルゴリズム チキンカレーを作るのに必要な情報は? ・材料と量 玉葱 2玉 マーガリン 大2 ニンニク 小1 とり手羽元 10本 塩コショー 少々 オリーブ油 大1 ◎水 800cc ◎コンソメ 大1 ◎ローリエ 2枚 ◆カレールー 半箱 ◆ウスターソース 大2 ◆カレー粉 大1 材料 = Data ・作り方 1. 耐熱皿に玉葱を平らに 入れ、ラップ無しレンジ で5分(600W)加熱する 2. お鍋にマーガリン・ニン ニクを熱し①を加え、タ マネギが飴色になるまで 中火で炒める(約10分) 一旦、取り出す 3. 同じ鍋を軽く拭き取って からオリーブ油を熱し、 塩コショーした鶏肉を両 面軽く焼き色が付くまで 焼く ・・・ 処理 = Processing データ型(Data Type) データには“型”がある! e.g. チキンカレーを作る ・材料と量 玉葱 2玉 マーガリン 大2 ニンニク(みじん切り) 小1 とり手羽元 10本 塩コショー 少々 オリーブ油 大1 ◎水 800cc ◎コンソメ 大1 ◎ローリエ 2枚 ◆カレールー 半箱 ◆ウスターソース 大2 ◆カレー粉 大1 ◆ハチミツ 大1 ◆砂糖 小2 ・具材 玉葱 マーガリン ニンニク とり手羽元 ・分量 2玉 大2 小1 10本 ・調味料 塩コショー オリーブ油 ◎水 ◎コンソメ ◎ローリエ ◆カレールー ◆ウスターソース ◆カレー粉 ◆ハチミツ ◆砂糖 ・時間 ・火加減 表現することによっていろいろあって、 最適なものを使う データ型(Data Type) データには“型”がある 計算機も同じ e.g. “文字”表現と“数字”表現では全く違う “目的”に応じたデータ型を使う 整数型 0, 123, ‐999, 9999 数字を扱う データ型 実数型 1.23, ‐99.9, 0.001 文字型 A, あ, イ 文字を扱う 文字列型 ABC, 岩田 日付を扱う 日付型 数字に沢山のデータ型がある理 由は処理論で習ってください 値(Value) データ=情報表現 データの具体的な表現を「値」と呼ぶ e.g. チキンカレー ・具材 玉葱(みじん切り) マーガリン ニンニク とり手羽元 水 「物」を表している「値」 ・分量 2玉 大2 小1 10本 500cc 「数」を表している「値」 数字はデータ型に合わせて表現していればOK 値(Value) プログラムを書く際の約束事 of 文字&文字列 文字型の値には、シングル・クォーテションを付ける ‘A’ ‘あ’ 文字列型の値には、ダブル・クォーテションを付ける ”JAPAN” “アルゴリズム” Q. 何故、上記の約束があるのか? A. 数字列の数と、文字列の数を区別するため =10と”10”は計算機からすると全く違う値である 練習 以下の値を表現するのに用いるべきデータ型は何 か? 1. 120 2. ‐3 3. 0.98 4. ‐0.88 5. 1.00 6. A 7. 金曜日 8. 休日 9. 10月11日 変数(Valuable) • 「変数」とは「値」を入れておく「皿」 「引出し」 e.g. チキンカレーを作る みじん切りした玉ねぎを「皿」に「おいておく」 水800ccを準備して「カップ」に「おいておく」 野菜をいためて「ボール」に「おいておく」 e.g. 郵便局の仕分け作業 ○○さん宛の郵便物を□□地域の「箱」に「いれておく」 上記の作業例では、 「玉ねぎ」、「水」、「野菜」、「○○さん宛の郵便物」がデータ それらは、作業過程において、皿なり、箱なりに「保管」し、 出し入れしている プログラムにおいて、この「皿」「箱」にあたるのが「変数」 変数(Valuable) e.g. ユークリッドの互除法 最大公約数を求める2つの数 X, Y (X≧Y) XをYで割った余り R 最低、この3つの変数が最大公約数を探すのに必要 最大公約数の算出 ・材料 最大公約数を求める2つの数 X, Y (X≧Y) ・処理 ユークリッドの互除法 定理 「XをYで割った余りRとYの最大公約 数は、XとYの最大公約数に等しい」 X/Y=a1余りR1 Y/ R1=a2余りR2 R1/ R2=a3余りR4 ・・・ Rm‐1/Rm=am+1余り0 この時のamがXとYの最大公約数 証明 X=a1*Y+R1 X=α*m, Y=β*m (m : X と Y の最大公約数) R1=X‐a1*Y=α*m‐a1*β*m=(α‐a1*β) *m R1はmを約数に持つが、mはXとYとの最大公約数であるから、 mはYとR1の最大公約数 変数(Valuable) e.g. ユークリッドの互除法 最大公約数を求める2つの数 X, Y (X≧Y) XをYで割った余り R 最低、この3つの変数が最大公約数を探すのに必要 変数に値を入れることを「代入」(Substitution)するという 注意点 一つの「引出し」に代入できる「値」は一つ ただし、上書きはできる =同じ変数に別の値を代入すると、前の値は消去され、新 たに代入された値になる 変数(Valuable) 引出には「名前」を付け、定義しなければならない In V.B. or C++ e.g. Dim i as Integer = iを整数型で定義する Dim s as string = sを文字型として定義する 変数を定義するときの約束事 1. ユニークでなければならない =同じ名前の変数を定義してはならない。名前が違えば、 基本、何でもOKだが、プログラミング言語によっては、予 約変数がある(e.g. pi, e, etc) 2. 数字のみ、または、数字から始まってはいけない =数字の「値」と区別するため 代入(Substitution) 「代入」とは、変数に値を与える行為 表現する場合、必ず、左辺が変数、右辺が値 ・変数名←値 ・変数名 = 値 e.g. Aという変数に10という値を代入する場合 A←10 A = 10 代入(Substitution) 「代入」とは、変数に値を与える行為 表現する場合、必ず、左辺が変数、右辺が値 ・変数名←値 ・変数名 = 値 e.g. strという変数に”ABC”を値を代入する場合 str←”ABC” str = ”ABC” 代入(Substitution) 「代入」とは、変数に値を与える行為 右辺に算術記号があってもよい e.g. A←10+5 A = 10+5 であれば、Aに15(=10+5)を代入するという意味 B ← 10*5 B = 10*5 であれば、Aに50(=10*5)を代入するという意味 代入(Substitution) 「代入」とは、変数に値を与える行為 右辺に関数があってもよい e.g. A←abs(sqrt(9)) A = abs(sqrt(9)) であれば、Aに3(√9の絶対値)を代入するという 意味 B←10 mod 3 B = 10 mod 3 であれば、Bに1(10を3で割った余り)を代入 代入(Substitution) 「代入」とは、変数に値を与える行為 変数に変数を代入することもできる(コピー) e.g. A←3 B←A であれば、Bに3(= A)を代入する A←3 B←2 C ←A+B であれば、Cの値は5である 代入(Substitution) 「代入」とは、変数に値を与える行為 プログラミングでよく使用することに、自分に自分 を代入する場合がある(後に扱う) e.g. A←A AにAを代入する A←A+3 AにA+3を代入する 変数のデータ型 変数は必ず、”型”を宣言して定義される In V.B. or C++ e.g. Dim i as Integer = iを整数型で定義する Dim s as string = sを文字型として定義する そして、値は同型の変数にしか、代入できない Dim i as Integer i = 10 はOK i = “ABC”は× i = 0.9 は× 練習 以下の計算結果を述べよ 第1問 A=2, B=3, A + B = ? 第2問 A=‘5’, B=‘1’, A + B = ? 配列(Array) • 「配列」とは「変数」が並んだ「たんす」 e.g. チキンカレー ・具材 玉葱 マーガリン ニンニク とり手羽元 水 A_Guzai[i] A_Guzai[0] = 玉葱 A_Guzai[1] = マーガリン A_Guzai[2] = ニンニク A_Guzai[3] = とり手羽元 A_Guzai[4] = 水 e.g. 1年365日の気温 365個のデータ このように、沢山のデータを保持するために 用いるのが「配列」 配列(Array) • 「配列」とは「変数」が並んだ「たんす」 e.g. チキンカレー ・具材 玉葱(みじん切り) マーガリン ニンニク とり手羽元 水 具材 A = “玉葱” B = “マーガリン” C = “ニンニク” D = “とり手羽元” E = “水” 配列 =変数が隙間なく、連続 に並んだもので、変数が 「引出し」とすれば、「たん す」に対応する ・具材 Dim Gu[5] as String Gu[0] = “玉葱(みじん切り)” Gu[1] = “マーガリン” Gu[2] = “ニンニク” Gu[3] = “とり手羽元” Gu[4] = “水” 配列(Array) 配列の約束事 = 大体は「変数」と同じ 1. ユニークでなければならない =同じ名前の変数を定義してはならない。名前が 違えば、基本、何でもOK 2. 数字のみ、または、数字から始まってはいけな い =数字の「値」と区別するため 3. 一配列で扱う値は、同じ型でなくてはなら ない 配列の表示方法 配列は、 配列要素(=引出し) 配列用素数(= 配列要素の数) 要素番号(=引出しについた番号) で表す Dim Array[100] as Integer Array[0]=0 配列要素 Array[1]=2 要素番号 配列表示した場合の要素番号のことを”添え字”(suffix or index)と呼ぶ 配列の表示方法 「Base 0」と「Base 1」 Base 0 配列の要素番号を”0”~”N‐1”で表す Base 1 配列の要素番号を”1”~”N”で表す Dim Array[100] as Integer Array[0]=0 Array[1]=2 こいつは、Base 0 配列の表示方法 配列へのアクセス m番目の引出し(=配列要素)にアクセスするときは Array[m] or Array(m) と書く (2つの違いは、プログラミングで習うこと) e.g. m番要素に5を代入する ⇔ Array[m]=5 変数aにm番要素を代入する ⇔ a=Array[m] 変数bにm番要素を加える ⇔ b + Array[m] m番要素にm+1番要素を加える ⇔ Array[m]+ Array[m+1] 何故、配列か? e.g. 牛肉、 豚肉、 鶏肉の必要量を管理したい場合 変数を3つ用意して管理する Weight_Beef Weight_Pork Weight_Chicken 3種類程度であれば、行けるが、40種類もあると、 40の変数で管理するのは、非効率 配列 Weight_Meet として、 Weight_Meet[0]~ Weight_Meet[39]で管理 した方が効率的 何故、配列か? 繰り返し操作をする場合、”添え字”で操作できる配 列が便利 e.g. 牛肉、 豚肉、 鶏肉の必要量の和を出したい Sum = Weight_Beef + Weight_Pork + Weight_Chicken ↓ Sum = Weight_Meet[0] + Weight_Meet[1] + Weight_Meet[2] 40種類ある場合、 Sum = 0 Weight_Meet[i] (詳しくは、後日) 多次元配列 e.g. 学生の英語・数学の得点を管理したい 77 66 88 78 65 70 … … 75 55 これを添え字2つを使って Name_E_M[i,j](0≦i≦ 99, 0≦j≦ 99 ) として管理する場合、 Name_E_M [0,0]を2次元配列と呼ぶ 太郎の英語と数学は Name_E_M[0,0]=77, Name_E_M[0,1]=66 で表す 添え字が3つあれば、3教科 多次元配列の約束事 • 表示方法 n次元配列では、配列要素をn個の添え字を使って A[i, j, …] or A(i, j, …) または、 A[i][j][]… or A(i)(j)… と表示する • 縦、横、高さ…の数が一致していなければならない 構造体配列 e.g. 学生の身長・体重の得点を管理したい 身長(cm) 体重(kg) 太郎 177 66 一郎 188 78 次郎 165 70 175 55 ・・・ 百太郎 これを添え字2つを使って Name_L_W[i,j](0≦i≦ 99, 0≦j≦ 99 ) として管理する場合、 Name_L_W [0,0]を2次元配列と呼ぶ 太郎の英語と数学は Name_L_W[0,0]=77, Name_L_W[0,1]=66 で表す 添え字が3つあれば、3種類 多次元配列と構造体配列の違い 多次元配列 構造体配列 身長(cm) 体重(kg) 太郎 177 66 70 一郎 188 78 … … 次郎 165 70 75 55 ・・・ 175 55 77 66 88 78 65 百太郎 表でみると、ほとんど同じ → Q. 何が違うの? A. メモリ内でのデータ管理が違う 多次元配列 77 88 65 … 75 66 78 70 … 55 構造体配列 太郎 177 一郎 66 188 次郎 78 165 百太郎 … 70 … … 175 55 文字型と文字列型 計算機側の文字の理解 計算機は、数字しか理解しない = 文字は文字コードと呼ばれる決まりで表現される e.g. ‘0’=48, ‘1’=49, ‘A’=65, ‘B’=66, ‘C’=67, ‘+’=43, ‘‐’=45 など 文字列型は、文字型の配列で表現 e.g. Str[0]=‘A’, Str[1]=‘B’, Str[2]=‘C’, “ABC”=Str[0]+Str[1]+Str[2]=’A’+’B’+’C’ 練習
© Copyright 2024 Paperzz