] > Fair Copy(3), if sentence

第 8 回 清書(3), if文

本日の内容


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

8-1. ドローソフト

ドローソフトとは線、円などの図形の組合せで画像ファイルを作るソフトウェ アです。 Gimp などのペイントソフトと異なり、 ドローソフトでは作成した画像ファイルは拡大縮小を行っても線の滑らかさが 失われません。 したがって、高解像度が必要な印刷に向いています。 ドローソフトで図形の組合せにより画像ファイルを作ります。 そのため、一旦作成した画像ファイルに対しても、図形を図形として修正す ることが出来ます。例えば描画した円だけを後で拡大したり変形したりすることが できます。 又、特に文字の修正は便利です。 ペイントソフトでは作成した画像中の文字を修正しようとしても文字を表す点 の集まりになっているため、別の文字に変更するには手間がかかりました。こ れが、ドローソフトでは文字を文字として取り扱えるので、単純に文字を消し て別の文字に取り替えるだけで画像を作ることが出来ます。

ここでは、 Openoffice.org の「図形描画」を取り上げます。 これはベクタファイルである EPS ファイルを作ることができますので、 Adobe の Illustrator 形式を指定する印刷所へ入稿することができます。

なお、 CAD(Computer Aided Disign) ソフトとドローソフトは機能が似ています。 しかし、 CAD ソフトは建築や回路設計などの機能に特化しています。 そのため水平線、垂線、平行線など図形や線の揃え方などに高度な機能があっ たり、表計算ソフトと連動して使用しているオブジェクトの集計などを行った りできます。 本講義では次回、電気、電子回路網を作成し、回路のシミュレートまでできる CADソフト「Circuit Maker」を紹介します。

ドローソフトの利用法

基本操作

画面の一部(通常左側)に、ツールと呼ぶさまざまな機能を実現す るアイコンが集まっています。 これらを指定しながら図形を書きます。 通常は「選択モード」になっていて、図形の選択、移動などができるようになっ ています。 他に、四角形、円または楕円、文字、折れ線(Openoffice.org では曲線)など があります。 Openoffice.org ではこれらのアイコンに右を示す三角形が書かれています。 これはそのアイコンを左ボタンで長押ししていると選択ではなくメニュー表示 に切り替わり、円と楕円を切替えたり、折れ線と多角形を切替えたりすること ができます。

図形

四角形、円などはそれを描くツールを指定します。 画面をドラッグすると、その始点と終点に従って長方形や円を描きます。

曲線もドラッグすることでその軌跡が書かれます。 但し、軌跡を書いたあと、「編集」→「制御点」を選ぶと曲線上に選択可能な 点が現れます。 この点を選択すると点を通る線分(ハンドル)が出現します。 点自体を移動したり、削除、追加できる他、このハンドルをドラッグすること で点周辺の曲げ具合を整えることもできるます。 このような曲線をベジエ曲線と呼びます。 また、この点を折れ線の頂点とすることもできます。

なお図形を描いたあと、その図形を選択し、線種(点線)や線の太さ、色、塗り つぶしパターンなどを変更できます (あらかじめ指定しておくこともできます)。

選択

選択ツールを指定すると、図形を選択できます。 通常、ドローソフトでは選択ツールは矢印のアイコンです。 Shift キーを押しながら選択すると複数の図形を選択できます。 他に Alt キーや Ctrl キーを押すと、選択を取り消したりできます。 これらのキーの割り当てはドローソフト毎に変わることがありますので、実際 に絵を書き始める前に確認しておいた方が良いです。 なお、図形のない部分をクリック(捨てクリック)すると、全ての 選択を解除できます。 また、ほとんどのソフトウェアで Ctrl-A を押すと全てを選択で きます。

図形を選択すると、上下左右斜めの合計 8 か所に黒い点が表示されます。 点を表示させた後、黒い点以外の図形の部分をドラッグ&ドロップすると 移動します。 一方、黒い点をドラッグ&ドロップすると図形を拡大、縮小できます。 通常は縦横比を保存しません。斜めの点を使用すると縦横両方の幅、上下の点 では縦幅のみ、左右の点では横幅のみ調整できます。 Ctrl など、なにか特別なキーを押しながらす ると縦横比を保存できるものもあります。

