Anda di halaman 1dari 55

Departamento de Informtica

Apostila de PD-I, ICC e IC

CAPTULO I
INTRODUO
Objetivos

Familiarizar o aluno com as noes de algoritmo e de refinamentos sucessivos atravs de


exemplos no-computacionais;

Introduzir a noo de programa e linguagem de programao;

Ressaltar as vantagens de representao em C;


Identificar as componentes principais de um programa em C, baseando-se em um exemplo no
computacional.

I.1 O que um Algoritmo


Os computadores vm sendo cada vez mais utilizados nas mais diversas reas, desde a medicina
at a engenharia, desde a administrao de empresas at o controle de mquinas industriais, desde a
edio de textos pessoais at a produo de efeitos especiais em filmes.
Em todas as situaes, o computador age como uma mquina capaz de coletar, manipular e
devolver dados em grande quantidade e alta e alta velocidade. Estas atividades so executadas por uma
gama de circuitos e componentes eletrnicos (Hardware).
Ao longo das ltimas dcadas, estes componentes tm se tornado cada vez mais eficientes e
baratos, devido aos avanos tecnolgicos.
Embora os computadores modernos sejam capazes de executar operaes difceis e complexas,
eles so mquinas dceis e de uma inteligncia restrita. Eles devem ser ensinados exatamente o que
fazer, e as instrues devem ser feitas em uma linguagem simples, precisa e limitada que eles possam
compreender. Estas instrues so mais conhecidas como software (Darmell,l988).
Uma das etapas fundamentais no desenvolvimento do software a Construo de Algoritmo.
Algoritmo uma seqncia de operaes que devem ser executadas em uma ordem definida
e no-ambgua, com o propsito de solucionar um determinado problema.
Esta definio pode caracterizar tanto um receita de bolo com o conjunto de instrues para
montagem de um automvel. No nosso caso, serviria para definir o conjunto de atividades que o
computador deve desempenhar para solucionar um problema.
O algoritmo geralmente representado atravs de modelos de fcil compreenso pelos humanos,
mas incompreensveis para o computador. Para que o computador possa executar um algoritmo,
necessrio que este algoritmo seja traduzido para uma linguagem que seja entendida pelo computador a linguagem de programao. Ao traduzir-se um algoritmo para uma linguagem de programao
obtm-se um Programa.
Este curso tem por objetivo desenvolver a capacidade de construir algoritmos de uma forma
organizada (estruturada) na linguagem de programao C.
I.2 Exemplo de Algoritmo
Boa parte das atividades do dia-a-dia pode ser descrita atravs de algoritmos. Por exemplo, o ato
de trocar um pneu furado em um carro consiste em:
Pegar as ferramentas no porta-malas;
Retirar o estepe;
Instalar o macaco;
Levantar o carro parcialmente;

-1-

Departamento de Informtica

Apostila de PD-I, ICC e IC

Afrouxar os parafusos do pneu furado;


Retirar o pneu furado;
Instalar o novo pneu;
Abaixar o carro
Apertar bem as porcas;
Guardar o pneu furado e as ferramentas;

A seqncia descrita acima pode ser completada com vrias observaes. Por exemplo:
O que fazer se o macaco no estiver no porta-malas?
O que fazer se o estepe tambm estiver vazio?
Deve-se sempre puxar o freio de mo antes de executar estas operaes.
Por outro lado, algumas aes devem ser levadas a cabo aps executar a troca do pneu. Por
exemplo:
Limpar as mos;
Consertar o pneu furado;
Se o responsvel pela construo do algoritmo tiver que se preocupar com todas as possibilidades
do ambiente de execuo do mesmo, e alm disso, com todas as necessidades de tratamento psexecuo , nenhum algoritmo ser completo. Sempre alguma condio poder ser esquecida.
Assim, antes de se construir um algoritmo, deve-se especificar as condies de inicio (dados de
entrada) e as de trmino (dados de sada). No caso acima, teremos:
Condio de entrada: um carro com todos os equipamentos de segurana em
condies, parado e freado, com um pneu furado.
Condio de sada: um carro parado, freado, com todos os equipamentos de
segurana em condies, exceto pelo pneu estepe vazio, com todos os pneus OK.
Alm disso, algum pode argumentar que as aes no esto suficientemente detalhadas para
compreenso. Para uma pessoa acostumada a trocar pneus furados as explicaes so suficientes,
mas ser que um selvagem do deserto Kalahari, que nuca viu um carro antes, saber utilizar
corretamente um macaco para elev-lo?
Assim, a funo levantar o carro seria melhor descrita como:
Empunhe o cabo da manivela do macaco; comece a girar a manivela no sentido
horrio, mantendo este movimento at que o pneu do carro esteja suspenso a pelo
menos 10 cm do cho; solte a manivela.
Boa parte dos problemas tratados no computados resolvida por seqncia de instrues
(algoritmos) compostas por um agrupamento de atividades por si s complexas. Da mesma forma
que foi necessrio detalhar o uso do macaco para o selvagem, tambm estas atividades complexas
devem ser detalhadas at a um nvel em que o computador seja capaz de reconhec-las e executlas.
Devido velocidade com que o computador processa cada uma destas instrues simplificadas,
no h problema em descrever e tratar uma atividade complexa atravs de milhares de outras
atividades bsicas.
Para os seres humanos, contudo, difcil memorizar e detalhar milhares de instrues,
associando-as atividade original. Para facilitar esta tarefa, utilizam-se duas ferramentas:
Tcnica de Refinamentos Sucessivos;
Representao de Algoritmos.

-2-

Departamento de Informtica

Apostila de PD-I, ICC e IC

-3-

Departamento de Informtica

Apostila de PD-I, ICC e IC

I.3 A Tcnica de Refinamentos Sucessivos


O computador s capaz de entender instrues muito simplificadas, escolhidas dentro de um
conjunto bastante restrito. A transformao de atividades complexas, bem mais que a troca de um pneu
furado, seqncia de instrues computacionais pode ser uma atividade tediosa e frustrante, na medida
em que quase sempre se esquece algum detalhe.
Os seres humanos tm capacidade limitada de armazenar informaes em memria. Estas
informaes tanto podem ser os processos necessrios ao cumprimento de alguma atividade como as
ferramentas necessrias para a execuo dos processos individualmente. Uma boa poltica ento,
dividir atividades complexas em processamentos-componentes menores, especificando apenas a
entrada e a sada de cada um dos processamentos-componentes. Aps individualizados os
processamentos-componentes e suas entradas/sadas, pode-se preocupar com as ferramentas necessrias
para sua execuo.
Entrando, mesmo estes processos menores podem ser ainda to complexos que exijam novas
divises. Repete-se, ento, a diviso, desta vez no interior dos processamentos-componentes, gerando
novos processamentos mais simplificados.
Esta atividade feita pela construtor do algoritmo (VOC!) at que os processamentoscomponentes se tornem seqncias de instrues aceitveis pelo computador.
Est tcnica conhecida como dividir-para-conquistar, ou tambm Tcnica de Refinamentos
Sucessivos.
Vejamos graficamente o que ocorre no algoritmo que descreve atividades matinais de uma pessoa:
=>Algoritmos Manh de Segunda-Feira
Levantar da cama;
Cuidar da higiene pessoal;
Tomar caf;
Recolher material necessrio;
Sair de casa.
Processamento-Componente Levantar de Cama
Abrir os olhos;

Se espreguiar;
Ficar de p.
Processamento-componente Tomar Caf
Sentar mesa;

Pr caf na xcara;
Pr margarina no po;
Comer o po e tomar o caf;
Comer uma fruta.

Processamento-componente Comer o po e tomar o caf


Apanhe o po com margarina e a xcara com caf;

-4-

Departamento de Informtica

Apostila de PD-I, ICC e IC

Enquanto o po com margarina e o caf no acabarem, coma mais um pedao de po e


beba mais um pouco de caf da xcara.
Processamento-componente Coma uma fruta
Se houver algum tipo de fruta disponvel na mesa, escolha um tipo;
Pegue uma fruta do tipo escolhido;
Coma a fruta.
Exerccios
1) Termine o detalhamento de todos os procedimentos necessrios sua Manh de Segunda-Feira.
Depois compare com pelo menos dois de seus colegas.
2) Use a tcnica de refinamentos sucessivos para detalhar as seguintes atividades:
Limpeza de um automvel;

Montagem de uma barraca de camping;


Preparao de um bolo de aniversrio.

I.4 Representao de Algoritmos


Devido pequena capacidade de memorizao humana, os procedimentos-componentes devem ser
armazenados em algum lugar, para permitir o acesso rpido e o fcil entendimento. Para isto, podem
ser utilizadas desde folhas de papel at o auxilio de computadores.
Qualquer que seja o tipo de armazenamento, estes procedimentos/algoritmos devem ser descritos por
algum modelo. Nos exemplos anteriores utilizamo-nos da prpria lngua portuguesa, que um modelo
de representao com que estamos acostumados a trabalhar.
A lngua portuguesa traz, contudo, uma srie de inconvenientes:
Certas palavras tm dupla interpretao;
Exigem-se regras de concordncia bastante definidas;
A pontuao pode alterar completamente o significado de uma frase.
Alm disso, a lngua falada costuma apresentar construes complexas, bastantes distintas da
simplicidade das linguagens entendidas pelos computadores.
Os modelos de representao de algoritmos devem ser mais restritos, diminuindo a liberdade de
expresso do construtor de algoritmos, mas com isso eliminando os problemas de interpretao,
concordncia e pontuao. Estes modelos devem ainda utilizar-se da apresentao grfica para tornar
os algoritmos mais fceis de serem compreendidos.
A linguagem de programao C proporciona estas caractersticas para a representao de algoritmos.
I.5 Partes de um Programa em C
Um exemplo bastante conhecido de representao de programas o de receitas culinrias. Estas tm a
seguinte estrutura:
Nome da receita;

Ingredientes: descreve todo o material necessrio durante p preparo da receita;


Modo de preparar: descreve como agrupar e tratar os ingredientes.
-5-

Departamento de Informtica

Apostila de PD-I, ICC e IC

Alm disso, toda receita vem com muitos comentrios relativos a detalhes que poderiam passar
despercebidos e estragar o resultado final. Os comentrios servem para chamar a ateno do cozinheiro
e explicar melhor o porque de cada passo.
Da mesma forma um bom programa ter 4 partes:
1. Cabealho: com o nome do programa;
2. Dicionrio de Dados: definindo os dados de entrada, de sada e outros que sejam necessrios ao
longo do processamento do programa;
3. Corpo: definindo o tratamento dado aos dados no programa;
4. Comentrios: esclarecendo aspectos pouco claros do programa em suas diversas partes
(Cabealho, Dicionrio de Dados e Corpo).
Alm disso, a forma como as linhas do programa esto dispostas fisicamente, identao, deve ser feita
de maneira a tornar a listagem do programa o mais clara quanto possvel, permitindo assim uma boa
legibilidade do programa.
Para que um programa apresente uma boa esttica deve-se seguir regras bsicas, como:
Coloque cada comando em uma linha separada;
Insira uma linha em branco antes de cada seo do programa e sempre que apropriado em
uma seqncia de comandos para destacar blocos de comandos;
Mantenha-se fiel a identao dos comandos de modo a enfatizar a relao entre palavras
reservadas e comandos que compreendem estruturas de controle, sees de programas, etc.

-6-

Departamento de Informtica

Apostila de PD-I, ICC e IC

