1. プログラミングの練習を始めよう

まずは、プログラミングの練習を進めるための準備を説明します。

本講義は、 Google Colabを使って、ハンズオン演習形式でプログラミングとアルゴリズムの基礎を学びます。 そのあと、オンラインジャッジ(AtCoder)を使って、練習を深めるようになっています。

プログラミングは、ある程度の練習量を積むことが重要になります。 個人差はありますが、オンラインジャッジで100題くらい解くと、 プログラミングしたいことが自由自在に書けるようになります。

ぜひ、章末に演習問題も積極的に取り組んでください。

1.1. Colabとプログラミング

本講義ノートは、Colabを使って、 ハンズオン演習形式でプログラミングを学ぶようになっています。 Colabの使い方は、講義のガイダンスで説明します。

1.1.1. Colabとは

Colabとは、Google 社が提供するクラウド版のJupyter Notebook です。 環境設定することなしに、Python と豊富なライブラリ、さらに高性能なGPUが利用可能です。 本講義で学ぶPythonプログラミングをさらに発展させて、 データサイエンスや機械学習の入門には大変によい環境になっています。

https://colab.research.google.com/

はじめて Colab を使うときは、 Google アカウント( Gmail アカウント ) が必要になります。 Googleアカウントは複数作成できるので、授業用のアカウントを作っておくと便利です。

1.1.2. 最初のプログラム: Hello world

Hello Worldは、 「プログラミング言語C」の教科書に登場して以来、 プログラミングを学ぶ人がみんな書いてきた伝統のプログラムです。 まず、通過儀礼として、Hello Worldを書いてみて、実行してみましょう。

プログラム(ソースコード)を入力して、実行ボタンを押すことで、実行結果を表示します。

300f1f1ac21a4918a77c59823a8fc28f

本資料では、実行セルに入力すべきコードと実行結果は、次のように記載します。

[1]:
print("Hello World")

Hello World

二十引用符 "Hello World"で囲まれたテキストは、 文字列と呼ばれるデータ値です。 このように、コードと区別してい、文字列を扱いときは、 "で囲みます。

ただ、実行ボタンを押すだけでは寂しいので、 表示する内容を変えて実行してみましょう。

Let’s try

Hello Worldの代わりに自分の名前を表示してみよう。

(注意)全角文字と半角文字

もし全角文字と半角文字の区別がつかないときは、Python ソースコード内での日本語入力は、招かざるエラーの原因になりますので、止めておきましょう。

1.2. プログラムの構造と入出力

プログラムは、データの入力(input)を受け、 データを処理してから、その結果を出力(output)します。

a9196693acda474abee828dade1e7638

(用語)標準入出力

入出力デバイスはキーボードやモニター、ファイルなどいろいろあります。それらをデバイスの種類ではなく、文字データの流れ(ストーム)として一般化したものが標準入出力です。一般化してあるので、プログラムを変更することなく、入出力先を切り替えることができます。

1.2.1. Python の入出力

Pythonの入出力の書き方をみておきましょう。

入力: 入力から読んだデータ(一行)を変数xとする

x = input()

出力: 変数xの値を出力する

print(x)

まずは、最も簡単な入出力プログラムを書いて、Colab上で実行してみましょう。

入力された値をそのまま出力

x = input()
print(x)

例題(入力されたxとyの和)

1行目にxの値、2行目にyの値が与えられる。 このとき、xyの和を出力せよ。

入力例:

1
2

出力例:

3

ヒント:2行に渡って入力されるので、2回input()します。

x = input()
y = input()

さて、正しく和が計算できるでしょうか?

(うまく計算できないときは、次の解説に進んでください。)

1.2.2. 入出力データ

入出力を正しく理解する鍵は、 そこで扱われるデータがどのように表現されているか理解することです。 先に結論から言えば、入出力は文字列でデータ表現されています。

入出力で扱われるデータ

文字列、つまり文字が並んだデータ になっている

文字は、Pythonに限らず、 全てのコンピュータや情報機器で利用可能な共通コードになっています。 だから、input()に対して、数字を1と入力しても、 それは数値ではありません。 数字の文字として入力されます。 このようになっていることで、 数字以外の文字も入出力データとして扱うことができます。

先ほどのx + yが変な結果になってしまったのも、 文字列の加算として、連結されてしまったからです。

文字列の加算は連結

[2]:
x = "1"
y = "2"
print(x + y)

12

文字列の加算

数字は、"1"のように" "で囲むと文字列になります。 そして、文字列の加算は、文字列の連結となります。

1.2.3. データ値の変換

入出力データを文字列ではなく、 整数値で処理するためには、 データ値の種類を変換する関数を用います。

23e8e6747a0c4da2ac0c6223803803eb

Python

説明

int(x)

xの値を整数値にする

float(x)

\(~~~~~\) xの値を浮動小数点値にする

str(x)

xの値を文字列にする

これらの変換関数を使うと、正しく整数値として計算できるように直せます。

x = int(input())
y = int(input())
print(str(x+y))

ちなみに、出力データも文字列です。 ただし、出力の場合は文字列と決まっているので、 print()関数は、数値を勝手に文字列に変換してくれます。 だから、str()は省略することができます。

x = int(input())
y = int(input())
print(x+y)

例題(BMI)

BMI(ボディマス指数)は、次の式で求められる肥満度を表す体格指数です。

bmi-fs8.png

体重と身長の入力から、BMI を計算して表示するプログラムを書いてみよう。

入力例:

1.75
68.5

出力例:

22.367346938775512

よくある間違い:

ほぼ正解ですが、演算子の優先度に気をつけてください。

[3]:
height = 1.75
weight = 68.5
BMI = weight / height * height
print(BMI)

