Anda di halaman 1dari 67

Disciplina: Iniciao Computao

Prof. Augusto Antonio Pinheiro Neto


Curso de Licenciatura em Matemtica UFPBVIRTUAL
pinheironeto@di.ufpb.br
Ambiente Virtual de Aprendizagem: Moodle www.ead.ufpb.br
Site da UFPBVIRTUAL www.virtual.ufpb.br
Telefone UFPBVIRTUAL (83) 3216 7257

Carga Horria: 60 horas

Crditos: 04

Ementa

Componentes bsicos de um computador


Linguagem de programao

Descrio
Nesta disciplina apresentaremos a configurao bsica de um computador, de modo que o aluno
tenha uma compreenso geral de sua arquitetura. Estudaremos em seguida uma linguagem de programao
imperativa, permitindo capacitar o aluno na programao de resolues de problemas numricos.

Objetivos
Ao final da disciplina o aluno dever ser capaz de:







compreender a arquitetura bsica de um computador,


programar as operaes de entrada\sada,
programar operaes bsicas como: atribuio de valores a variveis ou constantes,
permutao de valores entre duas variveis, uso de acumuladores de soma e de produtos,
programar os diversos tipos de deciso e de repetio (laos),
compreender os principais tipos de dados inerentes linguagem estudada,
trabalhar com funes (elemento de programao)
elaborar algoritmos de resoluo de diversos tipos de problemas numricos,
programar esses algoritmos

197

Unidades Temticas Integradas


Unidade I

Componentes bsicos de um computador

Unidades funcionais bsicas

Unidades de Entrada e/ou Sada


Dispositivos de Entrada de Dados
Dispositivos de Sada de Dados
Dispositivos de Entrada e Sada de Dados
Memria principal
Tipos de memria
Unidade Central de Processamento
o

Unidade de Controle

Unidade de Aritmtica e Lgica

Registradores

Clock

Sistemas Operacionais
Os arquivos em informtica

Unidade II

Algoritmos

Algoritmos

Abordagem dividir para conquistar

Algoritmo TrocarPneuFurado
o Refinamento do passo 1
o Refinamento do passo 1.5

Algoritmo TrocarLmpadaQueimada
Exerccios
Solucionando um problema

Fases de resoluo

Fase de implementao

Atitude tudo

Unidade III

Introduo programao

Conceitos bsicos

Memria e variveis

Dando nome s variveis

Tipos de variveis

Declarando uma varivel

Atribuindo valor a uma varivel

198

Constantes

Exibindo o contedo de uma varivel

Recebendo uma entrada

Teste

Unidade IV

Operaes aritmticas bsicas

Primeiros passos

A diviso

O mdulo

Clculo entre variveis

Abreviaes: incremento e decremento

Outras abreviaes

A biblioteca matemtica

Teste

Unidade V

Praticando entrada e sada

Algumas consideraes sobre a funo scanf

Algumas consideraes sobre a funo printf

Unidade VI

Estruturas de controle: condicionais

A estrutura if ... else

o O teste if
o O teste else
o O teste else if
Alguns erros comuns
Para melhor compreender as condies
A estrutura switch
Condies condensadas
Teste

Unidade VII Estruturas de controle: repeties

O lao while
o

O lao do .. while

O lao for

Teste

199

Unidade VIII Funes

Qual o objetivo de uma funo?

A estrutura de uma funo

Criando uma funo

Chamando uma funo

Mais exemplos

Converso Celsius/Fahrenheit

Transformar segundos em horas, minutos e segundos

rea de um retngulo

Um menu

Teste

Unidade IX

Ponteiros

Um pouco mais sobre as funes


o
o

A memria e os endereos
Endereo e valor
Utilizao de ponteiros

Criar um ponteiro

Enviar um ponteiro a uma funo

Outro modo de enviar um ponteiro a uma funo

Um problema estranho?

Resumo

Teste

Unidade X

Arrays

Os arrays e a memria

Declarando um array

Como acessar um elemento

Atribuindo valores a um array

Arrays e ponteiros

Listando um array

Inicializando um array

Passagem de arrays como parmetros

Arrays de duas ou mais dimenses

Teste

200

Unidade I Componentes bsicos de um computador


1. Situando a temtica
Os computadores esto cada vez mais presentes no dia-a-dia dos cidados. Mesmo aqueles que no os
utilizam diretamente tm essas mquinas ligadas s suas vidas. Basta nascer para que as informaes
referentes ao novo cidado passem a fazer parte de algum banco de dados, por exemplo, o do hospital onde a
criana nasceu. Ao registr-la, o pai (a me) estar contribuindo para alimentar outro banco de dados, o do
cartrio de registros civis. Ao iniciar seus estudos oficiais, novas informaes sero transferidas para os
computadores, desta vez os da escola. E assim ser por toda a vida, imagino. A informao deve ser
armazenada e disseminada no momento necessrio. Seria bom ento entender um pouco sobre essas
mquinas que nos acompanham por toda a vida.

2. Problematizando a temtica
Os computadores so sistemas eletrnicos de processamento de dados, compostos de uma parte fsica,
denominada hardware e de uma parte lgica, denominada software. O hardware formado por um conjunto
de funes lgicas, geralmente associadas a um ou mais equipamentos fsicos, capazes de executar
determinadas tarefas. Iniciamos os nossos estudos sobre programao apresentando uma noo sobre a
configurao bsica de um computador.

3. Conhecendo a temtica
3.1 Unidades funcionais bsicas
As funes lgicas associadas ao hardware de um computador so geralmente agrupadas em blocos
chamados de unidades funcionais. Um computador possui as seguintes unidades funcionais bsicas,
compostas de circuitos eletrnicos especficos:

UC
Entrada
Teclado
Mouse
Leitor de disquete
Scanner
Tela sensvel
Leitor de CD, DVD

UAL
CPU

Sada

Registradores
Monitor (Vdeo)
Impressora
Gravador de disquete
Gravador de CD, DVD

Memria Principal
3.2 Unidades de Entrada e/ou Sada
As unidades de Entrada so blocos funcionais compostos por circuitos eletrnicos com a finalidade
especfica de transmitir dados do meio exterior para a memria do computador. As unidades de Sada
realizam a operao inversa, transmitem dados da memria do computador para o meio exterior. A
transmisso fsica desses dados se d por meio de dispositivos especiais. Na figura acima so listados alguns
dispositivos que tm a finalidade de realizar essas tarefas. Os dispositivos que realizam tarefas relacionadas
funo de entrada so conhecidos como dispositivos de entrada de dados. De modo anlogo, os dispositivos
que realizam tarefas relacionadas funo de sada so conhecidos como dispositivos de sada de dados.
Alguns dispositivos so capazes de executar entrada e sada de dados.
3.3 Dispositivos de Entrada de Dados
Exemplos de alguns dispositivos de entrada de dados: teclado, mouse, scanner. Existem outros, como
microfone (dispositivo de entrada de som), monitores de vdeo sensveis ao toque, light-pen, joystick, etc.

201

Teclado
Mouse

Scanner

3.4 Dispositivos de Sada de Dados


Os dispositivos mais comuns de sada de dados so as impressoras e os monitores de vdeo. Entretanto,
existem outros dispositivos nesta classe como plotters (traadores de grfico), projetores, caixas de som, etc.

projetor

Impressora
Monitor
3.5 Dispositivos de Entrada e Sada de Dados

Alguns dispositivos possuem as funes de entrada e sada. Eles so bem conhecidos e podemos citar, por
exemplo, leitor/gravador de discos (disquetes, CDs, DVDs, etc),

Leitor/Grava
dor de CDs

Leitor/Grava
dor de

Leitor/Grava
dor de HDs

3.6 Memria Principal


Por memria, compreende-se todo dispositivo capaz de guardar qualquer dado ou informao. A memria
principal de um computador o local onde esto armazenados os programas e dados que so utilizados
durante um processamento. Todo dado ou programa a ser processado deve estar na memria principal do
computador. Caso esses dados estejam armazenados em disquetes, Cds ou HDs, ser necessrio, primeiro,
transferi-los para a memria principal. A memria principal do computador possui a caracterstica de ser
voltil, isto , caso o computador seja indevidamente desligado (falta de energia eltrica, por exemplo), todo
o seu contedo ser perdido, ou seja, tornar-se- inacessvel.
A memria principal de um computador existe na forma de pentes de memria como mostrado nas figuras
a seguir.
Atualmente, os pentes de memria, mais encontrados, instalados nos microcomputadores so os de 256
MBytes, 512 MBytes, ou 1GBytes.
Memria
Memria 256 MB

3.7 Tipos de memria


As memrias esto representadas em duas grandes categorias de chips:
RAM (random access memory): so chips de memria que podem ser lidos e/ou gravados pela CPU.
A memria principal deste tipo.

202

ROM (read only memory) : so chips de memria que podem apenas ser lidos pela CPU. Uma
memria ROM permanente e sua gravao feita pelo fabricante do computador, ou pelo fabricante
de memrias. Um conjunto especfico de programas, necessrios inicializao de um computador,
denominado BIOS, localizado na placa me do computador, est encapsulado em uma memria deste
tipo.
3.8 Unidade Central de Processamento
A unidade central o elemento funcional central de todo computador. o corao, ou melhor, o crebro
do computador. Nesta unidade so realizadas todas as operaes. Todas as informaes tratadas pelo
computador transitam por esta unidade funcional. A unidade central tambm conhecida por CPU (Central
Processing Unit), Unidade Central de Processamento e dividida classicamente em trs partes:
I - Unidade de Controle, responsvel pela extrao das instrues da memria do computador e por sua
anlise. Essa unidade controla dois registros especiais denominados CONTADOR DE INSTRUO (PC)
que contm o endereo de memria da prxima instruo a ser executada e REGISTRO DE INSTRUES
que contm a instruo extrada da memria. a unidade de controle que gerencia todos os eventos
necessrios operao do computador.
II - Unidade de Aritmtica e Lgica (UAL) controla um conjunto de registros que devem conter os cdigos
dos operandos e do operador, necessrios realizao de uma operao aritmtica ou lgica. Exemplos de
operaes aritmticas: adio, subtrao, multiplicao ou diviso de nmeros. Exemplos de operaes
lgicas: comparao de dois valores alfabticos, operaes envolvendo operadores os booleanos, AND, OR e
NOT.
Nos dias atuais, uma CPU est completamente embutida em uma pastilha, denominada chip, de dimenses
reduzidas. As primeiras CPUs integradas em um nico chip foram a CPU 4004 e a CPU 8008. Hoje esses
chips so mais conhecidos no mercado pelo nome de processador ou microprocessador.
Em 1974 a Intel fabricou o 8080, o primeiro microprocessador a ser usado em larga escala nos chamados
"computadores pessoais". Antes dele, os microcomputadores eram usados apenas em laboratrios cientficos,
em fbricas e em universidades.
III - Registradores, memrias especiais, de alta velocidade, localizadas no interior de um microprocessador,
enquanto a memria principal externa a este. Cada registrador possui uma funo especfica. Dentre os
registradores destacam-se os seguintes:
Contador de programa (PC - Program Counter), que aponta para a prxima instruo a executar.
Registro de instruo (IR - Instruction Register) que armazena a instruo em execuo.
Outros registros que permitem o armazenamento de resultados intermedirios.
Clock
Clock um circuito oscilador que tem a funo de sincronizar a velocidade de transferncia de dados entre
duas partes durante um processamento. Por exemplo, a transferncia de dados entre o processador e a
memria principal. Essa velocidade de transferncia (freqncia) medida em ciclos por segundo, ou Hertz.
A velocidade de acesso dentro do processador maior que na memria principal. Os processadores Pentium100, Pentium II-300, acessam a memria principal a 66 MHz.
3.9 Sistemas Operacionais
Sistemas operacionais so conjuntos de programas que permitem explorar (fazer funcionar) o computador.
Atualmente os sistemas operacionais mais conhecidos so Windows e Linux.
Um computador um conjunto de materiais inertes. So as diversas camadas de software que fazem
com que ele funcione. Quando ligado rede eltrica, uma primeira camada de software, sempre a mesma,
posta em ao. Esta camada foi gravada diretamente no hardware: a BIOS (Basic Input/Output System).
Esta camada realiza certo nmero de verificaes e de testes (presena de diversos perifricos, volume de
memria, etc). Aps isso o sistema operacional assume o controle.
o sistema operacional que permite aos humanos dialogar com os computadores. Segundo o grau de
convivialidade do sistema, esse dilogo ser mais ou menos amigvel, podendo ser textual, grfico ou uma

203

mistura desses. A partir do sistema operacional o usurio pode ento lanar os aplicativos (programas
especficos).
3.10 Os arquivos em informtica
Todo arquivo visto e tratado do mesmo modo pelo sistema operacional em vista de seu armazenamento em
disco. Tecnicamente, um arquivo um conjunto de bits formando uma entidade identificada por um nome e
uma extenso seguindo a forma: nome.ext.
Somente a sua extenso capaz de determinar a natureza e assinalar ao sistema operacional o que esse
arquivo capaz de fazer. Assim, um arquivo .doc reconhecido como um programa Word, um arquivo .xls
reconhecido como um arquivo do Excel e esses softwares so carregados na memria para execuo. Alguns
arquivos de imagens (.jpeg ou .jpg, .gif, .png, etc.) necessitam de um visualizador de imagens instalado no
computador para que essas imagens possam ser exibidas na tela. Por padro, est previsto que esses arquivos
podem ser abertos no Internet Explorer, capaz de exibi-los a partir de pginas da Internet.
Dependendo do sistema operacional, existem regras com mais ou menos restries para dar nomes aos
arquivos. No MS-DOS, antigo sistema operacional, os nomes de arquivo deveriam ter no mximo 8
caracteres com uma extenso de trs caracteres. A partir do Windows 95 os nomes dos arquivos passaram a
ter at 256 caracteres (incluindo o caminho onde se encontra o arquivo, por exemplo,
C:\programas\C\programa1.exe).

204

Unidade II - Algoritmos
1. Situando a temtica
Programar uma cincia ou uma arte? A computao uma cincia, porem programar est mais para arte. A
programao requer certo dom. Mas isto podemos desenvolver com esforo e pacincia. Assim como
aprendemos a pintar, tambm podemos aprender a programar. Alguns requisitos so necessrios, verdade.
Para desenvolvermos programas que realizem algumas proezas matemticas, necessrio que tenhamos
algum conhecimento para matemtico, seno, como program-las? Qualquer que seja a natureza de nossos
programas, existem algumas regras bsicas a serem seguidas. Primeiramente, preciso entender o enunciado
do problema a ser resolvido e ento partirmos para encontrar uma soluo. O estudo do domnio de um
problema conhecido no mundo da computao como anlise. A apresentao de uma soluo para esse
problema faz parte do que se chama projeto. Como os domnios (lgebra, geometria, trigonometria, etc) so
vastos e variados, procuramos seguir uma metodologia de resoluo de problemas. o que faremos a seguir
no estudo dos algoritmos.

2. Problematizando a temtica
Suponhamos o seguinte problema: trocar o pneu furado de um carro (voc j passou por este tipo de
problema?). Parece que estamos diante de um problema simples, mas tentemos explicar a um rob como
proceder para realizar tal tarefa. Veremos um enfoque denominado dividir para conquistar, que nos ajudar
bastante nessa e outras tarefas.

3. Conhecendo a temtica
3.1 Algoritmos
Definio: conjunto finito, ordenado e no ambguo de passos necessrios para realizar uma tarefa. Esse
conjunto apresenta as seguintes caractersticas:
possui um ponto de parada, isto , sua execuo finita;
recebe dados de entrada e, em funo desses, produz dados de sada.
Algoritmo Receita de bolo
Um algoritmo pode ser correto ou no. Um algoritmo correto produz uma sada correta e pra, enquanto que
um algoritmo incorreto produz uma sada incorreta ou no pra.
3.2 Abordagem dividir para conquistar
Essa abordagem, muito utilizada em informtica, consiste em dividir o problema inicial em vrios
subproblemas, recursivamente. Cada subproblema , logicamente, mais simples que o problema inicial. Esse
procedimento de diviso continua at que sejam encontrados subproblemas, que possam ser resolvidos de
forma simples ou trivial.
3.3 Algoritmo Trocar Pneu Furado
1.
2.
3.
4.
5.

pegue o macaco e levante o carro


retire o pneu furado
pegue o estepe, coloque-o na roda e aperte os parafusos
abaixe o carro e reaperte os parafusos
guarde o pneu furado e o macaco

Refinamento do passo 1
1.1 remova o macaco do porta-malas
1.2 coloque o macaco sob o carro, prximo ao pneu furado
1.3 desaperte os parafusos da roda
1.4 insira a manivela no macaco (ou monte-o de acordo com o modelo do macaco)
1.5 coloque um calo sob o carro para impedi-lo de se mover
1.6 levante o carro com o macaco at que haja espao suficiente para colocar o estepe

205

Refinamento do passo 1.5


1.5.1 se o carro estiver em uma ladeira, de frente para o topo desta, ento coloque o
calo atrs de um pneu em bom estado caso contrrio, coloque o calo na
frente de um pneu em bom estado
O passo 1.6 revela a existncia de um procedimento repetitivo: enquanto no houver espao suficiente para
colocar o estepe, faa o seguinte: levante o carro com o macaco.
Outro procedimento que pode ser associado ao passo 1.6 : repita o levantamento do carro com o macaco
at que haja espao suficiente para colocar o estepe.
3.4 Algoritmo Trocar Lmpada Queimada
1. Remova a lmpada queimada
2. Coloque a nova lmpada

Refinamento
1.
2.
3.
4.
5.
6.
7.

Posicione uma escada em baixo da lmpada queimada


Escolha uma nova lmpada com a mesma voltagem da queimada
Suba na escada at que a lmpada possa ser alcanada
Gire a lmpada queimada no sentido anti-horrio at que ela se solte
Posicione a nova lmpada no soquete
Gire-a no sentido horrio at que ela se firme
Desa da escada

1. Posicione uma escada em baixo da lmpada queimada


