解答集

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

第1回
第2回
第3回
第4回
第5回
第6回
第7回
第8回
第9回
第10回
第11回
第12回

第1回

第2回

第3回

演習3-1

  1. 電源を入れた後、数秒後に画面の下部に BIOS の画面にするためのキーを 案内する表示が出る(通常は DEL キー、または F2 キー)。但し、これも数秒 以内に押さないと表示が消えて操作できなくなる。
  2. 省略

演習3-2

  1. コマンドプロンプトへのメッセージ
  2. ゴミ箱へのメッセージ
  3. work へのショートカットへのメッセージ

演習3-3

ver
OS のバージョン番号を表示する
time
時刻を表示した後、時刻の入力を促す
date
日付を表示した後、日付の入力を促す
echo def
def を表示する
rem abc
何もしない
cls
画面を消去し、カーソルを左上に移動する
exit
コマンドプロンプトを終了する

演習3-4

省略

演習3-5

省略

演習3-6

省略

演習3-7

省略

演習3-8

G1 に =average(A1:E1)を入れる

演習3-9

省略

演習3-10

K2 に =B2+C2+D2+max(E2:I2)*2+J2 を入れ、ハンドルを下に引く。

演習3-11

ABCD
11020=$A1=$A1
23040=$A2=$A2
ABCD
110201010
230403030

演習3-12

ABCD
11020=A$1=B$1
23040=A$1=B$1
ABCD
110201020
230401020

演習3-13

ABCD
11020=$A$1=$A$1
23040=$A$1=$A$1
ABCD
110201010
230401010

演習3-14

省略

演習3-15

省略

演習3-16

ABCDE
1tax rate0.05
2PriceNo.SubtotalTaxTotal
3703=A3*B3=C3*$B$1=C3+D3
4205=A4*B4=C4*$B$1=C4+D4
5402=A5*B5=C5*$B$1=C5+D5
6304=A6*B6=C6*$B$1=C6+D6

演習3-17

AB
1AverageStdev
2=average(A4:A8)=stdev(A4:A8)
3PointRank偏差値
410=rank(A4;$A$4:$A$8;0)(A4-$A$2)/$B$2*10+50
530=rank(A5;$A$4:$A$8;0)(A5-$A$2)/$B$2*10+50
660=rank(A6;$A$4:$A$8;0)(A6-$A$2)/$B$2*10+50
750=rank(A7;$A$4:$A$8;0)(A7-$A$2)/$B$2*10+50
840=rank(A8;$A$4:$A$8;0)(A8-$A$2)/$B$2*10+50

演習3-18

第4回

演習4-1

  1. 1 bit
  2. 1 bit
  3. 10 通りなので log210 3.32... 4[bit]
  4. 26 通りなので log226 4.70... 5[bit]
  5. 10+26+26=62 通りなので log262 5.95 6[bit]
参考

本来の情報量の定義は、事象の集合 {i} の起こる確率 {pi} に対して、 i- pi log pi で定義されます。 これはそれぞれの確率が等確率の時最も大きくなります。 例えば、コインを投げた時、裏か表かの情報量は log の底を 2 とすると、 - 12 log 12 + - 12 log 12 = 12 + 12 = 1 より 1 bit になります。

演習4-2

  1. Windows のバージョンにより異なる。 Windows XP の場合は C:\Documents and Settings\ユーザ名 となる。
  2. cd \work

    なお、Windows にはカレントドライブという概念があって、カレントディレク トリの :(コロン)の左側の英字が装置を表します。 もし、カレントドライブが C: でない場合、c: とカレントドライ ブを変更してから cd \work とカレントディレクトリを変更しま す。

  3. abc という文字が記入されたファイルが def という名前でできる。 なお、abc 自体は 3 Byte だが、自動的に改行記号(2 Byte) とファイルの終 了記号(1 Byte) が付け加えられるため、 6 Byte になる。
    1. 絶対パス
      1. mkdir \work\test
      2. mkdir \work\test\A
      3. mkdir \work\test\B
    2. 相対パス
      1. cd \work
      2. mkdir test
      3. cd test
      4. mkdir A
      5. mkdir B
    1. 絶対パス
      1. copy \work\def \work\test\A\
      2. copy \work\def \work\test\B\
    2. 相対パス
      1. cd \work
      2. copy def test\A\
      3. copy def test\B\
  4. 略。木構造になる。
  5. ディレクトリはファイルやディレクトリが入っていると消せない。
    1. 絶対パス
      1. del \work\test\A\def
      2. del \work\test\B\def
      3. rmdir \work\test\A
      4. rmdir \work\test\B
      5. rmdir \work\test
    2. 相対パス
      1. cd \work\test\A
      2. del *.* (ファイルの全消去)
      3. cd ..
      4. rmdir A
      5. cd B
      6. del *.* (ファイルの全消去)
      7. cd ..
      8. rmdir B
      9. cd ..
      10. rmdir test

