[WebP Vol.015] Cプログラミング ~しっかり基礎を固めようシリーズ 定数編~

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【 Webプログラミング Code Sample 】                          Since2001/11/23

                        Code015: Cプログラミング
                〜しっかり基礎を固めようシリーズ 定数編〜

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                                                    Produced by ichikoro.com

           ▼毎週月曜日配信です。
           ▼等幅フォントでご覧いただくとキレイに見えます。
           ▼登録・解除はこちらから可能です。
               < http://www.ichikoro.com/webp/ >
                  ※バックナンバーへのリンクもあります。
                  ※お友達にもぜひお勧めください(^^)/


─【Contents】───────────────────────────────
    01.Review  .................. 前週のおさらい
    02.Answer  .................. 前週の回答
    03.Answer  .................. 前週の回答:その2
    04.Guide  ................... フリーフォーマット
    05.Guide  ................... フリーフォーマット:全角文字は禁止です!
    06.Guide  ................... 3大構造:プログラムには3つの制御構造があるのだ
    07.Guide  ................... しっかり基礎を固めよう:定数 その1
    08.Guide  ................... しっかり基礎を固めよう:定数 その2
    09.GUide  ................... しっかり基礎を固めよう:演算子 その1
    10.Question  ................ 今週の問題
    11.News  .................... 今週の気になるニュース「ネット業界の一週間」
    12.From Editor .............. 編集後記

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  01.Review  「前週のおさらい」
──────────────────────────────────────

前回はコンパイラの役割とエラー、ワーニングの違いについてご説明しました。
簡単に振り返ってみましょう。

    ・コンパイル
        文法のチェックと、オブジェクトファイルの作成をする作業のことです。
            →コンパイラ
                コンパイルをするソフトウェアのことです。

    ・リンク
        必要な部品を集結させ、最終的に実行が可能なファイルを作成する作業のこと
        です。
            →リンカ
                リンクをするソフトウェアのことです。

    ・エラー
        致命的な間違いのことです。コンパイラ、リンカが実行者に対して注意を促す
        とともに、コンパイル(リンク)の作業をそこまででストップします。例えば文
        法が違う(スペルミス)、存在しない関数(今まで“命令”と言っていた物です。
        後述)を記述した場合などに発生します。

    ・ワーニング
        致命的な間違いではないがあまり好ましくない表現に対して、コンパイラ(リン
        カ)が実行者に対して注意を促します。エラーと違いメッセージを出すのみで、
        作業自体は継続されます。

もし分からない場合はもう一度前号を引っ張り出してきてくださいね。
さぁ、今週も行ってみましょう!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  02.Answer  「前週の回答:その1」
──────────────────────────────────────

前回下記のような問題を出しました。

    Q1.ディスプレイにあなたの名前をローマ字で3回表示さるプログラムを
        書きなさい。ただし一回名前を表示させる度に改行すること。
        方法は問いません。

すでにある程度の知識がある方や、勘の良い方、がんばって調べられた方(!)は
解けると思います。


例えば前回の説明で注目すべきは、下記でしょうか。

>    1行目:
>        printfを使うために必要。

>    3行目:
>        メイン関数と呼ばれています。。
>        この下に書いてある { から } までがメイン関数です。
>        この中にプログラムを書いていきます。

>    5行目:
>        printf("文字列")
>        文字列の所には好きな言葉が書けます。
>        これは、ディスプレイに文字列を出力しますよっていう命令(関数)
>        です。\nは改行を示します。

>    C言語では何らかのステートメント(文)を記述したら、その最後にセミコロン(';')を
>    書かないといけないルール(文法)になっています。「ここで終わりだよ」ということ
>    を教えてあげるわけです。


たったこれだけの情報ですが、逆にこれだけで十分だと言えます。実行方法について
はすでに述べた通りです。さぁ、ではその答えとして下のようなプログラムをみなさ
ん思い浮かべられたのではないでしょうか。


    ■回答例その1

        #include<stdio.h>

        int main(void)
        {
            printf("M.Katsube\n");
            printf("M.Katsube\n");
            printf("M.Katsube\n");

            return(0);
        }

    ■回答例その2

        #include<stdio.h>

        int main(void)
        {
            printf("M.Katsube\nM.Katsube\nM.Katsube\n");

            return(0);
        }


これが、プログラムの面白いところです。高校や中学校の数学のように、答えは一つ
だけとは限らないのです。その人にあった、その人が好きな手法で「正解」を作り上
げることができるのです。

私が高校時代、純粋に「面白い!」と感じたのはここでした。がんばれば、がんばっ
た分、すばらしいプログラムが生み出せる、それに答えてくれるといえます。


