] > Fair Copy(2), C

第 7 回 清書(2), C

本日の内容


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

7-1. 清書(2)TeX, pLateX(1)

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

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

(p)LaTeX の基本的な仕様

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

LaTeX の文書は拡張子 .tex のテキストファイルで作成します。 a.tex というファイルが出来たら 「platex a.tex」 を行います。 すると a.dvi という出力ファイルが出来ます。 dviout a.dvi で作成された文書を画面に表示できます。 dviout で印刷もできます。 一方、作成した文書は Postscript ファイルとして出力できます。 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 では文章をそのまま書くと、そのまま文章として扱われます。 但し、連続した空白や一つの改行は一つの空白として扱われます。さらに日本 語では改行や空白は無視されます。

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

文章の構造

文章には次のような構造があります。
  1. 段落
  2. 見出し
  3. 箇条書

これらの構造をマークアップする方法について説明します。

段落

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

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

例7-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 を使 用しないと連番表示は自動的にはできません。

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

例7-3

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

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

  1. 内容 1
  2. 内容 2

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

例7-4

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

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

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

例7-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 + 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) 処理をすることを指定しています。c の代わりに左寄せ(l)、右寄せ(r)を指定 できます。そして左上の要素から右へ要素を & で区切って書きます。 一つの行が終ったら \\ を記入し、次の行をまた左から書いていきます。 なお、角カッコで括るには \left[ と \right] で、絶対値など縦棒で括る時 は \left| と \right| で、中カッコで括るには \left\{ と \right\} としま す。対応するカッコがない場合も、 \left. や \right. となにも表示しない指 定をして \left と \right の対応をとる必要があります。
\cdots で中央に点を三つ、 \ldots で下に点を三つ、 \vdots で縦に点 を三つ打ちます。

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

演習7-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

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

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

表紙

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

例7-7

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

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

演習7-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 ファイルを作りなさい。

7-2. コマンドプロンプトの使い方

特殊キー

Ctrl+C を押すと、実行しているプログラムが停止します。 プログラムミスなどによりプログラムが止まらなくなった場合は、まず Ctrl-C を押してみてください。

また、 Ctrl-S を押すと画面の表示が止まってしまうことがあります。 その時はもう一度 Ctrl-S を押して下さい。

カットバッファ関連

他のアプリケーションに表示されている文字列の入力

  1. 他のアプリケーションで「編集→コピー」などの操作で文字列をカットバッ ファにコピーする
  2. コマンドプロンプトの上のバーを右クリックして、「編集→貼り付け」

コマンドプロンプト上の文字のコピー

  1. コマンドプロンプトの上のバーを右クリックして、「編集→範囲指定」
  2. 指定したい範囲をポインターでドラッグ
  3. コマンドプロンプトの上のバーを右クリックして、「編集→コピー」

再入力

直前に入力したコマンドは F3 キーで再入力できます。 ひと文字ずつ入力するには F1 キーを押します(F2, F4, INS, DEL キーも再入 力のための機能を持ちますが、ここでは省略します)。 また、Windows 2000 や Windows XP では上下矢印による、過去の入力の順次 呼びだし、左右矢印による入力行の編集などもできます。

さまざまなコマンド

コマンドプロンプト(MS-DOSプロンプト)では、コマンド文字列の入力により、 さまざまな指示が出せます。

cd
カレントディレクトリの表示
cd ディレクトリパス
カレントディレクトリの変更
dir
カレントディレクトリに含まれているファイルやディレクトリの表示
dir /p
カレントディレクトリに含まれているファイルやディレクトリの表示 (量が多い場合、一画面ごとに表示が止まる)
type ファイル名
テキストファイルの表示
more < ファイル名
テキストファイルの表示 (量が多い場合、一画面ごとに表示が止まる)
del ファイル名
ファイルの消去(復元はできません)
ren 旧ファイル名 新ファイル名
ファイル名の変更
move ファイル名 転送先
ファイルの移動
copy ファイル名 転送先
ファイルのコピー
mkdir ディレクトリ名
ディレクトリの作成
rmdir ディレクトリ名
ディレクトリの消去(ディレクトリ内が空でないと実行できません)
ver
OS のバージョン番号の表示
echo 文字列
文字列の表示

演習7-3

次の指示に従ってコマンドを入れなさい。

  1. カレントディレクトリを c:\work にする。
  2. ディレクトリの内容を表示する。
  3. Meadow で、 c:\work の中に test.txt というファイル名のファイルを作 る。ファイルの中身は「abc」など適当に決める。
  4. ディレクトリの内容を表示する。
  5. test.txt の内容を画面に表示する。
  6. c:\work\a というディレクトリを作る。
  7. test.txt を c:\work\a に移動して、 c:\work, c:\work\a のそれぞ れの内容を確認して、移動が正しく行われたかどうかを確認する。
  8. カレントディレクトリを c:\work\a に変更する。
  9. test.txt を消す。
  10. ディレクトリ a を消す。
