2017-12-12 11 views
-5

私は何をすべきか理解できないので、このプログラムの助けが本当に好きです。私は正しい答えを得るためにオンラインで検索しようとしましたが、コード作成の方法を学んでいるので、これは難しいことです。私は大いに感謝します!エルフによって作られたおもちゃのためのパラレルアレイC++

あなたは、彼のエルフによって行われた作業をサンタが処理するのに役立つプログラムを作成する必要があります。 elves.datという名前のデータファイルを使用します。各エルフには1行が表示されます。その行にはエルフの名前とエルフが作ったおもちゃの数が入っています。ファイルから読み込み、値を並列配列に配置します。何個のエルフがあるかわからないので、ファイルの最後まで読んで数えなければなりません。各エルフの評価を記録するには、3番目に並んだ文字列の配列が必要です。 50個のコンポーネントの容量を持つ配列を宣言する必要があります。

プログラムは配列に読み込む必要があります。各エルフが作ったおもちゃの数を見て、並行した配列で評価を記録する必要があります。下記の表は格付けを決定します。プログラムは、ラベルの付いた素敵な列に並べて配列を印刷します。それは、エルフによって作られた玩具の総数、500個以上の玩具を作ったエルフの数、最も多くの玩具を作ったエルフの名前、そして最小の玩具を作ったエルフの名前を印刷しなければならない。それぞれの計算はそれ自身の関数を持つ必要があります。計算を行う関数では出力を行わないでください。すべての出力は1つの出力関数で行う必要があります。配列を持つ配列内の要素の数を常に関数に渡すことを忘れないでください。

おもちゃメイド........評価

500以上:***** 5つ星

300と499の間

:*** 3つ星

200の間

* 1つ星

200下::299と - なし

ここelves.datの情報です: Smiley 662 Curley 88 Clementine 335 Jasper 105 Lucinda 775 Brunhilda 103 Florence 441 Oskar 820 Snowflake 990 Bernard 690 Punch 298 Chuckie 10 Frosty 102 Snowman 311 April 830 Merry 299 Sunshine 331 Buddy 1234 Carol 271 Misty 111 Harold 52 Henry 292 Twinkle 308 Starlight 703 Burr 112 Angelica 444 Bluenose 689 Harry 254 Twinkle 259 Stardust 121 Greensleeves 453 Noel 312 Happy 209 Yukon 534 Snowcap 190 Northpole 598

ここに私のコードがありますが、私は非常に基本的な理解を持っているように感じていますが、私は近くにいないことを知っています!私は助けていただければ幸いです。本当に必要です。

#include <iostream> 
#include <fstream> 
#include <cstring> 

using namespace std; 

int main() { 

    ifstream inFile; 
    inFile.open("elves.dat"); 

    string elfName[50]; 
    int ToysMade[50]; 
    int count = 0; 
    int i; 
    //Read file until you've reached the end           
    while (!inFile.eof()){ 
    inFile >> elfName; 
    inFile >> ToysMade; 
    count++;} 
    cout << "Elf: " << elfName <<endl; 
    cout << "Toys made: " << ToysMade <<endl; 

    inFile.close(); 
    return 0; 
} 
+1

推奨読み取り:[ 'しばらく(!inFile.eof()){'](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside -a-loop-condition-considered-wrong)を指定します。 – user0042

+1

Binkyの名前で、パテはこれにどのように関与しましたか?パティを使って学校のサーバにログインして作業をする場合は、代わりにC++ IDEをローカルでダウンロードしてダウンロードすることを検討してください。あなたが選んだどのIDEにも、デバッガが内蔵されているので、ソフトウェア開発の経験がさらに楽しくなります。 – user4581301

+2

こんにちは、スタックオーバーフローへようこそ!私たちは渋滞の中でプログラマーを助けてくれることをうれしく思いますが、あなたの宿題はしません。あなたの宿題をペーストして一般的な「私は何をしますか」の質問の代わりに、あなたが本当に助けが必要なことを知るために理解していない特定の部分に集中するのはどうですか? 「ファイルからデータを読み込むにはどうすればよいですか?または "私が望む機能をどのように呼び出すのですか?"問題を管理しやすい塊に分割し、一度に1つずつ攻撃してください。そうすれば、あなたは一般的な "私はそれをすることができません"という態度で大量の仕事をすることで克服することはできません。 –

答えて

0

これは私がプログラムを設計する方法です。私はstructまたはclassを使って見た目を簡単にすることもできましたが、私はあなたを集めています。これは、依頼されているものより少し進んでいるかもしれません。あなたはparallel arraysと言及しました。 arraysの代わりに私はそれの代わりにstd::vectorsを使用しています。 vectorsを通常のarraysに簡単にスワップすることはできますが、コンテナで機能するlibrary関数を使用しているため、計算を行うための関数が変更されます。 raw arraysを使用すると、また、それらのarraysboundschecksをしながらfor & whileloopscomparison小切手の束を行う必要があります。あなたの全体的なプログラムはこれに似ています。

#include <string> 
#include <vector> 
#include <algorithm> 
#include <numeric> 
#include <iostream> 
#include <iomanip> 
#include <fstream> 

// Typedefs 
typedef std::vector<std::string> Strings; 
typedef std::vector<unsigned> Values; 

unsigned countToys(const Values& toys); 
void determineRatings(const Values& toys, Values& ratings); 
unsigned count5StarElves(const Values& toys); 

std::string getBestElf(const Strings& elves, const Values& toys); 
std::string getWorstElf(const Strings& elves, const Values& toys); 

void displayStats(const unsigned numElves, const unsigned fiveStarElves, 
        const Strings& elves, const Values& toys, const Values& ratings, 
        const std::string& bestElf, const std::string& worstElf); 

int main() { 

    // Create Containers Giving 50 available spots. 
    Strings elves; 
    elves.resize(50); 
    Values ratings; 
    ratings.resize(50); 
    Values toysMade; 
    toysMade.resize(50); 

    // Create, Open, Read From File & Close It 
    unsigned numElves = 0; 
    std::ifstream file; 
    file.open("elves.dat"); 
    while (file >> elves[numElves] >> toysMade[numElves]) { 
     numElves++; // Need this to resize containers. 
    } 
    file.close(); 

    // Adjust containers to fit number of elves. 
    const std::size_t newSize = numElves; 
    elves.resize(newSize); 
    ratings.resize(newSize); 
    toysMade.resize(newSize); 

    // Get The Stats -- Counting the total number of elves is called within the display function. 
    determineRatings(toysMade, ratings); 
    unsigned fiveStarElves = count5StarElves(ratings); 
    std::string bestElf = getBestElf(elves, toysMade); 
    std::string worstElf = getWorstElf(elves, toysMade); 

    // Display The Results 
    displayStats(numElves, fiveStarElves, elves, toysMade, ratings, bestElf, worstElf); 


    std::cout << "\nPress any key and enter to quit." << std::endl; 
    char c; 
    std::cin >> c; 

    return 0; 
} 

unsigned countToys(const Values& toys) { 
    unsigned total = std::accumulate(toys.begin(), toys.end(), 0); 
    return total; 
} 

void determineRatings(const Values& toys, Values& ratings) { 
    for (unsigned i = 0; i < toys.size(); i++) { 
     if (toys[i] >= 500) { 
      ratings[i] = 5; 
     } 

     if (toys[i] < 500 && toys[i] >= 300) { 
      ratings[i] = 3; 
     } 

     if (toys[i] < 300 && toys[i] >= 200) { 
      ratings[i] = 1; 
     } 

     if (toys[i] < 200) { 
      ratings[i] = 0; 
     } 
    } 
}; 

unsigned count5StarElves(const Values& ratings) { 
    unsigned fiveStartCount = 0; 
    for (auto val : ratings) { 
     if (val == 5) { 
      fiveStartCount++; 
     } 
    } 

    return fiveStartCount; 
} 

std::string getBestElf(const Strings& elves, const Values& toys) { 
    auto it = std::max_element(toys.begin(), toys.end()); 
    if (it == toys.end()) { 
     return ""; 
    } 

    // for random access containers with O(1) - constant 
    return elves[it - toys.begin()]; 

    // If using non-random containers use the following with O(n) - linear 
    // return std::distance(toys.begin(), it); 
} 

std::string getWorstElf(const Strings& elves, const Values& toys) { 
    auto it = std::min_element(toys.begin(), toys.end()); 
    if (it == toys.end()) { 
     return ""; 
    } 

    // for random access containers with O(1) - constant 
    return elves[it - toys.begin()]; 

    // If using non-random containers use the following with O(n) - linear 
    // return std::distance(toys.begin(), it); 
} 

