Você está na página 1de 19

Mdulo II Unidade 2.

1 Listas
Com as listas, iniciamos o estudo das estruturas de dados lineares. Nas estruturas ditas lineares, os dados so montados mantendo-se um nico sucessor para cada um deles. Na verdade, as listas so bem conhecidas nossas. Dentre vrios exemplos que podemos citar (uma lista de compras, uma relao de alunos de uma turma etc.), tomemos o Exemplo 1.1 (inserido na introduo ao Mdulo I). Vimos, naquele caso, que a soluo do problema dependia da organizao dos objetos de interesse: as contas de luz. Antes, estavam espalhadas e misturadas com outros documentos numa gaveta. No citado exemplo das contas de luz, para uma eficiente busca de uma das contas, o acesso a cada uma delas precisou ser "disciplinado". O simples fato de sequenciar, colocando uma conta sobre a outra, j se produz o que podemos chamar de lista. Depois da organizao, cada conta passou a ter um nico sucessor (com exceo da ltima, claro), resultando em maior facilidade para sua manipulao em operaes, como: retirar uma conta da lista, inserir, buscar uma conta na sequncia em que esto colocadas etc. Percebemos tambm que a colocao, segundo uma ordem, mais um ponto a favor da eficincia dessas operaes.

2.1.1Conceituao
Numa lista, possvel retirar e inserir novos componentes em qualquer um dos seus pontos. Portanto, o conjunto das contas de luz do Exemplo 1.1, aps sua organizao, um caso tpico. Consideremos que as contas so colocadas em ordem por ms de faturamento (por ano e, em seguida, por ms em cada ano). Observamos, no processo de ordenao, que uma conta pode ser retirada e inserida em qualquer ponto da lista, de modo que seja mantida a ordem da conta mais antiga para a mais recente.

Lista sequencial e lista encadeada


Para providenciar os algoritmos de manipulao de uma lista, necessrio decidir sobre as condies da futura implementao, pois interferem na maneira de execuo das operaes bsicas (por exemplo, insero ou remoo de elementos). Uma das condies relativa disposio fsica na memria do computador. Sob esse critrio, uma lista pode ser classificada como sequencial ou encadeada. Lista sequencial. Em uma lista sequencial, os dados esto dispostos como os elementos de um vetor (ou seja, em posies vizinhas na memria), como no exemplo seguinte.

Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.1

Exemplo 2.1 Considere-se uma lista de nomes e respectivos telefones de clientes em uma agenda telefnica de um pequeno empresrio (este caso foi abordado como exerccio no Mdulo I, Subunidade 1.1.1). O registro de cada cliente ter o formato:

Montados segundo uma lista sequencial, eles estaro dispostos em posies contguas da memria do computador, conforme est representada a lista L abaixo:

Sob a disposio sequencial, vizinhos lgicos na lista so tambm vizinhos fsicos na memria do computador. Por essa razo, operaes de insero de novos elementos ao longo da lista, ou remoo de algum deles, requererem o deslocamento de vrios elementos fisicamente vizinhos. Desejando-se, por exemplo, inserir um novo cliente na segunda posio da lista, todos os elementos a partir dessa posio devem ser deslocados para a direita como na figura abaixo.

E o resultado ser:

Lista encadeada. Em uma lista encadeada, os dados podem no estar em posies contguas da memria. Os blocos de dados so dispostos de modo que cada bloco contm a indicao do seguinte, como no exemplo abaixo.

Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.2

Exemplo 2.2 Tomemos a lista de clientes do exemplo anterior. Para se construir uma lista encadeada com estes dados, o registro de um cliente dever conter mais um campo, que servir de "ponteiro" para o prximo cliente, ou seja,

O campo prox contm uma referncia ao prximo cliente da lista. Construmos a lista E, encadeando elementos deste tipo (cada um indicando qual o cliente seguinte):

