C言語基礎からマスター5-直接探索プログラムから制御文・配列を学ぶ①-

C言語基礎からマスター

はじめに

前回は、足し算を計算する関数を実際に動かしてみました。そして、C言語のプログラム構成やプログラムで使われている関数や変数がコンピュータの中でどのように扱われているのかを解説しました。

今回の第五回目は、直接探索アルゴリズムで並べ替えプログラムを作成するうえで必要となるC言語文法の制御文と配列を学んで実際にそのプログラムをつくっていきます。

制御文には、条件判断をする条件文や同じ処理を繰り返し実行する繰り返し文というものがあります。また、変数をひと続きに管理したいときに使う配列というものがあり、その配列や制御文を使ってプログラムを作成します。

例題を通してこの条件文や繰り返し文、配列といったC言語文法について2回に分けて解説していこうと思います。この①では、制御文について解説し、次回の②で配列を解説した上で直接探索プログラムを作成していきます。

このブログシリーズは、C言語文法の基礎を例題プログラムから学んでマスターしていくものです。

それでは、はじめていきます。

アルゴリズム

一列に並んだ数字を小さい順番に並べ替えるということを考えてみます。

ヒトがこれを考えるとき

①数字を眺める

②一番小さい数字を見つける

③②の数字を取り出して並べる

④取り出し元がなくなったら終わりとする

まだ数字があれば①に戻る

このような手順で考えるでしょうか。

この並べ替えをプログラムにするとなった場合も同じようにコンピューターに実行させる手順を考えていきます。

この手順のことを「アルゴリズム」といいます。

ヒトが問題を解決するとき、ヒトそれぞれ得意なやり方で取り組んでいくと思います。

同様にコンピューターにも得意なやり方があります。 それは、条件判断することと繰り返し実行することです。

計算機プログラムでは、この条件判断と繰り返しという2つの操作をうまく組み合わせて問題を解いていく手順、アルゴリズムを考えていくということが求められます。

直接探索アルゴリズム

ここで次の例題を考えてみます。

例題

「80」,「41」,「35」,「90」,「40」,「20」という6つ数字を小さい順番に並べ替えるプログラムを作成してみましょう。

小さい順番に並べるやり方はいろいろ考えられます。ここでは、直接探索というやり方で考えてみます。直接探索のアルゴリズムは、次のように書けます。

直接探索アルゴリズム
  1. 比較元を先頭の数字として最小値と仮定する。また、比較対象を先頭の右隣りの数字とする。
  2. 最小値と比較対象の値を比較して、小さい方の数字を最小値として記憶する。
  3. 比較対象としてさらに右隣りの数字がある場合は、その数字に対象を移して2に戻る。
  4. 記憶した最小値の数字と比較元の数字を入れ替える。
  5. 比較元を右隣りの数字に移してその値を最小値と仮定する。その比較元のさらに右隣りの数字を比較対象値とする。
  6. 比較対象値がない場合は、終了とする。ある場合は、2に戻る。

小さい数字を見つけて取り出していくというのが直接探索アルゴリズムです。

ここで使った言葉、「記憶」、「比較」、「戻る」というのがキーワードです。

「記憶」をプログラムで書くと「変数に代入」に変換されます。

「比較」は、「条件判断」、「戻る」は「繰り返す」に対応します。

アルゴリズムを書くときに、このキーワードを使って構成するとプログラムをつくりやすくなります。

ここで必要となるC言語文法についてみていきます。

変数については前回までで解説してきましたので、ここでは、条件判断と繰り返しについて解説していきます。

関係演算子

まずは、条件判断で必要となる関係演算子について説明していきます。

条件判断は、2つの数値や文字を比較して、その比較結果が正しいか、違うかで動かすプログラムを変えることができる仕組みです。

比較結果が正しいことを「真」、間違っていることを「偽」と呼びます。

この真偽の判断をするときに使う演算子に関係演算子というものがあります。

演算子については、これまでに四則演算をする算術演算子とデータを代入する代入演算子を扱いました。 ここで、関係演算子についても解説を加えていきます。

関係演算子は、値の比較をする演算子です。関係演算子には次のようなものがあります。

演算子  演算説明 
>大なりA>B    右辺(B)が左辺(A)より大きいかの比較   
>=大なりイコール  A>=B  右辺(B)が左辺(A)以上かの比較
<小なりA<B    右辺(B)が左辺(A)より小さいかの比較
<=小なりイコールA<=B  右辺(B)が左辺(A)以下かの比較
==イコールA==B  右辺(B)と左辺(A)が等しいかの比較
!=ノットイコールA!=B   右辺(B)と左辺(A)が異なるかの比較

演算子記号の左右に記述する値を大小、等しい、異なるといった比較をしてその結果を真、偽という形で返します。

#include <stdio.h>

main()
{
    printf("%d",1<0);
}

例えば、上のようなプログラムを実行すると結果として「0」が出力表示されます。1は0より大きいので関係演算子による演算「1<0」の結果は偽(0)となります。printfの%dは、前回の表中にありましたが、10進数の数値で出力するという意味です。

条件判断

C言語で条件判断の書き方でよく使う文法として2つあります。

ひとつは、if文、もうひとつはswitch文というものです。

ここでは、if文について解説します。if文の書き方は次のようになります。

「if」のあとに括弧を続けて、その括弧の中に条件となる文を記述します。

条件は、先ほど説明した関係演算子などを使って条件の真偽を評価します。

