[Atomで覚えるC言語入門 – 初歩の初歩 – ] No.02 変数と式

 

プログラミングの基本は変数ダーーーーッ!!!

ってことで、C言語プログラミングの第一歩がprintfを使ったHello, Worldですが、第二歩として変数を覚えましょう。
変数は、C言語はもちろんその他のプログラム言語にも色々な種類があります。
今回の記事はC言語を対象にしていますが、割りと基本的な事を書いていますので他のプログラム言語でも考え方は参考になるかと思います。
もちろんプログラム言語によって使い方や種類は違いますので、細かい事はそれぞれのプログラム言語の本とかで調べてください。



前提

この記事は以下の記事を前提にしていますので、先にそちらをご覧ください。

変数ってなに?

プログラム言語を覚え始めると、『変数(へんすう)』というものが必ず出て来ます。
変数の無いプログラム言語は無いんじゃないかと思います。
変数はプログラミングにおいて基本中の基本です。
プログラム言語にもよりますが、

変数を知らずして、何を知るんですか?

って言うぐらい大切です。

変数をどのように使ってプログラムを組み立てるか?ってのがプログラミングのポイントの一つになります。

まず、

変数ってなんやん???

って思いますよね。
そんな単語聞いたこと無いし。
ま、専門用語みたいなもんですね。

全然関係無い話ですけど、専門用語(?)から一般の用語に来てるものを調べるとちょっとおもしろかったりします。「変態」とか「駄目」とか。

変数とは『箱』と考えてください。
何を入れる箱かと言いますと、データを入れておく箱です。

 

箱という概念が分かりにくかったら『データを記憶しておいてくれるもの』というイメージでもいいです。

データってなに?

ほな、今度はデータってなんやねん?

まぁ、言葉で大体お分かりでしょうけど、プログラミングにおけるデータを定義するなら↓こんな感じかな。

  • 文字
  • 数値


プログラム言語によってはこれら以外にオブジェクトとか色々有りますけど、基本は文字と数値と考えていればいいでしょう。

あまり深く考え過ぎるとメンドくさくなるので、ほどほどにしておきましょう

プログラムの中でデータは当然出てきます。
データってプログラムの中で何回も使います。

例えばですが、

データAとデータBを足し算してデータCを算出します。
また、違う計算で、データDとデータEを引き算してデータFを算出します。
最後にデータCとデータFを掛け算してデータGを算出します。
このデータGを画面に表示する。

という処理をする場合、データA~データGをどこかに保管しておく必要があります。
保管しておかないと消えてしまいますからね。
でも、箱の中にデータを保管しておけば消えずに残ります。
消えずに残るってことは、後から何度でも使えるっちゅうワケです。

データは『カタチ』にあった箱(変数)に入れましょう

No.02_変数と式

データをモノ変数を入れ物と考えてみてください。

靴(モノ)はシューズバッグ(入れ物)に入れますよね。
ゴルフクラブ(モノ)はゴルフバッグ(入れ物)に入れますよね。
ギター(モノ)はギターケース(入れ物)に入れますよね。

プログラミングにおいてもデータはカタチの合った変数に入れます。
データと変数のカタチは同じである必要があります。
カタチが違うのに入れようとしても、エラーが出て入れる事ができません。
細かい説明はしませんがカタチの違う変数に入れる事も可能っちゃぁ可能ですが、取り出した時に正しく使う事ができません。

ゴルフバッグから靴が出て来ても、

人間なら

『そうそう、これでボールを打つと飛ぶんだよねぇ~・・・・』
『・・・って靴やんけーーーー!!! ゴルフクラブ違うやんけー! 打てるかい!!』

と誰でもノリツッコミで間違い指摘をすることができますが、プログラム言語はそんなにノリは良くないですし間違い指摘もしてくれません。

