Python(36進数→10進数変換)

def input_base():
    """入力を求める関数"""
    return input("2~36の範囲で基数を入力してください:")

def get_int(function):
    """<高階関数>入力を求める関数の値を判断する関数
       @param function 入力処理を行う関数
       @return s 認識可能なstring"""
    while True:
        s = function()        
        if s.lower() == "exit":
            break
        if s.isdigit():
            n=int(s)
            if n<=1 or n > 36:
                print(f"「{n}」は2~36の数ではありません\n正しい入力値をお願いします")            
            else:
                return s
        else:
            print(f"「{s}」は正の数値ではありません\n正しい入力値をお願いします")
    return "exit"

def make_char_list(char,count):
    """基となるchar文字列から連続した文字をリスト化する関数
       @param char  基にするchar文字列
       @param count 作成したいリストの要素数
       @return _char_list 文字列リスト"""
    _char_list = []
    _base = ord(char.lower())
    for i in range(count):
        _char_list.append(chr(_base))
        _base += 1
    return _char_list

def make_num_list(num,count):
    """基となるnum文字列から連続した数をリスト化する関数
       @param num 基にするchar文字列
       @param count 作成したいリストの要素数
       @return _num_list num文字列リスト"""    
    _num_list = []
    _base = ord(str(num).lower())
    for i in range(count):
        _num_list.append(chr(_base))
        _base += 1
    return _num_list

def make_char_dict36(key_char,value_num,count):
    """36進数に対応するdicionaryにする関数
       @param key_char キーとする文字列
       @param base   値とする数
       @return base_num 正しい入力値のn進数リスト"""    
    _dictionary = {}
    _key_base = ord(key_char.lower())
    _value_base = int(value_num)
    for i in range(count):
        _dictionary[chr(_key_base)]=_value_base
        _key_base += 1
        _value_base += 1
    return _dictionary

def input_num(base):
    """入力を求める関数"""
    return input(f"{base} 進数を入力してください:")

def valid(base,base_num):
    """<検査関数>入力値が正しいかどうか判定する関数"""
    # dictionaryを作成し、その中に入力値があるかチェックが必要
    if int(base) <= 10:
        for i in base_num:
            if not("0" <= i.lower() <= str(base-1)):
                return False
        return True

    _char=make_char_list("a",int(base)-10)
    _num=make_num_list("0",10)
    
    for i in base_num:
        if not("0" <= i.lower() <= "9" or "a"<= i.lower() <= "z"):
            return False
        elif not(i.lower() in _char or i.lower() in _num):
            return False
    return True    

def get_base_num_list(function,base):
    """<高階関数>入力を求める関数の値を判断する関数
       @param function 入力処理を行う関数
       @param base   基数n
       @return base_num 正しい入力値のn進数リスト"""
    while True:
        base_num = function(base)
        
        if len(base_num)==0:
            print(f"「{base_num}」は空です\n正しい入力値をお願いします")
        elif not valid(base,base_num):
            print(f"「{base_num}」は{base}進数の数ではありません")
            print("正しい入力値をお願いします")
        else:
            return base_num
        
def convert(src,*,base=2):
    n_result=0
    for i,x in enumerate(reversed(src)):
        if not x.isdigit():
            dict36 = make_char_dict36("a",10,base-10)
            print(f"Debug:convert「{x}」=「{dict36[x.lower()]}」")
            x = dict36[x.lower()]
        n_result += int(x)*base**i
        print(f"Debug i:{i} x:{x} {base}**{i}={base**i}  result:{n_result}")     
    return n_result  

def test_exec():
    base = get_int(input_base)     
    if base.isdigit():
        base=int(base)
        base_num = get_base_num_list(input_num,base)
        print("求める10進数は:",convert(base_num,base=base),"\n")
        return True
    else:
        return False
    
def test():
    while test_exec():
        pass
    print("end")

# 実行部分
test()

2~36進数までの数を入力すると10進数に変換してくれるプログラミングコードです。
不適切な入力があると再入力を求める作りになっており、間違った入力値を検査する部分を関数化することでループ処理もすっきりした形にできたのではないかと思っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Unity

次の記事

Unity(Toto’s Toy Box)