スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

初心者のためのC#プログラミング本格入門72 - 悩む暇があったら反復的に学習をしよう

 この記事は、初心者のためのC#プログラミング本格入門71の続きです。前回は、テストを通じた学習のやり方をまとめました。今回は、プログラミング習得の心得を解説します。
 私は何度も「プログラミング本を読んだけども実際に出来ない」という悩みを持つ初心者の方と出会いました。そうした悩みを持つ初心者の方は、「自分には才能がない」、「理解力が足りないのだろうか」、「やはり文系は駄目なのか」・・・といった心境になるそうです。ですが、心配要りません。実際にプログラミングが出来ないのは、貴方の能力や適性の問題ではありません。
 プログラミングをやる人は理系の人だという誤解があるようですが、そもそも文系/理系なんて分類自体がナンセンスです。学問はそれほど単純ではありません。人類が積み重ねてきた英知を2分割にできません。プログラミングはプログラミングなのであって、○○系なんてものはありません。また、繰り返しになりますが才能云々は直ぐに答えを出すほど簡単ではありません。理解できないのはそういった問題ではなく、単純に何事も繰り返さないと習得できないだけです。歴史に名を残すほどとなると才能が必要でしょうが、普通にちょっとしたプログラミングするだけならばだれでも出来ます。現にハッカーでもプロでも繰り返し学習をしています。一度で全てを完璧に習得し、永遠にその状態を維持する事なんて人外の天才でなければできないでしょう。悩むなんて時間の無駄。余計な心配はせずに反復的に学習しましょう。
 復習を兼ねて、前回のテスト「CalculateSimpleExpression」と、計算処理の「Calculation」メソッドについて考えてみましょう。今のテストは実行できるか否かを確かめるためのものであり、大した意味はありません。この様なテストですと、前回述べたように「return 110;」でもパス出来てしまいます。AnalyzeSimpleExpressionの時と同様に改良しましょう。
 改良のポイントは、テストに網羅性があるのかという点と、特徴ある値(最大値、最小値、中央値など)をチェックできているのかという点です。この2点を盛り込んだテストにするには、先ずは今のテストコードを整理して準備します。一度に全てをやろうとしては駄目です。段階を踏む事が肝心です。具体的には、テスト値が変わっても大丈夫な様に、新しいメソッドに汎用的なコードを抜き出します。

class MultiAnalyzerTest
{
    //※他のプログラムは省略

    //簡単な式1つの計算処理をチェックする
    public void CalculateSimpleExpression()
    {
        int value1 = 10;
        int value2 = 100;
        CalculateTest( value1, value2 );
    }

    //計算処理をチェックする
    private void CalculateTest( int value1, int value2 )
    {
        string inputValue = value1 + " + " + value2;
        this.target = new MultiAnalyzer();
        this.target.AnalyzeExpression( inputValue );
        float result = target.Calculation();
        float rightValue = rightValue = value1 + value2;
        if ( rightValue != result )
        {
            System.Console.Write( inputValue + 
                "の計算処理が正しくありません。" );
            System.Console.Write( " 正しい値:" + rightValue );
            System.Console.WriteLine( " 処理結果;" + result );
        }
    }
}

コードを変えたらすぐに実行してみましょう。ブレークポイントをCalculateTestメソッド内のコードに設定し、デバッグ実行をすると、テストが実行されている事を確認できます。
 これでひとまず安心ですが、現在のテストは演算子の部分に問題があります。今のままでは足し算しかチェックできていません。どの演算子でも大丈夫なように自分で改良してみましょう。

class MultiAnalyzerTest
{
    //※他のプログラムは省略

    //簡単な式1つの計算処理をチェックする
    public void CalculateSimpleExpression()
    {
        int value1 = 10;
        int value2 = 100;
        CalculateTest( value1, value2, '+' );
    }

    //計算処理をチェックする
    private void CalculateTest( int value1, int value2, char sign )
    {
        string inputValue = value1 + " " + sign + " " + value2;
        this.target = new MultiAnalyzer();
        this.target.AnalyzeExpression( inputValue );
        float result = target.Calculation();
        float rightValue = 0;
        switch ( sign )
        {
            case '+':
                rightValue = value1 + value2;
                break;
            case '-':
                rightValue = value1 - value2;
                break;
            case '*':
                rightValue = value1 * value2;
                break;
            case '/':
                rightValue = value1 / value2;
                break;
            case '%':
                rightValue = value1 % value2;
                break;
        } 
        if ( rightValue != result )
        {
            System.Console.Write( inputValue + 
                "の計算処理が正しくありません。" );
            System.Console.Write( " 正しい値:" + rightValue );
            System.Console.WriteLine( " 処理結果;" + result );
        }
    }
}

これで、任意の値と演算子を指定できる計算処理のテストが出来上がりました。
 準備が出来たので、AnalyzeSimpleExpressionテストを参考にして、よりよいテストに改良します。

class MultiAnalyzerTest
{
    //※他のプログラムは省略

    //簡単な式1つの計算処理をチェックする
    public void CalculateSimpleExpression()
    {
        //テストデータを準備
        char[] signs = new char[] { '+', '-', '*', '/', '%' };
        int[] values = new int[] 
        { 
            int.MinValue, int.MinValue + 1, int.MinValue / 2, 
            0, int.MaxValue / 2, int.MaxValue - 1, int.MaxValue
        };

        //全演算子と主要な数値の組み合わせをチェック
        foreach ( char sign in signs )
        {
            foreach ( int v1 in values )
            {
                foreach ( int v2 in values )
                {
                    this.CalculateTest( v1, v2, sign );
                }
            }
        }
    }
}

このテストを実行すると・・・動作が停止して怪しいダイアログボックスが表示されます。これでプログラムが間違っている事が分かったので、このダイアログボックスはひとまず閉じて、何が間違っているのかを考えます。次回へ続く・・・
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。