• 検索結果がありません。

¥×¥í¥°¥é¥ß¥ó¥°±é½¬I Exercise on Programming I [1zh] ` `%%%`#`&12_`__~~~alse

N/A
N/A
Protected

Academic year: 2021

シェア "¥×¥í¥°¥é¥ß¥ó¥°±é½¬I Exercise on Programming I [1zh] ` `%%%`#`&12_`__~~~alse"

Copied!
44
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミング演習

I

Exercise on Programming I

http://bit.ly/OITprog1

小林 裕之

大阪工業大学 ロボティクス&デザイン工学部 システムデザイン工学科

1, 2 of 14

(2)

この授業でやること

プログラミングの基礎・基本的な概念を演習

を通じて学ぶ。

プログラミング言語として

Ruby

を使う(が、

(3)

『プログラミング的』思考

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

どうやれば

確実に

解ける

?

(4)

『プログラミング的』思考で「アルゴリズム」を作る

たったの

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

1

q

が間違いだったら解なし。

2

q

が全マス埋まっていれば

q

が解。

3

q

の最初の空きマスに

1

から

9

まで順に

埋めた問題

q

1

, q

2

,

· · · , q9

を作成し、そ

れぞれについて

《数独

q

i

の解》

を求める。

(5)

『プログラミング的』思考から本当の『プログラム』へ

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’

の解を求める

(6)

その他少々加えて完成!

(

言語は

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

])

(7)

同じものを別言語

(

この授業でやる

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]

}

(8)

評価方法

『⃝⃝演習』の授業は、出席して、授業に参加すること自体がとても重要です。

演習出席点

=3

/

(

遅刻

=2

,

途中無断退出

=0

)

出席管理システムで採点するので必ずカードを通すこと。

レポート点

=3

/

(第 1 回の分は出席者全員 3 点)

期末演習点

=16

以下はその都度適宜減点:

動画・音楽の視聴, ヘッドフォンの使用 (聴覚の補助等を除く), 私的なゲーム, 指定席

以外への移動, 飲食 (飲み物もダメ), 睡眠, その他常識の範囲で明らかに演習の授業を

受けることに対して不適当な行為全般

(9)

今日の内容

学内

Wi-Fi

に接続

ssh

クライアントの準備

サーバにログイン

(10)

この授業の開発環境

クラウドぽい環境です。

梅田キャンパス

edu1

edu2

edu3

大宮キャンパス

自分の

PC

端末

にして、大宮の

サーバ

ログイン

して作業

(11)

学内

Wi-Fi

に接続

これは、もうやってますね。

Windows

の人は右下、

macOS

の人は右上の

Wi-Fi

ある

いはネットワークのアイコンをクリックして

OIT-AirLAN.1x

に接続。

ID

は学生番号の前に

e1

をつけたもの。全部小文字。

(

:

e1x19123)

パスワードは情報センターが発行したもの。

OIT-AirLAN.1x

にどうしてもつながらなければ

OIT-AirLAN

を試す。

(12)

ssh

クライアント

Windows

の人のみ。

mac, Linux

の人は不要です。

Windows

の人のみ

追加でソフトをひとつインストール。

https://gitforwindows.org

を開き

[Download]

ダウンロードしたら『実行』でインストール。

(13)

プログラミング言語とは

プログラムを作成するために作られた

形式言語

用途や思想により様々なものがある。

(14)

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

;

}

(15)

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

);

}

(16)

0 + 1 + . . . + 9 in JavaScript

let

sum

= 0

for

(

let

i

= 0

; i

< 10

; i

++

) {

sum

=

sum

+

i

}

console.log(sum)

(17)

0 + 1 + . . . + 9 in Python

sum

= 0

for

i

in

range

(

10

):

sum

=

sum

+

i

(18)

0 + 1 + . . . + 9 in Ruby

sum

= 0

(

0..9

)

.

each {

|

i

|

sum

=

sum

+

i

}

puts

sum

(19)

0 + 1 + . . . + 9 in Swift

var

sum

=

0

