如何根据输入创建垂直图?

时间:2017-06-08 03:10:16

标签: c

输入

1 1 3 1

输出

  # 
  # 
####

输入

0 3 0 4 5 

输出

    #
   ##
 # ##
 # ##
 # ##

这是我到目前为止的代码..

#include <stdio.h>
int main (void){
    int height[80],length=0,max=0;
    while ((scanf("%d",&height[length++])) != EOF && length <=79) {
        if (height[length-1] > max) {
            max=height[length-1];
        }
    }
}

输入不得包含不超过80个值。 我不完全确定如何从这里添加更多代码。

4 个答案:

答案 0 :(得分:3)

像这样:

length -= 1;
for(;max>=0;--max){
    for(int i = 0; i < length; ++i){
        putchar(height[i] > max ? '#' : ' ');
    }
    putchar('\n');
}

while ((scanf("%d",&height[length++])) != EOF && length <=79){也是错误的 这是因为在读取height[79]后不会执行while-body 因此,例如,修改如下。

#include <stdio.h>

#define DATA_MAX_LEN 80

int main (void){
    int height[DATA_MAX_LEN], length = 0, max = 0;
    for(int len = 0, h; len < DATA_MAX_LEN && scanf("%d", &h) == 1; ++len){
        height[length++] = h;
        if (height[length-1] > max){
            max=height[length-1];
        }
    }
    while(max--){
        for(int i = 0; i < length; ++i){
            putchar(height[i] > max ? '#' : ' ');
        }
        putchar('\n');
    }
}

答案 1 :(得分:2)

找到arr[]中存储的所有输入的最大高度。现在有一个外部循环从最大高度j迭代hm直到1.外循环的每次迭代,遍历内循环的所有值并检查是否arr[i] >= j。如果是,请打印#否则打印一个空格。

int arr[80];
int n;

cin>>n;

int hm = -1;
for(int i = 0; i < n; i++){
    cin>>arr[i];
    hm = max(hm, arr[i]);
}

for(int i = hm; i > 0; i--){
    for(int j = 0; j<n; j++){
        if(arr[j]>=i)
            cout<<"#";
        else cout<<" ";
    }
    cout<<'\n';
}

答案 2 :(得分:2)

这可能适合你。

#include <stdio.h>
#define MAX 100

int main(void) {
    int st[MAX];
    int n = 0;
    int i, j;
    int max_value = -1;

    while (scanf("%d", st + n) != EOF) {
        if (st[n] > max_value)
            max_value = st[n];
        ++n;
    }

    for (i = max_value; i > 0; --i) {
        for (j = 0; j < n; ++j) {
            if (st[j] >= i)
                printf("#");
            else
                printf(" ");
        }
        printf("\n");
    }

    return 0;
}

输入

0 3 0 4 5 "Enter" "Ctrl+D"

输出

    #
   ##
 # ##
 # ##
 # ##

答案 3 :(得分:2)

我根据问题中的代码编写了这段代码。这将逐个获得输入数字。它最多只能消耗80个数字。

void draw(const int* height, int length, int max)
{
    char* t_mat;
    char* mat;

    size_t mat_size = length * max * sizeof(char);

    t_mat = (char*)malloc(mat_size);
    mat = (char*)malloc(mat_size);

    // build transposed graph
    for (int i = 0; i < length; i++) {
        int value = height[i];

        for (int j = max - 1; j >= 0; j--) {
            if (j + value >= max)
                t_mat[i * max + j] = '#';
            else
                t_mat[i * max + j] = ' ';
        }
    }

    // tanspose t_mat to mat
    for (int i = 0; i < max; i++)
        for (int j = 0; j < length; j++)
            mat[i * length + j] = t_mat[j * max + i];

    // print
    for (int i = 0; i < max; i++) {
        for (int j = 0; j < length; j++)
            printf("%c", mat[i * length + j]);
        printf("\n");
    }

    free(t_mat);
    free(mat);
}

int main()
{
    int height[80], length=0, max=0;

    while (length < 80 && scanf("%d",&height[length++]) != EOF) {

        // update max number
        if (height[length-1] > max)
            max=height[length-1];

        // draw the graph with the updated number
        draw(height, length, max);
    }
}

此方法首先创建输入的 transposed 版本。例如,如果您的输入序列是:

5 3 0 4 5

此代码首先创建一个char矩阵,对应于:

#####  // 5 #'s in this row
  ###  // 3 #'s in this row
       // 0 #'s in this row
 ####  // 4 #'s in this row
#####  // 5 #'s in this row

然后转置它以获得所需的图表:

#   #
#  ##
## ##
## ##
## ##

如果您编译它并使用此输入序列运行​​它:5 3 0 4 5您将获得以下输出序列。

5 // <- your input
#
#
#
#
#
3 // <- your input
#
#
##
##
##
0 // <- your input
#
#
##
##
##
4 // <- your input
#
#  #
## #
## #
## #
5 // <- your input
#   #
#  ##
## ##
## ##
## ##

此程序将在消耗80个输入数字后终止。