def main() -> None: calls = {} while True: print("""1) Registar chamada 2) Ler ficheiro 3) Listar clientes 4) Fatura 5) Terminar""") op = input("Opção? ") if op == "1": registar_chamada(calls) elif op == "2": fname = input("Ficheiro? ") ler_ficheiro(calls, fname) elif op == "3": listar_clientes(calls) elif op == "4": phone_number = input("Telefone? ") fatura(calls, phone_number) elif op == "5": exit(0) else: print("Opção inválida\n") def registar_chamada(calls: dict) -> None: caller_phone_number = input("Telefone origem? ") while not validate_phone_number(caller_phone_number): caller_phone_number = input("Telefone origem? ") destination_phone_number = input("Telefone destino? ") while not validate_phone_number(destination_phone_number): destination_phone_number = input("Telefone destino? ") duration = input("Duração (s)? ") while not duration.isdigit(): duration = input("Duração (s)? ") duration = int(duration) if caller_phone_number not in calls: calls[caller_phone_number] = {} if destination_phone_number not in calls[caller_phone_number]: calls[caller_phone_number][destination_phone_number] = [] calls[caller_phone_number][destination_phone_number] += [int(duration)] def ler_ficheiro(calls: dict, fname: str) -> None: try: with open(fname, 'r') as f: for line in f: line = line.strip() if line: caller_phone_number, destination_phone_number, duration = line.split('\t') if caller_phone_number not in calls: calls[caller_phone_number] = {} if destination_phone_number not in calls[caller_phone_number]: calls[caller_phone_number][destination_phone_number] = [] calls[caller_phone_number][destination_phone_number] += [int(duration)] except FileNotFoundError: print("Ficheiro não encontrado\n") def listar_clientes(calls: dict) -> None: print("Clientes:", end='\t') for caller_phone_number in calls: print(caller_phone_number, end='\t') print() def fatura(calls: dict, phone_number: str) -> None: if phone_number not in calls: print("Cliente não existe\n") return total = 0 print("Fatura do cliente", phone_number) print(f"{'Destino':<15}{'Duração':>10}{'Custo':>10}") for destination_phone_number in calls[phone_number]: for duration in calls[phone_number][destination_phone_number]: if destination_phone_number.startswith("+"): call_cost = duration * 0.8 / 60 elif destination_phone_number.startswith("2"): call_cost = duration * 0.02 / 60 elif phone_number[:2] == destination_phone_number[:2]: call_cost = duration * 0.04 / 60 else: call_cost = duration * 0.1 / 60 total += call_cost print(f"{destination_phone_number:<20}{duration:>10}{call_cost:>12.2f}") print(f"{'Total':>30}{total:>12.2f}") def validate_phone_number(phone_number: str) -> bool: return phone_number.isdigit() and len(phone_number) >= 3 if phone_number[0] != "+" else phone_number[1:].isdigit() and len(phone_number[1:]) >= 3 if __name__ == '__main__': main()