4

在 KN Kings “C 编程:一种现代方法”,第 10 章练习 7 中,任务是在 ASCII 艺术中将数字转换器从普通数字转换为 7 段数字,如下所示:

   _   _        _   _   _   _   _   _ 
|  _|  _|  |_| |_  |_    | |_| |_| | |
| |_   _|    |  _| |_|   | |_|   | |_|

我得到了每个数字的序列,在哪里打开和关闭它

样本:

int digit_sequence[10][7] = {
    // A,B,C,D,E,F,G
    /* 0 */ {1,1,1,1,1,1,0}

}

其中 1 = 开,0 = 关

但我很难让该process_digit(int digit, int position)功能正常工作。

我很难从 翻译sequence[10][7]digits[4][MAX_DIGITS*4]

好心人能帮帮我吗?

我一直在阅读高尔夫代码七段挑战,但即使我理解这个理论,仍然很难说服我的大脑使用多个阵列做我想做的事情。


忽略 ASCII 艺术,问题如下:

编写一个程序,提示用户输入数字,然后用字符显示数字,模拟七段显示的效果。

...

应忽略数字以​​外的字符。编写程序,使最大位数由名为 MAX_DIGITS 的宏控制,其值为 10。如果该数字包含的位数超过此位数,则忽略多余的位数。 提示:使用两个外部数组。一个是segments数组[...],它存储表示数字和段之间对应关系的数据。另一个数组 ,digits将是一个字符数组,有 4 行(因为每个分段的数字是 4 个字符高)和MAX_DIGITS * 4列(数字是 3 个字符宽,但为了便于阅读,数字之间需要一个空格)。将您的程序编写为四个函数:main, [...]

void clear_digits_array(void);
void process_figit(int digit, int position);
void print_digits_array(void);

clear_digits_array将空白字符存储到数字数组的所有元素中。process_digit将 的七段表示存储digit到数组中的指定位置digits(位置范围从0MAX_DIGITS - 1)。print_digits_array将显示数字数组的行,每行都在一行 [...]。

4

1 回答 1

1

诀窍是映射段显示的位置。

每个段的行号相同。

0:  _   _
1: |_| |_| ...
2: |_| |_|
3:     

但是,列的变化​​为position. 每个位置是一个 4 个字符宽度的“迷你矩阵”(3 个用于段,1 个用于空格:)'|_| '。所以我们固定线段并用(位置* 4)在“迷你矩阵”上对其列求和。

0123 4567 89AB
 _    _    _
|_|  |_|  |_|   ...
|_|  |_|  |_|
pos0 pos1 pos2

知道了?代码将是这样的:

void process_digit(int digit, int position){
    int i;
    for(i=0;i<7;i++){
        if(segments[digit][i]==1) /* Has digit the i segment? */
            switch(i){
                case 0: digits[0][1+position*4]='_';break;
                case 1: digits[1][2+position*4]='|';break;
                case 2: digits[2][2+position*4]='|';break;
                case 3: digits[2][1+position*4]='_';break;
                case 4: digits[2][0+position*4]='|';break;
                case 5: digits[1][0+position*4]='|';break;
                case 6: digits[1][1+position*4]='_';break;
            }
    }
}

(您可以在“-”和“_”之间进行选择,或者更改某些行)

希望能帮助到你。

于 2011-10-28T15:13:47.447 回答