第 6 回 清書(2)、C コンパイラ

本日の内容


このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。

6-1. エクスプローラの設定変更

MS-Windows では、ファイル名の最後にファイルの 属性に関する記号として、ピリオドに続き 3 文字以内の 文字を付加してファイルの管理をします。 これを拡張子と言います。 しかし、初期設定時には拡張子が見えないように設定されています。 一方、 MS-Windows では、システムに関わるが一般ユーザに関係ないファイル を表示しないようになっています。 これらの機能は、特定の業務をこなすだけで様々なファイルを作成しないユー ザーにとっては有用です。 しかし、プログラミングをしたり、様々なファイル形式を取り扱う立場では拡張子 を意識しないといけないので、基本的には全ての情報は隠されない方が望まし いです。 そこで、次の手順でエクスプローラの設定を変更します。

  1. 「スタート」を右クリックして「エクスプローラ」を選択します。
  2. フォルダオプションの設定例 「ツール」→「フォルダオプション」を選択します。
  3. 「表示」タブを選びます。
  4. 「ファイルとフォルダの表示」では「すべてのファイルとフォルダを表示 する」を選び、「登録されている拡張子は表示しない」のチェックを外します。
  5. 「すべてのフォルダに適用」を押します。

6-2. 清書(2)TeX, pLaTeX(1)

今回はコンピュータで行う清書のうち、マークアップ言語 pLaTeX による清書 を取り上げます。 Knuth は TeX(テックまたはテフ) を開発し、 Lamport はそれを改良した LaTeX を作りました。ASCII 社はそれを日本語化(縦書き可能に)した pLaTeX を作りました。 HTML と比較した pLaTeX の特徴としては次のようなことが挙げられます。

  1. 自由に数式を表現できる
  2. 章番号などを自動的に生成できる
  3. 番号の参照を自動的に行える
  4. 目次や索引を自動的に扱える
  5. マクロ機能がある

TeX とその派生である LaTeX, pLaTeX などを全て指す時、曖昧さがない場合 単に TeX と呼びます。 また pLaTeX も LaTeX も使い方はほとんど同じなので、pLaTeX の説明におい ても、LaTeX と共通の部分を指す時は LaTeX と呼ぶことがあります。

(p)LaTeX の基本的な仕様

TeX パッケージ(pLaTeX システムを含む)を ソフトウェア のページの指示に従ってインストールします。 pLaTeX システムは基本的にはコマンドプロンプトで使用します。 c:\work にインストールされる starttex.bat を開くと TeX を利用できる コマンドプロンプトが起動します。

(p)LaTeX の文書は拡張子 .tex のテキストファイルで作成します。 a.tex というファイルに対して 「platex a.tex」 を行うと、 a.dvi という出力ファイルが出来ます。 できた dvi ファイルに対して dviout a.dvi で作成された文書 を画面に表示できます。この dviout で印刷もできます。 一方、作成した文書は Postscript ファイルとして出力できます。 dvi ファイルに対して dvipsk dviファイル名 とします。 さらに PDF ファイルにする場合は dvipdfmx dviファイル名とします。

LaTeX は HTML と同じように最初にパラメータを設定するために、本 文を書き始める前に設定用のコマンドを書く必要があります。 コマンドは「\(バックスラッシュ)」で始めます (日本語の MS-DOS や Windows では「¥(円記号)」に文字化けします)。

設定の雛型

ここでは LaTeX の文書ファイルに必要な設定の基本的な書き方を説明します。 ここでは、最低限次のようなことを書く必要があります。

  1. 文書の形式の指定(日本語の文書なら jarticle を指定する)
  2. 本文の始まりを指定する。
  3. (本文を書く)
  4. 本文の終了を指定する。

これは実際には次のようにします。


\documentclass{jarticle}
\begin{document}
ここに本文を書く
\end{document}

これに、フォントの大きさの指定と、用紙の指定を加えると次のようになります。


