Programação 23/24 S2

Laboratório 4

Autor
Afiliação

CAP Diogo Silva

Academia da Força Aérea

Regras

  • O laboratório tem a duração de 2 tempos letivos e é individual.
  • Para resolver os seguintes exercícios, podem ser usados:
    • computador
    • ambiente de desenvolvimento, sem assistências configuradas (e.g. Github Copilot)
      • o ambiente de desenvolvimento é local (e.g. CodeBlocks), sem recurso à internet (e.g. Replit)
    • folha de rascunho
    • caneta ou lápis
    • folha de consulta “cheatsheet” (impressa ou em PDF)
  • Em cima da mesa de trabalho não devem estar quaisquer outros objetos, à excepção de uma garrafa de água, se desejado.
  • Não podem ser consultados ou usados quaisquer outros recursos.
  • Lê o enunciado com atenção e usa o código fornecido (quando aplicável).
  • ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
  • ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
  • ⚠️⚠️ CONDIÇÃO MINÍMA PARA ACEITAÇÃO: O CÓDIGO COMPILA E CORRE ⚠️⚠️
  • ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
  • ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
  • Se a solução submetida não compilar com sucesso, a nota final é 0.
  • O incumprimento das regras supracitadas levará à anulação do laboratório e consequente atribuição de pontuação 0.
  • Escreve o NIP e NOME (primeiro e último) em forma de comentário no final do ficheiro, e.g. “134569 Isaac Newton”.
  • Submete a solução no Moodle.

Setup

  • É fornecido um programa que lê idades e nomes de pessoas de um ficheiro de texto.
  • Toda a lógica para carregar os dados já está implementada.
  • São fornecidas as estruturas para implementar uma lista ligada simples.
  • São fornecidas 3 funções que trabalham com a lista ligada:
    • novo_no - cria um novo nó da lista ligada (sem o adicionar)
    • print_list - imprime o conteúdo da lista ligada recebida
    • free_list - liberta a memória alocada à lista ligada recebida
  • Com este laboratório pretende-se que este programa seja melhorado com as seguintes funcionalidades:
    1. [25%] Implementar a função insert que recebe um nome (string) e uma idade (inteiro) e insere um novo nó com esta informação na lista ligada recebida.
    • Para simplificar, cada nó pode steer sempre inserido no fim da lista, ou sempre no início.
    1. [25%]Implementar a função media que calcula a média das idades presentes na lista ligada recebida.
    2. [25%] Implementar a função removeMaiorX que remove da lista ligada recebida todos os nós com idades superiores ou iguais a um valor x recebido.
    3. [25%] Na main
      1. Parte 1
        1. criar lista ligada
        2. dentro do ciclo de leitura do ficheiro, chamar a função insert para inserir cada pessoa na lista ligada
      2. Parte 2
        1. imprimir a lista ligada com a função print_list
        2. calcular a média das idades com a função media
      3. Parte 3
        1. remover da lista ligada todas as pessoas com idades superiores ou iguais a 20 com a função removeMaiorX
        2. calcular a nova média depois de remover essas pessoas
      4. Part 4 - libertar a memória da lista ligada com a função free_list

Código fornecido

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NOME 100

typedef struct node {
    char nome[MAX_NOME];
    int idade;
    struct node *next;
} Node;


typedef struct {
    Node *head;
    Node *tail;
    int n;
} List;


Node * novo_no(char *nome, int idade) {
    Node *no = (Node *) malloc(sizeof(Node));
    strcpy(no->nome, nome);
    no->idade = idade;
    no->next = NULL;
    return no;
}

void printList(List list) {
    Node *no = list.head;
    while (no != NULL) {
        printf("%s %d\n", no->nome, no->idade);
        no = no->next;
    }
}


void freeList(List *list) {
    Node *no = list->head;
    while (no != NULL) {
        Node *aux = no;
        no = no->next;
        free(aux);
    }
    list->head = NULL;
    list->tail = NULL;
    list->n = 0;
}


void insert(List *list, char *nome, int idade) {
    // a alocação de um novo nó pode ser feita com o código já desenvolvido na função novo_no
    // TODO
}

// idade media
float media(List list) {
    // TODO
}

// remover pessoas com idade superior a X
void removeMaiorX(List *list, int x) {
    // TODO
}

int main() {
    // criar lista
    // TODO
    
    FILE * fp = fopen("dados.txt", "r");
    if (fp == NULL) {
        printf("Erro ao abrir arquivo\n");
        return 1;
    }

    // ler todas as linhas do ficheiro (idade nome), linha a linha
    char nome[MAX_NOME];
    int idade;
    while (fscanf(fp, "%d %s", &idade, nome) == 2) {
        // inserir idade e nome na lista ligada
        // TODO usar a função 
    }
    fclose(fp);

    // imprimir lista TODO

    // imprimir idade media TODO

    // remover pessoas com idade >= 20 TODO

    // libertar memoria da lista TODO

}