2014年09月28日
Posted by 屋台ブルー at
◆ 2014年09月28日00:00 Comment(0)
Swiftで遊ぼう! - 79 プロおも本、クラスの問題4

この本のことをこのブログでは「プロおも本(ぷろおもぼん)」とします(^^)/
問題:学生名簿を管理するクラスを設計してみよう。学生レコードには、名前・番号・成績(0〜100)があり、このプログラムは、学生レコードの追加と削除・番号で指定した学生の成績(数値と文字)の表示と全体の平均点の表示を可能にする。成績の表す表は以下の通り。
93-100 :"A"
90-92 :"A-"
87-89 :"B+"
83-86 :"B"
80-82 :"B-"
77-79 :"C+"
73-76 :"C"
70-72 :"C-"
67-69 :"D+"
60-66 :"D"
0-59 :"F"
ここ数日間、本にある解答を見ないで、上記の問題に取り組んだ結果作り挙げたコードを前日に示した。しかし、課題にある学生レコードの追加と削除の「削除」の機能が抜けていたので、色々考えて関数を組み込んだがうまく動かない(T_T) 色々試行錯誤しても分からないので、今日は分からないまま以下に記述
class Student {
var name: String
var iD: Int
init(name: String, iD: Int) {
self.name = name
self.iD = iD
}
}
class StudentMark: Student {
var score: Int
var mark: String
init(name: String, iD: Int, score: Int) {
self.score = score
switch score {
case 93...100:
mark = "A"
case 90...92:
mark = "A-"
case 87...89:
mark = "B+"
case 83...86:
mark = "B"
case 80...82:
mark = "B-"
case 77...79:
mark = "C+"
case 73...76:
mark = "C"
case 70...72:
mark = "C-"
case 67...69:
mark = "D+"
case 60...66:
mark = "D"
default:
mark = "F"
}
super.init (name: name, iD: iD)
}
}
var student1 = StudentMark(name: "Yuji Tai", iD: 1, score: 87)
var student2 = StudentMark(name: "Miyuki Tai", iD: 2, score: 96)
var student3 = StudentMark(name: "Yuki Tai", iD: 3, score: 78)
var student4 = StudentMark(name: "Genki Tai", iD: 4, score: 67)
class SchoolClass {
var studentMember = [StudentMark]()
init(member: StudentMark){
studentMember.append(member)
}
func getMember( anotherMember: StudentMark) {
return studentMember.append(anotherMember)
}
func getMark(ID iD: Int) -> (score: Int, mark: String) {
var scoreSpecific = 0
var markSpecific = ""
for itme in studentMember {
if itme.iD == iD {
(scoreSpecific, markSpecific) = (itme.score, itme.mark)
} else {
println("no student is found")
}
}
return (scoreSpecific, markSpecific)
}
func getAverage() -> Double {
var average = 0.0
var totalScore = 0
for item in studentMember {
totalScore += item.score
}
average = Double(totalScore/studentMember.count)
return average
}
// 以下の関数を加えてみたが動かない(T_T)
func removeStudent(ID iD: Int) -> StudentMark {
var studentMemberChange:StudentMark
for (index, item) in enumerate(studentMember) {
if item.iD == iD {
studentMemberChange = studentMember.removjeAtIndex(index)
} else {
println("no entry!")
}
}
return studentMemberChange
}
}
var classA = SchoolClass(member: student1)
classA.getMember(student2)
classA.getMember(student3)
classA.getMember(student4)
classA.getMark(ID: 4).score
classA.getAverage()
for i in 1...4 {
println("\(classA.getMark(ID: i))")
}
classA.removeStudent(ID: 2)
どうやったらいいのか分からないので、このままおいておく。
本を読み進めていく...
2014年09月27日
Posted by 屋台ブルー at
◆ 2014年09月27日00:00 Comment(0)
Swiftで遊ぼう! - 78 プロおも本、クラスの問題3

