跳到c ++第5章概要7

时间:2014-08-19 12:26:09

标签: c++ scaling

按照建议,我已经完成了本书“跳入c ++”。我目前正在讨论第5章的问题7,虽然我已经制作了代码,似乎做了我的要求但我希望有人可以看一看并告诉我,如果我已实施任何'坏'练习(理想情况下,我不想要养成不良习惯)。

其次,它还说“尝试制作一个条形图,无论输入了多少结果,都会显示适当缩放的结果以适合您的屏幕”#。同样,下面的代码生成一个水平条形图,但我不相信如果我说10000个条目(我想我可以通过添加额外的for循环验证这一点),它将按比例缩放。如何应用这个? (无论有多少条目,它总是适当地缩放)。

我应该在这一点上指出,我还没有涵盖数组,指针和类等主题,以防万一有人好奇我为什么不创建一个名为'投票'什么的。

最后一件事......我没有回复0'在我的代码中,这是一个问题吗?我发现回归0的确切含义有点令人困惑。我知道确保你的代码运行正常但它看起来有点多余吗?

提前致谢!

#include <iostream>

using namespace std;

int main()
{
    int option;
    int option_1 = 0;
    int option_2 = 0;
    int option_3 = 0;
    cout << "Which is your favourite sport?" << endl;
    cout << "Tennis.. 1" << endl;
    cout << "Football.. 2" << endl;
    cout << "Cricket.. 3" << endl;

    cin >> option;
while(option != 0)
{
    if(option == 1)
    {
        option_1++;
    }
    else if(option ==2)
    {
        option_2++;
    }
    else if(option ==3)
    {
        option_3++;
    }
    else if(option > 3 || option < 0)
    {
        cout << "Not a valid entry, please enter again" << endl;
    }
    else if(option ==0)
    {
        break;
    }
    cout << "Which is your favourite sport?" << endl;
    cout << "Tennis.. 1" << endl;
    cout << "Football.. 2" << endl;
    cout << "Cricket.. 3" << endl;
    cin >> option;
}
    cout << "Option 1 (" << option_1 << "): ";
    for(int i = 0; i < option_1; i++)
    {
        cout << "*";
    }
    cout << "" << endl;
    cout << "Option 2 (" << option_2 << "): ";
        for(int i = 0; i < option_2; i++)
    {
        cout << "*";
    }
    cout << "" << endl;
    cout << "Option 3 (" << option_3 << "): ";
        for(int i = 0; i < option_3; i++)
    {
        cout << "*";
    }


}

2 个答案:

答案 0 :(得分:1)

关于main中的返回0:它在C ++中是可选的。

关于您的代码:

  • 您有大量的if / else if块,您应该用switch替换它们。 switch语句更紧凑,可读,并且在运行时可能会更快一些。在这一点上并不重要,但知道在哪里放置开关以及在哪里使用常规if是非常好的做法。

  • 你有一个很大的功能,它真的很糟糕。您应该将代码分解为可重复使用的小块。这就是DRY(不要重复自己):如果你是复制粘贴代码,那你就做错了。例如,您的运动列表在代码中出现2次,您应该将其移到单独的功能中。

  • 你写了cout << "" << endl;,我觉得你并不真正理解std::cout是如何工作的。 std::cout是表示程序标准输出的对象。您可以使用operator<<将值传递给此标准输出。 std::endl是您可以传递的值之一,字符串也是。所以你可以写cout << endl;,不需要空字符串。

  • 请了解如何使用原始数组或std::array数组。这是一个可以使用数组重构的程序的一个很好的例子。

这是一个更易读,更清晰的代码版本:

#include <iostream>

int prompt_option()
{
    int option;

    while (true)
    {
        std::cout << "Which is your favourite sport?" << std::endl;
        std::cout << "Tennis.. 1" << std::endl;
        std::cout << "Football.. 2" << std::endl;
        std::cout << "Cricket.. 3" << std::endl;
        std::cin >> option;
        if (option >= 0 && option <= 3)
            return option;
        else
            std::cout << "Not a valid entry, please enter again" << std::endl;
    }
}

void display_option(int number, int value)
{
    std::cout << "Option " << number << " (" << value << "): ";
    while (value--)
        std::cout << '*';
    std::cout << std::endl;
}

int main()
{
    int option;
    int values[3] = {0};

    while (true)
    {
        option = prompt_option();
        if (option)
            values[option - 1]++;
        else
            break;
    }
    for (int i = 0; i < 3; i++)
        display_option(i + 1, values[i]);
}

答案 1 :(得分:1)

如果别的话你太多了,它太乱了。 检查下面的代码,muc更短,更清洁和有效。 我希望它有所帮助。

#include <iostream>

using namespace std;

int main()
{
    int choice;
    int soccer=0, NFL=0 ,formula1=0;
    while(choice != 0){
        cout<<"Please choose one of the following for the poll"<<endl;
        cout<<"press 1 for soccer, press 2 for NFL, press 3 for formula 1"<<endl;
        cout<<"Press 0 to exit"<<endl;
        cin>>choice;
        if(choice==1){
            soccer++;

        }
        else if(choice==2){
            NFL++;

        }
        else if(choice == 3){
            formula1++;

        }
        else{
            cout<<"Invalid entry, try again"<<endl;
        }
        cout<<"soccer chosen "<<soccer<<" times.";
        for(int i=0; i<soccer; i++){
            cout<<"*";
        }
        cout<<endl;

        cout<<"NFL chosen "<<NFL<<" times.";
        for(int j=0; j<NFL; j++){
            cout<<"*";
        }
        cout<<endl;
        cout<<"formula1 chosen "<<formula1<<" times.";
        for(int c=0; c<formula1; c++){
            cout<<"*";
        }
        cout<<endl;



    }

    return 0;
}