\documentclass[12pt]{jarticle}
\usepackage{vmargin}
\setpapersize{A4}
\setmarginsrb{20mm}{20mm}{20mm}{20mm}{5mm}{5mm}{5mm}{5mm}
\begin{document}
ここに本文を書く
\end{document}

なお、jarticle の代わりに jbook を指定すると本のモードになります。章立 ては chapter, section などを使います。

文章の構造

LaTeX も HTML 同様に文章の抽象的な構造に対して、マークアップを指定しま す。 とりあず以下の基本の構造について説明|します。!|

  1. 段落
  2. 見出し
  3. 箇条書

その後、数式など LaTeX で特徴的な機能を説明して行きます。

本文、段落

LaTeX では文章をそのまま書くと、そのまま文章として扱われます。 但し、連続した空白や一つの改行は一つの空白として扱われます。さらに日本 語では改行や空白は無視されます。

なお % を書くとそれ以降の入力は無視されますので、ここには本文に出さな いコメントを書き込むことが出来ます。 他に #, $, & は特殊記号として使用します。 従って、 \ を表示させるには \backslash、% を表示させるには \%、 # を表 示させるには \#、 $ を表示させるには \$、& を表示させるには \& と書く必要があります。

本文において、段落と段落の区切りは空行で行います。 また、段落の最初の部分は字下げされます。

なお、 HTML では段落は p エレメント、つまり <p> と </p> で 内容を囲みます。

例6-1


\documentclass[12pt]{jarticle}
\usepackage{vmargin}
\setpapersize{A4}
\setmarginsrb{20mm}{20mm}{20mm}{20mm}{5mm}{5mm}{5mm}{5mm}
\begin{document}
これは第一段落です。

これは第二段落です。
単なる改行は連続した文と見なされます。

これは第三段落です。
\end{document}

見出し

文書の種類を jarticle に指定した場合、\section{表題}で番号付の表題が表 示されます。 小さい節に区切るには \subsection{表題} や \subsubsection{表題} が使え ます。 番号を付けたくない時は \section*{表題} と * を付けます。

HTML では H1, H2, ... エレメントがこれに対応します。 なお、 LaTeX は 自動的に連番の表示ができます (HTML では CSS で content, counter を使用して連番表示はできますが、ほ とんどのブラウザで対応していません)。

例6-2


\documentclass[12pt]{jarticle}
\usepackage{vmargin}
\setpapersize{A4}
\setmarginsrb{20mm}{20mm}{20mm}{20mm}{5mm}{5mm}{5mm}{5mm}
\begin{document}
\section{はじめに}
これは第一章です。
\subsection{概略}
第一章第一節の内容を書きます。
\subsection{問題点}
第一章第二節の内容を書きます。

\section{背景}
これは第二章です。
\end{document}

箇条書

LaTeX では箇条書は三種類用意されています。 通し番号を自動的につけるもの、それぞれの項目の頭に同じマークをつけるも の、項目名を指定するものがあります。

例6-3


\begin{enumerate}
\item 内容 1
\item 内容 2
\end{enumerate}

とすると、次のようになります。

  1. 内容 1
  2. 内容 2

なお HTML では ol エレメントが対応します。

例6-4


\begin{itemize}
\item 内容 1
\item 内容 2
\end{itemize}

とすると、次のようになります。

なお HTML では ul エレメントが対応します。

例6-5


\begin{description}
\item[内容 1]内容 1 の説明
\item[内容 2]内容 2 の説明
\end{description}

とすると、次のようになります。

内容 1
内容 1 の説明
内容 2
内容 2 の説明

なお HTML では dl エレメントが対応します。

数式

LaTeX では数式モードが二種類あります。 文章中に本文の中に他の文字と同じように入れるテキストモード と、行を改めて本文と分離するディスプレイモードがあります。 テキストモードでは数式を $x+y=z$ のように $ 記号で括ります。 一方、ディスプレイモードでは $$x+y=z$$ と $$ 記号で括ります。 $ で括る代わりに \( と \) が、 $$ で括る代わりに \[ と \] が使えます。

