1359 - Ecuatie 2: Difference between revisions
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 ''' | 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 ''' | 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 ''' | 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 == | ||
; | ; ecuatie2in.txt | ||
: 23+x=100 | : 23+x=100 | ||
; | ; ecuatie2out.txt | ||
: Datele introduse corespund restricțiilor impuse. | |||
: 1 | : 1 | ||
: 77 | : 77 | ||
== Exemplul 2 == | == Exemplul 2 == | ||
; | ; ecuatie2in.txt | ||
: x*20=1400 | : x*20=1400 | ||
; | ; ecuatie2out.txt | ||
: Datele introduse corespund restricțiilor impuse. | |||
: 6 | : 6 | ||
: 70 | : 70 | ||
== Exemplul 3 == | == Exemplul 3 == | ||
; | ; ecuatie2in.txt | ||
: 15:x=3 | : 15:x=3 | ||
; | ; 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 | # 1359 - Ecuatie 2 | ||
if "+x=" in | def validare(ecuatie1): # functia de validare a datelor de intrare | ||
a, b = map(int, | if len(ecuatie1) > 1000: | ||
return | raise ValueError | ||
elif "x+" in | |||
a, b = map(int, | # daca datele de intrare nu corespund, ridicam eroarea ValueError | ||
return | for caracter in ecuatie1: | ||
elif "-x=" in | if not (caracter.isdigit() or caracter in ['+', '-', '*', ':', 'x', '=']): | ||
a, b = map(int, | raise ValueError | ||
return | |||
elif "x-" in | # extract a and b from the equation | ||
a, b = map(int, | parts = ecuatie1.split('=') | ||
return | a = int(''.join(filter(str.isdigit, parts[0]))) | ||
elif "*x=" in | b = int(''.join(filter(str.isdigit, parts[1]))) | ||
a, b = map(int, | |||
return | # check if a and b are within the given range | ||
elif "x*" in | if not (1 <= a <= 30000 and 1 <= b <= 30000): | ||
_, temp = | 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 | return 6, b // a | ||
elif ":x=" in | elif ":x=" in ecuatie1 and int(ecuatie1.split(":x=")[0]) % int(ecuatie1.split(":x=")[1]) == 0: | ||
a, b = map(int, | a, b = map(int, ecuatie1.split(":x=")) | ||
return | return 7, a // b | ||
elif "x:" in | elif "x:" in ecuatie1: | ||
_, temp = | _, temp = ecuatie1.split("x:") | ||
a, b = map(int, temp.split("=")) | a, b = map(int, temp.split("=")) | ||
return | 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> | </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>
- 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>