Posted by あしたさぬき.JP at ◆

 

この広告、メッセージは90日以上更新のないブログに表示されています。
新しい記事を書く事でこのメッセージが消せます。
  

2014年12月26日
Posted by 屋台ブルー at ◆ 2014年12月26日00:00 Comment(0)

Swiftで遊ぼう! - 168 - Array

swift_logoMy Third Projectを作っていたのですが、優柔不断な私は、Swiftの文法書に戻ります(^_^;) 先日、私と同世代の方からコメントがあり「プロおも本」の問題に対してコメントをくださったので、再びプログラミング関連の問題に戻ろうと思ったしだいです。iOS SDKばかり取り組んでいると覚えなきゃいけない情報が多すぎて少し辟易してきていたので、ちょうどよかったかも。

問題に取り組む前に、関連する項目の復習。「アレー型」なんて、基本的な事は復習するまでもないと思ってましたが... やっぱりオヤジ脳、シンタックス関連忘れてしまってました(^_^;)

毎回The Swift Programming Language本を紐解くのもかったるいので自分の備忘録として要点を書いてここで復習できるようにしておく。

1) Array(配列型)は値を保持するコレクションタイプの1つ(もう一つはDictionary)

2) アレーは、同型の値の集まりを順序だって保持する。

3) 扱う値のタイプ(型)を明確にする必要があるので、アレーから得られる値の型は保証されている。しかし、その裏で「ジェネリックタイプ」も扱える。

4) アレーは、変数(var)として作ってやるのが一般的。後で追加変更を加えられるから。しかし、コレクションを変更する必要が全くないのであれば、定数(let)で作ってやった方がプログラムのパフォーマンスは上がる。

5) そしてArrayの宣言法が次のようにする。
i) var arrayA: Array〈Int〉 = [1, 2, 3]
ii) var arrayB: [Int] = [1, 2, 3]
iii) var arrayC = [1, 2, 3]
iv) var arrayD = [Int]()
arrayD = [1, 2, 3]

arrayAからarrayDまですべて同じ値を保持してるんですが、よく忘れるのが最初の正式宣言のArrayだけど。なぜこのシンタックスの仕方を忘れてしまうというと使わないからだ。どうして使わない宣言法が用意されているんだろう? 使わない宣言法だったららメモリの無駄ですよね。省けばいいんじゃないかと素人的に考えます。「Array»〈int〉」という宣言法をどんな状況で使う必要があるんでしょうか? プログラマの皆さん!

6) Arrayに備わっている標準プロパティとメソッド
i) .count アイテムの数をINt型で返す
ii) .isEmpty Boolean型で「0」だったらtrueを返す
iii) .append() アイテムを追加
iv) operator (+=) による連結 2つの同型アレーを連結
v) array[0] 変数(定数)arrayの最初のアイテムを抽出するサブスクリプト、同型のアイテムで入れ替えることもできる
vi) array[0...3] まとめて入れ替えができる
vii) .insert(someItem, atIndex: 0) インデクス値にアイテムを挿入
viii) .removeAtIndex(0) インデックスのアイテムを除去して既存のアイテムが前倒しになる
viv) .removeLase() 最後のアイテムを除去
x) .removeAll() アイテムをすべて除去
xi) array = [] 変数arrayの内容をすべて除去することができる

7) Arrayの初期化には以下のとおり
i) var someInts = [Int]() 空のアレーを作る
ii) var array = [Inte](count: 5, repeatedValue: 0] 値が0の5つの項目をもつアレーarrayを作る

これが正本の全てです。今日は之まで。  


2014年10月19日
Posted by 屋台ブルー at ◆ 2014年10月19日00:00 Comment(0)

Swiftで遊ぼう! - 100 - Swift Fundamentals本 アレー型の関数は続く

swift_logoSwift Fundamentals: The Language of iOS Development - スイフト:基本」はまだまだ続く。