数式モードにおける基本となる式の書き方は次の通りです。

変数 x,y
x y などそのまま書けば斜字体で表示されます。
上付文字 xy+z
x^{y + z} など ^ と { } を使用します。
下付文字 xy+z
x_{y + z} など _ と { } を使用します。
分数 分子分母
\frac{分子}{分母}とします。
一般の関数
\sin \log などバックスラッシュを先頭につけるとローマン体で表示され ます。
α、πなどのギリシャ文字。無限大 ∞、±、≠、≦、≧ 。
\alpha, \pi など。無限大∞は \infty 、± は \pm 、≠ は \neq 、≦ は \leq 、≧ は \geq です。
平方根
\sqrt{根号の中身} とします。三乗根などは \sqrt[3]{根号の中身} など とします。
Σ、∫
\sum_{下側の式}^{上側の式}、 \int_{下側の式}^{上側の式}
行列
次の行列を表示するには \left( \begin{array}{ccc}a_{1,1} & a_{1,2} & a_{1,3} \\ a_{2,1} & a_{2,2} & a_{2,3} \end{array} \right) とします。
( a1,1 a1,2 a1,3 a2,1 a2,2 a2,3 )
行列を囲む大きい丸カッコは \left( と \right) です。 行列の定義の中の {ccc} は、 c が一つの列を表現するため、ccc で三つの列を持つことを表し、さらにそれ ぞれの列はセンタリング(c)処理をすることを指定しています。c の代わりに 左寄せ(l)、右寄せ(r)を指定できます。 そして左上の要素から右へ要素を & で区切って書きます。 一つの行が終ったら \\ を記入し、次の行をまた左から書いていきます。 なお、角カッコで括るには \left[ と \right] で、絶対値など縦棒で括る時 は \left| と \right| で、中カッコで括るには \left\{ と \right\} としま す。対応するカッコがない場合も、 \left. や \right. となにも表示しない指 定をして \left と \right の対応をとる必要があります。
\cdots で中央に点を三つ、 \ldots で下に点を三つ、 \vdots で縦に点 を三つ打ちます。

例6-6

$ax^2+bx+c=0$

ax2 + bx + c = 0

\[ F(x)=\frac{a_0}{2}+\sum_{n=1}^{\infty}\left[ a_{n} \cos 2 \pi n \frac{x}{p} + b_{n}\sin 2 \pi n \frac{x}{p}\right]\]

Fx = a02 + n=1 an cos 2 π n xp + bn sin 2 π n xp

\[\int \frac{dx}{\sqrt{a^{2}-x^{2}}} = \sin^{-1}\frac{x}{|a|}\]

x a2 - x2 = sin-1 x a

\[\left( \begin{array}{cc}a & 0 \\ 0 & b \end{array}\right)^{n} = \left( \begin{array}{cc}a^{n} & 0 \\ 0 & b^{n} \end{array}\right)\]

a0 0b n = an0 0bn

表の作り方は行列とほぼ同じです。 さらに罫線を指定できますが、指定の仕方は縦と 横で異なります。 縦線は表の列数を定義する部分に|を書きます。 横線は \hline コマンドを使用します。

\begin{tabular}{|l|c|r|}
\hline
第一行一項&第一行二項&第一行三項\\
\hline
第二行一項&第二行二項&第二行三項\\
\hline
第三行一項&第三行二項&第三行三項\\
\hline
\end{tabular}

表紙

表紙を作るには、題名、作者、日付を指定します。 日付の指定を省略すると、 dvi ファイルを作成した日付が表示されます。 日付を表示させないためには \date{} と空の日付を設定します。

例6-7

\author{坂本直志}
\title{コンピュータ基礎及び演習 I}
\maketitle