void displayStats(const unsigned numElves, const unsigned fiveStarElves, 
        const Strings& elves, const Values& toys, const Values& ratings, 
        const std::string& bestElf, const std::string& worstElf) { 

    std::cout << "***********************************************\n"; 
    std::cout << "* Welcome To Santa's Workshop:    *\n"; 
    std::cout << "* We have " << numElves << " working elves.     *\n"; 
    std::cout << "* Our Elves made a total of " << countToys(toys) << " toys today. *\n"; 
    std::cout << "***********************************************\n\n"; 
    std::cout << "Here are their stats:\n"; 
    std::cout << "===============================================\n"; 


    // Calculate the longest name for proper screen output formatting. 
    std::size_t maxLength = 0; 
    for (const auto name : elves) { 
     if (name.length() > maxLength) { 
      maxLength = name.length(); 
     } 
    } 

    std::cout << std::left << std::setw(maxLength + '\t') << "Elf Name:" << std::setfill(' ') << "Toys Made:\t\tRating:\n" << std::endl; 

    for (unsigned i = 0; i < numElves; i++) { 
     std::cout << std::left << std::setw(maxLength + '\t') << elves[i] << std::left << std::setfill(' ') 
      << std::setw(4) << std::left << toys[i] << std::left 
      << "\t\t" << ratings[i] << " stars" << std::endl; 
    } 

    std::cout << "\n\n"; 

    // Additional Stats: 
    std::cout << "There are " << fiveStarElves << " 5 Star Elves!\n"; 
    std::cout << "The Best Elf is: " << bestElf << std::endl; 
    std::cout << "The Worst Elf is: " << worstElf << std::endl; 
} 

エルフ。DAT

Smiley 662 
Curley 88 
Clementine 335 
Jasper 105 
Lucinda 775 
Brunhilda 103 
Florence 441 
Oskar 820 
Snowflake 990 
Bernard 690 
Punch 298 
Chuckie 10 
Frosty 102 
Snowman 311 
April 830 
Merry 299 
Sunshine 331 
Buddy 1234 
Carol 271 
Misty 111 
Harold 52 
Henry 292 
Twinkle 308 
Starlight 703 
Burr 112 
Angelica 444 
Bluenose 689 
Harry 254 
Twinkle 259 
Stardust 121 
Greensleeves 453 
Noel 312 
Happy 209 
Yukon 534 
Snowcap 190 
Northpole 598 

編集 - あなたが何か表示機能に少し空想をしたい場合。これにdisplayStats()機能を変更します。

void displayStats(const unsigned numElves, const unsigned fiveStarElves, 
        const Strings& elves, const Values& toys, const Values& ratings, 
        const std::string& bestElf, const std::string& worstElf) { 

    std::cout << "***********************************************\n"; 
    std::cout << "* Welcome To Santa's Workshop:    *\n"; 
    std::cout << "* We have " << numElves << " working elves.     *\n"; 
    std::cout << "* Our Elves made a total of " << countToys(toys) << " toys today. *\n"; 
    std::cout << "***********************************************\n\n"; 
    std::cout << "Here are their stats:\n"; 
    std::cout << "===============================================\n"; 


    // Calculate the longest name for proper screen output formatting. 
    std::size_t maxLength = 0; 
    for (const auto name : elves) { 
     if (name.length() > maxLength) { 
      maxLength = name.length(); 
     } 
    } 

    std::cout << std::left << std::setw(maxLength + '\t') << "Elf Name:" << std::setfill(' ') << "Toys Made:\t\tRating:\n" << std::endl; 

    // A little bit of magic: (not really) just pretty 
    Strings stars; 
    std::string str; 
    for each (auto star in ratings) { 
     if (star == 0) { 
      str = std::string(""); 
     } 

     if (star == 1) { 
      str = std::string("*"); 
     } 

     if (star == 3) { 
      str = std::string("***"); 
     } 

     if (star == 5) { 
      str = std::string("*****"); 
     } 

     stars.push_back(str); 
    } 

    for (unsigned i = 0; i < numElves; i++) { 
     std::cout << std::left << std::setw(maxLength + '\t') << elves[i] << std::left << std::setfill(' ') 
      << std::setw(4) << std::left << toys[i] << std::left 
      << "\t\t" << stars[i] /*ratings[i] << " stars"*/ << std::endl; 
    } 

    std::cout << "\n\n"; 

    // Additional Stats: 
    std::cout << "There are " << fiveStarElves << " 5 Star Elves!\n"; 
    std::cout << "The Best Elf is: " << bestElf << std::endl; 
    std::cout << "The Worst Elf is: " << worstElf << std::endl; 
} 
関連する問題