E guarda uma referncia ao primeiro cliente e este que tem (no seu campo prox) o endereo do segundo, o segundo cliente apontar para o terceiro e assim por diante. O ltimo cliente tem o seu campo prox igual a None (usando a notao da linguagem Python para referncias nulas) para indicar que no aponta para mais nenhum cliente. Sob essa disposio, vizinhos lgicos (que obedecem sequncia das ligaes) no necessariamente so vizinhos fsicos, pois a restrio de contiguidade na memria do computador no existe. Os blocos s precisam ser localizados pelo seu antecessor e apontar para seu sucessor. Por essa razo, executar insero ou remoo de elementos ao longo da lista no exige o deslocamento de blocos de dados. A manipulao das ligaes o bastante. Como exemplo, a figura abaixo mostra uma sequncia de operaes para inserir um novo cliente (chamado Novo) na segunda posio da lista.

Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.3

Lista esttica e lista dinmica


Considerando o modo de alocao de memria, as listas so classificadas como estticas e dinmicas. Lista esttica. Quando uma lista recebe uma implementao esttica, a quantidade total de memria abrangida pelos dados conhecida previamente e no muda durante toda a execuo do programa. Os vetores (no incluindo a implementao em Python que estamos adotando, ou quando, propositalmente, no se deseje variar o tamanho do vetor durante a execuo do programa) podem ser considerados listas estticas. Lista dinmica. Numa implementao dinmica, a quantidade de memria utilizada pelos dados do programa durante a execuo varivel. Por exemplo, ao utilizarmos listas da linguagem Python como base, ganhamos o direito de incrementar elementos alm daqueles definidos no incio do programa. Essa modificao de tamanho acontece durante a execuo do programa. Isso caracteriza uma lista dinmica. Por exemplo, no Experimento 02, da Subunidade 1.2.2, a lista (chamada naquele exemplo de vetor) iniciada com v = [] ganha novos elementos digitados pelo usurio quando o programa est em execuo. Observao: Neste curso, particularmente, vamos nos concentrar nas listas sequenciais dinmicas. O objetivo simplificar a aplicao dos conceitos e aproveitar determinados recursos disponveis na linguagem de programao Python adotada neste curso.

Exerccio
1 - Consta no Exemplo 2.1 uma descrio grfica da operao de insero de um elemento numa lista sequencial, L. O tipo registro Cliente representa um elemento da lista: Tipo_registro Cliente: Nome (caracteres) Fone (caracteres) Fim_registro A lista L pode ser representada por t elementos Cliente indexados (um vetor de registros Cliente ver Subunidade 1.1.1) da seguinte maneira: L[0], L[1], L[2], ..., L[t-1] Use uma linguagem simples para descrever os passos para se fazer a insero de um novo elemento no incio da lista, orientando-se pelo que est descrito na figura do Exemplo 2.1. 2 - O Exemplo 2.2 mostra uma representao grfica de uma lista encadeada, E, e de uma operao de insero nesta. Represente um elemento da lista por Tipo_registro Cliente: Nome (caracteres) Fone (caracteres) prox (do tipo Cliente) Fim_registro

Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.4

A lista E representada pelo seu primeiro elemento. No h ndices, pois o campo prox de E indicar o segundo elemento, o prox do segundo informar qual o terceiro, e assim por diante. Logo, s ser possvel localizar elementos e navegar na lista se o acesso for feito a partir da sua cabea que o elemento indicado por E. Tomando a figura do Exemplo 2.2 como base e chamando o novo elemento de Novo, escreva os passos para inserir esse elemento no incio da lista.

2.1.2O TAD lista


