C言語とPascalとの対応

この教科書ではPascal言語を使用していますが、授業ではC言語を使います。ここでは教科書中のPascal言語で記述してある擬似コード等を、C言語に変換してありますので参考にしてください。第3章 3.2の説明まで、および第4章は左側にC言語、右側にPascal言語が並列記述してありますが、アルゴリズムやプログラムはC言語だけになっています。


     C言語                 Pascal言語

< 第2章 2.2(P.29) >
     =                 :=  代入(転送)


< 第3章 3.2(P.49) >

○擬似コード  C言語              Pascal
逐次構造    ; ; ;             ; ; ;
 (ブロック { ;  ;  ;}           begin ; ; ; end)


選択構造
1. if (条件)                          if 条件
  {                                then 文
  真の時の処理1; (セミコロン)         else 文
      処理2;   
       :  
  }  
 else  
  {  
  偽の時の処理1;  
      処理2;  
       :  
  }  
  

2. switch (式)                case x of
 {  
  case 値1: (コロン)                      値1:値1の場合の処理;
     値1の場合の処理;  
     break;  
  case 値2:                                値2:値2の場合の処理
     値2の場合の処理;  
     break;                             end
  default:  
     どれでもない場合の処理;  
     break;  
 }  
  
反復構造  
1. while (繰り返し条件)                      while 条件 do 繰り返し処理
 {  
   繰り返し処理1;  
        :  
 }  

2. do {                                      repeat 繰り返し処理
   繰り返し処理;  
  } while (繰り返し条件);                   until 終了条件

3. for (i=初期値 ; i<=最終値 ; ++i)          for 初期値 to 最終値
 {                                              do 繰り返し処理
    繰り返し処理1;                        for 初期値 downto 最終値
        :                               do 繰り返し処理
 }  
     ++i は i=i+1 とほぼ同じ  



○演算子

    + - * /                算術演算              + - * /
    %                      剰余                  ?
    =                      代入                  :=
    == != >= <= > <   比較                  =  ? ? ? ?
    &&  ||  !            論理演算              and or not
    ++ (a = a+1)          インクリメント演算子  
    -- (a = a-1)          デクリメント演算子  

     (b = ++a; …aに1を加えてから、その値をbに代入する)
     (b = a++; …aをbに代入してから、aに1を加える)

○コメント注釈
     /* コメント */           {コメント}


< 第3章 3.2 【演習3.12】(P.57) > 
 {
  S1;
  while (P2) {
   S2;
   do {
    S3;
    S4;
    S5;
   } while (P5) ;
  }
  if (P6) {
   do {
    S7;
   } while (P7) ;
  } else {
   if (P8) {
    S8;
   } else {
    S9;
   }
  }
 }


< 第3章 3.2【演習3.14】(P57) > 
 {
  S1;
  if (P2) {
   while (P3) {
    S3;
   }
   if (P4) {
    S4;
    S5;
   }
  }
  do {
   S6;
   S7;
   if (P8) {
     S8;
   } else {
     S9;
   }
  }while (P9) ;
 }

< 第3章 3.3 【例題3.2】(P.58) > 
{
 1. データの入力 ;
 2. 処理する ;       
 3. 結果の出力(表示) ;
}

(P.60)
 /* 1. データの入力 */
 {
  1.1 基底打席数を読む ;
  1.2 全選手の打撃成績を読む ;
 }

 /* 1.2 全選手の打撃成績を読む */ 
 while(選手がまだ残っている) {
   1.2.1 次の選手の打撃成績を読む;
 }

 /* 2. 処理 */
 {
  2.1 打席数が規定打席数に満たない選手を除く ;
  2.2 残った選手について、打率を計算する ;
  2.3 打率が大きい順に上位10人を求める ;
 }