演習4-3

演習4-4

  1.  ドライブ C のボリューム ラベルがありません。
     ボリューム シリアル番号は 201F-90C3 です
    
     C:\work\literacy\4-4 のディレクトリ
    
    2006/05/08  11:28    <DIR>          .
    2006/05/08  11:28    <DIR>          ..
    2006/05/08  11:28                47 a.csv
    2006/05/08  11:22             7,238 a.ods
    2006/05/08  11:27               125 a.slk
    2006/05/08  11:27             6,656 a.xls
                   4 個のファイル              14,066 バイト
    
  2. a.csv
    "あいうえお",1,2006/05/01,2,0.707106781186547
    a.ods
    PK... と意味不明な文字列
    a.slk
    ID;PSCALC3
    C;X1;Y1;K"あいうえお"
    C;X2;Y1;K1
    C;X3;Y1;K38838
    C;X4;Y1;K2;EB1+1
    C;X5;Y1;K0.707106781186547;ESIN(PI()/4)
    E
    
    a.xls
    ミマ... と意味不明な文字列
  3. 書き込みエラーが出て解凍できない。

演習4-5

演習4-6

演習4-7

  1. 2個
  2. 1個
  3. 0個

演習4-8

  1. -2
  2. 0
  3. 解なし
  4. 任意の値

演習4-9

E2
=IF(D2<0;"解なし";(-B2+SQRT(D2))/2/A2)
F2
=IF(D2>0;(-B2-SQRT(D2))/2/A2);"")

演習4-10

E2
=LARGE(K4:K6;$D$2)
N4
=IF(K4>=$E$2;"合格";"不合格")

演習4-11

ad- bc0 の場合

各式に対して d,b をそれぞれかけると次のようになる。

