Use a 30 x 3 array using class, def, parameters - Python

Asked

Viewed 38 times

-2

The intention here is to use a matrix capable of storing in each position all the information related to a given service (number, value, service code, customer code). Each row represents one day of the month. So, I must use a 30 3 matrix. Follow the code:

class TipoServico:
    codigo = 0
    descricao = ''

class PrestacaoServico:
    numero = 0
    valor = 0.0
    cod_servico = 0
    cod_cliente = 0

def cadastrar_tipos_servicos(vets):
    for i in range(4):
        s = TipoServico()
        s.codigo = input('Digite o código do serviço: ')
        s.descricao = input('Digite a descrição do serviço: ')
        vets.append(s)
    return vets

def consultar_tipos_servicos(vets):
    for i in range(len(vets)):
        print('Código: ',vets[i].codigo,'\tDescrição do servico: ',vets[i].descricao)

def servicos_prestados(vetm):
  x = PrestacaoServico()
  total_de_dias = 30
  total_de_servicos = 3
  for lin in range(total_de_dias):
    for col in range(total_de_servicos):
      x.numero = int(input('Informe o número: '))
      x.valor = float(input('Informe o valor: R$'))
      x.cod_servico = int(input('Informe o código do serviço: '))
      x.cod_cliente = int(input('Informe o código do cliente: '))
      vetm.append(x)
    break
  return vetm

def consultar_servicos_prestados(vetm):
  for i in range(len(vetm)):
    print('Número: ',vetm[i].numero,'\tValor: R$',vetm[i].valor,'\tCódigo do serviço:',vetm[i].cod_servico,'\tCódigo do cliente:',vetm[i].cod_cliente)

def main():
    vetServico = []
    matriz = []
    while True:
        print('Menu de opções')
        print('1. Cadastrar os tipos de serviços')
        print('2. Mostrar todos os tipos de serviço')
        print('3. Cadastrar os serviços prestados')
        print('4. Mostrar todos os serviços prestados')
        print('5. Mostrar os serviços prestados em determinado dia')
        print('6. Mostrar os serviços prestados dentro de um intervalo de valor')
        print('7. Mostrar um relatório geral (separado por dia)')
        print('8. Sair')
        opcao = int(input('Digite a opção desejada: '))
        if opcao == 1:
            vetServico = cadastrar_tipos_servicos(vetServico)
        elif opcao == 2:
            consultar_tipos_servicos(vetServico)
        elif opcao == 3:
            matriz = servicos_prestados(matriz)
        elif opcao == 4:
            consultar_servicos_prestados(matriz)
        elif opcao == 5:
            print('Opção 5')
        elif opcao == 6:
            print('Opção 6')
        elif opcao == 7:
            print('Opção 7')
        else:
            break
main()
  • and what is the question? Is there a mistake?

  • When I ask to show all the services provided, it results in 3x: Number: 30 Value: R$ 300.0 Service Code: 3 Client code: 3 .

  • See if you decide to change the line below opcao == 1 of vetServico = cadastrar_tipos_servicos(vetServico) for vetServico.append(cadastrar_tipos_servicos(vetServico))&#That, because you have to add ``to your list.

  • The problem is in option 3 and 4, that is, in def servicos_prestados(vetm) and def consultar_servicos_prestados(vetm). Option 1 and 2 is working normally.

1 answer

0


Based on the comments I understood the question.

A programmer-defined class is a type mutable

Read this post for more details.

Modify the function servicos_prestados for

def servicos_prestados(vetm):
  total_de_dias = 30
  total_de_servicos = 3
  for lin in range(total_de_dias):
    for col in range(total_de_servicos):
      x = PrestacaoServico()
      x.numero = int(input('Informe o número: '))
      x.valor = float(input('Informe o valor: R$'))
      x.cod_servico = int(input('Informe o código do serviço: '))
      x.cod_cliente = int(input('Informe o código do cliente: '))
      vetm.append(x)
    break    # entendo que este break é para questões de teste
  return vetm

Expliocation:

Being a user defined class a changeable type, the last value overrides the previous

Code similar to yours

class MinhaClass:
    def __init__(self):
        self.valor = None

l = []
meu_object = MinhaClass()
for i in range(3):
    meu_object.valor = i
    l.append(meu_object)
    print(l)

The output of this program will be something like

[<__main__.MinhaClass object at 0x7f8a8d87bb50>]
[<__main__.MinhaClass object at 0x7f8a8d87bb50>, <__main__.MinhaClass object at 0x7f8a8d87bb50>]
[<__main__.MinhaClass object at 0x7f8a8d87bb50>, <__main__.MinhaClass object at 0x7f8a8d87bb50>, <__main__.MinhaClass object at 0x7f8a8d87bb50>]

Note that Minhaclass within the list always points to the same memory address

So, look at the result:

>>> [o.valor for o in l]
[2, 2, 2]

Note: 2 is the last value because of the range.

Modifying the code

class MinhaClass:
    def __init__(self):
        self.valor = None

l = []
for i in range(3):
    meu_object = MinhaClass()   # reaproveitando o nome da variável, mas na verdade, criando uma nova
    meu_object.valor = i
    l.append(meu_object)
    print(l)

The output of this code would be something like

[<__main__.MinhaClass object at 0x7f8a8d87bc10>]
[<__main__.MinhaClass object at 0x7f8a8d87bc10>, <__main__.MinhaClass object at 0x7f8a8d87bb50>]
[<__main__.MinhaClass object at 0x7f8a8d87bc10>, <__main__.MinhaClass object at 0x7f8a8d87bb50>, <__main__.MinhaClass object at 0x7f8a8d87bbd0>]

Values in the list as expected

>>> [o.valor for o in l]
[0, 1, 2]

I hope I’ve helped

Browser other questions tagged

You are not signed in. Login or sign up in order to post.