我正在读一本关于C编程的书,并尝试做练习:
编写一个打印由星号(*)组成的水平直方图的程序。每个数字的一颗星可以在0 ... 70区间内。
#include <stdio.h>
void draw_stars(int number_of_stars) {
int counter = 0;
for(counter = 0; counter < number_of_stars; counter++) {
printf("*");
}
printf("\n");
}
int main(void) {
int counter1, counter2, ones, tens, zero, one, two, three, four, five, six, seven, eight, nine = 0;
for(tens = 0; tens < 7; tens++) {
if(tens == 0)
zero = zero + 1;
if(tens == 1)
one = one + 10;
if(tens == 2)
two = two + 10;
if(tens == 3)
three = three + 10;
if(tens == 4)
four = four + 10;
if(tens == 5)
five = five + 10;
if(tens == 6)
six = six + 10;
if(tens == 7)
seven = seven + 10;
for(ones = 0; ones < 9; ones++) {
if(ones == 0)
zero++;
if(ones == 1)
one++;
if(ones == 2)
two++;
if(ones == 3)
three++;
if(ones == 4)
four++;
if(ones == 5)
five++;
if(ones == 6)
six++;
if(ones == 7)
seven++;
if(ones == 8)
eight++;
if(ones == 9)
nine++;
}
}
draw_stars(zero);
draw_stars(one);
draw_stars(two);
draw_stars(three);
draw_stars(four);
draw_stars(five);
draw_stars(six);
draw_stars(seven);
draw_stars(eight);
draw_stars(nine);
}
由于某些原因,我的程序进入无限循环打印星。但我找不到原因?
我无法提出任何其他解决方案,但我仍然认为这是丑陋和臃肿。真正的C程序员将如何解决这个问题?
在阅读并理解了书中有关数组的章节之后,我能够编写一个更干净的程序版本。我在这里发布它,因为它可能有助于其他初学者理解数组的使用。在输出方面编写相同的程序,但使用该语言的不同功能是一种很好的学习体验。
#include <stdio.h>
#define TENS 7
void draw_stars(int stars) {
int star_counter = 0;
for (star_counter = 0; star_counter < stars; star_counter++)
printf("%c", '*');
}
int main(void) {
int number_array[10];
int tens_counter, ones_counter;
for (ones_counter = 0; ones_counter < 10; ones_counter++)
number_array[ones_counter] = 0;
for (tens_counter = 0; tens_counter < TENS; tens_counter++) {
if (tens_counter != 0)
number_array[tens_counter] += 10;
else
number_array[tens_counter] += 1;
for (ones_counter = 0; ones_counter < 10; ones_counter++)
number_array[ones_counter]++;
}
for (ones_counter = 0; ones_counter < 10; ones_counter++) {
draw_stars(number_array[ones_counter]);
printf("\n");
}
}
答案 0 :(得分:1)
如果要将所有整数初始化为零,则应编写:
int counter1=0, counter2=0, ...
现在只有nine
初始化为0,其他变量包含垃圾 - 任意值。
答案 1 :(得分:1)
初始化所有变量:
int counter1=0, counter2=0, ones=0, tens=0, zero=0, one=0..
顺便说一下,为了获得更好的性能,
将if
替换为else if
,但块中的第一个除外。当您只知道一个是真的时,为什么要检查所有if
条件?
仅供参考,当Else if
中的条件为真时,将跳过所有其他if
。
答案 2 :(得分:1)
在main()中,您必须将所有变量初始化为零,如
int counter1=0,counter2=0 and so on
否则它将获取垃圾值并使用这些值执行操作,然后输出将类似于
********
*****************
*****************
*****************
*****************
*****************
*****************
*******
*******