(

1.

..

9

).forEach{(i)

in

sum = sum

+

i

}

print

(sum)

(20)

0 + 1 + . . . + 9 in Haskell

main

=

print

$

mysum [

0..9

]

mysum

[a]

=

a

(21)

0 + 1 + . . . + 9 in (old) BASIC

10

S

=0

20

FOR

I

=0

TO

9

30

S

=

S

+

I

40

NEXT

I

50

PRINT

S

(22)
(23)

classroom

に参加

(1 of 2)

1

ブラウザで

https://classroom.google.com

を開く。

2

OIT

組織アカウント以外で

Google

にログイン中の場合は組織アカ

ウントでログインし直す。

ログイン中のアカウント。

ここをクリックして

OIT

織アカウントかどうか確認。

(24)

classroom

に参加

(2 of 2)

3

アカウントアイコンの左側のプラス(+)をクリックして生徒とし

てクラスに参加する。

(

クラスコードは

1nmp0c9

)

(25)

サーバにログイン

(Windows,

学内ネットワークのみ

)

1

【スタートメニュー】→【

Git

】→

Git Bash

2

以下のように

(

学科別の

)

コマンドを打ち込む。

($

は最初から表示

されている「プロンプト」なので入力する必要はない。

)

$

ssh [email protected]

$

ssh [email protected]

$

ssh [email protected]

3

初回は鍵を確認されるので

“(yes/no)”

yes

と答える。

4

パスワードを入力する。

(

パスワードは画面に表示されない。

)

(26)

サーバにログイン

(macOS,

学内ネットワークのみ

)

1

Launcher

】→【その他】→

【ターミナル】

2

以下のように

(

学科別の

)

コマンドを打ち込む。

(mac

$

は最初か

ら表示されている「プロンプト」なので入力する必要はない。

)

mac:˜ someone$

ssh [email protected]

mac:˜ someone$

ssh [email protected]

mac:˜ someone$

ssh [email protected]

3

初回は鍵を確認されるので

“(yes/no)”

yes

と答える。

(27)

サーバにログイン

(

その他

,

学内ネットワークのみ

)

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????

みたいなもの

)

、パスワードを使ってログ

イン。

(28)

サーバからログアウト

授業が終わったら必ずやること!

作業

(

授業

)

が終わったら

いきなりウィン

ドウを閉じない

まずは

logout

コマンド

(

もしくは

exit

コマンド

)

を実行して

サーバからログアウ

トする

その後でウィンドウを閉じるなり電源を

切るなりする。

logout コマンド

(29)

ターミナル(端末)

コマンドを入力して応答が返ってくるようなものを「

ターミナル

(端末)

」という

1

ターミナルにはさまざまなソフトがあるが、この授業では

Windows

の場合は

Git Bash

のターミナルを使う。

(30)

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」などの

コマンドも試してみよう。

(31)

『プログラム』とは?

ある仕事をさせるための手順等を定義したもの。

コンピュータの「プログラム」も、広義には運動会の「プログラ

ム」、 卒業式の「プログラム」と同じ意味。

広辞苑第六版

:

プログラム【program(me)】

1. 番組。予定。計画。

2. 目録。計画表。また、演劇・音楽会などの内容を解説した小冊子。

3. コンピューターに対して、どのような手順で仕事をすべきかを、機械が解読で

きるような特別の言語などで指示するもの。

→プログラム‐カウンター【program(me) counter】

(32)

プログラムの作り方

program (source code)

editor

1

プログラムは

ファイル

として作る。

2

それを

ソース

ソースコード

あるいは

ソース

ファイル

などとも)という。

3

ソースを編集するには

エディタ

というソフト

(アプリ)を使う。

(33)

はじめての

Ruby

スクリプト

1

buf

= []

2

while true do

3

buf

.

unshift(

" "

*

rand

(

40

)

+

"#"

)

4

puts

(buf

[0]

)

5

sleep

(

0.03

)

6

end

これを、全員でいっしょに、一行ずつ入力していく。

まだ

意味は全くわからなくていい

