1

7 セグメント ディスプレイを作成するプログラムを作成する必要があります。次のように機能します。

def numbers(number, width):
  # Code to make number

典型的な出力は次のようになります。

numbers(100, 2)

    --   -- 
 | |  | |  |
 | |  | |  |

 | |  | |  |
 | |  | |  |
    --   --

numbers(24, 1)

 -  
  | | |
 -   -
|     |
 -

numbers(1234567890, 1)

   -   -       -   -   -   -   -   - 
|   |   | | | |   |     | | | | | | |
   -   -   -   -   -       -   -     
| |     |   |   | | |   | | |   | | |
   -   -       -   -       -   -   - 

numbers(8453, 3)

 ---         ---   --- 
|   | |   | |         |
|   | |   | |         |
|   | |   | |         |
 ---   ---   ---   --- 
|   |     |     |     |
|   |     |     |     |
|   |     |     |     |
 ---         ---   --- 

とにかく、これらはいくつかの例です (タイプするのにかなり時間がかかりました)。などを使えるのはわかっているのですが、わから'-' * numberなくてイライラするだけです!クラスか何かを使用する必要があるように感じますが、指を置くことはできません。

ありがとうございました。

4

4 に答える 4

3

プログラムでセグメントを生成しようとしないでください。手動で入力しますが、通常はエンコードされた方法で入力してください。このエンコーディングにより、さまざまな出力を生成できるはずです。 これらをプログラムしてください。

次のコードを検討してください

class SSDigit(object):
    """A 7-segment digit"""
    def __init__(self):
        self.lines= []

ssdig0= SSDigit()
ssdig1.lines.append("     ")
ssdig0.lines.append("  -  ")
ssdig0.lines.append(" | | ")
ssdig0.lines.append("     ")
ssdig0.lines.append(" | | ")
ssdig0.lines.append("  -  ")
ssdig1.lines.append("     ")

ssdig1= SSDigit()
ssdig1.lines.append("     ")
ssdig1.lines.append("     ")
ssdig1.lines.append("   | ")
ssdig1.lines.append("     ")
ssdig1.lines.append("   | ")
ssdig1.lines.append("     ")
ssdig1.lines.append("     ")

.....

class LineType(object):
    """Each of the 2 line types (1 horizontal segment or 2 vertical),
       with their possible representations and segment positions"""
    def __init__(self):
        self.valueForRepr= {}
        self.segmentPos= []

class Line(object):
    """Each of the 5 lines a SSDigit has, with its LineType"""
    def __init__(self):
        self.type= None

digits= [ ssdig0, ssdig1, ssdig2, ssdig3, ssdig4, ssdig5, ssdig6, ssdig7, ssdig8, ssdig9 ]

linetype1= LineType()
linetype1.valueForRepr["     "]= [0]
linetype1.valueForRepr["  -  "]= [1]
linetype1.segmentPos= [3]

linetype2= LineType()
linetype2.valueForRepr["     "]= [0,0]
linetype2.valueForRepr["   | "]= [0,1]
linetype2.valueForRepr[" |   "]= [1,0]
linetype2.valueForRepr[" | | "]= [1,1]
linetype2.segmentPos= [2,4]

typeforline= [ linetype1, linetype2, linetype1, linetype2, linetype1 ]

# Validate error-prone typing !!!
for digit in digits :
    for linenum, linetype in enumerate(typeforline) :
        if digit.lines[linenum] not in linetype.valueForRepr :
            print("Error in digit {:d}, line {:d}".format(digit,linenum))

def printNumber(num):
    num= str(num)
    for linenum, linetype in enumerate(typeforline) :
        line= ""
        for d in num :
            line+= digits[int(d)].lines[linenum]
        print( line )

printNumber(3475649560458)

それぞれに入力された文字列は、SSDigit単なる正規表現です。その構造は、開発者を簡単に視覚化するためだけのものです。さまざまなサイズとフォームを生成するために必要な情報は、これらの表現やその他の構造を通じてエンコードされます。

例えば、