Conforme sabemos, para se definir um tipo abstrato de dado, devem-se determinar os atributos (quais so os dados propriamente) e o conjunto das operaes sobre esses atributos (a interface com suas funes). Os atributos de uma lista so, basicamente, seus elementos e seu tamanho. A interface corresponde ao conjunto das operaes sobre uma lista. Classicamente, as operaes so as seguintes: Criao - Criar uma lista na memria do computador inicialmente vazia (pode preencher em seguida com dados lidos do teclado ou de um arquivo em disco). Pesquisa - Dado um elemento (do mesmo tipo da lista), determinar se este pertence lista, ou qual elemento est armazenado em uma dada posio na lista. Insero - Criar um espao na lista (numa lista sequencial) e inserir um dado elemento nesse espao. Remoo - Remover um elemento de uma dada posio da lista. Desejando-se remover algum elemento pelo seu valor de atributo, executa-se primeiramente uma pesquisa para determinar em que posio est o valor. Alterao - Uma vez localizado o elemento na lista, modificar valores de seus atributos. Outras operaes possveis so: ordenao, determinao da quantidade de elementos, concatenao de listas, partio ou determinao de sublistas etc. Podemos observar que a linguagem Python implementa listas com um semelhante conjunto de operaes. Exemplo 2.3 Consideremos que se deseja montar uma caderneta escolar eletrnica para registrar as notas dos alunos de uma turma numa certa disciplina. Cada aluno tem nome, matrcula, notas (AB1 e AB2) e quantidade de faltas, e estes dados iro conferir-lhe um resultado (aprovado, reprovado ou em reavaliao). Sabe-se que a carga horria da disciplina 120 horas, e o aluno que faltar mais que 25% desta estar automaticamente reprovado (e o resultado ser RF - reprovado por falta). Observando a mdia aritmtica das notas, o resultado ser determinado da seguinte maneira:
Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.5

A lista de alunos ser implementada, usando uma lista sequencial dinmica. Um programa dever ser projetado para gerenciar a caderneta, inserindo ou removendo elementos da lista de alunos, e consultando dados existentes. Definiremos o tipo abstrato Caderneta e este faz uso de outro tipo abstrato chamado Aluno. O TAD Aluno Os atributos sero definidos pelo tipo registro Aluno. Tipo_registro Aluno: nome (caracteres) matric (caracteres) AB1 (numrico) AB2 (numrico) n_faltas (numrico) Fim_registro A interface ser composta das trs funes a seguir. Funo NovoAluno() - Cria e retorna um registro do tipo Aluno com seus campos preenchidos via teclado: Defina NovoAluno(): al Aluno() Escrever "Nome: " ler al.nome Escrever "Matrcula: " ler al.matric Escrever "AB1: " ler al.AB1 Escrever "AB2: " ler al.AB2 Escrever "Quant.faltas: " ler al.n_faltas retornar al Fim_funo Funo Resultado(al) - Recebe um Aluno como parmetro, determina e retorna seu resultado (AP, RA, RF ou RM). Uma varivel global, chamada CH, ser declarada para conter a carga horria da disciplina: Defina Resultado(al): se al.n_faltas/CH > 0.25 ento: retornar "RF" media se media se media retornar Fim_funo (al.AB1 + al.AB2)/2.0 >= 7.0 ento: retornar "AP" >= 5.0 ento: retornar "RA" "RM" II.1.6

Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

Funo EscreveAluno(al) - Mostra os dados de um dado Aluno: Defina EscreveAluno(al): Escrever "Nome: ", al.nome Escrever "Matrcula: ",al.matric Escrever "AB1: ", al.AB1, "AB2: ", al.AB2 Escrever "Num. faltas: ", al.n_faltas Escrever "Resultado: ", Resultado(al) Fim_funo O TAD Caderneta Os atributos de Caderneta sero os de uma lista de dados do tipo Aluno: Caderneta = [] (uma lista inicialmente vazia)

Quanto interface, vo ser consideradas as operaes para insero remoo e consulta lista. Funo insereNoFim(al,ct) - Insere um dado Aluno al no fim da lista localmente denominada de ct: Defina insereNoFim(al,ct): {alocar memria aps o ltimo elemento de ct} {atribuir o elemento al a este local} Fim_funo Os passos do algoritmo insereNoFim() esto descritos na figura abaixo

Observao: No momento da implementao, os dois comandos da funo acima podero ser substitudos at por uma nica chamada de uma funo pr-definida. Funo posicaoAluno(matricula,ct) Retorna a posio na lista (localmente denominada de ct) a partir de uma informao associada a um aluno. Nesse exemplo, a informao utilizada sobre a matrcula do aluno, porm, variaes podem ser feitas,
Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.7

permitindo uma localizao baseada em qualquer dos campos de um registro Aluno (Utilizamos aqui uma lgica direcionada para o aproveitamento das caractersticas da linguagem Python): Defina posioAluno(matricula, ct): {obter uma lista com todas as matrculas dos alunos na mesma sequncia de ct} se (matricula no estiver na lista de matrculas) ento: retornar None retornar ndice de matricula na lista de matrculas Fim_funo O primeiro passo do algoritmo construir uma lista com todas as matrculas, mantendo a ordem da lista original. Se a matrcula dada estiver na lista das matrculas, bastante descobrir qual o seu ndice, e este valor ser retornado pela funo. Funo removeAluno(pos, ct) - Remove da lista ct e retorna o elemento que foi removido da posio vlida pos: Defina removeAluno(pos, ct): {salvar em aux o elemento da posio pos de ct} {deslocar os elementos de ct de um item para a esquerda a partir de pos+1} {eliminar o ltimo elemento de ct} retornar aux Fim_funo A figura seguinte descreve a lgica dos comandos da funo removeAluno():

O ltimo passo do algoritmo (apenas este no est visualizado na figura) corresponde ao retorno do elemento gravado na varivel auxiliar aux.
Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.8

Funo acessaAluno(pos, ct) - Retorna (sem remover) um elemento da lista ct que est na posio vlida pos (Observemos que esta funo tem como base uma operao simples e bem conhecida, que o acesso a elementos de vetores): Defina acessaAluno(pos, ct): retornar ct[pos] Fim_funo A soluo do problema proposto nesse exemplo pode ento ser dada pelo algoritmo abaixo: Algoritmo {Declarar o tipo abstrato Aluno} {Declarar o tipo abstrato Caderneta} 1 Cdta = Caderneta 2 faa: 2.1 Escrever 2.2 Escrever 2.3 Escrever 2.4 Escrever 2.5 Escrever 2.6 Ler opc 2.7 " (1)Inserir aluno" " (2)Remover aluno" " (3)Consultar lista" " (4)Encerrar" "Digite sua opo > "

Se (opc=="1") ento: Escrever "Digite os dados de um aluno: " insereNoFim(NovoAluno(),Cdta) Seno se (opc=="2") ento: Ler mat {l a matrcula do aluno a ser removido} indice posicaoAluno(mat, Cdta) Se (indice!=None) ento: Escrever "Aluno removido: " removido removeAluno(indice, Cdta) EscreveAluno(removido) seno: Escrever "--> Aluno inexistente! " Seno se (opc=="3") ento: Ler mat {l a matrcula do aluno a ser exibido} indice posicaoAluno(mat, Cdta) Se (indice!=None) ento: Escrever "Dados do aluno: " alunoAcessado acessaAluno(indice, Cdta) EscreveAluno(alunoAcessado) Seno: Escrever "--> Aluno inexistente! " Seno se (opc=="4") ento: (vai para o fim do programa) Seno: Escrever "Opo invlida! "

enquanto(opc!="4") Fim-Algoritmo
Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.9

O primeiro comando do algoritmo acima cria um nome compacto Cdta para a lista Caderneta apenas para tornar explcita a lista que est sendo manipulada. O comando 2.7 (dentro da estrutura faa-enquanto) uma estrutura de seleo que direciona as opes do usurio (sem muito rigor na verificao de erros). A conferncia dos passos deste algoritmo ser feita no laboratrio desta subunidade.