条件の部分が「真」となれば、{ }の中の処理が実行されます。「偽」の場合は、{ }の中の処理を飛ばしてその次の処理から実行します。if文は、条件に一致した場合のみ特定の処理をしたい場合に使います。

条件に一致しない場合で、別の処理をさせたいときは、ifにelseを加えます。書き方は次のようになります。この書き方は、条件に一致するか、それ以外かという場合に使います。

条件が2つ以上ある場合は、else ifを使って条件を書いていきます。else ifは条件2、条件3、条件4というように複数つなげていけます。また、それらの条件以外にのみ処理をしたい場合は、最後にelseを書く形をとれます。

else ifを書いた場合は、elseの処理がなくても必ずelseをつける習慣をつけておくとよいです。複数人でプログラムを作成している場合やプログラムを長期運用する場合などで、作成したプログラムを見直しているとelseの処理がないところを発見すると、条件以外の処理がなくていいのかと不安になるときがあります。バグやバグの可能性をチェックするツールとして、静的解析ツールというものがあるのですが、そのようなツールでプログラムをチェックするとこのelse ifを使った条件文のelse抜けは、指摘の対象となる場合があります。ですので、elseの中で処理がなくてもelseを記述して、その中で処理がないというコメントを残しておくことで、処理の考慮漏れを防ぐことができます。

if文の使い方の例を示します。

#include <stdio.h>
main()
{
    int i = 3;
    if(i == 0){
        printf("i=%d if program\n",i);
    }else if(i == 1){
        printf("i=%d else if program\n",i);
    }else if(i == 2){
        printf("i=%d else if program\n",i);
    }else{
        printf("i=%d else program\n",i);
    }
}

変数 i の値の応じて呼び出されるprintf関数が異なるプログラムです。

この例では、i の値が3なので、elseの部分(else節)が実行されます。

繰り返し

C言語には、繰り返し処理を実行する文法がいくつか用意されています。

その中で今回はfor文について解説していきます。for文の構造は次のようになります。

これだけでは、分かりにくいので、次の例で説明していきます。

#include <stdio.h>
main()
{
    int i;
    for(i=0;i<10;i++){
        printf("%d\n",i);
    }
}

for文を使うときには基本的に変数を用意します。

ここでは、i という整数値を定義してfor文に使っています。

forに続く( )の中には、2つのセミコロンで区切った3つの記述があります。

先頭の区切り部分には、初期値を設定します。ここでは、代入演算子で変数 i の値を0に設定しています。

次の区切り部分には、終了条件を書きます。終了条件とは、この繰り返しを抜ける条件です。この条件は、初期値が代入された後にチェックされます。この例では、変数 i に 0が入った状態で、変数 i が10より小さいか関係演算子により比較されています。この結果は、正しい(真)ですので、繰り返しの処理を実行することになります。繰り返しの対象となる処理は、for文の { }で囲った部分に書いたプログラムになります。

最後の区切り部分では、ステップの更新を行います。ここでは、「i++」という記述になっています。

これは、インクリメントという演算で、「 i = i + 1 」と同じ意味です。つまり、i の値に1加算するということになります。これと同じような演算でデクリメントというものがあります。それは、「i–」というように記述し、「 i = i – 1 」と同値になります。

話がそれましたが、ステップ更新は、1回の繰り返し処理が終わったあと、すなわち、{ }の中の最後の処理が実行された後に行われます。この例では繰り返し内部の処理がprintf関数の処理しかないので、その処理が実行された後に変数 i に1加わるとなります。

これで1つの流れが終わります。この後、再度for文の終了条件がチェックされて、条件の評価結果が真の間は、この繰り返しを行います。条件が成立しない、つまり、偽となった時点で、繰り返し処理を抜けてfor文の{ }の外に処理を移します。

この例のプログラムの実行結果は次のようになります。

変数 iの値が繰り返しにより0から9まで1づつ加算される結果が出力されます。

同じ処理を10回繰り返したいという場合は、この書き方で構成できます。

もちろん、繰り返したい回数は、自由なので数値を変えればその回数分の繰り返しになります。

このような形がfor文になります。ここで、for文の流れをまとめておきます。

for文

① 初期値の実行

② 終了条件の評価

③ ②が真の場合、④へ、偽の場合は⑦へ

④ for文内の処理を実行

⑤ ステップの更新を実行

⑥ ②に戻る

⑦ for文の外に処理を移し実行

まとめ

第五回では、例題として挙げた直接探索プログラムを作成するためにまず、C言語の条件文と繰り返し文についてみてきました。

条件文には、if文の他にswitch文がありますが、条件数が少ない場合は、if文を使用します。1つのif文の中にelse if文を多用するような場合は、switch文を使用した方がプログラムの解読がしやすいですが、if文の構造で記述はできます。

また、繰り返し文として、for文を解説しました。繰り返し文には、その他にwhile文やdo while文などがあります。

ここで扱わなかった条件判断や繰り返しの記述形式は、別の例題で解説していきたいと思います。

まずは、条件判断のif文と繰り返しのfor文をマスターできれば、基本的なプログラムの制御はできると思います。

次回は、C言語文法の配列について解説した上で、例題の直接探索アルゴリズムを使った並べ替えプログラムをつくって、動きを確認していきたいと思います。

新・明解C言語 入門編 第2版 [ 柴田望洋 ]

価格:2,530円
(2022/9/4 21:34時点)
感想(0件)

コメント

タイトルとURLをコピーしました