【问题标题】:7-Segment display with printf and multidimensional array for segments带 printf 的 7 段显示和段的多维数组
【发布时间】:2011-10-17 14:24:05
【问题描述】:

在 K.N 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 列(数字是三个字符宽,但为了便于阅读,数字之间需要一个空格)。将您的程序编写为四个函数: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 将显示数字数组的行,每行都在一行 [...]。

【问题讨论】:

  • 你应该解释清楚一点,digit_sequence[]digits[] 的目的是什么?您提到的process_digit() 函数的意图是什么?
  • 您犯了一个经典的初学者错误,即假设我们知道您要做什么。我们从未听说过process_digit 函数,也不知道它应该如何工作。
  • 第 10 章出现在本书的“第 11 章:指针”和“第 12 章:指针和数组”之前。
  • 几年前我们在 comp.lang.c 中使用这些程序进行了大逃杀This thread 有很多信息(和非高尔夫项目)。
  • 感谢大家的回复,是的,我的问题做得过火了,但在尝试写下问题并同时试图找出问题时,我的想法很远。 (AT)JonathanLeffler 我希望在了解指针和数组之前完成 excersize,因为它应该可以在不采取指针的情况下解决,并且从那个阶段的书籍角度来看,我不会知道任何指针。 (AT)luserdroog 我衷心感谢您对这个问题的最佳回答,因为您向我指出了另一个我无法通过 google 找到的线程。

标签: c ascii-art


【解决方案1】:

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

每个段的行号相同。

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

但是,列因position 而异。每个位置都是一个 4 个字符宽度的“迷你矩阵”(3 个用于段,1 个用于空格:'|_| ')。因此,我们固定线段并将其列在“迷你矩阵”上与 (position*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;
            }
    }
}

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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2018-02-05
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多