Laboratrio - Listas
Objetivos Conferir os algoritmos apresentados nesta unidade; Identificar e aplicar os recursos disponveis na linguagem Python para implementar o TAD Lista. Recursos e implementao Consideremos o problema do Exemplo 2.3: Desejando-se montar e gerenciar uma lista com dados de alunos, so construdos dois tipos abstratos: Aluno e Caderneta. A soluo desse problema ser explorada nos dois experimentos seguintes. Experimento 01 Neste experimento, ser construdo e testado um mdulo Python, que contm a definio do tipo abstrato Aluno. Criar um diretrio no disco, atribuindo o nome L212_01, onde sero colocados todos arquivos envolvidos nesse experimento. Iniciar o IDLE e criar o arquivo aluno.py com as linhas de cdigo a seguir: # Tipo Abstrato 'Aluno' CH = 120.0 #Carga horria da disciplina #ATRIBUTOS:----------------------------------------------------class Aluno: #Implementao do 'tipo_registro Aluno' nome = ' ' matric = ' ' AB1 = 0.0 AB2 = 0.0 n_faltas = 0 #INTERFACE:----------------------------------------------------def NovoAluno(): #cria um aluno em particular al = Aluno() al.nome = input('Nome: ') al.matric = input('Matrcula: ') al.AB1 = float(input('AB1: ')) al.AB2 = float(input('AB2: ')) al.n_faltas = int(input('Quant.faltas: ')) return al def Resultado(al): global CH #determina e retorna o resultado do aluno

Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.10

if al.n_faltas/CH > 0.25: return 'RF' media = (al.AB1 + al.AB2)/2 if media >= 7.0: return 'AP' if media >= 5.0: return 'RA' return 'RM' def EscreveAluno(al): #mostra um Aluno em particular print ('Nome:', al.nome) print ('Matrcula:',al.matric) print ('AB1: %.1f, AB2: %.1f' % (al.AB1, al.AB2)) print ('Num. faltas:', al.n_faltas) print ('Resultado:', Resultado(al)) #--------------------------------------------------------------Observemos que os cdigos das funes esto naturalmente explicados pelos algoritmos apresentados no Exemplo 2.3. Antes de integrar o mdulo aluno.py verso final do programa, vamos test-lo. Fazendo isso no prompt de comandos, usamos o comando seguinte para incluir todas as definies contidas no referido mdulo: >>> from aluno import * Para testar a funo NovoAluno(), criamos um Aluno al, atribuindo os seguintes dados de um aluno fictcio: "Manoel", "2006G0765", 6, 7.5, 20: >>> al = NovoAluno() Nome: Manoel Matrcula: 2006G0765 AB1: 6 AB2: 7.5 Quant.faltas: 20 >>> Podemos ainda conferir o preenchimento dos campos, imprimindo cada um deles ( al.nome, al.matric, al.AB1, al.AB2 e al.n_faltas). Testando a funo Resultado(): >>> Resultado(al) 'RA' >>> De fato, a mdia do aluno ((6.0+7.5)/2=6.75 est entre 5.0 e 7.0) indica que ele est em reavaliao, conforme a tabela. Testando a funo EscreveAluno() (que tambm ir conferir as primeiras funes): >>> EscreveAluno(al) Nome: Manoel Matrcula: 2006G0765 AB1: 6.0, AB2: 7.5 Num. faltas: 20
Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.11