(

実はけっこう難しいプログラム

です

)

とにかく入力の体験をするだけ。

(34)

エディタ

(editor)

ソースコードを編集するためのアプリ

エディタは数え切れないほどいろいろあるが、この

授業では

nano

というものを使う。

サーバにログインした状態で

nano game.rb

とし

てエディタを起動しよう。

game.rb

はプログラムの

ファイル名

。『

.rb

』で

終わっているのは

ruby

プログラムの意味。

画面下の方にある【

ˆX

終了】は

[Control]

キーを

押しながら

[X]

を押す

、の意味。

(35)

1

行目

1

buf

= []

エディタで一番左上から書き始める。

[]

角括弧

()

(

丸括弧

)

{}(

波括弧

)

ではないので注意。

(36)

2

行目

1

buf

= []

2

while true do

一行目の下に、左端を揃えて書くのが良い。

(37)

3

行目

1

buf

= []

2

while true do

3

buf

.

unshift(

" "

*

rand(

40

)

+

"#"

)

3

行目は先頭に

2

文字スペースを入れる。

(

インデント

(

字下げ

)

いう。

)

" "

』の部分はダブルクォート

([SHIFT]

を押しながら

[2])

の間

にスペースを一つ入れる。

(38)

4, 5

行目

1

buf

= []

2

while true do

3

buf

.

unshift(

" "

*

rand(

40

)

+

"#"

)

4

puts(buf

[0]

)

5

sleep(

0.03

)

インデント

3

行目に合わせる。

4

行目の

[0]

は角括弧。

(39)

6

行目

(

完成!

)

1

buf

= []

2

while true do

3

buf

.

unshift(

" "

*

rand(

40

)

+

"#"

)

4

puts(buf

[0]

)

5

sleep(

0.03

)

6

end

インデント量を

0

にして

(

一番左に寄せて

)end

を入力

(40)

保存して終了する

1

ˆX

(

[Control]+[X]

)

として終了する。

2

保存するか聞かれるので

y

押し…

3

ファイル名の確認はそのまま

(41)

プログラム実行前に…

ファイル一覧を表示する

“ls”

コマンド

e1w19999@edu1:˜$

ls

game.rb

e1w19999@edu1:˜$

ls

ls

list

の省略形と言われている。

「そこ

2

」にあるファイルの一覧を表示するコマンド。

(42)

さあ、いよいよ実行!

Ruby

プログラムは

“ruby”

コマンドで実行する。

今回は以下のとおり。

e1w19999@edu1:˜$

ruby game.rb

(43)

スクリーンショットの撮り方

課題提出に必要です。

毎回の課題として、作ったプログラムの

実行結果のス

クリーンショット

を提出してもらう。以下撮り方。

Windows

[Windows]

を押しながら

[Print Screen (Prt Sc)]

押す。→ ピクチャフォルダの中のスクリーンショットフォルダ

に保存される。

macOS

[Shift]+[command]

を押しながら

[3]

を押す。

(

デスク

(44)

課題

今回はこれだけ!

課題

game.rb

を実行した結果の画面のスクリーン

ショットを

Google classroom

(https://classroom.google.com)

に提出

せよ。

締め切りは月曜正午。

参照

関連したドキュメント

いてもらう権利﹂に関するものである︒また︑多数意見は本件の争点を歪曲した︒というのは︑第一に︑多数意見は

喫煙者のなかには,喫煙の有害性を熟知してい

ところで、モノ、ヒト、カネの境界を越え た自由な往来は、地球上の各地域の関係性に

Bでは両者はだいたい似ているが、Aではだいぶ違っているのが分かるだろう。写真の度数分布と考え

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

子どもが、例えば、あるものを作りたい、という願いを形成し実現しようとする。子どもは、そ

だけでなく, 「家賃だけでなくいろいろな面 に気をつけることが大切」など「生活全体を 考えて住居を選ぶ」ということに気づいた生

   遠くに住んでいる、家に入られることに抵抗感があるなどの 療養中の子どもへの直接支援の難しさを、 IT という手段を使えば