Crditos: 04
Ementa
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:
197
Unidade de Controle
Registradores
Clock
Sistemas Operacionais
Os arquivos em informtica
Unidade II
Algoritmos
Algoritmos
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
Tipos de variveis
198
Constantes
Teste
Unidade IV
Primeiros passos
A diviso
O mdulo
Outras abreviaes
A biblioteca matemtica
Teste
Unidade V
Unidade VI
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
O lao while
o
O lao do .. while
O lao for
Teste
199
Mais exemplos
Converso Celsius/Fahrenheit
rea de um retngulo
Um menu
Teste
Unidade IX
Ponteiros
A memria e os endereos
Endereo e valor
Utilizao de ponteiros
Criar um ponteiro
Um problema estranho?
Resumo
Teste
Unidade X
Arrays
Os arrays e a memria
Declarando um array
Arrays e ponteiros
Listando um array
Inicializando um array
Teste
200
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
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
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.
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
1.
2.
3.
4.
5.
6.
7.
206
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
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
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
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!
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
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.
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
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.
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
}
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
}
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
Sada:
Qual a sua idade? 20
Ah! Voce tem 20 anos!
Pressione uma
continuar...
tecla
para
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
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
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
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
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
( )%
( )4
( )5
( ) 15
)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
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
2. Problematizando a temtica
As funes mais utilizadas para entrada ou sada so:
scanf
printf
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.
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.
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
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
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
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;
....
expr
True
False
Bloco
False
prxima instruo
228
Bloco
True
.....
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
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.
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
( ) Siga em frente.
( ) Aguarde um pouco
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
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
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
}
236
#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 ;
}
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.
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
.....................
long cont = 0;
do
{
printf("cont = %d\n",cont);
cont++;
} while (cont<10);
.....................
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.
.............................
long cont;
for (cont = 0; cont < 10; cont++)
{
printf("cont = %d\n",cont);
}
...............................
A varivel cont no foi inicializada a zero quando de sua declarao, mas poderia ter sido.
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.
( ) repeat
( ) do.. while
( ) while
239
( ) 2 vezes
( ) 12 vezes
( ) 13 vezes
( ) 1 vez
( ) 14 vezes
( ) 15 vezes
( ) infinitas vezes
(
(
(
(
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 ++)
#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
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
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
}
242
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
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 */
float converte(long C)
{
long F = 0;
F = 180*C/100+32;
return F;
}
1.
2.
3.
4.
244
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 */
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
3.6 Teste
1. O que acontece aps um return?
246
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
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
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
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
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
......................
int x=100, *p=NULL;
p=&x;
35846
100
p
16315
35846
p uma varivel que aponta para uma varivel de tipo int, seu valor um endereo [valor de p =
35846]
251
252
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
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 = #
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
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
...
257
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.
/* 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
/* 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;
}
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.
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;
}
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
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.
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