B11 [宿題]

B11_1 (スクリプト)

ねらい: リストに要素番号を添付する enumerate() の使用方法を習得する.

※本課題ではファイルの読み書きは行いません.

以下のプログラムは,リスト list_tohoku の要素を,大きい順に,順位とともに画面に表示するプログラムである. このプログラムを,range() を使わず,enumerate() を用いるように書き直せ.

list_tohoku = [5349, 5478, 5344, 4644, 4968, 6259]
list_tohoku.sort(reverse=True)

for i in range(len(list_tohoku)):
    print(f'{i + 1}位: {list_tohoku[i]}円')

enumerate()

enumerate() は,引数としてリストを与えると,(インデックス番号, 値) のタプルを順に返す.

enumerate() の使用例:

>>> seasons = ['春', '夏', '秋', '冬']
>>> for i, season in enumerate(seasons):
...     print(f'{i}: {season}')
... 
0: 
1: 
2: 
3: 

※enumerate() は関数と考えて使用して差し支えないが,厳密には enumerate 型のクラスである.


B11_2 (スクリプト)

ねらい: 複数のリストを組み合わせて活用する zip() の使用方法を習得する.

※本課題ではファイルの読み書きは行いません.

以下のプログラムは,物品の単価のリスト unit_prices と購入個数 quantities が与えられると,物品ごとの小計と合計金額を計算し,画面に表示するプログラムである. このプログラムを,range() を使わず,zip() を用いるように書き直せ.

unit_prices = [108, 88, 1280]
quantities = [40, 50, 2]

amounts = []
for i in range(len(unit_prices)):
    u = unit_prices[i]
    q = quantities[i]
    a = u * q
    print(f'{u} 円 × {q} 個 = {a} 円')
    amounts.append(a)
print(f'合計 {sum(amounts)} 円')

zip()

zip() は,引数として複数のリストを与えると,各リストから1要素ずつ取り出したタプルを順に返す.

zip() の使用例:

>>> seasons_en = ['spring', 'summer', 'autumn', 'winter']
>>> seasons_jp = ['春', '夏', '秋', '冬'] 
>>> for e, j in zip(seasons_en, seasons_jp):
...     print(f'{e}: {j}')
... 
spring: 
summer: 
autumn: 
winter: 

※ zip() も enumerate() 同様に関数と考えて使用して差し支えないが,厳密には zip 型のクラスである.


B11_3 (スクリプト)

ねらい: ファイルの読み書きを行う.関数と組み合わせて使う.

テキストファイル time.txt (右クリック→名前を付けてリンク先を保存) に,マラソン選手の5キロごとの通過時間が, 時(1桁):分(2ケタ):秒(2桁) の形式で記録されている.

5キロ(ただし最後のみ2.195キロ)の区間ごとに要した時間を計算し,分,秒 の形式でテキストファイル split.txt に出力するプログラムを作成せよ. プログラムの作成にあたっては,時(1桁):分(2ケタ):秒(2桁) の形式の文字列を引数にとり,その秒数を整数で返す関数 time_str_to_sec() を作成し,適切に活用するようにせよ.

本課題では,実行結果として,スクリーンショットではなく,作成されたテキストファイル split.txt を提出せよ.

time.txt の抜粋

0:14:26
0:28:42
:
2:00:35

split.txt として期待される出力内容

14,26
14,16
:
6,12

関数 time_str_to_sec() の期待される動作例

>>> time_str_to_sec('0:01:02') 
62
>>> time_str_to_sec('1:02:03') 
3723


B11_4 (スクリプト)

ねらい: テキストファイルに記述された数値データに基づいた計算を行う.

ある日に円でドルを買い,後日,より円安になったときに買ったドルを売ると,差額分の利益を得ることができる. 例えば円相場が1ドル100円のときに1ドルを買い,後日円相場が1ドル110円のときに手元の1ドルを売ると,10円の利益が出る.

2014年から2020年までの為替レート(ドル円相場,1ドルが何円か)が yen_usd.csv (右クリック→名前を付けてリンク先を保存) で与えられている.この期間内に,1ドルを購入→売却したとする.最大の利益は何円になるかを求めて画面に表示するプログラムを作成せよ.

例による説明:

入力

2021/1/1,106
2021/1/2,105
2021/1/3,103
2021/1/4,101
2021/1/5,103
2021/1/6,104

出力

3円

2021/1/4に購入し,2021/1/6に売却すると,利益が最大の3円になる. この例の期間内だと2021/1/1が最も円安だが,2021/1/4に購入したものを売ることはできない.


B11_5 (スクリプト)

ねらい: 日本語を含むテキストファイルを正しく扱う.

テキストファイル 6th.txt (右クリック→名前を付けてリンク先を保存) を読み込み,1行に1文ずつ画面に出力するプログラムを作成せよ. 出力の際には1から始まる行番号を付与せよ.また空行はスキップするようにし,出力されないようにせよ. テキストファイルの内容は日本語で書かれており,文は必ず句点「。」で終わるものとする.文の途中で改行されている場合は,適切に接続して1行で表示されるようにせよ.

入力と出力の例を以下に示す.なお与えられているテキストファイルの内容は以下とは異なる.

入力

吾輩は猫である。名前はまだ無い。

どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所で
ニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて
人間というものを見た。しかもあとで聞くとそれは書生という人間中
で一番獰悪な種族であったそうだ。

出力

1: 吾輩は猫である。
2: 名前はまだ無い。
3: どこで生れたかとんと見当がつかぬ。
4: 何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
5: 吾輩はここで始めて人間というものを見た。
6: しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。


B11_6 (スクリプト,オプション)

ねらい: 日本語を含むテキストファイルを正しく扱う.

テキストファイル issa.txt (右クリック→名前を付けてリンク先を保存) には,俳人小林一茶の詠んだ俳句が100句記載されている. 上五・中七・下五の間には半角空白が入っている.

issa.txt を読み込み,上五・中七・下五をランダムに組み合わせて,新しい俳句(※)を10句生成し,画面に表示するプログラムを作成せよ.

※厳密には,季語がめちゃくちゃになるので,俳句の定義から外れるものも生成される.

出力例

凩や 唐紅の 子があらば 
七夕や 蝿が手をすり 湯につかる
さはつたら 手をかけて寝る 蛙かな
夏の夜に 子のせんたくや 溜り水
夕日影 正月を待つ 年の暮
うまそうな 秋風吹や ない雀
けろけろと 負けるな一茶 なく蛙
陽炎に 隣を始 しらぬ人
水風呂へ 涼がてらの 口をあく
陽炎に 泊るや恋の 笑ふ子よ