Resultado: RA >>> Experimento 02 Inicialmente, ser criado e testado o tipo abstrato Caderneta. Em seguida, deveremos combinar o uso de Aluno e Caderneta para implementar a soluo do problema proposto no Exemplo 2.3. Criar um diretrio com o nome L212_02 onde sero colocados os arquivos envolvidos neste experimento. Neste diretrio, devero estar o arquivo aluno.py, criado no Experimento 01, e o arquivo caderneta.py, cujo cdigo est descrito abaixo: # Tipo Abstrato 'Caderneta' #ATRIBUTOS:----------------------------------------------------Caderneta = [] #INTERFACE:----------------------------------------------------def insereNoFim(al, ct = Caderneta): ct.append(al) def posicaoAluno(matricula, ct = Caderneta): matriculas = [al.matric for al in ct] if matricula not in matriculas: return None return matriculas.index(matricula) def removeAluno(pos, ct = Caderneta): return ct.pop(pos) def acessaAluno(pos, ct = Caderneta): return ct[pos] #--------------------------------------------------------------Os cdigos das funes esto de acordo com os algoritmos do TAD Caderneta apresentadas no Exemplo 2.3. Podemos observar que o uso da linguagem Python oferece vantagens quanto quantidade e simplicidade de comandos. Outra observao importante sobre o parmetro de cada funo, que referencia a lista de alunos Caderneta. Ct uma varivel local, mas permite o acesso direto lista de alunos. Sendo isso automtico, esse parmetro poder ser omitido na chamada da funo. Por outro lado, essa implementao obriga que a manipulao seja de apenas uma caderneta por vez. Este e outros detalhes de implementao so comentados abaixo: Constam os trs comandos abaixo na funo insereNoFim(): {alocar memria aps o ltimo elemento de ct} e {atribuir o elemento al a este local} {eliminar o ltimo elemento de ct}

Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.12

Estes comandos esto sendo implementados por uma nica chamada do mtodo append() da classe list de Python (pois ct uma lista): ct.append(al) A funo posicaoAluno() tem o objetivo de generalizar a localizao de um aluno em funo de um de seus campos do registro. Uma vez escolhida a chave para a localizao (no caso, a busca pela matrcula do aluno), o primeiro passo do algoritmo construir uma lista com todos exemplares da chave considerada, mantendo a ordem da lista original. Chamando esta lista de matriculas, o comando seguinte executa esta construo: matriculas = [al.matric for al in ct] De outro modo (usando construo iterativa de listas), matriculas a lista formada pelos campos matric de al, onde al um aluno da lista original ct. Se o parmetro matricula pertencer lista matriculas, o seguinte comando ir extrair o ndice associado (consultar bibliografia do curso): matriculas.index(matricula) A funo retornar None se no encontrar matricula na lista matriculas. A implementao da funo removeAluno() se reduz a um nico comando da linguagem Python (consultar a bibliografia do curso sobre o mtodo pop() da classe list): ct.pop(pos) (observando que pos uma posio vlida conferida fora da funo). O significado est revelado nos seguintes comandos do algoritmo: {salvar em aux o elemento da posio pos de ct} {deslocar os elementos de ct de um item para a esquerda a partir de pos+1} {eliminar o ltimo elemento de ct} Finalmente, a funo acessaAluno()tambm possui um nico comando, dessa vez, por sua simplicidade, idntico ao algoritmo (para pegar um dado de uma lista bastante informar seu ndice): ct[pos] Realizemos interativamente os testes dessas funes. No prompt de comandos, fazemos a incluso do mdulo caderneta.py e, para referenciar explicitamente a lista de alunos chamada Caderneta, criamos a varivel (de nome mais curto) Cdta: >>> from caderneta import* >>> Cdta = Caderneta (No esquecer que o IDLE deve encontrar os arquivos aluno.py e caderneta.py) Experimentemos uma lista com apenas dois alunos. Sejam eles: "Manoel", "2006G0765", 6, 7.5, 20; e Josefa, "2007G0741", 5.4, 9.5, 18:
Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.13

