計算機実習 I
第七回 (2015 年 5 月 21 日)
応用課題演習 I
http://www.sw.it.aoyama.ac.jp/2015/CP1/lecture7.html
Martin J. Dürst
© 2005-15 Martin
J. Dürst 青山学院大学
目次
- 総合復習テスト
- 前回の演習
- プリプロセッサ
- 今週の演習問題
総合復習テスト
- 30 分の筆記試験
- ログオフ済み
- 机に場所を作る
(キーボードの長辺を下にパソコンとディスプレーの間に挟むなど)
- 授業開始まで教科書、資料、筆箱、財布などを鞄に入れ、鞄を椅子の下に
- テスト終了後その場で待つ
不正行為
- 約束した通り、独走
- 質問は Q&A フォーラムの範囲内
- 付ききりの指導は独走ではなく、本人の勉強にもならない
- 対処:
- 一問あたり一週間分の課題をすべて 0 点
- 必要ならさらに対応を強化
C 言語の応用: Ruby
- プログラミングの楽しさを主な目的としたプログラム言語
- 最初の公開は 1993 年
- 作者はまつもと ゆきひろ (Matz)
- 主な応用分野はウェブサイト (Ruby on Rails)
とスクリプト
- 全体で約 84万行
- 他の実装も (例: JRuby: Java による Ruby の実装)
前回の演習結果
|
06A1 |
06A2 |
06B1 |
06C1 |
06C2 |
06C3 |
100点 |
82 |
76 |
72 |
42 |
12 |
4 |
60点 |
12 |
18 |
22 |
45 |
48 |
34 |
エラー |
- |
- |
- |
4 |
22 |
17 |
未提出 |
- |
- |
- |
|
12 |
39 |
- 06C1 を提出してない ⇒
本格的なプログラムを提出してない
- 06C2 を提出してない ⇒
今日違った形でもう一回チャンス
前回の演習: 構造体の定義
- 構造体はプログラムによく出てくる対象物のために定義
- 構造体の定義を表現する対処の本質に合わせる
- 構造体の型名とメンバ名は対象物に合わせる
- 構造体は関連あるデータをまとめるのが目的
- 構造体や関数そのものと使うプログラムを別物と考える
- 入出力と計算はできるだけ別の関数に
- これらの点はプログラミングだけではなく、
要求分析、設計などにも大事
前回の演習: 構造体の具体例
[昨年度資料につき削除]
前回の演習: 情報収集
- 演習前の説明をよく聞く
- 配布資料をよく読む
- 問題文をしっかり読んで理解
例: Create a function to add two complex numbers.
- Q&A フォーラムの活用
- いまだ遠慮する学生が存在
- 英文についての質問でもよい
- 個別問題だと思われる場合でもよい
06C3 の要点
[昨年度資料につき削除]
プリプロセッサ
(preprocessor)
- コンパイラ本体の前に実行
- プリプロセッサのみの実行:
gcc -E 06A1.c -o 06A1.i
→
06A1.i
- 主な役割:
- (ヘッダ) ファイルの包含 (
#include
)
- マクロの定義・展開 (
#define
)
- 条件付きコンパイル
(
#ifdef
/#ifndef
/#endif
)
ヘッダファイル
(header file)
- C のヘッダファイルの拡張子は
.h
.c
ファイルへ包含しながらコンパイル
- 主な役割:
- 複数の C のファイルの情報共有
- 共通の型の定義
- 関数の宣言
- マクロの定義
- [グローバル変数の宣言]
ヘッダファイルの使い方の典型例
library.h
:
ライブラリが提供する型の定義、関数の宣言
library.c
: ライブラリの関数などの定義
(library.h
を #include
)
using.c
: ライブラリを使用するプログラム
(library.h
を #include
)
#include
の種類
- 標準ライブラリの
#include
(教科書 p. 201):
#include <stdio.h>
- 独自ライブラリの
#include
:
#include "my_library.h"
マクロの定義
(教科書 pp. 218, 237)
- 基本形:
#define COUNT 20
応用: プログラムの素早い変更
応用例: for (i=0; i<COUNT; i++)
- 応用系:
#define max(a,b) ((a)>(b)?(a):(b))
応用:
型に依存しない、関数呼出が必要ない関数みたいなもの
応用例: int i = max(d,e); double z = max(x,y);
注意点:
定義で括弧を多めに使用、副作用の発生の恐れ
(char c = max(getchar(), 'n');
)
- コマンドラインでのマクロの定義:
gcc -DCOUNT=20 ...
条件付きコンパイル
#ifdef HOGE
// HOGE が #define で定義されたら残る部分
#endif
#ifndef HOGE
// HOGE が #define
で定義されなかったら残る部分
#endif
条件付きコンパイルの応用例
同一ヘッダファイルの #include
の重複防止:
ヘッダファイルにて:
#define MY_LIBRARY_HEADER
使用場所:
#ifndef MY_LIBRARY_HEADER
#include "my_library.h"
#endif
演習問題の概要
- 07A1: 複素数のライブラリの使用
- 07B1: 複素数のライブラリの作成
- 07C1: 行列計算のライブラリの作成と使用
(
#ifndef
, #define
)
- 07C2: 日付のライブラリの作成 (第一部)
- 07C3: 日付のライブラリの作成 (第二部、発展問題、部分点)
(問題ごとにテスト用のファイル、コンパイル用のファイルがダウンロード可能)
次回までの準備
- 今日の復習
- 残りの演習問題を宿題として完成、提出
- 配布資料 (「ビジュアルラーニング C++ 入門」、さかお
まい著、X-media 社、pp. 70-112) をよく読む。