Linguagens e Ambientes de Programação (2016/2017)



Prática 6

Primeiros exercícios sobre a linguagem C. Exercícios de 31 a 35.



Guião para usar a linguagem C na consola

  1. Usar um editor de texto qualquer para escrever um ficheiro "test.c"
  2. Gravar
  3. cc -o test test.c
  4. ./test

Guião para usar a linguagem C dentro do Eclipse Juno

  1. Ativar Eclipse, escrevendo "eclipse" num consola.
  2. Window > Open Perspective... mudar perspetiva para C/C++
  3. File > New > Project...
  4. Selecionar "C Project"
  5. Escrever "Test" e selecionar "Hello World ANSI C Project" e "Linux GCC"
  6. Fazer "Finish" (ignorar o "Next")
  7. File > New > Source File
  8. Dar o nome "Test.c" ao ficheiro
  9. Escrever o programa no ficheiro "Test.c"
  10. Ctrl-S (save) para gravar
  11. Carregar seta branca e verde da barra de tools para compilar e correr o programa.
  12. Se o programa não correr logo, ir ao menu Project, forçar um build manual, e depois mandar o programa correr por duas vezes na seta verde. Da segunda vez, o programa já corre.

Instalação: Já está instalado nos laboratórios. Para instalar no seu computador pessoal, use o comando do Eclipse "Help>Install New Software...". Na caixa "Work with:" insira "http://download.eclipse.org/tools/cdt/releases/juno" e depois escolha apenas "CDT Main features".



  • 31 - Considere a seguinte variável global x e as seguintes funções f e g: Suponha que f e g são usadas num segmento de programa da seguinte forma:

    Quais os valores que ficam em s1 e s2, assumindo que os operandos nas expressões são avaliados da esquerda para a direita. Note que, em geral, os compiladores têm a liberdade de definir a ordem de avaliação ou seja a ordem de avaliação das sub-expressões está indefinida ao nível da linguagem. Isso recomenda que evitemos escrever código do género do que está contido neste exemplo.


  • 32 - Analise o programa incompleto abaixo. No início, define-se um tipo Byte para representar bytes de memória. Também se define um tipo Block para representar sequências de bytes em memória. A função blockZero inicializa um bloco com zeros, e a função blockPrint mostra o conteúdo dum bloco.

    Pedimos-lhe para completar as funções blockFill_char_uint_double e blockPrint_char_uint_double.

    A função blockFill_char_uint_double guarda no início dum bloco três valores de diferentes tipos, sem qualquer alinhamento: um char, um unsigned int e um double.

    A função blockPrint_char_uint_double extrai e imprime (um por linha) três valores do início dum bloco, com os tipos: char, um unsigned int e um double.

    A função main já está escrita e serve para testar se você escreveu bem as funções anteriores.


  • 33 - Escreva em C um programa introspetivo que olhe para a sua própria pilha de execução e escreva os dados necessários para poder responder às seguintes perguntas: Use o seguinte código como ponto de partida. Vai precisar de usar um apontador.
  • 34 - Considere novamente o tipo soma Shape apresentado na teórica 11. Desta vez é também oferecido um construtor de pontos e um construtor de linhas.
  • 35 - Escreva em C um programa avaliador de expressões aritméticas inteiras onde podem ocorrer os operadores + e *. O programa lê uma linha completa da consola, avalia a expressão nela contida e escreve o resultado na consola. Quando testar, não introduza espaços em branco, pois o programa não está preparado para lidar com eles.

    Para processar as fórmulas, escreva uma coleção de funções, seguindo a estrutura da gramática LL1 abaixo. Gramáticas LL1, vão ser estudadas em TC. Têm a particularidade de admitirem uma tradução simples à mão para código que implementa um reconhecedor da liguagem em causa. [Este exercício é um simples pretexto para programar em C algo de útil e interessante, num momento em que a matéria sobre esta linguagem apenas começou a ser dada nas teóricas.]

    O programa já está 80% escrito. Estude o que já está feito, comparando com a gramática, e escreva as três funções que faltam: as funções T, Y e F.
  • 36 - Enriqueça o programa anterior com 26 variáveis mutáveis (use os nomes 'a'..'z') e uma operação de atribuição denotada "=". As variáveis podem receber valores de expressões e as expressões podem conter variáveis. Quando o programa arranca, todas as variáveis começam com o valor zero.