プログラム言語はゴルフバッグから出てくるものは全てゴルフクラブと信じています。
ゴルフバッグから靴が出て来てもそれは「ゴルフクラブ」と信じて疑いません。
その取り出した「靴」でボールを打とうとします。

例え過ぎて分かりにくいですかね?
データと変数の型が合わないと、プログラムは異常終了とかエラーとかになると考えてください。
※その前に、そもそもコンパイルが通らなかったりしますけど

 

データも変数も『カタチ』を意識してください。

『カタチ』とはなんやねん?

プログラミングの世界では『カタチ』とは言わず『型(かた)』と言います。
データにも変数にも型があります。

“abc”という文字は、文字型です。
123という数値は、数値型です。

ちょっとややこしいのですが、文字型“123”数値型123は違います。
“123”は(いち・に・さん)という文字です。計算式には使えません。
123は(ひゃくにじゅうさん)という数値です。当然計算式に使えます。しかし、そのままでは文字として画面に表示する事ができません。
(画面に表示できるのは「文字」だけです。数値を画面に表示することはできません)

・プログラム言語によって、文字型数値型の違いがあまり無い場合もあります
・文字型は” “(ダブルクォーテーション)で囲って表記することが多いです

で、変数にも型があります。
プログラム言語によって変数の型の表記は違いますが、文字型数値型はあると思います。
大体以下の様な感じの変数の型が準備されていると思います。

  • 文字型なら、Stringstr みたいなの
  • 数値型なら、Integerint みたいなの

C言語には文字型という型は存在しません。
char型というものがありますが、これは文字型ではありません。
charという名前に文字型と想像しがちですが、文字型ではありません。ただの1バイトの変数です。
この辺はC言語はメモリの事を分かっておく必要があります。
C/C++言語以外は、メモリの事をあまり考えなくても(知らなくても)使えるように工夫されています。
※↑意味がよく分からなければ気にせず飛ばしてください。

 

変数とデータってこんな感じで使います。あまり深く読み込まなくていいです。雰囲気だけ掴めますかね?

  /*------------------*/
  /* 足し算プログラム */
  /*------------------*/
  int  hoge;    /* 数値型変数としてhogeを定義 */
  int  fuga;    /* 数値型変数としてfugaを定義 */
  int  answer;  /* hoge + fugaの答えを入れる */

  hoge = 3;     /* 変数hogeに、データとして数値の3を入れる */
  fuga = 5;     /* 変数fugaに、データとして数値の5を入れる */

  answer = hoge + fuga;  /* 変数と変数を足し算して、答えを変数へセットする */

  printf("答えは %d です", answer);  /* 答えを画面に表示する */

 

『変数とはデータを保管しておく箱である』っていうのを覚えておいてください。

式ってなに?

式ってなに?
Wikipediaにはこう書いています。
式 (プログラミング)

式 (プログラミング)

式(しき、expression)とは、プログラミングにおいて、言語によって定められた優先順位や結びつきの規定に則って評価される値、変数、演算子、関数の組み合わせである。数学における式と同様、式は評価された値を持つ。
言語によっては式が副作用を持つこともあり、参照透過性がない場合もある。

う~ん・・・・さっぱり分かりません(笑)
『式は評価された値を持つ。』って一文はワカラン事も無いですが、まぁ、基本的には分かりません(笑)

ひとまず計算式とか四則演算と考えておきましょう。(テキトー過ぎますがwww)
前項でも出しましたが、↓こんな感じとイメージしておきましょう。

  hoge = 3;
  fuga = 5;
  answer = hoge + fuga;    /* 足し算 */
  answer = hoge * fuga;    /* 掛け算 */
  answer = hoge - fuga;    /* 引き算 */
  answer = hoge / fuga;    /* 割り算 */
  answer = 8 + 9;

 

変数無しで数値や文字を直接扱うこともできます。

式って四則演算だけ?

四則演算だけじゃないです。

『命令』です。
『命令』があります。