この本のことをこのブログでは「プロおも本(ぷろおもぼん)」とします(^^)/
問題:学生名簿を管理するクラスを設計してみよう。学生レコードには、名前・番号・成績(0〜100)があり、このプログラムは、学生レコードの追加と削除・番号で指定した学生の成績(数値と文字)の表示と全体の平均点の表示を可能にする。成績の表す表は以下の通り。
93-100 :"A"
90-92 :"A-"
87-89 :"B+"
83-86 :"B"
80-82 :"B-"
77-79 :"C+"
73-76 :"C"
70-72 :"C-"
67-69 :"D+"
60-66 :"D"
0-59 :"F"
取りあえず、上記の問題をクラスを使って解いてみた。当然、私の解答は、「プロおも本」に書かれている答えじゃないよ。これから読み進めるのでどんな解答なのかちょっと楽しみである。
私の解答は、ツッコミどころ満載でしょう。というか本当は色々つっこんで欲しい。私のような50オヤジが真剣にプログラマーを目指して、この程度です。Swiftの構文も次から次へと忘れていきます。「あれ、なんとかすればできそうだけど、どうしたらいいんだろう?」ということばかりです。私の周りでプログラミングを教えてくれる人は誰もいません。問題にぶち当たれば自分で解決しないといけないので、理解するのにものすごく時間がかかります。周りにプロフェッショナルな人がいらっしゃる皆さん、幸せな環境ですよ。どんどん質問して勉強してください。
香川県高松市在住の奇特なプログラマーの皆さん、私にオブジェクト指向プログラミングを教えてもいいよっていう人、いらっしゃったら声かけてください。iPhoneアプリの作り方を御教授してください。まだまだアプリ制作に横たわるAPI、フレームワークの勉強に入る自信がありません(T_T)
まあ、次の私のコードをみてください(^^;)
class Student {
var name: String
var iD: Int
init(name: String, iD: Int) {
self.name = name
self.iD = iD
}
}
class StudentMark: Student {
var score: Int
var mark: String
init(name: String, iD: Int, score: Int) {
self.score = score
switch score {
case 93...100:
mark = "A"
case 90...92:
mark = "A-"
case 87...89:
mark = "B+"
case 83...86:
mark = "B"
case 80...82:
mark = "B-"
case 77...79:
mark = "C+"
case 73...76:
mark = "C"
case 70...72:
mark = "C-"
case 67...69:
mark = "D+"
case 60...66:
mark = "D"
default:
mark = "F"
}
super.init (name: name, iD: iD)
}
}
var student1 = StudentMark(name: "Yuji Tai", iD: 1, score: 87)
var student2 = StudentMark(name: "Miyuki Tai", iD: 2, score: 96)
var student3 = StudentMark(name: "Yuki Tai", iD: 3, score: 78)
var student4 = StudentMark(name: "Genki Tai", iD: 4, score: 67)
class SchoolClass {
var studentMember = [StudentMark]()
init(member: StudentMark){
studentMember.append(member)
}
func getMember( anotherMember: StudentMark) {
return studentMember.append(anotherMember)
}
func getMark(ID iD: Int) -> (score: Int, mark: String) {
var scoreSpecific = 0
var markSpecific = ""
for itme in studentMember {
if itme.iD == iD {
(scoreSpecific, markSpecific) = (itme.score, itme.mark)
} else {
println("no student is found")
}
}
return (scoreSpecific, markSpecific)
}
func getAverage() -> Double {
var average = 0.0
var totalScore = 0
for item in studentMember {
totalScore += item.score
}
average = Double(totalScore/studentMember.count)
return average
}
}
var classA = SchoolClass(member: student1)
classA.getMember(student2)
classA.getMember(student3)
classA.getMember(student4)
classA.getMark(ID: 4).score // 67
classA.getAverage() // 82.0
無理矢理クラスの継承を使ってSchoolClassで集計させてみたらこうなりました。ジャンジャン!ってな結果です(>_<)
クラスを使ったプログラミングをオブジェクト指向関係無しにした結果だと思います。やっぱりにオブジェクト指向的な考え方は無茶苦茶重要なんでしょう。デザインパターンの理解がやっぱり必要かなと思うしだいです。人のコーディンを見て勉強をする時期(まだSwiftを理解してないから早いかも)かもしれない。
プログラミング便虚運試行錯誤は続きます。
はっきり言い切るけど、50オヤジは1月や2月でiPhoneアプリを作れません。時間をかけてもコツコツと進めるしかないでしょう。Appleから提供された正本、THe Swift Programming Langege本を読めば、iPhoneアプリなんか簡単にできると思っていたけど、3ヶ月ほど勉強して理解できた事は、プログラミングの奥深さでした。生命科学の奥深さに匹敵することが分かりました。プログラミングで人の知能に近づけようとする行為は、生命科学では生命を作り出すそれと同じだと思えます。一度は生命科学に囚われた私がプログラミングの奥深さに囚われてしまうのも必然かもしれません。全く興味のなかったプログラミングが非常に面白く感じます。私は道を間違えていたのかもしれません。でも50オヤジの言う言葉じゃないですね(^_^;)
2014年09月25日
Posted by 屋台ブルー at
◆ 2014年09月25日00:00 Comment(4)
Swiftで遊ぼう! - 76 プロおも本、クラスの問題

