在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 = 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
列(数字宽度为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
数组中的指定位置(位置范围从0
到MAX_DIGITS - 1
)。print_digits_array
将显示数字数组的行,每行都在一行[...]上。
答案 0 :(得分: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;
}
}
}
(您可以选择' - '和'_',或者可能更改某些行)
希望它有所帮助。