1359 - Ecuatie 2: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinţa == 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 '''ecuatie.in''' o ecuaţie de tipul precizat în enunț şi care să...
 
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 18: Line 18:
8) '''x:a=b'''
8) '''x:a=b'''


Scrieți un program care să citească din fișierul '''ecuatie.in''' o ecuaţie de tipul precizat în enunț şi care să determine:
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;
a) tipul ecuației citite;
b) soluția ecuației obținută prin rezolvarea acestei ecuații.
b) soluția ecuației obținută prin rezolvarea acestei ecuații.
== Date de intrare ==
== Date de intrare ==
Fişierul '''ecuatie2.in''' conţine pe prima linie ecuația, ca în exemplu.
Fişierul '''ecuatie2in.txt''' conţine pe prima linie ecuația, ca în exemplu.
== Date de ieşire ==
== Date de ieşire ==
Fişierul de ieşire '''ecuatie2.out''' 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.
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 ==
== Restricții și precizări ==
* '''1 ≤ a ≤ 30 000'''
* '''1 ≤ a ≤ 30 000'''
Line 31: Line 31:
* Fișierul de intrare conține o singură ecuație; soluția ecuației este un număr natural.
* Fișierul de intrare conține o singură ecuație; soluția ecuației este un număr natural.
== Exemplul 1 ==
== Exemplul 1 ==
; ecuatie2.in
; ecuatie2in.txt
: 23+x=100
: 23+x=100
; ecuatie2.out
; ecuatie2out.txt
: Datele introduse corespund restricțiilor impuse.
: 1
: 1
: 77
: 77
== Exemplul 2 ==
== Exemplul 2 ==
; ecuatie2.in
; ecuatie2in.txt
: x*20=1400
: x*20=1400
; ecuatie2.out
; ecuatie2out.txt
: Datele introduse corespund restricțiilor impuse.
: 6
: 6
: 70
: 70
== Exemplul 3 ==
== Exemplul 3 ==
; ecuatie2.in
; ecuatie2in.txt
: 15:x=3
: 15:x=3
; ecuatie2.out
; ecuatie2out.txt
: Datele introduse corespund restricțiilor impuse.
: 7
: 7
: 5
: 5
== Exemplul 4 ==
; ecuatie2in.txt
: x+ = 100
; ecuatie2out.txt
: Datele introduse nu corespund restricțiilor impuse.
== Explicații ==
== Explicații ==
Pentru primul exemplu, ecuația este de tipul '''1'''. Soluția ecuaţiei '''23+x=100''' este '''x=77'''.
Pentru primul exemplu, ecuația este de tipul '''1'''. Soluția ecuaţiei '''23+x=100''' este '''x=77'''.
Line 56: Line 64:
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def solve_equation(equation):
# 1359 - Ecuatie 2
     if "+x=" in equation:
def validare(ecuatie1):          # functia de validare a datelor de intrare
         a, b = map(int, equation.split("+x="))
    if len(ecuatie1) > 1000:
         return (1, b - a)
        raise ValueError
     elif "x+" in equation:
 
         a, b = map(int, equation.split("x+"))
    # daca datele de intrare nu corespund, ridicam eroarea ValueError
         return (2, b - a)
    for caracter in ecuatie1:
     elif "-x=" in equation:
        if not (caracter.isdigit() or caracter in ['+', '-', '*', ':', 'x', '=']):
         a, b = map(int, equation.split("-x="))
            raise ValueError
         return (3, a - b)
 
     elif "x-" in equation:
    # extract a and b from the equation
         a, b = map(int, equation.split("x-"))
    parts = ecuatie1.split('=')
         return (4, a + b)
    a = int(''.join(filter(str.isdigit, parts[0])))
     elif "*x=" in equation and int(equation.split("*x=")[1]) % int(equation.split("*x=")[0]) == 0:
    b = int(''.join(filter(str.isdigit, parts[1])))
         a, b = map(int, equation.split("*x="))
 
         return (5, b // a)
    # check if a and b are within the given range
     elif "x*" in equation:
    if not (1 <= a <= 30000 and 1 <= b <= 30000):
         _, temp = equation.split("x*")
        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("="))
         a, b = map(int, temp.split("="))
         return (6, b // a)
         return 6, b // a
     elif ":x=" in equation and int(equation.split(":x=")[0]) % int(equation.split(":x=")[1]) == 0:
     elif ":x=" in ecuatie1 and int(ecuatie1.split(":x=")[0]) % int(ecuatie1.split(":x=")[1]) == 0:
         a, b = map(int, equation.split(":x="))
         a, b = map(int, ecuatie1.split(":x="))
         return (7, a // b)
         return 7, a // b
     elif "x:" in equation:
     elif "x:" in ecuatie1:
         _, temp = equation.split("x:")
         _, temp = ecuatie1.split("x:")
         a, b = map(int, temp.split("="))
         a, b = map(int, temp.split("="))
         return (8, a // b)
         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)


def main():
    # din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam
     with open('ecuatie2.in', 'r') as f:
     try:
         equation = f.readline().strip()
         ecuatie = file_in.readline()     # citirea ecuatiei se face ca sir de caractere


    type_of_equation, solution = solve_equation(equation)
        validare(ecuatie)                # apelul functiei de validare
        tip_ecuatie, solutie = rezolva_ecuatie(ecuatie)               # apelul functiei de rezolvare


    with open('ecuatie2.out', 'w') as f:
         file_out.write(str(tip_ecuatie) + '\n')
         f.write(str(type_of_equation) + '\n')
         file_out.write(str(solutie) + '\n')
         f.write(str(solution) + '\n')


if __name__ == "__main__":
    except ValueError:
    main()
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")


</syntaxhighlight>
</syntaxhighlight>

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>