编程珠玑之第三章习题8

习题描述:

8.[S.C.Johnnson]七段显示设备实现十进制数字:

                     

的廉价显示。七段显示通常如下编号:

                             

编写一个使用5个七段显示数字来显示16位正整数的程序。输出为一个5个字节的数组,当且仅当数字j中的第i段点亮时,字节j中的位i置1.
习题解析:
1、7段显示在控制台下表示也不是很方便,但好歹是能够实现的 具体解决方案如下:

解决方案: 

1、这里一个数字我选用5行4列的字符空间标识,所以有了下面代码中的一些常量。

2、对于一个5行4列的数组来说,每一行每一列显示哪个字符是固定不变的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <cstdio>
#include <cassert>
#include <cmath>

#define SECTION   7
#define MAX_NUM   10

#define ROWS  5
#define COLS  25

using  namespace std;


// 0-9数字在7段中的标识
const  int flag_num[MAX_NUM][SECTION]={
    { 1011111},
    { 0001010},
    { 1110110},
    { 1110101},
    { 0101101},
    { 1111001},
    { 1111011},
    { 0010101},
    { 1111111},
    { 0111101}
};

// 每一段标识的字符
char get_numchar( int index,  bool flag)
{
     char ch =  ' ';
     switch(index){
     case  0case  1case  2:
            {  if (flag) ch =  '-'; }   break;
     case  3:   case  4case  5case  6:
            {  if (flag) ch =  '|'; }   break;
     default: ch =  ' ';   break;
    }

     return ch;
}

/************************************************************************/
// 函数名称:generate_mumchar_arr
// 函数目的:生成数字的字符数组
// 函数参数:num数字(0-9) index标识是第几个数字 arr二维数组 COLS数组列  rows数组行
// 函数返回:rows >=5 && COLS >= 4    0 < num < 9
// 使用条件:
/************************************************************************/

void generate_mumchar_arr( int num,  int index,  char (*arr)[COLS],  int rows)
{
    assert(rows >= 5 && COLS >=  4);
    assert( 0 <= num && num < MAX_NUM);

     int movebit = index *  4 +  1// 数字整体移动的位(列)数
     for ( int i =  0; i < SECTION; ++i){
         switch(i){
         case  0: { arr[ 4][ 1 + movebit] = arr[ 4][ 2 + movebit] = get_numchar(i, flag_num[num][i]); }
                 break;
         case  1: { arr[ 2][ 1 + movebit] = arr[ 2][ 2 + movebit] = get_numchar(i, flag_num[num][i]); }
                 break;
         case  2: { arr[ 0][ 1 + movebit] = arr[ 0][ 2 + movebit] = get_numchar(i, flag_num[num][i]); }
                 break;
         case  3: { arr[ 1][ 0 + movebit] = get_numchar(i, flag_num[num][i]); }
                 break;
         case  4: { arr[ 1][ 3 + movebit] = get_numchar(i, flag_num[num][i]); }
                 break;
         case  5: { arr[ 3][ 0 + movebit] = get_numchar(i, flag_num[num][i]); }
             break;
         case  6: { arr[ 3][ 3 + movebit] = get_numchar(i, flag_num[num][i]); }
              break;
         defaultbreak;
        }
    }

     return;
}


int main()
{
     // 初始化二维字符数组
     char arr[ROWS][COLS];
     for ( int i =  0; i < ROWS; i++){
         for ( int j =  0; j < COLS; j++){ arr[i][j]=  ' '; }
    }

    cout <<  "请输入一位16位的整数: " << endl;
    int16_t number;
     while (cin >> number){
         for ( int index =  0; index <  5; index++){

            int16_t pownum = ceil(pow( 104-index));
            int16_t m = number/pownum;

            generate_mumchar_arr(m, index, arr, ROWS);
             if (m >  0) { number -= m * pownum; }
        }

         // 输出字符number
        cout <<  "7段显示数字结果是:" << endl;
         for ( int i =  0; i < ROWS; i++){
             for ( int j =  0; j < COLS; j++){ cout << arr[i][j]; }
            cout << endl;
        }
        cout << endl;

        cout <<  "请输入一位16位的整数: " << endl;
    }

     return  0;
}

输出结果如下:


心得疑惑:
1、代码很烂,有待优化。见谅!

猜你喜欢

转载自blog.csdn.net/JohnnyHu90/article/details/43637807
今日推荐