1359 - Ecuatie 2: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
 
Line 73: Line 73:
         if not (caracter.isdigit() or caracter in ['+', '-', '*', ':', 'x', '=']):
         if not (caracter.isdigit() or caracter in ['+', '-', '*', ':', 'x', '=']):
             raise ValueError
             raise ValueError
    # extract a and b from the equation
    parts = ecuatie1.split('=')
    a = int(''.join(filter(str.isdigit, parts[0])))
    b = int(''.join(filter(str.isdigit, parts[1])))
    # check if a and b are within the given range
    if not (1 <= a <= 30000 and 1 <= b <= 30000):
        raise ValueError


     file_out.write("Datele de intrare corespund restrictiilor impuse\n")
     file_out.write("Datele de intrare corespund restrictiilor impuse\n")

Latest revision as of 16:06, 11 November 2023

Cerinţa[edit | edit source]

Fie a și b două numere naturale nenule. Cu ajutorul lor se pot forma ecuațiile matematice de tipul:

1) a+x=b

2) x+a=b

3) a-x=b

4) x-a=b

5) a*x=b  (unde a divide b)

6) x*a=b  (unde a divide b)

7) a:x=b  (unde b divide a)

8) x:a=b

Scrieți un program care să citească din fișierul ecuatiein.txt o ecuaţie de tipul precizat în enunț şi care să determine:

a) tipul ecuației citite; b) soluția ecuației obținută prin rezolvarea acestei ecuații.

Date de intrare[edit | edit source]

Fişierul ecuatie2in.txt conţine pe prima linie ecuația, ca în exemplu.

Date de ieşire[edit | edit source]

Fişierul de ieşire ecuatie2out.txt va conține pe prima linie un număr natural reprezentând tipul ecuaţiei, iar pe a doua linie, un număr natural reprezentând soluția ecuației.

Restricții și precizări[edit | edit source]

  • 1 ≤ a ≤ 30 000
  • 1 ≤ b ≤ 30 000
  • Fișierul de intrare conține o singură ecuație; soluția ecuației este un număr natural.

Exemplul 1[edit | edit source]

ecuatie2in.txt
23+x=100
ecuatie2out.txt
Datele introduse corespund restricțiilor impuse.
1
77

Exemplul 2[edit | edit source]

ecuatie2in.txt
x*20=1400
ecuatie2out.txt
Datele introduse corespund restricțiilor impuse.
6
70

Exemplul 3[edit | edit source]

ecuatie2in.txt
15:x=3
ecuatie2out.txt
Datele introduse corespund restricțiilor impuse.
7
5

Exemplul 4[edit | edit source]

ecuatie2in.txt
x+ = 100
ecuatie2out.txt
Datele introduse nu corespund restricțiilor impuse.

Explicații[edit | edit source]

Pentru primul exemplu, ecuația este de tipul 1. Soluția ecuaţiei 23+x=100 este x=77.

Pentru al doilea exemplu, ecuația este de tipul 6. Soluția ecuaţiei x*20=1400 este x=70.

Pentru al treilea exemplu, ecuația este de tipul 7. Soluția ecuaţiei 15:x=3 este x=5.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1359 - Ecuatie 2

def validare(ecuatie1): # functia de validare a datelor de intrare

   if len(ecuatie1) > 1000:
       raise ValueError
   # daca datele de intrare nu corespund, ridicam eroarea ValueError
   for caracter in ecuatie1:
       if not (caracter.isdigit() or caracter in ['+', '-', '*', ':', 'x', '=']):
           raise ValueError
   # extract a and b from the equation
   parts = ecuatie1.split('=')
   a = int(.join(filter(str.isdigit, parts[0])))
   b = int(.join(filter(str.isdigit, parts[1])))
   # check if a and b are within the given range
   if not (1 <= a <= 30000 and 1 <= b <= 30000):
       raise ValueError
   file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def rezolva_ecuatie(ecuatie1): # functia de rezolvare

   if "+x=" in ecuatie1:
       a, b = map(int, ecuatie1.split("+x="))
       return 1, b - a
   elif "x+" in ecuatie1:
       a, b = map(int, ecuatie1.split("x+"))
       return 2, b - a
   elif "-x=" in ecuatie1:
       a, b = map(int, ecuatie1.split("-x="))
       return 3, a - b
   elif "x-" in ecuatie1:
       a, b = map(int, ecuatie1.split("x-"))
       return 4, a + b
   elif "*x=" in ecuatie1 and int(ecuatie1.split("*x=")[1]) % int(ecuatie1.split("*x=")[0]) == 0:
       a, b = map(int, ecuatie1.split("*x="))
       return 5, b // a
   elif "x*" in ecuatie1:
       _, temp = ecuatie1.split("x*")
       a, b = map(int, temp.split("="))
       return 6, b // a
   elif ":x=" in ecuatie1 and int(ecuatie1.split(":x=")[0]) % int(ecuatie1.split(":x=")[1]) == 0:
       a, b = map(int, ecuatie1.split(":x="))
       return 7, a // b
   elif "x:" in ecuatie1:
       _, temp = ecuatie1.split("x:")
       a, b = map(int, temp.split("="))
       return 8, a // b


if __name__ == '__main__':

   file_in = open("ecuatie2in.txt", "r")         # declararea fisierelor
   file_out = open("ecuatie2out.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)
   # din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam
   try:
       ecuatie = file_in.readline()      # citirea ecuatiei se face ca sir de caractere
       validare(ecuatie)                 # apelul functiei de validare
       tip_ecuatie, solutie = rezolva_ecuatie(ecuatie)               # apelul functiei de rezolvare
       file_out.write(str(tip_ecuatie) + '\n')
       file_out.write(str(solutie) + '\n')
   except ValueError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>