2011-10-17 18 views
4

在KN Kings的“C programming:A modern approach”第10章练习7中,任务是将数字转换器从普通数字转换成ASCII艺术中的7段数字,像这样:7段显示printf和段多维数组

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

我得到了每个数字的序列,其中在它开启和关闭

样本:

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

} 

其中1 = ON,0 = OFF

但我很难让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将显示位数组的行,每行位于一行[...]上。

+1

你应该更好地解释一下,'digit_sequence []'和'digits []'的目的是什么?你提到的'process_digit()'函数的意图是什么? – unwind

+0

你正在使经典初学者误以为我们知道你在做什么。我们从来没有听说过'process_digit'函数,不知道它应该如何工作。 – Chriszuma

+2

第10章出现在书的“第11章:指针”和“第12章:指针和数组”之前。 –

回答

1

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

行号对于每个段是相同的。

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

但是,列的变化​​是position。每个位置是一个4个字符宽度的'迷你矩阵'(3个用于分段,1个用于空间:'|_| ')。所以我们修正了线段并且在'mini-matrix'上用(位置* 4)对其列进行求和。

AB 
_ _ _ 
|_| |_| |_| ... 
|_| |_| |_| 
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; 
      } 
    } 
} 

(您可以选择“ - ”和“_”,或者改变一些线)

希望它能帮助。