CAPTULO II
A SOLUO DE UM PROBLEMA ATRAVS DO COMPUTADOR
I.1 O que um Algoritmo
Quando se deseja resolver um problema com auxlio do computados, necessrio a execuo de uma
srie de etapas, elaboradas e executadas passo a passo na forma de algoritmos.
O algoritmo descrito em portugus, o que permite ao programados pensar no problema a ser
resolvido, e no na mquina ou linguagem de programao que sero usadas. Esta preocupao fica
para uma etapa posterior.
I.2 A Programao Estruturada
A programao estruturada consiste em uma metodologia de projeto de programa com objetivo de
reduzir a complexidade dos grandes sistemas de software. Assim essa metodologia se prope a:
Facilitar a escrita dos programas;

Facilitar a leitura e compreenso de programas;


Permitir a verificao a priori dos programas;
Facilitar a manuteno e verificao dos programas.

A idia bsica da programao estruturada reduzir a complexidade do sistema, em tre nveis:


PRIMEIRO NVEL
Desenvolvimento do programa em diferentes fases pro refinamentos sucessivos (top-down). Isto
, o problema inicial subdividido em subproblemas menores, etc. A cada diviso so levados em
conta mais detalhes sobre a especificao do problema, sendo que os meios disponveis para a soluo
(mquina e linguagem de programao) so deixados para as ltimas fases.
Em cada etapa da decomposio, preciso garantir que:
As solues dos subprogramas permitam obter a soluo total;

A seqncia de aes componentes faa sentido;


A decomposio selecionada se aproxime cada vez mais daquilo que representvel pelos

comandos da linguagem na qual o programa ser escrito.


O processo inverso, quando em primeiro lugar levado em conta a linguagem de programao (ou
mesmo o computador que ser adotado) denominado de desenvolvimento bottom-up.
Na prtica, os dois tipos de desenvolvimento (top-down e bottom-up) no so independentes e nem
existe um compromisso formal do programador em usar um ou outro. Tudo depende dos recursos
disponveis, do ambiente em questo e at da formao do programados.
SEGUNDO NVEL
Modularizao de grandes programas, isto , diviso do programa em pequenas etapas, que so
mdulos ou subprogramas, que nada mais so que um conjunto de comandos agrupados com a
finalidade de executar uma determinada funo. A primeira etapa, por onde comea a execuo do
trabalho, recebe o nome Programa Principal, e as outras so os sub-programas propriamente ditos,
executados sempre que ocorre uma chamada dos mesmos. Para que os sub-programas possam ser
chamados, eles devem receber um nome, e a unidade que deseja cham-lo o faz atravs de seu nome.
Um sub-programa por sua vez, pode chamar outro sub-programa e assim por diante.
A modularizao possui vrias vantagens, como por exemplo:

-7-

Departamento de Informtica

Apostila de PD-I, ICC e IC

Permite a diviso de tarefas em equipes, onde cada mdula pode ser elaborado por um
programa diferente;
Facilita o teste, pois cada mdula pode ser testado individualmente e depois incorporado ao
conjunto;
Permite o uso do mesmo mdula vrias vezes.
TERCEIRO NVEL
Elaborao do programa usando dentro de cada mdulo um numero limitado de estruturas bsicas de
fluxo de controle, isto , instrues.
Os mdulos so construdos por programas. No programa, cada um de seus passos pertence a uma das
trs estruturas bsicas:
Operao elementar;

Operao de controle (Estrutura) especificando uma seleo entre seqncias de passos;


Operao de controle (Estrutura) especificando a repetio de uma seqncia de passos.
DOCUMENTAO:
Os programas devem ser lidos e entendidos por quem os confeccionou e por outras em toda a sua vida
til, uma vez que podem necessitar correo, manuteno e modificao. Para que isto ocorra, eles
precisam ser muito bem documentados.
Um programa bem documentado possui as seguintes caractersticas:
convenientemente identado de modo a mostrar sua estrutura lgica. Os comandos devem
ser alinhados de acordo com o nvel a que pertencem, ou seja, a estrutura na qual eles esto
contidos deve estar destacada;
Possui comentrios que auxiliam a sua compreenso por outras pessoas no responsveis
por sua elaborao;
Contm uma declarao de variveis em um dicionrio de dados. O dicionrio de dados
especifica formalmente o contedo de cada dado utilizado no corpo do programa e indica os valores
que cada um deles pode assumir.

-8-

Departamento de Informtica

Apostila de PD-I, ICC e IC

CAPTULO III
CONSTRUO DE PROGRAMAS EM C
Objetivos

Apresentar os tipos bsicos de dados INT, FLOAT, CHAR;


Apresentar a forma de definio das variveis e constantes de um programa em C;
Apresentar os comandos elementares de construo de programas em C, exemplificando seu
uso;
Apresentar uma forma organizada de construo de programas;

III.1 Introduo
Nos captulos anteriores mostraram-se diversos algoritmos, com suas operaes mais simples sendo
executadas por seres humanos (algoritmo Troca de Pneu). Tambm se discutiram as vantagens e
objetivos das Tcnicas de Programao Estruturada (Refinamentos Sucessivos, Modularizao,
Documentao, etc).
Nesse captulo sero descritas as operaes bsicas que o computador pode executar. Estas operaes
sero utilizadas para construir algoritmos progressivamente mais complexos.
Um fator a observar que os computadores reais, na verdade, executam um conjunto ainda mais
reduzido de operaes, chamadas operaes de mquina, e que definem a Linguagem de Mquina.
As operaes descritas aqui referem-se ao que se convenciona chamar de Linguagens de Alto
Nvel. Estas so mais prximas de linguagem humana. Para traduzir um programa escrito em
linguagem de alto nvel para linguagem de mquina utilizam-se outros programas denominados de
compiladores.
Uma vez construdo um algoritmo, o mesmo pode ser traduzido para uma linguagem de programao
de alto nvel (PACAL, COBOL, FORTRAN, C, MODULA, etc). Este ltimo programa ento
traduzido pelo compilados para linguagem de mquina, que pode ser executada pelo computador.
IDENFIFICAO DO
DO PROBLEMA
PROBLEMA
IDENFIFICAO

|
CONSTRUO DE ALGORITMO

|
TRADUO PARA UM
LINGUAGEM DE ALTO NVEL

|
COMPILAO

-9-

Departamento de Informtica

Apostila de PD-I, ICC e IC

EXECUO PELO COMPUTADOR

As operaes bsicas executadas em Linguagem de Alto Nvel so feitas sobre tipos bsicos de dados.
Antes de se aprender as operaes necessrio, portanto, conhecer esses tipos bsicos de dados.
III.2 Identificadores
Em geral, uma linguagem de Alto Nvel possui dois tipos de elementos: os elementos definidos pela
linguagem (palavras reservadas, etc) e os elementos definidos pelo programador (identificadores,
comentrios, etc).
Um identificador um smbolo que pode representar uma varivel, uma constante, um tipo, um nome
de programa ou subprograma ou rtulo.
formado por uma seqncia de caracteres alfanumricos (letras e dgitos), sendo que o primeiro deve
ser obrigatoriamente alfabtico.
A escolha de nomes de identificadores importante para a qualidade do programa. Um nome de
identificador deve ser significativo, isto , deve esclarecer a funo que o elemento identificado exerce
dentro do programa. Deste modo, o programa se torna fcil de ler, compreender e alterar.
Neste texto ser adotado como regra na escrita: a) nome de identificados comeados com letra
maiscula e demais caracteres minsculos; b) nomes compostos de identificadores com a primeira letra
de cada parte maiscula, e c) palavra com letras maisculas. Apesar do compilador na fazer distino
entre letras maisculas e minsculas.
III.3 Tipo de Dados
As linguagens de alto nvel permitem ao programador definir tipos de dados bastantes complexos,
como vetores, matrizes, filas e pilhas. Todavia, todos esses tipos so compostos por outros tipos
menores, com caractersticas definidas pela prpria linguagem. So os tipos bsicos de dados.
Os dados em um algoritmo/programa podem ser de dois tipos: constantes ou variveis.
Constantes so valores que parecem em meio ao programa e que no tm seu valor alterado durante a
execuo do mesmo. Um exemplo tpico o do nmero (PI).
Variveis so elementos (posio de memria da mquina) que recebem o valor de uma varivel ou de
uma expresso, podendo este valor ser alterado durante a execuo do programa. Uma varivel pode
ser imaginada como uma posio da mquina, identificada pelo nome da varivel.
Exemplo:
Soma = 0; significa que uma posio de memria da mquina, identificada pelo nome Soma, recebe
o valor 0.
III.3.1 Tipo Bsicos de Dados
No C, so adotados quatro tipos bsicos de dados, isto , so quatro os tipos primitivos de dados que
podem ser usados. Esses tipos podem criar outros tipos chamados de tipos construdos, que sero
vistos posteriormente.
1. TIPO INTEIRO (int)
Designa um intervalo (dependente do compilador e da mquina) dos nmeros inteiros (negativo,
positivo ou nulo). Possui como operaes associadas:
Soma: +

- 10 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

Multiplicao: *
Subtrao: Diviso inteira: /
2. TIPO PONTO FLUTUANTE (float)
Designa um intervalo dos nmeros racionais (a preciso e o intervalo so dependentes da mquina e do
compilador). Possui como operaes associadas:
Soma: +
Multiplicao: *
Subtrao: Diviso: /
3. TIPO CARACTER (char)
Designa qualquer caracter (letras, nmeros e caracteres especiais como *, &, $, etc). Existem operaes
especiais associadas manipulao de caracteres, mas no sero abordadas neste momento.
4. TIPO BOOLEANO (int)
Na linguagem C, o tipo INT usado tambm como expresso booleana. Para isso, o zero interpretado
como falso e os outros nmeros como verdadeiro.
III.4 Definio das Variveis de um Programa
Quando se escreve um programa, necessrio definir o tipo de todas as variveis que sero usadas.
Essa definio de tipo feita atravs de uma Declarao de Variveis, onde so especificados os
valores que podem ser atribudos a cada uma das variveis (se valores inteiros, reais, etc). Em C,
quando um computador est executando um programa e encontra uma varivel qualquer, se esta no
tiver tido o seu nome e tipo declarado anteriormente, ser emitida uma mensagem de erro, abortando a
execuo. Assim, toda varivel deve ser declarada antes de ser utilizada.
A declarao de variveis e constantes segue a seguinte estrutura:
#define <identificador> <valor>
<tipo> <identificador>;
Exemplo:
#define pi 3, 1415926
#define NotaMaxima 10
int soma, cont1, cont2, matriculaAluno;
float mediaAluno, notaProva1, notaProva2;
EXERCCIO
Assinale os identificadores vlidos:
( )Valor
( )Salrio-Liquido
( )SalarioLiquido
( )X2
( )NotaAluno
( )3X3
( )AH!!
( )xy
- 11 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

( )X234
III.5 Operaes Elementares
As operaes elementares so os comandos de atribuies, clculos de expresses, e operaes de
entrada e sada. Essas operaes so chamadas de elementares por na alterarem o fluxo normal da
execuo do programa, ou seja, aps a execuo de uma operao elementar, a prxima instruo a ser
executada a seguinte do programa.
Toda instruo possui uma parte sinttica (diz respeito forma como a instruo escrita) e uma parte
semntica (diz respeito ao que a instruo faz).
III.5.1 Comando de Atribuio
O comando de atribuio a maneira de se especificar que a uma determinada varivel ser atribudo
(fornecido) um certo valor. Este comando. Em C, indicado pelo smbolo de atribuio =.
Forma geral do comando de atribuio:
<varivel> = <valor>;
O tipo dos dados esquerda e direita do comando de atribuio deve ser compatvel. A nica exceo
ocorre para casos em que um valor inteiro atribudo a uma varivel do tipo real.
III.5.2 Clculo de Expresso
As variveis e constantes podem ser combinadas com os operadores associados a cada tipo de dados,
gerando expresses. o valor calculado das expresses que atribudo varivel ao lado esquerdo do
comando de atribuio.
III.5.3 Expresso Aritmtica
A expresso aritmtica aquela cujos operadores e/ou variveis de tipo numrico.
A notao a mesma das operaes matemticas, com as seguintes excees:
No permitido omitir o operador de multiplicao:
A*C diferente de AC
Nas operaes aritmticas, as operaes guardam sempre uma relao de prioridade, que
:
Prioridade
Operao
1
Multiplicao, diviso
2
Adio, subtrao
Para se obter uma seqncia de clculos diferente, vrios nveis de parnteses podem ser usados para
quebrar as prioridades definidas. No permitido o uso de colchetes e chaves, uma vez que estes
smbolos sero utilizados com outras finalidades.