(P.61)
 /* 3. 結果の出力 */
 {
  3.1 見出しを印刷する ;
  3.2 for(i=1 ; i<=10 ; i++) {
    3.2.1 打撃順位iの選手の選手名と打撃成績を表示する ;
    }
 }


 {
  /* 1. データの入力 */
  {
   1.1 基底打席数を読む ;
     while(選手がまだ残っている){
      1.2.1 次の選手の打撃成績を読む;
     }
  /* 2. 処理 */
  {
   2.1 打席数が規定打席数に満たない選手を除く ;
   2.2 残った選手について、打率を計算する ;
   2.3 打率が大きい順に上位10人を求める ;
  }
  /* 3. 結果の出力 */
  {
   3.1 見出しを印刷する ;
   3.2 for(i=1 ; i<=10 ; i++) {
     3.2.1 打撃順位iの選手の選手名と打撃成績を印刷する ;
     }
  }
 }


< 第3章 3.4 【例題3.3】(P.62) > 

(P.64)
 /* sort */
 {
  for( i=1 ; i<=n-1 ; i=i+1) {
   1. 最大値を求めて入れ換える ; 
  }
 }


(P.64)
 /* 1. 最大値を求めて入れ換える*/ 
 {
  1.1 最大値を求める ;
  1.2 値を入れ換える ; 
 }


(P.65)
 /* 1.1 最大値を求める */
 {
  max=a[i] ; 
  for( j=i+1 ; j<=n ; j=j+1) {
   1.1.1 最大値と比較して必要ならば最大値を置き換える ;
  }
 }


 /* 1.1.1 最大値と比較して必要ならば最大値を置き換える */
 {
  if(a[j]>max) {
   max=a[j] ;
  }
 }


(P.67)
 /* 1.1.1' 最大値と比較して必要ならば最大値を置き換える */
 {
  if(a[j]>max) {
    max=a[j] ;
    jmax=j ;
  }
 }


(P.68) 修正版
 /* 1.1' 最大値を求める */
  {
   max=a[i] ; 
   jmax=i ; 
   for(j=i+1 ; j<=n ; j=j+1) {
    1.1.1' 最大値と比較して必要ならば最大値を置き換える ; 
   }
  }


 /* 1.2 値を入れ換える */ 
  {
   a[jmax]=a[i] ; 
   a[i]=max ; 
  }


(P.68) プログラムの形・・省略(課題になっている)


< 第3章 3.6 【例題3.4】(P.78) > 
アルゴリズム1( for 文使用)
 {
  result=0;
    for( i=1; i<=n; ++i){
       if( table[i] == data){
          result = i;
       }
    }
  }

アルゴリズム1(while 文使用)
 {
  result=0;
  i=1;
  while( i<=n ){
    if( table[i] == data ){
      result=i;
    }
    i=i+1;
  }
 }

(P.79)アルゴリズム2 (goto使用)
  /* (for 文使用) */

 {
    result=0;
    for( i=1; i<=n; ++i){
       if( table[i] == data){
          result=i;
          goto found;
       }
    }
    found:  /* (コロン) */
  }
 
(P.79)アルゴリズム2 (goto使用)
  /* (while 文使用) */
 {
  result=0;
  i=1;
  while( i<=n ){
    if( table[i] == data ){
      result=i;
      goto found;
    }
    i=i+1;
  }
  found: /* (コロン) */
 }

アルゴリズム2' (break使用)
  /* (for 文使用) */
  {
    result=0;
    for( i=1; i<=n; ++i){
        if( table[i] == data ){
          result=i;
            brak;
    }
  }
 }

アルゴリズム2' (break使用)
  /* (while 文使用) */
 {
  result=0;
  i=1;
  while( i<=n ){
    if( table[i] == data ){
      result=i;
      break;
    }
    i=i+1;
  }
 }


(P.80)アルゴリズム3 (「スイッチ」使用)
  /* (for 文使用) */
 {
  result=0;
  found=0;
    for( i=1; i<=n && found == 0; ++i){
    if( table[i] == data ){
      result=i;
      found=1;
    }
  }
 }

(P.80)アルゴリズム3 (「スイッチ」使用)
  /* (while 文使用) */
 {
  result=0;
  found=0;
  i=1;
  while( i<=n && found==0 ){
    if( table[i] == data ){
      result=i;
      found=1;
    }
    i=i+1;
  }
 }


(P.81)アルゴリズム4 (「番兵」使用)
  /* (for 文使用) */
 {
  table[n+1]=data;
    for( i=1; table[i] != data; ++i)
    ;
  }
  if( i<=n ){
    result=i;
  }else{
    result=0;
  }
 }

