【问题标题】:Printing stars for a specific number of freq in arrays为数组中特定数量的频率打印星号
【发布时间】:2019-03-05 07:50:29
【问题描述】:

我还是 C 的新手,我需要想办法打印与频率数相同的星数。

这是我的代码:

int arrayHistogram(int array[]){
    int i;
    int j;
    int count=0;
    int freq[SIZE];
    char stars[SIZE];
    for(i = 0; i < SIZE; i++){
        count =1;
        for(j = i+1; j < SIZE; j++){
            if(array[i]==array[j]){
                count++;
                freq[j]=0;
            }
        }
        if(freq[i] != 0){
            freq[i] = count;
        }
    }
    //for ( i = 0; i < SIZE; i++){
        //int num = freq[i];
        //stars[i]= '*'*num;
    }
    printf("Value ");
    printf("Frequency ");
    printf("Histogram\n");
    for(i = 0; i < SIZE; i++){
        if(freq[i] != 0){
            printf("%5d%10d%10d\n", array[i], freq[i], stars[i]);
        }
    }
}

我知道我不能在这里将char 乘以int 来打印星星,但我放在这里只是为了显示我需要在哪里打印这些星星(即直方图)。

My Output:

    Value Frequency Histogram
        7         4       -46
        8         3       126
        4         6        84

Expected output:

      Value Frequency Histogram
          7         4      ****
          8         3       ***
          4         6    ******

【问题讨论】:

  • 你需要一个嵌套循环来打印出*

标签: c histogram


【解决方案1】:

嗯,你已经知道所有要做的事情,即循环。

只需循环到一个频率并打印那么多星。

类似这样的东西(伪代码):

loop until freq[i]
    print '*'
end loop

这只是一个想法。你知道循环是如何工作的。只需在需要打印星星的地方放置一个嵌套循环(即for 循环)。注意换行符。打印星星后,您需要在每行末尾添加一个换行符。


更新:

据观察,您的频率最高可达 10,即您已经知道的固定大小。您可以简单地使用一串星号,然后使用printf()%.*s 格式说明符以及字段宽度和字符串长度来打印它。

这是一个示例 (live code):

#include <stdio.h>

#define SIZE 10

int main(void)
{
    const char* stars = "**********";

    const int freqs[ SIZE ] = { 3, 5, 6, 2, 0, 7, 10, 9, 4, 8 };

    for ( int i = 0; i < SIZE; i++ )
    {
        printf("%5d \t %10.*s\n", freqs[i], freqs[i], stars);
    }

    return 0;
}

输出:

    3           ***
    5         *****
    6        ******
    2            **
    0              
    7       *******
   10    **********
    9     *********
    4          ****
    8      ********

【讨论】:

    【解决方案2】:

    用循环构建char stars[SIZE] 怎么样?

    int nStars = freq; // in you situation.
    for(int i=0; i < nStars;++i)
    {
        stars[i] = '*'; // set char i to be '*'
    }
    stars[nStars] = '\0'; // don't forget to terminate your string
    

    你可以为它制作一个简单的实用函数void fillChar(char* buff, char ch, int count);

    注意不要超过分配的字符串的大小,否则会发生坏事。

    干杯。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多