1

我正在做这个练习,想知道我的答案是否正确;

编写一个程序来打印输入中不同字符频率的直方图。

我在网上看到了其他几个答案,但它们与我的相差很大。此外,如果我的代码格式有任何问题或需要进行任何改进。欢迎任何建议。我确实理解这个问题需要一个直方图,但是一旦我有了所需的数据,就很容易构建一个。

#include <stdio.h>
int main(){

    int userInput;
    int arrayStuff[92];
    int i, j;

    for(i = 0; i < 92; ++i){
        arrayStuff[i] = 0;
    }

    while((userInput = getchar()) != '\n'){
        if(userInput >= 30 && userInput <= 122){
            if(userInput != '\n'){
                ++arrayStuff[(userInput-30)];
            }

            if(userInput == '\n'){
                break;
            }
        }
    }

    printf("Case\t|\tOccurances\n");

    for(i = 0; i < 92; ++i){
        printf("%c\t|\t%d\n", (i+30), arrayStuff[i]);
    }
}
4

2 回答 2

1

我会做的改进:

  • 一次性声明和初始化int arrayStuff[92] = { 0 };,摆脱 for 循环。这保证将所有元素设置为 0。
  • 不要在各个地方使用幻数 92,(sizeof arrayStuff/sizeof arrayStuff[0])而是使用它来计算 arrayStuff 中的元素数。
  • (i+30) 中的括号是多余的
  • 如果用户键入EOF字符会发生什么?它看起来像它永远循环。
  • “发生”不在我的字典里,但发生在我的字典里。也许字符频率是一个更好的术语?
  • 数组东西?我不能过分强调清晰简洁的标识符命名的重要性。频率浮现在脑海。
  • 它必须int main (void)return 0;. 这不是 C++,其中一个空参数列表等效于 void。这是 C,其中一个空参数列表意味着“我是一个旧式 K&R 参数列表,用于未知但固定数量的参数”。
于 2012-09-12T07:17:50.533 回答
0

Jens 提到了 92 的“幻数”。幻数是代码中的数字文字。建议避免使用它们,因为如果将值替换为常量变量名称、宏名称或计算,则更容易理解值的用途或含义。我认为 30 和 122 也将被视为“幻数”。此代码在输入任何非图形字符时终止。这意味着如果输入制表符,它将停止,并且不会计算制表符字符,这可能不正确。

#include <stdio.h>
#include <stdlib.h>

#define FIRST_GRAPHIC_CHAR 32
#define LAST_GRAPHIC_CHAR 126
#define NUM_GRAPHIC_CHARS (LAST_GRAPHIC_CHAR - FIRST_GRAPHIC_CHAR + 1)


int main(void)
{

    int userInput;
    int arrayStuff[NUM_GRAPHIC_CHARS] = {0};
    int i;

    printf("enter a string of characters followed by <return>\n");

    userInput = getchar();
    while( userInput >= FIRST_GRAPHIC_CHAR && userInput <= LAST_GRAPHIC_CHAR )
    {
       ++arrayStuff[(userInput - FIRST_GRAPHIC_CHAR)];
       userInput = getchar();
    }

    printf("Case\t|\tOccurances\n");

    for(i = 0; i < NUM_GRAPHIC_CHARS; ++i)
    {
        if (  i + FIRST_GRAPHIC_CHAR == ' ' )
           printf("<spc>\t|\t%d\n",  arrayStuff[i]);
        else
           printf("%c\t|\t%d\n", (i + FIRST_GRAPHIC_CHAR), arrayStuff[i]);
    }
    return EXIT_SUCCESS;
}
于 2012-09-12T09:20:55.963 回答