Python(16進数まで対応ver)

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

def valid(base,base_num):
    """<検査関数>入力値が正しいかどうか判定する関数"""    
    if int(base) < 10:
        for i in base_num:
            if not("0" <= i.lower() <= str(base-1)):
                return False
        return True
    
    for i in base_num:
        if not("0" <= i.lower() <= "9" or "a"<= i.lower() <= "f"):
            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 base_num.isdigit():
        #    print(f"「{base_num}」は数値ではありません\n正しい入力値をお願いします")
        elif not valid(base,base_num):
            print(f"「{base_num}」は{base}進数の数ではありません")
            print("正しい入力値をお願いします")
        else:
            return base_num        

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

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

def convert(src,*,base=2):
    n_result=0
    for i,x in enumerate(reversed(src)):
        if not x.isdigit():
            dict16 = {"a":10,"b":11,"c":12,"d":13,"e":14,"f":15}
            print(f"Debug:convert「{x}」=「{dict16[x]}」")
            x = dict16[x]
        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()

さらにDictionaryを用いて2~16進数までを10進数に変換させられるように改良したverプログラミングです

コメントを残す

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Python

前の記事

Python(n進数オリジナル)
Python

次の記事

Python(シーザー暗号化)