4

他の人の助けを借りて、コードをゼロからやり直しました。これは、多数のエラーや機能しないものを指摘したためです。したがって、コードを大幅に変更しました。

2 つの書式設定以外はプログラムを動作させていますが、動作する方法がわかりません。

出力の上部に「DAILY SCOOP REPORT」を 1 回だけ印刷する必要がありますが、移動しましたが、配列の設定方法が原因で、どこに配置すればよいかわかりません。

これが私のコードです:

#include <iostream>

含む

含む

含む

含む

含む

名前空間 std を使用します。

int main() {文字列flavor_input、Capitalize; string フレーバー[] = { "チョコレート"、"バニラ"、"ストロベリー"、"ミント"、"ロッキー ロード"、"モカ" }; int scoop_count [6] = { 0, 0, 0, 0, 0, 0}, スクープ = 0, j, k;

bool valid_option; 

cout << "Welcome to Frozen Tongue Ice Cream Shop\n"<<endl;
cout << "Flavors avaliable: "<<endl;
cout << "Chocolate "<<endl;
cout << "Valnilla "<<endl;
cout << "Strawberry "<<endl;
cout << "Mint "<<endl;
cout << "Rocky Road "<<endl;
cout << "Mocha \n"<<endl;

while(true) { 

    cout << "Please enter the flavor of icecream sold or 'STOP' to exit.\n"<<endl;
    getline (cin, flavor_input); // getline causes rocky road to be accepted with a space between the words. 


    string::iterator it( flavor_input.begin());  //converting the first letter of input to uppercase if not already.

    if (it != flavor_input.end())
        flavor_input[0] = toupper((unsigned char)flavor_input[0]);

    while(++it != flavor_input.end())
    {
        *it = tolower((unsigned char)*it);
    }


    if (flavor_input == "STOP" || flavor_input == "Stop")
        break; 

    valid_option = false; 

    for(int i=0;i<6;i++)  //Checks to see if input matches those of possible inputs.
        if(!flavor_input.compare(flavors[i]))
        {
            valid_option = true;
            break;
        }

        if(!valid_option)
        {
            cout << "Invalid Flavor. Try again.\n\n"; 
            flavor_input.clear();
            continue; 
        }

        for(int i=0;i<6;i++)
        {
            if(!flavor_input.compare(flavors[i])) 
            {
                cout << "Enter how many scoops were sold: ";
                cin >> scoops;
                cin.ignore();
                scoop_count[i] += scoops; 
                scoops = 0; 
                cout << '\n';
                break;
            }
        }
}


for(int i=0;i<6;i++)
{
    if(!scoop_count[i])
        continue;
    else
    {
        cout << "\nDAILY SCOOP REPORT: "<<endl;   
        cout << setiosflags( ios::left )
            << setw( 11 )  << flavors[i]
        << resetiosflags( ios::left )
            << setw( 4 ) << scoop_count[i] << endl;

    }
}


cin.get();
return 0;

}

すべての支援に感謝します。大変感謝しております。



すべての支援と勉強の方向性を教えてくれたおかげで、最後の部分を除いてプログラムを完了できました。

「DAILY SCOOP REPORT」の行を移動したときに、なぜ機能しないのかがわかりました。私はファイルの名前を変更し、それをコンパイルすると、それが意味をなす場合、「最後の作業構成」のようなものを出力していました。そこで、新しいプロジェクトを作成し (.cpp ファイルには提出用の特定の名前が必要です)、コードを入れました。これで、行は一度だけ印刷されます。

以下のコードブロックでは、最初の文字以外のすべての文字の大文字と小文字を区別しているように見えます。私がこのようにケースコーディングを行っている理由は、各単語の最初の文字が大文字で、その後は小文字でフレーバーレポートが印刷されるように指示されているためです。Rocky Road で 2 番目の「R」をキャップする方法を調べますが、空白を無視する以外は、方法がよくわかりません。行を解析する必要がありますか?

私を正しい方向に向けてくれる人は誰でも大歓迎です。

試してみましたが、最初のifステートメントで「構文エラー:識別子 'flavor_input'」というエラーが発生します。

//converting the first letter of input to uppercase if not already.

string::iterator it( フレーバー入力.begin());

    if flavor_input = "rocky road"
        (it != flavor_input.end())
        flavor_input[6] = toupper((unsigned char)flavor_input[6]);

    if (it != flavor_input.end())
        flavor_input[0] = toupper((unsigned char)flavor_input[0]);

    while(++it != flavor_input.end())
    {
        *it = tolower((unsigned char)*it);
    }
4

5 に答える 5

5

switch文字列では機能しません。

==次のように正しい選択肢を選択するには、演算子を使用する必要があります。

string count = // ... something
if (count == "choc") {

}
else if (count == "van") {

}
else if (count == "str") {

} // .. etc