ヒント
  1. cd c:\work
  2. dir
  3. Meadow で「Files → Open File...」を選択し、 test.txt を入力する (正しくインストールされている場合、デフォルトで c:\work の下にファイル が作られる)。 そして、「abc」などを打ち、「Files → Save Buffer」で保存する。
  4. 再びdir。 test.txt というファイルができている。
  5. type test.txt。先ほど Meadow で入力された文字が表示され れば良い。
  6. mkdir a
  7. move test.txt a をした後、dir で test.txt が存在せず、 dir aで test.txt が存在することを確認する。
  8. cd a
  9. del test.txt
  10. cd .. で親ディレクトリ(c:\work)に戻った後、rmdir a でディレクトリを消す。

7-3. C 言語の基礎

Cの構文

前回次のようなプログラムを扱いました。

/* This program prints "Hello World!". */
#include <stdio.h>
main(){
  printf("Hello World!\n");
}

これから、このようなプログラムの実際の意味を少しずつ学習していきます。 C 言語には次のような基本的な構文があります。

  1. /* と */ で囲まれた部分にはメモを書くことができる。
  2. # で始まる行がある。
  3. 中括弧 「{ }」 の間に文を書く。
  4. プログラムは文の組合せにより書かれる。各文の最後にセミコロン「;」を必ず置く。
  5. 計算式の括弧は丸括弧「( )」のみを使用する。
  6. main() や printf(...) のように丸括弧は別の用途(関数の表現)がある。

変数

コンピュータはデータをメモリーに記憶することができます。 表計算ではセルの中に様々なデータを入れることが出来ました。基本的にはセ ルの名前は A1, B2 など縦横の位置で指定していました。 一方、プログラミング言語の多くでは、これを行うのに変数と呼 ばれる概念を使います。 C 言語も変数を使えますが、 C 言語では一つの変数に様々なデータを入れることは できません。 それはという考え方があるからです。 プログラムの最初に変数の型を決めたら、その変数には同じ型のデータの出し 入れしか出来ず、他の型のデータは扱えません。 型には次のものがあります。

int
整数型
float
単精度浮動小数点数(実数型)
double
倍精度浮動小数点数(高精度実数型)
char
文字型

変数は a、 hensu など名前をつけて指定します。 C 言語ではプログラムの先頭で、使用する変数の型と名前を登録する必要があ ります(プログラムの途中ではできません)。 これを宣言文と言います。 宣言文はつぎのような構文になります。

型名 変数名1[, 変数名2[, 変数名3 ...]]

例えば単精度浮動小数点型の変数として、 a, b, x の三つの変数名を使う場 合は次のように宣言します。

float a,b,x;

変数の名前は先頭が英字、二文字目以降は英字または数字でなければなりませ ん。a, bb, c123 は変数名として使えます が、1a, a-b-c などは変数名として使用できません。 また、 C 言語では、一つの名前ではひとつのものしか指せません。 a という名前の変数を整数型で宣言したら、再度文字型で使用する ことはできません(cf. オブジェクト指向言語の関数名などは複数の型を取る ことが可能。BASIC 言語は同じ名前でも各型ごとに別々の値を持つことが可能)。 但し、変数名の大文字と小文字は区別しますので、 a と A は別の変数名にな ります。

データを変数に記憶させるには代入文を使います。

変数名 = 式

  a    =  2;
  b    = a+3;

変数名は必ず左辺に来ます。また、式が計算されてから変数に代入されます。 従って次のような代入文を書くことも可能です。

  i = i+1;
  j = 2*j;

この場合それぞれ、 i の内容は 1 増えて(i+1 の結果が i に代入される)、j の内容は 2 倍されます( 2*j の結果が j に代入される)。

整数型

整数を扱う型は整数型(int)と言います。 プログラム中に整数のデータを書く時は、通常の数字の記述法と同じになりま す(位取りのカンマは使用できません)。 なお、二進数、八進数、十六進数などの記入法もありますが、省略します。

int i;
i=2;

文字型

文字型(char)の変数は一文字のみを記憶します。 後で出てくる配列を利用すると、文字列を表すことができます。 なお、他のプログラミング言語では大抵文字列型を取り扱うことができます。

プログラム中に文字データを書く場合は'a'など、シングルクォー テーションマーク「'」を使用します。 改行は '\n' で表します。 また、シングルクォーテーションマーク「'」、ダブルクォーテーションマー ク「"」、バックスラッシュ(円記号)「\」、疑問符「?」はそれぞれ、'\'', '\"', '\\', '\?' で表します。

char a,b;
a='a';
b='\n';

浮動小数点型

浮動小数点型(float, double)は、数値計算など実数を使用するよう な計算に用います。 但し、真の意味での実数は取り扱えず、有限の桁の精度しかありません。 float に対して double は二倍の計算精度があります。

浮動小数点数のデータは、通常小数点を含む数の表記で表します。 また、 0.3×10-3のようなデータは 0.3e-3 と表します。