この本のことをこのブログでは「プロおも本(ぷろおもぼん)」とします(^^)/
またまた戻ってきました。「プロおも本」。第4章の「ポインタと動的メモリによる問題解決」は読み飛ばした。ここの解説はパス。完全理解しているとは言えないけど、次の第5章「クラスによる問題解決」に進んでいる。
さっそくですが、問題:学生名簿に取りかかっているけど、まだまだ簡単に解けない! 本当に我ながら頭の悪さをひけらかすようで情けないが、どんどんツッコミを入れてください。あ、変なところを修正してください。プログラマの皆さん!
問題:学生名簿を管理するクラスを設計してみよう。学生レコードには、名前・番号・成績(0〜100)があり、このプログラムは、学生レコードの追加と削除・番号で指定した学生の成績(数値と文字)の表示と全体の平均点の表示を可能にする。成績の表す表は以下の通り。
93-100 :"A"
90-92 :"A-"
87-89 :"B+"
83-86 :"B"
80-82 :"B-"
77-79 :"C+"
73-76 :"C"
70-72 :"C-"
67-69 :"D+"
60-66 :"D"
0-59 :"F"
ここを見ている人はお気づきのように、昨日はこのテーブルをSwictch Case文を使ってコードに取り組むことを試していたがうまくいかない。Struct型に取り込もうしていもうまく動かない。Struct型にするのがいいか悪いかさておいて、どうして動かないのかさっぱり分からない。教えて...
struct Scoring {
var score = 0
var mark: String
switch score {
case 93...100:
mark = "A"
case 90...92:
mark = "A-"
case 87...89:
mark = "B+"
case 83...86:
mark = "B"
case 80...82:
mark = "B-"
case 77...79:
mark = "C+"
case 73...76:
mark = "C"
case 70...72:
mark = "C-"
case 67...69:
mark = "D+"
case 60...66:
mark = "D"
default:
mark = "F"
}
}
var scoreTable = Scoring() // まったく駄目です(T_T)
2014年09月24日
Posted by 屋台ブルー at
◆ 2014年09月24日00:00 Comment(0)
Swiftで遊ぼう! - 75 オブジェクト指向 プロおも本に戻る

さて、課題に取り組んではいるものの、Swiftの文法を忘れている。非常に基本的な事だが、Switch Case文の使い方が分からなくなった。
以下のようなコードをPlaygroundに書いた時、最初の「var mark = ""」を書かなかったら、println(mark)でエラーが出る。これを加えると、let Markに"C"が加えられて、「C」が表示される。でも、私は最初に変数(var)でmarkを宣言しているのに、let(定数)に変更さるのはどうしてでしょう? なぜ、「var mark = ""」を加えないとエラーになるんでしょう? 不思議だ...
var score = 76
var mark = ""
switch score {
case 93...100:
let mark = "A"
case 90...92:
let mark = "A-"
case 87...89:
let mark = "B+"
case 83...86:
let mark = "B"
case 80...82:
let mark = "B-"
case 77...79:
let mark = "C+"
case 73...76:
let mark = "C"
case 70...72:
let mark = "C-"
case 67...69:
let mark = "D+"
case 60...66:
let mark = "D"
default:
let mark = "F"
}
println(mark)