『順次・選択・繰り返し』って聞いたことあるでしょうか?

プログラムの命令って基本的には三種類です。
※プログラム言語によって違うこともありますが、ごく一般的なプログラム言語の場合と思ってください。

順次

単に指示された処理をしてすぐに次の命令に進みます。

↓C言語ではこんなのがあります。

  • 代入命令(変数に値をセット)
  • 四則演算

選択

ある条件を評価(大小比較したり、一致するか否かを見たり)して処理を切り分けます。

分岐と書くほうが分かり良いかもしれません。

↓C言語ではこんなのがあります。

  • if-else命令
  • switch命令

繰り返し

ある条件を満たすまで or ある条件を満たしている間だけ or 永遠に 処理を繰り返し続けます。

↓C言語ではこんなのがあります。

  • for命令
  • while命令
  • do-loop命令
  • do-while命令

変数と式を使いまくろう!

と、まぁ、変数と式を回りくどく説明しましたが、これが基本なんです。

コンピュータって日本語では計算機です。
ま、そろばんみたいなもんですね。

プログラミングが初めての方はまずは四則演算をするプログラムを作りまくるといいと思います。
私が初めて書いた(と言うか写した)プログラムは足し算プログラムです。
足し算だけです。
って言うか 3+5 だけの足し算プログラムです。

その次は、数値を変えて 8+10 とか、100+0 とかです。
またその次は引き算とか掛け算とか割り算とか。
それにも慣れてきたら 1+2+3 とか、5-0+2*4 とかって感じで色々な計算をするプログラムを作るようになりました。

それを繰り返してると、

プログラム書く
  ↓
コンパイルする
  ↓
書き間違いがあってコンパイル通らない
  ↓
書き間違いを探す
  ↓
書き直す
  ↓
再度コンパイルする
  ↓
コンパイル通る
  ↓
実行する
  ↓
動きがおかしい
  ↓
間違っている箇所を悩みに悩んで探す
  ↓
直してみる
  ↓
またコンパイルする
  ↓
コンパイル通る
  ↓
実行する
  ↓
まだ動きがおかしい
  ↓
間違っている箇所を悩みに悩んで探す
  ↓
直してみる
  ↓
またコンパイルする
  ↓
コンパイル通る
  ↓
実行する
  ↓
動作正常!!!

という手順を覚えてしまって、次第に指の動きや操作する手の動きが早くなってきました。

で、少しずつ理解できてきて、色々と工夫をするようになります。
変数を増やしたり減らしたりして変数とはなんぞや?ってのが分かってきます。

 

まずは今回のような足し算プログラムとか簡単なものでいいので、沢山作ってみてください。沢山作れば作るほどプログラミングなんて簡単だってことが分かってきますし、色々な事を覚えていきます。

変数と式を使って西暦和暦プログラムを作ろう!

ちょっと昔のプログラミング入門で出て来そうな内容でゴメンナサイ。

ほんの少しだけ考える必要があるけど、簡単なんですよ。
是非やってみてください。

◆問題
西暦1900~2000年を和暦(明治・大正・昭和・平成)で表示せよ。
1年おきや5年おきのように表示する年間隔を変更できるようにせよ。

※西暦と和暦の対応は以下の通りとする
 今回は月は考えず、単純に年だけを変換する

 明治:1868年~1911年
 大正:1912年~1925年
 昭和:1926年~1988年
 平成:1989年~

↓実行結果の表示例

    西暦1910年は、明治43年です。
    西暦1920年は、大正9年です。
    西暦1985年は、昭和60年です。
    西暦1995年は、平成7年です。
  

さぁ!!!考えよう!!!
C言語をちょっとでも知っているなら自分で作ってみてから見てね。
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓
  ↓

※これは一例です。参考程度に見てください。

#include <stdio.h>