Funes Pr-definidas
Alm das operaes bsicas citadas podem-se usar nas expresses aritmticas algumas funes bastante
comuns na matemtica, definidos dentro da linguagem.
Nome da funo
abs
abs
sin

Tipo do Argumento
int
float
int/float

Tipo de Retorno
int
float
float

- 12 -

Departamento de Informtica

cos
atan
log
exp
sqrt
floor
ceil

Apostila de PD-I, ICC e IC

int/float
int/float
int/float
int/float
int/float
float
float

float
float
float
float
float
int
int

Exemplos:
ABS o valor absoluto (mdulo) de um nmero. Exemplos:
abs(-4) = 4
SQRT raiz quadrada. Exemplos:
sqrt(4) = 2
FLOOR o maior inteiro no maior que o nmero de entrada. Exemplo:
floor(10.9) = 10
CEIL o menor nmero no menor que o nmero de entrada. Exemplo:
ceil(9.9) = 10
SIN, COS e ATAN so as funes trigonomtricas seno, coseno e arco-tangente
respectivamente.
Os ngulos so sempre dados em radianos.
LOG e EXP so o logaritmo neperiano e exponencial respectivamente.
Exerccio
Calcule o valor das seguintes expresses aritmticas, considerando os seguintes valores:
A = 10
B=3
X = 2.5
Y = 1.2
a)X/2
b)ceil(X-Y)
c)EXP(Y*(B+2)-6)
d)floor(2.9+ceil(0.3+Y)*2+A)
III.5.2.2 Expresso Relacional
Trabalha com operadores relacionais e formada por trs partes: uma expresso (da esquerda), um
operador relacional e outra expresso (da direita). Note-se que uma varivel ou constante isolada pode
ser entendida como uma expresso.
So exemplos de operadores relacionais:

< menor que;

<= menor ou igual a;

== igual a;

> maior que;

- 13 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

>= maior ou igual a;

!= diferente de.
As expresses relacionais tm como resultados finais valores do tipo inteiro (0 para falso e 1 para
verdadeiro).
As variveis do tipo CHAR tambm podem ser comparadas entre si, obedecendo ordenao do
padro ASCII.
III.5.2.3 Expresso Lgica
comum nos programas surgirem situaes em que a execuo de uma ao, ou seqncia de
subaes, est sujeita a uma certa condio. Esta representada no texto do programa por meio de uma
expresso lgica.
Denomina-se de Expresso Lgica expresso cujos operadores so lgicos e cujos operandos so
expresses relacionais e/ou variveis do tipo inteiro.
Os operadores lgicos so:
&& (AND)
|| (OR)
! (NOT)
Os resultados obtidos das expresses lgicas tambm so valores do tipo inteiro (0 para falso e 1 para
verdadeiro).
Exemplos:
Se P e Q so operandos inteiras ento:
P
Q
P && Q
P || Q
!P
!(P && Q)
1
1
1
1
0
0
1
0
0
1
0
1
0
1
0
1
1
1
0
0
0
0
1
1
Exerccios
Dadas as variveis e seus valores:
A = 10
B=3
X = 3.5
L1 = 1
L2 = 0
Calcule o valor das seguintes expresses:
a)(A < B)
b)(X < A)
c)((X + A) < (B * Y))
d)((X < A) || (B > Y))
e)L1 && L2
f)L1 || L2
g)(L1 && (X < Y))
h)((! L2) || (! (X < (Y + 2))))

Y = 0.3

Prioridade de Clculo das Expresses


Caso se elimine os parmetros das expresses dos exerccios anteriores, podem-se criar dvidas sobre
que operaes sero executadas primeiro. A tabelo a seguir apresenta a ordem de prioridade de clculo
de expresses.
Prioridade
Operador
1
!
2
*, /, %, &&

- 14 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

3
4

+, -, ||
==, !=, <, <=, >=, >

III.5.3 Operaes de Entrada de Dados


O computador armazena os valores das variveis (e o prprio programa!) em sua memria. O
computador alcana estes valores do ambiente externo atravs de operaes de entrada de dados. A
operao de entrada de dados transfere um ou mais dados do ambiente externo (teclado, disquete) para
uma ou mais variveis na memria, funcionando como um comando de atribuies. Os dados lidos
devem ser do mesmo tipo das variveis especificadas no comando de leitura. A forma geral de
descrio desta operao :
scanf(<formato1> <formato2> ... <formatoN>, &var1, &var2, ..., &varN);
A tabela a seguir nos mostra alguns dos possveis formatos a serem usados:
Cdigo
Significado
%c
L um nico caracter
%d
L um inteiro decimal
%i
L um inteiro decimal
%e
L um nmero em ponto flutuante
%f
L um nmero em ponto flutuante
%g
L um nmero em ponto flutuante
%o
L um nmero octal
%s
L uma string
%x
L um nmero hexadecimal
%p
L um ponteiro
%n
Recebe um valor inteiro igual ao nmero de
caracteres lidos at ento
%u
L um nmero sem sinal
%[]
Busca por um conjunto de caracteres
Exemplo:
Tome o seguinte trecho de um programa em escrito em C.
scanf(%d %d %d, &X, &Y, &Z);
scanf(%d, &W);
Simulao da execuo:
TELA

MEMRIA
X = ?, Y = ?, Z = ?, W = ?
X = 10, Y = 20, Z = 30, W = ?
X = 10, Y = 20, Z = 30, W = 40

10 20 30
40

III.5.4 Operaes de Sada de Dados


Quando o computador termina de processar as informaes e obtm os valores finais (por exemplo, o
salrio lquido), os valores so automaticamente armazenados em posies de memria (valores de
variveis). Entretanto, o usurio no tem acesso a estes valores.
Para permitir o acesso do usurio aos resultados, o programados deve ordenar sua apresentao. Esta
pode ser em vdeo ou em impressoras.
- 15 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

A operao de sada de dados transfere para o mundo exterior um ou mais valores ou variveis
desejadas. Apresenta a seguinte forma geral:
printf(<formato1> <formato2> ... <formatoN>, var1, var2, ..., varN);
A tabela a seguir nos mostra alguns dos possveis formatos a serem usados:
Cdigo
Formato
%c
caracter
%d
Inteiros decimais com sinal
%i
Inteiros decimais com sinal
%e
Notao cientfica (e minsculo)
%E
Notao cientfica (E maiscula)
%f
Ponto flutuante decimal
%g
Usa %e ou %f, o que for mais curto
%G
Usa %G ou %F, o que for mais curto
%o
Octal sem sinal
%s
String de caracteres
%u
Inteiros decimais sem sinal
%x
Hexadecimal sem sinal (letras minsculas)
%X
Hexadecimal se sinal (letras maisculas)
%p
Apresenta um ponteiro
%n
O argumento associado um ponteiro para inteiro
no qual o nmero de caracteres escritos at esse
ponto colocado
%%
Escreve o smbolo %
Exemplo:
Tome o seguinte trecho do programa:
printf(Entre com dois numeros inteiros: );
scanf(%d %d, &num1, &num2);
printf(%d , num1);
printf(%d\n, num2); //o \n faz com que ele pule para a prxima linha
printf(Soma: %d, num1+num2);
printf(\n);
printf(Fim Programa);
Simulao da execuo:
TELA
Entre com dois nmeros inteiros:1 2
12
Soma: 3
Fim Programa

- 16 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

III.6 Um Primeiro Programa


Um aluno do curso de Construo de Programas deseja calcular a sua mdia final, conhecidas as suas
trs notas parciais. Escreva um programa computacional que executa esta operao.
OBS.: As notas parciais podem ser fracionrias; a mdia final a mdia aritmtica das trs notas
parciais.
main(){
float nota1, nota2, nota3, media_final;
scanf(%f %f %f, &nota1, &nota2, &nota3);
media_final = (nota1 + nota2 + nota3) / 3;

//aqui feito o clculo da mdia

printf(A Media Final eh: %d, media_final);


}
Esse exemplo j permite identificar as partes de um programa. So elas: cabealho, dicionrio de
dados, corpo e comentrios.
III.6.1 Dicionrio de Dados
No dicionrio de dados se definem todas as variveis e constantes utilizadas no programa. Tambm os
nomes das variveis devem ser auto-explicativos. No caso de no ficar explicito a funo da varivel
com o nome, deve-se utilizar comentrios explicativos.
A forma de declarao de dados j foi definida anteriormente.
III.6.2 Corpo
onde se descrevem as operaes que se devem efetuar sobre os dados (entradas, atribuies, clculo
de expresses e sadas) de forma a obter informaes desejadas. No caso de algum trecho do programa
no ter uma leitura imediata e fcil, mesmo por quem no o construiu, tambm dev-se utilizar
comentrios explicativos.
III.6.3 Corpo
Os comentrios so a ltima parte do programa, mas no a menos importante. Como se explicou, os
comentrios se localizam em todas as partes do programa (cabealho, dicionrio de dados e corpo). Sua
funo explicar a funo de cada operao cuja utilidade no esteja clara a uma leitura imediata.
Tambm o programa como um todo merece um conjunto de comentrios que descrevem sua utilidade,
o que se faz com um grupo de comentrios associados ao cabealho do programa.
E qualquer parte do programa, pode se identificar os comentrios por estarem escritos entre /* e */ ou
frente de //. Aquelas funcionam como delimitadores dos comentrios.
Em exemplos pequenos como o acima, a utilizao de nomes mnemnicos nas variveis suficiente
para garantir a legibilidade do programa. Em programas maiores, contudo, isto pode no ocorrer: neste
caso a utilizao de comentrios essencial.
O critrio para o uso ou no de comentrios subjetivo, mas pode ser bem traduzido pelo seguinte
questionamento: Ser que um programador mdio, no to capaz e inteligente quanto eu mesmo, ser
capaz de ler e entender cada linha de cdigo escrito com a sma facilidade? Ser que eu serei capaz de
- 17 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

entender a funo de cada varivel e cada linha de cdigo daqui a um ano, as 21:00 horas de uma
sexta-feira de carnaval, quando este programa der um defeito e eu for o responsvel pela sua
correo?
Muitos programadores acostumados a restries de linguagens antigas tm o mau costuma de definir
nomes de variveis muito pequenos e pouco explicativos (uma ou duas letras), tambm s incluem
comentrios quando so diretamente obrigados pela sua chefia,e isto aps a escrita do seu programa,
quando j esqueceram boa parte das funes do programa e suas variveis.
A experincia demonstra que o tempo gasto em escrever nomes maiores e mais explicativos bem
menor que aquele gasto tentando lembrar a funo e o tipo de uma varivel de nome XY2 na milsima
primeira linha de cdigo, ou procurando a definio desta varivel na folha de nmero 257 em um
bloco de listagem com 500 pginas.
Na mesma linha de raciocnio, os comentrios podem e devem ser definidos durante a construo do
programa. Ao utilizar as tcnicas de programao estruturada, o programador ter todos os comentrios
apropriados a cada parte do programa antes de iniciar seu detalhamento final.