選択した図形に対してメニューを選ぶと、線種や塗りつぶしパターンなども後 から変更できます。

文字

文字入力ツールを選択すると文字を入力できます。但し、ワープロではないの で、禁則処理(句読点や促音が行頭に来ないようにする)などはして くれないの普通です。 指定できるのはフォントの種類、字形、サイズ、左寄せや中央揃えなどです。 文字毎に指定できます。

グループ

選択したひとまとまりの図形を一つの図形として扱い、移動、コピー、拡大縮 小できます。 なお、グループで拡大縮小を行うと、含まれる文字のサイズや縦横比も変化し てしまうので注意が必要です。 文字をグループの拡大で拡大すると表示の品質が悪くなることがあります。 文字の大きさを変える時はこの機能を使わず、文字ツールを選んで文字を選択 し、メニューからフォントのサイズを指定して下さい。

配置

「変更」→「配置」を選ぶと、複数選択した図形の高さを揃えることができま す。 また 3 つ以上のオブジェクトの選択に対して「変更」→「分布」を選ぶと、 均等に並べることもできます。 なお、ソフトウェアによっては「整列」「均等配置」などと呼ぶものもありま す。 Openoffice.org では「変更」→「整列」は整列は図形の重なり具合を調整す るために使います。

なお、上端や下端を揃えたい場合、この配置の他にグリッドを使用したり、ス ナップラインを使ったりすることができます。

グリッド

「表示」→「グリッド線」を選ぶと画面に方眼を書くことができます。 そして、「位置合わせ」を指定すると、オブジェクトの座標は指定した点のそ ばの方眼上の格子点が指定されるようになります。

スナップライン

Openoffice.org では図形を揃えたい基準とする点や揃えたい基準とする線を 図形とは別に書いて指定することができます。 「挿入」→「スナップポイントとスナップラインの挿入」で座標指定すること もできますが、画面の上と左にある物差しを画面にドラッグ & ドロップ するだけでスナップラインを挿入することもできます。 スナップラインは印刷されません。

レイヤ

図形を描く領域として、透明なフィルムに対応する概念であるレイヤが あります。 このレイヤは何枚も用意できます。 図形を書き込む時、どのレイヤに書くかを指定できる他、どのレイヤを表示す るかを指定できます。 また、レイヤを重ねる順番も指定できます。 Openoffice.org では画面の左下に小さなアイコンとタブがあって、これによ りレイヤを指定することができます。

EPS ファイルの出力

作成した図形の情報はその使用しているソフトウェア固有の形式で保存します。 その一方、外部や他のソフトウェアとのやりとりのための形式で出力すること もできます。 ここでは印刷所や LaTeX で使用できる EPS 形式の出力法を説明します。

  1. 出力したい図形を選択します。
  2. 「ファイル」→「エクスポート」を選びます。
  3. ファイルの種類で EPS Encapsulated Postscript(*.eps)を選びます。
  4. ファイル名を指定して保存します。

演習8-1

コンピュータの絵を作図し、 EPS ファイルとして、 c:\work\computer.eps とい うファイル名で出力しなさい。

参考

ベジエ曲線は二点間を通る曲線の引き方で、制御点を指定するだ けで複雑な曲線を書くことができます。 n次のベジエ曲線は 始点 (x0,y0)、 制御点1 (x1,y1)、 ...、 制御点n-1 (xn-1,yn-1)、 終点 (xn,yn) とした時、曲線の軌跡は次の式で表されます。

x= i=0n xi Bn,i t y= i=0n yi Bn,i t
但し、
Bn,i t = n C i ti 1-t n-i

例8-1

点 (0,0), (1,2), (2,0) から導かれるベジエ曲線を表計算ソフトのグラフで 書くには次のようにします。

