第1回テキスト

プログラミング演習
土曜日(Q組)
システムデザイン工学科
配布資料
1. テキスト
部数に余裕がないため、絶対に紛失しないこと
•
•
基本的に講義スライドのコピーは配布しない。
講義時にはkeio.jpにも掲載するので、参照しながら
受講すると良い。
テキストの訂正などの補足事項も、随時keio.jpに
掲載していく予定です。
2
授業の進め方
• 前半は、C++言語の基礎
– 1時限目は主に講義、2時限目は主に演習
– 毎週、演習問題を出題する。
• 演習時間中に演習し、不足ならITCや自宅で自習すること
• レポートは次週の講義最初に提出すること
• プログラムリストのプリントアウトを添付すること
• 工夫した点、苦労した点などを考察として記すこと
• 後半はC++言語の応用で、演習が主体
– コンピュータシミュレーション(2週)
• レポート提出は1回のみ
– 入出力装置の活用 未定(3週)
• 課題毎に動作デモを行って認印を受けた後、
認印を表紙に付した最終レポートを提出
• 言語習得には演習量が大切なので、講義時間以外にも
ITCや自宅で自習を行うこと
3
MSDNAA (マクロソフト・アカデミック・アライアンス)
• 必要情報、
– 名前:漢字と、ひらがな読みと、ローマ字、学籍番号
• アカウントは、
– 学籍番号がIDになります。
– パスワードは、ID+ローマ字の名字をたした文字列になります。
• メールの仕方
– 題目(Subject) MSDNAA
– 本文(半角スペースを利用)
• 慶應 太郎
• けいおう たろう
• KEIOU TAROU
• 86XXXXX
– 宛先:[email protected]
• 2年の情報処理システムの授業でアカウントをもらった人は
同じですので必要ありません。
4
本日の目標
1. プログラミングとは何かを理解する
2. 製図室のPCを用いて、与えられたサンプルプログラムを
入力し、コンパイルし、実行するという一連のプログラミン
グ作業を習得する
3. C言語、C++言語のごく基本的な文法を知る
• テキストでは第3章まで
5
プログラミングとは?(1.1-1.3節)
• コンピュータは、命令されなければ何もしないし、
理解・実行できる命令数は有限である。
• しかし人間は万能機械を期待する。
• 人間がコンピュータに実行して欲しい処理手順を、
コンピュータの命令の順序付きの組み合わせとして
与えてやればよい。
– これをプログラムと言う。
• プログラムの設計作業をプログラミングと言う。
• 設計したものを言語で表わす作業をコーディングという。
• ある問題を解く処理手順は一意ではないから、
プログラムも一意にはならない。
6
続・プログラミングとは?(1.1-1.3節)
• コンピュータが理解・実行できる命令(機械語)は、
人間にとって扱いづらい
• 翻訳プログラム(コンパイラ)を用いて、人間の扱いやすい
言語から機械語へ自動翻訳する方法が開発された
• 様々なプログラミング言語が誕生した
– Fortran, COBOL, Ada, C, C++, Java, Python ...
– 残念ながら、すべて人工的な言語である
• C言語は以下の特徴があり、SDにとって魅力的である
– 手続き型言語で、処理速度が高速である
– ハードウェアの制御に適し、組み込みシステムにも使える
– 高性能コンピュータ上での大規模計算にも使える
7
C言語の歴史(1.1節)
• 1972年、B.W.KernighanとD.M.Ritchieが開発
• 1978年、最初の教科書が出版 (K&R C)
• 1988年、ANSI標準化され、改訂版が出版 (ANSI C)
– 主な変更点は、プロトタイプ宣言の追加
• 1998年、ISO規格化された (C99)
– 主な変更点は、変数宣言位置の拡張と可変長配列の追加
• 時代と共に言語の仕様が変わり、それとともに
翻訳プログラム(コンパイラ)もバージョンアップしている
• 古い教科書を参照すると古い文法を学ぶことになるが、
K&Rの教科書は学ぶ点が多いので、いずれは一読を
薦める
8
C++言語の歴史(1.2節)
•
•
•
•
1980年、B.Stroustrupが開発を開始(C with Classes)
1983年、C++として公開
1989年、ANSIによる標準化が開始
2003年、最新のISO規格化された
•
•
•
•
•
基本的にはC言語の拡張
型検査が厳密化
オブジェクト指向プログラミングをサポート
汎用プログラミングをサポート
例外処理の組み込み
9
コンパイルとコンパイラ (2.1, 2.2節)
• ソースファイル (source file)
– C言語で書かれたファイル
– 拡張子は .c (C++の場合は.cpp)
– 複数ファイルで構成してもいい
ソースプログラム
ソースプログラム
ソースプログラム sample.c
• コンパイラ (compiler)
– ソースファイルを翻訳して
実行ファイルを生成する
プログラム
コンパイラ
• 実行ファイル (executable file)
– 機械語のファイル
– 拡張子は .exe
ロードプログラム
sample.exe
10
本演習で用いる計算機環境
• ハードウェア: IBM PC互換機、OS: Windows XP
Professional
• Cコンパイラ、統合開発環境: Visual C++ Express Edition
– 編集、コンパイル、デバッグ、実行が同じ画面からGUI操作できる
• 日吉や矢上のITCのWindows PCにもVisual C++がインス
トールされており、利用可能である(バージョンが異なる)
• Express Editionは無料のソフトウェアなので、各自のPCにイ
ンストールして演習することが可能
• SDでは、学科でMicrosoftの開発ライセンスを取得している
ので、製品版を自宅のPCにインストールすることも可能。
希望者は [email protected] に連絡すること。
• ちなみに、Mac OS X上には優れた統合開発環境が標準で
搭載されています。詳細は矢向に聞いてください。
11
製図室PCの使い方
• ログイン作業は、他のITC環境と同じ
• 「スタート」→「プログラム」→「Visual C++ 2005 Express
Edition」→「Visual C++ Express Edition」を起動する
• 「ツール」→「オプション」→「環境」→「スタートアップ」を
「最後に読み込んだソリューション」にしておこう
• 製図室のプリンタを利用する場合は課金されない
– 悪用しないこと!
• プログラムの印刷は、VC++の印刷メニューから行う
– 行数が増えてきたら 2 up で印刷しても構わない
• グラフィクス(ウィンドウのイメージ)を印刷する場合は、
Alt+PrtScreenで画面をコピーできるので、それを
スタート->プログラム->アクセサリ->ペイントに貼り付け、
画像ファイルとして保存して文書に張り付ければよい。
12
Visual C++でのファイル管理 (2.3節)
• プロジェクト:1つの実行ファイルを生成する単位
– 演習問題毎にプロジェクトを作成
• ソリューション:関連する複数プロジェクトの集まり
– 演習日毎にソリューションを作成
プログラミング演習
用のフォルダ
H:¥programming
20070927
ex1
ex2
20071004
…
exn
…
20080117
プロジェクト
フォルダ
ソリューション
フォルダ
13
Visual C++でのファイル管理 (2.3節)
• 「ファイル」→「新規作成」→「プロジェクト」で「新しいプロ
ジェクト」ウィンドウを開く
• プロジェクトの種類は「Visual C++」→「Win32」
• テンプレートは「Win32 コンソール アプリケーション」
• プロジェクト名は任意、例えば「ex1」など
• 場所は、「h:¥programming」
• ソリューションは、
– 各演習日の最初は「新しいソリューションを作成する」を選び、「ソ
リューションのディレクトリを作成」をチェックし、ソリューション名とし
て「20070927」など日付で命名する
– 各演習日の2回目以降は「ソリューションに追加」を選ぶ
• 「OK」を押すと「Win32アプリケーションウィザード」ウィンド
ウが開くので、「次へ」を押して、「空のプロジェクト」をチェッ
クして「完了」を押す
14
VC++の使い方 (2.3節)
•
•
•
•
「プロジェクト」→「新しい項目の追加」ウィンドウを開く
カテゴリは「コード」を選択
テンプレートは「C++ファイル(cpp)」を選択
任意のファイル名(例えばex1.c)を指定して「追加」を押す
– 拡張子は .c にする
• 演習1:p.13のソースコード1を打ち込んでみよ
• コンパイルするには、「ビルド」→「コンパイル」
– オブジェクトファイルが生成される。文法チェックに便利
• ビルドするには、「ビルド」→「プロジェクト名のビルド」
– 実行ファイルが生成される
• 実行するには、「デバッグ」→「デバッグなしで開始」
– DOS窓が開いて、printf中の文字列が表示されればOK
15
2つ目のプロジェクト
• 演習2:p.14のソースコード2で同様に実行してみよ
– 「ファイル」→「新規作成」→「プロジェクト」で「新しいプロジェクト」
ウィンドウを開く
– 「ソリューションに追加」として、別のプロジェクト名を指定する
– ソースファイルを追加する際、拡張子を .cpp とする
– 実行する際、2つ目のプロジェクトをスタートアッププロジェクトに
指定するために、
• ソリューションエクスプローラ中の所望のプロジェクトを
右クリックして「スタートアッププロジェクトに設定」する
• 以上で、C言語とC++言語の両方とも演習できることが確認
できた。
16
「構成」の選択とファイルの所在確認
• ツールバーの「ソリューション構成」という欄にDebugと表示
されている。ここでReleaseと切り替えられるし、「ビルド」→
「構成マネージャ」でも切り替えることができる。
– Debug: 後に説明するデバッグを可能にする設定だが、実行ファイ
ルが大きくなったり、処理速度が低下する
– Release: デバッグ不可能になるが、実行ファイルが小さくなり、処理
速度も速くなる
– 演習中は常にDebugを選択しているのがよいだろう
• ファイルエクスプローラで H:¥programming を開き、
ソースファイルと実行ファイルの所在を確認しておこう
– 例えば
• ソースファイル:h:¥programming¥ex1¥main.c
• 実行ファイル:h:¥programming¥ex1¥debug¥ex1.exe
17
コマンドラインからのプログラム起動
• 「スタート」→「ファイル名を指定して実行」でcmdと入力し、
DOS窓を開く。
• cdコマンドでソリューションフォルダ内のdebugへ移動する
– cd h:¥programming¥20070927¥debug
– DOS窓で日本語を入力するには Alt+漢字
• dirコマンドでプロジェクト名.exe という名の実行ファイルが
あることを確認する
– dir
• 実行してみる
– .¥プロジェクト名
• プログラムの出力をファイルに保存することができる(リダイ
レクト)
– .¥プロジェクト名 > 出力ファイル名.txt
• 演習3:出力をファイルに保存し、それをメモ帳で開いて
中身を確認せよ
18
文字セットと予約語 (2.5)
• よく出てくるバックスラッシュ(文字コード0x5c)は、フォントに
よって円記号¥で表示される。同じものと
• C言語、C++言語それぞれ、特定の用途に予約されている
単語がある。これらは、変数や関数の名前に使用してはな
らない。ファイル名は言語と無関係なので何でも良い。
19
文法の基礎 (2.6)
• コメントには、学籍番号と氏名を必ず記入すること
プログラム内にも、説明を書き加えるとなお良い
• C言語、C++言語では、大文字小文字は区別されるが、
全体的に小文字が多用される
• 丸括弧()は、関数への引数を表す
• 波括弧{}は、ブロックを表す
• 文の最後はセミコロン ; で終わる
• 字下げは文法に含まれないが、ブロックの深さに応じて字
下げすると良い。VC++は波括弧の入力で自動的に字下げ
を調節してくれる。整形し直したい場合には、領域を選択し
て「編集」→「詳細」→「選択範囲のフォーマット」すればよい。
20
C言語の構成要素
• 識別子:変数や関数の名前
main, a, h, w, printf, ...
• 予約語:予め定められた用途に使用
int, return, void, ...
• 定数:実行前に決められている値
2, "%d", ...
• 演算子:様々な演算を行う
+, -, *, /, %, ...
• 区切り記号:文の終りを指定する
;
• ブロック:複数の文をまとめる
{ }
• インデント(空白、タブ)
• コメント:C言語と関係ない注釈を残すために使用
/* から */ まで、あるいは//から改行まで
21
プリプロセッサ (2.8)
• 行頭がシャープ#で始まる行は、プリプロセッサへの指令で
ある。プリプロセッサとは、ソースファイルをコンパイラへ渡
す前に簡単な処理を行うプログラムである。
• 置換
– #define
PI
3.14
• マクロ
– #define
SUM(a,b)
(a+b)
• ソースファイルの取り込み
– #include <stdio.h>
– #include "myHeader.h"
• 条件付コンパイル
(VC++ではdebug構成で_DEBUGが定義されている)
–
–
–
–
#ifdef _DEBUG
#ifndef _DEBUG
#else
#endif
22
プリプロセッサの動作確認プログラム
• 演習4:以下を入力して、debug構成とrelease構成の両方で
実行し、その結果を確認せよ
#include <iostream>
using namespace std;
#define MYNAME "Takahiro Yakoh"
int main(void){
#ifdef _DEBUG
cout << "compiled with debug configuration";
#endif
cout << "My name is " << MYNAME << ".¥n";
return 0;
}
23
変数と演算 (3章)
• 例として、次のスライドにあるプログラムを入力しよう
• 変数を使用するに先立ち、変数の定義が必要
– int i, j; は、int型の変数として i と j を定義している
• cout << を用いることにより、文字列定数や変数の値を
画面表示することができる
• cin >> を用いることで、キーボード入力を変数の値へ
代入することができる
• j=i*2; は極めて重要な事柄を表している。等号は右辺の
演算結果を左辺の変数へ代入することを意味している。
ちなみに、比較は等号2つ == で表す。
24
• ここから
25
デバッガ練習用のプログラム
• p.15のソースコード3とほぼ同じ
• using namespace std; は、それ以降で std:: を省略できるよう
にするための命令。
#include <iostream>
using namespace std;
int main(void){
int i, j;
cout << "Input an integer:";
cin >> i;
j=i*2;
cout << i << " * 2 = " << j << "¥n";
return 0;
}
26
デバッグ
• ソリューション構成は「Debug」を選択してビルドすること
• デバッグする際、プロジェクト毎にプロパティ→構成プロパ
ティ→マニフェストツール→全般にある「FAT32次善策の使
用」を「はい」にしてからリビルドすること
(ITCが完全対応してくれるまでの対処、自宅なら不要)
• ソース中の任意のところにカーソルを置き、右クリックし、
「カーソル行の前まで実行」を選択すると、実行が開始し、
その行を実行する直前で一時停止する
– 黄色矢印が次に実行する行を示している
• 1行だけ実行して再度停止するには
「デバッグ」→「ステップオーバー」(F10)
• 関数中まで追いかけて停止したいときは
「デバッグ」→「ステップイン」(F11)
27
デバッグ(続き)
• ブレークポイントを設定することで、複数個所で実行を一時
停止することが可能
• 左下のローカルには変数の現在値を表示される
• 演習5:最初の段階で変数の値がいくつなのか、値はいつ
変更されるかを観察してみよ。
– ウィンドウの切り替えはAlt+Tabが便利
28
データ型と変数(3.1)
よく使われるデータ型
char
文字(8bit)
int
整数(32bit)
float
単精度浮動小数点(32bit)
double 倍精度浮動小数点(64bit)
変数(データを格納するための箱)
名前のついた箱を用意することを「変数を定義する」という。
箱を用意しただけの時、何が入っているかは分からない。
あらかじめ値を入れておくことを初期化という。
変数の定義は、ブロックの先頭で行わなければならない。
int a;
// 変数の定義、値は未定
int b=123; // 変数の定義と初期化
int c(123); // C++のみ許される変数の定義と初期化
29
定数 (3.3)
• 変数定義の際、型の前にconstを前置すると定数となり、
初期化以外の代入が許されなくなる。
– const int a=5;
– const int b; // 初期値がないとエラー
– a=6;
// 定数への代入もエラー
30
参照(C++のみ) (3.4)
• 既にある他の変数を参照する変数である
• 定義時に、型名と変数名の間に&を記すことで参照型であ
ることを示し、さらに参照する変数で初期化しなければなら
ない
• 主な利用場面は関数への引数であり、現状ではわからなく
て良い
31
リテラル定数 (3.5)
実行前に決められている値
整数リテラル
a=64; b=0100; c=0x40;
実数リテラル,倍精度リテラル
a=1234.0; b=1.234e-5;
a=123L; b=1.23F;
文字リテラル
a='a';
エスケープ文字
→引用符や制御文字を扱う
→コンソール出力
\n
\b
\a
\’
改行
バックスペース
beep
’文字
\(バックスラッシュ)は端末に
よっては¥に見えるが同一文字
文字列リテラル
である。
"Hello, world.\n"
"123" ='1'+'2'+'3'+'\0'
32
演算子(1) (3.7)
• 算術演算子
+ 加算
/ 除算
- 減算
% 除算の余り
* 乗算
= 代入
記述例
a=a+1;
b=c%d;
• 代入演算子
e1=e2; e1をe2に代入
e1+=e2; e1+e2をe1に代入
e1-=e2; e1-e2をe1に代入
e1*=e2; e1*e2をe1に代入
e1/=e2; e1/e2をe1に代入
e1%=e2; e1%e2をe1に代入
33
第1回目の演習問題
1. 2.1-2.9の演習問題はすべて行っておくことを原則とするが、
提出は各自が最後に行った2問だけでよい。
レポートには、プログラムリストを添付し、何を行ったら何が
起きたのか、それが所望の動作だったかどうか、などを記
すこと。さらに今回は、コンピュータに関する知識の有無や、
この授業に何を期待するかを書くこと。
34