我正在进行这项练习,想知道我的答案是否正确;
编写程序以打印不同频率的直方图 输入中的字符。
我在网上看到了其他几个答案,但它们与我的差异很大。此外,如果我的代码格式有任何问题或任何改进。欢迎任何建议。我知道这个问题需要一个直方图,但是一旦我需要数据就可以很容易地构建一个直方图。
#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]);
}
}
答案 0 :(得分:1)
我做的改进:
int arrayStuff[92] = { 0 };
并摆脱for循环。保证将所有元素设置为0。(sizeof arrayStuff/sizeof arrayStuff[0])
来计算arrayStuff中的元素数。EOF
字符会怎样?看起来它永远循环。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;
}