とうとう100回目を迎えたけど、まだまだ道半ば... 
まだまだ初心者用の本を読んでいる。
実は仕事が忙しくて、プログラミングの勉強に打ち込めない。
こいう日もあるんでペースが落ちている。
まあ気長に続けます。

アレー型の関数は色々ある。
Array.IsEmpty()
Array.Append()
array concatenation(アレー型の連結)
Array.Insert()
Array.RemoveAll()
Array.RemoveLast()
Array.RemoveAtIndex()
などの説明があるけど、知っているから簡単に流して、章末の問題を解こう

Questions for Review - 復習のための質問

1. Array.append()の正しい使い方は?
a) Array.append()を使って、アレー型の最初のメンバーに追加する。
b) Array.append()はアレー型の最後に空のメンバーを追加する。
c) Array.append()を使って、アレー型の最後にメンバーを追加する。
d) Array.append()は2つのアレーを結合して大きな1つのアレーにする。
これは答えが(c)ですね。

2. Arrays.Insert()を「atIndex」キーワード無しで呼ぶと、自動的にアレーの最後にメンバーを挿入する
a) 正しい
b) 間違い
これは(b)間違いで、atIndexキーワードがないとエラーになる。

3. アレー型の 「myArrayA」と「myArrayB」を結合させるシンタックスは何を使えばいいでしょう?
a) myArrayA += myArrayB
b) myArrayA.concat(myArrayB)
c) myArrayA = new Array(myArrayA + myArrayB)
d) 2つのアレーを結合させることはできない。
これは(a)ですね。

4. 空のアレーにArray.RemoveLast()を実行するとエラーがかえる。
a) 正しい
b) 間違い
これは(a)で正しい。空のアレーからリムーブできない。

今日はここまで。  


2014年10月18日
Posted by 屋台ブルー at ◆ 2014年10月18日00:00 Comment(0)

Swiftで遊ぼう! - 99 - Swift Fundamentals本 アレー型の関数

swift_logoSwift Fundamentals: The Language of iOS Development - スイフト:基本」はまだまだ続く。


アレー型にある関数はおさえていないといけない。どれも基本的なことで既に知っていることばかりなので章末の問題を解こう。

Questions for Review - 復習のための質問

1. Array.Count()を使ってアレー型のサイズを求めることがどうして重要なのでしょうか?
a) アレー型の要素の数を数えて手動で数字を入力しなければならないのは煩わしいから
b) 作業をしているアレー型のサイズをいつも正確に知っている訳じゃ内から
c) for-in-loopで必要になる繰り返す数を知る必要があるから
d) アレー型が大きくなりすぎないようにするため
これは答えが(b)でしょう。(c)のfor-in-loopを使用すればアレー型の総数を知る必要はない。

2. アレー型の 「myArray」でArray.Count()を使う適切なシンタックスは?
a) myArray.Count()
b) count.myArray
c) count.myArray()
d) myArray.count
これも基本です。答えは(d)です。

3. Array.Slice()で何ができますか?
a) アレー型のサブセットを戻します
b) 特定のインデックス値において2つの切り取られた新しいアレーを返します
c) 2つのアレーを結合させて大きなアレーをつくります
d) アレーの最後のメンバーを霧出します
答えは(a)のサブセットを返すです。

4. アレー型の「myArray」と2つのInt型の「a」と「b」を使ってArray.Slice()を適切つかうシンタックスは次のどれ?
a) myArray.slice[a...b]
b) myArray.slice(a...b)
c) myArray[a...b]
d) Array.Slice(myArray[a...b])
Slice()関数を使うのに「slice」というキーワードはいらない。答えは(c)である。

今日はここまで。  


2014年10月17日
Posted by 屋台ブルー at ◆ 2014年10月17日00:00 Comment(0)

Swiftで遊ぼう! - 98 - Swift Fundamentals本 アレー型

swift_logoSwift Fundamentals: The Language of iOS Development - スイフト:基本」はまだまだ続く。

アレー型は基本的なデータコレクションなので色々と宣言法や関数を復習しておこう。

