Exercícios de Programação

 

(Usando Gnu C em Linux)

 

1º ano da LEEC

 

 

1ª Aula - Familiarização 
2ª Aula - Tipos e Operações
3ª Aula - Selecção
4ª Aula - Laços

5ª Aula - Funções

6ª Aula - Funções
7ª Aula - Arrays
8ª Aula - Strings
9ª Aula - Apontadores

10ª Aula - Estruturas

11ª Aula - Ficheiros de Texto

12ª Aula - Ficheiros Binários

 

© Copyright J.P. Marques de Sá - 2001

1ª Aula - Familiarização


Familiarização com o ambiente de desenvolvimento de programas (Linux, KDE, Gnu C, gcc, xman, Advanced Editor).

O aluno deve previamente obter no CICA a identificação (user ID) e a palavra-chave (password).


1 - Aceda à sua conta Linux fornecendo a sua identificação e a palavra-chave. A identificação é fornecida a seguir a login e a palavra-chave a seguir a password.

2 - Abrir a consola no ambiente de desenvolvimento KDE (ícone: quadro negro com concha). É através da consola que irá gerir o sistema de ficheiros, compilar e executar programas. No que se segue representamos por $ o prompt do sistema.

3 - Criar um directório para os programas em C chamado "programas'':

$ mkdir programas

(mkdir significa make directory)

4 - Verificar o conteúdo do directório corrente do utilizador certificando-se que o directório "programas'' foi criado.
$ ls
        A palavra "programas" deve aparecer listada no ecrã (ls significa list).

5 - Mudar do directório do utilizador para o directório "programas''.

$ cd programas

(cd significa change directory)

Fazer de novo ls e verificar que o directório programas está vazio.

6 - Regressar ao directório anterior.

    $ cd ..

    (cd apenas regressa ao directório de raiz)

7 - Seleccionar no ícone KDE o Advanced Editor  em Applications e editar o seguinte programa em C: 


#include  <stdio.h>

main()

{

    printf("Bom dia!\n");

}


8 - Guardar (Save As) o programa que editou num ficheiro denominado teste.c no directório programas. Para tal seleccionar esse directório e escrever o nome do ficheiro (terminar com OK).

9 - Sair do editor e listar o directório programas verificando que já consta o ficheiro que acaba de ser criado.

10 - Compilar o programa teste.c.

$ gcc teste.c
11 - Executar o programa e verificar o resultado da execução
$ a.out
        Deve aparecer no ecrã a frase "Bom dia!''

a.out é o nome por omissão do ficheiro executável.

12 - Compilar o programa especificando o ficheiro executável.

    $ gcc teste.c -o  teste

13 - Executar teste e ver que dá o mesmo resultado.

14 - Remover um programa.

    $ rm a.out

(rm significa remove; listar e verificar que a.out foi removido. rmdir para remover directórios)

15 - Obter informação sobre comandos usando xman

Clicar em Manual Page e depois em Sections escolher User Commands. Aparece uma lista de comandos. Escolher p. ex. gcc (clicando duas vezes) para obter informação sobre este comando.

16 - Obter informação sobre um comando específico usando xman.

No Manual Page escolher Options e neste Search. Editar o nome do comando, p.ex. cd ou rm. Verificar a descrição do comando.

17 - Editar o seguinte programa (...) e guardá-lo em exp.c:

#include <stdio.h>

main()

