Programação 23/24 S2
Laboratório 4
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 recebidafree_list
- liberta a memória alocada à lista ligada recebida
- Com este laboratório pretende-se que este programa seja melhorado com as seguintes funcionalidades:
- [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.
- [25%]Implementar a função
media
que calcula a média das idades presentes na lista ligada recebida. - [25%] Implementar a função
removeMaiorX
que remove da lista ligada recebida todos os nós com idades superiores ou iguais a um valorx
recebido. - [25%] Na
main
- Parte 1
- criar lista ligada
- dentro do ciclo de leitura do ficheiro, chamar a função
insert
para inserir cada pessoa na lista ligada
- Parte 2
- imprimir a lista ligada com a função
print_list
- calcular a média das idades com a função
media
- imprimir a lista ligada com a função
- Parte 3
- remover da lista ligada todas as pessoas com idades superiores ou iguais a 20 com a função
removeMaiorX
- calcular a nova média depois de remover essas pessoas
- remover da lista ligada todas as pessoas com idades superiores ou iguais a 20 com a função
- Part 4 - libertar a memória da lista ligada com a função
free_list
- Parte 1
- [25%] Implementar a função
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
}