-
Notifications
You must be signed in to change notification settings - Fork 0
/
tp_final.py
613 lines (571 loc) · 24 KB
/
tp_final.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
#Trabajo Grupal Final - Ceballos - Yaben
#Calculadora Clásica Trabajo Grupal Final - Ceballos - Yaben
#Función que indica si el valor ingresado es un flotante o un signo '='
def float_val(entrada):
if entrada == '=':
valido = True
else:
try:
entrada = float(entrada)
except:
valido = False
else:
valido = True
return valido
#Función que indica si el operador ingresado es uno válido
def op_val(entrada2):
if entrada2 == '+':
valido2 = True
elif entrada2 == '-':
valido2 = True
elif entrada2 == '*':
valido2 = True
elif entrada2 == '/':
valido2 = True
elif entrada2 == '=':
valido2 = True
else:
valido2 = False
return valido2
#Cuerpo principal de la calculadora, se ejecuta desde el selector
def clasica():
op = ''
base = input("Ingrese número: ") #Ingreso el número que va a servir como base
while not float_val(base):
base = input("Ingrese un número válido: ") #Mientras el número no sea un float o un signo igual, lo sigo pidiendo
if base != '=': #Si la base ingresada no es un igual, lo convierto a float y pido operando
base = float(base)
while op != '=': #Comienzo a operar. Se puede salir ingresando un igual en cualquier momento (cuando se pide un operando o un número)
op = input("Ingrese un operando (+, -, *, /, =): ")
while not op_val(op):
op = input("Ingrese un operando válido (+, -, *, /, =): ") #Si el operando ingresado no válido, lo sigo pidiendo
if op != '=': #Si el operando no es un igual, pido otra número para operar
if op == '/': #Separo el caso de la división para asegurarme de no poder dividir por 0
num = input("Ingrese número: ")
while (not float_val(num)):
num = input("Ingrese un número válido: ") #Si el número no es un float o un signo igual, lo sigo pidiendo
if num != '=':
if num == '0': #Si el número ingresado es un 0, salgo de la calculadora e imprimo un mensaje de error
op = '='
base = "Error al dividir por 0"
else:
num = float(num) #Si el número es válido, hago la división
base = base/num
else:
op = '='
else:
num = input("Ingrese número: ") #Si el operador no es el de división, pido un número y hago la operación que corresponda
while not float_val(num):
num = input ("Ingrese un número válido: ") #Si el número no es un flotante o un signo igual, lo sigo pidiendo
if num != '=':
num = float(num)
if op == '+':
base = base + num
elif op == '-':
base = base - num
else:
base = base * num
else:
op = '='
print(f"Resultado: {base}") #Imprimo el resultado de las operaciones cuando ingreso '=' o el mensaje de error en caso de dividir por 0
else:
print("Resultado: 0") #Imprimo 0 como resultado en caso de ingresar un '=' inmediatamente después de iniciar la calculadora
#Calculadora de Fracciones Trabajo Grupal Final - Ceballos - Yaben
#Esta función ve si el número ingresado es una fracción.
def fraccionValida(n):
try:
if n != "=":
#Descomponer fracción
resultado = 0
longitud = len(n)
inicio = 0
ubicacionBarra = 0
hayBarra = False
while inicio < longitud:
#print(f"Caracter: '{n[inicio:inicio+1]}'")
inicio = inicio + 1
if n[inicio:inicio+1] == "/":
ubicacionBarra = inicio #arrancando en 0 la cadena
hayBarra = True
#print(f"ubicacionBarra: '{ubicacionBarra}'")
if hayBarra:
numerador = n[:ubicacionBarra]
numeradorInt = int(numerador) ##################################
denominador = n[ubicacionBarra+1:]
denominadorInt = int(denominador) ##################################
resultado = int(numerador) / int(denominador)
#print(f"resultado: '{resultado}'")
else:
#puede ser que que sea un numero sin denominador
resultado = int(n) / 1
#print(f"resultado: '{resultado}'")
return True
else:
return True
except ValueError:
print(f"El valor no es valido")
return False
#Esta función ve si el número ingresado es una fracción pero no se da ningun mensaje.
def fraccionValidaST(n):
try:
if n != "=":
#Descomponer fracción
resultado = 0
longitud = len(n)
inicio = 0
ubicacionBarra = 0
hayBarra = False
while inicio < longitud:
#print(f"Caracter: '{n[inicio:inicio+1]}'")
inicio = inicio + 1
if n[inicio:inicio+1] == "/":
ubicacionBarra = inicio #arrancando en 0 la cadena
hayBarra = True
#print(f"ubicacionBarra: '{ubicacionBarra}'")
if hayBarra:
numerador = n[:ubicacionBarra]
numeradorInt = int(numerador) ##################################
denominador = n[ubicacionBarra+1:]
denominadorInt = int(denominador) ##################################
resultado = int(numerador) / int(denominador)
#print(f"resultado: '{resultado}'")
else:
#puede ser que que sea un numero sin denominador
resultado = int(n) / 1
#print(f"resultado: '{resultado}'")
return True
else:
return True
except ValueError:
return False
#Esta función devuelve el numerador de una fracción.
def fraccionNumerador(n):
try:
longitud = len(n)
inicio = 0
ubicacionBarra = 0
while inicio < longitud:
#print(f"Caracter: '{n[inicio:inicio+1]}'")
inicio = inicio + 1
if n[inicio:inicio+1] == "/":
ubicacionBarra = inicio #arrancando en 0 la cadena
#print(f"ubicacionBarra: '{ubicacionBarra}'")
if ubicacionBarra == 0:
return n
else:
return n[:ubicacionBarra]
except ValueError:
print(f"El valor '{n}' no pudo ser procesado...")
return 0
#Esta función devuelve el denominador de una fracción.
def fraccionDenominador(n):
try:
longitud = len(n)
inicio = 0
ubicacionBarra = 0
while inicio < longitud:
#print(f"Caracter: '{n[inicio:inicio+1]}'")
inicio = inicio + 1
if n[inicio:inicio+1] == "/":
ubicacionBarra = inicio #arrancando en 0 la cadena
#print(f"ubicacionBarra: '{ubicacionBarra}'")
if ubicacionBarra == 0:
return 1
else:
return n[ubicacionBarra+1:]
except ValueError:
print(f"El valor '{n}' no pudo ser procesado...")
return 0
#Esta función devuelve la suma de dos fracciones
def sumarFraccion(f1, f2):
try:
resultado = ""
numeradorTotal = 0
num1 = 0
num2 = 0
den1 = 0
den2 = 0
if f1 == "":
return f2
else:
#aca hago la suma de f1 + f2
numerador1 = fraccionNumerador(f1)
denominador1 = fraccionDenominador(f1)
numerador2 = fraccionNumerador(f2)
denominador2 = fraccionDenominador(f2)
if denominador1 != denominador2:
#Me fijo si un denominador es divisor del otro.
if (int(denominador1) % int(denominador2)) == 0 or (int(denominador2) % int(denominador1)) == 0:
if int(denominador1) > int(denominador2):
#1ra fracción
num1 = int(numerador1)
den1 = int(denominador1)
#2da fracción
num2 = int(numerador2) * (int(denominador1)/int(denominador2))
den2 = int(denominador2) * (int(denominador1)/int(denominador2))
numeradorTotal = num1 + num2
resultado = str(int(numeradorTotal)) + "/" + str(int(den1))
else:
#1ra fracción
num1 = int(numerador1) * (int(denominador2)/int(denominador1))
den1 = int(denominador1) * (int(denominador2)/int(denominador1))
#2da fracción
num2 = int(numerador2)
den2 = int(denominador2)
numeradorTotal = num1 + num2
resultado = str(int(numeradorTotal)) + "/" + str(int(den1))
else:
#1ra fracción
num1 = int(numerador1) * int(denominador2)
den1 = int(denominador1) * int(denominador2)
#2da fracción
num2 = int(numerador2) * int(denominador1)
den2 = int(denominador2) * int(denominador1)
numeradorTotal = num1 + num2
resultado = str(int(numeradorTotal)) + "/" + str(int(den1))
else:
numeradorTotal = int(numerador1) + int(numerador2)
resultado = str(int(numeradorTotal)) + "/" + str(int(denominador1))
return resultado
except ValueError:
print(f"La suma de fracciones no pudo ser procesada...")
return ""
#Esta función devuelve la resta de dos fracciones
def restarFraccion(f1, f2):
try:
resultado = ""
numeradorTotal = 0
num1 = 0
num2 = 0
den1 = 0
den2 = 0
if f1 == "":
return f2
else:
#aca hago la resta de f1 - f2
numerador1 = fraccionNumerador(f1)
denominador1 = fraccionDenominador(f1)
numerador2 = fraccionNumerador(f2)
denominador2 = fraccionDenominador(f2)
if denominador1 != denominador2:
#Me fijo si un denominador es divisor del otro.
if (int(denominador1) % int(denominador2)) == 0 or (int(denominador2) % int(denominador1)) == 0:
if int(denominador1) > int(denominador2):
#1ra fracción
num1 = int(numerador1)
den1 = int(denominador1)
#2da fracción
num2 = int(numerador2) * (int(denominador1)/int(denominador2))
den2 = int(denominador2) * (int(denominador1)/int(denominador2))
numeradorTotal = num1 - num2
resultado = str(int(numeradorTotal)) + "/" + str(int(den1))
else:
#1ra fracción
num1 = int(numerador1) * (int(denominador2)/int(denominador1))
den1 = int(denominador1) * (int(denominador2)/int(denominador1))
#2da fracción
num2 = int(numerador2)
den2 = int(denominador2)
numeradorTotal = num1 - num2
resultado = str(int(numeradorTotal)) + "/" + str(int(den1))
else:
#1ra fracción
num1 = int(numerador1) * int(denominador2)
den1 = int(denominador1) * int(denominador2)
#2da fracción
num2 = int(numerador2) * int(denominador1)
den2 = int(denominador2) * int(denominador1)
numeradorTotal = num1 - num2
resultado = str(int(numeradorTotal)) + "/" + str(int(den1))
else:
numeradorTotal = int(numerador1) - int(numerador2)
resultado = str(int(numeradorTotal)) + "/" + str(int(denominador1))
return resultado
except ValueError:
print(f"La resta de fracciones no pudo ser procesada...")
return ""
#Esta función devuelve la multiplicación de dos fracciones
def multiplicarFraccion(f1, f2):
try:
resultado = ""
numeradorTotal = 0
num1 = 0
num2 = 0
den1 = 0
den2 = 0
if f1 == "":
return f2
else:
numerador1 = fraccionNumerador(f1)
denominador1 = fraccionDenominador(f1)
numerador2 = fraccionNumerador(f2)
denominador2 = fraccionDenominador(f2)
num = int(numerador1) * int(numerador2)
den = int(denominador1) * int(denominador2)
resultado = str(int(num)) + "/" + str(int(den))
return resultado
except ValueError:
print(f"La multiplicación de fracciones no pudo ser procesada...")
return ""
#Esta función devuelve la división de dos fracciones
def dividirFraccion(f1, f2):
try:
resultado = ""
numeradorTotal = 0
num1 = 0
num2 = 0
den1 = 0
den2 = 0
if f1 == "":
return f2
else:
numerador1 = fraccionNumerador(f1)
denominador1 = fraccionDenominador(f1)
numerador2 = fraccionNumerador(f2)
denominador2 = fraccionDenominador(f2)
num = int(numerador1) * int(denominador2)
den = int(denominador1) * int(numerador2)
resultado = str(int(num)) + "/" + str(int(den))
return resultado
except ValueError:
print(f"La división de fracciones no pudo ser procesada...")
return ""
#Calculadora de Fracciones
def fracciones():
print('Calculadora de Fracciones')
print("Operaciones disponibles:")
print("1: Suma")
print("2: Resta")
print("3: Multiplicación")
print("4: División")
operacion = input()
#print(f"Operación '{operacion}'")
resultado = ""
if operacion != "1" and operacion != "2" and operacion != "3" and operacion != "4":
print("Ingrese una opción valida.")
operacion = "5"
#Suma
if int(operacion) == 1:
fraccion = ""
fraccion = input("Ingrese numero:")
if fraccionDenominador(fraccion) != "0":
if fraccionValida(fraccion):
while fraccion != "=":
resultado = sumarFraccion(resultado, fraccion)
if fraccionValidaST(resultado):
fraccion = input("Ingrese numero:")
if fraccionValida(fraccion):
if fraccionDenominador(fraccion) == "0":
print("El denominador no puede ser cero.")
fraccion = "="
resultado = ""
else:
fraccion = "="
if fraccionValidaST(resultado):
if resultado != "":
print(f"Resultado {resultado}")
else:
print("El denominador no puede ser cero.")
#Resta
if int(operacion) == 2:
fraccion = ""
fraccion = input("Ingrese numero:")
if fraccionDenominador(fraccion) != "0":
if fraccionValida(fraccion):
while fraccion != "=":
resultado = restarFraccion(resultado, fraccion)
if fraccionValidaST(resultado):
fraccion = input("Ingrese numero:")
if fraccionValida(fraccion):
if fraccionDenominador(fraccion) == "0":
print("El denominador no puede ser cero.")
fraccion = "="
resultado = ""
else:
fraccion = "="
if fraccionValidaST(resultado):
if resultado != "":
print(f"Resultado {resultado}")
else:
print("El denominador no puede ser cero.")
#Multiplicación
if int(operacion) == 3:
fraccion = ""
fraccion = input("Ingrese numero:")
if fraccionNumerador(fraccion) != "0":
if fraccionDenominador(fraccion) != "0":
if fraccionValida(fraccion):
while fraccion != "=":
resultado = multiplicarFraccion(resultado, fraccion)
if fraccionValidaST(resultado):
fraccion = input("Ingrese numero:")
if fraccionNumerador(fraccion) != "0":
#if fraccionValida(fraccion):
if fraccionDenominador(fraccion) == "0":
print("El denominador no puede ser cero.")
fraccion = "="
resultado = ""
else:
print(f"Resultado 0")
fraccion = "="
resultado = ""
else:
fraccion = "="
if fraccionValidaST(resultado):
if resultado != "":
print(f"Resultado {resultado}")
else:
print("El denominador no puede ser cero.")
else:
print(f"Resultado 0")
#División
if int(operacion) == 4:
fraccion = ""
fraccion = input("Ingrese numero:")
if fraccionNumerador(fraccion) != "0":
if fraccionDenominador(fraccion) != "0":
if fraccionValida(fraccion):
while fraccion != "=":
resultado = dividirFraccion(resultado, fraccion)
if fraccionValidaST(resultado):
fraccion = input("Ingrese numero:")
if fraccionDenominador(fraccion) != "0":
if fraccionValida(fraccion):
#if fraccionDenominador(fraccion) == "0":
if fraccionNumerador(fraccion) == "0":
print("El denominador no puede ser cero.")
fraccion = "="
resultado = ""
else:
print("El denominador no puede ser cero.")
fraccion = "="
resultado = ""
else:
fraccion = "="
if fraccionValidaST(resultado):
if resultado != "":
print(f"Resultado {resultado}")
else:
print("El denominador no puede ser cero.")
else:
print(f"Resultado 0")
#Calculadora Conversora Trabajo Grupal Final - Ceballos - Yaben
#Función que verifica que la entrada sea un entero positivo
def es_int(valor):
try:
valor = int(valor)
except:
valido = False
else:
if valor >= 0:
valido = True
else:
valido = False
return valido
#Función que verifica que la opción elegida sea válida
def op_val_conversora(opcion):
if opcion == '1':
valido2 = True
elif opcion == '2':
valido2 = True
elif opcion == '3':
valido2 = True
else:
valido2 = False
return valido2
#Función que convierte un número en base decimal en un string en base 2 u 8 y lo imprime
def conv_bin_oct(numero, base):
orig = numero
resul = ""
while numero >= base:
resul = str(numero%base) + resul
numero = numero//base
resul = str(numero) + resul
print (f"{orig} en base {base} es: {resul}")
#Función que convierte digitos en base decimal a caracteres en base hexadecimal
def dig_hex(digito):
if digito < 10:
hexa = str(digito)
elif digito == 10:
hexa = 'A'
elif digito == 11:
hexa = 'B'
elif digito == 12:
hexa = 'C'
elif digito == 13:
hexa = 'D'
elif digito == 14:
hexa = 'E'
elif digito == 15:
hexa = 'F'
return hexa
#Función que convierte un número en base decimal en un sting en base 16 y lo imprime
def conv_hex(numero):
orig = numero
resul = ""
while numero >= 16:
resul = dig_hex(numero%16) + resul
numero = numero//16
resul = dig_hex(numero) + resul
print (f"{orig} en base 16 es: {resul}")
#Cuerpo principal de la calculadora, se ejecuta desde el selector
def conversora():
numero = input("Ingrese el número a convertir: ") #Pido el número a convertir, verificando que sea un entero positivo
while not es_int(numero):
numero = input("Ingrese un valor válido (entero positivo): ")
numero = int(numero)
print (" ___________________________________________ \n" #Imprimo la interfaz de selección
"|Seleccione base a la que quiere convertir: |\n"
"|1. Bin |\n"
"|2. Hex |\n"
"|3. Oct |\n"
"|___________________________________________|\n")
op = input() #Ingreso la opción elegida
while not op_val_conversora(op): #Verifico que la opción ingresada sea válida
op = input("Seleccione una opción válida (1-3): ")
if op == '1': #Derivo la opción a la función correspondiente
conv_bin_oct(numero, 2)
elif op == '2':
conv_hex(numero)
else:
conv_bin_oct(numero, 8)
#Selector de calculadoras Trabajo Grupal Final - Ceballos - Yaben
#Importo los módulos de cada calculadora
#import calc_clasica as clas
#import calc_fracciones as frac
#import calc_conversora as conv
#Función que imprime la interfaz del selector de calculadoras
def mostrar_interfaz():
print(" _______________________________\n"
"|Ingrese función deseada: |\n"
"|1. Calculadora Clásica |\n"
"|2. Calculadora de Fracciones |\n"
"|3. Calculadora de Conversiones |\n"
"|4. Salir |\n"
"|_______________________________|")
#Función que indica si la opción elegida es válida o no
def check_val(valor):
if valor == '1':
valido = True
elif valor == '2':
valido = True
elif valor == '3':
valido = True
elif valor == '4':
valido = True
else:
valido = False
return valido
#Cuerpo principal, donde el usuario ingresa la opción deseada
opcion = '0'
while opcion != '4':
mostrar_interfaz()
opcion = input("Función: ")
while not check_val(opcion): #Verifico que la opción elegida sea una válida
opcion = input("Ingrese una función correcta (1-4): ")
if opcion == '1':
clasica()
elif opcion == '2':
fracciones()
elif opcion == '3':
conversora()