#pragma twice

KAB-studio > プログラミング > #pragma twice > 016 Version 2.5 楽をしてみよう!

#pragma twice 016 Version 2.5 楽をしてみよう!

前のページへ 表紙・目次へ 次のページへ

 Version 2.5
楽をしてみよう!

さて、問題!
げげ、いきなり?
これまでの知識で答えられる問題だから、心配しないでいいよ
で、その問題は?
 1 から 5 までの数字をアウトプットに出力してみて
はーい。えっと、アウトプットに出力するのは TRACE() だから……

void CCalcDlg::OnBEqual() 
{
    TRACE( "1 2 3 4 5" );
}

でいい?
OK。じゃ、第2問。 1 から 100 までの数字を出力して
げげげ! 何そのめんどいの!
というわけでこれを簡単にする方法を教えましょう
あ、そういうのがあるんだ
じゃ、第1.5問
げ、また問題?
第1問の数字を、変数を使ってするとどうなる?
えっと……変数って iBox とかのことよね。1 から 5 だから、ひとつず
つ増やして、出力して、ってことを繰り返せばいいんだから……

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
}

こうでしょ
そ。この辺はもう完璧?
だいたいはねー。前回のとかを使い回してるだけだし
そだね。じゃ、ちょっと新しいこと憶えてみようか
う”
えっと、

    TRACE( "%d ", iBox );
    iBox += 1;

の2行が、5回繰り返されてるんだよね
正確には4.5回かな
じゃあ〈5回〉にしてみようか。こういうふうにすれば、5回の繰り返し
になるよ?

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
}

あ、ホントだ、でも余分なことしてて変じゃない?
でもこれだとちゃんと〈5回の繰り返し〉になるでしょ。そうすると便利
なものが使えるんだよね
便利なもの?
その繰り返しをしてくれるもの、それは while !
ほわいる?
そ。日本語に訳すと〈〜の間〉て意味かな。これを使って、こんなふうに
書き換えてみようか

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( 1 )
    {
        iBox += 1;
        TRACE( "%d ", iBox );
    }
}

 while って関数?
ううん、小カッコ付いてるけど関数じゃないんだよ
なんか混乱するなー
大丈夫、小カッコ付いて関数じゃないのは5つくらいしかないから
まぁそれくらいなら大丈夫かな。で、これどうなるの?
試してみ?
はーい。ビルドして実行して……!!

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 
(ずっと続く……)

こここ壊れちゃったよ水希ちゃん壊れちゃったよどうしよどうしよ!
〈実行〉ボタンにx印が付いているのがあるでしょ、それ押してみて
は、はいっ! ……あ、止まった

3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970
3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 
3984 3985 3986 3987 プログラム 'D:\Kamichan\Calc\Calc\Debug\Calc.exe'
はコード 0 (0x0) で終了しました。

ビックリしたー、ダイアログの【キャンセル】ボタン押しても閉じないん
だもの
数字を表示するのに忙しくて押されても分かんない、ってとこかな
忙しいとかそういうことあるの?
あるんだよね、これが。ま、それは置いといて、さっきのプログラム見て
みようか
はーい。こんなふうになったのって、やっぱり while ってヤツのせいよ

そういうこと。実際にどう動いてるのか、ブレークポイントで止めて見て
みようか
あ、そっかー、実際に自分でひとつずつ進めてみればわかるもんねー
やりかた憶えてる?
……いつやったっけ、それ
えっと…… Ver.2.1 とか 2.3 かな
ちょっと待ってね、今読み返すから……あ、手のひらのアイコンをクリッ
クすればいいんだ。どこにセットすればいいの、ブレークポイント
while(1) の行かな
 言われた通り while の行をクリックし、〈手のひら〉アイコンをクリッ
クする。ブレークポイントの印、●が左端に表示される。
状況描写って久しぶりね
んなこたいいから実行!
はーい
 実行して【=】ボタンを押すと、アプリケーションが止まり、●の上に矢
印が表示される。
あとは〈中カッコの上を乗り越える〉アイコンを繰り返し押してけば分か
るかな
〈関数の中に入らず出もせず〉ってヤツよね
 〈中カッコの上を乗り越える〉を押すたび、矢印が下の行へと移動する。
そして、下から2行目の中カッコで押すと、 while の行へと矢印が瞬時に
移動する。
へー、こーゆーふーに繰り返されるから、どんどん数字が書かれていった
んだー
 アウトプットを見ると、 TRACE() の次の行になるときに、数字が書き込ま
れる。
……で、これいつまで続けるの?
ずっと終わんないよ
あ、さっきのアイコンで止めなきゃいけないんだ
 〈実行にx〉アイコンを押してアプリを止める。
これで while が繰り返しをしてくれるってことは分かったよね。んじゃ、
その仕組みについて見てみようか
まず質問!
はい、火美ちゃん
関数の中に中カッコがあってもいいの?
実は、中カッコと中カッコ閉じがちゃんと1組揃ってるんなら、関数の中
にいくらあってもいいんだよ
ってことは……

void CCalcDlg::OnBEqual() 
{
    {
        {
            {
            }
        }
    }
}

とかでもいいの?
もちろん
じゃあさじゃあさ、

void CCalcDlg::OnBEqual() 
{
    {
}   //  ここで関数終わり。
    }   

とかしたらエラーになる?
ならないよ……
ええっ!?
だって、インデントとか、改行とか、そういうのは関係ないんだから、関
数の中カッコは、最後の中カッコ閉じに対応するでしょ
うーん……
だから、こんなんだっていいんだよ?

