From 6274b6e6dfbfcb3cd66eaeaaf57084a4c01b727c Mon Sep 17 00:00:00 2001 From: Salvatore Fede Date: Thu, 13 Nov 2025 17:13:05 +0100 Subject: [PATCH 1/4] feat: implementazione del convertitore da decimale a binario in Python --- src/binary_converter.py | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/binary_converter.py b/src/binary_converter.py index 57139210..1f9e1bf6 100644 --- a/src/binary_converter.py +++ b/src/binary_converter.py @@ -5,3 +5,49 @@ # Insert first number: 8 # The binary number is: 1000 # + +def division(a): + b = '' + while (a > 0): + if a % 2 == 0: + b = '0' + b + else: + b = '1' + b + a = a // 2 + return b + + +def carry(a): + result_list = list(a) # conversione dell'array in lista + + for i in range(len(result_list) - 1, -1, -1): #gestione del riporto di 1 + if result_list[i] == '0': + result_list[i] = '1' + break + else: + result_list[i] = '0' + + a = "".join(result_list) + return a + + +result = '' +input = int(input("Inserisci il numero da convertire: ")) + +if input == 0: + print("0") + +elif input < 0: + input = -input + result = division(input) + + result = result.zfill(16) + result = result.replace('0', '&').replace('1', '0').replace('&', '1') + + print(f"Stringa modificata: {carry(result)}") + + print("Il seguente numero è calcolato con la tecnica del complemento a due.") + print("Il risultato è rappresentato in 16 bit.") + +elif input >= 0: + print(division(input)) \ No newline at end of file From 5adbdf5819ac88b2d0c16710c31ea1bb7c47c4e2 Mon Sep 17 00:00:00 2001 From: Salvatore Fede Date: Sun, 16 Nov 2025 23:23:20 +0100 Subject: [PATCH 2/4] chore: aggiunti i tipi alle funzioni e ottimizzazione dello stile del codice, in accordo con la pipeline di verifica relativa --- src/binary_converter.py | 65 ++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/src/binary_converter.py b/src/binary_converter.py index 1f9e1bf6..13fad98b 100644 --- a/src/binary_converter.py +++ b/src/binary_converter.py @@ -6,48 +6,45 @@ # The binary number is: 1000 # -def division(a): - b = '' - while (a > 0): - if a % 2 == 0: - b = '0' + b - else: - b = '1' + b - a = a // 2 - return b - - -def carry(a): - result_list = list(a) # conversione dell'array in lista - - for i in range(len(result_list) - 1, -1, -1): #gestione del riporto di 1 - if result_list[i] == '0': - result_list[i] = '1' - break - else: - result_list[i] = '0' - - a = "".join(result_list) - return a - +def division(a: int) -> int: + b = '' + while (a > 0): + if a % 2 == 0: + b = '0' + b + else: + b = '1' + b + a = a // 2 + return b + +def carry(a: int) -> int: + result_list = list(a) # conversione dell'array in lista + + for i in range(len(result_list) - 1, -1, -1): # gestione del riporto di 1 + if result_list[i] == '0': + result_list[i] = '1' + break + result_list[i] = '0' + + a = "".join(result_list) + return a result = '' input = int(input("Inserisci il numero da convertire: ")) if input == 0: - print("0") + print("0") elif input < 0: - input = -input - result = division(input) - - result = result.zfill(16) - result = result.replace('0', '&').replace('1', '0').replace('&', '1') + input = -input + result = division(input) + + result = result.zfill(16) + result = result.replace('0', '&').replace('1', '0').replace('&', '1') - print(f"Stringa modificata: {carry(result)}") + print(f"Stringa modificata: {carry(result)}") - print("Il seguente numero è calcolato con la tecnica del complemento a due.") - print("Il risultato è rappresentato in 16 bit.") + print("Il seguente numero è calcolato con la tecnica del complemento a due.") + print("Il risultato è rappresentato in 16 bit.") elif input >= 0: - print(division(input)) \ No newline at end of file + print(division(input)) From 6d80662662c708d9e56580b825434f96ab736316 Mon Sep 17 00:00:00 2001 From: Salvatore Fede Date: Tue, 18 Nov 2025 11:06:52 +0100 Subject: [PATCH 3/4] chore: migliorie allo stile del codice --- src/binary_converter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/binary_converter.py b/src/binary_converter.py index 13fad98b..994051e7 100644 --- a/src/binary_converter.py +++ b/src/binary_converter.py @@ -8,11 +8,11 @@ def division(a: int) -> int: b = '' - while (a > 0): + while a > 0: if a % 2 == 0: b = '0' + b else: - b = '1' + b + b = '1' + b a = a // 2 return b @@ -39,7 +39,7 @@ def carry(a: int) -> int: result = division(input) result = result.zfill(16) - result = result.replace('0', '&').replace('1', '0').replace('&', '1') + result = result.replace('0', '&').replace('1', '0').replace('&', '1') print(f"Stringa modificata: {carry(result)}") From ccaefc2c536761bf62d235cabf385de5ce2d34cc Mon Sep 17 00:00:00 2001 From: Salvatore Fede Date: Thu, 27 Nov 2025 21:08:57 +0100 Subject: [PATCH 4/4] test: aggiunto unit-test, leggere migliorie al codice originale --- src/binary_converter.py | 57 ++++++++++++++++++++++----------------- tests/test_binary_conv.py | 49 +++++++++++++++++++++++++++++++++ tests/test_sum.py | 7 ----- 3 files changed, 81 insertions(+), 32 deletions(-) create mode 100644 tests/test_binary_conv.py delete mode 100644 tests/test_sum.py diff --git a/src/binary_converter.py b/src/binary_converter.py index 994051e7..8bd6fbfc 100644 --- a/src/binary_converter.py +++ b/src/binary_converter.py @@ -6,45 +6,52 @@ # The binary number is: 1000 # -def division(a: int) -> int: - b = '' + +def division(a: int) -> str: + b = "" while a > 0: if a % 2 == 0: - b = '0' + b + b = "0" + b else: - b = '1' + b + b = "1" + b a = a // 2 - return b + return f"{b}" + -def carry(a: int) -> int: - result_list = list(a) # conversione dell'array in lista +def carry(a: str) -> str: + result_list = list(a) # conversione dell'array in lista - for i in range(len(result_list) - 1, -1, -1): # gestione del riporto di 1 - if result_list[i] == '0': - result_list[i] = '1' + for i in range(len(result_list) - 1, -1, -1): # gestione del riporto di 1 + if result_list[i] == "0": + result_list[i] = "1" break - result_list[i] = '0' + result_list[i] = "0" a = "".join(result_list) return a -result = '' -input = int(input("Inserisci il numero da convertire: ")) -if input == 0: - print("0") +def invert(res: str) -> str: + res = res.zfill(16) + res = res.replace("0", "&").replace("1", "0").replace("&", "1") + return res + -elif input < 0: - input = -input - result = division(input) +if __name__ == "__main__": + result = "" + input = int(input("Inserisci il numero da convertire: ")) - result = result.zfill(16) - result = result.replace('0', '&').replace('1', '0').replace('&', '1') + if input == 0: + print("0") - print(f"Stringa modificata: {carry(result)}") + elif input < 0: + input = -input + result = division(input) + result = invert(result) - print("Il seguente numero è calcolato con la tecnica del complemento a due.") - print("Il risultato è rappresentato in 16 bit.") + print(f"Stringa modificata: {carry(result)}") + print("Il seguente numero è calcolato con la tecnica del complemento a due.") + print("Il risultato è rappresentato in 16 bit.") -elif input >= 0: - print(division(input)) + elif input >= 0: + print(division(input)) diff --git a/tests/test_binary_conv.py b/tests/test_binary_conv.py new file mode 100644 index 00000000..99123878 --- /dev/null +++ b/tests/test_binary_conv.py @@ -0,0 +1,49 @@ +from typing import List +import pytest +from src import binary_converter + +parametri: List[dict] = [ + {"a": 5, "exp_ris": f"{bin(5)[2:]}", "bin_post_carry": list("110")}, + {"a": 1, "exp_ris": f"{bin(1)[2:]}", "bin_post_carry": list("0")}, + {"a": 8, "exp_ris": f"{bin(8)[2:]}", "bin_post_carry": list("1001")}, + {"a": 111, "exp_ris": f"{bin(111)[2:]}", "bin_post_carry": list("1110000")}, + {"a": 2.5, "exp_ris": f"{bin(round(2.5))[2:]}", "bin_post_carry": list("11")}, + { + "a": 4.0000000, + "exp_ris": f"{bin(int(4.0000000))[2:]}", + "bin_post_carry": list("101"), + }, + {"a": -1, "exp_ris": f"{bin(-1)[3:]}", "bin_post_carry": list("0")}, + { + "a": 101.0110, + "exp_ris": f"{bin(int(101.0110))[2:]}", + "bin_post_carry": list("1100110"), + }, +] + +param_invert: List[dict] = [ + {"input": "1", "exp_out": "1111111111111110"}, + {"input": "", "exp_out": "1111111111111111"}, + {"input": "10101010", "exp_out": "1111111101010101"}, + {"input": "1010101010101010", "exp_out": "0101010101010101"}, + {"input": "1111111111111111", "exp_out": "0000000000000000"}, + {"input": "10101010101010101", "exp_out": "01010101010101010"}, +] + + +@pytest.mark.parametrize("test", parametri) +def test_division(test: dict) -> int: + act_ris = binary_converter.division(int(abs(test["a"]))) + assert test["exp_ris"] == act_ris + + +@pytest.mark.parametrize("test", parametri) +def test_carry(test: dict) -> str: + act_ris = binary_converter.carry(test["exp_ris"]) + assert "".join(test["bin_post_carry"]) == act_ris + + +@pytest.mark.parametrize("test", param_invert) +def test_invert(test: dict) -> str: + act_ris = binary_converter.invert(test["input"]) + assert test["exp_out"] == act_ris diff --git a/tests/test_sum.py b/tests/test_sum.py deleted file mode 100644 index 4874e5c8..00000000 --- a/tests/test_sum.py +++ /dev/null @@ -1,7 +0,0 @@ -from src.sum import sum - - -def test_sum() -> None: - assert sum(3, 4) == 7 - assert sum(0, 0) == 0 - assert sum(1, 2) == 3