カーナビゲーション課題の概要

目次

  1. 概要
  2. カーナビゲーションとは
  3. 構造体を使う理由


概要

コンピュータ言語というものは、そもそも、何の目的もなく勉強しても あまり身につかないものです。なぜなら、いろいろな文法やテクニックを 教わっても何に使うかが分からないからです。むしろ、必要に迫られて、 そのための方法を探し出すほうが勉強になります。そういう意味だと、研究と かをするようになってからの方がスキルが身につき易いのですが、その頃は忙 しくてプログラミングの勉強をする余裕はあまりありません。

そこで、このプログラミング演習では、「カーナビゲーション」という 比較的身近?な題材を取り上げ、これを通して幾つかの勉強をしていきます。


カーナビゲーションとは

カーナビといったらGPS(Global Positioning System)衛星からの 電波を受けて、地球上での車の位置を決定して、それを地図上に表示 するのが主たる使い道のようですが、それはさっぱり“ナビゲーション” ではありません(勘の働く人はそれでもいいのですが)。 ナビゲーションたる部分は、目的地を設定しておくと、自動的に そこまでの「最短」経路を割り出し、それを運転者に教えることです。 「最短」というのは、単純には距離ですが、渋滞しにくい、走りやすい といった情報も加味すべきでしょう。この目的のためには

  1. 地図データの保持
  2. 目的地、および出発地(現在地)の、地図データ上での位置決定
  3. 最短経路の割り出し
  4. ドライバーへの提示
という要素が必要です。これらの部分を作っていく過程で、 C言語・プログラミングに対する理解を深めてもらいます。
最近行っていたファイルの読み込み、配列や構造体のお話は、1に関連したも のです。これからは2〜4の内容を含んだ課題に取り組んでもらいます。 2のためには、データの検索と呼ばれる作業を行います。沢山あるデータの中 から、ある条件に従って最も一致するデータを探し出す、という処理はプログ ラムでは良く行なわれます。 3の最短経路の割出しは、今回のような目的以外では使わなさそうですが、 考え方としてはとても重要です。4については、これまで学んできたグラフィッ クスを用いて各自のオリジナリティを出して見易いものを作るよう頑張って下 さい。最近は、いかに美しく・カッコ良く・分かり易く見せるかが、商品とし てのカーナビでも重要です。

これらの内容を今後順次進めていきますが、今日はまず、これまでに習った構造体を 思い出しながら課題をこなしてください。


構造体を使う理由

はじめに、構造体をなぜ使うか?ということを考えたいと思います。確かに、
    int x[N], y[N], r[N];
         :
    circle(x[i], y[i], r[i]);
    

    struct circleData {
        int x,y,r;
     };
    typedef struct circleData CircleData;
    CircleData c[N]
         :
    circle(c[i].x, c[i].y, c[i].r);
    

を比べると、後者のほうが手間がかるだけのような気がします。

それでも敢えて構造体を使用するにはいくつか理由があります。

  1. 変数としては1つである。
    これはもう少しプログラムが大きくなって、データをあちこち渡したり するようになると重要になる問題です。たとえば、関数に1セット 渡したいときに、必要なだけ全部の変数を書くよりは、構造体1つを 渡したほうがすっきりします。中身を1個増やすことも容易です。
    (さらに、普通はこういうときは ポインタを使います)

  2. データが意味的にまとまる。
    数種類のデータ群を扱うプログラムの場合、すべて int x[N]; などと 宣言していると、どれとどれが関連した変数かわからなくなります。 また、座標には x,y などの名前を使いたいところですが、座標値を それぞれのデータ群で持つ場合はそうもいきません。a_x, b_x ... などと 名前をつけるはめになります。それなら、a.x, b.x .. としても あまり手間は代わりませんし、むしろ後者のほうが一体感があります。

  3. データがメモリ上でもまとまる。
    ばらばらの変数として、配列を宣言した場合、コンピュータの記憶領域 (メモリ)上にはそれぞれの変数ごとにまとまって配置されます。それに対して、 構造体を用いた場合は、配列にしても、構造体1要素ごとにまとめて 配置されます。今回の演習ではこのご利益は出てきませんが、変数を 変数としてではなく、ただの01の塊として扱う関数群があり、 これらをつかって構造体を一括してコピーしたり、ファイルに記録したり、 という場合に有効になります。そうすると、コピーするときに、変数を 1つずつ代入する必要もなくなります。

以上のように、プログラムを作成する上で、実行する上での利点も ありますが、そのほかに、ある程度のレベルになると「見やすさ」という 利点が出てくることも、覚えておいて下さい。



戻る