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