练习是在输入中打印不同字符的直方图。在底部是我的代码,我将不同的字符分成3个类别a,b或其他,如果代码成功,则推断为更多类别的字符。但它没有我想要的输出,例如,我希望输入ab cd
x
xxx
---
abo
t
h
e
r
但我得到的只是
---
abo
t
h
e
r
这是我的尝试:
#include<stdio.h>
main()
{
int i,c,b, max;
int array[3] = {0,0,0};
while( (c = getchar()) != EOF){
if(c== 'a')
++array[0];
else if(c== 'b')
++array[1];
else if(c=='\n' ||c=='\t' || c==' '){}
else ++array[2];
}
array[0]=max;
i=0;
while(i<3){
if(max>=array[i])
{}
else array[i]=max;
++i;
}
i=0;
max=b;
while(i<b){
if(array[0]>=max){
putchar('x');}
else putchar(' ');
if(array[1]>=max) {
putchar('x');}
else putchar(' ');
if (array[2]>=max){
putchar('x\n');}
else putchar(' \n');
--max;
++i;
}
printf("---\nabo\n t\n h\n e\n r");
}
答案 0 :(得分:5)
你的代码有点不对。
永远不要 - main()
您应该使用int main(void){...}
see this answer。
您很难在代码中编码。提供常量变量。这有逻辑上的例外,但数字通常具有意义所以说明它。
unsigned const int LETTERS = 3;
您花时间增加array[0]
计算'a'
的出现次数,但之后直接为其分配值max
,而不使用该值或将其存储在其他位置
您在第一个array[0]
之后分配while(){...}
,但max
尚未初始化,因此它是“垃圾”。
在这里 - if(max>=array[i]){}
你在身体里什么都不做?
您再次max
分配b
- 的值“垃圾”!
您应该return ...;
功能main
。你必须亲自看看你在那里的选择。注意:如果您遵循“1”你别无选择,只能按照这个。
修复这些问题,你可能会解决问题。
答案 1 :(得分:1)
更改
array[0] = max
到max = array[0]
(否则max
会占用一些垃圾值)
max = b
到b = max
(否则b
会占用一些垃圾值)
putchar('x\n')
至{ putchar('x'); putchar('\n')}
(这里需要注意的是,putchar()
一次只打印一个字符,但您使用putchar('x\n')
一起打印两个字符x
和\n
!)< / em>
然后你的程序将提供所需的输出 以下是您的工作代码,其中包含上述更改:
#include<stdio.h>
int main()
{
int i,c,b, max;
int array[3] = {0,0,0};
while( (c = getchar()) != EOF){
if(c == 'a')
++array[0];
else if(c == 'b')
++array[1];
else if(c =='\n' || c =='\t' || c == ' ')
;
else ++array[2];
}
max = array[0];
i=0;
while(i<3){
if(max < array[i])
max = array[i];
i++;
}
i=0;
b = max;
while(i < b){
if(array[0] >= max)
putchar('x');
else
putchar(' ');
if(array[1] >= max)
putchar('x');
else
putchar(' ');
if (array[2] >= max)
{
putchar('x');
putchar('\n');
}
else
putchar('\n');
--max;
++i;
}
printf("---\nabo\n t\n h\n e\n r");
return 0;
}