ABCDEFGHIJ
1'Combination
21
3=A2+B2
4
5'n=COUNT(B6:D6)-1
6'i00
7'x座標012'求める x座標'y座標020'求めるy座標
80=B$7*B$4*POWER($A8;B$6)
*POWER(1-$A8;$B$5-B$6)
=SUM(B8:D8) =G$7*B$4*POWER($A8;G$6)
*POWER(1-$A8;$B$5-G$6)
=SUM(G8:I8)
90.05
10↓↓
:::::: ::::
28↓↓

矢印はその方向へハンドルを動かしてコピーすることを示しています。 二つの矢印は二つの領域を指定してからハンドルを動かしてコピーすることを 示しています。 二つの数値を指定してハンドルを使ってコピーすると等差数列が生成されます。

  1. まず組合せの数を求めるため、B2 から D4 の領域にパスカルの三角形を作成します。
  2. 次に座標を格納する領域を用意します。 X 座標と Y 座標は別々に B8 からと G8 から入れます。 また X0 の上(B7)には 0, X1 の上(C7)には 1, ... y2 の 上(I7)には 2 を記入します。 B5 に =COUNT(B6:D6)-1 と X の座標の領域を指定して項数を求めます。
  3. A8 から下へ、 t の値として 0 から 1 の値を 0.05 刻に埋めます。
  4. B8 では X_0 B(2,0)(0) を計算します。 そのため、=B$7*B$4*POWER($A9;B$6)*POWER(1-$A9;$B$5-B$6) を入れます。 これを B8 から D28 の領域にコピーします。
  5. E8 に =SUM(B8:D8) を入れ、E28 までコピーします。この領域が求めるベジエ 曲線の X 座標になります。
  6. 一方、 G8 では Y_0 B(2,0)(0) を計算します。 そのため、=G$7*B$4*POWER($A9;G$6)*POWER(1-$A9;$B$5-G$6) を入れ、同様に コピーし、和を求めて Y 座標となる領域を計算します。
  7. 作図例 計算により求めた X Y 座標に対して、散布図のデータポイント付き折れ線で グラフを書くとベジエ曲線が書けます。 「求める x 座標」の部分をドラッグにより選択した後、 ctrl キーを押しながら「求める y 座標」の部分をドラッグにより選択します。 そして、「挿入」→「グラフ」を選びます。

なお、x,y 座標を変えると瞬時に再計算され、グラフが書き替わります。

8-2. 清書(3)TeX, pLaTeX(2)

センタリング

左寄せ、中央揃え、右寄せは次のようにします。

\begin{flushleft}
abc\\
def
\end{flushleft}
\begin{center}
abc\\
def
\end{center}
\begin{flushright}
abc\\
def
\end{flushright}

参照

LaTeX は section や enumerate などで番号を自動生成しますが、この値を参照できます。 section や item の直後に \label{ラベル名} を置くと、\ref{ラベル名} で ラベルの値を参照できます。

式に番号を付けるには \begin{equation} \end{equation} を使います。中に 入れた式は display モードで表示されます。 \end{equation} の手前に \label の指定をすると式番号を参照できます。 さらに便利なものに \begin{eqnarray} \end{eqnarray} があります。 これは式を 3 列の表とみなし、中央の部分を揃えるようにします。

\begin{eqnarray}
左辺 & 等号などの記号 & 右辺 \\
左辺 & 等号などの記号 & 右辺 \\
\end{eqnarray}

このようにすると等号を揃えた式変形などを説明し易くなります。 但し、これではすべての式に番号がついてしまいます。 特定の行だけ番号を付けないようにするには改行の手前に \nonumber を書き ます。 全ての行に行番号が不要の時は \begin{eqnarray*} \end{eqnarray*} を使用 します。

図の挿入

図を挿入する時は \begin{figure}[hbtp] \caption{}\end{figure}を使用し ます。 caption (脚注)を付けると図番号が生成されますので、caption の直後に label を指定すると参照することができます。 [hbup] は here, bottom, top, page の意味で、それぞれ、「切れ目の良い一 番近いところ」「ページの下の方」「ページの上の方」「最終ページにまとめ て」になります。 これらのうちどれを指定しても構いません。 但し、ページの割り付け上、必ずしも指定通りにならない場合があります。 そのため、複数指定することで、左に書いた方から順に優先して適用させるこ とができます。 なお、指定通りに割り付けられない場合は p を指定したものと同じになって します。 また、一度そのように割り付けられてしまうと、その後ろの図も全て p を指 定されたことと同じになってしまいます。 なお、 figure の中には図の他、文章やプログラムリストなども入れられます。

