Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
プログラミング演習IExercise on Programming I
http://bit.ly/OITprog1
小林裕之
大阪工業大学ロボティクス&デザイン工学部システムデザイン工学科
1, 2 of 14
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 1 / 44
この授業でやること
プログラミングの基礎・基本的な概念を演習を通じて学ぶ。プログラミング言語として Rubyを使う(が、Rubyであることはあまり重要ではない)。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 2 / 44
『プログラミング的』思考
7 5 9
2 9 3
3 2 6 5
1 3 2
5 6
4 7 8
4 5 2 7
9 6 4
7 1 3
どうやれば確実に解ける?
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 3 / 44
『プログラミング的』思考で「アルゴリズム」を作る
たったの3ステップで:::::::::::::::::::::::::誰でも、確実に、
:解ける!
秘伝《数独 qの解》手順書
q =7 5 9
2 9 33 2 6 5
1 3 25 64 7 8
4 5 2 79 6 4
7 1 3
1, 2, · · · , 9
1 qが間違いだったら解なし。2 qが全マス埋まっていればqが解。3 qの最初の空きマスに1から9まで順に埋めた問題q1, q2, · · · , q9を作成し、それぞれについて《数独qiの解》を求める。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 4 / 44
『プログラミング的』思考から本当の『プログラム』へ
solveSdk q =
if chkSdk q == False then []
else if zp == 81 then q
else concat (map (\i -> let q' = (take zp q) ++ [i] ++ drop (zp + 1) q
in solveSdk q') [1..9])
where zp = index q 0
間違いだったら解なし
全 (81)マス埋まっていれば qが解
最初の空きマスに順に数字を入れてq’とし、q’の解を求める
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 5 / 44
その他少々加えて完成! (言語は Haskell)
q0 = [7, 0, 0, 0, 0, 5, 9, 0, 0,0, 2, 0, 0, 9, 0, 0, 3, 0,0, 0, 3, 2, 0, 6, 0, 0, 5,1, 3, 0, 0, 0, 0, 2, 0, 0,0, 0, 5, 0, 0, 0, 6, 0, 0,0, 0, 4, 0, 0, 0, 0, 7, 8,4, 0, 0, 5, 0, 2, 7, 0, 0,0, 9, 0, 0, 6, 0, 0, 4, 0,0, 0, 7, 1, 0, 0, 0, 0, 3]
main = mapM_ (\i -> print (take 9 (drop i ans))) [0,9..72] where ans = solveSdk q0chkDup a = foldl (&&) True (map (\i -> length (filter (== i) a) <= 1) [1..9])chkSdk x =
foldl (&&) True (map (\i -> chkDup (take 9 (drop i x))) [0,9..72]) &&foldl (&&) True (map (\i -> chkDup (map (\j -> x!!(i + j)) [0,9..72])) [0..8]) &&foldl (&&) True (map (\i -> chkDup (map (\j -> x!!(i + j)) box)) tl)wherebox = [0, 1, 2, 9, 10, 11, 18, 19, 20]tl = [0, 3, 6, 27, 30, 33, 54, 57, 60]
index [] _ = 0index (x:xs) tgt = if x == tgt then 0 else 1 + index xs tgt--solveSdk q = if chkSdk q == False then []
else if zp == 81 then qelse concat (map (\i -> let q' = (take zp q) ++ [i] ++ drop (zp + 1) q
in solveSdk q') [1..9])where zp = index q 0
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 6 / 44
同じものを別言語 (この授業でやるRuby)で14回の授業が終わった後でもう一度眺めてみると多少は理解できる…かも!?
q0 = [7, 0, 0, 0, 0, 5, 9, 0, 0,0, 2, 0, 0, 9, 0, 0, 3, 0,0, 0, 3, 2, 0, 6, 0, 0, 5,1, 3, 0, 0, 0, 0, 2, 0, 0,0, 0, 5, 0, 0, 0, 6, 0, 0,0, 0, 4, 0, 0, 0, 0, 7, 8,4, 0, 0, 5, 0, 2, 7, 0, 0,0, 9, 0, 0, 6, 0, 0, 4, 0,0, 0, 7, 1, 0, 0, 0, 0, 3,
]
def chk9(ary) # dup test (1 line)(1..9).inject(true) {|a, i| ary.count(i) > 1 ? false : a
}end
def chk_all(ary) # dup test (all)9.times {|i|return false unless chk9(ary[i*9,9])return false unless chk9((0..8).map{
|j| ary[i + j * 9]})
}
[0,3,6,27,30,33,54,57,60].each {|i|return false unless chk9(
ary[i,3] + ary[i+9,3] + ary[i+18,3])
}true
end
def solve_sdk(q)return nil unless chk_all(q)return q unless tgt = q.index(0)ans = nil(1..9).each {|i|q[tgt] = ireturn ans if ans = solve_sdk(q)
}q[tgt] = 0nil
endans = solve_sdk(q0)9.times {|i|p ans[i * 9, 9]
}
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 7 / 44
評価方法『◯◯演習』の授業は、出席して、授業に参加すること自体がとても重要です。
演習出席点=3点/回 (遅刻=2点,途中無断退出=0点)出席管理システムで採点するので必ずカードを通すこと。
レポート点=3点/回 (第 1回の分は出席者全員 3点)
期末演習点=16点
以下はその都度適宜減点:
動画・音楽の視聴,ヘッドフォンの使用 (聴覚の補助等を除く),私的なゲーム,指定席
以外への移動,飲食 (飲み物もダメ),睡眠,その他常識の範囲で明らかに演習の授業を
受けることに対して不適当な行為全般小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 8 / 44
今日の内容
学内Wi-Fiに接続sshクライアントの準備サーバにログイン最初のプログラムの作成と実行
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 9 / 44
この授業の開発環境クラウドぽい環境です。
梅田キャンパス
edu1edu2
edu3大宮キャンパス
自分の PCを端末にして、大宮のサーバにログインして作業小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 10 / 44
学内Wi-Fiに接続これは、もうやってますね。
Windowsの人は右下、macOSの人は右上のWi-FiあるいはネットワークのアイコンをクリックしてOIT-AirLAN.1xに接続。
▶ IDは学生番号の前にe1をつけたもの。全部小文字。(例:e1x19123)
▶ パスワードは情報センターが発行したもの。
▶ OIT-AirLAN.1xにどうしてもつながらなければOIT-AirLANを試す。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 11 / 44
sshクライアントWindowsの人のみ。mac, Linuxの人は不要です。
Windowsの人のみ追加でソフトをひとつインストール。https://gitforwindows.orgを開き [Download]。ダウンロードしたら『実行』でインストール。インストール中の質問にはすべてデフォルトで答える。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 12 / 44
プログラミング言語とは
プログラムを作成するために作られた形式言語。
用途や思想により様々なものがある。
最近ではビジュアルプログラミング言語も人気。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 13 / 44
0 + 1 + . . .+ 9 in C
#include <stdio.h>int main(){int sum;int i;for (i = 0, sum = 0; i < 10; i++) {
sum = sum + i;}printf("%d\n", sum);return 0;
}小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 14 / 44
0 + 1 + . . .+ 9 in Java
public class Sum {public static void main(String[] args) {int i;int sum;for (i = 0, sum = 0; i < 10; i++) {
sum = sum + i;}System.out.println(sum);
}}
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 15 / 44
0 + 1 + . . .+ 9 in JavaScript
let sum = 0for (let i = 0; i < 10; i++) {
sum = sum + i}console.log(sum)
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 16 / 44
0 + 1 + . . .+ 9 in Python
sum = 0for i in range(10):
sum = sum + iprint(sum)
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 17 / 44
0 + 1 + . . .+ 9 in Ruby
sum = 0(0..9).each {|i|
sum = sum + i}puts sum
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 18 / 44
0 + 1 + . . .+ 9 in Swift
var sum = 0(1...9).forEach{(i) in
sum = sum + i}print(sum)
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 19 / 44
0 + 1 + . . .+ 9 in Haskell
main = print $ mysum [0..9]
mysum [a] = amysum (car:cdr) = car + mysum cdr
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 20 / 44
0 + 1 + . . .+ 9 in (old) BASIC
10 S=020 FOR I=0 TO 930 S=S+I40 NEXT I50 PRINT S
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 21 / 44
0 + 1 + . . .+ 9 in Scratch
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 22 / 44
classroomに参加 (1 of 2)
1 ブラウザでhttps://classroom.google.comを開く。2 OIT組織アカウント以外でGoogleにログイン中の場合は組織アカウントでログインし直す。
ログイン中のアカウント。ここをクリックしてOIT組織アカウントかどうか確認。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 23 / 44
classroomに参加 (2 of 2)
3 アカウントアイコンの左側のプラス(+)をクリックして生徒としてクラスに参加する。(クラスコードは1nmp0c9)
以上。課題等は基本的にこちらに提出することになります。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 24 / 44
サーバにログイン (Windows,学内ネットワークのみ)
1 【スタートメニュー】→【Git】→【Git Bash】2 以下のように (学科別の)コマンドを打ち込む。($は最初から表示されている「プロンプト」なので入力する必要はない。)
$ ssh [email protected]$ ssh [email protected]$ ssh [email protected]
3 初回は鍵を確認されるので “(yes/no)”に yesと答える。4 パスワードを入力する。(パスワードは画面に表示されない。)
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 25 / 44
サーバにログイン (macOS,学内ネットワークのみ)
1 【Launcher】→【その他】→【ターミナル】2 以下のように (学科別の)コマンドを打ち込む。(mac~$は最初から表示されている「プロンプト」なので入力する必要はない。)
mac:˜ someone$ ssh [email protected]:˜ someone$ ssh [email protected]:˜ someone$ ssh [email protected]
3 初回は鍵を確認されるので “(yes/no)”に yesと答える。4 パスワードを入力する。(パスワードは画面に表示されない。)
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 26 / 44
サーバにログイン (その他,学内ネットワークのみ)Windows/macOSで前のページでうまくいかない場合もこちら
1 ブラウザで以下のいずれかの URLを開く。▶ https://edu2.rd.oit.ac.jp:3000▶ https://edu2.rd.oit.ac.jp:3001▶ https://edu2.rd.oit.ac.jp:3002▶ https://edu2.rd.oit.ac.jp:3003▶ https://edu3.rd.oit.ac.jp:3000▶ https://edu3.rd.oit.ac.jp:3001▶ https://edu3.rd.oit.ac.jp:3002▶ https://edu3.rd.oit.ac.jp:3003
2 ユーザ名 (e1w1???? みたいなもの)、パスワードを使ってログイン。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 27 / 44
サーバからログアウト授業が終わったら必ずやること!
作業 (授業)が終わったらいきなりウィンドウを閉じない。
まずは logoutコマンド (もしくはexitコマンド)を実行してサーバからログアウトする。
その後でウィンドウを閉じるなり電源を切るなりする。
logoutコマンド
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 28 / 44
ターミナル(端末)
コマンドを入力して応答が返ってくるようなものを「ターミナル(端末)」という 1。ターミナルにはさまざまなソフトがあるが、この授業ではWindowsの場合はGit Bashのターミナルを使う。
1もともとは遠隔にある大型のコンピュータを操作するための文字通り「端末」、という意味だったが、今ではコマンドを入れてコンピュータを操作するある種のアプリを総じてターミナルという。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 29 / 44
UNIXターミナル演習
calコマンドを試してみよう。
edu2:˜ e1x19999$ cal4月 2019
日 月 火 水 木 金 土1 2 3 4 5 6
7 8 9 10 11 12 1314 15 16 17 18 19 2021 22 23 24 25 26 2728 29 30
cal 2020や cal 9 1752もどうぞ。
解説calコマンドはカレンダーを表示するもの。edu2:˜ e1x19999$の部分はプロンプトといい、『はい、ご用件はなんでしょう』程度の意味の目印。「w」、「date」、「pi 1000」などのコマンドも試してみよう。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 30 / 44
『プログラム』とは?
ある仕事をさせるための手順等を定義したもの。コンピュータの「プログラム」も、広義には運動会の「プログラム」、卒業式の「プログラム」と同じ意味。広辞苑第六版:プログラム【program(me)】1. 番組。予定。計画。2. 目録。計画表。また、演劇・音楽会などの内容を解説した小冊子。3. コンピューターに対して、どのような手順で仕事をすべきかを、機械が解読できるような特別の言語などで指示するもの。→プログラム‐カウンター【program(me) counter】
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 31 / 44
プログラムの作り方
program (source code)
editor
1 プログラムはファイルとして作る。2 それをソース(ソースコードあるいはソースファイルなどとも)という。
3 ソースを編集するにはエディタというソフト(アプリ)を使う。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 32 / 44
はじめての Rubyスクリプト
1 buf = []2 while true do3 buf.unshift(" " * rand(40) + "#")4 puts(buf[0])5 sleep(0.03)6 end
これを、全員でいっしょに、一行ずつ入力していく。まだ意味は全くわからなくていい (実はけっこう難しいプログラムです)。とにかく入力の体験をするだけ。小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 33 / 44
エディタ (editor)ソースコードを編集するためのアプリ
エディタは数え切れないほどいろいろあるが、この授業ではnanoというものを使う。サーバにログインした状態でnano game.rbとしてエディタを起動しよう。
▶ game.rbはプログラムのファイル名。『.rb』で終わっているのは rubyプログラムの意味。
▶ 画面下の方にある【ˆX終了】は [Control]キーを押しながら [X]を押す、の意味。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 34 / 44
~1行目
1 buf = []
エディタで一番左上から書き始める。[]は角括弧。()(丸括弧)や {}(波括弧)ではないので注意。=(イコール)の左右にはスペースを入れた方がいい。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 35 / 44
~2行目
1 buf = []2 while true do
一行目の下に、左端を揃えて書くのが良い。while、true、doの間にはスペースを入れる。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 36 / 44
~3行目
1 buf = []2 while true do3 buf.unshift(" " * rand(40) + "#")
3行目は先頭に 2文字スペースを入れる。(インデント (字下げ)という。)『" "』の部分はダブルクォート ([SHIFT]を押しながら [2])の間にスペースを一つ入れる。*(アスタリスク)は [SHIFT]を押しながら [L]の 2つ右。小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 37 / 44
~4, 5行目
1 buf = []2 while true do3 buf.unshift(" " * rand(40) + "#")4 puts(buf[0])5 sleep(0.03)
インデントを 3行目に合わせる。4行目の[0]は角括弧。5行目の(0.03)は丸括弧。小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 38 / 44
~6行目 (完成! )
1 buf = []2 while true do3 buf.unshift(" " * rand(40) + "#")4 puts(buf[0])5 sleep(0.03)6 end
インデント量を 0にして (一番左に寄せて)endを入力以上でプログラムがひとまず完成!小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 39 / 44
保存して終了する
1 『ˆX』 (← [Control]+[X]の意)として終了する。
2 保存するか聞かれるので yを押し…
3 ファイル名の確認はそのまま[Enter] (や [Return])。 “Y”を選んで次の質問は
そのまま [Enter]
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 40 / 44
プログラム実行前に…
ファイル一覧を表示する “ls”コマンド
e1w19999@edu1:˜$ lsgame.rbe1w19999@edu1:˜$ ls
lsは listの省略形と言われている。「そこ 2」にあるファイルの一覧を表示するコマンド。
2ってどこよ? という問の答はなかなか奥深くて難しい…。小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 41 / 44
さあ、いよいよ実行!
Rubyプログラムは “ruby”コマンドで実行する。今回は以下のとおり。e1w19999@edu1:˜$ ruby game.rb(何が起こるかな!?)
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 42 / 44
スクリーンショットの撮り方課題提出に必要です。
毎回の課題として、作ったプログラムの実行結果のスクリーンショットを提出してもらう。以下撮り方。
▶ Windows[Windows]を押しながら[Print Screen (Prt Sc)]を押す。→ピクチャフォルダの中のスクリーンショットフォルダに保存される。
▶ macOS[Shift]+[command]を押しながら[3]を押す。(デスクトップに保存される)
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 43 / 44
課題今回はこれだけ!
課題
game.rbを実行した結果の画面のスクリーンショットをGoogle classroom(https://classroom.google.com)に提出せよ。締め切りは月曜正午。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 1, 2 of 14 44 / 44