>>> insereNoFim(NovoAluno(),Cdta) Nome: Manoel Matrcula: 2006G0765 AB1: 6 AB2: 7.5 Quant.faltas: 20 >>> insereNoFim(NovoAluno(),Cdta) Nome: Josefa Matrcula: 2007G0741 AB1: 5.4 AB2: 9.5 Quant.faltas: 18 >>> print (len(Cdta)) # conferindo o tamanho atual da lista 2 >>> Observao: Devemos notar que, pela definio do parmetro ct, a chamada da funo acima pode ser feita, omitindo-se o segundo parmetro: valor default de ct Caderneta). Um aluno dever ser acessado a partir de sua matrcula. Para tanto, determina-se inicialmente seu ndice na lista. Considerando que a matrcula pode no ser encontrada, o ndice deve ser testado antes de usar a funo de acesso. Por exemplo, localizar e exibir o aluno de matrcula 2007G0741: >>> indice = posicaoAluno('2007G0741', Cdta) >>> print (indice) #imprime indice ou se verifica: indice!=None 1 >>> alunoBuscado = acessaAluno(indice, Cdta) >>> EscreveAluno(alunoBuscado) Nome: Josefa Matrcula: 2007G0741 AB1: 5.4, AB2: 9.5 Num. faltas: 18 Resultado: AP >>> Para remover um aluno da lista, ser usada a funo removeAluno() que precisa da correta posio do aluno (encontrada a partir da matrcula do aluno). Vamos remover o aluno de matrcula 2006G0765 (lembrando que, aqui, trata-se de um teste, mas, na verdade, este valor pode vir de diversas fontes teclado, arquivo, etc.): >>> indice = posicaoAluno('2006G0765',Cdta) >>> print (indice!=None) True >>> removido = removeAluno(indice, Cdta) #remove salva o aluno >>> EscreveAluno(removido) Nome: Manoel Matrcula: 2006G0765
Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