Comentrios no cabealho

Um grupo de comentrios so aqueles relativos ao conjunto do programa. Antes de algumas


informaes sobre o autor e a data de construo do programa, existem 5 comentrios fundamentais em
qualquer programa:
Funo: deve-se descrever o objetivo do programa com um texto conciso;
Entradas: descrevem-se todos os dados cuja leitura necessria durante a execuo do
programa;
Sadas: descrevem-se todas as sadas de resultados obtidos ao longo do programa;
Condio de parada: muitas vezes os programas executam tarefas repetitivas. A no ser
que haja uma condio de arada estipulada, o programa continuaria indefinidamente. Esta
condio deve ser explicitada nos comentrios do cabealho;
Restries: alguns programas exigem que os dados estejam dispostos de uma forma
particular ou com alguma caracterstica em particular. Este o caso de dados cuja entrada
deve ser ordenada por alguma chave ou dados que no podem ter valor nulo. Caso haja
uma ocorrncia deste tipo em programa, esta restrio deve ser includa nos comentrios
do cabealho.
Exemplos:
3)Escreva um programa que calcule a renda lquida de uma pessoa, conhecidas a renda bruta, o
percentual de impostos e a parcela a deduzir de uma determinada pessoa fsica. Imprima o resultado
junto com o nmero de CPF que tambm so dados de entrada.
main(){
/*Autor: Pedro II
Data: 13 de maio de 1888
Funo: calcular a renda liquida de um contribuinte.
Entrada: numero do CPF, renda bruta, percentual de impostos e parcela a deduzir.
Sada: numero do CPF e receita liquida.*/

- 18 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

float rendaLiquida, rendaBruta, parcelaDeducao, impostoFinal, percentualImposto;


int numCPF;
scanf(%d %f %f %f, &numCPF, &percentualImposto, &parcelaDeducao);
impostoFianl = rendaBruta * (percentualImposto / 100) parcelaDeducao;
receitaLiquida = receitaBruta impostoFinal;
printf(%d %f, numCPF, receitaLiquida);
}
III.7 Comandos Estruturados
III.7.1 Seqncia de Comandos
Uma seqncia finita de comandos onde cada instruo executada uma vez, um aps o outro sem
desvio. A seqncia delimitada por { e }, com cada comando separado por ;.
{
<comando1>;
<comando2>;
.
.
.
<comandoN>;
}
Um programa um exemplo de uma seqncia de comandos.
III.7.2 Estrutura de Seleo
Quando uma ao ou conjunto de aes dentro do programa depender de uma teste, que decide pela sua
execuo ou no, deve-se utilizar o comando (estrutura) de seleo.
Comando if / else
Sua forma geral :
if (expresso)
Comando1
else
Comando2
O comando1 s ser executado se a expresso for verdadeira. Caso contrrio ser executado o
comando2.
Jamais ambas expresses de comandos sero executadas, e tambm nunca teremos nenhuma expresso
sem ser executada.
Exemplo:

- 19 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

Calcular a mdia final de um aluno do curso de programao a partir de suas trs notas parciais. Caso
sua nota final seja inferior (superior) a 6.0, imprima uma aviso de que o aluno foi reprovado
(aprovado).
Algoritmo em portugus:

Leitura das notas

Clculo das mdias

Se mdia inferior a 6.0: aluno reprovado

Seno: aluno aprovado


Algoritmo traduzido para C.
main(){
int matricula;
float n1, n2, n3, mediaFinal;
printf(Entre com as notas parciais: );
scanf(%d %f %f %f, &matricula, &n1, &n2, &n3);
mediaFinal = (n1 + n2 + n3) / 3.0;
if(mediaFinal < 6.0){
printf(O aluno %d foi reprovado.);
}
else{
printf(O aluno %d foi aprovado.);
}
}
Observe que os delimitadores { e } foram omitidos nas clusulas if / else, isto porque sempre que
uma seqncia for composta por apenas um comando os delimitadores so opcionais, porm sempre
bom coloc-los. O ; nunca colocado antes da clusula else, visto que o ; representa o fim do
comando if e o else nada mais que a continuao do comando if / else.
A clusula else opcional, podendo a estrutura reduzir-se a:
if (expresso)
Comando
Neste caso, se a condio for falsa o comando seguinte ao comando if ser executado.
Exemplo:
Ler dois nmeros e orden-los.
main(){
int num1, num2, aux;

- 20 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

printf(Entre com os nmeros: );


scanf(%d %d, &num1, &num2);
printf(Valores desordenados: %d %d.\n, num1, num2);
if(num1 > num2){
aux = num1;
num1 = num2;
num2 = aux;
}
printf(Valores ordenados: %d %d.\n, num1, num2);
}
O programa l dois nmeros e faz a troca, ordenando-os, caso num1 seja maior que num2. Caso
contrrio troca no executada e o comando seguinte ao if executado.
OBS.: Para que uma varivel participe de uma operao de comparao necessrio que inicialmente
ela seja atribudo algum valor, atravs de leitura ou atribuio.
Programa MaiorDeTres:
main(){
/* Funcao: le tres nmeros e identificar o maior.
Entrada: tres numeros inteiros.
Saida: o maior dos tres numeros inteiros. */
int n1, n2, n3;
printf(Entre com os tres numeros: );
scanf(%d %d %d, &n1, &n2, &n3);
if((n1 > n2) && (n1 > n3)){
printf(Omaior eh: %d., &n1);
}
if((n2 > n1) && (n2 > n3)){
printf(Omaior eh: %d., &n2);
}
if((n3 > n1) && (n3 > n2)){
printf(Omaior eh: %d., &n3);
}
}
- 21 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

Note que este programa embora funcione no eficiente, pois caso o nmero n1 seja maior mais dois
teste so feitos desnecessariamente.
Um a segunda verso mais eficiente utilizando comandos de seleo aninhados dada no seguninte
exemplo:
main(){
/* Funcao: le tres nmeros e identificar o maior.
Entrada: tres numeros inteiros.
Saida: o maior dos tres numeros inteiros. */
int n1, n2, n3;
printf(Entre com os tres numeros: );
scanf(%d %d %d, &n1, &n2, &n3);
if (n1 > n2){
if (n1 > n3){
printf(O maior eh: %d., n1);
}
else {
printf(O maior eh: %d., n3);
}
}
else{
if (n2 > n3) {
printf(O maior eh: %d., n2);
}
else {
printf(O maior eh: %d., n3);
}
}
}
Comando Switch
Sua forma geral :
switch (expresso) {
case valor1: comando1
case valor2: comando2
.
.
.
case valorN: comandoN
default : comando
}
- 22 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

O comando switch permite que seja realizada uma entre as n seqncias de operaes, dependendo do
valor do seletor.
O valor do seletor o comparado com cada valor de seqncia de valores. Se algum dos valores
comparados for igual ao valor do seletor a seqncia de operaes a ele relacionada ser executada.
O caso intitulado default executado se nenhum outro for satisfeito. O default opcional.
Exemplo:
Ler uma vogal e exibir a vogal subseqente. Considere letras maisculas.
main(){
/* Funcao: ler uma vogal e exibir a vogal subsequente
Entrada: uma vogal
Saida: uma vogal subsequente */
char cor;
printf(Entre com uma vogal maiuscula: );
scanf(%c, &cor);
switch (cor) {
case A: cor = E;
case E: cor = I;
case I: cor = O;
case O: cor = U;
case U: cor = A;
}
printf(Vogal subsequente: %c, cor);
}
Exemplo:
Ler ms e ano e exibir o nmero de dias do ms / ano digitado.
main(){
int dia, mes, ano;
printf(Entre com o mes: );
scanf(%d, &mes);
scanf(%d, &ano);
switch (mes) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12: dia = 31;
case 4: case 6: case 9: case 11: dia = 30;
- 23 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

case 2: {
if (ano % 4 == 0){
dia = 29;
}
else {
dia = 28;
}
}
}
printf(O mes %d do ano %d possui %d dias., ms, ano, dia);
}
III.7.3 Estrutura de Repetio
Quando um conjunto de aes executado repetidas vezes, tem-se uma repetio.
A estrutura de repetio, assim como a estrutura de seleo, envolve sempre a avaliao de uma
condio. Existem trs tipos bsicos de repetio em C: while, do-while e for.
Comando while
Sua forma geral :
while(expresso)
comando
A estrutura while usada para repetir n vezes uma ou mais instrues, tendo como vantagem o fato
de no ser necessrio conhecer o valor de n (nmero de repeties).
Antes da seqncia ser executada, a condio avaliada. Se na primeira avaliao a condio for falsa
a seqncia de operaes no executada uma nica vez. Caso a condio seja verdadeira a seqncia
de operaes executada repetidamente at que a condio se torne falsa.
Logo, em algum momento esta condio deve ser modificada dentro do lao while, caso contrrio a
seqncia ser executada indefinidamente provocando um loop no programa.
Exemplo:
Dado um nmero externo, imprimir a tabuada desse nmero, de zero a nove:
main(){
int numero, multiplicador, produto;
scanf(%d, &numero);
multiplicador = 0;
while (multiplicador <= 9){
produto = numero * multiplicador;
printf(numero * multiplicador = %d, produto);
multiplicador = multiplicador + 1;
}
- 24 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

}
Neste exemplo o valor da varivel multiplicador modificado a cada iterao do lao while. A
seqncia de operaes do comando while executada at que o valor do multiplicador seja maior que
9, isto , a condio se torne falsa.
Comando do-while
Assim como o comando while, este comando usado quando no se conhece o nmero de vezes que
uma seqncia de comandos ser executada.
Sal forma geral :
do
comando
while (expresso);
O do-while testa avalia a expresso no final, depois de fazer cada passagem pelo corpo do lao, por
tanto o corpo executado ao menos suma vez.
Exemplo:
1) Dada a srie 2, 3, 4, 9, 16, 29, 54, 99... onde cada elemento a partir do quarto a soma dos trs
termos que lhe antecedem, faa um programa que leia trs termos iniciais quaisquer, e a partir da
obtenha e imprima mais 20 termos da referida srie.
main(){
int num1, num2, num3, num, n;
printf(Entre com os tres primeiros termos: );
scanf(%d %d %d, &num1, &num2, &num3);
printf(%d %d %d , num1, num2, num3);
n = 0;
do {
num = num1 + num2 + num3;
printf(%d , num);
num1 = num2;
num2 = num3;
num3 = num;
n = n + 1;
} while (n < 20);
}
2)

- 25 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

