C言語の解説と演習

(第五回)

メニュー

「N88BASICについて」へ行く

「C言語の解説と演習(第四回)」へ行

トップページへ行く

質問箱へ行く



はじめに

今回は、C言語での配列の使い方を勉強しましょう.C言語でも BASIC と全く同じように配列を使うことができますが、1つだけ大きな違いが有ります.それは 「C言語の配列の添え字は 0 から始まる」ということです.つまり、配列 a[N] を宣言したとき、その要素は a[0], a[1], a[2], ..., a[N-1] のn個になります.(a[N] は使えないことに注意してください).それでは例題を見てみましょう.


さらにさらにさらにその次の一歩

今回は、「N88BASIC について」「配列を使う」をC言語に変えてみましょう.「配列を使う」はBASIC で書かれた次のようなプログラムでした.


10 input "データの数 n=",n
20 dim d(n)
30 for i=1 to n
40 input "データ=",d(i)
50 next i
60 for i=1 to n
70   print i,"番目のデータ=",d(i)
80 next i
90 end

このプログラムは、配列 d(n) に n 個の値をキーボードから入力した後、それを入力した順に表示するプログラムです.プログラムの流れは以下の通りです.
まず、行番号 10 で n を入力し、行番号20 で配列 d(n) を宣言します.BASIC では、このように配列 d(n) を宣言すると、d(1),d(2), ..., d(n) のn個の要素が使えるようになります。行番号 30 の for i=1 to n と行番号 50 の next i が対応しており、行番号 30 から行番号 50 の間が、変数 i の値を i = 1, 2, 3, .... n と変えながら、 n 回実行されます.つまり、d(i) (i=1,2,3,...,n) 値が順番にキーボードから入力されます。次に行番号 60 の for i=1 to n と行番号 80 の next i が対応しているので、

70 print i ," 番目のデータ=", d(i)

が i = 1,2,3, ..., n に対し実行され、d(1),d(2),...,d(n) がこの順に表示されます。
上の BASIC のプログラムを C 言語に書きなおすと、次のようになります.


#include <stdio.h>

#define N 3

main()
{

  int d[N];
  int i;

  for (i=1;i<=N;i=i+1) {
    printf("データ=");
    scanf("%d",&d[i-1]);
  }

  for (i=1;i<=N;i=i+1) {
    printf("%d番目のデータ=%d¥n",i,d[i-1]);
  }
}

上の C のプログラムを順に見ていきましょう.
まず、

#include  <stdio.h>

ですが、これはお約束のおまじないですね.
次の

#define N 3

定数 N を 3 に定義する命令です。これは初めて出る命令ですが、難しいことは全くありません。これより下にあるプログラム中の N がすべて 3 に置き換わると、思えば良いのです。つまり、上のCのプログラムは

#include <stdio.h>

main()
{

  int d[3];
  int i;

  for (i=1;i<=3;i=i+1) {
    printf("データ=");
    scanf("%d",&d[i-1]);
  }

  for (i=1;i<=3;i=i+1) {
    printf("%d番目のデータ=%d¥n",i,d[i-1]);
  }
}
と全く同じです。このようにプログラムを書いてもいいのですが、BASIC のプログラムとの対応がつきやすいように #define N 3 を使って
プログラムを書いてみました。
この N は配列の要素数を表しており、 BASIC のプログラムの行番号 10

10 input "データの数 n=",n

で入力する配列の要素数 n と同じ物です.
プログラムを見ていくと、次に

main()
{


がありますが、この部分は関数 main() の定義で、C のプログラムは実行されると、必ずこの関数から実行されると「第一回の解説」で説明しました.次に

 int  d[N];

がありますが、これは配列 d[N] の定義です。この定義により配列の要素 d[0], d[1], ..., d[N-1] が使えるようになります。BASIC では 配列は d(i) ですが、C では d[i] である(丸カッコでなく角カッコを使います)ことに注意してください。次に

int i;

ですが、これは変数 i の宣言です.C言語では使う変数は全て宣言しなければならないと前に説明しましたね.
次に
  for (i=1;i<=N;i=i+1) {
    printf("データ=");
    scanf("%d",&d[i-1]);
  }

ですが、これは前回解説した for 命令を使った繰り返し命令で BASIC の

30 for i=1 to n
40 input "データ=",d(i)
50 next i

に相当しています。つまり、

    printf("データ=");
    scanf("%d",&d[i-1]); 

をi = 1,2, ..., N の順番に N 回繰り返し実行し、キーボードからの入力を d[i-1] に代入していきます.ここで、BASIC ではキーボードから入力した値を配列 d(N)i 番目の要素 d(i) に代入しているのに対し、C では i-1 番目の要素 d[i-1] に代入しています。これは一番始めに述べたように BASIC では配列の要素が

d(1), d(2), d(3), ...., d(N)

であるのに対し、C言語では配列 d[N] の要素は

d[0], d[1], d[2], ...., d[N-1]

となるためです.次に

  for (i=1;i<=3;i=i+1) {
    printf("%d番目のデータ=%d¥n",i,d[i-1]);
  }

では

    printf("%d番目のデータ=%d¥n",i,d[i-1]);

を i = 1,2,...,N に対し、 N 回繰り返し実行するのはもう分かりますね.これは
BASIC のプログラムの

60 for i=1 to n
70   print i,"番目のデータ=",d(i)
80 next i

の部分に相当しており、キーボードから入力した値を順番に一つずつ出力しています.
上のプログラムを cygnus でコンパイルして、実行すると

データ=

と3回聞いてきますから、それぞれ 1, 3, 7 と入力してやると

1番目のデータ=1
2番目のデータ=3
3番目のデータ=7


と入力したデータをそのままの順に表示してくれます.
これで今回の解説を終わります.今回もいろいろと新しいことが出てきました.
  1. define 命令は
    
    #define  変数名  数値
    
    
    の形でつかう.これより以下のプログラムの中の「変数名」は全て「数値」と置き換わる.例えば
    
    #define  K  10
    i = K;
    
    
    
    i = 10;
    
    
    と 同じ意味である.
  2. C言語では N 個の要素を持つ整数の配列 d[N]
    
    int d[N];
    
    
    と定義する.配列の要素は d[0], d[1], d[2], ..., d[N-1] の N 個である.

次回の予定

次回はC言語の特徴であるポインターの解説をします.


演習問題

今回の C のプログラムを利用して、入力した5個の数を入力したのとは逆の順番に出力するプログラムを作れ.例えば、キーボードから、1, 3, 5, 10, 7 とこの順番で入力したとすると、

5番目のデータ=7
4番目のデータ=10
3番目のデータ=5
2番目のデータ=3
1番目のデータ=1

と表示されれば良い.