def printNumberDoubleSize(num):
    num= str(num)
    for linenum, linetype in enumerate(typeforline) :
        line= ""
        for d in num :
            line+= digits[int(d)].lines[linenum]
        print( line )

printNumberDoubleSize(3475649560458)

次のステップは、間隔を考慮して、ディスプレイが 7x5 マトリックスで構成されていることを認識することです。

  01234
0   
1   -
2  | |
3   -
4  | |
5   -
6

また、マトリックスの各行と列は論理的なものです。つまり、次のように、複数の物理的な行や列で構成できます。

   012   34
   00012300 
00   
10   ----
20  |    |
 1  |    |
30   ----
40  |    |
 1  |    |
50   ----
60

ここで、ほとんどの論理行と論理列は、それぞれ 1 つの物理行と 1 列だけで構成されます。ただし、論理行 2 と 4 (それぞれ 2 つの物理行) と、4 つの物理列を持つ論理列 2 は除きます。

これは、一連の文字列として表すことができます。また、各要素について、オフ状態とオン状態でどのように表示したいかを表現すると非常に便利です。以下の定義では、例として、芸術的な自由にふけっています。

phyLineN= []
phyLineN.append([])
phyLineN[0]= []
phyLineN[0].append([ "....", ".", "....",".", "...." ])
phyLineN.append([])
phyLineN[1]= []
phyLineN[1].append([ ".   ", " ", ". . "," ", "    " ])
phyLineN.append([])
phyLineN[2]= []
phyLineN[2].append([ ".   ", ".", "    ",".", "    " ])
phyLineN[2].append([ ".   ", " ", "    "," ", "    " ])
phyLineN.append([])
phyLineN[3]= []
phyLineN[3].append([ ".   ", " ", ". . "," ", "    " ])
phyLineN.append([])
phyLineN[4]= []
phyLineN[4].append([ ".   ", ".", "    ",".", "    " ])
phyLineN[4].append([ ".   ", " ", "    "," ", "    " ])
phyLineN.append([])
phyLineN[5]= []
phyLineN[5].append([ ".   ", " ", ". . "," ", "    " ])
phyLineN.append([])
phyLineN[6]= []
phyLineN[6].append([ "....", ".", "....",".", "...." ])

phyLineY= []
phyLineY.append([])
phyLineY[0]= []
phyLineY[0].append([ "    ", " ", "    "," ", "    " ])
phyLineY.append([])
phyLineY[1]= []
phyLineY[1].append([ "    ", " ", "===="," ", "    " ])
phyLineY.append([])
phyLineY[2]= []
phyLineY[2].append([ "    ", "H", "    ","H", "    " ])
phyLineY[2].append([ "    ", "H", "    ","H", "    " ])
phyLineY.append([])
phyLineY[3]= []
phyLineY[3].append([ "    ", " ", "===="," ", "    " ])
phyLineY.append([])
phyLineY[4]= []
phyLineY[4].append([ "    ", "H", "    ","H", "    " ])
phyLineY[4].append([ "    ", "H", "    ","H", "    " ])
phyLineY.append([])
phyLineY[5]= []
phyLineY[5].append([ "    ", " ", "===="," ", "    " ])
phyLineY.append([])
phyLineY[6]= []
phyLineY[6].append([ "    ", " ", "    "," ", "    " ])

def printNumberNY(num,structN,structY):

    phyRowH= [ len(structN[0]), len(structN[1]), len(structN[2]), len(structN[3]), len(structN[4]), len(structN[5]), len(structN[6]) ]

    # Validate structure and compute phyColW
    # This could be moved to an object constructor so is computed only once
    first= 1
    for line in structN :
        for phyLine in line :
            if first :
                phyColW= [ len(phyLine[0]), len(phyLine[1]), len(phyLine[2]), len(phyLine[3]), len(phyLine[4]) ] 
                first= 0
            else:
                for i, _ in enumerate(phyLine) :
                    if len(phyLine[i]) != phyColW[i] : raise "Inconsistent physical column width"

    # Real rendering of the (full) number in 7-segment form
    num= str(num)
    for linenum, linetype in enumerate(typeforline) :
        for phyLine in range(phyRowH[linenum]) :
            line= ""
            for d in num :
                for col, qq in enumerate(phyColW) :
                    if digits[int(d)].lines[linenum][col] != " " :
                        line+= structY[linenum][phyLine][col]
                    else:
                        line+= structN[linenum][phyLine][col]
            print( line )

