4

KN 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]

優しい魂が私を助けてくれませんか?

私はゴルフコードの7セグメントチャレンジを読んでいますが、その理論を理解していても、複数のアレイでやりたいことを実行するように脳を説得するのはまだ難しいです。


アスキーアートを無視すると、質問は次のようになります。

ユーザーに数字の入力を求め、文字を使用して数字を表示し、7セグメントディスプレイの効果をシミュレートするプログラムを作成します。

..。

数字以外の文字は無視してください。最大桁数が値10のMAX_DIGITSという名前のマクロによって制御されるようにプログラムを作成します。数値にこの桁数を超える場合、余分な桁は無視されます。 ヒント: 2つの外部アレイを使用してください。1つは、segments数字とセグメント間の対応を表すデータを格納する配列[...]です。もう1つの配列、digitsは、4行(各セグメント化された数字は4文字の高さであるため)およびMAX_DIGITS * 4列(数字は3文字の幅ですが、読みやすくするために数字の間にスペースが必要です)の文字の配列になります。プログラムを4つの関数として記述します:main、[...]

void clear_digits_array(void);
void process_figit(int digit, int position);
void print_digits_array(void);

clear_digits_array数字配列のすべての要素に空白文字を格納します。process_digitの7セグメント表現を配列digit内の指定された位置に格納します(位置の範囲はから)。数字配列の行をそれぞれ1行に表示します[...]。digits0MAX_DIGITS - 1print_digits_array

4

1 に答える 1

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;
            }
    }
}

('-' と '_' の間で選択するか、いくつかの行を変更することができます)

それが役に立てば幸い。

于 2011-10-28T15:13:47.447 に答える