8.[S.C.Johnnson]七段显示设备实现十进制数字:
的廉价显示。七段显示通常如下编号:
编写一个使用5个七段显示数字来显示16位正整数的程序。输出为一个5个字节的数组,当且仅当数字j中的第i段点亮时,字节j中的位i置1.解决方案:
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]={ { 1, 0, 1, 1, 1, 1, 1}, { 0, 0, 0, 1, 0, 1, 0}, { 1, 1, 1, 0, 1, 1, 0}, { 1, 1, 1, 0, 1, 0, 1}, { 0, 1, 0, 1, 1, 0, 1}, { 1, 1, 1, 1, 0, 0, 1}, { 1, 1, 1, 1, 0, 1, 1}, { 0, 0, 1, 0, 1, 0, 1}, { 1, 1, 1, 1, 1, 1, 1}, { 0, 1, 1, 1, 1, 0, 1} }; // 每一段标识的字符 char get_numchar( int index, bool flag) { char ch = ' '; switch(index){ case 0: case 1: case 2: { if (flag) ch = '-'; } break; case 3: case 4: case 5: case 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; default: break; } } 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( 10, 4-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; } |
输出结果如下:
心得疑惑: