K& R练习1-14解决方案

时间:2012-09-12 06:14:16

标签: c

我正在进行这项练习,想知道我的答案是否正确;

  

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

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

#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]);
    }
}

2 个答案:

答案 0 :(得分:1)

我做的改进:

  • 一次性声明并初始化int arrayStuff[92] = { 0 };并摆脱for循环。保证将所有元素设置为0。
  • 不要在各个地方使用幻数92,而是使用(sizeof arrayStuff/sizeof arrayStuff[0])来计算arrayStuff中的元素数。
  • (i + 30)中的括号是多余的
  • 如果用户输入EOF字符会怎样?看起来它永远循环。
  • “Occurances”不在我的字典中,但是出现了。也许字符频率是一个更好的术语?
  • arrayStuff?我不能过分强调清晰简洁的标识符命名的重要性。想到频率。
  • int main (void)必须为return 0;。这不是C ++,其中空参数列表等效于void。这是C,其中空参数列表意味着“我是一个旧式的K&amp; R参数列表,用于未知但固定数量的参数。”

答案 1 :(得分:0)

Jens提到92的“幻数”。幻数是代码中的数字。建议避免使用它们,因为如果用常量变量名称或MACRO名称或计算替换它,可以更容易理解值的目的或含义。我认为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;
}