(P.81)アルゴリズム4 (「番兵」使用)
  /* (while 文使用) */
 {
  table[n+1]=data;
  i=1;
  while( table[i] != data ){
    i=i+1;
  }
  if( i<=n ){
    result=i;
  }else{
    result=0;
  }
 }


< 第4章 4.1 【演習4.8】(P.90) > 
  /* (for 文使用) */
 {
    for( x=a; x<=b; x+= delta){
   xとsqrt(x)の値を印刷する;
   x=x+delta;
  }
 }

  /*  (while 文使用) */
 {
  x=a;
  while(x<=b){
   xとsqrt(x)の値を印刷する;
   x=x+delta; 
  }
 }


< 第4章 4.1 【演習4.9】(P.90) > 
 {
  n=floor((b-a)/delta+0.1)
  for(i=0; i <=n; ++i){
   x=a+delta*i;
   xとsqrt(x)の値を印刷する;
  }
 }


< 第4章 4.1 E.データの宣言(P.93) > 
     C言語                          Pascal
(1) int x,y,z;                            var x,y,z:integer;
(2) float height, depth, width;           var height, depth, width:real
  double height, depth, width;  
(3) char chr;                             val chr:char;
  char mojiretu[n+1] (終端0)                 word:packed array[1..n] of char;
   表現が難しい(ポインタを使う)    
  int result, i, n;                        result, i, n:integer;
  なし                                    found:Boolean;



< 第4章 4.2 配列とレコード(P.93) > 
(P.94)
float a[20]; あるいは double a[20]    var a:array[1..20] of real;
int b[50][11]; 添字は必ず0から始まる      var b:array[1..50,0..10] of integer
 なし                                   const lbound=-10; ubound=26;
                                          var vec:array[lbound..ubound] of integer



(P.95)
構造体(struct)                          レコード(record)
struct dageki{  
  char namae[14];                       record namae:array[1..14] of char;
  char team;    team:char;
  int daseki, dasu, anda;             daseki, dasu, anda:integer
  }  end
  
struct dageki{                            var dageki:array[1..100] of
  char namae[14];                         record namae:array[1..14] of char;
  char team;                              team:char;
  int daseki, dasu, anda;}             daseki, dasu, anda:integer
struct dageki senshu[100];                end
 


< 第5章 5.1 【演習5.1】(P.102) > 
#include <stdio.h>
#include <math.h>
#define N 100

double sum(x, n) /* 手続きの宣言 */
double *x;
int n;
{
 int i;
 double s;
 s=0.0;
 for(i=1; i<=n; i++) {
  s=s+x[i];
 }
return s;
}

main()
{
 double x[N+1], s;
 double m;
 int n, i;


 データの個数を読む;
 データx[1],x[2],....,x[n]を読む;
 s=sum(x, n); /* 手続きの呼び出し */
 m=s/n;
 データの個数n、データx[1],...,x[n],平均値mを印刷する
}


< 第5章 5.1 (P.109) > 
#include <stdio.h>
#include <math.h>
#define N 100

double sum(x, n)
double *x;
int n;
{
 int i;
 double s;
 s=0.0;
 for(i=1; i<=n; i++) {
  s=s+x[i];
 }
return s;
}


main()
{
 double x[N+1]; x2[N+1]
 double s, s2, m, v;
 int n, i;


 データの個数を読む;
 データx[1],x[2],....,x[n]を読む;
 s=sum(x, n);
 m=s/n;


 s2=0.0;
 for(i=1; i<=n; i++) {
  x2[i]=(x[i]-m)*(x[i]-m);
 }
 s2=sum(x2, n);
 v=s2/n;
}
 n、x[1],...,x[n],m,vを印刷する
}