aki本アーティクルは「応用プログラミングA」の2013年5月28日の講義内容の補足です。内容の正確さは保証しません。これをそのままコピーしてレポートを書く人がいますが、全く勉強にならないのでやめましょう。前回、「C++でのポインタと配列の利用」ではクラスのオブジェクトをいきなり配列にとって、そのポインタを挿げ替えるような初期化を行っていたわけですが、ふつうは(少なくとも最近の言語は)こんな”野蛮な”オブジェクトの生成をしたりはしません。(もちろんmallocやfreeなどもありますが...)今回はnew演算子とdelete演算子を使った例を見てみましょう。演算子を使って作成する。オブジェクトには初期値として、(3,4,5)を与える。デストラクタを追加している。0;}[/code]new演算子を使うとメモリの動的確保が行えます。deleteはnewで確保したメモリを開放します。newとdeleteは演算子でmalloc()やfree()は関数なので書式が異なります。Triangle(3,4,5);[/code]という書式で、コンストラクタを呼んでクラスのインスタンスを取得しています。new/deleteを使った配列の場合も覚えておきましょう。//このカッコの付き方に注意[/code]new演算子を使ってクラスのインスタンスを取得した場合、そのメンバ変数やメンバ関数にアクセスするときはアロー演算子(->)を使用します。lang=”cpp”]tri->show();[/code]問題2「値渡し、ポインタ渡し、参照渡し」C++で関数にオブジェクトを渡す際に、「値渡し」、「ポインタ渡し」、「参照渡し(reference)」といった方法でオブジェクトを渡すことができます。問題2ではこれらを実験するプログラムを作成します。//ここでobのスコープが終了するため、設定した値は消滅する。//ここでobのスコープが終了するため、設定した値は消滅する。{//参照渡しで受け取るときは"&ob"になる。0;}[/code]チャック・ノリス問題として出題してみたり。チャック・ノリス(@chucknorris_jp)は、値渡しでクラスのインスタンスを書き換えることができる。★レポート締切前なので未完です。aki応用プログラミングA(C++言語)、前回の「C++のフレンド関数」に引き続き、今週は「C++でのポインタと配列の利用」です。C++言語はオブジェクト指向(クラス指向)ではありますが、C言語のパワフルなポインタも使えることは意外と知られていません。(とはいえ実用上はオブジェクトの配列を使うことが多いと思います)今回は「学生の成績を管理するクラス」を作成して、ここまでの復習を兼ねた総合問題という設計になっています。出題された課題は3問あります。Q1、Q2、Q3...と順に解いていかないと、最後までたどり着けませんので注意です。サンプル中に出てくる学生の名前は昨年のAKB48からガラッと変わって『ラブライブ!』からの引用が多いようですが、打つのが大変なのと、私自身が思い入れがないので適当なボカロあたりの名前に差し替わっております。このあたり、まるまるコピーした場合は減点対象となりますので要注意。ここでは学生のデータを管理するStudentListクラスを作成します。show();};[/code]このオブジェクトの配列に10人分のデータをコンソールから入力し、すべて入力し終わったらコンソールに出力する基本となるプログラムを作ります。「独習C++(第4版)」の例4.2を参考にするとよいようです。lang=”cpp”]//配列とポインタ:クラスオブジェクトを配列でとった場合も、C言語におけるポインタと同様に扱える。0;}[/code]実行すると、10人分の名前と学籍番号、学年の入力を強いられるだけのマゾプログラムです。ブレイクポイントを仕込んでおかないと結果が一瞬で流れて消えます。それではあまりにご無体ですので、ここではmax=3として端折っています。レポートではmax=3としたら誤りです。ちなみに講義中はptrのことを『ハンドル』と呼んでしまいましたが、厳密には異なります。ここは固定のメモリアドレスをptrに渡しているので『ポインタ』と呼ぶのが適切でしょう。『ハンドル』とは、動的にメモリ配置が変わる場合、たとえばガーベージコレクションなどを備えたJavaやC#のような環境において、実メモリアドレスが移動しても、捕まえておけるオブジェクトのことを『ハンドル』と呼ぶべきようです。タイトルは「総合問題1」となっています。先ほどのQ1の続きからはじめて、成績を管理するResultListクラスを追加します。先述のStudentListクラスをPublicに継承して、公開メンバとして100個までの科目名を格納し、その単位異数と評価を格納します。格納されている科目数を記憶する変数を非公開メンバ変数として持ちます。出力するshowResult()を持ちます。2010の「クラスダイアグラム」機能で描画してみました)継承をコードにするとこんな感じになります。showResult();};[/code]なお、今回のプログラムでは入力チェックなどは一切行いません。削除や変更もしませんし、科目名の重複もチェックしません。//普通はこう呼ぶほうが多いですよね。"この学生のデータを入力しました。0;}[/code]【実行結果】9番目の「かいと」(KAIT!?)と10番目の「らぴす」の成績を入力しています。「応用プログラミングA」が同じ名前なのですが、見た目には動作しています、が、デバッガ仕掛けるとわかりますが、別の科目になっています。重複チェックを入れるのはさほど難しいことではないので考察としてやってみてもよいのでは。結果を表示するshow()ももう一工夫してもいいように思います(Q3にもありますので...)。それに「end」と入れずに[0]を入れると終わるなど、工夫のしようはありそうです。書けるようになってください。最後のQ3「総合問題2」です。前述Q2のResultListクラスに総合成績評価をあらわすGPAを追加します。GPAは成績評価のSを4、Aを3、Bを2、Cを1、それ以外を0とした取得講義の平均で求めます。先ほどのRegist()を拡張してすでに同盟の科目の成績が入力されている場合には評価を上書き修正するようにします。科目と成績を削除するdel()も実装します。以下、サンプルソースです。main()がないととっかかりがつかみづらいと思いますので。★レポート締切前なので、ResultListクラスの個々のメソッド実装は未公開です。sumc;break;}}}//以下はmainの参考。"入力を終了するには科目名にendと入力してください。"この学生のデータを入力しました。0;}[/code]実行結果のスクリーンショットはうまく、登録や削除を説明できるように複数撮りましょうね!たとえば、このスクリーンショットだけでは何が何だかわかりませんよね?第7回に続きます。座標:(1.5,1.5)半径:2GB:(150,150,150)登録してある色一覧hite:(255,255,255)lack:(0,0,0)ed:(255,0,0)reen:(0,255,0)lue:(0,0,255)yan:(0,255,255)agenta:(255,0,255)ellow:(255,255,0)円1の色はRedです円2の色はGreenです円3の色は登録されている色にありません次回は「C++でのポインタと配列の利用」です。youthkee.%d人のブロガーが「いいね」をつけました。