{ a dx + b d y = d e b c x + b dy = b f

すると y の係数が一致するので辺々を引き算すると次の式が得られる。

a d - b c x = e d - b f

ad- bc0 より x = ed- bf ad- bc と求まる。 同様に y = af- ce ad- bc となる。

ad- bc = 0 の場合
  1. ad 0 の場合を考える。 この場合、変形して c a = d b = k 0 と置く。 すると、 c = a k , d = b k より、 もともとの式は次のように変形できる。

    { ax + by = e a k x + b k y = f
    { ax + by = e ax + by = fk

    つまり、 ax + by = e cx + dy = f は xy 平面上では、互いに平行な直線と なる。 ここで、 e = fk ならば同一の直線となるので、 ax + by = e を満たす x,y は全て与えられた式を満たす。 一方、 e fk ならば交点のない平行な二直線なので、共通の部分は無く、解なしとなる。

  2. a d = 0 の場合は ad- bc = 0 より b c = 0 である。 したがって、この条件は a = 0 または d = 0 かつ b = 0 または c = 0 である。

    1. a0 の時 d=0 となる。 b0 なら c=0 より 以下のようになる。 これは f0 なら解なしとなり、 f=0 なら ax + by = e を満たす全ての x,y となる。

      { ax + by = e 0x + 0y = f

      一方、 b=0 の時は式は次のようになる。

      { ax + 0y = e cx + 0y = f

      a0 より上の式から x=ea が得られるが、これが下の式も 満たす必要がある。 つまり、 cea = f を満たす時だけ、 x=ea となり、そうでない時は解なしになる。 またこの場合 y を束縛する式はないので、 y は任意の数になる。

    2. a=0 の時、もし d0 であれば、 x y などの文字を入れ換えるだけで a0 と同様の議論ができる。 つまり、 b=0 なら e=0 の時、 cx + dy = f を満たす全ての x,y となり、 b0 なら deb = f の時、 y=eb

      したがって残る条件は a=0 かつ d=0 の場合のみである。 この場合与えられた式は次のようになる。

      { 0x + by = e cx + 0y = f

      つまり、 by=e cx=f という個別の一次方程式を解くだけである。 b=0 または c=0 なので、 b0 の時、 c=0 となる。その時 f=0 ならば x は任意の数で、 y=eb f0 なら解なし。 同様に c0 の時、 b=0 となり、 e=0 ならば y は任意の数で、 x=fc e0 なら解なしとなる。 最後に a, b, c, d 全てが 0 の時、 e= f= 0 の時だけ x y も任意の数になり、それ以外は解なしとなる。

まとめ

ad- bc 0 の時は次の通りである。

{ x = ed- bf ad- bc y = af- ce ad- bc

ad- bc = 0 の場合の解をまとめると次のようになる。

a0 d0 e= af c ax + by = e を満たす全ての x,y
a0 d0 e af c 解なし
a0 d=0 b0 c=0 f=0 ax + by = e を満たす全ての x,y
a0 d=0 b0 c=0 f0 解なし
a0 d=0 b=0 c ea = f x= ea y は任意の数
a0 d=0 b=0 c ea f 解なし
a=0 d0 b=0 c0 e= 0 cx + dy = f を満たす全ての x,y
a=0 d0 b=0 c0 e 0 解なし
a=0 d0 b fd = e c=0 x は任意の数、 y= fd
a=0 d0 b fd e c=0 解なし
a=0 d=0 b 0 c=0 f=0 x は任意の数、 y= eb
a=0 d=0 b 0 c=0 f0 解なし
a=0 d=0 b = 0 c0 e=0 x= fc y は任意の数
a=0 d=0 b = 0 c0 e0 解なし
a=0 d=0 b = 0 c=0 e=f=0 x,y とも任意の数
a=0 d=0 b = 0 c=0 e0 または f0 解なし

このように ad- bc = 0 の場合は次のような条件に場合分けされ複雑になって いる。

  1. 二つの式が平行線を表す( ad 0 )
  2. 一方が x,y の両方の係数が 0 になってしまうため直線を表さな くなってしまう ( a=b=0 , c=d=0 )
  3. x または y に関して束縛条件を失ってしまう ( a=c=0 , b=d=0 )

つづく

第5回

演習5-1

  1. 販売できる。但し、ライセンス条件を削ったり修正してはいけない。
  2. 販売できる。但し、ライセンス条件を修正せずそのままのライセンスとし、 さらに入手者に対して、改造した内容をソースコードで開示する必要がある。
  3. できない。ライセンス条件で再配布が禁じられている。
  4. 言えない。ソースコードを開示することと、オープンソースは直接関係な い。オープンソースと言うには、再配布や改造物の頒布等を許していなければ ならない。

演習5-2

演習5-3

演習5-4

演習5-5

最終結果


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />
<link rev="made" href="mailto:sakamoto@c.dendai.ac.jp" />
<style>
<!--
div#area { background-color: lightyellow; 
width: 25em;
}
h1 { border-style: double; 
     text-align: center;
     background-color: lightblue;
}
p { text-indent: 1em;}
li { color: blue;}
-->
</style>
<title>教育理念</title>
</head>
<body>
<div id="area">
<h1>教育理念</h1>
<p>
情報通信工学科は、世界のIT(情報通信技術)関連技術の最先端を担うことの
できる技術者を育成することを目標とし、次のような特徴を有しています。
</p>
<ol>
<li>情報技術・通信技術・メディア処理技術の統合的な教育</li>
<li>考える能力と独創性を涵養する教育</li>
<li>東京電機大学創立以来の『実学の精神』を尊重</li>
<li>産業界との交流を盛んにし、先端技術を反映した教育</li>
<li>充実した最先端の実験環境による実学教育</li>
</ol>
<h1>学科構成</h1>
<p>情報通信工学科には、以下の学科が設置されております。</p>
<ul>
<li>工学部第一部 情報通信工学科(昼間部)</li>
<li>工学部第二部 情報通信工学科(夜間部)</li>
</ul>
</div>
</body>
</html>

演習5-6

略。構造を意識していないマークアップの非効率さ、不条理さを味わって下さ い。

演習5-7

c2 =if(AND(a2=0; NOT(b2=0));"存在しない";"存在する")

  1. 存在する
  2. 存在する
  3. 存在しない
  4. 存在する

演習5-8

f2
=if(and(b2>=6;c2>=6;d2>=6);sum(b2:d2);0)
g2
=if(cell("type";e2)="b";"-";if(f2>=18;max(e2;f2*2.4+e2*0.28);0))
h2
=if(g2="-";"-";if(g2>=90;"S";if(g2>=80;"A";if(g2>=70;"B";if(g2>=60;"C";"D")))))

演習5-9

  1. x0
  2. (a0)(b=0)
  3. ( (a0) (b0) ) ( (a=0) (b0) ) ( (a=0) (b=0) )

演習5-10

ABCDEF
110=A1-1
20=A2+2
31=A3+2
41=A4*2

演習5-11

15

演習5-12

A
11
21
3=A1+A2
4

55

演習5-13

210

演習 5-14

A2 = A1&"○" など。演習 5-15 の答えでも正解。

演習 5-15

A2 = A1&$A$1

第6回

演習 6-1

  1. \[ \sqrt{2} = 1+ \frac{1}{2+ \frac{1}{2+ \frac{1}{2+\cdots}}} \]
  2. \[ f(t)=\frac{d}{dt}\int_{0}^{t}f(x)dx \]
  3. \[ \left( \begin{array}{cc} a & b \\ c & d \end{array} \right) ^{-1} = \frac{1}{ad-bc} \left( \begin{array}{cc} d & -b \\ -c & a \end{array} \right) \]

演習 6-2

演習 6-3

最終結果は以下の通り


\documentclass[12pt]{jarticle}
\usepackage{vmargin}
\setpapersize{A4}
\setmarginsrb{20mm}{20mm}{20mm}{20mm}{5mm}{5mm}{5mm}{5mm}
\begin{document}
\section{教育理念}
情報通信工学科は、世界のIT(情報通信技術)関連技術の最先端を担うことの
できる技術者を育成することを目標とし、次のような特徴を有しています。
\begin{enumerate}
\item 情報技術・通信技術・メディア処理技術の統合的な教育
\item 考える能力と独創性を涵養する教育
\item 東京電機大学創立以来の『実学の精神』を尊重
\item 産業界との交流を盛んにし、先端技術を反映した教育
\item 充実した最先端の実験環境による実学教育
\end{enumerate}
\section{学科構成}
情報通信工学科には、以下の学科が設置されております。
\begin{itemize}
\item 情報通信工学科(昼間部)
\item 情報通信工学科(夜間部)
\end{itemize}
\end{document}

演習 6-4


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

但し、 /* と */ の間は出力には影響しない。

演習 6-5

演習 6-6


#include <windows.h>

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

演習 6-7

予想

a=2.0 b=3.0 a+b=5.0 が表示される。

実行結果
a=2.000000  b=3.000000 a+b=5.000000

演習 6-8


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

第7回

演習 7-1

演習 7-2

演習 7-3

演習 7-4

  1. char initial;
  2. float menseki,hankei;
    または
    double menseki,hankei;
  3. int page;

演習 7-5


printf("x=%d, y=%f, z=%c",x,y,z);

演習 7-6

  1. 2
  2. -5
  3. -0.5

演習 7-7


#include <stdio.h>
main(){
  float a,b,c,d,e,f,x,y;
  a=10.0;
  b=20.0;
  c=30.0
  d=40.0;
  e=50.0
  f=60.0
  x=(d*e-b*f)/(a*d-b*c);
  y=(-c*e+a*f)/(a*d-b*c);
  printf("連立方程式 %f x + %f y = %f, %f x + %f y = %f の解は \n",a,b,e,c,d,f);
  printf("x = %f, y = %f\n",x,y);
}
  1. x = 1, y = 1
  2. x = 0.5, y = 1.2
  3. x = 1.5, y = 4

演習 7-8

関数 sqrt を使用するには math.h を #include で指定する


#include <stdio.h>
#include <math.h>
main(){
  float a,b,c;
  a=10.0;
  b=20.0;
  c=sqrt(a*a+b*b);
  printf("二辺が %f, %f の直角三角形の斜辺は %f。\n",a,b,c);
}

演習 7-9

連立方程式を使った場合、連立方程式は次のようになる。

{ a2 = x2 + y2 b2 = x2 + c - y 2

これより、上下を引き算することにより y が求まる。

a2 - b2 = y2 - c - y 2
a2 - b2 = 2 c y - c 2
y = a2 - b2 + c2 2 c

これより x を求める。

x2 = a2 - a2 - b2 + c2 2 c
= 2 a2 b2 + 2 b2 c2 + 2 c2 a2 - a4 - b4 - c4 4 c2

x>0 より、面積 S は次のように求まる。

S = 12 c x = 12 c 2 a2 b2 + 2 b2 c2 + 2 c2 a2 - a4 - b4 - c4 2 c
= 2 a2 b2 + 2 b2 c2 + 2 c2 a2 - a4 - b4 - c4 4

したがってプログラムは次のようになる。


#include <stdio.h>
#include <math.h>
main(){
  float a,b,c,s,a2,b2,c2;
  a=10.0;
  b=20.0;
  c=20.0;
  a2=a*a;
  b2=b*b;
  c2=c*c;
  s=sqrt(2*a2*b2+2*b2*c2+2*c2*a2-a2*a2-b2*b2-c2*c2)/4;
  printf("三辺が %f, %f, %f の三角形の面積は %f。\n",a,b,c,s);
}

なお、余弦定理は a2 = b2 + c2 - 2 b c cos A で、 cos A がわかっている時の三角形の面積は S = 12 b c sin A から求められる。

sin A >0 に注意すると面積は次のように求まる。

S = 12 b c 12 - b2 + c2 - a2 2 b c 2

これを変形すると同じ式が得られる。 なお、ヘロンの公式とは s = a + b + c 2 の時、面積が次の式で与えられると言うものである。 なお展開すると上と同じ式になる。

S = s s - a s - b s - c

第8回

演習 8-1

  1. 3 行目 int → float
  2. 6 行目 if(a=0) → if(a==0)
  3. 7 行目 if(b=0) → if(b==0)
  4. 13 行目 x=b/a; → x=-b/a;
  5. 14 行目 printf("x = %d\n",x); → printf("x = %f\n",x);
  1. 2
  2. 0.5
  3. 解なし
  4. x は任意の数

演習 8-2


#include <stdio.h>
#include <math.h>
main(){
  float a,b,c;
  float d,x0,x1;
  a=10; b=20; c=30;
  d=b*b-4*a*c;
  if(d>0){
    x0=(-b+sqrt(d))/2/a;
    x1=(-b-sqrt(d))/2/a;
    printf("%f, %f\n",x0,x1);
  }else{
    if(d==0){
      x0=-b/2/a;
      printf("%f\n",x0);
    }else{
      printf("実数解なし\n");
    }
  }
}
  1. 3, -0.5
  2. 0.5
  3. 1.618034, -0.618034

演習 8-3

/* a も b も 0 */
(a==0)&&(b==0)
/* a は 0 だが、 b は 0 でない*/
(a==0)&&(b!=0)
/* a は 0 でない */
a!=0
/* x の計算 */
x=-b/a;

演習 8-4

/* 2 の倍数の判定 */
(d2==0)&&(d3!=0)
/* 3 の倍数の判定 */
(d2!=0)&&(d3==0)
/* 6 の倍数の判定 */
(d2==0)&&(d3==0)
/* その他 */
d2 と d3 に関して 0 かそうでないかの場合は全部で 4 通りなので、す べて条件は出尽くしている。 従って、この /*その他*/ にたどり着くことはありえないので、なにもしない か、printf("異常な条件")などエラーを表示する。

第9回

演習 9-1

講義中に解説。 後で掲載予定。

演習 9-2


#include <stdio.h>
main(){
  int a;
  a=0;
  while(a<10){
    printf("●");
    a=a+1;
  }
  printf("\n");
}

演習 9-3

  1. 
    #include <stdio.h>
    main(){
      int b;
      b=1;
      while(b<=9){
        printf("ループ変数 = %d\n",b);
        b=b+2;
      }
    }
    
  2. 
    #include <stdio.h>
    main(){
      int b;
      b=10;
      while(b>=6){
        printf("ループ変数 = %d\n",b);
        b=b-1;
      }
    }
    

演習 9-4

  1. 
    #include <stdio.h>
    main(){
      int i,b;
      i=0;
      while(i<10){
        b=2*i+1;
        printf("%d, ",b);
        i=i+1;
      }
      printf("\n");
    }
    
  2. 
    #include <stdio.h>
    main(){
      int i,b;
      i=0;
      while(i<21){
        b=10-i;
        printf("%d, ",b);
        i=i+1;
      }
      printf("\n");
    }
    
  3. 
    #include <stdio.h>
    main(){
      int i,b;
      i=0;
      while(i<10){
        b=(i+1)*(i+1);
        printf("%d, ",b);
        i=i+1;
      }
      printf("\n");
    }
    

演習 9-5

始めが 4, 終りが 10 で 6 回に分けて数を増やすには次のようにする。 始めは 4 で固定で、残り 6-1 回で 10-4 を等分して増やして行く。 つまり毎回増やす量は (最終項-初項)/(回数-1) となる。

問題では 20 回で 0 から 2πまで増やすので、毎回増やす量は (2π-0)/(20-1)=2π/19 となる。 したがってプログラムは次のようになる。


#include <stdio.h>
main(){
  int i;
  float x,y;
  while(i<20){
    x=3.141592*2/19*i;
    y=sin(x);
    printf("x=%f, sin(x)=%f\n",x,y);
    i=i+1;
  }
}

演習 9-6

フィボナッチ数列は前回と前前回の値の合計を次々と出力する。


#include <stdio.h>
main(){
  int konkai, zenkai, zenzenkai;
  int i;
  zenkai=1;
  zenzenkai=1;
  printf("%d, %d, ",zenzenkai,zenkai);
  for(i=2; i<20; i++){
    konkai=zenkai+zenzenkai;
    printf("%d, ",konkai);
    zenzenkai=zenkai;
    zenkai=konkai;
  }
}

演習 9-7

  1. i=2, j=1
  2. i=1, j=0
  3. i が 0 で無い時、 0 で、 i が 0 の時も 0 なので、いずれにしろ 0 (変数の値が不定なのに参照するとコンパイラはしばしばエラーを出す)。

演習 9-8

出力

i=0 で i に 1 を増やす
i の値 1, 式の値 1
i の値 1, 式の値 1
i の値 1, 式の値 1
i の値 1, 式の値 0

演習 9-9

改造後


#include <stdio.h>
main(){
  int i;
  i=5;
  while(i--){
    printf("%d\n",(i+1)*2);
  }
}

演習 9-10

改造後


#include <stdio.h>
main(){
  int i, j;
  for(i=1;i<=6;i++){
    for(j=1;j<=i;j++){
      printf("●");
    }
    printf("\n");
  }
}

演習 9-11


#include <stdio.h>
main(){
  int n;
  n=11;
  while(n){
    printf("%d",n%2);
  n/=2;
  }
  printf("\n");
}
n=6
011
n=14
0111
n=23
11101

演習 9-12


#include <stdio.h>
main(){
  int n,i;
  n=18;
  printf("%dの約数は",n);
  for(i=1;i<=n;i++){
    if(!(n%i)){
      printf(" %d",i);
    }
  }
  printf("\n");
}
n=32
32の約数は 1 2 4 8 16 32
n=60
60の約数は 1 2 3 4 5 6 10 12 15 20 30 60

第10回

演習 10-1


#include <stdio.h>
main(){
  float a[]={2,1};
  float x;
  x=-a[0]/a[1];
  printf("方程式 %f%+f x = 0 の解は %f\n",a[0],a[1],x);
}
  1. -2
  2. 0.5
  3. 0

演習 10-2


#include <stdio.h>
#define N 6
main(){
  float a[N]={2, 1, 5, 6, 9, 2};
  int i;
  for(i=0; i<N; i++){
    printf("a[%d] の値は %f\n",i,a[i]);
  } 
}

演習 10-3


#include <stdio.h>
#define N 6
main(){
  float a[N]={2, 1, 5, 6, 9, 2};
  int i;
  float s=0;
  for(i=0; i<N; i++){
    s+=a[i];
  } 
  printf("平均値は %f\n",s/N);
}

演習 10-4


#include <stdio.h>
main(){
  int a[]={5,3,10,2,0};
  int i=0;
  while(a[i]!=0)
  {
    printf("%d番目の要素は%d\n",i,a[i]);
    i++;
  }
}

演習 10-5


#include <stdio.h>
main(){
  int a[]={5,3,10,2,0};
  int n=0;
  int i;
  i=0;
  while(a[i]!=0)
  {
    if(a[i]%2==0){
      n++;
    }
    i++;
  }
  printf("与えられた入力中に偶数は %d 個\n",n);
}

演習 10-6


#include <stdio.h>
main(){
  int data[]={2, 7, 1, 3, 9, 0};
  int i,goukei;
  goukei=0;
  for(i=0;data[i]!=0;i++){
    goukei+=data[i];
  }
  printf("合計 %d\n",goukei);
}

演習 10-7


#include <stdio.h>
main(){
  double data[]={2.1, 7.5, 1.2, 3.4, 9.9, 0};
  int i,count;
  double goukei=0;
  count=0;
  for(i=0;data[i]!=0;i++){
    goukei+=data[i];
    count++;
  }
  printf("平均 %f\n",goukei/count);
}

第11回

演習 11-1


#include <stdio.h>
main(){
  char str[]="abcdefg";
  int i;
  for(i=0; str[i]!='\0'; i++){
    printf("%c\n",str[i]);
  }
}

演習 11-2


#include <stdio.h>
main(){
  char x[]="abcdefgh";
  int y=0;
  while(x[y]!='\0'){
    printf("文字列 %s の %d 文字目は %c\n",x,y,x[y]);
    y=y+1;
  }
  printf("全部で %d 文字\n",y);
}

演習 11-3


#include <stdio.h>
main(){
  char x[]="abcdefgh";
  int y=0;
  while(x[y]!='\0'){
    y=y+1;
  }
  printf("%d 文字\n",y);
}

演習 11-4

始めに、与えられたプログラム中の次の部分に注目する。


  j=0;
  while(y[j]!='\0'){
    z[i]=y[j];
    i=i+1;
    j=j+1;
  }

これは文字配列 y が終了するまで、y の j 番目の文字を z の i 番目にコピー している。 j は 0 なので y は始めからであるが、 z は何文字目からか不明である。 しかし、問題のコメント中にある x から z へのコピーもこれと同様にすれば 良い。 つまり上のプログラムの y を単純に x に取り換えただけのプログラムを考え る。 すると、同様に x が終了するまで x を一文字ずつ z にコピーすることにな る。

さて、問題は i の値である。 上記のプログラムを見ると while が終了する時、つまり、 y が終了する時、 i 番目には文字は入らず終了する。 したがって、このプログラムを直結すると、文字が連続して入れられることに なる。 したがって、最初に i を 0 とし、 x, y をコピーするため、上記のプログラ ムの部分を二つ直結する。

最後に考えなければならないのは、 z も'\0' で終了しなければならないのだ が、y をコピーした直後に '\0' を入れているので問題ない。


#include <stdio.h>
main(){
  char x[]="abcdef", y[]="ghijkl", z[100];
  int i,j;
  printf("文字列 %s と文字列 %s をくっつけると",x,y);
  i=0;
  j=0;
  while(x[j]!='\0'){
    z[i]=x[j];
    i=i+1;
    j=j+1;
  }
  j=0;
  while(y[j]!='\0'){
    z[i]=y[j];
    i=i+1;
    j=j+1;
  }
  z[i]='\0';
  printf("%s\n",z);
}

演習 11-5


#include <stdio.h>
main(){
  char str[]="abcde";
  int i=0;
  while((str[i]!='\0')&&(i<3)){
    printf("%c",str[i++]);
  }
}

演習 11-6


#include <stdio.h>
main(){
  char str[]="abcde";
  int i=0;
  while(str[i]==' '){
    i++;
  }
  printf("%d個\n",i);
}

演習 11-7


#include <stdio.h>
main(){
  char  x[]="This is a pen.", y='i'; 
  int i=0;
  int count=0;
  while(x[i]!='\0'){
    if(x[i]==y){
      count++;
    }
    i++;
  }
  printf("%d個\n",count);
}

演習 11-8


#include <stdio.h>
main(){
  char  x[]="a";
  int i=0;
  while(x[i]!='\0'){
    printf("%c",x[i++]);
    if(i%2){
      printf("\n");
    }
  }
}

演習 11-9


#include <stdio.h>
main(){
  char  x[]="a";
  int i=0;
  while(x[i]!='\0'){
    if(i%2==0){
      printf("%c",x[i]);
    }
    i++;
  }
}

演習 11-10


#include <stdio.h>
main(){
  char  x[]="a";
  int i=0;
  while(x[i]!='\0'){
    i++;
  }
  while(i>=0){
    printf("%c",x[--i]);
  }
}

第12回

演習 12-1

以下のコマンドで実現

  1. ver > file1
  2. dir /w > file2
    1. プログラムを file3.c に保存する
    2. gcc file3.c でコンパイル
    3. .\a.exe > file3 でファイルに保存

演習 12-2


#include <stdio.h>
main(){
  char c;
  int n=0;
  while((c=getchar())!=EOF){
    n++;
  }
  printf("\n"); /* MS-DOS プロンプトのバグ対策 */
  printf("合計 %d 文字\n",n);
}

演習 12-3


#include <stdio.h>
main(){
  int c;
  int n=0;
  while((c=getchar())!=EOF){
    if(c=='\n'){
      n++;
    }
  }
  printf("\n"); /* MS-DOS プロンプトのバグ対策 */
  printf("%d 行\n",n);
}

演習 12-4


#include <stdio.h>
main(){
  int c;
  char x='x';
  int n=0;
  while((c=getchar())!=EOF){
    if(c==x){
      n++;
    }
  }
  printf("\n"); /* MS-DOS プロンプトのバグ対策 */
  printf("%d 文字\n",n);
}

演習 12-5


#include <stdio.h>
main(){
  int c;
  int n=0;
  while((c=getchar())!=EOF){
    if(c==' '){
      printf("%c",c);
    }
  }
}

演習 12-6


#include <stdio.h>
main(){
  int c;
  int n=0;
  while(((c=getchar())!=EOF)&&(n<5)){
    printf("%c",c);
    if(c=='\n'){
      n++;
    }
  }
}

演習 12-7


#include <stdio.h>
main(){
  int c;
  int n=0;
  printf("%d: ",++n);
  while((c=getchar())!=EOF){
    printf("%c",c);
    if(c=='\n'){
      printf("%d: ",++n);

    }
  }
}

演習 12-8


#include <stdio.h>
main(){
  int c;
  int mojisu=0;
  while((c=getchar())!=EOF){
    if(c!='\n'){
      printf("%c",c);
      mojisu++;
      if(mojisu>10){
	printf("\n");
	mojisu=0;
      }
    }
  }
}
実行例
#include <s
tdio.h>main
(){  int c;
  int mojis
u=0;  while
((c=getchar
())!=EOF){ 
   if(c!='\
n'){      p
rintf("%c",
c);      mo
jisu++;    
  if(mojisu
>10){   print
f("\n");        mo
jisu=0;    
  }    }  }
}

tab コードがあるので、完全な長方形にならない場合もある。

演習 12-9

文字数改行文字その他の文字
10 文字 改行を出力、文字数を 0 に文字を出力して改行を出力、文字数を 0 に
9 文字まで 改行を出力、文字数を 0 に文字を印字し、文字数を増やす

#include <stdio.h>
main(){
  int c;
  int mojisu=0;
  while((c=getchar())!=EOF){
    if(c!='\n'){
      printf("%c",c);
      mojisu++;
      if(mojisu>10){
	printf("\n");
	mojisu=0;
      }
    }else{
      printf("\n");
      mojisu=0;
    }
  }
}

演習 12-10


#include <stdio.h>
main(){
  char mojiretsu[]="test";
  int i;
  for(i=0;mojiretsu[i]!='\0';i++){
    printf("%c",mojiretsu[i]-'a'+'A');
  }
}

演習 12-11


#include <stdio.h>
main(){
  char mojiretsu[]="This is a pen.";
  int i;
  char c;
  for(i=0;(c=mojiretsu[i])!='\0';i++){
    if((c>='a') && (c<='z')){
      printf("%c",c-'a'+'A');
    }else{
      printf("%c",c);
    }
  }
}

演習 12-12


#include <stdio.h>
main(){
  int c;
  while((c=getchar())!=EOF){
    if((c>='a') && (c<='z')){
      printf("%c",c-'a'+'A');
    }else{
      printf("%c",c);
    }
  }
}
出力
#INCLUDE <STDIO.H>
MAIN(){
  INT C;
  WHILE((C=GETCHAR())!=EOF){
    IF((C>='A') && (C<='Z')){
      PRINTF("%C",C-'A'+'A');
    }ELSE{
      PRINTF("%C",C);
    }
  }
}

演習 12-13


#include <stdio.h>
main(){
  int c;
  while((c=getchar())!=EOF){
    if((c>='0') && (c<='9')){
      printf("9");
    }else if((c>='a') && (c<='z')){
      printf("a");
    }else if((c>='A') && (c<='Z')){
      printf("A");
    }else {
      printf("%c",c);
    }
  }
}
出力
#aaaaaaa <aaaaa.a>
aaaa(){
  aaa a;
  aaaaa((a=aaaaaaa())!=AAA){
    aa((a>='9') && (a<='9')){
      aaaaaa("9");
    }aaaa aa((a>='a') && (a<='a')){
      aaaaaa("a");
    }aaaa aa((a>='A') && (a<='A')){
      aaaaaa("A");
    }aaaa {
      aaaaaa("%a",a);
    }
  }
}

演習 12-14


#include <stdio.h%gt;
main(){
  float x,goukei=0;
  int c;
  while((c=scanf("%f",&x))!=EOF){
    if(c==1){
      goukei+=x;
    }else{
      scanf("%*c");
     }
  }
  printf("\n"); /* MS-DOS プロンプトのバグ対策 */
  printf("合計: %f\n",goukei);
}

演習 12-15


#include <stdio.h%gt;
main(){
  float x,goukei=0;
  int c;
  int kosuu=0;
  while((c=scanf("%f",&x))!=EOF){
    if(c==1){
      goukei+=x;
      kosuu++;
    }else{
      scanf("%*c");
     }
  }
  printf("\n"); /* MS-DOS プロンプトのバグ対策 */
  printf("平均: %f\n",goukei/kosuu);
}

演習 12-16


#include <stdio.h%gt;
main(){
  float x,max;
  int c;
  int kosuu=0;
  while((c=scanf("%f",&x))!=EOF){
    if(c==1){
      kosuu++;
      if(kosuu==1){
        max=x;
      }else{
        if(max<x){
	  max=x;
	}
      }
    }else{
      scanf("%*c");
     }
  }
  printf("\n"); /* MS-DOS プロンプトのバグ対策 */
  printf("最大値: %f\n",max);
}

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