LaTeX に EPS ファイルを取り込むには、 \documentclass の直後に \usepackage{epsfig} を指定し、 本文中に \epsfig{file=EPSファイル名} を書きます。 なお、図の大きさを指定したい時は \epsfig{file=EPSファイル名,height=単 位つき高さ} や \epsfig{file=EPSファイル名,width=単位つき幅} とします。

例8-2

以下にコンピュータの図 (図 \ref{comp}) を示す。
\begin{figure}[hbt]
\begin{center}
\epsfig{file=computer.eps,width=6cm}
\end{center}
\caption{コンピュータ}
\label{comp}
\end{figure}

プログラムの挿入

プログラムを本文に入れるには listings パッケージを使います。 listings パッケージを使うには、\documentclass の直後に \usepackage{listings} を書きます。 そして、本文中には次のように書きます。

\lstset{language=C,numbers=left,numberstyle=\tiny}
\begin{lstlisting}
#include <stdio.h>
main(){
  printf("Hello World!");
}
\end{lstlisting}

文字

通常使う文字はローマン体と明朝体ですが、強調 {\em ...} ではボールド体 とゴシック体になります。

また \begin{large} \end{large} や \begin{Large} \end{Large} で字が大き くなります。

目次、参考文献

目次を作るには \tableofcontents コマンドを使います。 目次を作るとページ位置が大きく変わるため、5 回程度 platex コマンドを使用し ないと、ページの参照などがうまくいかない場合があります。

参考文献リストを作るには、文献データベースを作り bibtex を使用する方法 と、本文に書き込む方法があります。 ここでは本文に書き込む方法を説明します。 基本的には description 環境と同じように書きます。

\begin{thebibliography}{9}
\bibitem{参照名1}参考文献1の出展
\bibitem{参照名2}参考文献2の出展
\end{thebibliography}

はじめの 9 は文献リストが一桁の時指定します。 参照名は画面には表示されませんが、\cite{参照名} を本文中に書くと自動的に生成された参考文献番号を表示します。

例8-3

C 言語の基本構文
\begin{thebibliography}{9}
\bibitem{KandR}
B.W.カーニハン、D.M.リッチー「プログラミング言語 C」共立出版(1981)
\bibitem{masuda}増田忠士「2時間でマスター快適パソコン・キーボード」日本経済新聞社(1999)
\end{thebibliography}