main(){
char resp;
do {
printf(deseja continuar? S/N \n);
resp = getchar();
} while ((resp != S) || (resp != N));
}
Neste exemplo novos caracteres so lidos at que seja teclado S ou N.
Comando for
O comando for til quando se deseja realizar uma seqncia de operaes um nmero fixo e
conhecido de vezes.
Apresenta-se da seguinte forma:
for (<inicializao>; <condio>; <incremento>)
comando
A inicializao so os comandos de atribuies feitas s variveis desejadas. A condio uma
expresso relacional que determina quando o lao acaba. O incremento define como as variveis de
controle variam com cada passo do lao.
No exemplos
for (i = 1; i <= 10; i++)
printf(%d \n, &i);
e
for (i = 10; i >= 1; i--)
printf(%d \n, &i);
Ocorrem 10 repeties. No primeiro for a varivel de controle recebe inicialmente o valor 1 e
incrementada automaticamente de 1 a cada repetio at que o primeiro valor acima de 10 seja obtido.
Isto ocorre porque antes da seqncia ser executada, o valor da <inicializao> atribudo varivel de
controle e a cada iterao seu valor comparado na <condio>, a seqncia de comando ser
executada se a varivel de controle satisfizer a <condio>. No segundo for a varivel decrementada
de 1.
A varivel de controle deve ser do tipo enumervel e deve ser declarada no dicionrio de dados.
Exemplos:
1)Ler 3 notas e imprimir a mdia.
#define numNotas 3
main(){
int i;
float nota, soma, media;

- 26 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

soma = 0;
for (i = 0; i < numNotas; i++){
printf(Entre com a nota: );
scanf(%f, &nota);
soma = soma + nota;
}
media = soma / numNotas;
printf(A media eh: %f, media);
}
2)Ler n notas e imprimir a mdia
main(){
int n, i;
float nota, soma;
soma = 0;
printf(Entre com o numero de notas: );
scanf(%d, &n);
for (i = 0; i < n; i++){
printf(Entre com a nota: );
scanf(%d, &nota);
soma = soma + nota;
}
if (n > 0){
printf(A media eh : %f, soma / n);
}
}
III.8 Um Algoritmo para a construo de Programas
Os estudos da psicologia sobre a memria humana apontam que uma pessoa com capacidade de
memorizao mediana consegue definir, de forma imediata, cerca de 8 fatos ao mesmo tempo, isto ,
apena 8 fatos ou valores podem ser recordados imediatamente se a pessoa for questionada sobre
eles.
Para poder recordar mais fatos simultaneamente, existem dois caminhos: 1) a pessoa deve decorar os
valores, de forma a acess-los de forma automtica; 2) deve ser dado um tempo para que a pessoa
consiga lembra o valor solicitado.
- 27 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

Na construo de programas, mesmo para a resoluo de programas simples como os estudantes aqui,
a quantidade de fatos a se recordar ultrapassa facilmente estes limites. Alm disso, geralmente no se
dispe de tempo para se decorar cada uma das entradas e / ou sadas do problema, suas variveis, a
estrutura do algoritmo (uso de repeties e selees), etc.
Um dos objetivos das tcnicas de programao estruturada permitir a pessoas normais o
desenvolvimento de programas (e, por conseguinte, de algoritmos) com boa produtividade. Como j foi
apontado anteriormente, duas ferramentas so fundamentais para este processo: as tcnicas de
refinamentos sucessivos e de representao de algoritmos.
Ao se desenvolver pequenos algoritmos, estas ferramentas podem ser dispensadas, porque a memria
capaz de tratar todos os elementos (variveis e estruturas de seleo e repetio, por exemplo)
programador sente dificuldades em trabalhar nesta maneira pouco metdica. A seguir, apresenta-se uma
estratgia ara auxiliar o desenvolvimento de programas;
Metodologia para o Desenvolvimento de Programas
1)Ler especificao do problema at o final, de forma a compreender de que se trata o assunto;
2)Ler novamente, tomando o cuidado de fazer e ressaltar os pontos fundamentais (entrada, sada,
restries e condies de parada);
3)Montar o cabealho do programa, inclusive (e principalmente!) os comentrios pertinentes: funo,
entrada, sada, restries e condies de parada.
4)Escrever em portugus, da forma que deseja, a seqncia de aes necessrias a obteno dos
resultados desejados. Importante: evite, neste momento, a utilizao de nomes de variveis. Utilize a
tcnica de refinamentos sucessivos para transformar procedimentos complexos em outros mais simples,
at obter um texto baseado apenas em aes simples, estruturas de seleo e repetio. Ao fim desse
passo, dever ser possvel visualizar as estruturas de repetio e seleo necessrias ao algoritmo final.
5)Monte o dicionrio de dados d programa, baseando-se no seguinte roteiro:
5.1)defina as constantes existentes no problema (ex: nmero de elementos de um conjunto,
valores mximos ou mnimos de algum dado, etc.);
5.2)defina as variveis necessrias para receber os valores de entrada (uma varivel para cada
dado de entrada). Estas entradas j esto disponveis nos comentrios do cabealho;
5.3)defina as variveis de sada necessrias para escrever os resultados desejados. Novamente,
os comentrios do cabealho serviro de base para este passo;
5.4)defina as variveis necessrias ao clculo (o algoritmo em portugus pode ser til para esta
tarefa). Por exemplo: para calcular a mdia de um conjunto de valores, necessita-se do valor acumulado
destes valores e do nmero de elementos do conjunto;
5.5)defina as variveis necessrias ao controle de fluxo de processamento do programa (o
algoritmo em portugus vai ajudar). Por exemplo: se o programa deve parar ao processar o centsimo
elemento de entrada, ento ser necessria uma varivel para controle do nmero de elementos
processados (um contador). As variveis de controle esto sempre associadas s condies testadas nas
estruturas de seleo e repetio do problema, portanto, utilize o algoritmo em portugus para auxiliar
tambm este passo.
6)Comece a traduzir o algoritmo em portugus escrito em 4 partes para o C, utilizando as constantes e
variveis descritas no dicionrio de dados montado no passo 5.
7)Verifique se todas as variveis foram devidamente inicializadas (veja observaes abaixo). Caso no
tenham sido, identifique o momento ideal de sua inicializao e inclua-a no algoritmo escrito no passo
6.
8)Verifique a correo do programa atravs de um ou mais testes de mesa (teste chins).
- 28 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

OBSERVAES:

RESISTA a tentao de saltar as fases desta metodologia. Criando o hbito de utiliz-la, voc
poder identificar adaptaes que se ajustem melhor a sua forma de trabalho, mas, ACREDITE, todos
os passos descritos acima so necessrios para a construo de um programa.

O cabealho do programa, incluindo seus comentrios (funo, entrada, sada, parada e


restrio) deve ser escrito antes do dicionrio de dados e corpo do programa. NO OS IMAGINE
COMO ACESSRIOS OU PERDA DE TEMPO. ELES TE AJUDARO NO RESTANTE DE SEU
TRABALHO!!!

Os programas bsicos descritos neste captulo e nos captulos subseqentes vo auxili-lo a


definir a estrutura do problema. Estude-os com ateno!

Sempre que identificar uma estrutura de repetio, haver uma ou mais variveis associadas
sua condio de parada. Verifique, ento, que: a)estas variveis tenham recebido um valor inicial antes
do inicio da repetio; b)em algum ponto da repetio o valor de pelo menos uma destas variveis
atualizado de maneira a tornar falsa a condio de continuidade da repetio.

Utilize nomes de variveis que descrevam a sua funo; nunca use a mesma varivel para
executar duas funes diferentes.
III.9 Programas Exemplos
A)Calcular as razes de uma equao do segundo grau, lidos os valores dos coeficientes A, B e C:
Algoritmo:
Leitura de valores

Calculo de delta
Se delta maior ou igual a zero: Calcular as razes reais
Seno: No h razes reais
Calcular as razes reais:
Se delta igual a zero: calcular raiz nica.
Se no: calcular razes distintas

main(){
/*Funcao: Calcular as razes reais de uma equao de segundo grau.
Entrada: os coeficientes A, B e C
Sada: as raizes reais da equao*/
float A, B, C, delta, raizDelta, raiz1, raiz2;
Scanf(%f %f %f, &A, &B, &C);
//calcular delta
delta = B * B - 4 * A * C;
if (delta >= 0){
if (delta == 0){

- 29 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

raiz1 = (-1) * B / (2 * A);


printf(As duas raizes sao iguais a: %f., raiz1);
}
else{
raizDelta = sqrt(delta);
raiz1 = ((-1) * B + raizDelta) / (2 * A);
raiz2 = ((-1) * B - raizDelta) / (2 * A);
printf(As duas raizes so: %f e %f, raiz1, raiz2);
}
}
else {
printf(No existem raizes reais desta esquacao!);
}
}
B)Imprimir a primeira, segunda e terceira potncias dos nmeros pares entre 2 e 50, inclusive:
main(){
int numero, potencia1, potencia2, potencia3;
numero = 2;
while (numero <= 50){
potencia1 = numero;
potencia2 = potencia1 * numero;
potencia3 = potencia2 * numero;
printf(%d %d %d, potencia1, potencia2, pontecia3);
numero = numero + 2;
}
}
C)Imprimir da primeira a vigsima potncia dos nmeros inteiros pares entre 2 e 50, inclusive:
main(){
int numero, potencia, i;
numero = 2;
while (numero <= 50){
potencia = 1;
for(i=1; i<=20; i++){
potencia = potencia * numero;
printf(A %d .a potencia de %d eh %d, i, numero, potencia);
- 30 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

}
numero = numero + 2;
}
}
D)Calcular a soma de uma progresso aritmtica de 50 termos, sendo lidos o primeiro termo e a razo:
#define numTermos 50
main(){
/*Condio de parada: ter somado os 50 termos da PA*/
float primeiroTermo, razao, soma, termo;
int contaTermos;
scanf(%f %f, &primeiroTermo, razao);
contaTermos = 1;
termo = primeiroTermo;
soma = primeiroTermo;
do {
termo = termo + razao;
soma = soma + temo;
contaTermos = contaTermos + 1;
} while(contaTermos != 50);
}
E)Calcular o Maximo divisor comum entre dois nmeros:
O MDC de dois nmeros pode ser obtido escolhendo o maior deles e subtraindo-lhe o valor do menos.
Esta operao repetida at que os dois sejam iguais, cujo valor ser o MDC dos nmeros iniciais:
33 15
45 18
18 15
27 18
03 15
09 18
03 12
09 09
03 09
MDC = 09
03 06
03 03
MDC = 03
main(){

- 31 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

int numero1, numero2, auxiliar1, auxiliar2;


scanf(%d %d, &numero1, &numero2);
auxiliar1 = numero1;
auxiliar2 = numero2;
while (auxiliar1 != auxiliar2){
if (auxiliar1 > auxiliar2){
auxiliar1 = auxiliar1 auxiliar2;
}
else {
auxiliar2 = auxiliar2 auxiliar1;
}
}
}
F)Clculo do maior nmero dentre N lidos.
Dado um nmero N do meio externo, representando a quantidade de nmero a serem lidos, o maior
desses nmeros encontrado atravs do seguinte programa:
main(){
/*Restricao: o numero N no pode ser negativo ou zero
Parada: apos a leitura do N-esimo numero*/
int n, i;
float numero, maior;
printf(Entre com o numero de termos a serem lidos: );
scanf(%d, &n);
printf(Entre com o primeiro numero: );
scanf(%f, &numero);
maior = numero;
for(i=2; i<=n; i++){
printf(Entre com proximo numero: );
scanf(%f, &numero);
if(numero > maior){
maior = numero;
}
}
printf(Maior = %f, maior);
- 32 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

}
G)Clculo do maior nmero positivo sem saber quantos so previamente.
Dada uma quantidade indefinida de valores positivos a serem lidos, o programa a seguir determina qual
o maior deles.
#define delimitador -1
main(){
/*Restricao: os nmeros devem ser inteiros positivos
Parada: ao ser lido o valor -1*/
int numero, maior;
printf(Entre com o primeiro numero: \n);
printf(Digite -1 para encerrar a entrada de dados\n);
scanf(%d, &numero);
maior = numero;
while (numero != delimitador){
if (numero > maior){
maior = numero;
}
printf(Entre com o prximo numero: \n);
printf(Digite -1 para encerrar a entrada de dados.\n);
scanf(%d, &numero);
}
if (maior !=delimitador){
printf(O maior numero eh: %d, maior);
}
else {
printf(No foi lido nenhum numero positivo);
}
}
Lista de exerccios
1)Construa um programa que apresente os 100 primeiros nmeros mpares.
2)Construa um programa que calcule e apresente todos os divisores de um nmero lido.
3)Construa um programa que apresente os 200 primeiros nmeros primos.
- 33 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

