A abstracção Caneta

A tarefa associada a este exercício corresponde à modelação e concretização em C (ficheiros .h e .c) de uma estrutura de dados que represente uma versão simples do conceito Caneta.

Uma caneta tem como características (ou campos) a marca (brand) e a cor da tinta (color).

Uma caneta deve escrever e deve ser possível criar novas canetas e destruir canetas antigas. Duas cenas são iguais se tiverem a mesma cor e marca. Deve ser possível aceder ao valor de cada um dos campos de uma caneta. Finalmente, deve ser possível apresentar ao utilizador o conteúdo dos vários campos de uma caneta.

Defina primeiro a interface deste conceito no ficheiro Pen.h e só depois é que deve comparar a sua solução com a seguinte solução proposta Pen.h.

Concretize agora o conceito Caneta no ficheiro Pen.c Compare a sua solução com a seguinte solução proposta: Pen.c

Programa exemplo

Agora é necessário criar um pequeno programa exemplo que irá exercitar as funcionalidades suportadas pelo conceito Caneta.Assim, deverá criar o seguinte ficheiro main.c:

Ficheiro main.c
#include <stdio.h>
#include "Pen.h"
 
int main() {
  Pen p1 = newPen("Bic", "green");
  Pen p2 = newPen("Bic", "red");
  Pen p3 = newPen("Bic", "green");
 
  print(p1);
  print(p2);
 
  write(p1, "SCP");
  write(p2, "SLB");

  printf("p1 == p2? %s\n", equalsPen(p1, p2) ? "yes" : "no");
printf("p1 == p3? %s\n", equalsPen(p1, p3) ? "yes" : "no");
deletePen(p1); deletePen(p2); deletePen(p3); return 0; }

Como compilar e executar?


O programa é constituído por dois módulos independentes, que têm de ser compilados (conversão de C para código binário) e "linkados" (ligação de todos os módulos binários e bibliotecas adicionais), para produção do executável.

gcc -c Pen.c -o pen.o
gcc -c main.c -o main.o

A opção -o foi apresentada como o valor por omissão, apenas para explicitar o que acontece como resultado do comando.

gcc -o main main.o pen.o

Note-se que o comando "gcc" não é simplesmente o compilador de C: é um programa capaz de chamar o compilador em si (quando se usa com a opção -c) ou capaz de invocar o "linker", se não for dito nada em contrário (último comando acima).

A execução é simples (o comando seguinte executa o programa "main" que está na directoria actual, i.e., "."):

 ./main