演習8-2

  1. 次の内容を Meadow にコピーし、c:\work\test1.tex というファイル 名で保存しなさい。
    \documentclass[12pt]{jarticle}
    \usepackage{epsfig}
    \usepackage{listings}
    \usepackage{vmargin}
    \setpapersize{A4}
    \setmargnohfrb{20mm}{20mm}{20mm}{20mm}
    \begin{document}
    \begin{center}
    \begin{LARGE}
    \LaTeX\ のさらなる高度な使い方
    \end{LARGE}
    \end{center}
    \begin{flushright}
    05kc999\\
    名無しの権兵衛
    \end{flushright}
    \section{数式の参照}
    数式に番号をつけて参照するには次のようにします。
    \begin{equation}
    D = b^{2} - 4 a c \label{eq1}
    \end{equation}
    式 (\ref{eq1}) は二次方程式の{\em 判別式}です。
    
    また、等号を揃えた式を書くには次のようにします。
    \begin{eqnarray*}
    a x^{2} + b x + c &=& 0\\
    x^{2} + \frac{b}{a} x + \frac{c}{a} &=& 0\\
    \left(x + \frac{b}{2 a}\right)^{2} - \frac{b^{2}}{4 a^{2}} + \frac{c}{a} &=& 0\\
    \left(x + \frac{b}{2 a}\right)^{2} &=&  \frac{b^{2}- 4 a c}{4 a^{2}}\\
    x + \frac{b}{2 a} &=& \pm  \frac{\sqrt{b^{2}- 4 a c}}{2 a}\\
    x &=& \frac{- b \pm \sqrt{b^{2}- 4 a c}}{2 a}
    \end{eqnarray*}
    \section{図形の挿入}
    \label{nisho}
    \ref{nisho} 章では、図形の挿入の例を示します。
    \begin{figure}[hbt]
    \begin{center}
    \epsfig{file=computer.eps,width=6cm}
    \end{center}
    \caption{コンピュータ}
    \label{comp}
    \end{figure}
    
    \section{プログラムの挿入}
    \label{sansho}
    \ref{sansho} 章ではプログラムの表示をします。
    参考文献 \cite{KandR} には C 言語の文法が書かれています。
    \lstset{language=C,numbers=left,numberstyle=\tiny}
    \begin{lstlisting}
    #include <stdio.h>
    main(){
      printf("Hello World!");
    }
    \end{lstlisting}
    \nocite{masuda}
    \begin{thebibliography}{9}
    \bibitem{KandR}
    B.W.カーニハン、D.M.リッチー「プログラミング言語 C」共立出版(1981)
    \bibitem{masuda}増田忠士「2時間でマスター快適パソコン・キーボード」日本経済新聞社(1999)
    \end{thebibliography}
    
    \end{document}
    
  2. platex を使用して、上の内容を画面に表示しなさい。
  3. 上記の内容を変更して、変更結果を表示しなさい。

8-3. 宿題の解答

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

8-4. if文

if 文の基礎

if 文は条件式が正しい時と正しくない時で動作を変える場合に使用します。 構文は次の通りです(但し、 else 以下は省略することができます)。

if(条件式){
   条件が正しい時の動作
}else{
   条件が正しくない時の動作
}

例えば、方程式 ax +b=0 を満たす xを求めることを考えましょう。 この時、a の値が 0 か 0 でないかで解き方が異なります。 これを C 言語では次のような構文で書きます。

if( a が 0 である){
    a が 0 の時の解法
}else{
    a が 0 でない時の解法
}

「a が 0 である」という条件式は次のように書きます。

   a==0

「等しい」という条件は、イコール記号「=」を二つ続けて書くことに注意して 下さい。一つだけ書くと「変数 a に 0 を記憶しなさい」という別の意味になっ てしまい、エラーは一切出ませんが、プログラムが正常に動作しません。 プログラムミスの中でよく起こり得ることなので、もしプログラムを実行して 正常に動作しない場合は、 if 文などの条件式を確認するようにして下さい。 なお、このミスを予防するために 0==a と書く人もいます。これ だと0=aを誤って書いた時、左辺に変数の来ない代入文になるため、 コンパイラがエラーを出します。 ただ、これは左辺が数字のときだけうまくいくという部分的な解決法なので、 本来必要なプログラムをチェックする能力は上達しない側面もあります。

条件を表現する記号には次のようなものがあります。

a == b
a と b は等しい
a != b
a と b は等しくない
a < b
a は b より小さい
a > b
a は b より大きい
a <= b
a は b 以下
a >= b
a は b 以上

演習8-3

次のプログラムは方程式 ax +b=0 を解くように見えま すが、おかしいところが全部で 5 箇所あるので正しい答を求められません。 このプログラムを正しく動くように直して、次の方程式の解を求めなさい。

  1. 2x -4=0
  2. -2x +1=0
  3. 0x +3=0
  4. 0x +0=0
#include <stdio.h>
main(){
  int a,b,x;
  a=2;
  b=-4;
  if(a=0){
    if(b=0){
      printf("x は任意の数\n");
    }else{
      printf("解なし\n");
    }
  }else{
    x=b/a;
    printf("x = %d\n",x);
  }
}
ヒント

それぞれの解をまず手計算で求めて、プログラムの出力と比較しなさい。

演習8-4