int main(void)
{
    /* 西暦を和暦で表示 */
    /* 明治元年:1868~、大正元年:1912~、
       昭和元年:1926~、平成元年:1989~、とする */

    int     seireki;
    int     wareki;

    int     start, end, step;

    start   = 1900;
    end     = 2000;
    step    = 5;

    seireki = start;

    while( seireki < end )
    {
        if( seireki < 1912 )
        {
            /* 明治 */
            wareki = seireki - 1868 + 1;
            printf("西暦%d年は、明治%d年です。\n", seireki, wareki);
        }
        else if( seireki < 1926 )
        {
            wareki = seireki - 1912 + 1;
            /* 大正 */
            printf("西暦%d年は、大正%d年です。\n", seireki, wareki);
        }
        else if( seireki < 1989 )
        {
            wareki = seireki - 1926 + 1;
            /* 昭和 */
            printf("西暦%d年は、昭和%d年です。\n", seireki, wareki);
        }
        else
        {
            wareki = seireki - 1989 + 1;
            /* 平成 */
            printf("西暦%d年は、平成%d年です。\n", seireki, wareki);
        }

        seireki = seireki + step;       // seireki += step; という書き方でも良い
    }

    return 0;
}

ちょっとだけ解説

前項のプログラムで覚えるのはこれだけ。

  • 変数 ※今回は数値型(int)のみ
  • 変数への代入
  • 四則演算
  • 繰り返し(while命令)
  • 比較(if命令)
  • printf命令
  • コメント
  • 戻り値

変数

※説明済みなので省略

変数への代入

この部分です。


#include <stdio.h>

int main(void)
{
    /* 西暦を和暦で表示 */
    /* 明治元年:1868~、大正元年:1912~、
       昭和元年:1926~、平成元年:1989~、とする */

    int     seireki;
    int     wareki;

    int     start, end, step;

    start   = 1900;
    end     = 2000;
    step    = 5;

    seireki = start;

    while( seireki < end )
    {
        if( seireki < 1912 )
        {
            /* 明治 */
            wareki = seireki - 1868 + 1;
            printf("西暦%d年は、明治%d年です。\n", seireki, wareki);
        }
        else if( seireki < 1926 )
        {
            wareki = seireki - 1912 + 1;
            /* 大正 */
            printf("西暦%d年は、大正%d年です。\n", seireki, wareki);
        }
        else if( seireki < 1989 )
        {
            wareki = seireki - 1926 + 1;
            /* 昭和 */
            printf("西暦%d年は、昭和%d年です。\n", seireki, wareki);
        }
        else
        {
            wareki = seireki - 1989 + 1;
            /* 平成 */
            printf("西暦%d年は、平成%d年です。\n", seireki, wareki);
        }

        seireki = seireki + step;       // seireki += step; という書き方でも良い
    }

    return 0;
}

変数に値を直接代入することもありますし、変数から変数へ値を代入する事もあります。
↓こんな感じで計算結果(seireki - 1912 + 1)を変数(wareki)へ代入する事もできます。


#include <stdio.h>

int main(void)
{
    /* 西暦を和暦で表示 */
    /* 明治元年:1868~、大正元年:1912~、
       昭和元年:1926~、平成元年:1989~、とする */

    int     seireki;
    int     wareki;

    int     start, end, step;

    start   = 1900;
    end     = 2000;
    step    = 5;

    seireki = start;

    while( seireki < end )
    {
        if( seireki < 1912 )
        {
            /* 明治 */
            wareki = seireki - 1868 + 1;
            printf("西暦%d年は、明治%d年です。\n", seireki, wareki);
        }
        else if( seireki < 1926 )
        {
            wareki = seireki - 1912 + 1;
            /* 大正 */
            printf("西暦%d年は、大正%d年です。\n", seireki, wareki);
        }
        else if( seireki < 1989 )
        {
            wareki = seireki - 1926 + 1;
            /* 昭和 */
            printf("西暦%d年は、昭和%d年です。\n", seireki, wareki);
        }
        else
        {
            wareki = seireki - 1989 + 1;
            /* 平成 */
            printf("西暦%d年は、平成%d年です。\n", seireki, wareki);
        }

        seireki = seireki + step;       // seireki += step; という書き方でも良い
    }

    return 0;
}

