Você está na página 1de 284

Recife, 2009

Programao 2
Snia Virginia Alves Frana
Universidade Federal Rural de Pernambuco
Reitor: Prof. Valmar Corra de Andrade
Vice-Reitor: Prof. Reginaldo Barros
Pr-Reitor de Administrao: Prof. Francisco Fernando Ramos Carvalho
Pr-Reitor de Extenso: Prof. Paulo Donizeti Siepierski
Pr-Reitor de Pesquisa e Ps-Graduao: Prof. Fernando Jos Freire
Pr-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira
Pr-Reitora de Ensino de Graduao: Prof. Maria Jos de Sena
Coordenao Geral de Ensino a Distncia: Prof Marizete Silva Santos
Produo Grfca e Editorial
Capa e Editorao: Allyson Vila Nova, Rafael Lira, Italo Amorim e Glaydson da Silva
Reviso Ortogrfca: Ivanda Martins
Ilustraes: Diego Almeida
Coordenao de Produo: Marizete Silva Santos
Sumrio
Plano da Disciplina ...............................................................................5
Apresentao ........................................................................................9
Conhecendo o Volume 01 ..................................................................10
Captulo 1 Introduo ao C .............................................................13
1.1. Programas e Programao de Computadores ..........................13
1.2. Linguagens de Programao .....................................................15
1.3. Breve Histrico da Linguagem de Programao C ...................18
1.4. Criao, Compilao e Execuo de um Programa ..................19
Captulo 2 Conceitos Preliminares para Programar em C ...........24
2.1. Estrutura de um Programa Bsico em C ...................................25
2.2. Palavras Reservadas do C ........................................................28
2.3 Uso de Comentrios ...................................................................29
2.4. Os Fundamentos do Ambiente C ...............................................31
2.5. Conhecendo o Dev-cpp .............................................................34
Captulo 3 Tipos de Dados, Variveis e Constantes .....................40
3.1. Tipos de dados ..........................................................................40
3.2. Variveis e Constantes ..............................................................42
3.3. Operador de Atribuio (=) ........................................................49
Captulo 4 Comandos de Entrada e Sada de Dados ....................54
4.1. Entrada de Dados ......................................................................54
4.2. Sada de Dados .........................................................................59
4.3. Erros Frequentes no Uso dos Comandos de Entrada e Sada .65
4.4. Primeiros programas em C ........................................................66
Captulo 5 Operadores, Expresses e Funes Matemticas .....75
5.1. Operadores Bsicos ..................................................................75
5.2. Operadores Aritmticos de Atribuio ......................................87
5.3. Operadores ++ e -- ....................................................................87
5.4. Converso de tipo ......................................................................88
5.5. Funes Matemticas (biblioteca math.h) .................................90
Plano da Disciplina
Carga horria: 60h
Ementa da Disciplina
Introduo linguagem de programao C. Tipos de dados, variveis, operadores
aritmticos, relacionais e lgicos. Comandos de entrada e sada. Estruturas de
seleo e repetio. Modularizao. Vetores e registros. Ponteiros. Arquivos.
Manipulao de caracteres. Comandos de tela. Comandos de manipulao de
data e hora.
Objetivos
Objetivo Geral
Apresentar tcnicas de programao estruturada utilizando como ferramenta a
linguagem de programao C
Objetivos Epecfcos
Desenvolver a capacidade de soluo de problemas de programao, com o uso
da linguagem C.
Introduzir mtodos de otimizao para garantir efcincia e segurana aos
programas.
Desenvolver o auto-aprendizado.
Contedo Programtico
Mdulo 1 - Introduo Linguagem de Programao C
Carga Horria do Mdulo 01: 15 h
Objetivo do Mdulo 01: Introduo ao C e seus comandos bsicos, para
possibilitar a construo dos primeiros programas nesta linguagem.
Contedo Programtico do Mdulo 1
Introduo ao C
Conceito de programa e linguagem de programao
Introduo ao C: Um breve histrico
Etapas de desenvolvimento de um programa
Comandos Bsicos do C
Estrutura de um programa C
Diretivas de compilao
Uso de comentrio
Tipos de dados
Variveis, constantes, identifcadores e atribuio
Comandos de entrada e sada
Operadores aritmticos, relacionais e lgicos
Modifcadores de tipos de dados
Funes matemticas
Mdulo 2 Estruturas de Controle de Fluxo e Modularizao
Carga Horria do Mdulo 2: 15 h
Objetivo do Mdulo 2: Possibilitar o conhecimento das estruturas de controle
(seleo e repetio) do C e mtodos para modularizao dos programas (criao
de procedimentos e funes).
Contedo Programtico do Mdulo 2:
Estruturas de Controle de Fluxo
Sequncia
Estrutura de seleo: If e Switch
Estrutura de repetio: for, do/while e while
Comando break
Modularizao
Construo de mdulos: funes e procedimentos
Passagem de parmetros e escopo de variveis
Comando return
Mdulo 3 Armazenamento de Dados em Vetores, Registros e Arquivos
Carga horria do Mdulo 03: 15 h
Objetivo do Mdulo 03: Apresentar as formas de armazenamento de dados
homogneos (vetores) e heterogneos (registros), alm dos comandos para
manipulao de arquivos.
Contedo Programtico do Mdulo 03:
Tipos de Dados Homogneos e Heterogneos
Vetores
Registros
Vetor de registro
Arquivos
Ponteiros
Comandos para manipulao de arquivo
Mdulo 4 Comandos Avanados
Carga Horria do Mdulo 4: 15 h
Objetivo do Mdulo 4: Apresentar comandos mais avanados da linguagem
C, tais como: manipulao de caracteres, comandos de tela (para melhorias na
interface dos programas) e manipulao de data e hora.
Contedo Programtico do Mdulo 4:
Comandos para Manipulao de Caracteres e Strings
Comandos da biblioteca ctype e string
Validao de campos
Comandos de Tela Interface
Comandos da biblioteca conio
Comandos para Manipulao de data e hora
Comandos da biblioteca time
Avaliao
Avaliao prtica em laboratrio correspondendo a 60% da nota.
Resoluo de listas de exerccios, que sero enviadas atravs do ambiente virtual
(30%).
Avaliao referente participao do aluno nas aulas presenciais e ambiente
virtual: fruns de discusso, chats, etc (10%).
Bibliografia
Bsica:
SCHILDT, Herbert. C Completo e Total. So Paulo: Makron, 1996.
DEITEL, H, M e DEITEL, P. J. Como Programar em C. Rio de Janeiro: LTC,
1999.
Complementar:
ASCENIO, Ana Fernanda Gomes e CAMPOS, Edilene Aparecida Veneruchi.
Fundamentos de Programao de Computadores. So Paulo: Prentice Hall,
2002.
Apresentao
Caro(a) aluno(a),
Seja bem-vindo (a) ao primeiro mdulo da disciplina Programao II. Nesta disciplina,
voc ir aprender a programar na linguagem de programao C, uma das mais utilizadas
mundialmente. Desenvolver programas e garantir que estes sejam confveis, efcientes
e agradveis de usar requer conhecimento tcnico e muito treinamento.
Este livro foi escrito pensando em voc, que est iniciando neste mundo da
programao de computadores e que precisa ser apresentado, com tranquilidade, a um
conjunto de novos conceitos. Os assuntos sero transmitidos gradativamente, de forma
que voc os absorva com naturalidade.
Este livro contm muitos exemplos de questes resolvidas, comentadas em
detalhes, para que voc no encontre difculdades para aprender cada assunto. Alm
de apresentar dicas para que voc desenvolva seus programas de forma efciente e
no cometa os principais erros de programao que ocorrem com quem est iniciando
a programar. Ao fnal de cada captulo, voc poder testar o seu aprendizado e assimilar
melhor o que foi estudado, atravs da resoluo de exerccios. Isto muito importante!
No deixe de resolv-los.
De antemo, informamos que programar muito bom, voc vai gostar! Nada melhor
do que ver um programa rodando e saber que foi voc quem o criou. Mas, no desanime
se encontrar alguma difculdade durante esta caminhada. s vezes o programa d
um erro e no sabemos onde est o problema. Seja persistente! Ao longo do tempo,
a experincia vai te dar mais segurana e voc conseguir encontrar tais erros com
facilidade.
O objetivo deste primeiro mdulo fazer uma introduo linguagem C, conhecer
um pouco da sua histria e iniciar o estudo da sintaxe da linguagem, que possibilitar
a construo de programas bsicos. Ao fnal deste primeiro mdulo, voc j estar
desenvolvendo seus primeiros programas em C. O que voc est esperando? Vamos
comear?
Bons estudos!
Professora Snia Virginia Alves Frana
10
Programao 2
Conhecendo o Volume 01
Neste primeiro volume, voc ir encontrar o mdulo 01 da disciplina:
Programao II. Este volume est estruturado em cinco captulos, que
sero estudados ao longo de 15h/aula. Para facilitar seus estudos,
veja a organizao deste primeiro volume.
Captulo 1: Introduo ao C
Carga Horria do Captulo 1: 2 h/aula
Objetivos do Captulo 1: Introduzir os conceitos bsicos da
rea de programao e apresentar um breve histrico sobre a
linguagem C.
Contedo Programtico do Captulo 1
Conceito de programas e programao de computadores;
Linguagens de programao;
Breve histrico da linguagem de programao C;
Etapas do desenvolvimento de um programa.
Captulo 2: Conceitos Preliminares para Programar em C
Carga Horria do Captulo 2: 3 h/aula
Objetivos do Captulo 2: Apresentar detalhes mais especfcos
da linguagem, necessrios para dar incio programao
em C. Neste captulo, tambm ser apresentado o ambiente
de programao que utilizaremos no desenvolvimento dos
programas.
Contedo Programtico do Captulo 2
Estrutura de um programa bsico C;
Palavras reservadas do C;
Uso de comentrios;
Fundamentos do ambiente C;
Conhecendo o Dev-cpp.
11
Programao 2
Captulo 3: Tipos de Dados, Variveis e Constantes
Carga Horria do Captulo 3: 2 h/aula
Objetivos do Captulo 3: Apresentar os tipos de dados
suportados pelo C e introduzir o conceito de variveis e
constantes
Contedo Programtico do Captulo 3
Tipos de dados;
Variveis e constantes;
Operador de atribuio;
Captulo 4: Comandos de Entrada e Sada de Dados
Carga Horria do Captulo 4: 4 h/aula
Objetivos do Captulo 4: Apresentar os comandos de entrada
e sada de dados do C. Neste captulo, voc ter acumulado
conhecimento sufciente para desenvolver os primeiros
programas em C.
Contedo Programtico do Captulo 4
Entrada de dados;
Sada de dados;
Desenvolvimento dos primeiros programas C.
Captulo 5: Operadores, Expresses e Funes Matemticas
Carga Horria do Captulo 5: 4 h/aula
Objetivos do Captulo 5: Apresentar os operadores
bsicos (aritmticos, relacionais e lgicos), alm de funes
complementares para o desenvolvimento de programas que
executem expresses mais complexas.
Contedo Programtico do Captulo 5
Operadores aritmticos, lgicos e relacionais;
Operadores aritmticos de atribuio;
Operadores ++ e --;
12
Programao 2
Converso de tipos;
Funes matemticas.
Ao fnal de cada captulo voc encontrar:
A seo Atividades e Orientaes de Estudo: que contm
exerccios para a fxao do assunto estudado, alm de
indicao de fruns de discusso.
A seo Conhea Mais: que contm dicas de sites e livros
que devem ser lidos para ampliar os seus conhecimentos.
A seo Vamos Revisar?: que apresenta um resumo dos
principais tpicos abordados no captulo.
13
Programao 2
Captulo 1 Introduo ao C
Vamos conversar sobre o assunto?
Neste primeiro captulo, ser feita uma apresentao do que
programao e quais as principais linguagens de programao do
mercado, dando nfase linguagem C. Este captulo importante,
porque conheceremos um pouco da histria da linguagem de
programao que iremos aprender nesta disciplina. Sempre que
conhecemos uma pessoa nova, queremos saber alguns detalhes
da sua vida, no mesmo? Quantos anos ela tem, onde nasceu,
quem so seus pais, etc. Neste captulo, tambm, sero introduzidos
conceitos utilizados na rea de programao, visando a nossa
preparao para nos lanarmos nesse mundo intrigante da criao de
programas computacionais. Ento, prontos (as) para o desafo?
1.1. Programas e Programao de
Computadores
Um programa de computador um conjunto de instrues que
descrevem uma tarefa que ser executada por um computador.
Um programa de computador tambm conhecido como software,
software aplicativo, software de sistema ou simplesmente programa.
O termo software mais utilizado quando feita uma referncia
parte no fsica do sistema computacional, juntamente com o termo
hardware, que faz referncia ao conjunto de componentes eletrnicos
que constituem um computador.
Os programas que permitem ao usurio fazer uma ou mais tarefas
especfcas, como as planilhas eletrnicas, editores de texto e jogos
so chamados de software aplicativo ou aplicao. J os programas
que do suporte funcional aos computadores, como os sistemas
operacionais e drivers de dispositivos, so chamados de software de
sistema
1
.
O ato de desenvolver programas chamado de programao
de computadores. A programao o processo de escrita, teste
e manuteno de um programa (ASCENIO e CAMPOS, 2002).
O desenvolvimento de programas baseado em metodologias ou
processos formalizados conhecido por engenharia de software.
Saiba Mais
1
Alm dos
software
aplicativo e
software de
sistema, ainda
possivel utilizar
a categoria
software
embutido ou
embarcado,
destinado a
funcionar dentro
de uma mquina
que no um
computador.
Normalmente,
estes software
tm um
propsito muito
especfco, como,
por exemplo:
controlar a
injeo eletrnica
de um carro
ou gerenciar
o cozimento
dos alimentos
no forno de
microndas. Mais
recentemente,
surgiu tambm
o software como
servio, que
um software que
roda diretamente
na internet, no
sendo necessrio
instalar nada no
computador do
usurio.
14
Programao 2
Os programas so escritos em uma linguagem de programao.
Assim como o Portugus, o Ingls e o Espanhol, as linguagens
de programao tm as suas regras e devemos segu-las para
escrever nossos programas corretamente. Portanto, a programao
de computadores uma cincia e, por isso, devemos seguir uma
metodologia para termos como resultado: programas seguros e
efcientes.
Em uma disciplina anterior, vocs aprenderam a desenvolver
algoritmos, que so uma sequncia de passos para realizar uma
tarefa ou resolver um problema. Utilizamos algoritmos no nosso
cotidiano para realizar atividades corriqueiras, defnindo a sequncia
de passos que deve ser executada para atingirmos um objetivo, como,
por exemplo, os passos que executamos para tomar banho, calibrar
um pneu ou fazer um bolo.
Figura 1.1: Exemplos de algoritmos
Para efetuarmos estas atividades, seguimos uma sequncia
lgica de passos. Se esses passos no tiverem uma lgica, podemos
no conseguir atingir o nosso objetivo. Se vocs observarem, para
fazer um bolo, existe uma ordem em que os ingredientes devem ser
adicionados receita, caso no sigamos esta ordem, o bolo no fcar
bom. Na programao ir ocorrer a mesma coisa, devemos passar as
instrues ao computador, utilizando uma linguagem de programao,
seguindo uma lgica a lgica computacional.
Na prxima seo vamos abordar as linguagens de programao,
de uma forma mais abrangente, tratando os principais conceitos que
envolvem este assunto. Vamos seguir em frente?
15
Programao 2
1.2. Linguagens de Programao
atravs das linguagens de programao que poderemos criar
nossos programas. Uma linguagem de programao um conjunto de
regras sintticas e semnticas usadas para defnir um programa. O
conjunto de cdigos (palavras e smbolos), compostos de acordo com
essas regras, constituem o cdigo fonte do nosso programa. Para
ser executado pelo processador, o cdigo fonte precisa ser traduzido
para cdigo de mquina.
Aprender uma linguagem de programao um pouco similar
a aprender um novo idioma. Temos que saber o signifcado das
palavras, as regras da estruturao das frases, etc., para podermos
nos comunicar corretamente no novo idioma.
Figura 1.2: Aprenda a dar ordens ao seu computador
Existem vrias linguagens de programao. Vocs sabiam que
cada linguagem de programao possui o seu conjunto de regras e
um modo de funcionamento prprio? A escolha de uma linguagem
de programao para o desenvolvimento de um programa deve estar
atrelada ao tipo de problema que deseja resolver. Existem linguagens
16
Programao 2
que so melhores para resolver um certo tipo de questo do que
outras.
De acordo com Sebesta (2003), as linguagens de programao
vm sendo classifcadas de vrias formas: por gerao, de acordo com
o paradigma de programao, quanto ao grau de abstrao, de acordo
com a estrutura de tipos, dentre outras. Uma das classifcaes mais
utilizadas quanto ao grau de abstrao. Segundo esta classifcao,
as linguagens de programao so divididas em trs grupos:
linguagens de mquina, linguagens de baixo nvel e linguagens
de alto nvel.
A linguagem de mquina a linguagem natural dos computadores.
Estas linguagens so ininteligveis para o ser humano no treinado.
As linguagens de mquina so representadas por sequncias de
bits (zeros e uns). Estas sequncias representam instrues que
sero executadas pelo processador do computador. As instrues
correspondem a sequncias muito simples de operaes, tais como:
transferir um dado em memria para a CPU ou somar dois valores. As
linguagens de mquina so dependentes do processador, isto , uma
determinada linguagem de mquina s poder usada por um tipo de
computador.
As linguagens de baixo nvel so prximas da linguagem de
mquina. No entanto, os zeros e uns que formam uma instruo
foram substitudos por palavras que representam tais instrues,
tornando-as um pouco mais legveis. Estas linguagens so mais
voltadas para a mquina, isto , so escritas usando as instrues
do microprocessador do computador. So chamadas de linguagens
Assembly (que signifca montagem). Estas linguagens apresentam
as seguintes vantagens: os programas so executados com maior
velocidade de processamento (j que so executadas diretamente
pela mquina) e ocupam menos espao na memria. No entanto, de
modo geral, os programas em Assembly tm pouca portabilidade
2
(um
cdigo gerado para um tipo de processador no serve para outro) e
no so estruturados, tornando a programao mais difcil.
As linguagens de alto nvel so mais prximas linguagem
humana (do Ingls, por exemplo) e mais distantes das linguagens
de mquina. Por isso, so linguagens mais simples de entender, j
que, em geral, utilizam uma sintaxe estruturada, tornando seu cdigo
mais legvel. Necessitam de compiladores ou interpretadores
para gerar instrues do microprocessador. Interpretadores fazem
Saiba Mais
2
No contexto da
informtica, a
portabilidade de
um programa a
sua capacidade
de ser compilado
ou executado
em diferentes
arquiteturas (seja
de hardware ou
de software).
Esse termo
tambm vem
sendo utilizado
pelas empresas
de telefonia
mvel, quando
se referem
portabilidade
de nmero, ou
seja, voc muda
de operadora,
mas nao muda
o nmero do
celular.
17
Programao 2
a interpretao de cada instruo do programa fonte executando-a
dentro de um ambiente de programao, Basic e Java so exemplos de
linguagens interpretadas. Os compiladores fazem a traduo de todas
as instrues do programa fonte gerando um programa executvel.
Estes programas executveis (*.exe) podem ser executados fora dos
ambientes de programao. A linguagem C e Pascal so exemplos de
linguagens compiladas.
As linguagens de alto nvel ainda podem ser divididas de acordo com
a sua aplicao: genricas (como C, Java e Pascal, que servem para
o desenvolvimento de programas de propsito geral) ou especfcas
(como Fortran - utilizada para execuo de clculos matemticos,
LISP - desenvolvimento de aplicaes na rea de inteligncia artifcial
e CLIPPER utilizada para aplicaes que manipulam bancos de
dados). As vantagens das linguagens de alto nvel so: portabilidade
(por serem compiladas ou interpretadas podem ser executadas em
vrias plataformas com pouqussimas modifcaes) e facilidade de
desenvolvimento de programas. No entanto, as rotinas geradas so
mais genricas (e mais complexas) e por isso so mais lentas e
ocupam mais memria.
A fgura 1.3, a seguir, apresenta um trecho de cdigo escrito em
linguagem de mquina, linguagem de baixo nvel e linguagem de alto
nvel, respectivamente.
Linguagem de
Mquina
10110101
11100110
11000100
Linguagem de
Baixo Nvel
LOAD BASE
ADD BONUS
STORE SALARIO
Linguagem de Alto Nvel


Salario = Base + Bonus
Figura 1.3: Trecho de cdigo em diferentes linguagens
Notem como o cdigo em linguagem de mquina incompreensvel.
Difcil entender essas seqncias de zeros e uns, no mesmo?
O cdigo na linguagem de baixo nvel mais legvel e passamos
a entender as instrues. Na linguagem de alto nvel, o cdigo fca
menor e muito mais simples. Em qual tipo de linguagem vocs querem
programar? Nem precisamos parar para pensar, no mesmo?
18
Programao 2
Figura 1.4: Linguagens de baixo nvel x linguagens de alto nvel
1.3. Breve Histrico da Linguagem de
Programao C
Vamos conhecer um pouco sobre a histria do C? A linguagem
de programao C nasceu em 1972 nos laboratrios Bell, Estados
Unidos. Seus criadores so Brian Kernighan e Dennis M. Ritchie. A
linguagem C foi criada a partir da linguagem B (sugestivo, no ?),
que havia sido desenvolvida no fnal dos anos 60 por Ken Thompson.
O C uma linguagem de alto nvel, compilada e estruturada
3
.
No entanto, o C possui instrues de baixo nvel, bem prximas
linguagem de mquina, que s o Assembler possui. O objetivo dos
seus criadores era usar o C para desenvolver o sistema operacional
UNIX, que originalmente foi escrito em Assembly (linguagem de baixo
nvel). Desde ento, espalhou-se por muitos outros sistemas e tornou-
se uma das linguagens de programao mais usadas, e infuenciando
o desenvolvimento de muitas outras linguagens como C++ e Java.
Com a linguagem C podemos construir programas organizados
e concisos (caractersticas dos programas das linguagens de alto
Saiba Mais
3
Uma linguagem
considerada
estruturada
quando
permite que o
programador
pegue trechos
de maior uso do
seu programa e
transforme-os
em pequenos
mdulos
(procedimentos
e funes) que
sero reutilizados
sempre que
necessrio.
19
Programao 2
nvel), ocupando pouco espao de memria e com alta velocidade
de execuo (como o Assembler). Infelizmente, dada toda a
fexibilidade da linguagem, tambm poderemos escrever programas
desorganizados e difceis de serem compreendidos. Portanto, cabe
ao programador de C utilizar boas prticas de programao, para ter
programas legveis e de fcil manuteno.
Existem inmeras razes para que o C seja uma das linguagens
mais preferidas dos programadores. As caractersticas da linguagem
C mostram o porqu de sua ampla aceitao. Vejamos algumas
caractersticas da linguagem C.
Portabilidade entre mquinas e sistemas operacionais;
Dados compostos em forma estruturada;
Programas estruturados;
Total interao com o sistema operacional;
Cdigo compacto e rpido, quando comparado ao cdigo de
outras linguagens de alto nvel.
Agora que j conhecemos um pouco mais da linguagem C, vamos
entender o processo de desenvolvimento de um programa. Quais so
os passos que devemos seguir para termos um programa pronto?
Vamos comear a falar sobre isto agora mesmo. Continuem frmes na
leitura!
1.4. Criao, Compilao e Execuo de um
Programa
Nesta seo vamos estudar as etapas de desenvolvimento de um
programa em C. O desenvolvimento de um programa dividido em
trs etapas, como mostra a fgura 1.5.
Figura 1.5: Estados do desenvolvimento de um programa em C
A primeira etapa para o desenvolvimento de um programa em C
20
Programao 2
a criao do programa fonte, que consiste no texto formado pelo
conjunto de comandos que ns desejamos que o computador execute.
O programa fonte deve ser escrito respeitando as regras da linguagem.
De modo geral, os programas fontes so digitados em editores de
texto genricos ou especfcos dos ambientes de programao. No
prximo captulo deste volume, vamos conhecer detalhadamente o
ambiente de programao que ser utilizado para o desenvolvimento
dos nossos programas em C.
Com o programa fonte pronto, passamos para a etapa de
compilao. O compilador um programa que verifca se o
programa fonte no apresenta nenhum erro de sintaxe e gera o
programa executvel. Quando o programa fonte apresenta algum
problema, dizemos que ocorreu um erro de compilao. Assim, o
programador dever avaliar o programa fonte, para a retirada tais
erros. Normalmente, os compiladores indicam os provveis erros de
sintaxe cometidos pelo programador. Se o programa no tiver erros
de sintaxe, o compilador ir gerar o programa executvel.
A etapa fnal consiste na execuo do programa executvel.
Neste momento, o programador dever testar se o programa
est produzindo os resultados esperados. Quando o programa
apresenta algum erro nesta fase, como, por exemplo, mostrar um
resultado incorreto, dizemos que ocorreu um erro de lgica ou
erro de execuo. Isso ocorre porque, apesar do programa no
ter apresentado erros de sintaxe, o que tornou possvel a gerao
do programa executvel, a sequncia de comandos no foi defnida
de forma correta. Quando ocorre um erro de lgica, o programador
dever revisar o seu programa fonte e pass-lo novamente pela fase
de compilao, para que um novo executvel, sem erros, seja gerado.
Como o compilador no nos avisa onde esto os erros de lgica, estes
so mais difceis de serem corrigidos.
Aps ter certeza que o programa executvel est correto, sem
erros de lgica, o programador poder entreg-lo ao seu cliente.
importante fazermos vrios testes nos nossos programas. Testar com
vrios valores e verifcar se est realmente tudo como esperado. No
fca bem nosso cliente fcar ligando, dizendo que o programa est com
BUG!
4
Lembrem-se sempre, o computador s executa as instrues
que ns mandarmos. Se houver erros, a responsabilidade ser nossa
que no fzemos o programa corretamente! Vocs no vo querer
passar por uma situao como essa? Vo?
Saiba Mais
4
Bug um erro
no funcionamento
de um programa.
tambm
chamado de
erro de lgica,
e pode causar
discrepncias
no objetivo ou
impossibilidade
de utilizao de
um programa de
computador.
O uso do
termo bug
para descrever
defeitos
inexplicveis foi
parte do jargo da
engenharia por
vrias dcadas.
Acredita-se que o
termo foi criado
por Thomas
Edison quando
um inseto (bug,
em Ingls) causou
problemas de
leitura em seu
fongrafo em
1878.
21
Programao 2
Nesta fase de execuo do programa executvel, ns tambm
devemos verifcar a usabilidade do programa, ou seja, se o programa
fcou fcil de ser utilizado pelo seu usurio. Quando o programa de
difcil utilizao ou confunde o usurio, induzindo-o ao erro, ele perde
o interesse em utiliz-lo ou compr-lo. Tambm devemos verifcar se
nosso programa tem um bom desempenho, ou seja, se ele processa
rapidamente as operaes. Usurio no gosta de programa lento, no
mesmo?
Atividades e Orientaes de Estudo
Agora o momento de analisarmos se os assuntos abordados
neste captulo foram bem absorvidos. Foram vistos muitos conceitos
novos, no mesmo? Vamos responder as questes a seguir. Caso
sintam necessidade, releiam alguma seo que no foi muito bem
assimilada ou complementem as respostas com a leitura dos sites
indicados na prxima seo. Vocs esto preparados(as)?
1. Para que serve uma linguagem de programao?
2. Quais as desvantagens das linguagens de baixo nvel?
3. Por que desejamos programas portveis?
4. O que motivou a criao da linguagem C?
5. A linguagem C de baixo ou alto nvel?
6. A linguagem C compilada ou interpretada?
7. Por que os erros de lgica so mais difceis de serem
corrigidos?
8. Por que devemos nos preocupar com a usabilidade dos nossos
programas?
Conhea Mais
Para ampliar os seus conhecimentos sobre os assuntos
tratados neste captulo, visite o site da OReilly. Neste endereo,
22
Programao 2
http://oreilly.com/pub/a/oreilly/news/languageposter_0504.html,
foi disponibilizado um pster, muitssimo interessante, como uma
rvore genealgica das principais linguagens de programao dos
ltimos 50 anos. Vale a pena dar uma olhada.
muito importante que vocs se cadastrem em algum frum de
discusso sobre a linguagem C. Assim, vocs podero conversar e
trocar idias com programadores de C mais experientes. Exemplos
de fruns de C: DevMedia e Linha de cdigo.
Vamos revisar?
Vamos dar uma reforada em nosso aprendizado com esta
pequena reviso dos principais conceitos apresentados neste captulo.
Observem o resumo a seguir:
Programa: um conjunto de instrues que descrevem uma tarefa
que ser executada por um computador.
Programao de Computadores: o processo de escrita, teste e
manuteno de um programa.
Algoritmo: sequncia de passos para realizar uma tarefa ou
resolver um problema.
Linguagem de Programao: um conjunto de regras sintticas e
semnticas usadas para defnir um programa.
Linguagem de mquina: a linguagem natural dos computadores.
As instrues so formadas por zeros e uns. Estas linguagens no
so legveis para um programador sem experincia.
Linguagens de baixo nvel: so linguagens escritas usando as
instrues do microprocessador do computador. Estas linguagens
so mais difceis de entender e criar programas.
Linguagens de alto nvel: so linguagens mais prximas
linguagem humana e mais distantes das linguagens de mquina.
So linguagens mais simples de entender, j que, em geral,
utilizam uma sintaxe estruturada, tornando seu cdigo mais legvel.
Compiladores: so programas que fazem a traduo de todas as
instrues do programa fonte gerando um programa executvel.
23
Programao 2
Interpretadores: so programas que interpretam cada instruo
do programa fonte executando-a dentro de um ambiente de
programao.
Compilao: o processo, executado pelo compilador, que verifca
se existem erros de sintaxe no cdigo fonte e gera um programa
executvel.
Erro de sintaxe: ocorre durante o processo de compilao do
programa, quando o programador, ao editar o seu programa
fonte, no respeita alguma regra de sintaxe da linguagem de
programao.
Erro de lgica: ocorre durante a execuo de um programa, devido
um erro na lgica dos comandos.
24
Programao 2
Captulo 2 Conceitos
Preliminares para Programar
em C
Vamos conversar sobre o assunto?
Neste captulo, sero abordados conceitos preliminares que
iro nos preparar para programar em C. Estes conceitos esto
relacionados estrutura de um programa bsico em C. Aqui, tambm,
ser apresentado o ambiente de programao que utilizaremos
para o desenvolvimento dos nossos programas o Dev-cpp. Este
ambiente apresenta uma interface amigvel, que facilitar o processo
de programao. Vocs devem baixar e instalar o Dev-Cpp
5
, o
quanto antes, no computador que ser utilizado para a prtica desta
linguagem.
importante que vocs tenham pacincia neste incio de
aprendizado, j que precisamos, inicialmente, acumular o conhecimento
necessrio para a construo de um programa completo em C.
Visando facilitar o aprendizado, em alguns momentos, ser feito um
paralelo entre a sintaxe do C e do Portugol do VisuAlg
6
(linguagem
utilizada para escrever algoritmos).
Saiba Mais
5
O Dev-cpp
uma ferramenta
gratuita e pode
ser baixada
acessando o site:
www.bloodshed.
net/devcpp.html
Saiba Mais
6
Conhea
mais o VisuAlg
pesquisando no
site: http://www.
apoioinformatica.
inf.br/visualg/
linguagem.htm
25
Programao 2
Figura 2.1: Qualidades de um programador: ateno, pacincia e persistncia
Vale lembrar que qualquer linguagem de programao assimilada
atravs da resoluo de exerccios. importantssimo que a prtica
de programar faa parte da rotina de vocs. Assim, separem sempre
um tempo para resolver as questes propostas neste material. Vocs
vo perceber o quanto bom ver um programa rodando! Que venha
o C!
2.1. Estrutura de um Programa Bsico em C
Nesta seo, vamos estudar a estrutura de um programa bsico
em C. Visando facilitar o entendimento e no sobrecarregar vocs
com muitos detalhes, alguns elementos da estrutura do programa
sero omitidos. Mas, no momento certo, abordaremos tais elementos,
certo? Assim, a estrutura do programa que ser apresentada nesta
seo, a estrutura mnima de um programa em C.
Nas linguagens de programao em geral, existe uma estrutura que
indica a ordem em que deve ser disposto cada elemento do programa.
Esta ordem deve ser respeitada para que nossos programas fquem
corretos. Como ser a estrutura de um programa em C?
A estrutura bsica de um programa C deve seguir a seguinte
ordem:
1. Incluso de bibliotecas (quando necessrio);
2. Declarao das constantes (quando necessrio);
3. Programa principal;
26
Programao 2
Declarao de variveis (quando necessrio);
Seqncia de comandos.
Para entendermos melhor a estrutura bsica de um programa C,
vamos analisar o programa de exemplo 2.1, abaixo. Este programa
calcula o cubo de um nmero inteiro fornecido pelo usurio. Na
sequncia, temos este programa resolvido utilizando o portugol, que
do conhecimento de vocs. Assim, fca fcil compararmos a estrutura
do programa em C, com a estrutura do algoritmo. No se preocupem
em entender cada comando do exemplo abaixo, estamos apenas
comeando a estudar o C, certo?
Exemplo 2.1: Programa C Clculo do cubo de um nmero
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
main()
{
int num,c;
printf(Cubo de um numero\n\n);
printf(Digite o numero: );
scanf(%d,&num);
c = num*num*num;
printf(\nCubo de %d = %d,num,c);
getche();
}
Segue abaixo o algoritmo, escrito no VisuAlg, que calcula o cubo
de um nmero.
27
Programao 2
Exemplo 2.2: Algoritmo Calculo do cubo de um nmero
1
2
3
4
5
6
7
8
9
10
algoritmo Cubo
var
num, c: inteiro
inicio
escreval(Cubo de um numero)
escreva(Digite o numero: )
leia(num)
c <- num*num*num
escreval(Cubo de , num, = , c)
fmalgoritmo
Um programa em C inicia com a incluso de bibliotecas. Uma
biblioteca um arquivo que contm comandos complementares,
que so utilizados pelo nosso programa. Para a incluso de uma
biblioteca devemos usar um comando que chamado de diretiva de
compilao. Este comando informa ao compilador quais bibliotecas
devem ser anexadas ao programa executvel. Assim, o comando para
a incluso de uma biblioteca tem a seguinte sintaxe:
Sintaxe
#include <nome_do_arquivo_da_ biblioteca>
De acordo com a sintaxe, para incluir uma biblioteca ao nosso
programa devemos colocar a diretiva de compilao #include e, entre
os smbolos < e >, colocamos o nome do arquivo da biblioteca. De
maneira geral, os arquivos de biblioteca tm a terminao .h (esse h
vem de header, ou seja, este um arquivo de cabealho). Para cada
biblioteca, que ser includa no nosso programa, devemos colocar
um comando #include. No exemplo 2.1, na linha 1, feita a incluso
de uma biblioteca: stdio.h. Na medida em que formos aprendendo
os comandos, sero indicadas quais bibliotecas devem ser includas
no programa. A quantidade de bibliotecas e quais bibliotecas sero
28
Programao 2
includas, depende dos comandos que sero utilizados no programa.
Pode ser que em um programa, no seja necessrio incluir nenhuma
biblioteca.
O segundo item da estrutura de um programa C a declarao
das constantes, esse item opcional, s constar no nosso programa,
caso seja necessrio. Veremos a declarao de constantes, em
detalhes, no prximo captulo. No exemplo 2.1 no foi necessrio o
uso de constantes.
O terceiro item da estrutura do programa C o programa principal.
no programa principal que colocaremos a sequncia de comandos
que deve ser executada para a soluo do problema que desejamos
resolver. Ns devemos informar onde comea e termina o programa
principal. O programa principal inicia com: main()
7
, como mostra a linha
2, do exemplo 2.1. A sequncia de comandos do programa principal
delimitada por um par de chaves: { (abre chaves) e } (fecha chaves).
As chaves que delimitam o corpo do programa principal
8
aparecem
nas linhas 3 e 11, do exemplo 2.1. Fazendo uma comparao com
o algoritmo do exemplo 2.2, as chaves fazem o papel do inicio e
fmalgoritmo, das linhas 4 e 10.
Logo no incio do programa principal, devem ser declaradas as
variveis (que sero abordadas no prximo captulo). A declarao
de variveis um item opcional, pode acontecer de no precisarmos
declarar variveis no nosso programa. No exemplo 2.1, a declarao
de variveis feita na linha 4. Foram declaradas duas variveis do
tipo inteiro: num e c. No algoritmo, exemplo 2.2, as variveis so
declaradas fora do programa principal, na seo de declarao de
variveis (linhas 2 e 3).
Aps a declarao das variveis, colocamos a sequncia de
comandos que o programa dever executar. O programa termina com
o fecha chaves que delimita o programa principal.
Agora que j sabemos como a estrutura de um programa bsico
em C, vamos comear a aprender a sintaxe dos comandos para
darmos incio ao desenvolvimento dos nossos programas.
2.2. Palavras Reservadas do C
Como mencionado no captulo anterior, as linguagens de
programao so formadas por um conjunto de regras de sintaxe e
Saiba Mais
7
Do Ingls,
main signifca
principal. Todo
programa C
comea a sua
execuo a partir
do programa
principal. Assim,
o programa
principal uma
parte obrigatria
na estrutura de
um programa C.
Saiba Mais
8
Chamamos
de corpo do
programa
principal toda
a sequncia
de comandos
que faz parte
do programa
principal. Ou seja,
a seqncia de
comando que
aparece entre
as chaves de
abertura e trmino
do programa
principal.
29
Programao 2
semntica que ditam como o programa deve ser escrito. Com isso,
dentro dessas regras, existe um conjunto de palavras que tem um
signifcado para a linguagem de programao so as palavras
reservadas. Uma palavra reservada , essencialmente, um comando
e, na maioria das vezes, as palavras reservadas de uma linguagem
defnem o que pode ser feito e como pode ser feito.
As palavras reservadas so de uso exclusivo da gramtica da
linguagem, por isso, no podem ser utilizadas, pelo programador, para
dar nome a alguma varivel, constante ou funo do seu programa.
Assim, um programador no pode ter uma varivel chamada int no
seu programa C, j que int uma palavra reservada que indica um
tipo de dado.
Na linguagem C temos 32 palavras reservadas. Todas as palavras
reservadas do C so escritas em minsculo. A tabela abaixo mostra
as palavras reservadas, conforme defnido pelo padro ANSI
9
, para a
linguagem C.
auto
break
case
char
const
switch
volatile
continue
default
do
double
else
typedef
while
enum
extern
foat
for
goto
union
if
int
long
register
unsigned
return
short
signed
sizeof
static
struct
void
No Dev-cpp, ambiente de programao que ser utilizado, sempre
que digitarmos uma palavra reservada no nosso programa, esta
aparecer em negrito. Isto facilita no momento da programao, pois
no precisaremos decorar esta lista de palavras reservadas. Que
alvio! Assim que uma palavra fcar em negrito no nosso programa,
poderemos verifcar se estamos utilizando-a de forma correta.
2.3 Uso de Comentrios
Os comentrios so utilizados para documentar um programa. A
colocao de comentrios em um programa uma das boas prticas
de programao
10
. Os comentrios iro facilitar o entendimento
e manuteno de programas. Por exemplo, um programador
responsvel por desenvolver o sistema de controle de vendas
Saiba Mais
9
A sigla ANSI
signifca:
American
National
Standards
Institute (Instituto
Nacional
Americano de
Padronizao).
uma organizao
que tem por
objetivo facilitar a
padronizao dos
trabalhos de seus
membros.
Saiba Mais
10
Ao desenvolver
nossos
programas
utilizando boas
prticas de
programao,
teremos como
resultado um
cdigo fonte
mais legvel e
um progama
executvel mais
seguro e efciente.
Ao longo deste
material sero
ensinadas boas
prticas de
programao.
30
Programao 2
da sua empresa. Como o sistema grande, aps um tempo, ele
no lembrar mais o porqu de ter colocado uma sequncia de
comandos no seu programa. Se o programa estiver bem comentado,
o programador poder, rapidamente, ter esta resposta. Alm disso,
quando desenvolvemos programas em grupo, importante que os
demais membros do grupo entendam o raciocnio do nosso programa
e isso pode ser explicado atravs dos comentrios.
Os comentrios podem ser colocados em qualquer parte do
programa. Quando o compilador identifca um comentrio, ele os
ignora, j que os comentrios so apenas informaes para o
programador. A linguagem C fornece dois tipos de comentrios: de
linha e de bloco. Vamos detalhar como funciona cada um deles.
Os comentrios de linha so mais utilizados quando desejamos
comentar uma nica linha do nosso programa. Um comentrio de
linha possui a sintaxe a seguir:
Sintaxe
// texto do comentrio
Um comentrio de linha inicia com duas barras // e, na sequncia,
vem o texto do comentrio. O exemplo 2.3, a seguir, apresenta um
programa comentado. Na linha 7 temos o exemplo de um comentrio
de linha. Este comentrio serviu para informar para que serve a
varivel C. Assim que o compilador encontra //, ele ignora todo texto
que vem aps as duas barras
11
. Este tipo de comentrio age apenas
na linha que ele inserido.
O segundo tipo de comentrio disponvel na linguagem C o
comentrio de bloco. Os comentrios de bloco so utilizados quando
queremos fazer um comentrio maior, que compreenda mais de uma
linha de comentrio. A sintaxe do comentrio de bloco a seguinte:
Sintaxe
/* texto do comentrio
texto do comentrio
texto do comentrio */
Um comentrio de bloco inicia com barra-asterisco /* e termina
por asterisco-barra */. O compilador ir ignorar tudo o que encontrar
Saiba Mais
11
No Dev-
cpp, quando
colocamos um
comentrio, as
letras do texto
comentado fcam
cinza
31
Programao 2
entre estes dois smbolos. Veja no exemplo 2.3, que nas linhas 2, 3,
e 4 aparece um comentrio de bloco. Este tipo de comentrio do
exemplo utilizado para identifcar quem o programador quando
o programa foi feito e o que o programa faz. Devemos Adotar este
tipo de comentrio no incio dos nossos programas. Assim, ao abrir
um programa, rapidamente, saberemos para que ele serve. Devemos
tomar cuidado para no esquecer o */ que fecha o comentrio de
bloco.
Exemplo 2.3: Programa C Comentado Calculo do cubo de um nmero
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
/* Programador: Snia Frana
Data: 09/03/2009
Programa calcular o cubo de um nmero */
main()
{
int Num, C; // C guarda o cubo do numero
printf(Cubo de um numero\n\n);
printf(Digite o numero: );
scanf(%d,&Num);
C = Num*Num*Num;
printf(\nCubo de %d = %d,Num,C);
getche();
}
2.4. Os Fundamentos do Ambiente C
Na seo 1.5, do captulo anterior, foram abordados os processos
de criao, compilao e execuo de um programa. Nesta seo,
vamos detalhar um pouco mais estes processos, entendendo os
32
Programao 2
fundamentos do ambiente C. A fgura 2.2 apresenta um ambiente
C, com as seis fases pelas quais passa um programa, desde a sua
edio, at a sua execuo.
Figura 2.2: Ambiente C
A fase 1 compreende a edio do nosso programa. O programa
criado com a utilizao de um editor e armazenado no disco do
computador (HD - Hard Disk). O arquivo que contm o nosso programa
tem a terminao .c, e este chamado de programa fonte ou cdigo
fonte.
Ao terminar a edio do programa, o programador solicita que
o seu cdigo fonte seja compilado. O compilador traduz o cdigo
fonte para o cdigo em linguagem de mquina (tambm chamado
de cdigo objeto). Vocs se lembram das diretivas de compilao?
Antes da traduo, temos a fase 2, em que o pr-processador
33
Programao 2
analisa o cdigo fonte, executando as diretivas de compilao. O
pr-processador tambm responsvel por eliminar os comentrios
que o programador colocou no seu cdigo fonte. O pr-processador
ativado automaticamente pelo compilador. Na fase 3, que ocorre o
processo de compilao, aps o cdigo fonte ter sido pr-processado.
Para que o processo de compilao seja concludo, o programa no
pode apresentar erros de sintaxe.
Na fase 4, ocorre o processo de linking, que consiste na ligao do
cdigo objeto, gerado pelo compilador, com o cdigo das funes que
esto disponveis nas bibliotecas que inclumos no nosso programa.
Ou seja, no exemplo 2.1, em que foi includa uma biblioteca, o linker
dever localizar o arquivo da biblioteca e fazer a ligao com o cdigo
objeto. Esta fase termina com a gerao do programa executvel,
armazenando-o no disco do computador. No Dev-cpp, o programa
executvel armazenado no mesmo diretrio que tiver armazenado
o cdigo fonte. Na Figura 2.3, temos um diretrio contendo o arquivo
do cdigo objeto (.c C source fle) e o programa executvel (.exe
application). O arquivo do programa executvel no pode ser editado,
o que ns podemos editar o arquivo do cdigo fonte.
Figura 2.3: Diretrio contendo cdigo objeto e o programa executvel
As fases 5 e 6 consistem na execuo do programa executvel.
Para dar incio a execuo de um programa, necessrio que o mesmo
esteja na memria principal do computador. Isto feito na fase 5, pelo
carregador do programa. O carregador pega o programa executvel
que est armazenado no disco e o transfere para memria principal.
Assim que o programa est na memria principal do computador, ele
est pronto para ser executado. A execuo de um programa feita
pela CPU
12
, que executa as instrues do programa, uma aps a
outra, at o seu trmino.
Saiba Mais
12
CPU a sigla
para Central
Processing
Unit, em Ingls,
ou Unidade
Central de
Processamento.
A CPU a parte
do computador
que processa
as instrues
contidas em um
programa.
34
Programao 2
Na prxima seo, vamos conhecer o Dev-Cpp, que possibilitar a
criao, compilao e execuo dos nossos programas. Com o Dev-
cpp poderemos observar as fases aqui descritas.
2.5. Conhecendo o Dev-cpp
O Dev-Cpp um ambiente de programao que edita, compila
e executa programas C e C++
13
. Sabem porque iremos usar o Dev-
cpp para desenvolver nossos programas? O Dev-cpp gratuito
(muito importante!) e possui uma interface bastante amigvel (mais
importante ainda!). A Figura 2.4 apresenta a tela principal do Dev-
cpp.
Figura 2.4: Tela principal do Dev-cpp
Como mencionado no incio deste captulo, vocs devero baixar
o Dev-cpp e instalar no seu computador, para que possamos fazer
os nossos programas. O processo de instalao no apresenta
difculdades. Vocs s devem fcar atentos no momento que for
questionado sobre qual idioma deseja utilizar, para que faa a escolha
do idioma correto (Portugus), certo? Assim, a interface do Dev-cpp
fcar toda em Portugus, facilitando os seus estudos.
Vamos analisar a tela principal do Dev-cpp, apresentada na fgura
2.4. Na parte 1 temos o menu principal do Dev-cpp, que disponibiliza
Saiba Mais
13
C++ uma
linguagem de
programao que
surgiu a partir
do C.
35
Programao 2
as seguintes opes:
Arquivo: o menu arquivo disponibiliza, basicamente, as opes
para criar, salvar, imprimir e fechar arquivos.
Editar: neste menu encontraremos as opes: copiar, colar,
selecionar, refazer e desfazer.
Localizar: as opes deste menu nos possibilita localizar alguma
palavra no programa fonte, alm de permitir substituies de
uma palavra por outra.
Exibir: neste menu temos as opes que nos permite exibir ou
esconder itens da interface do ambiente, como por exemplo:
barra de ferramenta e barra de status.
Projeto: permite a adio ou remoo de arquivos em um
projeto.
Executar: atravs deste menu que iremos chamar as opes
para a compilao e execuo do nosso programa.
Debug: o debugador auxilia o programador a encontrar erros
no programa, tornando possvel acompanhar passo a passo a
execuo dos comandos do programa. Neste menu teremos as
opes para utilizao do debugador.
Ferramentas: no menu ferramentas temos as opes para
confgurar o ambiente (mudar cores, tipo de letra, dentre outros)
e tambm a opo para atualizao do Dev-cpp.
CVS
14
: este menu utilizado por quem faz o controle de
verses dos programas. Apesar de ser uma funo bastante
interessante, mais utilizado quando trabalhamos em grupo ou
com programas grandes.
Janela: neste menu esto disponveis as opes que nos
permitem escolher qual janela de edio deve fcar visvel
no momento. Utilizamos esta opo quando temos vrios
programas abertos ao mesmo tempo.
Ajuda: neste menu encontramos o help do Dev-cpp.
Na parte 2, da Figura 2.4, temos os cones de atalhos para as
opes mais utilizadas no Dev-Cpp. Se vocs deixarem o mouse
sobre o cone, aparecer um texto, que informa o que ele faz. Na parte
3 temos a rea de edio do programa. Para a rea de edio fcar
Saiba Mais
14
O CVS, ou
Concurrent
Version System
(Sistema
de Verses
Concorrentes)
um sistema
de controle de
verses que
permite que
se trabalhe
com diversas
verses do
mesmo arquivo.
Este sistema
mantm as
verses antigas
do seu arquivo
e os logs de
quem e quando
manipulou os
arquivos.
especialmente
til para se
controlar verses
de um software
durante seu
desenvolvimento,
ou para
composio
colaborativa de
um documento.
36
Programao 2
disponvel, vocs devero escolher a opo Arquivo/Novo/Arquivo
Fonte. nesta rea que digitaremos os nosso programas (cdigo
fonte). A parte 4 fca visvel quando nosso programa apresenta algum
erro de compilao. O compilador indicar em qual linha foi encontrado
um erro, e fornece uma dica do que pode ser o erro. Mesmo que
vocs tenham instalado o Dev-cpp em Portugus, as mensagens de
erro so apresentadas em Ingls. Por isso, importante que vocs
comecem a se familiarizar com estas mensagens, para que consigam
tirar mais rapidamente os erros dos programas.
Segue abaixo um roteiro do que vocs precisam fazer para editar,
compilar e executar seus programas no Dev-cpp:
1. Crie um arquivo fonte novo na opo: Arquivo/Novo/Arquivo
Fonte;
2. Digite o programa fonte na rea de edio. Ao terminar de edit-
lo, salve o arquivo;
3. Compile o programa na opo: Executar/Compilar;
4. Se der algum erro no programa, vejam as indicaes de
erro fornecidas pelo compilador
15
. Conserte os erros, salve o
arquivo e compile novamente. Isto deve ser feito at que seja
apresentada uma mensagem indicando que o programa no
tem erros de compilao.
5. Se vocs acessarem o diretrio que o arquivo do cdigo fonte
foi armazenado, notaro que foi criado um arquivo com a
extenso .exe (com o mesmo nome do arquivo do cdigo fonte).
Este programa executvel. Para execut-lo, escolha a opo
Executar/Executar no Dev-cpp. Imediatamente, aparecer a
janela de execuo do programa, como mostra a Figura 2.5.
Figura 2.5: Janela do programa em execuo
nesta janela que o programa ser executado. Aqui o usurio
Saiba Mais
15
O erro de
compilao pode
no estar na linha
que o complilador
est indicando. O
erro poder estar:
na linha que ele
est indicando,
na linha
imediatamente
acima, ou ainda,
em linhas mais
acima (menos
comum de
acontecer).
37
Programao 2
dever fornecer os dados solicitados pelo programa, neste caso o
programa est solicitando que seja digitado um nmero. Alm disso,
tambm receber os resultados fornecidos pelo programa. Quando
a execuo de um programa fnalizada, esta janela ser fechada
automaticamente.
Agora que j conhecemos o ambiente de desenvolvimento de
programa C, precisamos aprender os comandos para fazer um
programa completo. Nos prximos captulos iremos ver tais comandos,
para podermos comear a programar. No fquem ansiosos(as), a
nossa hora de programar est chegando!
Atividades e Orientaes de Estudo
Vamos resolver mais uma lista de exerccios? Note que estamos
conhecendo, ao poucos, os detalhes que envolve a programao de
computadores. A resoluo das atividades propostas far com que
estes conceitos sejam assimilados de forma mais natural. sempre
importante complementar o nosso conhecimento com a leitura de
livros e materiais disponveis na Internet, indicados na seo Conhea
Mais. Ser que vocs esto lembrados (as) das respostas para as
questes abaixo?
1. Quando que precisamos incluir uma biblioteca em um
programa C?
2. O que diretiva de compilao?
3. O que deve ter no corpo do programa principal?
4. O que uma palavra reservada?
5. Porque devemos comentar nossos programas?
6. Qual a funo do pr-processador no momento da compilao
de um programa?
7. Qual o papel do linker no processo de compilao?
8. Qual elemento do computador responsvel pela execuo do
programa?
38
Programao 2
Conhea Mais
Vocs podero aprender mais sobre boas prticas de programao
nos sites:
http://www.ibm.com/developerworks/aix/library/au-hook_
duttaC.html
ht t p: / / www2. el et r oni ca. or g/ ar t i gos/ el et r oni ca- di gi t al /
programando-em-c-boas-praticas
Para conhecer mais detalhes do ambiente de programao que
iremos utilizar, acessem os sites:
http://www.bloodshed.net/dev/index.html
http://www.uniqueness-template.com/devcpp/
Vamos revisar?
Nesta seo iremos revisar os principais tpicos vistos neste
captulo. Vale a pena dar uma lida para verifcar como est o nosso
aprendizado. Observem o resumo a seguir:
A estrutura bsica de um programa C deve seguir a seguinte ordem:
incluso de bibliotecas, declarao das constantes e programa
principal. No corpo de programa principal temos: declarao de
variveis e seqncia de comandos.
Uma biblioteca um arquivo que contm comandos
complementares, que so utilizados pelo programa. Para a incluso
de uma biblioteca devemos usar um comando que chamado de
diretiva de compilao.
As palavras reservadas de uma linguagem defnem o que pode ser
feito e como pode ser feito. O programador no pode utilizar uma
palavra reservada da linguagem para dar nome as suas variveis,
constantes e funes.
O uso de comentrio nos programas uma boa prtica de
programao, e facilita o entendimento do cdigo fonte.
39
Programao 2
Passos para o desenvolvimento de um programa: edio, pr-
processamento, compilao, ligao (linking), carregamento e
execuo.
O compilador traduz o cdigo fonte para o cdigo em linguagem
de mquina. O pr-processador analisa o cdigo fonte, executando
as diretivas de compilao.
O linker faz a ligao do cdigo objeto, gerado pelo compilador,
com o cdigo das funes que esto disponveis nas bibliotecas
que inclumos no programa.
Ao ser executado, um programa deve ser carregado na memria.
O carregador, tambm conhecido por loader, e responsvel por
acessar o programa armazenado no disco e carreg-lo para a
memria principal do computador.
Os programas so executados passo a passo pelo processador
do computador.
40
Programao 2
Captulo 3 Tipos de Dados,
Variveis e Constantes
Vamos conversar sobre o assunto?
Programas so feitos para manipular dados. Armazenar notas,
calcular mdias, alterar um endereo, etc. Os dados so a essncia
de um programa. Dados precisam ser armazenados e modifcados
ao longo da execuo do programa. Neste captulo, iremos conhecer
os tipos de dados suportados pela linguagem C e aprender a defnir
constantes e variveis.
Inicialmente, os comandos sero apresentados em separado. Mas,
logo em seguida, veremos o ponto em que cada comando deve ser
colocado na estrutura do programa, certo? Tenham pacincia! Vocs
iro notar que muito dos conceitos estudados nos captulos anteriores
sero referenciados neste captulo. Mas isto no problema, no
mesmo? Vamos continuar os nossos estudos, conhecendo mais um
pouco da linguagem C.
3.1. Tipos de dados
Nesta seo, vamos aprender um conceito importante em
programao, que : tipo de dados. De maneira geral, os programas
manipulam dados, armazenando-os e, muitas vezes, modifcando seus
valores. Primeiramente, vamos conhecer quais os tipos de dados so
manipulados na linguagem C. Basicamente, a linguagem C, manipula
quatro tipos de dados: inteiro, real, caractere e void
16
. Para cada tipo
de dado, necessria uma quantidade de bits
17
para armazen-lo.
Alm disso, cada tipo de dado possui um conjunto de operaes
que pode ser executada sobre ele. Nas subsees seguintes, vamos
detalhar cada tipo de dado separadamente.
3.1.1. Inteiro
Os dados do tipo inteiro so toda e qualquer informao numrica
que pertena ao conjunto dos nmeros inteiros relativos (negativo,
nulo ou positivo). Os nmeros inteiros, em C, se dividem em trs tipos,
como mostra a tabela a seguir.
Saiba Mais
16
A linguagem
C no possui
o tipo lgico,
que armazena
verdadeiro ou
falso.
Saiba Mais
17
Bit uma
abreviatura de
Binary Digit
(dgito binrio).
Este termo foi
criado pelo
engenheiro belga
Claude Shannon
que em 1949
para simbolizar
uma unidade de
informao. Tudo
na informtica
medido em bits,
desde o tamanho
de um nmero
at a velocidade
de transferncia
de dados em uma
rede. Por ser uma
unidade binria,
pode ter apenas
dois valores, zero
ou um.
A partir do bit,
surgiu o byte, que
nada mais do
que um conjunto
de 8 bits.
Existem diversos
mltiplos dos
bytes: um kilobyte
(KB), equivalente
a 1.024 bytes;
um megabyte
(MB), equivalente
a 1.024 KB; e
um gigabyte,
equivalente a
1.024 MB.
41
Programao 2
Tipo Tamanho Intervalo Suportado
Short 16 bits -32.768 a +32.767
Int 32 bits -2.147.483.648 a + 2.147.483.647

Long

64 bits
-9.223.372.036.854.775.808
a
+9.223.372.036.854.775.807
Qual a diferena entre cada um deles? A diferena entre os tipos
short, int e long a quantidade de memria
18
que reservada para
armazen-los. Veja como simples: medida que se utiliza mais
memria, aumenta o intervalo do valor que pode ser armazenado. Por
exemplo, para armazenar um dado do tipo short, so reservados 16
bits de memria. Com isso, o tipo short pode suportar um nmero
inteiro no intervalo de -32.768 a +32.767, como apresentado na
tabela. Portanto, dependendo do valor que ser armazenado, deve
ser escolhido um tipo (short, int ou long) que comporte tal valor. Por
exemplo, para armazenar a idade de um funcionrio, o tipo short
o mais adequado (j que a idade de uma pessoa um valor que
raramente ultrapassa 100). No entanto, para armazenar a quantidade
de eleitores de uma cidade, deve-se usar o tipo int (note que em
muitas cidades, a quantidade de eleitores ultrapassar o maior valor
suportado pelo tipo short: 32.767). Para facilitar nosso estudo, neste
material, sempre ser usado o tipo int para armazenar os dados
inteiros.
3.1.2. Real
Os dados do tipo real so toda e qualquer informao numrica
que pertena ao conjunto de nmeros reais (negativo, positivo ou
nulo). Os nmeros reais, em C, podem ser de dois tipos, como mostra
a tabela abaixo:
Tipo Tamanho Intervalo Suportado
foat 32 bits 3.4E-38 a 3.4E+38
double 64 bits 1.7E-308 a 1.7E+308
Para o tipo foat so reservados 32 bits de memria, o que
possibilita armazenar um valor no intervalo 3.4
38
a 3.4
38
. Como o tipo
foat suporta valores bem altos, neste material, sempre ser usado o
tipo foat para armazenar os dados reais.
Ateno
18
A memria
a parte do
computador que
tem como funo
o armazenamento
de dados. Quando
um dado vai ser
armazenado,
precisamos
reservar uma
quantidade de
memria para
isto.
42
Programao 2
3.1.3. Caractere
Na linguagem C, os caracteres so do tipo char, representados
por toda e qualquer informao composta por um nico caractere
alfa numrico (a, b, c,...z, A, B, C,...Z, 0...9) ou especial (como por
exemplo: ; # ? @ ! < ?). O tipo char armazena um nico caractere.
Quando se deseja armazenar vrios caracteres, necessrio defnir
um vetor de caractere (mais detalhes na seo 3.2.2). Por exemplo,
o nome de um aluno formado por uma cadeia de caracteres,
assim, ser necessrio usar um vetor de caracteres. Cada caractere
armazenado ocupa o espao de 8 bits de memria. Um caractere
deve ser representado entre apstrofo, por exemplo: a. Mas, quando
temos uma cadeia de caracteres, esta deve ser representada entre
aspas dupla, por exemplo: Pedro Goncalves.
3.1.4. Void
Em Ingls, void quer dizer vazio e isto mesmo que o void . Void
um tipo que no armazena nada (um tanto esquisito, no ?). Este
tipo serve para indicar que um resultado no tem um tipo defnido. Ele
utilizado quando estamos defnindo funes nos nossos programas.
Permiti-nos desenvolver funes que no retornam nada e funes
que no tm parmetros. Voltaremos a falar do tipo void no Volume 2,
no captulo que aborda modularizao.
3.2. Variveis e Constantes
Agora que j sabemos os tipos de dados manipulados pela
linguagem C, vamos aprender como reservar espaos de memria
para o armazenamento dos nossos dados.
Qualquer dado que seja manipulado pelo programa deve fcar
armazenado na memria principal do computador. Para que o
armazenamento seja possvel, precisaremos reservar espaos na
memria principal do computador. As variveis e constantes so
unidades bsicas de armazenamento dos dados em programao.
Elas so um espao de memria reservado para armazenar um certo
tipo de dado e possuem um identifcador (nome) para referenciar o
seu contedo. Dessa forma, nossos dados fcam armazenados em
constantes ou variveis.
Uma varivel pode conter, a cada instante, valores diferentes. No
43
Programao 2
entanto, as constantes referem-se a valores fxos que no podem
ser alterados durante a execuo do programa. O modo como cada
constante representada depende do seu tipo (este assunto ser
detalhado um pouco mais a frente).
Para entender o conceito de variveis e constantes, vamos fazer
a seguinte analogia: um armrio cheio de gavetas de tamanhos
diferentes. Acompanhem o raciocnio: Pedro tem um armrio e
decide que em cada gaveta ser guardado um tipo de roupa: camisa,
bermuda, cala, etc.
Figura 3.1: Armrio cheio de gavetas
Em uma dada gaveta, s podem ser armazenadas camisas. No
ser permitido o armazenamento de calas nesta gaveta. Para facilitar
a identifcao, Pedro coloca uma etiqueta informando o que cada
gaveta guarda. Com isso, Pedro poder identifcar, rapidamente, em
qual a gaveta esto guardadas suas camisas.
Agora vamos associar a ideia das gavetas com a ideia de variveis,
constantes e tipo. As gavetas que guardam as roupas so como os
espaos de memria que armazenam nossos dados. Assim como uma
gaveta s pode armazenar um tipo de roupa, os espaos de memria
so especifcados para armazenar um tipo de dado. Dependendo do
tipo de roupa, a gaveta precisa ser maior ou menor. Da mesma forma,
dependendo do tipo de dado, feito uma reserva de mais ou menos
memria para armazen-lo (de acordo com as tabelas da seo 3.1).
As etiquetas das gavetas so os identifcadores dos nossos
44
Programao 2
espaos de memria. Assim, iremos encontrar, facilmente, um dado
armazenado nos nossos espaos de memria. Quando temos uma
varivel, o contedo da nossa gaveta pode mudar ao longo do
tempo. Mas, no caso de uma constante, seu contedo ser sempre o
mesmo.
Nas prximas sees, vamos aprender as regras para dar nomes
s nossas variveis e constantes e como criar as nossas gavetas
espaos de memria (variveis e constantes).
3.2.1. Identifcadores
Para que o compilador saiba quais dados estamos querendo
manipular, eles precisam ter um nome. como ns, todos temos um
nome. Sabemos quando algum est nos chamando quando falam
o nosso nome. Vai acontecer a mesma coisa com os espaos de
memria dos nossos programas, precisamos identifc-los, de alguma
forma. Os identifcadores so os nomes que damos as nossas
variveis, constantes, funes e procedimentos usados no programa.
Para criar um identifcador necessrio respeitar as regras a seguir:
O primeiro caractere deve ser uma letra ou _ (underscore);
O restante do nome deve ser formado por caracteres
pertencentes ao seguinte conjunto: a,b,c,..z, A,B,C,...Z,
0,1,2,...,9, _ (ou seja: letras, nmeros e underscore);
No deve haver espao em branco (ou seja, no existe
identifcadores compostos, formados por dois ou mais nomes);
No utilizar acentos, nem cedilha;
Os identifcadores podem ter at 32 caracteres;
No deve haver identifcadores repetidos (Se dermos o mesmo
nome para duas variveis do nosso programa, o compilador
no vai saber qual delas ser chamada, e isso no pode
acontecer).
A linguagem C faz distino de maisculas e minsculas. Assim,
os identifcadores: Media, MEDIA, MediA e media, so diferentes.
O fato de termos uma nica letra de forma diferente (maiscula ou
minscula), j faz com que os identifcadores se diferenciem. Esta
propriedade chamada de case sensibility (sensibilidade a letras
maisculas e minsculas).
45
Programao 2
DICA: Boa Prtica de Programao
Escolham bem os nomes das variveis e constantes do
programa. Os identifcadores escolhidos devem ser claros, a fm
de explicitar o contedo que ser armazenado, mas tambm
no devem ser extensos para no difcultar a escrita.
A seguir, vamos verifcar exemplos de identifcadores corretos e
incorretos:
Identifcadores corretos: a, x2, Nome_Aluno, Media,
SalarioFuncionario. Note que, quando queremos usar
identifcadores com mais de uma palavra, que foi o caso de
Nome_Aluno, usamos o _ para ligar uma palavra a outra. Ou
usamos as palavras juntas, como o exemplo SalarioFuncionario.
Lembrando que no podemos usar espao em branco.
Identifcadores incorretos: 2m (comeou com nmero),
media* (caractere * no permitido), Nome disciplina (no pode
haver espao em branco), funcionrio (no pode acentuar).
At este momento, vimos os conceitos de tipos de dados, variveis,
constantes e identifcadores. Na prxima seo, estes conceitos
sero utilizados em conjunto, para que possamos declarar as nossas
variveis, ou seja, criar espaos de memria para armazenar os dados
manipulados pelo nosso programa. Continuemos a nossa leitura.
3.2.2. Declarao de Variveis
Para que se possa usar uma varivel em um programa,
primeiramente, necessrio fazer a declarao dela. A declarao
de uma varivel informa ao processador duas coisas: o identifcador
(nome) da varivel e o seu tipo de dado. As variveis precisam de
um nome para que o processador saiba onde desejamos armazenar
o nosso dado. Alm disso, toda varivel precisa ser associada a um
tipo de dado, para que o processador reserve o espao de memria
necessrio para o seu armazenamento. Como visto na seo 3.1, cada
tipo de varivel, ocupa uma quantidade de bits diferente. Resumindo,
toda varivel possui um nome, um tipo e um contedo (ou valor que
armazenado na varivel).
46
Programao 2
A declarao de variveis deve obedecer a seguinte sintaxe:
Sintaxe
tipo [variavel_1, variavel_2, ...];
Onde tipo o tipo de dado (int, foat, char) e variavel_1 o nome
da varivel a ser declarada. O nome da varivel deve seguir a regra
dos identifcadores (mencionadas na seo 3.2.1). Se houver mais de
uma varivel do mesmo tipo, seus nomes so separados por vrgulas.
Notem que, no fnal do comando, aparece um ponto e virgula (;),
indicando ao compilador que o comando terminou.
Exemplo 3.1: Declarao de Variveis
1
2
3
int idade, matricula;
foat media, total;
char letra, nome_aluno[20];
As variveis idade e matricula so espaos de memria que
armazenam nmeros inteiros. As variveis media e total armazenam
nmeros reais. Note que na linha 3, temos as variveis letra e
nome_aluno. Quando uma varivel caractere tem apenas um nico
caractere, na sua declarao, necessrio apenas dar um nome a
esta varivel.
Quando houver necessidade de armazenar vrios caracteres,
temos o que chamado de cadeia de caracteres, vetor de caracteres
ou string. Uma cadeia de caracteres forma uma palavra ou frases. Para
declarar uma varivel capaz de armazenar uma cadeia de caracteres,
devemos colocar ao lado do nome da varivel, entre colchetes, um
valor inteiro, que signifca quantos caracteres podem ser armazenados
nesta cadeia. Assim, a varivel nome_aluno, declarada na linha 3, tem
capacidade de armazenar uma palavra/frase com at 20 caracteres.
A fgura 3.2 representa a memria do computador, aps a declarao
das variveis do exemplo. Cada caixa representa uma varivel. E,
cada varivel possui o seu identifcador. Assim, esta declarao de
variveis resultou na reserva de seis espaos na memria. Toda vez
que precisarmos acessar ou armazenar o contedo de uma varivel,
utilizaremos o seu identifcador.
47
Programao 2
Figura 3.2: Representao da memria do computador
aps a declarao de um conjunto de variveis
Ateno
Como dito anteriormente, o C difere as letras minsculas
das maisculas. Assim, os tipos de dados e comandos que
iremos aprender ao longo da disciplina, DEVEM ser escritos em
minsculo. Se vocs fzerem a seguinte declarao : Int x,y; Vai
ocorrer um erro no momento da compilao do seu programa,
j que o C no conhece o tipo Int com I maisculo. Fiquem
atentos, pois esse um erro comum para quem est comeando
a programar em C.

De acordo com o que foi visto, quando estudamos a estrutura
da um programa C, as variveis devem ser declaradas logo quando
inicia o corpo do programa principal. Vamos estudar, a seguir, como
fazemos para declarar as nossas constantes.
3.2.3. Declarao de Constantes
Diferente das variveis, as constantes mantm seu valor ao
longo do programa. Para indicar ao compilador que se trata de uma
constante, a diretiva de compilao #defne utilizada. Segue a
sintaxe da declarao de uma constante.
Sintaxe
#defne <identifcador> <valor>
48
Programao 2
No necessrio colocar o ponto e vrgula no fnal da linha e
tambm no precisa informar o tipo de dado da constante. O valor
de uma constante no pode ser modifcado, de maneira alguma, ao
longo da execuo do programa.
O modo como cada constante representada depende do seu
tipo. Constantes do tipo inteiro so representadas por nmeros sem
o componente fracionrio, por exemplo, 123 e 2009. Constantes reais
precisam do uso de ponto decimal seguido do componente fracionrio
do nmero, por exemplo, 302.54. Constantes caractere so colocadas
entre apstrofos, por exemplo, a. Constantes cadeia de caractere
so colocadas entre aspas duplas, por exemplo, Casa e Maria. A
seguir so apresentadas as declaraes de quatro constantes:
Exemplo 3.2: Declarao de Constantes
1
2
3
4
#defne DIAS 7
#defne PI 3.1416
#defne RESPOSTA s
#defne DISCIPLINA Matemtica
De acordo com o exemplo, a constante DIAS ir armazenar sempre
7. Como o valor que esta constante recebeu foi um valor inteiro, o
compilador entende, automaticamente, que esta uma constante
inteira. Da mesma forma, como a constante PI recebeu 3.1416 (um
nmero real), o compilador saber que se trata de uma constante do
tipo real. A constante RESPOSTA armazena um char e DISCIPLINA
uma cadeia de caracteres.
interessante declarar uma constante quando sabemos que um
valor no ser modifcado ao longo da execuo do programa. Por
questes de padronizao, declare as suas constantes com todas as
letras em maisculo, como apresentado nos exemplos. Assim voc
estar diferenciando-as das variveis.
De acordo com a estrutura de um programa C, as nossas
constantes so declaradas no incio do programa, logo aps incluirmos
as bibliotecas que sero utilizadas. Esto lembrados(as) disso? Se
no esto, deem uma revisada na seo 2.1, certo?
Ao serem criadas, as constantes j recebem o valor que elas vo
armazenar ao longo do programa. Isto no acontece com as variveis.
49
Programao 2
Mas como fazemos para armazenar um valor em uma varivel? Esta
resposta vocs encontraro na prxima seo.
3.3. Operador de Atribuio (=)
Esse operador utilizado para armazenar um valor em uma dada
varivel. Assim, o operador de atribuio nos possibilita armazenar
um dado em um espao de memria, que foi previamente declarado.
importante que o dado que ser armazenado seja compatvel com
o tipo da varivel que receber a atribuio. Por exemplo, as variveis
reais podem receber valores reais e inteiros. No entanto, uma varivel
inteira, no pode receber um valor real. Segue a sintaxe do operador
de atribuio.
Sintaxe
Variavel = Valor;
Variavel_1 = Variavel_2;
Variavel = Expresso Aritmtica;
Variavel = funo;
Variavel_1 = variavel_2 = variavel_3 = valor;
O operador de atribuio representado pelo smbolo =. No lado
esquerdo do operador da atribuio, temos a varivel que vai receber
o valor. No lado direito do operador, temos o valor que ser atribudo
varivel. Ao fnal da linha de atribuio deve ter um ponto e vrgula.
Notem que o operador de atribuio permite vrias possibilidades.
Para um melhor entendimento, o exemplo 3.3 apresenta cada uma
das possibilidades do operador de atribuio.
50
Programao 2
Exemplo 3.3: Comando de atribuio
1
2
3
4
5
6
7
8
9
foat Media, X, Y, Z;
int J, L, M, K, A, B;
char Letra;
Media = 7.5;
Letra = D;
X = Y;
K = A + B;
Z = sqrt(4);
J = L = M = 10;
Nas linhas 1, 2 e 3, temos a declarao das variveis. Lembrem
que s podemos armazenar algum valor, caso tenhamos declarado
as variveis. Uma vez que necessrio ter reservado espaos de
memria para nossos dados, entendido?
Na linha 4, a varivel Media recebeu 7.5 (para nmeros reais,
devemos utilizar ponto ao invs de virgula, para separar a parte inteira
da parte fracionria do nmero)
19
.
Na linha 5, temos uma atribuio para uma varivel char com um
nico caractere. Note que, neste caso, o valor que a varivel receber
vem entre apstrofo. Assim, a varivel Letra est recebendo D.
Ateno
O operador de atribuio no usado para variveis do tipo
char com vrios caracteres. Este tipo de atribuio ser visto no
captulo Comandos de Manipulao de Caracteres, do Volume
4.
Na linha 6, a varivel X receber o valor que est armazenado
na varivel Y. Na linha 7, a varivel K ir receber o resultado da
Saiba Mais
19
Onde aparece o
= do comando de
atribuio, nos
lemos: recebe.
Assim, o
comando da linha
4 do exemplo 3.3,
seria lido: Media
recebe 7.5.
51
Programao 2
expresso A + B, ou seja, ser obtido o valor armazenado na varivel
A, depois o valor da varivel B, os valores so somados e o resultado
atribudo a varivel K. Uma varivel sempre recebe um valor. Quando
a atribuio tem uma expresso matemtica, a expresso resolvida
e o resultado atribudo a varivel.
Na linha 8, a varivel Z receber o resultado da chamada da funo
sqrt (que faz o clculo da raiz quadrada de um nmero). Veremos
mais detalhes sobre estas funes no captulo 5.
Na linha 9, aparece o que chamamos de atribuio em cadeia.
Quando vrias variveis vo receber o mesmo valor, ao invs de
ser feita uma atribuio de cada vez, podemos dizer: variavel1 =
variavel2 = variavel3 = valor. Ns podemos atribuir o mesmo valor a
quantas variveis quisermos. Coloquei um exemplo com trs, certo?
No exemplo da linha 9, as variveis K, L e M vo receber 10. Mas
tem um detalhe, ns s podemos usar a atribuio em cadeia quando
todas as variveis que iro receber o valor so do mesmo tipo. Assim,
nesta atribuio do exemplo, as trs variveis K, L e M so do mesmo
tipo: int.
Atividades e Orientaes de Estudo
Temos agora mais uma lista de exerccios para consolidar o nosso
entendimento do assunto visto neste captulo. Vocs perceberam
quantas coisas novas ns j aprendemos at aqui? Como uma
linguagem de programao envolve vrios detalhes, so os exerccios
que vo nos ajudar a no esquecer deles. Prontos (as) para acertar
todas as questes?
1. Identifque os tipos dos valores abaixo (int, foat, char de um
caractere ou char de vrios caracteres):
1) 1000 2) 09 3) 1.56 4) VERDADE
5) 456 6) 34 7) C 8) 45.8976
9) BRASIL 10) l 11) - 5.6 12) 300
2. Abaixo, temos exemplos de identifcadores. Assinale os
identifcadores vlidos e descreva o erro dos operadores
invlidos.
52
Programao 2
1) endereco 2) 21brasil 3) fone$com 4) nome_usuario
5) usuario6 6) nome*usuario 7) end*a-6 8) #media
9) nome aluno 10) mdia 11) _pais 12) Media_da_Turma
3. De acordo com as declaraes abaixo, assinale os comando de
atribuio invlidos e descreva o erro.
int NUM, X, SOMA;
foat MEDIA, K, L;
( ) SOMA = NUM + 2;
( ) MEDIA = SOMA;
( ) NUM = K + L;
( ) X = X + 1
( ) L = SOMA - K;
( ) SOMA + 2 = NUM + 10;
( ) S = SOMA;
( ) X = SOMA - NUM;
Conhea Mais
Comece a aprofundar mais seus conhecimentos com a leituras dos
livros clssicos da linguagem C:
O mais autntico de todos, tem como autores os criadores
desta linguagem: C - A Linguagem de Programao, de B.
W. Kernighan e D. M. Ritchie, editora Campus. Este um livro
relativamente difcil de ler, mas a Bblia da linguagem.
Dois textos mais didticos so:
C Completo e Total, de Herbert Schildt, pela editora MAKRON
Books.
Como programar em C, de H. M. Deitel e P. J. Deitel, pela
editora LTC.
53
Programao 2
A vantagem de ver vrios livros que um autor acaba
complementado o que o outro escreveu. Alm disso, um autor pode
explicar um certo assunto de forma mais clara que o outro. Por isso
bom sempre dar uma olhada em livros novos e material disponvel na
Internet.
Vamos revisar?
Vamos fazer uma reviso do assunto que foi visto neste captulo,
fazendo a leitura do resumo a seguir:
Os tipos de dados manipulados pelo C so: inteiro, real, caractere
e void.
O tipo inteiro se divide em: int, short ou long. A diferena entre os
trs tipos a quantidade de memria reservada para armazen-
los.
O tipo real se divide em: foat e double.
O tipo char armazena um caractere. Quando desejamos armazenar
vrios caracteres, para formar um nome ou frase, precisamos
declarar uma cadeia de caracteres.
As variveis so espaos de memria onde armazenamos nossos
dados. Uma varivel possui um nome, um tipo e um valor.
Para que um varivel passe a existir, precisamos fazer a sua
declarao. Ao declarar uma varivel, damos a ela um nome, e
dizemos que tipo de dado pode ser armazenado na varivel.
Os nomes da variveis so os identifcadores. Para dar um
nome a uma varivel, precisamos seguir a regra de criao de
identifcadores.
As constantes so espaos de memria onde armazenamos um
valor que no ser alterado durante a execuo do programa.
O comando de atribuio utilizado quando desejamos armazenar
um valor em uma varivel.
A atribuio de um valor a uma varivel s poder ser executada
se o tipo de dado que a varivel armazena for compatvel com o
valor que ser atribudo.
54
Programao 2
Captulo 4 Comandos de
Entrada e Sada de Dados
Vamos conversar sobre o assunto?
Um programa que no fornece resultados, nem recebe valores
para serem processados, no tem muita utilidade. De um modo
geral, o objetivo pelo qual escrevemos programas a obteno de
resultados (Sadas) depois da realizao de clculos ou pesquisas
(Processamento) atravs do fornecimento de um conjunto de dados
(Entradas). Neste captulo, iremos a estudar os comandos de entrada
e sada de dados. Assim, com o comando de entrada poderemos
fornecer dados para que sejam processados pelo programa.
Com o comando de sada poderemos receber os resultados do
processamento dos nossos dados. Uma boa notcia que, a partir
deste captulo, teremos adquirido conhecimento sufciente para
construir um programa completo em C! Ficaram felizes? Ento no
vamos perder mais tempo, vamos logo aprender os comandos de
entrada e sada de dados.
4.1. Entrada de Dados
O comando de entrada de dados utilizado quando desejamos
fornecer um valor para um nosso programa. A entrada de dados
feita atravs de um dispositivo de entrada de dados. Os dispositivos
mais comuns so: teclado, mouse
20
, tela sensvel ao toque, scanner,
dentre outros. A fgura 4.1 apresenta alguns destes dispositivos.
Figura 4.1: Dispositivos de Entrada de Dados
Saiba Mais
20
Voce sabe
quem inventou o
mouse? Embora
tenha sido
inventado por Bill
Enghlish, a sua
patente pertence
a Douglas
Engelbart. Ele
apresentou este
perifrico pela
primeira vez em
1968 e o chamou
de XY Position
Indicator For A
Display System.
O primeiro
mouse era feito
de madeira,
com apenas um
boto. O invento
de Engelbart
fcou sem
muita utilizao
devido a falta de
necessidade de
tal dispositivo, j
que a maioria dos
computadores
utilizavam
apenas textos
sem cursores
na tela. Vocs
se imaginam
sem um mouse
em seus
computadores?
55
Programao 2
Nesta seo, iremos aprender como executar a entrada de um
dado (ou a leitura de um dado, como tambm chamada) atravs do
teclado. A execuo do comando de leitura pressupe que os dados
sero fornecidos do meio externo (teclado), e sero armazenados na
memria (variveis).
O comando que faz a leitura de um dado fornecido via teclado e
o armazena em uma varivel do programa o scanf. Fazendo um
paralelo com o Portugol, o scanf o comando leia. Vamos ver a sua
sintaxe.
Sintaxe
scanf(string de controle, &variavel);
O comando scanf tem um certo nvel de detalhes, para entend-lo,
vamos por partes. Na primeira parte do scanf, entre as aspas, aparece
a string de controle. O que vem a ser a string de controle? A string de
controle indicar que tipo de dado ser lido neste momento. A string
de controle deve assumir um dos valores abaixo:
String de Controle Signifcado
%d leitura de nmeros inteiros
%f leitura de nmeros reais
%c leitura de um caractere
%s leitura de cadeia de caracteres
Assim, quando formos ler um dado que vai ser armazenado em
uma varivel do tipo inteiro, a string de controle deve ser %d. Se
o valor a ser lido, for um nmero real, a string de controle ser %f.
Quando o dado a ser lido for um nico caractere, a string de controle
%c e para ler uma cadeia de caracteres, utilizado %s. Com a
resoluo de exerccios, vocs no esquecero o signifcado de cada
string de controle, certo?
Na segunda parte do scanf, colocamos o nome da varivel que
vai armazenar o valor que ser fornecido via teclado, entendido?
Notem que antes do nome da varivel, aparece um & (e-comercial).
O & faz parte da sintaxe do scanf e no pode ser esquecido. NUNCA!
Na linguagem C, o & signifca: Endereo de memria
21
. Assim,
o comando scanf indica que o dado ser lido via teclado e ser
Saiba Mais
21
Ns acessamos
uma varivel
atravs do seu
nome. No entanto,
o processador
acessa uma
varivel utilizando
o endereo de
memria dela.
Cada varivel
criada no nosso
programa possui
um endereo de
memria. Ns
no precisamos
conhecer o
endereo de
memria de uma
varivel, certo?
S precisamos
saber o nome
dela.
56
Programao 2
armazenado no endereo de memria da varivel. O comando scanf
tambm termina com ponto e vrgula.
Vamos analisar o exemplo 4.1, que apresenta o uso do scanf.
Exemplo 4.1: Comando de Entrada - scanf
1
2
3
4
5
6
int idade;
foat salario;
char letra, nome[20];
scanf(%d, &idade);
scanf(%f, &salario);
scanf(%c, &letra);
Nas linhas 1 a 3, temos as declaraes das nossas variveis. No
scanf da linha 4, temos a leitura da varivel idade. Como esta varivel
do tipo int, a string de controle %d. Na linha 5, temos a leitura
da varivel salrio, que do tipo foat. Assim, a string de controle
%f. Por fm, na linha 6, temos a leitura da varivel letra, que do
tipo char, contendo apenas um caractere. Por conta disso, a string de
controle foi %c. A string de controle vem sempre entre aspas duplas,
certo? Note que tambm foi declarada uma varivel chamada nome,
que uma cadeia de 20 caracteres. No entanto, o comando scanf no
funciona corretamente nas leituras de cadeias de caractere. Portanto,
quando for necessrio fazer a leitura de variveis deste tipo, teremos
que usar um outro comando, que ser visto na prxima seo.
4.1.1. Entrada de Cadeia de Caracteres
Como mencionado, o comando scanf no funciona de maneira
correta ao ler uma cadeia de caracteres. O problema que, se nesta
cadeia de caractere tiver um espao em branco, separando uma
palavra da outra, ao encontrar o espao em branco, o processador
entende que a leitura terminou, desprezando parte do nosso dado.
Ento j viu, no d para fcar com o dado pela metade, no
mesmo?
A soluo usar outro comando de leitura, especfco para a leitura
de cadeias de caracteres. Este comando o gets. A sintaxe do gets
a seguinte:
57
Programao 2
Sintaxe
ffush(stdin);
gets(varivel);
Para a execuo de um gets, precisamos informar apenas a
varivel que ir receber o valor lido. Note tambm que antes do gets,
temos o comando ffush. assim mesmo. Sempre que tivermos um
gets, antes temos que executar um ffush. No esquea disso, certo?
O comando ffush um comando que limpa o buffer de entrada de
dados (stdin). Esto querendo saber o que o buffer de entrada? O
buffer um espao de memria que armazena, temporariamente, os
nossos dados. assim, suponha que o programa est solicitando que
seja digitado o nome do usurio. O usurio vai teclando cada letra que
forma seu nome. Ao terminar de digitar, ele tecla enter. O enter indica
ao processador, que o usurio encerrou aquela entrada de dados.
Enquanto no for teclado o enter, o processador vai armazenado cada
tecla que est sendo pressionada, no buffer de entrada. Aps o enter
ser pressionado, o processador pega o nome completo do usurio,
que est no buffer de entrada, e transfere para a varivel.
Pode parecer complexo, mas no . A questo que, enquanto no
terminamos de digitar o dado, ele est sendo formado. S depois de
fnalizada a entrada, que ele pode ser transferido para a varivel.
A Figura 4.2 ilustra o esquema da entrada de dados.
4.2: Esquema da entrada de dados
A execuo do ffush nos assegura que o buffer de entrada est
limpo, sem o contedo de algum dado que foi teclado anteriormente.
58
Programao 2
No caso de entradas de dados usando o scanf, no necessrio
limpar o buffer de entrada.
Ateno
O gets e o ffush so comandos que se encontram em
uma biblioteca chamada stdio.h. Portanto, se voc for
utilizar estes comandos, esta biblioteca dever ser includa
na seo de incluso de bibliotecas do programa. A incluso
feita com a diretiva de compilao #include e fca assim:
#include <stdio.h>.
Vamos agora analisar o exemplo 4.2, que apresenta o uso do
comando gets.
Exemplo 4.2: Comando de Entrada - fgets
1
2
3
4
5
char nome_aluno[20], endereco[50];
ffush(stdin);
gets(nome_aluno);
ffush(stdin);
gets(endereco);
Na linha 1, temos as declaraes das variveis nome_aluno e
endereco. A varivel nome_aluno armazena at 20 caracteres e a
varivel endereco armazena at 50 caracteres. Antes de executar o
gets da linha 3, responsvel por ler o nome_aluno, temos, na linha
2, o ffush, responsvel por limpar o buffer de entrada. Na sequncia,
temos a leitura da varivel endereco. Assim, necessria a execuo
de um novo ffush antes do gets da linha 5. Notem que na leitura de uma
varivel cadeia de caractere, s usamos o nome dela, desprezamos o
colchetes e o nmero que indica quantos caracteres ela armazena.
Agora que sabemos como fazer a entrada de dados via teclado,
vamos aprender a apresentar os dados na tela. S falta este comando
para darmos incio a criao dos nossos programas. Estamos bem
perto! Vamos em frente!
59
Programao 2
4.2. Sada de Dados
O comando de sada de dados utilizado quando desejamos ver
o resultado do processamento do nosso programa. Este comando
tambm utilizado para passar mensagens na tela, solicitando que
o usurio faa algo, como por exemplo, digitar a idade dele. Os
dispositivos de sadas de dados mais comuns so: monitor, impressora
e caixas de som. A fgura 4.3 apresenta tais dispositivos.
Figura 4.3: Dispositivos de sada de dados
Vamos agora aprender o comando que fornece a sada de dados
para o dispositivo de sada padro que a tela do computador. Este
comando o printf. Fazendo um paralelo com o Portugol, o printf o
comando escreva. Vamos ver a sua sintaxe.
Sintaxe
printf(string de controle);
printf(string de controle, lista de argumentos);
Existem duas sintaxes para o printf. Na primeira, s temos a string
de controle, entre as aspas dupla. Usamos esta sintaxe quando
queremos escrever apenas texto na tela. Na segunda, alm da string
de controle, temos a lista de argumentos. Esta sintaxe aplicada
quando iremos escrever texto e valores armazenados nas variveis.
Apesar de aparecer aqui uma string de controle, ela no similar a
do scanf, certo? No printf, a string de controle uma mscara que
especifca (formata) o que ser impresso e de que maneira ser
impresso. Na string de controle pode conter: texto, cdigos especiais
e especifcadores de formatos. Calma! Vamos detalhar mais.
Primeiramente, vamos ver quais so os cdigos especiais que
podem aparecer na string de controle do printf. Os cdigos especiais
so formados por uma barra invertida (\), seguida de uma letra. O
cdigo especial, indica uma ao que deve ser executada pelo printf.
60
Programao 2
A tabela a seguir apresenta os cdigos especiais e o seu signifcado.
Cdigo Especial Ao
\n Muda o cursor para o incio da linha seguinte.
\t tabulao (tab)
\ Escreve uma aspas dupla na tela
\\ Escreve uma barra invertida na tela
\a D um alerta sonoro
Vamos analisar exemplos bem simples de printf, que escrevem,
apenas um texto na tela.
Exemplo 4.3: Comando de Sada printf Escrevendo textos apenas
1
2
3
4
printf(Ola Mundo!);
printf(\nBom Dia...);
printf(\n\nIsso eh um teste.\a);
printf(\n\nAte \nmais... \ntchau);
A execuo desta sequncia de printf do exemplo 4.3, resulta na
seguinte tela (Figura 4.4).
Figura 4.4: Tela de execuo de um programa: uso do printf
Vamos entender cada printf do exemplo 4.3. Um detalhe essencial
que devemos saber: o printf escreve um texto na tela, no ponto em que
o cursor se encontra no momento. Quando um programa executado,
o cursor se encontra na primeira coluna, da primeira linha da tela
22
. No
primeiro printf do exemplo, a string de controle tem apenas o texto que
Saiba Mais
22
A tela tem
as seguintes
dimenses: 80
colunas x 25
linha. Assim,
conseguimos
escrever em uma
linha de tela, 80
caracteres. E
conseguimos ter
uma tela com at
25 linhas.
61
Programao 2
queremos colocar na tela: Ola Mundo!
23
. Aps terminar este printf, o
cursor estar posicionado aps a exclamao.
Na sequncia, na linha 2, temos um printf cuja string de controle :
\nBom Dia.... O \n serviu para fazer com que o cursor mudasse para
o incio da linha seguinte e logo em seguida, o texto Bom dia.. foi
impresso, e o cursor fcou no fnal desta linha.
No printf da linha 3, temos a string de controle: \n\nIsso eh um
teste.\a. A string de controle comea com dois \n. Isso faz com que
o cursor mude de linha duas vezes. Assim, teremos uma linha em
branco na tela. Alm disso, na string de controle, tambm temos um
\a, que faz com que seja disparado um beep(sinal sonoro) quando
este printf for executado. interessante usar o sinal sonoro quando
quisermos chamar a ateno do usurio.
Finalmente, na linha 4, temos o printf com a string de controle:
\n\nAte \nmais... \ntchau. Como a string de controle comea com
dois \n, o cursor muda de linha duas vezes, e escreve Ate. Na
sequncia, temos outro /n, o que fez o cursor mudar novamente
de linha e escrever mais.... Por fm, temos outro \n, o cursor vai
mudar de linha e escreve tchau. Notem que um nico printf, pode
resultar em um texto em vrias linhas da tela. Isso no possvel no
Portugol.
Vamos ver agora, como escrevemos textos e valores, armazenados
nas nossas variveis, na tela do computador. Para isto, temos que
saber mais um detalhe que vai aparecer na string de controle, que
so os especifcadores de formato. Um especifcador de formato
marca o lugar e o formato de impresso das variveis, contidas na
lista argumentos (vejam a segunda sintaxe do printf). Deve haver um
especifcador de formato para cada varivel a ser impressa. Todos os
especifcadores de formato comeam com um %. Os especifcadores
de formato so apresentados na tabela a seguir.
Especifcador de Formato Uso
%d Escrever um valor do tipo inteiro
%f Escrever um valor do tipo real
%c Escrever um caractere
%s Escrever uma cadeia de caracteres
%% Escrever o caractere %
Saiba Mais
23
Ateno: No
use acentos nos
textos que sero
escritos na tela.
No volume 4,
aprenderemos
como acentuar
nossos textos.
62
Programao 2
Neste caso de impresso na tela, quando temos textos e valores,
na string de controle, devemos colocar um especifcador de formato,
no ponto onde queremos que um valor seja impresso. O especifcador
deve ser relativo ao tipo de dado que ser impresso. Aps a string
de controle, coloca-se uma vrgula, e na sequncia vem a lista de
variveis que ser impressa. Assim, ns primeiro montamos a frase
(string de controle), informando em que ponto entraro os valores
(usando os especifcadores de formato) e depois, informamos quais
variveis sero utilizadas. Vamos ver alguns exemplos.
Exemplo 4.4: Comando de Sada printf Escrevendo textos e valores
1
2
3
4
5
6
7
8
9
10
int X, Y, mat, idade;
foat A;
X = 1;
Y = 3;
A = 7.5;
mat = 123;
idade = 25;
printf(O valor de A = %f, A);
printf(\n\nO aluno de matricula %d tem %d anos,
mat, idade);
printf(\n\nResultado da soma: %d, X+Y);
A sequncia do exemplo 4.4 iniciada com a declarao das
variveis e com a atribuio de valores, para que possamos entender
melhor a montagem dos printf. No primeiro printf, da linha 8, queremos
que seja apresentado o valor da varivel foat A. Assim, montamos a
string de controle, informando o ponto da frase onde deve ser colocado
o valor da varivel A, utilizando o especifcador de formato de valores
reais, o %f. Veja na Figura 4.5, a tela resultante da execuo desta
sequncia de comandos.
63
Programao 2

Figura 4.5: Tela de execuo de um programa usando printf com textos e valores
Quando pedimos para que um nmero real seja apresentado na tela,
este mostrado com uma preciso de seis casa decimais. Por isso, o
valor da varivel A, aparece como 7.500000. Podemos decidir quantas
casas decimais devem ser apresentadas, nem sempre queremos
trabalhar com tantas casas decimais, bem como, poderemos precisar
trabalhar com um nmero com mais casas decimais. Aprenderemos
daqui a pouco como informar quantas casas decimais devem ser
apresentadas, quando um nmero real for impresso na tela. Por
enquanto, vamos continuar a anlise do exemplo 4.4, certo?
No segundo printf, na linha 9, queremos que seja apresentado o
nmero de matrcula do aluno e a sua idade. Aqui temos um printf que
ir apresentar mais de um valor. O raciocnio o mesmo. Montamos a
string de controle, informando onde vai aparecer o valor das variveis,
utilizando o especifcador de formato. O que muda depois da string
de controle. Aps a vrgula, devemos colocar as variveis que sero
impressas, na ordem que elas devem aparecer na frase. Ou seja, se
na ordem da frase, vem primeiro a matrcula do aluno, ento, coloca-
se primeiro a varivel mat. Quando temos mais de uma varivel,
elas so separadas por vrgula. Notem que continuamos usando os
cdigos especiais na string de controle, neste caso foi colocado o /n,
para mudar o cursor de linha.
Na linha 10, temos um printf que ir apresentar o resultado de um
expresso matemtica. Isto tambm possvel. Assim, na parte do
printf que indicamos a varivel que ser impressa, ns colocamos a
expresso matemtica. A expresso resolvida e o seu resultado
apresentado na tela.
Vamos ver agora como fazer para que nossos nmeros reais sejam
apresentados com a quantidade de casa decimais que quisermos. O
que vai mudar o especifcador de formato dos nmeros reais, o %f.
Agora ele deve ser assim: entre o % e o f, colocaremos um ponto,
seguido de um nmero, que representa quantas casas decimais ns
64
Programao 2
queremos que sejam apresentadas. Vejam os printf do exemplo 4.5.
Exemplo 4.5: Comando de Sada printf formatando nmeros reais
1
2
3
4
5
6
7
foat A, B,C;
A = 3.4;
B = 1.12345;
C = 7.56789;
printf(A = %.1f, A);
printf(\n\nB = %.2f, B);
printf(\n\nC = %.2f, C);
Primeiro, temos as declaraes e atribuies para trs variveis
reais. Na linha 5, temos o printf que imprime o valor da varivel A,
vejam como fcou o especifcador de formato: %.1f. Neste caso,
queremos que seja apresentada apenas uma casa decimal deste
nmero. Vejam a Figura 4.6, que apresenta a tela resultante da
execuo desta sequncia de comandos.

Figura 4.6: Tela de execuo de programa: formatao de nmeros reais
Nas linhas 6 e 7, temos os printf que imprimem os valores das
variveis B e C. Neste caso, queremos que sejam apresentadas duas
casas decimais, por isso, o especifcador de formato fcou: %.2f.
S vamos ver mais um detalhe. Notem que, quando pedimos para
que um nmero seja apresentado com poucas casas decimais, o
printf apresenta um valor arredondado. Como assim? Veja o valor
que foi atribudo a varivel C, na linha 4 do exemplo: 7.56789. Veja
agora o valor que foi apresentado na tela de execuo do programa:
65
Programao 2
7.57. Funciona assim: se queremos que sejam apresentadas apenas
duas decimais, o printf vai verifcar qual valor tem na terceira casa
decimal, se tiver um valor maior ou igual a cinco, ele arredonda o valor
apresentado. Se for um nmero menor que 5, ele no arredonda.
Observe o valor da varivel B.
Terminamos aqui os comandos de entrada e sada. Como estes
comandos tem muitos detalhes, fcamos sujeitos a cometer vrios
erros quando os utilizamos: esquecer uma vrgula, uma aspa, dentre
outros. Na prxima seo, iremos ver uma lista dos erros mais comuns
que ocorrem com o uso destes comandos. Com esta lista, poderemos
encontrar os erros dos nossos programas mais rapidamente, certo?
4.3. Erros Frequentes no Uso dos Comandos
de Entrada e Sada
Nesta seo, ser apresentada uma lista com os erros que so
mais frequentemente cometidos por quem est iniciando a programar,
e que precisa fcar atento a tantos detalhes da sintaxe dos comandos.
Vamos ver, na tabela abaixo, os erros que podemos cometer no uso
do scanf, gets e printf.
Comando Erros Consequncia
Scanf Esquecer o & antes do
nome da varivel.
O programa compila, como se
no tivesse erro, mas durante a
execuo ele trava.
Trocar a string de controle.
Por exemplo, no lugar de
um %d, usar um %f.
O programa compila, mas a
varivel receber um valor
esquisito (normalmente, um valor
bem grande)
Esquecer o ; no fnal do
comando.
O compilador avisa que tem erro.
Esquecer as aspas da
string de controle.
O compilador avisa que tem erro.
Esquecer a vrgula entre
a string de controle e a
varivel.
O compilador avisa que tem erro.
Fazer a leitura de uma
varivel que no foi
declarada.
O compilador avisa que tem erro.
66
Programao 2
Gets Esquecer de colocar o
comando ffush antes do
gets.
O programa compila, como se
no tivesse erro, mas durante a
execuo, o processador pula a
execuo do comando gets.
Esquecer de incluir a
biblioteca stdio.h.
O compilador avisa que tem erro.
printf No fechar a string de
controle.
O compilador avisa que tem erro.
Esquecer a vrgula entre
as variveis que sero
impressas.
O compilador avisa que tem erro.
Usar um especifcador
de formato incompatvel
com o valor que ser
impresso.
O programa compila, mas ser
impresso um valor esquisito.
Esquecer de colocar um
especifcador de formato.
O programa compila, mas no
imprime o valor da varivel.
Notem na coluna consequncia, que mesmo que sejam cometidos
alguns tipos de erros, o programa vai compilar e s durante a execuo
que notaremos algo estranho. Ateno: podem ocorrer outros erros
que no foram mencionados nesta lista, estes so apenas os mais
comuns.
Pronto, enfm poderemos comear a fazer os nossos primeiros
programas! J sabemos, declarar variveis, atribuir valores a elas,
ler valores via teclado e apresentar resultados na tela. Com esses
comandos, j podemos fazer uns programas simples em C. Para
comear, vocs j tem devem ter instalado o Dev-cpp nos seus
computadores. Na prxima seo, veremos dois programas completos
comentados. Agora de verdade, vamos programar!
4.4. Primeiros programas em C
isso, vamos comear com o nosso primeiro programa em C.
Ele ser simples, mas com o tempo iremos aumentado o nvel de
complexidade dos nossos programas. Antes de tudo, vamos a alguns
detalhes (Mais detalhes?). Primeiro, vocs devem executar o Dev-
cpp e escolher a opo: Arquivo/Novo/Arquivo Fonte. NO devemos
trabalhar com projetos, certo? Em seguida, comecem a digitar o
programa.
67
Programao 2
Ateno
Por padro, o Dev-cpp salva os nossos programas no formato
do c++ (ou seja, .cpp). Sempre que forem salvar os programas,
lembrem de informar que vocs querem que este seja salvo no
formato .c. Fiquem atentos a isso!
A Figura 4.7 mostra a tela de como devemos salvar nossos
programas. No momento que solicitamos que o programa seja salvo,
aberta uma janela para escolha do diretrio que o programa ser
salvo, o nome dele e podemos tambm escolher o formato, na opo:
Save as Type. Nesta opo, voc deve escolher: C source fles
(*.c). S isso. Se voc salvar seu programa como .cpp, ele fcar
dando erros.

Figura 4.7: Tela do Dev-cpp: salvando um programa c.
O nosso primeiro programa em C ir ler dois nmeros inteiros e
apresenta a soma destes dois nmeros. Segue abaixo o programa
completo. Em seguida, vamos comentar cada linha.
68
Programao 2
Programa Completo 4.1: Ler dois nmeros inteiros e calcula a soma
1
2
3
4
5

6
7
8
9
10
11
12
13
//Ler dois numeros e calcula a soma
main()
{
int n1, n2, soma;
printf(Calcular a soma de dois numeros\
n\n);
printf(Primeiro valor: );
scanf(%d, &n1);
printf(Segundo valor: );
scanf(%d, &n2);
soma = n1 + n2;
printf(\n\nA soma dos dois numeros = %d\n\
n,soma);
system(pause);
}
Comentrios sobre cada linha do Programa completo 4.1
Linha 1: De acordo com a estrutura de um programa C,
este inicia com incluso das bibliotecas, quando necessrio.
Neste exemplo, no utilizamos nenhum comando que se fez
necessria a incluso de biblioteca. Assim, na linha 1 temos um
comentrio, indicando o que o programa faz. Sempre coloquem
esse tipo de comentrio no programa. Assim, ele fcar bem
documentado.
Linha 2: incio do programa principal, que defnido pelo:
main().
Linha 3: temos um abre chaves, que ir delimitar o corpo do
programa principal.
Linha 4: temos as declaraes das trs variveis do programa
24
:
Saiba Mais
24
Ao ler um
enunciado de
uma questo
procure
identifcar as
variveis de
entrada, ou seja,
quais valores
sero fornecidos
pelo usurio e
qual resultado o
programa precisa
processar. E
assim, faa a
declarao das
suas variveis.
69
Programao 2
n1 e n2 (para armazenar os nmeros que sero fornecidos pelo
usurio) e soma (que armazena a soma dos dois nmeros).
Linha 5: um printf que serve para colocar, no incio da tela,
o ttulo do que o programa faz. Isso importante para que o
usurio saiba para que serve o programa.
Linha 6
25
: colocamos este printf para que o usurio saiba que
precisa fornecer o primeiro valor.
Linha 7: scanf que l o primeiro valor e armazena na varivel
n1.
Linha 8: printf para que o usurio saiba que precisa fornecer o
segundo valor.
Linha 9: scanf que l o segundo valor e armazena na varivel
n2.
Linha 10: agora que j temos os dois valores armazenados
nas variveis n1 e n2, podemos executar a soma. Nesta linha,
temos o comando que atribui a soma das variveis n1 e n2 para
a varivel soma.
Linha 11: printf que apresenta o resultado, que est armazenado
na varivel soma.
Linha 12: nesta linha, temos um comando novo. o seguinte,
assim que terminada a execuo do nosso programa, o
processador fecha, automaticamente, a janela onde o programa
estava sendo executado. Por conta disso, acabamos sem
ver algum resultado que tenha sido impresso na tela. Para
fazer com que a janela no feche ao trmino da execuo, foi
colocado o comando system(pause). Este comando d uma
pausa na execuo do programa e fca aguardando que o
usurio pressione alguma tecla
26
. Com esta pausa, poderemos
ver os resultados apresentados. Assim que pressionamos algo
no teclado, a janela ir fechar. Portanto, no fnal dos nossos
programas, teremos que colocar o system(pause), certo?
Um outro comando que faz a mesma coisa o getche(), no
prximo exemplo, usaremos o getche(), para que vocs possam
conhec-lo.
Linha 13: fecha chaves, indicando o fnal do programa
principal.
Saiba Mais
25
Importante:
sempre que
temos que fazer
uma leitura de
dados (com
scanf ou gets),
devemos colocar
uma mensagem
para que o
usurio saiba
o que ele deve
digitar. Assim,
todo scanf (ou
gets), deve ter
um printf antes,
informado o
que o usurio
tem que fazer. O
programa precisa
se comunicar com
um usurio.
Saiba Mais
26
O comando
system(pause)
escreve na tela
de execuo
do programa
a seguinte
mensagem:
Press any key
to continue...
ou Pressione
qualquer tecla
para continuar...
70
Programao 2
Vocs devem digitar, compilar e executar este programa utilizando
o Dev-cpp. Comecem a se familiarizar com a sintaxe do C. Tambm
procurem se familiarizar com o ambiente de programao. Em breve,
vocs no estaro mais tendo que consultar as sintaxes dos comandos
com tanta frequncia. Vamos logo fazer outro programa!
Nosso segundo programa ir ler o nome do usurio e o ano em
que ele nasceu e como resultado imprime uma mensagem dizendo
quanto anos o usurio tem.
Programa Completo 4.2: Ler o nome e a idade do usurio
e informar a sua idade.
1
2

3
4
5
6
7
8
9
10
11
12
13
14

15
16
#include <stdio.h>
//Ler o nome e a idade do usurio e informar a
sua idade.
main()
{
char nome[20];
int ano, idade;
printf(Calcular a idade o usuario\n\n);
printf(Seu nome: );
ffush(stdin);
gets(nome);
printf(Ano que voce nasceu: );
scanf(%d, &ano);
idade = 2009 - ano;
printf(\n\n%s, voce esta com %d anos.,
nome, idade);
getche();
}
71
Programao 2
Programa Completo 4.2: Ler o nome e a idade do usurio e
informar a sua idade.
Vamos ver o que est sendo feito em cada linha do programa
completo 4.2.
Linha 1: Neste programa ns teremos que ler uma varivel
que uma cadeia de caractere: o nome do usurio. Assim,
precisaremos usar o gets e o ffush. Estes comandos fcam na
biblioteca stdio.h. Na linha 1, temos a incluso desta biblioteca.
Linha 2: Comentrio indicando o que o programa faz.
Linha 3: incio do programa principal, que defnido pelo:
main().
Linha 4: temos um abre chaves, que ir delimitar o corpo do
programa principal.
Linha 5: declarao da varivel do tipo char, que armazena o
nome do usurio.
Linha 6: declarao das variveis inteiras: ano (que armazena
o ano de nascimento do usurio) e idade (que armazenar a
idade do usurio, que ser calculada pelo programa).
Linha 7: printf que indica o que o programa faz, no incio da
tela de execuo.
Linha 8
27
: printf que solicita que seja digitado o nome do
usurio.
Linha 9: temos o comando ffush, que DEVE sempre vir antes
do comando gets.
Linha 10: gets que efetuar a leitura do nome do usurio.
Linha 11: printf para que o usurio saiba que precisa fornecer o
ano de nascimento.
Linha 12: scanf que l o ano de nascimento do usurio.
Linha 13: atribuio que descobre quantos anos o usurios
tem. Para isso, subtramos o ano atual (2009), do ano que o
usurio nasceu. O resultado atribudo para a varivel idade.
Linha 14: printf que apresenta o resultado. Notem que o nome
do usurio vai aparecer na frase. A string de controle comea no
dois \n, solicitando que o cursor mude de linha e logo temos
Saiba Mais
27
Importante:
sempre que
temos que fazer
uma leitura de
dados (com
scanf ou gets),
devemos colocar
uma mensagem
para que o
usurio saiba
o que ele deve
digitar. Assim,
todo scanf (ou
gets), deve ter
um printf antes,
informado o
que o usurio
tem que fazer. O
programa precisa
se comunicar com
um usurio.
72
Programao 2
um %s, isto porque queremos que a resposta seja iniciada
com o nome do usurio. Um exemplo de frase de resposta :
Carolina, voc esta com 10 anos.
Linha 15: temos o comando getche(), similar ao system(pause),
faz com que a tela de execuo no feche ao fnal do programa.
A vantagem do getche() que ele no escreve nada na tela.
Lembram que o system(pause) coloca uma frase na tela?
Linha 16: fecha chaves, indicando o fnal do programa
principal.
A seguir, temos as telas de execuo dos programas completos
4.1 e 4.2.
Tela de execuo do Programa
completo 4.1
Tela de execuo do Programa
completo 4.2
Figura 4.8: Telas de execuo dos programas completos 4.1 e 4.2
Com esses dois programa completamente comentados, j d para
vocs comearem a treinar sozinhos. No queiram acertar tudo de
primeira, vo com calma e sejam persistentes. Vejam que a sintaxe da
linguagem C cheia de detalhes que precisamos ter muita ateno.
Na prxima seo, vocs encontraro sugestes de exerccios.
Atividades e Orientaes de Estudo
Como vocs j devem ter notado, uma linguagem de programao
envolve muitos detalhes. Vocs s iro aprender realmente, se fzerem
muitos exerccios. a prtica que far com que esta gama de detalhes
seja assimilada. Portanto, aqui vai mais uma lista de exerccios. Esta
para ser resolvida no computador, certo? Podem comear a ligar
seus computadores!
73
Programao 2
1. Faa um programa que leia dois nmeros reais A e B e os
imprima na tela. O valor da varivel A deve ser apresentado
com duas casa decimais e o valor da varivel B com trs casas
decimais.
2. Faa um programa que leia o nome do usurio e escreva uma
frase de saudao, desejando um bom dia de trabalho para
o mesmo. A resposta deve ter o formato deste exemplo: Ola
Joao, tenha um otimo dia de trabalho!. Faca o programa soar
um sinal sonoro(beep) ao escrever esta frase.
4. Faa um programa que leia dois nmeros inteiros A e B e
imprima o resultado da subtrao de A por B. A resposta deve
ter o seguinte formato: 6 2 = 4.
3. Faca um programa que leia o nome do usurio e a sua idade e
imprima quantos anos ele ter em 2020. A resposta deve ter o
formato deste exemplo: Carlos, em 2020 voce estara com 45
anos.
5. Faa um programa que leia o nome do usurio, a idade do
usurio, o nome da me do usurio e a idade da me do
usurio. O programa devera imprimir na tela quantos anos a
me do usurio tinha quando ele nasceu. A resposta deve ter
o formato deste exemplo: Carlos, quando voce nasceu, Dona
Cecilia tinha 27 anos.
Conhea Mais
Aumente os seus conhecimentos sobre comandos de entrada
e sada de dados acessando site especializados na linguagem C.
Muitos professores e instituies disponibilizam materiais na rede e o
principal, vocs podem encontrar muitos enunciados de exerccios.
Vocs j se inscreveram em um frum de discusso da linguagem
de programao C? Nessa fase em que estamos iniciando a programar,
ter auxlio de programadores experientes muito importante. No
deixem de se inscrever, certo?
74
Programao 2
Vamos revisar?
Para dar uma revisada nos tpicos tratados neste captulo,
observem o resumo a seguir:
Dispositivos de entrada: so utilizados para passar informaes
para o computador. So exemplos de tais dispositivos: teclado e
mouse.
Dispositivos de sada: so utilizados para apresentar informaes
processadas pelo computador.
scanf: um dos comandos de leitura do C. Esta comando no
adequado para a leitura de cadeia de caracteres.
gets: comando especfco para a leitura de cadeia de caracteres.
Para utiliz-lo, necessrio incluir no programa a biblioteca
stdio.h.
ffush: comando que faz a limpeza do buffer de entrada de dados.
Sempre que fzermos uma leitura de cadeia de caracteres, devemos
colocar o comando ffush.
printf: comando de sada de dados. O printf pode ser usado para
imprimir textos, valores de variveis e resultados de expresses
aritmticas.
getche() e system(pause): comandos para provocar uma parada
na tela de execuo, fazendo com que o usurio possa conferir o
resultado processado pelo programa.
75
Programao 2
Captulo 5 Operadores,
Expresses e Funes
Matemticas
Vamos conversar sobre o assunto?
Gostaram de ter feito os primeiros programas em C? Foram
programas simples, que utilizavam o assunto visto at o momento.
Vamos continuar avanando no estudo da linguagem C e aumentando,
gradativamente, o nvel de complexidade dos nossos programas.
Neste captulo, iremos aprender quais operadores esto disponveis
na linguagem C e como utiliz-los, atravs da montagem de
expresses aritmticas, relacionais e lgicas. Tambm iremos abordar
as principais funes da biblioteca matemtica. Com o assunto deste
captulo, teremos habilidades para resolver questes que requerem
a construo de expresses, seja aritmtica, relacional ou lgica.
Vamos em frente!
5.1. Operadores Bsicos
Em toda linguagem de programao, existem operadores que
nos permitem armazenar, modifcar, comparar e avaliar dados no
computador. Aqui veremos trs tipos de operadores: aritmticos,
relacionais e lgicos. Nas prximas sees, ser feito o detalhamento
de cada um dos tipos de operadores.
5.1.1 Operadores Aritmticos
Usamos os operadores aritmticos quando precisamos executar
operaes aritmticas (matemticas) sobre os nossos dados
(variveis). A tabela abaixo apresenta os operadores aritmticos do C.
Notem que o operador da multiplicao um asterisco.
Operador Descrio
+ Adio
- Subtrao
* Multiplicao
76
Programao 2
/ Diviso
% Retorna o resto da diviso
inteira de a por b
( ) Parnteses
Vamos dar uma ateno especial aos operadores da diviso(/)
e resto(%). O resultado de uma diviso, em C, depende dos tipos
dos dados que esto sendo divididos. A tabela abaixo apresenta o
resultado da operao de diviso, de acordo com os tipos de dados
do numerador e do denominador.
numerador / denominador resultado
inteiro / inteiro inteiro
inteiro/ real real
real / inteiro real
real/real real
Quando dois nmeros inteiros so divididos, o resultado a parte
inteira do quociente da diviso. Quando pelo menos um dos elementos
(numerador e/ou denominador) real, o resultado um nmero real.
Vamos analisar a sequncia de comandos a seguir:
Exemplo 5.1: Uso de Operadores Aritmticos
1
2
3
4
5
6
7
8
9
int X, Y, Z, W;
foat K, L, M;
X = 19;
Y = 3;
Z = X/Y;
W = X % Y;
K = 19;
L = 3;
M = K/L;
77
Programao 2
Nas linhas 1 e 2, temos as declaraes das variveis: quatro
inteiras (X, Y, Z e W) e trs reais (K, L, e M). Nas linhas 3 e 4 so
atribudos valores nas variveis X e Y, que passam a armazenar
tais valores. Na linha 5, temos um comando de atribuio, em que
a varivel Z receber o resultado da diviso entre a varivel X (19)
e a varivel Y (3). Como as variveis X e Y so inteiras, o resultado
ser a parte inteira do quociente da diviso. Assim, se temos: 19/3 =
6.333333, ser considerado apenas a parte inteira do resultado, ou
seja, 6. Portanto, nesta atribuio da linha 5, a varivel Z vai receber
6.
Na linha 6, a varivel W vai receber o resto da diviso de X por
Y, ou seja, o resto da diviso de 19 por 3. A fgura 5.1 ilustra como a
operao do resto feita.
Figura 5.1: Resto de uma diviso
A operao do resto funciona da seguinte forma: os dois nmeros
vo sendo divididos, neste caso: 19 dividido por 3 (primeiro quadro
da fgura 5.1). Assim, 19 por 3 d 6 e sobra 1. Como o 1 no d pra
ser dividido por 3, a conta para e pega o resto da diviso que 1.
Portanto, o resultado da operao X%Y (neste caso, 19%3) 1. Este
resultado ser atribudo a varivel W.
Ateno
O operador do resto (%) s pode ser usado quando as
variveis envolvidas so do tipo inteiro. No poderemos usar tal
operador para obter resto de diviso de nmeros reais. Outra
coisa: o operador % no tem nada haver com percentagem,
certo?
Nas linhas 7 e 8 so atribudos valores nas variveis K e L, que
passam a armazenar tais valores. Na linha 9, temos um comando
78
Programao 2
de atribuio, em que a varivel M receber o resultado da diviso
entre a varivel K (19) e a varivel L (3). As variveis K e L so reais
(foat). Dessa forma, teremos 19/3 = 6.333333. O resultado completo
ser atribudo a varivel M, ou seja 6.33333, sem desprezar a parte
fracionria do resultado.
A fgura 5.2 apresenta o valor que fcou armazenado em cada uma
das variveis, aps a execuo da sequncia de comandos. Note que,
nas variveis reais, mesmo que seja atribudo um valor inteiro, como
por exemplo, na linha 7, que foi atribudo 19 varivel K, no momento
que o valor armazenado, ele passa a ter a parte fracionria do
nmero. Por isso, a varivel K aparece com 19.000000 de contedo
(lembrem-se que o ponto deste nmero, est representando uma
virgula, certo?).
Figura 5.2: Resultado fnal das variveis
5.1.1.1 Prioridade dos Operadores
Uma questo que devemos tomar bastante cuidado ao montar
uma expresso aritmtica a prioridade dos operadores. A prioridade
que o operador aritmtico tem sob o outro que vai determinar como
a expresso ser resolvida. Na matemtica, quando montamos uma
expresso, usamos parnteses, colchetes e chaves. Nas linguagens
de programao, ns s temos os parnteses.
Os parnteses tm um papel importante nas expresses e
possibilitam que a ordem das operaes seja alterada. Expresses
entre parnteses so calculadas primeiro, portanto eles fornecem
o maior grau de prioridade s expresses que envolvem. Podemos
ter pares de parnteses envolvendo outros pares. Dizemos que os
parnteses esto aninhados. Neste caso, as expresses dentro dos
parnteses mais internos so avaliadas primeiro.
79
Programao 2
A tabela abaixo apresenta a prioridade de resoluo dos operadores
aritmticos:
Prioridade Operador
1 Operaes embutidas em parnteses mais internos
2 % (resto) e/ou * (multiplicao) e/ou / (diviso)
3 + (adio) e/ou (subtrao)
De acordo com a tabela, as expresses entre parnteses tem maior
prioridade, portanto, so resolvidas primeiro. Na sequncia, resolve
os operadores resto e/ou multiplicao e/ou diviso, e, fnalmente,
resolve os operadores de adio e/ou subtrao. Quando aparecem
operadores de mesma prioridade em uma expresso, o operador mais
esquerda ser avaliado primeiro.
Vamos analisar o exemplo 5.2, a seguir, e verifcar qual o valor
fnal das variveis A, B, C e D.
Exemplo 5.2: Prioridade de Operadores
1
2
3
4
5
6
7
8
9
int X, Y, Z, W, A, B, C, D;
X = 19;
Y = 3;
Z = 4;
W = 2;
A = X + Y * Z;
B = (X + Y) * Z;
C = X Y * Z / W;
D = (X-Y) * (Z/W);
Na linha 1, temos as declaraes das variveis que sero usadas
(todas elas so do tipo int). Nas linhas 2 a 5, so atribudos valores
s variveis X, Y, Z e W. Vamos acompanhar a resoluo de cada
expresso das linhas 6 a 9 na fgura 5.3. A parte da expresso que
80
Programao 2
aparece circulada, a que tem prioridade de resoluo.
Figura 5.3: Acompanhamento da resoluo das expresses aritmticas
No primeiro quadro (atribuio para a varivel A), aparecem
na expresso os operadores da adio e multiplicao. Como a
multiplicao tem prioridade, esta resolvida primeiro. Posteriormente,
o operador da adio resolvido e assim o resultado que ser
atribudo varivel A.
No segundo quadro (atribuio para a varivel B), a expresso
tambm composta por operadores de adio e multiplicao. No
entanto, a adio aparece entre parnteses. Sabe-se que a operao
dentro dos parnteses ter prioridade. Assim, a adio resolvida e,
posteriormente, a multiplicao.
No terceiro quadro (atribuio para a varivel C), aparecem na
expresso os operadores de subtrao, multiplicao e diviso.
O operador de subtrao o de menor prioridade. No entanto, os
operadores de multiplicao e diviso tem a mesma prioridade. Dessa
forma, o operador da multiplicao ser resolvido primeiro, j que ele
aparece mais a esquerda da expresso. Na sequncia, a diviso
resolvida. E, fnalmente, a subtrao.
Finalmente, no quarto quadro (atribuio para a varivel D),
aparecem na expresso os operadores de subtrao, multiplicao,
diviso e parnteses. Primeiro, resolvida a expresso dentro
do parntese mais a esquerda. Posteriormente, a expresso
entre parnteses mais a direita. Finalizando com a resoluo da
multiplicao.
81
Programao 2
5.1.2 Operadores Relacionais
Os operadores relacionais so utilizados para comparar valores
de variveis ou expresses aritmticas. Uma expresso aritmtica
tem como resultado um valor numrico. No caso de uma expresso
relacional, o resultado ser sempre um valor lgico: Verdade ou
Falso. Na tabela abaixo so apresentados os operadores relacionais
do C.
Operador Descrio
== Igualdade
!= Diferena ( )
< Menor
> Maior
<= Menor ou Igual ( )
>= Maior ou Igual ( )
Vamos aprender como montar uma expresso relacional. Segue
abaixo as possveis sintaxes de expresses relacionais.
Sintaxe
Variavel operador Valor
Varivel1 operador varivel2
Variavel operador Expresso Aritmtica
Expresso Aritmtica operador Expresso Aritmtica
Notem que podemos montar a expresso relacional de vrias
formas. Na tabela abaixo so apresentados exemplos de expresses
relacionais.
Exemplo 5.3: Expresses relacionais
1
2
3
4
X == 10
X > Y
X < Y + Z
X * Y > Z / W
82
Programao 2
Na linha 1, temos uma expresso relacional que verifca se a
varivel X igual a 10 (ou ela ser igual a 10 ou no, resultando
em verdade ou falso). Na linha 2, temos uma expresso relacional
que compara duas variveis. Esta expresso verifca se o valor da
varivel X maior que o valor da varivel Y. Na linha 3, a expresso
relacional compara o valor da varivel X com o resultado da expresso
aritmtica Y + Z. Por fm, na linha 4, temos uma expresso relacional
que compara o resultado de duas expresses aritmticas.
Suponha que X = 1, Y = 5, Z = 8 e W = 2. Vamos ver o resultado
das expresses do exemplo 5.3 (V verdade e F falso):
Resultados das expresses relacionais do exemplo 5.3
1
2
3
4
X == 10 => 1 == 10 => F
X > Y => 1 > 5 => F
X < Y + Z => 1 < 5 + 8 => 1 < 13 => V
X * Y > Z / W => 1 * 5 > 8 / 2 => 5 > 4 => V
Quando as expresses relacionais so compostas por expresses
aritmticas (como os exemplos das linhas 3 e 4), a prioridade de
resoluo da expresso aritmtica. Assim, primeiro resolve-se
a expresso aritmtica e a comparao feita com o resultado da
mesma.
5.1.3 Operadores Lgicos
Os operadores lgicos servem para interligar duas ou mais
expresses relacionais. Uma expresso lgica representa a unio
de expresses relacionais, permitindo que os resultados de vrias
expresses relacionais sejam transformados em um nico resultado
lgico (verdade ou falso).
Os operadores lgicos so: E, OU e NO. A tabela a seguir
apresenta como os operadores lgicos so representados na
linguagem C.
83
Programao 2
Operador Lgico Operador Lgico em C
E &&
OU ||
NO !
Os resultados das expresses lgicas obedecem s tabelas que
veremos a seguir, que dependem dos resultados das expresses
relacionais envolvidas. Quando montamos uma expresso lgica, as
expresses relacionais devem ser colocadas entre parnteses.
Comearemos estudando a tabela de resultados do operador lgico
E. Quando este operador interliga duas expresses relacionais, o
resultado da expresso lgica s ser verdade se as duas expresses
relacionais forem verdade. Em qualquer outra situao, o resultado
ser falso.
Tabela de Resultado do Operador Lgico E (&&)
Expresso Relacional 1 Expresso Relacional 2 Resultado
V V V
V F F
F V F
F F F
Vejamos um exemplo: um aluno s ser aprovado se a sua mdia
for maior ou igual a 7. E, se a quantidade de faltas for menor que 15.
As duas condies precisam ser verdade, para o aluno ser aprovado.
Se o aluno tem a mdia maior que 7, mas tem mais de 15 faltas, ele
no ser aprovado. A expresso lgica para testar esta situao
apresentada na linha 1 do exemplo 5.4, a seguir.
Exemplo 5.4: Expresses Lgicas com operador e (&&)
1
2
3
(media >= 7.0) && (faltas < 15)
(A < 5) && (B <> 5)
(X > 10) && (Y > 50) && (Z < 25)
84
Programao 2
Quando temos mais de duas expresses relacionais, como o
caso do exemplo da linha 3, a expresso lgica vai sendo resolvida da
esquerda para a direita. Para acompanhar a resoluo das expresses
do exemplo, vamos supor que: media = 8.0, faltas = 18, A=3, B=4, X =
15, Y= 70 e Z=30. Vejamos a fgura 5.4 a seguir.
Figura 5.4: Resultado das expresses lgicas do operador &&
No primeiro quadro da fgura, a primeira expresso relacional
verdade e a segunda expresso falsa. De acordo com a tabela
de resultados do operador lgico E, verdade && falso d falso. No
segundo quadro, as duas expresses relacionais so verdade. Assim,
de acordo com a tabela de resultados do operador lgico E, verdade
&& verdade d verdade. Finalmente, no terceiro quadro temos trs
expresses relacionais. Neste caso, iremos resolver a expresso
lgica, da esquerda para a direita. Comeamos encontrando o
resultado da primeira expresso relacional, com a segunda (ou seja,
(X>10) && (Y>50)). E depois, pegamos este resultado e continuamos
resolvendo o restante da expresso, sempre da esquerda para a
direita. Podemos interligar vria expresses relacionais, atravs dos
operadores lgicos.
Agora vamos analisar a tabela de resultados do operador lgico
OU. Quando tivermos duas expresses relacionais interligadas pelo
operador lgico ou, o resultado da expresso lgica s ser falso se
as duas expresses relacionais forem falsas. Nos demais casos, o
resultado da expresso ser verdade.
Tabela de Resultado do Operador Lgico OU (||)
Expresso Relacional 1 Expresso Relacional 2 Resultado
V V V
V F V
F V V
F F F
85
Programao 2
Vejamos um exemplo: para o aluno ingressar em um curso superior
- ele deve ser aprovado no vestibular OU ele deve ser um portador de
diploma. Apenas uma situao precisa ser verdade. Assim, se o aluno
nem passou no vestibular, nem portador de diploma, no poder
ingressar no curso. A expresso lgica para testar esta situao
apresentada na linha 1 do exemplo 5.5, a seguir. Vejam outros
exemplos de expresses lgicas com o operador OU.
Exemplo 5.5: Expresses Lgicas com operador ou (||)
1

2
3
(Aprovado_Vestibular == S) || (Portador_Diploma == S)



(A < 3) || (B < 2)
(X < 12) || (Y > 1) || (Z < 35)
A tabela de resultados do operador lgico NO apresentada a
seguir. Notem que a fnalidade deste operador inverter(ou negar,
como comumente chamado) o resultado de uma expresso
relacional. Assim, se a expresso relacional verdade, a sua negativa
falso.
Tabela de Resultado do Operador Lgico No (!)
Expresso Relacional Resultado
V F
F V
No exemplo 5.6, temos duas expresses lgicas com o operador
NAO. Este operador deve ser colocado na frente da expresso
relacional.
Exemplo 5.6: Expresses Lgicas com operador no (!)
1
2
!(X < 12)
!(Y == 10)
A fgura 5.5, ilustra uma situao cotidiana, do uso de operadores
lgicos.
86
Programao 2
Figura 5.5: Uso cotidiano de operadores lgicos
Ns tambm poderemos ter expresses lgicas, em que aparecem
mais de um tipo de operadores lgicos, alm de operadores
aritmticos. Vejamos o exemplo 5.7.
Exemplo 5.7: Expresses Lgicas com vrios operadores
1
2
3
4
(X > 10) && (Y < 30) || (Z == 1)
(A == 2) || (B <> C) && (D < 1) || (E > 10)
!(A == 1) || (B <= C + B)
(X + Y < Z + W) && (A < 3 + D) || (F < 5)
Nestes casos, vamos ver a tabela de prioridade de operadores,
para a resoluo de tais expresses.
Prioridade Operador
1 Operaes embutidas em parnteses mais internos;
2 Resto e/ou multiplicao e/ou diviso;
3 Adio e/ou Subtrao;
4 Operadores Relacionais;
5 Operadores Lgicos.
Primeiro, resolveremos as expresses aritmticas (seguindo
a prioridade dos operadores aritmticos), depois as expresses
relacionais e, fnalmente, as expresses lgicas.
87
Programao 2
5.2. Operadores Aritmticos de Atribuio
A linguagem C oferece um conjunto de operadores que uma
combinao de operador de atribuio e operador aritmtico, so
os operadores aritmticos de atribuio. Eles so utilizados para
representar de maneira reduzida uma operao aritmtica, seguida de
uma atribuio. A prxima tabela apresenta os operadores aritmticos
de atribuio e como utiliz-los em nossos programas.
Operador Exemplos de Uso Descrio
+= X += 4; Equivale a X = X + 4;
-= Y -= X; Equivale a Y = Y X;
*= Z *= W; Equivale a Z = Z * W;
/= K /= 7; Equivale a K = K / 7;
%= L %= M; Equivale a L = L % M
Como pode ser visto, a sintaxe do operador aritmtico de atribuio
: um operador aritmtico(+, -, *, /, %) seguido do operador da
atribuio (=). Uma expresso com este tipo de operador, signifca que
a varivel do lado esquerdo da atribuio, alm de receber o resultado,
tambm far parte da expresso aritmtica. Vejamos o exemplo dado
para o operador +=. A expresso X += 4, quer dizer que: ser obtido
o valor da varivel X, adiciona 4, e este resultado atribudo a prpria
varivel X. Neste caso, como se fosse um acumulador: acumule 4
ao valor que j tem na varivel X.
5.3. Operadores ++ e --
Os operadores ++ e -- so utilizados aps o nome de uma varivel
e servem para incrementar (++) ou decrementar (--) uma unidade da
varivel, ou seja, somar 1 ou subtrair 1 do valor da varivel. A tabela
abaixo apresenta os operadores ++ e --, seguidos de exemplos de
uso. Aps o ++ ou --, devemos colocar um ponto e vrgula.
Operador Exemplos de Uso Descrio
++ X++; Equivale a X = X + 1;
-- Y--; Equivale a Y = Y -- 1;
88
Programao 2
No exemplo X++, signifca que, se X=5, ser somado 1 ao valor da
varivel X, e assim, X fnalizar com 6. Da mesma forma, no exemplo
Y--, signifca que, se Y=5, ser subtrado 1 do valor da varivel Y, e
assim, Y fnalizar com 4
28
.
5.4. Converso de tipo
Quando usamos operadores aritmticos, temos que lembrar que
o resultado da expresso depende do tipo das variveis envolvidas.
Por exemplo, quando dividimos dois nmeros inteiros, o resultado a
parte inteira do quociente da diviso. Mas, quando dividimos nmeros
reais, o resultado vem completo, a parte inteira e a parte fracionria
do quociente. Outro detalhe que precisamos lembrar que alguns
operadores s podem ser usados por um tipo de dado. Este o caso
do operador do resto, ns s podemos utiliz-lo com dados do tipo
inteiro.
Por conta disso, algumas vezes desejamos, momentaneamente,
modifcar o tipo do contedo de uma varivel. Isto , queremos que
uma varivel se comporte como se ela fosse de um tipo diferente do
que ela foi declarada. Por exemplo: declaramos uma varivel como
int e queremos, momentaneamente, que seu contedo seja utilizado
como um foat. Este procedimento chamado de converso de tipo
ou casting (moldagem, em Ingls).
A converso de tipo usada em uma expresso aritmtica e feita
da seguinte forma: antes da varivel, colocamos entre parnteses, o
tipo que queremos que a varivel seja nesta expresso aritmtica.
importante salientar que a converso de tipo feita com o dado
armazenado em uma varivel, mas a varivel continua tendo o seu tipo
original. Vamos ver o exemplo 5.8, que apresenta uso de converso
de tipo.
Saiba Mais
28
Os operadores
++, -- e
operadores
aritmticos
de atribuio
fazendo com
que as nossas
expresses
fquem menores,
j que precisamos
escrever menos
coisas para a
montagem da
expresso.
89
Programao 2
Exemplo 5.8: Converso de tipo
1
2
3
4
5
6
7
int A,B,C;
foat X,Y;
A=3;
B=5;
X=6.5;
C = (int)X % B;
Y = (foat)A/B;
Nas linhas 1 e 2, temos as declaraes de cinco variveis. Nas
linhas 3, 4, e 5 foram atribudos valores as variveis A, B e X. Na linha
6, precisamos executar uma operao para obter o resto da diviso
entre a varivel X (que do tipo foat) e a varivel B (que do tipo
int). Esta operao no seria possvel, j que o operador do resto
no aceita nmeros reais na expresso. No entanto, esta operao
se torna possvel, se fzermos a converso de tipo da varivel X.
Queremos que, nesta expresso, o contedo de X seja um inteiro.
Para isso, colocamos (int) na frente da varivel X, como mostra a linha
6 do exemplo. Como a varivel X tem 6.5 armazenado, nesta conta,
a parte fracionria ser desprezada e a conta ser feita considerando
que X 6. Assim, 6 % 5 = 1. Ento, 1 o valor que ser atribudo a
varivel C.
Vamos ver agora a atribuio da linha 7. Neste caso, estamos
querendo fazer a diviso entre dois nmeros inteiros. Esta conta
possvel, mas ela traz como resultado, apenas a parte inteira do
quociente. No entanto, h situaes em que queremos dividir dois
nmeros inteiros, e receber o resultado completo, parte inteira
e fracionria do quociente. Este o caso da linha 7. Para que o
resultado venha completo, basta que o contedo de uma das variveis
se comporte como um foat. Com isso, um foat dividido por um int,
temos como resultado um foat. Dessa forma, fzemos a converso
de tipo da varivel A, solicitando que seu contedo se comporte como
um foat. Nesta linha 7 teremos, ento, 3.0/5 = 0.6. Este o valor que
ser atribudo a varivel Y.
90
Programao 2
5.5. Funes Matemticas (biblioteca math.h)
A linguagem de programao C possui uma biblioteca que agrupa
um conjunto de funes matemticas. a biblioteca math.h. Nesta
seo, vamos ver quatro funes matemticas, da biblioteca math.h,
que utilizaremos com mais frequncia nos nossos programas. So as
funes para encontrar a raiz quadrada de um nmero, potncia (elevar
um nmero a uma potncia) e duas funes de arredondamento. Esta
biblioteca possui outras funes, mas estas so as mais utilizadas
nos nossos programas.
As funes matemticas precisam receber um ou vrios parmetros
e nos retornam um resultado. Por exemplo, para descobrir a raiz
quadrada de um nmero, a funo precisa saber de que nmero ser
calculada a raiz quadrada. Este nmero que fornecido a funo o
parmetro. Vamos ver a tabela a seguir, em que feita a descrio
destas funes.
Funo Descrio Exemplos de uso
sqrt Funo para encontrar a raiz
quadrada de um nmero. A funo
sqrt precisa receber como parmetro,
o nmero que desejamos encontrar a
sua raiz quadrada. O resultado desta
funo um nmero real. Como uma
funo retorna um resultado, devemos
atribu-lo a uma varivel.
R = sqrt(16);
R = sqrt(A);
pow Funo para encontrar a potncia de
um nmero, ou seja, eleva um nmero
a um expoente: A
B
. Assim, se A = 4 e
B = 3, 4 elevado a 3 64. A funo
pow ir receber dois parmetros. O
primeiro a base (neste exemplo o
A) e o segundo o expoente (neste
caso o B). Esta funo retorna um
nmero real como resultado.
P = pow(3,4);
P = pow(A, 3);
ceil A funo ceil serve para arredondar
um nmero real. Esta funo
arredonda o nmero para cima.
Assim, ela retornar como resultado:
o primeiro nmero inteiro maior
que o nmero que desejamos
arredondar. Por exemplo: se
x = 1.34, e desejamos arredondar com
a funo ceil, o resultado ser 2.0. Ou
seja, o primeiro nmero inteiro acima
de 1.34. Apesar do arredondamento,
esta funo retorna um nmero real
como resultado.
Z = ceil(1.67);
Z = ceil(Z);
91
Programao 2
foor A funo foor serve para arredondar
um nmero real. Esta funo
arredonda o nmero para baixo.
Assim, ela retornar como resultado:
o primeiro nmero inteiro menor
que o nmero que desejamos
arredondar. Por exemplo: se
x = 1.34, e desejamos arredondar com
a funo foor, o resultado ser 1.0. Ou
seja, o primeiro nmero inteiro abaixo
de 1.34. Apesar do arredondamento,
esta funo retorna um nmero real
como resultado.
Z = foor(1.67);
Z = foor(Z);
Ateno
Sempre que usarmos estas funes nos nossos programas,
devemos incluir a biblioteca matemtica, com a diretiva de
compilao: #include <math.h>.
Devemos fcar atentos ao tipo de dado que a funo retorna, para
que seja feita a atribuio para uma varivel compatvel com o tipo do
resultado. Por exemplo, no podemos atribuir o resultado da funo
pow, para uma varivel inteira.
Programas Resolvidos
Nesta seo, vamos acompanhar a resoluo de dois programas
completos, que utilizaro os comando aprendidos neste captulo.
Vamos l?
No primeiro programa que iremos analisar, o aluno fornecer seu
nome e as duas notas que tirou nas provas de programao. Como
resultado, o programa vai imprimir a mdia do aluno. Segue abaixo o
programa completo 5.1. Em seguida, vamos comentar cada linha.
92
Programao 2
Programa Completo 5.1: Ler o nome e duas notas
do usurio e imprimir a mdia.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

17
18
#include <stdio.h>
//ler o nome e as duas notas do aluno e imprimir a
media
main()
{
char nome[20];
foat nota1, nota2, media;
printf(Calcular a media do aluno\n\n);
printf(Seu nome: );
ffush(stdin);
gets(nome);
printf(Nota 1: );
scanf(%f, &nota1);
printf(Nota 2: );
scanf(%f, &nota2);
media = (nota1 + nota2)/2;
printf(\n\n%s, sua media = %.2f, nome,
media);
getche();
}
Comentrios sobre cada linha do Programa completo 5.1:
Linha 1: Como iremos ler o nome do aluno, precisamos incluir
a biblioteca stdio.h onde esto os comandos ffush e gets.
Linha 2: Comentrio informando o que o programa faz.
93
Programao 2
Linha 3: incio do programa principal, que defnido pelo:
main().
Linha 4: um abre chaves, que ir delimitar o corpo do programa
principal.
Linhas 5 e 6: declaraes das quatro variveis do programa:
nome, nota1, nota2 e mdia.
Linha 7: um printf que serve para colocar, no incio da tela, o
ttulo do que o programa faz.
Linha 8: printf para que o usurio saiba que precisa fornecer
seu nome.
Linha 9: comando ffush, que DEVE sempre vir antes do
comando gets. Utilizado para limpar o buffer de entrada de
dados.
Linha 10: gets que efetuar a leitura do nome do usurio.
Linha 11: printf para que o usurio saiba que precisa fornecer a
primeira nota.
Linha 12: scanf que l a primeira nota e armazena na varivel
nota1.
Linha 13: printf para que o usurio saiba que precisa fornecer
a segunda nota.
Linha 14: scanf que l a segunda nota e armazena na varivel
nota2.
Linha 15: clculo da mdia do aluno. Notem que a soma das
nota1 e nota2 aparece entre parnteses. Devemos lembrar que
o operador da diviso tem prioridade maior que o operador da
soma. Assim, para que a soma das notas seja feita primeiro,
ela deve vir entre parnteses. No esqueam deste detalhe!
Linha 16: printf que apresenta a mdia do aluno. Notem que na
mensagem, tambm ser escrito o nome do aluno. A mdia do
aluno ser apresentada com duas casas decimais (%.2f)
Linha 17: comando getche que faz com que a tela de
execuo do programa fque aberta, e assim podemos ver o
resultado do programa. Nesta linha tambm poderamos usar o
system(pause).
94
Programao 2
Linha 18: fecha chaves, indicando o fnal do programa
principal.
importante que vocs digitem estes programas resolvidos, no
Dev-cpp, assim vo se familiarizando com a sintaxe do C, certo?
Vamos fazer o outro programa?
Nosso segundo programa ir ler um nmero e vai imprimir a sua
raiz quadrada. Segue abaixo o programa completo 5.2. Em seguida,
vamos comentar cada linha.
Programa Completo 5.2: Ler um nmero e imprimir a raiz quadrada
1
2
3
4
5
6

7
8
9
10
11
12
#include <math.h>
//ler um nmero e encontrar a raiz quadrada
main()
{
foat num, raiz;
printf(Calcular a raiz quadrada de um numero\
n\n);
printf(Numero: );
scanf(%f, &num);
raiz = sqrt(num);
printf(\n\nA raiz quadrada de %.1f = %.1f.,
num, raiz);
getche();
}
Comentrios sobre cada linha do Programa completo 5.2:
Linha 1: Para encontrar a raiz quadrada, iremos utilizar a
funo sqrt da biblioteca math.h. Assim, precisamos inclu-la no
nosso programa.
Linha 2: Comentrio informando o que o programa faz.
95
Programao 2
Linha 3: incio do programa principal, que defnido pelo:
main().
Linha 4: um abre chaves, que ir delimitar o corpo do programa
principal.
Linha 5: as declaraes das duas variveis do programa: num
e raiz.
Linha 6: printf que serve para colocar, no incio da tela, o ttulo
do que o programa faz.
Linha 7: printf para que o usurio saiba que precisa fornecer o
nmero.
Linha 8: scanf que l o nmero e armazena na varivel num.
Linha 9: clculo da raiz quadrada do nmero. Usamos a funo
sqrt, passando como parmetro o nmero que foi digitado pelo
usurio (que est armazenado na varivel num). O resultado
da funo sqrt atribudo varivel raiz.
Linha 10: printf que apresenta o resultado. Notem que ser
apresentada apenas uma casa decimal (%.1f) das variveis
num e raiz.
Linha 11: comando getche que faz com que a tela de execuo
do programa fque aberta, e assim podemos ver o resultado do
programa.
Linha 12: fecha chaves, indicando o fnal do programa
principal.
A fgura 5.6 apresenta as duas telas de execuo dos programas
completos 5.1 e 5.2.
Figura 5.6: Telas de execuo dos programas completos 5.1 e 5.2
96
Programao 2
Com estes dois programas comentados, podemos dar incio
resoluo de mais uma lista de exerccios. Continuem programando!
Atividades e Orientaes de Estudo
Temos mais uma lista de exerccios para consolidar o entendimento
do assunto visto neste captulo. A maior parte das questes deve ser
resolvida no computador, certo? Continuem fazendo os programas
e sempre que der erro tenham calma para encontr-los. Fiquem
atentos(as) com a sintaxe de cada comando, para no cometer erros
com tanta frequncia. Vamos iniciar nosso novo treino?
1. Dados os valores inteiros abaixo:
MEDIA NOTA TOTAL Z K X I J A
0 2 10 0 7 4 80 -1 -4
Quais os valores resultantes depois da execuo dos passos a
seguir:
1) X = TOTAL/NOTA;
2) X = X+1;
3) NOTA = X;
4) TOTAL = NOTA + X + TOTAL;
5) MEDIA = 3;
6) K += 9;
7) Z = J / 5;
8) K = I % 5;
9) I ++;
10) I = I+2*A;
2. De acordo com os valores das variveis abaixo, encontre o
resultado das expresses lgicas com VERDADE ou FALSO:
A B C D E
10 3 2 2 25
a) A == D
b) (A>B) && (C==D)
c) (E+2<B+C) && (A==10)
97
Programao 2
d) (D*E>100) || (B<5)
e) (E==25) && (A >B+C+D) && (C<B)
f) !(A < 15) && (B>=3)
g) (D>2) || (C == 7) && (E > 20)
3. Faa um programa que leia um nmero qualquer e imprima o
seu cubo.
4. Uma empresa vai dar um aumento de salrio ao seu
funcionrio. Faa um programa para ler o salrio do funcionrio
e o percentual de reajuste. Calcular e escrever o valor do novo
salrio.
5. Faa um programa para ler o nmero de votos brancos, nulos
e vlidos de uma eleio. Calcular e escrever o percentual que
cada um representa em relao ao total de eleitores.
6. Faa um programa que leia o nmero total de prestaes de
um consrcio, o total de prestaes pagas e o valor atual da
prestao. O programa deve calcular e apresentar o saldo
devedor atual e a quantidade de prestaes sem pagar.
7. Dada as seguintes entradas: quilometragem inicial,
quilometragem fnal, litros consumidos, preo do litro de
combustvel. Faa um programa que imprima o seguinte
Relatrio: distncia percorrida, Valor total gasto e o consumo do
carro(quantos quilmetros percorre com 1 litro de combustvel).
8. Um motorista de txi deseja calcular o rendimento de seu carro
na praa. Sabendo-se que o preo do combustvel de R$2.59,
faa um programa para ler: a marcao do odmetro (Km) no
incio do dia, a marcao (Km) no fnal do dia, a quantidade
de litros de combustvel gasto e o valor total (R$) recebido dos
passageiros. Calcular e escrever: a mdia do consumo em km/l
e o lucro (lquido) do dia.
9. Faa um programa que leia os preos de uma mercadoria em
abril e maio. Tendo como base a variao dos preos desta
mercadoria, calcule a taxa de infao.
10. Faa um programa que leia o tempo de durao de um evento
em uma fbrica expressa em segundos e mostre-o expresso
em horas, minutos e segundos.
98
Programao 2
11. Faa um programa para um caixa eletrnico, que l o valor
que o cliente quer sacar e calcula o menor nmero possvel de
notas de 100,00, 50, 20 e 10 reais em que o valor lido pode ser
decomposto. Escrever o valor do saque e a relao de notas
necessrias. Suponha que o sistema monetrio no utiliza
centavos. Ateno: S digite nmeros mltiplos de 10.
Exemplo: Valor: R$ 380,00
Notas de R$ 100,00: 3
Notas de R$ 50,00: 1
Notas de R$ 20,00: 1
Notas de R$ 10,00: 1
Conhea Mais
Pesquisem na Internet outra funes matemticas disponveis na
biblioteca math.h. Comecem a pesquisa pelo site:
http://visualcplus.blogspot.com/2006/03/mathh.html
Vamos revisar?
Para revisarmos os tpicos tratados neste captulo, observem o
resumo a seguir:
Os operadores aritmticos so utilizados quando desejamos
resolver expresses aritmticas. Devemos prestar ateno no tipo
das variveis que esto sendo utilizadas na expresso, pois o tipo
interfere no resultado da expresso.
Os operadores relacionais so utilizados quando desejamos
comparar valores de variveis. O resultado de uma expresso
relacional sempre verdade ou falso.
Os operadores lgicos servem para interligar duas ou mais
expresses relacionais. O resultado de uma expresso lgica
sempre verdade ou falso.
99
Programao 2
Podemos utilizar os operadores aritmticos de atribuio para
reduzir o tamanho das expresses aritmticas.
Os operadores ++ e incrementam ou decrementam 1 de uma
varivel.
Na biblioteca math.h podem ser encontradas funes matemticas
para encontrar a raiz quadrada de um nmero, potncia,
arredondamento de nmeros reais, dentre outras.
Consideraes Finais
Neste volume, tivemos a oportunidade de iniciar nosso
aprendizado na linguagem de programao C. Nos captulos 1 e
2, conhecemos os principais conceitos desta rea (programao,
linguagem de programao, um pouco do histrico do C, dentre
outros), nos preparando para um melhor entendimento da linguagem
de programao C. Nos captulos 3, 4 e 5, comeamos a estudar a
sintaxe da linguagem de programao C, vimos os tipos de dados
manipulados pela linguagem, os comandos de entrada e sada
e a utilizao dos operadores aritmticos, relacionais e lgicos.
Estes assuntos nos deram o conhecimento sufciente para iniciar
o desenvolvimento dos nossos primeiros programas em C. Mas
estamos apenas no incio. Temos mais trs volumes, que nos daro
a capacidade de desenvolver programas mais complexos. Continuem
frmes nos estudos! At o prximo mdulo.
Referncias
ARAJO, Jairo. Dominando a Linguagem C. So Paulo: Cincia
Moderna, 2004.
ASCENIO, Ana Fernanda Gomes e CAMPOS, Edilene Aparecida
Veneruchi. Fundamentos de Programao de Computadores.
So Paulo: Prentice Hall, 2002.
DEITEL, H, M e DEITEL, P. J. Como Programar em C. Rio de
Janeiro: LTC, 1999.
LAUREANO, Marcos. Programando em C Para Linux, Unix e
100
Programao 2
Windows. Rio de Janeiro: Brasport, 2005.
MIZRAHI, Victorine Viviane. Treinamento em Linguagem C
Curso Completo. So Paulo: Makron, 1999.
MONTGOMERY, Eduard. Programando em C: Simples e
Prtico. So Paulo: Alta Books, 2006.
OLIVEIRA, Ulisses. Programando em C Volume I
Fundamentos. So Paulo: Cincia Moderna, 2004.
SCHILDT, Herbert. C Completo e Total. So Paulo: Makron,
1996.
SEBESTA, Robert. Conceitos de Linguagem de Programao.
So Paulo: Makron, 2003.
Conhecendo a Autora
Sou graduada em Cincia da computao pela Universidade
Federal de Sergipe. Fiz mestrado e doutorado na Universidade Federal
de Pernambuco, desenvolvendo pesquisas nas reas de Sistemas
Distribudos e Geoprocessamento. Comeei a ensinar em 2000, nos
cursos de Cincia da Computao e Sistemas de Informao. Desde
o incio da minha carreira como professora, ministro disciplinas de
Programao e tenho uma paixo pela linguagem C. Atualmente,
encontrei uma nova paixo: Educao a Distncia.
Recife, 2009
Programao 2
Snia Virginia Alves Frana
Universidade Federal Rural de Pernambuco
Reitor: Prof. Valmar Corra de Andrade
Vice-Reitor: Prof. Reginaldo Barros
Pr-Reitor de Administrao: Prof. Francisco Fernando Ramos Carvalho
Pr-Reitor de Extenso: Prof. Paulo Donizeti Siepierski
Pr-Reitor de Pesquisa e Ps-Graduao: Prof. Fernando Jos Freire
Pr-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira
Pr-Reitora de Ensino de Graduao: Prof. Maria Jos de Sena
Coordenao de Ensino a Distncia: Prof Marizete Silva Santos
Produo Grfca e Editorial
Capa e Editorao: Allyson Vila Nova, Rafael Lira, Italo Amorim e Mrcio Heitor
Reviso Ortogrfca: Marcelo Melo
Ilustraes: Diego Almeida e Glaydson da Silva
Coordenao de Produo: Marizete Silva Santos
Sumrio
Apresentao ........................................................................................5
Conhecendo o Volume 2 ......................................................................6
Captulo 1 Estruturas de Seleo .....................................................8
1.1. Estruturas de Controle .................................................................8
1.2. If Else (se seno) ..................................................................9
1.2.1. If Simples ............................................................................10
1.2.2. If Composto ........................................................................14
1.2.3. If Aninhado..........................................................................19
1.3. Switch (Escolha-Caso) ..............................................................24
1.4. Identao de um Programa .......................................................31
Captulo 2 Estruturas de Repetio ...............................................39
2.1. For (para... faa) ........................................................................39
2.2. While (enquanto... faa teste no incio) ..................................46
2.3. Do/while (repita... at - teste no fnal) ........................................49
2.4. Uso do break na Estrutura de Repetio ...................................56
Captulo 3 Modularizao ................................................................64
3.1. O que so mdulos e por que utiliz-los? .................................64
3.2. Estrutura de um mdulo ............................................................66
3.3. Em que ponto do programa os mdulos devem ser
implementados? ...............................................................................69
3.4. Escopo das Variveis ................................................................70
3.5. Parmetros ................................................................................71
3.6. Contexto do Mdulo (Ao ou Resultado) .................................72
3.7. Ativando Funes ......................................................................73
Apresentao
Caro(a) aluno(a),
Seja bem-vindo (a) ao segundo mdulo da disciplina Programao II. Nesta disciplina,
voc est aprendendo a programar na linguagem de programao C, uma das mais
utilizadas mundialmente.
No volume I, voc aprendeu os comandos bsicos do C, que permitiram a construo
dos primeiros programas nesta linguagem. Neste volume II, ser dado um novo passo,
conhecendo um pouco mais desta linguagem, analisando novos comandos que
melhoraro a capacidade de resolver problemas computacionais.
Este livro segue a mesma ideia do volume I, os assuntos so apresentados de forma
gradativa, com muitos exemplos de programas completos e comentados, visando um
bom entendimento, principalmente para as pessoas que esto iniciando no mundo da
programao. Ao fnal de cada captulo, voc poder testar o seu aprendizado e assimilar
melhor o que foi estudado, atravs da resoluo de exerccios. Isto muito importante!
No deixe de resolv-los.
Vale lembrar que, para um bom andamento dos estudos destes novos assuntos, voc
ter que ter assimilado o contedo do volume I, pois este continuar sendo utilizado em
todos os nossos programas. Mas isto no um problema para quem vem resolvendo
questes de programao regularmente, no mesmo?
O objetivo deste segundo mdulo apresentar as estruturas de controle de fuxo:
seleo e repetio. Alm disso, tambm ser analisada a diviso de programas em
mdulos/funes, visando a um desenvolvimento mais rpido e um cdigo mais legvel.
Ao fnal deste mdulo, voc vai perceber o quanto a sua capacidade de resolver
programas foi aumentada. Convido-lhe para uma nova etapa no conhecimento da
linguagem de programao C. Vamos comear?
Bons estudos!
Snia Virginia Alves Frana
6
Programao 2
Conhecendo o Volume 2
Neste segundo volume, vocs iro encontrar o mdulo 02 da
disciplina: Programao II. Este volume est estruturado em trs
captulos, que sero estudados ao longo de 15h/aula. Para facilitar
seus estudos, veja a organizao deste volume.
Captulo 1: Estruturas de Seleo
Carga Horria do Captulo 01: 5 h/aula
Objetivos do Captulo 1: Apresentar a sintaxe das duas
estruturas de seleo (if e switch), disponveis na linguagem de
programao C.
Contedo Programtico do Captulo 1
Estruturas de controle
Estrutura de seleo if: simples, composto e aninhado
Estrutura de seleo switch.
Captulo 2: Estruturas de Repetio
Carga Horria do Captulo 02: 5 h/aula
Objetivos do Captulo 2: Apresentar a sintaxe das trs
estruturas de repetio (for, while e do/while), disponveis na
linguagem de programao C.
Contedo Programtico do Captulo 2
Estrutura de repetio for
Estrutura de repetio while
Estrutura de repetio do/while
Comando break.
Captulo 3: Modularizao de Programas
Carga Horria do Captulo 03: 5 h/aula
Objetivos do Captulo 3: Apresentar como se criam
mdulos(funes e procedimentos) em um programa C.
7
Programao 2
Contedo Programtico do Captulo 3
Estrutura de um mdulo
Variveis locais e globais
Parmetros
Chamada de um mdulo
Comando return.
Ao fnal de cada captulo vocs encontraro:
A seo Atividades e Orientaes de Estudo: que contm
exerccios para a fxao do assunto estudado, alm de
indicao de fruns de discusso.
A seo Conhea Mais: que contm dicas de sites e livros
que devem ser lidos para ampliar os seus conhecimentos.
A seo Vamos Revisar?: que apresenta um resumo dos
principais tpicos abordados no captulo.
8
Programao 2
Captulo 1 Estruturas de
Seleo
Vamos conversar sobre o assunto?
Nos programas que desenvolvemos at este momento, todos
os comandos que aparecem no programa so executados, ou seja,
o processador vai passando e executando cada um dos comandos
do programa. Existem situaes em que no queremos que todos os
comandos sejam executados. Nestes casos, devemos utilizar alguma
estrutura de seleo, que nos permite desviar de uma sequncia de
comandos do programa. Neste captulo, iremos aprender a utilizar as
estruturas de seleo disponveis na linguagem C, que so: if e switch.
Estas estruturas correspondem ao se e escolha do Portugol. As
estruturas de seleo tambm podem ser chamadas de: estruturas
de deciso ou estruturas de desvio. Vamos avanar, um pouco mais,
nossos conhecimentos em C?
1.1. Estruturas de Controle
De um modo geral, os comandos de um programa so executados
um aps o outro, na ordem em que foram escritos de cima para
baixo e da esquerda para a direita. Este o fuxo de execuo de um
programa. Mas, atravs do uso de estruturas de controle, podemos
controlar o fuxo de execuo dos nossos programas. Existem trs
tipos de estruturas de controle:
Sequncia: nesta estrutura, todos os comandos so executados
uma nica vez, de forma linear, um aps o outro. At ento,
nossos programas foram desenvolvidos desta forma.
Seleo: esta estrutura permite que um grupo de comandos
seja executado ou no, dependendo do resultado de uma
condio (representada por expresses relacionais ou lgicas).
Dessa forma, poderemos ter um conjunto de comandos do
nosso programa que no vai ser executado.
Repetio: com estas estruturas, poderemos fazer com que
uma sequncia de comandos seja executada vrias vezes.
9
Programao 2
Para entender melhor as estruturas de controle, vamos fazer a
seguinte analogia: imagine que o nosso programa uma estrada. As
retas so as sequncias. Os entroncamentos so as estruturas de
seleo, que nos permitem pegar um caminho ou outro. As rotatrias
e os retornos so as estruturas de repetio, que nos permitem passar
vrias vezes pelo mesmo local. A Figura 1.1 apresenta estradas com
retas, entroncamentos e rotatrias.
Figura 1.1: Retas, entroncamentos e rotatrias
Nas prximas sees, deste captulo, vamos conhecer as
estruturas de seleo do C. No captulo seguinte, conheceremos as
estruturas de repetio.
1.2. If Else (se seno)
A estrutura de seleo if a estrutura de seleo mais simples. No
entanto, esta estrutura resolve todo e qualquer problema de seleo.
Esta estrutura permite executar um entre vrios blocos de comandos.
A escolha de qual bloco ser executado depende do resultado de uma
condio (expresso relacional ou lgica, apresentadas no captulo
5 do volume I
1
). A sintaxe geral para o comando if apresentada
abaixo:
Sintaxe
if (condio)
bloco_de_comandos1;
else
bloco_de_comandos2;
Neste comando, a condio verifcada e, caso o resultado seja
verdade, o bloco_de_ comandos1 ser executado. Caso contrrio, o
bloco_de_comandos2 executado. Note que somente um dos blocos
Ateno
1
Vale lembrar que
o resultado de
uma expresso
relacional ou
expresso lgica
sempre verdade
ou falso.
10
Programao 2
ser executado. Apesar de possuir uma forma geral, esta estrutura
pode se apresentar de modos ligeiramente diferentes: if simples,
composto ou aninhado. Nas prximas sees vamos analisar,
separadamente, cada uma das possibilidades de sintaxe.
1.2.1. If Simples
O if simples o if sem o else. O if simples utilizado quando se
deseja executar uma sequncia de comandos, apenas se a condio
for verdade. Dessa forma, no existe uma sequncia de comandos
para ser executada quando a condio falsa. A fgura 1.2 apresenta
o fuxograma do if simples. A condio do if ser testada, se for
verdade, o bloco de comandos vinculado ao if executado. Se for
falso, o bloco de comandos vinculado ao if desviado.
Figura 1.2: Fluxograma do if simples
As sintaxes para o if simples so as seguintes:
Sintaxe
if (condio)
comando;
if (condio)
{ comando1;
comando2;
}
Quando o if simples tem apenas um comando, utilizamos a sintaxe
da esquerda. Quando o if simples tem mais de um comando para ser
executado, devemos colocar a sequncia de comandos entre chaves.
11
Programao 2
As chaves servem para que o compilador saiba quantos comandos
2
vo ser desviados, caso a condio seja falsa. Quando no colocamos
as chaves, o compilador entende que apenas um comando deve ser
desviado. A fgura 1.3 apresenta dois exemplos aplicando a sintaxe do
if simples.
if simples com um comando if simples com mais de um comando
main()
{ comando 1;
comando 2;
comando 3;
if (condicao)
comando 4;
comando 5;
comando 6;
comando 7;
}
main()
{ comando 1;
comando 2;
comando 3;
if (condicao)
{ comando 4;
comando 5;
}
comando 6;
comando 7;
}
Figura 1.3: Exemplos de if simples
Vamos analisar os exemplos da fgura 1.3. O programa principal
da esquerda formado por sete comandos. O programa vai sendo
executado, passando pelos comando1, comando2 e comando3. Ao
chegar no if, a condio avaliada. Se a condio for verdade, o
comando4 ser executado. Se esta condio for falsa, o comando4
ser desviado (ou seja, no ser executado). Na sequncia, so
executados os comando5, comando6 e comando7.
O programa principal da direita tambm composto de sete
comandos. Os comando1, comando2 e comando3 so executados.
Na seqncia, temos o if, que tem a sua condio avaliada. Se a
condio for verdade, os comando4 e comando5 so executados.
Caso contrrio, os comando4 e comando5 so desviados. Como este
if possui dois comandos, foi necessrio coloc-los entre chaves. Na
sequncia, os comando6 e comando7 so executados.
Ateno
2
At ento,
tnhamos
somente as
chaves que
delimitavam
o corpo do
programa
principal.
Veremos que as
chaves tambm
aparecero em
outras situaes.
Ateno
As condies do
if devem vir entre
parnteses. Se
tivermos mais de
uma expresso
relacional, estas
so conectadas
por operadores
lgicos.
O abre chaves
que delimita
o bloco de
comandos
vinculado ao if
colocado aps a
condio do if. O
fecha chaves
colocado aps o
ltimo comando
do bloco de
comandos do if.
O if e o else
devem ser
escritos todo em
letras minsculas.
12
Programao 2
Vamos ver um exemplo do uso do if simples? O programa 1.1
solicita o saldo atual do cliente e o valor que ele deseja retirar no
banco. O programa vai calcular e apresentar o valor do saldo do
cliente, aps o saque. Caso o saldo fque negativo, deve ser escrito
uma mensagem informando esta situao ao cliente.
Programa Completo 1.1
1
2
3
4
5
6
7
8
9
10

11
12

13
14
main()
{
foat saldo,valor_saque;
printf(Banco Poupe Aqui\n\n\n);
printf(Saldo atual: R$ );
scanf(%f,&saldo);
printf(\n\nValor do saque: R$ );
scanf(%f,&valor_saque);
saldo = saldo valor_saque;
printf(\n\nSaldo apos o saque: R$%.2f
\n\n,saldo);
if(saldo<0)
printf(\nAtencao: sua conta fcou com saldo
NEGATIVO!\a);
getche();
}
Comentrios sobre o programa completo 1.1:
Linha 1: incio do programa principal, que defnido pelo:
main().
Linha 2: temos um abre chaves, que ir delimitar o corpo do
programa principal.
Linhas 3: temos as declaraes das duas variveis do
programa: saldo e valor_saque.
Linha 4: um printf que serve para colocar, no incio da tela, o
ttulo do que o programa faz. Neste caso, foi colocado o nome
do banco.
13
Programao 2
Linha 5: printf para que o usurio saiba que precisa fornecer o
seu saldo atual.
Linha 6: scanf que l o saldo do cliente.
Linha 7: printf para que o usurio saiba que precisa fornecer o
valor do saque.
Linha 8: scanf que l o valor do saque.
Linha 9: Como j sabemos o valor do saldo e quanto ser
sacado, podemos calcular quanto fcar o saldo depois do
saque.
Linha 10: printf para apresentar o valor do saldo aps o saque.
Linha 11: if que testa se o saldo fcou negativo. A condio
para informar se o saldo est negativo o saldo ser um valor
menor que zero (saldo < 0). Assim, a condio do if montada
e colocada entre parnteses. Se o saldo for menor que zero, a
mensagem de saldo negativo deve ser apresentada.
Linha 12: printf para mostrar que o saldo fcou invlido. Veja
que este comando est vinculado ao if, dessa forma, ele s
ser executado se a condio do if for verdade. Como o if tem
apenas um comando, no precisamos colocar chaves.
Linha 13: comando getche que faz com que a tela de
execuo do programa fque aberta, e assim podemos ver o
resultado do programa. Nesta linha tambm poderamos usar o
system(pause).
Linha 14: fecha chaves, indicando o fnal do programa
principal.
A fgura 1.4 apresenta duas telas de execuo do programa
completo 1.1. No primeiro caso, o saldo permanece positivo aps o
saque. Dessa forma, o comando vinculado ao if no foi executado. No
segundo caso, o saldo fcou negativo aps o saque, assim, o comando
vinculado ao if foi executado (printf que imprime mensagem de saldo
negativo).
14
Programao 2
Saldo positivo aps o saque
Saldo negativo aps o saque
Figura 1.4: Telas de execuo do programa completo 1.1
Agora que j sabemos como usar o if simples, vamos aprender a
utilizar o if composto.
1.2.2. If Composto
O if composto o if com o else, dessa forma, teremos uma
sequncia de comandos que executada quando a condio resulta
em verdade e uma outra sequncia que executada quando a
condio falsa.
A fgura 1.5 apresenta o fuxograma do if composto. A condio do
if ser testada, se for verdade, o bloco de comandos 1 executado.
Se for falsa, o bloco de comandos 2 executado. Notem que apenas
um dos bloco de comando ser executado.
15
Programao 2
Figura 1.5: Fluxograma do if composto
Seguem abaixo as sintaxes para o if composto:
Sintaxe
Caso 1 Caso 2
if (condio)
comando1;
else
comando2;
if (condio)
{ comando1;
comando2;
}
else
comando3;
Caso 3 Caso 4
if (condio)
comando1;
else
{ comando2;
comando3;
}
if (condio)
{ comando1;
comando2;
}
else
{ comando3;
comando4;
}
De um modo geral, na sintaxe do if composto, teremos o if,
juntamente com a condio que ser testada. Abaixo da linha do
16
Programao 2
if, temos um comando ou uma sequncia de comandos que ser
executada se a condio for verdade. Logo em seguida temos o else e
um comando ou um sequncia de comandos que executada quando
a condio do if falsa.
Vamos ver qual a diferena entre as quatro sintaxes. Existe uma
regra que diz: se tivermos mais de um comando para ser executado
quando a condio for verdade, temos que colocar a sequncia de
comandos entre chaves. Para um nico comando, as chaves no so
necessrias. A mesma regra vale para a sequncia de comandos do
else, mais de um comando, a sequncia deve vir entre chaves.
Analisando a tabela com as quatro sintaxes temos:
Caso 1: Se a condio for verdade, apenas um comando ser
executado. Se a condio for falsa, apenas um comando ser
executado. Como tivemos um comando na sequncia do if e
um comando na sequncia do else, no necessrio colocar
chaves.
Caso 2: Se a condio for verdade, vrios comandos sero
executados. Dessa forma, necessrio colocar as chaves para
delimitar a sequncia de comandos do if. Quando a condio
for falsa, apenas um comando ser executado. Assim, no
necessita colocar as chaves no comando do else.
Caso 3: Se a condio for verdade, apenas um comando
ser executado. Com isso, no precisamos colocar as chaves
no comando do if. No entanto, se a condio for falsa, vrios
comandos devem ser executados. Com isso, a sequncia de
comandos do else deve vir entre chaves.
Caso 4: Se a condio for verdade, vrios comandos sero
executados. Dessa forma, precisamos colocar a sequncia de
comandos do if entre chaves. Se a condio for falsa, tambm
sero executados vrios comandos. Assim, a sequncia do else
precisa ser colocada entre chaves.
Vamos analisar um programa completo que utiliza o if composto.
Este programa l o nome do aluno e as suas duas notas. Em seguida,
calcula a mdia do aluno e apresenta uma mensagem informando se
o aluno foi aprovado ou reprovado (considerar que a mdia para ser
aprovado igual ou maior que 7.0).
Ateno
O else no tem
condio. A
condio do if.
Se a condio
for falsa, a
sequncia do else
executada.
Tomar cuidado
com as chaves
que delimitam
a sequncia de
comandos do if e
do else.
17
Programao 2
Programa Completo 1.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

17
18

19
20
#include <stdio.h>
main()
{
foat n1, n2, media;
char nome[20];
printf(Caderneta de Notas\n\n);
printf(Nome do aluno: );
ffush(stdin);
gets(nome);
printf(Nota 1: );
scanf(%f,&n1);
printf(Nota 2: );
scanf(%f,&n2);
media = (n1+n2)/2;
if (media>=7)
printf(\n\n%s foi aprovado(a) com media
%.1f\n,nome, media);
else
printf(\n\n%s foi reprovado(a) com media
%.1f\n,nome, media);
getche();
}
Comentrios sobre o programa completo 1.2:
Linha 1: incluso da biblioteca stdio, devido o comando ffush,
que ser usado quando formos ler o nome do aluno.
Linha 2: incio do programa principal, que defnido pelo:
main().
Linha 3: temos um abre chaves, que ir delimitar o corpo do
programa principal.
18
Programao 2
Linhas 4 e 5: temos as declaraes das variveis do
programa.
Linha 6: o printf que serve para colocar, no incio da tela, o ttulo
do que o programa faz. Neste caso, ser colocado caderneta
de notas.
Linhas 7 a 13: leitura das variveis de entrada: nome do aluno,
a primeira e a segunda nota.
Linha 14: clculo da mdia do aluno.
Linha 15: if composto que verifca qual o valor da mdia, para
escrever a mensagem se o aluno foi aprovado ou reprovado.
Para o aluno ser aprovado, a mdia tem que ser maior ou igual
a 7. A montagem da condio feita utilizando operadores
relacionais. Alm disso, a condio foi colocada entre
parnteses.
Linha 16: printf que executado quando a condio do if
for verdade. Neste caso, quando a mdia do aluno for maior
ou igual a 7. Note que a mensagem informa que o aluno foi
aprovado. Como apenas um comando est vinculado ao if, no
houve a necessidade de colocar chaves.
Linha 17: temos um else, que indica que tambm teremos uma
sequncia de comandos para ser executada quando a condio
do if for falsa, ou seja, mdia do aluno menor que 7.
Linha 18: printf que executado quando a condio do if for
falsa. Note que a mensagem informa que o aluno foi reprovado.
Como apenas um comando est vinculado ao else, no houve
a necessidade de colocar chaves.
Linha 19: comando getche que faz com que a tela de execuo
do programa fque aberta, e assim podemos ver o resultado do
programa.
Linha 20: fecha chaves, indicando o fnal do programa
principal.
A fgura 1.6 apresenta duas telas de execuo do programa
completo 1.2. No primeiro caso, o aluno aprovado e no segundo
caso, reprovado.
19
Programao 2
Aluno aprovado
Aluno reprovado
Figura 1.6: Telas de execuo do programa completo 1.2
Agora s falta estudarmos o ltimo tipo de if, que o if aninhado.
Vamos aprender mais um pouco?
1.2.3. If Aninhado
O if composto, visto na seo anterior, usado quando temos
duas possibilidades de resposta. Por exemplo, ou o aluno aprovado
ou reprovado. Apenas uma situao ir ocorrer. O if aninhado
ocorre quando temos mais de duas possibilidades de respostas (ou
situao). Por exemplo, ao comparar dois nmeros (x e y), temos
trs possibilidades de resposta: x menor que y, x maior que y, ou
ainda, x e y so iguais. Assim, a primeira possibilidade ser testada
na condio do if (verifcando se x menor que y). Se a condio for
falsa, ainda temos duas possibilidades de resposta. Para fazer esta
verifcao, necessitamos de um outro if. Este novo if ser colocado
dentro da sequncia de comandos do else. Assim, teremos um if
dentro do outro, por isso chamado de if aninhado.
20
Programao 2
A seguir, so apresentadas duas sintaxes de if aninhado. No
caso 1, temos trs possibilidades de respostas e no caso 2, quatro
possibilidades. Vale lembrar que podemos ir aninhando um if dentro
do outro, sem um limite de aninhamento. S depende de quantas
possibilidades de situaes teremos que testar.
Sintaxe
Caso 1: trs possibilidades de
resposta
Caso 2: quatro possibilidades de
resposta
if (condio1)
comando1;
else
{ if (condicao2)
comando2;
else
comando3;
}
if (condio1)
comando1;
else
{ if (condicao2)
comando2;
else
{ if (condicao3)
comando3;
else
comando4;
}
}
No caso 1, se a condio1 do primeiro if for verdade, o comando1
ser executado e toda a sequncia do else desviada. No entanto, se
a condio1 do if for falsa, o fuxo do programa desviado para o else.
Quando chega no else, encontrada uma sequncia de comandos
(por isso necessrio coloc-la entre chaves). Mas, nesta sequncia
tem um if, que precisa ter a sua condio avaliada. Se a condicao2
deste if for verdade, o comando2 executado. Caso seja falsa, o
fuxo do programa desviado para o else e executa o comando3.
Dessa forma, apenas um dos comandos (comando1, comando2 ou
comando3) ser executado, os demais sero desviados.
Um comportamento similar ocorre com o caso 2, que analisa quatro
possibilidades de respostas.
Vamos analisar um programa completo que utiliza o if aninhado.
Ateno
Existe if sem else
(que o primeiro
caso de if que
estudamos if
simples), mas
todo else est
vinculado a um if.

No colocar ponto
e vrgula depois
da condio do if
21
Programao 2
Neste programa, sero lidos dois nmeros inteiros(x e y) e seus
valores sero comparados. O programa ir escrever uma das trs
mensagens: x maior que y, x menor que y ou x e y so iguais. Na
sequncia, as linhas do programa sero comentadas.
Programa Completo 1.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
main()
{
int x, y;
printf(Compara Numeros\n\n);
printf(X: );
scanf(%d,&x);
printf(\nY: );
scanf(%d,&y);
if (x > y)
printf(\n\n%d eh maior que %d,x,y);
else
{ if (x < y)
printf(\n\n%d eh menor que %d,x,y);
else
printf(\n\nX e Y sao iguais: %d,x);
}
getche();
}
Comentrios sobre o programa completo 1.3:
Linha 1: incio do programa principal, que defnido pelo:
main().
Linha 2: temos um abre chaves, que ir delimitar o corpo do
programa principal.
Linha 3: temos as declaraes das variveis do programa.
Linha 4: o printf que serve para colocar, no incio da tela, o ttulo
22
Programao 2
do que o programa faz. Neste caso, ser colocado Compara
Nmeros.
Linhas 5 a 8: leitura das variveis de entrada: x e y.
Linha 9: Agora que j conhecemos o valor de x e y, devemos
comear a comparao. Nesta linha temos um if, com a
condio para verifcar se x maior que y. Se esta condio
for verdade, o comando da linha 10 ser executado e todos os
comandos dentro do else sero desviados.
Linha 10: printf para escrever que x maior que y.
Linha 11: temos um else, o programa ter seu fuxo desviado
para o else, caso a condio do if seja falsa. Notem que, se o
x no maior que y, ainda temos que descobrir se x menor
que y ou se x e y so iguais. Por conta disto, na sequncia de
comandos deste else, ser necessrio colocar um if composto.
Por termos uma seqncia de comandos, devemos coloc-la
entre chaves.
Linhas 12: abre chaves para informar que comear a
sequncia de comandos do else, alm do if que verifca a
segunda possibilidade de resposta: se x menor que y.
Linha 13: printf para escrever que x menor que y. Este printf
executado caso a condio do if da linha 12 seja verdade.
Linhas 14: temos um else, que est vinculado ao if da linha 12.
Ou seja, se a condio deste if for falsa, o fuxo do programa
desviado para este else.
Linha 15: printf para escrever que x e y so iguais. Este printf
executado caso a condio do if da linha 12 seja falsa.
Linhas 16 e 17: temos o getche() e o fecha chaves, indicando o
fnal do programa principal.
A fgura 1.7 apresenta telas de execuo do programa completo
1.3, mostrando as trs possibilidades de respostas.
23
Programao 2
X menor que Y
X maior que Y
X igual a Y
Figura 1.7: Telas de execuo do programa completo 1.3
Agora que j sabemos utilizar os trs casos da estrutura de
seleo if: simples, composto e aninhado, vamos analisar um outro
tipo de estrutura de seleo disponvel no C, que o switch. Vale
lembrar que o if um tipo de estrutura de seleo que pode ser
aplicada em qualquer situao em que seja necessria tomar uma
deciso no programa. O switch apresenta algumas restries e nem
sempre poderemos utiliz-lo. No entanto, o switch tem uma sintaxe
mais limpa que a do if. Dessa forma, sempre que for possvel o seu
uso, interessante inclu-lo no programa. Vamos ver como o switch
funciona?
24
Programao 2
Figura 1.8: Quadrinhos sobre deciso
1.3. Switch (Escolha-Caso)
O switch uma estrutura de deciso que permite a execuo de uma
sequncia de comandos a partir da anlise do valor de uma varivel
inteira ou de uma varivel com um nico caractere. Normalmente,
o switch usado quando sabemos os provveis valores que uma
varivel pode armazenar, e para cada valor, temos que executar uma
sequncia de comandos diferente. A grande restrio do switch que
ele no funciona para variveis reais, nem cadeia de caracteres. Alm
disso, o switch testa se a varivel igual a um valor.
No caso de uma condio usada no if, ns podemos usar qualquer
tipo de varivel, alm de podermos verifcar se seus valores so:
menor que, maior que, diferente de, etc., e no apenas a igualdade.
Por conta dessas restries, no em toda situao de seleo que o
switch pode ser utilizado. No Portugol, o switch o comando escolha-
caso. Signifcando que uma sequncia de comandos ser escolhida,
caso a varivel tenha um certo valor. Vamos analisar as sintaxes do
switch.
25
Programao 2
Sintaxe
Caso 1: sem o default Caso 2: com o default
switch (variavel)
{ case valor1: comando1;
comando2;
break;
case valor2: comando3;
comando4;
break;
case valor3: comando5;
comando6;
break;
}
switch (variavel)
{ case valor1: comando1;
comando2;
break;
case valor2: comando3;
comando4;
break;
case valor3: comando5;
comando6;
break;
default: comando7;
comando8;
break;
}
A sintaxe do switch a seguinte: aps o switch, colocamos o nome
da varivel que ser avaliada, entre parnteses. Para cada possvel
valor que a varivel pode assumir, colocaremos um case e ao lado, o
valor da varivel seguido de dois pontos(:). Em seguida, colocamos
a sequncia de comandos que deve ser executada, caso a varivel
tenha este valor. A sequncia de comandos deve ser fnalizada com
o comando break, obrigatoriamente. Assim, para cada valor que a
varivel pode assumir, teremos um case e a sequncia de comandos.
A sequncia de comandos no precisa vir entre chaves. No entanto,
temos as chaves que abre e fecha o comando switch.
Ao executar o switch, o processador ir procurar um case que
tenha o valor que a varivel est armazenado no momento. Quando
encontrar, executa a sequncia de comandos relacionada a este
valor e o break faz com que o fuxo do programa seja desviado para
o primeiro comando depois da chaves que fecha o switch. Assim,
s ser executada a sequncia de comandos de um nico case. No
entanto, caso a varivel no esteja armazenando um dos valores
26
Programao 2
previstos, nenhuma sequncia de comandos ser executada.
Alm dos case com os provveis valores das variveis, tambm
podemos colocar a clusula default no nosso switch (Caso 2, da
sintaxe). O default funciona como um else, ou seja, se a varivel
no tiver nenhum dos valores previstos nos case, ser executada
a sequncia de comandos do default. O default opcional, assim,
podemos ter switch com ou sem default.
Abaixo, temos o exemplo 1.1 que apresenta um switch sem o
default. A varivel cargo inteira e pode assumir os valores 1, 2 ou 3.
Dependendo do cargo do funcionrio, dado um aumento diferenciado
ao salrio do mesmo. Notem o break no fnal de cada sequncia de
comandos dos case.
Exemplo 1.1: Switch sem default
1
2
3
4
5
6
7
8
switch (cargo)
{ case 1: sal = sal + 200;
break;
case 2: sal = sal + 400;
break;
case 3: sal = sal + 600;
break;
}
No exemplo 1.2 temos um switch com o default. Neste exemplo,
se a varivel cargo no estiver com 1, 2 ou 3, ser executada a
sequncia de comandos do default. Ou seja, qualquer outro valor
diferente dos valores previstos, a sequncia de comandos do default
ser executada.
Ateno
O default deve
ser, sempre, a
ltima sequncia
de comandos do
switch.

No podemos
colocar dois
case testando o
mesmo valor.

Quando a varivel
do switch for um
char, devemos
colocar os
possveis valores
da varivel entre
apstrofos, por
exemplo: case
a:.
27
Programao 2
Exemplo 1.2: Switch com default
1
2
3
4
5
6
7
8
9
10
switch (cargo)
{ case 1: sal = sal + 200;
break;
case 2: sal = sal + 400;
break;
case 3: sal = sal + 600;
break;
default: sal = sal + 100;
break;
}
Uma outra situao que pode acontecer : uma mesma sequncia
de comandos deve ser executada para diferentes valores da varivel.
Por exemplo, para os funcionrios dos cargos 1 e 2 ser dado o mesmo
aumento salarial. Assim, para no repetirmos a mesma sequncia de
comandos no case 1 e 2, faremos como mostra a linha 2 do exemplo
1.3. Coloca-se o primeiro case com o respectivo valor e aps os dois
pontos, vem o prximo case e o valor que ser testado. Podemos
colocar quantos case sejam necessrios.
Exemplo 1.3: Switch
1
2
3
4
5
6
7
8
switch (cargo)
{ case 1: case 2: sal = sal + 200;
break;
case 3: sal = sal + 600;
break;
default: sal = sal + 100;
break;
}
Vamos analisar um programa completo que faz uso do switch. Uma
empresa conceder um aumento de salrio aos seus funcionrios,
28
Programao 2
varivel de acordo com o cargo, conforme a tabela abaixo. Faa
um programa que leia o cargo de um funcionrio (1-Gerente,2-
Engenheiro,3-Tcnico) e o seu salrio atual e calcule o novo salrio.
Se o cargo do funcionrio for invlido, dever ser impressa uma
mensagem de erro. Como resultado, mostre o salrio antigo, o novo
salrio e a diferena de salrio.
Cargo Percentual
Gerente 10%
Engenheiro 20%
Tcnico 30%
29
Programao 2
Programa Completo 1.4
1
2
3
4
5
6

7
8
9
10
11
12
13
14

15
16
17
main()
{
int cargo;
foat sal, nsal;
printf(Empresa Legal\n\n\n);
printf(Cargo(1-Gerente/2-Engenheiro/3-
Tecnico): );
scanf(%d,&cargo);
printf(\nSalario atual: );
scanf(%f,&sal);
switch (cargo)
{ case 1: nsal=sal*1.1; break;
case 2: nsal=sal*1.2; break;
case 3: nsal=sal*1.3; break;
default: printf(\n\nCargo Invalido!\n);
break;
}
if ((cargo>=1) && (cargo<=3))
{ printf(\n\n______________________________
\n);
18
20

21

22

23
24
25
printf(\n\nResultados\n\n);
printf(\nSalario Antigo..............: R$
%.2f\n,sal);
printf(\nSalario Novo................: R$
%.2f\n,nsal);
printf(\nDiferenca de Salarios: R$
%.2f\n,nsal - sal);
}
getche();
}
30
Programao 2
Comentrios sobre o programa completo 1.4:
Linhas 3 e 4: temos as declaraes das variveis do programa.
O cargo do funcionrio ser armazenado em uma varivel do
tipo int. Quando tiver armazenado 1, signifca que o funcionrio
um gerente, 2 engenheiro e 3 tcnico.
Linha 5: o printf que serve para colocar, no incio da tela, o
ttulo da empresa.
Linha 6: printf que solicita que o usurio digite o cargo do
funcionrio. Como estamos usando uma legenda, ou seja, um
nmero representando cada cargo, precisamos colocar neste
printf o signifcado de cada nmero.
Linha 7: scanf para ler o cargo do funcionrio.
Linha 8: printf para solicitar a digitao do salrio do
funcionrio.
Linha 9: scanf para l o salrio do funcionrio.
Linha 10: switch que avalia o cargo do funcionrio, para calcular
seu novo salrio. Cada cargo tem um aumento de salrio
diferente. Como foi solicitado que imprima uma mensagem de
erro quando o cargo foi invlido, ser colocado o default.
Linhas 11 a 15: nestas linhas temos os case de cada valor
da varivel cargo, alm do default. Para cada case, colocamos
a frmula para o clculo do novo salrio. No default, temos o
printf que escreve a mensagem de cargo invlido. Notem que
o break aparece no fnal da sequncia de comando de cada
case.
Linha 16: este if foi colocado para testar se o cargo digitado
vlido. Sendo vlido, podemos apresentar os resultados.
Linhas 17 a 23: temos os printf que apresentam os resultados
do programa: o salrio antigo, o novo e a diferena dos
salrios.
Linhas 24 e 25: temos o getche() e o fecha chaves, indicando o
fnal do programa principal.
A fgura 1.9 apresenta duas telas de execuo do programa
completo 1.4.
Ateno
Ateno: neste
programa a
varivel cargo
armazenar 1
(quando o cargo
for gerente),
2 (quando for
engenheiro) e
3 (quando for
tcnico). Dessa
forma, esta
varivel ser do
tipo inteiro.
31
Programao 2
Cargo Vlido
Cargo Invlido
Figura 1.9: Telas de execuo do programa completo 1.4
Notem que, quando o cargo invlido, apenas a mensagem de
erro apresentada. Quando o cargo vlido, os resultados so
apresentados.
Agora que j sabemos usar as estruturas de seleo do C, vamos
abrir um parnteses para falar sobre a identao dos comandos dos
programas.
1.4. Identao de um Programa
A identao a forma como alinhamos os comandos do nosso
programa. O alinhamento faz com que o cdigo fque mais fcil de
ser lido. Vamos entender a identao do programa completo 1.4,
analisando a fgura 1.10.
32
Programao 2
main()
{
int cargo;
foat sal, nsal;
printf(Empresa Legal\n\n\n);
printf(Cargo(1-Gerente\2-Eng.\3-Tecnico): );
scanf(%d,&cargo);
printf(\nSalario atual: );
scanf(%f,&sal);
switch (cargo)
{ case 1: nsal=sal*1.1; break;
case 2: nsal=sal*1.2; break;
case 3: nsal=sal*1.3; break;
defaul: printf(\n\nCargo Invalido!\n);
break;
}
if ((cargo>=1) && (cargo<=3))
{ prinft(\n\n____________________________\n);
prinft(\n\nResultados\n\n);
prinft(\nSalario Antigo...: R$ %.2f\n, sal);
prinft(\nSalario Novo....: R$ %.2f\n, nsal);
prinft(\nDiferenca: R$ %.2f\n, nsal - sal);
}
getche();
}
Figura 1.10: Cdigo Identado
Cada chaves que abre deve fcar no mesmo alinhamento da chaves
que fecha. Assim, a chaves que abre o programa, fca alinhada com a
chaves que fecha o programa. Com as chaves alinhadas fca mais fcil
33
Programao 2
de verifcar se alguma chave est descasada. As chaves
3
tambm
devem fcar alinhadas com a estrutura que elas esto delimitando.
Vejam a chaves do main, do switch e do if.
Notem tambm, que a sequncia de comandos dentro do switch e
do if fca um pouco mais para dentro. Dessa forma, ns destacamos
os comandos que esto dentro da estrutura. Quando colocamos todos
os comandos do nosso programa no mesmo alinhamento, fca mais
difcil de visualizar quais comandos fazem parte de uma estrutura de
controle.
A fgura 1.11 apresenta o mesmo cdigo, mas sem a identao,
vejam que o switch e o if fcam menos visveis.
Dica de
Programao
3
Sempre que abrir
uma chaves no
seu programa, j
coloque a chaves
que fecha. Assim
no corre o risco
de esquecer a
chaves que fecha
uma sequncia de
comandos.
34
Programao 2
main()
{
int cargo;
foat sal, nsal;
printf(Empresa Legal\n\n\n);
printf(Cargo(1-Gerente\2-Engenheiro\3-Tecnico): );
scanf(%d,&cargo);
printf(\nSalario atual: );
scanf(%f,&sal);
switch (cargo)
{case 1: nsal=sal*1.1; break;
case 2: nsal=sal*1.2; break;
case 3: nsal=sal*1.3; break;
defaul: printf(\n\nCargo Invalido!\n); break;}
if ((cargo>=1) && (cargo<=3))
{prinft(\n\n____________________________\n);
prinft(\n\nResultados\n\n);
prinft(\nSalario Antigo..........: R$ %.2f\n, sal);
prinft(\nSalario Novo...........: R$ %.2f\n, nsal);
prinft(\nDiferenca de Salarios: R$ %.2f\n, nsal -
sal);
}
getche ();
}
Figura 1.11: Cdigo sem Identao
Bem melhor ler o cdigo identado, no mesmo? No deixem de
identar todos os programas. Vocs vero que fca mais fcil e rpido
de entender.
35
Programao 2
Atividades e Orientaes de Estudo
Os nossos programas vo comear a crescer de tamanho e, a cada
captulo que avanamos, teremos novas possibilidades de fazer coisas
bem interessantes. Nesta seo, temos uma lista de programas que
devemos resolver, para efetivar o nosso conhecimento nas estruturas
de seleo. Vocs iro notar que algumas questes s podem ser
feitas usando o if, mas outras podem ser resolvidas com o uso do
switch. Liguem o computador e comecem a programar!
1. Faa um programa que l 2 valores A e B (inteiros) e informa se
A divisvel por B ou no.
2. Faa um programa que leia um nmero inteiro e mostre uma
mensagem indicando se este nmero par ou mpar, e se
positivo ou negativo.
3. Tendo como dados de entrada a altura e o sexo(1-feminino/2-
masculino) de uma pessoa, construa um programa que calcula
e escreve seu peso ideal, utilizando as seguintes frmulas:
para homens: (72.7*altura)-58
para mulheres: (62.1*altura)-44.7
4. Um hotel cobra R$ 50,00 reais a diria e mais uma taxa de
servios. A taxa de servios de:
15,30 por dia, se nmero de dirias <15
10,00 por dia, se nmero de dirias =15
8,50 por dia, se nmero de dirias >15
Faa um programa que l a quantidade de dias que o hspede
fcou no hotel e imprime a taxa e total a pagar.
5. Elaborar um programa que ir ler trs nmeros inteiros diferentes
e informa qual o maior valor.
6. Elaborar um programa que ir ler quatro inteiros diferentes e
informa qual o menor valor.
7. Escrever um programa que l a matrcula do aluno e suas 3
notas. Calcular a mdia e verifcar qual o seu conceito, conforme
36
Programao 2
a tabela:
Mdia Conceito
>= 9,0 A
>= 7,5 e < 9,0 B
>= 6,0 e < 7,5 C
>= 4,0 e < 6,0 D
< 4,0 E
O programa deve escrever a matrcula do aluno, suas notas, a
mdia, o conceito correspondente e a mensagem: APROVADO
se o conceito for A, B ou C e REPROVADO se o conceito for D
ou E.
8. Escrever um programa que l a hora de incio e hora de trmino
de um jogo, ambas subdivididas em dois valores distintos: horas
e minutos. Calcular e escrever a durao do jogo, tambm em
horas e minutos, considerando que o tempo mximo de durao
de um jogo de 24 horas e que o jogo pode iniciar em um dia e
terminar no dia seguinte.
9. Fazer um programa que leia uma data (dia e ms) e informe se
primavera, vero, outono ou inverno. Sabe-se que as estaes,
no hemisfrio sul, comeam nas seguintes datas:
Primavera: 22/Set
Vero: 21/Dez
Outono: 20/Mar
Inverno: 20/Jun
10. Faa um programa para ler o peso de uma encomenda, tipo
de entrega(1-sedex, 2-sedex 10) e regio onde ser entregue a
encomenda(1- Norte, 2-Nordeste, 3-Centro-Oeste, 4-Sudeste,
5-Sul). Calcular o valor de postagem baseado nas tabelas
abaixo:
At 1 Kg R$ 5,00
De 1 Kg a 5 Kg R$ 10,00
37
Programao 2
Acima de 5 Kg R$ 15,00 + R$ 3,00 por Kg excedente
Para entrega por Sedex Adicionar R$ 9,00
Para entrega por Sedex 10 Adicionar R$ 11,00
Para entregar na regio Norte Adicionar R$ 3,00
Para entregar na regio Nordeste Adicionar R$ 2,00
Para entregar na regio Centro-Oeste Adicionar R$ 6,00
Para entregar na regio Sudeste Adicionar R$ 5,00
Para entregar na regio Sul Adicionar R$ 7,00
Conhea Mais
Para ampliar nossos conhecimentos sobre os assuntos tratados
neste captulo, leiam o captulo que aborda as estruturas de seleo,
do livro:
SCHILDT, Herbert. C Completo e Total. So Paulo: Makron,
1996.
Vamos Revisar?
Vamos revisar um pouco o assunto visto neste captulo? Faamos
uma leitura do resumo a seguir:
Estruturas de seleo servem para analisar condies e valores
de variveis verifcando se uma sequncia de comandos deve ser
executada ou desviada.
As estruturas de seleo do C so: if e switch.
O if pode ser: simples(quando no tem o else), composto
(quando tem o else) e aninhado (quando temos um outro if dentro
da sequncia de comandos do else).
38
Programao 2
O if avalia uma condio, se a mesma for verdade, a sequncia
de comandos do if executada.
O switch uma estrutura de seleo que avalia o valor de uma
varivel inteira ou caractere.
No fnal da sequncia de comando do case, devemos colocar um
break, forando a sada da estrutura de seleo switch.
A identao dos comando de um programa torna o cdigo mais
legvel e fcil de entender.
39
Programao 2
Captulo 2 Estruturas de
Repetio
Vamos conversar sobre o assunto?
Neste captulo, vamos abordar as estruturas de repetio. Como
mencionado da seo 1.1 do captulo anterior, com estas estruturas
poderemos repetir uma sequncia de comandos quantas vezes
forem necessrio. A linguagem de programao C fornece trs
tipos de estrutura de repetio: for, while e do/while. Entendendo as
caractersticas de cada estrutura de repetio, poderemos escolher a
mais adequada para resolver um dado problema. Vamos em frente!
Figura 2.1: Quadrinho sobre repetio
2.1. For (para... faa)
A estrutura de repetio for equivalente ao para/faa do Portugol.
Esta estrutura costuma ser utilizada quando sabemos quantas vezes
a sequncia de comandos deve ser repetida. A contagem dos ciclos
feita por uma varivel chamada de contador. A estrutura for tambm
chamada de estrutura de repetio com contador. Sua sintaxe a
seguinte:
40
Programao 2
Sintaxe
for (var-controle = inicio; condio;
atualizao_var-controle)
comando1;
for (var-controle = inicio; condio;
atualizao_var-controle)
{ comando1;
comando2;
comandon;
}
Onde:
var-controle: a varivel que controla a quantidade de
repeties. Esta varivel inicializada e atualizada a cada
repetio.
incio: o valor inicial da varivel que controla o for. Ao iniciar a
repetio, a varivel de controle inicializada com este valor.
condio: expresso relacional ou lgica que testada ao fnal
de cada repetio. Se a condio for verdade a sequncia de
comandos executada mais uma vez. Quando a condio
falsa, a repetio para. Dessa forma, temos que ter certeza que
algum momento a condio se tornar falsa. Caso contrrio,
entraremos em um loop infnito. Ou seja, o programa fca
repetindo a sequncia de comandos infnitamente.
atualizao_var-controle: a cada vez que a repetio
executada, a varivel de controle deve ser atualizada. Nesta
parte do for, colocamos a expresso que atualizar a varivel
de controle. com esta atualizao que faremos com que a
condio do for se torne falsa e a repetio tenha fm.
Notem que cada parte do for separada por ponto e vrgula. Mas
no colocamos o ponto e vrgula depois do comando que atualiza a
varivel de controle, nem aps o fecha parnteses.
A estrutura de repetio for funciona da seguinte forma:
41
Programao 2
Passo 1: a varivel de controle inicializada.
Passo 2: a condio analisada. Se for verdade, a sequncia
de comandos da repetio executada.
Passo 3: ao terminar de executar a sequncia de comandos
da repetio, a varivel de controle atualizada. E retorna ao
passo 2, verifcando se a condio continua sendo verdade
(para repetir mais uma vez a sequncia de comandos) ou se
falsa ( parando a repetio).
A fgura 2.2 apresenta o funcionamento da estrutura de repetio
for.
Figura 2.2 Funcionamento da estrutura de repetio for.
Assim como o if, se houver mais de um comando vinculado ao for,
devemos colocar a sequncia de comandos entre chaves. Se houver
apenas um comando, no h necessidade de colocar as chaves.
Vamos ver dois exemplos do uso do for. No exemplo 2.1 temos um
for que ser repetido 10 vezes. A varivel de controle i inicializada
com 1. Cada vez que fnalizada uma execuo do comando vinculado
ao for, incrementado 1 valor da varivel 1
4
. Esta repetio vai parar
quando i for igual a 11. Cada vez que o for executado, escrito o
valor atual de i na tela. Assim, ser escrito de 1 a 10 na tela.
Exemplo 2.1: for com varivel de controle sendo incrementada
1
2
for (i=1; i<=10; i++)
printf(\nO valor de i= %d, i);
No exemplo 2.2, temos um for que tambm ser repetido 10 vezes.
No entanto, a varivel de controle inicia com 10 e decrementada a
Ateno
A varivel de
controle do for
deve ser do tipo
inteiro.

O for deve ser
escrito todo em
minsculo.
Ateno
4
Esto lembrados
do operador ++?
Este operador
acrescenta uma
unidade a uma
varivel. Ele foi
abordado na
seo 5.3 do
Volume I.
42
Programao 2
cada fnal da repetio. Notem que esta repetio vai parar quando o i
0. Este for tambm faz a impresso de 1 a 10 na tela. S que, dessa
vez, os nmeros sero impressos na ordem decrescente.
Exemplo 2.2: for com varivel de controle sendo decrementada
1
2
for (i=10; i>=1; i--)
printf(\nO valor de i= %d, i);
Vamos agora analisar um programa completo que usa o comando
for. Uma loja quer calcular um bnus que dar a cinco clientes. O
bnus depende de quanto cada cliente comprou. Os clientes que
compraram menos de R$ 500 recebero de bnus 10% do valor das
compras. Os clientes que compraram a partir de R$ 500 recebero de
bnus, 15% do valor das compras. O programa deve ler o cdigo do
cliente e o valor das compras e escrever o valor do bnus, para cada
um dos cinco clientes.
43
Programao 2
Programa Completo 2.1
1
2
3
4
5
6
7
8
9
10
11
12

13
14

15

16
17
18
main()
{ foat valor;
int cod, i;
for (i=1; i<=5; i++)
{ system(cls);
printf(Loja Compre Tudo\n\n);
printf(Codigo do Cliente %d: ,i);
scanf(%d,&cod);
printf(\nValor das compras: );
scanf(%f,&valor);
if (valor<500)
printf(\n\nValor do bonus R$ %.2f\n,
valor*0.1);
else
printf(\n\nValor do bonus R$ %.2f\n,
valor*0.15);
printf(\n\ntecle enter para
continuar...);
getche();
}
}
Comentrios sobre o programa completo 2.1:
Linhas 2 e 3: temos as declaraes das variveis do programa.
O valor das compras, o cdigo do cliente e o i, que ser a
varivel de controle do for.
Linha 4: primeira linha do for, indicando que a varivel i ser
inicializada com 1, a condio para permanecer repetindo i
ser menor ou igual a 5 e o incremento do i, que ter seu valor
aumentado em uma unidade a cada repetio. Da linha 5 at 17
temos a sequncia de comandos que ser repetida 5 vezes.
44
Programao 2
Linha 5: abre chaves para delimitar a sequncia de comandos
vinculada ao for. Nesta linha tambm temos um comando novo:
system(cls); Este comando
5
limpa a tela, eliminado tudo que
tem escrito. Com o uso deste comando, cada vez que formos
cadastrar os dados de um novo cliente, a tela limpa, fcando
assim mais organizado. Depois vocs podem comentar esse
comando do programa e vejam o que acontece sem ele.
Linha 6: printf para colocar o nome da empresa.
Linha 7: printf para solicitar a digitao do cdigo do funcionrio.
Vejam que nesta mensagem, colocado o valor do i, isto
interessante para que o usurio saiba qual cliente est sendo
digitado no momento, se o primeiro, o quarto, etc.
Linha 8: scanf para ler o cdigo do cliente.
Linha 9: printf que solicita o valor das compras do cliente.
Linha 10: scanf para ler o valor das compras do cliente.
Linhas 11: Como j sabemos o valor das compras do cliente,
devemos calcular o valor do bnus. O bnus pode ser de 15%
ou 10%. Para decidir qual bnus o cliente levar, usaremos uma
estrutura de deciso. Assim, nesta linha temos um if composto,
que verifca se o valor das compras menor que R$500.
Linhas 12: printf que executado se a condio do if for
verdade. Notem que no prprio printf feita a conta de quanto
o cliente receber de bnus. Aqui dado um bnus de 10% ao
cliente.
Linha 13: temos o else, j que se trata de um if composto.
Linha 14: printf que executado se a condio do if for falsa.
Aqui dado um bnus de 15% ao cliente.
Linha 15: temos os printf que d uma mensagem para que o
usurio tecle enter e d prosseguimento a um novo cadastro.
Linha 16: temos o getche() que faz com que possamos ver o
valor do bnus do cliente.
Linha 17: fecha chaves que delimita a sequncia de comandos
do for.
Linha 18: fecha chaves do programa principal
6
.
Ateno
5
cls signifca
clear screen. Ou
seja, limpe a tela.
Ateno
6
Fiquem atentos
a identao do
programa.
45
Programao 2
A fgura 2.3 apresenta uma tela de execuo do programa completo
2.1.
Figura 2.3: Tela de execuo do programa completo 2.1
Na prxima seo iremos estudar o segundo tipo de estrutura de
repetio do C, o while.
Figura 2.4: Quadrinho - O castigo de Pablo
46
Programao 2
2.2. While (enquanto... faa teste no incio)
A estrutura de repetio while equivalente ao enquanto/faa do
Portugol. Nesta estrutura uma condio avaliada, e enquanto a
condio for verdade, a sequncia de comandos ser executada. Se
a condio for falsa, a repetio ser interrompida. O while avalia a
condio antes da primeira iterao
7
, isto signifca que, eventualmente,
pode no ocorrer sequer a primeira iterao. Por isso, esta estrutura
chamada tambm de: repetio que faz teste no incio. A sintaxe do
while a seguinte:
Sintaxe
while (condio)
comando;
while (condio)
{ comando1;
comando2;
comandon;
}
Ao lado do while colocamos a condio (entre parnteses) que
ser avaliada e que faz com que a repetio seja executada ou no.
Ao fnal de cada iterao, a condio avaliada para verifcar se
continua sendo verdade, para que a repetio seja executada mais
uma vez ou pare. No while tambm poder acontecer o problema de
loop infnito. Por isso, temos que ter certeza que em algum momento
a condio se tornar falsa, para que a repetio tenha fm. Seguindo
a mesma regra do if e do for, se tivermos mais de um comando
vinculado ao while, devemos colocar a sequncia de comandos entre
chaves. Podemos ler o comando while da seguinte forma: enquanto
a condio for verdade, faa esta sequncia de comandos. A fgura
2.5 apresenta o esquema de funcionamento da estrutura while.
Saiba Mais
7
Iterao um
termo muito
utilizado na
computao
e signifca
repetio.
47
Programao 2
Figura 2.5: Funcionamento da estrutura de repetio while
Como podemos ver na fgura 2.5, antes de entrar na sequncia
de comandos do while a condio testada, se for verdade, executa
os comandos vinculados ao while, quando termina, retorna para
testar a condio novamente. Enquanto for verdade, fca repetindo
a sequncia de comandos. Quando for falsa, desvia para o primeiro
comando depois do while.
Vamos analisar o programa completo 2.2, que resolve a mesma
questo do programa completo 2.1, s que usando a estrutura de
repetio while. Para garantir que a repetio ser executada 5
vezes, ser declarada uma varivel responsvel por contar cada vez
que terminada uma iterao do while. O valor desta varivel ser
testado na condio do while, e a repetio ser executada enquanto
o contador for menor ou igual a 5.
48
Programao 2
Programa Completo 2.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16

17
18

19
20
21
main()
{
foat valor;
int cod, contador;
contador = 1;
while (contador<=5)
{ system(cls);
printf(Loja Compre Tudo\n\n);
printf(Codigo do Cliente %d: ,contador);
scanf(%d,&cod);
printf(\nValor das compras: );
scanf(%f,&valor);
if (valor<500)
printf(\n\nValor do bonus R$ %.2f\n,
valor*0.1);
else
printf(\n\nValor do bonus R$ %.2f\n,
valor*0.15);
contador++;
printf(\n\ntecle enter para
continuar...);
getche();
}
}
Comentrios sobre o programa completo 2.2:
Linhas 3 e 4: temos as declaraes das variveis do programa.
O valor das compras, o cdigo do cliente e o contador que ir
controlar a repetio.
Linha 5: Nesta linha temos a inicializao do contador. Assim,
49
Programao 2
atribudo 1 ao contador. Isto indica que iremos comear a
primeira iterao do while.
Linha 6: temos o while, juntamente com a condio de
permanncia da repetio. Assim, esta repetio feita
enquanto o contador for menor ou igual a 5. Notem que,
obrigatoriamente, a condio vir entre parnteses, certo?
Linhas 7 a 20: sequncia de comandos vinculada ao while,
que ser executada cinco vezes. Para cada cliente pedido o
seu cdigo e o valor das suas compras. O bnus calculado de
acordo com o valor das compras e apresentado na tela.
Linha 17: observem que nesta linha somado mais 1 ao
valor do contador. Dessa forma, cada vez que passamos pela
repetio, o contador vai aumentado seu valor, at fazer com
que a condio se torne falsa e a repetio pare. Quando
usamos o for, a inicializao, a condio e o incremento da
varivel do controle fca tudo ao lado do for. No while, temos
estas trs partes, s que separadas: na linha 5 tivemos a
inicializao do contador, na linha 6 temos a condio e na linha
17 o incremento do contador. Se esquecermos de incrementar o
contador, a condio no se tornar falsa, nunca, e entraremos
em um loop infnito.
Linha 21: fecha chaves do programa principal.
A execuo deste programa resulta em uma tela idntica a do
programa anterior, apresentada na fgura 2.3.
Vamos agora entender o funcionamento do terceiro e ltimo tipo
de repetio do C, que o do/while.
2.3. Do/while (repita... at - teste no final)
A estrutura de repetio do/while equivale ao repita...at do
Portugol. A principal diferena entre o do/while e o while o ponto
onde a condio testada. Como vimos na seo anterior, a condio
do while fca no incio do bloco e assim, a verifcao feita antes de
executar o bloco de comandos. Se a condio for falsa j no primeiro
teste, os comando vinculados ao while no so executados nenhuma
vez. No caso do do/while, a condio s vem aps a sequncia de
comandos. Com isso, o teste s feito aps a execuo dos comandos
50
Programao 2
do do/while. A sintaxe do do/while a seguinte:
Sintaxe
do
comando;
while (condio);
do
{ comando1;
comando2;
comandon;
} while (condio);
O comando do/while comea com o do, e logo em seguida
colocamos a sequncia de comandos que ser repetida. Aps a
sequncia de comandos, coloca-se o while com a condio que ser
testada para verifcar se continua a repetio ou no. Quando tivermos
mais de um comando, as chaves que delimitam os comandos do do/
while so obrigatrias. Prestem ateno o local correto das mesmas.
O abre chaves que indica o incio da sequncia deve vir depois do
do. O fecha chaves que indica o fnal da sequncia, deve vir antes do
while. Outro detalhe importante que, depois da condio (que deve
vir entre parnteses), devemos colocar um ponto e vrgula
8
.
O esquema da execuo do do/while apresentado na fgura 2.6.
Figura: 2.6: Funcionamento da estrutura de repetio do/while
O do serve, na verdade, para indicar que a sequncia de comandos
vai comear. A sequncia de comandos executada e, ao encontrar
Ateno
8
No colocamos
ponto e virgula
aps a condio
do if, nem aps
a condio do
while.
51
Programao 2
o while, a condio testada. Se a condio for verdade, retorna ao
primeiro comando da sequncia. Se a condio for falsa, executa o
primeiro comando depois do do/while. O comando do/while pode ser
lido da seguinte forma: faa a sequncia de comandos enquanto a
condio for verdade.
Agora, vamos fazer o programa completo 2.1, usando o do/while.
Do mesmo modo que foi necessrio no while, teremos que ter uma
varivel que serve de contador, para fcar verifcando se j executou a
repetio cinco vezes.
52
Programao 2
Programa Completo 2.3: uso do do/while
1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16

17
18

19
20
21
main()
{
foat valor;
int cod, contador;
contador = 1;
do
{ system(cls);
printf(Loja Compre Tudo\n\n);
printf(Codigo do Cliente %d: ,contador);
scanf(%d,&cod);
printf(\nValor das compras: );
scanf(%f,&valor);
if (valor<500)
printf(\n\nValor do bonus R$ %.2f\n,
valor*0.1);
else
printf(\n\nValor do bonus R$ %.2f\n,
valor*0.15);
contador++;
printf(\n\ntecle enter para
continuar...);
getche();
} while (contador <=5);
}
Comentrios sobre o programa completo 2.3:
Linhas 3 e 4: temos as declaraes das variveis do programa.
O valor das compras, o cdigo do cliente e o contador que ir
controlar a repetio.
Linha 5: Nesta linha temos a inicializao do contador.
53
Programao 2
Linha 6: temos o do, indicando que ser iniciada uma estrutura de
repetio do/while.
Linhas 7 a 19: sequncia de comandos vinculada ao do/while,
que ser executada cinco vezes. Para cada cliente pedido o
seu cdigo e o valor das suas compras. O bnus calculado de
acordo com o valor das compras e apresentado na tela. Notem
que na linha 17 temos o incremento do contador.
Linha 20: temos o fecha chaves e o while, juntamente com a
condio que avaliada para que prossiga uma nova repetio
da sequncia de comandos ou pare de executar o do/while.
Linha 21: temos o fecha chaves do programa principal.
Vimos aqui um mesmo problema sendo resolvido com os trs tipos
de repetio do C. No problema em questo, foi mencionado quanto
elementos (clientes) seriam cadastrados. Assim, estes programas
SEMPRE repetem a sequncia 5 vezes. Em vrias situaes, no
sabemos previamente quantos elementos sero cadastrados. Dessa
forma, no saberamos o valor a ser colocado na condio da estrutura
de repetio para indicar a sua parada. Mas tem uma soluo: quando
no soubermos quantos elementos sero cadastrados, usaremos o
do/while, da forma como ser apresentada no programa completo
abaixo. Este programa tem o mesmo enunciado do programa 2.1,
no entanto, ele poder cadastrar uma quantidade indeterminada de
clientes.
54
Programao 2
Programa Completo 2.4: uso do do/while
1
2
3
4
5
6
7
8
9
10
11
12
13

14
15

16

17
18
19
main()
{
foat valor;
int cod, continuar;
do
{ system(cls);
printf(Loja Compre Tudo\n\n);
printf(Codigo do Cliente: );
scanf(%d,&cod);
printf(\nValor das compras: );
scanf(%f,&valor);
if (valor<500)
printf(\n\nValor do bonus R$ %.2f\n,
valor*0.1);
else
printf(\n\nValor do bonus R$ %.2f\n,
valor*0.15);
printf(\n\n\nDeseja cadastrar outro
(1-sim/2-nao)? );
scanf(%d, &continuar);
} while (continuar==1);
}
Comentrios sobre o programa completo 2.4:
Notem que no teremos a varivel contador. Teremos agora
uma varivel inteira que foi chamada de continuar. A condio
de parada deste do/while avalia o valor armazenado na varivel
continuar.
Linhas 3 e 4: temos as declaraes das variveis do programa.
O valor das compras, o cdigo do cliente e a varivel inteira
continuar que ir controlar a repetio.
55
Programao 2
Linha 5: do que inicia a sequncia da repetio.
Linhas 6 a 17: sequncia de comandos vinculada ao do/while.
Nesta sequncia temos a solicitao dos dados do cliente, e
apresentao do bnus que o cliente tem direito.
Linha 16: Aps apresentar o valor do bnus, feita a seguinte
pergunta ao usurio: deseja cadastrar outro (1-sim/2-no)? .
Na linha 16 temos o printf que escreve esta pergunta na tela. O
usurio dever digitar 1 se quiser cadastrar outro, que signifca:
sim, eu quero cadastrar. Ou digitar 2 porque no tem mais
clientes para cadastrar.
Linha 17: scanf para ler a resposta do cliente, que deve ser 1
para continuar ou 2 para parar. O valor que o usurio digitar,
ser armazenado na varivel continuar.
Linha 18: temos o fecha chaves e o while, juntamente com
a condio que avaliada para que prossiga uma nova
repetio da sequncia de comandos ou pare de executar o
do/while. Notem que a condio : (continuar == 1). Ou seja,
enquanto o usurio estiver respondendo 1, informando que
quer continuar cadastrando, novos cadastros sero feitos. A
parada ocorre quando o usurio responde 2. Dessa forma, no
precisamos determinar a quantidade de vezes que a repetio
ser executada. A execuo depender apenas da resposta do
usurio. Assim, uma vez ns poderemos executar a repetio
2 vezes, na outra 10, na outra 3, etc. Diferente da outra forma
de resolver, que sempre executava uma quantidade de vezes
pr-determinada. A resoluo da questo desta forma, trs
mais fexibilidade ao programa, uma vez que o usurio repete
o cadastro quantas vezes ele desejar. Uma outra observao
que no houve a necessidade de colocarmos o getche(). A
questo que, como ns tivemos que fazer a leitura da varivel
continuar, o scanf que l esta varivel, faz com que a tela fque
parada esperando o usurio fornecer a resposta. Por isso, no
houve necessidade de colocar o getche().
Linha 19: temos o fecha chaves do programa principal.
A fgura 2.7 apresenta uma tela de execuo do programa completo
2.4.
56
Programao 2
Figura 2.7: Tela de execuo do programa completo 2.4
De acordo com a fgura 2.7, aps os usurio fornecer os dados
do cliente e receber o valor do bnus que o cliente tem direito,
feita a pergunta se ele deseja ou no cadastrar outro. Assim que for
respondido 2, ou seja, no quer mais cadastrar, a janela do programa
ir fechar. Enquanto estiver respondendo 1, novos cadastros so
feitos.
2.4. Uso do break na Estrutura de Repetio
Vimos anteriormente o comando break fnalizando a sequncia
de comandos de um case, da estrutura de seleo switch. Mas, este
comando tambm pode ser usado para forar o encerramento de
uma estrutura de repetio. Se um break for executado dentro de
uma estrutura de repetio, o fuxo do programa ser desviado para o
primeiro comando depois da repetio. Mesmo que a repetio ainda
no tenha sido executada a quantidade de vezes que foi determinada.
Normalmente, o comando break colocado na sequncia de comandos
de uma estrutura de seleo e s executado, caso alguma situao
acontea.
Vamos analisar o programa completo 2.5. Neste programa, o
cliente tem um limite de R$ 200 no carto de crdito da loja. Conforme
as suas compras vo sendo passadas no caixa, seu saldo vai sendo
avaliado. Se a compra de um novo item ultrapassar o limite permitido,
o programa deve parar a venda. Mas, se ele tiver limite, a compra
pode ser feita e fnalizada normalmente.
Ateno
Todas as
estruturas de
repetio so
escritas em
minsculo.

Atentem a
identao dos
comandos do
programa.

A sequncia de
comandos de
uma estrutura de
controle, seja de
repetio ou de
seleo, poder
ser composta
por qualquer
comando vlido
da linguagem.
Assim,
poderemos ter
uma estrutura
de repetio
dentro da outra.
Se houver
necessidade de
colocar um for
na sequncia
de comandos
de outro for,
devemos utilizar
uma varivel de
controle diferente
para cada for
57
Programao 2
Programa Completo 2.5: uso do break na repetio
1
2
3
4
5
6
7

8
9
10
11
12
13

14

15
16
17
18

19
20
21
main()
{ foat preco, total;
int continuar;
total = 0;
do
{ system(cls);
printf(Loja Compre Tudo - Adicionar
produto\n\n);
printf(Preco do produto: );
scanf(%f,&preco);
if ((total + preco) <= 200)
total = total + preco;
else
{ printf(\n\nA adicao deste produto
vai extrapolar o seu limite!);
printf(\n\nTecle enter para
fnalizar...);
getche();
break;
}
printf(\n\nDeseja adicionar outro
(1-sim/2-nao)? );
scanf(%d, &continuar);
} while (continuar==1);
printf(\n\nTotal a pagar: %.2f, total);
22
23
getche();
}
Comentrios sobre o programa completo 2.5:
Linhas 2 e 3: declarao das variveis do programa: preo
58
Programao 2
do produto, total das compras e continuar (para verifcar se a
repetio deve ser executada ou no).
Linha 4: inicializao da varivel total, que armazena o valor
total das compras
9
.
Linha 5: do que inicia a sequncia da repetio.
Linhas 6 a 20: sequncia de comandos vinculada ao do/while.
Nesta sequncia temos a solicitao do preo do produto que
o cliente est comprando. A cada novo produto comprado
preciso verifcar se o total da compra extrapola os 200 reais
do limite do carto. Esta verifcao feita no if da linha 10. Se
o limite extrapolar, ser executada a sequncia de comandos
do else da linha 12. Assim, impressa uma mensagem que
no pode mais adicionar produtos e, logo em seguida, executa
o break da linha 16, forando a sada do do/while. Como no
pode mais comprar produtos, temos que sair da repetio.
Por isso foi usado o break. Mas, se a compra no extrapolar o
limite, o cliente vai fazendo as compras dos produtos que ele
desejar. Dessa forma, a execuo do break ocorre mediante
a ocorrncia de uma situao, que neste caso foi o estouro do
limite.
Linha 21: Aps sair da repetio, devemos imprimir quanto foi
o valor das compras do cliente. Neste printf ser escrito o total.
Linhas 22 e 23: temos getche() e o fecha chaves do programa
principal.
A fgura 2.8 apresenta duas telas de execuo do programa
completo 2.5.
Adio de produto na Nota Fiscal
Ateno
9
Sempre que
uma varivel
for servir de
acumulador, seu
contedo deve
ser inicializado.
Normalmente com
zero.
59
Programao 2
Adio de produto que extrapola o limite
Figura 2.7: Telas de execuo do programa completo 2.5
Agora que j vimos alguns exemplos completos de programas
que utilizam as estruturas de repetio, que tal resolvermos umas
questes?
Atividades e Orientaes de Estudo
Estamos aqui, mais uma vez, para colocar nossos conhecimentos
em prtica. Nesta lista, temos 12 questes que utilizam comandos
de repetio. Nos enunciados, quando for indicado que a quantidade
de elementos desconhecida, resolva a questo utilizando um do/
while (que pergunta se o usurio quer continuar ou parar). Coloquem
comentrios nos seus programas, deixando-os bem documentados.
Alm disso, prestem muita ateno para manter o cdigo identado.
importante ser um programador organizado. Vamos comear?
1. Uma empresa deseja aumentar seus preos em 20%. Faa um
programa que leia o cdigo e o preo de custo de cada produto
e calcule o preo novo. Calcule tambm, a mdia dos preos
com e sem aumento. Mostre o cdigo e o preo novo de cada
produto e, no fnal, as mdias. A quantidade de dados que sero
cadastrados desconhecida.
2. Pablo tem 1,50 m e cresce 2 centmetros por ano, enquanto
Edson tem 1,10 m e cresce 3 centmetros por ano. Construa
um programa que calcule e imprima quantos anos sero
necessrios para que Edson seja maior que Pablo.
3. Escrever um programa que leia 5 pares de valores, o primeiro
valor a matrcula do aluno, e o segundo a sua altura em
60
Programao 2
centmetros. Encontre o aluno mais alto e o mais baixo. Mostre
a matrcula do aluno mais alto e do mais baixo, junto com suas
alturas.
4. Escrever um programa que leia um conjunto de 10 informaes
contendo, cada uma delas, a altura e o sexo(1- mas/2- fem),
calcule e mostre o seguinte:
a maior e a menor altura da turma
a mdia da altura das mulheres
a mdia da altura da turma.
5. Foi feita uma pesquisa entre os 50 habitantes de uma regio.
Foram coletados os dados de idade, sexo (1-mas/2-fem) e
salrio. Faa um programa que informe:
a mdia de salrio do grupo;
maior e menor idade do grupo;
quantidade de mulheres com salrio at R$ 200.
6. Com o lanamento de notebooks no mercado nacional,
um fabricante deseja obter determinadas informaes dos
seus possveis consumidores. Para cada empresa ou rgo
pesquisado foi digitado os seguintes dados:
Preferncia desejada (fabricante): 1-Toshiba/2-HP/3-Sony
Possuem computadores de grande porte: 1-Sim/2-No
Necessitam de notebooks: 1. Sim/2. No
Deseja-se saber:
A quantidade de empresas pesquisadas;
Quantas empresas possuem computadores de grande porte;
Percentual de empresa que necessitam de notebooks
Percentual de empresas que tem preferncia pela Toshiba.
A quantidade de dados que sero cadastrados
desconhecida.
7. Foi feita uma pesquisa estatstica nas 50 principais cidades de
quatro Estados para coletar dados sobre acidentes de trnsito.
Foram obtidos os seguintes dados:
61
Programao 2
Cdigo da cidade
Estado (1-PE, 2-PB, 3-RN, 4-CE)
Nmero de veculos de passeio (em 2008)
Nmero de acidentes de trnsito com vtimas (em 2008)
Deseja-se saber:
qual o maior e o menor ndice de acidentes de trnsito e a que
cidades pertencem;
qual a mdia de veculos nas cidades;
qual a mdia de acidentes com vtimas entre as cidades do
Estado de Pernambuco.
8. A Empresa Legal decidiu fazer um levantamento dos candidatos
que se inscreveram para preenchimento de vaga no seu quadro
de funcionrios, utilizando processamento eletrnico e voc foi
contratado, ento faa um programa que:
Leia um conjunto de informaes para cada candidato,
contendo: nmero de inscrio do candidato, idade, sexo(1-
fem/2-mas), experincia anterior(1-sim/2-nao)
Calcule:
Quantidade de candidatos
Quantidade de candidatas
Mdia de idade dos homens com experincia
Percentagem dos homens com mais de 45 anos, entre os
homens
Quantidade de mulheres com idade inferior a 35 anos e com
experincia
Menor idade entre as mulheres que j tem experincia no
servio
A quantidade de dados que sero cadastrados
desconhecida.
9. Faa um programa para realizar a totalizao dos votos da
eleio para a prefeitura concorrida entre 3 candidatos. Para
cada seo so informados o nmero de votos do candidato
62
Programao 2
A, o nmero de votos do candidato B, o nmero de votos do
candidato C, o nmero de votos brancos e o nmero de votos
nulos. A quantidade de sees que sero cadastradas
desconhecida. Determine e imprima:
O nmero de votantes;
O total de votos de cada candidato;
O total de votos brancos e total de votos nulos;
O total de votos vlidos;
O candidato com maior nmero de votos;
Se a eleio foi vlida e para isso o total de votos brancos
mais votos nulos deve ser menor que o total de votos vlidos;
Se haver segundo turno, para no haver segundo turno basta
que o total de votos do candidato vencedor seja maior que 50%
dos votos vlidos
Percentual de votos nulos.
10. Ler 20 notas e imprimir as trs maiores.
Conhea Mais
Vocs podero encontrar mais detalhes sobre estruturas de
repetio no livro:
ASCENIO, Ana Fernanda Gomes e CAMPOS, Edilene
Aparecida Veneruchi. Fundamentos de Programao de
Computadores. So Paulo: Prentice Hall, 2002.
O interessante que, os autores primeiro do as explicaes em
Portugol, e depois fazem a traduo para a sintaxe da linguagem de
programao C e Pascal.
63
Programao 2
Vamos Revisar?
Vamos revisar as estruturas de repetio? Observem o resumo a
seguir:
As estruturas de repetio possibilitam que uma sequncia de
comandos possa ser executada vrias vezes.
As estruturas de repetio da linguagem de programao C so:
for, while e do/while.
A estrutura de repetio for mais utilizada quando sabemos
quantas vezes uma repetio ser executada.
A estrutura de repetio while avalia o resultado de uma condio
para verifcar se deve ou no executar uma sequncia de comandos.
Enquanto a condio for verdade, a repetio executada. A
condio do while fca no incio da sequncia de comandos.
A estrutura de repetio do/while tambm avalia uma condio
para permanecer repetindo a execuo de uma sequncia de
comandos. No entanto, a condio s avaliada aps a execuo
da sequncia de comandos.
O comando break tambm pode ser utilizado para forar a parada
de uma repetio.
Quando no tomamos cuidado de tornar a condio de uma
repetio falsa, ocorre o loop infnito.
64
Programao 2
Captulo 3 Modularizao
Vamos conversar sobre o assunto?
Neste captulo, vamos aprender a programar de forma
modularizada. At agora, toda a sequncia de comandos dos nossos
programas foi escrita dentro do programa principal (main), em um
bloco nico. Vocs vo ver que podemos dividir os nossos programas
em mdulos. A modularizao uma das alternativas mais utilizadas
para desenvolver grandes programas, pois deixa o cdigo mais
legvel e aumenta a produtividade dos programadores. No entanto, a
modularizao apresenta muitas outras vantagens. Vamos descobrir
isso agora?
3.1. O que so mdulos e por que utiliz-los?
A melhor maneira de desenvolver um programa grande constru-
lo a partir de pequenas partes, que so chamadas de mdulos. Esta
tcnica chamada dividir para conquistar, uma estratgia de guerra
criada pelos romanos e muito utilizada por Napoleo Bonaparte
10
,
quando tentou conquistar o mundo. Como o territrio a ser
conquistado era muito extenso, ele o dividiu em pequenos territrios e
foi conquistando cada parte por vez.
Uma vantagem desta tcnica que focamos a nossa ateno em
um problema pequeno de cada vez. No fnal, teremos a soluo do
problema como um todo. Para compreender melhor este conceito,
vamos fazer uma analogia: suponham que ns precisamos construir
uma casa. Mas esta no uma atividade simples, devido a sua
complexidade. No entanto, podemos dividir esse problema em partes
menores: alvenaria, sistema eltrico, sistema hidrulico, acabamento,
pintura, etc. e assim, fca mais simples de entendermos cada parte
separadamente (Figura 3.1). Caso ainda existam partes complexas,
podemos continuar dividindo em partes ainda menores. Por exemplo,
o sistema hidrulico pode ser dividido em caixa de gua, bombas,
canos, registros, etc. Este processo de decomposio contnua
tambm conhecido como refnamentos sucessivos, porque se
parte de um problema complexo e abrangente, que sucessivamente
dividido at resultar em problemas mais simples e especfcos.
Saiba Mais
10
Napoleo
Bonaparte foi
imperador da
Frana e esteve
no poder durante
15 anos. Nesse
tempo conquistou
grande parte
do continente
europeu. Os
bigrafos afrmam
que seu sucesso
deu-se devido ao
seu talento como
estrategista, alm
do seu esprito de
liderana.
65
Programao 2
Figura 3.1: Divises da construo de uma casa
Os mdulos (tambm chamados de funes, rotinas ou
subprogramas) so a essncia da programao estruturada. Os
mdulos so segmentos de programa que executam uma tarefa
especfca. Os mdulos servem para dividir um grande programa
em diversas partes menores. De acordo com as boas prticas
de programao: sempre que possvel, evite cdigos extensos,
separando os mesmos em mdulos, visando a um rpido entendimento
e uma manuteno facilitada.
A modularizao permite que cada mdulo do programa seja escrito,
testado e revisado individualmente sem alterar o funcionamento do
programa como um todo. Os programadores podem testar suas
funes separadamente, permitindo que muitos erros do sistema
completo sejam retirados antes que ele esteja totalmente pronto. A
modularizao tambm permite que um programa seja escrito por
vrios programadores ao mesmo tempo, cada um desenvolvendo
um mdulo em separado. como a construo de uma casa, que
podemos contratar vrios funcionrios. Esta diviso do trabalho
acelera o desenvolvimento dos programas e reduz custos. Uma outra
utilizao da modularizao quando um trecho de cdigo utilizado
vrias vezes em um programa. Devemos colocar este trecho em um
mdulo e, sempre que preciso, fazemos a chamada do mdulo. Com
isso, reduzimos a quantidade de linhas de cdigo do programa.
A maior parte das linguagens de programao fornece um conjunto
de funes (mdulos) que so utilizadas pelos programadores,
evitando que o mesmo tenha que implement-las. A utilizao de
Sistema Hidrulico
Sistema Eltrico
Alvenaria
Pintura
66
Programao 2
funes que j existem, diminui o tempo de desenvolvimento do
programa. Alm disso, o fato de utilizar uma funo que j foi testada
em diversos programas, reduz o risco de erros. como se costuma
dizer: no vamos reinventar a roda. Se a funo est pronta,
disponvel e correta, o programador no deve perder tempo em
implementar a mesma coisa. s fazer uso da mesma. Um exemplo
de uso de mdulos que j existem, quando utilizamos alguma funo
da biblioteca math, como sqrt (raiz quadrada) e pow (potncia).
As prximas sees descrevem como devemos fazer para
desenvolver programas modularizados.
3.2. Estrutura de um mdulo
Ao receber um problema, o programador dever verifcar se
este problema pode ser resolvido com uma soluo particionada ou
modularizada. Vamos usar o seguinte exemplo: fazer um programa
que calcule a mdia do aluno e verifque se o mesmo foi aprovado ou
reprovado. A princpio, podemos pensar que o clculo da mdia do
aluno e a descoberta da sua situao (aprovado ou reprovado) sero
implementados em dois mdulos. Dessa forma, nosso programa seria
formado por 2 mdulos, alm do programa principal. Mas poderemos
notar, durante a implementao, que algumas partes de cdigo se
repetem em diversos pontos do programa e por isso, elas tambm so
candidatas a se tornarem mdulos. A sintaxe para construir mdulos,
em C, a seguinte:
Sintaxe
tipo_de_retorno nome_da_funo([declarao de
parmetros])
{ [declarao de variveis locais]
bloco de instrues da funo
[return ]
}
Toda a declarao de mdulos/funes darieve seguir ao formato
acima. As partes entre colchetes so opcionais. Vamos ver o que
signifca cada componente da estrutura de um mdulo:
Tipo_de_retorno: especifca qual o tipo de dado retornado
67
Programao 2
pela funo, podendo ser qualquer tipo de dado da linguagem
(int, foat, char, etc.). Se a funo no retorna nenhum valor,
devemos defnir o retorno como void, que signifca ausente de
retorno. Vale ressaltar que existe apenas um valor de retorno
para funes em C. Um exemplo de mdulo que retorna um
valor o sqrt, ou seja, ao ser executado, ele nos retorna a raiz
quadrada de um nmero.
Nome da funo: indica o nome pelo qual o bloco de cdigo
correspondente funo ser chamado. atravs do nome
da funo que poderemos cham-la quando desejarmos a sua
execuo. As regras para nomear um funo so as mesmas
que utilizamos para nomear as nossas variveis.
Declarao de parmetros: na declarao de parmetros
que informamos ao compilador quais sero as entradas da
funo. Para cada um dos parmetros deve ser declarado o
seu tipo e nome. Se a funo no receber nenhum parmetro,
deve-se deixar os parnteses sem nada entre eles. Os
parmetros servem para passarmos alguma informao
para a funo. A funo sqrt recebe um nmero real como
parmetro. Para calcular uma raiz quadrada, a funo precisa
que o programador informe de qual valor ser calculada a raiz
quadrada. O valor que fornecido a funo, o parmetro. J
a funo pow, precisa receber dois parmetros para que possa
elevar um nmero a um expoente qualquer.
Declarao das variveis locais: as variveis que so
especfcas de um mdulo so chamadas de variveis locais.
Todas as variveis locais devem ser declaradas dentro da
funo, antes de qualquer comando. Uma varivel local
somente pode ter seu valor acessado dentro da funo em que
foi declarada. Um mdulo pode no ter nenhuma varivel local.
Corpo da funo: sequncia de comandos que compem a
funo. similar ao corpo do programa principal. O corpo de
uma funo delimitado por chaves.
return: o comando return fnaliza a execuo da funo que
est sendo executada. Se a funo retornar algum valor (o
tipo de retorno no void) este comando obrigatrio. Se a
funo tiver retorno do tipo void, este comando no precisa ser
colocado.
68
Programao 2
A fgura 3.2 apresenta uma funo que calcula a mdia das duas
notas de um aluno.
foat calc_media(foat n1, foat n2)
{ foat m;
m = (n1 + n2)/2;
return m;
}
Figura 3.2: Funo para calcular a mdia do aluno
Vamos identifcar cada parte da estrutura desta funo. Esta funo
se chama calc_media e precisa receber dois parmetros para calcular
a mdia do aluno. Os parmetros so as duas notas do aluno: n1 e
n2. Como cada nota um nmero real, na frente de cada parmetro
colocado o seu tipo (foat) e separa por vrgula. Mesmo que os
parmetros sejam do mesmo tipo, precisamos colocar o tipo de cada
parmetro, na frente do seu nome.
O objetivo desta funo calcular uma mdia. Dessa forma, ao
terminar a sua execuo, a funo ir retornar a mdia do aluno.
Por isso, o tipo de retorno da funo foat. Como esta funo tem
um retorno, no fnal da sequncia de comandos, devemos colocar
o comando return, e ao lado dele, o nome da varivel que tem
armazenado o valor que ser retornado. Neste caso, a varivel que
tem este valor m. Esta uma varivel local, ou seja, uma varivel
que foi declarada dentro deste mdulo. Por conta disto, s pode ser
usada no mdulo calc_media.
Vamos discutir um pouco mais sobre alguns dos conceitos
apresentados, para depois iniciarmos a implementao de mais
funes.
Tipo de retorno Lista de parmetros
Nome da funo
Retorno da funo
Varivel Local
69
Programao 2
3.3. Em que ponto do programa os mdulos
devem ser implementados?
A execuo de um programa C sempre iniciada pelo main(), que
o mdulo principal do programa, por isso ele tem esse nome. Um
programa pode ter vrias funes, bem como poder utilizar funes
defnidas em outros programas. Alm disso, uma funo poder
fazer uso de outra funo. Dessa forma, as funes defnidas no
programa devem ser escritas antes do programa principal. E ainda,
se a funcao1, faz uso da funcao2, a funo2 deve ser escrita antes
da funcao1. Isto feito por uma razo. Ao compilar o programa, o
compilador precisa conhecer, com antecedncia, quais so os tipos de
retorno e quais so os parmetros das funes para que o cdigo seja
gerado corretamente. por isto que as funes so colocadas antes
do programa principal. Quando o compilador chegar no programa
principal (main), ele j ter compilado as funes e j saber seus
formatos.
Quando so utilizadas funes que esto em outros programas, o
programador dever informar, atravs da diretiva #include, a biblioteca
ou o arquivo onde a funo foi implementada. O caso mais comum
o uso de funes que esto nas bibliotecas padro do C, como por
exemplo, o comando para limpar o buffer de entrada: ffush(stdin), que
se encontra na biblioteca stdio (standard in/out).
A fgura 3.3 apresenta a nova estrutura dos nossos programas C.
Incluso das Bibliotecas
Declarao de Constantes
Declarao de Variveis Globais
Declarao dos Mdulos
Programa Principal
Figura 3.3: Nova estrutura dos programas C
O que temos nesta nova estrutura a seo de declarao de
variveis globais, que so as variveis que so utilizadas por todos
os mdulos do programa (mais detalhes na prxima seo). Alm
da seo de declarao dos mdulos, que vem antes do programa
principal. neste ponto do programa que devemos declarar nossos
mdulos.
70
Programao 2
3.4. Escopo das Variveis
Quando programamos sem utilizar modularizao, as variveis
so declaradas no incio do programa principal. Com esta forma de
declarao, as variveis s podem ser acessadas pelo programa
principal. Agora que comearemos a programar com mdulos, para
que uma varivel possa ser acessada por todos os mdulos do
programa, ela deve ser declarada fora de qualquer mdulo. Estas
variveis so chamadas de globais. As variveis globais devem ser
declaradas fora de qualquer mdulo e programa principal, logo aps a
incluso das bibliotecas.
Quando programamos de forma modularizada, em alguns casos,
uma determinada varivel utilizada apenas por um mdulo especfco,
o que no justifca uma defnio global, pois somente ser utilizada
dentro dos limites do mdulo. Quando isto acontece, a varivel deve
ser declarada dentro do mdulo e denominada varivel local.
O escopo ou abrangncia de uma varivel indica por quais mdulos
do programa esta varivel visvel e pode ser utilizada. Assim,
podemos dizer, ento, que as variveis globais so visveis por todos
os mdulos, e as variveis locais, so visveis apenas ao mdulo onde
esta foi declarada. Podemos ter quantos mdulos quisermos com
uma varivel local chamada x, por exemplo, e elas no apresentaro
confito entre si. Vamos analisar a fgura 3.4 a seguir:
int A, B, C;
Modulo 1
int x, y, z;
Modulo 2
int x, w;
Figura 3.4: Escopo de variveis locais e globais
As variveis A, B e C so globais, portanto, podem ser utilizadas
pelos mdulos 1 e 2. No mdulo 1 temos as variveis x, y e z, que
s podem ser utilizadas por este mdulo. Dessa forma, o mdulo 2
71
Programao 2
no tem acesso a tais variveis. Notem que, tanto o mdulo 1 quanto
o mdulo 2, tem uma varivel chamada x. Variveis com o mesmo
nome em mdulos diferentes no causam confito no programa.
Tambm pode ocorrer de uma funo ter uma varivel local com o
mesmo nome de uma varivel global, quando isto acontece, a funo
dar preferncia varivel local
11
.
Um ponto interessante que devemos atentar ao declarar as
variveis do programa que as variveis locais s existem (e
consequentemente, ocupam memria) enquanto o mdulo estiver
ativo e so destrudas quando a execuo do mdulo termina. Com
isso, h uma melhor utilizao da memria do programa.
3.5. Parmetros
Ao desenvolver um mdulo, devemos fcar atentos para que o
mesmo seja defnido de forma bem genrica, com o objetivo de que
este possa ser reutilizado mais vezes. Por exemplo, se criamos
um mdulo para calcular 2 elevado a 3, a sua aplicao ser muito
restrita. Porm se generalizarmos o mdulo de forma a torn-lo capaz
de calcular o valor de qualquer base elevada a qualquer expoente, sua
aplicao ser mais abrangente. Portanto, dizemos que um mdulo
generalizado quando ele for parametrizado.
A utilizao de parmetros nos mdulos funciona de forma muito
similar s funes matemticas, como por exemplo:
f (x , y) = x
y
em que x e y so parmetros.
Essa funo foi defnida em termos de parmetros x e y. Para
calcularmos a funo para algum valor particular de x e y devemos
substitu-los pelos valores dos argumentos desejados.
f (3 , 2) = 3
2
= 9
Uma correspondncia estabelecida entre os parmetros da
defnio e os argumentos utilizados. No exemplo, o parmetro x foi
substitudo pelo 3 e o parmetro y foi substitudo pelo 2. importante
perceber que a ordem dos parmetros crucial, pois f(3,2) no o
mesmo que f(2,3).
Uma funo pode receber qualquer nmero de parmetros. Mas
Ateno
11
Lembrem que
no podemos ter
duas variveis
globais com o
mesmo nome.
72
Programao 2
tambm poderemos escrever uma funo que no receba nenhum
parmetro. No caso de uma funo sem parmetros pode-se escrev-
la da seguinte forma: deixando a lista de parmetros vazia, mantendo
entretanto os parnteses. O exemplo 3.1 apresenta uma funo sem
parmetros.
Exemplo 3.1: funo sem parmetro
1
2
3
4
5
void cabecalho()
{ system(cls);
printf(Faculdade Legal\n);
printf(__________________________________\n);
}
A funo cabecalho, apresentada no exemplo 3.1 tem o objetivo de
limpar a tela e escrever o nome da empresa no incio da tela, alm de
passar uma linha logo abaixo. Como esta funo no precisou receber
nenhuma informao para a sua execuo, ela no tem parmetros,
mas temos que colocar os parnteses em branco logo aps o nome
da funo. Esta funo tambm no tem retorno, por isso o tipo de
retorno void.
3.6. Contexto do Mdulo (Ao ou Resultado)
Um mdulo possui o contexto de ao quando ele se preocupa com
um processo em particular, como por exemplo, o mdulo responsvel
por fazer o cadastramento dos dados dos alunos ou o mdulo
responsvel por apresentar todos os dados dos alunos cadastrados.
Neste tipo de mdulo, teremos a execuo de uma ao que o
cadastramento de alunos ou a listagem dos dados dos alunos.
Um mdulo possui o contexto de resultado quando a sua
caracterstica a de calcular um resultado. Para exemplifcar podemos
pensar no mdulo que responsvel por calcular a mdia das duas
notas de um aluno. Ao ser executado, este mdulo retornar como
resultado, a mdia do aluno.
A essncia de um mdulo com contexto de resultado que seu
conjunto de aes visa um objetivo nico, retornar ao ponto de sua
chamada, um valor. Para que um mdulo retorne um valor, em C, ser
73
Programao 2
necessrio que seja indicado qual o valor a ser retornado, o que
ser efetuado com a utilizao do comando return. Vamos analisar
mais uma vez a funo que calcula a mdia do aluno.
Exemplo 3.2
1
2
3
4
5
foat calc_media(foat n1, foat n2)
{ foat m;
m = (n1 + n2)/2;
return m;
}
A funo calc_media recebe como parmetro as duas notas do
aluno e retorna como resultado um foat, que a sua mdia. As duas
notas passadas como parmetros nas variveis n1 e n2 so somadas
e depois divididas por 2. No fnal da funo, temos o comando return,
que retorna o valor da varivel local m, que tem armazenado a mdia
do aluno. No necessrio usar o comando return nas funes que
no retornam nenhum valor (contexto de ao).
3.7. Ativando Funes
A ativao de um mdulo ocorre quando um determinado ponto
do programa contm o identifcador do mdulo (nome do mdulo).
A ativao conhecida como chamada de um mdulo e serve para
execut-lo. Uma chamada de funo feita escrevendo-se o nome da
funo seguido dos argumentos fornecidos, entre parnteses. Se no
houver argumentos, ainda assim devem ser mantidos os parnteses,
para que o compilador diferencie a chamada da funo de uma
varivel. As funes s podem ser chamadas depois de terem sido
declaradas.
Quando queremos chamar uma funo que retorna valor, devemos
cham-la atravs de um comando de atribuio, para que o valor que
ela retorna de resultado, seja armazenado nesta varivel. Este tipo de
funo tambm pode ser chamada/ativada em um comando de sada.
Dessa forma, ao invs de armazenamos o resultado, o apresentamos
na tela.
Durante a chamada de um mdulo, o fuxo de execuo do
74
Programao 2
programa desviado para o mdulo chamado, e logo aps a sua
concluso, o fuxo de execuo do programa retorna para o comando
seguinte aps a sua ativao. A fgura 3.5 mostra a ativao de dois
mdulos no programa. Vale lembrar que aps a ativao de um
mdulo, todas as suas variveis locais so desalocadas da memria.
main()
{ comando1;
comando2;
comando3;
comando4;
modulo1();
comando5;
comando6;
modulo2();
comando7;
comando8;
}
void modulo1()
{ comando1;
comando2;
comando3;
}
void modulo2()
{ comando1;
comando2;
comando3;
comando4;
}
Figura 3.5: Chamada de Funes
Para ilustrar melhor o assunto explanado, o programa completo
3.1 apresenta um programa que calcula o quadrado de um nmero.
Foram defnidos dois mdulos, alm do programa principal (main).
no main que as funes deste exemplo sero chamadas.
75
Programao 2
Programa Completo 3.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void escreva_cabecalho()
{ system(cls);
printf(Encontrar quadrado de um numero\n);
printf(_______________________________\n\n);
}
int quadrado(int numero)
{ int q;
q = numero*numero;
return q;
}
main()
{ int n, r;
escreva_cabecalho();
printf(\nInforme o numero: );
scanf(%d, &n);
r = quadrado(n);
printf(\n\nResultado\n\n);
printf(O quadrado de %d = %d\n\n, n, r);
getche();
}
O programa comea a sua execuo pelo programa principal (linha
13). Logo no incio, encontra a chamada para a funo escreva_
cabecalho. A funo escreva_cabecalho usada para escrever o
ttulo do programa, esta funo, no recebe parmetros, nem retorna
nenhum valor, ela apenas escreve um texto na tela. A chamada desta
funo foi feita na linha 15, logo aps a declarao das variveis do
programa principal. Para chamar esta funo, foi necessrio apenas
76
Programao 2
informar o seu nome e, como ela no tem parmetros, os parnteses
so colocados sem nada entre eles.
Na sequncia do programa, ser lido o nmero que se deseja
calcular o quadrado e logo em seguida feita a chamada da funo
quadrado (linha 18). A funo quadrado recebe um parmetro inteiro
(que o nmero que se deseja calcular o quadrado) e retorna como
resultado um valor inteiro. Como mencionado anteriormente, funes
que retornam valor, devem ser chamadas atravs de um comando
de atribuio. Neste caso, a varivel r, receber o retorno da funo
quadrado. Alm disso, como esta funo precisa saber de qual
nmero ser calculado o quadrado, na chamada da funo, entre os
parnteses, devemos colocar o valor ou a varivel que ser utilizada
no clculo, neste caso, ser passado como parmetro o valor da
varivel n. O programa fnaliza apresentado o resultado, que o
quadrado do nmero (linhas 19 e 20).
A fgura 3.6 apresenta a tela de execuo do programa completo
3.1
Figura 3.6: Tela de execuo do programa completo 3.1
Nos demais volumes deste livro, estaremos desenvolvendo nossos
programas de forma modularizada. Quando passarmos a desenvolver
programas maiores, veremos com mais clareza as vantagens de usar
a modularizao.
Atividades e Orientaes de Estudos
Vamos treinar o desenvolvimento de mdulos? Para cada questo
abaixo, crie um programa principal, para que se possa testar/chamar
77
Programao 2
o mdulo desenvolvido.
1. Desenvolva uma funo que recebe as trs notas do aluno como
parmetro e retorne a sua mdia.
2. Desenvolva uma funo que recebe dois nmeros inteiros como
parmetro, e retorna o resto da diviso do primeiro parmetro
pelo segundo.
3. Desenvolva uma funo que receba trs nmeros inteiros como
parmetros e retorne o menor valor.
4. Desenvolva uma funo que recebe o ano de nascimento do
usurio e retorna a sua idade. Faa o clculo usando o ano
atual.
5. Desenvolva uma funo que recebe como parmetro o ms
atual e retorna quantos meses faltam para o fnal do ano.
6. Desenvolva uma funo que recebe como parmetros o dia do
ms, o ms e o ano e retorna quantos dias faltam para o fnal do
ms. Lembrem que os meses que tm 28, 29, 30 ou 31 dias.
Ser realizado um frum de discusso que discutir sobre
modularizao de programas em C. importante que vocs participem
ativamente deste frum. uma oportunidade para discutirmos e
trocarmos idias sobre este assunto to abrangente. Apaream por
l!
Conhea Mais
Vocs podem aumentar o entendimento deste assunto lendo o
captulo 7 do livro:
LAUREANO, Marcos. Programando em C Para Linux, Unix e
Windows. Rio de Janeiro: Brasport, 2005.
Vamos Revisar?
Vamos fazer uma reviso do assunto que foi visto neste captulo,
78
Programao 2
fazendo a leitura do resumo a seguir:
Modularizao um tcnica de programao que tem como
objetivo desenvolver o programa de maneira mais simples e
legvel.
Um mdulo deve ser bem especfco, ou seja, deve ser projetado
para resolver uma nica ao.
As variveis declaradas dentro de um mdulos so de uso
exclusivo deste mdulo e so chamadas de variveis locais.
As variveis globais podem ser acessadas por qualquer mdulo
do programa.
Um programa C comea a sua execuo a partir do programa
principal (main).
Se o mdulo retornar algum valor, devemos utilizar o comando
return.
Os mdulos que recebem parmetros tem mais chances de serem
reutilizados.
Para ativar a execuo de um mdulo, devemos fazer a sua
chamada.
Ao iniciar a execuo de um mdulo, o fuxo do programa
desviado para o mdulo chamado. Ao terminar, o fuxo de execuo
do programa volta para o ponto onde o mdulo foi chamado.
79
Programao 2
Consideraes Finais
Neste volume, demos continuidade ao nosso aprendizado na
linguagem de programao C. Nos captulos 1 e 2, conhecemos as
estruturas de repetio, que tem a capacidade de mudar o fuxo de
execuo do programa, desviando de uma parte de comandos ou
fazendo com que um grupo de comandos fosse executado vrias
vezes. No captulo 3, foi abordada a modularizao, que nos permite
uma programao mais organizada, reaproveitamento de cdigo
e desenvolvimento do programa em etapas. Esperamos que vocs
estejam a cada dia, gostando mais da linguagem de programao C.
Temos mais dois volumes, que nos daro a capacidade de desenvolver
programas ainda mais complexos. Continuem frmes nos estudos! At
o prximo mdulo.
Referncias
ARAJO, Jairo. Dominando a Linguagem C. So Paulo:
Cincia Moderna, 2004.
ASCENIO, Ana Fernanda Gomes e CAMPOS, Edilene
Aparecida Veneruchi. Fundamentos de Programao de
Computadores. So Paulo: Prentice Hall, 2002.
DEITEL, H, M e DEITEL, P. J. Como Programar em C. Rio de
Janeiro: LTC, 1999.
LAUREANO, Marcos. Programando em C Para Linux, Unix e
Windows. Rio de Janeiro: Brasport, 2005.
MIZRAHI, Victorine Viviane. Treinamento em Linguagem C
Curso Completo. So Paulo: Makron, 1999.
MONTGOMERY, Eduard. Programando em C: Simples e
Prtico. So Paulo: Alta Books, 2006.
OLIVEIRA, Ulisses. Programando em C Volume I
Fundamentos. So Paulo: Cincia Moderna, 2004.
SCHILDT, Herbert. C Completo e Total. So Paulo: Makron,
1996.
80
Programao 2
Conhecendo a Autora
Snia Virginia Alves Frana
Sou graduada em Cincia da computao pela Universidade
Federal de Sergipe. Fiz mestrado e doutorado na Universidade Federal
de Pernambuco, desenvolvendo pesquisas nas reas de Sistemas
Distribudos e Geoprocessamento. Comeei a ensinar em 2000, nos
cursos de Cincia da Computao e Sistemas de Informao. Desde
o incio da minha carreira como professora, ministro disciplinas de
Programao e tenho uma paixo pela linguagem C. Atualmente,
encontrei uma nova paixo: Educao a Distncia.
Recife, 2009
Programao 2
Snia Virginia Alves Frana
Universidade Federal Rural de Pernambuco
Reitor: Prof. Valmar Corra de Andrade
Vice-Reitor: Prof. Reginaldo Barros
Pr-Reitor de Administrao: Prof. Francisco Fernando Ramos Carvalho
Pr-Reitor de Extenso: Prof. Paulo Donizeti Siepierski
Pr-Reitor de Pesquisa e Ps-Graduao: Prof. Fernando Jos Freire
Pr-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira
Pr-Reitora de Ensino de Graduao: Prof. Maria Jos de Sena
Coordenao de Ensino a Distncia: Prof Marizete Silva Santos
Produo Grfca e Editorial
Capa e Editorao: Allyson Vila Nova, Rafael Lira, Italo Amorim e Marcella Almeida
Reviso Ortogrfca: Marcelo Melo
Ilustraes: Diego Almeida e Glaydson da Silva
Coordenao de Produo: Marizete Silva Santos
Sumrio
Apresentao ........................................................................................5
Conhecendo o Volume 3 ......................................................................6
Captulo 1 Armazenamento de Dados em Vetores .........................8
1.1 O que so vetores? ......................................................................8
1.2 Declarao de Vetores .................................................................9
1.3 Referncia a elementos de vetor ................................................ 11
1.4 Inicializao de vetores ..............................................................13
1.5 Leitura de elementos para o vetor ..............................................15
1.6 Impresso dos elementos de um vetor .......................................22
1.7 Tamanho de um vetor e segmentao de memria ...................27
1.8 Passando vetores como parmetros de funes .......................28
Captulo 2 Armazenamento de Dados em Registros ....................35
2.1 O que so registros? ..................................................................35
2.2 Declarao de um Registro ........................................................36
2.3 Acessando os campos do registro ..............................................39
2.4 Vetor de registro .........................................................................40
2.5 Acessando os campos do vetor de registro ................................42
2.6 Usando vetor de registro ............................................................43
Captulo 3 Armazenamento de Dados em Arquivos .....................61
3.1 O que so arquivos? ...................................................................61
3.2 Comandos para manipular arquivos binrios .............................64
3.3 Implementao das operaes bsicas em um arquivo .............76
Consideraes Finais .......................................................................102
Conhecendo a Autora .......................................................................104
Apresentao
Caro(a) aluno(a),
Seja bem-vindo (a) ao terceiro mdulo da disciplina Programao II. Neste mdulo,
vamos dar mais um passo no nosso aprendizado sobre a linguagem de programao
C.
Nos dois volumes anteriores, aprendemos os comandos bsicos do C, a utilizar
as estruturas de controle (seleo e repetio) e a modularizar nossos programas em
mdulos ou funes. Com estes assuntos, adquirimos a capacidade de desenvolver
programas mais elaborados.
Neste livro, ns vamos aprender novas formas de armazenar nossos dados. Com os
vetores e registros, poderemos manusear um volume maior de dados, de forma facilitada.
Outro assunto muito importante que ser abordado neste volume o armazenamento de
dados em arquivos. Atualmente, ao terminar a execuo do programa, todos os dados
que foram digitados so perdidos. Com o armazenamento de dados em arquivos, isto
no acontece. Assim, iremos desenvolver programas com operaes como: cadastro de
elementos, remoo, alterao, consultas, listagens, etc.
Continuem resolvendo as questes propostas no fnal de cada captulo, alm de
executar buscas na Internet, visando um maior aprofundamento de cada assunto. Ao fnal
deste mdulo, teremos a capacidade de resolver questes com operaes presentes
nos principais sistemas de controle do mercado, como por exemplo: sistema de controle
de estoque, sistema de controle de cliente, etc. Vamos comear mais uma nova etapa
no conhecimento da linguagem de programao C?
Bons estudos!
Professora Snia Virginia Alves Frana
6
Programao 2
Conhecendo o Volume 3
Neste terceiro volume, vocs iro encontrar o mdulo 03 da
disciplina: Programao II. Este volume est estruturado em trs
captulos, que sero estudados ao longo de 15h/aula. Para facilitar
seus estudos, veja a organizao deste volume.
Captulo 1: Armazenamento de Dados em Vetores
Carga Horria do Captulo 1: 5 h/aula
Objetivos do Captulo 1: Apresentar o uso de vetores para o
armazenamento de dados.
Contedo Programtico do Captulo 1
Defnio de vetores;
Declarao, leitura e escrita de dados em vetores;
Passagem de vetores como parmetros de funes;
Captulo 2: Armazenamento de Dados em Registros
Carga Horria do Captulo 2: 5 h/aula
Objetivos do Captulo 2: Apresentar o uso de registros para o
armazenamento de dados.
Contedo Programtico do Captulo 2
Defnio de registros;
Declarao, leitura e escrita de dados em registros;
Vetor de registro;
Captulo 3: Armazenamento de Dados em Arquivos
Carga Horria do Captulo 3: 5 h/aula
Objetivos do Captulo 3: Apresentar os principais comandos para
o armazenamento de dados em arquivos. Com os arquivos, os dados
manipulados no programa podem ser armazenados defnitivamente.
Contedo Programtico do Captulo 3
Defnio de arquivos;
7
Programao 2
Ponteiros;
Comandos para manipulao de dados em arquivos;
Ao fnal de cada captulo vocs encontraro:
A seo Atividades e Orientaes de Estudo: que contm
exerccios para a fxao do assunto estudado, alm de
indicao de fruns de discusso.
A seo Conhea Mais: que contm dicas de sites e livros
que devem ser lidos para ampliar os seus conhecimentos.
A seo Vamos Revisar?: que apresenta um resumo dos
principais tpicos abordados no captulo.
8
Programao 2
Captulo 1 Armazenamento de
Dados em Vetores
Vamos conversar sobre o assunto?
Neste terceiro volume, vamos aprender novas formas de armazenar
nossos dados. Comearemos aprendendo como armazenar os dados
em vetores. Com os vetores, ns podemos armazenar um grande
conjunto de dados, facilitando o acesso e manuseio dos mesmos. Os
dados so a alma de um programa. Assim, a manipulao dos dados
de forma mais adequada e facilitada, trar ganhos para o programa e
para o programador. Vamos continuar a nossa caminhada?
1.1 O que so vetores?
Imaginem que um professor nos encomendou um programa, que
tenha que armazenar as mdias dos 50 alunos de uma turma. Como
faramos para armazenar essas mdias? At o ponto que estudamos
a linguagem C, teramos que declarar 50 variveis do tipo foat, uma
por uma. Que trabalheira, no mesmo? E se o professor tivesse 300
alunos? Passaramos um tempo s declarando variveis e, alm
disso, teramos muito trabalho para fazer o controle das mesmas.
Mas no se preocupem, com os vetores, o professor pode ter mais de
1000 alunos, que a declarao e manuseio dos dados ser bem fcil.
Os vetores so usados quando precisamos armazenar um conjunto
de dados do mesmo tipo. Por exemplo: armazenar as 50 mdias dos
alunos de uma turma (todas as mdias so do tipo foat). Os vetores
so bem convenientes j que iremos colocar todas as informaes
dentro de um mesmo conjunto e faremos referncia de cada dado,
individualmente, atravs de um ndice
1
. De maneira mais formal, os
vetores so chamados de estruturas de dados homogneas (j
que armazenam dados do mesmo tipo). Os vetores so formados
por dados de mesmo tipo (homogneo) e possuem nmero fxo de
elementos (esttico).
Para entendermos melhor os vetores, vamos visualizar a sua
representao grfca, na fgura 1.1.
Saiba Mais
1
Em ingls, um
vetor chamado
de array (que
signifca cadeia).
Assim, quando
temos um array,
temos uma cadeia
de inteiros, reais
ou caracteres.
9
Programao 2
media 3.0 7.5 5.8 9.5 8.2
0 1 2 3 4
Figura 1.1: Representao grfca de um vetor
Na fgura 1.1 temos um vetor chamado media, formado por 5
elementos. Vocs lembram quando tnhamos uma varivel simples?
Representvamos com uma nica caixa. Agora, com os vetores,
teremos um conjunto de dados, por isso ele formado por vrias
caixas. Em cada uma delas poderemos armazenar um valor. Todas as
caixas tm um nico nome. Neste exemplo, o vetor se chama media.
Notem que, abaixo de cada caixa temos um nmero. Estes nmeros
so chamados de ndices. atravs do ndice, que iremos informar
qual das caixas do vetor que estamos querendo acessar. J que
todas as caixas tm um nico nome (media), a forma de diferenciar
uma da outra o ndice. Entenderam?
Na linguagem C, o ndice de um vetor, comea a partir de 0. Assim,
em um vetor com 5 elementos, os ndices variam de 0 a 4 (como no
exemplo da fgura 1.1). Por isso, o primeiro elemento do vetor media
est na posio de ndice 0. Podemos dizer que a mdia do segundo
aluno est na posio de ndice 1 do vetor media, e igual a 7.5.
Esta no a nica maneira de estruturar um conjunto de dados.
Tambm podemos organizar dados sob forma de tabelas. Neste caso,
cada dado referenciado por dois ndices e dizemos que se trata de
um conjunto bidimensional (ou matriz).
Vamos aprender, nas prximas sees, como manusear os vetores
nos nossos programas.
1.2 Declarao de Vetores
Como j foi mencionado, um vetor um conjunto de variveis
do mesmo tipo, que possuem um nome identifcador e um ndice de
referncia. A sintaxe para a declarao de um vetor a seguinte:
Sintaxe
tipo identifcador[tamanho];
10
Programao 2
onde:
tipo: o tipo de dados que o vetor armazena: int, foat, char,
etc.
identifcador: o nome do vetor. As regras para nomear um
vetor so as mesmas usadas para nomear variveis, constantes
e funes.
tamanho: o tamanho do vetor. Isto , o nmero de elementos
que o vetor pode armazenar.
A seguir, so apresentados exemplos de declaraes de vetores.
Os vetores so declarados na seo de declarao de variveis do
programa. Se estivermos desenvolvendo um programa modularizado,
podemos declarar o vetor como uma varivel local de um mdulo.
Exemplo 1.1: declarao de vetores
1
2
3
int idade[100];
foat nota[25];
char nome[80];
No primeiro exemplo, temos a declarao de um vetor chamado
idade, que pode armazenar at 100 nmeros inteiros. No segundo
exemplo, temos um vetor chamado nota, com capacidade para
armazenar at 25 nmeros reais. E, fnalmente, no terceiro exemplo,
temos um vetor chamado nome, com capacidade de armazenar at
80 caracteres
2
.
Ao declararmos o vetor, j temos que ter uma previso de quantos
elementos sero armazenados no mesmo. Com isso, o processador
saber quanto de memria precisa ser reservada para armazenar os
dados do vetor, ao executar o programa. A quantidade de memria
(em bytes) usada para armazenar um vetor pode ser calculada como:
quantidade de memria = tamanho do tipo * tamanho do vetor
O tamanho do tipo indica quantos bytes um determinado tipo de
varivel utiliza para ser armazenado (vimos este assunto no Volume
1 Captulo 3). Ao compilar o programa, a quantidade de memria
necessria para armazenar o vetor alocada. Os vetores tm
tamanhos fxos e no podemos armazenar mais elementos do que a
quantidade que foi solicitada no momento da declarao do vetor. Por
Ateno
2
Ns j havamos
utilizado vetor
de caracteres, j
que trabalhamos
com variveis
que armazenam
uma cadeia de
caracteres. No
prximo volume,
teremos um
captulo dedicado
a este assunto.
11
Programao 2
isso, so chamados de estticos. A quantidade de elementos no
pode aumentar em tempo de execuo do programa.
Tambm possvel declarar um vetor com tamanho parametrizado:
usando uma constante. Declaramos uma constante com a diretiva
#defne, no incio do programa, e depois declaramos o vetor com
esta constante como tamanho do vetor. Deste modo, podemos alterar
o nmero de elementos do vetor antes de qualquer compilao do
programa. Esta uma maneira simples de administrar o espao de
memria usado pelo programa, e tambm testar os limites de um
vetor.
Exemplo 1.2:
Declarao de vetor usando uma constante no local do tamanho do vetor.
1
2
#defne TAMANHO 30
int valor[TAMANHO];
No exemplo 1.2, o vetor valor ter capacidade de armazenar 30
elementos (este o valor da constante TAMANHO).
1.3 Referncia a elementos de vetor
Agora que j sabemos como criar os vetores, a partir da sua
declarao, vamos aprender como acessar um elemento do vetor.
Segue abaixo a sintaxe.
Sintaxe
identifcador[indice]
onde:
identifcador: o nome do vetor que queremos acessar.
ndice: o ndice do elemento do vetor que queremos acessar.
Cada elemento do vetor referenciado pelo nome do vetor e,
entre colchetes, tem-se o ndice, que um nmero inteiro. O ndice
ir indicar qual elemento do vetor estamos querendo referenciar. A
seguir, so apresentadas algumas atribuies a elementos de um
vetor chamado valor, que composto por 10 elementos do tipo foat.
12
Programao 2
Exemplo 1.3: Acessando os elementos de um vetor
1
2
3
4
5
6
foat valor[10]; //declarao do vetor
int x;
x = 3;
valor[1] = 6.6;
valor[x] = 9.9
valor[x+2] = 10.0;
Entre os colchetes, que indicam o ndice do vetor que ser
acessado, podemos ter: um valor (exemplo da linha 4), uma varivel
(exemplo da linha 5) ou uma expresso (exemplo da linha 6).
Devemos ter cuidado quando usamos variveis e expresses, pois
estas devem ser inteiras e devem ter um valor dentro da capacidade
de armazenamento do vetor. Ou seja, se o vetor foi declarado com
tamanho 10, no podemos tentar acessar o ndice 18 do vetor.
Na linha 4, foi atribudo 6.6 ao elemento de ndice 1 do vetor valor.
Na linha 5, como a varivel x tem armazenado 3, ento o valor[3],
receber 9.9. Quando temos uma expresso, que o caso da linha
6, a expresso resolvida primeiro. Assim, como x = 3, e entre os
colchetes temos x+2, o resultado ser 5. Dessa forma, valor[5]
receber 10.0. A seguir, temos a situao fnal do vetor valor, aps as
atribuies dos valores do exemplo.
Valor 6.6 9.9 10.0
0 1 2 3 4 5 6 7 8 9
Figura 1.2: Situao do vetor valor aps atribuies
Viram como fcil trabalhar com vetor? Em uma nica linha, ns
criamos um conjunto de variveis, do tamanho da nossa necessidade.
Posteriormente, acessamos cada uma destas variveis utilizando o
nome do vetor e o ndice da varivel.
Na prxima seo, vamos ver como fazemos para inicializar os
elementos de um vetor, no momento da declarao.
13
Programao 2
1.4 Inicializao de vetores
No momento da declarao de um vetor, tambm podemos
inicializar os seus elementos, fazendo a atribuio de valores aos
mesmos. A sintaxe para a inicializao dos elementos de um vetor
a seguinte:
Sintaxe
tipo identifcador[tamanho] = {lista de valores};
Onde:
tipo: o tipo dos elementos do vetor: int, foat, char, etc.
identifcador: o nome do vetor.
tamanho: o tamanho do vetor. Isto , o nmero de elementos
que o vetor pode armazenar.
lista de valores: uma lista, separada por vrgulas, dos valores
de cada elemento do vetor. A lista de valores colocada entre
chaves.
Vamos ver a seguir, exemplos de inicializao de vetores.
Exemplo 1.4: Inicializao de vetores
1
2
3
4
int idade[7] = {12, 30, 14, 7, 13, 15, 6};
char vogal[5] = {a, e, i, o, u};
foat nota[5] = {8.4, 6.9, 4.5};
foat media[5] = {0};
No exemplo da linha 1, temos o vetor chamado idade e para cada
posio do vetor, foi atribudo um valor. Aps esta atribuio, o vetor
idade fcar assim:
idade 12 30 57 25 18 15 13
0 1 2 3 4 5 6
Figura 1.3: Situao do vetor idade aps inicializao
No segundo exemplo, temos um vetor de caracteres, chamado
vogal. Quando inicializamos um vetor deste tipo de varivel, os valores
14
Programao 2
devem ser colocados entre apstrofo. Ao fnal desta atribuio, o vetor
vogal fcar como mostra a fgura 1.4.
vogal a e i o u
0 1 2 3 4
Figura 1.4: Situao do vetor idade aps inicializao
Na linha 3, temos a inicializao do vetor nota, que composto
por cinco elementos. Notem que, entre as chaves, no temos cinco
valores. Temos apenas trs. Quando no quisermos inicializar todo o
vetor, podemos colocar apenas os valores dos primeiros elementos, e
aos demais, ser atribudo zero (automaticamente). Vejam na fgura
1.5 como fcar o vetor nota, aps a sua inicializao.
nota 8.4 6.9 4.5 0.0 0.0
0 1 2 3 4
Figura 1.5: Situao do vetor idade aps inicializao
Seguindo o raciocnio do exemplo anterior, quando precisarmos
inicializar todos os elementos do vetor com zero, fazemos como
mostra o exemplo da linha 4. Colocamos apenas um zero entre as
chaves, o primeiro elemento ser inicializado com zero, e os demais
tambm. Neste caso, o vetor media fcar como apresentado na fgura
1.6.
media 0.0 0.0 0.0 0.0 0.0
0 1 2 3 4
Figura 1.6: Situao do vetor media aps inicializao
Opcionalmente, podemos inicializar os elementos do vetor
enumerando-os um a um. No exemplo 1.5, a seguir, observem que
estas duas inicializaes so possveis:
15
Programao 2
Exemplo 1.5: Inicializao de vetores
1
2
3
4
5
6
int valor[3] = {7,4,20};
ou
int valor[3];
valor[0] = 7;
valor[1] = 4;
valor[2] = 20;
Na prxima seo, vamos aprender a armazenar, em um vetor,
valores que so fornecidos via teclado.
1.5 Leitura de elementos para o vetor
Agora suponham que os valores que vo ser armazenados no
vetor sejam fornecidos pelo usurio, via teclado. O que devemos
fazer? Devemos utilizar uma estrutura de repetio, para controlar o
preenchimento dos dados no vetor, um por um. Assim, podem ocorrer
duas situaes:
Ns sabemos quantos elementos o usurio vai digitar;
Ns no sabemos a quantidade de elementos que o usurio
vai digitar.
Vamos ver como tratar cada uma das situaes? Quando ns
sabemos quantos elementos o usurio vai digitar, poderemos usar
uma estrutura de repetio como o for, que ir repetir a leitura dos
elementos, na quantidade defnida. Vamos ver o Programa Completo
1.1 a seguir: o usurio precisa armazenar 5 elementos em um vetor
de inteiros, chamado valor.
16
Programao 2
Programa Completo 1.1:
Ler 5 nmeros inteiros, armazenando-os em um vetor
1
2
3
4
5

6
7
8
9
10
11
main()
{
int valor[5];
int i;
printf(Cadastro dos elementos do vetor Valor
\n\n);
for (i=0; i<5; i++)
{ printf(\n\nElemento %d: ,i+1);
scanf(%d,&valor[i]);
}
getche();
}
Comentrios sobre o Programa Completo 1.1:
Linha 3: declarao do vetor valor, que tem a capacidade de
armazenar 5 nmeros inteiros.
Linha 4: declarao da varivel i, que ir controlar o for.
Linha 5: printf para que o usurio saiba que ser feito o cadastro
dos elementos no vetor.
Linha 6: for que ser repetido 5 vezes, fazendo a leitura dos
elementos do vetor. Notem que a varivel de controle do for, o i,
inicializado com 0. Isso acontece porque o primeiro ndice do
vetor 0.
Linha 7: Abre chaves que inicia a sequncia de comandos
do for (j que teremos mais de um comando). Nesta linha,
tambm temos o printf para que o usurio saiba qual elemento
do vetor est sendo cadastrado no momento. Vejam que neste
printf temos a expresso: i+1. O motivo de colocarmos esta
expresso no printf que, como o i comea com zero e vai at
4, no fcaria muito interessante que sasse uma mensagem, na
tela, informando que o usurio estaria cadastrando o elemento
0. O correto dizer que ele est cadastrando o elemento 1. Por
17
Programao 2
isso, usamos a expresso i+1.
Linha 8: scanf que l o valor, armazenando no vetor. Notem
que estamos usando a varivel i, no ndice do vetor. Dessa
forma, o i vai variando a cada vez que o for repetido, e assim,
os elementos so armazenados em ndices diferentes do vetor.
Com isso, nenhum elemento ir sobrepor o outro.
Linha 9: fecha chaves que indica o fnal da sequncia de
comandos do for.
Linha 10: comando getche que faz com que a tela de execuo
do programa fque aberta, e assim podemos ver o resultado do
programa.
Linha 11: fecha chaves, indicando o fnal do programa
principal.
A fgura 1.7, apresenta a tela de execuo do Programa Completo
1.1.
Figura 1.7: Tela de execuo do Programa Completo 1.1
Para facilitar o entendimento, vamos fazer um acompanhamento
dos valores das variveis do Programa Completo 1.1, ao longo da
sua execuo. Vamos considerar que o usurio est cadastrando os
valores apresentados na fgura 1.7. A fgura 1.8 mostra os valores das
variveis do programa, conforme o programa vai sendo executado.
18
Programao 2
i i+1 valor
0


1


10
0 1 2 3 4
1


2


10 15
0 1 2 3 4
2


3


10 15 9
0 1 2 3 4
3


4


10 15 9 6
0 1 2 3 4
4


5


10 15 9 6 12
0 1 2 3 4
Figura 1.8: Acompanhamento das variveis do Programa Completo 1.1
O que fazemos quando no sabemos quantos elementos sero
armazenados no vetor? Neste caso, como no sabemos quantas
vezes o for deve ser executado, poderemos fazer a leitura dos dados
que sero colocados no vetor, usando um do/while, como mostra o
Programa Completo 1.2, a seguir. Neste programa, iremos fazer
a leitura de uma quantidade indeterminada de nmeros inteiros,
armazenando em um vetor.
19
Programao 2
Programa Completo 1.2:
Ler um conjunto de nmeros inteiros, armazenando-os em um vetor.
1
2
3
4
5

6
7
8
9
10

11
12
13
main()
{ int valor[5];
int q, continuar;
q=0;
printf(Cadastro dos elementos do vetor Valor
\n\n);
do
{ printf(\n\nElemento %d: ,q+1);
scanf(%d,&valor[q]);
q++;
printf(\n\nCadastrar outro elemento
(1-sim/2-nao)? );
scanf(%d, &continuar);
} while ((continuar==1) && (q<5));
}
Neste caso, a leitura ser fnalizada quando o vetor fcar cheio,
com cinco elementos, ou quando o usurio decidir que no deseja
mais continuar a leitura. Neste ltimo caso, saberemos quantos
elementos foram armazenados no vetor atravs da varivel q. esta
varivel que indica, tambm, em qual ndice do vetor o elemento deve
ser armazenado
3
.
Comentrios sobre o Programa Completo 1.2:
Linhas 2: declarao do vetor valor, que tem a capacidade de
armazenar 5 nmeros inteiros.
Linha 3: declarao das variveis q (que controla a quantidade
de elementos que j foram cadastrados no vetor) e continuar
(que armazena a resposta do usurio informando se quer
cadastrar mais elementos ou no).
Linha 4: inicializao da varivel q com 0.
Linha 5: printf para que o usurio saiba que ser feito o cadastro
Ateno
3
Quando no
sabemos quantos
elementos sero
cadastrados,
temos que
estipular um valor
para a quantidade
de elementos
que sero
armazenados no
vetor. Isso se d
porque temos que
saber o tamanho
do vetor no
momento da sua
declarao.
20
Programao 2
dos elementos no vetor.
Linha 6: do indicando o incio da repetio.
Linha 7: Abre chaves que inicia a sequncia de comandos do
do/while (j que teremos mais de um comando). Nesta linha
tambm temos o printf para que o usurio saiba qual elemento
do vetor est sendo cadastrado no momento.
Linha 8: scanf que l o valor que ser armazenado no vetor.
Notem que estamos usando a varivel q, no ndice do vetor.
Linha 9: incremento da varivel q, indicando que mais um
elemento foi cadastrado no vetor. Atravs do valor de q,
saberemos se o vetor j est cheio ou no.
Linha 10: prinft que pergunta ao usurio se deseja cadastrar
outro elemento no vetor. O usurio pode parar o cadastro dos
elemento do vetor, no momento que ele desejar. Nesse caso, o
vetor pode fcar com posies sem valores armazenados.
Linha 11: scanf para ler a resposta do usurio.
Linha 12: fecha chaves do do/while e while com a condio
que faz com que a repetio fque sendo executada. Como
a condio formada por duas expresses relacionais, ns
colocamos cada expresso relacional entre parnteses e depois
colocamos toda a expresso entre parnteses. As expresses
esto conectadas pelo operador && (e). Com isso, quando uma
das expresses der falso, a repetio para. Vai parar porque
o vetor est cheio (q=5) ou porque o usurio desejou parar,
respondendo 2 a pergunta se deseja continuar.
Linha 13: fecha chaves, indicando o fnal do programa
principal.
A fgura 1.9, apresenta a tela de execuo do Programa Completo
1.2.
21
Programao 2
Figura 1.9: Tela de execuo do Programa Completo 1.2
Vamos acompanhar o valor das variveis do Programa Completo
1.2? A Figura 1.9 mostra o cadastramento de 3 elementos no vetor. O
usurio respondeu que no queria mais cadastrar aps dar entrada
ao terceiro elemento. A fgura 1.10 mostra os valores das variveis do
programa, conforme o programa vai sendo executado.
q q+1 valor
0


1


12
0 1 2 3 4
1


2


12 15
0 1 2 3 4
2


3


12 15 18
0 1 2 3 4
Figura 1.10: Acompanhamento das variveis do Programa Completo 1.2
Agora que j sabemos colocar informaes em um vetor via
teclado, vamos ver como apresentar, na tela, os valores armazenados
em um vetor.
22
Programao 2
1.6 Impresso dos elementos de um vetor
Quando desejarmos apresentar os elementos que esto
armazenados no vetor, devemos utilizar uma estrutura de repetio,
que far com que cada uma das posies do vetor seja visitada e
seu contedo apresentado. Vale lembrar que, quando declaramos um
vetor, indicamos a sua capacidade de armazenamento. Mas durante a
execuo do programa, pode ser que o usurio no armazene dados
sufciente para preencher todas as posies do vetor. Assim, quando
formos imprimir os dados de um vetor, precisamos saber quantos
elementos tm armazenado no momento da impresso. O Programa
Completo 1.3, mostra a leitura e a impresso dos dados armazenados
em um vetor.
Programa Completo 1.3: Ler e imprimir um conjunto de nmeros inteiros,
armazenando-os em um vetor.
1
2
3
4
5

6
7
8
9
10

11
12
13
14
15
16
17
main()
{ int valor[5];
int q, continuar, i;
q=0;
printf(Cadastro dos elementos do vetor Valor
\n\n);
do
{ printf(\n\nElemento %d: ,q+1);
scanf(%d,&valor[q]);
q++;
printf(\n\nCadastrar outro elemento
(1-sim/2-nao)? );
scanf(%d, &continuar);
} while ((continuar==1) && (q<5));
printf(\n\nElementos do Vetor: );
for (i=0; i<q; i++)
printf( %d ,valor[i]);
getche();
}
23
Programao 2
At a linha 12, o Programa Completo 1.3 , praticamente, idntico
ao Programa Completo 1.2. A nica diferena que temos, na linha
3, a declarao da varivel i, que ser usada no for que imprimir os
elementos do vetor. Vamos ver o que est acontecendo nas demais
linhas?
Linha 13: printf para informar que sero apresentados os
elementos do vetor. Notem que o texto entre aspas no termina
com \n. Isso se d porque no queremos que o cursor v para
a linha seguinte.
Linha 14: for que ser utilizado para percorrer o vetor,
acessando cada uma das posies do vetor. A varivel que tem
a informao de quantos elementos foram armazenados no
vetor q. Dessa forma, o i do for vai variar de 0 at q-1. Uma
vez que se q for 3, a ltima posio ocupada no vetor 2.
Linha 15: printf que apresenta o elemento do vetor, na posio
de ndice i. Este printf tambm no tem o \n, porque queremos
que os elementos do vetor sejam impressos um ao lado do
outro. Este o nico comando do for, por isso no houve a
necessidade de delimitar com chaves.
Linha 16: getche que evita o fechamento da janela de execuo
do programa, e assim poderemos ver os elementos do vetor
impresso.
Linha 17: fecha chaves, indicando o fnal do programa
principal.
A fgura 1.11 apresenta a tela de execuo do programa 1.3. Foram
cadastrados os mesmos valores do exemplo anterior.
24
Programao 2
Figura 1.11: Tela de execuo do Programa Completo 1.3
Neste caso, apesar do vetor ter sido declarado com 5 posies, s
foram preenchidas 3 posies. Vejam que, aps o usurio responder
que no quer mais cadastrar, os elementos do vetor so apresentados
um ao lado do outro.
Vamos ver outro Programa Completo? Neste programa iremos
ler as matrculas e notas dos alunos de uma turma e imprimir as
matrculas dos alunos de tiveram nota acima da mdia das notas da
turma.
Programa Completo 1.4
1
2
3
4
5
6
7
8
9
10
main()
{ int mat[10];
foat nota[10];
int q, i, continuar;
foat soma, media;
soma = 0;
q=0;
do
{ system(cls);
printf(Universidade Aberta do Brasil -
UFRPE\n\n);
25
Programao 2
11

12
13
14
15
16
17
18

19
20
21
22
23

24
25

26
27
28
29
30
printf(\n\nDados do Alunos %d\n\n,
q+1);
printf(\nMatricula: );
scanf(%d,&mat[q]);
printf(\nNota: );
scanf(%f,&nota[q]);
soma = soma + nota[q];
q++;
printf(\n\nCadastrar outro(1-sim/2-nao)?
);
scanf(%d, &continuar);
} while ((continuar==1) && (q<10));
media = soma/q;
system(cls);
printf(Universidade Aberta do Brasil - UFRPE
\n\n);
printf(Media da turma: %.2f\n\n\n,media);
printf(Alunos com nota acima da media da
turma\n\n);
for (i=0; i<q; i++)
{ if (nota[i]>media)
printf(%d \n,mat[i]);
}
printf(\n\nDigite qualquer tecla para sair
);
31
32
getche();
}
Comentrios sobre o Programa Completo 1.4:
Linhas 2 a 5: declarao das variveis do programa. Vejam
que precisamos de um vetor para armazenar as matrculas e
um outro para armazenar as notas.
26
Programao 2
Linhas 6 e 7: inicializao das variveis soma (que acumula as
notas de todos os alunos) e q (que conta quantos elementos
foram cadastrados no vetor).
Linhas 8 a 20: do/while que faz a leitura das matrculas e das
notas de cada aluno, armazenando nos respectivos vetores.
Neste do/while, o usurio pode parar o cadastro no momento
que ele desejar. Para calcularmos a mdia da turma, temos que
somar as notas de todos os alunos e dividir pela quantidade
de alunos. Assim, enquanto estivermos no do/while, estamos
acumulando as notas de todos os alunos na varivel soma.
Linha 21: ao sair do do/while, a mdia da turma pode ser
calculada.
Linha 22: usa o system(cls) para limpar a tela e dar incio a
tela que ir apresentar os resultados.
Linha 24: printf para apresentar a mdia da turma.
Linhas 26 a 29: for para visitar cada posio do vetor que
armazena as notas dos alunos. Quando verifca que a nota do
aluno maior que a mdia da turma (armazenada na varivel
media), a matrcula do aluno apresentada.
A fgura 1.12 apresenta a tela de execuo do programa 1.4, na
fase do cadastramento dos dados dos alunos (matrcula e nota).
Figura 1.12: Tela de Execuo do Programa Completo 1.4 Cadastro de Alunos
A fgura 1.13 apresenta a tela de execuo do programa completo
1.4, na fase do apresentao dos resultados.
27
Programao 2
Figura 1.13: Tela de Execuo do Programa Completo 1.4 Apresentao dos Resultados
1.7 Tamanho de um vetor e segmentao de
memria
Na linguagem C, devemos ter cuidado com os limites de um vetor.
Embora na declarao tenhamos que defnir o tamanho de um vetor,
o C no faz nenhum teste de verifcao de acesso a um elemento
dentro do vetor ou no.
Por exemplo, se declaramos um vetor como int valor[5],
teoricamente, s tem sentido usarmos os elementos valor[0], valor[1],
valor[2] , valor[3] e valor[4]. Porm, o C no acusa erro se usarmos
valor[12] em algum lugar do programa. Estes testes de limite devem
ser feitos dentro do programa, pelo programador.
Este fato se deve maneira como o C trata os vetores. A memria
do computador um espao (fsico) particionado em pores de 1
byte. Se declararmos um vetor como int valor[3], estamos reservando
12 bytes (3 segmentos de 4 bytes lembrando que cada int ocupa
4 bytes) de memria para armazenar os seus elementos. O primeiro
segmento ser reservado para valor[0], o segundo segmento para
valor[1] e o terceiro segmento para valor[2]. O segmento inicial
chamado de segmento base, de modo que valor[0] ser localizado no
segmento base. Quando acessamos o elemento valor[i], o processador
acessa o segmento localizado em base+i. Se i for igual a 2, estamos
acessando o segmento base+2 ou valor[2] (o ltimo segmento
reservado para o vetor). Porm, se i for igual a 7, estamos acessando
o segmento base+7 que no foi reservado para os elementos do vetor
e que provavelmente est sendo usado por uma outra varivel ou
contm uma informao inesperada (lixo).
28
Programao 2
Observem que o acesso a um segmento fora do espao destinado
a um vetor pode destruir informaes reservadas de outras variveis.
Estes erros so difceis de detectar, pois o compilador no gera
nenhuma mensagem de erro. Por isso, a soluo mais adequada
sempre avaliar os limites de um vetor antes de manipul-lo. Como
feito no Programa Completo 1.2 que vai cadastrando os elementos no
vetor e para quando o vetor completa a sua capacidade.
A princpio, este fato poderia parecer um defeito da linguagem,
mas na verdade trata-se de um recurso muito poderoso do C. Poder
manipular sem restries todos os segmentos de memria uma
fexibilidade apreciada por programadores mais experientes.
1.8 Passando vetores como parmetros de
funes
Os vetores, assim como as variveis simples, podem ser usados
como argumentos de funes. Veremos como se declara uma funo
que recebe um vetor como parmetro e como se chama uma funo
passando um vetor como parmetro.
A sintaxe de uma funo que recebe um vetor como parmetro a
seguinte:
Sintaxe
tipo_retorno nome_funo(tipo_vetor nome_vetor[])
{
//corpo da funo
}
Onde:
tipo_retorno: o tipo de retorno da funo.
nome_funo: o nome da funo.
tipo_vetor: o tipo de dados dos elementos do vetor.
nome_vetor: o nome do vetor. Observe que depois do nome
do vetor temos o [ e o ], mas no colocamos nada entre eles.
Neste caso, no necessrio informar o tamanho do vetor.
Quando formos chamar uma funo que recebe um vetor como
29
Programao 2
parmetro, usamos a seguinte sintaxe:
Sintaxe
nome_da_funo(nome_do_vetor);
Onde:
nome_da_funo: o nome da funo que ser chamada.
nome_do_vetor: o nome do vetor que queremos passar
como parmetro. Neste caso, indicamos apenas o nome do
vetor, sem os colchetes.
O exemplo 1.6, a seguir, apresenta a declarao de uma funo
que tem um vetor como parmetro e a chamada da funo.
Exemplo 1.6:
declarao e chamada de uma funo que tem um vetor como parmetro
1
2
3
4
5
6
7
8
9
10

11
12
foat media(foat vetor[],foat N)
{
//corpo da funo
}
main()
{ foat valor[30]; // declarao do vetor
foat n;
...
med = media(valor, n); // passagem do vetor
para a funo
...
}
Ateno: Ao contrrio das variveis comuns, o contedo de um
vetor pode ser modifcado pela funo chamada. Isto signifca que
podemos passar um vetor para uma funo e alterar os valores de
seus elementos. Isto ocorre porque a passagem de vetores para
funes feita de modo especial dito passagem por endereo.
Portanto, devemos ter cuidado ao manipular os elementos de um
30
Programao 2
vetor dentro de uma funo para no modifc-los por descuido.
Atividades e Orientaes de Estudos
Vamos fazer um conjunto de exerccios, usando o assunto que
acabamos de aprender? Segue abaixo uma lista de exerccios em
que os dados sero armazenados em vetores. Vamos comear?
1. Ler um conjunto de nmeros e imprimi-los na ordem inversa da
leitura. A quantidade de nmeros tambm ser lida e ser no
mximo 10.
2. Ler o tamanho e os elementos de dois vetores e, em seguida,
caso os vetores tenham o mesmo tamanho, gere e imprima o
vetor SOMA, onde seus elementos sero formados pela soma
dos elementos de mesmos ndices dos dois vetores lidos.
Exemplo:
A 1 4 7 2 9
0 1 2 3 4
B 3 5 11 4 8
0 1 2 3 4
Soma 4 9 18 6 17
0 1 2 3 4
3. Ler um vetor de nmeros e imprimir os valores armazenados
nas posies PARES e, em seguida, os valores armazenados
nas posies MPARES. Exemplo:
V 1 4 7 2 9
0 1 2 3 4
Valores nas posies pares: 1 7 9
31
Programao 2
Valores nas posies impares: 4 2
4. Ler dois vetores e caso tenham tamanhos iguais, armazene seus
elementos alternadamente em um terceiro vetor. Exemplo:
A 1 4 7 2 12
0 1 2 3 4
B 3 5 11 4 15
0 1 2 3 4
Resultante 1 3 4 5 7 11 2 4 12 15
0 1 2 3 4 5 6 7 8 9
5. Ler um vetor de nmeros inteiros e imprimir as posies do
maior e do menor elemento do vetor. Assuma que no existem
elementos repetidos no vetor. Exemplo:
V 14 13 7 22 9
0 1 2 3 4
O menor elemento se encontra na posio 2
O maior elemento se encontra na posio 3
6. Ler um vetor de nmeros e inverter a ordem dos elementos
desse vetor no prprio vetor. Exemplo:
Vetor antes de ser invertido:
V 14 13 7 22 9
0 1 2 3 4
Vetor depois de ser invertido:
32
Programao 2
V 9 22 7 13 14
0 1 2 3 4
7. Ler dois vetores de nmeros e gerar um terceiro vetor formado
pela INTERSECO dos dois vetores lidos. O resultado da
interseo de dois conjuntos : os elementos que fazem parte
dos dois conjuntos. Exemplo:
A 1 4 7 2 12
0 1 2 3 4
B 3 4 2 14 25
0 1 2 3 4
interseccao 4 2
0 1 2 3 4
8. Ler dois vetores de nmeros e gerar um terceiro vetor formado
pela DIFERENA dos dois vetores lidos. O resultado da
diferena de dois conjuntos : os elementos do conjunto A que
no fazem parte do conjunto B. Exemplo:
A 1 4 7 2 12
0 1 2 3 4
B 3 4 2 14 25
0 1 2 3 4
Diferenca 1 7 12
0 1 2 3 4
33
Programao 2
9. Ler dois vetores de nmeros e gerar um terceiro vetor formado
pela UNIO dos dois vetores lidos. O resultado da unio de dois
conjuntos : todos os elementos que fazem parte dos conjuntos
A e B. Exemplo:
A 1 4 7 2 12
0 1 2 3 4
B 3 4 2 14 25
0 1 2 3 4
Unio 1 4 7 2 12 3 14 25
0 1 2 3 4 5 6 7 8 9
10. Ler um vetor de nmeros e imprimir os nmeros que se repetem
nesse vetor. Exemplo:
V 1 4 7 1 2 1 4 25 3 7
0 1 2 3 4 5 6 7 8 9
Os nmeros que se repetem no vetor so: 1 4 7
Conhea Mais
Para ampliar nossos conhecimentos sobre os assuntos tratados
neste captulo, leiam o captulo que aborda armazenamento em
vetores, do livro:
SCHILDT, Herbert. C Completo e Total. So Paulo: Makron,
1996.
34
Programao 2
Vamos Revisar?
Vamos lembrar rapidinho o que foi visto neste captulo?
Leia o resumo a seguir, composto com os principais conceitos
apresentados.
Vetores: conhecidos como estruturas de dados homogneas, os
vetores so um conjunto de variveis que armazenam elementos
do mesmo tipo.
ndices: para acessar um elemento do vetor, precisamos indicar em
que posio do vetor est o elemento.
No momento da declarao dos vetores, precisamos indicar quantos
elementos sero armazenados no mesmo.
de responsabilidade do programador o acesso aos elementos do
vetor. Se o programa tentar acessar uma posio que no existe no
vetor, o compilador no indicar o erro.
Quando passamos um vetor como parmetro de uma funo, seus
valores podem ser alterados
35
Programao 2
Captulo 2 Armazenamento de
Dados em Registros
Vamos conversar sobre o assunto?
Neste captulo, vamos aprender mais uma forma de armazenamento
de dados, que so os registros. Nos registros podemos agrupar dados
de tipos diferentes. Por conta disto, os registros so chamados de
estruturas de dados heterogneas. Assim como os vetores, os registros
vo facilitar o gerenciamento dos dados dos nossos programas, que
esto cada vez maiores. Veremos, tambm, como unir os conceitos
de vetores e registros, trabalhando com vetor de registro. Leiam este
captulo com calma e ateno, uma vez que iremos utilizar registros
em muitas situaes nos nossos programas, certo?
2.1 O que so registros?
Ns j sabemos que um conjunto homogneo de dados composto
por variveis do mesmo tipo (vetores). Mas, e se tivermos um conjunto
em que os elementos no so do mesmo tipo? Teremos, ento, um
conjunto heterogneo de dados, que so chamados de registros.
O registro uma das principais formas de estruturar os dados no
programa. O conceito de registro visa facilitar o agrupamento de
variveis de tipos diferentes, mas que possuem uma relao lgica.
Um registro um conjunto de uma ou mais variveis, que podem
ser de tipos diferentes, agrupadas sobre um nico nome. O fato de
variveis agrupadas em um registro poderem ser referenciadas por
um nico nome, facilita a manipulao dos dados armazenados nestas
estruturas. Como exemplo de um registro, imaginem uma estrutura que
armazene as diversas informaes do boletim de um aluno. O boletim
formado por um conjunto de informaes logicamente relacionadas,
porm de tipos diferentes, tais como: nmero de matrcula (inteiro),
nome do aluno (caractere), nome da disciplina (caractere), mdia (real)
e situao (caractere), que so subdivises do registro (elementos
de conjunto), tambm chamadas de campos. Logo, um registro
composto por campos que so partes que especifcam cada uma das
informaes. A fgura 2.1 apresenta o boletim de notas de um aluno.
36
Programao 2
Boletim de Notas
Matricula...: 12345
Nome........: Michel
Disciplina..: Matemtica
Mdia........: 10.0
Situao....: Aprovado
Figura 2.1 Boletim de Notas
Notem que, o boletim composto por informaes de diferentes
tipos. No entanto, todas as informaes do boletim esto relacionadas
ao mesmo aluno. O agrupamento de informaes de tipos diferentes,
que tem uma relao lgica, facilitar a manipulao de dados.
Nas prximas sees, vamos aprender a declarar e manipular
registros.
2.2 Declarao de um Registro
Para declarar uma varivel, precisamos informar o seu tipo e dar
um nome mesma. Mas, um registro formado por vrias variveis
de tipos diferentes. Como iremos declarar um registro? Para declarar
um registro, necessrio informar quais variveis, e seus respectivos
tipos, fazem parte do registro. Dessa forma, precisamos declarar
cada campo do registro, agrupando-os em um novo tipo de dado.
A declarao de um registro passa por duas fases: defnio de um
novo tipo de dado e declarao do registro propriamente dito. Vamos
entender melhor isso tudo?
Primeiramente, precisamos defnir quais campos fazem parte
do registro e criar um novo tipo de dado para o nosso programa.
Precisamos criar um novo tipo de dado porque no conseguiramos
representar o tipo de informao que o registro armazena, utilizando
os tipos primitivos disponveis na linguagem: int, foat, char, etc. Uma
vez que o registro agrupa variveis de tipos de dados diferentes. Para
criar um novo tipo de dado, utilizamos a seguinte sintaxe:
37
Programao 2
Sintaxe
typedef struct { declarao das variveis;
} nome_do_tipo;
Onde:
typedef: indica que um novo tipo de dado ser defnido.
struct: indica que o tipo de dado que ser defnido um
registro, ou seja, um agrupamento de variveis de tipos de
dados diferentes.
declarao das variveis: so as variveis que fazem parte do
registro. Neste local, precisamos especifcar quais as variveis
iro compor o registro, alm do tipo das mesmas. As variveis
so colocadas entre chaves.
nome_do_tipo: dado um nome ao novo tipo de dado que
est sendo criado. S depois que o novo tipo de dado criado,
que o registro poder ser declarado.
Na sequncia, vamos ver a declarao de um registro. Assim como
toda varivel, ao declarar uma varivel que um registro, precisamos
dizer que tipo de dado o registro armazena. Neste caso, iremos dizer
que o registro do tipo de dado que acabamos de defnir no typedef.
A sintaxe a seguinte:
Sintaxe
nome_do_tipo nome_do_registro;
Onde:
nome_do_tipo: o nome do tipo de dado que defnimos
no nosso programa, formado pelo agrupamento de vrias
variveis.
nome_do_registro: o nome da varivel registro que est
sendo declarada. O nome de um registro segue as regras dos
identifcadores.
O exemplo 2.1 apresenta a declarao do registro do boletim do
aluno:
38
Programao 2
Exemplo 2.1: Defnio de tipo e declarao de registro
1
2

3
4
5
typedef struct { int matricula;
char nome[20], disciplina[20],
situao[10];
foat media;
} Tipo_Aluno;
Tipo_Aluno aluno;
Primeiramente, entre as linhas 1 e 4, foi defnido o conjunto de
variveis que fazem parte do registro. nesta parte que est sendo
defnido um novo tipo de dado.
Linha 1: com o typedef estamos informando que ser defnido
um novo tipo de dado. O struct indica que este tipo um
agrupamento de variveis de tipos diferentes, ou seja, um
registro. Colocamos o abre chaves e comeamos a declarar
as variveis que iro compor o registro. Comeamos com a
declarao da varivel inteira matricula. Se houvesse mais
variveis do tipo int, poderiam ser declaradas nesta mesma
linha.
Linha 2: declarao das variveis do tipo char: nome, disciplina
e situacao.
Linha 3: declarao da varivel media que do tipo foat.
Linha 4: Aps a declarao de todas as variveis que compe
o registro, podemos fechar a chaves e, em seguida, dar um
nome a esse tipo de agrupamento, que acabamos de defnir.
Neste caso, o tipo foi chamado de Tipo_Aluno. Ao defnirmos
um tipo de dado no nosso programa, signifca que: podemos
declarar variveis dos tipos de dados primitivos (int, foat, char,
etc), alm de variveis do tipo de dado que ns defnimos, neste
caso, Tipo_Aluno.
Linha 5: declarao de uma varivel chamada aluno, e o tipo
de dado que ela armazena Tipo_Aluno, ou seja, armazena:
matricula, nome, disciplina, situacao e media.
A fgura 2.2 mostra a representao grfca da varivel aluno, que
do tipo Tipo_Aluno.
39
Programao 2

matricula
nome
disciplina
situacao
media
aluno
Figura 2.2: Representao grfca do registro aluno
Notem que, a varivel aluno (que um registro) formada pelos
campos defnidos no Tipo_Aluno.
Como uma varivel registro formada por vrios campos,
precisamos utilizar uma forma diferenciada para informar qual campo
do registro ns estamos querendo acessar. Lembram dos vetores, que
precisvamos dizer qual elemento do vetor seria acessado? Com os
registros vai acontecer algo parecido. Mas isto, ns vamos aprender
na prxima seo.
2.3 Acessando os campos do registro
De acordo com a fgura 2.2, a varivel aluno um registro formado
por vrios campos. Para acessar um campo de um registro, devemos
usar a seguinte sintaxe:
Sintaxe
nome_do_registro.campo
Onde:
nome_do_registro: o nome da varivel registro que queremos
acessar.
Aps o nome_do_registro devemos colocar um ponto, que
ir separar o nome do registro, do campo que vem logo em
seguida.
campo: o campo do registro que ser acessado.
40
Programao 2
Pensem da seguinte forma: suponham que queremos acessar
o registro aluno, do exemplo 2.1. Ao acessarmos esta varivel, ela
possui vrios campos. Precisamos dizer qual deles ser acessado
no momento. A seguir, so apresentados exemplos de acesso aos
campos do registro aluno. Ao acessar um campo do registro, podemos
atribuir valores, como mostra o exemplo 2.2.
Exemplo 2.2: Acesso aos campos de um registro
1
2
3
4
aluno.matricula = 12345;
scanf(%f, &aluno.media);
gets(aluno.nome);
printf(Situacao do aluno: %s, aluno.situacao);
Na linha 1, estamos acessando o campo matricula do registro
aluno. Assim, colocamos o nome do registro, o ponto e o campo que
queremos acessar. Com acesso ao campo, fzemos uma atribuio
4
.
Na linha 2, estamos acessando o campo media do registro aluno.
Neste caso, ao invs de atribuir um valor ao campo de registro, estamos
fazendo uma leitura via teclado e armazenando o valor digitado no
campo media. Como o campo media do tipo foat, colocamos o %f
no scanf, indicando que ser lido um nmero real.
Na linha 3, temos o comando de leitura gets, responsvel por ler
variveis do tipo char. Neste gets, estamos fazendo uma leitura via
teclado e armazenando o valor digitado no campo nome do registro
aluno.
Na linha 4, temos um printf que apresenta a situao do aluno.
Para isso, acessamos o campo situacao do registro aluno.
Notem que, se tivermos vrios alunos em uma turma, precisaremos
de vrias variveis registro do tipo Tipo_Aluno, uma para cada
aluno. Para fazer isso de forma mais simplifcada, devemos juntar os
conceitos de vetores e registros e criar um vetor de registro. Vamos
aprender como faz isto?
2.4 Vetor de registro
Os vetores so formados por um conjunto de dados do mesmo
tipo. No captulo anterior, utilizamos vetores que armazenavam dados
Saiba Mais
4
O ponto que
aparece neste
comando, deve
ser lido como
campo. Assim,
a leitura do
comando da linha
1 seria: aluno no
campo matricula
recebe 12345.
41
Programao 2
de tipos primitivos, ou seja, tipos disponveis na linguagem int,
foat, char, etc. Veremos que podemos utilizar como elemento do vetor
no apenas um tipo primitivo, mas tambm os tipos construdos (tipos
defnido pelo programador), neste caso, os registros. Imaginem que
queremos armazenar os boletins dos 50 alunos de uma turma. Para
isso, ser necessrio um registro diferente para cada aluno. Para
agrupar todos estes registros, iremos defnir um vetor de registro.
Como possumos 50 alunos, podemos criar um vetor no qual cada
posio, armazena um Tipo_Aluno.
Para declarar um vetor de registro, precisamos antes defnir os
elementos do registro, utilizando o typedef struct, e assim, defnir um
novo tipo de dado que ser utilizado no programa. Aps defnirmos o
novo tipo de dado, o vetor poder ser declarado. Para declararmos
um vetor, precisamos informar o tipo de dado que o vetor armazena,
damos um nome ao vetor e informamos, entre colchetes, o tamanho
do vetor. O exemplo 2.3 apresenta a declarao do vetor de registro
alunos:
Exemplo 2.3: defnio do registro e declarao do vetor de registro
1
2

3
4
5
typedef struct { int matricula;
char nome[20], disciplina[20],
situao[10];
foat media;
}Tipo_Aluno;
Tipo_Aluno alunos[50];
Neste exemplo, cada uma das 50 posies do vetor alunos ir
armazenar todos os dados que compe o Tipo_Aluno, ou seja:
matricula, nome, disciplina, situacao e media. A fgura 2.3, a seguir,
representa o vetor de registro declarado no exemplo.
alunos
matricula
nome
disciplina
media
situacao
matricula
nome
disciplina
media
situacao
matricula
nome
disciplina
media
situacao
matricula
nome
disciplina
media
situacao
0 1 ... 48 49
Figura 2.3: Representao grfca do vetor de registro aluno
42
Programao 2
Se apenas com os vetores, j havamos adquirido uma facilidade
na declarao e manipulao de um grande conjunto de variveis,
com os vetores de registros, esta facilidade ser aumentada.
Vamos aprender, na prxima seo, como acessamos um campo
de um vetor de registro.
2.5 Acessando os campos do vetor de
registro
Quando precisamos acessar um elemento do vetor, informamos,
entre colchetes, o ndice do elemento do vetor que ser acessado.
Quando queremos acessar um campo do registro, informamos o
nome da varivel registro, colocamos um ponto e o nome do campo
que queremos acessar. J no caso de um vetor de registro, temos
que usar a seguinte sintaxe:
Sintaxe
nome_do_vetor[indice].campo
Onde:
nome_do_vetor: nome do vetor que queremos acessar.
[ndice]: ndice do vetor que ser acessado.
.campo: campo do registro que ser acessado.
O exemplo 2.4 apresenta acessos a campos do vetor de registro
alunos.
Exemplo 2.4: Acesso aos elementos de um vetor de registro
1
2
3
4
alunos[2].media = 7.5;
alunos[3].matricula = 12345;
gets(alunos[0].nome);
scanf(%d,&alunos[2].matricula);
Na linha 1, acessamos o elemento de ndice 2 do vetor alunos e
atribumos 7.5 ao campo media. Na linha 2, acessamos o elemento
de ndice 3 do vetor alunos e atribumos 12345 ao campo matricula.
Nas linhas 3 e 4, temos acessos atravs de comandos de entrada
43
Programao 2
de dados. Na linha 3, temos um gets, que obtm o nome do aluno, via
teclado, e armazena no ndice 0 do vetor alunos, no campo nome. Na
linha 4, temos o scanf que l a matrcula do aluno, armazenando no
ndice 2 do vetor alunos, no campo matricula.
2.6 Usando vetor de registro
Vamos fazer um programa completo usando vetor de registro?
Este programa ser um pouco maior do que os outros programas que
j fzemos, e apresentar uma gama de coisas novas. Alm do uso
de vetor de registro, aprenderemos a mostrar os dados do vetor de
registro em forma de tabela. Vamos comear?
Primeiramente, vamos ler e entender o enunciado do Programa
Completo 2.1: Faa um programa que cadastre e apresente os
dados dos alunos de uma escola. Os dados dos alunos devem
ser armazenados em um vetor de registro, com a capacidade de
armazenar at 20 alunos. A quantidade de alunos que ser cadastrada
desconhecida. No momento do cadastro sero informados os
seguintes dados para cada aluno: matrcula, nome, srie(1-4) e se
tem irmo na escola (1-sim/0-nao). O programa ir calcular o valor
da mensalidade do aluno, que depende da srie do aluno e se o
mesmo tem irmo na escola. Valor da Mensalidade: 1 Serie: R$110,
2 Serie: R$130, 3 Serie: R$160, 4 Serie: R$170. O aluno que tiver
irmo na escola, receber 20% de desconto no valor da mensalidade.
Quando o usurio decidir que no deseja mais cadastrar, o programa
apresentar os dados de todos os alunos, em forma de tabela. Para
facilitar o entendimento deste enunciado, vejam os exemplos das telas
que so apresentadas durante a execuo do programa:
Colgio Legal
Cadastro de Aluno
Matricula..:
Nome.......:
Serie(1-4):
Irmao na escola (1-sim/0-nao):
Cadastrar outro aluno (1-sim/0-nao)?
44
Programao 2
Colgio Legal
Relatrio Geral
Matricula Nome Serie Irmao Mensalidade
xx xxxxx x x xx.xx
xx xxxxx x x xx.xx
xx xxxxx x x xx.xx
xx xxxxx x x xx.xx
xx xxxxx x x xx.xx
Tecle enter para sair...
Figura 2.4:Exemplos de telas do programa completo 2.1
A primeira tela representa a operao de cadastramento dos
dados dos alunos. Nesta tela, que sero fornecidos os dados para o
cadastramento dos alunos. Como a mensalidade um dado calculado
pelo programa, o usurio no fornecer este dado no momento do
cadastro.
A segunda tela representa a apresentao dos dados de todos
os alunos, em forma de tabela (listagem ou relatrio). Cada linha da
tabela apresentar os dados de um aluno.
Como precisamos armazenar os vrios dados de cada um dos
alunos da escola, se faz necessrio o uso de um vetor de registro.
Segue o cdigo do programa completo 2.1, que ser comentado
posteriormente.
45
Programao 2
Programa Completo 2.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

22
23
#include <stdio.h>
main()
{ typedef struct{ int mat, serie, irmao;
char nome[20];
foat mens;
} Tipo_Aluno;
Tipo_Aluno alunos[20];
int qa, i, resp;
qa =0;
do
{ system(cls);
printf(Colegio Legal\n);
printf(\n\nCadastro de Alunos\n\n);
printf(\nMatricula.: );
scanf(%d,&alunos[qa].mat);
printf(\nNome......: );
ffush(stdin);
gets(alunos[qa].nome);
printf(\nSerie(1-4): );
scanf(%d,&alunos[qa].serie);
printf(\nIrmao na escola(1-sim/0-nao):
);
scanf(%d,&alunos[qa].irmao);
switch(alunos[qa].serie)
24
25
26
27
28
{ case 1: alunos[qa].mens = 110; break;
case 2: alunos[qa].mens = 130; break;
case 3: alunos[qa].mens = 160; break;
case 4: alunos[qa].mens = 170; break;
}
46
Programao 2
29
30
31
32

33
34
35
36
37
38
39

40
41
42


43
44
45
46
if (alunos[qa].irmao == 1)
alunos[qa].mens = alunos[qa].mens*0.8;
qa++;
printf(\n\nDeseja cadastrar outro aluno(1-
sim/0-nao)? );
scanf(%d,&resp);
}while ((resp == 1) && (qa <20));
system(cls);
printf(Colegio Legal\n);
printf(\n\nRelatorio Geral\n);
printf(\n________________________________);
printf(\nMatricula Nome Serie Irmao
Mensalidade);
printf(\n________________________________);
for(i = 0; i < qa; i++)
printf(\n%9d %-20s %5d %5d %11.2f,
alunos[i].mat, alunos[i].nome, alunos[i].serie,
alunos[i].irmao, alunos[i].mens);
printf(\n_______________________________);
printf(\nTecle enter para sair...);
getche();
}
Comentrios sobre o Programa Completo 2.1
Linha 1: incluso da biblioteca stdio.h devido o uso do comando
ffush.
Linha 2: incio do programa principal.
Linhas 3 a 6: defnio de um novo tipo de dado, que ser
chamado de Tipo_Aluno. O Tipo_Aluno formado pelos dados
dos alunos: mat (matrcula), nome, serie, irmao (indica se tem
irmo na escola) e mens (mensalidade).
Linha 7: declarao do vetor de registro alunos, com capacidade
de armazenar 20 elementos do Tipo_Aluno.
47
Programao 2
Linha 8: declarao das variveis qa (que ir controlar a
quantidade de alunos cadastrados no vetor), i (utilizada como
varivel de controle do for) e resp (utilizada para saber se o
usurio deseja continuar cadastrando novos alunos).
Linha 9: inicializao da varivel qa com 0;
Linhas 10 a 34: repetio do tipo do/while que ir controlar
o cadastro dos dados dos alunos no vetor de registro. Este
do/while ir parar a sua execuo se o vetor fcar cheio (20
elementos) ou se o usurio no quiser mais cadastrar.
Linha 11: Cada vez que o do/while executado, queremos que
a tela seja limpa. Para isso, usamos o system(cls). Esta linha
tem, tambm, o abre chaves que indica o incio da sequncia
de comandos do do/while.
Linhas 12 e 13: printf para indicar o nome do colgio (Colgio
Legal) e para indicar o que est sendo feito nesta tela (Cadastro
de Alunos).
Linhas 14 e 15: printf informando que o usurio deve digitar
a matrcula do aluno e scanf que obtm a matrcula do aluno,
armazenado-a no vetor de registro alunos, na posio qa e no
campo mat. Notem que a varivel qa iniciou com 0. Na primeira
vez que o do/while for executado, os dados dos alunos sero
armazenados na posio 0 do vetor. A cada vez que a repetio
executada, a varivel qa incrementada de uma unidade.
Assim, os dados de cada aluno sero armazenados em uma
posio, diferente, no vetor de registro.
Linhas 16 a 18: printf informando que o usurio deve digitar o
nome do aluno. ffush para limpar o buffer e, em seguida, o gets
responsvel por ler o nome do aluno, armazenando no vetor de
registro alunos, na posio qa e no campo nome.
Linhas 19 e 20: printf informando que o usurio deve digitar a
srie do aluno (que pode ser de 1 a 4). scanf responsvel por
ler a srie do aluno, armazenando no vetor de registro alunos,
na posio qa e no campo serie.
Linhas 21 e 22: printf informando que o usurio deve digitar se
o aluno tem irmo na escola (digitar 1 se tiver irmo e 0 se no
tiver irmo na escola). scanf responsvel por ler se o aluno tem
irmo na escola, armazenando no vetor de registro alunos, na
48
Programao 2
posio qa e no campo irmao.
Linhas 23 a 28: depois de obter todos os dados de um aluno,
o programa vai calcular o valor da mensalidade do aluno,
verifcando a srie e se tem irmo na escola. Como cada uma
das sries da escola tem um valor diferente de mensalidade,
este switch serve para verifcar em que srie o aluno est
matriculado, para atribuir ao campo mens do registro do aluno,
o valor da mensalidade correspondente a sua srie.
Linhas 29 e 30: if para verifcar se o aluno tem irmo na escola.
De acordo com o enunciado, os alunos que tem irmo na escola,
recebem uma desconto de 20% na sua mensalidade. Como o if
s tem um comando, no foi necessrio o uso de chaves.
Linha 31: neste momento, todo o registro do aluno j foi
preenchido. Com isso, fazemos o incremento da varivel qa,
informando que mais um aluno acabou de ser cadastrado.
Linhas 32 e 33: printf que pergunta se o usurio deseja
continuar cadastrando novos alunos. scanf para ler a resposta
do usurio (1 se ele deseja continuar cadastrando e 0 se deseja
parar).
Linha 34: fechamento do do/while com a condio que faz a
repetio parar. Como mencionado anteriormente, este do/
while fca em execuo enquanto tem posies disponveis no
vetor ou enquanto o usurio desejar. Nesta linha, termina a fase
de cadastramento dos dados dos alunos no vetor de registro.
Linhas 35 a 47: Esta sequncia de comando serve para
apresentar os dados dos alunos que foram armazenados
no vetor de registro. Por uma questo de organizao, estes
dados sero apresentados na forma de tabela. Assim, cada
linha da tabela corresponder aos dados de um aluno, ou
seja, uma posio do vetor de registro. Para que a tabela fque
alinhada, precisamos saber que: a tela tem 80 colunas por 25
linhas. Dessa forma, temos que distribuir as informaes de um
jeito que no extrapole as 80 colunas da tela. Para entender
melhor esta parte do programa, acompanhem os comandos,
observando a fgura 2.9 (tela de execuo do programa).
Linha 35: limpa a tela para darmos incio apresentao dos
dados de todos os alunos.
49
Programao 2
Linhas 36 e 37: printf para informar o nome do colgio e para
informar o que esta tela faz (Relatrio Geral).
Linha 38: printf para passar uma linha na tela. Esta linha vai
delimitar o cabealho da tabela.
Linha 39: printf que imprime os ttulos de cada coluna da tabela.
A tabela ser composta pelas seguintes colunas: Matricula,
Nome, Serie, Irmao e Mensalidade. Os ttulos que devemos
dar as colunas da tabela so sempre indicados nos enunciados
das questes, certo? Sigam esta dica, porque vocs esto
comeando a aprender a fazer tabelas agora. Este printf cheio
de detalhes, mas vamos ver isso agora, observando a fgura
2.5. O resultado deste printf a linha que est indicada com a
seta.
Figura 2.5: Apresentao dos dados em forma de tabela
Vamos ver quais so os passos para montar o printf da linha 39
(cabealhos/ttulos das colunas da tabela).
Para cada coluna da tabela, verifquem quantas letras tem
no seu cabealho. Por exemplo, a palavra matrcula, tem 9
letras. Vejam que, na fgura 2.5, tem a indicao de quantas
letras tem em cada um dos cabealhos. A quantidade de
letras que tiver o cabealho, ser a largura da coluna.
Agora, precisamos verifcar se os dados dos alunos vo
extrapolar a largura de cada uma das colunas da tabela.
Vamos ver uma por uma:
Matricula: a coluna que ser utilizada para apresentar
a matrcula, tem uma largura de 9 espaos (quantidade
de letras da palavra matrcula). Vamos considerar que
nossas matrculas tem sempre menos que 9 dgitos.
50
Programao 2
Assim, a largura de 9 espaos para esta coluna,
sufciente.
Nome: a palavra nome s tem 4 letras. Vejam que o
nome do aluno foi declarado com 20 letras. Assim, se
deixarmos a coluna Nome, com largura 4, no ser
sufciente para apresentar os nomes dos alunos.
Quando a quantidade de letras do cabealho menor
que o contedo que vem na coluna da tabela, devemos
completar a coluna com espaos em branco at fazer
com que a coluna tenha a largura que precisamos.
Srie: tem 5 letras. A srie do aluno varia entre 1 e 4,
dessa forma, a largura da coluna Serie (5 espaos),
ser sufciente para apresentar o dado.
Irmo: tambm tem 5 letras. A varivel que armazena
se o aluno tem ou no irmo na escola, varia entre 0 e
1, dessa forma, a largura da coluna Irmao (5 espaos),
ser sufciente para apresentar o dado.
Mensalidade: tem 11 letras. Esta largura sufciente
para apresentar o valor da mensalidade do aluno.
Agora que j sabemos que apenas a coluna Nome no tem
largura sufciente para apresentar os nomes dos alunos,
vamos ver quantos espaos em branco ns temos que
colocar depois da palavra Nome, para que esta coluna
tenha a largura que precisamos. Se o nome do aluno tem
at 20 letras e a palavra Nome tem apenas 4 letras, faremos
a seguinte conta: 20 4 = 16. Assim, depois da palavra
Nome, temos que colocar 16 espaos em branco, para que
a nossa coluna passe a ter a largura que precisamos (20).
Por fm, temos que defnir um espaamento para separar
uma coluna da outra. Nos nossos exemplos, vamos usar
sempre trs espaos separando uma coluna da outra.
A padronizao do espaamento entre as colunas visa
facilitar a programao, j que estamos vendo este assunto
agora e o mesmo cheio de detalhes.
Agora vamos montar o printf, vejam a fgura 2.6. Ns
vamos colocando os ttulos das colunas da tabela, e entre
cada palavra, vamos colocando trs espaos em branco,
51
Programao 2
que foi o espaamento defnido para separar as colunas.
S no caso da coluna nome, que depois que colocamos
Nome, devemos dar os 16 espaos em branco para que ela
passe a ser uma coluna de largura 20. Mas ainda teramos
que dar mais 3 espaos em branco, que para separar a
coluna nome, da coluna serie.
Figura 2.6: Detalhamento do printf da linha 39
O printf est pronto! A primeira vista, parece complicado,
mas depois vocs estaro fazendo a tabela bem rpido.
Linha 40: printf para passar uma linha na tela. Esta linha vai
delimitar o cabealho da tabela.
Linha 41: for para visitar cada uma das posies do vetor e
apresentar os dados dos alunos. A varivel de controle do for,
o i, vai variar de 0 at a ultima posio ocupada do vetor. A
varivel que tem esta informao o qa.
Linha 42: este printf que vai fazer a montagem das linhas
da tabela, apresentado os dados dos alunos que esto
armazenados no vetor de registro. Este printf tambm tem
macetes, pois est relacionado com o printf da linha 39. Vamos
l! Lembram que fzemos a contagem para saber a largura
de cada coluna da tabela? Vamos precisar desta informao
agora.
Na primeira parte do printf, temos a string de controle
(a fgura 2.7 faz o detalhamento dessa parte do printf).
Sabemos que as colunas da tabela so: matricula( nmero
inteiro e esta coluna deve ter largura 9), nome (vetor de
caracteres com at 20 letras), serie (nmero inteiro e esta
coluna tem largura 5), irmo (nmero inteiro e esta coluna
tem largura 5) e mensalidade (nmero real e esta coluna
tem largura 11). Alm disso, sabemos que entre cada
coluna, ns colocamos trs espaos em branco. Com estas
informaes, vamos montar a string de controle do printf da
52
Programao 2
linha 42.
Figura 2.7: Detalhamento do printf da linha 42
Entre o % e a letra que indica o que vai ser impresso (%d,
%s ou %f), devemos colocar a largura da coluna. A primeira
coluna da tabela a da matricula, que um nmero inteiro
e que tem largura 9. Por isso, temos o %9d. Aps cada
uma das formataes, colocamos trs espaos em branco,
j que foi o espaamento defnido entre as colunas da
tabela. No caso da varivel caractere nome do aluno (que
a segunda coluna da tabela) colocamos %-20s (o
para que o nome do aluno seja alinhado pela esquerda).
Nas demais formataes no precisamos colocar o -, s
utilizamos em campos caractere.
Aps a string de controle, colocamos as variveis que sero
apresentadas na tela, na ordem em que as colunas foram
defnidas.
Linha 43: printf para passar uma linha na tela. Esta linha vai
fechar a tabela.
Linha 44: printf que informa que o usurio deve teclar enter
para sair.
Linha 45: getche() que evita que a tela de execuo feche
antes de vermos os resultados.
Linha 46: fecha chaves do programa principal.
A fgura 2.8 apresenta a tela de execuo do programa 2.1, na
fase do cadastramento dos alunos.
53
Programao 2
Figura 2.8: Tela de execuo do programa completo 2.1 - Cadastro
A fgura 2.9 apresenta a tela de execuo do programa 2.1, na
fase do apresentao dos dados de todos os alunos cadastrados, em
forma de tabela.
Figura 2.9: Tela de execuo do programa completo 2.1 Relatrio Geral
Viram como esta questo cheia de detalhes? Mas no se
assustem, a explicao precisava ser minuciosa, para que cada linha
do programa fosse entendida. Agora precisamos treinar esse tipo de
questo. No percam tempo!
Atividades e Orientaes de Estudos
Vamos resolver mais uma lista de exerccios? Esta lista composta
por questes em que se faz necessrio o uso de vetor de registro.
DICA: sempre coloque as tabelas com os mesmos cabealhos
propostos nos enunciados (exemplos de telas). Mos a obra!
1. Uma empresa de turismo deseja um programa que calcule o
valor das viagens dos clientes. Sero informados os seguintes
54
Programao 2
dados: cdigo do cliente, nome, roteiro desejado(1-Brasil,
2-EUA, 3-frica), tipo de quarto (1-Standard, 2-Luxo), Se deseja
alugar carro(1-sim/0-nao) e a quantidade de dias. A quantidade
de clientes desconhecida. O programa ir calcular o total da
viagem usando os valores da tabela abaixo, que variam de
acordo com o roteiro escolhido. A diria do quarto de luxo
R$30 mais cara que o valor da diria em um quarto standard.
Exemplo: Se a pessoa escolher roteiro 2, em quarto de luxo, a
diria ir custar: 320 + 30 = R$ 350.
Roteiro Diria Hotel
Quarto Standard
Diria - Aluguel
de carro
1 R$ 170 R$ 50
2 R$ 350 R$ 60
3 R$ 370 R$ 75
Total da Viagem:
dias*diriahotel + dias*diariacarro(se o cliente for alugar carro)
Armazenar os dados em um vetor de registro. Imprimir os dados
em forma de tabela. Exemplo das telas:
Viagem Legal Turismo
Cadastro de Cliente
Codigo:
Nome:
Roteiro (1-Brasil, 2-EUA, 3-frica):
Tipo de Quarto (1- Standard, 2-Luxo):
Alugar Carro (1-sim/0-nao)?
Quantidade de Dias:
Inserir outro (1-sim,0-nao)?
Viagem Legal Turismo
Relatrio Geral
Cdigo Nome Roteiro Quarto Carro Dias Total
xx xxxxx x x x xx xx.xx
xx xxxxx x x x xx xx.xx
xx xxxxx x x x xx xx.xx
Tecle enter para sair...
55
Programao 2
2. Faa um programa para montar a folha de pagamento dos
empregados de uma empresa. Para cada empregado sero
lidos os seguintes dados: matricula, nome, cargo(1-Analista
de Sistemas/2- programador), sexo(1-mas/2-fem), anos de
experincia e quantidade de flhos. O programa ir calcular
para cada empregado o seu salrio. Sabe-se que:
Cargo Salrio Base
1 R$ 2500
2 R$ 1700
O salrio ser calculado da seguinte forma: Cada cargo tem
o salrio base. Alm do salrio base, o empregado recebe os
seguintes adicionais: R$ 50, para cada ano de experincia e R$
40 por cada flho. Portanto, um analista de sistemas com trs
anos de experincia e dois flhos ter o salrio = 2500 + 50*3 +
40*2 = R$ 2730.
Armazenar as informaes em um vetor de registros. Imprimir
o relatrio geral em forma de tabela contendo os dados de
cada empregado. A quantidade de empregados da empresa
desconhecida (declarar o vetor com capacidade de armazenar
20 funcionrios). Exemplos das telas:
Empresa Legal
Cadastro de Funcionario
Matricula:
Nome:
Cargo(1-Analista de Sistemas, 2- programador):
Sexo(1-mas/2-fem):
Anos de experincia:
Quantidade de flhos:
Cadastrar outro (1-sim/2-nao)?
56
Programao 2
Empresa Legal
Listagem Geral
Matricula Nome Cargo Sexo Anos Q. Filho Salrio
xx xxxxx x x xx x xxx.xx
xx xxxxx x x xx x xxx.xx
xx xxxxx x x xx x xxx.xx
xx xxxxx x x xx x xxx.xx
Tecle enter para sair...
3. Faa um programa para uma empresa de celular contendo as
seguintes operaes: cadastro de clientes e listagem geral.
Para cada cliente devemos armazenar: cdigo, nome, sexo
(1-feminimo/2-masculino), quantidade de ligaes, plano que
o cliente est associado (1-Dia/2-Noite/3-Fixo/4-Empresarial) e
Valor da conta. O programa ir calcular o valor da conta de cada
cliente. Sabe-se que, cada plano tem uma tarifa diferenciada,
segundo a tabela abaixo:
Plano Valor de 1 ligao
Dia 1.30
Noite 1.60
Fixo 1.25
Empresarial 1.10
Armazenar os dados em um vetor de registro. Aps o cadastro dos
clientes, apresentar a listagem com os dados de todos os clientes, em
forma de tabela. A quantidade de clientes desconhecida. Declare o
vetor com capacidade de receber at 50 clientes.
Exemplos das telas:
57
Programao 2
Ligue Mais
Cadastro de Cliente
Cdigo:
Nome:
Sexo(1-fem/2-mas):
Quantidade de Ligaes:
Plano(1-Dia/2-Noite/3-Fixo/4-Empresarial):
Cadastrar outro (1-sim/0-nao)?
Ligue Mais
Listagem Geral
Codigo Nome Sexo Quant. Lig. Plano Total
xx xxxxx x xx x xxx.xx
xx xxxxx x xx x xxx.xx
xx xxxxx x xx x xxx.xx
xx xxxxx x xx x xxx.xx
Tecle enter para sair...
4. Um professor quer um programa para o clculo da mdia dos
alunos de uma turma. Sero informadas a matrcula, nome (20
caracteres), e as trs notas dos alunos. O professor descarta
a menor nota do aluno e a media calculada com as duas
maiores notas. Calcular a mdia e apresentar os resultados em
forma de tabela, aps o cadastramento. Armazenar os dados em
um vetor de registro. A quantidade de alunos desconhecida,
declare o vetor com capacidade de receber at 20 alunos.
Exemplos das Telas:
Universidade Legal
Cadastro de aluno
Matricula:
Nome:
Nota 1:
Nota 2:
Nota 3:
Cadastraroutro (1-sim/0-nao)?
58
Programao 2
Universidade Legal
Relatrio Geral
Matricula Nota1 Nota2 Nota3 Media
x xxxxxxxxx x.x x.x x.x x.x
x xxxxxxxxx x.x x.x x.x x.x
x xxxxxxxxx x.x x.x x.x x.x
x xxxxxxxxx x.x x.x x.x x.x
Tecle enter para sair...
5. O MEC quer um programa para fazer um relatrio sobre os
plos de educao a distncia da UFRPE. Para cada plo so
informados os seguintes dados: cdigo do plo, cidade, total
de alunos, total de tutores, se possui laboratrio de informtica
(1-sim/0-no) e se possui laboratrio de cincias (1-sim/0-no).
O MEC quer saber quanto deve ser liberado de verba para cada
plo. O calculo ser feito da seguinte forma:
Por cada aluno so liberados: R$ 100
Por cada tutor so liberados: R$ 500
Se o plo tem no tem laboratrio de informtica so liberados:
R$ 20.000
Se o plo no tem laboratrio de cincias so liberados: R$
17.000
Ex: um plo com 150 alunos, com 15 tutores, que tem laboratrio
de informtica, mas no tem laboratrio de cincias: Verba = 100 x
150 + 500 x 15 + 17000 = 15000 + 7500 + 17000 = 39500.
Armazenar os dados dos plos em um vetor de registro. A
quantidade de plos desconhecida. Declarar o vetor com a
capacidade de armazenar at 20 plos. Aps o cadastros dos plos,
apresentar todos os dados dos plos em forma de tabela.
Exemplos das telas:
59
Programao 2
Ministrio da Educao
Cadastro de Polo
Codigo:
Cidade:
Quantidade de alunos:
Quantidade de tutores:
Tem lab. de informatica (1-sim/0-nao)?
Tem lab. de ciencias (1-sim/0-nao)?
Cadastrar outro plo (1-sim,0-nao)?
Ministrio da Educao
Listagem Geral
Codigo Cidade Alunos Tutores LI LC Verba Liberada
xx xxxxx xxx xxx x x xxxxx.xx
xx xxxxx xxx xxx x x xxxxx.xx
xx xxxxx xxx xxx x x xxxxx.xx
xx xxxxx xxx xxx x x xxxxx.xx
Tecle enter para sair...
Conhea Mais
Vocs podero aprender mais sobre registros e vetores de registros
lendo os livros:
MONTGOMERY, Eduard. Programando em C: Simples e
Prtico. So Paulo: Alta Books, 2006.
SCHILDT, Herbert. C Completo e Total. So Paulo: Makron,
1996.
Vamos Revisar?
Nesta seo iremos revisar os principais tpicos vistos neste
60
Programao 2
captulo. Vale a pena dar uma lida para verifcar como est o nosso
aprendizado. Observem o resumo a seguir:
Os registros so um agrupamento de variveis de tipos diferentes,
mas que tem uma relao lgica.
Por ser formado por elementos de diferentes tipos, os registros so
chamados de estruturas de dados heterogneas.
Para declarar uma varivel registro, precisamos defnir um novo
tipo de dado para o programa, utilizando o typedef.
Cada elemento do registro chamado de campo.
Unindo os conceitos de vetores e de registros, temos os vetores
de registro que facilitam a declarao e o manuseio de grandes
volumes de dados.
61
Programao 2
Captulo 3 Armazenamento de
Dados em Arquivos
Vamos conversar sobre o assunto?
Neste captulo, vamos aprender a armazenar nossos dados de
forma defnitiva. At ento, ao terminar a execuo de um programa,
todos os dados que foram armazenados nas variveis eram perdidos.
Em muitas aplicaes isto no pode acontecer. Por exemplo, um
professor precisa ter certeza de que todo o trabalho para digitar
as notas dos alunos da turma no ser perdido quando ele fechar
o programa. Com os arquivos, poderemos armazenar os dados e
recuper-los quando necessrio. Este captulo abordar os comandos
que nos possibilitaro manipular dados armazenados em um arquivo.
Vamos comear?
3.1 O que so arquivos?
Os arquivos so estruturas de dados manipuladas fora do ambiente
do programa. Considera-se como ambiente do programa a memria
principal, onde nem sempre conveniente manter certas estruturas
de dados. De modo geral, os arquivos so armazenados na memria
secundria, como, por exemplo: disco rgido (HD), CD e pendrive.
3.1.1. Como os arquivos so organizados?
A linguagem C utiliza o conceito de fuxo de dados (stream) para
manipular os vrios tipos de dispositivos de armazenamento e seus
diferentes formatos. Os dados podem ser manipulados em dois
diferentes tipos de fuxos: fuxos de texto e fuxos binrios.
Um fuxo de texto (text stream) composto por uma sequncia
de caracteres, que pode ou no ser dividida em linhas, terminadas
por um caractere de fnal de linha. Um fuxo binrio (binary stream)
composto por uma sequncia de bytes, que so lidos, sem traduo,
diretamente do dispositivo externo. A Figura 3.1 ilustra estes dois tipos
de fuxos.
62
Programao 2
Figura 3.1: Fluxo de dados
No fuxo de texto, os dados so armazenados como caracteres
sem converso para a representao binria. Cada um dos caracteres
ocupa um byte. O nmero 12 ocupa dois bytes e o nmero 113 ocupa
3 bytes. Um caractere em branco foi inserido entre cada um dos
nmeros para separ-los, de modo que a funo de entrada e sada
possa descobrir que so dois nmeros inteiros (12 e 113) e no o
nmero 12113. No fuxo binrio, cada nmero inteiro ocupa 32 bits (4
bytes) e armazenado na forma binria. Observem que, em arquivos
binrios, no h necessidade de separar os nmeros j que eles
sempre ocupam 32 bits.
Os arquivos binrios so utilizados quando queremos armazenar
registros completos. Com estes arquivos, poderemos acessar
qualquer registro de forma mais rpida. No caso dos arquivos texto,
quando queremos encontrar alguma informao, temos que fazer uma
varredura sequencial no arquivo, tornando a busca pouco efciente.
Neste captulo, ser dada nfase ao armazenamento de dados
em arquivos binrios. Nas prximas sees, iremos conhecer os
comandos para manipular este tipo de arquivo.
3.1.2 Ponteiros
Antes de comearmos a conhecer os comandos de manipulao
de arquivos binrios, vamos ver um conceito que ser utilizado
neste captulo, que : ponteiro. Um ponteiro um tipo de varivel
que armazena um endereo de memria. Ns j vimos variveis que
armazenam nmeros inteiros, nmeros reais e caracteres. Ao trabalhar
com arquivos, precisamos saber em qual endereo de memria o
arquivo est armazenado. O endereo de memria onde o arquivo
63
Programao 2
est armazenado ser colocado em uma varivel que armazena
endereo de memria (ponteiro).
Para declarar uma varivel que capaz de armazenar um endereo
de memria, usamos a seguinte sintaxe:
Sintaxe
tipo *nome_do_ponteiro;
Onde:
tipo: tipo de varivel que o ponteiro armazena endereo.
Podemos dizer que nosso ponteiro armazena o endereo de
uma varivel inteira, real, caractere, etc. Para este captulo,
estaremos utilizando um ponteiro que vai armazenar o endereo
de um arquivo.
*: o asterisco na frente do nome de uma varivel simboliza que
a varivel que est sendo declarada um ponteiro.
nome_do_ponteiro: daremos um nome nossa varivel que
armazena endereos.
O exemplo 3.1 apresenta exemplos de declaraes de ponteiros
que armazenam endereos de memria de arquivos.
Exemplo 3.1: Declarao de ponteiros para arquivos
1
2
FILE *p aluno;
FILE *p produto;
Na linha 1, temos a declarao do ponteiro paluno, que ir
armazenar o endereo de um arquivo (FILE). Devemos colocar o
FILE em maisculo. Na linha 2, temos a declarao de outro ponteiro,
pproduto, que armazena o endereo de um FILE.
Quando queremos inicializar uma varivel real ou inteira, atribumos
zero s mesmas. Quando precisarmos inicializar um ponteiro,
devemos atribuir: NULL. Quando um ponteiro armazena NULL, quer
dizer que ele no est armazenando um endereo no momento.
Tenham calma, daqui a pouco o conceito de ponteiros fcar mais
claro. Vamos comear a conhecer os comandos de manipulao de
arquivos binrios e entenderemos melhor onde o conceito de ponteiro
ser aplicado.
64
Programao 2
3.2 Comandos para manipular arquivos
binrios
Como j mencionado, os arquivos binrios so utilizados quando
queremos armazenar registros. como se tivssemos um vetor de
registro, s que os dados no so perdidos ao terminar a execuo do
programa. A fgura 3.2 mostra a representao grfca de um arquivo
binrio.
Figura 3.2: Representao grfca de um arquivo binrio
O arquivo binrio formado por um conjunto de registros,
armazenados um aps o outro. As operaes realizadas em um
arquivo binrio dependero do local onde se encontrar o leitor. Pense
no leitor como se fosse a agulha de uma vitrola (Figura 3.3). Para
tocar uma msica, a agulha passa sobre o disco, fazendo a leitura da
msica. Dependendo de onde a agulha seja posicionada, tocada
uma msica do disco.
Figura:3.3: Vitrola com agulha tocando uma msica
O leitor do arquivo passar sobre os registros, fazendo a leitura
dos mesmos. Ns podemos colocar o leitor sobre qualquer registro
e executar uma operao sobre o mesmo (leitura e/ou gravao). O
arquivo tem uma marcao indicando onde ele termina (end of fle).
Nas prximas sees, iremos detalhar os comandos para manipular
arquivos binrios. As operaes para a manipulao de arquivo esto
na biblioteca stdio.h. Com isso, ao trabalhar com arquivos, devemos
65
Programao 2
incluir esta biblioteca nos nossos programas.
3.2.1 Declarao de um ponteiro para arquivo
Na linguagem C, as funes que manipulam arquivos trabalham
com o conceito de ponteiros para arquivo. Com isso, teremos
uma varivel que armazenar o endereo de memria onde est
armazenado nosso arquivo. Ns vimos na seo 3.2.1 (exemplo 3.1),
como fazemos para declarar um ponteiro para um arquivo. Devemos
declarar um ponteiro para cada arquivo que formos manipular no
nosso programa.
3.2.2 Comando para abrir um arquivo
A maior parte das operaes sobre um arquivo (leitura, gravao,
etc) s pode ser executada com o arquivo aberto. O comando de
abertura do arquivo (fopen) apresenta a seguinte sintaxe:
Sintaxe
ponteiro_arquivo = fopen(nome_do_arquivo,
modo_de_abertura);
Onde:
ponteiro_arquivo: ao abrir um arquivo, a funo fopen retorna
o endereo de memria do arquivo. Por conta disso, devemos
atribuir o endereo de memria do arquivo, para um ponteiro.
Aps o arquivo ser aberto, usaremos este endereo de memria
para acess-lo.
nome_do_arquivo: determina qual arquivo dever ser aberto.
Neste espao colocado o nome do arquivo, da forma que
foi salvo no diretrio. O comando fopen procura o arquivo que
desejamos abrir, no mesmo diretrio onde est armazenado o
programa executvel.
modo_de_abertura: informa que tipo de uso voc vai fazer do
arquivo. O modo de abertura indica o que faremos no arquivo:
leitura, gravaes e alteraes. Alm disso, o modo de abertura
tambm vai indicar se queremos que um novo arquivo seja
criado. A tabela abaixo, apresenta os principais modos de
abertura.
66
Programao 2
Modo Signifcado
r+b Abre um arquivo binrio para leitura e escrita. O arquivo deve
existir antes de ser aberto. Dessa forma, este modo de abertura
s pode ser usado se o arquivo que estamos querendo abrir, j
existe no nosso computador.
w+b Cria um arquivo binrio para leitura e escrita. Se o arquivo no
existir, ele ser criado. Se j existir, o contedo anterior ser
destrudo. Este modo de abertura tem a capacidade de criar novos
arquivos. Mas, se solicitarmos que seja aberto um arquivo que j
existe, o contedo do arquivo ser apagado.
a+b Acrescenta dados ou cria um arquivo binrio para leitura e escrita.
Caso o arquivo j exista, novos dados podem ser adicionados,
apenas, no fnal do arquivo. Se o arquivo no existir, um novo
arquivo ser criado.
O exemplo 3.2, apresenta o uso do fopen.
Exemplo 3.2: Abertura de arquivo
1
2
3
4
5
FILE *paluno, *pprofessor;
paluno = fopen(alunos.bin, w+b);
pprofessor = fopen(professores.bin, r+b);
if (pprofessor == NULL)
printf(Arquivo de professores no existe);
Na linha 1, temos a declarao de dois ponteiros para armazenar
os endereos dos arquivos que iremos abrir logo em seguida.
Na linha 2, temos um fopen que ir abrir o arquivo alunos.bin,
utilizando o modo de abertura w+b. Caso o arquivo alunos.bin no
exista, ele ser criado (com o nome que passamos como parmetro).
Normalmente, usamos o modo de abertura w+b quando executamos
o nosso programa pela primeira vez. Neste momento, o arquivo ainda
no existe. Dessa forma, desejamos que o mesmo seja criado. Mas,
se o arquivo alunos.bin j existir, todo o seu contedo ser apagado.
E, como resultado, teremos o arquivo aberto, mas sem nenhum
registro armazenado. Ao abrir o arquivo, o endereo de memria do
arquivo ser armazenado no ponteiro paluno.
Na linha 3, temos um fopen que abrir o arquivo professores.
bin, utilizando o modo de abertura r+b. Este modo de abertura s
utilizado para arquivos que j existem, pois, diferente do modo de
abertura w+b, ele no tem a capacidade de criar um arquivo novo. Se
tentarmos abrir um arquivo que no existe, o fopen retornar NULL.
67
Programao 2
Para saber se um arquivo foi aberto corretamente, podemos fazer
um teste como mostra as linhas 4 e 5. Aps executar um fopen,
verifcamos se o ponteiro est com NULL. Caso afrmativo, porque a
abertura no foi executada corretamente.
Uma vez aberto, o arquivo fca disponvel para leituras e gravaes
atravs da utilizao de funes adequadas.
3.2.3 Comando para fechar um arquivo
Aps terminar de usar um arquivo, devemos fech-lo. Para isso,
usamos a funo fclose, que tem a seguinte sintaxe.
Sintaxe
fclose(ponteiro_arquivo);
Onde:
ponteiro_arquivo: o ponteiro que tem armazenado o
endereo de memria do arquivo que queremos fechar.
S podemos fechar arquivos que esto abertos. O exemplo 3.3,
apresenta o uso do comando fclose. Vamos utilizar os ponteiros
declarados no exemplo anterior.
Exemplo 3.3: Fechamento de arquivo
1
2
fclose(palunos);
fclose(pprofessores);
Na linha 1, fechamos o arquivo que est armazenado no endereo
de memria palunos (que o ponteiro que armazena o endereo do
arquivo). Ns s utilizamos o nome do arquivo (o nome que est salvo
no diretrio), no momento da abertura. Depois de aberto, s utilizamos
seu endereo de memria, certo?
3.2.4 Comando para ler um registro armazenado no arquivo
Vamos aprender a ler os dados de um registro armazenado no
arquivo? Neste comando, teremos vrios detalhes e devemos ter em
mente o seguinte:
A leitura feita a partir do ponto onde o leitor se encontra. Ao
abrir o arquivo, o leitor posicionado no incio do primeiro
68
Programao 2
registro, como mostra a fgura 3.2. medida que vamos
executando leituras, o leitor vai se deslocando. Dessa forma,
precisamos ter noo da posio onde o leitor se encontra.
Nos arquivos binrios, SEMPRE fazemos a leitura de um
registro completo, independente de quantos campos ele tenha.
Um arquivo deve armazenar registro do mesmo tipo. Se os
registros so do mesmo tipo, cada um deles ocupar o mesmo
espao de memria. Dessa forma, o leitor sempre se deslocar
em intervalos regulares. Vamos entender isto melhor, daqui a
pouco.
Vamos, primeiro, ver a sintaxe do comando de leitura:
Sintaxe
fread (&registro, numero_de_bytes, quantidade,
ponteiro_arquivo);
Onde:
&registro: o registro que armazenar os dados do registro
lido do arquivo. assim, ns pegamos um registro que est no
arquivo, e armazenamos no registro passado como parmetro.
numero_de_bytes: na verdade, o que o comando de leitura
faz informar que o leitor precisa se deslocar, fazendo a leitura
de uma certa quantidade de bytes. A quantidade de bytes que o
leitor deve se deslocar exatamente quantos bytes de memria
o registro ocupa. Por exemplo: se o nosso arquivo armazena
registros de alunos, composto pelos campos: matricula (int),
nota1 (foat), nota2 (foat) e media (foat). Sabe-se que um int
ocupa 4 bytes e um foat, tambm, ocupa 4 bytes. Dessa forma,
teremos: 4 bytes para a matricula + 4 bytes para a nota1 + 4
bytes para a nota2 + 4 bytes para a media = 16 bytes. Assim,
esse registro ocupa 16 bytes (Figura 3.4). esse o nmero de
bytes que o leitor dever ler, para recuperar o registro de um
aluno, armazenado no arquivo. Existe uma funo chamada
sizeof que informa quantos bytes ocupa um tipo de dado.
Assim, no precisamos estar lembrados de quantos bytes um
int ocupa. Alm disso, no precisamos fazer as contas para
saber quantos bytes o nosso registro ocupa. Para utilizar a
funo sizeof, precisamos apenas, passar como parmetro
69
Programao 2
para a funo, que tipo de dado queremos saber quantos bytes
ele ocupa. Por exemplo: sizeof(int) ou sizeof(TAluno). No caso
de um registro, a funo vai fazer as contas de quantos bytes
cada um dos campos do registro ocupa, e retorna a soma.
4 bytes 4 bytes 4 bytes 4 bytes
matricula nota1 nota2 media
Figura 3.4: Campos do registro aluno
quantidade: neste terceiro parmetro, usaremos SEMPRE 1.
Este parmetro signifca quantas vezes a leitura ser executada.
Ns sempre queremos que seja feita a leitura de um registro
por vez. Por isso, sempre utilizaremos 1.
ponteiro_arquivo: precisamos informar em qual arquivo a
leitura ser feita. Com isso, passamos o endereo de memria
onde o arquivo que ser lido est armazenado. Assim, utilizamos
o ponteiro que tem o endereo do arquivo.
Agora vamos ver o exemplo 3.4, que apresenta a leitura de um
registro do arquivo. Para um melhor entendimento, foram feitas as
declaraes das variveis que sero usadas no fread.
Exemplo 3.4: Leitura de um registro do arquivo
1
2
3
4
5
6
7
8
typedef { int matricula;
foat nota1, nota2, media;
} TAluno
TAluno aluno;
FILE *paluno;
fread(&aluno, sizeof(TAluno), 1, paluno);
Nas linhas 1 a 3 temos a declarao de um novo tipo de dado,
que o agrupamento dos dados do aluno. Este tipo foi chamado de
TAluno. Na linha 5, temos a declarao da varivel aluno, que um
70
Programao 2
registro do tipo TAluno. Na linha 6 declaramos um ponteiro chamado
paluno, que armazena endereo de memria de arquivo.
Na linha 8 que temos o comando de leitura. Vamos interpretar
cada parte do comando. No primeiro parmetro, temos a varivel
registro que vai armazenar as informaes lidas do arquivo
5
. Assim, o
registro que for lido do arquivo, ser armazenado no registro aluno. No
segundo parmetro, precisamos dizer quantos bytes sero lidos. Se
iremos ler os dados do registro do aluno, precisamos saber quantos
bytes ele ocupa. Para isso, foi usada a funo sizeof. Como parmetro
do sizeof foi colocado TAluno, que um tipo criado no programa e que
queremos saber quantos bytes esse tipo de dado ocupa. No terceiro
parmetro, ns sempre usaremos 1. Finalmente, no quarto parmetro
informamos o endereo do arquivo em que ser feita a leitura. Neste
caso, o endereo do arquivo est armazenado no ponteiro paluno.
Aps a leitura de um registro do arquivo, o leitor estar posicionado
no incio do prximo registro. A Figura 3.5 apresenta a posio do
leitor antes e depois da execuo do fread.
Figura 3.5: Posio do leitor antes e aps a execuo de um fread
Agora que j sabemos como fazer para ler um registro que est
armazenado no arquivo, vamos aprender a gravar um registro no
arquivo.
Ateno
5
No esquecer
de colocar o & na
frente da varivel.
71
Programao 2
3.2.5 Comando para gravar um registro no arquivo
Para gravar um registro em um arquivo binrio, ns utilizamos
o comando fwrite. Este comando muito parecido com o fread.
A diferena que o fread l uma sequncia de bytes no arquivo, e
armazena em um registro (primeiro parmetro do fread). E o fwrite,
pega um registro, e armazena suas informaes no arquivo. Vamos
ver a sintaxe do fwrite:
Sintaxe
fwrite(&registro, numero_de_bytes, quantidade,
ponteiro_arquivo);
Onde:
&registro: o registro que ser armazenado no arquivo.
numero_de_bytes: a quantidade de bytes que sero
gravadas no arquivo. Neste parmetro, tambm usaremos o
sizeof.
quantidade: neste terceiro parmetro, tambm, usaremos
SEMPRE 1. Este parmetro signifca quantas vezes a gravao
ser executada. Ns sempre queremos que seja feita a
gravao de um registro por vez. Por isso, sempre utilizaremos
1.
ponteiro_arquivo: precisamos informar em qual arquivo a
gravao ser feita. Assim, utilizamos o ponteiro que tem o
endereo do arquivo.
Agora vamos ver o exemplo 3.5, que apresenta a gravao de um
registro no arquivo. Para um melhor entendimento, foram feitas as
declaraes das variveis que sero usadas no fwrite.
72
Programao 2
Exemplo 3.5: Leitura de um registro do arquivo
1
2
3
4
5
6
7
8
typedef { int matricula;
foat nota1, nota2, media;
} TAluno
TAluno aluno;
FILE *paluno;
fwrite(&aluno, sizeof(TAluno), 1, paluno);
Na linha 8 que temos o comando de gravao. Vamos interpretar
cada parte do comando. No primeiro parmetro, temos a varivel
registro que ser gravada no arquivo. No segundo parmetro,
precisamos dizer quantos bytes sero gravados. Para isso, foi usada
a funo sizeof. No terceiro parmetro, ns sempre usaremos 1.
Finalmente, no quarto parmetro informamos o endereo do arquivo
em que ser feita a gravao. Neste caso, o endereo do arquivo est
armazenado no ponteiro paluno.
Devemos lembrar que o comando de gravao no arquivo (fwrite)
executado na posio onde o leitor se encontra no momento. Se o
leitor estiver posicionado no incio de um registro e executarmos um
fwrite, o registro ser gravado sobre o outro. Dessa forma, quando
vamos inserir um novo registro no arquivo, devemos posicionar o leitor
num ponto do arquivo que no tenha nenhum registro armazenado,
ou seja, no fnal do arquivo. Vamos ver como faz isso?
3.2.6 Comando para posicionar o leitor em um ponto do
arquivo
As operaes de leitura e gravao so feitas na posio onde o
leitor se encontra no momento. Podemos mudar a posio do leitor,
colocando-o em um ponto especfco do arquivo. Este comando o
fseek. A sintaxe do fseek a seguinte:
Sintaxe
fseek(ponteiro_arquivo,numero_de_bytes, origem);
73
Programao 2
Onde:
ponteiro_arquivo: precisamos informar em qual arquivo o leitor
est sendo posicionado.
numero_de_bytes: a quantidade de bytes que o leitor ir se
deslocar pelo arquivo, at chegar no local desejado.
origem: determina a partir de onde os nmero_de_bytes de
deslocamento do leitor sero contados. Os possveis valores
so:
Origem Signifcado
SEEK_SET O deslocamento do leitor ser contado a partir do incio do
arquivo.
SEEK_CUR O deslocamento do leitor ser contado a partir da sua posio
corrente.
SEEK_END O deslocamento do leitor ser contado a partir do fnal do
arquivo.
O exemplo 3.6 apresenta o uso do comando fseek.
Exemplo 3.6: Comando fseek
1
2
fseek(paluno, 0,SEEK_END);
fseek(paluno, 2*sizeof(paluno), SEEK_SET);
No exemplo da linha 1, temos um fseek que ser muito utilizado
em nossos programas. Neste fseek solicitado que seja feito
o posicionamento do leitor do arquivo de endereo paluno. O
deslocamento do leitor ser feito iniciando a contagem a partir do
fm do arquivo (SEEK_END)
6
. O nmero de bytes que o leitor ir se
deslocar 0. Este tipo de fseek usado quando queremos gravar um
novo registro do nosso arquivo. Jogamos o leitor para o fm do arquivo
e no deslocamos nenhum byte. Com isso, temos a garantia que o
leitor no est sobre nenhum registro. Dessa forma, podemos gravar
um novo registro, sem perder registros que j haviam sido gravados
no nosso arquivo.
No fseek da linha 2, foi solicitado que o leitor seja posicionado no
incio do arquivo (SEEK_SET), antes do deslocamento ser efetivado.
Notem que, no segundo parmetro, foi passada uma expresso 2 * o
tamanho de um registro. Neste caso, signifca que o leitor ir deslocar
a quantidade de bytes ocupadas por 2 registros, com isso, ir se
posicionar no incio do terceiro registro.
Ateno
6
O parmetro
origem, deve ser
colocado todo em
letra maiscula.
74
Programao 2
A fgura 3.6 apresenta a posio do leitor aps a execuo dos
fseek do exemplo.
Figura 3.6: Posio do leitor aps a execuo dos fseek do exemplo 3.6
3.2.7 Comando para posicionar o leitor no incio do arquivo
Ns podemos posicionar o leitor no incio do arquivo, utilizando o
comando rewind. A sua sintaxe a seguinte:
Sintaxe
rewind(ponteiro_arquivo);
Onde:
ponteiro_arquivo: o ponteiro que tem o endereo do arquivo
que queremos posicionar o leitor.
O exemplo 3.7 apresenta o uso do comando rewind.
Exemplo 3.7: Uso do comando rewind
1 rewind(paluno);
O comando rewind utilizado quando precisamos fazer uma
varredura por todos os registros do arquivo. A varredura iniciada
colocando o leitor no incio do arquivo.
75
Programao 2
3.2.8 Comando para verifcar se chegou ao fnal do arquivo
Quando fazemos uma varredura no arquivo, no sabemos quantos
registros tem armazenados no mesmo. No entanto, precisamos saber
o momento de parar de executar a leitura dos registros. O comando
feof (end of fle) informa se o leitor chegou ao fnal do arquivo ou no.
A sintaxe do feof a seguinte:
Sintaxe
int feof(ponteiro_arquivo);
Onde:
int: o retorno da funo. A funo feof retorna um nmero
inteiro, que indica se o arquivo terminou ou no. Quando a
funo retorna zero, signifca que ainda no chegou no fnal do
arquivo. Qualquer valor diferente de zero, indica que chegou ao
fnal do arquivo.
ponteiro_arquivo: o ponteiro que tem o endereo do arquivo
que queremos verifcar se chegou ao fm.
O exemplo 3.8 apresenta o uso do comando feof.
Exemplo 3.8: uso do comando feof
1 while (feof(paluno)==0)
Normalmente, o feof usando como condio de um while, como
mostra o exemplo 3.8. Este while ser executado enquanto no
chegar no fnal do arquivo.
3.2.9 Comando para remover um arquivo
Quando desejamos apagar um arquivo do diretrio, podemos
utilizar o comando remove. Este comando s pode ser utilizado em
arquivos fechados. A sua sintaxe a seguinte:
Sintaxe
remove(nome_do_arquivo);
Onde:
nome_do_arquivo: o nome do arquivo que queremos apagar.
76
Programao 2
Neste caso, utilizado o nome do arquivo salvo no diretrio do
nosso computador.
O exemplo 3.9 apresenta o uso do comando remove.
Exemplo 3.9: uso do comando remove
1 remove(alunos.bin);
Neste exemplo, o arquivo alunos.bin ser removido do
computador.
3.2.10 Comando para renomear um arquivo
Ns podemos renomear um arquivo no diretrio do nosso
computador. Para isso, utilizamos o comando rename. Este comando,
tambm, s pode ser utilizado em arquivos fechados. A sua sintaxe
a seguinte:
Sintaxe
rename(nome_do_arquivo, novo_nome_do_arquivo);
Onde:
nome_do_arquivo: o nome do arquivo que queremos
renomear. Neste caso; utilizado o nome do arquivo salvo no
diretrio do nosso computador.
novo_nome_do_arquivo: o novo nome para o nosso
arquivo.
O exemplo 3.10 apresenta o uso do comando rename.
Exemplo 3.10: uso do comando rename
1 rename(alunos.bin, alunos_temp.bin);
Neste exemplo, o arquivo alunos.bin, ser renomeado para
alunos_temp.bin.
3.3 Implementao das operaes bsicas
em um arquivo
Agora a hora de fazermos o nosso programa completo, que
77
Programao 2
ir aplicar os comandos de manipulao de arquivo, descritos na
seo 3.2. Este programa ir gerenciar os dados dos alunos de uma
turma, que sero armazenados em um arquivo. O registro do aluno
composto pela matrcula, nome e mdia do aluno. O programa
implementar as seguintes operaes: cadastrar aluno, remover
aluno, consultar aluno por matrcula, alterar mdia do aluno e listagem
de todos os alunos.
Mais uma vez, teremos um programa cheio de detalhes, bem maior
do que os que fzemos at ento. Por isso, o programa completo 3.1
foi desenvolvido de forma modularizada. Para facilitar o entendimento
deste programa, que tem quase 200 linhas, o mesmo foi dividido em 8
partes. Vamos comear?
Na primeira parte do programa completo 3.1, teremos as
declaraes das variveis globais do programa. Alm, de mdulos
auxiliares, que sero utilizados ao longo do programa, por outros
mdulos.
Programa Completo 3.1- Parte 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
typedef struct{ int mat;
char nome[20];
foat med;
} TAluno;
FILE *paluno;
TAluno aluno_aux, aluno_nulo;
void linha()
{ int i;
for (i=1; i<=80; i++)
printf(_);
}
78
Programao 2
17
18
19

20
21
22
23
24
25
26
27
void cabec()
{ system(cls);
printf(Universidade Federal Rural de
Pernambuco\n);
linha();
}
void abre_arquivo()
{ paluno = fopen(aluno.dat, r+b);
if (paluno == NULL)
paluno = fopen(aluno.dat, w+b);
}
Comentrios sobre o Programa Completo 3.1, Parte 1:
Linha 1: incluso da biblioteca stdio.h devido o uso do comando
ffush e comandos de manipulao de arquivo.
Linhas 3 a 6: defnio de um novo tipo de dados TAluno,
que agrupa os dados de um aluno. O tipo TAluno composto
pela matrcula, nome e mdia do aluno.
Linha 8: declarao do ponteiro paluno, que armazenar o
endereo do arquivo com os registros dos alunos.
Linha 9: declarao de dois registros: aluno_aux e aluno_nulo.
O registro aluno_aux, ser utilizado quando precisamos ler
ou gravar um registro no arquivo. O registro aluno_nulo ser
utilizado no momento da remoo de um aluno do arquivo.
As variveis declaradas nas linhas 8 e 9 so globais, por isso,
podem ser acessadas por todos os mdulos do programa.
Linhas 11 a 15: temos o primeiro mdulo do nosso programa. O
mdulo linha tem como objetivo, passar uma linha na tela. Este
mdulo ser chamado pelos demais mdulos do programa.
Linhas 17 a 21: temos a sequncia de comandos do mdulo
cabec. O mdulo cabec faz o cabealho das tela. Ao iniciar uma
operao do programa (cadastro, remoo, etc), a tela deve ser
limpa e precisamos colocar o nome da universidade no topo
79
Programao 2
da tela. O mdulo cabec vai: limpar a tela, colocar o nome da
instituio e passar uma linha (fazendo uso do mdulo linha).
Linhas 23 a 27: temos a sequncia de comandos do mdulo
que responsvel por abrir o arquivo dos alunos, e deix-lo
disponvel para uso. Vamos entender a lgica deste mdulo?
Primeiramente, feita uma tentativa de abrir o arquivo dos
alunos alunos.dat com o modo de abertura r+b, no comando
fopen. Lembrem que o modo de abertura r+b s pode ser
utilizado quando o arquivo j existe. O processador vai procurar o
arquivo alunos.dat no diretrio. Se o arquivo no for encontrado,
o ponteiro paluno, fcar com NULL. Mas, se for encontrado, o
endereo de memria do arquivo ser armazenado no ponteiro
paluno. Na sequncia (linha 25), temos um if que testa o valor
do ponteiro paluno. Se o ponteiro paluno estiver com NULL,
signifca que o arquivo alunos.dat no existe ainda e precisa
ser criado. Se isso acontecer, o comando vinculado ao if
executado. Este comando um fopen, s que agora utiliza o
modo de abertura w+b, que deve ser utilizado para arquivos
que no existe. Mas, por que no abrimos o arquivo usando
logo o w+b? Vocs devem estar lembrados, que o modo de
abertura w+b apaga todos os registros de um arquivo quando
ele j existe. Assim, tentamos primeiro abrir o arquivo com r+b
(utilizado para arquivos que j existem e abre o arquivo sem
apagar os registros). Se der erro, porque o arquivo no existe.
Com isso, tentamos abrir com o modo de abertura w+b.
Vamos agora para a parte 2 do programa completo 3.1. Nesta
parte temos o mdulo inserir, que responsvel pelo cadastro dos
registros dos alunos no arquivo. Para fazer o cadastro de um registro
no arquivo binrio, devemos obter os dados do aluno, montando o
registro que iremos gravar no arquivo. Quando o registro estiver com
todas as informaes do aluno (mat, nome e media), o mesmo poder
ser gravado no fnal do arquivo.
Ateno
7
O nome do
arquivo que
ns passarmos
como parmetro
no fopen ser
utilizado para
salvar nosso
arquivo no
diretrio. Por
exemplo, aps
a execuo do
mdulo abre_
arquivo, teremos
um arquivo
chamado alunos.
dat no diretrio
onde est salvo
o programa
executvel. Por
conveno,
coloque os
arquivos de
dados sempre
com a extenso
dat ou bin.
80
Programao 2
Programa Completo 3.1- Parte 2
28
29
30
31
32
33
34
35
36
37
38
39
40

41

42

43
44
45
void inserir()
{ int resp;
do { cabec();
printf(\n\nCadastrar novo aluno\n\n);
printf(\nMatricula: );
scanf(%d, &aluno_aux.mat);
printf(\nNome.....: );
ffush(stdin);
gets(aluno_aux.nome);
printf(\nMedia....: );
scanf(%f, &aluno_aux.med);
fseek(paluno, 0, SEEK_END);
fwrite(&aluno_aux, sizeof(TAluno), 1,
paluno);
printf(\n\nAluno cadastrado com sucesso!
\n\n);
printf(\nDeseja cadastrar outro
(1-sim/0-nao)? );
scanf(%d, &resp);
} while (resp ==1);
}
Comentrios sobre o Programa Completo 3.1, Parte 2
Linha 28: incio do mdulo inserir.
Linha 29: declarao da varivel resp. Esta varivel ir
armazenar a resposta do usurio, quando for perguntado se ele
deseja cadastrar mais alunos.
Linha 30: incio de um do/while. O mdulo inserir fcar
executando enquanto o usurio desejar cadastrar novos alunos.
Nesta linha, tambm temos a chamada do mdulo cabec. Cada
vez que um cadastro feito, a tela vai ser limpa, para iniciar um
81
Programao 2
novo cadastro.
Linha 31: printf que informa o que esta tela faz cadastro de
alunos.
Linhas 32 e 33: printf solicitando que seja digitada a matrcula
do aluno e scanf que l esta informao. Os dados do aluno
vo sendo colocados no registro aluno_aux.
Linhas 34 a 36: printf solicitando que seja digitado o nome do
aluno, ffush para limpar o buffer de entrada (j que teremos a
leitura de uma sequncia de caractere) e o gets que l o nome
do aluno e armazena no registro aluno_aux.
Linhas 37 e 38: printf solicitando que seja digitada a mdia do
aluno e scanf que l esta informao. Neste momento, o registro
aluno_aux acabou de ser todo preenchido com os dados do
aluno e j pode ser gravado no arquivo.
Linha 39: para gravar o registro no arquivo, devemos posicionar
o leitor no fnal do arquivo para no correr o risco de fazer a
gravao sobre algum outro registro. Para isso, executado o
fseek.
Linha 40: com o leitor posicionado no fnal do arquivo, podemos
executar o fwrite, que vai gravar o contedo do registro aluno_
aux, no nosso arquivo.
Linha 41: printf para informar que o aluno foi cadastrado com
sucesso.
Linhas 42 e 43: printf para pergunta se o usurio deseja
cadastrar outro aluno e scanf que l a resposta para esta
pergunta.
Linha 44: fnal do do/while, com a condio de parada. O do/
while executado enquanto o usurio estiver respondendo que
quer cadastrar mais alunos. Notem que, no precisamos nos
preocupar com a capacidade do arquivo. Vamos armazenando
quantos registros desejarmos.
Linha 45: fecha chaves que indica o fnal do mdulo inserir.
A fgura 3.7 apresenta a tela de execuo do programa 3.1, na tela
de cadastro de novo aluno.
82
Programao 2
Figura 3.7: Tela de cadastro de aluno
Vamos ver agora o cdigo de dois mdulos que sero utilizados
pelos mdulos: consultar aluno por matrcula, remover aluno e alterar
mdia do aluno. Quando fazemos uma consulta, alterao ou remoo,
precisamos localizar o registro do aluno no arquivo e apresentar o
registro para o usurio. Por isso, foi criado um mdulo responsvel
para procurar um registro no arquivo e, outro mdulo, responsvel por
apresentar os dados do registro de um aluno. Vamos l, entender a
parte 3 do nosso programa completo 3.1!
Programa Completo 3.1- Parte 3
46
47
48
49
50
51
52
53
54
55

56
int procura(int matp)
{ int p;
p = 0;
rewind(paluno);
fread(&aluno_aux, sizeof(TAluno), 1, paluno);
while (feof(paluno)==0)
{ if (aluno_aux.mat == matp)
return p;
else
{ fread(&aluno_aux, sizeof(TAluno), 1,
paluno);
p++;
83
Programao 2
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
}
}
return -1;
}
void mostre(int pos)
{ fseek(paluno, pos*sizeof(TAluno), SEEK_SET);
fread(&aluno_aux, sizeof(TAluno), 1, paluno);
printf(\n\n);
linha();
printf(Matricula Nome Media\n);
linha();
printf(%9d %-20s %5.1f\n, aluno_aux.mat,
aluno_aux.nome, aluno_aux.med);
linha();
}
Comentrios sobre o Programa Completo 3.1, Parte 3:
Linhas 46 a 60: temos a sequncia de comandos do mdulo
procura. O mdulo recebe um parmetro, que a matrcula do
aluno que est sendo procurado. Ao fnalizar a sua execuo,
esse mdulo retorna um int que pode ser: -1 (signifca que
procurou o registro do aluno no arquivo e no achou) ou um
nmero positivo (que signifca em qual posio do arquivo
o registro foi encontrado). Este mdulo possui uma varivel
local p, que incrementada cada vez que feita a leitura de
um registro no arquivo. o valor desta varivel que indica em
que posio do arquivo o registro foi encontrado. Para localizar
o registro de um aluno, com uma dada matrcula, precisamos
percorrer todo o arquivo, at encontrar o registro ou at o
arquivo chegar ao fm. Para percorrer o arquivo, colocamos
o leitor no incio do mesmo (usando o rewind linha 49) e
efetuamos vrios fread, at que chegue no fnal do arquivo
(while da linha 51). Logo aps posicionar o leitor no incio do
84
Programao 2
arquivo, fazemos a leitura do primeiro registro do arquivo, para
verifcar se no o fnal de arquivo (end of fle). Lembrem que,
assim que um fread executado, o leitor j fca posicionado no
incio do prximo registro, pronto para um novo fread. Quando
um registro do arquivo tem a mesma matrcula que est sendo
procurada, signifca que encontramos o aluno. Com isso, j
pode ser dado o retorno, indicando a posio onde o registro
foi encontrado (linha 52 e 53). Se fzermos a leitura de todos
os registros do arquivo e no encontrar nenhum aluno com a
matrcula procurada, o mdulo retornar -1 (linha 59).
Linhas 62 a 72: temos a sequncia de comandos do mdulo
mostre. Este mdulo recebe como parmetro a posio do
registro que deve ser apresentado, recupera o registro no
arquivo e apresenta os dados do registro em forma de tabela.
O mdulo comea com o posicionamento do leitor no incio do
registro que deve ser mostrado (linha 63). Notem que, no fseek,
no campo que indica o tamanho do deslocamento que o leitor
vai dar, feita a conta: pos*sizeof(TAluno). Vamos entender
o porqu desta conta. A varivel pos indica em que posio
o registro est armazenado no arquivo (se ele o primeiro,
segundo, etc.). Consequentemente, saberemos quantos
registros tem armazenados antes do registro que queremos
mostrar. E assim, saberemos sobre quantos registros o leitor
dever se deslocar, at ser posicionado no incio do registro
desejado. Com o leitor no ponto certo, podemos fazer a leitura
do registro do aluno, armazenando seus dados no registro
aluno_aux (linha 64). Aps isto, precisamos apenas apresentar
os dados do aluno (linhas 65 a 71).
Vamos agora entender o mdulo responsvel por consultar um
aluno atravs do seu nmero de matrcula. O mdulo consultar
vai solicitar que o usurio informe a matrcula do aluno que deseja
consultar. Atravs do uso do mdulo procura descoberta em que
posio o registro do aluno se encontra armazenado no arquivo. Se o
aluno estiver armazenado no arquivo, seus dados so apresentados,
atravs do uso do mdulo mostre. Se o aluno no for encontrado,
apresentada uma mensagem de erro.
85
Programao 2
Programa Completo 3.1- Parte 4
73
74
75
76
77
78
79
80
81

82
83
84

85
86
87
void consultar()
{ int resp, matcon, posicao;
do{ cabec();
printf(\n\nConsultar Aluno\n\n\n);
printf(Matricula do aluno: );
scanf(%d, &matcon);
posicao = procura(matcon);
if (posicao == -1)
printf(\n\nMatricula nao encontrada!
\n\n);
else
mostre(posicao);
printf(\n\nDeseja consultar outro
(1-sim/0-nao)? );
scanf(%d, &resp);
} while (resp == 1);
}
Comentrios sobre o Programa Completo 3.1, Parte 4
Linha 73: incio do mdulo consultar.
Linha 74: declarao das variveis locais: resp, matcon
(matricula que ser consultada) e posicao (armazena em que
posio o registro foi localizado).
Linha 75: incio de um do/while. O mdulo consultar fcar
executando enquanto o usurio desejar consultar alunos. Nesta
linha, tambm temos a chamada o mdulo cabec. Cada vez
que uma consulta feita, a tela vai ser limpa, para iniciar uma
nova consulta.
Linha 76: printf que informa o que esta tela faz consultar
aluno.
Linhas 77 e 78: printf solicitando que seja digitada a matrcula
86
Programao 2
do aluno que deseja consultar e scanf que l esta informao.
Linha 79: chamada do mdulo procura, passando a matrcula
que desejamos consultar como parmetro. O retorno do mdulo
procura armazenado na varivel posicao.
Linhas 80 a 83: if que verifca se a varivel posicao tem
armazenado -1. Se sim, porque o aluno no foi encontrado.
Com isso, escrita uma mensagem de erro. Caso posicao no
esteja com -1, porque o aluno foi encontrado e seus dados
devem ser apresentados. Para apresentar os dados do aluno,
fazemos uma chamada ao mdulo mostre, passando a posio
onde o aluno foi encontrado, como parmetro.
Linhas 84 e 85: printf para perguntar se o usurio deseja
consultar outro aluno e scanf que l a resposta para esta
pergunta.
Linha 86: fnal do do/while, com a condio de parada. O do/
while executado enquanto o usurio estiver respondendo que
quer consultar mais alunos.
Linha 87: fecha chaves que indica o fnal do mdulo consultar.
A fgura 3.8 apresenta a tela de execuo do programa completo
3.1, na tela de consulta aluno por matrcula.
Figura 3.8: Tela de consulta aluno por matrcula
Vamos agora entender o mdulo responsvel por remover um
aluno do arquivo. O mdulo da remoo inicia de forma muito similar
ao da consulta. Primeiro, solicitado o nmero da matrcula do aluno
87
Programao 2
que ser removido, seu registro localizado e apresentado para que o
usurio possa ter certeza que vai remover o registro certo. Na verdade,
um registro no removido do arquivo, o que fazemos gravar sobre
o registro do aluno que queremos remover, um registro com os dados
zerados (aluno_nulo). Assim, toda vez que temos um registro com
a matrcula igual a zero no arquivo, signifca que ele um registro
que foi removido. Se o aluno no for encontrado, apresentada uma
mensagem de erro.
Programa Completo 3.1- Parte 5
88
89
90
91
92
93
94
95
96
97
98
99
100
101

102
103
104

105

106

107
void remover()
{ int matrem, conf, resp, posicao;
aluno_nulo.mat = 0;
aluno_nulo.med = 0;
do{ cabec();
printf(\n\nRemover aluno\n\n\n);
printf(Matricula: );
scanf(%d, &matrem);
posicao = procura(matrem);
if (posicao == -1)
printf(\nAluno nao encontrado!!\a);
else
{ mostre(posicao);
printf(\n\nDeseja remover o aluno
(1-sim/0-nao)? );
scanf(%d, &conf);
if (conf == 1)
{ fseek(paluno,posicao*sizeof
(TAluno),SEEK_SET);
f w r i t e ( & a l u n o _ n u l o ,
sizeof(TAluno), 1, paluno);
printf(\n\nAluno removido com
sucesso!);
}
88
Programao 2
108
109
110
111

112
113
114
else
printf(\nRemocao cancelada!);
}
printf(\n\n\nDeseja remover outro
(1-sim/0-nao)? );
scanf(%d, &resp);
} while (resp ==1);
}
Comentrios sobre o Programa Completo 3.1, Parte 5:
Linha 88: incio do mdulo remover.
Linha 89: declarao das variveis locais: resp, matrem
(matricula que ser removida), conf (confrmao se deseja
remover realmente) e posicao (armazena em que posio o
registro foi localizado).
Linhas 90 e 91: inicializao dos campos do registro aluno_
nulo.
Linha 92: incio de um do/while. O mdulo remover fcar
executando enquanto o usurio desejar remover alunos. Nesta
linha, tambm temos a chamada do mdulo cabec. Cada vez
que uma remoo feita, a tela vai ser limpa, para iniciar uma
nova remoo.
Linha 93: printf que informa o que esta tela faz remover
aluno.
Linhas 94 e 95: printf solicitando que seja digitada a matrcula
do aluno que deseja remover e scanf que l esta informao.
Linha 96: chamada do mdulo procura, passando a matrcula
que desejamos remover como parmetro. O retorno do mdulo
procura armazenado na varivel posicao.
Linhas 97 a 110: if que verifca se a varivel posicao tem
armazenado -1. Se sim, porque o aluno no foi encontrado.
Com isso, escrita uma mensagem de erro. Caso posicao no
esteja com -1, porque o aluno foi encontrado e seus dados
devem ser apresentados. Para apresentar os dados do aluno,
89
Programao 2
fazemos uma chamada ao mdulo mostre, passando a posio
onde o aluno foi encontrado como parmetro. Aps ver os dados
do aluno, o usurio pode desistir de remov-lo. Na linha 102,
temos o scanf que l se o usurio confrma ou no a remoo. A
remoo, propriamente dita, executada nas linhas 104 e 105.
Na linha 104 temos o posicionamento do leitor sobre o registro
que queremos remover. E, na linha 105, temos a gravao do
registro aluno_nulo sobre o registro antigo.
Linhas 111 e 112: printf para pergunta se o usurio deseja
remover outro aluno e scanf que l a resposta para esta
pergunta.
Linha 113: fnal do do/while, com a condio de parada. O do/
while executado enquanto o usurio estiver respondendo que
quer remover mais alunos.
Linha 114: fecha chaves que indica o fnal do mdulo remover.
A fgura 3.9 apresenta a tela de execuo do programa 3.1, na tela
de remoo de aluno.
Figura 3.9: Tela de remoo do registro do aluno
Agora vamos entender o mdulo responsvel pela alterao da
mdia do aluno. Este mdulo parecido com a remoo. Primeiro,
solicitado o nmero da matrcula do aluno que ser alterado, seu
registro localizado e apresentado para que o usurio possa ter
certeza que vai alterar o registro certo. Na alterao, gravamos um
registro com a mdia alterada, sobre o antigo registro do aluno.
90
Programao 2
Programa Completo 3.1- Parte 6
115
116
117
118

119
120
121
122
123
124
125
126

127
128
129
130
131

132

133

134
void alterar()
{ int matalt, conf, resp, posicao;
do { cabec();
printf(\n\nAlterar media do aluno\n\
n\n);
printf(Matricula: );
scanf(%d, &matalt);
posicao = procura(matalt);
if (posicao == -1)
printf(\nAluno,nao encontrado!!\a);
else
{ mostre(posicao);
printf(\n\nAlterar a media do
aluno(1-sim/0-nao)? );
scanf(%d, &conf);
if (conf == 1)
{ printf(\nNova media: );
scanf(%f, &aluno_aux.med);
printf(\nMedia alterada com sucesso!
\n\n);
fseek(paluno,posicao*sizeof(TAluno),
SEEK_SET);
fwrite(&aluno_aux,sizeof(TAluno), 1,
paluno);
mostre(posicao);
135

136
137
printf(\nMedia do aluno alterada com
sucesso!\n);
}
else
91
Programao 2
138

139
140

141
142
143
printf(\n\nAlteracao cancelada!
\n\n);
}
printf(\n\nDeseja alterar outro
(1-sim/0-nao)? );
scanf(%d, &resp);
}while (resp ==1);
}
Comentrios sobre o Programa Completo 3.1, Parte 6:
Linha 115: incio do mdulo alterar.
Linha 116: declarao das variveis locais: resp, matalt
(matricula que ser alterada), conf (confrmao se deseja
alterar a mdia do aluno) e posicao (armazena em que posio
o registro foi localizado).
Linha 117: incio de um do/while. O mdulo alterar fcar
executando enquanto o usurio desejar alterar alunos. Nesta
linha, tambm temos a chamada do mdulo cabec. Cada vez
que uma alterao feita, a tela vai ser limpa, para iniciar uma
nova alterao.
Linha 118: printf que informa o que esta tela faz alterar mdia
do aluno.
Linhas 119 e 120: printf solicitando que seja digitada a matrcula
do aluno que deseja alterar e scanf que l esta informao.
Linha 121: chamada do mdulo procura, passando a matrcula
que desejamos alterar como parmetro. O retorno do mdulo
procura armazenado na varivel posicao.
Linhas 122 a 139: if que verifca se a varivel posicao tem
armazenado -1. Se sim, porque o aluno no foi encontrado.
Com isso, escrita uma mensagem de erro. Caso posicao no
esteja com -1, porque o aluno foi encontrado e seus dados
devem ser apresentados. Para apresentar os dados do aluno,
fazemos uma chamada ao mdulo mostre, passando a posio
onde o aluno foi encontrado como parmetro. Aps ver os dados
do aluno, o usurio pode desistir de alterar a sua mdia. Na
92
Programao 2
linha 127, temos o scanf que l se o usurio confrma ou no a
alterao. Se o usurio confrma que quer alterar, solicitada
a nova mdia do aluno (linha 130). A alterao, propriamente
dita, executada nas linhas 132 e 133. Na linha 132, temos o
posicionamento do leitor sobre o registro que queremos alterar.
E, na linha 133, temos a gravao do registro alterado sobre o
registro antigo. Aps os dados serem alterados, o registro do
aluno reapresentado atravs de uma chamada ao mdulo
mostre (linha 134).
Linhas 140 e 141: printf para pergunta se o usurio deseja
alterar outro aluno e scanf que l a resposta para esta
pergunta.
Linha 142: fnal do do/while, com a condio de parada. O do/
while executado enquanto o usurio estiver respondendo que
quer alterar mais alunos.
Linha 143: fecha chaves que indica o fnal do mdulo alterar.
A fgura 3.10 apresenta a tela de execuo do programa completo
3.1, na tela de alterao de mdia do aluno.
Figura 3.10: Tela de alterao de mdia do aluno
Veremos, agora, o ltimo mdulo do programa, que a listagem.
Este mdulo responsvel por apresentar todos dados dos alunos
que esto armazenados no arquivo. Os dados sero apresentados
em forma de tabela. Devemos lembrar que s iremos apresentar os
93
Programao 2
registros vlidos do arquivo, ou seja, registros com matrcula zerada
no devem ser apresentados.
Programa Completo 3.1- Parte 7
144
145
146
147
148
149
150
151
152
153
154

155
156

157
158
159
160
161
void listagem()
{ cabec();
printf(\n\nListagem Geral\n\n\n);
linha();
printf(Matricula Nome Media\n);
linha();
rewind(paluno);
fread(&aluno_aux, sizeof(TAluno), 1, paluno);
while (feof(paluno)==0)
{ if (aluno_aux.mat != 0)
printf(%9d %-20s %5.1f\n, aluno_aux.
mat,
aluno_aux.nome, aluno_aux.med);

fread(&aluno_aux, sizeof(TAluno), 1,
paluno);
}
linha();
printf(tecle enter para voltar ao menu...);
getche();
}
Comentrios sobre o Programa Completo 3.1, Parte 7
Linha 144: incio do mdulo listagem.
Linha 145: chamada ao mdulo cabec, responsvel por limpar
a tela e escrever o nome da instituio.
Linha 146: printf que informa o que esta tela faz listagem
geral.
Linha 147: chamada do mdulo linha, para iniciar o desenho
da tabela.
94
Programao 2
Linha 148: printf que escreve os cabealhos das colunas da
tabela.
Linha 149: mais uma chamada ao mdulo linha.
Linha 150: posiciona o leitor no incio do arquivo, para que
possamos varrer o arquivo, visitando todos os registros do
arquivo.
Linha 151: Leitura do primeiro registro do arquivo, para verifcar
se no o fnal do arquivo.
Linhas 152 a 157: while que executado enquanto no chegar
no fnal do arquivo. Para cada registro lido, verifcado se o
mesmo tem a matrcula igual a zero. Se sim, o registro no
apresentado na listagem.
Linha 158: chamada do mdulo linha, para fechar a tabela.
Linha 159: printf informando que o usurio deve teclar enter
para sair da listagem.
Linha 160: getche para que possamos ver a listagem.
Linha 161: fecha chaves que indica o fnal do mdulo listagem.
A fgura 3.11 apresenta a tela de execuo do programa completo
3.1, na tela de listagem dos dados de todos os alunos.
Figura 3.11: Tela de listagem de dados de todos os alunos
O programa principal do programa completo 3.1 apresentado a
seguir. no programa principal que sero feitas as chamadas aos
mdulos que o usurio deseja executar no momento.
95
Programao 2
Programa Completo 3.1- Parte 8
162
163
164
165
166
167
168
169

170

171
172
173
174
175
176
177
178
179
180
181
182
183
main()
{ int op;
abre_arquivo();
do{ cabec();
printf(\n\nOpcoes: \n\n\n);
printf( 1- Cadastrar novo aluno\n\n);
printf( 2- Remover aluno\n\n);
printf( 3- Consultar aluno por
matricula\n\n);

printf( 4- Alterar media do aluno
\n\n);
printf( 5- Listagem geral\n\n);
printf( 0- Sair\n\n);
linha();
printf(Informe a opcao desejada: );
scanf(%d, &op);
switch(op)
{ case 1: inserir(); break;
case 2: remover(); break;
case 3: consultar(); break;
case 4: alterar(); break;
case 5: listagem(); break;
case 6: limpar(); break;
case 0: fclose(paluno); break;
184

185
default: printf(\n\n\aOpcao
invalida!);
break;
96
Programao 2
186
187
188
}
} while (op != 0);
}
Comentrios sobre o Programa Completo 3.1, Parte 8:
Linha 162: incio do programa principal.
Linha 163: declarao da varivel local op, que vai armazenar
a operao que o usurio deseja executar.
Linha 164: chamada do mdulo abre_arquivo, disponibilizando
o mesmo para uso.
Linhas 165 a 187: do/while responsvel por ler a operao
que o usurio que executar e fazer a chamada do mdulo que
executar a implementa a operao.
Linha 188: fecha chaves do programa principal.
A fgura 3.12 apresenta a tela de execuo do programa 3.1, na
tela do menu principal, onde informada a operao que desejamos
executar.
Figura 3.12: Tela do menu principal
E assim, terminamos mais um programa completo. Agora, colocar
a mo no teclado e comear a programar, armazenando dados em
arquivos.
97
Programao 2
Atividades e Orientaes de Estudos
Temos agora mais uma lista de exerccios para consolidar o nosso
entendimento do assunto visto neste captulo. Se preparem, pois as
questes esto maiores. Mas, isso bom porque vemos que estamos
fazendo programas interessantes, no mesmo?
1. Faa um programa para um shopping contendo as seguintes
telas:
Tela de Menu
Shopping Center
Opes:
1 .Cadastrar loja
2. Consultar loja
3. Listagem de todas as lojas
0. Sair
Entre com a opo:
Cadastro
Shopping Center
Cadastro de Loja
Cdigo:
Nome:
rea:
Tipo(1-Confeces, 2-Alimentao, 3-Livros, 4- Servios):
Cadastrar outra (1-Sim/0-Nao)?
Consulta
Shopping Center
Consultar Loja
Cdigo da loja que deseja consultar:
Cdigo Nome rea Tipo Condomnio
xxx xxxxxxx xx xx xxxx
Consultar outra (1-Sim/0-Nao)?
98
Programao 2
Relatrio Geral
Shopping Center
Listagem Geral
Codigo Nome rea Tipo Condomnio
xxx xxxxxxx xx xx xxxxx
xxx xxxxxxx xx xx xxxxx
xxx xxxxxxx xx xx xxxxx
Tecle enter para voltar ao menu...
O programa ir armazenar os dados das lojas em um arquivo.
O programa ir calcular o valor do condomnio de cada loja. O
valor do condomnio depende da rea e do tipo da loja. Veja
tabela abaixo:
Tipo da loja Valor do m
1 R$ 50
2 R$ 65
3 R$ 80
4 R$ 95
2. Faa um programa para uma Agncia de Turismo armazenando
os dados em um arquivo. O programa dever ter as seguintes
funes: Cadastrar roteiro, Consultar roteiro, Listagem de todos
os roteiros e Simular valor de viagem. A seguir, sugestes de
telas.
Tela Principal
Vida Boa Turismo
Opes:
1- Cadastrar roteiro
2- Consultar roteiro
3- Listagem de todos os roteiros
4- Simular viagem
0- Sair
Entre com a opo:
99
Programao 2
Tela de Cadastro
Vida Boa Turismo
Cadastrar Roteiro
Cdigo:
Pas(1-Brasil, 2-Espanha, -3-Italia):
Cidade:
Diria de Hotel: R$
Diria Aluguel de Carro: R$
Inserir outro(1-sim,2-no)?
Tela de Remoo de Roteiro
Vida Boa Turismo
Consultar Roteiro
Cdigo do roteiro a ser consultado:
Cdigo Pas Cidade Diria Hotel Carro
xxx x xxxxxxxx xxx xxxx
Consultar outro (1-Sim/0-Nao)?
Tela de Listagem de todos os roteiros
Vida Boa Turismo
Listagem de todos os roteiros
Cdigo Pas Cidade Diria Hotel Carro
xxx x xxxxxxxx xxx xxxx
xxx x xxxxxxxx xxx xxxx
xxx x xxxxxxxx xxx xxxx
Pgina x de x... Tecle enter
Tecle enter para voltar ao menu...
100
Programao 2
Tela para simular valor de viagem
Vida Boa Turismo
Simular Viagem
Cdigo do roteiro:
Cdigo Pas Cidade Diria Hotel Carro
xxx x xxxxxxxx xxx xxxx
Quantidade de dias:
Alugar carro(1-sim, 2-no)?
Valor total da viagem = R$ xxxxx
Simular outro roteiro(1-sim, 2-no)?
Observaes:
Os dados do roteiro devem ser armazenados em um arquivo.
No pode cadastrar roteiros com cdigos repetidos.
O valor da viagem deve ser calculado com base nos valores do
roteiro escolhido; viagem = quantos dias * valor diria hotel +
quantos dias * valor diria carro (caso alugue carro).
Na consulta deve passar o cdigo do roteiro e apresentar os
dados do roteiro.
Na listagem, apresentar os dados de todos os roteiros em forma
de tabela.
Conhea Mais
Para melhorar o nosso conhecimento sobre manipulao de
arquivos binrios, vejam este assunto nos livros:
LAUREANO, Marcos. Programando em C Para Linux, Unix e
Windows. Rio de Janeiro: Brasport, 2005.
MIZRAHI, Victorine Viviane. Treinamento em Linguagem C
Curso Completo. So Paulo: Makron, 1999.
101
Programao 2
Vamos revisar?
Vamos fazer uma reviso do assunto que foi visto neste captulo,
lendo o resumo a seguir:
Os arquivos servem para armazenar nossos dados de forma
defnitiva.
Os arquivos binrios so adequados para o armazenamento de
registros.
Cada registro que armazenado no arquivo ocupa a mesma
quantidade de memria.
Toda operao sobre um arquivo ser executada no ponto onde
o leitor se encontra.
Com o comando fseek, podemos colocar o leitor sobre o registro
que desejamos ler ou gravar.
S podemos manipular um arquivo que esteja aberto. Aps o uso
do arquivo, devemos fech-lo.
O arquivo criado pelo programa salvo no mesmo diretrio em
que est armazenado o nosso programa executvel.
102
Programao 2
Consideraes Finais
Neste volume, tivemos a oportunidade de aprender como
armazenar dados em vetores, registros e arquivos. O armazenamento
adequado dos dados possibilitou o desenvolvimento de programas
com operaes mais elaboradas como: cadastro de elementos,
remoo, alterao, consultas e listagens. Perceberam o quanto
nossos programas evoluram desde o nosso primeiro programa
completo, at hoje? Vejam que todos os conceitos que aprendemos
esto sempre em uso nos nossos programas. Isto bom porque nos
acostumamos com a sintaxe dos comandos. Agora, temos apenas
mais um mdulo para fnalizar a nossa caminhada, em busca do
aprendizado da linguagem de programao C. Continuem frmes nos
estudos! Estamos quase no fnal! At o prximo mdulo.
103
Programao 2
Referncias
ARAJO, Jairo. Dominando a Linguagem C. So Paulo:
Cincia Moderna, 2004.
ASCENIO, Ana Fernanda Gomes e CAMPOS, Edilene
Aparecida Veneruchi. Fundamentos de Programao de
Computadores. So Paulo: Prentice Hall, 2002.
DEITEL, H, M e DEITEL, P. J. Como Programar em C. Rio de
Janeiro: LTC, 1999.
LAUREANO, Marcos. Programando em C Para Linux, Unix e
Windows. Rio de Janeiro: Brasport, 2005.
MIZRAHI, Victorine Viviane. Treinamento em Linguagem C
Curso Completo. So Paulo: Makron, 1999.
MONTGOMERY, Eduard. Programando em C: Simples e
Prtico. So Paulo: Alta Books, 2006.
OLIVEIRA, Ulisses. Programando em C Volume I
Fundamentos. So Paulo: Cincia Moderna, 2004.
SCHILDT, Herbert. C Completo e Total. So Paulo: Makron,
1996.
104
Programao 2
Conhecendo a Autora
Sou graduada em Cincia da computao pela Universidade Federal
de Sergipe. Fiz mestrado e doutorado na Universidade Federal de
Pernambuco, desenvolvendo pesquisas nas reas de Sistemas Distribudos
e Geoprocessamento. Comeei a ensinar em 2000, nos cursos de Cincia
da Computao e Sistemas de Informao. Desde o incio da minha carreira
como professora, ministro disciplinas de Programao e tenho uma paixo
pela linguagem C. Atualmente, encontrei uma nova paixo: Educao a
Distncia.

Você também pode gostar