0

在下面的代码中,我正在根据饮食计划找到我必须吃的晚餐。我通过饮食、午餐和早餐作为输入,而必须返回晚餐作为输出。饮食包含我今天应该吃的东西。每个字母都是一些食物。早餐和午餐包含我已经吃过的东西。

如果早餐或午餐包含饮食中不存在的任何元素,我应该返回“Cheater”。否则,我必须找到饮食中存在但早餐和午餐中没有的元素。

我的代码显示晚餐已成功计算。但它不返回晚餐。

#include <iostream>
#include <string>
using namespace std;

class DietPlan
{
public:
    string chooseDinner( string diet, string breakfast, string lunch )
    {
        int lim1 = breakfast.length(), lim2 = lunch.length();
        int flag1 = 1, lim0 = diet.length();
        //Sort diet.
        for(int k = 1; k < lim0; k++)
            for(int x=0;x < lim0-k; x++)
                if( diet[x]>diet[x+1] )
                {
                    char temp = diet[x];
                    diet[x] = diet[x+1];
                    diet[x+1]=temp;
                }
        cout<<"Diet: "<<diet<<endl;
        //Sort breakfast.
        if(lim1>0)
        for(int k = 1; k < lim1; k++)
            for(int x=0;x < lim1-k; x++)
                if( breakfast[x]>breakfast[x+1] )
                {
                    char temp1 = breakfast[x];
                    breakfast[x] = breakfast[x+1];
                    breakfast[x+1]=temp1;
                }
        cout<<"Breakfast: "<<breakfast<<endl;
        //Sort lunch.
        if(lim2>0)
        for(int k = 1; k < lim2; k++)
            for(int x=0;x < lim2-k; x++)
                if( lunch[x]>lunch[x+1] )
                {
                    char temp2 = lunch[x];
                    lunch[x] = lunch[x+1];
                    lunch[x+1]=temp2;
                }
        cout<<"Lunch: "<<lunch<<endl;
        //compare breakfast and diet. as soon as there is a difference flag 0.

        for( int l = 0; l < lim1; l++ )
        {
            for(int m = 0; m<lim0; m++ )
                if( breakfast[l]!=diet[m] )
                    flag1 = 0;
                else
                {   
                    flag1 = 1;
                    cout<<diet[m];
                    diet[m] = '0'; cout<<" ho "<<endl;
                    break;
                }
            if( flag1 == 0 )
            {
                cout<<"Hicheater"<<endl;
                return "CHEATER";
            }
        }
        cout<<"Diet: "<<diet<<endl;
        //compare lunch and diet. as soon as there is a difference flag 0.

        for( int l = 0; l < lim2; l++ )
        {
            for(int m = 0; m<lim0; m++ )
                if( lunch[l]!=diet[m] )
                    flag1 = 0;
                else
                {   
                    flag1 = 1;
                    diet[m] = '0';
                    break;
                }
            if( flag1 == 0 )
                return "CHEATER";
        }
        cout<<"Diet: "<<diet<<endl;
        string dinner;
        int i = 0;
        // put the remaining characters from diet in dinner.
        for( int k = 0; k<lim0; k++ )
            if( diet[k]!='0' ) {
                cout<<diet[k];
                dinner[i] = diet[k];
                cout<<i<<" "<<dinner[i]<<endl;
                i++;
        }
        cout<<i<<endl;
        dinner[i]='\0';
        cout<<"Dinner: "<<dinner<<endl;
        return dinner;
    }
};

int main()
{
    string diet = "ABCD";
    string bf = "AB", lu = "C";
    DietPlan d;
    string din = d.chooseDinner(diet, bf, lu);
    cout<<"Dinner: "<<din<<endl;
}

输出:

    Diet: ABCD
    Breakfast: AB
    Lunch: C
    A ho 
    B ho 
    Diet: 00CD
    Diet: 000D
    D0 D
    1
    Dinner: 
    Dinner: 

晚餐没有显示任何东西。我真诚地感谢任何帮助。

4

4 回答 4

2

你对C++中的字符串有一些误解。可能是你把它和C风格的字符串混在一起了。string在C++中,你不需要设置'\0'之类的东西,我们可能不在乎库如何存储它。当你声明一个字符串,一开始它是空的,所以你应该写dinner += diet[k]而不是 dinner[i] = diet[k],字符串会自动放大。所以下面的行应该修改,然后它会起作用:

for( int k = 0; k<lim0; k++ )
    if( diet[k]!='0' )
    {
        cout<<diet[k];
        //dinner[i] = diet[k];
        dinner += diet[k];
        cout<<i<<" "<<dinner[i]<<endl;
        i++;
    }
cout<<i<<endl;
//dinner[i]='\0';

更多提示:不要手动对字符串进行排序,使用 STL 算法排序

于 2013-08-31T01:47:23.347 回答
1

如果您引用像dinner[i]. 它没有。当您声明dinner它以空字符串开始时。如果您的程序随后执行dinner[i] = diet[k];,则会导致未定义的行为。

要在字符串末尾添加字符,请使用 stringspush_back成员函数。

此外,无需在字符串末尾添加 '\0'。

于 2013-08-31T01:31:16.870 回答
0

我认为你需要改变

dinner[i] = diet[k];

dinner.push_back(diet[k]);

并摆脱与

dinner[i] = '\0';
于 2013-08-31T01:31:33.030 回答
0

您可以将晚餐声明为:char Dinner[100];

然后在主函数 getchar() 和 int 的返回值让输出留在屏幕上:

int main()
{
    string diet = "ABCD";
    string bf = "AB", lu = "C";
    DietPlan d;

    string din = d.chooseDinner(diet, bf, lu);

    cout<<"Dinner: "<<din<<endl;

    getchar();
    return 0;
}
于 2013-08-31T01:46:39.307 回答