他のいくつかのこと:string一貫した大文字で綴ることを確認してください。すべて小文字で、大文字は使用しないでください。Stringとは違うものstringです。

文字列は一重引用符""ではなく二重引用符で囲んでください'''a'一重引用符は、またはのような単一文字用'b'です。"abc"二重引用符は、およびのような複数文字の文字列用です。"hello"

count関数名と引数名の両方として単語を使用することはおそらく悪い考えであり、同じ名前は2つの異なることを意味するため、コンパイルされません。

関数から複数の値を返すことはできません。のようなものを書くことreturn a,b,c;は、おそらくあなたがそれを意味したいことを意味するものではありません。コンマ(,)演算子を使用すると、同じステートメントで複数の式を評価でき、結果は最後の式の値になるため、書き込みreturn 1,2,3;は書き込みとまったく同じになります。return 3;

于 2009-11-17T22:44:39.880 に答える
1

C++は文字列をオンに切り替えることができません。switch(count) {...}if/else ifステートメントに置き換えます。さらに、文字列の適切な形式は「文字列」ではなく「文字列」です(一重引用符は「a」のように単一の文字を示します)。また、文字列オブジェクトには常に正しい大文字小文字を使用するようにしてください(戻り値としてのようにではなくstringString

それ以外に、発生しているコンパイラエラーを確認すると便利です。

于 2009-11-17T22:46:02.637 に答える
1

私があなたの情報源で気づいたもう一つのこと:あなたは次の行の終わりにあるセミコロン(-cola?)を省略しなければならないでしょう:

cout << "Please enter the flavor of icecream sold or 'STOP' to exit.\n"<<endl
     << "Flavors avaliable:\n"<<endl
     << "chocolate\n"<<endl
     << "valnilla\n"<<endl
     << "strawberry\n"<<endl
     << "mint\n"<<endl
     << "rocky road\n"<<endl
     << "mocha\n"<<endl
     << "Enter flavor : ";

これはただ一つの巨大な表現です。同じことが当てはまります

cout << "\nDAILY SCOOP REPORT: \n"<<endl
     << "chocolate :"<<chocolate<<"\n"<<endl
     << "vanilla :"<<vanilla<<"\n"<<endl
     << "strawberry :"<<strawberry<<"\n"<<endl
     << "mint :"<<mint<<"\n"<<endl
     << "rocky road :"<<rocky_road<<"\n"<<endl
     << "mocha :"<<mocha<<"\n"<<endl;

また、endl"\n"は冗長です。選択肢が空の行で区切られているのがわかります。

于 2009-11-17T23:19:54.270 に答える
1

私はすべてを見ていませんが、これはあなたが望むことをするつもりはありません:

if (flavor = 'STOP' || 'stop')

私はあなたが必要だと思います:

if (flavor.compare("STOP") == 0 || flavor.compare("stop") == 0)
于 2009-11-17T23:10:59.740 に答える
0

私が見る問題を下に行きましょう。

String count (string& flavor, string& count, string& chocolate, string& vanilla, string& strawberry, string& mint, string& rocky_road, string& mocha);

Stringここで使用している、std::stringまたは単にstring.

count 関数内 (SO は貼り付け時にコードを切り捨てます) では、endl の後にセミコロンで行を終了していますが、ストリーム出力を続行しようとしています。私はあなたが意味したと思います

次:

if (flavor = 'STOP' || 'stop')

比較ではなく割り当てであるのoperator==代わりにを使用するつもりだったと思います。operator=また、c++ にはジャンクションがないため、次のように記述する必要があります。

if (flavor == 'STOP' || flavor == 'stop')

次:

switch (count) { case 'choc' :

ここで 2 つの問題があります。まず、switch ステートメントでは、plain-old-data (pod) のみを使用できます。スイッチで std::string を使用しても、自動的に operator== は呼び出されません。if/else ステートメントを使用する必要があります。また、文字列リテラルは二重引用符で囲まれますが、文字リテラルは一重引用符で囲まれます。

次:

chocCount + count;

これは実際には声明ではありません。私はあなたが意味したと確信していますchocCount += count;

次:

if (flavor = chocolate) chocCount + count;

ここでも、 and を使用==chocCount += count;ます。

これらの問題のほとんどは繰り返されます。これらの問題が存在するすべての場所で、これらの問題をそれぞれ修正する必要があります。他にも問題があるかもしれませんが、基本的には頭の中でコンパイルしていました。

セマンティックの問題を見つけるためにすべてを読んだわけではありませんが、カウント関数は明らかにカウントを返していません(少なくとも現在投稿されているもの)。あなたは文字列を返していますが、これは文字列を意味していると思います。

この人間のコンパイラーが 1 つの宿題を解決しようとしているのはそれだけです。優れた C++ チュートリアルを読むことをお勧めします。

于 2009-11-19T06:48:05.187 に答える