四則演算

※説明済みなので省略

繰り返し(while命令)

ある処理を100回やりたい場合、同じ処理を100回も書きますか?
メンドクサイですよね。

例えばですが、↓はhogehogeという文字を1行として表示するプログラムコードですが、

    printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */

↑コレを100行表示したい場合、

    printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */
    printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */
    printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */
    printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */
    printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */
    printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */
    printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */
    printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */
        ・
        ・
        ・
        ・
        ・

↑って感じで同じ処理を100行書きますか?
書きますか?
書くんですか???

いや、そんなプログラムはダメ!!!

メンドクサイです。

表示する文字を「hogehoge」から「hagehage」に変更したい場合、100行全部変更するのですか?

そんなメンドクサイことやりたいですか??

そもそもそんなプログラムコードはエレガントでは無いです!!!
プログラムコードは美しさを求めましょう!

↓こう書くとわずか4行程度でいいのです。

    while(100回繰り返す)         /* 正式な書き方で無いですが、雰囲気を読み取ってください */
    {
        printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */
    }

(書き方はちょっと省略していますけど)こっちの方が楽ですよね。
hogehogeをhagehageと書きなおすのも1箇所だけなのでものすごーーーーく楽ですよね。
単純に読む量も少ないですしね。(←コレ結構重要!)

while命令の書き方は本とかで調べてみてね。

printf命令
            printf("西暦%d年は、平成%d年です。\n", seireki, wareki);

printf命令っていう画面に文字を表示する命令です。
printf命令の書き方自体は本とかを見て欲しいですが、ちょっとだけ説明します。

「%d」と「\n」ってのがありますね。
「これはナンヤネン?」と思われる方が多いと思います。

%dは(ぱーせんと でぃー)です。
他にも%fや%sとか%cとかあります。
興味があれば調べてみてください。
\nは(えんまーく えぬ or ばっくすらっしゅ えぬ)です。
他にも\tとかあります。
興味があれば調べてみてください。

下の図を見てください。

printf

1個目の「%d」は変数seirekiの数値を数字に変換して画面に表示します。
2個目の「%d」は変数warekiの数値を数字に変換して画面に表示します。
「\n」は改行を意味します。

パターンAとBでは表示結果が変わりますので、一度試してみてください。

↓パターンA

    while(100回繰り返す)
    {
        printf("hogehoge");      /* 画面にhogehogeという文字を表示する */
    }

↓パターンB

    while(100回繰り返す)
    {
        printf("hogehoge\n");    /* 画面にhogehogeという文字を表示する */
    }
whileの使い方は自分で調べてちゃんと書いてね。

コメント

プログラミングというのは、アルゴリズムを考えて・プログラムを書いて・・・だけではありません。

コメントが非常に大切です。
コメントもプログラミングの一部です。

コメントってなんやねん?

と言うと、上記のサンプルプログラムで書いてますが「/* */」で囲まれたものの事です。
「//」も行末までコメントです。

コメント部分には何を書いてもいいです。
プログラムの動作には一切影響は与えません。
※コメントになる書き方はプログラム言語によって違います。

何を書くかと言うと、要はメモ書きです。
ここの処理は何をしているのか?何のための処理なのか?それを書くのです。

よくあるのが、、、、

    /* seirekiから1926引いて1足したものをwarekiに代入する */
    wareki = seireki - 1926 + 1;

↑こんなコメント読んで何が分かります?
プログラムコード読めば分かりますよね?
コメント読むだけ無駄ですよね?

    /* 西暦1926年が昭和元年。
       現在の西暦(seireki)から1925(1926-1)を引くと昭和の年数が算出される */
    wareki = seireki - 1926 + 1;

