def substitutie(): """ Apeleaza functiile de converitire a unui numar dintr-o baza mai mica intr-o alta mare prin substitutie. """ print("\nNumarul: ".upper()) mesaj_citire = "Citeste o baza strict mai mica decat 16: " mesaj_atentionare = "\n Baza sursa trebuie sa fie un numar strict mai mic decat 16, dar mai mare sau egal decat 2\n".upper( ) baza = Console.citesteBaza(mesaj_citire, mesaj_atentionare, 2, 15) numar = Console.citesteInstanta(baza) numar = Operatii(numar[0], numar[1]) nr = Console.fromList_toString(numar.getNumar()) bz = numar.getBaza() print("\nbaza destinatie: ".upper()) mesaj1 = "Citeste o baza mai mare decat baza data in care vrei sa fie convertit numarul: " mesaj2 = "\n Baza trebuie sa fie un numar mai mare decat baza numarului citit si mai mica sau egala decat 16\n".upper( ) baza = Console.citesteBaza(mesaj1, mesaj2, numar.getBaza(), 16) numar = Conversii.substitutie(numar, baza) #return "Rezultatul este: {}".format(Console.fromList_toString(numar)) return "\nREZULTAT: {}({}) = {}({})".format( nr, bz, Console.fromList_toString(numar), baza)
def impartiriSuccesive(): """ Citeste o baza si un numar in acea baza Citeste baza destinatie, baza care este mai mica decat baza in care a fost citit numarul Gesticuleaza procesul de convertire a numarul in baza destinatie folosind algoritmul de impartiri succesive """ print("\nNumarul: ".upper()) mesaj_citire = "Citeste o baza strict mai mare decat 2: " mesaj_atentionare = "\n Baza sursa trebuie sa fie un numar strict mai mare decat 2, dar mai mic decat egal decat 16\n".upper( ) baza = Console.citesteBaza(mesaj_citire, mesaj_atentionare, 3, 16) numar = Console.citesteInstanta(baza) numar = Operatii(numar[0], numar[1]) nr = Console.fromList_toString(numar.getNumar()) bz = numar.getBaza() print("\nbaza destinatie: ".upper()) mesaj1 = "Citeste o baza mai mica decat baza sursa in care vrei sa fie convertit rezultatul: " mesaj2 = "\n Baza trebuie sa fie un numar mai mic decat baza numarului citit si mai mare egala decat 2\n".upper( ) baza = Console.citesteBaza(mesaj1, mesaj2, 2, numar.getBaza()) numar = Conversii.impartiriSuccesive(numar, baza) #return "Rezultatul este: {}".format(Console.fromList_toString(numar)) return "\nREZULTAT: {}({}) = {}({})".format( nr, bz, Console.fromList_toString(numar), baza)
def test_conversieBazaIntermediara(): x = Operatii([1, 1, 2, 0, 1], 6) baza = 12 assert (Conversii.conversieBazaIntermediara(x, baza)) == [11, 0, 1] x = Operatii([1, 7, 3], 8) baza = 7 assert Conversii.conversieBazaIntermediara(x, baza) == [2, 3, 4]
def test_substitutie(): x = Operatii([1, 1, 2, 0, 1], 6) baza = 12 assert Conversii.substitutie(x, baza) == [11, 0, 1] x = Operatii([6, 7, 3, 4], 8) baza = 6 assert Conversii.substitutie(x, baza) == [2, 4, 2, 3, 2]
def adunare(): """ Adunarea a doua numere naturale intr-o baza citita de la tastatura(2-16). Numerele pot sa fie in aceeasi baza sau nu. """ print("\nPrimul numar: ".upper()) numar1 = Console.citesteInstanta() numar1 = Operatii(numar1[0], numar1[1]) print("\nAl doilea numar: ".upper()) numar2 = Console.citesteInstanta() numar2 = Operatii(numar2[0], numar2[1]) print("\nBaza destinatie: ".upper()) baza = Console.citesteBaza( "Citeste o baza destinatie de la 2 la 16 in care vrei sa se afle rezultatul: " ) nr1 = Console.fromList_toString(numar1.getNumar()) nr2 = Console.fromList_toString(numar2.getNumar()) baza1 = numar1.getBaza() baza2 = numar2.getBaza() numar1 = Console.converteste(numar1, baza) numar2 = Console.converteste(numar2, baza) return "\nREZULTAT: {}({}) + {}({}) = {}({})".format( nr1, baza1, nr2, baza2, Console.fromList_toString(Operatii.adunare(numar1, numar2)), baza)
def test_impartiriSuccesive(): nr = Operatii([1, 7, 3], 8) baza = 7 assert Conversii.impartiriSuccesive(nr, baza) == [2, 3, 4] nr = Operatii([2, 4, 2], 7) baza = 6 assert Conversii.impartiriSuccesive(nr, baza) == [3, 3, 2] x = Operatii([11, 0, 1], 12) baza = 6 assert Conversii.impartiriSuccesive(x, baza) == [1, 1, 2, 0, 1]
def converteste(numar, baza): """ Se converteste un numar dintr-o baza data in alta baza, folosindu-se baza intermediara 10 :param numar: numarul de convertit :param baza: baza in care vrem sa convertim numarul :return: numarul convertit in baza ceruta """ if numar.getBaza() != baza: numar = Conversii.conversieBazaIntermediara(numar, baza) numar = Operatii(numar, baza) return numar
def impartire(): """ Imparteste un numar care se afla intr-o baza de la 2 la 16, la o cifra care se afla in aceeazi baza ca numarul. """ print("\nNumarul: ".upper()) numar = Console.citesteInstanta() numar = Operatii(numar[0], numar[1]) nr = Console.fromList_toString(numar.getNumar()) baza = numar.getBaza() while True: print("\nCifra: ".upper()) cifra = Console.citesteCifra(numar.getBaza()) if cifra == 0: print("\n Cifra trebuie sa fie diferita de 0.\n". upper()) else: break rez = Operatii.impartire(numar, cifra) #return "Catul impartirii este {}, iar restul este {}".format(Console.fromList_toString(cifra[0]), cifra[1]) return "\nREZULTAT: {}({}) / {}({}) = {} rest {}".format( nr, baza, cifra, baza, Console.fromList_toString(rez[0]), rez[1])
def bazaIntermediara(): """ Citeste o baza(2-16) si un numar in aceeasi baza Citeste o baza destinatie cuprinsa intre 2 si 16 Gesticuleaza procesul de convertire a numarului folosindu-se de algoritmul de convertire folosind o baza intermediara :return: """ print("\nNumarul: ".upper()) numar = Console.citesteInstanta() numar = Operatii(numar[0], numar[1]) nr = Console.fromList_toString(numar.getNumar()) bz = numar.getBaza() print("\nbaza destinatie: ".upper()) baza = Console.citesteBaza( "Citeste o baza de la 2 la 16 in care vrei sa se afle numarul: ") numar = Conversii.conversieBazaIntermediara(numar, baza) #return "Rezultatul este: {}".format(Console.fromList_toString(numar)) return "\nREZULTAT: {}({}) = {}({})".format( nr, bz, Console.fromList_toString(numar), baza)
def test_impartire(): numar = Operatii([2, 9, 11, 4, 13], 16) cifra = 8 assert numar.impartire(cifra) == [[5, 3, 6, 9], 5] numar = Operatii([5], 10) cifra = 9 assert (numar.impartire(cifra)) == [[0], 5]
def inmultire(): """ Inmulteste un numar care se afla intr-o baza de la 2 la 16, cu o cifra care se afla in aceeasi baza ca numarul. """ print("\nNumarul: ".upper()) numar = Console.citesteInstanta() numar = Operatii(numar[0], numar[1]) nr = Console.fromList_toString(numar.getNumar()) baza = numar.getBaza() print("\nCifra: ".upper()) cifra = Console.citesteCifra(numar.getBaza()) #return "Rezultatul inmultirii este: {}".format(Console.fromList_toString(Operatii.inmultire(numar,cifra))) return "\nREZULTAT: {}({}) * {}({}) = {}({})".format( nr, baza, cifra, baza, Console.fromList_toString(Operatii.inmultire(numar, cifra)), baza)
def test_adunare(): numar1 = Operatii([3, 1, 4, 7], 8) numar2 = Operatii([2, 0, 2], 8) assert numar1.adunare(numar2) == [3, 3, 5, 1]
def test_inmultire(): numar = Operatii([4, 12, 3, 2, 10], 16) cifra = 11 assert numar.inmultire(cifra) == [3, 4, 6, 2, 12, 14]
def test_scadere(): numar1 = Operatii([3, 1, 4, 7], 8) numar2 = Operatii([2, 0, 2], 8) assert numar2.scadere(numar1) == [2, 7, 4, 5] numar1 = Operatii([1, 0, 2], 8) assert (numar1.scadere(numar2)) == [1, 0, 0] numar1 = Operatii([1, 0, 0, 1, 1, 0], 2) numar2 = Operatii([1, 0, 0, 1], 2) assert Operatii.scadere(numar2, numar1) == [1, 1, 1, 0, 1]
def substitutie(nr, baza): """ Algoritmul de conversie a unui numar dintr-o baza mai mica intr-o baza mai mare folosind metoda substitutiei. :INPUTS: - nr- o instanta a clasei Operatii din modulul operatiiElementare. - baza- baza in care vrem sa convertim numarul :OUTPUTS: rezultat- rezultatul convertirii numarului in baza ceruta. Daca nr=244(7), acesta va fi o instanta a clasei Operatii, deci se va afla sub forma Operatii([2,4,4],7) Unde: [2,4,4]- sirul cifrelor numarului 7 - baza in care se afla numarul Pentru numarul 332(6) -> ? (7) ,avem lista cifrelor [3,3,2] Se parcurge lista cifrelor de la stanga spre dreapta [3, 3 ,2] ordine puteri: 2 1 0 Se imnulteste fiecare cifra cu baza in care se afla numarul curent ridicata la o putere ( vezi ordinea puterilor). Trebuie sa fim atenti la faptul ca calculele se vor efectua in baza destinatie rezultat= 3*6^2 + 3*6 + 2 6^2 in baza 7 va fi egal cu 51 (ne folosim de algoritmul de inmultire a unui numar cu o cifra) rezultat= 3*51 + 3*6 + 2 3*51 in baza 7 va fi egal cu 213 3*6 in baza 7 va fi egal cu 24 rezultat= 213 + 24 +2 (ne folosim de algoritmul de adunare a doua numere in aceeasi baza de numeratie) rezultat = 213+ 26= 242 (7) """ rezultat = Operatii([0], baza) listaCifre = nr.getNumar() for index in range(len(listaCifre)): x = Operatii([nr.getBaza()], baza) #baza= baza in care vrem sa trecem numarul if index == len(listaCifre) - 1: x = Operatii([1], baza) else: for putere in range(len(nr.getNumar()) - index - 2, 0, -1): x = Operatii.inmultire(x, nr.getBaza()) x = Operatii(x, baza) x = Operatii.inmultire(x, listaCifre[index]) x = Operatii(x, baza) rezultat = Operatii.adunare(x, rezultat) rezultat = Operatii(rezultat, baza) x = rezultat.getNumar() return rezultat.getNumar()
def scadere(): """ Scaderea a noua numere in baze identice sau diferite, si afisarea rezultatului intr-o a treia baza. Se face verificarea ca descazutul sa fie mai mare decat scazatorul, altfel utilizatorul este atentionat cu un mesaj. """ print("\nDescazutul: ".upper()) numar1 = Console.citesteInstanta() numar1 = Operatii(numar1[0], numar1[1]) while True: try: print("\nScazatorul: ".upper()) numar2 = Console.citesteInstanta() numar2 = Operatii(numar2[0], numar2[1]) print("\nBaza destinatie: ".upper()) baza = Console.citesteBaza( "Cisteste o baza in care vrei sa se afle rezultatul: ") nr1 = Console.fromList_toString(numar1.getNumar()) nr2 = Console.fromList_toString(numar2.getNumar()) baza1 = numar1.getBaza() baza2 = numar2.getBaza() numar1 = Console.converteste(numar1, baza) numar2 = Console.converteste(numar2, baza) Validator.compare(numar1.getNumar(), numar2.getNumar()) break except ValueError as msg: print(msg) #return "Rezultatul scaderii este: {}".format(Console.fromList_toString(Operatii.scadere(numar2, numar1))) return "\nREZULTAT: {}({}) - {}({}) = {}({})".format( nr1, baza1, nr2, baza2, Console.fromList_toString(Operatii.scadere(numar2, numar1)), baza)