float x;
double y;
x=3.14;
y=0.1e-5;

表計算とC 言語の比較

表計算C 言語
宣言不要必要
入れられる値の型自由宣言した型一種類
計算法一つの式、自動再計算手順を自由に指示
入力セルに値を入れる、または式値の代入
出力常に出力printf 関数を使用する

表計算でもセルに名前をつけて変数名のように扱う事もできます。

演習7-4

次の式を正しく計算するためには どのような宣言文が必要か答えなさい。

  1. initial = 'D';
  2. menseki = hankei * hankei * 3.141592;
  3. page = 3;

外部関数

計算式を書く時、三角関数や平方根など、既に用意されている関数を使用する ことができます。 C 言語で使用できる主な数学的関数にはつぎのものがあります。

sqrt(x)
xの正の平方根を求めます。xの値が負の場合、エ ラーを示す特別な値が返ります。

例:

a=sqrt(b*2);

sin(x)
sin x の値を求めます。xの単位はラジアンです。
cos(x)
cos x の値を求めます。xの単位はラジアンです。
tan(x)
tan x の値を求めます。xの単位はラジアンです。
exp(x)
exの値を求めます。
log(x)
log xの値を求めます。xの値が0や負の場合エラー を示す特別な値が返ります。
pow(x,y)
xy の値を求めます。xy の値によりエラーが発生する場合、エラーを示す特別な値が 返ります。

なお、これらの関数を使用する場合、プログラムの先頭に次の行を書く必要が あります。

#include <math.h>

またこれらの関数の返す値の型は double です。但し、変数に float 型を使 用しても精度が低くなる他は問題ありません。

printf

printfは画面(標準出力)に文字を書く命令です。 次のような書式になっています。

printf(フォーマットを示す文字列 [, 変数1 [, 変数2 [, 変数3 ...]]])

「フォーマットを示す文字列」に通常の文字列を入れるとそのままの文字列が 出力されます。 但し、 % 記号だけは特別な働きをします。 % と英字の組合せを入れると、最初の %+英 字が変数1 の値に、二番目の %+英字が変数2 の値にと、順に変数の値と置 き換わります。 %と英字の組合せには次のものがあります。

%d
整数
%f
実数
%c
文字

その他、 %s,%o, %x, %u, %e, %g, %p などありますが、ここでは特に取り上げま せん。 % を表示したい時は %% と記入します。

「フォーマットを示す文字列」はダブルクォーテーションマーク「" "」で括 ります。文字列そのものは次回以降の講義で取りあげます。

なお、「%4.2f」など % と英字の間に数を入れると、「最小幅 4 桁、小数点 以下 2 桁」など表示する書式を表すことができます。詳しくは専門書を参照し てください。

例7-8

次のプログラムを実行すると画面に「変数 x の値は 3 です。」と表示され、 改行されます。

#include <stdio.h>
main(){
  int x;
  x=3;
  printf("変数 x の値は %d です。\n",x);
}

演習7-5

次のプログラムの最後に printf 文を書き、すべての変数の内容を表示させな さい。

#include <stdio.h>
main(){
  int x;
  double y;
  char z;
  x=1;
  y=3.141592;
  z='a';
  /* ここに printf 文を書き、変数の内容を表示させる */
}

演習7-6

一次方程式 ax+b=0 を解くプログラムを作成しましょ う。 あらかじめ、 ab の値は分かっているとして、プロ グラムの中に埋め込みます。 そして、解は -b/a で求めます。 このようなプログラムは次のようになります。

#include <stdio.h>
main(){
  float a,b,x;
  a=10.0;
  b=20.0;
  x=-b/a;
  printf("%f x + %f = 0 の解は %f\n",a,b,x);
}

このプログラムを使って次の方程式の解を求めなさい。

  1. 3x-6=0
  2. 2x+10=0
  3. 4x+2=0

演習7-7

次の連立方程式を解くプログラムを作りなさい(ad-bc≠0 とする)。

{ ax + by = e cx + dy = f

できたプログラムで次の方程式を解きなさい。

  1. { x - y = 0 x + y = 2
  2. { 2x - 5y = -5 4x + 10y = 14
  3. { 2x - y = -1 4x + y = 10

演習7-8

直角三角形の直角をはさむ辺の長さ a, b が与えられ た時、斜辺の長さ c を求めるプログラムを書きなさい。

そして次の辺の組に対して、斜辺の長さを求めなさい。

  1. 34
  2. 512
  3. 11

演習7-9

三辺の長さが与えられた時、三角形の面積を求めるプログラムを作りなさい。 そして次の三辺を持つ三角形の面積を求めなさい。

  1. 345
  2. 112
  3. 123
  4. 222
ヒント1

三角形に垂線を引き、三平方の定理から連立方程式を立て、高さを求める。

三角形に垂線を引く
ヒント2

余弦定理を使って公式を導く(ヘロンの公式)


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