void CCalcDlg::OnBEqual() 
{{{{}}}}

あー、よーするに見かけに騙されちゃダメってことね
でもヒトは見かけに騙されるもんだから、インデントして見やすくするわ

ここは中カッコの中ですよー、ってことね
で、 while の下の中カッコ&閉じは〈この中を繰り返す〉っていう意味
うん、実際繰り返されてたね
で、一番のミソは while( 1 ) の小カッコの中。実は、この小カッコの中
がゼロ以外の時は、中カッコの中を実行し続けるっていうのが、この while
の特徴
? 1 は〈ゼロ以外〉だよね、だからずっと続けてたってこと?
そういうこと。でゼロの時には中カッコの中は実行しないんだわ
??
ま、これを試してみれば分かるかな

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( 0 )
    {
        iBox += 1;
        TRACE( "%d ", iBox );
    }
}

これって while の小カッコの中がゼロってだけの違いよね
そ。試してみ?
はーい。ビルドして実行……あ、何も起きないね
ブレークポイントを使って見れば分かるけど、 while の次は下から2行
目の中カッコに移動しちゃうから
これが、ゼロだと中カッコの中は実行されない、ってことなのね
で、この while の小カッコの中のチェックは、実は1回繰り返すごとに
行われるから、それで繰り返しの回数を調節できるんだわ
よーするに、 TRACE() の次、while の行に戻った時に小カッコの中がゼ
ロかそうじゃないか調べるってことよね。でも 0 とか入ってたら……あ
そう、変数を使えば、うまく回数を調節できるでしょ。たとえば、こんな
プログラムは?

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    int iChecker;
    iChecker = 1;
    while( iChecker )
    {
        iBox += 1;
        TRACE( "%d ", iBox );
        iChecker = 0;
    }
}

これはどう動くと思う?
えっと、 iChecker っていう変数を作って、その中に1を入れて、それを
while でチェックして……1が入ってるんだから中カッコの中に入るんだよ

そうだよ。で、中カッコの最初2行は同じ。最後は?
 iChecker にゼロを入れてるね。で、そのあと……あ、while の行に戻る
んだよね。このとき iChecker の中身をチェックして、今度はゼロが入って
るから、中カッコの中に入らない、で、終わり、ってこと?
そういうこと。だからこれだけだと 1 しか出力されないってことだね
ふーん……
ま、よーするに while は〈小カッコがゼロじゃない間は実行する〉ってい
うふうに憶えるといいかな
……
……火美ちゃん聞いてる?
あ、あのね、もしかしてこういうふうにすればいーんじゃない?

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 5;
    while( iBox )
    {
        iBox -= 1;
        TRACE( "%d ", 5 - iBox );
    }
}

こうすれば5回中カッコの中を繰り返したときに iBox の中がゼロになる
から、うまく5回だけ表示できるんじゃない?
そう! 分かってきたじゃん
でしょでしょ! へー、こういうふうにちゃんと便利な道具が揃ってるん
だー
こういう道具を憶えること、うまく使いこなせてくことが上達の近道か
な。while が使えれば、第2問だって簡単に答えられるでしょ
あの 1 から 100 までってヤツ? 楽勝でしょ
でも、もっと楽な方法があるんだよねー
え?


/*
    Preview Next Story!
*/
今回は280行オーバー。だんだん長くなってくね
でもプログラムが増えてるだけだから、読むの辛くはないでしょ
似たプログラムが繰り返し出てくるしね
だから書く方も楽
手抜きー
う”
というわけで次回
< Version 2.6 便利なものいろいろ! >
につづく!!
楽とか便利とか、いい話ばっか
プログラムではそれが大事なのだよ君ぃ!!
な、なに?


/*
    おまけ!
*/

では次のお便り! 東大和市の〈キョロちゃんイカス!〉君から
ベタなペンネームですねー
先日買ったC言語の本の最初に、こんなプログラムが載っていました

#include <stdio.h>

main()
{
    printf( "Hello, world!" );
    return 0;
}

でもこれをどうやってVCで使えばいいのか分かりません。教えてぷりー
づ! ってゆー質問だけど……
ひどいプログラムですねー
ヒドイの?
酷いです。ま、こんな本買っちゃったのが運悪いって感じですね
そこまで言う……
で、移植方法だけど、まず具体例としてはこんな感じにするとうまくいく
と思います

// CalcDlg.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include "Calc.h"
#include "CalcDlg.h"
#include <stdio.h>    //ここに追加。

//  略。

void CCalcDlg::OnBEqual() 
{
    TRACE( "Hello, world!" ); //printf を置き換え。
//  return 0;   //この行は削除。
}

あれ、これってここ最近ずっと使ってる関数よね
そ。 main() も関数だから、まず main() の中身をこの中に移しちゃって
ください。次に、 printf を TRACE に書き換えてね
 TRACE() って、これも使ってるのだよね、アウトプットに出力するの
機能としてはほとんど同じだから置き換えられるんです。んで return の
行を削除
これなんで削除するの?
うーん、これはまた今度ね
う”ー
あと、 #include のところは、同じファイルの上の方に移しちゃえば大丈
夫。ただ
ただ?
これはなくても動くよ
そーなの?
そーなの。ま、こういうふうに移せば、=を押したときに本に載っていた
こととほとんど同じことができると思います
本が無駄にならなくて良かったね。じゃ、また来週!
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。