二次方程式 ax2 +bx +c =0 ( a 0 ) の解を求めるプログラムを書きなさい。

そして、作ったプログラムで次の方程式を解きなさい。

  1. 2x2 -5x -3 =0
  2. 4x2 -4x +1 =0
  3. x2 -x -1 =0

論理演算

条件 A と B があった時、その両方が成立している時だけ文 X を実行するに は次のようにします。

if(A){
  if(B){
    X;
  }
}

一方、条件 A と B のどちらか一方が成立していれば X を実行するには次の ようにします。

if(A){
  X;
}else{
  if(B){
    X;
  }
}

このように if 文であれば複数の条件の組合せを処理することができます。 しかし、これを論理演算を用いて一つの条件文にまとめることができます。 ここでは C 言語での論理演算の表現を学びます。

C 言語において、条件 A と B に対して、両方が成立した時にだけ成立するこ とを表すには (A)&&(B) と書きます。 「a が 0 で b も 0 」という条件文を表すには (a==0)&&(b==0) と書きます。 これは一般にはAND 演算と呼ばれてます。

ABA AND B
成立成立成立
不成立成立不成立
成立不成立不成立
不成立不成立不成立

一方、C 言語において、条件 A と B に対して、どちらか一方が成立すれば成 立することを表すには (A)||(B) と書きます。 「a または b のいずれかが 0 」という条件文を表すには (a==0)||(b==0) と書きます。 これは一般にはOR 演算と呼ばれてます。

ABA OR B
成立成立成立
不成立成立成立
成立不成立成立
不成立不成立不成立

さらに、C 言語において、条件 A に対して、A が不成立のときだけ成 立することを表すには !(A) と書きます。 「a が 0 でない時」は a!=0 とも書けますが、!(a==0) とも書けます。 これは一般にはNOT 演算と呼ばれてます。

ANOT A
不成立成立
成立不成立

上記の例をもう一度とりあげます。 A と B の両方が成立している時 X を実 行するには次のように書きます。

if((A)&&(B)){ X; }

同じように「A と B のどちらか一方が成立している時 X を実行する」は次の ように書けます。

if((A)||(B)){ X; }

演習8-5

方程式 ax +b=0 の解を求める下のプロ グラムを完成させなさい。 また、完成させたプログラムを用いて、次の方程式を解きなさい。

  1. 2x +1=0
  2. 5x +0=0
  3. 0x +3=0
  4. 0x +0=0
#include <stdio.h>
main(){
  float a,b;
  float x;

  a=10;
  b=20;
  printf("%fx+%f=0 の解は",a,b);
  if(/* a も b も 0 */){
    printf("任意の値\n");
  }
  if(/* a は 0 だが、 b は 0 でない*/){
    printf("ない\n");
  }
  if(/* a は 0 でない */){
    /* x の計算 */
   printf("%f\n",x);
  }
}

演習8-6

以下は与えられた数が 2 の倍数、 3 の倍数、 6 の倍数のどれかを判定する プログラムです。 プログラムを完成させなさい。 そして、次の数に対してプログラムを走らせて正しく答が出力されることを確 かめなさい。 なお、 x % y は x を y で割った余りを求めます。

  1. 60
  2. 15
  3. 32
  4. 35
# include <stdio.h>
main(){
  int n,d2,d3;

  n = 100;
  d2 = n % 2;
  d3 = n % 3;
  printf("%d は",n);
  if((d2!=0)&&(d3!=0)){
    printf("2 でも 3 でも割れない\n");
  }else{ 
    if(/* 2 の倍数の判定 */){
      printf("2 の倍数\n");
    }else{ 
      if(/* 3 の倍数の判定 */){
        printf("3 の倍数\n");
      }else{if(/* 6 の倍数の判定 */){
            printf("6 の倍数\n");
           }else{
              /*その他*/
           }
      }  
    }
  }
}

8-5. 宿題

Circuit Maker をダウンロードしておいて下さい。 また、興味があれば、加藤ただし「CD-ROM付電子回路シミュレータ入門」 ブルーバックス B-1344、講談社(2001)を買って予習しておいて下さい。


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