{
      int den, r

 

      den = 0;
      r = 10 % den;
      printf("%d\n', r);

}

18 - Compilar o programa.

    gcc exp.c -o exp

No fim da compilação aparece o erro "c:8 unterminated string or character constant".

De facto, existe um erro sintáctico na linha 8

19 - No editor corrigir a linha 8 para:

       printf("%d\n", r);

Depois basta fazer Save ou clicar no ícone da diskette.

20 - Voltar à consola e compilar de novo (basta clicar a seta para cima e fazer Enter). Agora aparece:

c:6 parse error before den

De facto, em antes do den da linha 6 falta um ;

20 - No editor corrigir a linha 4 para:

      int den, r;

Compilando de novo não dá erro mas, ao executar, aparece o erro "floating point exception"

21 - Inserir uma correcção adequada e experimentar de novo..

22 - Copiar o ficheiro teste.c para t.c

    $ cp teste.c t.c

23 - Listar o conteúdo de uma diskette (formatada em Windows).

    $ mdir

23 - Copiar um ficheiro para uma diskette (formatada em Windows).

        $ mcopy teste.c a:

24 - Terminar a sessão de trabalho.

    Ir ao KDE e fazer logout.
 

© Copyright J.P. Marques de Sá - 2001

2ª Aula - Tipos e Operações


  1. Ler um ângulo em graus e converter para radianos. 

  2. Ler dois números reais e apresentar a sua soma, média e média arredondada.

  3. Ler um número inteiro com três dígitos e escrever em separado o dígito das centenas, o dígito das dezenas e o das unidades.

  4. Ler um número inteiro e escrever o resto da sua divisão por 2.

  5. Ler um carácter e escrever o seu código ASCII.

 

© Copyright J.P. Marques de Sá - 2001

3ª Aula - Selecção


  1. Ler um número e indicar se ele é positivo, negativo ou nulo.

  2. Ler dois números reais e um carácter que indica a operação a realizar sobre eles (+,-,*,/). Escrever o resultado da operação.

  3. Determinar as soluções reais de equações do tipo "ax^2+bx+c=0". O programa deve estar preparado para detectar a situação de raízes complexas

  4. Escrever um programa que converte informação quantitativa em informação qualitativa sobre altura das pessoas. Utilize as seguintes regras. Uma pessoa com menos de 1,0m é baixíssima. Uma pessoa com altura entre 1,0m e 1,5m é baixa. Uma pessoa com altura entre 1,5m e 1,7m é mediana. Uma pessoa com altura entre 1,7m e 1,9m é alta. Uma pessoa com altura superior a 1,9m e altíssima.

 

© Copyright J.P. Marques de Sá - 2001


4ª Aula - Laços


  1. Ler uma sequência de valores reais terminada por zero e indicar o máximo e mínimo.

  2. Ler um número inteiro e calcular a soma dos seus dígitos.

  3. Ler um número entre 1 e 9 (inclusive) e gerar a tabela da tabuada correspondente.

  4. Determinar e escrever o valor ao fim de 1 a n anos, de uma quantia q, actualizada todos os anos com a taxa de juro de 2.5%. O utilizador especifica n e q. Supõe-se que os juros são acumulados a q.

  5. Calcular o valor das seguintes séries para n a especificar:

1 + 1/2 + 1/3 + ... + 1/n

(1/2) - (1/2)^2 + (1/2)^3 - (1/2)^4 + ....

  1. Ler sucessivos caracteres terminando com '.' À medida que vão sendo lidos é escrito no ecrã se se trata de uma letra (escreve "letra") de um dígito (escreve "dígito") ou de outro caracter (escreve "outro").

  2. Ler um conjunto de no máximo 4 caracteres representando um valor inteiro, calcular esse valor e escrevê-lo no ecrã.

 

© Copyright J.P. Marques de Sá - 2001

5ª Aula - Funções


  1. Escrever um programa que lê uma sequência de números inteiros terminada por zero. Sempre que um número é lido, a partir do segundo, é escrito um 1 ou 0 conforme o número é um divisor do anterior ou não. Use uma função apropriada para gerar os 0s e 1s.

  2. Implementar uma função para o cálculo de a*x^2 (parábola), que tem como parâmetros de entrada o valor a e o valor do ponto x. Utilizar a função num programa que apresenta os valores da função num determinado intervalo definido pelo utilizador. O utilizador deve também definir o incremento a utilizar nesse cálculo.

  3. Implementar o exercício 3 da aula anterior usando um procedimento para a escrita da tabela.

  4. Implemente e teste uma função para gerar iterativamente x^n (x real e positivo, n inteiro), com x e n a especificar pelo utilizador.

  5. Elaborar um programa que lê uma sequência de números inteiros positivos terminada por zero. O programa deve mostrar no ecrã unicamente os números capicuas. Para verificar se um número é capicua escreva uma função que inverte a sequência de dígitos de um número e utilize o resultado dessa função para comparar o número "invertido" com o original. Um número é capicua se o original for igual ao número "invertido".

 

© Copyright J.P. Marques de Sá - 2001

6ª Aula - Funções


  1. Escrever uma função que simule o lançamento de um dado. Esta função não tem qualquer parâmetro de entrada e retorna 1, 2, 3, 4, 5 ou 6. Utilize a função rand() para simular o lançamento (1+rand()%6). Utilize essa função num programa que simula N lançamentos de um dado (N definido pelo utilizador) e apresenta no final a distribuição dos resultados obtidos.

  2. Elabore um programa que lê números inteiros positivos e os mostra na sequência inversa da leitura. Considere que qualquer número negativo ou o zero terminam a sequência. Implemente uma definição recursiva da função que lê e mostra os números.

  3. Elaborar uma versão recursiva do exercício 4 da aula anterior.

  4. Elabore um programa que lê uma sequência de números inteiros positivos terminada por zero. O programa deve mostrar no ecrã unicamente os números capicuas. Para verificar se um número é capicua escreva uma função que inverte a sequência de dígitos de um número e utilize o resultado dessa função para comparar o número "invertido" com o original. Um número é capicua se o original for igual ao número "invertido".

  5. Escrever uma função para calcular o máximo divisor comum (mdc) entre dois números inteiros, notando que mdc(x,y)=x se y=0, senão mdc(x,y)=mdc(y, x % y). 

 

© Copyright J.P. Marques de Sá - 2001

7ª Aula - Arrays


  1. Ler um vector de no máximo 20 reais e escrever a soma de todos os elementos. Usar uma função adequada.

  2. Ler um vector de n números inteiros, n par, e calcular a soma do 1º com o último elemento, do 2º com o penúltimo, etc. Usar um procedimento para implementar estas somas.

  3. Ler um vector e verificar se contém um dado elemento, usando pesquisa binária.

  4. Usar a função rand() para gerar n valores no intervalo [0,1], n a especificar pelo utilizador. Seguidamente, determinar quantos valores aleatórios ocorreram em cada um de 10 intervalos [0.1k, 0.1k+0.1]. Determinar a média e desvio máximo destas ocorrências.

  5. Ler um vector e deslocar, rodando, os seus elementos de k posições, para a esquerda se k>0, para a direita se k<0.

  6. Diz-se que uma matriz tem um ponto de sela no elemento (i,j) se for um mínimo local face aos seus 6 vizinhos. Ler uma matriz e determinar todos os seus pontos de sela.

  7. Implementar e testar o algoritmo de multiplicação de matrizes. 

  8. Escrever novas versões dos Exemplos 5.7 e 5.8, considerando que os vectores de inteiros contêm, na sua posição zero, o número de elementos válidos.

 

© Copyright J.P. Marques de Sá - 2001

8ª Aula - Strings


  1. Ler uma matriz quadrada e verificar se pode representar uma matriz de distâncias. Para isso a matriz deve obedecer às seguintes condições: a) os elementos da diagonal principal são nulos; b) a matriz é simétrica; c) o valor do elemento (i,j) não excede a soma dos valores dos elementos (i,k) e (k,j).

  2. Ler um array de strings e escrever: a) a string de maior comprimento; b) a string de menor comprimento; c) a string alfabeticamente maior.

  3. Ler um vector de n nomes próprios e uma mensagem contendo inteiros de 1 a n. A seguir escrever a mensagem substituindo os números pelas strings do vector com o mesmo índice.

  4. Escrever e testar uma função que detecta a posição em que uma string está contida noutra. (0 se não está).

  5. Implementar e testar uma rotina que inverte a ordem dos caracteres na string. Usar a rotina para determinar se uma dada string é capicua.

 

