Estude o ciclo de desenvolvimento de aplicações em linguagem C no ambiente Unix (slide).
Copie o ficheiro aula1-eg1.tgz para a sua área de trabalho e descomprima o seu conteúdo com o comando:
tar -zxvf aula1-eg1.tgz
1. Geração do executável (slide)
a) Visualize e compreenda o conteúdo dos ficheiros.
b) Compile os ficheiros e faça a sua ligação de modo a produzir o executável denominado main.
gcc -g -c list.c main.c
gcc -o main list.o main.oc) Execute a aplicação main e compreenda o resultado.
2. Utilização do debugger ddd (slide)
a) Execute a aplicação no debugger ddd:
ddd mainb) Coloque um breakpoint na primeira instrução
lst_insert
e execute a aplicação pressionando o botão run. O que observa?c) Execute a aplicação utilizando os botões next e step. Qual é a diferença entre ambos?
3. Utilização da ferramenta make (slide)
a) Crie um ficheiro Makefile na sua área de trabalho com o conteúdo descrito no slide e execute make. O que aconteceu?
b) Apague o ficheiro list.o. Re-execute make. Interprete o sucedido.
c) Simule uma alteração ao ficheiro main.c com o comando seguinte e re-execute make. Compreenda o resultado.
touch main.c
1. Implemente a função lst_insert
do exemplo anterior que adiciona um valor no final da lista.
Sugestões:
lst_insert
e observe o conteúdo actual das variáveis.ddd main core
.
2. Implemente a função lst_print
do ficheiro list.c
que imprime o conteúdo de uma lista (inteiros separados por vírgulas). Utilizando
o ddd, verifique que a lista impressa pela função lst_print
corresponde ao conteúdo
efectivo da lista em memória.
3. Compreenda melhor o funcionamento do make.
a) Simule a alteração do ficheiro list.h e execute
make
. Porque razão todos os ficheiros foram gerados?b) Simule a alteração do ficheiro list.o. O que acontece quando faz
make list.o
? E se agora fizermake
?c) Retire a dependência do ficheiro list.h da regra list.o da Makefile. Repita procedimento da alínea a). Explique a diferença no resultado?
d) Adicione a regra seguinte no fim do ficheiro. O que descreve esta regra? Identifique: o alvo, as dependências e o comando.
clean: rm -f *.o maine) Execute
make clean
. O que aconteceu? Porque razão o comando é executado sempre que esta regra é invocada explicitamente?
4. Implemente as função lst_destroy
e lst_remove
. A função lst_destroy
liberta toda a memória alocada pela lista. A função lst_remove
recebe uma lista e um valor e remove
o primeiro item com aquele valor.
Calculadora RPN (Reverse Polish Notation)
Criar uma calculadora capaz de fazer operações de soma, subtracção, multiplicação e divisão, recebendo como entrada expressões na notação RPN.
A notação RPN permite definir expressões aritméticas evitando o uso de parêntesis para definir as prioridades na avaliação das operações. As operações/expressões ilícitas - como, por exemplo, a falta de operandos e/ou operadores; divisão por zero - devem ser identificadas com mensagens .Utilize uma pilha como estrutura de dados auxiliar
(sugestão: estender a biblioteca lista com operações push
e pop
).
Exemplos:
/* 8 - 4 (notação tradicional) */ > 8 4 - Resultado: 4 /* 3 + (20 + 5) (notação tradicional) */ > 3 20 5 + + Resultado: 28 /* (10 - 1) - (6 - 3) (notação tradicional) */ > 10 1 - 6 3 - - Resultado: 6 /* 10 - 1 - 6 - 3 (notação tradicional) */ > 10 1 - 6 - 3 - Resultado: 0 /* 10 : 0 (notação tradicional) */ > 10 0 : Resultado: DIVISAO POR ZERO
/* Expressõos ilícitas) */ > 10 1 Resultado: FALTAM OPERADORES > 10 1 + 1 5 Resultado: FALTAM OPERADORES > + 1 5 Resultado: OPERAÇÂO NÃO VÁLIDA > 1 5 + A Resultado: OPERAÇÂO NÃO VÁLIDA