Académique Documents
Professionnel Documents
Culture Documents
COMPUTADORES
Utilizando Linguagem C-ANSI
Sumário................................................................................................................................................2
Prefácio................................................................................................................................................6
1. Introdução ...................................................................................................................................7
2. A Linguagem C..........................................................................................................................20
2.1 Introdução..........................................................................................................................................20
2.5 Variáveis.............................................................................................................................................22
2
2.5.1 Classe de Variáveis .......................................................................................................................22
2.6 Operadores.........................................................................................................................................23
2.6.2 Aritméticos.....................................................................................................................................23
2.6.7 Precedência....................................................................................................................................25
3. Fluxo de Controle......................................................................................................................26
7.2 Enumerações......................................................................................................................................41
8. Ponteiros ....................................................................................................................................44
10. Funções......................................................................................................................................48
13. Ordenação..................................................................................................................................68
13.5 “Quicksort”........................................................................................................................................70
14.2 Filas.....................................................................................................................................................73
14.5 Exercícios...............................................................................................................................81
15. Bibliografia................................................................................................................................82
5
PREFÁCIO
Esta apostila é destinada aos alunos das disciplinas de Programação de Computadores I
e II do curso de Ciência da Computação. Neste texto, encontra-se, de forma resumida, os conceitos
básicos da linguagem de programação C, estruturas de dados e técnicas de programação baseado no
livro texto e nas referências bibliográficas complementares.
Quaisquer dúvidas, críticas e sugestões serão bem vindas.
6
1. INTRODUÇÃO
7
nossas decisões. Entende-se por lógico o que não permite questionamento, o que é coerente, o que é
óbvio e certo. A lógica de programação em processamento de dados é a forma pela qual se
representa em uma linguagem, ou símbolos que expressam essa linguagem, instruções que são
executados por um computador.
A lógica de programação é diretamente influenciada pela forma como raciocinamos, ou
seja, dado um problema de processamento de dados os passos realizados para a análise podem
deve-se realizar uma análise seguindo os seguintes passos:
a) Entender o problema proposto;
b) Definir os objetivos a serem alcançados;
c) Verificar todos os dados disponíveis para resolvê-lo;
d) Estabelecer uma seqüência de ações para resolução do problema;
e) Dividir o problema em partes menores, se necessário;
f) Rever os passos anteriores caso o objetivo não seja atingido.
“...a informação é a medida da redução da incerteza sobre um determinado estado de coisas por
intermédio de uma mensagem. Neste sentido, a informação não deve ser confundida com o significado e
apresenta-se como função direta do grau de originalidade, imprevisibilidade ou valor-surpresa da
mensagem, sendo quantificada em bits de informação...”
A unidade básica que representa a informação é o bit, cujo valor compreende um entre
duas possibilidades mutuamente exclusivas. Um bit é uma contração das palavras binary digit ou
dígitos binários. Os dígitos binários 0 e 1 são usados para representar os dois possíveis estados de
determinado bit.
Um programa processa dados, isto é, entra-se com os dados no programa que os
processa e, disponibiliza a informação processada. Um programa é constituído de algoritmos e
estrutura de dados, ou seja, a estrutura de dados recebe as informações e o algoritmo processa-os.
As estruturas de dados são organizações conceituais de informações, isso é, organizam
as informações que representam uma situação real. Uma estrutura de dados permite apresentar uma
forma mais compreensível de se observar as informações, oferecendo, assim, um nível de abstração
na solução de problemas, porém, de acordo com a forma da organização, pode comprometer a
eficiência do algoritmo que manipula essa informação.
Um algoritmo é descrito na literatura como:
8
“ ...uma série de passos organizados que descrevem um processo que se deseja seguir para dar solução a
um problema específico... ”
considerando-se que:
“ ...é uma seqüência finita de instruções, cada uma das quais possuem um significado claro e pode ser
executada com uma quantidade finita de esforço ao longo de um tempo também finito... ”
Desta foram, defini-se que os algoritmos são instruções que descrevem um padrão de
comportamento expresso em termos de um conjunto finito de ações, ou seja, é um conjunto
seqüencial de ações executáveis ao longo de um tempo finito para obtenção de uma solução para
um determinado tipo de problema.
Indica início ou final do Operação de atribuição e Conectores de páginas Operação de saída de dados
diagrama de fluxo chamada ou retorno de em vídeo
subalgoritmo
Arco de fluxo
Operação de entrada de dados Conector de fluxo Decisão
de dados
10
Início
Leia N1 e
N2
M = (N1 + N2)/2
Imprima
N
M>=6 “Reprovado”
S
Imprima Fim
“Aprovado”
Seqüência <Comando>
1 2 3 4
Interação <Condição>
<Condição>
11
A figura 1.4 apresenta um exemplo do tipo de diagrama de Chapin para o algoritmo de
cálculo da média de um aluno.
Início
Leia N1, N2
Média = (N1+N2)/2
Média >=7?
S N
Escreva Escreva
“Aprovado” “Aprovado”
Fim
12
Algoritmo Média
Declare N1, N2, Média Real
Início
Leia N1, N2
Média ← (N1+N2)/2
Se Média >=7
Então
Escreva “Aprovado”
Do contrário
Escreva “Reprovado”
Fim
13
máquina é complexa para maioria das pessoas, dessa forma usamos uma linguagem de um nível
maior para escrever nossos programas.
As linguagens de alto nível podem se distinguir quanto a sua aplicação em genéricas
como C, Pascal e Basic ou específicas como Fortran (cálculo matemático), GPSS (simulação), LISP
(inteligência artificial) ou CLIPPER (banco de dados). A principal vantagem é que os programas
podem ser compiladas ou interpretadas tornando-os portáveis, isto é, podem ser executados em
varias plataformas com pouquíssimas modificações. Em geral, a programação torna-se mais fácil
por causa do maior ou menor grau de estruturação de suas linguagens. A desvantagem é que em
geral, as rotinas geradas (em linguagem de maquina) são mais genéricas e portanto mais complexas
e por isso são mais lentas e ocupam mais memória.
14
9 Seqüência: Implementa os passos de processamento necessários para descrever qualquer
programa;
9 Seleção: Especifica a possibilidade de selecionar o fluxo de execução do processamento
baseado em ocorrências lógicas;
9 Iteração: Permite a execução repetitiva de segmentos do programa.
Em linguagem C, o principal componente estrutural é a função, isto é, são sub-rotinas
ou blocos de construção em que são realizadas as atividades pré-estabelecidas. A função tem como
objetivo conceitual realizar essas atividades adequadamente sem criar efeitos inesperados em outras
partes do programa. Outra forma de estruturar e modularizar o código em linguagem C é pelo uso
de blocos de código. Um bloco de código é um grupo de comandos que é tratado como uma
unidade.
Portanto, a modularização do código permite que os programas possam:
9 Compartilhar seções de códigos;
9 Realizar facilmente manutenções no código;
9 Facilitar a compreensão de programas através do número restrito sub-rotinas.
15
1.8.1.1 Sistema de Numeração Binária
Neste sistema, cada posição de bit representa uma potência de 2. O inteiro é
representado por uma soma de potências de 2. Se o valor for 1 em determinada posição, a potência
de 2 representada por essa posição de bit será incluída na soma porém, se o valor for 0, essa
potência de 2 não será incluída na soma. A figura 1.6 apresenta um exemplo. Portanto, uma
seqüência de bits de tamanho n pode representar um número inteiro não negativo entre 0 a 2(n-1).
00100110
1ª posição
2ª posição 21 + 22 + 25 = 38
5ª posição
(00100110)2=(38)10 (-38)10=(11011001)2
(-38)10=(11011001)2 11011001+1=11011010=(-38)10
16
1.8.1.2 Decimal Codificado em Binário
Neste sistema, uma seqüência de bits pode ser usada para representar inteiros da
seguinte forma: cada quatro bits representa um dígito decimal entre 0 e 9. Desta forma, uma
seqüência representa o número formado por esses dígitos decimais na notação decimal
convencional (figura 1.9).
2
00100110 0010 0110 26
6
Mantissa*baseexpoente 387,53=38753*10-2
1.9 Exercícios
Construir algoritmos em português estruturado, diagrama de blocos e português
estruturado para os seguintes exercícios:
1. Construa um algoritmo detalhado para trocar uma lâmpada.
2. Construa um algoritmo para fazer uma ligação telefônica.
3. Construa um algoritmo para comer uma barra de chocolate.
4. Construa um algoritmo para fazer o cálculo das suas despesas do mês.
5. Calcular o número de dias existentes entre dois anos digitados pelo usuário.
6. Dados o consumo em m3 de água dos três últimos meses, elaborar um algoritmo que calcule a
estimativa da conta do próximo mês, sabendo-se que o preço por m3 é de R$ 3,50.
18
7. Calcular e mostrar o tempo em anos, meses, dias, horas, minutos e segundos de um ano digitado
pelo usuário em relação ao ano atual.
8. Elabore um algoritmo que calcule a hipotenusa de um triângulo retângulo dados as medidas dos
dois catetos.
9. Um automóvel tem um consumo médio de 1 litro de gasolina para cada 16 km rodados. Dados:
Distância percorrida. Calcule a quantidade de gasolina consumida.
10. Calcular o custo de um bolo de aniversário, sabendo-se que o preço por quilo de bolo é R$
16,00. Dado: Peso total do bolo.
11. A velocidade de um ponto material é regida pela equação apresentada a seguir. Faça um
algoritmo que calcule a velocidade v (m/s), dado uma entrada t (s).
v = 10 + 5 * t
12. Dado: Nome, Endereço e Telefone. Construa um programa para ler e mostrar os dados digitados
pelo usuário.
13. Elabore um algoritmo que dado dois número fornecidos pelo usuário, fazer uma calculadora que
pode realizar as seguintes operações: soma, subtração, multiplicação e divisão.
14. Elabore um algoritmo que dados três números, verifique qual é o maior, o menor e a média.
15. Elabore um algoritmo que dados 10 números reais, calcule a média aritmética.
16. Elabore um algoritmo que apresente a tabuada de multiplicação de um número fornecido pelo
usuário.
17. Em uma distribuidora, sabe-se que os vinhos tipo tinto custam R$ 8,50, os de tipo branco R$
8,00 e o rosê R$ 9,00. Dado o tipo do vinho e a quantidade comprada, elabore um algoritmo que
calcule o valor que o cliente vai pagar.
18. Elabore um algoritmo que calcule a soma de dez números pares fornecidos pelo usuário. Se o
número for ímpar, emitir mensagem informando o usuário. Emitir o resultado da soma.
19. Construa um algoritmo para somar e contar os números pares e ímpares de 30 números inteiros
inseridos pelo usuário.
20. Dados: sexo e idade dos alunos. Construa um algoritmo para verificar em uma classe com 50
alunos quantos são do sexo feminino e masculino e, quantos da classe toda são maiores que 18
anos. Ao final mostre os resultados.
21. Construa um algoritmo para o funcionamento de uma máquina de lavar roupa.
22. Construa um algoritmo para o funcionamento de uma máquina de refrigerante.
19
2. A LINGUAGEM C
2.1 Introdução
A linguagem C é uma linguagem de alto nível, genérica. O C foi criada no centro de
pesquisas da Bell Laboratories em 1972 por Dennis Ritchie tendo como meta características de
flexibilidade e portabilidade. Em 1983 a ANSI (American National Standards Institute)
estabeleceu um padrão C ANSI. A linguagem C é classificada como linguagem de alto nível
somando-se as funcionalidades de linguagens de baixo nível, isto é, C permite a manipulação de
bits, bytes e endereços e, ao mesmo tempo, suportam o conceito de tipos de dados.
A linguagem C é uma linguagem estruturada.
Outro aspecto a ser considerado, é que o padrão C ANSI estabelece 32 palavras-
chaves. São palavras reservadas que são os comandos que compõem a linguagem C. As linguagens
de alto nível tipicamente possuem várias vezes esse número de palavras reservadas.
A linguagem C é uma linguagem compilada. A geração do programa executável a partir
do programa fonte obedece a uma seqüência de operações:
9 Criar o programa;
9 Compilar o programa;
9 Linkeditar o programa.
20
programa principal. Comentários no programa são colocados entre /* e */ não sendo considerados
na compilação. Cada instrução encerra com ; (ponto e vírgula) que faz parte do comando.
A forma geral de um programa em C é:
1. #include <stdlib.h>
#include <stdio.h>
Componentes Iniciais: arquivos de
cabeçalho, declaração de constantes, int x=20;
void func(void);
protótipos e variáveis globais.
int main(void)
{
Função main(): Variáveis locais e instruções int y=10;
printf(“Variável global x=%d\n”, x);
do programa. printf(“Variável y=%d\n”, y);
func();
return(0);
}
Implementação de Funções: Variáveis locais
e definição das funções void func(void)
{
printf(”Fim\n”);
}
O padrão C ANSI determina 32 palavras-chave ou palavras reservadas que, combinadas
com a sintaxe formal de C, foram a linguagem de programação C (tabela 2.1).
2.3 Identificadores
Identificadores são os nomes usados para referenciar objetos definidos pelos usuário,
isto é, nomes de variáveis, funções, rótulos, entre outros. O primeiro caractere deve ser uma letra ou
um sublinhado e os caracteres subseqüentes devem ser letras, números ou sublinhados. O padrão C
ANSI determina que identificadores podem ter qualquer tamanho, porém em geral, dependendo do
compilador utilizado, considera-se apenas os 31 primeiros caracteres.
Os identificadores não podem ser igual a uma palavra-chave de C ou nome de funções
criadas pelo usuário ou que estão nas bibliotecas C.
Em C, letras maiúsculas e minúsculas são tratadas diferentemente. Por exemplo:
int count, Count, COUNT;
Logo, count, Count e COUNT são três identificadores distintos.
21
2.4 Tipos de Dados
Em C, há cinco tipos básicos de dados: caractere, inteiro, ponto flutuante, ponto
flutuante de precisão dupla e sem valor: char, int, float, double e void, respectivamente. O
tamanho e a faixa desses tipos de dados variam de acordo com o tipo de processador e com a
implementação do compilador em C. O padrão C ANSI estipula apenas a faixa mínima de cada tipo
de dado, não o seu tamanho em bytes (tabela 2.2). O tipo void declara explicitamente uma função
que não retorna valor algum ou cria ponteiros genéricos.
Em algumas situações é necessário modificar um tipo básico para atender às
necessidades de diversas situações. Isto é conseguido através do uso de modificadores que alteram o
significado de um tipo básico. Exceto o tipo void, todos os demais tipos básicos podem ter vários
modificadores precedendo-os.
Os modificadores podem ser:
signed unsigned long short
2.5 Variáveis
Variável é uma posição nomeada de memória utilizada para armazenar um valor que
pode ser modificado pelo programa. As variáveis devem ser declaradas da seguinte forma:
<tipo> <nome_da_variavel>; int x;
2.6 Operadores
2.6.1 Atribuição
O operador de atribuição pode ser utilizado dentro de qualquer expressão válida em C.
A forma geral do operador de atribuição é:
nome_da_variavel = expressão; x = 10;
A atribuição é válida para variáveis de tipos diferentes, ou seja, é possível converter os
tipos de forma automática. Esta conversão é conhecida como conversão de tipos, porém deve-se
observar que poderá ocorrer uma possível perda de informação.
Em C, é permitido atribuição do mesmo valor para muitas variáveis em uma única
expressão:
var1 = var2 = var3 = expressão; x = y = z = 0;
2.6.2 Aritméticos
Os operadores aritméticos de C são:
- Subtração
+ Adição
* Multiplicação
/ Divisão
% Módulo da divisão (resto)
23
2.6.4 Relacionais e Lógicos
O operador relacional refere-se à relação que os valores podem ter uns com os outros. O
operador lógico refere-se à maneira como essas relações podem ser conectadas. A idéia de
verdadeiro e falso é a base dos conceitos dos operadores lógicos e relacionais. Em C, verdadeiro é
qualquer valor diferente de zero. Falso é zero. As expressões que usam operadores relacionais ou
lógicos devolvem zero para falso e 1 para verdadeiro (tabela 2.3). A tabela 2.4 apresenta a tabela
verdade dos operadores lógicos utilizando 1s e 0s.
24
2.6.6 Outros Operadores
Tabela 2.7 Outros operadores.
?: Exp1 ? Exp2 : Exp3
& “o endereço de”
* “o valor do endereço de”
sizeof(f) Retorna o tamanho em bytes de f
, Separa seqüência de operações
. Referência a elementos
-> individuais de estruturas e
uniões.
() Organizar precedência.
[] Indexação de matrizes.
1. #include <stdlib.h>
2. #include <stdio.h>
3.
4. int main(void)
5. {
6. int x, y;
7. printf(“Digite valor de x=”);
8. scanf(&x);
9. printf(“Digite valor de y=”);
10. scanf(&y);
11. print((x>y)? “x>y\n”:((x=y)? “x=y\n”: “x<y\n”)
12. return(0);
13. }
2.6.7 Precedência
Tabela 2.8 Precedência dos operadores em C.
Maior () [] ->
! ~ ++ -- * & sizeof
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
?:
Menor = += -= *=
25
3. FLUXO DE CONTROLE
26
1. #include <stdlib.h> 1. #include <stdlib.h> 1. #include <stdlib.h>
#include <stdio.h> #include <stdio.h> #include <stdio.h>
27
1. #include <stdlib.h> 1. #include <stdlib.h> 1. #include <stdlib.h>
#include <stdio.h> #include <stdio.h> #include <stdio.h>
28
4. ENTRADA E SAÍDA
As funções printf() e scanf() realizam entrada e saída formatada, isto é, permite a
leitura e a escrita de dados em vários formatos.
O printf() é uma função de I/O, que permite escrever no dispositivo padrão (tela). A
expressão de controle pode conter caracteres que serão exibidos na tela e os códigos de formatação
(tabela 3.1) que indicam o formato em que os argumentos devem ser impressos. Cada argumento
deve ser separado por vírgula.
O scanf() também é uma função de I/O implementada em todos compiladores C. Ela é o
complemento de printf() e nos permite ler dados formatados (tabela 4.1) da entrada padrão
(teclado). Sua sintaxe é similar a printf().
int printf(const char *str, ...); int scanf(const char *str, ...);
1. #include <stdlib.h>
#include <stdio.h>
int main(void)
{
char c;
int x;
float y;
c=’d’;
x=c;
y=19.234;
printf(’%c\n’, c);
printf(’%d\n’, x);
printf(’%f\n’, y);
printf(’%.3f\n’, y);
printf(’%.2f\n’, y);
printf(’%.1f\n’, y);
return(0);
}
4.1 Exercícios
1. Faça um programa que receba três números inteiros, calcule e mostre a soma desses números.
2. Faça um programa que receba três notas, calcule e mostre a média aritmética dessas notas.
3. Faça um programa que receba três notas e seus respectivos pesos, calcule e mostre a média
ponderada dessas notas. As notas deverão estar na faixa entre 0 e 10.
29
4. Faça um programa que receba o valor de um depósito e o valor da taxa de juros, calcule e
mostre o valor do rendimento e o valor total depois do rendimento.
5. Faça um programa que calcule e mostre a área de um triângulo. Sabe-se que: Área = (base *
altura)/2.
6. Faça um programa que calcule e mostre a área de um círculo. Sabe-se que: Área = π * R2.
(π=3,14)
7. Faça um programa que calcule e mostre a área de um trapézio. Sabe-se que: Área = ((base maior
+ base menor)*altura)/2.
8. Faça um programa que calcule e mostre a área de um losango. Sabe-se que: Área = (diagonal
maior * diagonal menor)/2.
9. Faça um programa para calcular a área de um triângulo. Esse programa não pode permitir a
entrada de dados inválidos, ou seja, medidas menores ou iguais a 0.
10. Faça um programa que receba um número positivo e maior que zero, calcule e mostre:
a) O número digitado ao quadrado;
b) O número digitado ao cubo;
c) a raiz quadrada do número digitado.
11. Faça um programa que receba dois números maiores que zero, calcule e mostre um elevado ao
outro.
12. Faça um programa que calcule e mostre a tabuada de um número digitado pelo usuário.
13. Faça um programa que receba o número de horas trabalhadas e o valor do salário mínimo.
Calcule e mostre o salário a receber seguindo as regras abaixo:
a) A hora trabalhada vale a metade do salário mínimo;
b) O salário bruto equivalente ao número de horas trabalhadas multiplicado pelo valor da hora
trabalhada;
c) O imposto eqüivale a 3% do salário bruto;
d) O salário a receber eqüivale ao salário bruto menos o imposto.
14. Um trabalhador recebeu seu salário e o depositou em sua conta corrente bancária. Esse
trabalhador emitiu dois cheques e agora deseja saber seu saldo atual. Sabe-se que cada operação
bancária de retirada paga CPMF de 0,38% e o saldo inicial da conta está zerado. Elabore um
programa que apresente os lançamentos, o total de impostos descontados e o saldo atual.
15. Pedro comprou um saco de ração com peso em quilos. Pedro possui dois gatos para os quais
fornece a quantidade de ração em gramas. Faça um programa que receba o peso do saco de
ração e a quantidade de ração fornecida para cada gato. Calcule e mostre quanto restará de ração
no saco após cinco dias.
30
16. Cada degrau de uma escada tem X de altura. Faça um programa que receba essa altura e a altura
que o usuário deseja alcançar subindo a escada. Calcule e mostre quantos degraus o usuário
deverá subir para atingir seu objetivo, sem se preocupar com a altura do usuário.
17. Faça um programa que receba o preço de um produto, calcule e mostre o novo preço sabendo-se
que este sofreu um desconto de 10%.
18. Faça um programa que receba o salário-base de um funcionário, calcule e mostre o salário a
receber, sabendo-se que esse funcionário tem gratificação de 5% sobre o salário-base e paga
imposto de 7% sobre o salário-base.
19. Sabe-se que um quilowatt de energia custa um quinto do salário mínimo. Faça um programa que
receba o valor do salário mínimo e a quantidade de quilowatts consumida por uma residência.
Calcule e mostre:
a) O valor (R$) de cada quilowatt;
b) O valor (R$) a ser pago por essa residência;
c) O valor (R$) a ser pago com desconto de 15%.
20. Faça um programa que receba o salário de um funcionário e o percentual de aumento., calcule e
mostre o valor do aumento e o novo salário.
21. A nota final de um estudante é calculada a partir de três notas atribuídas respectivamente a um
trabalho de laboratório, a avaliação semestral e a um exame final. A média das três notas
mencionadas anteriormente obedece aos pesos a seguir:
NOTA PESO
Trabalho de laboratório 2
Avaliação semestral 3
Exame final 5
22. Faça um programa que receba as três notas, calcule e mostre a média ponderada e o conceito
que segue a tabela abaixo.
MÉDIA PONDERADA CONCEITO
10,0 <= media <= 8,0 A
8,0< media <= 7,0 B
7,0 < media <= 6,0 C
6,0 < media <= 5,0 D
5,0 < media E
23. Faça um programa que receba três notas de um aluno, calcule e mostre a médias aritmética e a
mensagem que segue a tabela abaixo. Para alunos de exame, calcule e mostre a nota que deverá
ser tirada no exame para a aprovação, considerando que a média no exame é 6,0.
MÉDIA ARITMÉTICA MENSAGEM
3,0 > media Reprovado
3,0 <= media < 7,0 Exame
7,0 <= media Aprovado
24. Faça um programa que receba dois números e mostre o maior.
25. Faça um programa que receba três números e mostre-os em ordem crescente.
31
26. Faça um programa que receba três números inteiros em ordem crescente e um quarto número
também inteiro que não siga esta regra. Mostre, em seguida, os quatro números em ordem
decrescente. Deve-se verificar se os três primeiros números estão em ordem crescente
27. Faça um programa que receba um número inteiro e verifique se esse número é par ou ímpar.
28. Elabore um programa que calcule as raízes de uma equação a segundo grau.
f ( x) = a * x 2 + b * x + c
f ( x) = 0
∆ = b2 − 4 * a * c
−b± ∆
x1, 2 =
2*a
29. Faça um programa que mostre o menu de opções a seguir, receba a opção do usuário e os dados
necessários para executar cada operação.
Menu de opções:
1: Somar dois números
2: Raiz quadrada de um número
Digite a opção desejada:
30. Faça um programa que determine a data cronologicamente maior de duas datas fornecidas pelo
usuário. Cada data deve ser fornecida por três valores inteiros, onde o primeiro representa o dia,
o segundo o mês e o terceiro o ano.
31. Faça um programa que receba o código correspondente ao cargo de um funcionário e seu salário
atual e mostre o cargo, o valor do aumento e seu novo salário. Os cargos estão na tabela a
seguir:
CÓDIGO CARGO PERCENTUAL
1 Escriturário 50%
2 Secretário 35%
3 Caixa 20%
4 Gerente 10%
5 Diretor Não tem aumento
32. Faça um programa que receba o salário de um funcionário, calcule e mostre o novo salário desse
funcionário, acrescido de bonificação e de auxílio-escola.
SALÁRIO BONIFICAÇÃO SALÁRIO AUXÍLIO-ESCOLA
Até R$ 500,00 5% Até R$ 600,00 R$ 150,00
Entre R$ 500,00 e R$ 1200,00 12% Mais que R$ 600,00 R$ 100,00
Acima de R$ 1200,00 Sem bonificação
33. Faça um programa que leia um número indeterminado de valores para m, todos inteiros e
positivos, um de cada vez. Se m for par, verifique quantos divisores possui. Se m for ímpar,
calcule a soma dos números inteiros de 1 até m (m não deve entrar nos cálculos). Mostre os
cálculos realizados.
32
34. Faça um programa que calcule o fatorial de um número inteiro fornecido pelo usuário.
se n > 1 : n! = n * (n − 1) * (n − 2) * ... * 3 * 2 *1
se n = 1 : n! = 1!= 1
se n = 0 : n! = 0!= 1
35. Faça um programa que leia o número de termos n e um valor positivo para x, calcule e mostre o
valor da série a seguir:
x1 x 2 x 3 x 4 x 5 x 6 x 7 xn
S= + + + + + + + ... +
1! 2! 3! 4! 5! 6! 7! n!
0 − 1 − 1 − 2 − 3 − 5 − 8 − 13 − 21 − 34 − 55 − ...
37. Faça um programa que leia o número de termos e um valor positivo para X, calcule e mostre o
valor da série a seguir:
x 2 x3 x 4 x5 x 6 x 7 x8 x n−1
S = 1+ + + + + + + + ... +
3! 4! 5! 6! 7! 8! 9! n!
38. Faça um programa que calcule a soma dos primeiros 50 números pares iniciando de 2.
39. Faça um programa que mostre os primeiros 50 números múltiplos de 2 iniciando de 2.
40. Faça um programa que calcule a soma dos primeiros 50 números ímpares iniciando de 3.
41. Faça um programa que mostre os primeiros 50 números múltiplos de 3 iniciando de 3.
42. Faça um programa que leia dois valores inteiros e positivos: x e y, calcule e mostre a potência
xy, utilizando uma estrutura de repetição.
43. Faça um programa que receba o ângulo de incidência dos raios solares, a altura de uma pessoa
em metros e retorne o comprimento da sombra dessa pessoa conforme a figura abaixo.
33
5. VETORES E MATRIZES
Matriz é uma coleção de variáveis do mesmo tipo referenciada por um nome comum. O
acesso aos elementos é realizado mediante um índice ou pelo endereço. O endereço mais baixo ou
índice (0) corresponde ao primeiro elemento e o mais alto, ao último elemento. As matrizes podem
possuir várias dimensões.
Matrizes unidimensionais, ou vetores, são matrizes que possuem apenas uma dimensão.
Os vetores são, essencialmente, listas de informações do mesmo tipo, que são armazenadas em
posições contíguas da memória em uma ordem de índice. A figura 5.1 apresenta um exemplo de
matriz unidimensional. Considerando-se que cada bloco armazena um único caractere, a matriz no
exemplo pode armazenar nove caracteres seqüenciais.
5.1 Exercícios
1. Faça um programa que carregue uma matriz 2x2, calcule e mostre uma matriz resultante que
será a matriz digitada multiplicada pelo maior elemento da matriz.
34
2. Faça um programa que carregue uma matriz 10x3 com as notas de dez alunos em três provas.
Mostre um relatório com o número do aluno (número da linha) e a prova em que cada aluno
obteve menor nota. Ao final do relatório, mostre quantos alunos tiveram menor nota na prova 1,
quantos alunos tiveram menor nota na prova 2 e quantos alunos tiveram menor nota na prova 3.
3. Faça um programa que carregue uma matriz 10x20 com números inteiros e some cada uma das
linhas, armazenando o resultado das somas em um vetor. A seguir, multiplique cada elemento
da matriz pela soma da linha e mostre a matriz resultante.
4. Na teoria dos sistemas define-se o elemento MINMAX de uma matriz como sendo o maior
elemento da linha onde se encontra o menor elemento da matriz. Faça um programa que
carregue uma matriz 4x7 com números reais, calcule e mostre seu MINMAX e sua posição
(linha e coluna).
5. Faça um programa que carregue uma primeira matriz de ordem 4x5 e uma segunda matriz 5x2,
calcule e mostre a matriz resultante do produto matricial das duas matrizes anteriores,
armazenando-o em uma terceira matriz de ordem 4x2.
6. Faça um programa que carregue uma matriz 15x5 com números inteiros, calcule e mostre quais
os elementos da matriz que se repetem e quantas vezes cada um está repetido.
7. Faça um programa que carregue uma matriz 6x4 com números inteiros, calcule e mostre
quantos elementos dessa matriz são maiores que 30 e, em seguida, mostre uma segunda matriz
com os elementos diferentes de 30. No lugar do número 30 da segunda matriz coloque o número
zero.
8. Faça um programa que carregue uma matriz 10x10 com números inteiros, execute as trocas
especificadas a seguir e mostre a matriz resultante.
• A linha 2 com a linha 8;
• A coluna 4 com a coluna 10;
• A diagonal principal com a diagonal secundária;
• A linha 5 com a coluna 10.
9. Faça um programa que carregue uma matriz 8x8 com números inteiros e mostre o maior e
menor número com as respectivas posições (linha, coluna).
10. Faça um programa que carregue uma matriz 8x8 com números inteiros e mostre a quantidade de
números pares e ímpares.
11. Faça um programa que carregue uma matriz 8x8 com números reais, calcule a média de todos
os elementos e mostre a quantidade de números que são maiores ou iguais a média e sua
respectiva posição.
35
12. Faça um programa que carregue uma matriz 5x5 de números reais, calcule a média aritmética
dos elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na
matriz.
13. Faça um programa que construa a tabela apresentada a seguir em uma matriz. Dado um número
digitado pelo usuário, exiba o mês do ano correspondente de acordo com a tabela. Emitir
mensagem de erro se o código for inválido.
Código Mês Código Mês
1 Janeiro 7 Julho
2 Fevereiro 8 Agosto
3 Março 9 Setembro
4 Abril 10 Outubro
5 Maio 11 Novembro
6 Junho 12 Dezembro
14. Faça um programa que leia um vetor de 20 números inteiros. Dado uma entrada do usuário,
verifique se há esse número no vetor, quantos números e em qual posição.
15. Elabore um programa que calcule o produto de duas matrizes de ordem 3.
3 2 1 9 3 + 2 2 + 9 5 11
5 − 9 + 3 1 = 5 + 3 − 9 + 1 = 8 − 8
a b
D= = a *d − b*c
c d
x y z
D = a b c = x * b * p + y * c * m + z * a * n − z * b * m − x * c * n − y * a * p
m n p
19. Considere o triângulo de vértices A(2;1), B(5; 2) e C(3; 4) apresentado na figura a seguir. A
área do triângulo ABC é calculada de acordo com a fórmula abaixo, onde D é a determinante da
matriz de ordem 3, onde a primeira coluna é formada pelas abscissas dos pontos A, B e C, a
segunda coluna é formada pelas respectivas ordenadas e a terceira coluna é unitária. Elabore um
36
programa que receba as coordenadas dos vértices A, B e C e calcule a área do triângulo.
ATENÇÃO: Se a determinante D=0 então os três pontos não formam um triângulo, portanto,
são pontos de uma mesma reta!!!
a x a y 1
D = bx by 1
cx c y 1
1
S ABC = * D
2
20. Numa matriz quadrada, os elementos aij tais que i=j formam o que chamamos de diagonal
principal da matriz. Elabore um programa que imprima os elementos da diagonal principal de
qualquer matriz mxm.
21. Dada uma matriz A(mxn), a matriz que se obtém trocando ordenadamente as linhas pelas
colunas chama-se transposta de A, e é indicada por At (ou por At). Elabore um programa que
receba uma matriz A(3x2) e crie a matriz At.
37
6. MANIPULAÇÃO DE “STRINGS”
String é uma cadeia de caracteres armazenadas uma matriz unidimensional (vetor) de
caracteres finalizada pelo caractere nulo, ou seja, por meio de ‘\0’, isto é, indica o fim da string.
Desta forma, deve-se declarar sempre o vetor com uma posição a mais para armazenar o caractere
nulo. Por exemplo, a seguinte instrução declara um vetor nome que guarda uma string de 10
caracteres:
char nome[11];
Em programação, é comum o uso de matrizes de string. Para criar uma matriz de
strings, utiliza-se uma matriz bidimensional de caracteres. O seguinte exemplo apresenta o uso de
uma matriz de string.
1. #include <stdlib.h>
2. #include <stdio.h>
3.
4. #define MAX 10
5. #define LEN 31
6.
7. char lista[MAX][LEN];
8.
9. int main(void)
10. {
11. int i;
12. for (i=0; i<MAX; i++)
13. {
14. printf(”Digite um nome:”);
15. scanf(”%s”,lista[i]);
16. }
17. for (i=0; i<MAX; i++)
18. printf(”%d - %s\n”, i+1, lista[i]);
19. return(0);
20. }
6.1 Exercícios
1. Faça um programa que receba uma palavra, calcule e mostre a quantidade de caracteres.
2. Faça um programa que receba uma palavra, calcule e mostre a quantidade de vogais.
3. Faça um programa que receba uma palavra, troque todas as vogais por * e apresente o resultado
4. Faça um programa que receba duas palavras e gere uma terceira que represente a combinação
das duas anteriores.
5. Faça um programa que receba uma palavra e coloque os caracteres em ordem crescente.
6. Faça um programa que receba uma palavra e inverta a ordem dos caracteres.
7. Faça um programa eu receba uma frase, calcule e mostre a quantidade de vezes que o caractere
a aparece.
8. Faça um programa que receba uma frase, calcule e mostre a quantidade de consoantes da frase
digitada.
9. Faça um programa que receba uma frase, calcule e mostre a quantidade de vogais da frase
digitada.
38
10. Faça um programa que receba uma frase e mostre a quantidade total de cada caractere na frase.
11. Faça um programa que armazene 10 nomes.
12. Faça um programa que armazene 10 nomes. Dado uma entrada do usuário, pesquise e apresente
se encontrado o nome (em que posição do vetor).
13. Faça um programa que receba uma frase, calcule e mostre a quantidade de palavras da frase
digitada.
14. Faça um programa que receba uma frase. Caso a frase possua meses por extenso substitua-os
pelo seu número correspondente.
15. Faça um programa que mostre a data do sistema nos seguintes formatos: “dia/mês/ano” e “São
Paulo, 14 de setembro de 2001”.
16. Elabore um programa que receba uma frase e mostre a quantidade de palavras, quais os
caracteres existentes e a quantidade de cada caractere.
39
7. ESTRUTURAS, ENUMERAÇÕES E UNIÕES
A linguagem C permite criar tipos de dados utilizando:
• Estruturas;
• Uniões;
• Enumerações.
7.1 Estruturas
Estrutura (structure) é um tipo de dado formado por um conjunto de variáveis
referenciadas por um nome. As estruturas permitem organizar os dados na memória e estabelecer
um inter-relacionamento entre os mesmo de modo que facilite a manipulação dos dados e ofereça
maior clareza aos programas.
Em C é declarada uma estrutura da seguinte maneira:
struct <nome_da_struct> struct cliente
{ {
<tipo> <variável_1>; char nome[41];
<tipo> <variável_2>; char sobrenome[41];
... };
<tipo> <variável_n>;
};
A palavra struct define uma declaração, seguida do nome da estrutura e das respectivas
variáveis delimitadas pelas chaves. As variáveis são denominadas membros da estrutura. A
declaração de variáveis do tipo estrutura pode ser realizada da seguinte maneira:
struct cliente struct cliente
{ {
char nome[41]; char nome[41];
char sobrenome[41]; char sobrenome[41];
}*x, y, z[5]; };
...
struct cliente *x, y, z[5];
A referência ou o acesso a um determinado membro da estrutura é dado por uma
construção do tipo para variáveis e ponteiros:
<nome_da_estrutura>.<membro> <nome_da_estrutura>-><membro>
Exemplo:
1. #include <stdlib.h> 14. scanf("%s", &y.nome);
2. #include <stdio.h> 15. printf("Ola %s!\n", y.nome);
3. 16. printf("Digite seu nome: ");
4. struct cliente 17. scanf("%s", &x->nome);
5. { 18. printf("Ola %s!\n", x->nome);
6. char nome[41]; 19. printf("Digite seu nome: ");
7. char sobrenome[41]; 20. scanf("%s", &z[0].nome);
8. }*x, y, z[5]; 21. printf("Ola %s!\n", z[0].nome);
9. 22. return(0);
10. int main(void) 23. }
11. {
12. x=&y;
13. printf("Digite seu nome: ");
40
7.2 Enumerações
Enumeração é um conjunto de constantes inteiras que especifica todos os valores legais
que uma variável desse tipo pode ter. Considere o seguinte exemplo:
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. enum dia_da_semana {Segunda, terca, quarta, quinta, sexta, sabado, domingo};
5.
6. int main(void)
7. {
8. enum dia_da_semana dia;
9. printf("Digite um numero de 0 a 6:");
10. scanf("%d", &dia);
11. switch(dia)
12. {
13. case Segunda:
14. printf("Segunda");
15. break;
16. case terca:
17. printf("terca");
18. break;
19. case quarta:
20. printf("quarta");
21. break;
22. case quinta:
23. printf("quinta");
24. break;
25. case sexta:
26. printf("sexta");
27. break;
28. case sabado:
29. printf("sabado");
30. break;
31. case domingo:
32. printf("domingo");
33. break;
34. default:
35. printf("Fora da faixa!\n");
36. }
37. return(0);
38. }
O valor do primeiro elemento do conjunto enum é 0.
7.3 Uniões
Uniões (union) é uma posição de memória que é compartilhada por duas ou mais
variáveis diferentes, geralmente de tipos diferentes. A definição e um exemplo é apresentada a
seguir:
union <identificador> union cliente
{ {
<tipo> <nome_da_vairável_01>; int i;
<tipo> <nome_da_vairável_02>; char c;
... };
<tipo> <nome_da_variável_n>;
}<variáveis union>;
No exemplo acima, tanto o inteiro i como o caractere c compartilham a mesma porção
de memória, o mesmo endereço. Porém i ocupa 2 bytes e c apenas 1 byte. Quando uma union é
declarada, o compilador cria automaticamente uma variável grande o bastante para conter o maior
41
tipo de variável da union. A utilização de union pode ajudar na produção de código portáveis e na
utilização de conversões de tipos.
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. union tipoespecial
5. {
6. int x;
7. float y;
8. }W;
9.
10. int main(void)
11. {
12. printf("Digite um inteiro:");
13. scanf("%d", &W.x);
14. printf("O endereco da variavel x e: %p\n", &W.x);
15. printf("Voce digiou inteiro %d\n", W.x);
16. printf("Digite um ponto flutuante:");
17. scanf("%f", &W.y);
18. printf("O endereco da variavel y e: %p\n", &W.y);
19. printf("Voce digiou ponto flutuante %f\n", W.y);
20. return(0);
21. }
7.4 Exercícios
1. Elabore um programa que armazene as seguintes informações de 10 alunos de uma turma:
nome, sobrenome, prontuário, turma e data de nascimento.
2. Elabore um programa que imprima as seguintes informações de 10 alunos de uma turma: nome,
sobrenome, prontuário, turma e data de nascimento.
3. Considerando os exercícios 1 e 2, elabore um programa que edite as informações de um
determinado aluno escolhido pelo usuário.
4. Elabore um programa que leia um valor. Este valor pode ser inteiro, ponto flutuante ou
caractere.
5. Faça um programa que realize o cadastro de contas bancárias com as seguintes informações:
número da conta, nome do cliente e saldo. O banco permitirá o cadastramento de apenas 15
contas e não pode haver mais de uma conta com o mesmo número. Crie o menu de opções a
seguir:
Menu de opcoes:
Cadastrar
Visualizar todas as contas de um determinado cliente
Excluir a conta com o menor saldo
Sair
Opcao?:
6. Faça um programa de cadastro de clientes. Este programa deve permitir a inserção de novos
clientes, editar dados de clientes cadastrados, imprimir informações de um determinado cliente,
excluir um cliente do cadastro, pesquisar clientes e relatorio. São necessários as seguintes
informações do cliente: nome, sobrenome, rg, sexo, estado civil, data de nascimento, endereço,
numero, complemento, cep, bairro, cidade, estado, telefone, fax e celular. O relatorio deve
42
calcular a média de idade, quantos são do sexo masculino e feminino, quantos são solteiros(as),
quantos são casados(as) , quantos divorciados(as), listar as cidades e a respectiva quantidade de
clientes por cidade.
7. Faça um programa que gerencie uma locadora de vídeo. Este programa deve permitir a inserção
de novas fitas, editar informações de fitas, pesquisar e imprimir informações de uma
determinada fita. São necessários as seguintes informações das fitas de vídeo: título, categoria
(comédia, drama, ação, documentário ou infantil), diretor, ano, com legenda ou sem legenda,
idioma, descrição e quantidade disponível.
43
8. PONTEIROS
Ponteiros são variáveis que contém um endereço de memória, isto é, armazenam a
posição de uma outra variável na memória. Um ponteiro pode armazenar a posição de uma variável
de dado, um trecho de código executável ou ainda outro ponteiro. A forma geral para declarar uma
variável ponteiro é:
<tipo> *<nome_do_ponteiro>; float *p
O tipo base do ponteiro define que tipo de variáveis o ponteiro pode apontar. É
importante declarar o ponteiro corretamente pois de acordo com o tipo base pode ser realizado a
aritmética de ponteiros.
Após um ponteiro ser declarado o ponteiro possui um valor desconhecido. Portanto é
necessário atribuir um valor antes de utilizá-lo.
Existem dois operadores especiais para ponteiros:
* = ”No endereço de...” & = ”O endereço de...”
44
8.1 Exercícios
1. Considere o trecho de código a seguir e responda se as seguintes expressões são construções
válidas ou inválida. Justifique cada uma delas.
...
int j, k[10], *r, *s;
...
1. r=j; 6. *r=&j;
2. r=&j; 7. *r=j;
3. s=k[0]; 8. *s=k;
4. s=&k[0]; 9. *s=k[5];
5. s=k; 10. *s=*r;
45
9. PONTEIROS, VETORES E MATRIZES
Ponteiros e matrizes possuem uma estreita relação. A linguagem C permite o acesso aos
elementos de uma matriz de duas formas: aritmética de ponteiros e indexação de matrizes.
Por exemplo, é criado um vetor tipo char e um ponteiro para char. Em seguida é
atribuído ao ponteiro p a posição 0 da variável vetor str. Para x receber o conteúdo do vetor str
posição 10, as seguintes expressões são válidas:
x=str[10]; x=*(p+10);
As duas expressões retornam o valor do décimo primeiro elemento do vetor str.
Exemplo:
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. int main(void)
5. {
6. int *p, v[10], i;
7. p=&v[0];
8. printf("p armazenou endereco %p\n",p);
9. for (i=0; i<10; i++)
10. printf("O endereco de p[%d] e: %p\n", i, &p[i]);
11. printf("\n\n");
12. for (i=0; i<10; i++)
13. printf("O endereco de p+%d e: %p\n", i, p+i);
14. return(0);
15. }
46
9.2 Exercícios
1. Escreva um programa que inverta a ordem dos caracteres de uma cadeia de caracteres. Use
ponteiros.
2. Faça um programa que carregue um vetor 10 de números reais, calcule a média aritmética dos
elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na
vetor. Utilize ponteiro.
47
10. FUNÇÕES
Funções são blocos de construção em C. A forma geral de uma função é:
<Tipo_de_retorno> <nome_da_função>(<lista de parâmetros>)
{
<Corpo da Função>
}
OBS: <lista de parâmetros> = <tipo> <Var1>, <tipo> <Var2>, ..., <tipo> <Varn>
Cada função é um bloco discreto de código, sendo que é privativo à função e não pode
ser acessado por nenhum comando em uma outra função, exceto por meio de uma chamada de
função. O escopo da função é a porção de código e dados (variáveis locais) que constitui o corpo da
função que é oculto do resto do programa, portanto, a menos que utilize variáveis ou dados globais,
não pode afetar ou ser afetado por outras partes do programa. Os argumentos são chamados de
parâmetros formais da função. São variáveis locais que pertencem à função e são criadas na entrada
e destruídas na saída. Os argumentos podem ser passados de duas maneiras:
• Chamada por Valor: Este método faz uma cópia do valor de um argumento no parâmetro
formal. Desta forma, quaisquer alterações feitas no parâmetro não têm nenhum efeito nas
variáveis usadas para chamá-la;
• Chamada por Referência: Este método o endereço do argumento é copiado para o parâmetro
formal. Isto implica que quaisquer alterações no parâmetro afetam a variável usada para chamar
a rotina.
1. #include <stdio.h> 18. float valor(float x)
2. #include <stdlib.h> 19. {
3. 20. x=x*x;
4. float valor(float x); 21. return(x);
5. float referencia(float *x); 22. }
6. 23.
7. int main(void) 24. float referencia(float *x)
8. { 25. {
9. float y=10,z; 26. x=x*x;
10. printf(”Chamada por valor:\n”); 27. return(x);
11. z=valor(y); 28. }
12. printf(”y=%f, z=%f\n”, y, z);
13. printf(”Chamada por Referencia:\n”);
14. z=valor(y);
15. printf(”y=%f, z=%f\n”, y, z);
16. return(0);
17. }
48
uma chamada de função, enquanto o programa está sendo executado, é efetuada uma chamada em
linguagem de máquina para o endereço desse ponto de entrada.
1. #include <stdlib.h> 21. void mostra_erro1(int num)
2. #include <stdio.h> 22. {
3. 23. char *erro[]=
4. void mostra_erro1(int num); 24. {
5. void mostra_erro2(int num); 25. "Primeiro Erro zero\n",
6. 26. "Primeiro Erro um\n",
7. int main(void) 27. "Primeiro Erro dois\n",
8. { 28. "Primeiro Erro tres\n",
9. int i; 29. "Primeiro Erro quatro\n",
10. void (*p)(int); 30. };
11. p=mostra_erro1; 31. printf("%s", erro[num]);
12. printf("End. da funcao: %p\n", p); 32. }
13. for(i=0; i<5; i++) 33.
14. p(i); 34. void mostra_erro2(int num)
15. p=mostra_erro2; 35. {
16. printf("End. da funcao: %p\n", p); 36. char *erro[]=
17. for(i=0; i<5; i++) 37. {
18. p(i); 38. "Segundo Erro zero\n",
19. return 0; 39. "Segundo Erro um\n",
20. } 40. "Segundo Erro dois\n",
41. "Segundo Erro tres\n",
42. "Segundo Erro quatro\n",
43. };
44. printf("%s", erro[num]);
45. }
10.2 Recursividade
Em C, funções podem chamar a si mesmas. A função é recursiva se um comando no
corpo da função a chama. A recursividade talvez seja a mais importante vantagem das funções em
C. A recursão é o processo é o processo de definir algo em termos de si mesmo, isto é, uma função
que chama a si mesma repetidamente um número finito de vezes. Este recurso é muito útil em
alguns tipos de algoritmos chamados de algoritmos recursivos. Por exemplo: O cálculo do fatorial
de um número é definido pela seguinte expressão:
n! = n * ( n − 1) * ( n − 2) * ... * 3 * 2 * 1
5! = 4 * 3 * 2 * 1 = 4 * 3!
onde n é o número inteiro positivo. Uma propriedade dos fatoriais é:
n! = n * ( n − 1)!
Uma função recursiva cria a cada chamada um novo conjunto de variáveis locais. Não
existe ganho de velocidade ou espaço de memória significativo com o uso de funções recursivas. A
principal vantagem das funções recursivas é que pode ser utilizadas para criar versões mais claras e
simples de vários algoritmos. Um exemplo não recursivo:
int fact(int n)
{
int t, answer; /*Declaração das variáveis t e answer*/
answer=1;
for (t=1; t<=n; t++)
answer=answer*(t);
return(answer); /*retorna answer*/
}
Um exemplo recursivo:
49
int fact_r(int n)
{
int t, answer; /*Declaração das variáveis t e answer*/
if (n==1) return(1);
answer=fact_r(n-1)*n;
return(answer); /*retorna answer*/
}
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. int main(int argc, char * argv[])
5. {
6. int i;
7. printf("The value of argc is %d \n\n", argc);
8. printf("These are the %d command-line arguments passed to main:\n\n", argc);
9. for (i = 0; i < argc; i++)
10. printf(" argv[%d]: %s\n", i, argv[i]);
11. printf("\nThe environment string(s) on this system are:\n\n");
12. return(0);
13. }
Função puts(): Escreve o seu argumento no dispositivo padrão de saída (vídeo), coloca um '\n' no
final. Reconhece os códigos de barra invertida.
Sintaxe (stdio.h):
int puts(const char *str);
1. #include <stdlib.h>
2. #include <stdio.h>
3.
4. int main(void)
5. {
6. char string[] = "This is an example output string\n";
7. puts(string);
8. return(0);
9. }
Função strcmp(): Compara duas strings, se forem iguais devolve 0. Se str1 > str2, devolve > 0. Do
contrário se str1 < str2, devolve < 0.
Sintaxe (string.h):
int strcmp(const char *str1, const char *str2);
1. #include <stdlib.h>
2. #include <stdio.h>
3.
4. int main(void)
5. {
6. char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";
51
7. int ptr;
8.
9. ptr = strcmp(buf2, buf1);
10. if (ptr > 0)
11. printf("buffer 2 is greater than buffer 1\n");
12. else
13. printf("buffer 2 is less than buffer 1\n");
14. ptr = strcmp(buf2, buf3);
15. if (ptr > 0)
16. printf("buffer 2 is greater than buffer 3\n");
17. else
18. printf("buffer 2 is less than buffer 3\n");
19. return(0);
20. }
52
Função cos(): Devolve o co-seno do argumento.
Sintaxe (math.h):
double cos(double arg);
1. #include <stdlib.h>
2. #include <stdio.h>
3. #include <math.h>
4.
5. int main(void)
6. {
7. double result;
8. double x = 0.5;
9. result = cos(x);
10. printf("The cosine of %lf is %lf\n", x, result);
11. return(0);
12. }
53
Função fabs(): Devolve o valor absoluto do argumento.
Sintaxe (math.h):
double fabs(double arg);
1. #include <stdlib.h>
2. #include <stdio.h>
3. #include <math.h>
4.
5. int main(void)
6. {
7. float number = -1234.0;
8. printf("number: %f absolute value: %f\n", number, fabs(number));
9. return(0);
10. }
55
10.7 Outras Funções
Função randomize() e rand(): A função rand() devolve um número aleatório entre 0 e
RAND_MAX. A constante RAND_MAX é definida na biblioteca <stdlib.h>. A função randomize()
inicia a geração de números aleatórios.
Sintaxe (time.h e stdlib.h):
void randomize(void);
int rand(void);
1. #include <stdlib.h>
2. #include <stdio.h>
3. #include <time.h>
4.
5. int main(void)
6. {
7. int i;
8. randomize();
9. printf("Dez números randômicos de 0 a 99\n\n");
10. for(i=0; i<10; i++)
11. printf("%d\n", rand() % 100);
12. return(0);
13. }
10.8 Exercícios
1. Elabore uma função que aceita como parâmetro dois catetos e retorna o valor da hipotenusa.
2. Elabore uma função que aceita como parâmetro dois números reais e retorna a média aritmética.
3. Elabore uma função que aceita como parâmetro 5 números reais e retorna o maior número.
4. Elabore uma função que aceita como parâmetro o número do CPF e retorna 1 para válido e 0
para inválido.
ABC.DEF .GHI − JK
S1 = A *10 + B * 9 + C * 8 + D * 7 + E * 6 + F * 5 + G * 4 + H * 3 + I * 2
d1 = 11 − ( S1 MOD 11)
IF d1 >= 10 THEN Dígito _ 01 = 0 ELSE Dígito _ 01 = d1
S 2 = A *11 + B *10 + C * 9 + D * 8 + E * 7 + F * 6 + G * 5 + H * 4 + I * 3 + Dígito _ 01 * 2
d 2 = 11 − ( S 2 MOD 11)
IF d 2 >= 10 THEN Dígito _ 02 = 0 ELSE Dígito _ 02 = d 2
IF J = Dígito _ 01 AND K = Dígito _ 02 THEN Válido ELSE Inválido
5. Elabore uma função que receba uma palavra (string) e retorna a quantidade de caracteres.
6. Elabore uma função que receba uma string e troque todos os caracteres ‘a’ por ‘@’.
7. Elabore uma função que receba 10 números reais e retorna a média aritmética.
n
∑X i
µ= i =1
n
8. Elabore uma função que receba 10 números reais e a média, retornando o valor do desvio
padrão.
56
n
∑ (X i − µ)
2
σ= i =1
n
9. Elabore uma função que receba como parâmetro um raio de uma esfera e retorne o volume de
acordo com a fórmula abaixo.
4
V = * π * R3
3
10. Elabore uma função que receba como parâmetro um número real e retorne a raiz quadrada.
11. Elabore uma função que receba como parâmetro um número real e retorne o número elevado a
potência 2.
12. Elabore uma função que receba como parâmetro um número real e retorne o número elevado a
potência 3.
13. Elabore uma função que receba como parâmetro um número real e retorne o número elevado a
potência 5.
14. Elabore uma função que receba como parâmetro um número real e retorne 10% do valor.
15. Elabore uma função que receba como parâmetro um número inteiro e imprima o valor em
extenso na tela.
16. São apresentados as seguintes fórmulas da trigonometria. Elabore um programa e implemente as
funções para o cálculo da tangente, cotangente, secante e cossecante de um ângulo α.
sen α 1
tgα = sec α =
cos α cos α
cos α 1
cotgα = cos sec α =
sen α sen α
sen (a + b ) = sen (a )* cos(b ) + sen (a )* cos(b ) sen (a − b ) = sen (a )* cos(b ) − sen (a )* cos(b )
cos(a + b ) = cos(a )* cos(b ) − sen (a )* sen (b ) cos(a − b ) = cos(a )* cos(b ) + sen (a )* sen (b )
tg (a ) + tg (b ) tg (a ) − tg (b )
tg (a + b ) = tg (a − b ) =
1 − tg (a )* tg (b ) 1 + tg (a )* tg (b )
cos(2 * a ) = 2 * cos 2 (a ) − 1
sen (2 * a ) = 2 * sen (a )* cos(a )
cos(2 * a ) = 1 − 2 * sen 2 (a )
cos(2 * a ) = cos 2 (a ) − sen 2 (a )
2 * tg (a )
tg (2 * a ) =
1 − tg 2 (a )
57
18. Dado um ponto C e uma distância r, o conjunto de pontos formado num plano cuja distância a C
é igual a r é denominado circunferência de centro C. Se P(x; y) é um ponto qualquer da
circunferência, a relação entre x e y é dada pela equação abaixo (equação da circunferência).
Elabore funções que, dado o centro C e a distância r, apresentem a equação da circunferência,
os pontos em que a circunferência corta o eixo Ox e Oy, e verificar se a circunferência passa
pela origem.
58
11. ALOCAÇÃO DINÂMICA
Um programa necessita de memória para armazenar informações. Existem duas
maneiras fundamentais de um programa alocar memória do computador. A primeira forma é através
de variáveis locais e globais (alocação estática), isto é, cada variável recebe um endereçamento de
memória e o respectivo tamanho, que é fixo durante todo o tempo de execução do programa, para o
armazenamento da informação. As variáveis globais são alocadas em uma região pré-definida e as
variáveis locais são alocadas em uma parte da memória definida como pilha. Para este tipo de
alocação necessita-se definir de antemão a quantidade de armazenamento necessária.
A segunda forma é através da alocação dinâmica. A alocação dinâmica é o processo de
alocar espaço de memória do computador em tempo de execução, ou seja, um programa em
execução pode, sempre que necessário e houver a disponibilidade de espaço em memória, solicitar a
alocação do espaço e utilizar convenientemente os dados. O armazenamento é realizado em uma
região de memória livre, ou heap.
A figura 11.1 mostra conceitualmente como um programa utiliza a memória (a posição
e o tamanho variam de acordo com o tipo de processador).
Pilha
Heap
Variáveis Globais
Código do Programa
Função calloc() :Aceita como parâmetro num números de elementos de size bytes de memória e
retorna um ponteiro para o bloco alocado (num*size) ou nulo (NULL) se indisponível.
void *calloc(size_t num, size_t size);
59
Função realloc() :Aceita como parâmetro o ponteiro do bloco de memória já alocada e um novo
tamanho size bytes. Um ponteiro para o bloco de memória é devolvido porque realloc() pode
precisar mover o bloco para aumentar seu tamanho. Se isso ocorrer, o conteúdo do bloco antigo é
copiado para o novo bloco. Se p é nulo, realloc() aloca size bytes de memória e devolve um
ponteiro para a memória alocada. Se size é zero, a memória apontada por p é liberada.
void *realloc(void *p, size_t size);
Função free() :Aceita como parâmetro o ponteiro do bloco de memória alocada e devolve ao heap.
Por exemplo:
void free(void *p);
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. int main(void)
5. {
6. float *y;
7. y=(float*)malloc(sizeof(float));
8. if (!y)
9. {
10. printf(”Memória indisponível!\n”);
11. exit(0);
12. }
13. *y=10;
14. printf(”O endereço do bloco alocado é %p\n”,y);
15. printf(”O endereço de y é %p\n”,&y);
16. printf(”O conteúdo para que y aponta é %f\n”,*y);
17. free(y);
18. return(0);
19. }
11.1 Exercícios
1. Elabore um programa que aloque dinamicamente um vetor de 10 números reais, apresente o
conteúdo e o endereço de cada posição do vetor.
2. Elabore um programa que aloque dinamicamente três números reais, leia, calcule e mostre o
maior e o menor número.
3. Elabore um programa que aloque dinamicamente um vetor 10 de números reais, carregue,
calcule a média aritmética dos elementos e mostre todos elementos maiores ou iguais à media e
sua respectiva posição na vetor.
4. Elabore um programa que aloque dinamicamente um vetor de n números reais, carregue, calcule
e apresente a média aritmética e o desvio padrão.
5. Faça um programa de cadastro de clientes. Este programa deve permitir a inserção de novos
clientes, editar dados de clientes cadastrados, imprimir informações de um determinado cliente,
excluir um cliente do cadastro, pesquisar clientes e relatório. São necessários as seguintes
informações do cliente: nome, sobrenome, rg, sexo, estado civil, data de nascimento, endereço,
numero, complemento, cep, bairro, cidade, estado, telefone, fax e celular.
60
• relatório deve calcular a média de idade, quantos são do sexo masculino e feminino, quantos são
solteiros(as), quantos são casados(as) , quantos divorciados(as), listar as cidades e a respectiva
quantidade de clientes por cidade;
• Para armazenar as informações dos clientes, utilize um vetor de ponteiros (deve-se iniciar todos
ponteiros com nulo);
• Cada novo cliente, aloca-se dinamicamente um registro e atribui o endereço desse bloco a uma
posição do vetor;
• Criar também uma função para ordenar os clientes.
6. Faça um programa contendo os serviços que uma oficina mecânica pode realizar:
• Ordem de serviço (número da OS, data, valor, serviço realizado, cliente);
• Leia as informações sobre várias ordens de serviço e determine, ao final, a média dos valores, o
nome do cliente que realizou o serviço mais caro, juntamente com a descrição desse serviço e a
data de sua realização.
61
12. MANIPULAÇÃO DE ARQUIVOS
62
12.2 Tipos de Acesso
Os tipos de acesso aos arquivos podem ser seqüencial ou aleatório. No acesso
seqüencial, a leitura e a transferência de dados devem ser feitas percorrendo seqüencialmente os
bytes no arquivo. O acesso aos dados é feito através de um ponteiro indicador da posição corrente
no arquivo, que indica a localização de início de leitura ou gravação.
Enquanto que no acesso aleatório é feito em qualquer posição do arquivo sem que
informações anteriores precisem ser acessadas. Isto pode ser feito através de funções que alteram
indicador de posição corrente para determinada localização no arquivo. Este posicionamento
aleatório é feito em relação a três possíveis origens que são passados como argumento de funções:
Início, posição corrente ou fim.
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. int main(void)
5. {
6. FILE *in, *out;
7. if ((in = fopen("TESTFILE.DAT", "r"))== NULL)
8. {
9. printf("Cannot open input file.\n");
10. return 1;
11. }
12. if ((out = fopen("TESTFILE.BAK", "w"))== NULL)
13. {
14. printf("Cannot open output file.\n");
15. return 1;
16. }
17. while (!feof(in))
18. fputc(fgetc(in), out);
19.
20. fclose(in);
21. fclose(out);
22. return(0);
23. }
63
Função fprintf() : Escreve argumento em um arquivo.
int fprintf(FILE *arq, const char *control_string, ...);
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. int main(void)
5. {
6. FILE *stream;
7. int i = 100;
8. char c = 'C';
9. float f = 1.234;
10. stream = fopen("DUMMY.FIL", "w");
11. if (!stream)
12. exit(1);
13. fprintf(stream, "%d %c %f", i, c, f);
14. fclose(stream);
15. return 0;
16. }
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. long filesize(FILE *stream);
5.
6. int main(void)
7. {
8. FILE *stream;
9. stream = fopen("MYFILE.TXT", "w+");
10. fprintf(stream, "This is a test");
11. printf("Tamanho de MYFILE.TXT is %ld bytes\n", filesize(stream));
12. fclose(stream);
13. return 0;
14. }
15.
16. long filesize(FILE *stream)
17. {
18. long curpos, length;
19. curpos = ftell(stream);
20. fseek(stream, 0L, SEEK_END);
21. length = ftell(stream);
22. fseek(stream, curpos, SEEK_SET);
23. return length;
24. }
Função ferror() : Devolve verdadeiro se ocorreu um erro durante a última operação no arquivo.
int ferror(FILE *arq);
Função fread() : Lê count blocos de num_bytes de arq para buffer. Se não ocorrer erro retorna
count.
size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *arq);
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. int main(void)
5. {
6. FILE *stream;
7. int s[10], i;
8. if ((stream = fopen("TEST.$$$", "rb")) == NULL)
9. {
10. fprintf(stderr, "Cannot open output file.\n");
11. return 1;
12. }
13. for (i=0; i<10; i++)
14. {
15. fread (&s[i], sizeof(int), 1, stream);
16. printf("x[%d]=%d\n",i, s[i]);
17. }
18. fclose(stream);
19. return 0;
20. }
65
Função fwrite() : Escreve count blocos de num_bytes de buffer para arq. Se não ocorrer erro retorna
count.
size_t fwrite(void *buffer, size_t num_bytes, size_t count, FILE *arq);
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. int main(void)
5. {
6. FILE *stream;
7. int s[10], i;
8. if ((stream = fopen("TEST.$$$", "wb")) == NULL)
9. {
10. fprintf(stderr, "Cannot open output file.\n");
11. return 1;
12. }
13. for (i=0; i<10; i++)
14. {
15. printf("x[%d]=",i);
16. scanf("%d",&s[i]);
17. fwrite(&s[i], sizeof(int), 1, stream);
18. }
19. fclose(stream);
20. return 0;
21. }
Função fgetc() : Devolve o próximo caractere da stream de entrada na posição atual e incrementa o
indicador de posição do arquivo.
int fgetc(FILE *arq);
1. #include <string.h>
2. #include <stdio.h>
3.
4. int main(void)
5. {
6. FILE *stream;
7. char string[] = "This is a test";
8. char ch;
9.
10. /* open a file for update */
11. stream = fopen("DUMMY.FIL", "w+");
12.
13. /* write a string into the file */
14. fwrite(string, strlen(string), 1, stream);
15.
16. /* seek to the beginning of the file */
17. fseek(stream, 0, SEEK_SET);
18.
19. do
20. {
21. /* read a char from the file */
22. ch = fgetc(stream);
23.
24. /* display the character */
25.
26. putchar(ch);
27. } while (ch != EOF);
28.
29. fclose(stream);
30. return 0;
31. }
12.4 Exercícios
1. Faça um programa de cadastro de clientes. Este programa deve permitir a inserção de novos
clientes, editar dados de clientes cadastrados, imprimir informações de um determinado cliente,
excluir um cliente do cadastro, pesquisar clientes e relatório. São necessários as seguintes
66
informações do cliente: nome, sobrenome, rg, sexo, estado civil, data de nascimento, endereço,
numero, complemento, cep, bairro, cidade, estado, telefone, fax e celular.
• relatório deve calcular a média de idade, quantos são do sexo masculino e feminino, quantos são
solteiros(as), quantos são casados(as) , quantos divorciados(as), listar as cidades e a respectiva
quantidade de clientes por cidade;
• Para armazenar as informações dos clientes, utilize um vetor de ponteiros (deve-se iniciar todos
ponteiros com nulo);
• Cada novo cliente, aloca-se dinamicamente um registro e atribui o endereço desse bloco a uma
posição do vetor;
• Criar também uma função para ordenar os clientes;
• Implementar operações para manipular arquivos.
2. Faça um programa contendo os serviços que uma oficina mecânica pode realizar:
• Ordem de serviço (número da OS, data, valor, serviço realizado, cliente - ler informações de um
arquivo);
• Leia as informações sobre várias ordens de serviço e determine, ao final, a média dos valores, o
nome do cliente que realizou o serviço mais caro, juntamente com a descrição desse serviço e a
data de sua realização.
3. Faça um programa que gerencia os produtos armazenados em uma farmácia. Deve-se criar um
arquivo que armazene as informações dos produtos e a quantidade disponível.
4. Faça um programa que gerencie a venda de produtos de uma farmácia. O programa consulta um
arquivo (exercício 3) que contém a disponibilidade dos produtos. A cada venda deve-se
atualizar a quantidade no arquivo.
67
13. ORDENAÇÃO
Ordenação é o processo de arranjar um conjunto de informações semelhantes numa
ordem crescente ou decrescente. Geralmente, quando a informação é ordenada, apenas uma porção
dessa informação é usada como chave da ordenação. Essa chave é utilizada nas comparações, mas,
quando uma troca se torna necessária, toda a estrutura de dados é transferida.
Existem três método básicos para ordenar matrizes:
• Troca;
• Seleção;
• Inserção.
Considerando-se o seguinte exemplo são apresentados os algoritmos de ordenação a
seguir:
1. #include <stdio.h> 21. for (i=0; i<n; i++)
2. #include <stdlib.h> 22. {
3. 23. printf("x[%d]=",i);
4. void selecao(int *p, int count); 24. scanf("%d", &q[i]);
5. void insercao((int *p, int count); 25. }
6. void troca(int *p, int count); 26. print(q,n);
7. void shakesort(int *p, int count); 27. shakesort(q,n);
8. void shell(int *p, int count); 28. printf("\nOrdenando...\n");
9. void quicksort((int *p, int count); 29. print(q,n);
10. void qs(int *p, int left, int right); 30. free(q);
11. void print(int *p, int count); 31. return 0;
12. 32. }
13. int main(void) 33.
14. { 34. void print(int *p, int count)
15. int *q, n, i; 35. {
16. printf("Quantos números deseja:"); 36. int i;
17. scanf("%d", &n); 37. printf("\n");
18. q=(int*)malloc(n*sizeof(int)); 38. for (i=0; i<count; i++)
19. if (!q) 39. printf("%d ", p[i]);
20. exit(1); 40. printf("\n");
41. }
42. ...
68
p[b-1]=p[b]; temp=p[a-1];
p[b]=temp; p[a-1]=p[a];
} p[a]=temp;
} exchange=1;
} }
}
for (a=1; a<count; a++)
{
if (p[a-1]>p[a])
{
temp=p[a-1];
p[a-1]=p[a];
p[a]=temp;
exchange=1;
}
}
} while (exchange);
}
13.5 “Quicksort”
O algoritmo de ordenação quicksort é um algoritmo de ordenação por troca. Baseia-se
na escolha de um elemento central. A partir da posição 0, começamos a procurar um elemento
maior do que x, até encontrarmos. O mesmo processo ocorre a partir da posição n-1, procurando um
elemento menor do que x.
70
Quando o índice da esquerda (i) for menor do que o índice da direita (j), trocamos estes
valores, até que i>=j. O processo se repete de forma recursiva para cada subconjunto (esquerda e
direita do elemento x), até termos um subconjunto com um único elemento.
void quicksort(int *p, int count)
{
qs(p, 0, count-1);
}
71
14. ESTRUTURAS DE DADOS
Um programa consiste de duas coisas: algoritmos e estruturas de dados. A estrutura de
dados é importante para armazenar os dados e recuperá-los, quando necessário, de forma
automática em uma ordem predeterminada. De acordo com a forma de acesso (armazenamento e
recuperação) aos dados, existem basicamente quatro tipos de estruturas:
• Pilha;
• Filas;
• Listas;
• Árvores Binárias.
14.1 Pilhas
Pilhas são estruturas de armazenagem e recuperação de dador em ordem LIFO (Last-in,
First-out), isto é, o último item colocado na pilha será o primeiro a ser removido. As duas operações
básicas (armazenar e recuperar) são tradicionalmente chamadas de push e pop, respectivamente.
A P G U W
W
U U
G G G
P P P P
A A A A A
W U G P A
U
G G
P P P
A A A A
72
14.2 Filas
Filas são estruturas de armazenagem e recuperação de dados em ordem FIFO (First In,
First Out), isto é, o primeiro item colocado na fila será o primeiro a ser removido. A fila opera
utilizando duas funções: entra e sai. As filas podem ser utilizadas em simulações, distribuição de
eventos, entre outros.
X X Y Z
X Y Y Z X
X Y Z Z Y
X Y Z Z
73
qualquer número de itens poderia ser colocado na fila, desde que itens também estejam sendo
retirados (Fig. 14.4).
74
d) O novo nó precede todos os nós da lista, mas esse fato tem que ser refletido no valor do
Primeiro. Consequentemente, o ponteiro Primeiro é atualizado para se tornar o ponteiro
para o novo nó.
O processo de adicionar um novo nó ao longo da lista de forma ordenada é realizada em
quatro etapas:
a) Um nó vazio é criado. Ele está vazio no sentido de que o programa que realiza a inserção
não atribui quaisquer valores aos campos de dados do nó;
b) O campo info do nó é inicializado com um valor em particular;
c) Percorre a lista comparando o campo info do novo nó com cada nó da lista.
d) Ao determinar a posição de inserção, o elo proximo do anterior do nó corrente aponta para o
novo nó e, o elo proximo do novo nó aponta para o elo proximo do nó corrente.
A operação de remoção consiste em remover um nó do início ou ao longo da lista e
retornar o valor armazenado nela. Deve-se observar que:
a) Não se pode remover um nó de uma lista vazia;
b) A remoção de um único nó de uma lista ligada de apenas um nó, o ponteiro Primeiro deve ser
atualizado;
c) A remoção do primeiro nó da lista com pelo menos dois nós exige a atualização do ponteiro
Primeiro;
d) A remoção de um nó no meio de uma lista deve ser realizada somente após efetuar as ligações
necessárias afim de manter a consistência da lista.
1 2 5 8 4
Primeiro
A A A
75
Figura 14.6 Ilustração de inserção em uma lista singularmente ligada.
C A C A C A
C S R A
A
Primeiro
(1)
Tmp
C S R A
A
Primeiro
(2)
Tmp
C S R A
A
Primeiro
(3)
76
Figura 14.8 Ilustração de inserção em uma lista singularmente ligada.
1 9 3 5
Primeiro Último
S S
E S
S S S S
1 9 3 5
Início
Figura 14.9 Ilustração de uma lista circular duplamente ligada com cabeçalho.
79
• A altura de um nó é o comprimento do caminho mais longo deste nó até um nó folha;
• A altura de uma árvore é a altura do nó raiz;
• A profundidade é o número de arestas da raiz até um determinado nó. A raiz possui
profundidade 0. As subárvores (sucessores diretos) da raiz possuem profundidade 1. Um nó
no nível n possui a profundidade n.
As árvores podem ser utilizadas para administrar grandes quantidades de dados em uma
ordem qualquer, permitem o uso de listas ligadas e a divisão de um conjunto de dados em
subconjuntos, administrando-as de forma hierárquica. Além disso, podem representar processos
decisórios.
Raiz: 15
Grau da árvore: 2
Nível 0: 15
Nível 1: 5 e 16
Nível 2: 2, 12 e 20
Nível 3: 10, 13, 18 e 23
Nível 4: 6
Nível 5: 7
Altura da árvore: 7
Embora árvores sejam fáceis de visualizar, elas apresentam alguns problemas difíceis de
programação. A maioria das funções que usam árvore é recursiva porque a própria árvore é uma
estrutura de dados recursiva. Isto é, cada subárvore é ela própria uma árvore.
O procedimento de acesso a cada nó na árvore é chamado de transversalização da
árvore. Existem três maneiras de percorrer uma árvore: de forma ordenada, pré-ordenada e pós-
ordenada. Usando a forma ordenada, cada nó é visitado da subárvore da esquerda, a raiz e, em
seguida, a subárvore da direita. Na maneira pré-ordenada, cada nó é visitado da raiz, a subárvore da
esquerda e, em seguida, a subárvore da direita. Com a pós-ordenada, cada nó é visitado da
subárvore da esquerda, a subárvore da direita e, depois, a raiz. Considerando-se o exemplo da figura
14.11, a ordem de acesso à árvore usando cada método é:
d
Ordenada a b c d e f g
Pré-ordenada d b a c f e g b
f
Pós-ordenada a c b e g f d
e g
a c
80
Figura 14.11 Exemplo de árvore binária.
Uma árvore binária ordenada é aquela em que a subárvore da esquerda contém nós que
são menores ou iguais à raiz e os da direita são maiores que a raiz.
14.5 EXERCÍCIOS
1. Elaborar as funções pop() e push() de uma pilha.
2. Elaborar um programa que simule o armazenamento e recuperação de uma pilha.
3. Elaborar as funções para armazenar e recuperar dados em uma fila.
4. Elaborar um programa que simule uma fila de atendimento.
81
15. BIBLIOGRAFIA
Arakaki, R.; Arakaki, J.; Angerami, P.M.; Aoki, O.L.; Salles, D.S. “Fundamentos de Programação
C: Técnicas e Aplicações” 2ªEdição, Livros Técnicos e Científicos Editora, Rio de
Janeiro/RJ, 1992.
Ascencio, A.F.G; Campos, E.A.V. “Fundamentos da Programação de Computadores - Algoritmos,
Pascal e C/C++”, Editora Prentice Hall, São Paulo/SP, 2002.
Cormen, T.H.; Leiserson, C.E.; Rivest, R.L.; Stein, C. “Algoritmos - Teoria e Prática”, Tradução da
2ª.Edição Americana, Editora Campus, 2002.
Drozdek, A. “Estrutura de Dados e Algoritmos em C++”, Editora Pioneira Thomson, São Paulo/SP,
2002.
Loudon, K. “Dominando Algoritmos com C” Editora Ciência Moderna, Rio de Janeiro/RJ, 2000.
Lourenço, A.C.; Alves Cruz, E.C.; Ferreira, S.R.; Choueri Júnior, S. “Circuitos Digitais” 3ªEdição,
Editora Érica, São Paulo/SP, 1996.
Mizrahi, V.V. “Treinamento em Linguagem C++ - Módulo 2”, Editora Makron Books, São
Paulo/SP, 1994.
Neto, A. “Matemática Básica”, Editora Atual, São Paulo, 1984.
Pressman, R.S.; Ince, D. “Software Engineering: A Practitioner’s Approach (European
Adaptation)” 5thEdition, MacGraw-Hill International, Berkshire/UK, 2000.
Schildt, H. “C Completo e Total” 3ªEdição Makron Books Ltda., São Paulo/SP, 1997.
Stroustrup, B. “A Linguagem de Programação C++”, 3ª.Edição, Editora Bookman, Porto
Alegre/RS, 2000.
Tenenbaum, A.M.; Langsam, Y.; Augenstein, M.J. “Estruturas de Dados Usando C” Makron Books
Ltda., Rio de Janeiro/RJ, 1995.
Ziviani, N. “Projeto de Algoritmos com Implementações em Pascal e C” 4ªEdição, Editora Pioneira
Informática, São Paulo/SP, 1999.
82
16. APÊNDICE
83
16.2 Sistema Numérico
O homem é resultado contínuo da sua própria evolução. Em um determinado momento
ao longo desse processo, surgiu a necessidade de medir grandezas. Para medir essas grandezas o
homem criou os sistemas numéricos.
Por exemplo, o tempo é medido utilizando um sistema de 24 unidades para as horas, um
sistema de 60 unidades para minutos e segundos, um sistema de 12 unidades para os meses e um
sistema de 10 unidades para os anos. Os números de todos os sistemas numéricos podem ser
decompostos de acordo com a lei de formação:
Número = an * bn + an −1 * b n −1 + an − 2 * bn − 2 + K + a0 * b0
onde:
an = algarismo;
b = base do número;
n = quantidade de algarismos –1.
3452 = 3 * 10 3 + 4 * 10 2 + 5 * 101 + 2 * 10 0
9 Sistema Binário (base 2): O sistema binário ou base 2 utiliza apenas dois símbolos para
representar qualquer quantidade: 0 1. Cada algarismo ou dígito de um número binário é
chamado de bit (binary digit). É um sistema muito utilizado em circuitos lógicos e
aritméticos.
9 Sistema Hexadecimal (base 16): O sistema hexadecimal ou base 16 possui 16 símbolos para
representar qualquer quantidade: 0 1 2 3 4 5 6 7 8 9 A B C D E F. É um sistema
muito utilizado na área de microprocessadores.
84
A equivalência entre os números dos três sistemas numéricos é apresentado na seguinte
tabela:
Tabela 16.1 - Equivalência entre os sistemas numéricos.
Decimal Binário Hexadecimal
0 0 0
1 1 1
2 10 2
3 11 3
4 100 4
5 101 5
6 110 6
7 111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F
16 10000 10
17 10001 11
... ... ...
85
Existem uma relação estreita entre o sistema binário e o hexadecimal. Esta relação vem
do fato que o número 16 pode ser escrito como 24.
onde:
an = algarismo;
b = base do número;
n = quantidade de algarismos da parte inteira –1;
m = quantidade de algarismos da parte fracionária.
Para a conversão de base 10 para base 2 ou base 16, a parte inteira é convertida
separadamente pelo processo das divisões sucessivas. A parte fracionária é utilizado o processo das
multiplicações sucessivas pela base desejada. A parte inteira resultante dos produtos formará os
dígitos da parte fracionária do número convertido.
86