↑こっちの方が分かりやすいですよね?
プログラムコードの意味とか意図とかを書くとコメントとしての意味があります。

基本的にはプログラムコードを読めば処理が分かるはずなんですけど、人が書いたものはもちろん自分が書いたものでも後で読むとさっぱり意図が分からなかったりします。

英語でも、英文は読めるしそれぞれの単語の意味は分かるけど、文としての意味がさっぱり分からないって事ありますよね?
あれと同じようなものです。
コメントは非常に重要です。短く・他人が読んでも分かりやすく・的確に・ポイントを突いて・意味/意図/理由を書きましょう。
コメントのセンスが悪いとプログラムコードも超ダサく見えますよ

戻り値

今回はサラッと流します。


#include <stdio.h>

int main(void)
{
    /* 西暦を和暦で表示 */
    /* 明治元年:1868~、大正元年:1912~、
       昭和元年:1926~、平成元年:1989~、とする */

    int     seireki;
    int     wareki;

    int     start, end, step;

    start   = 1900;
    end     = 2000;
    step    = 5;

    seireki = start;

    while( seireki < end )
    {
        if( seireki < 1912 )
        {
            /* 明治 */
            wareki = seireki - 1868 + 1;
            printf("西暦%d年は、明治%d年です。\n", seireki, wareki);
        }
        else if( seireki < 1926 )
        {
            wareki = seireki - 1912 + 1;
            /* 大正 */
            printf("西暦%d年は、大正%d年です。\n", seireki, wareki);
        }
        else if( seireki < 1989 )
        {
            wareki = seireki - 1926 + 1;
            /* 昭和 */
            printf("西暦%d年は、昭和%d年です。\n", seireki, wareki);
        }
        else
        {
            wareki = seireki - 1989 + 1;
            /* 平成 */
            printf("西暦%d年は、平成%d年です。\n", seireki, wareki);
        }

        seireki = seireki + step;       // seireki += step; という書き方でも良い
    }

    return 0;
}

↑これが戻り値(もどりち)です。
返り値(かえりち)とも言います。

「return」が戻り値を返すための命令です。
今回はそれだけを覚えておいてください。

戻り値ってなんやねん????
っていうのはまたの機会に書きます。
(今回説明してもあまり意味が無いので)

プログラミングを覚えていくコツ

入門書で一つ一つ順番に覚えていく方法もいいんですけど、そういうのってあまり頭に残らないんですよね。

私がプログラム言語を覚える時のやり方は、

  1. とりあえず薄い本を一回やる
    あまり一生懸命やらず、どんな命令・機能があるかをサッと見る事を目的とする(まじめにやるとしんどいので)
  2. ショボいプログラムを何本も作る
    使いたい命令・機能を少しずつ増やしながら作る
  3. 作っていく中で、自分が実現したい機能を作るにはどうするのがいいのか調べながら作る

 

作りたいものがあって、それを実現するのに必要な物を一つずつその都度覚えていけばいいと思います。
一から順番に全部を覚えようとしても覚えられません。
今使うものから覚えていくと良いでしょう。

まぁ、プログラミングに限らず覚えるコツってのは人それぞれなので一概に言えませんけどね・・・・
自分に合ったやり方でやりましょう(笑)

動画

※まだ撮っていません
※後日撮ります。

参考書籍

関連する記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUTこの記事をかいた人

Windows/Mac/Linuxを使う現役システムエンジニア&プログラマ。オープン系・組み込み系・制御系・Webシステム系と幅広い案件に携わる。C言語やC#やJava等数多くのコンパイラ言語を経験したが、少し飽きてきたので、最近はRubyやPython、WordPressなどのWeb系を修得中。初心者向けのプログラミング教室も運営中。オンライン・対面・出張等でプログラミングをレッスンします。