C编程练习?

时间:2014-03-15 09:47:58

标签: c

我正在读一本关于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");
    }
}

3 个答案:

答案 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

否则它将获取垃圾值并使用这些值执行操作,然后输出将类似于

********
*****************
*****************
*****************
*****************
*****************
*****************
*******
*******