また、ページを変えるには \clearpage コマンドを使用します。

6-3. C言語とは

機械語

コンピュータは CPU がメモリ上のプログラムを読んで実行することで動作し ます。 CPU が実行できるプログラムを「オブジェクトコード」と呼びます。 オブジェクトコードを書くためのルールを「機械語」と言います。 機械語はコンピュータが解釈するため、0 と 1 の組合せ(2進法)により記述さ れます。 機械語を使って人間が直接プログラムするのに、直接二進数で表された数一つ 一つに対して割り当てられた機能を対応させて覚えるのは大変です。 そこで、各二進数の列に割り当てられた機能に対応するような覚えやすい記号 (mnemonic ニーモニック)を割り振ってプログラムを組み、完成したニーモニッ クによるプログラムに対して、後でそれを 0 と 1 の列に変換します。 たとえば00000001 11011000という列は「AX レジスタに BX レジスタの値を 足す」という命令ですが、これに ADD AX,BX という記号を割り当 てます。 そして、プログラムを組む時は一旦 ADD AX,BX と記述しておき、 プログラムが完成した時にこの部分を00000001 11011000に戻すこ とで機械語のプログラムを完成させます。 このように CPU の機能に対応したニモニックを用いたプログラミングのルー ルを アセンブリ言語 と言います。 そしてアセンブリ言語で作られたプログラムを機械語にする作業をアセ ンブルと言います。 人間でも機械語に直せますが(これをハンドアセンブルと言います)、 もちろんコンピュータのプログラムでも直せます。 記号を機械語に直すプログラムをアセンブラと言います。

高級言語

アセンブリ言語でプログラムを書く際、次のようなことが問題になります。

  1. CPU の仕組みを知らないと書くことができない
  2. コンピュータのハードウェアの構成を理解し、メモリやプログラムの管理 を自分でしなければならない
  3. 特定のことをさせる時、毎回複数の同じ手順が必要になる場合がある
  4. そもそも CPU の計算のし方と、人間の計算のし方が違う

このような問題点を解決するために、(1)機械語とは直接関係ない人間の記述しや すい記述法でプログラムを書き、(2)それをコンピュータが理解する仕組みを 実現する必要があります。

高級言語

機械語とは直接関係ない人間の記述しやすい記述法を高級言語と 言います。 代表的な高級言語には次のようなものがあります。

本講義では次のような理由から C 言語を学習します。

  1. インターネットなどでもっとも利用されている
  2. Java, Perl など C を基にした言語は多数あるので、他の言語を学習する 際の基礎になる
  3. コンピュータの動作原理と言語仕様がよく対応しているため、 OS や組み 込み系などハードウェアのコントロールに役立つ。

処理系

高級言語をコンピュータに理解させるプログラムを処理系と言います。 処理系には二種類あります。

解釈系(インタプリタ)

高級言語で書かれたプログラムを読んで解釈しながら動作するプログラムを インタプリタと言います。 代表的なインタプリタは BASIC, LISP, Prolog, Perl などがあります。 インタプリタの長所は、複雑で高度な機能を持ち、開発時に部分的にプログラ ムを実行できるなど、開発コストが低い事があげられます。 一方短所は、完成したプログラムを実行するにも常にインタプリタ自身が必要であ り、また実行速度が遅い事が挙げられます。

翻訳系(コンパイラ)

高級言語で書かれたプログラムを機械語に翻訳するプログラムをコンパイ ラと言います。 翻訳前の高級言語で書かれたプログラムをソースプログラム原始プログラムと呼び、翻訳されたプログラムをオブジェク トプログラムと言います。 コンパイラの長所は、直接コンピュータが実行できるプログラムを作成できる 事と、実行速度がインタプリタと比較して速い事が挙げられます。 一方短所はプログラム中に一箇所でも誤りがあるとプログラムを実行できない ため、開発コストがかかる(工夫しなければならない)ことが挙げられます。 但し、これは対策が可能で、しかも慣れればそれほど苦にならなくなります。