4)Construa um programa que apresente os 100 primeiros nmeros de uma Progresso Geomtrica,
sendo lidos o primeiro termo e a razo.
5)Fazer um programa que calcule e escreva uma tabela de graus centgrados em funo de graus
farenheit que variam de 50 a 150 de 1 em 1.
6)Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele comercializa. Para
isto, ele reuniu as seguintes informaes: nmero de mercadorias, preo de compra e preo de venda.
Fazer um programa que:
Determine e escreva quantas mercadorias proporcionam:
lucro < 10%
10% < lucro < 20%
lucro > 20%
Determine e escreva o valor total de compra e de venda de todas as mercadorias, assim
como o lucro total.
7)Suponha que a populao de um pas A seja de 9.000 habitantes com uma taxa anual de crescimento
de 3% e que a populao de um pas B seja, aproximadamente, de 20.000 de habitantes com uma taxa
anual de crescimento de 1,5%, fazer um programa que calcule e escreva nmero de anos necessrios
para que a populao de pas A ultrapasse ou se iguale populao do pas B, mantidas estas taxas de
crescimento.
8)Uma certa firma fez uma pesquisa de mercado para saber se as pessoas gostaram ou no de um novo
produto lanado no mercado. Para isso, obteve, para cada pessoa entrevistada, informaes a respeito
do sexo do entrevistado e sua resposta (S = Sim ou N = No). Sabe-se que foram entrevistados 2000
pessoa, fazer um programa que calcule e escreva:
O nmero de pessoas que responderam sim

O nmero de pessoas que responderam no


A porcentagem de pessoas do sexo feminino que responderam sim
A porcentagem de pessoas do sexo masculino que responderam no

9)O sistema de avaliao de uma determinada disciplina obedece aos seguintes critrios:

Durante o semestre so dadas trs notas.

A nota final obtida pela mdia aritmtica das notas dadas.

considerado aprovado o aluno que obtiver nota final superior ou igual a 60 e que tiver
comparecido a um mnimo de 40 aulas.
Fazer um programa que:

Leia um conjunto de dados contendo o nmero de matrcula, as trs notas e freqncia


(nmero de aulas freqentadas) de 100 alunos

Calcula:
a) a nota final de cada aluno
b) a maior e a menor nota da turma
c) a nota mdia da turma

- 34 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

d) o total de alunos reprovados


e) a porcentagem de alunos reprovados por freqncia insuficiente
Escreva:
a) para cada aluno, o nmero de matrcula, a freqncia, a nota final e o cdigo (A =
aprovado e R = reprovado).
b) o que foi calculado de (a) a (e).

10)Escreva um programa que encontre o maior e o segundo maior nmero de uma srie de nmeros
lidos do teclado.
11)Faa um programa para ler uma seqncia de nmeros inteiros positivos (um por vez), e verificar se
eles so pares ou mpares.
12)Dada a srie de Fibonacci
S = 2 3 5 8 13 21 34 55 .....
Escreva um programa que gere essa srie at o n-simo termo (n ser lido).
Dica:

leia os dois primeiros termos,

esta srie tal que cada nmero a partir do terceiro a soma dos dois anteriores.
13)Escreva um programa para ler 50 dados do tipo base e altura, que contm as medidas de diferentes
retngulos. Imprimir o permetro e a rea de cada retngulo.
14)Escreva um programa para calcular o calor de usando a frmula:
=
refazer essa parada!!!!!!
Escreva um programa para ler uma seqncia de 30 cdigos de vendedores de uma firma comercial,
juntamente com os respectivos totais de vendas dirias e verificar quantos deles esto na faixa
compreendida entre R$ 500,00 e R$ 1500,00. Imprimir uma lista listagem contendo todo os cdigos
dos vendedores situados no intervalo especificado, e a quantidade de vendedores neste intervalo.
16)Leia uma lista de dados contendo o nmero da conta e o saldo mdio dos correntistas de uma
caderneta de poupana. Imprimir uma listagem contendo o total de:
a)clientes bons: 500,00 <= SALDO MDIO => 1000,00
b)clientes razoveis: SALDO MDIO < 500,00
c)clientes prioritrios: SALDO MDIO > 1000,00
Imprima tambm a lista dos clientes prioritrios. O flag de sada para o comando de repetio ser
referente ao SALDO MDIO, sair quando este for igual a zero.
17)Um servio de correspondncia sentimental deseja obter informaes sobre seus clientes. Cada
cliente forneceu as seguintes informaes:
MATRICULA, SEXO (M ou F), IDADE, ALTURA (em m), PESO (em Kg), COR DOS OLHOS
(1-azul, 2-castanhos, 3-outros), COR DOS CABELOS (1-castanhos, 2-loiros, 3-outros).
Escrever um programa que leia estes dados e imprima as matrculas de:

- 35 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

a) todos os homens loiros de olhos azuis e altura maior que 1.75 m, pesando entre 75 Kg e 95
Kg.
b) Todas as mulheres de olhos castanhos, altura entre 1.65 m e 1.75 m, pesando menos de 60
Kg.
Utilizar um flag para indicar o final da entrada de dados.
18)Escreva um programa para ler uma seqncia de dados contendo a matrcula e a altura dos
funcionrios de uma empresa. Obter uma listagem para o Departamento de Educao Fsica e
Desportos contendo a matrcula e a medida de todos funcionrios altos (acima de 1.80 m). Imprimir a
altura mdia dos funcionrios e o total de:

Funcionrio baixos (altura inferior a 1.65 m);

Funcionrios de altura mediana (1.65 m <= ALTURA <= 1.80 m).


19)Escreva um programa para ser fornecido ao DETRAN, para provimento das informaes abaixo
descritas, referentes a acidentes em estradas:
a)Percentagem de motoristas no-habilitados;
b)Percentagem de homens no volante;
c)Percentagem de motoristas inexperientes (menos de 20 anos).
Os dados de entrada contm o ano de nascimento, o sexo e o cdigo de habilitao dos motoristas,
sendo:

CDIGO 1 motorista habilitado;

CDIGO 2 motorista no-habilitado.


20)Faa um programa que calcule e escreva o valor de S:
S = 1/1 + 3/2 + 5/3 + 7/4 + ... + 99/50
Acertar essa parada!!!!!!!
21)Faa um programa que calcule o valor da soma:
S = (2)^1/50 + (2)^2/49 + (2)^3/48 + ... + (2)^50/1
Acertar essa parada!!!!!!
22)Faa um programa que calcule a seguinte soma:
Escrever a soma!!!!
23)Faca um programa que calcule a seguinte soma:
Escrever a soma!!!!
24)Construa um programa que:

Leia diversos pares de nmeros naturais positivos;

Para cada ar de valores, calcule o valor do quociente e do resto da diviso inteira de


num_1 por num_2; (num_1 > num_2)

Apresentar o resultado para cada par de valores.


25)Escreva um programa que leia o nmero de inscries e a altura de moas para um concurso de
beleza. Calcule e escreva as duas maiores alturas e quantas moas as possuem.

- 36 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

26)Um banco deseja saber as seguintes informaes:


a)o cliente com maior volume de depsitos em cada agncia;
b)a agncia com maior saldo (depsito-saldo) em cada regio;
c)a agncia que possui o cliente com maior saldo no banco.
Fazer um programa que determine essas informaes para o banco, tendo como dado de entrada a
regio, agncia, conta, movimento (depsito) e valor.

- 37 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

CAPTULO IV
MODULARIZAO
Objetivos

Definir o que modularizao e quais as suas vantagens;

Apresentar a estrutura de um subprograma;

Apresentar o mtodo de modularizao atravs de funo e procedimentos, enfatizando


o conceito de passagem de parmetros;

Apresentar exemplos de modularizao;

Definir estratgias que contribuam para assegurar a qualidade da modularizao.


IV.1 A Necessidade de Modularizao na Programao
Estudos da psicologia mostram que o ser humano normal capaz de resolver problemas que envolvam
7 mais ou menos 2 variveis simultaneamente. Um problema complexo se envolve mais do que 9 ou
10 variveis. Como, ento, podemos resolver problemas deste tipo?
A soluo que encontramos para solucionar estes problemas dividir em problema complexo em vrios
subproblemas elementares, onde no estejamos sujeitos essa limitao humana. Esta estratgia se
soluo de problemas comumente conhecida com o a tcnica de Dividir para Conquistar, a qual o
fundamento bsico para a Modularizao.
Neste sentido, a modularizao de programas consiste da diviso do programa em mdulos ou
subprogramas, que nada mais so que um conjunto de comandos agrupados com a finalidade de
executar ma determinada funo.
Alm disso, a modularizao uma tcnica de programao que permite a aplicao direta dos
refinamentos sucessivos, isto , possibilita que haja um mapeamento entre os diversos nveis de
algoritmos criados quando utilizamos refinamentos e o prprio ato de programar.
Um outro problema que nos defrontamos quando estamos programando a repetio de cdigo. Voc
j deve ter notado que certos trechos dos seus programas se repetem em vrios momentos, tal qual
foram escritos num primeiro instante ou de uma maneira muito aproximada. Esta repetio de cdigo,
alm de ser algo desagradvel para o programador, torna o programa redundante e dificulta, em ltima
instncia, a sua legibilidade.
A modularizao uma soluo para este problema pois um mdulo pode ser ativado em pontos
diferentes de um mesmo programa.
Para falarmos um pouco mais sobre as vantagens da modularizao necessitamos definir alguns
conceitos sobre qualidade de programas. Um programa de boa qualidade quando apresenta as
seguintes caractersticas:

Confiabilidade: o programa est correto e confivel.

Legibilidade: o programa fcil de ser lido e entendido por um programador de nvel


mdio.

Manutenibilidade: o programa fcil de ser modificado. Quando o usurio requere


modificaes no programa, fruto de novas necessidades, a atualizao do programa de ser
natural.

Flexibilidade: o programa fcil de ser reutilizado; no possui muitas restries.


Neste contexto, podemos criar agora uma srie de vantagens da modularizao:

Facilita o projeto de sistemas incentiva a tcnica de refinamentos sucessivos.

Minimiza a manuteno de programas modificaes no programa precisam ser


realizadas apenas no mdulo correspondente, sem ter de alterar o resto do programa.

- 38 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

Melhora a legibilidade dos programas no h necessidade de se entrar em detalhes de


programao para se entender o que o programa faz.

Viabiliza a validao testes e correes de cada segmento podem ser realizados em


separado, s reunindo os mdulos quando todos estiverem devidamente validados.

Permitir a diviso de tarefas em uma equipe cada mdulo pode ser realizado por um
programador diferente.

Facilita a reutilizao de cdigo:


Em trechos onde ocorre repetio de cdigo no programa.
Em trechos onde ocorre repetio parcial de cdigo, onde s so modificados os
argumentos utilizados.

Estimula o encapsulamento de informaes: o programador que usar o mdulo s