68.5

変数名

プログラミングと数学の大きな違いは、変数名の命名法にあります。プログラミングの変数名は、値の名前なので変数の意味がわかりやすい名前を付けます。慣習的に、英単語に由来する名前か、その頭文字をつけましょう。

英単語

プログラミング用語は、ほとんど英語なのでちゃんと英単語を意味を調べよう。

1.3. オンラインジャッジに挑戦

いよいよオンラインジャッジシステム挑戦してみましょう。

(注意) AtCoderのユーザ登録を先に済ませて、サインインしておいてください。

1.3.1. 最初の一題

まずは簡単な問題を解いてみましょう。

問題:複数形

英小文字からなる文字列 W が入力されます。 W の末尾に英小文字の s を付け足したものを出力してください。

入力例:

dog

出力例:

dogs

手順

  1. (上記のリンクから)オンラインジャッジのページを開く

  2. 問題文をしっかり読んでみる

  3. Colab上で入出力プログラムを書いてみる

  4. サンプルの入力例と出力例で動作を試してみる

  5. オンラインジャッジに提出する

ae2b8010f8064af2b56bcb5372b249e8

まずオンラインジャッジに慣れよう

まずは、4まで自力で進めてみてください。 最後のオンラインジャッジへの提出は実演で示します。

1.3.2. AtCoder への提出

Colab上で動作確認したプログラムを提出フォームにコピペします。

atcoder1.png

提出ボタンを押します。 すると、次のとおり、オンラインジャッジの結果が表示されます。

atcoder2.png

AtCoder 側で入出力をテストし、正しければAC、正しくなければWAなどのエラーが表示されます。

ACにならないときは、プログラムのどこかが間違っています。 問題文をよく読んで修正して、再提出してください。

同じ問題で5回以上提出して、ACが取れない

  • 友達にどう解いたか聞いてみる

  • 教員やTAに質問してみる

  • 他のプログラマが作った模範解答をみてみる

プログラミングは、自力で考えて解くだけが、最善な解決策ではありません。 ちょっと友達や同僚に確認すると、あっという間に解決することがあります。

1.4. 入出力プログラム

オンラインジャッジでは、入出力を正しくプログラミングする必要があります。 しかし、入出力は、初学者にはかなり難しいパートといえます。

入出力のコツ

プログラミングは暗記ではないが、 パターンとして覚えてしまった方がよいでしょう。

1.4.1. 1行に整数値が1つある場合

入力例:

1

プログラム:

x = int(input())
print(x)

入力例:

1
2

プログラム:

x = int(input())
y = int(input())
print(x, y)

(重要)入力(input)は行単位

\(N\)行の入力データを読むには、\(N\)input()します

1.4.2. 1行に複数の整数値がある場合

1行に複数の整数値がある場合、 入力された文字列を字句解析して整数値に変換する必要があります。 この処理は、初心者には少々複雑なので、 ここは本当に決まり文句として覚えてましょう。

入力例:

1 2

変数x, yに読む

x, y = map(int, input().split())

入力例:

1 2 3

変数x, y, zに読む

x, y, z = map(int, input().split())

入力例:

1 2 3 4

変数x, y, z, wに読む

x, y, z, w = map(int, input().split())

** 1行にN個の数値がある場合(予習) **

今回は、1行のN個の数値がある場合は、次回で学ぶリストを用いて、 数列として読むこともできます。

入力例:

1 2 3 4 5

変数aリストとして読む

a = list(map(int, input().split()))

リストについては、リストを練習するところでもう少し詳しく説明します。

1.4.3. 文字列をそのまま1行に出力する

空白も含めて表示することができます。

[4]:
print("Hello World")

Hello World

1.4.4. 整数値を1行に出力する場合

[5]:
x = 1
y = 2
print(x)
print(y)

1
2

出力(print)も行単位

\(N\)行の出力をするときは、\(N\)print()します

1.4.5. 2つの整数値を1行に出力する場合

書式文字列f" ... "を用いて、書式文字列に変数の値を埋め込みます。

[6]:
x = 1
y = 2
print(f"{x} {y}") # 空白区切り

1 2
[7]:
x = 1
y = 2
print(f"{x}/{y}") # /区切り

1/2

書式文字列 f" { } "

書式文字列 f"   "は、文字列の中に{   }で囲んで式を埋め込みます。 すると、式が評価されて、その値(文字列表現)が埋め込まれた文字列になります。

f"x={x}, x+y={x+y}"

文字列を出力するときに便利なのでマスターしておきましょう。

1.5. 演習問題

1.5.1. 確認リスト

  1. input() において、文字列で入力される理由は何でしょう?

1.5.2. 課題リスト

プログラミングを上達するコツは、 頭で理解するだけでなく自分で書いてみることです。

1年生のPython入門をどの程度覚えているか、 まずは少し腕試ししてみましょう。

  • 複数形: 文字列の連結

  • 円/Circle: 入力を数値に変換する

  • 直方体: 頻出入出力例map(int, input().split())を参考に書いてください。

  • 3つのうち一つ: if文を覚えていますか?

  • 水の移動: 紙とえんぴつをもって、落ち着いて考えてみよう

  • 三桁の回文数: 文字列を覚えていますか?

  • ラッキー7: 文字列を覚えていますか

  • 星集め: シミュレーションでも解けます

  • 差分の和: TLEを解消する方法は、後半のアルゴリズムで習います。

  • かえる: この問題が解けたら、ICPCチームにスカウトに行きます。

なお、課題リストも参考にしてください。

次回からは、Python入門のおさらいをしながら、プログラミングとアルゴリズムの演習をしてゆきます。(もう、少し簡単になります。)