如何在C ++中打印垂直直方图

时间:2013-05-11 01:44:21

标签: c++ loops

#include <iostream>
using namespace std;
int main()
{
    int a, b, c, i;
    cin >> a >> b >>  c;

    for ( i = 0;  i < a; i++)
        cout << "*" << endl;

    for ( i = 0; i < b; i++)
        cout << "*" << endl;

    for ( i = 0; i < c; i++)
        cout << "*" << endl;
}

我知道输出与:

相同
for ( i = 0; i < a + b + c; i++ ){
cout << "*" << endl;
}

因此对于2 3 1我得到:

  

*

     

*

     

*

     

*

     

*

     

*

我想要的是:

     *

*    * 

*    *    *   //Horizontal distance between 2 shapes don't matter.

考虑到打印必须从上到下完成,我不知道如何将光标放在正确的位置。

编辑:我不清楚打印的顺序。我希望以下示例有所帮助,如果可能的话,每列的打印必须使用单独的功能。

第一循环:

*

*

第二次循环:

    *

*   *

*   *

最后一个循环:

    *

*   *

*   *   *

打印必须完全按照该顺序进行。打印第一列,然后打印第二列,然后继续打印。

3 个答案:

答案 0 :(得分:5)

您需要重新考虑一下您的打印。首先,您需要找出最高的列,因为这是您将拥有的行数。

我会做这样的事情:

int high = std::max(std::max(a, b), c);

for (int i = high; i > 0; i--)
{
    if (i <= a)
        std::cout << " * ";
    else
        std::cout << "   ";

    if (i <= b)
        std::cout << " * ";
    else
        std::cout << "   ";

    if (i <= c)
        std::cout << " * ";
    else
        std::cout << "   ";

    std::cout << std::endl;
}

如果您想要任意数量的列,您可能希望将它们放在std::vector中,并为此设置内部循环。


对于任意数量的列,您可以使用以下内容:

// Get the input
std::cout << "Please enter numbers, all on one line, and end with ENTER: ";
std::string input;
std::getline(std::cin, input);

// Parse the input into integers
std::istringstream istr(input);
std::vector<int> values(std::istream_iterator<int>(istr),
                        std::istream_iterator<int>());

// Get the max value
int max_value = *std::max_element(values.begin(), values.end());

// Print the columns
for (int current = max_value; current > 0; current--)
{
    for (const int& value : values)
    {
        if (current <= value)
            std::cout << " * ";
        else
            std::cout << "   ";
    }

    std::cout << std::endl;
}

答案 1 :(得分:0)

代码:

#include <iostream>
using namespace std;
int f[3];
int main()
{
    int a, b, c, i;
    cin >> f[0] >> f[1] >>  f[2];

    int m = max(max(f[0],f[1]),f[2]);
    for(int i=m;i>=1;i--)
    {
        for(int j=0;j<3;j++)
            if (f[j]<i) cout <<' ';
            else cout <<'*';
        cout<<endl;
    }
}

测试:

Input: 2 3 1
Output:
 *
**
***

答案 2 :(得分:-1)

好的代码检查这个

#include<conio.h>
void main()
{
int a[5];
int i,j,max;
clrscr();
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
max=a[0];
if(max<a[i])
max=a[i];
}
printf("\n");
for(i=0;i<max;i++)
{
putchar(max);
}
printf("\n");
printf("\n");
for(i=0;i<5;i++)
{
printf("%d \t--->\t",a[i],putchar(max));
for(j=1;j<=a[i];j++)
{
printf("*");
}
printf(" ");
printf("\n");
}
printf("\n");
for(j=max;j>0;--j)
{
putchar(max);
}
getch();`
}

&GT;