precisa saber o que o mdulo faz e no como faz.
IV.2 Modularizao em C
Agora que j estamos familiarizados com o conceito de modularizao e conhecemos as suas
vantagens, podemos nos ater a tcnica de modularizao que implementada em C.
A ferramenta disponvel em C para modularizao so as funes.
Funes so segmentos de programa que executam uma determinada tarefa. Alguns exemplos de
funes j usadas aqui so: printf, scanf e sqrt.
As funes escritas pelo programados, e que so usadas para fazer a modularizao, so denominadas
funes de usurio ou rotina de usurio.
IV.2.1 A Estrutura das Funes de Usurio
A estrutura de uma funo de usurio muito parecida com a estrutura dos programas que
apresentamos at agora. Uma funo de usurio constitui-se de um nome pelo qual faremos referncia a
ela, de uma lista de argumentos passados a ela, e de um bloco de instrues que definem o que ser
feito por essa funo.
Nas funes podemos declarar variveis, denominadas locais, que tm vida e escopo somente durante a
execuo da funo. Estas variveis s podem ser usadas na funo onde foram declaradas.
Um exemplo de funo dado a seguir:
float media2 (float a, float b){
float media;
media = (a + b) / 2.0;
return(media);
}
Nesse exemplo o nome da funo media2 e ela recebe dois argumentos do tipo float. A mdia desses
valores recebidos calculada e retornada para o programa que fez a chamada a funo. Esse valor de
retorno do tipo float, conforme indicado antes do nome da funo.
Depois de definida a funo, podemos cham-la dentro de um programa. Um exemplo de chamada da
funo media2 dado abaixo:
main() {

- 39 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

float num1, num2, media;


printf(Digite dois numeros:\n);
scanf(%f %f, &num1, &num2);
media = media2(num1, num2);

//aqui feita a chamada da funo

printf(A media dos nmeros fornecidos eh: %f, media);


}
IV.2.2 Definio de Funo
A sintaxe de definio de uma funo a seguinte:
tipo_de_retorno nome(tipo1 arg1, tipo2 arg2, ...., tipoN argN)

<comandos>
}
A primeira linha dita declarao da funo, nela encontramos o tipo que a funo retorna, o nome
dela e a lista de argumentos. Aps a declarao, encontramos a lista de comandos entre as chaves.
O tipo de retorno serve para especificar qual o tipo de dados retornado pela funo, podendo ser do tipo
int, float, etc. Nos casos em que a funo no retorna nenhum tipo, devemos defini-la como void, ou
seja, sem retorno.
A lista de argumentos serve para dizer quais so os valores recebidos pela funo e seus respectivos
tipos.
IV.2.3 Onde colocar as Funes
As funes podem ser declaradas no mesmo arquivo da main ou num outro arquivo separado.
IV.2.3.1 Funes no mesmo arquivo
Quando uma funo declarada no mesmo arquivo existe a possibilidade dela ser declarada antes ou
depois da main.
IV.2.3.1.1 Funes no mesmo arquivo e antes da main
Quando as funes so declaradas antes da main no necessrio adicionar nenhuma outra instruo. A
sintaxe fica assim:
tipo nome_funcao(lista_de_argumentos){
comandos
//definio da funo
}
void main(){
.
.
.
- 40 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

variavel = nome_funcao(lista_de_argumentos);
.
.
.

//chamada da funo

}
IV.2.3.1.2 Funes no mesmo arquivo e depois da main
Quando a funo definida depois da main necessrio incluir um prottipo da funo chamada. Um
prottipo constitui-se do tipo de retorno da funo, do nome da funo e quantidade de argumentos
junto com seus tipo. A sintaxe dessa declarao a seguinte:
tipo nome_funcao(lista_de_argumentos);
void main(){
.
.
.
variavel = nome_funcao(lista_de_argumentos);
.
.
.
}

//chamada da funo

tipo nome_funcao(lista_de_argumentos){
comandos
//definio da funo
}
IV.2.3.2 Funes em arquivo separado
Nesse caso necessrio incluir o arquivo onde se encontra a funo ao arquivo onde ela est sendo
usada. Essa incluso feita atravs do comando #include que diz para o compilador na hora da
compilao que ele precisa fazer alguma(s) incluso(s).
Supondo que a funo esteja no arquivo funcoes.h, a sintaxe ficaria assim:
#include funcoes.h
main(){
.
.
.
variavel = nome_funcao(lista_de_argumentos);
.
.
.
}
IV.2.4 Hierarquia das funes

- 41 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

Quando uma funo chama a outra, dizemos que a funo que chama tem uma hierarquia superior a da
funo chamada.
As funes com hierarquia inferior devem ser declaradas antes das funes com hierarquia superior.
Isso deve ser feito para que ao se fazer a chamada de uma funo, ela j seja conhecida.
IV.2.5 Recurso
Funo recursiva uma funo que faz chamada a si mesma.
importante ressaltar que a cada nova chamada da funo recursiva um novo conjunto de variveis
criado.
Exemplo: um bom exemplo do uso de funo recursiva o clculo do fatorial de um numero.
int fatorial (int numero){
if (numero < 0){
return 0;
}
if (numero == 0){
return 1;
}
return (numero * (fatorial (numero-1)));
}
O primeiro if avalia se o nmero de entrada menor que zero, caso seja a funo retorna zero pois
no existe fatorial de nmero negativo. J quando o nmero igual a zero, o segundo if faz com que
a funo retorne um pois o fatorial de zero um. Para os nmeros maiores que zero, a funo retorna a
multiplicao do nmero pelo fatorial do seu antecessor. Repare que para esse ltimo caso, a recurso
ir terminar quando o antecessor do nmero for zero pois a chamada de fatorial(0) no chamar outra
vez a funo fatorial conforme visto anteriormente.

- 42 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

CAPTULO V
ESTRUTURAS
Objetivos

Apresentar o que uma estrutura e para que ela serve


Mostrar a declarao de uma estrutura e como acessar seus elementos
Mostrar a relao entre estruturas e funes

V.1 O que uma estrutura


Uma estrutura uma coleo de variveis, que podem ou no ser de tipos diferentes, colocadas sob um
nico nome para manipul-las. As estruturas ajudam na organizao do cdigo e facilitam a vida do
programador pois juntam variveis relacionadas e permitem que elas sejam tratadas como uma unidade
maior.
Um bom exemplo do uso de estruturas o armazenamento de datas. Uma data caracterizada por um
dia, um ms e um ano. Caso o programador no pudesse utilizar uma estrutura, ele teria que declara
trs variveis separadamente e trabalhar com elas em paralelo. Isso poderia gerar alguma confuso e,
em alguns casos, perda de algumas informaes. Mas isso pode ser evitado quando o programador cria
uma estrutura de nome data, por exemplo, e dentro dela declara trs variveis: dia, ms e ano. Com
isso, ele passaria a trabalhar com uma varivel do tipo data que por sua vez possuiria as trs variveis j
citadas anteriormente.
V.2 Declarao de uma estrutura
A sintaxe de declarao de uma estrutura a seguinte:
struct nome_da_estrutura {
declarao_das_variveis
};
O nome da estrutura deve ser algo que lebre o que ela representa para que outros programadores
possam entender o seu significado. No exemplo anterior, um bom nome para a estrutura seria data e
ela ficaria assim:
struct data {
int dia;
int mes;
int ano;
};
Para usarmos essa estrutura durante o programa precisamos declarar uma varivel de seu tipo. Feito
isso, poderemos manipul-la conforme veremos na prxima sesso. A declarao de uma varivel do
tipo de uma estrutura feita assim:
struct nome_da_estrutura nome_da_variavel;
No exemplo a seguir veremos a declarao de uma varivel do tipo estrutura data:
main(){

- 43 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

struct data aniversario;


.
.
.
}
V.3 Manipulao dos elementos da estrutura
A manipulao dos elementos de uma estrutura muito simples. Os elementos da estrutura podem ser
modificados durante a declarao da varivel. Como ilustrao disso, tomemos o exemplo o seguinte
exemplo:
struct ponto {
int x;
int y;
};
main() {
struct ponto maxPt = { 500, 1000 };

//aqui a varivel maxPt declarada e as


//suas variveis internas da estrutura passam a
//valer: x = 500 e y = 1000

}
Outra forma de modificar os elementos da estrutura mostrada no prximo exemplo.
Exemplo: tomemos a estrutura data declarada anteriormente.
main(){
struct data nascimento;
printf(\nDigite o dia do seu nascimento: );
scanf (%d, &nascimento.dia); //observe que nascimento.dia indica que voc est
//armazenando o dado de entrada na varivel dia que est
//dentro da varivel aniversario, que por sua vez do tipo
// struct data.
printf(\nDigite o mes do seu nascimento: );
scanf (%d, &nascimento.mes);
printf(\nDigite o ano do seu nascimento: );
scanf (%d, &nascimento.ano);
printf(\nVoce nasceu no dia %d do mes %d do ano %d\n, nascimento.dia, nascimento.mes,
nascimento.ano);
}
V.4 O comando typedef
- 44 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

Esse comando bastante til para atribuirmos novos nomes a tipos de dados. Ele permite, por exemplo,
que voc atribua ao tipo int o nome tipoDeEntrada para designar que o tipo de entrada de uma
determinada funo ser o int.
A sintaxe desse comando muito simples e pode ser vista a seguir:
typedef tipo novo_nome;
No exemplo citado acima, a renomeao do tipo int ficaria assim:
typedef int tipoDeEntrada;
Assim, quando fizermos as declaraes
int entrada;
e
tipoDeEntrada entrada;
estamos declarando a mesma coisa.
Esse comando nos permite tambm renomear estruturas criadas por ns, para que a declarao de uma
varivel do tipo dessa estrutura seja menos trabalhosa.
Tomando como exemplo a estrutura declarada anteriormente para representar um ponto, poderamos
usar o typedef do seguinte modo:
typedef struct ponto {
int x;
int y;
} ponto;
Dessa forma uma varivel que antes era declara fazendo
struct ponto centro;
pode ser declarada usando
ponto centro;
Outra forma de se usar o typedef com estruturas fazer:
typedef struct ponto ponto;
struct ponto {
int x;
int y;
};
A declarao de uma varivel ficaria do mesmo jeito do caso anterior.
V.5 Estruturas e Funes
As estruturas so muito teis quando estamos trabalhando com funes pois elas podem agrupar dados
que sero passados como parmetro para as funes e permitem que uma funo retorne mais de um
valor.
V.5.1 Estruturas como parmetros
A passagem de estrutura como parmetro para funo muito utilizada pois permite que os dados com
caractersticas comuns cheguem agrupados e tambm por diminuir o nmero de parmetros da funo
facilitando o seu entendimento.
A declarao de uma funo que recebe uma estrutura como parmetro feita da mesma forma que a
de uma funo que recebe apenas tipos bsicos de dados como parmetro.

- 45 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

A seguir mostraremos um exemplo de uma funo que recebe uma varivel do tipo ponto declarado
anteriormente e retorna o quadrante ao qual ele pertence .
int qualQuadrante (ponto p){
/*A funo retorna 0 quando p for parte do limite de quadrantes, 1 quando p pertencer ao
1 quandrate, 2 quando pertencer ao 2 quadrante, 3 se pertencer ao 3 quadrante e 4
caso seja do 4 quadrante.*/
if (p.x == 0 || p.y == 0){
return 0;
}
if (p.x > 0){
if(p.y > 0){
return 1;
}
else {
return 4;
}
}
else {
if(p.y > 0){
return 2;
}
else {
return 3;
}
}
}
V.5.2 Estruturas como tipo de retorno
Estruturas so usadas com freqncia quando queremos que uma funo retorne mais do que valor.
Nesse caso precisamos declarar que o tipo de retorno da funo uma determinada estrutura.
Tome como exemplo uma funo que recebe trs nmeros inteiros distintos e retorna o maior e o
menor deles.
Para esse exemplo usaremos uma nova estrutura:
typedef struct maiorEmenor {
int maior;
int menor;
} mEm;
Agora vejamos como fica o prottipo dessa funo:
mEm maior_menor (int , int , int );
ou
struct maiorEmenor maior_menor(int , int , int );
Agora podemos definir a funo, ela fica assim:
- 46 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