var animalArray:[String] = ["Dog","Cat","Mouse"]
var animalArray2 = [String]()
var animalArray3:[String] = []
animalArray2.append("Pig")
animalArray2
animalArray2 += animalArray
animalArray3 += animalArray2
println(animalArray3)
//[Pig, Dog, Cat, Mouse]

ということで章末の問題を解く

Questions for Review - 復習のための質問

1.ミュータブル・アレーとイミュータブル・アレーの違いは?
a) ミュータブル・アレーはインデックス値を使ってメンバーにアクセスできないが、イミュータブル・アレーはできる。
b) ミュータブル・アレーは0インデックス値で始まるが、イミュータブル・アレーは1インデクス値から始まる。
c) イミュータブル・アレーは変更できないが、ミュータブル・アレーは変更できる
d) イミュータブル・アレーはDouble型とFloat型を保持できるが、ミュータブル・アレーはString型、Int型、そしてBoolean型を保持できる。
この答えは(c)ですね。

2. アレー型宣言で正しくないのは次のどれ?
a) var myArray = [1, 2, 3]
b) var myArray:[Int] = [1, 2, 3]
c) let myArray = ["1", "2", "3"]
d) var myArray = (1.0, 2.0, 3.0)
これは(d)が間違いですね。

3. アレー型は異なるタイプの変数を保持できる。
a) 正しい
b) 間違い
これは(b)の間違いですね。同じタイプしか保持できません。

4. アレー型のメンバーにアクセスするために必要なのはなに?
a) index
b) key
c) value
d) type
これは(a)のインデックスですね。

ここまで。  


2014年09月21日
Posted by 屋台ブルー at ◆ 2014年09月21日00:00 Comment(0)

Swiftで遊ぼう! - 72 プログラマの考え方 12 アレーでつまずく(T_T)

swift_logo参考文献:プログラマの考え方がおもしろいほど身につく本 問題解決能力を鍛えよう!←勉強になるよ初めての人にいいかも。
この本のことをこのブログでは「プロおも本(ぷろおもぼん)」とします(^^)/

さて、「プロおも本」を読み進めながら、自分で問題を考えていましたが、C++の問題をSwiftで取り組めない状況にぶち当たりました。

演習問題:学生の構造体の配列をソートするコードを書いてみよう。最初は成績でソートして、次は学生IDでソートしてみよう。
学生の構造体の配列は以下の通り

strict student {
int grade;
int studentID;
string name;
};

const int ARRAY_SIZE = 10;
student studentArray[ARRAY_SIZE] = {
{73, 10001, "Fred"},
{13, 10002, "Tom"},
{100, 10003, "Alistair"},
{67, 10004, "Susan"},
{78, 10005, "Tom"},
{53, 10006, "Bard"},
{92, 10007, "Candy"},
{85, 10008, "Veronica"},
{27, 10009, "Crista"},
{38, 10010, "Alice"}
};

C++の構造体がSwiftの構造体と何か違う! ここで示されているC++の構造体をSwiftで再現できないんですよね。どうしたらいいのか分からなくなって、あれこれ考えて以下のようになりました。

struct Student {
var index = 0
var grade = [Int]()
var studentId = [Int]()
var name = [String]()
init(grade: [Int], studentId: [Int], name: [String]) {
self.grade = grade
self.studentId = studentId
self.name = name
}
subscript(index: Int) -> (Int, Int, String){
get {
return (self.grade[index], self.studentId[index], self.name[index])
}
}
}

var myGrade = [73, 13, 100, 67, 78, 53, 92, 85, 27, 38]
var myStudentId = [10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010]
var myName = ["Fred", "Tom", "Alistair", "Susan", "Tim", "Bard", "Candy", "Veronica", "Crista", "Alice"]

var myStudent = Student(grade: myGrade, studentId: myStudentId, name: myName)

myStudent[4].0
myStudent[4].1

項目を1つしか入力してないけど、それぞれの項目にアクセスはできるようにしました。
myStudent[4].0 // 78
myStudent[4].2 // "Tim"

