Linguagem C
174 pág.

Linguagem C


DisciplinaFundamentos de Programação405 materiais4.775 seguidores
Pré-visualização38 páginas
\ufffd 
* 
Figura 6.3
Figura 6.3Figura 6.3
Figura 6.3 \u2212 Um vetor de estruturas 
A inicialização de uma tabela é similar àquela de uma matriz; como podemos 
perceber no exemplo a seguir. 
Exemplo 6.10.
Exemplo 6.10.Exemplo 6.10.
Exemplo 6.10. Inicializando uma agenda. 
static PESSOA agenda[] = { 
 { "Itivaldo Buzo", "850-9973", {27, 7, 1970} }, 
 { "Roberto Soares", "266-0879", {15, 11, 1971} }, 
 { "Márcia Ueji", "576-8292", { 9, 5, 1966} }, 
 { "Silvio Lago", "851-7715", {18, 3, 1968} }, 
 { "Mie Kobayashi", "834-0192", { 4, 12, 1973} } 
}; \ufffd 
Exercício 6.7.
Exercício 6.7.Exercício 6.7.
Exercício 6.7. Usando o tipo PESSOA, definido no exemplo 6.6, crie uma função 
para preencher uma agenda com os dados de 5 pessoas. Crie também uma 
função que para procurar na agenda o telefone de uma determinada pessoa e 
codifique um programa para testar essas funções. 
Um vetor cujos elementos são estruturas é denominado tabela e é, geralmente, 
representado com seus elementos dispostos em linhas e os campos em colunas. 
Itivaldo Buzo 850-9973 27/07/1970 
Roberto Soares 266-0879 15/11/1971 
Márcia Ueji 576-8292 09/05/1966 
0 
1 
2 
Mie Kobayashi 834-0192 04/12/1973 4 
nome fone nasc 
Silvio Lago 851-7715 18/03/1968 3 
 
6. ESTRUTURAS E UNIÕES 
104
104104
104 
 
 
Exercício 6.8.
Exercício 6.8.Exercício 6.8.
Exercício 6.8. Usando o tipo de estrutura definido no exercício 6.2, crie e 
inicialize uma tabela com os dados de todos
29
 os vôos de um aeroporto e 
codifique uma rotina para exibi-la em vídeo. 
6.1.3 O
6.1.3 O6.1.3 O
6.1.3 ORDENAÇÃO E 
RDENAÇÃO E RDENAÇÃO E 
RDENAÇÃO E B
BB
BUSCA EM 
USCA EM USCA EM 
USCA EM T
TT
TABELAS
ABELASABELAS
ABELAS 
 
 
Sejam k
0
, k
1
, k
2
, \u2026, k
n
\u2212
1
 chaves distintas e T = \u2329 (k
0
,d
0
), (k
1
,d
1
), \u2026, (k
n
\u2212
1
,d
n
\u2212
1
) \u232a 
uma tabela cujos registros associam a cada chave k
i
 uma informação d
i
, para 
0 \u2264 i < n. Dizemos que T é ordenada se e só se k
0 
< k
1 
< \u2026
 
< k
n
\u2212
1
. Dada uma 
particular chave k e uma tabela T, a busca consiste em determinar um índice
30
 i 
tal que (k
i
,d
i
) \u2208T e que k = k
i
. 
Exercício
ExercícioExercício
Exercício 
 
 6.9.
6.9.6.9.
6.9. 
 
 Usando o algoritmo de ordenação por seleção, codifique uma 
função para ordenar uma tabela cujos registros contêm nomes de pessoas e 
seus respectivos números de telefones. Use o nome como chave de 
ordenação. 
Exercício
ExercícioExercício
Exercício 
 
 6.10.
6.10.6.10.
6.10. 
 
 Usando o algoritmo de busca binária, codifique uma rotina que 
receba como entrada a tabela ordenada no exercício anterior e o nome de uma 
pessoa e exiba como saída o número de telefone correspondente. Caso o 
nome não conste da tabela
31
, deverá ser exibida uma mensagem de erro. 
Ordenação por chaves múltiplas
Ordenação por chaves múltiplasOrdenação por chaves múltiplas
Ordenação por chaves múltiplas 
 
 
Uma vantagem do método da inserção, visto em 1.5.3, é que ele é estável, ou 
seja, itens com chaves iguais na seqüência desordenada mantêm suas 
 
29
 Suponha um número qualquer fixo. 
30
 Se o registro não existe, a busca deve devolver um índice inválido. 
31
 Certifique-se de que a rotina funcione corretamente, independentemente do nome ser fornecido 
em maiúsculas ou minúsculas. 
 
6. ESTRUTURAS E UNIÕES 
105
105105
105 
 
 
posições relativas na seqüência ordenada. Isso significa que podemos usar o 
método de inserção para ordenar tabelas por mais de uma chave. 
 
* 
Exemplo
ExemploExemplo
Exemplo 
 
 6.11.
6.11.6.11.
6.11. 
 
 Seja L = \u2329 (c,2), (a,2), (b,3), (c,1), (a,3), (a,1), (c,3), (b,2) \u232a uma ta-
bela cujos registros desejamos ordenar por ambos os campos. Ordenando L 
pelo segundo campo, obtemos a seqüência L
1
 = \u2329 (c,1), (a,1), (b,1), (c,2), (a,2), 
(b,3), (a,3), (c,3) \u232a. Agora, usando inserção, ordenamos L
1
 pelo primeiro campo 
e obtemos L
2
 = \u2329 (a,1), (a,2), (a,3), (b,1), (b,3), (c,1), (c,2), (c,3) \u232a. O resultado final 
L
2
 é uma tabela ordenada por ambos os campos. Se o método da inserção não 
fosse estável, a ordenação de L
1
 pelo primeiro campo destruiria a ordenação já 
obtida para o segundo campo. \ufffd 
Exercício
ExercícioExercício
Exercício 
 
 6.11.
6.11.6.11.
6.11. 
 
 Considere a tabela do último exemplo. Crie duas versões da 
função insercao(), uma para ordená-la pelo primeiro campo e outra para 
ordená-la pelo segundo campo. Faça um programa que use essas funções 
para obter a tabela ordenada por ambos os campos. 
Exercício
ExercícioExercício
Exercício 
 
 6.12.
6.12.6.12.
6.12. Repita o exercício anterior usando o método da seleção, em 
vez da inserção, e verifique se ele também é estável. 
 
6.2. U
6.2. U6.2. U
6.2. UNIÕES
NIÕESNIÕES
NIÕES 
 
 
Seja L = \u2329a
0
, a
1
, a
2
, \u2026, a
n
\u2212
1
\u232a uma seqüência e \u3c1(0), \u3c1(1), \u3c1(2), \u2026, \u3c1(n\u22121) uma 
permutação dos índices de L tal que a\u3c1(0) \u2264 a\u3c1(1) \u2264 a\u3c1(2) \u2264 \u2026 \u2264 a\u3c1(n\u22121). O método que 
determina uma tal permutação é estável se \u3c1(i) <\u3c1(j), sempre que a\u3c1(i) = a\u3c1(i) e i < j. 
 
6. ESTRUTURAS E UNIÕES 
106
106106
106 
 
 
Uma união é um tipo especial de estrutura capaz de armazenar um único 
membro por vez. Ao contrário da estrutura normal, os membros de uma união 
não ocupam posições consecutivas. Na verdade, todos eles são armazenados 
a partir do mesmo endereço de memória e, por esse motivo, apenas um deles 
pode existir em um dado momento. 
Uma união é um recurso que nos permite armazenar diferentes tipos de dados 
num mesmo local da memória. Quando aloca espaço para uma variável do tipo 
união, o compilador sempre se baseia no tamanho do seu maior membro. 
Assim, para o exemplo a seguir, o compilador alocaria um espaço de 4 bytes, 
que é o espaço necessário para o tipo float. 
Exemplo 6.12.
Exemplo 6.12.Exemplo 6.12.
Exemplo 6.12. Um tipo mutante. 
typedef union { 
 char a; 
 int b; 
 float c; 
} mutante; 
Uma variável do tipo mutante pode armazenar um caracter, um inteiro ou um 
real. É responsabilidade do programador manter registro de qual dos três tipos 
de dados a variável está armazenando em cada momento. \ufffd 
Figura 6.4
Figura 6.4Figura 6.4
Figura 6.4 \u2212 Uma união do tipo mutante 
Exercício 6.13.
Exercício 6.13.Exercício 6.13.
Exercício 6.13. Alguns registradores do microprocessador 80286 são áreas de 
memória de 16 bits que podem também ser usadas como dois registradores de 
8 bits. Por exemplo, o byte superior do registrador AX pode ser acessado como 
AH e o inferior, como AL. Assim, se o valor 0x1234 é armazenado em AX, o 
a 
b 
c 
 
6. ESTRUTURAS E UNIÕES 
107
107107
107 
 
 
registrador AH fica valendo 0x34 e o AL, 0x12. Defina um tipo de dados capaz de 
representar um tal registrador e codifique um programa para testá-lo. 
6
66
6.2.1. U
.2.1. U.2.1. U
.2.1. UNIÕES 
NIÕES NIÕES 
NIÕES E
EE
ETIQUETADAS
TIQUETADASTIQUETADAS
TIQUETADAS 
 
 
Um meio bastante conveniente de se usar uma união é criar uma estrutura con-
tendo dois campos: a união propriamente dita e uma etiqueta, que especifica 
qual membro da união está sendo usado. Para cada membro da união, deve 
ser associado um valor distinto correspondente a sua etiqueta. 
* 
Exemplo 6.13.
Exemplo 6.13.Exemplo 6.13.
Exemplo 6.13. O tipo mutante melhorado. 
typedef struct { 
 int etiqueta; 
 union { 
 char a; /* 1 */ 
 int b; /* 2 */ 
 float c; /* 3 */ 
 } valor; 
} mutante; 
Agora o tipo mutante é uma estrutura composta de uma etiqueta e de uma 
união. A finalidade do campo etiqueta é indicar qual membro da união está em 
uso: caso seja o membro a, a etiqueta armazenará o valor 1;