mEm maior_menor (int a, int b, int c){


mEm s;
if (a>b){
if (a>c){
if (c>b){
s.maior = a;
s.menor = b;
}
else {
s.maior = a;
s.menor = c;
}
}
else {
s.maior = c;
s.menor = b;
}
}
else {
if (a<c){
if (c>b){
s.maior = c;
s.menor = a;
}
else {
s.maior = b;
s.menor = a;
}
}
else {
s.maior = b;
s.menor = c;
}
}
return s;
}
V.6 Tipos Abstratos de Dados
Tipos abstratos de dados so tipos de dados criados pelo programador de acordo com as suas
necessidades para resolver um determinado problema. A definio de um tipo abstrato de dados
constituda de:
Definir os elementos bsicos
Implementar construtores para gerar novos elementos a partir dos elementos bsicos
Implementar operaes sobre esses elementos

- 47 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

Podemos definir um tipo abstrato de dados para representar os pontos do plano XY. Para isso considere
a estrutura denominada ponto.
typedef ponto {
int x;
int y;
} ponto;
Agora j sabemos como so os elementos bsicos desse tipo. O prximo passo implementar uma
funo que opere elementos desse tipo. Um exemplo de uma operao entre elementos desse tipo o
clculo da distncia entre dois pontos.
float distanciaPontos (ponto a, ponto b){
float distancia, deltaX, deltaY;
deltaX = a.x b.x;
deltaY = a.y b.y;
distancia = sqrt(deltaX*deltaX+deltaY*deltaY);
return distancia;
}

- 48 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

CAPTULO VI
VETORES
Objetivos

Introduzir a estrutura de dados vetor, explicar seu conceito e mostrar sua utilidade;
Apresentar as operaes bsicas sobre vetores.

VI.1 Conceito de vetores e sua utilidade


Um vetor uma estrutura de dados composta homognea, isto , ela possui, em geral, mais de um
elemento (por isso, composta) sendo que estes elementos so sempre se um mesmo tipo (por isso,
homognea). Tal qual na matemtica, os vetores possuem uma dimenso (que corresponde ao nmero
de elementos do vetor) e seus elementos so acessados atravs de ndices. A figura abaixo representa
um vetor com sete elementos inteiros.
ndice: 0
9

1
5

2
15

3
6

4
3

5
2

6
12

Mas, voc j deve estar questionando, para que servem os vetores?


Nem sempre os tipos bsicos de dados (int, float, char) so suficientes para exprimir estruturas de
dados em algoritmos. Considere o problema em que um professor de uma turma de 50 alunos deseja
saber quais desses so bons alunos (tiverem nota acima da mdia da turma). Com os instrumentos que
dispomos at agora necessitaramos ler as notas dos 50 por duas vezes: uma para calcular a mdia e
outra para verificar quais alunos tiveram notas superior mdia. Esta dupla leitura no muito
conveniente, concorda?! A soluo para este problema se d atravs da utilizao de vetores.
A utilizao de um vetor se faz necessria sempre que for preciso armazenar uma quantidade finita de
dados de um tipo em comum, para posterior processamento.
VI.2 Declarao de Vetor
Um vetor definido da seguinte maneira:
tipo_componentes nome_vetor[tamanho];
tipo_componentes indica de que tipo so os elementos do vetor, o tamanho indica quantos elementos o
vetor poder armazenar. O vetor apresentado na sesso anterior possui a seguinte definio:
int vetor_inteiros[7];
O nmero de componentes de um vetor fixo e determinado na sua declarao.
O tamanho de um vetor determinado em sua declarao, antes da execuo do programa (tamanho
fsico), isto significa que o tamanho de um vetor no poder ser lido ou alterado durante a execuo do
programa. Verifica-se ento que para armazenar dados em vetores necessrio conhecer
antecipadamente a quantidade mxima de elementos a serem processados. Quando este nmero no for
conhecido, deve-se maximizar o tamanho do vetor baseado em critrios intuitivos (bom senso )
relacionado ao problema em questo.

- 49 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

Por exemplo, para calcular quais as notas dos alunos de uma turma so maiores que a mdia, seria
preciso ter-se uma idia de quantos alunos no mximo uma turma poderia possuir.
VI.3 Acesso aos elementos do vetor
Os elementos do vetor so acessados atravs da citao do nome da varivel (que indica qual vetor
estamos acessando) e de um ndice (que determina qual elemento queremos acessar). Este ndice no
pode ser um valor maior que o tamanho do vetor menos um nem tampouco um valor menor que zero.
A sintaxe de acesso a um vetor dada por:
nome_vetor[ndice]
Exemplo:
vetor[3] = 987;
vetor[indice+1] = vetor[3*2];
VI.4 Operaes bsicas sobre vetores
Em C no existem operaes pr-definidas para a manipulao de vetores como um todo. Por exemplo,
no permitido ler o contedo de um vetor inteiro com o comando scanf. As operaes s podem ser
feitas para cada elemento do vetor.
Portanto, as operaes bsicas de vetor devem ser simuladas atravs de subprogramas. A seguir sero
apresentadas uma srie de operaes bsicas para vetores.
Como sabemos, no parmetro associado por valor uma cpia do argumento e a duplicao de
estruturas do tipo vetor pode ocasionar problemas de memria e ineficincia do programa. A maneira
de resolver estes dois problemas forar a passagem do vetor por referncia, porm conceitualmente o
uso desse artifcio incorreto, devendo ser implementado somente aps ter sido testado e nunca
desacompanhado de um comentrio.
Voc ver nos procedimentos apresentados a seguir que um vetor apesar de no ser modificado no seu
interior ( um argumento de entrada) este passado por referncia, como por exemplo o procedimento
para escrita de um vetor.
VI.4.1 Leitura e Escrita
Um exemplo de uma funo que faz a leitura dos elementos de um vetor de inteiros.
void leitura_vetor (int vetor[], int tamanho){
int i;
for (i = 0; i < tamanho; i++){
scanf(%d, &vetor[i]);
}
}
Agora mostraremos uma funo que imprime os elementos de um vetor de inteiros.
void imprime_vetor (int vetor[], int tamanho){
int i;
- 50 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

for (i = 0; i < tamanho; i++){


printf(%d ,. Vetor[i]);
}
}
VI.4.2 Adio de dois Vetores Numricos
void soma_vetor (float vetor1[], float vetor2[], float vetr_soma[], int tamanho){
int i;
for (i = 0; i < tamanho; i++){
vetor_soma[i] = vetor1[i] + vetor2[i];
}
}
VI.4.3 Produto Escalar de dois Vetores Numricos
int produto_escalar (int vetor1[], int vetor2[], int tamanho){
int prod_escal, i;
for (i = 0; i < tamanho; i++){
prod_escal = prod_escal + vetor1[i] * vetor2[i];
}
return prod_escal;
}
VI.4.4 Pesquisa Seqencial
int pesquisa_binaria (int vetor[], int tamanho, int elemento ){
/*Funcao: percorre seqencialmente o vetor, procurando por um elemento. Esta funcao retorna o valor
-1 caso o elemento nao seja encontrado. Caso contrario, retorna o ndice da posicao do vetor onde o
elemento foi encontrado.*/
int i, encontrou, pesq_seq;
encontrou = 0;
pesq_seq = -1;
for (i = 0; i < tamanho && !encontrou; i++){
if (vetor[i] == elemento){
pesq_seq = i;
encontrou = 1;
}
}
return pesq_seq;
- 51 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

}
VI.4.5 Pesquisa Binria
int pesquisa_binaria (int vetor[], int tamanho, int elemento){
/*Funcao: Percorrer o vetor ordenado (ordenado crescente), particionando-o ao meio e procurando
determinado elemento. Esta funcao retorna o valor -1 caso o elemento nao seja encontrado. Caso
contrario, retorna o ndice do vetor onde o elemento foi encontrado.*/
int inicio, fim, meio;
inicio = 0;
fim = tamanho 1;
while (inicio <= fim){
meio = (inicio + fim) / 2;
if (elemento < vetor[meio]){
fim = meio 1;
}
else {
if (elemento > vetor[meio]){
inicio = meio + 1;
}
else {
return meio;
//encontrou!!!
}
}
}
return -1;
}
VI.4.6 Insero em Posio Pr-determinada do Vetor
void insere (int vetor[], int elemento, int posio, int tamanho){
/*Funcao: inserir um novo elemento numa posicao pre-estabelecida.*/
int i;
if ((posicao < 0) || (posicao > tamanho-1)){
printf(\nEntrada de Dados Incorreta\n);
}
else {
for (i = tamanho 2; i > posicao 1; i--){
vetor[i + 1] = vetor[i];
}
vetor[posicao] = elemento;
}
- 52 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

}
VI.4.7 Excluso de Elementos de Vetor
void excluir (int vetor[], int elemento, int tamanho){
/*Funcao: Percorrer o vetor sequencialmente procurando o elemento. Caso encontre-o retira-lo. Caso
contrario, manter o vetor inalterado.*/
int i, posicao, encontrou;
encontrou = 0;
posicao = 0;
while ((posicao < tamanho) && (!encontrou)){
if (vetor[posicao] == elemento){
encontrou = 1;
for (i = posicao; i < tamanho 1; i++ ){
vetor[i] = vetor[i + 1];
}
}
posicao += 1;
}
}
VI.4.8 Ordenao pelo Mtodo do Menor
void ordenacao_menor (int vetor[], int tamanho){
int posicao, i, indice_menor, menor;
for (posicao = 0; posicao < tamanho 1; posicao++){
menor = vetor[posicao];
for (i = posicao + 1; i < tamanho; i++){
if (vetor[i] < menor){
menor = vetor[i];
indice_menor = i;
}
}
vetor[indice_menor] = vetor[posicao];
vetor[posicao] = menor;
}
}
VI.4.9 Ordenao pelo Mtodo da Bolha
void ordenacao_bolha (int vetor[], int tamanho) {

- 53 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

int a, b, t;
for (a = 1; a < tamanho; a++){
for (b = tamanho 1; b >= a; --b){
if (vetor[b - 1] > vetor[b]){
t = vetor[b 1];
vetor[b 1] = vetor[b];
vetor[b] = t;
}
}
}
}
VI.5 Exemplo de programa que utiliza vetores
A)Este programa l dois vetores de mesma dimenso, calcula a sua soma e seu produto escalar,
apresenta em seguida os resultados.
#define tamanho 100
void leitura_vetor_inteiros (int vetor[], int tamanho_vetor){
int i;
for (i = 0; i < tamanho_vetor; i++){
scanf (%d, vetor[i]);
}
}
void escrita_vetor_inteiros (int vetor[], int tamanho_vetor){
int i;
printf(\n);
for (i = 0; i < tamanho_vetor; i++){
printf(%d , vetor[i]);
}
printf(\n);
}

- 54 -

Departamento de Informtica

Apostila de PD-I, ICC e IC

void soma_vetores_inteiros (int vetor1[], int vetor2[], int vetor_soma[], int tamanho_vetores){
int i;
for (i = 0; i < tamanho_vetores; i++){
vetor_soma[i] = vetor1[i] + vetor2[i];
}
}
int produto_escalar (int vetor1[], int vetor1[], int tamanho_vetores){
int i, prod_esc;
prod_esc = 0;
for (i = 0; i < tamanho_vetores; i++){
prod_esc = prod_esc + vetor1[i] * vetor2[i];
}
return prod_esc;
}
main(){
int vetor1[tamanho], vetor2[tamanho], vetor_soma[tamanho], prod_esc;
leitura_vetor_inteiros(vetor1, tamanho);
leitura_vetor_inteiros(vetor2, tamanho);
soma_vetores_inteiros (vetor1, vetor2, vetor_soma, tamanho);
escrita_vetor_inteiros (vetor_soma, tamanho);
prod_esc = produto_escalar (vetor1, vetor1, tamanho);
printf(\n%d\n, prod_esc);
}

- 55 -

Anda mungkin juga menyukai