2. Selecione uma nova lmpada para a substituio
2.1. Se a voltagem no for a mesma da lmpada queimada, repita os passos
abaixo at encontrar uma que sirva
2.1.1. Descarte a lmpada selecionada
2.1.2. Selecione uma nova
3. Repita at que a lmpada possa ser alcanada
3.1.1. Suba um degrau da escada
4. Repita at que a lmpada fique livre do soquete
4.1.1. Gire a lmpada no sentido anti-horrio
5. Posicione a nova lmpada no soquete
6. Repita at que a lmpada esteja firme
6.1.1. Gire a lmpada no sentido horrio
7. Desa da escada
Esses passos e refinamentos seriam importantes para a realizao dessas tarefas por uma mquina.
Um ser humano faz essas coisas intuitivamente, mas as mquinas...
3.5 Exerccios
1 Elabore um algoritmo para fazer pipoca em uma panela de fogo, usando manteiga, sal e milho.
2 Elabore um algoritmo para realizar uma chamada telefnica local.
3 Elabore um algoritmo para realizar uma chamada telefnica de longa distncia (interurbana).
4 Elabore um algoritmo que simule sua sada de casa pela manh. Comece com o passo dormindo na
cama e inclua todas as suas atividades matinais.
5 Elabore um algoritmo para calcular as razes reais de uma equao do 2 grau. Se a equao no tiver
razes reais, isto deve ser mencionado como resposta.

206

3.6 Solucionando um problema

Fase de resoluo do problema

Problema
Passo nico

Algoritmo
Fase de implementao da soluo

Programa de
computador

Fase de resoluo elaborao de um algoritmo para resolver o problema proposto, incluindo testes para
verificar se a soluo boa.
Fase de implementao ao encontrarmos o algoritmo adequado soluo do problema, precisamos
codific-lo em uma linguagem de programao. Geralmente, essa codificao fcil de ser feita desde que o
programador compreenda bem a sintaxe e a semntica dos comandos da linguagem escolhida para a
implementao.
3.7 Atitude tudo
Luis o tipo de cara que voc gostaria de conhecer. Ele estava sempre de bom humor e sempre tinha algo de
positivo para dizer. Se algum lhe perguntasse como ele estava, a resposta seria logo: Se melhorar estraga.
Ele era um gerente especial em um restaurante, pois seus garons o seguiam de restaurante em restaurante
apenas pelas suas atitudes. Ele era um motivador nato. Se um colaborador estava tendo um dia ruim, Luis
estava sempre dizendo como ver o lado positivo da situao. Fiquei to curioso com seu estilo de vida que
um dia lhe perguntei: Voc no pode ser uma pessoa positiva todo o tempo. Como faz isso? Ele me
respondeu: A cada manh, ao acordar, digo para mim mesmo: Luis, voc tem duas escolhas hoje: Pode ficar
de bom humor ou de mau humor. Eu escolho ficar de bom humor. Cada vez que algo ruim acontece, posso
escolher bancar a vtima ou aprender alguma coisa com o ocorrido. Eu escolho aprender algo. Toda vez que
algum reclamar, posso escolher aceitar a reclamao ou mostrar o lado positivo da vida. Certo, mas no
fcil - argumentei. fcil sim, disse-me Luis. A vida feita de escolhas. Quando voc examina a fundo,
toda situao sempre oferece escolha. Voc escolhe como reagir s situaes. Voc escolhe como as pessoas
afetaro o seu humor. sua a escolha de como viver sua vida. Eu pensei sobre o que o Luis disse e sempre
lembrava dele quando fazia uma escolha. Anos mais tarde, soube que Luis cometera um erro, deixando a
porta de servio aberta pela manh. Foi rendido por assaltantes. Dominado, enquanto tentava abrir o cofre,
sua mo tremendo pelo nervosismo, desfez a combinao do segredo. Os ladres entraram em pnico e
atiraram nele. Por sorte foi encontrado a tempo de ser socorrido e levado para um hospital. Depois de 18
horas de cirurgia e semanas de tratamento intensivo, teve alta ainda com fragmentos de balas alojadas em seu
corpo. Encontrei Luis mais ou menos por acaso. Quando lhe perguntei como estava, respondeu: Se melhorar
estraga. Contou-me o que havia acontecido perguntando: Quer ver minhas cicatrizes? Recusei ver seus
ferimentos, mas perguntei-lhe o que havia passado em sua mente na ocasio do assalto. A primeira coisa
que pensei foi que deveria ter trancado a porta de trs, respondeu. Ento, deitado no cho, ensangentado,
lembrei que tinha duas escolhas: poderia viver ou morrer. Escolhi viver! Voc no estava com medo?
Perguntei. Os para-mdicos foram timos. Eles me diziam que tudo ia dar certo e que ia ficar bom. Mas
quando entrei na sala de emergncia e vi a expresso dos mdicos e enfermeiras, fiquei apavorado. Em seus
lbios eu lia: "Esse a j era". Decidi ento que tinha que fazer algo. O que fez? Perguntei. Bem, havia
uma enfermeira que fazia muitas perguntas. Perguntou-me se eu era alrgico a alguma coisa. Eu respondi:
"sim". Todos pararam para ouvir a minha resposta. Tomei flego e gritei: - "Sou alrgico a balas!" Entre
risadas lhes disse: - "Eu estou escolhendo viver, operem-me como um ser vivo, no como morto." Luis
sobreviveu graas persistncia dos mdicos, mas tambm graas sua atitude. Aprendi que todo dia temos
opo de viver plenamente. Afinal de contas, "ATITUDE TUDO".

207

Agora voc tem duas opes:


1. Aps ler estas aulas, esquec-las.
2. Dar o melhor de si, com todas as dificuldades que possam aparecer e escolher aprender.
Boa escolha e bons estudos.
(Texto de autor desconhecido, obtido na Internet.)

4. Avaliando o que foi construdo


Pensar por etapas, foi o que vimos. No adianta querer que os computadores se comportem como os
humanos. Eles fazem, realmente, operaes aritmticas e de comparaes, muito mais rpido do que ns o
fazemos, mas preciso dizer-lhes, felizmente, o deve ser feito, como e quando. Os algoritmos se resumem
nisso, informar ao computador de modo inequvoco essas formas e temporalidade.

5. Referncias
1. Salvetti, Dirceu D., Barbosa, Lisbete M., Algoritmos. Pearson Education do Brasil, 1998
2. Pinheiro Neto. Augusto A., Notas de aula, 2001.

208

Unidade III - Iniciao a Programao


1. Situando a temtica
Poderamos dizer que a palavra programar vem do Latim programmeus. Voc acredita? Pois bem,
verdade. Mas o que nos interessa que a palavra programar, em nosso contexto, significa simplesmente:
escrever programas de computador. Os programas solicitam aos computadores a realizao de aes.
Veremos como dialogar com um computador, procurando ensinar-lhe como realizar essas aes, ou seja,
vamos aprender a codificar em uma linguagem de programao um algoritmo apresentado como soluo
para um problema.

2. Problematizando a temtica
O computador uma mquina estranha, o mnimo que se pode dizer. Ele entende apenas aquilo que est
codificado somente com 0s e 1s. Esse tipo de linguagem denominado linguagem de mquina, ou de baixo
nvel. Imaginemos, por exemplo, que a operao de somar seja representada por 11001100 e que desejemos
somar 2 com 3. Para transmitir essa ordem a um computador, temos que escrever uma instruo equivalente
a esta: 11001100 00000010 00000011. Felizmente, as linguagens de programao atuais esto bem mais
prximas das linguagens naturais, aquelas que os homens utilizam para se comunicarem. Existem diversas
linguagens de programao que podem ser utilizadas na implementao de algoritmos. Estudaremos a seguir
uma das mais importantes hoje em dia, a linguagem C.

3. Conhecendo a temtica
3.1 Conceitos bsicos
Linguagens de alto nvel
As linguagens atuais com as quais se escreve programas para computadores so estruturadas (possuem
estruturas de controle), mais prximas da linguagem natural e com certo formalismo matemtico. Essas
linguagens so chamadas de linguagens de Alto Nvel. Exemplos de linguagens de alto nvel.
C, C++, Java, Pascal, Visual Basic, Delphi, PHP, etc...
Programa fonte e programa executvel
Os programas escritos em linguagens de alto nvel, aqueles escritos pelo programador, so geralmente
chamados de programas fonte, pois ali so codificados os conhecimentos necessrios para a soluo de
determinada tarefa. Uma vez traduzido para a linguagem de mquina, aquela dos 0s e 1s, o programa
resultante recebe o nome de programa executvel.
Tradutores
Tradutores so programas especiais que traduzem um programa fonte para linguagem de mquina. Alguns
programas so ditos compilados e outros interpretados. O que isso? Existem tradutores que, quando da
traduo do programa fonte, traduzem cada linha e a executam imediatamente. Nesse caso diz-se que houve
uma interpretao do programa fonte e esse tipo de tradutor denominado interpretador. Quando a traduo
se d por inteiro e to somente aps seu trmino o programa executado, diz-se que ocorreu uma compilao
e esse tipo de tradutor denominado compilador. Programas compilados so mais rpidos do que programas
interpretados.
Importante! Existe um compilador diferente para cada linguagem de alto nvel. Isso lgico. As linguagens
sendo diferentes, no se traduz C do mesmo modo que Delphi, por exemplo.

209

Fazendo um esquema grfico do que acabamos de dizer temos:


Programa escrito
em linguagem de
Alto Nvel
Programa Fonte

Programa de
traduo para
linguagem binria

Programa traduzido em
linguagem de mquina
Programa Executvel

Compilador/
Interpretador Fonte

Veremos em seguida que mesmo para uma nica linguagem como C, por exemplo, existem vrios
compiladores diferentes. H compiladores escritos pela Microsoft, GNU, etc. Felizmente esses compiladores
so quase idnticos.
Linguagens de altssimo nvel
So fceis de utilizar, possuem vrios elementos de linguagem que podem ser arrastados para a rea do
programa e o seu cdigo ento gerado automaticamente, digamos "grande pblico", como Visual Basic.
Essas linguagens apresentam alguns inconvenientes: elas custam caro e so limitadas plataforma. Se o
compilador for voltado plataforma Windows, por exemplo, no espere fazer um programa desenvolvido
com ele funcionar sob Linux ou Macintosh. Enfim, no podemos fazer tudo que desejarmos com esse tipo de
linguagem. Perceba que estamos de certa forma limitados.
As linguagens de alto nvel so um pouco mais difceis que Visual Basic, mas com uma linguagem deste
tipo, como C ou C++, aprendemos muito mais sobre programao e funcionamento dos computadores. Aps
aprendermos uma linguagem deste tipo, somos capazes de aprender mais facilmente uma outra linguagem de
programao. O programador torna-se ento mais autnomo. Em particular C e C++ so linguagens muito
populares. Elas so utilizadas para programar uma grande parte dos softwares mais conhecidos. Enfim,
programando em C ou C++, o programador est livre de comprar softwares carssimos. Programar em C ou
C++ , geralmente, gratuito.
Qualidades de um programador
Um programador deve ter certas qualidades:
pacincia: se um programa no funcionar da primeira vez, preciso saber perseverar!

bom senso: no preciso ser to forte em matemtica, mas isso no impede de se ter que refletir!

Calma: no se d tapa no computador

. Isso no faz o programa funcionar.

Em resumo, no so necessrios conhecimentos especiais para programar. Algum fraco em matemtica


pode at se sair bem, o essencial a pacincia para refletir.
O mnimo que deve estar disponvel para um programador:

Um editor de texto para escrever o cdigo fonte do programa. Em teoria um software como o Bloco
de Notas do Windows, edit em linha de comando do DOS ou o vi em Linux suficiente. O ideal
dispor de um editor de texto inteligente que colore o cdigo, o que permite acompanh-lo mais
facilmente.
Um compilador para transformar (compilar) o cdigo fonte em binrio.
Um depurador (debugger) para ajudar a encontrar alguns erros no programa, erros de utilizao da
memria do computador (erros de lgica do programador no so detectados).

comum utilizarmos um programa 3-em-1 que combina editor de texto, compilador e depurador. Esses
programas so tambm chamados de IDE "Integrated Development Environment". Exemplos de IDE para
programar em C: Bloodshed Dev-C++ e Code::Blocks.
Em nosso curso escreveremos os programas fonte no bloco de notas (notepad) se o sistema operacional for
Windows ou no KEdit (ou outro editor de texto que acompanhe a verso instalada) se o sistema operacional
for Linux. Isto nos restringe aos conhecimentos da linguagem de programao, o que mais interessante

210

para quem est iniciando. Aps conhecermos bem a sintaxe e a semntica da linguagem, usar uma interface
tipo IDE ser fcil. Acredite.
3.2 Memria e variveis
Para que tenhamos uma idia, eis aqui diferentes tipos de memria existentes dentro de um computador, da
mais rpida para a mais lenta:
1. Os registros: uma memria ultra-rpida situada dentro do processador.
2. A memria cache: faz a ligao entre os registros e a memria RAM.
3. A memria RAM: a memria principal com a qual trabalhamos geralmente.
4. O disco rgido: que voc conhece seguramente, onde guardamos os arquivos para posterior uso.
Ao dizermos que uma memria lenta, estamos considerando a escala de tempo de um computador. Afinal,
8 milissegundos so quase imperceptveis aos humanos, mas muito tempo para acessar um disco rgido,
por exemplo!
A memria principal
Fotografando de perto a memria principal (RAM) de um computador, no vemos grandes coisas. mais
importante sabermos como ela funciona internamente.

Vejamos o esquema abaixo. Ele bastante simples, mas do necessitamos saber para programar.

Endereo

Valor

145

3.8028322

0.8272555

39014768

...

...

n-1

940.5118

Como podemos ver preciso distinguir duas coisas:


Endereos: um endereo um nmero que permite ao computador se orientar na memria. Tudo
comea pelo endereo 0 (justamente no incio da memria) e termina no endereo 2n-1, onde n o
tamanho do barramento de endereos. Quanto mais memria existir no computador mais endereos
existiro e mais coisas podero ali ser armazenadas.
Em cada endereo podemos armazenar um nico valor (um nmero): o computador armazena na
memria esses nmeros para poder recuper-los depois, quando necessrio.
O endereamento de memria uma tcnica que permite ao processador acess-la. A interface utilizada para
isto , na maioria das vezes, chamada barramento (BUS), um conjunto de fios dedicados a uma utilizao
particular. No caso do acesso memria, esse barramento chamado de barramento de endereos.
A memria RAM s pode armazenar nmeros. Como fazer ento para armazenar outros caracteres (palavras,
por exemplo)? Boa pergunta. Na verdade, as letras no passam de nmeros para os computadores! Uma frase
uma simples sucesso de nmeros. Existe uma tabela, denominada ASCII, que faz a correspondncia entre

211

os nmeros e as letras e outros caracteres. Essa tabela diz, por exemplo, que o nmero 65 corresponde letra
A.
Variveis
Em C, uma varivel constituda de dois atributos:
Um valor: o nmero que ela armazena, por exemplo, 25.
Um nome: que permite reconhec-la. Programando em C no preciso lembrar o endereo de
memria que guarda certo valor (ufa!), basta lembrar o nome da varivel que contm aquele valor. O
compilador far a converso entre o nome da varivel e o endereo onde ela est armazenada (ainda
bem).
Isso parece um pouco confuso no momento (qual o interesse de armazenar um nmero se preciso lembrar o
seu endereo), mas, tudo vai tomar sentido em seguida.
3.3 Dando nome s variveis
Em C cada varivel deve ter um nome. Se uma varivel guarda o valor da vida mdia de um cidado, ns
bem que gostaramos de cham-la vida mdia. Infelizmente isso no possvel. Existem certas restries.
Veja a seguir as regras que devemos seguir ao darmos um nome a uma varivel.

S podem existir letras (minsculas ou maisculas), dgitos e sublinha _.


O nome de uma varivel deve comear por uma letra.
Espaos so proibidos
Acentos no so permitidos ( etc).

Enfim, e isto muito importante, a linguagem C (como C++) faz diferena entre as letras maisculas e
minsculas. Ento Brasil, bRasil e brasil so nomes que representariam trs variveis distintas. Veja alguns
exemplos de nomes vlidos de variveis:
Vidamedia, vida_media, vida_Media, VidaMedia, num_de_telefone, bola215, etc
Cada programador tem sua maneira prpria de nomear as variveis. Uma maneira bastante utilizada :
Comear os nomes de variveis por maisculas.
Se houver vrias palavras no nome da varivel, colocar uma maiscula no incio de cada palavra.
VidaMedia, por exemplo.
3.4 Tipos de variveis
Um computador como se pode constatar nada mais do que uma grande mquina de calcular. Ele s sabe
trabalhar com nmeros. O problema que existem vrios tipos de nmeros.
Nmeros inteiros positivos: 45; 578; 2457
Nmeros inteiros negativos: -87; -513
Nmeros decimais, isto , nmeros com vrgula: 1,7741; 9810,7
Nmeros decimais negativos: -98,45; -1,0045
Nosso pobre computador precisa de ajuda. Quando pedimos a ele para armazenar um nmero, devemos
dizer-lhe de que tipo o nmero. No que ele no seja capaz de reconhec-lo, mas isso o ajuda a organizarse e no perder tempo e espao de memria com algo que poderia ser evitado. Quando declaramos uma
varivel em um programa devemos ento indicar o seu tipo. Vejamos os principais tipos de variveis
existentes em C:
Nome do tipo Valores que podem ser armazenados
Char
-128 a 127
Int
-2 147 483 648 a 2 147 483 647
Long
-2 147 483 648 a 2 147 483 647
Float
-3.4 x 1038 a 3.4 x 1038
Double
-1.7 x 10308 a 1.7 x 10308
Esses no so todos os tipos, mas j d pra comear.

212

Os trs primeiros tipos permitem armazenar nmeros inteiros (1, 2, 3, 4...).