© Copyright J.P. Marques de Sá - 2001

9ª Aula - Apontadores


  1. Elabore um programa que lê uma sequência de números inteiros positivos, terminada com zero, e a guarda num vector. Usando uma variável do tipo apontador percorra os elementos lidos e substitua-os pela média (v[i-1]+v[i]+v[i+1])/3. Nas extremidades faça a média só de dois elementos.

  2. Elabore um programa que lê uma sequência de letras terminada por qualquer carácter que não seja letra. Guarde as letras lidas num vector e acrescente no fim o carácter nulo como indicador de fim de sequência. Implemente uma função que, utilizando uma variável tipo apontador, converta as letras da sequência em letras maiúsculas. Implemente uma segunda função que devolve o endereço onde começa a sub-sequência que lhe é passada como parâmetro. Escreva no ecrã o que está no vector a seguir (incluindo) ao apontado pelo apontador.

  3. Ler um vector de reais e invertê-lo usando um procedimento de troca.

  4. Ler um vector de reais e determinar os elementos de valores máximo e mínimo bem como as suas posições (passagem de parâmetros por referência).

  5. Copiar para uma string de destino d, k caracteres de uma string s com início na posição p. Se p excede o comprimento de s retornar a string nula, se p+k excede o compromento de s copiar até ao fum d s

  6. Ler um vector com um número de elementos n a especificar pelo utilizador. Seguidamente expandir o vector para 2n elementos, preenchendo os elementos apensados com o dobro dos anteriores.

 

