[ad_1]
ドライバーファイル
#include "dhoover42_prog4.h" int main() { int zooCapacity; int choice; int creatures[zooCapacity]; int numCreatures; char userChoice; cout << "What is the maximum capacity of your magical creature zoo?"; cin >> zooCapacity; cin.ignore(); numCreatures = 0; Creatures createArray[zooCapacity]; cout << "\n What would you like to do?"; cout << "\n\t1. Enter some Magical Creatures." << endl; cout << "\t2. Delete a Magical Creature." << endl; cout << "\t3. List/Print Creatures." << endl; cout << "\t4. Print Creature Costs." << endl; cout << "\t5. End Program." << endl; cout << "\tEnter 1, 2, 3, 4, or 5." << endl; cout << "CHOICE: "; cin >> choice; cin.ignore(); if( choice < 1 || choice > 5 ) do{ { cout << "Your choice was invalid. Choose a number 1 through 5." << endl; cout << "CHOICE: "; cin >> choice; cin.ignore(); } }while(choice < 1 || choice > 5); switch (choice) { case 1: enterCreatures(zooCapacity, numCreatures, choice, userChoice, createArray); break; case 2: cout << "2. Delete a Magical Creature." << endl; break; case 3: cout << "3. List/Print Creatures." << endl; break; case 4: cout << "4. Print Creature Costs." << endl; break; case 5: cout << "5. End Program." << endl; break; } }
ヘッダファイル
#ifndef DHOOVER42_PROG4_H #define DHOOVER42_PROG4_H #include <iostream> #include <iomanip> #include <fstream> using namespace std; struct Cost { int hoursCare; double hourlyCost; double foodCost; double materialCost; }; struct Creatures { string creatureName; string creatureDesc; double avgLength; double avgHeight; string creatureOrigin; string creatureDanger; double costPerMember; Cost cost; }; int enterCreatures(int &zooCapacity, int numCreatures, int choice, char userChoice, Creatures createArray[]); #endif
関数ファイル
#include "dhoover42_prog4.h" int enterCreatures(int &zooCapacity, int numCreatures, int choice, char userChoice, Creatures createArray[]) { cout << "What do you want to do?" << endl; cout << "\t1. Load my creatures from a file." << endl; cout << "\t2. Enter one creature manually." << endl; cout << "CHOICE: "; cin >> choice; cin.ignore(); string inputFile, stringConvert; ifstream inFile; int numCreatureTotal = 0; switch (choice) { case 1: cout << "What is the name of the file with your list of creatures? (ex: filename.txt)" << endl; cout << "FILENAME: "; cin >> inputFile; inFile.open(inputFile); if (inFile.is_open()) { while (!inFile.eof()) { getline(inFile, createArray[numCreatures].creatureName, '#'); getline(inFile, createArray[numCreatures].creatureDesc, '#'); getline(inFile, stringConvert, '#'); createArray[numCreatures].avgLength = stod(stringConvert); getline(inFile, stringConvert, '#'); createArray[numCreatures].avgHeight = stod(stringConvert); getline(inFile, createArray[numCreatures].creatureOrigin, '#'); getline(inFile, stringConvert, '#'); createArray[numCreatures].creatureDanger = stoi(stringConvert); getline(inFile, stringConvert, '#'); createArray[numCreatures].cost.hoursCare = stoi(stringConvert); getline(inFile, stringConvert, '#'); createArray[numCreatures].cost.hourlyCost = stod(stringConvert); getline(inFile, stringConvert, '#'); createArray[numCreatures].cost.foodCost = stod(stringConvert); getline(inFile, stringConvert, '#'); createArray[numCreatures].cost.materialCost = stod(stringConvert); cout << "\n" << createArray[numCreatures].creatureName << " was added to the zoo"; numCreatures++; numCreatureTotal++; cout << "\n" << numCreatureTotal << " creatures from " << inputFile << " have been added to the zoo."; } if (numCreatures >= zooCapacity) cout << "\nYou are now at maximum capacity of " << zooCapacity << " in your zoo."; } inFile.close(); case 2: do{ cout << "NAME: "; getline(cin, createArray[numCreatures].creatureName); cout << "\nDESCRIPTION: "; getline(cin, createArray[numCreatures].creatureDesc); cout << "\nAVERAGE LENGTH (in feet): "; cin >> createArray[numCreatures].avgLength; cin.ignore(); cout << "\nAVERAGE HEIGHT (in feet): "; cin >> createArray[numCreatures].avgHeight; cin.ignore(); cout << "\nLOCATION: "; getline(cin, createArray[numCreatures].creatureOrigin); cout << "\nIS IT A DANGEROUS CREATURE? (y or n): "; getline(cin, createArray[numCreatures].creatureDanger); cout << "\nHow many hours do you spend caring for the " << createArray[numCreatures].creatureName << " ? "; cin >> createArray[numCreatures].cost.hoursCare; cin.ignore(); cout << "\nWhat is the cost per hour for caring for the " << createArray[numCreatures].creatureName << " ? $"; cin >> createArray[numCreatures].cost.hourlyCost; cin.ignore(); cout << "\nHow much money do you spend on food for the " << createArray[numCreatures].creatureName << " ? $"; cin >> createArray[numCreatures].cost.foodCost; cin.ignore(); cout << "\nHow much money do you spend on grooming and medical supplies for the " << createArray[numCreatures].creatureName << " ? $"; cin >> createArray[numCreatures].cost.materialCost; cin.ignore(); cout << "The " << createArray[numCreatures].creatureName<< " has been added." << endl; cout << "Want to add more creatures? (y or n) "; cin >> userChoice; cin.ignore(); }while(userChoice == 'Y' || userChoice == 'y'); } return numCreatures; }
私が試したこと:
まだ何も前に働いていた
解決策 1
メニュー入力を囲む while ループを追加したいと思うかもしれません。 プログラムは今のところ、一度メニューを表示し、リクエストを処理してから終了します。
その他の観察事項:
メニューの選択肢を入力するコードを複製しているため、選択肢が無効な場合に内部ループを使用する (または、少なくともメニュー全体に while ループを配置するとそうなる) のは適切な設計ではありません。 のデータ型を変更する場合は、このループを変更することも忘れないでください。 choice
ヘッダー ファイルの使用には細心の注意を払う必要があります。 #include
ディレクティブ。 この場合、あなたの定義のために #include string
メンバー。 また、ヘッダー ファイルにインクルードすることはほとんどありません。 using namespace std;
これは、ヘッダーを使用するクライアントに予期しない結果を引き起こす可能性があるためです。 それを 実装 ファイルの場合、それはスタイルやコーディング標準の問題です。 ただし、一般的には、追加することに慣れるでしょう。 std::
標準ライブラリ関数、オブジェクト、コンテナなどにかなり迅速に変換できます。
あなたは行方不明のようです break
文の最後に case 1
実装ファイルで。
基本的に、ファイルの読み取り用に 1 回、ユーザー プロンプト用に 1 回、データ入力を複製しています。 Creature クラスを変更する場合は、両方の場所で変更を行うことを忘れないでください。 ソースに関係なく、同じ順序でオブジェクト データを読み取っていると仮定すると、単一のクリーチャーのデータを読み取ることができ、プロンプトを表示するかどうかを認識できる関数がより適切な方法である可能性があります。 そのような関数には、次のような署名がある場合があります
bool getCreature(Creature& creature, std::istream& input, bool showprompt)
解決策 2
見積もり:まだ何も前に働いていた
前回の動作時以降に行った変更を確認する必要があります。
コードが期待どおりに動作しないか、理由がわかりません。
ほぼ普遍的な解決策があります。コードをデバッガーで段階的に実行し、変数を調べます。
デバッガーは、コードが何を行っているかを示すためにここにあり、あなたのタスクはコードが何をすべきかを比較することです。
デバッガーには魔法はありません。コードが何をすべきかはわかりません。バグを見つけることはありません。何が起こっているのかを示すことで、バグを見つけるのに役立ちます。 コードが期待どおりに動作しない場合は、バグに近づいています。
コードの動作を確認するには: ブレークポイントを設定してコードの実行を確認するだけです。デバッガーを使用すると、行を 1 行ずつ実行し、実行時に変数を調べることができます。
Visual Studio 2010 でのデバッグの習得 – 初心者向けガイド[^]
Visual Studio 2010 を使用した基本的なデバッグ – YouTube[^]
1.11 — プログラムのデバッグ (ステッピングとブレークポイント) | C++ を学ぶ[^]
デバッガーは、コードが何を行っているかを表示するためだけに存在し、あなたのタスクはコードが何をすべきかを比較することです。
[ad_2]
コメント