] > Fair Copy(3), if sentence

第 8 回 清書(3), if文

本日の内容


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

8-1. Dynamic Draw

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

ここでは、ベクタファイルである EPS ファイルを作れる、フリーのドローソ フト Dynamic Draw を使います。ソフトウェアのペー ジに従ってインストールして下さい。

ドローソフトの利用法

グリッド

画面に「グリッド」と呼ばれる方眼の目盛が書かれてます。 図形を配置する際、グリッドに揃えて置くか、グリッドに無関係に自由に置く かを選べます。

図形

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

折れ線は通過点を複数指定した後、終点を指定します。 折れ線は頂点を丸くすることもできます。 また複数の点のそばを通る曲線としてベジエ曲線と呼ばれる曲線 を描けるものもあります。

図形を描く線種(点線)や線の太さ、色、塗りつぶしパターンなども指定できま す。

選択

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

図形を選択すると、上下左右斜めの合計 9 か所に黒い点が表示されます。 黒い点以外の図形の部分をドラッグ&ドロップすると、移動します。 一方、黒い点をドラッグ&ドロップすると図形を拡大、縮小できます。 通常は縦横比を保存しません。Ctrl など、なにか特別なキーを押しながらす ると縦横比を保存できるものもあります。 また、線種や塗りつぶしパターンなども後から変更できます。

文字

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

グループ

選択したひとまとまりの図形を一つの図形として扱い、移動、コピー、拡大縮 小できます。 なお、グループで拡大縮小を行うと、含まれる文字のサイズや縦横比も変化し てしまうので注意が必要です。 文字をグループの拡大で拡大すると表示の品質が悪くなることがあります。

整列

選択した図形の高さを揃えたり、均等に並べたりできます。

レイヤ

図形を描く領域として、透明なフィルムに対応する概念レイヤが あります。 このレイヤを何枚も用意できます。 図形を書き込む時、どのレイヤに書くかを指定できる他、どのレイヤを表示す るかを指定できます。 また、レイヤを重ねる順番も指定できます。

EPS ファイルの出力

  1. 出力したい図形を選択します。
  2. 「ファイル」→「選択部品を他形式で保存」を選びます。
  3. ファイルの種類で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,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}
    03kc999\\
    名無しの権兵衛
    \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. 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-4. 宿題

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


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