C言語 と C++


C言語 は1972年頃 Dennis Ritchie により DEC 製コンピュータのオペレ−ティング システム (OS) である UNIX (ユニックス) のプログラム記述言語として開発された。 現在では、C言語を更に発展させた C++ がコンピュータのプログラム記述言語として、 ソフト開発等に幅広く用いられている。 C言語プログラムのソースファイルは、テキストエディター等を用いて「直接入力」モードで記す。 Windows系パソコンにおいては、C言語のソースファイルの拡張子は .c であるが、 C++ のソースファイルの場合は、拡張子を .cpp とする。 このソースファイルを Cコンパイラにかけると実行可能ファイルが出力生成される。 実行可能ファイルの拡張子は一般に .exe となる。 実行可能ファイルは完全な機械語 (バイナリー コード) で記述されているために、 通常のテキストエディターでは編集することができない。 作成された実行可能ファイルのアイコンをダブルクリックすると、プログラムが実行される。 Cプログラムの実行速度は非常に高速である。 なお Cコンパイラについては、市販されている製品を購入して予めコンピュータに インストールしておく必要がある。 パソコン用の Cコンパイラとしては、Microsoft (マイクロソフト) 社の VisualC++ などが よく知られている。

C言語のソースファイル記述例

以下の記述の各行において // の以後の文はコメント文と呼ばれる説明や注釈であり、 プログラム実行には関係ない。 また コマンド (制御命令) 等を表す文字を太字で記してあるが、実際の記述では、 すべて標準の文字形すなわち「直接入力」モードで記す。

[例 1] 二つの整数 591 と -365 の和を求め、テキストファイルに出力する。

// ソースファイル名 ex1.c

#include <stdio.h>     // 標準入出力ファイルの挿入を指示するプリプロセッサ制御文
#include <math.h>     // 数学ライブラリの挿入を指示するプリプロセッサ制御文
#include <errno.h>

void main(void)         // main (メイン) 関数
{
  FILE *fp ;           // *fp はファイル ポインタの指定
  int i, j, k ;           // 変数 i, j, k を整数型として宣言
  fp = fopen("c : ex1.txt","w") ;   // ドライブ C にファイル ex1.txt を作成し開く。 ("w" は上書きモード指定)
  i = 591 ;              // 変数 i に整数型の定数 591 を代入
  j = -365 ;             // 変数 j に整数型の定数 -365 を代入
  k = i+j ;              // 和 i+j を計算し、その結果を変数 k に代入
  fprintf(fp," %d ¥n", k) ;    // ファイル ex1.txt に変数 k の値を上書き出力して改行  (¥n は改行コマンド)
  fclose(fp) ;           // ファイル ex1.txt を閉じる。
}                 // main 関数の終了

C言語系のプログラムにおいては、関数中の文の終わりに必ずセミコロン 「 ; 」 を記す。 また小文字を主に用いる習慣がある。 C言語系のプログラムでは、大文字と小文字は区別される。 文字入力モード (全角,半角,直接入力 などの区別) に注意を払うこと。 コンピュータでは空白も文字の一種とみなされ、全角と半角の空白は全く異なる。
プログラム中の void main (void) {  } は main (メイン) 関数 と呼ばれる。 関数中のプログラム文は、必ず中括弧 {  } の中に記述する。 C言語のプログラムは、必ず一つの main 関数が存在しなければならない。 void は、値を返さない関数の型を意味する。 すなわち この例の場合、main 関数は、他の関数からは呼び出すことが出来ない。
fopen 関数内の c : はファイルを作成するドライブの指定であって、 通常はハードディスクに設定されている。 fopen 関数内の指定 "w" では、既に存在する旧ファイル上に新に上書きされるので 旧テキストの内容は消失する。 旧ファイルに追加書き込みをするときは、fopen 関数内の指定を "a" とする。 fprintf 関数内の %d は整数表記の書式指定である。
上記の例における Cソースファイル名は、拡張子も含めて ex1.c としてある。 ここでファイル名 ex1 はアルファベットや数字ならば任意でよい。 作成したソースファイルは一旦保存し、Cコンパイラにかけると実行ファイルが出力生成される。 実行ファイルは機械語で記述された実行可能なプログラムファイルである。 上記の例では、実行ファイル名は ex1.exe となり、拡張子 .exe のファイルが 自動的に生成されることになる。 この実行ファイル ex1.exe のアイコンをダブルクリックすると、プログラムが実行される。