Os dois ltimos permitem armazenar nmeros decimais (13.8, 16.911...).
Os tipos float e double permitem armazenar nmeros bastante grandes. Se voc no est habituado com as
potncias de dez, ento imagine que o tipo double permite armazenar o nmero 1 seguido por 308 zeros, isto
, 100000000000000.... (eu no vou aqui escrever 308 zeros

Observemos que int e long so parecidos. Antes no era assim (um int era menor que um long), mas hoje as
memrias evoluram e temos bastante espao para escrever nmeros grandes sem grandes preocupaes com
a memria. Por razes de compatibilidade, a linguagem C guarda os dois tipos. Na prtica utilizamos
principalmente os tipos char, long e double. Voc ver que na maior parte do tempo manipularemos
nmeros inteiros (tanto melhor, pois so mais fceis de utilizar).
Ateno com os nmeros decimais. O computador no conhece a vrgula decimal. Em seu lugar utilizaremos
o ponto. No devemos escrever 273,45, mas 273.45!
Isso ainda no tudo! Alm dos tipos que armazenam nmeros inteiros (char, int, long,...) j vistos, existem
outros ditos unsigned (sem sinal) que podem armazenar apenas nmeros positivos. Para utiliz-los basta
escrever a palavra unsigned antes do nome do tipo.
unsigned char 0 a 255
unsigned int 0 a 4 294 967 295
unsigned long 0 a 4 294 967 295
A vantagem de utilizar tipos unsigned que podemos armazenar nmeros duas vezes maiores (char pra em
128 enquanto unsigned char vai at 255, por exemplo). Por que criar trs tipos para os nmeros inteiros? Um
s tipo no seria suficiente? Sim, mas no incio foram criados vrios tipos para economizar memria. A
tabela a seguir mostra o espao necessrio para armazenar os tipos.
Nome do tipo Nmero de bits
Char
8
Int
32
Long
32
Float
32
double
64
3.5 Declarando uma varivel
Uma declarao de varivel muito simples, agora que voc sabe tudo que necessrio. Basta indicar, na
ordem:
1.
2.
3.
4.

O tipo da varivel que vai ser criada


Teclar espao
Indicar o nome desejado para a varivel
Enfim, no esquea o ponto-e-vrgula

Por exemplo, se desejamos criar uma varivel de nome TotalDePontos do tipo long, basta digitar a linha
seguinte:
long TotalDePontos;
Isso tudo!
Outros exemplos:
long NotaDeFisica;
double TotalRecebido;
unsigned long NumeroDeEspacosNaLeituraDeUmTextoLongo;
Ateno! A declarao das variveis deve ser feita no incio das funes. O texto no quadro abaixo um
cdigo de programa escrito em C. Um programa em C formado por vrios trechos de cdigo com um

213

formato especial denominado funo. Todo programa possui uma funo principal chamada main, essa a
nica no programa abaixo. No se preocupe, aprenderemos aos poucos a escrever um programa.
#include <stdio.h>
int main(int argc, char *argv[])
{
// Incio da funo
long TotalDePontos;
system("PAUSE");
return 0;
// Fim da funo
}

Se executarmos este programa ficaremos pasmos ao ver que


ele no faz nada.

Algumas explicaes
Na verdade se passa alguma coisa, mas no possvel v-la.
Quando a execuo do programa chega linha de declarao
da varivel TotalDePontos ele solicita ao computador
permisso para utilizar um espao de sua memria principal.
Se tudo vai bem, o computador responde pois no, faa como
se estivesse em sua casa . O nico problema que poderia
acontecer seria no haver mais espao disponvel na memria do computador, mas isso ser um caso
extremo. possvel declarar mais de uma varivel em uma mesma linha do programa. Por exemplo, long a,
b, c;
Isso criar trs variveis de tipo long denominadas a, b e c.
3.6 Atribuindo valor a uma varivel
tudo que h de mais simples. Para atribuir o valor 8 varivel TotalDePontos basta escrever:
TotalDePontos = 8;
De modo geral, um comando de atribuio tem a forma: varivel = expresso;
Nosso programa completo se parece agora com
#include <stdio.h>
int main(int argc, char *argv[])
{
// Incio da funo
long TotalDePontos;
TotalDePontos = 8 ;
system("PAUSE");
return 0;
// Fim da funo
}

Nada exibido na tela do computador at agora. Em algum lugar


da memria do computador o valor 8 armazenado, esse lugar
conhecido no programa pelo nome da varivel TotalDePontos e
isso tudo.

O valor de uma nova varivel


Eis uma questo muito interessante. Quando se declara uma
varivel, qual o seu valor inicial? De fato, quando o computador
l a linha long TotalDePontos; ele reserva uma pequena parte da
memria para armazenar um valor do tipo long.
Mas que valor esse? Existe um valor padro (0, por exemplo)?
Bem, a resposta no. No existe um valor padro. O computador reserva um espao na memria para
armazenar um novo valor, mas no apaga o que j existia naquele espao. Imediatamente a varivel recebe o
valor que se encontrava no espao que foi reservado, que pode ser qualquer coisa. Assim, o melhor
inicializar as variveis quando de suas declaraes, sempre que possvel. Procedemos assim:
long TotalDePontos = 8;
Agora a varivel foi declarada e recebeu imediatamente o valor 8. Foi apagado o que poderia haver na
posio de memria que lhe foi alocada e colocado ali o valor 8.
3.7 Constantes
Ocorre s vezes que se tem a necessidade de armazenar um mesmo valor durante toda a execuo de um
programa. O valor de pi (3.14), por exemplo. Isso quer dizer que uma vez declarada e inicializada, a varivel
dever conservar o seu valor impedindo que qualquer pessoa possa modific-lo. Essas variveis particulares
recebem o nome de constantes, por motivos bvios. Para declarar uma constante em um programa deve-se
utilizar a palavra const antes do tipo e obrigatoriamente, inicializar a varivel. Exemplo de declarao de
uma constante:
const long PI = 3.14;
No uma obrigao, mas por conveno, escreve-se os nomes das constantes com letras maisculas. Isso
nos permite distinguir facilmente os nomes de constantes dos de variveis. Fora isso uma constante
utilizada do mesmo modo que uma varivel.

214

Ao tentar modificar o valor de uma constante no corpo de um programa o compilador acusar um erro (por
qu?).
3.8 Exibindo o contedo de uma varivel
Utilizamos a funo printf para exibir valores na tela do computador.
printf("Total de pontos = %d ", TotalDePontos);
O smbolo especial % seguido da letra d um especificador de formato. Este especificador permite a
exibio de um nmero inteiro na tela do computador. Existem vrios especificadores de formato que sero
visto mais tarde. Por enquanto usaremos os especificadores para nmeros inteiros e nmeros decimais.
Smbolo Significado
%d
Nmero inteiro (ex: 56)
%f
Nmero decimal (ex: 13.75)
Por enquanto saiba que, se quisermos exibir um nmero inteiro, precisamos utilizar o especificador %d e
para exibir um nmero decimal precisamos utilizar o especificador %f.
Os especificadores de formato so geralmente utilizados dentro de um texto explicativo, como no exemplo
anterior. preciso, entretanto indicar para a funo printf qual o valor a ser exibido. Para isso preciso
escrever o nome da varivel que contm esse valor aps o texto contendo o especificador, aps uma vrgula.
Vejamos outros exemplos:
printf("O valor de a eh %d ", a1);
printf("Foram encontrados %d resultados ", r);
No primeiro exemplo %d indica que um valor inteiro deve ser exibido na tela do computador e esse valor
est armazenado em a1. No segundo exemplo esse valor est armazenado na varivel r.
Por enquanto veremos os programas prontos e aprenderemos cada vez mais sobre suas estruturas. Pelo que
temos visto podemos tirar algumas concluses:
Um programa comea sempre com a instruo #include<stdio.h>, isto indica que uma biblioteca de
funes de nome stdio deve ser includa automaticamente no programa e isto feito, no se
preocupe.
O cabealho da funo principal ser sempre int main().
Aps // vem um comentrio, que no executado, serve apenas de documentao.
system("PAUSE"); fixa a tela de modo que possamos ver a resposta.
return 0 indica um fim normal do programa.
#include <stdio.h>
int main()
{
long TotalDePontos = 5;
// No incio o alunos possui 5 pontos
printf("Voce possui %d pontos \n", TotalDePontos);
printf("**** H U M M M ****\n"); // O aluno errou uma questo
TotalDePontos = 4;
// Ele acaba de perder um ponto!
printf("Ah, agora voce so tem %d pontos!\n\n", TotalDePontos);
system("PAUSE");
return 0;
}
Este programa produz a seguinte sada:
Voce possui 5 pontos
**** H U M M M ****
Ah, agora voce so tem 4 pontos!
Pressione uma tecla para continuar...

215

Exibir vrias variveis em um nico printf


possvel exibir o valor de vrias variveis em um nico printf. Para tanto, suficiente indicar %d ou %f
onde se deseja que os valores sejam impressos e em seguida indicar as variveis que contm esses valores,
obedecendo ordem em que os especificadores foram indicados, separadas por vrgula.
Exemplo.
printf("Voce tem %d pontos e faltam %d perguntas", TotalDePontos, p);
3.9 Recuperando uma entrada
As variveis vo comear a ficar mais interessantes agora. Vamos solicitar ao usurio (aquele que est
operando o computador) que digite um nmero. Vamos aprender a recuperar essa entrada e a armazenar em
um determinado lugar na memria principal. Para solicitar ao usurio que entre com uma determinada
informao pelo teclado utiliza-se a funo scanf. Essa funo se parece com a funo printf. Deve-se
colocar um %d ou %f, entre aspas, para indicar um inteiro ou um decimal a ser digitado.
Veja um exemplo.
scanf("%d", &idade);
Coloca-se apenas %d (ou %f) entre as aspas. No esquecer de colocar o smbolo & antes do nome da
varivel que vai receber o valor. E por que esse & antes do nome da varivel?
preciso que voc acredite em mim. Eu explicarei isso mais tarde. No o fao agora para no embolar o
meio de campo. Quando o programa encontra um scanf ele faz uma pausa e espera que o usurio digite um
valor. Esse valor ser armazenado na varivel idade. Veja um pequeno exemplo.
#include <stdio.h>
int main()
{
long idade = 0; // inicializa a varivel com 0
printf("Qual a sua idade? ");
scanf("%d", &idade); // Solicita a entrada de idade com scanf
printf("Ah ! Voce tem %d anos!\n\n", idade);
system("PAUSE");
return 0;
}

Sada:
Qual a sua idade? 20
Ah! Voce tem 20 anos!
Pressione uma
continuar...

tecla

para

Pronto! Voc compreendeu o


princpio. Graas funo scanf
o computador pode interagir
com o usurio.

Observe que nada nos impede de digitar outra coisa que um nmero inteiro:
Se digitarmos um nmero decimal como 34.56, por exemplo, ele ser truncado imediatamente e s a
parte inteira armazenada. Neste caso, 34 armazenado na varivel idade.
Se digitarmos letras, a varivel no muda de valor. Permanece ento com o valor 0 (valor com que
foi inicializada). Se a varivel no tivesse sido inicializada, o programa imprimiria qualquer coisa.
Percebem a importncia da inicializao das variveis?
3.10 Testes
1. Quando se declara uma varivel, qual memria utilizada?
( ) Registros
( ) Memria cache
( ) Memria RAM
( ) Disco rgido
2. Qual memria no apagada quando o computador desligado?
( ) Registros
( ) Memria cache
( ) Memria RAM
( ) Disco rgido

216

3. Qual desses no um nome vlido de varivel?


( ) scanf
( ) coordenadaDaJanela
( ) desconto_total
4. Qual dos tipos de dado abaixo permite armazenar o nmero 15.3?
( ) char
( ) long
( ) double
( ) int
5. Qual dos tipos abaixo permite armazenar o nmero - 1458 ?
( ) long
( ) unsigned int
( ) unsigned double
6. Se a varivel SaldoBanco um long que vale 150345 reais (pensemos grande), o que a linha de cdigo
printf("Voce tem %d reais na conta ", saldoBanco); exibir na tela?
( ) Voce tem %d reais na conta
( ) Voce tem 150345 reais na conta
( ) Voce tem d reais na conta saldoBanco
7. Para armazenar um nmero decimal digitado no teclado, qual das linhas de cdigo abaixo a boa?
( ) scanf("%f", num);
( ) scanf("%d", num);
( ) scanf("%f", &num);
( ) scanf("%d", &num);

4. Avaliando o que foi construdo


Foram apresentados alguns conceitos bsicos necessrios para a construo de um programa: memria,
variveis e constantes, alm das instrues capazes de realizar as operaes de entrada e sada desses
elementos de programao. Uma operao de entrada consiste em receber um valor via teclado e armazenlo na memria principal do computador. A operao correspondente sada consiste em exibir, geralmente
na tela do computador, um valor que esteja armazenado em uma varivel. Vimos tambm que as linguagens
utilizadas pelos programadores atualmente so classificadas em um nvel to mais alto quanto mais afastadas
estiverem da codificao binria. Assim que linguagens como C, Pascal, Ada, Java, PHP, etc., so
denominadas de alto nvel.

5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de Computadores:
Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill Book
Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.

217

Unidade IV - Operaes Aritmticas Bsicas


1. Situando a temtica
Nesta unidade aprenderemos a realizar a maior parte dos clculos que um computador pode executar. A idia
retomar o conceito de variveis visto na unidade anterior e realizar as operaes bsicas que as envolvem
como somar, multiplicar, permutar, etc.

2. Problematizando a temtica
J sabemos que o computador uma calculadora muito potente com a qual podemos realizar as seguintes
operaes bsicas com muita simplicidade:
Adio
Subtrao
Multiplicao
Diviso
Mdulo (eu explicarei o que isto)
Quando desejamos fazer outras operaes mais complicadas, temos que as programar, isto , explicar ao
computador como faz-las. Felizmente existe uma biblioteca de funes matemticas j prontas que
acompanha a linguagem C. Neste caso no necessrio programar as operaes, mas simplesmente conhecer
a interface das funes correspondentes, ou seja, saber como utiliz-las.

3. Conhecendo a temtica
3.1 Primeiros passos
Vamos comear pela adio. Para fazer uma adio se utiliza o smbolo + (sem brincadeira). O resultado de
um clculo, geralmente, deve ser armazenado em uma varivel.
Ateno! Na maioria das vezes, representaremos apenas a parte do programa fonte que estiver sendo
discutida. Lembre-se de completar o cdigo do programa comeando por
#include <stdlib.h>
#include <stdio.h>
..............................
Vejamos um exemplo de um trecho de programa que realiza uma soma.
..............................
long resposta = 0;
..............................
resposta = 13 + 7;
No necessrio ser um gnio em matemtica para saber que a varivel resposta armazenar o valor 20
aps a execuo desse trecho de programa. Claro que nada exibido na tela como resposta. Para ver o
resultado na tela, como j sabemos, necessrio utilizar a funo printf. Em algum lugar do programa
poderamos ter printf(17 + 3 = %d, resposta);. O resultado na tela seria 17 + 3 = 20.
Isso tudo para a adio. Para as outras operaes o procedimento o mesmo apenas o smbolo do operador
muda. Os operadores so representados pelos smbolos:
Adio: +
Subtrao: Multiplicao: *
Diviso: /
Mdulo: %
As trs primeiras operaes so realizadas de modo natural, conhecido por quase todos. Apenas as operaes
de diviso e de mdulo merecem um pouco de reflexo, pois existem algumas consideraes especficas
relacionadas com os tipos envolvidos.

218

3.2 A diviso
As divises funcionam normalmente em um computador quando no sobram restos. Por exemplo, 8/2 4,
mas 7/2 que deveria ser 3.5 3 e sobra um resto 1. Observe.................................
long resposta = 0;
.............................
resposta = 7/2;
printf ("7 / 2 = %d", resposta);
..............................
Sada.
7/2=3
Eis aqui um problema. Sabemos que 7/2=3.5, mas o resultado apresentado foi 3. Ocorre que a varivel
resposta do tipo long, portanto inteiro, por isso o computador truncou o resultado ficando apenas com a
sua parte inteira. Se resposta tivesse sido declarada como float ou double o resultado seria 3.500000. Faa
as modificaes no programa fonte e execute-o novamente para ver o resultado.
Se quisermos que o computador mostre o bom resultado (3.5) ser necessrio transformar os nmeros 7 e 2
para decimais. Isso feito escrevendo-se 7.0 e 2.0 (so os mesmos nmeros, mas agora o computador vai
entend-los como nmeros decimais e, portanto efetuar uma diviso de decimais). Na verdade, basta
escrever um dos nmeros no formato decimal (com ponto decimal). A linguagem C reconhecer a expresso
como sendo do tipo decimal e efetuar a operao corretamente.
.....................................
double resposta = 0;
....................................
resposta = 7.0 / 2.0;
printf ("7 / 2 = %f", resposta);
......................................
Sada
7 / 2 = 3.500000
Observe que o especificador de formato utilizado foi %f, para nmeros decimais. Mas ateno, s vezes se
deseja realmente que o resultado seja um valor inteiro, nesse caso o resultado inicial (3) estaria correto.
Esta propriedade dos nmeros inteiros muito importante. Tenha sempre em mente que 5/2=2, 8/5=1, 6/7=0,
etc. Para obter um resultado decimal necessrio que os operandos sejam nmeros decimais: 5.0/2.0=2.5,
8.0/5.0=1.6, 6.0/7.0=0.857143, etc.
De fato, na diviso 5/2, o computador responde questo quantas vezes o nmero 2 est dentro do nmero
5? Resposta, 2 (duas vezes).
Voc agora deve estar se perguntando como fazer ento para recuperar o resto da diviso? Esse o nosso
prximo passo.
3.3 Primeiros passos
O mdulo uma operao matemtica que permite se obter o resto da diviso de dois nmeros inteiros.
Talvez seja uma operao menos conhecida que as anteriores, mas de grande importncia nos clculos
realizados por computadores. Como mostrado anteriormente, o operador de mdulo representado por %.
Veja os exemplos:
7%2=1
ler: o resto da diviso de 7 por 2
28 % 5 = 3
ler: o resto da diviso de 28 por 5
10 % 2 = 0
ler: o resto da diviso de 10 por 2
Ao executar a operao 7%2, o computador calcula o resto da diviso de 7 por 2, que 1. A operao 10%2
fornece como resultado 0, pois esse o resto da diviso de 10 por 2, ou seja, a diviso exata.

219

3.4 Clculo entre variveis


O interessante, agora que sabemos as cinco operaes bsicas, utiliz-las entre vrias variveis. Nada nos
impede de escrever, resposta = num1 + num2, por exemplo, onde num1, num2 e resposta so variveis
declaradas. Esta linha, obviamente faz a soma das variveis num1 e num2 e coloca o resultado na varivel
resposta.
Agora as coisas comeam a ficar mais interessantes. Voc j capaz de fazer coisas espantosas, como uma
calculadora. Creia-me. Imagine um programa que solicita ao usurio a entrada de dois nmeros. Esses dois
nmeros devero ser armazenados em variveis. Em seguida escreva uma expresso que calcule a soma
desses nmeros e armazene o resultado em uma varivel chamada resposta. Ento exiba o resultado obtido
na tela do computador. Experimente escrever esse programa sozinho.
Uma possvel resposta seria:
#include <stdio.h>
#include <stdlib.h>
int main()
{
long resposta = 0, num1 = 0, num2 = 0;
// ** solicitar num1 e num2 ao usurio **
printf("Entre com o valor de num1: ");
scanf("%d", &num1);
printf("Entre com o valor de num2: ");
scanf("%d", &num2);

// ********* Calcular ************


resposta = num1 + num2;
// ** Mostrar o resultado na tela **
printf ("%d + %d = %d\n", num1, num2,
resposta);
system("PAUSE");
return 0;
}

Sada
Entre com o valor de num1: 52
Entre com o valor de num2: 30
52 + 30 = 82
Experimente agora seguir o mesmo procedimento para que a sua calculadora execute as outras operaes
bsicas, ou seja, modifique o programa acima para que ele execute as operaes de subtrao, multiplicao
e diviso.
3.5 Abreviaes: incremento e decremento
Existem em C tcnicas que permitem abreviar a escrita de certas operaes. Essas abreviaes tm por
objetivo agilizar a digitao e tornar o cdigo mais conciso.
Incremento
Quase sempre, um programador se depara com um problema bem simples, mas de grande importncia:
aumentar de 1 o valor de certa varivel.
Imagine que um programa trabalhe com uma varivel denominada Total e que se deseje aumentar de 1 o
valor dessa varivel. Como faz-lo se o seu valor atual no conhecido?
Soluo: Total = Total + 1;
O que se passa em um computador ao encontrar uma instruo como esta? Bem, ele sempre avaliar a
expresso que se encontra do lado direito da instruo de atribuio (representada pelo smbolo =) e
armazenar o seu resultado na varivel que se encontra do lado esquerdo. Assim, na unidade de aritmtica e
lgica (UAL), ele somar 1 ao valor atual da varivel Total e substituir o valor armazenado em Total pelo
valor da expresso calculada.
Na memria

Na UAL

Na memria
total

total
Antes

30

30+1

220

Depois

31

Observe que nessa instruo escreve-se duas vezes o nome de uma mesma varivel (Total). Os
programadores achando isso muito cansativo resolveram ento abrevi-la. A instruo seguinte faz
exatamente a mesma coisa que a anterior e escreve-se menos: Total++;
Este recurso muito usado nos programas escritos em C. Voc ter oportunidade de comprovar este fato.
Decremento
Esta operao o inverso daquela denominada incremento. Trata-se de retirar 1 do valor de uma varivel.
Ento, de modo anlogo operao de incremento tem-se: Total = Total - 1; equivalente a Total--;
3.6 Outras abreviaes
Existem outras abreviaes que funcionam sob o mesmo princpio que o de incremento (decremento) visto
anteriormente, porem de forma mais geral. Essas abreviaes funcionam para todas as operaes bsicas. A
tabela abaixo mostra essas abreviaes.
Operao
total = total +5
total = total -5
total = total *5
total = total /5
total = total %5

Abreviao
total += 5
total -= 5
total *= 5
total /= 5
total %= 5

Exemplo. Supor total = 5 inicialmente.


long total = 5;
total += 4; // total vale 9
total -= 3; // ... total vale 6
total *= 5; // ... total vale 30
total /= 3; // ... total vale 10
total %= 3; // ... total vale 1(pois 10=3*3+1)
A vantagem aqui que podemos utilizar todas as operaes bsicas e podemos somar, multiplicar, etc por
qualquer nmero. Essas abreviaes so importantes quando temos operaes repetitivas com essa estrutura
em um programa. Todavia, o incremento a abreviao mais utilizada.
3.7 A biblioteca matemtica
Em C existe um conjunto de funes j prontas para uso bastando apenas ao usurio compreender as suas
interfaces, o meio de comunicao do programa com essas funes. Esse conjunto de funes foi escrito por
outros programadores e servem, de certo modo, para evitar que os programadores atuais reinventem a roda a
cada novo programa.
J utilizamos as funes printf et scanf da biblioteca stdio.h. Existem outras bibliotecas de programas, dentre
elas uma denominada math.h, que contm diversas funes matemticas j prontas, isto , j programadas.
Tenha em mente, por exemplo, que a linguagem C no sabe calcular potncia. Se escrevermos 43 o
computador no saber executar essa operao, pois ele no sabe o que isso significa. Para a realizao desse
clculo necessrio indicar no incio do programa a incluso de uma biblioteca que contenha a funo
responsvel por ele.
Essa indicao feita por: #include <math.h>
Uma vez feita essa indicao, podemos utilizar todas as funes dessa biblioteca. As principais funes
existentes na biblioteca math so:

221

fabs
Esta funo retorna o valor absoluto de um nmero, isto , |x| (sua notao matemtica).
O valor absoluto de um nmero o seu valor positivo:
Ao passar o valor -78 para a funo, ela retornar 78.
Ao passar o valor 175 para a funo, ela retornar 175.
........................................................
double absoluto = 0, x=-42;
absoluto = fabs(x); // absoluto receber o valor 42
........................................................
A funo fabs retorna um valor double por isso devemos declarar a varivel absoluto (aquela que vai receber
o retorno da funo) como sendo do tipo double. Existe uma funo similar a fabs na biblioteca "stdlib.h",
a funo abs. Essa funo funciona do mesmo modo que fabs, mas somente para valores inteiros. Devemos
ento declarar a varivel que vai receber o retorno da funo como sendo do tipo int.
ceil
Esta funo retorna o menor nmero inteiro maior que o nmero decimal que lhe passado como argumento.
Por exemplo, ao passar 18.33 como argumento para a funo ela retorna 19. Esta funo retorna um valor do
tipo double.
.........................................................
double teto = 0, valor1 = 18.33;
teto = ceil(valor1);
// teto valer 19
//Programa floor, ceil
#include <stdio.h>
floor
Esta funo funciona como a
int main(void)
precedente, mas retorna o
{
maior inteiro menor do que o
double base=0, valor2=18.99;
valor decimal passado como
float teto=0, valor1=18.33;
argumento. Por exemplo, ao
teto=ceil(valor1);
passar 18.99 como argumento
base=floor(valor2);
para a funo ela retorna 18.
printf("Base = %f\n", base);
Vejamos um programa que
printf("Teto = %f\n", teto);
exemplifica as duas funes.
printf("Tamanho de base (em bytes) = %d\n", sizeof(base));
printf("Tamanho de teto (em bytes) = %d\n", sizeof(teto));
getch();
return 0;
}
Outras funes.
funo
pow(n, p)
sqrt(n)

argumentos
(double|float|int, double|float|int)
(double|float|int)

sin(x)
cos(x)
tan(x)
asin(x)
acos(x)
atan(x)
exp(x)

em radianos
em radianos
em radianos
double
double
double
double

log(x)
log10(x)

double
double

retorna
double|float|int (np)
double ( n )
double (seno de x)
double (cosseno de x)
double (tangente de x)
double (arco seno de x)
double (arco cosseno de x)
double (arco tangente de x)
double ( e x )
double (loge x)
double (log10 x)

3.8 Testes
1. Qual o smbolo de multiplicao na linguagem C?
( )*
( )+
( )/
( )-

222

( )%

2. Qual o resultado da operao 17 % 5?


( )0
( )1
( )2
( )3

( )4

( )5

( ) 15

3. Qual o valor da varivel resultado aps a instruo resultado = (8 / 3) - 2;?


( ) -2 ( ) 0
( )1
( )2
4. Qual o nome da operao seguinte em programao? x++;
( ) incremento
( ) argumento
( ) suplemento
5. Qual o valor da varivel numero aps as operaes seguintes?
long numero = 4;
numero--;
numero *= 4;
numero %= 12;
numero += 1;
(
(
(
(
(

)0
)1
)4
) 12
) 14

6. Qual das funes abaixo se deve utilizar para que 13.25 seja arredondado para 14?
( ) pow
( ) ceil ( ) floor
( ) sqrt

4. Avaliando o que foi produzido


Essas so as operaes e funes que provavelmente todos os programadores mais utilizam ao trabalharem
com as operaes aritmticas. A sua compreenso importantssima, pois elas formam a base de programas
mais complexos. Teremos oportunidade na seqncia deste curso de utiliz-las como operaes elementares.

5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de Computadores:
Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill Book
Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.

223

Unidade V- Praticando Entrada e Sada


1. Situando a temtica
As funes que realizam as operaes de entrada ou sada no pertencem linguagem C. A biblioteca padro
de entrada/sada stdio contm tudo que necessrio para as operaes de entrada ou sada em um
programa C. Essa biblioteca formada por um conjunto de funes que fornecem linguagem um sistema
de interfaces cmodas para a realizao das operaes de entrada ou sada.

2. Problematizando a temtica
As funes mais utilizadas para entrada ou sada so:
scanf
printf

L valores de variveis a partir da entrada padro, geralmente o teclado.


Escreve sobre a sada padro. Na ausncia de indicao em contrrio,
essa sada a tela do computador.

Sempre que um programa precisar de dados iniciais vindos do mundo exterior, esses devero ser inseridos no
programa por uma funo de leitura. isso que faz a funo scanf. De modo anlogo, os dados produzidos
como resultado de processamento interno so exibidos, enviados para o mundo exterior, via a funo printf.
Vejamos alguns detalhes sobre essas funes.

3. Conhecendo a temtica
3.1 Algumas consideraes sobre a funo scanf
Consideremos o comando scanf(%d, &n);. Trata-se aqui da leitura de um valor que dever ser
armazenado na varivel n. Para administrar corretamente a varivel n, a funo scanf precisa conhecer o seu
tipo. No exemplo acima, o primeiro parmetro da funo, representado pela seqncia de caracteres %d
indica ao compilador C que a varivel de tipo inteiro (int). Se a varivel n pertencesse a um outro tipo,
outro caractere seria usado no lugar de d. Essa seqncia de caracteres conhecida pelo nome especificador
de formato. O segundo parmetro da funo (&n) indica o endereo na memria do computador, onde a
varivel n ser armazenada. O computador se encarrega de calcular esse endereo. O programador apenas
deve escrever o parmetro &n para que o computador saiba que no programa o valor armazenado naquele
endereo ser conhecido por n. O endereo de uma varivel x representado, portanto, pela expresso &x.
3.2 Algumas consideraes sobre a funo printf
O primeiro argumento dessa funo sempre uma seqncia de caracteres. Explicamos o funcionamento
dessa funo com a ajuda de alguns exemplos.
1.

printf(bom dia);
Quando essa instruo encontrada, a funo printf se encarrega de escrever na tela do
computador a seqncia bom dia.

2.

printf("Eh agradavel escrever um programa "


"em C, \nquando o utilizamos \"corretamente\".\n");
As aspas no fim da primeira linha e no incio da segunda permitem escrever uma seqncia de
caracteres em mais de uma linha. Esse comando produz como sada:
Eh agradavel escrever um programa em C,
quando o utilizamos "corretamente".
A seqncia de caracteres \n diz ao compilador para executar um salto de linha (passar para a
prxima linha da tela)
A seqncia de caracteres \" indica o uso de aspas. Nesse caso as aspas faro parte da sada que
ser impressa.

224

3.

printf(%d, 5);
A funo printf substitui o especificador de formato %d pelo primeiro parmetro situado aps a
vrgula, neste caso o inteiro 5. Lembre que o caractere d em um especificador de formato
representa um nmero inteiro.

Seja o programa
#include <stdio.h>
int main()
{
int altura=185;
float peso=80.5;
char nome[10]="Joao";
printf("%s mede %d cm e pesa %f kg", nome, altura, peso);
getch();
return 0;
}
4.

printf("%s mede %d cm e pesa %f kg", nome, altura, peso);


Supor que as variveis nome, altura e peso refiram-se a uma pessoa e valham a seqncia de
caracteres Joo, o inteiro 185 e o nmero real 80.5, respectivamente. A funo printf substitui os
especificadores de formato respeitando a ordem em os mesmos se encontram na instruo. Assim
%s substitudo pelo primeiro parmetro situado aps a vrgula, neste caso a seqncia Joo, %d
substitudo por 185 e %f por 80.5. Note que %s o especificador de formato para seqncia de
caracteres e %f o especificador de formato para nmeros em ponto flutuante (nmeros com ponto
decimal).

Observemos o seguinte comando:


5.

printf("os valores sao \n%5d\n%5d\n%.3f\n", v1, v2, v3);


v1 e v2 so duas variveis de tipo int que contm os valores 4 e 256 e v3 uma varivel de tipo
float contendo o valor 7.54756, por exemplo. As indicaes numricas permitem precisar o modo
como esses valores so mostrados na tela.
%5d: exibe o valor correspondente, um valor inteiro, ocupando 5 posies preenchidas a partir da
direita.
%.3f: exibe o valor correspondente como uma varivel de tipo float com 3 casas decimais, com
arredondamento.
A sada ento:
00004
00256
7.548

getch(): aguarda a prxima tecla ser pressionada. Isto permite ao usurio ver na tela o resultado exibido pelo
programa.
A instruo return 0; ao fim da funo main permite enviar o valor 0 ao sistema o que significa, por
conveno, que o programa terminou normalmente. O envio desse valor obrigatrio em C, pois a funo
main declarada como sendo do tipo int, logo espera um valor desse tipo.
3.3 Vamos praticar um pouco
Digitemos o programa abaixo. Antes de execut-lo, procure entender como sero a sua entrada e a sua sada.
O objetivo que ele seja auto-explicativo.

225

/* Este programa l 3 valores inteiros */


#include<stdio.h>
int main()
{
int a,b,c;
printf("digite 3 numeros inteiros separados por espaco\n");
scanf("%d %d %d",&a,&b,&c);
printf("\n valor de a = %d",a);
printf("\n valor de b = %d",b);
printf("\n valor de c = %d\n ",c);
getch();
return 0;
}
Alguns comentrios.
- algumas palavras esto sem acentuao, pois isto no permitido na linguagem C, salvo nos comentrios;
- o texto entre os smbolos /* e */ um comentrio e, portanto, no ser compilado;
- a primeira chamada funo printf serve para orientar o usurio sobre o que ele deve fazer quando da
execuo deste programa (o que ele deve fazer mesmo?). Experimente retirar esse comando do programa.
Ele funcionar corretamente, mas o usurio saber o que o computador estar esperando como entrada de
dados?
- na instruo scanf("%d %d %d",&a,&b,&c); os especificadores de formato (%d) podem ser separados por
espao ou no, isto no tem influncia no programa;
- a cada especificador de formato na funo scanf corresponde, em ordem, um argumento a ser lido do
teclado;
- as prximas chamadas funo printf servem para imprimir (exibir na tela do computador) os valores das
variveis a, b e c;
- no incio de cada chamada a printf h uma ordem para o computador mudar de linha (\n);
- getch() permite que o usurio veja o resultado na tela (fixa a tela de execuo do programa). Experimente
retirar esse comando do programa e tire suas prprias concluses.
Na plataforma Moodle voc encontrar vrios exerccios que
permitiro consolidar a aprendizagem sobre entrada e sada de
dados. Essas operaes so importantssimas e s a prtica
leva um programador a se sentir vontade em sua utilizao.
Ento, mos obra.

4. Avaliando o que foi construdo


As operaes de entrada e sada so bsicas no desenvolvimento de um programa. So elas que
implementam a interface entre o homem e a mquina. Se por um lado preciso alimentar o computador com
dados do mundo exterior a fim de que ele possa realizar alguns processamentos indicados no algoritmo
implementado como soluo de um problema, por outro precisamos ver os resultado obtidos. Bem formatar
esses procedimentos de entrada e sada implica em apresentar um trabalho legvel e compreensvel. De nada
adianta um programa que tenha um bom desempenho nos seus procedimentos internos se no somos capazes
de aliment-los de forma adequada e amigvel, com facilidade.

5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de Computadores:
Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. Mcgraw-Hill Book
Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.

226

Unidade VI - Estrutura de Controle Condicionais


1. Situando a temtica
Vimos anteriormente que existem vrias linguagens de programao. Algumas delas se parecem muito. A
linguagem PHP, por exemplo, foi inspirada na linguagem C. A propsito, a linguagem PHP muito utilizada
na criao de pginas dinmicas na Internet. No o caso da linguagem C.
Dando continuidade aos conceitos bsicos de programao, veremos agora os condicionais, tambm
conhecidos como condio ou seleo . Esse conceito utilizado para selecionar que trecho de um
programa deve ser executado sob certas condies. Sem as condies os programas de computador teriam
um comportamento "retilneo", isto , no seria possvel a realizao de determinadas operaes que
envolvem testes de variveis.

2. Problematizando a temtica
Uma condio o resultado de um teste de comparao. Imaginemos que um programa deve executar a
funo A ou a funo B de acordo com o valor da mdia aritmtica calculada a partir de trs notas. Se o valor
da mdia for maior ou igual a 7, ento deve ser executada a funo A, caso contrrio deve ser executada a
funo B. Assim, em que condio deve ser executada a funo A? Obviamente essa funo dever ser
executada se o resultado da comparao entre a mdia calculada e o valor 7 for "a mdia superior ou igual a
7".
Os smbolos de comparao utilizados na linguagem C so listados na tabela abaixo.
Smbolo Significado
==

igual a

>

superior a

<

inferior a

>=

superior ou igual a

<=

inferior ou igual a

!=

diferente de

Ateno especial necessria para a comparao de igualdade. Note que o


smbolo de comparao formado por dois smbolos de atribuio (==). Um
erro comum entre os iniciantes consiste em fazer essa comparao utilizando
um nico smbolo de atribuio, o que evidentemente no um teste de
igualdade em C.
As condies so representadas em C por estruturas de controle ditas
estruturas de seleo, implementadas pelas instrues if e switch.

3. Conhecendo a temtica
3.1 A estrutura if ... else
O teste if
Este teste consiste em realizar uma operao de comparao e indicar o que deve ser feito quando o resultado
da comparao verdadeiro. Isto codificado assim:
onde expr uma expresso de comparao. A parte do programa escrita entre
as chaves { e } denominada um bloco de instrues, tambm chamada
simplesmente bloco. A semntica dessa instruo : se o valor da expresso
expr for True (verdadeiro), ento o computador dever executar o bloco de
instrues pertencente instruo e, em seguida, executar a prxima
instruo aps o if. Caso o valor da expresso condicional seja False (falso),
a prxima instruo aps o if ser executada.
Graficamente, a semntica deste teste representada assim:
if (expr)
{
Bloco de instrues
}
prxima instruo

.....
expr

True

False
prxima instruo

227

Bloco

Problema1. Testar a varivel idade, correspondente idade de uma pessoa. Se o valor dessa idade for maior
do que ou igual a 18, imprimir uma mensagem informando esse fato.
if (idade>=18)
{
printf( voce eh maior de idade ) ;
}
prxima instruo;

Observao. Quando h somente uma instruo entre as


chaves, estas se tornam facultativas. Pode-se ento escrever:
if(idade>=18)
printf( voce eh maior de idade ) ;
prxima instruo;
#include <stdio.h>
int main()
{
long idade = 25;
if (idade >= 18)
{
printf("Voce eh maior de idade!\n");
}
system("PAUSE"); // ou getch()
return 0;
}

Eis ao lado um cdigo completo (cdigo1) que pode ser


testado.
Este cdigo pode servir de base para testar os exemplos
dos prximos testes. No deixe de faz-los.

Uma questo de legibilidade


A disposio das chaves no muito importante. O programa funcionar tambm se voc escrever assim
if(idade>=18) {printf("Voce eh maior de idade!\n");}, mas vemos claramente que a disposio anterior
mais legvel. Essa a recomendao do estilo C.
O teste else o uso de else para dizer "caso contrrio"
Agora que sabemos fazer um teste simples, hora de ir um pouco mais longe. Se o teste no funcionar, isto
, se o resultado da avaliao da expresso de comparao for False e a soluo que est sendo codificada
exigir que seja dito explicitamente ao computador o que fazer, trata-se de outro tipo de teste: if ... else. Para
codificar este teste basta adicionar aps o bloco correspondente ao resultado True, outro bloco, agora
precedido da palavra reservada else. Esse bloco conhecido como bloco else. Por exemplo,
Se o resultado da expresso de comparao for verdadeiro
(True), ser executada a instruo printf("voce eh maior
de idade") e a execuo do programa far um salto para
"prxima instruo". Se o resultado for falso (False), ser
executada a instruo printf("voce eh menor de idade") e a
execuo do programa continuar em "prxima
instruo". Observe que apenas um dos blocos de
instrues executado. A execuo de um impede a
execuo do outro.
Relembrando! De modo geral, o que executado quando
o resultado da expresso de comparao verdadeiro
denomina-se Bloco True e o que executado quando esse resultado falso, denomina-se Bloco False. Um
bloco constitudo por uma ou mais instrues. Quando um bloco possui apenas uma instruo, o uso das
chaves facultativo.
if (idade>=18)
{
printf("voce eh maior de idade ") ;
}
else
{
printf("voce eh menor de idade") ;
}
prxima instruo;

Graficamente a semntica deste teste representada assim:

....
expr

True

False
Bloco
False
prxima instruo

228

Bloco
True

O teste else if ... para dizer "caso contrrio, se ..."


Quando o primeiro teste no funcionar e a situao exigir, Bloco False poder conter outro if ... else.
Vejamos o exemplo a seguir.
if (idade >= 18)
{
printf("voce eh maior de idade");
}
else if ( idade >= 12 )
{
printf("voce eh um adolescente");
}
else
{
printf("Paciencia, voce ainda eh uma criana");
}
prxima instruo

O computador faz os testes em ordem.


1. se a expresso (idade>=18) avaliada True, a
instruo printf("voce eh maior de idade");
executada e o controle da execuo passa
para prxima instruo.
2. se a expresso (idade>=18) avaliada False,
o Bloco Else executado. Notar que esse
bloco um if ... else. Assim, a segunda
expresso de comparao (idade > 12)
avaliada. Se True, printf("voce eh um
adolescente"); executada. Se False,
printf("Paciencia, voce ainda eh uma
criana"); executada. Em qualquer dos
casos, aps a execuo de printf, prxima

instruo ser executada.


Ateno! O else e o else if no so obrigatrios, mas geralmente facilitam o modo de escrever e tornam o
programa mais legvel.
Graficamente a semntica deste teste representada assim:

.....
expr

True

Bloco
True

True

Bloco
True

False
expr
False
Bloco
False

prxima
instruo
Problema2. Ler um valor inteiro n e imprimir a mensagem "n pertence ao
intervalo i", onde i = 1, 2, 3 ou 4 de acordo com a tabela ao lado.
Uma soluo pode ser o cdigo abaixo. Observar o modo como feito o teste de
pertinncia a um intervalo. Este no o nico modo, logo sero vistos outros.
Procure entender bem o funcionamento desses testes, pois esse entendimento
indispensvel para a seqncia do curso.

229

i
1
2
3
4

intervalo
n<0
0 n < 20
20 n <100
n >= 100

#include <stdio.h>
int main()
{
long n;
printf("Digitar um valor inteiro. \n");
scanf("%d",&n);
printf("valor de n = %d\n",n);
/**** testar a pertinncia a um intervalo ****/
if(n<0) // n pertence ao intervalo 1?
{printf("%d pertence ao intervalo 1\n",n);}
else if(n<20) // n pertence ao intervalo 2?
{printf("%d pertence ao intervalo 2\n",n);}
else if (n<100) // n pertence ao intervalo 3?
{printf("%d pertence ao intervalo 3\n",n);}
else {printf("%d pertence ao intervalo 4\n",n);}
printf("Saida do IF\n");
system("pause"); // ou getch();
return 0;
}
Teste com vrias condies
Para realizar testes com vrias condies, necessrio o emprego de alguns conectivos lgicos.
Consideremos uma afirmao que, sem ambigidade, apenas pode ser verdadeira ou falsa. Uma afirmao
desse tipo denominada uma proposio. Pois bem, os conectivos lgicos so empregados na realizao de
operaes sobre proposies. Alguns exemplos de proposies:
3 maior do que 2
5 maior do que 10 (no precisa ficar assustado, esta uma proposio falsa)
H vida fora da Terra (mesmo que no se consiga provar, o resultado dessa afirmao s pode ser
verdadeiro ou falso, logo se trata de uma proposio)
Existem algumas afirmaes que no so proposies, por exemplo, esta afirmao falsa. As
proposies so objetos de estudo de um ramo da matemtica denominado Clculo Proposicional. No h
necessidade de preocupao neste momento com a teoria das proposies, pois as que sero vistas neste texto
so de compreenso natural e imediata, geralmente so afirmaes matemticas corriqueiras.
As tabelas abaixo mostram os principais conectivos dessa lgica.
Conectivo NOT
(smbolo: !)
A
!A
True
False
False
True

A
True
True
False
False

Conectivo AND
(smbolo: &&)
B
A && B
True
True
False
False
True
False
False
False

Conectivo OR
(smbolo: ||)
A
B
A || B
True
True
True
True
False
True
False
True
True
False
False
False

Essas tabelas se tornaro mais compreensveis com os exemplos a


seguir.

230

Teste AND
Para saber se o valor de n pertence ao intervalo 2 do problema anterior (0 n < 20) basta escrever: if(n>=0
&& n<20) ... Em portugus se diria: se n maior do que ou igual a 0 e menor do que 20 ... Trata-se de uma
condio composta. Ela ser verdadeira apenas se as duas condies envolvidas forem verdadeiras.
Teste OU
Para saber se uma pessoa possui mais de 20 anos ou se o seu saldo bancrio superior a 5000 reais basta
escrever: if(idade>20 || saldo>5000) ... Observe que se pelo menos uma das condies for verdadeira ento a
condio composta tambm o ser.
Teste NOT
Para saber se uma pessoa no menor de idade basta escrever: if(!(idade>=18)) ... Observe que se a
condio (idade>=18) verdadeira a sua negao (!(idade>=18)) falsa. A comparao !(idade>=18)
corresponde em portugus expresso idade no maior ou igual a 18.
3.2 Alguns erros comuns

Uso de = em teste de igualdade. Para testar se uma pessoa tem exatamente 18 anos, devemos
escrever if(idade == 18)
Uso de ponto-e-vrgula no fim da linha que contm um if. Lembrar que if um teste de condio.
Coloca-se ponto-e-vrgula no fim de uma instruo e no de um teste de condio.

3.3 Para melhor compreender as condies


Acompanhe o cdigo abaixo.
#include <stdio.h>
int main()
{
if (0)
{
printf("falso");
}
else
{
printf("verdadeiro");
}
system(pause);
}

A execuo deste cdigo com as modificaes indicadas para if(expr)


fornecer os seguintes resultados:
expr
resultado
0
falso
1
verdadeiro
2
verdadeiro
5
verdadeiro
Resumindo, quando a expresso comparao vale 0 o resultado de sua
avaliao False e para qualquer outro valor dessa expresso a sua
avaliao True. Por isso os resultados obtidos acima. De fato, toda vez
que a linguagem C realiza um teste, ela devolve o valor 1 quando o
resultado verdadeiro e 0 quando o resultado falso.

Atribuir o resultado de uma comparao a uma varivel


Acompanhe o cdigo abaixo.
#include<stdio.h>
int main()
{
int p = 14;
int b = 10;
b = (p >= b);
printf("b = %d\n", b);
system(pause);
}

A comparao p >= b retorna o nmero 1, pois ela verdadeira.


Assim, b passa a valer 1, como resultado da atribuio. Isso
pode ser verificado com o resultado exibido por printf.
Experimente mudar o valor de b para 20 no cdigo ao lado. O
resultado exibido deve ser 0, pois desta vez o teste falso.

Um valor boolean
Importante! A varivel b do cdigo acima representa um valor boolean. Diz-se que uma varivel que s pode
receber os valores 0 ou 1 do tipo boolean. Na verdade, em C no existe este tipo. H uma conveno na
linguagem C de modo que 0 associado ao boolean False e qualquer outro valor associado ao boolean

231

True. Em C++, a linguagem C orientada a objeto, um novo tipo foi criado especialmente para conter esses
valores. Em C, geralmente as variveis que guardaro valores boolean so declaradas do tipo int.
Os valores Booleans nas condies
Geralmente fazemos testes sobre variveis booleans. Se a varivel "maior" vale 1 ou qualquer outro valor
diferente de 0 e temos a instruo if(maior) {printf(maior de idade)}; ... o resultado exibido a expresso
maior de idade, pois a varivel "maior" diferente de zero, portanto True. Quando sabido que a varivel
pode conter um nmero fazemos o teste na forma if(varivel == 1). Se a varivel s pode conter os valores
0 ou 1, fazemos o teste na forma if(varivel). Sempre que possvel, bom encurtar os caminhos.
3.4 A estrutura switch
A condio "if... else" o tipo de condio mais utilizada. Entretanto, quando existem muitas comparaes a
serem feitas podemos utilizar outro tipo de estrutura: switch. Analise o seguinte trecho de programa

if (idade == 2)
{ printf("Ola bebe!");}
else if (idade == 6)
{ printf("Oi crianca!");}
else if (idade == 12)
{ printf ("Oi jovem!");}
else if (idade == 16)
{ printf ("Oi adolescente!");}
else if (idade == 18)
{ printf ("Salve adulto!");}
else if (idade == 68)
{ printf ("Ola vovo !");}
else
{ printf ("????????????? ");}

Existem seis comparaes a serem feitas. Para no repetir essas comparaes, nova forma de represent-las
foi desenvolvida. O trecho de programa abaixo mostra essa nova forma.

switch (idade)
{
case 2: printf ("Ola bebe!");
break;
case 6: printf ("Oi crianca!");
break;
case 12: printf ("Oi jovem!");
break;
case 16: printf ("Oi adolescente!");
break;
case 18: printf ("Salve adulto!");
break;
case 68: printf ("Ola vovo!");
break;
default: printf ("?????????????");
break;
}

232

Sempre que possvel, bom escrever utilizando o comando switch, mais prtico. necessrio colocar uma
instruo break, obrigatoriamente ao fim de cada caso. Esquecer de faz-lo faz com que o computador
continue a executar as instrues seguintes, o que no faz parte da lgica da instruo switch.
Enfim, o caso "default" corresponde ao else j visto. Se a varivel no vale nenhum dos valores testados
acima o computador executa esta opo.
Exemplo de um menu
O programa abaixo pode ser utilizado como modelo para a construo de outros menus.
// em um restaurante
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
long menu;
printf("=== Menu ===\n\n");
printf("1. Pao com queijo\n");
printf("2. Pao com manteiga\n");
printf("3. Cuscus\n");
printf("4. Ovo frito\n");
printf("\n Sua escolha? ");
scanf("%d", &menu);
printf("\n");
switch (menu)
{
case 1:
printf("Voce escolheu Pao com queijo!");
break;
case 2:
printf("Voce escolheu Pao com manteiga!");
break;
case 3:
printf("Voce escolheu Cuscus!)");
break;
case 4:
printf("Voce escolheu Ovo frito!");
break;
default:
printf("Voce no fez a escolha correta!");
break;
}
printf("\n\n");
system("PAUSE");
}
3.5 Condies condensadas
Existe ainda um terceiro modo de programar uma comparao, ainda que pouco utilizado. Trata-se da
condio condensada. como um if else s que tudo em uma mesma linha. Observar atentamente os dois
trechos de programa abaixo:

233

Um teste if ... else


Se a varivel maior for avaliada como True, isto , se for diferente de zero, ento a varivel idade receber o
valor 18, caso contrrio receber o valor 17.
if (maior)
idade = 18;
else
idade = 17;
O mesmo teste, condensado
A semntica desta instruo idntica do comando if ... else. Se maior for diferente de 0 (True), idade
recebe o valor 18. Se maior possui o valor 0, ento idade recebe o valor 17. Trata-se apenas de uma forma
condensada de escrever a estrutura if ... else.
idade = (maior) ? 18 : 17;
3.6 Teste
1. O que significa o smbolo <= ?
( ) Superior ( ) Inferior ( ) Superior ou igual ( ) Inferior ou igual ( ) Diferente de
2. Se a varivel n vale 0, o que exibido pelo trecho de programa abaixo?
if (n != 0)
printf ("Siga em frente.");
else
printf ("Aguarde um pouco.");

( ) Siga em frente.

( ) Aguarde um pouco

3. Observe o trecho de programa abaixo. O que ser impresso?


int temDinheiro = 0, maior = 0;
long dinheiroEmBolso = 10000, idade = 19;
...
temDinheiro = dinheiroEmBolso > 10000;
maior = !(idade < 18);
if (temDinheiro && maior)
printf ("Pode abrir conta em banco!");
else
printf ("Impossivel abrir conta");

( ) Pode abrir conta em banco!


( ) Impossivel abrir conta

4. Qual o problema na instruo abaixo?


switch (k)
{
case 5:
printf ("Bom dia");
case 12:
printf ("Boa tarde");
default:
printf ("Ate logo");
}

( ) faltam as instrues break


( ) falta um ponto-e-vrgula no fim de switch
( ) faltam as chaves em cada "case"
( ) "case default" e no "default"

234

5. Quanto valer a varivel resp aps as instrues abaixo? A varivel a vale 200 e b um Boolean que vale
False.
resp = (b || a >= 200) ? 20 : 30;
resp = (resp == 20 && (b && a >= 200)) ? 40 : 50;
( ) 20

( ) 30

( ) 40

( ) 50

4. Avaliando o que foi construdo


Compreender bem as estruturas de seleo uma condio indispensvel para escrever bons programas.
Parece que tudo indispensvel, no? Mas assim mesmo. Existe uma seqncia lgica no aprendizado de
uma linguagem de programao. como na matemtica. praticamente impossvel calcular uma derivada,
conscientemente, se no conhecemos os conceitos de funo, limites e de continuidade. Como veremos a
seguir, as estruturas de repetio traro embutidas estruturas de seleo.

5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de Computadores:
Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill Book
Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.

235

Unidade VII - Estruturas de Controle (Repeties)


1. Situando a temtica
Aps termos visto como realizar uma operao de seleo chegado o momento de entendermos as
repeties ou "laos". O que um lao? Trata-se de uma tcnica que permite repetir as mesmas instrues
vrias vezes. Da mesma forma que para as comparaes, existem vrias formas de realizar os laos.
Veremos trs dessas formas.
while
do ... while
for
Os laos, em geral, funcionam assim:
1. O computador executa as instrues de cima para baixo (como de hbito)
2. Ao atingir o fim do lao, retorna para a primeira instruo deste.
3. Pode haver saltos para fora do lao
4. Existe uma condio embutida nos laos
5. Essa condio controla a repetio das instrues e a sada do lao

instrues
instrues
..................
instrues
A existncia da condio nos laos necessria para impedir que as instrues fiquem sendo executadas
indefinidamente. Ento, ao criarmos um lao, criamos tambm, implicitamente, uma condio. A condio
significa: repetir este lao enquanto (at que) a condio seja verdadeira .

2. Problematizando a temtica
Suponhamos que necessitemos imprimir todos os nmeros naturais de 1 at 100. Uma maneira de faz-lo
chamarmos 100 vezes a funo printf tendo como argumento em cada chamada o nmero natural desejado.
uma soluo, mas com certeza a menos indicada. Imagine se tivssemos de imprimir os 1000 primeiros
nmeros naturais. As repeties nos oferecem um modo confortvel de realizarmos esta tarefa, como
veremos.

3. Conhecendo a temtica
3.1 O lao while
A estrutura de um lao while
while ( <condio> )
{
Bloco de instrues
}

Sua interpretao muito simples: enquanto a condio for


avaliada True, o bloco de instrues do lao executado.
Quando a condio for avaliada False, o controle do programa
passa para a prxima instruo, fora do lao. Evidentemente,
pode ser que as instrues do lao no sejam executadas
nenhuma vez. Por qu?

Exemplo1. Faamos um pequeno teste: escrever um programa que leia um nmero


inteiro a partir do teclado. Enquanto esse nmero no for negativo, voltar a ler um
nmero inteiro a partir do teclado.

236

Ao executar este programa entremos com os


seguintes nmeros:

#include<stdio.h>
main()
{
int n=0;
while (n>=0)
{
printf("Digitar um numero positivo ou nulo: ");
scanf("%d", &n);
}
printf("Obrigado! \n") ;
system(" pause ") ;
return 0 ;
}

Digitar um numero positivo ou nulo: 13


Digitar um numero positivo ou nulo: 21
Digitar um numero positivo ou nulo: 143
Digitar um numero positivo ou nulo: -3
Obrigado!

O programa continuar executando as instrues do lao enquanto o valor digitado for positivo ou nulo e
sair do mesmo to logo seja digitado um nmero negativo.
Graficamente, a semntica da instruo while pode ser representada assim:

condio

prxima
instruo

false

true
Bloco de
instrues

Semntica While
Vamos fazer algo mais interessante, executar um lao certo nmero de vezes. Para isso deve-se criar uma
varivel que "contar" o nmero de vezes que o lao ser executado. Essa varivel dever valer 0 antes do
lao e ser incrementada dentro deste cada vez que o mesmo for executado. A operao "incremento" como
sabemos, consiste em aumentar de 1 o valor de uma varivel. Por exemplo, x++ incrementa o valor da
varivel x de uma unidade.
Exemplo2. Imprimir (exibir na tela) os nmeros inteiros a partir de 0 at 9.

Acompanhe o trecho de programa abaixo. Completando este trecho de programa, teremos a seguinte sada
(experimente faz-lo):
....................
long cont = 0;
while (cont < 10)
{
printf("cont = %d\n ",cont);
cont++;
}
.....................

cont = o
cont = 1
cont = 2
cont = 3
cont = 4
cont = 5
cont = 6
cont = 7
cont = 8
cont = 9

237

Procure explicar como isto aconteceu. Ao compreendermos o que se passou poderemos nos divertir
aumentado o valor do limite 10 para 100, 1000, etc.

Ampliando o seu Conhecimento

Ateno com os laos infinitos


Ao criarmos um lao temos que ter a certeza de que ele ir parar em algum momento. Observemos que
neste tipo de lao se a condio sempre verdadeira, o programa nunca pra.
Exemplo de um lao infinito.
while (1)
{
printf("laco infinito\n");
}

Lembremo-nos dos booleans: 1 = True, 0 = False. Aqui a condio


sempre verdadeira, portanto o programa imprimir a frase "lao
infinito" sem parar. Na verdade a interveno humana pode parar
este programa bastando teclar Ctrl + C.

Evitemos a todo custo cairmos em um lao infinito, a menos que este seja o nosso propsito. s vezes esses
laos so necessrios. Na programao de jogos, por exemplo.
3.2 O lao do ... while
Este tipo de lao bastante similar ao lao while, porm menos utilizado. A diferena entre as duas
instrues est na colocao fsica da condio dentro dos laos. Neste tipo de lao a condio aparece aps
o bloco enquanto que em while a condio colocada antes do bloco. Isto quer dizer que as instrues
internas ao lao do ... while so executadas pelo menos uma vez.
Graficamente, a semntica da instruo do ... while pode ser representada assim:

Bloco de
instrues

true

condio

false

prxima
instruo

Semntica Do ... While


Exemplo3. Resolver o mesmo problema de Exemplo2, agora utilizando a instruo do
... while.

.....................
long cont = 0;
do
{
printf("cont = %d\n",cont);
cont++;
} while (cont<10);
.....................

Uma soluo para este problema dada pelo trecho de programa


ao lado. Complete-o e verifique que a sua sada igual do
Exemplo1.
Qual a diferena operacional entre este programa e aquele do
Exemplo2? Muito simples, no programa do exemplo2 o bloco de
instrues poder nunca ser executado bastando para isto que a
condio seja falsa no incio. Caso o valor de cont seja

238

inicializado com 30, por exemplo, a condio ser falsa na primeira vez em que for avaliada. No programa
do exemplo3 o bloco de instrues ser executado pelo menos uma vez. responsabilidade do programador
gerenciar bem a execuo dos laos.
Para no esquecer! No devemos esquecer de colocar ponto-e-vrgula no fim da instruo do ... while. Este
esquecimento um erro comum entre os principiantes.
3.3 O lao for
Em teoria, o lao while permite realizar todas as repeties que algum deseje programar. Entretanto, como
para as condies, existe uma forma condensada, mais rpida para escrever: o lao for. Os laos for, que
sero vistos nesta seo, e os laos while so os mais utilizados em programao.
Estudaremos o lao for a partir de um exemplo.
Exemplo4. Resolver o mesmo problema de Exemplo2, agora utilizando a instruo
for.

Uma soluo para este problema dada pelo trecho de


programa ao lado. Complete-o e verifique que a sua sada
igual do Exemplo2.

.............................
long cont;
for (cont = 0; cont < 10; cont++)
{
printf("cont = %d\n",cont);
}
...............................

O lao for outra forma de escrever um lao while.


Algumas observaes

A varivel cont no foi inicializada a zero quando de sua declarao, mas poderia ter sido.

No h mais incremento cont++ dentro do bloco de instrues

Vejamos o que h entre os parnteses pois l que se encontra todo o interesse do lao for. Na verdade,
existem trs instrues, separadas por vrgulas, dentro desses parnteses:

A inicializao: esta instruo utilizada para preparar a varivel cont. Em nosso caso, ela foi
inicializada com zero.

A condio: como para o lao while, a condio que diz se o bloco deve ser repetido. Enquanto a
condio for verdadeira o bloco executado.

O incremento: esta ltima instruo executada ao fim de cada execuo do bloco para atualizar a
varivel de controle. s vezes utilizado um decremento no lugar de um incremento. s vezes
tambm, se utiliza outras operaes como cont += 2; para avanar de 2 em 2, por exemplo.

Enfim, o lao for ser muito til. Saibamos utiliz-lo bem.


3.4 Teste
1. Qual destes laos no existe em C?
( ) for

( ) repeat

( ) do.. while

( ) while

239

2. Quantas vezes a mensagem "Estude Matematica" ser exibida?


long cont = 12;
do
{
printf ("Estude Matematica\n");
cont++;
} while (cont < 13);
( ) 0 vezes ( ) 1 vez

( ) 2 vezes

( ) 12 vezes

( ) 13 vezes

3. Quantas vezes a mensagem "Sistemas operacionais" ser exibida?


long cont = 10;
while (cont < 11)
{ printf ("Sistemas operacionais\n"); }
( ) 0 vezes

( ) 1 vez

( ) 14 vezes

( ) 15 vezes

( ) infinitas vezes

4. Qual dos laos for poderia exibir as mensagens seguintes?

(
(
(
(

Linha n1
Linha n3
Linha n5
Linha n7
) for (cont = 1; cont < 9 ; cont += 2)
) for (cont = 1; cont <= 7 ; cont ++)
) for (cont = 0; cont < 9 ; cont += 2)
) for (cont = 1; cont < 8 ; cont ++)

E para concluir, um lembrete que todos compreendero, com certeza.

#include<stdio.h>
int main()
{
int cont = 0;
for(cont=1; cont<=100; cont++)
printf("Eu devo entregar minhas tarefas em dia.");
}
4. Avaliando o que foi construdo
As estruturas de repetio facilitam bastante a realizao das tarefas, como visto. preciso que o
programador esteja familiarizado com essas estruturas, pois elas so necessrias na maioria dos programas
que so desenvolvidos. Com os conhecimentos adquiridos at aqui o aluno capaz de programar a soluo
de boa parte dos problemas numricos. Esses recursos sero complementados na prxima unidade com o
estudo das funes.

5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de Computadores:
Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill Book
Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.

240

Unidade VIII - Funes


1. Situando a temtica
Conclumos a parte dos conhecimentos bsicos da linguagem C com esta noo fundamental que so as
funes. Todos os programas em C se baseiam sobre este princpio. Aprenderemos a estruturar um programa
em pequenas partes. Um programa grande em C feito de pequenas partes que so encaixadas
adequadamente formando um todo. Essas partes so as funes.
Lembremos a estrutura de um programa em C.

# include < stdio.h >


Diretivas de pr processador
# include < stdlib.h >
int main(int argc, char * argv[])

funo
system("pause" );

return 0;

}
As diretivas de pr-processador comeam sempre por # e so geralmente colocadas no incio do arquivo
fonte. Em seguida aparece a funo main, a funo principal de todo programa. Nas unidades anteriores
permanecemos sempre dentro desta funo, ou seja, todos os clculos e outros processamentos foram feitos
no interior da funo main. Na prtica, quase nenhum programa escrito unicamente dentro da funo main.
Vamos ento aprender a dividir a soluo de um problema em vrias partes, cada uma dessas partes ser uma
funo.

2. Problematizando a temtica
Um programa que realiza vrias tarefas pode ser escrito como uma nica funo, a funo principal, main.
Entretanto, essa estratgia torna o programa difcil de ser lido e mesmo desenvolvido. Por isso, costume
dos analistas subdividirem um problema complexo em subproblemas, menos complexos obviamente, e
resolver cada um desses por meio de uma funo. Esse mtodo conhecido como dividir para conquistar.
Aprenderemos a programar essas unidades de programa agora.

3. Conhecendo a temtica
3.1 Objetivo de uma funo
Uma funo executa aes e retorna um resultado. As aes realizadas por uma funo dependem,
geralmente, de alguns parmetros iniciais denominados de entrada e o resultado produzido denominado
sada.
Esquematicamente, podemos representar uma funo assim:

entrada

sada

Processamento
Funo

Uma funo ento um elemento lgico de programao que comporta trs etapas:

241

1. Entrada: informaes necessrias ao processamento so passadas funo.


2. Processamento: operaes realizadas, geralmente a partir das entradas.
3. Sada: terminado o processamento, a funo retorna um resultado.
Imaginemos uma funo que calcule a soma de dois valores inteiros. Podemos represent-la
esquematicamente como abaixo, onde a e b so valores inteiros.
a
a

Somar a e b

a+b

Em geral as funes so mais complexas que o exemplo acima, mas esses so os conceitos a conservar:
entrada de parmetros, processamento a ser realizado e sada do resultado produzido.
3.2 A estrutura de uma funo
A estrutura de uma funo bem simples. Vejamos um modelo.
tipo nomedaFuno(parmetros)

Algumas consideraes:

{
instrues
}

tipo: tal como as variveis, toda funo possui um


tipo. O tipo de uma funo indica o tipo do resultado
que ela retornar. Mas existe funo que no retorna
valor algum para o programa que a chamou. Neste
caso a funo dever ser de um tipo especial void

significando esse fato;


nomedaFuno: o nome da funo, evidentemente, e deve obedecer s mesmas regras que os
nomes de variveis;
parmetros: uma lista de parmetros entre parnteses, separados por vrgula, que contm as
entradas necessrias ao processamento da funo. Uma funo pode conter qualquer nmero de
parmetros, dependendo da lgica e do bom senso do programador.
{ ... }: aps o cabealho da funo (tipo, nome e parmetros), segue um par de chaves que contm o
corpo da funo, as instrues que a compem.

3.3 Criando uma funo


Vamos escrever a funo que soma dois valores inteiros, vista anteriormente e dar-lhe o nome soma2.
Eis a nossa primeira funo. O que vemos nessa funo?
long tipo dos parmetros e de retorno da funo, por isso a
varivel resposta tambm desse tipo
soma2 o nome dado funo
return instruo que indica funo para retornar um resultado
ao programa que a chamou. Esta instruo geralmente se encontra
no fim da funo. Como a varivel resposta declarada dentro do
corpo da funo, seu escopo ser a prpria funo. O escopo de
uma varivel o seu campo de abrangncia (onde ela vlida). Uma varivel declarada assim chamada
local e no pode ser utilizada fora da funo onde declarada. A varivel resposta ento uma varivel local
funo soma2.
A funo soma2 definida acima, ser chamada de dentro da funo principal (main) de um programa.
long soma2(long p1, long p2)
{
long resposta = 0;
resposta = p1+p2;
return resposta;
}

242

3.4 Chamando uma funo


#include<stdio.h>
long soma2(long p1,long p2)
{
long resposta = 0;
resposta = p1+p2;
return resposta;
}
int main()
{
long a,b, soma;
printf("\n digite um valor para a = ");
scanf("%d",&a);
printf("\n digite um valor para b = ");
scanf("%d",&b);
soma=soma2(a,b);
printf(" soma = %d\n", soma);
system("pause");
ret rn 0;

Para chamar uma funo a partir da funo main ou de qualquer


outra funo, basta escrever o seu nome em uma expresso ou
como um parmetro em um comando printf.
No programa ao lado a funo soma2 est sendo chamada a
partir da funo main. Observe que o nome da funo aparece
em uma expresso, do lado direito de um comando de
atribuio. O nome de uma funo nunca pode aparecer do lado
esquerdo em uma atribuio. Lembre que uma atribuio do
tipo varivel = expresso.

Uma funo pode chamar outra, que pode chamar outra, etc.
Cabe ao programador no perder o domnio sobre a execuo do
cdigo.
Os parmetros declarados no cabealho de uma funo so ditos
parmetros formais, pois servem apenas para dizer ao
compilador o tipo e a ordem em que os parmetros efetivos
sero transmitidos funo. Parmetros efetivos so aqueles
que aparecem na chamada da funo. No programa acima os
parmetros efetivos so a e b e os parmetros formais so p1 e
p2. Os parmetros efetivos e os formais podem ter os mesmos nomes, porm representam identificadores
distintos.
Ampliando o seu Conhecimento
Prottipo de uma funo. O prottipo de uma funo o seu cabealho
seguido de ponto-e-vrgula.
Exemplo. long soma2(long p1,long p2);
Um prottipo pode tambm indicar apenas os tipos dos parmetros:
Exemplo. long soma2(long,long);
Na definio da funo os parmetros formais sero explicitados.

Uma funo pode ser definida tambm aps a funo principal. Neste caso, o seu prottipo deve ser
declarado antes da funo main. Aps a funo main coloca-se ento a funo que est sendo definida.
Usar ou no os prottipos uma deciso do programador. O seu uso indica ao compilador que a funo por
ele representada ser definida (codificada) aps a funo main. Caso uma funo seja codificada aps a
funo main, sem o uso de prottipo, o compilador acusar um erro, pois quando o nome da funo aparecer,
pela primeira vez, na funo main, ele no o reconhecer como nome de uma funo e o tratar como uma
varivel no declarada acusando, portanto erro por falta de declarao de varivel.

243

O exemplo anterior ficaria assim:


#include<stdio.h>
/* declarao do prottipo */
long soma2(long p1, long p2);
int main()
{
long a,b, soma;
printf("\n digite um valor para a = ");
scanf("%d",&a);
printf("\n digite um valor para b = ");
scanf("%d",&b);
soma=soma2(a,b);
printf(" soma = %d\n", soma);
system("pause");
return 0;
}
/* definio da funo soma2 */
long soma2(long p1,long p2)
{
long resposta = 0;
resposta = p1+p2;
return resposta;
}

Ampliando o seu Conhecimento


No somos obrigados a armazenar o resultado produzido
por uma funo em uma varivel. Podemos retornar esse
resultado na forma indicada de uma expresso. Vejamos,
#include <stdio.h>
long soma2(long p1, long p2)
{
return p1+p2;
}
Neste caso, no foi necessrio declararmos a varivel
resposta uma vez que no a utilizamos.
Tambm possvel chamar uma funo a partir de um
comando printf.
printf(" soma = %d\n", soma2(a,b));

Observe que acima a funo soma2 est sendo chamada a partir da lista de parmetros da instruo printf.
3.5 Mais exemplos
I. Converso Celsius/Fahrenheit
Lembremo-nos que a relao entre as escalas Celsius e Fahrenheit dada por:

C
F 32
. Ento, de
=
100
180

posse dessa informao vamos escrever uma funo que transforme uma temperatura dada em Celsius para
Fahrenheit. Escreveremos apenas a funo. Escreva o programa principal (a funo main).
/* funo converso: Celsius em Fahrenheit */

Antes de escrever a funo principal, responda ao


pequeno questionrio a seguir.

float converte(long C)
{
long F = 0;
F = 180*C/100+32;
return F;
}

1.
2.
3.
4.

Qual o parmetro formal, na funo converte?


Quantos parmetros efetivos devem existir na chamada da funo converte?
Qual o tipo do parmetro efetivo?
Como ser feita a chamada funo converte (comando de atribuio ou parmetro na funo
printf)?

Pronto! Agora s escrever a funo main.

244

II. Transformar segundos em horas, minutos e segundos


A funo abaixo transforma n segundos em horas, minutos e segundos. Essa funo no retornar nenhum
valor. Ela imprimir o resultado obtido sem a necessidade de retorn-lo para a funo main.
/* funo tempo: segundos em horas, minutos e segundos */
void tempo(int s)
{
int ss, mm, hh, t;
ss = s%60;
// resto da diviso de s por 60
t = s/60;
// quociente inteiro de s por 60
mm = t%60; // resto da diviso de t por 60
hh = t/60;
// quociente inteiro de t por 60
printf(%d segundos = %d horas, %d minutos e %d segundos, s,hh,mm,ss);
}
Antes de escrever a funo principal, responda ao pequeno questionrio a seguir.
1.
2.
3.
4.
5.

Qual o tipo da funo tempo?


Qual o parmetro formal, na funo tempo?
Quantos parmetros efetivos devem existir na chamada da funo tempo?
Qual o tipo do parmetro efetivo?
Como ser feita a chamada funo tempo (expresso ou parmetro na funo printf)?

Pronto! Agora s escrever a funo main. Uma dica: a chamada funo tempo pode ser assim tempo(n);.
III. rea de um retngulo
A rea de um retngulo dada por: largura * altura.
Nossa funo AreaRetangulo deve receber dois parmetros, largura e altura e retornar a rea calculada.
/* funo AreaRetangulo */

Escreva a funo main().

float AreaRetangulo(float larg, float alt)


{
return larg * alt;
}

Modifique a funo AreaRetangulo para que ela


imprima a rea calculada e no precise retorn-la
funo main.

IV. Um menu
Acompanhe o exemplo abaixo. Trata-se da elaborao de um menu, onde podemos escolher qual operao
ser executada: o clculo da rea de um crculo, de um quadrado, de um retngulo ou de um trapzio. Este
roteiro poder ser utilizado para a elaborao de outros menus. Basta fazer as adaptaes que se fizerem
necessrias.
/* funo menu */
long menu()
{
int escolha= 0;
while (escolha < 1 || escolha> 4)
{
printf("Menu :\n");
printf("1 : Para calcular a area de um circulo\n");
printf("2 : Para calcular a area de um quadrado\n");
printf("3 : Para calcular a area de um retangulo\n");
printf("4 : Para calcular a area de um trapezio\n");
printf("Sua escolha ? ");
scanf("%d", &escolha);
}
return escolha;
}

245

Texto da funo menu

int main(int argc, char *argv[])


{
float r,l, la, lb, area;
switch (menu())
{
case 1:
printf("Raio do circulo =");
scanf("%f",&r);
printf("\nArea = %f\n", 3.14*r*r);
break;
case 2:
printf("Lado do quadrado =");
scanf("%f",&l); area=l*l;
printf("\nArea = %f\n",area);
break;
case 3:
printf("Lados do retangulo\n");
printf("lado a = "); scanf("%f",&la);
printf("lado b = "); scanf("%f",&lb);
printf("\nArea = %f\n",la*lb);
break;
case 4:
printf("Bases do trapezio\n");
printf("base maior a = "); scanf("%f",&la);
printf("base menor b = "); scanf("%f",&lb);
printf("altura l = "); scanf("%f",&l);
printf("\nArea = %f\n",(la+lb)*l/2);
break;
}
system("PAUSE");
return 0;
}

Texto da funo main

3.6 Teste
1. O que acontece aps um return?

( ) A funo pra e retorna o resultado indicado


( ) A funo continua e retorna o resultado indicado
( ) A funo continua e no retorna resultado

2. Em que caso a instruo return no obrigatria?

( ) Quando a funo no possui parmetro de entrada


( ) Quando a funo de tipo void
( ) Quando a funo deve retornar zero

3. O que so os parmetros de uma funo?

( ) Indicaes sobre o nome da funo


( ) Indicaes sobre o valor que ela deve retornar
( ) Variveis que lhe so enviadas para serem usadas internamente

4. Qual das afirmaes falsa?

( ) Uma funo no obrigada a retornar um valor


( ) Uma funo pode retornar um valor de qualquer tipo de varivel
( ) Uma funo pode retornar vrios valores pela instruo return

246

5. O que h de errado na funo abaixo?


long quadrado(long num)
{
long resposta = 0;
resposta = num * num;
}

( ) A funo no retorna nenhum valor


( ) Falta um ponto-e-vrgula em algum lugar da funo

4. Avaliando o que foi construdo


As funes em linguagem de programao, como voc j percebeu, surgiram para facilitar a programao de
problemas considerados complexos. Esses problemas requerem uma soluo longa o que dificulta o seu
desenvolvimento e sua compreenso. Os programas so entes abstratos, frutos da imaginao. Por isso
mesmo no so fabricados, no sentido em que o so os produtos das engenharias convencionais, como uma
casa, um navio, etc. Assim, quando nos referimos a um programa de computador, sempre usamos o termo
desenvolvimento em lugar de fabricao. De fato, desenvolvemos uma soluo para um dado problema, um
algoritmo. nessa fase do projeto de soluo que o problema quebrado em subproblemas. A soluo de
cada subproblema ento implementada como uma funo. Mais uma vez, s as repeties, os exerccios,
conduzem ao domnio da tcnica.

5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de Computadores:
Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill Book
Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.

247

Unidade IX - Ponteiros
1. Situando a temtica
Nesta unidade estudaremos um novo tipo de dado, os ponteiros. Veremos como eles funcionam e para que
servem. quase impossvel hoje em dia escrever programas em C sem fazer uso dos ponteiros. Mesmo sem
saber ns j o utilizamos quando realizamos leituras com a funo scanf. A noo de ponteiros importante
para lidarmos com outro tipo de dado muito utilizado denominado array. Mesmo que o escopo deste texto
no cubra outros tipos de dados abstratos de grande utilizao na computao, importante saber,
principalmente para aqueles que pretendem avanar mais no estudo de resoluo de problemas com o uso de
computador, que vrios desses tipos de dados so implementados base de ponteiros. A ttulo de ilustrao
sobre esses tipos citamos: rvores e listas encadeadas.

2. Problematizando a temtica
Um problema estranho
Escrever uma funo que retorne 2 ou mais valores.
Isso parece ser "Impossvel"!
Sabemos que uma funo tem as seguintes caractersticas:
Retorna um nico valor ou no retorna valor algum
Se uma funo do tipo T ento ela retorna um valor do tipo T
Vamos adquirir os conhecimentos necessrios para solucionar problemas deste tipo.

3. Conhecendo a temtica
3.1 Um pouco mais sobre funes
Retomemos o problema de transformar segundos em horas, minutos e segundos, apresentado na unidade IX.
/* funo tempo: segundos em horas, minutos e segundos */
void tempo(int s)
{
int ss, mm, hh, t;
ss = s%60;
// resto da diviso de s por 60
t = s/60;
// quociente inteiro de s por 60
mm = t%60; // resto da diviso de t por 60
hh = t/60;
// quociente inteiro de t por 60
printf(%d segundos = %d horas, %d minutos e %d segundos, s,hh,mm,ss);
}
Observamos que a funo do tipo void, isto , no retorna valor algum. De fato, o resultado calculado
impresso na prpria funo. Por que no foi possvel retornar esses valores para a funo main?
Quando passamos uma varivel para uma funo, como argumento, uma cpia dessa varivel feita e
passada para a funo. Assim, se na funo main existir uma varivel de nome s, que represente o nmero
de segundos a ser transformado, a varivel s na funo tempo no a mesma que aquela de main. Trata-se
apenas de uma cpia. Tudo se passa da mesma forma caso as variveis correspondentes tenham nomes
distintos.

248

De modo geral, a transmisso de parmetros se passa assim:


int main()
int a,b,c
.....................
x = f(a,b,c);

int f(int x, int y, int z)

cpia
de c

cpia
de b

cpia
de a

Observemos que na funo main, ao ser executada a instruo x = f(a,b,c); so criadas cpias dos
parmetros reais (as variveis a, b e c) e essas cpias so passadas para a funo f. Na funo f, as cpias
transmitidas recebem os nomes x, y e z, respectivamente, parmetros formais. Assim, se alguma alterao
ocorrer nos valores de x, y ou z essa alterao no afetar os valores de a, b ou c, pois isso ocorreu apenas na
cpia dessas variveis ficando os seus originais intactos.
A soluo do problema proposto, como veremos, apenas um exemplo da utilidade dos ponteiros.
A memria e os endereos
Endereo

Valor

145

3.8028322

0.8272555

mais ou menos assim que podemos representar a memria principal


(RAM) de um computador. A memria composta de clulas. Cada
clula possui um nmero, seu endereo. A memria possui um grande
nmero de endereos, comeando sempre por 0. Em cada endereo
podemos armazenar UM e UM S nmero. Observemos tambm que
na memria podemos armazenar apenas nmeros. Ela no pode
armazenar letras, frases, etc. Para contornar esse problema foi inventada
uma tabela, denominada ASCII, j vista na unidade II.

Endereo e valor
Ao criarmos uma varivel soma do tipo long, por exemplo,
escrevemos:
...
...
long soma = 300; e o programa solicita ao sistema operacional
permisso para utilizar a memria. Como resposta o sistema operacional
n-1
940.5118
indica em qual endereo o programa pode armazenar um valor de tipo
long para a varivel soma. Alis, este um dos papis principais de um
sistema operacional, gerenciar a alocao de memria para os programas.
Voltemos nossa instruo. O valor 300 armazenado em alguma parte da memria, digamos no endereo
1540. A partir de ento, a palavra soma no programa substituda, via compilador, pelo endereo 1540. A
cada ocorrncia da palavra soma no programa, o computador verifica ento o endereo 1540. Para o
programador tudo bastante transparente. Basta escrever soma em uma expresso aritmtica, em uma
instruo de leitura (scanf) ou impresso (printf). Vejamos,

39014768

printf("A variavel soma vale: %d", soma);


Resultado na tela:

A varivel soma vale: 300

Sabemos exibir o valor de uma varivel, mas poderamos exibir o seu endereo? Para exibir o endereo de
uma varivel deve-se utilizar o especificador de formato %p (p da palavra ponteiro) na instruo printf. De
outro modo, enviamos funo printf no a varivel soma, mas seu endereo. E para fazer isso devemos
colocar o smbolo & antes do nome da varivel. J fazemos isto habitualmente quando utilizamos a funo
scanf. Ento para imprimir o endereo da varivel soma devemos escrever

249

printf("O endereo da variavel soma eh: %p", &soma);


Resultado na tela:

O endereo da varivel soma eh: 0023FF74

O que aparece na tela um nmero sim. Um nmero hexadecimal, no lugar dos nmeros decimais aos quais
estamos acostumados. Esse o endereo da varivel soma na memria do computador, designado pelo
sistema operacional como explicado acima.
Se trocarmos %p por %d na instruo printf acima obtemos um nmero decimal como sada. Entretanto, %p
foi implementado especialmente para exibir endereos, por isso preferimos esta notao.
Ateno! Ao executarmos um programa em computadores diferentes, o endereo de uma varivel ser
certamente diferente de um computador para outro. Isso depende dos programas que esto carregados na
memria dos computadores. No esqueamos que o sistema operacional que se encarrega de gerenciar a
memria. , portanto impossvel saber a priori em que endereo uma varivel ser alocada.
Em resumo,
soma: exibe o VALOR da varivel.
&soma: exibe o ENDEREO da varivel.
Com soma o computador l o valor da varivel na memria e reenvia esse valor. Com &soma, o
computador nos dir em que endereo se encontra a varivel.
3.2 Utilizao de ponteiros
At este ponto utilizamos variveis apenas para conter nmeros. A partir de agora vamos aprender a criar
variveis que contero endereos: exatamente a isto que chamamos de ponteiros. Ponteiro uma varivel
que contm um endereo.
Poderamos nos perguntar, mas os endereos no so nmeros tambm? Sim, mas neste caso esses nmeros
tm um significado particular: eles representam o endereo de outra varivel na memria.
I. Criar um ponteiro
Para criar uma varivel de tipo ponteiro, devemos colocar o smbolo * no incio do nome da varivel.
Exemplo.
Podemos tambm escrever:
long *nomeDoPonteiro;
long *p1, *p2, *p3;
long* p1, p2, p3;
Como temos visto ao longo deste curso, muito importante iniciarmos as variveis quando de suas
declaraes. ainda mais importante faz-lo com os ponteiros. Para iniciar um ponteiro devemos escrever:
A constante NULL indica que o ponteiro p1 no contm nenhum endereo. Essa
instruo reservar um espao na memria do computador como se estivssemos
criando uma varivel normal. A diferena entre uma varivel ponteiro e as outras
variveis j vistas que o contedo desta ser o endereo de outra varivel.
Exemplo. A primeira linha significa: "Criar uma varivel de tipo
long com valor 300". A segunda linha significa: "Criar uma varivel
long soma = 300;
de tipo ponteiro cujo valor o endereo da varivel soma".
long *pointSoma = &soma;
Observao. No existe um tipo ponteiro como existem os tipos
int, long, etc. Ento, no podemos escrever, por exemplo, ponteiro pointSoma; em seu lugar escrevemos
long *pointSoma; como visto acima. Isto quer dizer que a varivel pointSoma um apontador para uma
varivel de tipo long. Se a varivel soma fosse de tipo int, ento pointSoma deveria ser um apontador para
uma varivel de tipo int e escreveramos assim: int *pointSoma;
long *p1 = NULL;

250

Representao grfica.

soma

pointSoma

Endereo

Valor

145

3.8028322

135

300

39014768

15648

135

n-1

940.5118

No esquema ao lado verificamos que a


varivel soma est alocada na posio
135 da memria enquanto que a
varivel pointSoma esta alocada na
posio
15648
dessa
memria.
Observemos que o contedo da
posio 15648 exatamente o
endereo da varivel soma, isto , 135.
Esses valores variam de computador
para computador e a cada execuo do
programa.

Bem, acabamos de entrar no mundo maravilhoso dos ponteiros.


Estudemos o programa fonte abaixo:
/* ponteiros1*/
#include<stdio.h>
main()
{
int *pontx = NULL;
int x;
printf("Entre com um valor inteiro x: ");
scanf("%d",&x);
printf("\nendereco de x = %p",&x);
printf("\nvalor de x = %d",x);
pontx=&x;
printf("\nendereco de x = %d",pontx);
getch();
return 0;
}

pontx um ponteiro para uma varivel do tipo


int
&x o endereo da varivel x
pontx=&x; o endereo de x armazenado em
pontx (varivel ponteiro)

A atribuio do endereo de x a pontx poderia ter sido


feita assim tambm:
int *pontx = &x;
Execute o programa ponteiros1.
E como faramos para imprimir o contedo da varivel
apontada por pontx? Experimente incluir a instruo

abaixo no cdigo do programa ponteiros1.


printf("\nvalor de x = %d", *pontx);
Como podemos verificar pela execuo do programa ponteiros1, o valor impresso o mesmo que o de x.
Ento a expresso *variavelp onde variavelp uma varivel ponteiro, indica o contedo da varivel
apontada por variavelp. Em resumo, dado o trecho de programa abaixo, temos:

......................
int x=100, *p=NULL;
p=&x;

35846

100
p

16315

35846

x uma varivel de tipo int [valor de x = 100]

&x o endereo da varivel x [endereo de x = 35846]

p uma varivel que aponta para uma varivel de tipo int, seu valor um endereo [valor de p =
35846]

&p o endereo da varivel p [endereo de p = 16315]

251

*p indica o contedo da varivel apontada por p, isto , o valor de x [valor de *p = 100]

II. Enviar um ponteiro a uma funo


O grande interesse dos ponteiros, mas no o nico, consiste em envi-los a uma funo, como parmetro
claro, de modo que a funo possa modificar diretamente uma varivel em memria e no apenas sua cpia.
Como isto funciona? Vejamos um primeiro exemplo.

void triplicar(long *ponteiroN);


int main(int argc, char *argv[])
{
long numero = 20;
triplicar(&numero);
// Passa o endereo de nmero para a funo
printf("%d", numero);
// Exibe o valor de nmero
getch();
return 0;
}
void triplicar(long *ponteiroN)
{
*ponteiroN *= 3; // Multiplica por 3 o valor da varivel numero
}
A funo triplica possui um parmetro de tipo long* (isto , um ponteiro sobre o tipo long). Vejamos o que
se passa.
1. Uma varivel "numero" criada na funo main e lhe atribudo o valor 20.
2. A funo triplicar chamada e lhe passado o endereo da varivel numero.
3. A funo triplicar recebe esse endereo na varivel ponteiroN. O contedo da varivel ponteiroN
passa ento a ser o endereo de "numero".
4. Como a funo triplicar possui um ponteiro para a varivel numero, poder modificar diretamente o
valor dessa varivel na memria. Para isto basta utilizar *ponteiroN para designar a varivel numero.
Na funo triplicar utilizamos uma operao de multiplicao *ponteiroN *= 3; para multiplicar por
3 o valor de numero.
5. A instruo printf("%d", numero); na funo main imprimir 60 como o novo valor de numero.
O interesse na utilizao de ponteiros se justifica pelo fato de podermos modificar o valor de vrias variveis
na memria do computador, o que na verdade uma simulao do retorno de vrios valores por uma funo.
Ento, no estamos mais limitados a escrever funes que retornem um nico valor. Interessante no?
Enfim, tudo depende do programa que escrevemos. s vezes necessrio retornar um valor por uma funo,
um cdigo que dever ser testado na funo main, por exemplo.
III. Outro modo de enviar um ponteiro para uma funo
No cdigo fonte que vimos no havia ponteiro na funo main. Entretanto, possvel passar um ponteiro
para uma funo em sua chamada, como um parmetro real. Vejamos outra verso do programa anterior.

252

void triplicar1(long *ponteiroN);


int main(int argc, char *argv[])
{
long numero = 20;
long *p = &numero; // p recebe o endereo de numero
triplicar1(p); // envia p (endereo de numero) a funo triplicar1
printf("%d", *p); // exibe o valor de numero
getch();
return 0;
}
O importante que o endereo da varivel numero tenha sido passado para a funo triplicar1. A diferena
entre as duas verses que na primeira foi passado o endereo de numero para a funo triplicar e na
segunda um ponteiro foi transmitido. Na verdade, as duas verses fazem a mesma coisa, transmitem um
endereo.
No incio desta unidade dissemos que mesmo sem saber j utilizvamos o conceito de ponteiro. Agora
podemos passar isso a limpo. Trata-se da funo scanf. Ao utiliz-la, devemos informar um endereo de
modo que o valor teclado seja armazenado nesse endereo. S pra lembrarmos acompanhemos o texto
abaixo.
long numero = 0;
scanf("%d", &numero);
3.3 Um problema estranho?
No incio desta unidade falamos sobre certo problema estranho. hora de tentarmos resolv-lo. Afinal de
contas esse problema mesmo estranho? Tratava-se de escrever uma funo que retornasse 2 ou mais
valores. Agora temos as ferramentas para solucion-lo. O problema consistia em transformar segundos em
horas, minutos e segundos. Mos obra. Apresentamos abaixo uma soluo para esse problema. bom que
o leitor tente encontrar sua prpria soluo antes de verificar a que segue.

void novotempo(long* pontHoras, long* pontMinutos, long* pontSegundos)


{
/* No esquecer de colocar um * antes do nome do ponteiro para poder modificar
o valor das variveis e no os seus endereos. */
*pontHoras = *pontSegundos / 3600;
*pontMinutos = (*pontSegundos % 3600)/60;
*pontSegundos = (*pontSegundos % 3600) % 60;
}

253

/* programa novotempo */
#include<stdio.h>
void novotempo(long* pontHoras, long* pontMinutos, long* pontSegundos);
int main(int argc, char *argv[])
{
long horas = 0, minutos = 0, segundos=0, segtemp=0;
// Entrar com o nmero de segundos
printf("Digite o numero de segundos a transformar: ");
scanf(("%", &segundos);
segtemp=segundos
novotempo(&horas, &minutos, &segundos);
// Os valores horas, minutos e segundos foram modificados!
printf("\n%d segundos corresponde a:\n", segtemp);
printf("%d horas\n", horas);
printf("%d minutos\n", minutos);
printf("%d segundos\n", segundos);
getch();
return 0;
}
Ao digitarmos o valor 27000 para a varivel segundos na execuo do programa acima, teremos a
seguinte sada:

Exerccio. Procure explicar como os procedimentos foram realizados no programa novotempo. Explicandoos de forma coerente significa que o conceito de ponteiros foi bem assimilado.
3.4 Resumo
Os ponteiros no so simples de trabalhar, reconheamos. No nos preocupemos muito com isto agora.
difcil pra todo mundo. O melhor que temos a fazer repassar esta unidade tantas vezes quanto necessrio a
fim de consolidarmos este conceito. E para terminar, mais um pequeno resumo.
Em C podemos criar duas coisas na memria: variveis e ponteiros.

variveis: com elas que temos trabalhado at aqui. Criar uma varivel muito simples: basta
indicar seu nome e seu tipo.
long minhaVariavel = 0; // varivel criada na memria (valor 0)
Se escrevemos &minhaVariavel, obtemos o endereo da varivel na memria

ponteiros: so variveis um pouco particulares, pois elas tomam por valor o endereo de outras
variveis. Para criar um ponteiro vazio (que no contm endereo de nenhuma varivel) escrevemos
assim:

254

long *meuPonteiro = NULL;


Um ponteiro torna-se til quando lhe atribumos por valor o endereo de uma varivel.
long *meuPonteiro = &minhaVariavel;

observemos que *meuPonteiro funciona exatamente com se tivssemos escrito minhaVariavel.


printf("%d", *meuPonteiro); ento equivalente a printf("%d", minhaVariavel);

O resultado exatamente o mesmo salvo que no primeiro caso passamos por um ponteiro para acessar a
varivel.
3.5 Teste
1. Qual dos tipos abaixo corresponde a um ponteiro?
( ) int
( ) double*
( ) long
2. Se digitamos &bola, o que obtemos?
( ) O endereo de bola
( ) O valor de bola
( ) O valor da varivel apontada por bola
3. Se digitamos *total, o que obtemos?
( ) O endereo de total
( ) O valor de total
( ) O valor da varivel apontada por total
4. Por qual valor devemos inicializar um ponteiro?
( ) NOTHING
( ) NULL
( ) MAIN
( ) ADDRESS
5. Examine o cdigo seguinte:
long num = 25;
long *ponteiro = &num;
Supor que num se encontre no endereo 1400 da memria do computador e ponteiro se encontre no endereo
3800. Se na seqncia do programa for solicitada a impresso de *ponteiro, que valor ser exibido na tela?

(
(
(
(
(

) 3800
) 25
) 1400
)0
) impresso impossvel

4. Avaliando o que foi construdo


O conceito de ponteiro considerado por muitos como aquele em que o programador leva mais tempo para
assimilar. Devemos considerar sua grande importncia dentro da programao, pois somente com a sua
utilizao podemos trabalhar com estruturas de dados dinmicas, aquelas podem aumentar ou diminuir
durante a execuo de um programa dependendo unicamente da disponibilidade de memria. As principais

255

estruturas de dados dinmicas utilizadas em computao so as filas, pilhas e rvores. O estudo dessas
estruturas foge ao escopo deste texto, mas podero ser encontradas nos livros sobre estruturas de dados.

5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de Computadores:
Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill Book
Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.

256

Unidade X - Arrays
1. Situando a temtica
Nesta unidade aprenderemos a criar variveis do tipo array. Os arrays so muito utilizados em C,
pois eles so muito prticos. Comearemos explicando o funcionamento dos arrays na memria de um
computador. A compreenso desse funcionamento conduz o programador a construir programas mais
confiveis. Afinal de contas sempre bom compreender o porqu das coisas.

2. Problematizando a temtica
Ao trabalharmos com um conjunto de valores, podemos faz-lo de modo a utilizar cada valor uma nica vez.
Se for este o caso, medida que esses valores forem sendo lidos o processamento necessrio executado e
ficaremos satisfeitos. O que ocorre na prtica porm diferente. Imaginemos que se deseje calcular a
distncia entre cada elemento de um conjunto e a mdia aritmtica desses valores. Obviamente, precisaremos
de cada valor para calcular a mdia. Em seguida, precisaremos outra vez de cada valor para calcular as
diferenas. E onde esto esses valores agora? Se o conjunto possuir 100 elementos, por exemplo, podemos
dar um nome a cada elemento, mas isso seria um trabalho enorme. Os arrays permitem resolver este tipo de
problema sem maiores preocupaes.

3. Conhecendo a temtica
3.1 Os arrays e a memria
Arrays so seqncias de variveis de mesmo tipo, situadas em posies contguas na memria.
Concretamente, trata-se de vrias variveis de mesmo tipo, portando o mesmo nome e diferenciadas apenas
por um ou mais ndices. O nmero de ndices de uma varivel determina a dimenso do array a que ela
pertence. Assim, se para identificar uma determinada varivel precisamos utilizar dois ndices, ento essa
varivel pertence a um array de duas dimenses. Geralmente chamamos de elementos as variveis de um
array.
Exemplo. Seja um array de 4 elementos alocado na posio (endereo) 1800. Dizer que um array est
armazenado no endereo 1800 apenas uma forma de nos expressarmos. Na verdade, o array comea nessa
posio. Vejamos o esquema abaixo.

Endereo

Valor

...
2293600

52

2293601

10

2293602

-65

2293603

94

Ao solicitarmos em um programa a criao de um array com 4


elementos, o programa solicita ao sistema operacional espao suficiente
na memria para a alocao desse array. Os quatro elementos devem
ficar em endereos contguos, um vizinho ao outro, e devem ser todos
de um mesmo tipo.
Em resumo, sobre os arrays devemos guardar que:
Quando um array criado, ele ocupa um espao contguo na
memria: os endereos ocupados esto em seqncia, no existe
buraco entre eles.
Todos os elementos de um array so de um mesmo tipo. Um
array de int conter apenas variveis de tipo int e nada mais.

...

257

3.2 Declarando um array


Como sabemos todas as variveis em C devem ser declaradas antes de serem usadas. Comecemos com um
exemplo. Vamos declarar um array de 4 elementos de tipo long.

long x[4];

suficiente colocar entre colchetes o nmero de elementos do array. Neste caso, x o nome
do array. No existe limite para o nmero de elementos de um array, salvo a memria
disponvel.

3.3 Como acessar um elemento de um array


Para acessar um elemento de um array devemos escrever:
nomeDoArray[n] onde n a posio (ndice) do elemento dentro do array.
Ateno. Os elementos de um array so indexados a partir de 0 (zero). Assim, os elementos do array x
declarado acima so referenciados por: x[0], x[1], x[2] e x[3]. Observe que no existe o elemento de ndice 4
na declarao acima. Uma tentativa de faz-lo resulta em um erro de execuo.
3.4 Atribuindo valores a um array
Para atribuir um valor a um elemento de um array necessrio fazer uma referncia ao elemento desejado e
atribuir-lhe um valor como fazemos com qualquer outra varivel. Lembremo-nos que cada elemento uma
varivel.
Exemplo.
long x[4];
x[0] = 52;
x[1] = 10;
x[2] = -65;
x[3] = 94;
3.5 Arrays e ponteiros
Existe alguma relao entre arrays e ponteiros? Se
escrevermos apenas o nome do array, sem ndice,
teremos um ponteiro. Vejamos o programa ao lado.
Resultado: temos o endereo 2293600 onde comea o
array x.
Ao solicitarmos a impresso de x obtivemos o endereo
do primeiro elemento do array x, portanto o valor de x
o endereo de outra varivel, no caso x[0]. Lembremonos do conceito de ponteiro.
Se, no lugar de printf("%d", x); tivssemos escrito
printf("%d", x[0]); teramos obtido como reposta 52, o
valor de x[0].

/* Programa array1
#include<stdio.h>
int main()
{
long x[4];
x[0]=52;
x[1]=10;
x[0]=-65;
x[0]=94;
printf("%d", x);
getch();
return 0;
}

*/

Ateno! Como o nome de um array um ponteiro, podemos utilizar o smbolo * para conhecer o valor do
primeiro elemento de um array. Assim, printf("%d", *x); e printf("%d", x[0]); so equivalentes.
Experimente.
Tambm possvel obter o valor do segundo elemento escrevendo *(x+1) (endereo do array +1). Para os
demais elementos o raciocnio o mesmo, *(x+2) referencia o valor do terceiro elemento e assim por diante.

258

3.6 Listando um array


Para listar todos os elementos de um array devemos fazer uso de um comando de repetio. Seria muito
incmodo escrever um printf para cada elemento. Imagine s se o array possusse 800 elementos! Vejamos
um exemplo com uso do comando for.

/* programa array2 */
#include<stdio.h>
int main(int argc, char *argv[])
{
long x[4], i = 0;
x[0] = 15;
x[1] = -45;
x[2] = 218;
x[3] = 14;
for (i = 0 ; i < 4 ; i++)
{
printf("%d\n", x[i]);
}
getch();
return 0;
}

A execuo deste programa produzir a seguinte sada:


15
-45
218
14
Nosso lao percorre todo o array com a ajuda de uma varivel
de controle i. Estude o programa array2 ao lado e procure
entender o que se passa. Observe que a varivel de controle i
introduzida no cdigo vale 0, 1, 2 e 3.
Exerccio. Modifique o cdigo fonte do programa array2 de
modo que a sada seja
Listagem do array: 15 -45 218 14

Ateno! No tente exibir o valor de x[4]. Um array com 4 elementos possui ndices 0, 1, 2 e 3. Se tentarmos
exibir x[4] ocorrer um erro de execuo e o sistema operacional encerrar o programa avisando que o este
tentou acessar um endereo que no lhe pertence.
3.7 Inicializando um array
Agora que sabemos percorrer um array somos
capazes de inicializar todos os seus elementos com
zero, por exemplo, com o uso de um lao. Tente
faz-lo antes de ver o programa ao lado.
A sada deve ser algo como:
x=0000000000
Outro modo de inicializar um array
Podemos tambm inicializar um array de modo mais
automtico. Essa tcnica consiste em escrever
x[4]={valor1, valor2, valor3, valor4} quando da
declarao do array. De modo geral, basta escrever
os valores entre chaves e separados por vrgula.

/* programa array3 inicializa um array */


int main(int argc, char *argv[])
{
long x[10], i = 0;
// inicializao do array
for (i = 0 ; i < 10 ; i++)
{ x[i] = 0; }
// verificao exibio dos valores de x
for (i = 0 ; i < 10 ; i++)
{
printf("x = ");
printf("%d ", x[i]);
}
getch();
return 0;
}

Melhor que isso, se fizermos x[4]={10, -32}, os dois


primeiros elementos sero iniciados com 10 e -32,
respectivamente e os demais sero inicializados com zero.

Exerccio. Como inicializar todos os valores a zero utilizando a tcnica acima?


3.8 Passagem de arrays como parmetros
Ns certamente teremos necessidade de imprimir todos os valores de um array. Por que no escrevermos
uma funo para executar essa operao? Isto nos permitir ver como passar um array para uma funo,
como parmetro real, claro.

259

Ser necessrio passarmos duas informaes para a funo, o array (seu endereo) e o seu tamanho. De fato,
nossa funo dever ser capaz de inicializar um array de qualquer tamanho, por isso a necessidade de
conhecer o tamanho do array. Vejamos um cdigo para isso.
#include<stdio.h>
// Prottipo da funo de impresso
void imprimir(long *v, long comp);
int main(int argc, char *argv[])
{
long vetor[4] = {10, 15, 3}, i = 0;
// imprimir o contedo do vetor
imprimir(vetor, 4);
getch();
return 0;

void imprimir(long *v, long comp)


{
long i;
for (i = 0 ; i < comp ; i++)
{
printf("%d\n", v[i]);
}
}

}
Observemos que:
1. vetor em main um ponteiro
2. v em imprimir um ponteiro
A funo imprimir toma como parmetro um ponteiro para o tipo long e o tamanho de um array para saber
at onde esto os seus elementos.
Importante: existe outro modo de indicar que uma funo recebe array. Em vez de indicar que a funo
espera um long *v, podemos escrever assim:
void imprimir(long v[], long comp)
Este comando equivalente ao usado no cdigo apresentado acima, mas a presena dos colchetes lembra ao
programador que a funo est aguardando um array. Isto permite evitar confuses. Esta forma bastante
utilizada.
Exerccios
importante escrever vrias funes que trabalhem sobre arrays para que nos tornemos prticos sobre este
assunto.
1. Criar uma funo de nome somaVetor que retorne a soma de todos os elementos de um array. Utilize um
return para retornar o valor calculado. Como incentivo aqui est o prottipo da funo somaVetor.
long somaVetor(long vetor[ ], long comp);
2. Criar uma funo mediaVetor que calcule e retorne a mdia aritmtica dos
(Ateno. O valor de uma mdia sempre um nmero decimal).

elementos do vetor.

3. Criar uma funo copiarVetor que tenha como argumentos 2 arrays. O contedo do primeiro array
dever ser copado para o segundo. Prottipo:
void copiarVetor(long v1[ ], long v2[ ], long comp);
4. Criar uma funo maxVetor1 que dever atribuir o valor 0 a cada elemento do array que lhe passado
como parmetro, desde que esse elemento tenha um valor que seja superior a um valor mximo tambm
recebido por parmetro. Prottipo:
void maxVetor1(long v[ ], long comp, long max);
5. Criar uma funo ordenaVetor que classifique os elementos de um array em ordem crescente. Se um
array inicialmente possui os elementos {21, 30, 17, 8}, nesta ordem, ao fim da operao ele dever se
apresentar como {8, 17, 21, 30}.

260

3.9 Arrays de duas ou mais dimenses


Para utilizarmos arrays de duas ou mais dimenses precisamos declar-los como fazemos para qualquer
outra varivel. A declarao de um array de duas dimenses semelhante declarao de arrays com uma
nica dimenso. Devemos indicar explicitamente quantos elementos existem em cada dimenso. Vejamos
como declarar um array de inteiros de nome X, com 10 elementos em uma dimenso e 8 elementos em outra:
int X[10][8] ;. Simples no?
Os arrays de uma e duas dimenses recebem nomes especiais. Os arrays de uma dimenso so chamados de
vetor e os de duas dimenses recebem o nome de matriz.
Exemplo de programao usando matriz.
Vamos escrever um programa para preencher uma matriz de nome Nota, que represente as notas de 10
alunos de uma turma em 3 disciplinas. Trata-se de distribuir essas notas em uma estrutura de duas
dimenses. Acompanhe o nosso raciocnio. Consideraremos uma matriz de 3 linhas, cada linha
representando uma disciplina, e 10 colunas, uma para cada nota de um aluno. Nossa estrutura tem a seguinte
aparncia.

notas
disciplinas
Como imaginamos, a matriz deve ser declarada como int Nota[3][10].
Atribuindo valor aos elementos de um array
A atribuio de valores aos elementos de uma matriz se d do mesmo modo que para as outras variveis j
vistas, ou seja, podemos faz-lo por atribuio direta ou por leitura via teclado (como uso da funo scanf).
No podemos esquecer que as matrizes possuem dois ndices. Assim, podemos escrever Nota[0,3]=8,5; para
indicarmos que o aluno 3 obteve 8,5 como nota na disciplina 1. As disciplinas sero representadas por 0, 1, 2
(linha 0, linha 1, linha2). No se desespere. Lembre-se que os ndices dos arrays comeam em 0(zero). Por
isso, a primeira linha tem ndice 0, a segunda ndice 1, e assim por diante. O mesmo ocorre com relao s
colunas. Ento o elemento da terceira linha e sexta coluna representado por Nota[2,5]. A atribuio de
valores via teclado se d como auxlio de um comando de repetio. Lembremos do que j foi dito antes:
cada conceito estudado importante e deve ser acumulado, para uso
#include<stdio.h>
futuro, medida que os programas vo ficando mais complexos.
int main(){
Vejamos um modelo para a leitura de dados via teclado e atribuio
int i,j;
aos elementos de uma matriz.
int X[3][4];
for (i=0; i<3; i++)
Leia o cdigo ao lado e procure compreender cada passo.
{
Evidentemente este programa l uma matriz 3x4, de inteiros de
printf("Leitura da linha %d\n", i);
nome X. Escreva outro programa para realizar a mesma tarefa de
for (j=0; j<4; j++)
modo que os dados de entrada apaream na tela assim :
{
printf("elemento %d ", j);
Primeira linha : 10 23 15 17
scanf("\n%f", X[i,j]) ;
Segunda linha : 76 56 29 2
}
Terceira linha : -5 43 -2 45
}
getch();
Observe bem, aps a leitura de um nmero, no h mudana de
return 0;
linha, a menos que esse nmero seja o ltimo da sua linha.
}
Na plataforma Moodle, o aluno encontrar vrios outros exemplos com matrizes assim como muitos
exerccios.

261

3.10 Teste
1. Qual das linhas abaixo cria um array de double com 10 elementos?
( ) double* vetor[10];
( ) double vetor{10};
( ) double vetor[10];
( ) double vetor[9];
2. Qual o valor do primeiro ndice de um array?
( )0
( )1
( ) -1
3. Qual dos prottipos abaixo no permite a passagem do array vetor como parmetro?
( ) void f(long vetor[], long comp);
( ) void f(long vetor, long comp);
( ) void f(long *vetor, long comp);
4. Qual o outro modo de inicializar o array vetor com estes valores?
long vetor[4];
vetor[0] = 10;
vetor[1] = 23;
vetor[2] = 505;
vetor[3] = 8;
( ) long vetor[4] = 10, 23, 505, 8;
( ) long vetor[4] = [10, 23, 505, 8];
( ) long vetor[4] = (10, 23, 505, 8);
( ) long vetor[4] = {10, 23, 505, 8};
Para no esquecer.

No esquecer JAMAIS que um array comea no ndice 0 e no no ndice 1.


Quando passar um array para uma funo, como parmetro claro, passar TAMBEM o seu tamanho,
seno a funo no poder reconhecer o tamanho do array.

4. Avaliando o que foi construdo


Conclumos este texto com uma apresentao sobre os arrays. Esse tipo de dados possui larga utilizao na
soluo de problemas que necessitam a reutilizao de variveis dentro de um mesmo programa. Conforme
visto, os arrays so utilizados na implementao de vetores e matrizes em C. Existem outros tipos de dados
que devero ser estudados por aqueles que pretendem aprofundar-se no estudo desta linguagem. O
tratamento de caracteres, registros e arquivos (files) so assuntos fortemente recomendados para leitura. A
base de programao adquirida at aqui suficiente para que o aluno continue o seu desenvolvimento em
programao, agora de forma autnoma.

262

5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de Computadores:
Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill Book
Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.

263

Anda mungkin juga menyukai