Você está na página 1de 2

Instituto Superior de Engenharia de Lisboa

Programação II
2014/15 – 1.º semestre letivo
Primeira Série de Exercícios

1. Pretende-se fazer a observação do conteúdo de um conjunto de variáveis com diversos tipos para identificar a
representação dos valores e a característica little endian da arquitetura IA-32.
1.1. Escreva a função
void print_memory( void * address, int size );
que apresenta no standard output os valores, em hexadecimal, dos size bytes localizados a partir do
endereço address.
1.2. Escreva um programa de teste que utilize a função anterior para exibir o conteúdo de variáveis com diversos
tipos e valores. Propõe-se que explore, pelo menos, os seguintes casos:
int, com valores positivos e negativos;
char, com valores positivos e negativos;
array de char, preenchido com string incluindo carateres com acentuação;
struct com uma campo do tipo int e outro do tipo char.

2. Considere a representação seguinte de um bit-map formada por uma sequência de palavras em memória, em
que cada palavra representa um conjunto de bits de acordo com a sua dimensão.
typedef unsigned Bitmap[BITMAP_SIZE];
Para manipulação do bit-map usa-se um índice de bit. O primeiro bit tem o índice 0 e é o de menor peso da
palavra localizada no endereço mais baixo.
2.1. Escreva a função
int bit_scan_forward( Bitmap data );
que retorna o índice do primeiro bit com o valor 1, no bit-map data.
2.2. Escreva a função
int bit_scan_reverse( Bitmap data );
que retorna o índice do último bit com o valor 1, no bit-map data.
2.3. Escreva um programa de teste que permita demonstrar a funcionalidade das duas funções anteriores.

3. O código de caracteres UTF-8, suportado pela plataforma Linux que utilizamos, permite a representação de
caracteres compostos, com acentuação ou cedilha. Considerando a existência de dispositivos mais
rudimentares que não fazem a exibição correta desse código, pretende-se construir um programa de conversão
para ASCII básico.

Especificação
Escreva um programa que receba um texto, através de standard input, reproduzindo-o em standard output,
com a substituição de cada carater acentuado por um par acento-carater em ASCII básico. Por exemplo,
admitindo que o executável tem o nome “convert”, e que o standard input é redirecionado de um ficheiro
que contém a palavra “Programação” a execução é a seguinte:
convert < texto
Programa,c~ao
O programa deve ainda admitir um modo de supressão, selecionado pela opção “supress” na linha de
comando, em que suprime os acentos, exibindo apenas o caracter alfabético, sem qualquer acentuação. Nas
condições do exemplo anterior a execução em modo de supressão é:
convert supress < texto
Programacao
Página 1
PG II – 2014/15-1 Primeira Série de Exercícios Página 2

Implementação
O código UTF-8 é uma representação multi-byte com dimensão variável. É compatível com a tabela ASCII
básica, usando um byte para representar índices de 0 a 0x7f. Os caracteres especiais, fora desta gama, são
representados em UTF-8 por uma sequência de dois, três ou quatro bytes com o bit de maior peso a 1. Os
caracteres acentuados, a manipular neste exercício, são codificados por dois bytes: o primeiro com o valor
0xc3 e o segundo com um valor entre 0x80 e 0xbf. A estrutura de dados seguinte representa a associação do
segundo byte do código UTF-8 à sequência pretendida.
typedef struct {
unsigned char utf8_2nd_byte; char ascii_seq[3];
} Charcode;

Charcode table_c3[] = {
{ 0x80, "`A" }, /* À */ { 0x81, "'A" }, /* Á */
{ 0x82, "^A" }, /* Â */ { 0x83, "~A" }, /* Ã */
{ 0x87, ",C" }, /* Ç */ { 0x88, "`E" }, /* È */
{ 0x89, "'E" }, /* É */ { 0x8a, "^E" }, /* Ê */
{ 0x8c, "`I" }, /* Ì */ { 0x8d, "'I" }, /* Í */
{ 0x8e, "^I" }, /* Î */ { 0x92, "`O" }, /* Ò */
{ 0x93, "'O" }, /* Ó */ { 0x94, "^O" }, /* Ô */
{ 0x95, "~O" }, /* Õ */ { 0x99, "`U" }, /* Ù */
{ 0x9a, "'U" }, /* Ú */ { 0x9b, "^U" }, /* Û */
{ 0xa0, "`a" }, /* à */ { 0xa1, "'a" }, /* á */
{ 0xa2, "^a" }, /* â */ { 0xa3, "~a" }, /* ã */
{ 0xa7, ",c" }, /* ç */ { 0xa8, "`e" }, /* è */
{ 0xa9, "'e" }, /* é */ { 0xaa, "^e" }, /* ê */
{ 0xac, "`i" }, /* ì */ { 0xad, "'i" }, /* í */
{ 0xae, "^i" }, /* î */ { 0xb2, "`o" }, /* ò */
{ 0xb3, "'o" }, /* ó */ { 0xb4, "^o" }, /* ô */
{ 0xb5, "~o" }, /* õ */ { 0xb9, "`u" }, /* ù */
{ 0xba, "'u" }, /* ú */ { 0xbb, "^u" }, /* û */
};
O processamento pode ser realizado por leitura do standard input, byte a byte, identificação da gama do
carater obtido e aplicação da substituição quando necessário.
Para identificar a sequência associada a cada caracter acentuado, poderia fazer uma pesquisa no array
table_c3. No entanto, se o texto a processar tiver dimensão elevada, a pesquisa é executada muitas vezes,
tornando-se demorada. Para ter um acesso eficiente, deve criar um array de ponteiros, indexado pelo segundo
byte da representação UTF-8 para referenciar os elementos da tabela de conversão:
Charcode * index[…];
Este array terá que ser inicialmente preenchido, a partir de uma única pesquisa sequencial da tabela. Os
caracteres especiais que não estiverem na tabela devem ser substituídos por underscore “_”; podem ser
identificados, no array, por ponteiro nulo. Se ocorrerem caracteres especiais de outras gamas, com
identificador diferente de 0xc3, devem também ser substituídos por underscore.
Para ensaiar o programa, recomenda-se que use o redireccionamento de standard input, como está indicado
nos exemplos anteriores. Pode também capturar o standard output por redireccionamento para ficheiro.

Notas complementares
Mais informação sobre o código UTF-8 pode ser consultada em http://www.utf8-chartable.de/.
No editor de texto Notepad++, o comando Encoding permite converter texto de outros códigos para UTF-8.
Em anexo é disponibilizado, em UTF-8, o texto de “O Primo Basílio” de Eça de Queirós. Outras obras do
mesmo autor estão acessíveis a partir da página de Internet http://figaro.fis.uc.pt/queiros/eca_intro.html.
ISEL, 2014.10.17

Você também pode gostar