[例 2] 文字列 ABCDEFGHIJKLMNOPQRSTUVWXYZ と 0123456789 を テキストファイルに出力する。

// ソースファイル名 ex2.c

#include <stdio.h>

void main(void)
{
  FILE *fp ;
  char *a_p ;                  // アルファベット字列の先頭を指すポインタ a_p を宣言
  char *b_p ;                  // 数字列の先頭を指すポインタ b_p を宣言
  fp = fopen("c : ex2.txt","w") ;
  a_p = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;  // ポインタ a_p にアルファベット字列の先頭アドレスを代入
  b_p = "0123456789" ;             // ポインタ b_p に数字列の先頭アドレスを代入
  fprintf(fp , "%s ¥n", a_p) ;          // ファイル ex2.txt に a_p によって指示される文字列を上書き出力して改行
  fprintf(fp , "%s ¥n", b_p) ;          // ファイル ex2.txt に b_p によって指示される文字列を上書き出力して改行
  fclose(fp) ;
}

ポインタとは、データを格納してあるメモリの先頭アドレスを指定する変数であって、 データの値そのものを示しているわけではない。 上記例では、ポインタ a_p はアルファベット字列を格納してあるメモリアドレスの 先頭のアドレス値が代入される。 データそのものを参照する場合には *a_p のように表記する 。 fprintf 関数内の %s は文字列表記の書式指定である。


[例 3] 二つの実数 500.0 と 0.2 の 和,差,積,商 をそれぞれ求め、 テキストファイルに出力する。

// ソースファイル名 ex3.c

#include <stdio.h>
#include <math.h>
#include <errno.h>

void main(void)
{
  FILE *fp ;
  double x, y, wa, sa, seki, syo ;    // 変数 x, y, wa, sa, seki, syo を倍精度実数型として宣言
  fp = fopen("c : ex3.txt","w") ;
  x = 500.0 ;
  y = 0.2 ;
  wa = x+y ;              // 和 x+y を計算し、その結果を変数 wa に代入
  sa = x-y ;               // 差 x-y を計算し、その結果を変数 sa に代入
  seki = x*y ;              // 積 x*y を計算し、その結果を変数 seki に代入
  syo = x/y ;              // 商 x/y を計算し、その結果を変数 syo に代入
  fprintf(fp , "x+y= %f ¥n", wa) ;   // ファイル ex3.txt に文字列 x+y= 並びに変数 wa の値を出力して改行
  fprintf(fp , "x-y= %f ¥n", sa) ;    // ファイル ex3.txt に文字列 x-y= 並びに変数 sa の値を出力して改行
  fprintf(fp , "x*y= %f ¥n", seki) ;   // ファイル ex3.txt に文字列 x*y= 並びに変数 seki の値を出力して改行
  fprintf(fp , "x/y= %f ¥n", syo) ;   // ファイル ex3.txt に文字列 x/y= 並びに変数 syo の値を出力して改行
  fclose(fp) ;
}

fprintf 関数内の %f は実数表記の書式指定である。


[例 4] 二つの実数 5.0e2 と 2.0e-1 の 和,差,積,商 をそれぞれ求め、 テキストファイルに桁数などの書式を指定して出力する。 なお 5.0e2 は 5.0×102 を意味する。 また 2.0e-1 は 2.0×10-1 を意味する。

// ファイル名 ex4.c

#include <stdio.h>
#include <math.h>
#include <errno.h>

void main(void)
{
  FILE *fp ;
  double x, y, wa, sa, seki, syo ;
  fp = fopen("c : ex4.txt","w") ;
  x = 5.0e2 ;
  y = 2.0e-1 ;
  wa = x+y ;
  sa = x-y ;
  seki = x*y ;
  syo = x/y ;
  fprintf(fp , "x+y= %25.18E ¥n", wa) ;
  fprintf(fp , "x-y= %25.18E ¥n", sa) ;
  fprintf(fp , "x*y= %25.18E ¥n", seki) ;
  fprintf(fp , "x/y= %25.18E ¥n", syo) ;
  fclose(fp) ;
}

fprint関数中の %25.18E は実数表記の桁数指定と小数点以下の桁数指定である。 例 4 では全体の表示桁数は 25桁で、その中の小数部分の桁数は 18桁を指定している。
実数型の計算では大きな数同士を互いに差し引くと、桁落ちが生じて計算結果の精度が 低下するので注意を要する。 なお整数型の引き算では、桁落ちは生じない。


一般にCプログラムにおいては、main 関数内に詳細な具体的処理プログラムを記さずに、 main 関数の外部に具体的処理プログラムを記した関数を作成しておき、必要に応じて main 関数側から外部の関数に具体的処理を依頼する方式をとることが多い。 以下の 例 4-1や 例 4-2 は、例 4 のプログラムを書き換えたものを示す。

[例 4-1]

// ファイル名 ex4-1.c

#include <stdio.h>
#include <math.h>
#include <errno.h>

void Keisan(FILE *fp, double x, double y) ;                // Keisan関数を void型として宣言
void PrintOut(FILE *fp, double wa, double sa, double seki, double syo) ;  // PrintOut関数を void型として宣言

void main(void)
{
  FILE *fp ;
  double x, y ;
  fp = fopen("c : ex41.txt","w") ;
  x = 5.0e2 ;
  y = 2.0e-1 ;
  Keisan(fp, x, y) ;   // Keisan関数に変数 x, y の値とファイルポインタ fp を渡す。
  fclose(fp) ;
}

void Keisan(FILE *fp, double a, double b)   // Keisan関数
{
  double wa, sa, seki, syo ;
  wa = x+y ;
  sa = x-y ;
  seki = x*y ;
  syo = x/y ;
  PrintOut(fp, wa, sa, seki, syo) ;   // PrintOut関数に変数 wa, sa, seki, syo の値とファイルポインタ fp を渡す。
}

void PrintOut(FILE *fp, double wa, double sa, double seki, double syo )  // PrintOut関数
{

  fprintf(fp, "x+y= %25.18E ¥n", wa) ;
  fprintf(fp, "x-y= %25.18E ¥n", sa) ;
  fprintf(fp, "x*y= %25.18E ¥n", seki) ;
  fprintf(fp, "x/y= %25.18E ¥n", syo) ;
}

例 4-1 において、Keisan( ){  } や PrintOut( ){  } は、void型なので値を 返さない関数である。 すなわち 値を渡すことは出来るが、その関数を呼び出して値を取得することは出来ない。 各関数 main( ){  }, Keisan( ){  }, PrintOut( ){  } などは、 互いに独立なプログラム単位であると考えてよい。 例 4-1 では、main関数は Keisan関数に値を渡した後の処理には感知せず、また Keisan関数は PrintOut関数に値を渡した後の処理には感知しない。 一般に関数の内部で宣言した変数に関しては、異なる関数間で同一の変数名を用いても、 それらは互いに独立である。 これに対して、関数の外部で宣言した変数は、すべての関数から同一の変数として参照される。


[例 4-2]

// ファイル名 ex4-2.c

#include <stdio.h>
#include <math.h>
#include <errno.h>

double Wa(double x, double y) ;   // Wa関数を double型として宣言
double Sa(double x, double y) ;   // Sa関数を double型として宣言
double Seki(double x, double y) ;  // Seki関数を double型として宣言
double Syo(double x, double y) ;  // Syo関数を double型として宣言

void main(void)
{
  FILE *fp ;
  double x, y, wa, sa, seki, syo;
  fp = fopen("c : ex42.txt","w") ;
  x = 5.0e2 ;
  y = 2.0e-1 ;
  wa = Wa(x, y) ;   // Wa関数を呼び出し、変数 x, y の値を Wa関数に渡し、結果を変数 wa に代入
  sa = Syo(x, y) ;   // Sa関数を呼び出し、変数 x, y の値を Sa関数に渡し、結果を変数 sa に代入
  seki = Seki(x, y) ;  // Seki関数を呼び出し、変数 x, y の値を Seki関数に渡し、結果を変数 seki に代入
  syo = Syo(x, y) ;  // Syo関数を呼び出し、変数 x, y の値を Syo関数に渡し、結果を変数 syo に代入
  fprintf(fp, "x+y= %25.18E ¥n", wa) ;
  fprintf(fp, "x-y= %25.18E ¥n", sa) ;
  fprintf(fp, "x*y= %25.18E ¥n", seki) ;
  fprintf(fp, "x/y= %25.18E ¥n", syo) ;
  fclose(fp) ;
}

double Wa(double x, double y )   // Wa関数
{
  return x+y ;   // 変数 x+y の値を呼び出し元へ返す。
}

double Sa(double a, double b )   // Sa関数
{
  return x-y ;   // 変数 x-y の値を呼び出し元へ返す。
}

double Seki(double a, double b )   // Seki関数
{
  return x*y ;   // 変数 x*y の値を呼び出し元へ返す。
}

double Syo(double a, double b )   // Syo関数
{
  return x/y ;   // 変数 x/y の値を呼び出し元へ返す。
}

例 4-2 において、関数 Wa( ){  }, Sa( ){  }, Seki( ){  }, Syo( ){  } などは double 型なので、 倍精度実数型の値を返す関数である。 一般に C言語 や C++ における関数は、複数個の変数を受け取ることが出来るが、 変数の値を一つだけしか返すことができない。


[例 5] 二つの整数 1000000000 (10桁) と 999999999 (9桁) の 和,差,積,商 を求めて、ファイルに出力する。

// ソースファイル名 ex5.c

#include <stdio.h>
#include <math.h>
#include <errno.h>

void main(void)
{
  FILE *fp ;
  int i, j, k1, k2, k3, k4 ;    // 変数 i, j, k1, k2, k3, k4 を整数型として宣言
  fp = fopen("c : ex5.txt","w") ;
  i = 1000000000 ;
  j = 999999999 ;
  k1 = i+j ;
  k2 = i-j ;
  k3 = i*j ;
  k4 = i/j ;
  fprintf(fp , "i+j = %d ¥n", k1) ;
  fprintf(fp , "i-j = %d ¥n", k2) ;
  fprintf(fp , "i*j = %d ¥n", k3) ;
  fprintf(fp , "j/i = %d ¥n", k4) ;
  fclose(fp) ;
}

例 5 において、積 i*j については整数型の計算可能な有効桁数 (10桁) を超えるために結果は保証されない。 整数型の除算 j/i については、少数点以下は全て切り捨てられた整数のみが出力される。


[例 6] 各種の数学関数の値をそれぞれ求めて、ファイルに出力する。

// ファイル名 ex6.c

#include <stdio.h>
#include <math.h>
#include <errno.h>

void main(void)
{
  FILE *fp ;
  double x, y1, y2, y3, y4, y5, y6, y7, y8 ;
  fp = fopen("c : ex6.txt","w") ;
  x = 2.0 ;
  y1 = sqrt(x) ;      // x の平方根
  y2 = pow(x, 8) ;     // x の 8乗
  y3 = pow(x, 8.0/3.0) ; // x の 8/3乗
  y4 = exp(x) ;      // 指数
  y5 = log(x) ;      // 自然対数
  y6 = sin(x) ;      // 正弦
  y7 = cos(x) ;      // 余弦
  y8 = tan(x) ;      // 正接
  fprintf(fp , "x = %25.18E ¥n", x) ;
  fprintf(fp , "sqrt(x) = %25.18E ¥n", y1) ;
  fprintf(fp , "pow(x, 8) = %25.18E ¥n", y2) ;
  fprintf(fp , "pow(x, 8.0/3.0) = %25.18E ¥n", y3) ;
  fprintf(fp , "exp(x) = %25.18E ¥n", y4) ;
  fprintf(fp , "log(x) = %25.18E ¥n", y5) ;
  fprintf(fp , "sin(x) = %25.18E ¥n", y6) ;
  fprintf(fp , "cos(x) = %25.18E ¥n", y7) ;
  fprintf(fp , "tan(x) = %25.18E ¥n", y8) ;
  fclose(fp) ;
}


繰り返し操作を制御する for文 を用いたプログラム例を以下に示す。 繰り返し操作のことをループという。

[例 7] 二次関数 y = x * x について、独立変数 x を一定間隔で増加させ、 それに応じた従属変数 y の値を繰り返し計算してファイル出力する。

// ファイル名 ex7.c

#include <stdio.h>
#include <math.h>
#include <errno.h>

void main(void)
{
  FILE *fp ;
  double x, y ;
  fp =fopen("c : ex7.txt","w") ;
  for( x=-5.0; x<=5.0; x=x+1.0 )
  {                    // forループの開始
    y = x*x ;              // x の 2乗を計算し、y に代入
    fprintf(fp , "%f %f ¥n", x, y) ;  // ファイル ex7.txt に変数 x と y の値を出力して改行
  }                    // forループの終了
  fclose(fp) ;
}

例 7 において、 for( x=-5.0; x<=5.0; x=x+1.0 ) {  } は、 x = -5.0 から始めて、x の値が 5.0 になるまで x を +1.0 しながら {  }中のプログラムを繰り返す forループのプログラム文である。 x の値が 5.0 になると forループ領域から抜けて繰り返し実行は終了する。 例 7 の for ( x=-5.0; x<=5.0; x =x+1.0 ) において、 x<=5.0 を x<5.0 に変えると x = 5.0 が除外されるので、+1 の間隔での繰り返し実行は x = 4.0 に達すると終了する。


[例 8] 1 から 100 までの整数をすべて加えた 1+2+3+4+ ‥ ‥ +100 の 値を求めてファイル出力する。

// ファイル名 ex8.c

#include <stdio.h>
#include <math.h>
#include <errno.h>

void main(void)
{
  FILE *fp ;
  int m, i ;
  fp =fopen("c : ex8.txt","w") ;
  m = 0 ;           // 最初に、変数 m を零に初期化
  for(i=1; i<=100; i=i+1)
  {              // forループの開始
    m = m+i ;       // 変数 m の値に i を加えた数値を m に代入
  }              // forループの終了
  fprintf(fp ,"%d ¥n", m) ;  // forループ領域から抜けた時点での変数 m の値をファイル ex8.txt に出力
  fclose(fp) ;
}

例 8 において、for(i=1; i<=100; i=i+1) {  } は、 i=1 から始めて、i の値が 100 になるまで i を +1 しながら {  }中のプログラムを繰り返す forループのプログラム文である。 i の値が 100 になると forループ領域から抜けて繰り返し実行は終了する。 このとき、forループ領域から抜けた時点での変数 m の値は 1+2+3+4+ ‥ ‥ +100 となっている。


[例 9] 1 から 10 までの整数のすべて積 1*2*3*4* ‥ ‥ *10 の値を求めてファイル出力する。

// ファイル名 ex9.c

#include <stdio.h>
#include <math.h>
#include <errno.h>


void main(void)
{
  FILE *fp ;
  int m, i ;
  fp = fopen("c : ex9.txt","w") ;
  m = 1;            // 最初に、変数 m を 1 に初期化
  for(i=1; i<=10; i=i+1)
  {            // forループの開始
    m = m*i ;      // 変数 m と i の積を m に代入
  }            // forループの終了
  fprintf(fp , "%d ¥n", m) ;  // forループ領域から抜けた時点での変数 m の値をファイル ex9.txt に出力
  fclose(fp) ;
}

例 9 において、for(i=1; i<=10; i=i+1) {  } は、 i=1 から始めて、i の値が 10 になるまで i を +1 しながら {  }中のプログラムを繰り返す forループのプログラム文である。 i の値が 10 になると forループ領域から抜けて繰り返し実行は終了する。 このとき、forループ領域から抜けた時点での変数 m の値は 1*2*3*4* ‥ ‥ *10 となっている。


条件判断を行うプログラム if 文の例を以下に記す。

[例 10] 二次方程式 a*x*x + b*x + c = 0.0 の実数解を求めてファイル出力する。 ただし実数の解がないときは 「実数解なし」 という文字列をファイル出力する。

// ファイル名 ex10.c

#include <stdio.h>
#include <math.h>
#include <errno.h>

void main(void)
{
  FILE *fp ;
  double a, b, c, D, x1, x2 ;
  fp =fopen("c : ex10.txt","w") ;
  a = 2.0;
  b = 7.0;
  c = -15.0;
  D = b*b - 4.0*a*c;          // 判別式 D の定義
  if( D >= 0.0)
  {                   // ifブロックの開始
    x1 = ( -b +sqrt(D) )/(2.0*a);  // 解 x1
    x2 = ( -b -sqrt(D) )/(2.0*a);  // 解 x2
    fprintf(fp , "x1= %f ¥n", x1) ;
    fprintf(fp , "x2= %f ¥n", x2) ;
  }                   // ifブロックの終了
  else
  {                   // elseブロックの開始
    fprintf(fp , "実数解なし ¥n") ;   // 条件式が偽になったときの処理
  }                   // elseブロックの終了
  fclose(fp) ;
}

例 10 の if( D >= 0.0 ) {  } else {  } において、条件式 D >= 0.0 が真のとき ifブロック内のプログラムを実行する。 ただし条件式 D >= 0.0 が偽になったときは、elseブロック内のプログラムを実行する。 if 文の基本構造は if ( ) {  } else {  } の形をしており、 if ( ) 中に条件式を指定し、 その直後の {  }中には条件式が真のときに行う操作プログラム (if ブロック) を記述する。 else の後の {  } 中は条件式が偽になったときの 処理プログラム (else ブロック) を記述する。 if 文において、条件式が偽になったときの処理が必要ないときは、 else {  } の部分は省略してもよい。 この場合は条件式が真のときのみを実行して終了する。 if ( )中に記せる条件式には、上例において示した D >= 0.0 以外に 下記のような式がある。
   D > 0.0   ( D は零より大きい。)
   D < 0.0   ( D は零より小さい。)
   D <= 0.0   ( D は零と等しいか零より小さい。)
   D == 0.0   ( D は零と等しい。)
   D != 0.0   ( D は零に等しくない。)
if ( )中に記す条件式が二つになる場合は、以下のように記す。
   ( D > -50.0 ) && ( D < 80.0 )     (D は -50.0 より大きく かつ D は 80.0 より小さい。)
   ( D < -50.0 ) || ( D > 80.0 )      (D は -50.0 より小さいか または D は 80.0 より大きい。)
ここで記号 && は論理における 「かつ」 、記号 || は 「または」 を意味する。


ネスト (入れ子) 構造のプログラム例を以下に記す。 ネスト (入れ子) とは、for文の中にさらに for文が入って多重ループになっている場合や if 文の中にさらに if 文が入っているようなプログラム構造のことをいう。

[例 11] 二次関数 y = a*x*x について、独立変数 x を一定間隔で変化させてy の値を計算し、 さらに係数 a についても一定間隔で変化させ y を求めてファイル出力する。

// ファイル名 ex11.c

#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <errno.h>

void main(void)
{
  FILE *fp ;
  double a, x, y ;
  fp =fopen("c : ex11.txt","w") ;
  fprintf(fp , " a   x   y ¥n") ;        // 文字 a, x, y 間に空白を挿入してファイル出力
  for(a=1.0; a<=3.0; a=a+1.0)
  {                          // a=1.0 から 3.0 まで変化させるforループの開始
    for(x=0.0; x<=5.0; x=x+1.0)
    {                        // x=0.0 から 5.0 まで変化させるforループの開始
      y=a*x*x;                  // 二次関数の値 y の計算
      fprintf(fp , "%f %f %f ¥n", a, x, y) ;   // a, x, y の各値の間に空白を挿入してファイル出力
    }
  }
  fclose(fp) ;
}

例 11 において、内側の for文のループから先に実行される。 すなわち 最初は係数 a = 1.0 一定でもって変数 x が零から 5.0 まで +1.0 されながら変化し、 次に a が +1.0 されて a = 2.0 一定でもって x が零から 5.0 まで +1.0 されながら変化する。


[例 12] 二次方程式 a*x*x + b*x + c = 0.0 の解について、 係数 a, b, c を それぞれ一定間隔で変化させ、解 x1 と x2 を求めてファイル出力する。 このとき実数解が無いときは 「実数解なし」 という文字列をファイル出力する。

// ファイル名 ex12.c

#include <stdio.h>
#include <math.h>
#include <errno.h>


void main(void)
{
  FILE *fp ;
  double a, x, y ;
  fp = fopen("c : ex13.txt","w") ;
  fprintf(fp , " a   b   c   x1   x2 ¥n") ; 
  for(a=1.0; a<=3.0; a=a+1.0)
  {                     // a=1.0 から 3.0 まで変化させる forループの開始
    for(b=0.0; b<=3.0; b=b+1.0)
    {                   // b=0.0 から 3.0 まで変化させるforループの開始
      for(c=0.0; c<=3.0; c=c+1.0)
      {                 // c=0.0 から 3.0 まで変化させるforループの開始
        D=sqrt(b*b-4.0*a*c);
        if(D >= 0.0)
        {               // if ブロックの開始
          x1=(-b+D)/(2.0*a);
          x2=(-b-D)/(2.0*a);
          fprintf(fp , "%f %f %f %f %f ¥n", a, b, c, x1, x2) ; 
        }                // if ブロックの終了
        else
        {                // else ブロックの開始
          fprintf(fp , "%f %f %f  実数解なし ¥n", a, b, c) ; 
        }                // else ブロックの終了
      }                  // c=0.0 から 3.0 まで変化させるforループの終了
    }                    // b=0.0 から 3.0 まで変化させるforループの終了
  }                      // a=1.0 から 3.0 まで変化させるforループの終了
  fclose(fp) ;
}


 Java (ジャバ) へ進む

 情報技術 へ戻る

 トップページ へ戻る