本当は「myStudent[0].grade」でアクセスできると問題に似ているんですけどね。

ここまで考えて、やっている事は間違っている気がしてきた。「プロおも本」の第3章までの知識は、プログラミングを書くための技法ではなく、基本的な考え方であり、プログラムを組み立てる技術ではない。プログラミング技法は、第4章以降が重要で、特に第5章の「クラスによる問題解決」を読まないといけないでしょう。しかし、第4章は「ポインタと動的メモリによる問題解決」になっていて、Swiftでは説明されていない内容なんで読んでも全くわからない。じゃあ、もっと基本に戻らないといけないでしょう。実は、The Swift Programming Language本の「Protocol」を何度読んでもその使い方が分からない。「オブジェクト指向プログラミン」に関してもっと実践的な知識をつける必要があるなと感じて、ちょっと他の本(既に紹介してて明日紹介する)に手を出した... そして、それを読んでいたら、上で書いていたコードは全くちんぷんかんぷんなやり方だということに気がついた。

問題文の解答に近い書き方は次の通りだろう。クラスのインスタンスを配列に入れるが正解ですね。やっぱり素人が考えると無茶苦茶なアプローチをしませすね(^^;)

struct StudentModify {
var grade: Int
var studentId: Int
var name: String
init(grade: Int, studentId: Int, name: String) {
self.grade = grade
self.studentId = studentId
self.name = name
}
}

var student1 = StudentModify(grade: 73, studentId: 10001, name: "Fred")
var student2 = StudentModify(grade: 13, studentId: 10002, name: "Tom")
var student3 = StudentModify(grade: 100, studentId: 10003, name: "Alistair")
var student4 = StudentModify(grade: 67, studentId: 10004, name: "Susan")
var student5 = StudentModify(grade: 78, studentId: 10005, name: "Tim")
var student6 = StudentModify(grade: 53, studentId: 10006, name: "Bard")
var student7 = StudentModify(grade: 92, studentId: 10007, name: "Candy")
var student8 = StudentModify(grade: 85, studentId: 10008, name: "Veronica")
var student9 = StudentModify(grade: 27, studentId: 10009, name: "Crista")
var student10 = StudentModify(grade: 38, studentId: 10010, name: "Alice")

var myStudentArray = [StudentModify]()

myStudentArray.append(student1)
myStudentArray.append(student2)
myStudentArray.append(student3)
myStudentArray.append(student4)
myStudentArray.append(student5)
myStudentArray.append(student6)
myStudentArray.append(student7)
myStudentArray.append(student8)
myStudentArray.append(student9)
myStudentArray.append(student10)

myStudentArray[4].grade // 78
myStudentArray[4].name // "Tim"
  


2014年09月20日
Posted by 屋台ブルー at ◆ 2014年09月20日00:00 Comment(0)

Swiftで遊ぼう! - 71 プログラマの考え方 11 アレーでモード

swift_logo参考文献:プログラマの考え方がおもしろいほど身につく本 問題解決能力を鍛えよう!←勉強になるよ初めての人にいいかも。
この本のことをこのブログでは「プロおも本(ぷろおもぼん)」とします(^^)/

アレー型を使った課題が今日の問題だ。「プロおも本」の問題を少しアレンジしている。

問題:モードの検索、色々な値の集合の中で、頻度が最も多い値のことを統計で言えば、「モード」と呼ぶが、アレー型の調査データを調べてモード値を求めるコードを書いてみよう。調査対象の質問に1から10の数値で答えていて、アレー型データは[4, 7, 3, 8, 9, 7, 3, 9, 9, 3, 3, 10]とする。モードが複数存在する場合は、いずれかの値を選択する。
-----

さて、解答を見る前に自分で考えてみよう。最も頻度の多い値がいくつあるか数えて比較しなkればならない。ということは値を操作する方法では意味がないだろう。要素を見ながら要素の個数を保持する必要がある。どうやて保持させるか? 質問の答えは1から10個までなんで、10個の変数を用意して要素が出てくる度にその変数をカウントしてやればいいだろう。しかし、答える数値の制限が適当だったら? n個の変数を用意する必要があるだろう。じゃあどうすべきか?