6-4. MinGW プロジェクトとGCC

MinGW プロジェクトとは

MinGW プロジェクトでは GNU のフリーソフトウェアとして Windows 上の開発 環境を開発しています。 MinGW に含まれるプログラムのライセンスは GPL に従いますが、コンパイラ が出力するプログラムはマイクロソフトのライブラリを使用します。 したがって MinGW を利用して開発したソフトウェアには GPL のプログラムを 付属させる必要がないので、 GPL 以外のライセンスでも公開できます。 MinGW には gcc などのコンパイラの他にデバッガやアセンブラも含まれています。

Cygwin も Windows 上の開発環境ですが、 UNIX との互換性を高めるため、 GPL ライセンスのライブラリを使用します。 Cygwin では UNIX 用のプログラムが簡単に動きますが、公開する際は GPL ラ イセンスに基づき、自由なコピーを認め、ソースコードを提供する必要があり ます。

インストール

本講義では C言語のコンパイラを使用します。 始めに MinGW-jp をインストールして下さい。

  1. MinGW-jp を授業用サーバーからダウンロードする
  2. lhasa で解凍したものを c:\ に移動する。
  3. 起動用バッチファイル mingw-jp.bat をデスクトップ上にダウンロードす る。

インストールした MinGW を使用するには、 起動用バッチファイル mingw-jp.bat を開きます。

このパッケージをインストールすることで利用できるコマンドは次の通りです。 (c:\mingw-jp\bin )

gcc:
C コンパイラ(構造型言語)
g++,c++:
C++ コンパイラ(オブジェクト指向言語)
as:
アセンブラ
windres:
Windows 用のリソースコンパイラ

gcc の使い方

本講義では、次のようにしてプログラムを作成、実行させます。

  1. Meadow などのテキストエディタで XXX.c という名前のソースファイルを 作る(例えばファイル名 test.c など)。
  2. 起動用バッチファイル mingw-jp.bat を開くことで出るコマンドプロンプトで gcc にソースファイルを読ませ、オブジェクトコードを作る。
    gcc test.c
    
  3. a.exe というオブジェクトコードができるので、それを次のようにして実 行する。
    .\a.exe
    

プログラムの作成とコンパイル、実行

例6-8

次のプログラムを作り、コンパイルして実行するまでの手順を示します。

/* This program prints "Hello World!". */
#include <stdio.h>
main(){
  printf("Hello World!\n");
}
  1. Meadow で「Files → Open File」を選び、 hello.c というファイル名を 指定します(ファイル名は最後に .c がつけば hello.c でなくても良い)。
  2. ブラウザ上で上のプログラムをマウスでドラッグし、「編集→コピー」を 選びます。 そして、 Meadow の画面で「Edit → Paste」を選び、プログラムをコピーし ます。
  3. Meadow で「Files → Save Buffer」を選びセーブします。
  4. mingw-jp.bat を開いてコマンドプロンプトを動かします。
  5. gcc hello.cと打つと、 hello.c というプログラムがコンパ イルされ、オブジェクトファイル a.exe ができます。 ここでエラーが出た場合は、エラーの内容を良く読んで対処して下さい。
  6. .\a.exe と打つとプログラムが実行されます。

6-5. 付録

練習問題

演習6-1

次の数式を LaTeX で記述しなさい。

  1. 2 = 1+ 1 2+ 1 2+ 1 2+...
  2. ft = t 0 t fx x
  3. ab cd -1 = 1 ad- bc d-b -ca