そこで、この回答にはまだまだ可能性があると言えます。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  03.Answer  「前週の回答:その2」
──────────────────────────────────────

例えばこういう答えも、もちろんOKなわけです。


    ■回答例その3

        #include<stdio.h>

        int main(void)
        {
            printf("M.Katsube");
            printf("\n");

            printf("M.Katsube");
            printf("\n");

            printf("M.Katsube");
            printf("\n");

            return(0);
        }


これは解説していませんので出てこないと思いますが、


    ■回答例その4

        #include<stdio.h>

        int main(void)
        {
            printf(
                    "M.Katsube\n"
                    "M.Katsube\n"
                    "M.Katsube\n"
                    );

            return(0);
        }


連続する文字列はコンパイル時に合体されますので、回答例その4は
回答例その2と同じと言えます。

さぁ、まだまだ回答例は続きますよ!


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  04.Guide  「フリーフォーマット」
──────────────────────────────────────

C言語はフリーフォーマットです。
直訳すれば、“自由な体裁(書式)”でしょうか。


先に解説したHTMLでは、半角スペースやタブ、改行が無視されるため、自由にタグを
記述することができましたよね。意味的には同じです。やはりC言語も半角スペース、
タブ、改行などのホワイトキャラクター(目に見えない文字)は、実際の処理とは関係
ないため、好きに使うことができます。

逆に言えば一切書かなくてもOKです。
そこで、

    ■回答例その5

        #include<stdio.h>

        int main(void){
        printf("M.Katsube\n");printf("M.Katsube\n");printf("M.Katsube\n");return(0);}

というプログラムは正解なわけです。
また

    ■回答例その6

        #include<stdio.h>

        int main(void)
        {
            printf
            ("M.Katsube\n")
            ;printf
            ("M.Katsube\n")
            ;printf("M.Katsube\n");return(0);
        }

なんて気持ち悪い書き方も、同じく正解となります。



いくら自由に書けるといっても、一番気をつけないといけないのは

    「分かりやすいプログラム」

を書くことです。プログラムは自分だけが見るとは限りません。たとえ自分だけであ
っても、数ヶ月後に見たとき直感的に分かるような物でないといけません。特に開発
において俊敏性が求められる、Web業界でもこの考えは非常に重要です。

すこしでも、やさしい気持ちでプログラムを書きましょう。


