Paradigmas de Programação II
2006.03.13

Objectivos:

O objectivo principal desta ficha é familiarizar o aluno com a utilização e manipulação de vectores e matrizes em C.

As strings são casos particulares de arrays: uma string é um array em que os elementos são todos do tipo char. Assim, nesta ficha surgem também alguns exercícios envolvendo manipulação de strings.
Exercícios:
  1. Sequências de números inteiros positivos
  2. Totoloto (retirado do livro de apoio)
  3. Análise de Strings (adaptado do livro de apoio)
  4. Capicua
  5. Conversão Romano-Árabe
  6. Cifra por substituição arbitrária


Sequências de números inteiros positivos


Especifique um programa e codifique-o em C que lê do teclado uma sequência de números inteiros positivos e calcula um conjunto de indicadores sobre a sequência lida. O programa deverá oferecer ao utilizador um menu de operações como o que se mostra a seguir:
    Sequências de Inteiros: lista de operações
A - Ler a sequência
B - Escrever a sequência
C - Calcular o máximo da sequência
D - Calcular o mínimo da sequência
E - Determinar a subsequência de números acima da média
F - Determinar a subsequência de números abaixo da média
G - Calcular o mínimo múltiplo comum da sequência
H - Determinar a subsequência dos números que são primos
I - Sair do Programa
     Opção: 

A leitura de números deverá terminar quando fôr lido o 0 ou quando fôr atingido o limite da sequência (defina-o).

Apresente o resultado de forma a facilitar a análise.

Sugestão de implementação: especifique uma função para cada opção do menu inicial.


Totoloto (retirado do livro de apoio)


Pretende-se escrever um programa que leia do teclado uma chave de totoloto e que a imprima no monitor segundo as regras convencionais. Admita, para simplificar, que a combinação de números, que forma a chave, tem obrigatoriamente que ser introduzida por ordem crescente. A entrada de dados deverá ter a seguinte forma:
  Elemento 1 da chave = ...
  Elemento 2 da chave = ...
  ...
  Elemento 6 da chave = ...

Admitindo que a chave introduzida foi {2, 12, 17, 27, 30, 43}, a saída de resultados deve obedecer ao formato seguinte:
          Aposta de Totoloto
 1     X     3     4     5     6     7
 8     9    10    11     X    13    14
15    16     X    18    19    20    21
22    23    24    25    26     X    28
29     X    31    32    33    34    35
36    37    38    39    40    41    42
 X    44    45    46    47    48    49

Sugestão: relembre o formato de escrita formatada de strings discutido nas aulas teóricas (%ns).


Análise de Strings (adaptado do livro de apoio)


Pretende-se escrever um programa que leia do teclado uma linha de texto até ao máximo de 60 caracteres, e que calcule: o número de vogais, o número de consoantes, o número de caracteres minúsculos, o número de caracteres maiúsculos e o número de caracteres numéricos.

A entrada de dados deve ter a seguinte forma:
Frase de entrada: #######################

A saída de dados deve ter a seguinte forma:
Frase de Entrada: #######################
Número de vogais: ##
Número de consoantes: ##
Número de caracteres minúsculos: ##
Número de caracteres maiúsculos: ##
Número de caracteres numéricos: ##

Implemente funções para a leitura, escrita e para cada um dos indicadores estatísticos.

Sugestão: relembre/investigue as funções da biblioteca ctype.h. Estas funções têm a seguinte assinatura:
        int nome_função( int carácter )

O valor devolvido é nulo (em C é falso) se o carácter passado como argumento não pertence à classe) e não nulo (em C é verdadeiro) no caso contrário.

Para este exercício, as funções relevantes são:
isalpha
caracteres alfabéticos
isdigit
digitos decimais
islower
letras minúsculas
isupper
letras maiúsculas


Capicua


Especifique uma função que recebe uma string e verifica se a mesma é capicua (lida da esquerda para a direita, ou da direita para a esquerda, é a mesma palavra/frase).

Exemplos típicos: ala ou rapar.

Um caso curioso (e, claro, mais complexo) é a seguinte Capicua brasileira: Socorram-me subi no onibus em Marrocos.


Conversão Romano-Árabe


Especifique uma função que recebe uma string contendo um número escrito em notação romana e que dá como resultado o respectivo valor inteiro (correspondente à notação arábica).


Cifra por substituição arbitrária


Considere a cifra (palavra-chave) constituída pelas letras "SAPO" seguidas de um dígito n (entre 0 e 9). Para a cifragem (codificação) da mensagem efectuam-se os seguintes passos:
  1. reduzem-se espaços seguidos a um único espaço e mantém-se os caracteres de pontuação;
  2. os digitos rodam-se (circularmente) para a direita da quantidade n;
  3. convertem-se todas as letras em maiúsculas ou minúsculas;
  4. considera-se a seguinte tabela de codificação:
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    S A P O B C D E F G H I J K L M N Q R T U V W X Y Z

A construção desta tabela limita-se a colocar a palavra chave no início e completar com as restantes letras do alfabeto, não colocando as letras que se repetem.

Para a codificação, substitui-se cada um dos carácteres da primeira linha pelo carácter correspondente da segunda linha.

Construa um programa que dada uma cifra, codifique a mensagem, e um outro que, dada a mensagem cifrada e a cifra, descodifique a mensagem.