Você está na página 1de 6

CTSP – TPSI - Algoritmos e Fundamentos de Programação

2023/2024 Lab
09
Tipos Compostos e Modularidade

Objetivos do Laboratório

Pretende-se que o aluno:


• Aprenda a definir, declarar e utilizar tipos compostos;
• Aprenda a definir, declarar e utilizar tipos enumerados;
• Aprenda e consolide o uso de modularidade no desenvolvimento de programas em C.

Nota

1. Cada exercício seguinte deverá ser desenvolvido a partir de uma instância original do
template de projeto CProject, disponível no Moodle;

2. Todos os dados solicitados ao utilizador deverão ser efetuados a partir das funções
disponibilizados no módulo input (já incluído no template).

Exercício 1

Crie um módulo arrays onde declara e implementa (no ficheiro apropriado) os seguintes tipos e
funções:

a. O tipo composto ArrayStats (sum, mean, minimum, maximum, variance) – que


permitirá guardar estatísticas relativamente a uma sequência de valores inteiros.
b. As funções (os seus nomes devem ser auto-explicativos):
i. void arrayPrint(int array[], int arrayLength);
ii. ArrayStats arrayStatistics(int array[], int arrayLength);
iii. void arrayStatsPrint(ArrayStats statistics);

A variância de uma população é dada pela seguinte fórmula:

No programa principal main() faça uso deste módulo para apresentar as estatísticas de um
vetor de inteiros criado manualmente.

Compile, execute e teste o seu programa.

Com este programa pretende-se demonstrar a utilidade de utilização de tipos compostos para
agrupar informação que pode ser devolvida por uma função (efetivamente estamos a retornar
“múltiplos valores”)

1
CTSP – TPSI - Algoritmos e Fundamentos de Programação
2023/2024 Lab
09
Tipos Compostos e Modularidade

Exercício 2

Pretende-se elaborar um programa modular para apresentar ao utilizador o seu signo do


zodíaco.

a) Crie o módulo date, onde define, declara e/ou implementa (no ficheiro apropriado):
a. O tipo Date (day, month, year);
b. As funções (os seus nomes devem ser auto-explicativos):
i. Date dateCreate(int day, int month, int year);
ii. Date dateReadUser();
iii. void datePrint(Date date);

b) Crie o módulo zodiac, onde define, declara e/ou implementa:


a. O tipo enumerado ZodiacSign (com todos os signos)
b. As funções:
i. ZodiacSign zodiacSignOf(Date date);
ii. void zodiacSignPrint(ZodiacSign sign);

c) O programa principal deverá solicitar a data de nascimento ao utilizador e apresentar o


seu signo, utilizando os tipos/funções disponibilizadas nos módulos anteriores.

Nota: os signos e correspondência de datas:

Aries: (Mar 21 - Apr 19)


Taurus: (Apr 20 - May 20)
Gemini: (May 21 - Jun 20)
Cancer: (Jun 21 - Jul 22)
Leo: (Jul 23 - Aug 22)
Virgo: (Aug 23 - Sep 22)
Libra: (Sep 23 - Oct 22)
Scorpio: (Oct 23 - Nov 21)
Sagittarius: (Nov 22 - Dec 21)
Capricorn: (Dec 22 - Jan 19)
Aquarius: (Jan 20 - Feb 18)
Pisces: (Feb 19 - Mar 20)

Compile, execute e teste o seu programa.

Exercício 3

Pretende-se demonstrar a reutilização de módulos neste novo programa.

a) Reutilize (copie para a pasta do projeto) o módulo Date desenvolvido no exercício


anterior.
b) Crie o módulo Card, onde define, declara e/ou implementa (no ficheiro apropriado):

2
CTSP – TPSI - Algoritmos e Fundamentos de Programação
2023/2024 Lab
09
Tipos Compostos e Modularidade

a. O tipo Card que contém os campos:


i. number (número do cartão “XXXX-XXXX-XXXX”)
ii. holder (nome do titular do cartão)
iii. expires (uma data)
iv. ccv (número inteiro – card code verification)

b. As funções (os seus nomes devem ser auto-explicativos):


i. Card cardCreate(char number[], char holder[], int
month, int year, int ccv); - o dia da data a armazenar no cartão
criado será sempre o dia 1 do mês seguinte.
ii. void cardPrint(Card card);
iii. int cardIndexOf(char number[], Card array[], int
arrayLength) – devolve o índice do array onde o cartão foi
encontrado; -1 se não existir;
iv. bool cardVerify(Card card, int ccv) – verifica se o número
CCV de um cartão e o argumento ccv coincidem.

No main(), faça uso do módulo anterior para criar um programa que:

• Declara um array com 5 cartões e preencha as suas posições com cartões “fictícios”;
• Solicita ao utilizador um número de cartão e pesquise o mesmo no array de cartões:
a. Se o cartão existir, solicita o número CCV e verifica se coincide.
i. Se coincidir, apresenta a informação completa do cartão.
ii. Se não coincidir, apresenta uma mensagem “CCV incorreto”.
b. Se o cartão não existir, apresenta uma mensagem “Cartão não encontrado.”

Compile, execute e teste o seu programa.

Exercício 4

Pretende-se exemplificar a importação de informação estruturada a partir de um ficheiro CSV


(comma-separated values). Neste caso existirá um ficheiro “cards.csv” que conterá informação
de vários cartões. O anexo deste enunciado contém um exemplo deste ficheiro.

O objetivo será fazer com que o programa anterior trabalhe com esta informação importada
em vez de os cartões serem criados manualmente. Isto permitirá que o programa funcione
para um qualquer conjunto de cartões presentes num ficheiro CSV.

a) Copie o ficheiro “cards.csv” para a pasta do seu projeto – ver anexo.

3
CTSP – TPSI - Algoritmos e Fundamentos de Programação
2023/2024 Lab
09
Tipos Compostos e Modularidade

b) Declare a seguinte função no módulo Card (card.h):


a. int importCards(char filename[], Card array[], int
maxLength) – que recebe um nome de um ficheiro CSV e tenta a importação
de cartões para um array de dimensão especificada; retorna o número de
cartões lidos. Este valor é importante para posteriormente saber quantos
cartões foram colocados no array (as restantes posições conterão cartões
“indefinidos”).

b. Implemente esta função (ficheiro card.c), utilizando o código em anexo.

c) Substitua o array criado no exercício anterior, pelo seguinte código:

Card cards[100];
int numberCards = importCards("cards.csv", cards, 100);

// Só para verificarmos a informação importada


for(int i=0; i<numberCards; i++) {
cardPrint(cards[i]);
}

// ... adapte código existente do exercício anterior

O programa deverá continuar a funcionar como antes, mas agora com a informação
obtida do ficheiro CSV.

4
CTSP – TPSI - Algoritmos e Fundamentos de Programação
2023/2024 Lab
09
Tipos Compostos e Modularidade

ANEXO – Ficheiro CSV

Exemplo de ficheiro CSV para importação. O mesmo deverá estar disponível junto com este
enunciado no Moodle.

• Note que a primeira linha identifica o que significa cada “coluna”. Todas as colunas são
separadas por um caractere específico (o separador), neste caso a vírgula “,”.
• Cada uma das linhas seguintes corresponde à informação de um dado cartão.
• Atenção que nenhum dos valores pode conter o caractere separador, senão isto dará
problemas. Se, noutra aplicação, necessitar de valores com vírgulas, opte por outro
caractere separador, e.g., “;”.

card number,card holder,valid through,ccv


4936-5172-9945,Alec Caldwell,15/02/2023,769
4905-7517-1862,Montana English,27/05/2023,496
4905-7517-1862,Montana English,12/09/2023,618
4911-6938-3621,Shea Valencia,11/10/2023,422
6759-5553-2365,Rosalyn Kerr,20/10/2024,529
4905-1842-7648,Tyrone Kim,29/04/2023,162
4911-7672-2787,Jemima Wells,20/07/2024,547
4911-9444-9754,Abigail Norton,27/10/2023,824
4905-2773-6153,Wallace Sloan,23/10/2024,771
4905-6487-8881,Troy Farrell,12/05/2023,961
4905-3834-8788,Dustin Castillo,09/04/2023,707
4905-8636-3535,Jarrod Frank,20/06/2023,930
4903-7163-4636,Christian Ellis,16/05/2024,431
5641-8244-4776,Armand Burke,04/06/2024,810
5641-8233-9235,Kelly Ramsey,07/01/2024,604
4911-2116-1775,Solomon Howe,27/04/2024,372
6331-1053-1738,Colt Martin,25/09/2023,163
4905-2686-6473,Wesley Strong,21/07/2024,898
6331-1069-7655,Demetrius Greene,18/08/2023,249
4911-8928-2774,Jesse York,18/01/2024,505
4905-2596-9435,Jolie Snider,07/01/2023,426
4903-7418-6235,Lucy Lucas,23/01/2024,618
6333-2249-5748,Abigail Patrick,23/12/2022,977
4936-2928-7495,Mason Becker,28/10/2023,383
4905-6942-3748,Stephanie Brennan,10/08/2024,697

5
CTSP – TPSI - Algoritmos e Fundamentos de Programação
2023/2024 Lab
09
Tipos Compostos e Modularidade

ANEXO – Código de importação

Este código carece da importação das bibliotecas <stdlib.h>, <string.h> e “input.h”. O


mesmo deverá estar disponível junto com este enunciado no Moodle.

int importCards(char filename[], Card array[], int maxLength) {

FILE* stream = fopen(filename, "r");

int count = 0;
char line[1024];

fgets(line, 1024, stream); //descarta primeira linha, o cabeçalho


while (fgets(line, 1024, stream))
{
if(count >= maxLength) break;

char* tmp = strdup(line);

char** tokens = splitString(tmp, 4, ","); // retorna um array de strings

// Poderemos necessitar de um passo intermédio de conversão de tipos


int ccv = atoi(tokens[3]);
int day, month, year;
sscanf(tokens[2], "%d/%d/%d", &day, &month, &year);
Date date = dateCreate(day, month, year);

array[count++] = cardCreate(tokens[0], tokens[1], date.month, date.year, ccv);

free(tokens);
free(tmp);
}

fclose(stream);

return count;
}

Você também pode gostar