そうだ、Swiftのアレー型の変数は可変長なんで、これで対応できる! ということで少し先が見えてきた。i

自分で書いたコードがこれ

let survey = [4, 7, 3, 8, 9, 7, 3, 9, 9, 3, 3, 10]
let maxValue = maxElement(survey)
var resultMode = [Int](count: maxValue, repeatedValue: 0)

let start = 0
let end = maxValue - 1

for item in survey {
resultMode[item - 1] += 1
}

// 次はモード値を導き出すループ

var modeValue = 0
for index in start...end {
if modeValue < resultMode[index] {
modeValue = index + 1
}
}

modeValueは3という答えで、1番頻度が多い数だけど、こういうやり方でどうなんでしょう。答えを見ていこう。

-----

やっぱりというか、全く異なったアプローチによるコーディングがされていた。もとの配列(survey)を並び替えて同じ数字のグループをまとめてから、同じ数のカウントを数えてからモード値を求める手法だ。実はその後に私の考えた方法(ヒストグラムと呼ぶようだ)も載せてあった。色々な解法が思い浮かばないと駄目ですね。もう少し自分で色々と考えてみよう。  


2014年09月19日
Posted by 屋台ブルー at ◆ 2014年09月19日00:00 Comment(0)

Swiftで遊ぼう! - 70 プログラマの考え方 10 アレーの所でソート

swift_logo参考文献:プログラマの考え方がおもしろいほど身につく本 問題解決能力を鍛えよう!←勉強になるよ初めての人にいいかも。
この本のことをこのブログでは「プロおも本(ぷろおもぼん)」とします(^^)/

「プロおも本」で配列の基礎知識の説明を読んでいると、配列の要素を特定の順番に並べ替えることをソートと呼んでいる。ソートのアルゴリズムの話をしていると一冊まるごと本がかけてしまうため、この本では実践的な2種類のソートしか取りあげていない。高速で使いやすいソートと美しくて理解しやすいソートで、前者は標準ライブラリ関数の「qsort」で、後者が「挿入ソート」である。

しかし、この「qsort」は、「C++」の標準ライブラリなんでSwiftでは必要ない。じゃあSwiftの標準ライブラリを確認してみると、The Swift Programming Languageブックのクロージャ(Closures)のセクション *このブログにもクロージャの説明があるよにSwiftの標準ライブラリ「sorted」という関数があった。この関数は、与えたアレー型の値と同じ型とサイズで新しいアレー型の値を返す。以前読んだところなのにすっかり忘れている(^^;)

sorted関数は2つの引数が必要で、それは以下の2つだ:
1) 特定の型で構成されたアレー型値
2) 2つの同じ型を引数として受け取り、Bool値を返す関数

2) のところをみると、「プロおも本」で書かれている「qsort」と似ていますね。このソートは比較関数を引数として渡しているからだ。

var numbers:[Int] = [9, 4, 3, 1, 6, 7]
func forwads(s1: Int, s2: Int) -> Bool {
return s1 < s2
}
var numbersA = sorted(numbers, forwads)

for item in numbers {
print("\(item)")
}
for item in numbersA {
print("\(item)")
}

// 943167
// 134679

ここまではSwiftの標準ライブラリsorted関数の使い方だったので頭は使わなくてもできる。次の「挿入ソート」ですが、プログラマさんには常識らしいのですが、私には新鮮でした。なるほど、ソートのアルゴリズムってこうするんですね。知らなかったです。

var numbers:[Int] = [9, 4, 3, 1, 6, 7]

let start = 0
let end = numbers.count - 1
for index in (start+1)...end {
var j:Int
for j = index ; j > start && numbers[j-1] > numbers[j] ; --j {
var temp = numbers[j-1]
numbers[j-1] = numbers[j]
numbers[j] = temp
}
}

