LoginSignup
4

More than 5 years have passed since last update.

プログラミングの基礎

Last updated at Posted at 2015-08-11

したいこと

プログラミングの基礎を通して、コンピュータサイエンスの基礎となるアルゴリズムとデータ構造、また正しいプログラミングの知識を身につける。

第1章 - はじめに

OCamlをインストールする

第2章 - 基本的なデータ

整数と実数

OCamlでは整数と実数を分けて考える

そのまま計算するとエラーとなる

# 2 * 3.14 ;;
Error: This expression has type float but an expression was expected of type
         int

整数と(小数点以下がない場合も)四測演算子にもピリオドを付与する

# 2. *. 3.14 ;;
- : float = 6.28

べき乗

べき乗は「**」

3.14の2乗

# 3.14 ** 2. ;;
- : float = 9.8596

文字列

文字列は「"」で囲み、文字列連結は「^」

# "あいう" ^ "えお" ^ "かきく" ^ "けこ" ;;
- : string = "あいうえおかきくけこ"

論理演算

&&「かつ」
||「または」
not「否定」

# true && true ;;
- : bool = true

# true || false ;;
- : bool = true

# not true ;;
- : bool = false

第3章 - 変数の定義

変数

変数名の先頭は小文字、変数の定義は let 変数名 = 式

# let e = 2.7182 ;;
val e : float = 2.7182

OCamlインタプリタの実行順

# let e = 2.7182 ;;
val e : float = 2.7182
# 1.0 +. e *. 2.0 ;;
- : float = 6.4364

1.0 + e × 2.0
↓
1.0 + 2.7182 × 2.0
↓
1.0 + 5.4364
↓
6.4364

第4章 - 関数の定義

関数定義の構文

関数の定義は let 関数名 引数 ... = 式

# let calc x = x * 2 ;;
val calc : int -> int = <fun>

複数の引数の場合はスペースをあける

# let calc x y = x * 2 + y * 3 ;;
val calc : int -> int -> int = <fun>

上記の関数の型は

int -> int -> int

関数の呼び出しは "関数名 引数"

# calc 5 8 ;;
- : int = 34

デザインレシピ

プログラム作成時にしたがうべき指針となるもの

  • 目的
  • 本体
  • テスト

目的

作成する関数が何をするものなのか、入力と出力は何なのかを考え関数の型を決めてヘッダを作成する

例.距離と早さから時間を求める関数「calc_time」

calc_time.ml
(* 目的:距離と早さから時間を求める *)
let calc_time dist time = 0

実装するまえにテストをかく

calc_time.ml
(* テスト *)
let test1 = calc_time 10 1 = 10
let test2 = calc_time 15 5 = 3
let test3 = calc_time 20 10 = 2

テストの実行は #use "テスト対象" ;;

# #use "calc_time.ml" ;;
val calc_time : 'a -> 'b -> int = <fun>
val test1 : bool = false
val test2 : bool = false
val test3 : bool = false

本体

実際に実装する

calc_time.ml
(* 目的:距離と早さから時間を求める *)
let calc_time dist time = dist / time

テスト

正しく動作することを確認する

# #use "calc_time.ml" ;;
val calc_time : int -> int -> int = <fun>
val test1 : bool = true
val test2 : bool = true
val test3 : bool = true

完成形

calc_time.ml
(*目的:距離と早さから時間を求める *)
let calc_time dist time = dist / time

(* テスト *)
let test1 = calc_time 10 1 = 10
let test2 = calc_time 15 5 = 3
let test3 = calc_time 20 10 = 2

第5章 - 条件分岐

条件分岐の構文

if 条件 then 式 else 式

関数でのつかいかた

taikei.ml
let hosomi = "細身"
let futsuu = "普通"
let futome = "太め"

(* 目的:体重を与えたら男性の体型を返す *)
(* taikei : int -> string *)
let taikei taiju =
  if taiju < 55 then hosomi
  else if 55 <= taiju && taiju < 75 then futsuu
  else if taiju >= 75 then futome
  else ""

返却パターンもすべてテストとして網羅すること

taikei.ml
(* テスト *)
let test1 = taikei 54 = hosomi
let test2 = taikei 55 = futsuu
let test3 = taikei 56 = futsuu
let test4 = taikei 74 = futsuu
let test5 = taikei 75 = futome
let test6 = taikei 80 = futome

第6章 - さまざまなエラー
第7章 - 組とパターンマッチ
第8章 - レコード
第9章 - リスト
第10章 - 再帰関数を使ったプログラミング
第11章 - 自然数と再帰
第12章 - ダイクストラのアルゴリズム
第13章 - 一般化と高指関数
第14章 - 高指関数を使ったリスト処理
第15章 - 新しい形の再帰
第16章 - 情報の蓄積
第17章 - 再帰的なデータ構造
第18章 - 例外と例外処理
第19章 - モジュール
第20章 - モジュールの開発
第21章 - 逐次実行
第22章 - 値の書き換えと参照透過性
第23章 - 副作用命令を使ったプログラミング
第24章 - まとめ―プログラミングとは

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4