printNumberNY(3475649560458,phyLineN,phyLineY)

のコードprintNumberNYは、単純な width*n の場合よりもそれほど難しくありません。

width*n の場合は、実際には、このセットアップの特定のケースであり、次のように構築できます。

def sizeVH(vSegHeight,hSegWidth,vSep,hSep):

    hSepStr= " " *hSep
    hSegN= " "* hSegWidth 
    hSegY= "-"* hSegWidth

    phyLineN= []
    phyLineN.append([])
    phyLineN[0]= []
    phyLineN.append([])
    phyLineN[1]= []
    phyLineN[1].append([ "", " ", hSegN," ", hSepStr ])
    phyLineN.append([])
    phyLineN[2]= []
    for i in range(vSegHeight) :
        phyLineN[2].append([ "", " ", hSegN," ", hSepStr ])
    phyLineN.append([])
    phyLineN[3]= []
    phyLineN[3].append([ "", " ", hSegN," ", hSepStr ])
    phyLineN.append([])
    phyLineN[4]= []
    for i in range(vSegHeight) :
        phyLineN[4].append([ "", " ", hSegN," ", hSepStr ])
    phyLineN.append([])
    phyLineN[5]= []
    phyLineN[5].append([ "", " ", hSegN," ", hSepStr ])
    phyLineN.append([])
    phyLineN[6]= []
    for i in range(vSep) :
        phyLineN[6].append([ "", " ", hSegN," ", hSepStr ])

    phyLineY= []
    phyLineY.append([])
    phyLineY[0]= []
    phyLineY.append([])
    phyLineY[1]= []
    phyLineY[1].append([ "", " ", hSegY," ", hSepStr ])
    phyLineY.append([])
    phyLineY[2]= []
    for i in range(vSegHeight) :
        phyLineY[2].append([ "", "|", hSegN,"|", hSepStr ])
    phyLineY.append([])
    phyLineY[3]= []
    phyLineY[3].append([ "", " ", hSegY," ", hSepStr ])
    phyLineY.append([])
    phyLineY[4]= []
    for i in range(vSegHeight) :
        phyLineY[4].append([ "", "|", hSegN,"|", hSepStr ])
    phyLineY.append([])
    phyLineY[5]= []
    phyLineY[5].append([ "", " ", hSegY," ", hSepStr ])
    phyLineY.append([])
    phyLineY[6]= []
    for i in range(vSep) :
        phyLineY[6].append([ "", " ", hSegN," ", hSepStr ])

    return (phyLineN,phyLineY)

phyLineN, phyLineY= sizeVH(4,6,1,3)
printNumberNY(3475649560458,phyLineN,phyLineY)

最初に定義した要素の一部を使用していないことはわかっていますが、これがモデル化する方法です。ソリューションを拡張し続ける場合、それらは役立つ可能性があります。

于 2013-08-25T02:12:56.700 に答える
0

ここでの解決策は、プログラム全体が完了するまで、小さく始めて前進することだと思います。

最初に、数字の 2 を描画する など、1 桁の数字を描画できる関数を作成しますdrawTwo()。これを理解したら、これを にリファクタリングします。これdrawTwo(width)により、正しい幅で数字が描画されます。これで理解できたので、0 から 10 までの各桁に 1 を書くのはそれほど難しくありません。

10 個の関数を作成したら、入力数値を数字に分割し、各数字に対して (おそらく switch ステートメントを使用して) 正しい関数を呼び出す関数を作成します。

一歩ずつ進んでください。

于 2013-08-25T02:18:50.593 に答える