© Copyright J.P. Marques de Sá - 2001

10ª Aula - Estruturas


  1. Definir um tipo complexo, destinado a representar números complexos, e escrever um programa de leitura e soma de complexos.

  2. Criar e testar uma header file contendo rotinas para leitura, escrita, soma, subtracção, multiplicação e divisão de complexos.

  3. Pretende-se gerir um array contendo informação sobre alunos: Nome; Idade; Média do curso. Definir um tipo aluno para representar esta informação. Implementar e testar uma rotina para ler uma estrutura deste tipo. Implementar e testar uma rotina para escrever uma estrutura deste tipo. 

  4. Escrever um programa que leia um array do tipo aluno e determine quais: os alunos que têm média superior a um certo valor; os alunos que têm um dado nome inicial.

 

© Copyright J.P. Marques de Sá - 2001

11ª Aula - Ficheiros de Texto


 

1 - Considere um ficheiro de texto ("alunos.txt") organizado por linhas, em que cada linha contém o nome de uma aluno, a sua idade e a sua média de curso, e.g.:
João Luís   23   13.7


a) Escreva um programa que lê do ficheiro de texto a informação de cada linha por forma a colocar no array do exercício da aula anterior.
b) Complete o programa anterior por forma a, para todos os alunos, criar um ficheiro de texto com a seguinte informação: nome, factor de mérito=média/(idade-23).

2 - Uma revista musical organiza, semanalmente, uma pesquisa de opinião sobre a popularidade de discos. Os resultados da pesquisa são guardados num ficheiro discos.txt com a seguinte informação por linha separada por TABs: nome do disco, nome do autor, discos vendidos.

Escrever um programa que leia esta informação para um array e escreva os discos que têm vendas superiores a um certo valor.

 

© Copyright J.P. Marques de Sá - 2001

12ª Aula - Ficheiros Binários


 

1 - Criar uma tabela de valores do seno entre o e pi, com incrementos de pi/20 e guardar a tabela sob a forma de ficheiro binário. Seguidamente, ler do ficheiro os valores dos ângulos para os quais o seno está no intervalo [x, x + 0.1], com x especificado pelo utilizador em [0, 0.9].

2 - Repetir o exercício 1 da aula anterior usando um ficheiro binário.

3 - Uma empresa possui representantes em várias cidades e pretende implantar a sua sede numa delas, de acordo com o critério: o custo anual das deslocações dos representantes  das várias cidades à cidade sede deverá ser o menor possível.

a) Escreva um programa que crie um ficheiro binário contendo a seguinte informação:

nome - nome da cidade

x, y - coordenadas da cidade

t - número de deslocações por ano dos representantes da cidade

b) Complete o programa por forma a ler o ficheiro binário e determinar a cidade a ser eecolhida como sede.

 

© Copyright J.P. Marques de Sá - 2001