第115回【Python】構造体の作成、構造体の検索
現在取り組んでいるのは、paiza ラーニング問題集「クラス・構造体メニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 115 回目です。
今回からは「クラス・構造体メニュー」の挑戦します。クラスや構造体を上手く使いこなすことが出来ればコードの実行速度が上がります。いきなりクラスを書き始める人は尊敬です。LeoSaki(旦那)はコードを書きながらクラス化するにはどうすればいいか、と考えながらでないと書けません。まだまだ未熟者です。
それでは、今日も頑張ってみようと思います。
構造体の作成
クラスの学級委員である paiza 君は、クラスのみんなに次のような形式でアカウントの情報を送ってもらうよう依頼しました。
名前 年齢 誕生日 出身地
送ってもらったデータを使いやすいように整理したいと思った paiza 君はクラス全員分のデータを次の形式でまとめることにしました。
User{
nickname : 名前
old : 年齢
birth : 誕生日
state : 出身地
}
クラスメートの情報が与えられるので、それらを以上の形式でまとめたものを出力してください。
N
n_1 o_1 b_1 s_1
...
n_N o_N b_N s_N
・ 1 行目では、paiza君のクラスの人数 N が与えられます。
・ 続く N 行のうち i 行目 (1 ≦ i ≦ N) では、 i 番の生徒の名前・年齢・誕生日・出身地を表す整数・文字列 n_i ,o_i ,b_i , s_i が順に半角スペース区切りで与えられます。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 10
・ n_i , s_i (1 ≦ i ≦ N) は 1 文字以上 20 文字以下の文字列
・ b_i (1 ≦ i ≦ N) はMM/DD 形式の文字列(例 1月2日 → 01/02 12月31日 → 12/31)
・ 1 ≦ o_i ≦ 100
入力例
3
mako 13 08/08 nara
megumi 14 11/02 saitama
taisei 16 12/04 nagano
出力例
User{
nickname : mako
old : 13
birth : 08/08
state : nara
}
User{
nickname : megumi
old : 14
birth : 11/02
state : saitama
}
User{
nickname : taisei
old : 16
birth : 12/04
state : nagano
}
うーん。この出力だけならば、構造体なんだろうか・・・。
Python
N = int(input())
for _ in range(N):
n,o,b,s = map(str,input().split())
print('User{')
print(f'nickname : {n}')
print(f'old : {o}')
print(f'birth : {b}')
print(f'state : {s}')
print('}')
VBA
N = Cells(1, 1)
For i = 1 To N
S = Split(Cells(i + 1, 1), " ")
Debug.Print "User{"
Debug.Print "nickname : " & S(0)
Debug.Print "old : " & S(1)
Debug.Print "birth : " & S(2)
Debug.Print "state : " & S(3)
Debug.Print "}"
Next
構造体の検索
クラスの学級委員である paiza 君は、クラスのみんなに次のような形式でアカウントの情報を送ってもらうよう依頼しました。
名前 年齢 誕生日 出身地
送ってもらったデータを使いやすいように整理したいと思った paiza 君はクラス全員分のデータを次の形式でまとめることにしました。
User{
nickname : 名前
old : 年齢
birth : 誕生日
state : 出身地
}
年齢ごとの生徒の名簿を作る仕事を任された paiza 君はクラスメイトのうち、決まった年齢の生徒を取り出したいと考えました。
取り出したい生徒の年齢が与えられるので、その年齢の生徒の名前を出力してください。
N
n_1 o_1 b_1 s_1
...
n_N o_N b_N s_N
K
・ 1 行目では、paiza君のクラスの人数 N が与えられます。
・ 続く N 行のうち i 行目 (1 ≦ i ≦ N) では、 i 番の生徒の名前・年齢・誕生日・出身地を表す整数・文字列 n_i ,o_i ,b_i , s_i が順に半角スペース区切りで与えられます。
・ N + 2 行目では、検索したい生徒の年齢 K が与えられます。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 10
・ n_i , s_i (1 ≦ i ≦ N) は 1 文字以上 20 文字以下の文字列
・ b_i (1 ≦ i ≦ N) はMM/DD 形式の文字列(例 1月2日 → 01/02 12月31日 → 12/31)
・ 1 ≦ o_i , K ≦ 100
・ 年齢が K であるような生徒はクラスに 1 人
入力例
3
mako 13 08/08 nara
megumi 14 11/02 saitama
taisei 16 12/04 nagano
14
出力例
megumi
急にコードを書いている感の強い問題が出題された。
Python
class Student:
def __init__(self,nickname,old,birth,state):
self.nickname = nickname
self.old = old
self.birth = birth
self.state = state
N = int(input())
students = [None] * N
for i in range(N):
n,o,b,s = map(str,input().split())
students[i] = Student(n,o,b,s)
K = input()
for student in students:
if student.old == K:
print(student.nickname)
break
VBA
Type Students
name As String
old As Integer
birth As String
state As String
End Type
Sub class_primer__find()
N = Cells(1, 1)
Dim mem() As Students
ReDim mem(N - 1)
For i = 0 To N - 1
S = Split(Cells(i + 2, 1), " ")
mem(i).name = S(0)
mem(i).old = Val(S(1))
mem(i).birth = S(2)
mem(i).state = S(3)
Next
K = Cells(N + 2, 1)
For i = LBound(mem) To UBound(mem)
If mem(i).old = K Then
Debug.Print mem(i).name
Exit For
End If
Next
End Sub
最後に
なんかこう、修正が発生した際にも、クラスや構造体をちょっと修正すればいい感じになって、可読性も保守性も上がる気がする。VBA ではあまり使った記憶がなかったのだが、過去のコードを見ていたら、それなりに使っていたらしい。
その割には、今回問題に取り組むにあたって、いろいろ調べ直して、使い方に間違いがないか確認した。全然身についてないじゃん・・・。反省。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません