プログラミング言語基礎

吉田 宏    
福島県立医科大学
Email: yoshidah@fmu.ac.jp

 
 
 

シラバスはここにあります。


テキストは最初の授業で配布しますが,紛失した人は ここからダウンロード してください。このファイルはpdfファイルです。



テキストの正誤表

テキストの正誤表はここにあります。

Cygwinの起動の仕方

  1. デスクトップ左下の「スタート」をクリックする。
  2. 「その他のプログラム...」にマウスポインタを合わせる
  3. 今使用しているパソコンで利用できるアプリケーションの一覧のメニューが現れる
  4. メニューの中の「Cygwin」にマウスポインタを合わせ,さらに矢印にマウスポインタを移動する
  5. 「Cygwin Bash Shell」と書かれたメニューが横に現れるので,それをクリックする

Cygwin Shellの画面の色の変え方

  1. Cygwin Shellのタイトルバーを右クリックする
  2. 現れたメニューの中の「プロパティ」を選択する
  3. 「~ のプロパティ」というウインドウが開くので,その中の「画面の色」とあるところをクリックする
  4. 「画面の背景」「画面の文字」のどの中から,変えたい部分をクリックし,変えたい色を指定する
  5. 「OK」をクリックする
  6. 「ショートカットへのプロパティの適応」というウインドウが現れるので,その中の「現在のウインドウだけに適応する」を選択して「OK」をクリックする

Cygwin Shellの終了の仕方

  1. 方法1 「Cygwin Shell」のタイトルバーの右端にある×印をクリックする
  2. 方法2 「Cygwin Shell」の中で「$ exit」と入力する
  3. 方法3 「Cygwin Shell」の中で [Ctrl]キーを押しながら「D」を押す
これらどの方法でも「Cygwin」を終了することができるが、 方法2,3はUNIX的には安全な終了方法だと思います。

プログラム(xxxxx.cのようにファイル名の最後に「.c」とあるファイル)のコンパイル

Cygwinではプログラムのコンパイルには"gcc"を使います。
  1. 単純な方法 gcc プログラム名
    例 ex0101.c のコンパイル
    $ gcc ex0101.c

    この方法だと、どのようなプログラムであっても、実行ファイルが "a.exe"という名前になってしまう。

  2. もう少しましな方法 gcc -o 実行ファイル名 プログラム名
    例 ex0201.c のコンパイル
    $ gcc -o ex0201 ex0201.c

    この方法だと、生成される実行ファイルは "ex0201.exe"という名前になる。


絶対にやってはいけないこと

gcc -o プログラムファイル名 プログラムファイル名
例 ex0301.cをコンパイルしようとして...
$ gcc -o ex0301.c ex0301.c
としてしまった(-_-;)
「ex0301.c」という実行ファイルがもともとのプログラムファイル「ex0301.c」に上書き保存されてしまう(;_;)。したがって 編集できるプログラムファイル「ex0301.c」が消えてしまう。


プログラムの例(素数を求めるプログラム)

   1: /* 素数を求めるプログラム prime.c*/
   2: #include <stdio.h>
   3: #include <stdlib.h>
   4: #include <time.h>
   5: #define _TRUE  1
   6: #define _FALSE 0
   7: 
   8: int main(int argc, char *argv[])
   9: {
  10:   /* 各種変数の宣言 */
  11:   int i,j,k,n,*prime; /* 整数       */
  12:   long *list;         /* 倍長整数   */
  13:   time_t start,end;   /* 時間変数   */
  14: 
  15:   /* パラメータの設定 */
  16:   if ( argc > 2){
  17:     printf("Usage: prime Maximum_Integer \n");
  18:     exit(1);
  19:   } else if ( argc<2 ){
  20:     printf("Usage: prime Maximum_Integer \n");
  21:     printf("Input Maximum_Integer -->");
  22:     scanf("%d",&n);
  23:   } else {
  24:     n=atoi(argv[1]);
  25:   }
  26:   /* 時間の計測 始まりの時刻 */
  27:   time(&start);
  28: 
  29:   /* 配列prime[n]とlist[n]の動的確保 */
  30:   prime=(int *)malloc(n*sizeof(int));
  31:   list=(long *)malloc(n*sizeof(long));
  32:   k=1;
  33:   list[k]=2;
  34:  
  35:   for(i=3;i<=n;i+=2) prime[i]=_TRUE;
  36:   for(i=3;i<=n;i+=2){
  37:     if(prime[i]){
  38:       list[++k]=i;
  39:       for(j=i;j<=n;j+=i) prime[j]=_FALSE;
  40:     }
  41:   }
  42: 
  43:   for(i=1;i<k;i++){
  44:     printf("%7d,",list[i]);
  45:     if(i%10==0) printf("\n");
  46:   }
  47:   printf("%7d. \n",list[k]);
  48: 
  49:   /* 時間の計測 終わりの時刻 */
  50:   time(&end);
  51: 
  52:   printf("%g[sec]\n",difftime(end,start));
  53:   return 0;
  54: }

授業で使用したスライドとプログラム

ここに授業で使用したスライドをpdfファイルにしたものと,プログラムの一部を置いておきます。
 第1回 4/14「何もしないプログラム」 ex0001.c
 第2回 4/21 「Cygwin上のコマンドたち」
 第3回 4/28 「簡単なプログラム」 「printf関数」 ex0101.c ex0102.c ex0103.c ex0104.c
 第4回 5/12 「printf関数」 ex0105.c
 第5回 5/19 「変数」& 「scanf関数」 ex0201.c ex0202.c ex0203.c ex0204.c ex0205.c
 第6回 5/26 「演算と変数型」 ex0206.c
 第7回 6/02 「while文」 ex0207.c ex0208.c ex0209.c
 第8回 6/09 「配列」 ex0210.c ex0211.c
 第9回 6/16 「フローチャート」& 「制御文:繰り返し編」 ex0301.c ex0302.c 「for文」 ex0400.c
第10回 6/23 「繰り返し」と「条件分岐」 ex0401.c ex0402.c ex0403.c ex0404.c ex0405.c ex0406.c
第11回 6/30 「if文」 ex0407.c ex0408.c ex0409.c ex0410.c
第12回 7/07 「ファイル操作」 ex0501.c tmp.dat ex0502.c planet.c planet.dat
第13回 7/14 「ファイル操作2」& 「関数」 ex0502.c ex0601.c ex0602.c ex0603.c ex0604.c ex0605.c trape.c

0. なにもしないプログラム


ex0001.c
   1: /* ex0001.c 何もしないプログラム  */
   2: /* 作成者 xxxxx   */
   3: /* 作成日  2004/04/14   */
   4: 
   5: int main()
   6: {
   7:    return 0;
   8: }

1. 簡単なプログラム


ex0101.c
   1: /* ex0101.c        */
   2: /* 作成日  2004/04/21    */
   3: /* 作成者 xxxxx    */
   4: #include <stdio.h>
   5: 
   6: /* 開始 */
   7: int main()
   8: {
   9:     printf("Hello, World!\n");
  10:     return 0;
  11: }
  12: /* 終了 */

2. 変数


ex0201.c
   1: /* ex0201.c   y=x*x+2*x+1を計算するプログラム    */
   2: /* 作成日  2004/05/12    */
   3: /* 作成者 xxxxx    */
   4: #include <stdio.h>
   5:  
   6: /* 開始 */
   7: int main()
   8: {
   9:   int x,y; /* x,yを整数型変数として宣言。 (宣言文) */
  10: 
  11:   printf("xを入力してください->");
  12:   scanf("%d",&x);/* xに値を整数型のデータとして入力 */
  13: 
  14:   y=x*x+2*x+1;    /* yに値を代入 (代入文)*/
  15: 
  16:   printf("xが%dのとき,y=x*x+2*x+1は %d です\n",x,y);
  17:   return 0;
  18: }
  19: /* 終了 */

ex0206.c
   1: /* ex0206.c 角度を「度」から「ラジアン」に変換するプログラム */
   2: /* 作成者 xxxx */
   3: /* 作成日 2004/05/26 */
   4: 
   5: #include <stdio.h> /* stdio.hをインクリュードする */
   6: int main() /* main関数 */
   7: {
   8:   int radian,degree=0; /* 整数型radian, degreeの宣言 */
   9:   float PI=3.141592654; /* PI 円周率 */
  10:   
  11:   while(degree <= 180){
  12:     radian = degree*PI/180; /* ラジアンの換算 */
  13:     printf("%d  %d\n",degree,radian); /* 結果の出力 */
  14:     degree+=10; /* degreeを10増やす */
  15:   }
  16:   return 0; /* 終了 */
  17: }

ex0210.c
   1: /* ex0210.c 行列と配列の対応 */
   2: /* 作成日 2004/06/02 */
   3: /* 作成者 xxxxx */
   4: #include <stdio.h>
   5: 
   6: int main()
   7: {
   8:   int a[2][3]={{11,12,13},{21,22,23}};
   9:   int i,j;
  10: 
  11:   i=j=0;
  12:   while(i<2){
  13:     while(j<3){
  14:       printf("aの%1d行%1d列の要素a_{%1d,%1d}=%2d\n",i+1,j+1,i+1,j+1,a[i][j]);
  15:       j++;
  16:     }
  17:     j=0;i++;
  18:   }
  19:   return 0;
  20: }

ex0211.c
   1: /* ex0211.c ベクトルの内積 */
   2: /* 作成日 2004/06/02 */
   3: /* 作成者 XXXXXX */
   4: #include <stdio.h>
   5: #include <math.h>
   6: #define NDIM 2
   7: 
   8: int main()
   9: {
  10:   double alpha,la,lb,ab,a[NDIM],b[NDIM];
  11:   int i=0;
  12: 
  13:   while(i<NDIM){
  14:     printf("ベクトルaの第%d成分を入力してください-->",i+1);
  15:     scanf("%lf",&a[i]);
  16:     printf("ベクトルbの第%d成分を入力してください-->",i+1);
  17:     scanf("%lf",&b[i]);
  18:     i++;
  19:   }
  20: 
  21:   la=lb=ab=0.0;
  22:   i=0;
  23:   while(i<NDIM){
  24:     la+=a[i]*a[i];
  25:     lb+=b[i]*b[i];
  26:     ab+=a[i]*b[i];
  27:     i++;
  28:   }
  29:   alpha=acos(ab/sqrt(la*lb));
  30:   printf("aとbの成す角は%10.3f度です\n",alpha/M_PI*180);
  31:   return 0;
  32: }

3. フローチャートを作る!


ex0301.c
   1: /* ex0301.c1からnまでの和を求めるプログラム*/
   2: /* 作成者 xxxxxxxx */
   3: /* 作成日 2004/06/16 */
   4: #include <stdio.h>
   5: 
   6: int main()
   7: {
   8:   int s,n,i;  /* i,s,n を整数型として宣言 */
   9: 
  10:   i=0; /* iの初期化 */
  11:   s=0; /* sの初期化 */
  12:   
  13:   printf("Input n -->");
  14:   scanf("%d",&n); /* nの入力 */
  15: 
  16:   while(i<=n){ /* i が n より小さかったら */
  17:     s+=i; /* sにiを加える */
  18:     i++;  /* iを1増やす */
  19:   }
  20:   printf("%5d %5d\n",n,s); /* 結果の出力 */
  21:   return 0;
  22: }

4. 制御文


ex0400.c
   1: /* ex0400.c 星の三角形 for文の例 */
   2: /* 作成者 xxxxxxxx */
   3: /* 作成日 2004/06/16 */
   4: #include <stdio.h>
   5: int main(){
   6:   int i,j;
   7: 
   8:   for(i=0;i<10;i++){
   9:     for(j=0;j<=i;j++) printf("*");
  10:     printf("\n");
  11:   }
  12:   
  13:   for(i=9;i>=0;i--){
  14:     for(j=0;j<=i;j++) printf("*");
  15:     printf("\n");
  16:   }
  17:   return 0;
  18: }

ex0401.c
   1: /* ex0401.c 角度を「度」から「ラジアン」に変換するプログラム */
   2: /* 作成者 xxxxxx */
   3: /* 作成日 2004/06/23 */
   4: #include <stdio.h>
   5: 
   6: int main()
   7: {
   8:   int degree;
   9:   float radian;
  10:   float PI=3.141592654;
  11: 
  12:   for(degree=0;degree<=180;degree+=10){
  13:     radian = degree*PI/180;
  14:     printf("%4d %8.3f\n",degree,radian);
  15:   }
  16:   return 0;
  17: }

ex0209.cのプログラムがない人へ

6月23日の授業では,ex0209.cのプログラムが必要になるかもしれません。このプログラムをまだ作成していない人は 次の手順でex0209.cをカレントディレクトリに保存してください。

保存方法
  1. ここをクリックし,
  2. 「Ctrl」を押しながらaを押し,
  3. 「Ctrl」を押しながらcを押す。
  4. 更にカレントディレクトリ( ~/C/Lec04/ )で
    notepad ex0209.c
    を実行し,notepadの中で「Ctrl」を押しながらvを押す。
  5. notepadに現れたプログラムを保存する。
  6. 保存されたプログラムをコンパイルし,実行してみる。

ex0404.c
   1: /* ex0404.c 角度を「度」から「ラジアン」に変換するプログラム */
   2: /* 作成者 xxxxxx */
   3: /* 作成日 2004/06/23 */
   4: #include <stdio.h>
   5: 
   6: int main()
   7: {
   8:   int degree=0;
   9:   float radian;
  10:   float PI=3.141592654;
  11: 
  12:   do{
  13:     radian = degree*PI/180;
  14:     printf("%4d %8.3f\n",degree,radian);
  15:     degree+=10;
  16:   }while(degree<=180);
  17:   return 0;
  18: }

ex0407.c
   1: /* ex0407.c if文を使ったプログラム */
   2: /* 作成者 xxxxxx */
   3: /* 作成日 2004/06/23 */
   4: #include <stdio.h>
   5: 
   6: int main()
   7: {
   8:   int a,b;
   9: 
  10:   printf("aとbを入力してください-->");
  11:   scanf("%d %d",&a,&b);
  12:   
  13:   if(a>b){
  14:     printf("a(%d)はb(%d)より大きい\n",a,b);
  15:   } else {
  16:     printf("a(%d)はb(%d)より大きくない\n",a,b);
  17:   }
  18:   return 0;
  19: }

ex0409.c
   1: /* ex0409.c 複数の分岐を持つプログラム */
   2: /* 作成者  xxxxxxx */
   3: /* 作成日  2004/06/23 */
   4: #include <stdio.h>
   5: 
   6: int main()
   7: {
   8:   double a;
   9: 
  10:   printf("実数 a を入力してください-->");
  11:   scanf("%lf",&a);
  12:   if(a>=1000.0){
  13:     printf("aは1000以上(a=%10.3f)\n",a);
  14:   }else if(a>=500.0){
  15:     printf("aは500以上1000未満(a=%10.3f)\n",a);
  16:   }else if(a>=100.0){
  17:     printf("a は 100以上500未満(a=%10.3f)\n",a);
  18:   }else if(a>=50){
  19:     printf("a は 50以上100未満(a=%10.3f)\n",a);
  20:   }else if(a>=10){
  21:     printf("a は 10以上50未満(a=%10.3f)\n",a);
  22:   }else if(a>=0){
  23:     printf("a は 0以上10未満(a=%10.3f)\n",a);
  24:   }else{
  25:     printf("a は 負(a=%10.3f)\n",a);
  26:   }
  27:   return 0;
  28: }

ex0410.c
   1: /* ex0410.c もう1つのif文  */
   2: /* 作成者 xxxxx */
   3: /* 作成日 2004/06/23 */
   4: #include <stdio.h>
   5: 
   6: int main()
   7: {
   8:   int a,b,n,m;
   9: 
  10:   n=m=0;
  11:   printf("整数aを0から10の範囲で入力してください-->");
  12:   scanf("%d",&a);
  13:   while(a<0||a>10){ /* 「a<0またはa>10」のとき */
  14:     ++n;
  15:     if(n>3) {
  16:       printf("しつこい奴だ!\n aは 7とするぞ!\n");
  17:       a=7;
  18:     }else{
  19:       printf("もう一度,整数aを0から10の範囲で入力してください-->");
  20:       scanf("%d",&a);
  21:     }
  22:   }
  23:   
  24:   printf("整数bを0から10の範囲で入力してください-->");
  25:   scanf("%d",&b);
  26:   while(b<0||b>10){ /* 「b<0またはb>10」のとき */
  27:     ++m;
  28:     if(m>3){
  29:       printf("しつこい奴だ!\n bは6とするぞ!\n");
  30:       b=6;
  31:     }else{
  32:       printf("もう一度,整数bを0から10の範囲で入力してください-->");
  33:       scanf("%d",&b);
  34:     }
  35:   }
  36:   printf("aは%2d, bは%2dです。\n",a,b);
  37: 
  38:   if(a-b) printf("38行目: (真) aとbは等しくない。 a-b=%2d\n",a-b);
  39:   else printf("39行目: (偽) aとbは等しい。 a-b=%2d\n",a-b);
  40:   
  41:   if(!(a-b)) printf("41行目:!(真) aとbは等しい (a-b)=%2d\n",a-b);
  42:   else printf("42行目:!(偽) aとbは等しくない。 a-b=%2d\n",a-b);
  43: 
  44:   return 0;
  45: }

5. ファイル操作

ex0501.cのプログラムで使用するtmp.datはここにあります。

tmp.dat
1浅井清和 56 45 2.3
2井上ひかる 45 66 2.5
3宇野泰三 91 21 4.1
4遠藤芳美 54 25 5.4
5岡村文雄 87 41 7.3

ex0501.c
   1: /* ex0501.c データを読み込ませるプログラム */
   2: /* 作成者 xxxxxx */
   3: /* 作成日 2004/07/07 */
   4: #include <stdio.h>
   5: #include <stdlib.h>
   6: #define N 5
   7: 
   8: int main()
   9: {
  10:    FILE *fp;
  11:    char name[N][20];
  12:    int i;
  13:    int num[N],kokugo[N],sansuu[N];
  14:    double hyouka[N];
  15: 
  16:    fp=fopen("tmp.dat","r");
  17:    if(fp==NULL){
  18:      printf("ファイルがありませんでした");
  19:      exit(1);
  20:    }
  21:    for(i=0;i<N;i++)
  22:      fscanf(fp,"%d %s %d %d %lf",
  23:        &num[i],name[i],&kokugo[i],&sansuu[i],&hyouka[i]);
  24:    fclose(fp);
  25: 
  26:    for(i=0;i<N;i++) 
  27:       printf("%2d %s %4d %4d %5.2f\n",
  28:          num[i],name[i],kokugo[i],sansuu[i],hyouka[i]);
  29:    return 0;
  30: }
  31:

ex0502.c
   1: /* ex0502.c データを読み込ませ,
   2:    計算結果をファイルに書き込ませるプログラム */
   3: /* 作成者 xxxxxx */
   4: /* 作成日 2004/07/07 */
   5: #include <stdio.h>
   6: #include <stdlib.h>
   7: #define N 5
   8: 
   9: int main()
  10: {
  11:    FILE *fin,*fout;
  12:    char name[N][20];
  13:    int i;
  14:    int num[N],kokugo[N],sansuu[N],total;
  15:    double hyouka[N];
  16: 
  17:    fin=fopen("tmp.dat","r");
  18:    if(fin==NULL){
  19:      printf("ファイルがありませんでした");
  20:      exit(1);
  21:    }
  22:    for(i=0;i<N;i++)
  23:      fscanf(fin,"%d %s %d %d %lf",
  24:        &num[i],name[i],&kokugo[i],&sansuu[i],&hyouka[i]);
  25:    fclose(fin);
  26: 
  27:    fout=fopen("kekka.dat","a");
  28:    for(i=0;i<N;i++) {
  29:       total=kokugo[i]+sansuu[i];
  30:       printf("%2d %s %4d\n",num[i],name[i],total);
  31:       fprintf(fout,"%2d %s %4d\n",num[i],name[i],total);
  32:    }
  33:    fclose(fout);
  34:    return 0;
  35: }
  36:

課題5.4 で使用するplanet.datはここにあります。

planet.dat
惑星 公転周期 軌道半径
水星 0.24085 0.37100
金星 0.61521 0.72400
地球 1.00004 1.00000
火星 1.88089 1.50800
木星 11.86223 5.19300
土星 29.45772 9.51600
天王星 84.01300 19.14000
海王星 164.79000 30.08000
冥王星 248.40000 36.78000

6.関数


ex0601.c
   1: /* ex0601.c 関数を使ったプログラム */
   2: /* 作成者 xxxxx */
   3: /* 作成日 2004/07/14 */
   4: #include <stdio.h>
   5: double MaX(double a,double b);    /* 関数のプロトタイプの宣言を定義する */
   6: int main() /* main関数 */
   7: {
   8:    double aa,bb,cc;
   9: 
  10:    printf("数値を入力してください a-->");
  11:    scanf("%lf",&aa);
  12:    printf("もう1つ数値を代入してください b-->");
  13:    scanf("%lf",&bb);
  14: 
  15:    cc=MaX(aa,bb); /* 関数 MaXをaa,bbを使って呼び出している。ccに結果が戻される */
  16:    printf("%fと%fでは%fのほうが大きい\n",aa,bb,cc);
  17:    return 0;
  18: }
  19: double MaX(double a,double b)
  20: {
  21:    double c;
  22: 
  23:    if(a>=b) c=a;
  24:    else c=b;
  25:    return c;
  26: }

ex0603.c
   1: /* ex0603.c void関数の例 */
   2: /* 作成者 xxxx */
   3: /* 作成日 2004/07/14 */
   4: #include <stdio.h>
   5: void star(int n);
   6: 
   7: int main()
   8: {
   9:    int i,j;
  10:    for(i=0;i<10;i++) star(i);
  11: 
  12:   for(i=9;i>=0;i--) star(i);
  13:   return 0;
  14: }
  15: 
  16: void star(int n)
  17: {
  18:   int i;
  19:   for(i=0;i<n;i++)printf("*");
  20:   printf("\n");
  21: }

ex0604.c
   1: /* ex0604.c 数値の配列を関数に渡すプログラム  N次元の内積 */
   2: /* 作成者 xxxxxx */
   3: /* 作成日 2004/07/14 */
   4: #include <stdio.h>
   5: double ScalarProduct(double a[],double b[], int n);
   6: 
   7: int main()
   8: {
   9:   double a[10],b[10],sprd;
  10:   int N,i;
  11: 
  12:   printf("ベクトルの次元はいくつ?-->");
  13:   scanf("%d",&N);
  14: 
  15:   for(i=0;i<N;i++){
  16:     printf("ベクトルaの%2d番目の成分の値を入力してください。-->",i+1);
  17:     scanf("%lf",&a[i]);
  18:   }
  19: 
  20:   for(i=0;i<N;i++){
  21:     printf("ベクトルbの%2d番目の成分の値を入力してください。-->",i+1);
  22:     scanf("%lf",&b[i]);
  23:   }
  24: 
  25:   sprd=ScalarProduct(a,b,N); /* aとbの内積 */
  26:   printf("aとbの内積は%5.2fです。\n",sprd); 
  27: 
  28:   return 0;
  29: }
  30: 
  31: double ScalarProduct(double x[],double y[], int n) /* 内積の定義 */
  32: {                      /* nでデータが入っている配列の数を指定する。*/
  33:   int i;
  34:   double sp=0.0;
  35:   
  36:   for(i=0;i<n;i++) sp+=x[i]*y[i];
  37:   return sp;
  38: }

ex0605.c
   1: /* ex0605.c 複数のデータを返す関数の例 */
   2: /* 作成者 xxxxxx */
   3: /* 作成日 2004/07/14 */
   4: #include <stdio.h>
   5: void MaXMiN(int a,int b,int *m, int *n); 
   6: /* void型関数としてプロトタイプ宣言*/
   7: 
   8: int main()
   9: {
  10:   int a,b,mx,mn;
  11: 
  12:   printf("2つ整数を入力してください。");
  13:   scanf("%d %d",&a,&b);
  14:   MaXMiN(a,b,&mx,&mn);                /*  関数の呼び出し */
  15:   printf("大きいのは %dで,小さいのは %dです。\n",mx,mn);
  16:   return 0;
  17: }
  18: 
  19: void MaXMiN(int a,int b,int *m, int *n) /* 関数の定義 */
  20: {             /* m,n はポインタと呼ばれるアドレスを値とする変数 */
  21:   if(a>=b){
  22:     *m=a; /* "*m"はmで指定されたアドレスの値。*/
  23:     *n=b;    /* aの値をmで指定したアドレスに記憶させる。*/
  24:   }else{
  25:     *m=b;
  26:     *n=a; /* "*n"はnで指定されたアドレスの値。 */
  27:   }          /* bの値をnで指定したアドレスに記憶させる。*/
  28: }

trape.c
   1: /* trape.c 台形公式を使った数値積分 */
   2: /* 作成者 xxxxxx */
   3: /* 作成日 2004/07/14 */
   4: #include <stdio.h>
   5: #include <math.h>
   6: 
   7: double func(double x);
   8: double Sekibun(double a,double b,double h);
   9: 
  10: int main()
  11: {
  12:   double h,a,b,S;
  13:   char fname[40];
  14:   FILE *fout;
  15:   int i=0,N=1;
  16:   
  17:   printf("ファイル名を入力してください-->");
  18:   scanf("%s",fname);
  19:   fout=fopen(fname,"w");
  20: 
  21:   a=0.0;
  22:   b=1.0;
  23: 
  24: 
  25:   h=b-a;
  26:   while(i<20){
  27:     i++;
  28:     h*=0.5;
  29:     N*=2;
  30:     S=Sekibun(a,b,h);
  31:     printf("%2d %7d %10.5e %20.16f %15.10e\n",i,N,h,S,1.-S/M_PI);
  32:     fprintf(fout,"%2d %7d %10.5e %20.16f %15.10e\n",i,N,h,S,1.-S/M_PI);
  33:   }
  34:   fclose(fout);
  35:   return 0;
  36: }
  37: 
  38: double Sekibun(double a,double b,double h)
  39: {
  40:   double x,sum;
  41: 
  42:   x=a;
  43:   sum=0.5*(func(a)+func(b));
  44:   while((x+=h)<b) sum+=func(x);
  45:   sum*=h;
  46:   return sum;
  47: }
  48: 
  49: double func(double x)
  50: {
  51:   return 4.0/(1.0+x*x);
  52: }

その他


自分のパソコンにCコンパイラをインストールして,Cプログラミングを勉強したい人へ

自分のパソコンにCコンパイラを導入するには, Borland社のCコンパイラ(bcc32)がFreeソフトとして 以下のURLで公開されているので,これを使うとよいでしょう。

http://www.borland.co.jp/cppbuilder/freecompiler
にて必要事項を登録してダウンロードしてください。
大学のパソコンにダウンロードし,それをスティックメモリなどのUSB対応の 外部記憶装置にコピーして自宅へ持っていくのが最も簡単です。(ファイルの大きさは 8.7MBくらいありますので,フロッピーディスクには入りきりません。)
インストール後の設定は,インストールしたディレクトリ内のReadme.txtを読んでください。 このソフトをパソコンにインストールすると大体50MBくらいになります。
このCコンパイラでプログラムをコンパイルするには,
  1. Windowsのコマンドプロンプトを開きます。
  2. コンパイルは次のようにします。
      bcc32 プログラム名
    例えば,ex0201.cをコンパイルするときは,
      bcc32 ex0201.c
    とすればコンパイルできます。
(注)CygwinのShellではディレクトリの区切りに / を使っていましたが, コマンドプロンプトでは \ になります。例えば,「C/Lec02」 は 「C\Lec02」となります。 また,Cygwinではホームディレクトリは 「~/」で表現していましたが,Windowsでは ホームディレクトリは特に設定されていないので,このような表現は使えません。
また,コマンドプロンプト内で使用できる主なコマンドはテキストのp.4「表0.1 良く使うコマンド」を参照してください。

Cygwinを自分のパソコンにインストールして,Cプログラミングを勉強したい人へ

Cygwinを自分のパソコン(PC)にインストールすると,情報センターとほとんど同じ環境で Cの勉強ができます。ただし,Cygwinのpackageを全てダウンロードすると250MB(実質350MB)程度に なるので,自宅のPCがADSLなどでインターネットに常時接続されている場合以外は,あまりお勧め ではありません。更に,全ての機能をPCにインストールするには,ハードディスクに 大体900MB〜1GB以上の空き容量が必要とされます。 詳しくは

「Using Cygwin」(by 早田氏@東工大) http://www.mars.dti.ne.jp/~sohda/cygwin/



「@IT:真ゼロ円でできるXサーバ[Windows XP編]」http://www.atmarkit.co.jp/flinux/special/cygwin2/cygwin01a.html

などを参考にするとよいでしょう。