ここで、もう一つプログラマの専門用語を覚えた。「ハードコーティング」という単語だ。上に書いたコードの中でvar start = 0をすることで、start変数を使えば、コードが読みやすくなるし汎用化しやすいが、あえて「0」を使ってコードすることを「ハードコーディング」と呼ぶようです。ちょっとプログラマ的になってきたよ。

さて、2つのforループを絡めて、アレー型の要素を交換している。ます、アレー型の最初の要素から順番にindexを増やしていって、内側のforループで進んだindexから前に向かって進んで( start && numbers[j-1] > numbers[j] )がtrueであるかぎり要素を交換し続ける。という時間はかかるけど分かり易いコーディングになっている。

しかし、問題は、内側のforの使い方が、旧C++的で、Swift的じゃないですよね。どなたか教えてください。  


2014年09月18日
Posted by 屋台ブルー at ◆ 2014年09月18日00:00 Comment(0)

Swiftで遊ぼう! - 69 プログラマの考え方 9 アレー型

swift_logo参考文献:プログラマの考え方がおもしろいほど身につく本 問題解決能力を鍛えよう!←勉強になるよ初めての人にいいかも。
この本のことをこのブログでは「プロおも本(ぷろおもぼん)」とします(^^)/

「プロおも本」では、「C++」を使った説明が中心なんで、Swiftしか知らない私には戸惑うところが多い。配列の説明に入ったところで相違点に悩まされている。

まず、「配列」と「列挙」という表記ですが、混同してしまうという個人的な理由から、このブログでは配列を「アレー型」そして列挙を「イーナム型」としている。とは言うものの、既にこのブログで表記の統一性は崩れている(あまりツッコまないでね)。しかし、Swiftではアレー型を使っていく。「配列」という表記が出たら「プロおも本」のC++の話だと思ってください。

配列の中身を「要素」と言っているが、これもSwiftでどう表記するのが的確か分からない。原本では「value」と「item」という単語で説明している。しかし、valueの訳は「値」になりシックリこない。やっぱり「アイテム」という言葉を使っていたけど、「要素」にするべきかな。

また、 「プロおも本」では、「要素」についてくるナンバリングされたラベルのような数字のことを「添字(そえじ)」って訳してました。なんじゃそりゃ! プログラミング初心者には滅茶違和感のある言葉だった。プログラマの皆さんは本当に「添字(そえじ)」なんて言って使ってるんですか? 英語では「index」ですよ。素人の私の感覚では、あまりにも数学的じゃない表現に聞こえます。英語のまま「インデックス」でいいんじゃないでしょうか? 私は「添字」なんて言葉は使いたくないんですけど。

まあ、ネーミングなんて何でもいいのですが、アレー型変数に関して言えば、アイテムとインデックスでいいと思います。ちょっとビックリしたのは、この本で「配列をイテレートする回数の上限を~」なんて表現をしてます。「おいおい、イテレートする回数?、勘弁してよ」が、私の意見です。「イテレート」をそのままカタカナ語にして、インデックスを『添字』に訳するのですか?

ごめんなさい、私の英語力なんてたかがしれている(英語を翻訳することでお金をもらっていません)ので、偉そうなこと言えませんが、英語の翻訳には言いたいことを色々持っています。こんな事を言うのは、以前、私はItmedia(旧MacWeekに記事書いてました)に「Tokyo Time」というMacの情報をお伝えする英語コラムの連載をしていたからです。私の記事をItmediaの日本語チームが翻訳をしていたんですが、その翻訳記事に対してアップルジャパンから直接クレームを受けたことがあるんです。「勘弁してください。私の英文はそんな意味じゃ無いですよ、それは勝手に訳した翻訳家の訳がおかしいんです」と広報担当の人に説明した記憶が蘇りました。

まあ、私のこの記事でこのブログが炎上することはないと思いますが、翻訳って大変なことだと思いますよ。その領域の専門的知識と優れた英語力の両方を必要とするんですから。

ありゃりゃ、今日は全然プログラミング話ができなかったですね。明日から頑張ります。