insereNoFim(NovoAluno()) (pois o

II.1.14

AB1: 6.0, AB2: 7.5 Num. faltas: 20 Resultado: RA >>> Agora que o aluno de matrcula '2006G0765' foi removido, se fizermos um teste com a sua localizao, o resultado ser negativo, e o tamanho da lista estar reduzido de uma unidade: >>> indice = posicaoAluno('2006G0765',Cdta) >>> print (indice!=None) False >>> print (len(Cdta)) # conferindo o tamanho atual da lista 1 >>> A implementao do algoritmo principal mostrado no Exemplo 2.3 mostrada a seguir. Reiniciamos o IDLE e editamos o arquivo GerenciaCaderneta.py, gravando-o no diretrio L212_02, com o cdigo seguinte: from caderneta import * Cdta = Caderneta #Cdta um nome compacto para 'Caderneta'. #Explicita que lista est sendo manipulada while(True): print ('--------------------') print (' (1)Inserir aluno') print (' (2)Remover aluno') print (' (3)Consultar lista') print (' (4)Encerrar') opc = input('Digite sua opo > ') if opc=='1': print ('Digite os dados de um aluno:') insereNoFim(NovoAluno(),Cdta) #tambm pode ser: insereNoFim(NovoAluno()) elif opc=='2': indice = posicaoAluno(input('Remove aluno, matrcula: ')) if indice!=None: print ('Aluno removido:') removido = removeAluno(indice, Cdta) EscreveAluno(removido) else: print ('--> Aluno inexistente!') elif opc=='3': indice = posicaoAluno(input('Acessa aluno, matrcula: ')) if indice!=None: print ('Dados do aluno:') alunoAcessado = acessaAluno(indice, Cdta) EscreveAluno(alunoAcessado) else: print ('--> Aluno inexistente!') elif opc=='4': break else: print ('Opo invlida!')
Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.15

Observao: O programa executa operaes sobre apenas uma turma em cada execuo (isto foi feito somente para torn-lo mais simples). Porm, uma variao pode ser implementada, onde a atual lista seja copiada em outra, ou em um arquivo, por exemplo, e limpando a memria para nova execuo. Executando o programa acima e inserindo os dois alunos seguintes (usando opo 1 do menu): "Manoel", "2006G0765", 6, 7.5, 20; e Josefa, "2007G0741", 5.4, 9.5, 18, obtemos: >>> -------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo: 1 Digite os dados de um aluno: Nome: Manoel Matrcula: 2006G0765 AB1: 6 AB2: 7.5 Quant.faltas: 20 -------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo: 1 Digite os dados de um aluno: Nome: Josefa Matrcula: 2007G0741 AB1: 5.4 AB2: 9.5 Quant.faltas: 18 -------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo > Consultando a lista (opo 3), tentando encontrar os alunos de matrculas 2007G0741 e 2007G0700, obtemos: -------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo > 3
Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.16

Acessa aluno, matrcula: 2007G0741 Dados do aluno: Nome: Josefa Matrcula: 2007G0741 AB1: 5.4, AB2: 9.5 Num. faltas: 18 Resultado: AP -------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo > 3 Acessa aluno, matrcula: 2007G0700 --> Aluno inexistente! -------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo > Conforme o resultado acima, de fato, o aluno de matrcula 2007G0700 no est presente na lista. Vejamos agora um caso de remoo. Desejando-se remover um aluno de matrcula 2006G0765, escolhemos a opo 2: -------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo > 2 Remove aluno, matrcula: 2006G0765 Aluno removido: Nome: Manoel Matrcula: 2006G0765 AB1: 6.0, AB2: 7.5 Num. faltas: 20 Resultado: RA -------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo > Realmente, se consultarmos a lista buscando este aluno aps a operao acima, no mais o encontraremos. O resultado ser o seguinte:

Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.17

-------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo > 3 Acessa aluno, matrcula: 2006G0765 --> Aluno inexistente! -------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo > Para encerrar o programa, bastante digitar a opo 4: -------------------(1)Inserir aluno (2)Remover aluno (3)Consultar lista (4)Encerrar Digite sua opo > 4 >>>

Exerccio
1 - Consideremos o problema do Exemplo 1.5 (Mdulo I, Subunidade 1.1.2). A questo menciona uma loja que mantm um cadastro das mercadorias que comercializa a fim de dar suporte aos movimentos como vendas, controle de estoque etc. Uma mercadoria foi modelada por um tipo abstrato com os atributos: cdigo, denominao, preo de compra e preo de venda de uma mercadoria. Escreva um programa em Python para gerenciar uma lista de mercadorias na memria do computador. Use o TAD mercadoria do citado exemplo e explore os recursos de listas da linguagem Python. O programa dever permitir as seguintes operaes (utilize um menu que deve constar tambm a opo de encerrar o programa): -Inserir uma mercadoria na lista (inserir no fim da lista); -Remover uma mercadoria da lista, tendo fornecido o seu cdigo (executar esta operao somente se a lista no estiver vazia e se o cdigo existir); -Dado o cdigo de uma mercadoria (e se o cdigo existir), escrever seu cdigo, sua denominao e seu lucro (em %); Sugesto: Proceder com as mercadorias de modo anlogo aos alunos dos Experimentos 01 e 02 desta Subunidade 2.1.2. 2 - Tomemos o Item 5 dos exerccios da Subunidade 1.1.2 do Mdulo I. O problema dado menciona uma loja que organizou uma listagem com a produo anual dos seus
Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.18

vendedores, disponibilizando-a para consulta. Escreva um programa para gerenciar o cadastro dos vendedores como uma lista na memria do computador. Use o TAD Vendedor elaborado naquele exerccio e explore os recursos de listas da linguagem Python. O programa dever permitir as seguintes operaes (utilize um menu que deve constar tambm a opo de encerrar o programa): -Inserir um vendedor na lista (no fim da lista); -Remover um vendedor da lista, tendo fornecido seu cdigo (executar esta operao somente se a lista no estiver vazia e se o cdigo existir); -Consultar o cadastro (escrever os dados de um vendedor dado seu cdigo, verificando antes se tal cdigo de fato existe).

Algoritmo e Estrutura de Dados II Prof. Ailton Cruz

II.1.19

Você também pode gostar