いや、本当に他の人のプログラムを見ていると、如実にその時の様子があらわれてい
るのです。納期ギリギリだったんだなぁ...とか、かったるそうに作ってるなぁ...と
か、精神分析ができそうな勢いです(^^; 特にバグ部分を見ていると、目も当てられ
ないときがあります。

納品される側の感想としては、「納品するコードは丁寧に」「客がコードを読めない
とは限らない」でしょうか(笑)


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  05.Guide  「フリーフォーマット:全角文字は禁止です!」
──────────────────────────────────────

ただし、全角文字は使えません。同じ空白スペースでも、全角スペースを使用すると
エラーとなります。下のプログラムをコンパイルしてみましょう。メルマガだとわか
んないと思いますが全角スペースを使っています。


    ■printfの前に二つずつ全角スペースが入っています。

        #include<stdio.h>

        int main(void)
        {
          printf("M.Katsube\n");
          printf("M.Katsube\n");
          printf("M.Katsube\n");

            return(0);
        }


    ■コンパイル例

        C:\>bcc32 hello.c
        Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
        hello.c:
        エラー E2206 hello.c 5: 不正な文字 ' ' (0x8140)(関数 main )
        エラー E2206 hello.c 5: 不正な文字 ' ' (0x8140)(関数 main )
        エラー E2206 hello.c 6: 不正な文字 ' ' (0x8140)(関数 main )
        エラー E2206 hello.c 6: 不正な文字 ' ' (0x8140)(関数 main )
        エラー E2206 hello.c 7: 不正な文字 ' ' (0x8140)(関数 main )
        エラー E2206 hello.c 7: 不正な文字 ' ' (0x8140)(関数 main )
        *** 6 errors in Compile ***


もし、このようなエラーが出て、その箇所がいまいち分からない場合は、ほぼ全ての
テキストエディタ(統合環境)についていると思われる、“検索・置換”の機能をフル
活用しましょう。こういった時に限って忘れがちなんですよね(^^;

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  06.Guide  「3大構造:プログラムには3つの制御構造があるのだ」
──────────────────────────────────────

前回の問題は“3回”表示せよ、という問題でしたが、例えばこれが100回、1000回、
1億回表示せよ、という問題だったりした場合みなさんどうしますか?コピー&ペース
トは、さすがにつらいものがあります。というよりは、それだったらプログラムを使
う必然性がありません。こういう時には、「反復構造」を用います。


そもそもプログラムは大きく分けて3つの制御構造が存在します。制御構造とはプログ
ラムの“流れ”を意味します。

    ・順次構造
    ・反復構造
    ・選択構造

順次構造はその名の通り、順番に処理をすることを意味します。通常上から下に向か
って処理が流れていくというのはみなさんもう、お分かりですよね?

反復構造はこれもその名の通り、ある処理を何回も繰り返して行うことを指します。
つまり、「100回表示せよ」という場合は「表示する処理を100回繰り返せ」という
構造になります。


では、これをそのままプログラムに書き直してみましょう。

    #include<stdio.h>

    int main(void)
    {
        int i;

        i = 1;
        while( i <= 100 ){
            printf("M.Katsube\n");

            i = i + 1;
        }

        return(0);
    }

かなり不意打ちでしたね(^^;
このコードを理解するためには、いくつか学ばないといけないことがあります。

    ・定数
        → 文字列(文字)
        → 数値

    ・変数
        → 変数の宣言
        → 変数へ代入

    ・演算
        → 四則演算
        → 等符号

    ・反復構造
        → while文

おおっと、意外にありますね。私も書いていてビックリしました(^^;<おいおい
(他にももっと具体的な文法とか関数とかあるんですが、おいといて)

さぁて順番に説明していきましょう。

    「ところで、選択構造はどうなったん?」

そのうち説明します(^^;
あせらずジックリと基礎を抑えていきましょう。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  07.Guide  「しっかり基礎を固めよう:定数その1」
──────────────────────────────────────

ではまず定数から説明します。定数とはその名の通り定まった数、不変の値のことを
表します。上記のプログラムで言うと、

    i = 1;

の右側(右項)の“1”がこれにあたります。
また、

    printf("M.Katsube\n");

の中にある

    "M.Katsube\n"

これも定数です。現に、ここで出現した数値(文字列)はプログラムが終了するまで変
わることがありません。



まとめましょう、C言語では数字を書くときには、

    12

などといった具合に普通に書くことが可能です。ただこれは10進数の場合です。Cで
は10進数以外の基数もサポートしています。

    ・10進数
        普通に書きます。

    ・8進数
        数字の最初に一個だけ“0”をつけます。

            020

        とあった場合、これは10進数でいう20ではなく、「8進数の20」を表します
        (ちなみにこの場合、10進数だと16になります。)

    ・16進数
        数字の最初に“0x”をつけます。

            0xFF

        といった感じです。

Cでサポートいている基数は上記のみです。
2進数など他の基数は使用できません。

    ※16進数などの基数については、バックナンバーのCode002にある9項を
     ご覧ください。
        http://www.ichikoro.com/webp/back_list/?cd=00002


あ、この基数、というよりは2進数、16進数の考え方は今のうちに必ずマスターして
おいてください。後々の説明でぐわーと出てきます、はい。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  08.Guide  「しっかり基礎を固めよう:定数その2」
──────────────────────────────────────

C言語では文字や、文字の固まりを次のように操作します。

    ・文字
        文字単体を表す時には、文字をシングルコーテーションで囲います。

            'a'

        といった具合です。ただ、ここでいう文字単体とは、1byteであることが
        条件になります。ですから、

            'me'

        はルール違反です。また、見た目には一文字であっても、2byte以上の文字は
        文字ではなく“文字列”となります。

            '愛'

        は2byte文字ですから、ルール違反となります。

            'にょ'

        にいたっては、問答無用でエラーです(^^;


    ・文字列
        ダブルコーテーションで囲ったものをC言語では“文字列”といいます。
        主に2文字(2byte)以上の文字を扱う場合に使います。

            "I love only her"

        ただ、

            "a"

        という使い方でも問題はありません。が、注意すべきは、たとえ中身が
        1byteであっても、文字列として扱われるという点です。なんとなく納得
        いかないかもしれませんが、

            'a' ≠ "a"

        なのです。
        詳しくは後述しますが、これにはもちろんワケがあるのです。


文字と文字列の違いは理解してしまえば簡単なのですが、意外にバグの発生原因に
なることが多かったりします。今の時点では、

    ・文字
        1byteの文字を表現する

    ・文字列
        複数byteの文字を表現する

と覚えて置いてください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  09.Guide  「しっかり基礎を固めよう:演算子 その1」
──────────────────────────────────────

C言語では、もちろん四則演算のような計算をすることができます。

    足し算: +
    引き算: -
    掛け算: *
    割り算: /
    剰余算: %

となります。
詳しいことは、また次回に!


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  10.Question  「今週の問題」
──────────────────────────────────────

    Q2.下記のサンプルを参考にし、底辺12cm、高さ5cmの三角形の面積を求め、その
        結果を表示するプログラムを完成させよ。

            ・サンプル
                printf("%d", 1);


解答は次回配信時に!


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  11.News  「今週の気になるニュース
                インターネット業界の一週間」
──────────────────────────────────────

ボリューム過多につきコメント少な目です。
うーん、これだけでメルマガ一本だせるんじゃない?とか思ったりして(^^;


---------------------------------------------
■2月4日(月)
---------------------------------------------
・伊藤忠商事、エキサイトを買収へ
  http://www.watch.impress.co.jp/internet/www/article/2002/0204/excite.htm
    ポータルサイトとしては、2000年11月30日にinfoseekが楽天に買収されると
    いうニュース依頼の衝撃です。impressの記事によれば伊藤忠の狙いはエキサ
    イトのブランドとのこと。エキサイトがどう生まれ変わるのか楽しみです。

        【関連記事】
            ・楽天とインフォシークは相思相愛?」
              http://www.zdnet.co.jp/news/0011/30/rakuten_infoseek.html

            ・伊藤忠商事がエキサイトを買収、完全子会社に
              http://www.watch.impress.co.jp/broadband/news/2002/02/04/excite.htm


・多言語ドメインの標準化作業が最終段階に
  http://www.watch.impress.co.jp/internet/www/article/2002/0204/idna.htm


---------------------------------------------
■2月5日(火)
---------------------------------------------
・Bluetooth対応洗濯機・レンジ・冷蔵庫 東芝が本格的ネット家電を発表
  http://www.zdnet.co.jp/news/bursts/0202/05/14.html

・EZwebでもYahoo!メッセンジャーが利用可能に
  http://k-tai.impress.co.jp/cda/flash?site=ktai&aid=8085

・KDDI、光ファイバーによる“KDDI イーサアクセスサービス”の提供を開始
  http://ascii24.com/news/i/net/article/2002/02/05/633353-000.html

---------------------------------------------
■2月6日(水)
---------------------------------------------
・米国人の1億4,300万人がインターネットを利用〜米商務省調査
  http://www.watch.impress.co.jp/internet/www/article/2002/0206/doc.htm

・米Microsoft、JavaからC#への自動変換ツール「JLCA」β1をリリース
  http://www.watch.impress.co.jp/internet/www/article/2002/0206/jlca.htm

・IPv6は来年春までに普及する——NTTコミュニケーションズ
  http://www.zdnet.co.jp/broadband/0202/06/ipv6.html

・ウイルスとセキュリティーへの不安でシマンテック株急騰
  http://www.asahi.com/english/svn/K2002020600538.html

・ジャストシステムがユーザー参加型方言サイトを開設
  http://cnet.sphere.ne.jp/News/Infostand/Item/2002-0206-J-1.html

・J-フォン、パケット通信をいよいよ3月から開始 - ムービー写メールも可能
  http://pcweb.mycom.co.jp/news/2002/02/06/16.html

・金の成る木はセキュリティ市場に生えている?
  http://www.zdnet.co.jp/news/0202/06/e_security.html
    生えているでしょうねぇ。特にこれからの日本は、一般ユーザーの意識が
    高まるでしょから。

---------------------------------------------
2月7日(木)
---------------------------------------------
・米Googleがプログラミングコンテストを開催
  http://www.watch.impress.co.jp/internet/www/article/2002/0207/google.htm
    国籍に制限はありませんが、英語で審査員を説得できることが条件になっていま
    す。ああ、英語...少なくともこの業界にいると勉強しなきゃいけませんね(ーー;)

・米Sun Microsystems、Javaの最新版「J2SE 1.4」RC版をリリース
  http://www.watch.impress.co.jp/internet/www/article/2002/0207/j2se.htm

---------------------------------------------
2月8日(金)
---------------------------------------------
・国内DSL回線が178万契約に
  http://cnet.sphere.ne.jp/Broadband/News/2002/Item/020208-3j.html
    ネットレイティングス社のブロードバンドの定義だと、国内ですでに
    20%近い人がブロードバンドだそうです。

        【関連記事】
            ブロードバンド・ユーザーの利用動向データ提供を開始
            〜 すでに360万人が利用、ネット利用時間は2倍、ページビューは3倍 〜
            http://www.netratings.co.jp/press_releases/pr_240102.html


・首都圏でも「インターネットITS」の実証実験がスタート
  http://www.watch.impress.co.jp/internet/www/article/2002/0208/iits.htm
    クルマにITは、カーナビくらいでいいんじゃないのかなぁと思わないでも
    ないですが(^^; といいつつETCは欲しいっす。
    ところで、一つ検討して欲しいのは“交通違反”です。今のように運が悪い
    やつだけが馬鹿を見るというようなやり方は納得いきません。また、交通ル
    ールを守ることによる“見返り”制度も欲しいです。1000km無違反だったら、
    税金が1000円安くなるとか。交通ルール守るようになる人増えると思うんだ
    けどなぁ。IPV6導入と一緒にぜひ検討して欲しいものです。

・警察庁、古物営業法の改正案を発表〜ネットオークションなどの規制を強化
  http://www.watch.impress.co.jp/internet/www/article/2002/0208/npa.htm
    私がインターネットを始めた頃は、「利用者側で自主規制していく」という
    感じだったのですが、こうやって法の整備が進んでいくにつれ、一つの社会
    として認知されたのだなぁと実感します。

・総務省、Yahoo!BBとNTT東西に対し業務改善指導文書を発出
    〜Yahoo!BBには“回線にぎり”、NTTには工事期間の尊守について
  http://www.watch.impress.co.jp/internet/www/article/2002/0208/soumu.htm
    国が何らかの形で関与してそうですよね、Y!BB。
    これが失敗すると日本におけるインターネット分野はかなり厳しい状況に
    なりますからね。とはいえ、ブロードバンド化は間違いなく今年中に山が
    きますね。

・ハイパーリンクは誰のもの? いよいよ審問スタート
  http://www.zdnet.co.jp/news/reuters/020208/e_bt.html


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                           編    集    後    記
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

前回の問題が、こんなにも広がるとは思ってもみなかった、という方がほとんどじゃ
ないでしょうか?こういう発想の展開が、プログラミングにおいてはとても重要なの
です。だって、プログラマが普段目にするのって文字だけですもんね。そこから具体
的なイメージを引っ張り出してこなければならない。逆にそこが楽しかったりもする
のです。

さぁ、来週はいよいよプログラムの醍醐味の一つが味わえます。
お楽しみに!



先週の土曜日一つ夢がかないました。大きなTV(+高音質)で映画を見るのが憧れだ
ったのですが、願いカナって28型のワイドTV(無論フラット)が今も目の前に...って、
しょうもない夢で申し訳ないです(^^;

28型だと大型の部類でも一番下の方だと思うのですが、それでも以前使っていた14型
とは迫力が違います。もう、映画好きにはたまりませんなぁ(笑)早速マトリックスと
グラディエーターのDVDを堪能しました。液晶も悩んだんですが、大きさの魅力に負
けてしまいました。でも思っていたより全然キレイですね、液晶TV。技術の進歩って
すばらしい。


何か一歩一歩前進していく感じがして、こういうちょっとした夢を実現していくのっ
て何かいいですよね。私の最終目標は劇場を建て、そこのオーナーになり、おかかえ
劇団と一緒に世界を回ることだったりします(^-^)電波少年のヤベタローくんじゃな
いですが(^^;

じゃぁなんであんた技術者なんだと言うと、これもその一歩だと信じてるからなんで
すね。アプローチの方法は一つだけじゃないと信じてますから。


ではでは、また来週お会いしましょう!



■Information
 「Webプログラミングからのお知らせ」

    【相互広告募集のお知らせ】
      読者数を増やしたいメルマガ発行者さんを募集しています。お互いに一定期間(1〜
      3回程度)広告を掲載し合いませんか?(無料)

         お問い合わせ: mm-webp@ichikoro.com

    【コラム募集のお知らせ】
      Webプログラミングでは、寄稿していただけるコラムやプログラムなどを募集して
      います。たくさんの読者の方にあなたをアピールする場にもなります。ぜひ有意義
      な情報やご意見をお送りください。

         お問い合わせ: mm-webp@ichikoro.com


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

                   【 Webプログラミング Code Sample 】

                    発  行 : ichikoro.com
                発行責任者 : 勝部 麻季人
                              < katsube@ichikoro.com >
                  発行部数 : 1642部(前回)
                 Webサイト : < http://www.ichikoro.com/webp/ >
            お問い合わせ先 : < mm-webp@ichikoro.com >

                            Powerd by まぐまぐ
    All Right Reserved, CopyRight(C) 2001 Webプログラミング Code Sample
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■