レポートの基本的なチェック項目

仕様

  • 全般
    • 最初に作成者の学籍番号と氏名
    • である体
  • 目的
    • 記載があるかどうか
  • データ
    • 記載があるかどうか
    • 定数、変数それぞれについて言及しているか
    • データの型(整数型など)や種類(定数・変数)、データ構造(配列)に言及しているか
    • 定数、変数どちらも設定(入力)可能な値の範囲が示されているかどうか
    • 定数の場合はプログラム内で設定した値が示されているかどうか
    • 配列の場合は配列の大きさ、配列に入る値の型や種類、値の範囲が示されているかどうか
    • 構造体の場合は宣言した構造体のテンプレートのメンバの型や種類、データ構造が示されているかどうか
    • 構造体の場合はテンプレートだけでなく、構造体変数や配列についても記載されているかどうか。構造体配列の場合は配列の大きさが示されているかどうか
  • 機能
    • 記載があるかどうか
    • 処理手順ではなく機能(入力・処理・出力など)ごとに分けて書かれているかどうか
    • 例外処理・終了処理が書かれているかどうか
    • 入力時の例外処理を考えているかどうか
    • 画面表示が例外処理も含めて書かれているかどうか

プログラム

  • 定数の利用
  • 変数名と定数名の使い分け
  • コメント
    • 全体的なコメント
    • 関数定義の引数についてのコメント
  • 字下げ
  • 最初に作成者の学籍番号と氏名
  • プログラムのミス
  • 仕様と一貫しているか

段階的詳細化(疑似コード)

  • ソースコードをほぼ1対1で対応するレベルまで書けているか
  • 例外処理を記述しているか
  • 繰り返し(回数)を記述できているか
  • 仕様との相違

各回のレポートのコメント

  • 第1回レポート
    • プログラムは難しいものではないので、基本チェック項目を厳しめにチェックしました
    • 定数は先頭大文字、変数は先頭小文字で使い分けましょう
    • ifの条件が仕様と異なっている場合がありますので、実行時に境界の数値を必ずチェックしましょう
    • 入力時の例外処理は必ず入れるようにしましょう。また、間違った入力をしたらすぐ終了ではなく、正しく入力できたら、次の処理にいくようにできるとより親切ですね。
    • 仕様のデータの書き方が不十分な人が多かったです。チェック項目の内容を満たすように自分なりの書き方を決めて、毎回それで統一するとよいと思います。
    • 機能は処理の流れで書かずに、処理の種類で分けて書きましょう。「入力-処理1...処理n-出力」を基本に考えるとよいでしょう。
    • 少しでも不十分な点がある場合はBになっています。不十分な点が多かったり、項目がないとCになっています。またプログラムでは、入力時の例外処理を重要視して見ています。
  • 第2回レポート
    • 仕様については、前回とほぼ同様の方法でチェックしています。まったく赤を入れる余地がない場合はAですが,それ以外はB,不十分な記述が多い場合や,記述が抜けている場合はCです。
    • 画面表示についてですが,通常の入力処理の部分に例外処理の表示もあわせて書くと分かりやすいです。
    • 1人目のテストの点数を入力してください>> -100
      入力の値が不正です。0から100の間で入力してください。
      1人目のテストの点数を入力してください。>> 100
      2人目のテストの点数を入力してください>>
      (以下繰り返し)
  • データの記述がまだできていない人がいます。書き方には決まりはありませんが,各内容に漏れの無いようにしてください。
    • 入力できる生徒数の最大値:定数,整数型,値の範囲は1から100,設定した値は10
      ユーザが入力するテストの点数:変数,整数型,値の範囲は0から100,初期値はなし
      生徒全員のテストの点数:配列,整数型,配列に格納する値の範囲は0から100,配列の大きさは入力できる生徒数の最大値,初期値はなし
  • データの記述に書くべきデータが漏れている場合があります。今回の場合は評価の基準の点数などです。実際にプログラムを書くつもりで仕様書は考えましょう。
  • 機能を入力,処理,出力などのまとまりに分けて書くのは,ほとんどの人ができていました。
  • 段階的詳細化(疑似コード)ですが,繰り返しや例外処理が抜けている人が多かったです。
  • 疑似コードは1行ずつプログラムに変換すればプログラムが出来上がるようなレベルで考えましょう。
  • 疑似コードの書き方ですが,以下のように段階が分かるように記述してください。
    • L0:○○○
      L1: 変数を初期設定する。
      L1-1: 合格者数を0に初期化する
      L1-2: 不合格者数を0に初期化する
      L2: 10人の...
      L2-1: 学生カウンタが...
      L2-2: 試験結果を入力する
      L2-3: 合格者と不合格者に分ける
      L2-3-1:...
      (以下略)
  • 第3回レポート
    • 詳細なコメントは本日夜にアップしますので、明日以降確認して下さい。(11/1 14:47)
    • コメントアップしました。(11/2 12:45)
    • 仕様書
      • 機能や例外処理,画面表示については殆どの人が記述できていました。ただ、数名、機能で入力と出力の所しか書いていない人や、例外処理を考えていない人、画面表示が抜けている人がいました。仕様でこれらの部分をしっかり考えておくことが、プログラム作成時の負荷を軽くします。作るときにどう作るかを考えるというのは大変ですよね。なので、作るときはどう作るかがほぼ自明な状態でコーディングに集中できるように、仕様・擬似コードに時間を掛けて下さい。
      • データ部分がまだ充分でない人が多かったです。前回のコメントをぜひ参考にしてください。また、自分の周りでAをもらえている友達がどんな風に書いているか一度見せてもらうとよいと思います。#過去のレポートを見せてもらうこと。
      • データの記述で、配列のところで少し書き方に悩んだ人がいるかと思います。配列のデータの場合は、型、配列の大きさ、配列に格納するデータの値域(取りうる値の範囲)を定義しておくと良いでしょう。
    • プログラム
      • 定数名と変数名の表記を区別していない人がいます。よくあるのは、定数は先頭大文字、変数は先頭小文字という表記の区別ですが、別のルールでも構いません。とにかく、見た人がこれはプログラム中で値が変わるデータだな、これはプログラム中で変わらないデータだなというのがわかることが大事ですので、区別をして下さい。
      • 変数や配列の宣言時に、初期化を行う場合と初期化を行わない場合があります。この区別ができていない人がイます。例えば、ユーザからの入力を代入する変数や、計算結果の代入をする変数は、初期値を設定しておく必要はありません。それに対して、変数にその変数自身の値を代入するような場合は、初期値の設定が必要です。必要な初期化は行い、不必要な初期化は行わないようにしましょう。
      • 整数値しか入らない変数を実数で定義している人がいました。実数型は、丸め誤差が生じる場合がありますので、整数値しか入らない変数を実数型で定義するのはバグの原因になります。変数の型は、その変数に入る値の型で宣言してください。
      • 上に関連して、割合の計算で型変換を使えていない人が多かったです。型変換がつかえなく、割合の計算がうまく行かなかった人が、上のようにしていたのだと思います。型変換の使い方は以下のとおりです。
        #include<iostream.h>
        
        main(){
        
        double average;
        int sum = 0;
        int counter;
        for(counter=0; counter<10; counter++){
            sum=sum + (counter+1);
        }
        
        average = static_cast<double>( sum ) / counter;
        
        cout << sum << " ÷ " << counter << " = " << average << endl;
        }
  • 小数点の桁を揃えた表示が出来ていない人も多かったです。setprecision(2)だけではうまくいきません。setiofragsも使う必要があります。第3回の授業プリントをよく確認して下さい。
  • 頻度の割合が上手く計算できていない人がいますが、その場合は教員に質問をして動く状態に修正して再提出してください。
  • 第4回レポート
    • 仕様書
      • データの記述や機能、画面表示など、今まで指摘した部分がまだ書けていない人がいます。今までのコメントをよく確認してください。
      • 実数値の表示形式(実数の桁を揃えて表示)については、機能の出力部分の説明に記述してください。
    • 段階的詳細化
      • 繰り返しなど手抜きをしている人がいます。1対1対応を心がけましょう。
    • プログラム
      • 前回同様、不必要な初期化をしている人がいます。初期化の必要性を良く考えましょう。
      • 前回同様、実数値を出力する場合は、桁を揃えて出力しましょう。
      • 前回同様、合計を入れる配列を実数型で宣言している人がいました。代入するデータの型に合わせ、計算の際には型変換を使いましょう。
      • 配列を0で初期化する時は、for文などは使わず宣言時に初期化しましょう。
        例)
        int seiseki[Member_max][Kyoka_max] = {0};
      • プログラム中では生の数値はなるべく使わず、定数で扱うようにしましょう。cout内のメッセージも同様です。今回の場合、入力できる点数の最大・最小も定数にするとよいでしょう。
        例)
        const int Max_num = 100;
        const int Min_num = 0;
        
        cout << "点数を" << Min_num << "から" << Max_num << "の範囲で入力してください。>>";
      • その他、今までのコメント内容が守られていない人がいますので、コメントをよく確認してください。
  • 第4回レポート
    • 仕様書・段階的詳細化
      • 今まで指摘した点が守れているかどうかで判断しています。
    • プログラム
      • eの文字ですが、プログラムの汎用性(e以外の文字の検索)を考えると、定数に入れて使うとよいと思います。
      • 例外処理で、入力できる文字の種類(半角英数字記号)の判定をしていない人がいました。
      • 例外処理で、入力可能文字数を超えたらという例外処理をしていた人がいましたが、cin.getline(str,Max,'\n');としていて、Maxより文字数が多かったらというような判定をしている人はあまり意味がないです。やるのであれば、cin.getline(str,Max,'\n');としたときに、入力可能文字数はMaxより小さい値を設定するなどしてください。
  • 第6回レポート
    • 仕様書
      • 今回から関数が出てきました。関数を使用するときの仕様書の書き方ですが、大きく2通りあります。自分が書きやすい方を選んでください。
      • パターンA: データや機能、画面用時など、main部分と関数部分の仕様書を分けて作成する。mainの機能の中で、関数を使用する部分はその旨記入する。
      • パターンB: mainと関数をまとめて1つの使用として作成する。データは、mainと関数はまとめて記載する。関数の引数などmainのデータと対応するものは、独立には書かずにmainのデータの記述にあわせて書く。
    • 段階的詳細化
      • 詳細化の方は、mainと関数部分は分けて作成してください。どちらもL0から初めます。また、mainの方では、どこで関数を呼び出すのかが分かるように記入します。
    • プログラム
      • 関数に引数を渡すときに、関数内でしか使用しない値をわざわざ引数で渡している人がいました。例えば、利用体重を計算するときのBMI値などです。関数内でのみ使用するものは、関数内で定義して使用しましょう。
      • 関数の始めに、関数についてのコメントを全く書いていない人がいました。以下の例を参考に、必ず引数や返り値について記述するようにしてください。
        // 2つの整数を与え、その積を求めて返す関数
        // num1: 整数1 (整数値: 値引数,入力)
        // num2: 整数2 (整数値: 値引数,入力)
        // seki: 整数1と整数2の積 (整数値: 返値,出力)
        int kakezan (int num1, int num2) {
            int seki;
            seki = num1 * num2;
            return seki;
        }
      • 関数の引数で1文字変数を使っている人がいましたが、意味の分かる名前を使いましょう。
  • 第7回レポート
    • 基本的には前回のコメントと同様です。
    • データの記入があまりにもできていない人には再提出を課しています。少し厳しいかも知れませんが、簡単な課題のうちに、しっかり書き方を覚えてもらわないと、最終課題を乗り越えられませんので、今のうちにちゃんと書けるようになっておいてください。
    • 整数の入力に対して実数での入力を例外として扱いたい場合は、以下を参考にしてください。
      #include <iostream.h>
      
      int main(){
        double input_num;
        int test_num;
      
        while(1){
           cin >> input_num;
           test_num = input_num;
           cout << "入力値は、" << input_num << "です\n"; 
           if(input_num - test_num == 0){
              cout << "整数値が入力されていますので、終了します。\n";
              break; 
           }         
           cout << "整数値を入力してください。n"; 
        }    
        return 0;
      }
  • 第8回レポート
    • 12/27に返却します。
  • 第9回レポート
    • 構造体が新しく増えたので、データの記述が難しかったと思います。人によって書き方は異なると思いますが、大きく分けて以下の2つの情報をセットで記述するようにしてください。
      • 構造体のテンプレート: 構造体の型宣言にあたる部分の説明として、構造体のテンプレートの名前(言葉で)、メンバの型、種類、範囲などを定義してください。
      • 構造体の実体:構造体の変数宣言にあたる部分の説明として、テンプレートとして使用する構造体を変数として使うのか、配列として使うのかを定義してください。中身はテンプレートの方で詳しく述べているので、ここでは繰り返し述べなくてよいです。
    • 例外処理の有無で悩んだ人がいたと思います。プログラムを作るときは基本は再利用、一般化ということを念頭に置いて作りましょう。
    • プログラムの評価ですが、基本的なところが問題なくできていて、かつ最速タイムの人が複数いる場合に対応できている人はAとしました。
    • mainの外で、定数(変数・配列)を宣言(グローバル定数)している人がいます。構造体の型宣言や関数の宣言などでその定数を使っている場合はそれで問題ありませんが、main内でしか使用しない定数はmain内で宣言してください。
    • mainの外で、変数や配列を宣言(グローバル変数・配列)している人がいます。これはバグの原因になりますので、原則避けてください。main-関数間では、引数でやり取りして下さい。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-12-20 (金) 15:35:22 (1376d)