LABORATORIO DE PROGRAMAÇÃO
Published: 2024-04-09 19:18:59

**AULA VI**

```
class No:
    def __init__(self, valor):
        self.valor = valor
        self.anterior = None
        self.proximo = None

class DuplamenteEncadeada:
    def __init__(self):
        self.primeiro = None
        self.proximo = None

    def vazia(self):
        return self.primeiro is None
    
    def inserir_no_inicio(self, valor):
        new_node = No(valor)
        if self.vazia():
            self.primeiro = new_node
            self.ultimo = new_node
        else:
            new_node.proximo = self.primeiro
            self.primeiro.anterior = new_node
            self.primeiro = new_node
        
    def inserir_no_final(self, valor):
        new_node = No(valor)
        if self.vazia():
            self.primeiro = new_node
            self.ultimo = new_node
        else:
            new_node.anterior = self.ultimo
            self.ultimo.proximo = new_node
            self.ultimo = new_node

    def remover_do_inicio(self):
        if self.vazia():
            return None
        valor_removido = self.primeiro.valor
        if self.primeiro == self.ultimo:
            self.primeiro = None
            self.ultimo = None
        else:
            self.primeiro = self.primeiro.proximo
            self.primeiro.anterior = None
        return valor_removido
    
    def remover_do_final(self):
        if self.vazia():
            return None
        valor_removido = self.ultimo.valor
        if self.ultimo == self.primeiro:
            self.primeiro = None
            self.ultimo = None
        else:
            self.ultimo = self.ultimo.anterior
            self.ultimo.proximo = None
        return valor_removido
    
    def imprimir(self):
        no_atual = self.primeiro
        while no_atual is not None:
            print(no_atual.valor, end=" ")
            no_atual = no_atual.proximo
        print()

lista = DuplamenteEncadeada()

lista.inserir_no_inicio(90)
lista.inserir_no_inicio(50)
lista.inserir_no_final(33)
lista.inserir_no_final(80)
lista.inserir_no_final(60)

lista.imprimir()

lista.remover_do_inicio()
lista.remover_do_final()

lista.imprimir()

```
Explicação: Esse código cria duas classes: No, que representa um nó de uma lista duplamente encadeada, e DuplamenteEncadeada, que implementa uma lista duplamente encadeada.

Quando o código é executado, uma lista duplamente encadeada é criada e inicializada como vazia. Em seguida, são adicionados elementos à lista usando os métodos inserir_no_inicio e inserir_no_final.

Depois de adicionar os elementos, a lista é impressa para mostrar seu conteúdo.

Em seguida, dois elementos são removidos da lista, um do início e outro do final, usando os métodos remover_do_inicio e remover_do_final, respectivamente.

Por fim, a lista é impressa novamente para mostrar seu conteúdo após as remoções.

No geral, o código cria e manipula uma lista duplamente encadeada, adicionando elementos no início e no final, removendo elementos do início e do final, e imprimindo a lista em diferentes estágios.

Link para rodar: https://onlinegdb.com/X_DCWrxLx

**AULA VII**

```
# transforma a primeira letra de uma string em maiúscula
def upper(string):
    return string[0].upper() + string[1:]

# conta quantas vogais existem em uma determinada string
def count(string):
    vogais = 'aeiou'
    return sum(letra in vogais for letra in string.lower())

string = "laboratório"
string_upper = upper(string)

string = "laboratório"
string_count = count(string)

print(string_upper)
print(string_count)
```

Explicação: Este código define duas funções: upper, que transforma a primeira letra de uma string em maiúscula, e count, que conta quantas vogais existem em uma determinada string. Em seguida, a string "laboratório" é processada por ambas as funções e os resultados são impressos.

Link para rodar: https://onlinegdb.com/R36gjfW2w

**AULA IX**

```
from collections import Counter
import matplotlib.pyplot as plt

def ocorrencias(dado):
    return Counter(dado)

def calcular_frequencia(contador_dado):
    total = sum(contador_dado.values())
    return [count / total for count in contador_dado.values()]

def criar_bins(dado, num_bins):
    min_valor = min(dado)
    max_valor = max(dado)
    bin_width = (max_valor - min_valor) / num_bins
    return [min_valor + i * bin_width for i in range(num_bins + 1)]

def plot_histogram(dado, title='Idades de um grupo', xlabel='Idade', ylabel='Frequencia absoluta', bins=5, rwidth=0.9):
    data_counts = ocorrencias(dado)

    frequecias = calcular_frequencia(data_counts)

    bins = criar_bins(dado, bins)

    plt.title('Idades de um grupo', fontsize=30)
    plt.xlabel('Idade')
    plt.ylabel('Frequencia absoluta')
    plt.hist(idades, 5, rwidth=0.9)
    plt.savefig('grafico.png')
    plt.show


idades=[65,26,67,50,47,73,1,58,2,94,12,22,12,95,25,13,61,41,24,95,
        3,71,53,24,23,44,83,30,19,32,71,66,45,6,99,4,76,27,50,18,58,
        61,53,72,14,78,36,89,6,71,58,69,22,34,38,51,71,83,22,22,36,44,
        16,58,20,49,28,55,21,26,23,41,21,95,18,63,55,2,61,81,39,20,39,
        17,66,60,73,26,54,16,76,83,9,12,15,35,54,11,7,61]

plot_histogram(idades)
```

Explicação: Este código cria um histograma das idades de um grupo usando a biblioteca matplotlib. Ele define funções para calcular as ocorrências dos dados, calcular a frequência relativa, criar bins para o histograma e plotar o histograma.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/okgwhi7fltne31u7es4d.jpeg)