演習6-2

  1. 次の内容を Meadow にコピーし、c:\work\test.tex というファイル 名で保存しなさい。
    \documentclass[12pt]{jarticle}
    \usepackage{vmargin}
    \setpapersize{A4}
    \setmarginsrb{20mm}{20mm}{20mm}{20mm}{5mm}{5mm}{5mm}{5mm}
    \begin{document}
    \author{05kc999 名無しの権兵衛}
    \title{\LaTeX\ のテスト}
    \maketitle
    \clearpage
    \section{レポート課題}
    方程式 $ax^{2}+bx+c=0$ の解を求める表計算シートを作成しなさい。
    \section{問題の解説}
    $ax^{2}+bx+c=0$ は 
    $a\neq 0$ の時は二次方程式として解ける。
    $D=b^{2}-4ac$ とした時、解は次の式により与えられる。
    \[
    x = \frac{-b\pm\sqrt{D}}{2a}
    \]
    $D$ は根号の中に入るので、$x$ を実数の範囲で求める場合、$D$ の符号によ
    り解の存在条件が異なる。
    
    一方、$a=0$ の時は二次式ではない。その時、$bx+c=0$ となり、さらに $b$
    が $0$ と等しいか否かで解の存在条件が異なってくる。
    \section{考え方}
    出題された問題は次の手順を追って解く。
    \begin{enumerate}
    \item $a\neq 0$ の時の処理
    \begin{enumerate}
    \item 判別式の計算
    \item 判別式の値による処理
    \end{enumerate}
    \item ($a=0$ の時の処理)
    \item $b\neq 0$ の時の処理
    \item $b=0$ の時の処理
    \end{enumerate}
    
    \section*{付録}
    作成したシートの内容は以下の通りである。
    
    \begin{tabular}{|l|l|l|l|l|l|l|}
    \hline
    & A & B & C & D & E & F \\
    \hline
    1& 'a & 'b & 'c & 'D & 'x & \\
    \hline
    2& 10 & 20 & 30 & =B2*B2-4*A2*C2 & =(-B2+sqrt(D2))/2/A2 & =(-B2-sqrt(D2))/2/A2 \\
    \hline
    \end{tabular}
    \end{document}
    
  2. platex を使用して、上の内容を画面に表示しなさい。
  3. 上記の内容で作者の名前などを変更して、変更結果を表示しなさい。
  4. dvipdfmx を使用して PDF ファイルを作りなさい。

演習6-3

リンク先のサンプルファイル を保存し、次の修正 を加えなさい。。

  1. IT(情報技術)を IT(情報通信技術) に替えなさい(外国では ICT と言うらしい です)。
  2. 箇条書の中に第三項として以下の文章を加えなさい。残りの 箇条書の部分の番号は順にずらしなさい。
    3. 東京電機大学創立以来の『実学の精神』を尊重
  3. 既にあるコンテンツと同じ効果になるように、以下の内容を付け加えなさい。
    見出し
    学科構成
    本文
    情報通信工学科には、以下の学科が設置されております。
    箇条書
    • 工学部第一部 情報通信工学科(昼間部)
    • 工学部第二部 情報通信工学科(夜間部)

演習6-4

例6-8のプログラムを改造して、「Hello New World!」を表示するプログラムを 作りなさい。

演習6-5

次のプログラムをコンパイル、実行しなさい。

#include <windows.h>

int WINAPI WinMain(HINSTANCE progIns, HINSTANCE prevIns, LPTSTR cmdLine, int cmdShow)
{
    MessageBox(NULL, TEXT("Hello World!"), TEXT("Hello"), MB_OK);
    return 0;
}

演習6-6

演習6-5を改造して、画面に「Hello New World!」が表示されるようにしな さい。

演習6-7

次のプログラムを読んで、このプログラムが何をするか予想しなさい。 そして、プログラムをコンパイル、実行して、予想と一致するか調べなさい。

#include <stdio.h>
main()
{
  float a,b,c;
  a=2.0; b=3.0;
  c= a+b;
  printf("a=%f  b=%f a+b=%f\n",a,b,c);
}

演習6-8

演習6-7を改造して、a=5, b=2 に関して a+b, a-b, a*b, a/b をそれぞれ求めなさい。


坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科