Você está na página 1de 222

10 li coes

para aprender
a linguagem c
em Portugues.
Tarcisio Praciano Pereira
1
Universidade Estadual Vale do Acara u
Sobral, 12 de julho de 2005- Ceara
1
Dep de Matematica - U.V.A. - tarcisio@e-math.ams.org
Tarcisio Praciano Pereira
PhD em Matematica
10 LIC

OES
PARA APRENDER A LINGUAGEM c
em portugues
Edi cao eletronica
3
Pereira, Tarcisio Praciano
P496c 10 li c oes para aprender C
Sobral: UVA, 2001
224.p
Bibliograa
ISBN: solicitado
1 - A linguagem C
I. Ttulo
CDD xxx.xx
4
Lista de Figuras
1.1 arvore de diret orios - BC . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.1 se() ou entao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.2 Fluxograma do se() . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.3 Fluxograma com dois se() . . . . . . . . . . . . . . . . . . . . . . . . 76
4.4 Fluxograma com dois se(), uma entrada e uma sada dados . . . . . . . . 77
4.5 Fluxograma da equa c ao do segundo grau. . . . . . . . . . . . . . . . . 78
4.6 Ao encontrar pare() o uxo e desviado para a pr oxima fun c ao externa ao
bloco. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.1 Vari avel global e vari avel local. . . . . . . . . . . . . . . . . . . . . . . 118
6.2 Vari avel global e local . . . . . . . . . . . . . . . . . . . . . . . . . . 122
7.1 M aquina do balc ao do comercio, cole c ao do autor. . . . . . . . . . . . . 137
7.2 duas formas equivalentes para imprimir 30 na base 8 . . . . . . . . . . . 166
7.3 Formata c ao de dados em printf() . . . . . . . . . . . . . . . . . . . . 167
7.4 Uso de printf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
8.1 Equa c ao do segundo grau . . . . . . . . . . . . . . . . . . . . . . . . 180
8.2 C aculo da integral, aproximadamente. . . . . . . . . . . . . . . . . . . 183
9.1 O produto de n umeros complexos: parte imagin aria se obtem em cruz . . . 200
5
6 LISTA DE FIGURAS
Sumario
Introdu cao ................................... . . . . . . . . . . . . . . . . . . . . 10
I Usandos os comandos em Portugues 17
1 Uma primeira suite de programas 19
1.1 Como rodar um programa. . . . . . . . . . . . . . . . . . . . . . 19
2 O segundo programa em C 33
2.1 Programas e erros... . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.1.1 Analise do prog02 1.c . . . . . . . . . . . . . . . . . . . . 46
3 N umeros e Letras 53
3.1 Brincando com n umeros em C. . . . . . . . . . . . . . . . . . . . 53
3.1.1 Leitura de dados . . . . . . . . . . . . . . . . . . . . . . . 59
3.2 Brincando com as palavras em C. . . . . . . . . . . . . . . . . . . 62
3.2.1 Palavras, macros, caracteres. . . . . . . . . . . . . . . . . 62
3.2.2 Vetores de caracteres. . . . . . . . . . . . . . . . . . . . . 66
4 Controle logico do uxo 71
4.1 O condicional se() (if()) . . . . . . . . . . . . . . . . . . . . . . 71
4.2 M ultiplas escolhas. . . . . . . . . . . . . . . . . . . . . . . . . . . 83
4.3 enquanto() while() . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.4 Outro metodo para la cos. . . . . . . . . . . . . . . . . . . . . . . 92
4.5 Parando no meio de um bloco. . . . . . . . . . . . . . . . . . . . 94
5 Criando fun coes 97
5.1 Vericador de senhas. . . . . . . . . . . . . . . . . . . . . . . . . 100
5.1.1 Metamorfoses do Leitor de Palavras. . . . . . . . . . . . . 101
5.1.2 Sistema de contabilidade geral . . . . . . . . . . . . . . . 107
5.1.3 Como registrar dinheiro . . . . . . . . . . . . . . . . . . . 109
5.2 Maquina de calcular. . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.2.1 O menu de op c oes . . . . . . . . . . . . . . . . . . . . . . 109
7
8 SUM

ARIO
II Aprofundando os conhecimentos 111
6 Variavel global e local 117
6.1 Variavel global e local . . . . . . . . . . . . . . . . . . . . . . . . 117
6.1.1 Comentarios sobre os exerccios . . . . . . . . . . . . . . . 120
6.2 Tecnicas com o uso de variaveis locais . . . . . . . . . . . . . . . 123
6.3 Passando valores entre fun coes . . . . . . . . . . . . . . . . . . . 127
7 Os tipos basicos de dados 131
7.1 Os n umeros em c . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
7.1.1 Os n umeros inteiros . . . . . . . . . . . . . . . . . . . . . 132
7.1.2 Os n umeros reais . . . . . . . . . . . . . . . . . . . . . . . 137
7.1.3 Bibliotecas do BC . . . . . . . . . . . . . . . . . . . . . . . 142
7.2 Caracteres e vetores de caracteres. . . . . . . . . . . . . . . . . . 144
7.3 Ponteiros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.3.1 Opera coes com ponteiros. . . . . . . . . . . . . . . . . . . 153
7.4 Manipulando arquivos em disco . . . . . . . . . . . . . . . . . . . 154
7.5 Matriz, (array) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
7.6 Estrutura, struct. . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
7.6.1 tempo para os humanos . . . . . . . . . . . . . . . . . . . 163
7.6.2 tempo para o computador . . . . . . . . . . . . . . . . . . 165
7.7 Formatadores para sada de dados . . . . . . . . . . . . . . . . . 165
8 Matematica em c 171
8.1 Operadores aritmeticos e logicos . . . . . . . . . . . . . . . . . . 172
8.1.1 Uma lista seca de operadores . . . . . . . . . . . . . . . . 173
8.2 Equa cao do segundo grau . . . . . . . . . . . . . . . . . . . . . . 178
8.3 Somas e integrais em c . . . . . . . . . . . . . . . . . . . . . . . . 182
8.3.1 Integral de fun coes univariadas . . . . . . . . . . . . . . . 182
8.4 Gracos de fun coes usando c . . . . . . . . . . . . . . . . . . . . 185
8.4.1 Comentando o programa grafun01.c . . . . . . . . . . . 186
9 Programa cao avan cada 191
9.1 Continuar se aprofundando em c . . . . . . . . . . . . . . . . . . 191
9.1.1 c + + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
9.1.2 Programa cao orientada a objeto . . . . . . . . . . . . . . 193
9.2 O programa menu.cc . . . . . . . . . . . . . . . . . . . . . . . . . 197
9.2.1 Constru cao da ideia . . . . . . . . . . . . . . . . . . . . . 197
9.3 N umeros complexos . . . . . . . . . . . . . . . . . . . . . . . . . 199
9.3.1 Que e n umero complexo . . . . . . . . . . . . . . . . . . . 199
9.3.2 O programa em c . . . . . . . . . . . . . . . . . . . . . . 200
9.3.3 Constru cao de complexo milenium plus.cc . . . . . . . 201
SUM

ARIO 9
10 Manual introdutorio de referencia 203
10.1 O Sistema operacional e a shell . . . . . . . . . . . . . . . . . . . 204
10.2 instru coes de compila c ao . . . . . . . . . . . . . . . . . . . . . . . 206
10.3 linha de comando . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
10.4 Operadores aritmeticos e logicos . . . . . . . . . . . . . . . . . . 208
10.5 A libc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
10.6 Manual do compilador gcc . . . . . . . . . . . . . . . . . . . . . . 210
Bibliograa ............................................................................... 212
10 SUM

ARIO
Introdu cao.
Toda manha, na Africa, uma cor ca se levanta e sabe
tera que ser mais rapida que o mais rapido dos leoes,
ou sera morta.
Toda manha um leao se levanta e sabe
tera que superar a mais lenta das cor cas,
ou morrera de fome.
Nao importa se voce e leao ou cor ca
quando o sol se levantar,
e melhor sair correndo.
- autor desconhecido
Como usar este livro.
Para come car, sugerimos que nao leia, agora, esta introdu cao. Leia primeiro
o resto do livro, depois a introdu cao, porque, lhe confessamos, primeiro escre-
vemos o livro, depois a introdu cao. Mas se voce quiser insistir, fa ca uma leitura
rapida e depois volte para ler com mais cuidado. Voce vai ver que, entao, vale
a pena.
Este livro tem dez captulos em que lhe apresentamos as tecnicas b asicas
para programar na linguagem c, mas e preciso enfatizar, voce vai apenas se
iniciar na linguagem com este livro.
O livro esta divido em duas partes. Na primeira, vamos apresentar-lhe c em
portugues por duas razoes:
para vencer a diculdade psicologica com o Ingles, creamos um arquivo
que traduz os comandos da linguagem c para o Portugues, de modo que
voce se inicie sem a diculdade lingustica;
para mostrar-lhe que com c podemos facilmente construir outra lingua-
gem, neste caso e c em portugues. Isto mostra o poder da linguagem.
Mas voce nao deve se enganar com o apoio lingustico e nem queremos induz-
lo no erro de que e possivel viver sem o ingles. Por esta mesma razao vamos
manter os programas traduzidos junto com os programas naturais em c de modo
que voce va aos poucos se habituando com as palavras da linguagem em Ingles.
Na segunda parte usaremos apenas os comandos em ingles.
O conte udo das duas partes do livro, em linha gerais e o seguinte:
1. A primeira parte, constituida dos cinco primeiros captulos, devera deixa-
lo escrevendo pequenos programas em c e todos os exemplos ser ao em
portugues com a tradu cao ao lado. Depois voce tomara sua decisao, se
SUM

ARIO 11
quiser continuar escrevendo seus programas em Ingles, como e habitual,
ou continuar a escreve-los em portugues.
Observe que os programas em portugues rodam da mesma forma como
os programas em ingles, eles nao sao de mentira.
2. Na segunda parte vamos avan car em profundidade em algumas dire c oes. A
partir dai so apresentaremos peda cos de programas, porque os programas
inteiros voce pode consegu-los num disco ou via Internet, veja como fazer
na bibliograa, ou envie e-mail para
tarcisio@e-math.ams.org
solicitando os programas. Voce pode usar este ender co para consultas
rapidas, mas, por favor, nao espere que lhe possamos dar um curso parti-
cular via internet.
Se voce quiser continuar programando em portugues esta ser a uma
op cao sua e ate la voce tera aprendido como fazer.
O metodo que vamos usar no livro se assemelha `aquele que usaram quando
voce era pequeno, para aprender a sua lingua materna. Mostraram-lhe varias
vezes o mesmo objeto, cadeira, e lhe disseram: cadeira, a voce aprendeu a
diferen ca logica entre uma cadeira e uma mesa.
Vamos lhe mostrar pequenos programas, pedir que voce os rode num com-
putador em que o c esteja instalado
1
. Depois iremos comentar os programas e
lhe indicar como voce os pode alterar, e assim por diante.
Parte do metodo consiste do estilo com que os captulos foram escritos: ha
superposi cao entre eles, quer dizer, o mesmo assunto, o mesmo conceito, aparece
varias vezes, aumentando de intensidade nos captulos de n umero maior.

E o
metodo de explica cao logica da diferen ca entre cadeira e mesa, de tanto falar,
termina cando claro o que as coisas sao. Voce sera inclusive convidado a pular
para os captulos mais avan cados com frequencia e, nao tenha d uvida em faze-lo,
se achar que esta bem la na frente, nao precisa voltar atr as...
Como rodar o c ?
Se voce puder escolher, use LinuX e a linguagem gratuita c que vem com
este sistema operacional. Se voce tiver ainda alguma chance de escolher, mesmo
tendo que trabalhar dentro do Windows, (poucas chances de escolha...), sugeri-
mos
use o c da funda cao GNU, procure em www.gnu.org ou envie e-mail para
o autor. Veja abaixo instru coes mais detalhadas,
1
se voce tiver acesso a um computador rodando LinuX, ent ao o C estar a com toda certeza
instalado
12 SUM

ARIO
de preferencia ao c da Borland, BC que todos que o analisam consideram
melhor que o Microsoft C,
se voce nao tiver mesmo nenhuma outra op cao, use o que tiver `a mao, mas
aprenda o c.
Se voce usa Linux e por alguma raz ao complicada precisar de usar Borland
C, voce pode faze-lo sob dosemu. Foi assim que as versoes do programas
para BC foram testadas por mim.
Este livro foi escrito em cima do gcc, Gnu C Compiler (o Compilador C da
Funda cao para Software Livre,
2
Free Software Foundation, FSF). A FSF criou
tambem uma versao do gcc para rodar em DOS e em Windows de modo que se
voce nao tiver comprado um pacote de c, voce pode obter um, gratuito, direta-
mente da FSF no endere co http://www.gnu.org procure What we providee
voce vai ser direcionado para os diversos programas que feitos sob o patrocnio
desta funda cao, em algum lugar voce vai encontrar djdev que e o nome do gcc
para DOS/Windows. .
O que e c ?
Ha muitos mitos envolvendo a linguagem C, entre eles destacamos:


E uma linguagem difcil. Voce vera que e facil iniciar o seu aprendi-
zado em C. Mas seria uma mentira dizer-lhe que o conte udo deste livro
e suciente para que se torne um exmio programador. Prometemos que
ao termino deste livro voce podera estar fazendo alguns programas in-
teressantes e com muita vontade de continuar. Na bibliograa voce vai
encontrar dicas de como fazer isto.


E uma linguagem perigosa, voce pode estragar o computador.
Nao e perigosa, mas e poderosa. Se pode dizer, sem perigo de erro maior,
que tudo que roda hoje nos computadores foi feito em c ou foi feito com
alguma ferramenta, uma outra linguagem, que foi feita em C.
E de fato, voce pode, com facilidade, travar o computador com um pro-
grama errado. Voce tambem pode deixar o sistema operacional confuso
gravando algum dado improprio em local indevido de memoria, mas na
pior das hipoteses a solu cao para o problema vai consistir em desligar a
maquina e depois ter cuidado com o programa que causou esta confusao.
Na absoluta pior das hipoteses, voce pode ter que instalar tudo de novo,
se o seu programa houver se intrometido por cima do sistema operacional
2
GNU e uma sigla que representa a FSF e tambem o nome de um tipo de antlope, large
African antelope having a head with horns like an ox and a long tufted tail, copiado do meu
dicion ario gratuito produzido pelo Lab. de Ciencias Cognitivas de Princeton.
SUM

ARIO 13
gravado no disco... mas para fazer isto so um programa bem avan cado e
muito mal intencionado.
Claro, logo aqui no come co podemos dizer quem pode causar tais trans-
tornos para que voce aprenda a manipular com cuidado o vilao: sao as
variaveis do tipo ponteiro porque elas fazem referencia aos endere cos das
variavei na memoria RAM
3
. Consequentemente, se voce mandar escrever
dados muito grandes em uma variavel de tamanho pequeno, havera uma
invasao em areas de memoria e pode ser difcil de predizer as consequencias
desta invasao.

E isto que se chama de enderecamento indireto . A maioria das lingua-


gens de programa cao nao usa este recurso, nelas voce pode apenas fazer
endere camento direto, usando o proprio nome da variavel. Veja o seguinte
exemplo:
Exemplo: 1 Enderecamento indireto e indireto
numero = 23; // enderecamento direto
&numero 23;// enderecamento indireto
A primeira atribui cao e a comum nas linguagens de programac ao, foi atri-
buido o valor 23 diretamente ` a vari avel numero. Na segunda linha estamos
dizendo que o valor 23 seja associadoao endereco de n umero.
N ao e assim que se faz em c, veja o programa
endereco indireto.c,
mas n ao se preocupe com entende-lo completamente agora. Estamos lhe
dizendo que olhe o programa apenas para contrabalancar as duas linhas
acima que n ao s ao reais em programac ao, apenas uma tentativa de transmitir-
lhe o que signica endere camento indireto. No programa
endereco indireto.c
voce pode ver como e que realmente se faz.
Em c tambem fazemos atribui coes diretas de valores nas variavei, mas,
alem disto, c pode acessar, quando voce usar ponteiros, a mem oria de
forma absoluta, e a se encontra o risco de que voce mande escrever por
cima de alguma parte do sistema operacional, por exemplo...e neste caso,
com certeza a maquina vai parar. Desligando-a e novamente ligando, uma
versao nova do sistema operacional vai ser instalada a partir do disco e
tudo voltara ao normal. Este e o grande dano que obviamente deve ser
evitado e por isto primeiro entenda ponteiros antes de us a-los.
Mas aqui voce ira aprender o que e um ponteiro, vai aprender a compre-
ender o que pode estar acontecendo e dominar os poderes da linguagem.
Voce sabe que pode levar um choque eletrico pegando de mal jeito nos
os, mas nem por isso voce prefere viver no escuro...
3
Random Access Memory, e a mem oria que voce adquire a mais ou a menos para sua
m aquina e na qual os programas tem direito a fazer registros.
14 SUM

ARIO
Observa cao: 1 A funcao scanf() e o direcionador &.
O smbolo & se chama algumas vezes redirecionadorde memoria, porque ele as-
socia endereco e memoria. Algumas funcoes da linguagem C fazem atribuicao de
dados via endereco, e o caso da funcao scanf() e poristo ela representa um problema,
com frequencia. Ela exige, um direcionador de registro, & na frente de algumas
variaveis. Sua omissao fara com o compilador o advirta do erro e se voce nao levar
a serio a advertencia pode acontecer que com o valor lido seja colocado numa posicao
de memoria difcil de prever. Se o sistema operacional nao tiver um bom controle do
uso da memoria, e este e o caso do windows, isto pode levar a sobreposicao de uma
variavel do sistema e consequentemente a uma parada cardiaca violenta do mesmo...
mas em geral o ctrl-alt-delresolve o problema e o windowsvai lhe brindar o disco
com um monte de lixo quando se re-iniciar.
Evite de esquecer o & antes das variaveis quando usar scanf. Mas nao precisa se
assustar, o compilador que voce estiver usando dentro, mesmo dentro do windows,
lhe fara uma advertencia se voce esquecer um & na primeira etapa da compilacao
do programa, tenha apenas o cuidado de levar a serio a advertencia e corrija o esque-
cimento. Ha outras funcoes que, como scanf() exigem o &. Tome o mesmo cuidado
nestes outros casos.
Existem outras formas de copiar informa coes em lugares errados, elas serao
identicadas mais adiante, e todas estao ligadas ao uso indevido do en-
dere camento de memoria. Um exemplo comum como utiliza cao de uma
variavel com tamanho maior do que deveria. Rodando programas em Li-
nuX, o maior problema que isto pode causar consiste em deixar o programa
inconsistente e podendo travar indesejavelmente o que pode em geral ser
resolvido entrando noutra area de trabalho e matando o programa
mal comportado.
A preven cao para este problema consiste no uso cuidadoso das variaveis
segundo a declara cao das mesmas. Claro, e verdade, se espera de um
programador da linguagem c muita aten cao no uso de variaveis.
O nosso objetivo consiste em deixa-lo em condi coes de escolher um dos ca-
minhos seguintes:
Se aprofundar emc para construir programas que executem tarefas difceis
com esta linguagem, mas usando um outro livro, nao este. Na bibliograa
voce ira encontrar alternativas.
Escolher uma outra linguagem, vamos lhe sugerir algumas, usando a ex-
periencia adquirida aqui. Queremos lhe dizer com esta segunda op cao que
c pode ser uma linguagem introdutoria antes de voce se denir por uma
linguagem apropriada para o seu desenvolvimento, que pode ser em c, mas
ha muitas outras para escolher. Ao nal deste livro voce deve se encontrar
no ponto de fazer esta escolha.
Iniciar o estudo de c pelos seus aspectos de linguagem de alto nvel, dei-
xando para o nal os indicativos de como se aprofundar na linguagem.
E porque C e t ao importante, mesmo que nalmente voce va programar em
outra linguagem? Algumas das respostas para esta pergunta sao as seguintes:
SUM

ARIO 15
A primeira e aquela que ja mencionamos algumas linhas atr as, pratica-
mente tudo que roda nos computadores hoje, ou e feito em c ou com al-
guma ferramenta que foi feita em c e, como consequencia, por tras de tudo
isto sempre podemos encontrar as pegadas desta importante linguagem.
Em geral, na solu cao de problemas computacionais se usa c como uma
linguagem nal para escrever na forma denitiva os algoritmos que estao
rodando bem e sem erros e muitas vezes para escrever pequenos peda cos
crticos do algoritmo, nao o algoritmo todo. Quer dizer que se come ca a
escrever numa outra linguagem que, por alguma razao, e mais apropriada,
e quando se conseguiu montar o algoritmo, funcionando, sem erros, se o
traduz para c ou pelo menos parte dele e traduzido para c.
Outras vezes se escreve em c uma outra linguagem de alto nvel na qual se
produzem os programas. Neste caso, o que e comum fazer-se e, continuar
espandindo esta outra linguagem com novos modulos escritos em c. Esta
e, possivelmente, o uso mais comum da linguagem c.
Seria um erro nao mencionar aqui a estensao construida para c que se
chama c + +. Esta e uma nova linguagem mas que admite c como uma
sub-linguagem, quer dizer que voce pode programar exclusivamente em
c + + mas voce pode misturar as duas de uma forma conveniente. Outro
exemplo e Python que e uma linguagem um pouco mais nova que C + +
e que admite tambem c como uma linguagem de estensao. Mas aqui
teriamos que fazer uma lista com uma dezena de linguagens, ou mais,
para as quais isto e verdade.
No ndice remissivo voce encontra uso de c, remetendo-o para outros pon-
tos no livro onde mostramos pequenos exemplos de uso da linguagem
na constru cao de outras ferramentas. Nao espere, obviamente, encontrar
nada revolucionario a nvel de um livro introdutorio, como este...
Por todas estas razoes e importante conhecer a linguagem c.
Por outro lado ela e facil de se aprender e serve como uma primeira linguagem
de programa cao.

E este o intuito principal deste livro: apresentar c como
uma primeira linguagem de programa cao. Por exemplo, e faclimo escrever
programas em Portugues que rodem em C e seria um pouco mais difcil de fazer
o mesmo em qualquer outra linguagem de programa cao.
Observa coes e outros meios de comunica cao.
O texto e completado com observa coes de dois tipos. Um dos tipos se chama
claramente observa cao, o outro sao as notas de rodape.
Voce deve ler as observa coes na ordem em que elas aparecerem, mas sem
lhes dar muita importancia numa primeira leitura.
16 SUM

ARIO
Para lhe permitir uma busca mais acurada de informa c oes, o livro tem um
ndice remissivo alfabetico, ao nal, em que todos os conceitos que surgem nas
observa coes se encontram indexados, de forma que voce podera facilmente re-
tornar a eles quando achar necessario. Tambem se encontram indexadas todas
as palavras-chave do texto.
Quando falamos usamos encena cao para completar o sentido das palavras
usadas no discurso: mexemos as maos, o corpo e alteramos a entona cao da
voz. Para suprir um pouco deste teatro usaremos uma conven cao tipograca:
texto em it alico representa material que voce deve olhar com cuidado, possivel-
mente nao esta denido ainda e estamos usando a concep cao intuitiva do termo.
Quando usarmos texto tipografico estaremos fazendo referencia a um termo
tecnico ja denido anteriormente ou considerado bem conhecido como tal. As
palavras da linguagemc serao escritas no estilo tipografico. Quan-do usar-
mos letra pequena estamos lhe querendo dizer que o assunto e polemico e que ha
muito mais coisa para ser dito do que estamos conseguindo dizer naquele mo-
mento. Usamos texto sublinhado para chamar sua aten cao de um detalhe que
poderia passar desapercebido, tem o mesmo sentido texto em negrito.
Existe alguma tecnica para programar bem?
Bom, chamar de tecnica e um certo exagero, mas o que vamos dizer agora
e repetir umas tantas vezes ao longo do livro, pode aos poucos se tornar numa
tecnica de programac ao.
O segredo consiste em fazerem-se pequenos programas. Costuma-se dizer que
um programa nunca deve ser maior do que a tela do micro.

E possivel programar
assim com as linguagens que temos hoje, porque elas sao modularizadas, quer
dizer, um programa e um aglomerado de pequenos programas. Voce vai aos
poucos entender o que queremos dizer, mas torne esta ideia uma obsess ao: nunca
fa ca um programa que passe em tamanho da tela do micro.
O maior problema de um programador sao os erros que teimam em se es-
conder, como insetos, no interior dos programas. Os americanos os chamam
de bugs. Quanto maiores os programas, mais lugar os insetos encontram para
se esconder, acredite. Quando o programa ca do tamanho da tela, a gente
consegue rapidamente detectar os insetos e entao nao e necessaria nenhuma
tecnica de dedetizac~ao para consertar programas defeituosos. Mais `a frente
vou chamar sua aten cao dos ambientes de programa cao com que voce podera tra-
balhar, eles estao equipados com instrumentos para fazer esta dedetiza c aonos
programas.
Voce pode muito bem viver sem estes instrumentos de an alise de pro-
gramas se aprender, desde o incio, a programar bem, e, por outro lado, se
o seu programa for ruim, nem elas adiantam muito... e t ao difcil consertar
um programa mal feito, que e mais f acil re-aprender a programar e fazer outro
programa.
Parte I
Usandos os comandos em
Portugues
17
Captulo 1
Uma primeira suite de
programas
1.1 Como rodar um programa.
Depende do que voce dispoe como ambiente de programa cao.
Infelizmente alguns ambientes tem mais o objetivo de se apoderarem do
usuario do que ajuda-lo a ser um indivduo livre e criativo. Mas, se voce com-
prou este livro, entao voce quer ser livre e criativo, logo se prepare para descobrir
as coisas por si proprio e conte com algum auxlio por parte deste livro, mas nao
espere que o livro seja uma muleta para quem n ao quer superar as suas pr oprias
diculdades. Use o endere co eletronico do autor
1
para tirar algumas d uvidas,
mas fa ca isto de forma moderada. Discuta com outros colegas que ja dominam
um pouco assunto, este e certamente a melhor forma de evoluir em qualquer
ramo do conhecimento: trabalho em equipe.
Vamos discutir alguns ambientes de programac ao, para ser franco, tres am-
bientes: C da Borland, C da Microsoft, e o C da Fundac~ao GNU dentro de
um ambiente LinuX.
Vamos dar discutir com mais aten cao o primeiro, C da Borland, que e consi-
derado por todos trabalham como esta linguagem como o melhor existente para
Windows. Tambem existe um ambiente mais antigo, ainda em franco uso, que e
Turbo C. O que dissermos sobre o C da Borland vale muito aproximadamente
para Turbo C.
O ambiente do C da Microsoft segue os padroes habituais de ambientes
gracos dentro do Windows, de formas que, se voce estiver acostumado a tra-
blhar dentro deste sistema, rapidamente podera adaptar o que dissermos sobre
C da Borland para o ambiente da Microsoft.
Observe, entretanto, que este livro nao e um manual para estes ambientes,
e sim um livro para ensina-lo a programar em c, portanto a nossas discussao
1
tarcisio@member.ams.org
19
20 CAP

ITULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS


sobre ambientes de determinados pacotes, tem que ser breve. Alem do mais,
todos estes pacotes computacionais tem manuais que lhe poderao apresentar
suas possiblidades de forma muito mais efetiva do que nos poderiamos fazer
aqui.
A melhor forma para dominar estes ambientes integrados de programa cao
consiste em gastar algum tempo descobrindo a funcionalidade dos botoes que
eles oferecem. Voce podera fazer isto com tranquilidade e sem o menor receio de
estragar o sistema, porque ele foi feito para ser usado. A pior coisa que poderia
acontecer seria que voce apagar algum programa gravando outro por cima, e isto
com certeza vai acontecer em algum momento, portanto e melhor que aconte ca
logo no come co quando o prejuizo ainda sera pequeno... Portanto perca algum
tempo experimentando os botoes do ambiente integrado.
Os dois outros ambientes serao apenas citados, se voce n ao tiver op cao para
trabalhar em LinuX, devera completar o conte udo deste livro com o manual
do C correspondente, mas que tranq ulo, as diferen cas s ao pequenas e sao
importantes apenas no come co.
1. O ambiente BC Suponhamos que voce esteja no Windows e que esteja
usando o BC, Borland C. Como ja disse, gaste algum tempo para reco-
nhecer o ambiente integrado
2
do BC, o IDE
3
. Ele se chama assim, ambi-
ente integrado, porque lhe oferece um atelier onde produzir os programas,
guarda-los, e automaticamente roda-los. Observo que voce tambem corre
o risco se tornar excessivamente dependente do ambiente integrado, pro-
cure evitar esta dependencia, e fa ca um uso inteligente do ambiente, aos
poucos voce mesmo vera o que esta advertencia signica.
Assim que voce tiver gasto uns quinze minutos experimentando o ambiente
integrado, passe para o quarto item desta lista.
Ao estabelecer quinze minutos estamos exatamente querendo lhe dizer que
nao procure entender tudo que se encontra `a sua disposi c ao dentro do am-
biente integrado, e voce logo vai ver que, se aprender a programar correta-
mente, muitas das ferramentasdisponveis sao in uteis, e, pelo contrario,
se voce vier a precisar delas isto signica que estara programando mal....
e a sera preciso, de fato, usar estas ferramentas.
Parte do que ha disponvel no ambiente integrado so lhe ser a util mais a
frente, quando seus programas ganharem mais densidade e ja estiverem
caminhando na dire cao de um projeto.
Digamos que, no momento, o mais importante e aprender a
abrir um arquivo, (codigo fonte), encontrar um arquivo no disco; Para
isto use o botao File. Experimente agora, clique no botao e vai cair
um menu com
(a) new, (novo) se voce quiser come car um novo programa. Nunca
fa ca isto! Entre os meus programa tem um que se chama esqueleto.c,
2
muito semelhante ao ambiente do Turbo C
3
IDE - Integrated Development Environment
1.1. COMO RODAR UM PROGRAMA. 21
comece abrindo este programa para nao come car do zero... Crie
um esqueleto.c para voce.... Veja abaixo o que voce pode fazer
com esqueleto.c !
(b) open para voce abrir um programa existente no disco. Voce pode
indicar o caminho onde o BC deve procurar o arquivo;
(c) save para voce gravar o programa que estiver escrevendo, ob-
serve que basta acionar F2
(d) save as, (gravar como), para voce escolher um outro nome de ar-
quivo onde gravar o programa. Use esta op cao com o esqueleto.c.
Abra esqueleto.c e o grave com o nome que desejar. Voce ja
tera o novo programa na sua frente depois que zer isto. Expe-
rimente, abra esqueleto.c e o grave como teste.c.
(e) change dir e para mudar diretorio, provavelmente pouco util no
come co.
(f) print para enviar para a impressora uma copia do programa que
estiver na tela.
(g) DOS shell para usar o DOS, pouco util para os usuarios do windows...
(h) quit quando voce quiser ir embora...
procurar uma palavra num arquivo e trocar palavras erradas e isto
voce vai fazer com o botao search, (procura). Nos editores de texto,
em geral isto se faz com o botao edit, aqui nao. Se voce quiser
traduzir para o ingles os nosso programas, vai usar este botao. Nele
tem
(a) find para procurar uma palavra.
(b) replace para procurar e trocar palavras. Vao aparecer dois
campos, no primeiro para voce indicar qual a palavra que deve
ser trocada, no segundo, o que a deve substituir.
Ha varias op coes para voce ligar ou desligar sensvel `a mauscula,
palavras completas, express~oes regulares, pergunta ao trocar,
forward (pra frente), backward (pra tras), from cursor (a par-
tir do cursor), entire scope (no documento todo), OK, change
all (muda tudo), cancel e help...
(c) go to line number (vai para uma linha de n umero), e espera
que voce indique o n umero da linha.
rodar o programa guardado num arquivo. Voce vai usar o botao run.
Quando clicar cai um menu contendo
(a) run que vai rodar o programa
(b) program reset, botao importantssimo.
Quando voce tiver rodado um programa e, depois, zer modi-
ca coes, se pedir para rodar, o BC vai rodar o anterior.
Clique no program reset - (renova o programa), e depois no
run.
Este e um erro comum, se voce alterar um programa e tudo voltar
acontecer como antes, se lembre de fazer o reset.
22 CAP

ITULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS


compilar um programa. Voce vai fazer isto com o botao compile.
Clique no botao e ao cair o menu, escolha compile.
congurar os diretorios de trabalho Se voce tiver instalado o pacote
usando o instalador entao nao tem porque se preocupar com este
item. Se sua instala cao nao for a padronizada voce corre riscos de
que o C da Borland nao encontre os arquivos necessarios. Neste caso
voce deve ir ao botao Options, la escolher a Directories (diretorios)
e registrar cuidadosamente a arvore dos diretorios onde se encontram
os arquivos. Veja na gura (g. 1.1) pagina 22, como se encontra
Figura 1.1: arvore de diret orios - BC
organizada a arvore de diretorio no meu micro de trabalho.

E pre-
ciso indicar o disco e todo o caminho anterior aos diretorios que BC
procura:
BGI BIN OUT BINOUT INCLUDE LIB
Ao abrir o item Directories voce ja deve encontrar uma se cao de
arquivos. Veja se tudo esta de acordo com sua instala cao.
help
C da Borland tem um auxlio (help) muito bom que e preciso apren-
der a usar. Infelizmente nao ira funcionar com os programas escritos
em portugues. Experimente o programa
4
primeiro01.c. O comando
4
os programas para BC ganharam nomes mais curtos, em vez de primeiro01.c, procure
prim01.c
1.1. COMO RODAR UM PROGRAMA. 23
inicial do programa e clsscr(); que serve para limpar a tela. Co-
loque o cursor sobre esta palavra e aperte ctrl-F1. O resultado
e uma pequena
5
janela com informa coes especcas sobre este co-
mando. Aprenda a fazer uso destas informa coes, elas sao um manual
da linguagem on-line. Para sair do help, acione a tecla ESC.
Se voce apertar F1 vira o manual do C da Borland.

E um conjunto
de varias janelas descrevendo toda a linguagem. Eu nao poderia
deixar de sugerir que voce se habituasse a ler este manual on-line.
Infelizmente em ingles, mas se voce nao se acostumar a, pelo menos,
ler em ingles, cara cortado de grande parte das informa coes tecnico-
cientcas. Voce sai do manual acionando a tecla ESC.
2. O ambiente C da Microsoft Se voce estiver o usando o Microsoft C,
tambem voce vai dispor de um ambiente integrado bem parecido com o
ambiente do Borland C.
Leia o item anterior e gaste uns 15 minutos para ganhar experiencia com
o Microsoft C e depois passe para o quarto item desta lista. O objetivo
principal e carregar um programa para dentro do editor de textos e depois
roda-lo. Valem as mesmas observa coes que ja zemos sobre a congura cao
da arvore de diretorios. Nenhum sistema operacional pode advinhar onde
se encontram os seus programas ou os arquivos de dados, tudo isto tem
que ser registrado nas op coes.
Como sempre, o ideal e instalar os pacotes usando o programa apropriado
para isto, ele se ocupara de toda a congura cao basica. Nao fazer isto e
querer dores de cabeca. Se voce for um usuario experiente, podera, possi-
velmente, brincar com a congura cao, caso contrario use os instaladores.
3. Em ambiente Linux Em geral ninguem instala Linux manualmente
6
,
tudo e feito por um instalador que vem junto com a distribui cao adqui-
rida. Estes instaladores, habitualmente, deixam a linguagem c instalada
corretamente, ate mesmo porque c e a linguagem natural para Linux, de
modo que, tudo que voce tem que fazer e trabalhar com seus programas
no seu diretorio pessoal.
Em LinuX voce conta com diversos ambientes integrados, por exemplo,
wpe, xwpe, xcoral, xemacs ou o espartano joe, para citar alguns.
Em alguns deles voce deve indicar o modo com que deseja trabalhar, o
modo C . O xemacs entra no modo C automaticamente se voce abrir um
arquivo com extensao .c. Se o xemacs estiver bem instalado voce pode
contar com um ambiente integrado muito poderoso lhe oferecendo inclusive
uma ajuda on-line sobre os conceitos da linguagem. Aprenda a usar o
ambiente integrado que voce tiver escolhido. Se voce tiver paciencia para
usa-lo, tera uma poderosa ferramenta nas maos.
5
se n ao funcionar, coloque o cursor sobre a palavra, clique no bot ao help e, no menu que
cair, escolha topic search; procure help no ndice remissivo
6
nem Linux, e nem nenhum outro sistema complexo
24 CAP

ITULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS


Se tiver escolhido joe a voce vai penar um pouquinho mais, mas foi porque
voce mesmo quis...eu uso o joe e me dou muito bem. joe e um editor
de textos muito poderoso mas difcil de usar pois e orientado a comandos
no padrao dos editores da Borland, do Turbo C ou do Turbo Pascal, ou
ainda do wordstar dos anos 80 que foi um poderoso ambiente de edi cao
para aquela epoca.
Ainda existe uma outra possibilidade, seria usar o vi, mas se esta for a sua
escolha, entao, fora de d uvidas voce pertence a fac cao mais xiita do Unix
e eu nao tenho d uvidas de que voce esta lendo este livro somente para sa-
can(*) o autor... porque certamente voce deve ser um exmio programador
em C.
4. Come cando a trabalhar Suponhamos que voce ja tenha ganho experien-
cia com o ambiente integrado de sua escolha. Abra agora uma janela de
edi cao. Escolha o primeiro botao `a esquerda onde estiver escrito FILEou
ARQUIVO.
Se o ratinho
7
nao estiver disponvel, voce pode chegar ao menu superior
com F10
8
e depois manipular os botoes do menu usando as setas para
esquerda, direita ou para baixo.
Clique com o ratinho, (ou com a seta para baixo) e escolha open ou
abrir, para abrir um dos programas que voce ja deve ter gravado no
HD. Este incio sera semelhante em todos os ambientes. Escolha o pri-
meiro programa abaixo e rode-o. Os manuais que acompanham BC ou
Microsoft C trazem programas bem elementares do tipo primeiro.ce
lhe informam como roda-lo.

E tudo que voce precisa para come car, depois
aos poucos voce ira aprendendo como usar melhor o ambiente ate o limite
do necessario, (ou se preferir, que um expert no uso destes ambientes...).
5. Em LinuX a coisa pode ser tao simples como escrever numa shell
9
gcc -v primeiro.c -oprimeiro
ou
gcc -Wall primeiro.c -oprimeiro
em que
gcc e o nome do compilador produzido e distribuido pela Funda c ao
GNU, gindica isto, ccsignca compilador c.
-v e sua solicita cao de verbosidade, voce deseja que o compilador
lhe diga o que zer. Evite esta op cao no come co, para nao se afogar
nas informa coes que lhe serao apresentadas. Use -Wall em vez de
-v.
7
tambem chamado mouse....
8
em alguns casos ser a com F9, ESC ou TAB, sem d uvida, e melhor garantir que o ratinho
funcione...
9
uma area de trabalho
1.1. COMO RODAR UM PROGRAMA. 25
-Wall Parecido com -v, mas lhe apresenta apenas as reclama coes
mais importantes, muito bom para quem se inicia.
primeiro.c e o nome do arquivo-fonte
10
.
-o e a op cao de compila cao que indica qual e o nome do arquivo que
devera ser criado. Neste exemplo escolhi primeiro.
Em princpio o Borland C aceita alguma coisa do tipo:
bc primeiro.c
para fazer o que descrevemos acima, produzindo um arquivo chamado
primeiro.exe. Porem, voce tera diculdades com o caminho para que
BC encontre o programa que voce deseja compilar. A forma mais sim-
pels de usar Borland C e mesmo dentro do ambiente integrado onde voce
facilmente congura os diretorios em que se encontram os seus programas.
Vamos supor o uso do ambiente integrado
11
. Abra um programa, prim01.c,
por exemplo. Com o programa visvel na janela de edi cao, clique no botao
RUN e seu programa sera compilado e em seguida executado. Os programas
deste livro podem ter
12
um defeito que sera preciso corrigir, para que eles
funcionem bem em C da Borland. Vamos descrever o problema e a
solu cao:
Quando um programa termina de ser executado, dentro do ambiente
integrado, o ambiente automaticamente retorna ao texto do programa
(codigo fonte). Conseq uencia, voce pode nao ver o resultado do pro-
grama. Para programa pequenos, como os nossos primeiros progra-
mas, voce pode car com a sensa cao de que nada aconteceu...
De fato isto nao e um problema, voce logo vera que e uma vantagem,
porque assim o ambiente o tras de volta ao texto do programa (codigo
fonte) colocando uma marca vermelha em cima de algum erro que o
compilador tenha encontrado.
Mas se nao houver erros, e decepcionante... e voce poder a evi-
tar acrescentando no programa, antes do comando return
13
, o co-
mando getchar() Tentamos incluir em todos os programas o co-
mando pausar() que e uma redenic ao do getchar(), mas podere-
mos ter esquecido em algum caso. Se nao acontecer nada, verique
ao nal do programa se nao falta pausar() ou getchar().
Dentro do Windows/DOS, um arquivo so pode ser executado, se terminar
com as extensoes
.exe .com .bat
10
arquivo fonte e o arquivo em que se encontra o programa que voce escreveu
11
IDE
12
tentamos eliminar este problema, mas ainda pode ter cado em algum programa, voce
deve, ent ao ser alertado
13
que por regra, todos os programas em C devem ter como ultima instru c ao
26 CAP

ITULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS


Em LinuX nao e o nome que indica isto, mas alguns dados internos do ar-
quivo e gcc se ocupa disto, primeiro", compilado com as intruc~oes
descritas acima, sera um programa executavel.
Observa cao: 2 Erros e problemas
Problemas ao usar BC. Observe que, ao enumerar problemas, n ao estamos
sugerindo que um pacote e de baixa qualidade. N ao existem grandes programas,
sem erros, a n ao ser os programas mais mais simples. O defeito se encontra em
esconder os erros. Isto e de fato indecente. Este livro tinha muitos erros que
foram corrigidos com auxlio de leitores amigos.
Dicilmente conseguiriamos listar todos os problemas, mas indicaremos al-
guns mais importantes no momento apropriado, como agora.
Quando voce rodar um programa, se zer uma alterac ao no mesmo, observe o
item program reset (re-inicializa cao do programa) dentro do menu RUN. Com
freq uencia o compilador guarda na mem oria a vers ao anterior do programa.
Eis a raz ao deste bot ao. Aperte o bot ao antes de voltar a compilar ou rodar o
programa.
Se voce ainda n ao apertou em todos os bot oes do ambiente integrado que
estiver usando, faca-o agora, para pelo menos ver o que eles contem.
Se voce n ao alterar nada, n ao ir a estragar nada, tambem...olhar n ao faz
mal
14
.
Vocabulario: 1 compilar, compile, execut avel, rodar, run
compilar em ingles, compile, e uma das func oes do compilador, fazer
uma an alise sint atica do c odigo fonte para vericar se as regras (sintaxe)
da linguagem de programac ao foram todas respeitadas. Se isto for verdade,
o compilador cria um execut avel.
execut avel e um arquivo que o sistema operacional considera que pode fa-
zer algum processo, produzir um resultado. Este e o objetivo principal dos
programas de computador...este conceito se op oe ao de c odigo fonte. Ao
criar um execut avel, este programa poder a ser executado em outro com-
putador, que roda o mesmo sistema operacional. Se voce tiver compilado
com o BC, poder a rodar o programa em qualquer computador sob Windows.
Se voce tiver compilado com gcc, poder a rod a-lo em qualquer computador
sob Linux
15
.
c odigo fonte e o texto que voce escreveu como programa e gravou em um
arquivo no disco. Ele precisa ser compilado para que seja gerado um exe-
cut avel que o sistema operacional ir a permitir que rode.
rodar, em ingles run, executar um programa.
Agora vamos apresentar-lhe um bloco de exerccios. Voce n ao conseguir a
aprender nada sem fazer exerccios, muito menos podera aprender a programar
14
algumas vezes, talvez...
15
existe um compilador gratuito, djdev para DOS/Windows, veja no ndice remissivo
1.1. COMO RODAR UM PROGRAMA. 27
sem fazer exerccios de programac ao
16
. A grande maioria dos programas deste
livro, sao exerccios. Os programas dialogam com voce pedindo que voce
volte a ler o programa e corrija erros que deixamos nos programas. Em geral o
programa seguinte contem a corre cao de um erro, e mais outro erro...
Exerccios: 1 Os primeiros programas
O objetivo deste bloco de exerccios e a compreens ao do programa
primeiro.c
Vamos ent ao pedir que voce
rode e leia,
nesta ordem, os programas primeiro01.c
a
, primeiro02.c, ...
primeiro07.c que ir ao desembocar em primeiro.c que se encon-
tra editado a seguir.
a
para DOS,Windows, use os programas com nomes curtos, prim01.c,
prim02.c,. . . porque primeiro01.c se confunde com primeiro02.c
1. Rode e depois leia primeiro01.c.
gcc primeiro01.c -Wall -oprog
./prog
17
2. Volte a a rodar e ler primeiro01.c procurando entender cada linha de
comando do programa. Em particular leia os coment arios, o texto inicial
do programa, e veja como ele se encontra destacado do corpo do programa.
Analise o objetivo dos coment arios, inclusive o registro de que o programa
contem erros.
3. Corrija o coment ario de primeiro01.c indicando qual e o erro o programa
comete: a falta de n.
4. Rode e depois leia primeiro02.c.
gcc primeiro02.c -Wall -oprog
./prog
Altere o programa, como ele mesmo sugere, e tente compil a-lo, analise a
mensagem de erro. Experimente apagar alguns ponto-e-vrgulas, com-
pile e analise a mensagem de erro. A falta de um unico ponto e vrgula
pode gerar uma imensid ao de mensagens de erro. Experimente, apague
18
um ponto-e-virgula e compile o programa. Esta e uma diculdade que
os compiladores tem, antes se perder na leitura de uma enxurrada de men-
sagens de erro verique se n ao falta um simples ponto e vrgula.
5. Rode o programa primeiro03.c. Ele mente, corrija-o.
16
repetiremos mais ainda algumas vezes esta observa c ao, para conscientiz a-lo de que n ao
ser a apenas lendo, que aprender a a programar
17
se o sistema estiver bem instalado n ao ser a necess ario ./, bastar a prog...
18
voce n ao precisa apagar, basta colocar // na frente
28 CAP

ITULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS


6. Rode os programas primeiro04.c, primeiro05.c e faca o que eles suge-
rem.
7. Leia e rode o programa primeiro06.c. Este programa e um contra-
exemplo. Ficou muito grande, saiu da tela. Veja como ele e extranho,
tem uma linha de n umero 12 que aparece v arias vezes, isto e um sintoma
de imperfeic ao...
8. Melhore a redac ao no programa primeiro07.c, tem letra mascula depois
de vrgula, e precisa de algumas mundacas de linhas... mas tome cuidado
para que o resultado n ao que ilegvel...
9. Um exerccio importante: como re-utilizar um programa. Escolha algum
dos programas que voce acabou de usar, algum que lhe tiver parecido es-
pecial. Grave-o com outro nome, por exemplo teste.c
19
. Em Linux ser a
o mesmo se voce estiver usando alguma IDE, ou numa,
20
shell, digite
cp primeiro01.c teste.c
Agora voce tem o mesmo texto de primeiro01.c (ou prim01.c) dentro
do arquivo (ainda n ao gravado) teste.c. Rode este novo programa depois
que voce nele faca algumas modicac oes que lhe parecam interessantes.
Este e o metodo que n os, programadores, usamos para construir novos
programas...nunca comecamos do zero.
No ultimo exerccio lhe contamos o segredo de como escrever novos progra-
mas. Deixe-me contar-lhe outro. Entre os programas que voce recebeu est ao
dois iguais, esqueleto.c e padrao.c. Sao este programas que usamos para
come car a escrever outro.Crie os seus, com os seus dados, e com as estruturas
de programa cao que considerar basicas.
O texto abaixo e uma copia do arquivo primeiro.c que voce tem no disco.
Nele nao ha os sinais de acentua cao da lingua portuguesa, e um programa de
computador e nao um texto em nossa lingua.
/ Programa primeiro.c
Assunto: Escreve algumas frases e recebe uma informacao pelo teclado.
Programa com erros na saida de dados, nao imprime o que se espera.
COMENTARIO
Este texto inicial do programa eh um COMENTARIO e
se encontra demarcado com barra+asteriscono
inicio e depois asterisco+barraao nal.
Programa dene a variavel coisa como um vetor de caracteres
com 30 coordenadas.
por Tarcisio Praciano Pereira - 10 licoes para aprender C
Sobral, julho de 2001 - UVA
/
// isto aqui tambem eh um COMENTARIO
19
no BC escolha save-as e use a caixa de di alogo que aparece para, nela, escrever teste.c
20
area de trabalho
1.1. COMO RODAR UM PROGRAMA. 29
#include < stdio.h >
#include traducao.h
principal()
inicio
palavra coisa[30]; // variavel
imprima(%sn, Escreva uma frase no teclado, );
imprima(%sn, pode ser o seu nome, por exemplo: );
ler(%s, coisa);// leitura de dados pelo teclado
imprima(%sn,-);
imprima(Voce escreveu: %s %cn, coisa, ?);
imprima(%sn,-);
imprima(%sn,Agora leia o programa para );
imprima(%sn,acompanhar a critica que vai ser feita.);
imprima(%sn,-);
imprima(%sn,Observe que ler nao obedeceu a regra);
imprima(%sn,de uso do direcionador & de enderecos,);
imprima(%sn,como anunciamos no texto....);
voltar 0; // todo programa deve terminar com este comando
m
Exerccios: 2 An alise de primeiro.c
1. Rode o programa primeiro.c e depois o leia.
2. Ao compilar primeiro.c, voce recebeu uma advertencia:
primeiro.c:22: warning: return-type defaults to int
porque foi omitido o tipo de principal() e ao nal o valor devolvido e
zero. Um conito. Corrija isto, dado um tipo para principal():
inteira principal()
A advertencia se comp oe de tres partes, separadas por dois pontosque e
o separador ocial do Unix:
primeiro.c o nome do programa;
22 a linha em que o erro foi detectado;
warning, um aviso. Se o erro for mais grave ser a error.

E o tipo
de dados da func ao principal() que n ao foi fornecido.
Em c todas as func oes ou vari aveis tem que ter um tipo.
3. Rode o programa primeiro.c digitando o seu nome sem espacos.
4. Digite uma seq uencia de mais de 30 caracteres como resposta ao programa,
e analise o resultado.
30 CAP

ITULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS


A solu cao para que o compilador deixe de reclamar contra primeiro.c e
denir
inteira principal()
Deixamos este erro car de proposito, para justicar esta observa cao. Ao mesmo
tempo acrescentamos: somente na segunda parte e que discutiremos a fundo a
questao do tipo de dados a que se encontra afeto este problema.
Infelizmente vamos ter que trabalhar com tipos de dados antes de conse-
guirmos explicar tudo direitinho eis a razao do erro ter cado. Anal, erros sao
parte do aprendizado...
Se voce quiser avan car este assunto, veja o captulo 7 onde discutimos tipos
de dados, voce deve, agora, fazer uma leitura rapida daquele captulo para se
inteirar desta no cao.... e voltar logo para ca.
Voce esta aprendendo a programar em C, com os comandos traduzidos para o
Portugues, e os programas em portugues estarao rodando...
No proximo captulo trabalharemos com a suite de programas prog*.c...
la discutiremos esta nota cao extranha, formatadores de dados que aparecem
dentro da fun cao imprima(). Mas pode fazer uma leitura r apida do captulo 2
agora.
Exerccios: 3 Alterando primeiro.c
Os dois ultimos exerccios desta lista est ao fora do contexto, e portanto s ao
difceis para o iniciante. Eles se eoncontram aqui apenas para mostrar alguma
coisa do que pode ser feito com c.
1. Altere o texto dentro da func ao imprima(), por exemplo, mande escrever
o seu nome.
2. Altere substancialmente o texto de todas as func oes imprima() no pro-
grama, por exemplo, mande escrever os nomes dos seus amigos e amigas.
3. Altere o texto das func oes imprima do programa, por exemplo, para escre-
ver uma pequena lista telef onica. Pode ser a sua lista telef onica particu-
lar...
4. Voce viu que um programa pode colocar um texto na tela, altere primeiro.c
para colocar um texto seu na tela do computador, por exemplo, um lem-
brete sobre as coisas que voce deve fazer no dia. O execut avel assim criado,
pode ser incluido no autoexec.bat do DOS/Windows e rodar sempre que
voce ligar o computador.
1.1. COMO RODAR UM PROGRAMA. 31
5. ** fora do contexto Rode o programa agender01 p.c e depois o leia:
gcc -Wall -oprog agender01 p.c
./prog
A primeira linha serve para compilar o programa, quer dizer, pedir ao gcc
que crie um programa execut avel a partir do c odigo fonte. A segunda linha
e para executar o arquivo execut avel prog.
6. ** fora do contexto Se voce quiser compor sua lista telef onica em disco,
veja agender01 p.c. Tente modicar o programa, sem se preocupar com
entende-lo, e faca sua agenda. Se precupe apenas com alterar as mensa-
gens dentro das func oes imprima(), imprime arq(). O arquivo produ-
zido pelo programa poder a ser lido, e editado, depois, com qualquer editor
de textos e enviado para a impressora.
32 CAP

ITULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS


Captulo 2
O segundo programa em C
2.1 Programas e erros...
Observa cao: 3 Regras de trabalho
Vamos sempre comecar por lhe apresentar um programa;
voce deve digit a-lo
1
num editor de textos
2
;
depois rode o programa com o compilador que estiver ` a sua disposic ao
e em seguida leia os coment arios que faremos e tambem os coment arios
feitos pelo compilador, sobretudo porque voce pode ter esquecido de digitar
algum direcionador de mem oria & ;
tome a iniciativa de fazer alterac oes nos programas usando a experiencia
que for adquirindo, mas grave-os com nomes diferentes; Aqui voce vai ad-
quirir experiencia sobre um erro muito comum: perder programas porque
gravou por cima algum outro programa. Esta e uma dor de cabeca co-
mum a todos os programadores. Tenha por h abito fazer backup, c opia de
reserva, dos seus programas. Tenha o cuidado de gravar a alterac ao de
um programa, com outro nome:
prog01.c prog02.c ...prog101.c
e voce vai sempre encontrar o mais recente, ou algum mais antigo que
funcionava tao bem. . .
aos poucos deixaremos de transcrever os programas no livro, e mais pr atico
que voce leia os programas com um editor de textos, inclusive quando os
rodar, e interessante te-los numa tela ao lado.
1
Todos os programas do livro se encontram distribuidos em disco para economisar-lhe a
digita c ao. Basta carreg a-los para o editor.
2
grave os programas no modo texto, (sem acentos) Se voce estiver usando alguma IDE
(ambiente integrado) o editor e pr oprio para programa c ao. Se estiver usando algum editor
como word, tome o cuidado para gravar os programas no modo texto.
33
34 CAP

ITULO 2. O SEGUNDO PROGRAMA EM C


Exemplo: 2 O primeiro programa
/* Programa prog01.c
Assunto: le uma palavra pelo teclado e a imprime
por Tarcisio Praciano Pereira - 10 licoes para aprender C
Sobral, julho de 2002 - UVA
*/
# include < stdio.h > // (1) leitura da biblioteca stdio.h
# include traducao.h// (2) leitura da biblioteca traducao.h
inteiro principal() // (3) inicio do programa, tipo palavra
inicio
palavra coisa; // (4) declaracao de variavel
imprima(%s\n,
escreva alguma coisa pelo teclado, palavra, numero...); // (5)
ler(%c,&coisa); // (6)
imprima(%s%c\n,O primeiro caracter da coisa foi > ,coisa); // (7)
imprima(%s\n,==========================);
voltar(0); // (8)
m // (9)
Coment arios do programa.
Os comentarios s ao parte integrante de um programa e de forma alguma
devem ser considerados um apendice extra perfeitamente dispensavel. Um
programa e uma peca de abstrac ao, escrito em linguagem tecnica, em geral
muito conciso, e, consequentemente, difcil de ser lido. Os comentarios vem
suprir informac oes complementares e tornam o programa legvel.
Coment arios podem ser caracterizados de duas formas:
Com duas barras, //. O compilador ignora o que venha depois ate o
nal da linha.
Entre os sinais / e * no comeco, e revertidos ao nal * e /. Veja
logo no inicio do programa.
Quando se vai escrever um comentario longo, este segundo metodo,e o mais ade-
quado. Pequenos coment arios, como acima, depois de um comando, e preferivel
usar o primeiro metodo. Mas a decis ao e o estilo s ao seus. H a programadores
que usam colunas de asteriscos no incio e no nal de cada linha de um bloco
de coment arios para torn a-lo mais ostensivo. Vale tudo, desde que voce n ao se
atrapalhe (nem atrapelhe os outros) com a poluic ao visual...
Os coment arios servem para explicar o programa (inclusive para o pr oprio
autor...) ou tambem como parte do planejamento do trabalho. No inicio do
programa os coment arios dizem o que o programa faz, quem fez o programa,
as modicac oes que se pretendem fazer nele, os defeitos que ainda existam, etc...
2.1. PROGRAMAS E ERROS... 35
Os coment arios que zemos usando // tem uma numerac ao que vai servir
de referencia para uma sec ao de observac oes que costumamos fazer ao nal dos
programas. Veja, por exemplo, musica.c, n ao tente compreender o programa
agora, veja apenas como estamos usando os coment arios numerados. E, claro,
voce pode rodar e ler o programa, mas observe (leia o programa) ele necessita
que no sistema exista um programa chamado bell que acione o alto-falante
do computador. Troque bell pelo nome certo. Se este programa n ao existir
nada vai acontecer.
1. A linguagem C, como toda linguagem moderna, e expansvel, quer dizer,
voce pode criar novos comandos, s ao as func oes. Cada func ao e um novo
comando. Estes comandos novos cam com freq uencia dentro de arquivos
chamados bibliotecas. O programa comeca lendo a biblioteca padr ao do
C para Input/Output - < stdio.h > Entrada/Saida. Leia tambem a nossa
biblioteca, traducao.h, em que zemos as traduc oes dos comandos da
linguagem C. As bibliotecas s ao arquivos com a extens ao .h e cam
colocados em diret orios especcos que o gcc sabe quais s ao. Quando
quisermos incluir uma biblioteca nossa, como traducao.h, temos que
usar aspas em volta da biblioteca e ent ao gcc vai procur a-la no diret orio
de trabalho, ou no diret orio indicado pelo caminho que indicarmos:
# include "/home/meu nome/C/minha biblioteca.h"
2. erro grave concluir da observac ao anterior que voce pode construir uma
linguagem c especial para voce, com seus pr oprios comandos.

E verdade,
mas seria in util. Linguagens, mesmo de computador, existem para que
as pessoas se comuniquem. O conhecimento e social e n ao individual.
S o podemos ser avancados na medida em que o grupo social o seja junto
conosco. N ao teria sentido criar o seu c! Mas tem sentido pensarmos em
programar em Portugues, aqui no Brasil, e seguir entendendo programac ao
em Ingles.
3. Exerccio: Experimente! Apague
# include < stdio.h >
e rode o programa:
gcc -Wall prog01.c -oprog.
Como resultado voce vai receber a informac ao que printf(), scanf()
est ao sendo usados pela primeira:
prog01.c:14:
warning: implicit declaration of function printf
O gcc vai ignorar, pedantemente, a nossa traduc ao imprimae vai lhe fa-
lar de printffazendo o mesmo com scanf. Porque n os n ao traduzimos
o compilador.
4. estrutura de um programa H a dois tipos de func oes num programa:
36 CAP

ITULO 2. O SEGUNDO PROGRAMA EM C


main() A func ao principal(),
e as outras que a principal()chama.
Todo programa tem que ter uma func ao principal() e depois deve ter
outras func oes que executam tarefas especcas, tarefas auxili ares.
Neste programa a func ao principal()chama apenas outras func oes que
se encontram denidas na biblioteca stdio.h. Portanto as outras func oes
podem j a existir em alguma bibilioteca e inclusive podem j a ter sido usadas
e testadas por outro programa (melhor ainda).
5. Cada func ao e um pequeno programa. Neste sentido a linguagem c j a
nasceu moderna, no espirito de programac ao modular. Um programa se
constitui essencialmente de sua fun cao principal que ir a colocar em ac ao
os demais atores, as outras func oes, que foram feitas sob-medida para
executar pequenas tarefas especcas. Assim, um grupo grande de func oes
pode existir para compor, quando necess ario, um determinado programa.
Isto se chama hoje reciclagem de programas ou em ingles, re-use of
programs.
6. Vari aveis, func oes, tem que ter um tipo. A sintaxe da declarac ao de
vari aveis e
< tipo dados >< nome da variavel >;
Pode haver v arias vari aveis do mesmo tipo na mesma declarac ao, separa-
das por vrgulas.
7. leia acima... A linguagem C n ao distingue vari aveis e func oes em primeira
inst ancia. Inclusive o compilador, quando encontrar erros, vai se referir
` as vari aveis como func oes.
8. A func ao imprima() (printf()) exige que comecemos dizendo que tipo
de dados lhe fornecemos para imprimir: %s, quer dizer que vem uma
frase, (string), para ser impressa. O smbolo n e um comando:
mudanca de linha. Voce ver a depois que n n ao e um comando, agora
adianta pouco discutir esta diferenca sem antica.
9. ler() e a traduc ao de scanf() que e um comando muito r apido e pode
conduz-lo a erros. Use leia()(fgets()) como voce ver a nos pr oximos
programas. Usamos ler()para que o programa casse simples, mas e um
defeito.
Warning, Warning, Warning, Warning....!!!!
Rode prog04 2.c
3
para ver o risco do scanf(). Leia os coment arios,
dentro do programa.
10. Aqui imprima tem dois formatadores de dados, %d para inteiros, e %s
para frases (strings).
3
no diret orio BC este programa se chama prg04 2.c
2.1. PROGRAMAS E ERROS... 37
11. Toda func ao da linguagem C deve terminar com o comando voltar()
(return), e, com frequencia, com um n umero. Mais a frente voce vai ver
que isto e falso... Este n umero pode ser usado para fornecer ao sistema in-
formac oes sobre o comportamento da func ao, erros cometidos por ela, (na
verdade pelo programador...). Devolvendo zero signica que tudo correu
bem.
12. Os algoritmos comecam com inicio, , e termina com m . De
forma mais precisa, Os blocos logicos comecam com inicio e
terminam com m, .
Vocabulario: 2 Bloco l ogico e vari avel local
bloco logico e um conjunto de a coes, de comandos, que tenham um objetivo
especco. Uma func ao e um bloco logico, mas dentro de func oes voce pode
encontrar mais blocos logicos.

E um conceito difuso mas que aos poucos
voce compreender a.
Sempre que voce encerrar um conjunto de comandos entre chaves voce ter a
criado, para a linguagem c, um bloco l ogico.
Veja a import ancia deste fato: no incio de um bloco logico voce pode
denir vari aveis locais que deixam de existir ` a sada do bloco.
variavel local s ao vari aveis criadas dentro
4
de um bloco l ogico. Elas tem
sua existencia associadas ao bloco l ogico em que forem criadas. O conceito
que se op oe a este e o de variavel global. Podemos dizer que voce deve
evitar o uso de vari aveis globais e se habituar a usar apenas vari aveis
locais.
variavel global S ao vari aveis criadas fora de blocos l ogicos e que portanto
cam sendo reconhecidas por distintos blocos l ogicos. Algumas vezes somos
forcados a criar este tipo de vari avel, entretanto devemos inclusive deixar
indicativos no cabecalho do programa apontando a existencia delas numa
tentativa de elimin a-las, se possvel. Como estas vari aveis tem uma
existencia ampla, h a riscos que no planejamento nos esquecamos de suas
presencas e elas, assim, interram nos resultado de forma inexperada.
Vari aveis globais s ao um risco a ser evitado. Quando voce tiver que denir
uma vari avel global, indique isto no cabecalho do programa como uma
forma de aviso de existe um problema no programa.
No disco que acompanha este livro, ha um diretorio chamado BC em que os
programas foram testados em ambiente Borland, BC ou TC. Tambem os nomes
dos programas cam dentro do limite do DOS de oito caracteres. Programas que
fujam a este padrao tem seus nomes corrompidos pelo ambiente de programa cao
da Borland.
4
no incio de um bloco l ogico
38 CAP

ITULO 2. O SEGUNDO PROGRAMA EM C


Exerccios: 4 Alterac oes no programa
5
prog01.c
1. Compile e roda o programa
6
prog01.c.
2. Se voce digitou uma palavra, o programa guardou somente a primeira letra.
Experimente digitar n umeros, analise o resultado.
3. Altere
7
prog01.c, subsitua
palavra coisa; // (3) declaracao de variavel
por
palavra coisa[30]; // (3) declaracao de variavel,
agora compile-o e veja que o resultado foi desconcertante, uma montanha
de erros foram anunciados.
gcc -Wall -oprog prog01.c
prog, para executar o programa.
Leia o relat orio de erros e veja nos pr oximos exerccios a sada.
4. Substitua
ler("%c",&coisa); // (5)
imprima("%s%c\\n","A primeira letra foi -> ",coisa); // (6)
por
ler("%s",coisa); // (5)
imprima("%s%s\n","A primeira letra foi -> ",coisa); // (6)
e veja o resultado digitando uma palavra com ate 29 letras.
5. Digite tambem uma palavra com mais de 30 letras. Digite duas palavras,
quer dizer, duas strings separadas por um espa co, por exemplo. Analise
por que d a errado.
6. Faca algumas experiencias alternado as tres linhas aqui discutidas e veja
os resultados. Mas, somente rode os programas se o compilador n ao apon-
tar erros ou warnings porque este programa usa vetores de caracteres
que s ao ponteiros. Ponteiros devem ser usados com cuidado porque fazem
acesso direto ` a mem oria da m aquina.
5
no diretorio BC este programa se chama prg01.c
6
em BC prg01.c
7
no diretorio BC este programa se chama prg01.c
2.1. PROGRAMAS E ERROS... 39
Algo pode ter sado errado quando voce rodou este programa. Vamos ana-
lisar o que pode ter acontecido. Primeiro voce pode ter digitado um n umero.
Experimente, se nao o fez.
Se voce tiver digitado um n umero, o programa rodou, sem problemas, apesar
de que ele nao tenha sido feito para isto. Observe que foi um erro
8
, porque se
voce desejasse que o programa lesse um n umero, voce deveria ter dito isto. Foi
um erro do programador, nao do programa. Programas nao erram, eles fazem
apenas aquilo para o qual foram planejados
9
.
Com o programa modicado, se voce tiver escrito uma frase de verdade,
o programa so imprimiu a primeira palavra. Porque quando ele encontrou o
primeiro espa co considerou encerrada a leitura da vari avel coisa[30] e, natu-
ralmente, somente imprimiu a primeira palavra.
Experimente colocar a frase entre aspas, veja o resultado.
Li cao: 1 C roda aquilo que n ao se espera...
Um dos mitos por traz da linguagem C e que com ela se fazem programas
que rodam muito r apido. Isto pode ser verdade, e uma das raz oes se encontra no
fato de que o compilador espera que voce n ao cometa erros e reduz ao mnimo
a vericac ao da l ogica do programa.

E comum se dizer que um programa em C sempre faz alguma coisa...


mesmo que n ao seja o que se espera. Isto n ao e um defeito da linguagem,
acontece que C e considerada uma linguagem para programadores prossionais,
poristo n ao tem sido considerada uma linguagem para inciantes...
O programa acima foi feito para escrever frases, mas escreve tambem n umeros.
Num programa grande e complexo isto poderia ser um desastre. Claro, o pro-
grama lhe pedia para escrever alguma coisa, isto n ao se faz! A comunicac ao
usuario-programador deve ser mais completa e sempre clara. Alem disto o
pr oprio programa deve ter recursos de vericac ao do que o usu ario est a fazendo
e deve ent ao orient a-lo a repetir a operac ao de forma correta. Na verdade pro-
gramas s o fazem aquilo para o qual foram planejados.
Observa cao: 4 Coment arios dos exerccios
Ha uma diferenca fundamental entre
palavra coisa; // (3) declaracao de variavel
e
palavra coisa[30]; // (3) declaracao de variavel,
No primeiro caso, C entende que coisa e um simples caractere, um dos 256 caracteres
que voce pode produzir com o teclado.
No segundo caso, C entende que coisa[30] e um vetor de caracteres.
C enumera os ndices a partir de zero, que dizer que voce tem direito de usar
coisa[0], coisa[1], . . . , coisa[29], coisa[30]
e se o vetor estiver construido corretamente, coisa[31]=\0 e o NULL, um caracter
especial que marca o m dos vetores.
Voce nao tem o direito de fazer uso deste ultimo espaco de forma diferente sem o risco
de erros no seu programa, e como se voce guardasse uma garrafa cheia destampada...
8
E preciso desmisticar os erros, errar e natural de quem est a aprendendo, simplesmente.
9
tem gente que diz desenhados, que horror.
40 CAP

ITULO 2. O SEGUNDO PROGRAMA EM C


Este ultimo caractere se chama NULL e serve para marcar o m dos vetores corre-
tamente construidos. Claro que voce pode construir vetores incorretamente, correndo
riscos de que seus dados se misturem produzindo erros.
Veja a diferenca entre estas duas linhas:
ler("%c",&coisa); // (5)
imprima("%s%c\\n","A primeira letra foi -> ",coisa); // (6)
e
ler("%s",coisa); // (5)
imprima("%s%s\n","A primeira letra foi -> ",coisa); // (6)
O formatador %s anuncia `as funcoes imprima() e ler() que vira um vetor de
caracteres ou string.
Aqui tambem se encontra uma das diculdades no uso de ler() (scanf()). Esta funcao
da linguagem C e muito sensvel... ela sempre guarda os dados atraves dos seus en-
derecos.

E o que se encontra expresso em
ler("%c",&coisa); // (5)
que poderamos traduzir como
guarde o caracter que vem pelo teclado na variavel cujo endere co e &coisa.
Tudo muda quando declaramos palavra coisa[30]; porque coisa[30], sendo um vetor,
e uma sucessao de 30 enderecos, para C, um vetor de enderecos. Antes chamamos de
vetor de caracteres. Mais a frente voce vai ver que existem outros tipos de vetores.
Todo vetor e um vetor de endere cos de um certo tipo de dados. Aqui estamos com um
vetor de caracteres. Leia a respeito de tipos de dados no captulo 7, mas faca apenas
uma leitura rapida.
Usar o redirecionador de endere cos num endereco e errado. Vamos dizer isto de outra
forma, usando uma linguagem tecnica.
1. Existem variaveis do tipo endereco, sao os ponteiros.
2. Alem disto precisamos declarar que tipo de ponteiro. Leia mais a respeito no
captulo sobre ponteiros, veja no ndice remissivo.
3. Quando uma variavel for um ponteiro, entao nao sera correto usar o direciona-
dor & na frente desta variavel em ler() scanf(). Seria o mesmo que dizer
guarde este dado no endere co endere co X.
Isto justica que deixemos de lado a funcao ler() (scanf()) nos primeiros passos do
uso da linguagem. Iremos fazer um uso de um metodo mais complicado, entretanto
mais seguro,evitando esta discussao inicial deixando-a para um momento em que o
estudante de C esteja mais a vontade com a linguagem.
Rode e leia o programa
10
prob scanf.c. Sobretudo leia os comentarios ao nal do
programa.
10
dentro do BC o nome aparece cortado, tem mais de oito caracteres. Troque o nome arquivo
para prbscanf.c
2.1. PROGRAMAS E ERROS... 41
Existe um compilador para a linguagem C, chamado checker que faz uma vericacao do
uso da memoria pela variaveis do tipo ponteiro e pode alertar para problemas deixados
dentro de um programa.
Sintaxe: checker -gcc programa.c [comandos do gcc] Nao pude encontrar um similar
para DOS, nao sei se existe.
Observa cao: 5 Programas robustos.
Agora cou claro que nao se espera que voce escreva n umeros. Mas para frente voce vai
aprender a criar estruturas de controle de entradas de dados que aconselharao o usuario a
re-escrever o que se pede, no caso de que ele tenha respondido com alguma inconveniencia.
Sao metodos para fazer programas seguros, ou robustos. Est a cedo, entretanto, para uma
discussao mais aprofundada sobre este assunto.
Vocabulario: 3 Dados, vari avel
dados

E complicado discutir o que s ao dados, um programa todo pode ser
um dado... mas se tentarmos simplicar as coisas para comecar a discu-
tir, programas servem para manipular dados, quer dizer transformar uma
informa cao bruta em uma informa cao tratada, manipulada, lapidada...
processada.
O programa prog01.c parece rdiculo, pede um nome e volta a escreve-lo
na tela. Mas ele poderia ter pedido o seu nome para comparar com os
dados de um banco interno de nomes am de permitir-lhe ou negar-lhe a
entrada no sistema. Ent ao o seu nome e uma informac ao que, comparada
com um banco de clientes, diz se voce pode ou n ao ter acesso ` as outras
informac oes.
vari avel Para guardar dados se criou um sistema engenhoso que usa tres
etapas.
Uma tabela formada de palavras, chamadas identicadores, associa-
das aos enderecos, uma tabela de alocac ao que e basicamente o que
cada usu ario, ou programador, usa. Estas palavras s ao chamadas
vari aveis. Em certas linguagens esta tabela se chama de espaco
de nomes.
A cada tal vari avel se associa um endereco inicial no segmento de
mem oria reservado para tal onde se inicia o conte udo da vari avel
e, pelo seu tipo, se calcula onde dever a terminar reservando-se o
pr oximo endereco inicial de outra vari avel. Por esta raz ao voce pre-
cisa declarar o tipo da vari avel que voce pretende usar.
Uma associac ao dos elementos do espaco de nomes com seus respec-
tivos enderecos iniciais, chamada ainda de alocac ao. Esta alocac ao
e dinamica porque as vari aveis s ao criadas e destrudas portanto os
enderecos iniciais mudam durante a execuc ao de um programa. Voce,
e qualquer outro programador, n ao precisa se preocupar com isto, est a
e uma atribuic ao do sistema operacional.
Em c, o uso do endereco, pelo programador, e uma das caractersticas
da linguagem havendo um tipo particular de vari avel que opera sobre o
42 CAP

ITULO 2. O SEGUNDO PROGRAMA EM C


endereco, as vari aveis do tipo ponteiro. Voce pode programar em c sem
usar ponteiros, mas o atrativo e que podemos acelerar os programas com
seu uso, como tambem torn a-los mais perigosos. Como j a dissemos, pegar
nos os eletricos de mal jeito pode levar ` a morte, mas voce n ao prefere
viver no escuro... aprenda a usar ponteiros. Mas deixe para fazer uso
deles quando tiver uma compreens ao segura de como funcionam.
Veja um exemplo bem simples que mostra a importancia do uso de endere cos
para acelerar a manipula cao da informa cao.
Exemplo: 3 Uso de ponteiros e a velocidade Pense no seguinte exemplo, um
enorme armazem em que uma instituic ao tem guardados todo o seu acervo,
tomemos o caso de um museu.
Sempre novos itens chegam e seria impossvel prever de antem ao onde cada
um deles seria guardado, inclusive ser a preciso adquirir de vez em quando uma
nova casa para abrigar o acervo sempre crescente do museu, (imagine que os
governantes se preocupam com os museus e sempre est ao liberando mais verba
para enriquecer a instituic ao...)
Como manter o acervo organizado? As pecas v ao chegando e simplesmente
recebem um n umero de ordem de chegada, e um endereco em que se encontram
guardados (pode ser a identicac ao de uma sala em um determinado predio).
No m do dia a lista que identica os itens do acerto e novamente ordenada (por
ordem alfabetica) o que signica que se re-orientam os ponteiros entre objetos e
enderecos.

E muito menos pesado trocar a indicac ao
piano21 casa10 - sala 30
do que manter sempre o piano21 no mesmo lugar... quando houver um con-
certo e for preciso levar o piano21 para o audit orio, o lugar dele n ao precisa
car reservado, outros objetos podem ocupar o seu lugar, e depois ele pode ser
guardado noutro endereco e o cadastro vai simplesmente ser re-organizado com
a troca
piano21 casa15 - sala 3
porque seria muito mais difcil estar mudando de lugar pianos.
A exemplicac ao acima se aplica literalmente a qualquer banco de dados,
quer dizer um programa que associe distintas informac oes como nomes de pes-
soas objetos, endere cos, contas bancarias, por exemplo um cat alogo telef onico.
Um banco de dados ca in util se n ao estiver ordenado, porque ent ao sim-
plesmente os dados caram perdidos, imagine um catalogo telef onico em que os
nomes dos usu arios n ao aparecam em ordem alfabetica, seria in util!
Mas os bancos de dados s ao din amicos no sentido de que sempre estamos
colocando novos nomes ou retirando nomes ou qualquer outro tipo de dados, con-
sequentemente vivem desordenados. Como os dados podem ocupar muito espaco
na mem oria do computador, (igual pianos no acervo do museu), e preferivel or-
denar os enderecos que s ao relativamente pequenos. A entram os ponteiros para
acelerar o processamento.
Observa cao: 6 Abstracao e variavel
2.1. PROGRAMAS E ERROS... 43
Os computadores, atravez de varios sistemas de codigos, podem guardar informacoes
praticamente de quase todo tipo. A palavra abstracao adquiriu um sentido novo com a
ciencia da computa c ao, ela distingue as informacoes pelo que se entende hoje como de nveis
de abstra c ao. Antes abstra c ao era sinonimo de difcil, hoje caracteriza o nvel de complexi-
dade de um conceito no sentido de que ele comporte uma quantidade maior de informacoes.
Por exemplo, um n umero guarda um tipo de informacao que podemos considerar como de
primeiro nvel de abstracao.
Mas, um par ordenado de n umeros tem um nvel maior de abstrac ao porque pode guardar
informacao nao numericas como enderecos de apartamentos de um predio de varios andares.
Em ternos ordenados de n umeros poderiamos guardar a informa cao de quantos habitantes
existe por apartamento... Nos dois ultimos casos os n umeros deixaram de ser n umeros e
passaram ser codigos.
Esta e evolucao dos n umeros, que vistos como codigos, criam novos tipos de dados e
sucessivos niveis de abstracao. Veja que n umero de telefone n ao e n umero, e sim codigo...
voce nao somaria dois n umeros de telefone, somaria ?
A memoria de um computador tem um enderecamento dinamico semelhante a de um
edifcio de apartamentos. Din amico porque a cada instante mudam
os enderecos;
os habitantes;
o tamanho dos apartamentos.
Os habitantes sao as variaveis. Aqui, `a diferenca com o que ocorre num edifcio de
apartamentos, o tamanho dos apartamentos se adaptam ao tamanho das variaveis... Ao
denir uma variavel se estabelece o endereco do ponto inicial de memoria que ela vai ocupar
e do tipo de dado que ela vai representar, (ou conter, com se diz comumente), e assim
se marca o incio de uma proxima variavel. ou o outro endereco inicial. Se o sistema
operacional for bem feito, ele ca monitorando o uso das variaveis para realocar o espaco na
memoria, levar para o disco, ou trazer de volta do disco, p aginas de memoria.
Veja a nova formula cao de prog01.c prog02.c.
Primeiro compile
11
e rode prog02.c:
gcc -Wall -oprog prog02.c
prog, para executar o programa, ou ./prog
Exemplo: 4 prog02
/* Programa prog02.c
Assunto:le uma frase pelo teclado e a imprime
Programa errado, compile e corrija o erro. Ver exercicios.
por Tarcisio Praciano Pereira - 10 licoes para aprender C
Sobral, julho de 2000 - UVA
*/
#include <stdio.h>
#include <string.h>
#include "traducao.h"
palavra principal()
11
em BC procure prg02.c
44 CAP

ITULO 2. O SEGUNDO PROGRAMA EM C


inicio
palavra coisa1[30], coisa2[30], coisa3[30]; //(0)
imprima("%s%\n", "escreva uma frase curta pelo teclado, ");// (1)
imprima("%s\n", "digamos, com tres palavras.. "); // (2)
imprima("%s\n"," pode ser o seu nome, por exemplo ");//(3)
ler("%s%s%s",coisa1,coisa2,coisa3); //(4) ainda usa scanf
imprima("%s%s%s\n",coisa1,coisa2,coisa3); //(5)
fim
/* Comentarios:
0) declaracao de tres variaveis - vetores do tipo string.
1,2,3) mensagens orientando o usuario a fornecer os dados.
em (1) tem um erro que o compilador detecta.
4) Leitura de dados com ler (scanf) observe a ausencia do
direcionador de endereco &, desnecessario porque as
variaveis sao do tipo ponteiro, declaracao implicita.
5) Um unico imprima imprime todos os dados.
*/
Rode o programa para ver o que acontece. Programinha ruim, n ao e? Claro,
estamos apenas come cando. Vejamos alguns defeitos e como poderamos corrig-
los.
Exerccios: 5 Alterando e entendendo prog02.c
1. Compile e rode o programa prog02.c.
2. Quando compilado, o compilador reclama:
prog02.c:16:
warning: unknown conversion type character 0xa in format
prog02.c:21:
warning: control reaches end of non-void function.
Verique que na linha 16 tem % sem o caracter que caracteriza o tipo de
dados conversion type. O outro erro, linha 21, se deve ` a ausencia de
um valor a ser devolvido, corrija estes erros. Observe que o programa,
mesmo errado, roda. Na maioria das linguagens modernas isto n ao se d a.
Corrija estes erros, (compare com prog02 1.c).
3. Rode prog02.c, digitando cada um dos nomes em uma linha diferente (se-
parados por enter).
4. Refaca prog02.c para colocar as tres mensagens da entrada de dados num
unico imprima. Observe que cada mensagem e um par ametro, veja o
ultimo imprima para se inspirar.
2.1. PROGRAMAS E ERROS... 45
5. Melhore a sada de dados colocando um separador entre cada palavra es-
crita:
coisa1, ,coisa2, ,coisa3
n ao se esquecendo de incluir os formatadores %... Veja no exemplo abaixo
a soluc ao.
solu cao leia os coment arios no programa prog02.c
Depois vamos tornar este programa mais inteligente, deixando que ele mesmo
detecte quantas palavras o usuario quer escrever. No momento vamos ser mais
imperativos: Escreva uma frase com tres palavras.
Exemplo: 5 prog02 1.c
/* Programa prog02_1.c
Assunto:le uma palavra pelo teclado e a imprime
por Tarcisio Praciano Pereira - 10 licoes para aprender C
Sobral, julho de 2000 - UVA
*/
#include <stdio.h>
#include <string.h>
#include "traducao.h"
#include "ambiente.h"
palavra principal()
inicio
palavra coisa1[30], coisa2[30], coisa3[30]; //(0)
imprima("%s%s%s\n", "escreva uma frase curta pelo teclado",
"com tres palavras. ",
" Pode ser o seu nome, por exemplo "); // (1)
ler("%s%s%s",coisa1,coisa2,coisa3); //(2)
imprima("%s %s %s\n ",coisa1,coisa2,coisa3);//(3)
devolve 0; //(4)
fim
/* Comentarios:
0) Declaracao de variaveis com tamanho adequado para caber nomes.
1) Um unico imprima para as tres frases. Observe que as
frases podem ser dispostas em tres linhas diferentes, os
espacos entre os parametros nao tem significado.
2) Ainda usando ler (scanf)
3) Observe os espacos entre os formatadores de dados e veja
o resultado disto na impressao. Tire os espacos e veja o
resultado.
46 CAP

ITULO 2. O SEGUNDO PROGRAMA EM C


4) A ausencia de voltar provoca um erro.
*/
2.1.1 Analise do prog02 1.c
Come caremos por discutir os smbolos estranhos %s etc.. que apareceram nos
programas.
Observa cao: 7 Formatadores de dados
cabe calho O sinal /*marca o incio de um coment ario que e terminado
com o sinal */. O programa comeca com um coment ario que costu-
mamos chamar de cabecalho, nele colocamos as informac oes genericas
sobre o programa. Se, por exemplo, estivermos trabalhando em equipe com
colaboradores, eles devem receber programas nossos para alterar, modicar,
melhorar. Alguns dos programas ate funcionam, outros s o trazem a ideia
daquilo que devem fazer... No cabecalho colocamos estas informac oes, n ao
apenas para n os mesmo que escrevemos o programa, como tambem para
os outros que v ao trabalhar com os programas.
N ao duvide, se voce for ler um programa uma semana depois que o escre-
veu, possivelmente n ao vai mais entende-lo....
comentarios Os coment arios podem ser escritos em diversos lugares den-
tro dos programas. Se por um lado voce deve escrever muitos coment arios,
tambem deve ter o cuidado para que eles n ao causem uma polui c ao visual
que depois atrapalhe a leitura do programa. Guarde a ideia de que um
programa deve ser um texto bonito, agrad avel para os olhos e de f acil
leitura.
formata cao de dados O smbolo % informa ao C que se segue uma
formatac ao de sada de dados.
Se forem frases, (strings), ent ao ca: %s.
Se for um n umero, depende do tipo de n umero:
para n umeros inteiros: %d;
para n umeros fracion arios: %f
O erro, na terceira vers ao de prog02.c, consiste em que colocamos poucos
%s uma vez que os espacos separadores s ao tambem caracteres. O
comando que imprime os dados deve ser assim:
imprima("%s%s%s%s%sn ",coisa1, ,coisa2, ,coisa3);
se quisermos imprimir tres palavras com espacos entre elas.
Naturalmente, voce deve estar horrorizado! Como caria se quisessmos
escrever 30 palavras... Se acalme, veremos uma soluc ao mais inteligente
depois. Se quiser estudar o assunto agora, veja os programas texto.c,
texto01.c, texto02.c texto03.c.
2.1. PROGRAMAS E ERROS... 47
Chamamos estes smbolos de formatadores de dados, mas eles tem diversos
nomes, porque tambem tem diversas func oes, por exemplo, eles
12
servem para
traduzir dados de um tipo para outro.
c parece ser uma linguagem contraditoria. Por um lado relativamente livre,
por outro lado contendo restri c oes de formata cao rigorosas. Toda vez que voce
usar uma func ao de sada de dados, tem que informar a esta func ao que tipo
dados lhe vao ser passados. Porque, se nao o zer corretamente, c podera seguir
em frente coletando erros atras de erros.
Para come car, que e tipo de dados? Dedicamos um captulo a este assunto,
veja no ndice, e se voce quiser pode dar um salto agora para la, onde esta
questao esta sendo discutida com mais detalhes. No momento vamos dizer que
em computa cao se distinguem tres coisas bem claramente:
caracteres e palavras;
caracteres, em princpio, qualquer um dos smbolos que voce pode
obter apertando uma tecla. Ha alguns poucos que nao podem ser
obtidos desta forma. Sao caracteres especiais, como o caracter de
fim de linha.
frases, ou aglomerados de caracteres os vetores de caracteres,
em ingles, strings
n umeros;
n umero inteiro
n umero fracionario, chamado real ou em ingles, float.
vetores;
vetores de caracteres (strings)
vetores de inteiros ou de reais.
Caracteres sao qualquer um dos duzentos e poucos sinais que voce pode
produzir com o teclado do computador, como
A, a, / , % . . .
existe uma tabela americana chamada tabela ASCII
13
que registra umas duas
centenas de caracteres que sao, no fundo, a base do modo de comunica cao escrita
que usamos. Esta tabela ja foi muito mais importante do que e hoje porque
os meios de comunica cao evoluiram tanto que hoje ja praticamente nao mais
usamos caracteres para nos comunicar. Usamos cores... ou mais exatamente
bits.
Os n umeros sao agregados de caracteres tirados da cole cao
1,2,3,4,5,6,7,8,9,0, .
12
Ver cast a este respeito.
13
American Standard for Communication and Information Interchange
48 CAP

ITULO 2. O SEGUNDO PROGRAMA EM C


que podem ser inteiros, se nao usarmos . e se usarmos o ponto representam
n umeros fracionarios. Esta e uma explica cao muito rasteira, mas e mais ou
menos a forma como Fibonacci explicou os n umeros decimais no seculo 11, sem
incluir o ponto. Sem d uvida, seria otimo que voce nao casse satisfeito com
ela e criticasse o autor chamando-o de supercial...
Depois podemos combinar estes dois tipos de dados,
caracteres , numeros
para criar tipos de dados bem mais complexos. Voce pode ver isto a partir
do captulo 5.
Dito isto, o programa come ca com palavra
14
, para indicar que coisa, coisa1,
etc... sao do tipo caracter. Em ingles se usam duas palavras para isto, string,
character. character e um caracter, ao passo que string e um vetor de
caracteres, quer dizer um aglomerado de caracteres que pode inclusive conter
espa cos, (espaco e tambem um caractere que voce gera quando usa a barra
de espacos que nada mais do que uma tecla...)
Um vetor de caracteres e, por exemplo
Isto e um vetor de caracteres
e um conjunto de caracteres delimitado por aspas. Observe que
Isto e um vetor de caracteres
e diferente de
Isto e um vetor de caracteres
A segunda expressao e um erro, porque c usa d
A primeira linha do programa indica que coisa1, coisa2, coisa3 sao vari aveis
que devem conter palavras.

E uma declara cao de tipo de dados.
Observa cao: 8 E o que signica vari avel ?
As linguagens de programacao sao exemplos de linguagens formais. Quer dizer que elas
tentam, e com relativo sucesso, estabelecer uma comunicacao entre o homem e a maquina.
Na verdade entre programadores e aqueles que construiram os compiladores das lingua-
gens...portanto entre homens presentes em frente ao teclado e homens ausentes representados
pelo compilador.
Consequentemente elas tem que satisfazer a um conjunto de regras logicas que vao dar
sentido as frases de que se compoem os programas. Da mesma forma como eu nao posso
me dirigir a voce, querendo me referir a uma cadeira, dizer: me de a mesa. Voce nada vai
entender, sobretudo se na nossa frente nao houver nenhuma mesa.
cadeira e uma variavel da lingua portuguesa ocupada com um signicado bem denido,
e naturalmente, imutavel. Mas voce ja ouviu alguem dizer
esta coisa n ao serve para escrever
fazendo referencia a:
um lapis sem ponta;
uma caneta quebrada;
uma velha maquina de escrver.
coisa e uma variavel da lingua portuguesa.
Quer dizer que ha palavras livres para assumir distintos valores.
No presente caso temos
palavra, imprima, ler que sao palavras reservadas portuguesasda linguagem C;
em ingles seriam char, printf, scanf;
14
em ingles seria char
2.1. PROGRAMAS E ERROS... 49
coisa, coisa1, coisa2, coisa3 que escolhemos para guardar os fonemas que voce resolver
guardar: lapis,caneta, maquina velha etc...
Examine o arquivo traducao.h onde vai voce vai encontrar muitas das palavras reservadas
da linguagem C com a respectiva traducao que estou usando nos programas. A esta o segredo
de programar em Portugues...
Depois da declarac ao de tipos de dados vieram os comandos imprime, ler.
Estes comandos podem receber uma quantidade indenida de parametros, mas,
para cada parametro, deve vir indicado o tipo de dado que vai ser lido, e este o
signicado de %s para ler ou escrever palavras.
Bom, faltou discutir o que signicam as tres primeiras linhas do programa:
diretiva de compilac~ao
#include <stdio.h>
informa ao compilador que ele deve ler a biblioteca stdio.h que e um arquivo
onde se encontram denidas as fun coes prinf e scanf
15
.
diretiva de compilac~ao
A linha
#include traducao.h
diz ao compilador para ler o arquivo traducao.h. A diferen ca entre aspas ou
sinal de desigualdade reside no local onde se encontram os arquivos. Quando
o nome se encontra envolto por aspas, isto signica para o compilador que
o arquivo se encontra no mesmo diretorio em que se esta trabalhando com
programa, o diretorio corrente. Quando se envolve o nome do arquivo com
<, >, o compilador sabe que deve procurar o arquivo no diretorio padrao em
que se encontram todas as bibliotecas da linguagem C.
A linha
palavra principal()
e o incio do programa... e palavra indica que a fun cao principal() vai produ-
zir uma sada de dados do tipo palavra. Isto e, principal e do tipo palavra.
Todo programa em C tem a estrutura basica dos programas acima.
Primeiro vem as diretivas de compila cao marcadas pelo smbolo #, como
include, que signica incluir.
Depois vem as deni coes das fun coes que serao usadas. Discutiremos logo
no proximo captulo o que sao fun coes.
Depois a vem a func~ao principal(), em ingles se chama main(),e a
fun cao que gerencia o programa.
Ela e responsavel de colocar as coisas para andar, e o maestro que vai
comandar o espetaculo.
15
que traduzimos por imprima e ler. Se voce n ao gostar destes nomes, use outros...
50 CAP

ITULO 2. O SEGUNDO PROGRAMA EM C


Antes da palavra principal se encontra o tipo de dados que a fun cao vai
produzir, na ultima linha do programa, com a fun cao voltar, return.
Depois dos parentesis, que podem conter parametros, vem uma chave-
aberta contendo o algoritmo implementado ao nal do qual se fecha a
chave terminando assim o programa.
A ordem como as fun coes vierem dispostas no programa e irrelevante, mas
no incio deve vir uma lista das fun coes que v`ao ser denidas no arquivo e
que faz parte integrande do cabecalho do programa. Isto e o que se chama
de prototipos, e o planejamento do programa.
Tome como exemplo o programa integral.c. Depois dos comentarios
vem a lista de fun coes que vao ser denidas mais abaixo:
// Declaracao de funcoes *******************
real Riemann(real ini, real _fim, real deltax);
real f(real x);
Em C, as chaves servem para denir as unidades logicas.

E o que se chama
um bloco, uma unidade logica. Observe que dentro de um bloco pode ter
outro bloco... Aqui estamos usando inicio e fim, com esta nalidade,
como tradu c oes das chaves , .
Os vocabulos que usamos nesta se cao foram:
Vocabulario: 4 bloco l ogico, imprima, include, escreva, func ao, palavra, ler,
principal, printf, prot otipos, scanf, char, string
bloco logico e uma unidade de programac ao, conceito difuso que aos
poucos voce ir a dominar. As func oes s ao blocos l ogicos. Ao abrir e fechar
chaves voce cria um bloco l ogico.
imprima() e traduc ao de printf() e a func ao da linguagem C para pro-
duzir uma sada de dados. Imprimir no video.
include e uma diretiva de compilac ao para que o compilador veja in-
formac oes em uma biblioteca. H a v arias diretivas de compilac ao, elas
s ao assim chamadas porque dirigem o compilador para fazer tarefas bas-
tante complicadas antes de criar o programa. N ao as discutiremos neste
livro.
escreva() outra traduc ao que zemos de printf(), para mostrar-lhe que
podem ser diversas. Isto poderia ser considerado um defeito, por alguns,
um qualidade por outros (a diversidade...)
func~ao As func oes s ao as menores unidades l ogicas. printf(), scanf()
s ao func oes. Tudo em C e func ao
16
16
nem tudo, voce vai ver depois..., mas quase tudo, digamos.
2.1. PROGRAMAS E ERROS... 51
As func oes em C se assemelham um pouco com as func oes da Matem atica.
Depois voce vai ver as diferencas, mas agora usemos as semelhancas. Em
C denimos uma func ao f e depois escrevemos f(a); C calcula qual e o
resultado de f aplicada em a. Como em Matem atica...
Mas frequentemente escrevemos apenas f(); o que n ao se faz em Ma-
tem atica, porque em c existem func oes que n ao recebem par ametros.
palavra foi uma das traduc oes que demos para char que signica carac-
tere, um tipo de dados de C.
ler()e traduc ao de scanf() e a func ao da linguagem C para ler dados
pelo teclado. Esta func ao deve ser evitada, usar fgets(), ver prog04 3.c
prog03 8.c
principal() e func ao gerente do programa, obrigat oria, em ingles, main()
Observa cao: 9 Traduc ao da linguagem c
A traduc ao da linguagem que estamos introduzindo neste livro n ao e uma
brincadeira. Ou a nossa proposta ou a de outro grupo de pessoas um dia vir a a
ser levada a serio. Faz parte de nossa identidade cultural sabermos programar
em nossa lingua. Sem d uvida e uma atitude anti-globalizante de defesa do
desenvolvimento regional.
Entretanto algum organismo, possivelmente a SBC, deve num certo momento
chamar um grupo de pesquisadores e programadores para estabelecer um padr ao,
porque uma linguagem de programac ao deve ser padronizada am de que os
programas possam rodar em qualquer lugar e ser entendidos por todos.
52 CAP

ITULO 2. O SEGUNDO PROGRAMA EM C


Captulo 3
N umeros e Letras
Resumo.
A linguagem C n ao foi feita para trabalhar com n umeros, ela foi feita para
trabalhar com caracteres, acessar mem oria, executar opera c oes aritmeticas
e opera c oes l ogicas
a
. Mesmo assim ela tem uma capacidade numerica limi-
tada em seu formato original. As implementa c oes modernas tornaram esta
capacidade bem mais avantajada, porque C nasceu dentro do ambiente que
hoje podemos caracterizar como de programas livres ou de domnio p ublico,
que sempre foi tpico dos que programavam em Unix
b
. Uma conseq uencia
disto e que a linguagem C cresceu e hoje ate poderia ser considerada para
processamento numerico porque tem bibliotecas dirigidas para tal.
Neste captulo vamos explorar um pouco da capacidade numerica da lingua-
gem C. O captulo 8, na verdade, se dedica ` a Matem atica, aqui vamos apenas
brincar um pouco com os n umeros. Veremos um pouco de suas limita c oes,
como estas podem ser alteradas, que voce tem nas m aos os meios para pro-
duzir estas alteracoes e e que voce vai aprender como faze-lo...
Se o seu sistema for LinuX, voce tem chances de fazer grandes altera c oes, mas
tenha cuidado, n ao v a fazer o que voce n ao sabe sem tomar as precau c oes
adequadas. Esta frase n ao tem o objetivo de amendront a-lo, nem de inib-
lo.Aprenda C a fundo e ter a uma ferramenta imponente em suas m aos.
a
porque C foi feita para montar um sistema operacional.
b
E interessante observar que a pr opria palavra Unix, e uma marca regis-
trada, o sistema operacional Unix tem um dono. Mesmo assim Unix sempre
foi usado com liberalidade. LinuX e um clone do Unix, tem dono, Linus
Torvalds, mas est a colocado sob o GPL
3.1 Brincando com n umeros em C.
Como o ttulo menciona, nesta se cao vamos estudar um programa que efetua
opera coes com n umeros.
O programa que lhe vamos propor, prog03.c, vem com erros. Algumas
corre coes e mais outros tantos erros se encontram na suite de programas
prog03 X.c
Estamos absolutamente convencidos que os erros sao o instrumento mais
profcuo do aprendizado, tantos os nossos como os seus.
53
54 CAP

ITULO 3. N

UMEROS E LETRAS
Mas, nao limite sua imagina cao, altere os programas atendendo a todas as
possibilidades que lhe vierem `a cabe ca para experimentar outros resultados.
Encontre, voce mesmo, outras altera coes e as teste. Os exerccios propostos
sao apenas um guia para despertar a sua curiosidade. Nao tema estragar o
computador ou o compilador, eles sao muito robustos.
Primeiro compile e rode prog03.c:
gcc -Wall -oprog prog03.c
digite, prog, para executar o programa.
Possivelmente digite ./prog, se o sistema nao estiver
bem instalado, um defeito no path.
depois leia o programa para descobrir onde esta errado, e o corrija.
Exerccios: 6 Alterando prog03.c
As soluc oes destes exerccios, s ao os programas prog03 X.c.
1. Altere prog03.c para escrever a soma dos dois n umeros que lhe forem
fornecidos. Veja a soluc ao proposta em prog03 1.c.
2. prog03.c imprime os n umeros que voce forneceu colados um no outro, feio!
Corrija isto. Ver soluc ao em prog03 1.c
3. Torne o programa mais verboso, conversando mais detalhadamente com
o usu ario, tanto na entrada de dados como na sada de dados.
4. Experimente com somas de n umeros cada vez maiores para testar a pre-
cis ao do sistema que voce usa.
5. Altere prog03.c para somar n umeros n ao inteiros. Solu c ao prog03 8.c.
6. Faca um sistema generoso de mensagens para tornar sua calculadora
mais atraente, por exemplo, peca os n umeros para somar um a um.
7. Altere prog03.c para fazer a multiplicac ao entre dois n umeros.
8. Altere todos os programas da serie prog03*.c substituindo ler() (scanf())
pelo par de func oes
leia(), converte palavra()
. Veja prog03 91.c. Voce precisa declarar uma vari avel
palavra deposito[80]
para receber dados. O tamanho, 80, porque cabe uma linha.
3.1. BRINCANDO COM N

UMEROS EM C. 55
9. Existem dois tipos de n umeros nas linguagens de programac ao, inteiros
ou reais. Do ponto de vista de Matem atica isto e uma aberrac ao
1
, mas
n ao estamos fazendo Matem atica, aqui. Exemplique o que e n umero
inteiro e o que e n umero real, em computac ao.
Resposta prog03 10.c
10. ** fora do contexto Descreva o que signica dizer-se que um n umero a
est a representado na base 8, na base 10 ou na base 16.
Resposta base.c, compile este programa assim
gcc -Wall -oprog -lm base.c
a opc ao lm instrui o compilador a fazer uso da biblioteca matem atica.
Experimente omitir esta instruc ao, o compilador n ao saber a o que e pow,
a func ao potencia.
Observa cao: 10 Comentando os exerccios
O programa prog03.c sugere que voce use n umeros inteiros muito gran-
des para ver o que pode acontecer. N ao sabemos o que muito grande repre-
senta para voce, por exemplo a soma dos custos dos rombos banc arios pagos pelo
proer, quer dizer, por n os todos:
40.000.000.000 d olares !
Se isto j a for muito, experimente denir a constante
inteiro BANCOS = 40000000000;
e a use nas suas alterac oes de prog03.c. Observe que o programa talvez n ao
suporte este valor
2
.
Experimente somar n umeros maiores que BANCOS. No C que roda em
LinuX voce precisar a experimentar com inteiros maiores que 2 mi para notar
alguma coisa extranha. Experimente, portanto. Na vers ao tradicional do C os
inteiros v ao de -32768 ate 32767. Isto quer dizer que se voce pedir para somar
n = 32767; m = 1 n + m = 32768
Veja as respostas que obtivemos:
A soma de 2147483647 com 1: -2147483648
A soma de 2147483646 com 1: 2147483647
Quer dizer que os inteiros de C n ao suportam um BANCOS.
Mesmo assim, sob LinuX os inteiros chegam a casa dos bilh oes. Isto nada
tem de estranho, nem LinuX e melhor que qualquer outro sistema apenas porque
os inteiros em C, sob LinuX, tem um espectro mais amplo. LinuX e melhor
porque voce pode alterar este espectro, por exemplo. Com n umeros inteiros muito
grandes, voce pode estar gastando mem oria ` a toa, e talvez, para um uso especco
seja interessante reduzir a largura deste espectro.
1
porque os inteiros tambem s ao n umeros reais
2
mas o Brasil ainda continua em pe, apesar deste roubo, e ainda dizem que somos um
pas pobre...claro, quando pedimos dinheiro para as Universidades, a o pas e pobre... com
BANCOS se poderia pagar 8 anos do or camento minguado das Universidades brasileiras.
56 CAP

ITULO 3. N

UMEROS E LETRAS
Em LinuX voce pode fazer facilmente isto, mas n ao se esque ca que o sistema
e multi-usu ario e isto pode causar problemas... Observe que, mesmo que voce
seja o unico usu ario cadastrado em uma m aquina rodando LinuX voce, ainda
assim, n ao e o unico usu ario...existe um monte de usu arios (do sistema) tra-
balhando junto com voce. Eles podem necessitar (quase certamente necessitam)
do c instalado na m aquina...
Aprenda como fazer, antes de fazer. Estudando mais a fundo, nao vai ser
ainda aqui, voce ir a aprender como alterar a linguagem c para um uso especco
O segredo e, construa uma biblioteca adequada, para nao atrapalhar os outros
usuarios.
Outro: o uso das diretivas de compilac~ao.
Este programa e muito pequeno para oferecer espaco para muitas mensagens,
mas voce pode incluir setas no local onde o usu ario do programa ir a digitar
n umeros, por exemplo. Se n ao o tiver feito, faca-o agora.
Observa cao: 11 Setas - c odigo ASCII
J a nos referimos antes ` a tabela ASCII, consultando-a voce pode inserir al-
guns caracteres diferentes para embelezar seus programas.
Leia a biblioteca ambiente.h. Nela est ao denidas as letras acentuadas do
alfabeto brasileiro. Se voce quiser escrever corretamente a frase
A acao sistematica do modulo eh
voce dever a
3
digitar:
imprima(A a%c%co sistem%ctica do m%cdulo %c,
cedi,atil,aagu,oagu,eagu);
Veja o programa
4
acentuacao.c para uma alternativa de escrita com os
sinais diacrticos da lingua portuguesa.
No lugar de cada %c aparecer a o valor de cada uma das macros cedi,atil,
aagu, oagu, eagu denidas na biblioteca ambiente.h.
Se voce rodar o programa ascii.c, ele lhe vai imprimir alguns dos valores
da tabela ASCII. Nem todos podem ser impressos, um deles e o caracter de m
de linha... outro ir a produzir som no alto-falante do micro. Tambem existem
variac oes da tabela ASCII usadas por fabricantes diferentes e o resultado do
programa muda de um micro para outro. Consequentemente e difcil ter certeza
de que as palavras ser ao escritas corretamente quando o programa for executado.
Observe a estrutura da informac ao abaixo:
imprima("A soma de %d com %d eh %d\n",n,m, n+m);
A func ao imprima recebe dois tipos de par ametros
5
:
Um vetor de caracteres, "A soma de %d com %d eh %d\n", na qual
se encontram presentes instruc oes de formatac ao de dados: %d, e
3
n ao se assuste, esta e apenas uma forma de resolver o problema
4
veja tambem a suite de programas texto*.c
5
tipos, n ao quantidades
3.1. BRINCANDO COM N

UMEROS EM C. 57
os par ametros que v ao preencher o vetor de caracteres na mesma or-
dem em que se encontram as instruc oes de formatac ao. Se chama a isto
de expans ao dos formatadores.
Exerccio: 1 1. Altere o programa prog03.c para conversar com o usu ario
pedindo sucessivamente mais n umeros para serem somados num total de
cinco parcelas. A func ao que faz leitura de dados, ler()
6
, tem uma sintaxe
semelhante a da func ao imprima():
ler(%d,&num) em que
%d e a instruc ao sobre que tipo de dado ser a lido.
num e a vari avel que vai guardar o dado.
& aponta para o local da mem oria que estiver associado com a vari avel
num.Quer dizer que vai ser feita uma atribuic ao de valores indireta:
guardar um dado na mem oria cujo endereco est a sendo referido por
&num.
Posteriormente, nas operac oes aritmeticas, voce vai usar num e n ao
&num.
2. Faca um programa que solicite do usu ario cinco n umeros inteiros, e calcule
a soma destes n umeros. Ver prog03 2.c
3. O perigo de ler() (scanf()) Observamos que e um perigo, mas pode ser
usado de forma benigna, para quem j a tenha adquirido experiencia.
Quando rodar prog03 2.c ofereca todos os n umeros de uma s o vez, se-
parados por espacos. Veja o que acontece. Rode novamente o programa,
porem, forneca os n umeros um por um, separados por < enter >.
4. Melhore a vers ao de prog03.c usando a func ao controladora de uxo
enquanto() while(), sintaxe:
enquanto (condicao)
inicio
ler(%d,numero)
m
faca condicao controlar se o usu ario fornceu um n umero. As func oes
de controle de uxo s ao estudadas no captulo 4, de um pulo ate l a.
5. Faca um programa que solicite do usu ario dois n umeros inteiros, e devolva
o produto destes n umeros. Ver o programa prog03.c A multiplicac ao em
C se faz usando o operador *.
6
scanf()
58 CAP

ITULO 3. N

UMEROS E LETRAS
6. Ser a que o programa de multiplicac ao est a mesmo fazendo as contas cer-
tas? Verique! Se o resultado for do tamanho de
BANCOS,
provavelmente o programa est a errando...
Observa cao: 12 Agilidade perigosa do scanf()
Em um dos exerccios acima vimos a agilidade do scanf() que pode ser
muito util, mas que e uma func ao perigosa. H a autores que dizem para soluci-
onar os problemas de scanf(), o melhor metodo consiste em n ao usar scanf().
Preferimos dizer, deixe o uso de scanf() para quando voce tiver um domnio
adequado de todos os seus efeitos colaterais.
Ao ler 5 n umeros digitados, separadamente, com espacos, nos permite que
fornecamos todos os n umeros de uma seq uencia, de uma unica vez. Isto, inclu-
sive, nos permite fazer correc oes, se tivermos cometido algum erro de digitac ao.
Experimente.
Poristo voce dever a aprender a usar ler() (scanf()), mas deve observar
que ela oferece riscos. Se voce n ao quiser que ela leia dois valores seguidos,
ela ainda assim poder a le-los. Mas n ao se esqueca, tudo que o programa zer e
consequencia direta do que o programador tiver escrito. Portanto, se voce souber
usar corretamente a linguagem, seus programas funcionar ao corretamente e sem
misterios. Aqui n ao existem misterios, pode haver incompetencia apenas.
Veja os programas
7
(rode e leia)
prog04 2.c, prog04 21.c, prob scanf.c
Observa cao: 13 Programar bem
Um dos segredos para ser um bom programador, e isto vale para qualquer
linguagem de programac ao, consiste em ser organizado.
Nunca e pouco insistir que os programas devem ser bem comentados (evitando-
se a poluic ao visual). Um programa deve ser consequencia de uma criteriosa
modularizac ao e isto vai car claro no captulo 5 do qual voce deve fazer agora
uma r apida leitura e inclusive us a-lo como um manual complementar na leitura
do texto anterior. No captulo 5 discutimos func ao, v a ate l a rapidamente (e
volte logo).
As func oes s ao o metodo de modularizac ao da linguagem c.
Observa cao: 14 Instruc oes de formatac ao de dados.
Em Linux Uma lista parcial dos identicadores de tipos de dados em C e:
tipo de dado real inteiro caractere vetor de car. not. cientif.
f d c s e
Consulte info libc em LinuX para ver uma descric ao mais completa,
quando sentir necessidade. Procure por Formatted Output, Formatted
Output Basics onde se encontram informac oes sobre printf().
7
em BC altere o nome do programa prob scanf.c para prbscanf.c
3.1. BRINCANDO COM N

UMEROS EM C. 59
O sistema de ajudas dos pacotes computacionais quase que exigem que o
usu ario j a tenha alguma pr atica. N ao desista nas primeira tentativas.
Em BC
Abra um programa e nele escolha algum comando sobre o qual voce deseja
informac oes. Digamos que seja printf(), o noso imprima(). Escreva na
area de textos este comando e coloque o cursor sobre ele.
Procure o bot ao Help. Clicando, cai um menu, escolha Topic search
(busca por t opico).
Voce ser a conduzido ` a famlia de func oes que imprimem:
cprintf, fprintf, printf, ....
Passe uma vista. N ao tente entender tudo de uma s o vez. Volte a ler
quando necess ario, quando precisar de uma informac ao especca. Mas,
sobre tudo, v a ate o nal desta p agina do help, descendo com a seta para
baixo. Desca ate o nal.
Voce vai encontrar Examples, os exemplos. Coloque o cursor sobre
printf example
de enter, e voce ver a um programa completo mostrando como funciona
printf().
Voce poder a passar o ratinho sobre o programa, realc a-lo. V a ate ate o
Edit e escolha copy. Abra um editor de textos e no editor cole o programa,
e grave com o nome que lhe parecer adequado.
Voce tem um exemplo que funciona. Teste! Alguns exemplos tem excesso
de informac ao. Apague alguma coisa do exemplo e rode e leia. Querendo
copie de novo... O help do BC e um pequeno tutorial sobre a linguagem,
voce ganhar a muito ao us a-lo.
O Help do BC e muito rico, voce ter a que se acostumar a linguagem concisa
e tecnica. Mas sempre ter a exemplos para rodar e comparar com o que
tiver lido. Como dissemos sobre a ajuda em Linux, o sistema de ajuda
quase que exige uma pr atica computacional.

E preciso persistir no uso.
3.1.1 Leitura de dados
Desde o incio estivemos alertando o leitor sobre os erros potenciais no uso da
agil e poderosa fun cao ler() (scanf()) e mesmo assim zemos uso dela todo
o tempo com a desculpa de que ela tornaria os programas mais simples.

E esta razao que pela qual ela e usada com frequencia pelos programadores.
Apesar dos crticos que chegam a dizer que a soluc ao para o scanf() e n ao
us a-la, ela segue em uso porque e pratica.
Vamos mostrar-lhe uma alternativa segura, e ao mesmo tempo pratica, ao
uso de scanf() representada pelo par de fun coes
leia() (fgets())
60 CAP

ITULO 3. N

UMEROS E LETRAS
converte palavra() (sscanf() )
Observe que deixamos entre parentesis as fun coes originais de c.
Veja os programas prog03 8.c,prog03 10.c, prog03 11.c, com erros, e o
prog03 12.c em que os erros do anterior se encontram corrigidos.
Este metodo seguro de leitura de dados consiste no uso seguido das duas
fun coes: leia() (fgets()) e converte palavra() (sscanf()). A sintaxe delas
e:
Sintaxe:
palavra deposito[80];
leia(deposito, tamanho de palavra(deposito), entrada pdr);
converte palavra(deposito, %f, &numero);
em que a variavel deposito deve ser declarada com espa co suciente para a
leitura dos dados.
Depois a fun cao
converte palavra()
ira ao deposito pegar o que estiver la contido e transformar no tipo de
dados que se deseja, observe o formator de dados. No exemplo acima estamos
transformando os dados contidos em deposito em ponto flutuante que e
um dos tipos de n umeros fracionarios em c.
deposito e um vetor de caracteres, nao se esque ca de que c tem uma origem
humilde e sabia apenas mexer com numeros e caracteres.
Entao iniciamos a entrada de dados colocando num grande dep osito os ca-
racteres que compoem os dados que nos interessam, depois a fun cao
converte palavra
transforma os dados no tipo adequado.
Observa cao: 15 E o pr atico ?
Estamos propondo a substituic ao de uma unica func ao, scanf(), por duas,
e dissemos que tudo isto ainda seria pr atico.
De fato, como est ao as coisas, estamos trocando uma por duas...nada pr atico.
Para tornar pr atico o uso destas duas func oes, crie um arquivo
entrada dados
contendo o esqueleto contido no box acima. Este arquivo j a existe, ele se chama
entra dados.c
se encontra no disco junto com os demais programas, edite-o agora para ver
como foi criado e modique-o para suas necessidades.
Se habitue a sempre usar a mesma vari avel deposito para receber dados, o
nome e ate sugestivo.
Quando precisar fazer uma entrada de dados, importe para o programa o
arquivo entrada dados e siga programando tranquilamente.
N ao se esqueca de trocar a formac ao de dados na terceira linha e o nome da
vari avel que vai receber os dados.
3.1. BRINCANDO COM N

UMEROS EM C. 61
Se a vari avel que for receber os dados for tipo
ponteiro
n ao use o
redirecionador de enderecos
No exemplo, no box acima, foi preciso usar porque numero n ao e do tipo ponteiro.
Ser ao necess arios agora dois toques para construir a entrada de dados. Pr atico,
n ao?
Este metodo se aplica a programas inteiros. Quando vamos fazer um novo
programa, nunca comecamos de zero, sempre fazemos uma busca de algum pro-
grama que se encontre pr oximo do nosso objetivo, para isto colocamos palavras-
chave nos coment arios iniciais dos nossos programas.
Veja o arquivo
esqueleto.c
que, no mnimo, e o nosso ponto de partida.
Analise de prog03XX
Vamos olhar de perto a sintaxe de cada uma dessas fun coes.
Lembre-se que no fragmento de programa acima pode haver mais fun coes
antes de leia() e que a declara cao de variaveis tem que vir no incio do bloco,
ver prog03 10.c.
Vamos analisar os parametros de leia() (fgets())
leia(deposito, tamanho de palavra(deposito), entrada pdr); tem os se-
guinte parametros:
deposito, e um vetor de caracteres sucientemente grande para receber o
que se espera.

E sua responsabilidade denir isto tendo em mente n ao per-
der espa co nem deixa-lo curto demais. Se o espa co for insuciente, dados
vao se perder e c segue andando lampeiro. Outras linguagens parariam e
emitiriam uma mensagem de erro.
tamanho de palavra(deposito) poderia ser considerado uma falta de oti-
miza cao da linguagem porque o compilador poderia deduzir este n umero
inteiro da declara cao de deposito. Mas isto tornaria o compilador mais
lento.
entrada pdr informa ao compilador de onde vem os dados. Neste mo-
mento estamos lendo os dados via teclado, se voce estiver com pressa de
ver como se leem dados de um arquivo em disco, veja os programas da
serie 20, prog20 2.c, por exemplo, em que entrada pdr dene um ar-
quivo em disco onde os dados serao gravados e prog20 3.c em que se
leem dados contidos num arquivo em disco.
Vamos analisar converte palavra(), (sscanf()):
converte palavra(deposito, %f, &numero);
Ela exige tres parametros:
62 CAP

ITULO 3. N

UMEROS E LETRAS
deposito A variavel onde os dados se encontram guardados, no nosso
exemplo um vetor de caracteres;
o formatador de dados %f que aqui funciona como um operador para
mudanca de tipo de dados;
destino definitivo a variavel onde os dados serao guardados, (corri-
gindo: o endere co da variavel onde os dados serao guardados). Ver abaixo.
observe a possvel necessidade de usar o redirecionador de endere co &.
Falamos possvel porque se a variavel ja for do tipo ponteiro, o redirecio-
nador de endere co nao pode ser usado.
3.2 Brincando com as palavras em C.
Resumo.
Existem dois tipos de dados b asicos em C e na maioria das linguagens de processamento
de dados: n umeros e caracteres. Uma palavra e uma seq uencia de caracteres entre aspas,
com algumas exce c oes: h a alguns caracteres que tem signicado especial e que para serem
includos nesta deni c ao e preciso algum esfor co extra, como o caracter \que serve para
indicar ao compilador que depois dele vem outro caracter especial. Por exemplo, para fazer
uma mudan ca de linha, como voce j a viu nos programas anteriores, usamos \n dentro de
uma mensagem.
Neste par agrafo vamos aprender a lidar com caracteres e vetores de caracteres.
3.2.1 Palavras, macros, caracteres.
Se e verdade que tudo, dentro do computador e formado de zeros e uns
8
,
para nos humanos, o computador cria uma facilidade extra e expande este
universo estreito com auxlio de uma codica cao para caracteres, e ainda cria
uma parti cao muito util:
Caracteres numericos: 0,1,2, . . . , 9
Os outros... completando alguma coisa da ordem de 256 = 2
8
caracteres.
O teclado do computador, tem, por exemplo 101 teclas. Mas a e A
sao dois caracteres diferentes obtidos apertando ou n ao shif junto com
a tecla a. Com a tecla ctrl voce pode obter novos caracteres e assim
por diante. O que caracteriza um caracter e sua escritura entre aspas
simples. Assim 3 e um caracter, como a e 3 e um vetor de caracteres.
Tenha cuidado com estas combina coes,
ctrl-X, alt-X
alguns destes caracteres de controle podem, simplesmente, travar o pro-
grama que voce estiver usando...
alt-X parece ser sempre inofensivo, mas nao e o caso de ctrl-X.
8
Literalmente falando isto e falso hoje. O que era zero hoje e baixa voltagem, cerca de 2.5
volts, e o que era um hoje e alta voltagem, cerca de 5 volts...
3.2. BRINCANDO COM AS PALAVRAS EM C. 63
Aglomerados destes dois tipos de dados formam as macros, e os vetores
de caracteres, veja a observac ao a respeito destes dois tipos de dados. De
forma simplicada, o que estiver entre aspas e vetor de caracteres.
Alguns destes caracteres tem efeito especial, uns voce pode usar diretamente,
outros cam escondidos para uso interno do sistema operacional mas podem ser
acessados com alguma sabedoria desde que isto seja feito sabendo-se o que
se est a fazendo. Voce ja sabe que ctrl alt del serve para desligar a m aquina,
por exemplo...
Exerccios: 7 Vericando os caracteres
Os exerccios desta sec ao usam conceitos que somente vamos estudar no
captulo 4, salte ate este captulo quando sentir necessidade, ou ignore os con-
ceitos ainda n ao estudados. Basicamente as func oes para(), se() e o conceito
de laco e que precisamos do captulo 4, aqui.
1. Leia a biblioteca ambiente.h e analise o programa ascii 2.c, (rode e
leia o programa) para ver como se pode acentuar. Logo no come co de
ambiente.h se encontram as macros para denir as nossas letras acentu-
adas.
2. Leia o programa ascii.c e procure entender o comando de impress ao.
Talvez voce deva rodar o programa e depois voltar a le-lo. Ignore por
enquanto a func ao para, ela vai ser estudada no pr oximo captulo, ela e
respons avel pela evoluc ao da vari avel n desde 0 ate 255. Este trecho do
programa se chama um la co.
3. Claro, voce n ao conseguiu ver nada do que o programa imprimiu... 256
linha rodaram em frente aos seus olhos. Soluc ao: faca uma restric ao
dentro do para de modo que o programa imprima umas 10 linhas, (ver
ascii 1.c).
4. Melhore o programa ascii 2.c a seu gosto, incluindo mensagens na sada
de dados e na entrada de dados. Use muitas palavras acentuadas para
aprender a passar par ametros para imprima().
Veja que existe uma complicac ao
9
extra. Para nos comunicarmos com a
maquina precisamos de uma linguagem, como C, ou mesmo antes das lingua-
gens, se encontram os sistemas operacionais, LinuX, FreeBSD, DOS etc... Ora
as linguagens sao feitas de palavras
10
, quer dizer, aglomerados de caracteres
aos quais se fez uma associa cao com uma rotina da linguagem: e isto que voce
usa quando digita dir e enter na linha de comandos. O mesmo se da quando
voce executa a linha
gcc -v numero.c -onumero
9
sem preconceitos, as complicacoes s ao neces arias, uma vida simples e insuport avel...
10
veja observa c ao a respeito
64 CAP

ITULO 3. N

UMEROS E LETRAS
criando uma nova palavra, numero que agora o sistema operacional reconhece
como incluida no seu vocubulario e associada a uma rotina gravada no HD,
provavelmente em sua area de trabalho.
Uma novaespecica cao se vem estabelecendo, um modismo. Palavras
deste tipo que acabamos de descrever passam a ser chamadas de macros.
As macros servem para denir vari aveis, nomes de comandos e func oes. A pa-
lavra macro e antiga, passou para o esquecimento, e agora volta a ser usada com
frequencia como um sinonimo de variavel.
Vamos usar macros com mais freq uencia a partir do captulo 5 quando
come caremos a criar fun coes. Agora vamos trabalhar com vetores de caracteres.
Vocabulario: 5 caracter, palavra, macro, vetor de caracteres, variavel,
smbolo, identicador
Nos usamos palavra num sentido pouco usual em computacao, e foi proposital.
Aqui existe uma ambiguidade, palavra e usada tambem como medida da informacao
junto com bit, byte, apenas mal denida, existem palavras de 16 bits e de 32 bytes. A ideia
era que
um bit, seria a menor medida da informacao,
um aglomerado de 8 bits formaria um byte. Isto pode ser pensado sicamente como
um integrado contendo 8 diodos que possam energisados criando um total de 2
8
pos-
sibilidades;
e 16 bytes formaria uma word, que e palavra em ingles.
Mas a prepotencia de certas rmas computacionais anarquizou esta convencao porque
lancaram no mercado maquinas, ou sistemas, arrogantemente dizendo, que a word era de
32 bytes...
Uma outra ambiguidade persiste, nas linguagens humanas se tem o conceito de palavra
reservado para um aglomerado de letras e possivelmente n umeros, como Pentium III, para
representar os objetos ou as ideias que nos cercam e com os quais nos comunicamos formando
as frases de nossa linguagem.
Ainda existe o conceito de macro em computacao, tambem difuso quanto `a sua concepcao.
Voce pode encontrar o uso de macro, identicador, nome, smbolo usados como sinonimos.
caracter qualquer um dos smbolos que e possivel acionando uma tecla (ou
um conjunto de teclas de uma s o vez). Como o famoso ctrl-alt-del. O
programa ascii.c lhe mostra o que s ao caracteres, leia e rode o programa.
identicador e usado para fazer referencia ao nome de uma vari avel e
tambem de func oes.
macro e usada com freq uencia para representar o nome de uma rotina,
de um programa.
smbolo e usado como sin onimo de identicador, mas pode ser encontrado
com como sin onimo de variavel.
variavel tem uma concepc ao mais est avel, tem o signicado usado em
Matem atica.
Word Uma medida da informac ao. Ambgua, ora signifca 16 bytes, outras
vezes 32 bytes.
3.2. BRINCANDO COM AS PALAVRAS EM C. 65
vetor de caracteres Um aglomerado de caracteres enfeixados entre as-
pas. Alguns dos caracteres de controle n ao podem ser incluidos porque eles
tem uso especial para comunicac ao com o sistema operacional, como n
que signica nova linha.
Leia o arquivo traducao.h e vera al um conjunto de macros. As que se
encontram a esquerda sao as nossas que tem por deni cao aquelas que se se
encontram `a esquerda, usando a macro define do c.
Quando voce escrever
inteiro numero;
voce informa ao C que esta criando uma nova macro, designada pelo aglomerado
de letras n, u, m, e, r, o, classicada como variavel, que devera ser associada
a um endere co de memoria e que deve guardar um n umero inteiro.
Mas quando voce escrever numero, o compilador c vai identicar este
objeto como um vetor de caracteres e ignorar o que se encontra entre as aspas
mas fazendo-lhes uma associa c ao de endere cos sucessivos de memoria se voce
tiver denido tudo direitinho.... e isto que se chama um vetor de caracteres .
Ha algumas regras para denir
macros, variaveis, smbolos, identificadores
,
a primeira e que elas nao devem estar entre aspas, tudo que estiver entre
aspas e um vetor de caracteres;
depois elas nao devem come car com um n umero;
nalmente os caracteres
+ - / * $ % # @ ! ^ \
devem ser evitados e algumas vezes sao proibidos.
O caracter - nao e em geral proibido, mas e um mau habito usa-lo, porque
se confunde com a subtra cao.
O caracter _ tambem nao e proibido, mas tem em um signicado especial que
voce ainda vera no momento certo, e deve tambem ser evitado como primeiro
elemento ou ultimo.
Em C as dois identicadores Abracadabra e abracadabra sao diferentes,
quer dizer que a linguageme sensvel `a diferen ca entre letra mai uscula e min uscula.
Vamos seguir, entretanto, o habito lingustico, leia jargao, que prefere a
palavra identicador `a palavra macro.
Um identificador sera uma macro para nos apenas quando receber uma
deni cao(quando houver um algoritimo associado ao identicador).
66 CAP

ITULO 3. N

UMEROS E LETRAS
3.2.2 Vetores de caracteres.
Usamos vetores de caracteres para
mensagens construir as mensagens de um programa.
receber dados Ver a variavel deposito que usamos em conjunto com
leia(),converte palavra() . Veja o arquivo entrada dados.
Ha programas que se especilizam apenas em manipular mensagens, por
exemplo:
1. Um programa que gerencie um pacote computacional, basicamente ira
emitir mensagens para informar ao usuario quais sao as possibilidades do
programa, exibir o menu.
2. Um modulo de pesquisa de assuntos numa pagina da Internet ou num
banco de dados especializado em assuntos, ira receber palavras que o
usuario queira fornecer para fazer uma busca dentro do programa site ou
nos sites que tenham liga coes com este em que o usuario estiver conectado.
3. Voce pode estar interessado em construir um programa que cadastre se-
nhas. Uma senha seria um vetor de caracteres. Observe que senhas nao
sao macros. As macros devem receber dados ou conter dados.
Originalmente, em c, nao havia este tipo de dados, ele foi adicionado posteri-
ormente com a cria cao da biblioteca string.h, da qual fazem parte as seguintes
fun coes
11
:
Vocabulario: 6 Algumas func oes denidas em string.h copia de palavra
(strcpy()) ;concatena palavras() (strcat()) ;tamanho de palavra()
(strlen()) ;compara palavras() (strcmp()); compara()
copia de palavra(), strcpy() Sintaxe:
copia de palavra(var, palavra);
Se var tiver sido denida com o tamanho adequado ir a receber palavra.
Observe a diferenca entre a atribuic ao numerica e esta entre vari aveis do
tipo ponteiro. Para n umeros vale
x = 3;
se x for uma vari avel de tipo numerico. Voce ter a feito a atribuic ao do
valor 3 ` a vari avel x. Para cadeias de caracteres n ao e assim que se faz
atribuic ao. Temos que usar copia de palavras() ou (strcpy()).
concatena palavras(), strcat() Sintaxe:
concatena palavras(primeiro,segundo);
11
leia comandos, se quiser
3.2. BRINCANDO COM AS PALAVRAS EM C. 67
Se a vari avel primeiro contiver a string Jose e a vari avel segundo
contiver a string Maria ent ao depois da execuc ao de
concatena palavras(primeiro,segundo);
a vari avel primeiro conter a o valor JoseMaria. Claro, se voce desejar
um espaco entre os dois nomes, voce dever a executar primeiro:
concatena palavras(primeiro, );
veja abaixo.
Esta func ao serve para inicializar vari aveis tambem. O trecho de programa
seguinte far a com que primeiro contenha Jose Maria:
palavra primeiro[30];
concatena palavras(primeiro,Jose);
concatena palavras(primeiro, );
concatena palavras(primeiro,Maria);
Ver prog04 1.c.
tamanho de palavra(), strlen() Sintaxe:
tamanho de palavra(var)
Se a vari avel var contiver uma string denidas por uma seq uencia de n
caracteres, ser a o inteiro positivo n a resposta de
tamanho de palavra(var) > n N
compara palavras(), strcmp() Sintaxe: compara palavras(var1,var2);
com duas vari aveis do tipo string. Esta func ao da linguagem c tem um
uma sintaxe perversa. O resultado de
compara palavras(primeiro,segundo)
ser a zero se os vetores de caracteres contidos nas vari aveis primeiro,
segundo forem iguais. Veja o seguinte pedaco do programa prog04 2.c
palavra primeiro[30],segundo[50];
imprima(A primeira palavra >);
leia(primeiro, tamanho do(primeiro), entrada pdr);
imprima(A segunda palavra >);
leia(segundo, tamanho do(segundo), entrada pdr);
imprima(% d n, O resultado da comparac ao e:,
compara palavras(primeiro,segundo));
Vai resultar em zero se as vari aveis primeiro e segundo contiverem a
mesma string, apesar da denic ao diferente das vari aveis.
68 CAP

ITULO 3. N

UMEROS E LETRAS
compara() denida em ambiente corrige a pervers ao de compara palavras()
(strcmp()).
compara(primeiro,segundo) ser a zero somente se o conte udo de pri-
meiro e segundo forem diferentes.
Aqui podemos aproveitar para sugerir-lhe um metodo que todo programador
experiente:
Observa cao: 16 Reutilizac ao
Todo programador prossional, quando vai escrever um novo programa, come ca
por examinar entre os seus programas um parecido com aquele que deseja pro-
duzir.
Anal, porque comecar tudo do nada!
Se tiver que comparar palavras, v a buscar em alguma biblioteca programas
que comparem palavras algum apropriado porque assim voce vai se relembrar
qual e sintaxe de compara palavras() e sobretudo como foi que fez uso desta
func ao a ultima vez que precisou. Em geral apagamos quase todo o programa
para aproveitar quase que apenas o esqueleto...

E isto que se chama reutiliza cao de programas.


Deveriamos usar a palavra reciclagem, embora os americanos venham usando
a palavra reutiliza c ao.
A reciclagem de programas que j a foram testados e que ainda funcionam
bem, economiza tempo de trabalho.
Cabe relembrar o presenca dos comentarios nos programas... eles podem
criar condic oes para reciclagens ecientes de antigos programas.
Os nossos programas todos foram feitos com este objetivo em vista, inclusive
todos os mais recentes tem uma linha
Palavras chave
para faciliar a busca em LinuX. Se eu quiser procurar um programa que acesse
arquivos, na linha de comandos, executo:
grep arquivo *.c
e vou ter uma lista de programas que mexem com arquivos.
Leia a nossa biblioteca ambiente.h onde est a denida a func ao compara()
que inverte a l ogica perversa de strcmp(). Veja como e f acil corrigir aquilo que
n ao nos agrade na linguagem c.
Quando precisamos de comparar a igualdade entre palavras, usamos compara()
em vez de strcmp().
Observa cao: 17 Utilizac ao correta de strcmp()
Mas tem l ogica em compara palavras() strcmp().
Veja o seguinte trecho de programa
3.2. BRINCANDO COM AS PALAVRAS EM C. 69
primeiro = aaa;
segundo = bbb
terceiro = ccc
pri = strcmp(segundo, primeiro) aaa, bbb
seg = strcmp(terceiro, segundo) bbb, ccc
ter = strcmp(primeiro, terceiro) ccc, aaa
imprima(%d,pri); 1
imprima(%d,seg); 1
imprima(%d,ter); -1
Nas tres ultimas linhas voce tem o valor das vari aveis
pri,seg,ter
que guardam o resultado das comparac oes feitas.
Observe a ordem como as comparac oes s ao feitas por
strcmp(maior, menor)
para que o resultado seja positivo.
Quando voce usar com este objetivo, em um programa, deixe um coment ario
dizendo que e este o uso.
Exerccios: 8 Vetores de caracteres
1. No programa prog04 1.c a vari avel primeiro e denida com um valor
inicial, um vetor de caracteres vazio. Se n ao for assim c vai colocar
lixo n ao recicl avel em seu interior. Experimente modicar o programa
eliminando a inicializac ao da vari avel primeiro e analise o resultado.
2. Explique (tente explicar!) onde, exatamente, e por que, no programa
prog04 1.c, o compilador ena lixo se a vari avel n ao for inicializada na
declarac ao.
3. Rode o programa prog04 2.c e analise a diferenca entre
tamanho de palavra(), strlen()
e
tamanho da(), sizeof().
Uma, conta o n umero de caracteres do conte udo da vari avel, a outra, diz
qual e tamanho (tamanho planejado) da vari avel.
4. An alise, ao rodar o programa prog04 2.c um defeito: pede que voce aperte
uma tecla para continuar, mas n ao espera... Respons avel: ler() ou
scanf(). Veja a soluc ao do problema em prog04 21.c. Leia o coment ario
tambem.
5. O programa prog04 3.c compara duas vari aveis para determinar se s ao
iguais. Verique que isto e independente da denic ao das vari aveis, claro,
desde que sejam do mesmo tipo.
6. Corrija prog01.c para que ele leia o seu nome completamente, (se ainda
n ao o tiver feito...)
70 CAP

ITULO 3. N

UMEROS E LETRAS
7. Leia e rode prog04 5.c , ele e um tutorial sobre o uso de strcmp(),
compara(). Voce vai ver que strcmp() e uma importante func ao para
car em background
12
, como zemos em compara().
12
voce est a vendo aqui uma forma importante de usar C, construindo outras ferramentas
com as poderosas fun c oes da linguagem.
Captulo 4
Controle logico do uxo
Aqui come ca programa c ao.
Vamos estudar a l ogica por tr as de qualquer programa, em qualquer linguagem
de programa c ao do tipo imperativo.
As palavras chaves deste captulo s ao:
se() if()
se()/ou entao if()/else
escolha() switch()
enquanto() while()
para() for()
pare break
voltar() return()
Com estas palavras se fazem programas, portanto com elas podemos construir
as frases com que vamos instruir um computador a processar os dados que
lhe entregamos.
Vamos estudar a sintaxe desta comunica c ao, neste captulo, e isto que muitas
vezes e chamado de logica.
4.1 O condicional se() (if())
Vamos come car com duas estruturas de controle do uxo:
1) se() if()
se(certo) if(certo)
fa ca(); fa ca()
2) se() ou entao if() else
se(certo) if(certo)
fa ca(); fa ca();
ou entao else
fa ca outra coisa(); fa ca outra coisa();
Observe o uso do ponto-e-virgula no caso if() else, antes do else tem
ponto-e-virgula. Esta observa cao e importante para programadores em Pas-
71
72 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
cal porque (no caso do Pascal) nao tem ponto-e-virgula antes do else. Em
c, tem !
A fun cao se() recebe um parametro e o avalia. Se esta avalia cao resultar em
verdadeiro
1
o comando associado sera executado. Veja, por exemplo, o seguinte
bloco
imprima(Forneca-me dois numeros );
imprima(O segundo numero deve ser maior do que o primeiro);
se(numero1 < numero2 )

imprima(OK ! voce obedeceu ao combinado);

Este bloco esta implementado no programa prog05.c. Leia e rode o pro-


grama.
Esta comunica c ao esta claramente incompleta. Falta uma alternativa: . . . se
o usu ario do programa tiver fornecido um segundo n umero menor do que o
primeiro ?
Aqui entra o ou entao (else). Vamos completar o esquema.
imprima(Forneca-me dois numeros );
imprima(O segundo numero deve ser maior do que o primeiro);
se(numero1 < numero2 )

imprima(OK ! voce obedeceu ao combinado);

ou entao
imprima(Voce desobedeceu ao combinado ! )
Se a condi cao testada pelo se() se vericar falsa, o programa se conecta,
imediatamente, a um ou entao que se encontre depois se().
Se voce, por engano, colocar algum comando entre o nal do se() e o
ou entao havera uma mensagem de erro indicando isto. O prog05 1.c esta
preparado com este erro, basta apagar o comentario antes do ou entao. Expe-
rimente !
Em geral (nem sempre) usamos um par
se(condicao) ou entao
1
leia observa c ao sobre verdade e falsidade.
4.1. O CONDICIONAL SE() (IF()) 73
rode o programa prog05 1.c que implementa o se() ou entao. Depois leia o
programa e volte a roda-lo...
Exerccios: 9 se()/ou entao
1. Rode, leia, rode o programa prog05 1.c.
2. Apague o coment ario da linha que precede o ou entao e compile o pro-
grama. Ele vai reclamar dizendo que h a um erro antes do else (ou entao).
3. Altere o programa prog05 1.c para ele diga
2
que sabe calcular o fatorial
de n e se o usu ario apresentar um n umero maior do que 13 responda que
passou da capaciade da m aquina... soluc ao prog05 2.c
4. Estude prog05 2.c e veja que tem voltar duas vezes com valores diferen-
tes. Por que ? Observe que prog05 2.c e um exemplo de planejamento
vazio... veja o pr oximo exerccio.
5. Planeje um programa para calcular a divis ao exata de dois n umeros intei-
ros, o dividendo pelo divisor. Se o usu ario fornecer um divisor maior
do que o dividendo diga que e impossvel, ou entao que a o programa
ainda n ao sabe fazer esta conta, pedindo, gentilmente, que volte depois.
soluc ao prog05 3.c
6. Altere o programa prog05 3.c pedindo que o usu ario forneca mais alguns
n umeros e faca mais alguns testes para treinar o uso de
se()/ou entao
experimente omitir voltar. Experimente voltar com outros valores in-
teiros.
Os programas prog05 1.c prog05 2.c prog05 3.c todos tem a estrutura
logica da gura (g. 4.1) pagina 74,
Ha um teste, indicado na (g. 4.1) como condic ao e, em qualquer hipotese,
Verdadeira ou Falsa, o programa deve parar. Entao o comando voltar tem
que aparecer tanto dentro do se() como dentro do ou entao. Este e um erro
comum de logica de programa c ao, o programador esquecer de fazer uma analise
logica do uxo, e consequentemente, se perder nas sadas do programa.
Experimente, apague um voltar nestes programas e compile.
Veja mais este exemplo, com fatorial
3
.
if(n<10)

fatorial(n);

2
logo veremos um programa para calcular fatorial, por enquanto fa ca apenas o planeja-
mento...
3
precisamos de enquanto() para calcular o fatorial. Por enquanto ser a apenas planejamento
vazio. . .
74 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
pare();
V
F
pare();
condio
Figura 4.1: se() ou entao
ira calcular o fatorial de n se o n umero n for menor do que 10. Como nao existe
o fatorial de n umeros negativos, este algoritmo precisa ser melhor especicado
pois ele n ao duvidaria em calcular o fatorial de 1 se o n umero n = 1 lhe
fosse apresentado.
Precisamos de mais uma estrutura de controle de uxo para resolver o pro-
blema do fatorial. Se estiver curioso, leia o programa fatorial.c mas voce pode
resolver os exerccioso desta se cao sem resolver inteiramente o problema: pla-
nejamentos vazios. Se habitue a esta ideia que ela e essencial em programa cao.
Sempre fazemos planejamentos vazios numa primeira etapa, e esta se cao traz
varios exemplos. Sem brincadeira, eles sao importantes para uma a constru cao
da logica do problema.
Exerccios: 10 Fatorial incompleto Escreva o programa fat inc.c que execute
o algoritmo incompleto acima. Veja soluc ao no disco...
Vamos agora melhorar o planejamento do fatorial.
se(n >= 0)
inicio
fatorial(n);
fim
se(n<0)
inicio
imprima(nao existe o fatorial de %d,n);
fim
4.1. O CONDICIONAL SE() (IF()) 75
Exerccios: 11 Melhorando o fatorial
Transforme o esquema gr aco acima no programa fat inc02.c, a segunda
vers ao do fatorial. Veja a soluc ao no disco. O programa fat inc02.c faz uso
de func oes, v a ao captulo 5 para uma breve leitura sobre func oes para entender
a soluc ao.
Existe um esquema graco, chamado fluxograma, que nos permite uma
visualiza cao do uxo logico.
As guras (g. 4.2),(g. 4.3) (g. 4.4) mostram a evolu cao de um programa,
ver paginas 75, 76, 77.
A gura 4.2 representa os dois primeiros retangulos acima: um unico se().
A gura 4.3 contem o planejamento para o caso de n < 0 indicando que o
processo deve parar, com uma alternativa (else) para caso de que n! ultrapasse
a capacidade da maquina.
Observe que no primeiro caso o processo para, apenas se n > 10, mas a
maquina tentaria calcular (1)!, o fatorial de n umero negativo.
A gura 4.4 contempla uma entrada de dados, e um programa completo.
Veja na gura (g. 4.2) pagina 75,

faa alguma coisa;
faa outra coisa;
se (condicao)
{
pare();
}
faa mais alguma coisa;
continuando;
Figura 4.2: Fluxograma do se()
Quando for necessario usar dois se(), um completando o outro, ent ao pos-
sivelmente e melhor usar se() ou entao():
se(verdadeiro) faca ou entao faca outra coisa
O exemplo do fatorial caria agora melhor descrito assim:
se(n >= 0)
imprima(%d \ n ,fatorial(n));
ou entao
imprima(%s \n,
nao ha fatorial de numeros negativos);
76 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
(n < 0) (n > 13000)
pare();
V
V
F
F
fatorial(n)
Figura 4.3: Fluxograma com dois se()
supondo que fatorial() seja uma fun cao denida em alguma bilioteca.
Os uxogramas nos trazem uma li cao importante para o planejamento de
sistemas:
rapidamente uma folha de papel ser a insuciente para fazer o uxograma de
um problema.
Isto signica que voce deve dar um zoom no problema... quer dizer, resol-
ver as questoes maiores do problema, as grandes decisoes, estas sim representa-
das num primeiro uxograma.
Um exemplo fala mais que mil palavras. Vamos fazer o uxograma para
resolver uma equa c ao do segundo grau.
Uma equa cao do 2
o
grau tem tres coecientes, logo tres entradas de dados;
quer dizer tres retangulos no uxograma.
Temos que calcular o delta, um crculo no uxograma, porque os crculos
representam ac oes.
Pontos de decisao, se o delta for positivo, nulo ou negativo, tres pontos
de decisao (dois diamantes),
Tres crculos representados as tres possibilidades nais: duas raizes, uma
unica raiz, nenhuma raiz real.
Total 10 guras geometricas, um desenho complicado difcil de ser colocado
numa folha de papel. Pior, a visualiza cao seria pobre que e o contrario do
objetivo.
4.1. O CONDICIONAL SE() (IF()) 77
(n < 0) (n > 13000)
pare();
fatorial(n)
n
Figura 4.4: Fluxograma com dois se(), uma entrada e uma sada dados
Conclusao: devemos visualizar o problema em grandes linhas com um
fluxograma-generico
e depois fazer
fluxogramas-locais
para cada um dos blocos do generico.
No caso do problema das raizes o estudo generico seria:
Entrada de dados Primeiro uma unica representa cao para entrada de da-
dos.
Decisao uma unica, verica se 0 e conclue se tem raiz, (sim ou n ao).
Remete ao calculo das raizes ou a uma mensagem de impossibilidade.
Veja o uxograma desta analise logica na gura (g. 4.5) p agina 78,
O bloco (logico)
calcule as razes
esconde varios calculos, voce esta diante de um planejamento vazio... pro-
gramamos em equipes. Este e a ideia inicial, depois cada um dos membros da
equipe ira tratar do seu m odulo.
Ha fun coes escondidas dentro do uxograma, mas a ideia geral do processa-
mento esta expressa.
Existe uma fun cao para calcular o escondida dentro do ponto de decisao.
Tem uma fun cao para calcular as raizes escondida dentro da frase calcula as
raizes. Ha seis linhas de entrada de dados escondidas na frase entrada de
dados.
Isto a gente resolve depois, primeiro vem o planejamento. Claro, tem muito
sistema que nunca passa do planejamento e da promessa.
Vamos escrever o planejamento do programa que corresponde a este uxo-
grama.
78 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
Delta > 0
(a,b,c)
V
F
Calcule
as razes
pare();
Figura 4.5: Fluxograma da equa c ao do segundo grau.
entra dados();

delta = calcula delta(a,b,c)


se(delta >= 0)

calcula raizes(a,b,c);

ou entao

imprima(equacao impossivel);

voltar 0;

Depois iremos escrever as tres fun coes


entra dados(),
calcula delta(),
calcula raizes()
Quando come camos a produzir os programas fomos encontrando algumas
diculdades o que nos levou a construir tres versoes do programa, em cada
caso resolvendo uma parte do problema. Veja que em seg grau.c existem tres
funcoes para entrar os dados, uma para cada um dos coecientes. Seguramente
tem forma melhor de resolver este problema e voce sera convidade no proximo
bloco de exerccios, a ajudar o autor, com uma solu cao melhor.
4.1. O CONDICIONAL SE() (IF()) 79
Veja os programas
seg grau01.c, seg grau02.c, seg grau03.c
e a vers ao nal seg grau.c. Rode os programas para ver como foi sendo
feito planejamento, e depois leia cada um deles.
Exerccios: 12 Equac oes do segundo grau
1. Faca o programa equ seg01.c para executar o planejamento sugerido acima.
Soluc ao no disco.
2. Complete o programa equ seg01.c para que ele resolva equac oes do se-
gundo grau.
3. imprimindo o falso Experimente o programa logica01.c, rode-o e depois
leia-o. (No BC procure logi*.c)
4. imprimindo o falso Observe a express ao
(primeiro==segundo)
dada como par ametro ao imprima. Substitua (primeiro==segundo) por
(primeiro=segundo), rode o programa e veja a diferenca. Substitua tambem
como par ametro do se e descubra que diferenca isto faz.
5. Estude o programa fatorial04.c. Experimente retirar algumas chaves
(pares de chaves) para ver a diferenca. Ignore por enquanto as outras
vers oes de fatorial.
6. Em logica01.c temos a func ao se() que ir a avaliar uma express ao (ob-
serve que o par ametro e abstrato...). Experimente fornecer ao programa
dados n ao numericos, frases. Em BC ver logi01.c.
7. (primeiro == segundo) e uma operac ao l ogica seguida de uma ava-
lia cao: o parentesis. Coloque um alguns imprimas em logica01.c para
testar os valores de (primeiro == segundo).
8. Rode diversas vezes o programa e tente encontrar uma lei de formac ao
para o valor de (primeiro==segundo)
9. No programa logica01 1.c usamos
(primeiro = segundo)
como par ametro do if(). Verique que o compilador gcc vai avis a-lo do
risco, mas o programa vai rodar. Se voce fornecer ao programa os n umeros
1,0
nesta seq uencia, ele responder a que os n umeros s ao iguais. Por que ?
Veja a resposta nos coment arios do programa.
10. erros que enganam o compilador. Rode um programa com o seguinte co-
mando:
imprime(primeiro=segundo)
80 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
depois de denidas as vari aveis, naturalmente, e observe o coment ario
absurdo do compilador.
Objetivo do exerccio: prepar a-lo para procurar erros em local diferente do
apontado pelo compilador...
11. efeitos colaterais. Escreva um programa que rapidamente iguale duas
vari aveis inteiras, se elas forem diferentes, e nada faca se elas forem
iguais.
Li cao: 2 Erros l ogicos e de sintaxe. Num dos exerccios anteriores lhe pedimos
que substituisse (primeiro==segundo) por (primeiro=segundo). Aqui temos
um exemplo de erro l ogico que n ao e erro de sintaxe.
A express ao (primeiro=segundo) se constitui de dois operadores:
operador atribuic ao,
operador avaliac ao
4
.
No nosso sistema de computadores seq uenciais,(Von Neuman) a CPU tem
que fazer operac oes seguidas comecando sempre da parte interna de uma ex-
press ao no modelo matem atico de func ao composta:
(entrada) x : (4.1)
x f(g(h(x))) = f(g(y)) = f(z) = w (4.2)
(sada) w (4.3)
A CPU se utiliza de um sistema de mem oria onde c alculos intermedi arios
s ao guardados. Se voce tiver a curiosidade de ler um trecho de programa em
assembler, ver a, uma lista de operac oes semelhante ` a sequencia de equac oes
acima, apenas usando palavras como sto, abreviac ao de store, do ingles, que
signica guardar, seguida de um endereco de mem oria.
Hoje isto continua, apenas o programador escreve numa linguagem de alto
nvel que cria o programa em assembler, quando compila o c odigo escrito pelo
programador.
Qualquer linguagem de processamento (do tipo imperativo) faz uso deste sis-
tema, de acordo com o modelo acima descrito, no c alculo de w,
w e conseq uencia dos c alculos intermedi arios sobre as vari aveis y, z. Sendo
w a ultima, e passada para o standard output, (sada padr ao) que pode ser
o pr oximo comando a ser processado, (observe que x est a sendo passado
para o pr oximo comando, assim como y)
o vdeo;
a impressora;
4
alguns autores traduzem ao pe da letra do ingles evaluation, que em portugues e ava-
lia c ao, por evalua c ao, palavra inexistente...
4.1. O CONDICIONAL SE() (IF()) 81
um arquivo em disco, etc...
No caso (primeiro=segundo), o resultado desta operac ao composta e o va-
lor de segundo. Porque a operac ao mais interna e a atribuic ao que, ao ser
executada, produz este valor (faz parte da engenharia do compilador c).
Todas as operac oes ao serem executadas produzem valores e este e o segredo
dos efeitos colaterais: nem sempre este valor produzido e claro, muitas vezes
sendo um valor secund ario efetuado por uma operac ao primitiva pode dar um
ganho no programa, em velocidade
5
.
Essencialmente verdadeiro, tudo isto. Muito bonito se n ao produzisse algo-
ritmos difceis de serem lidos e interpretados. Esta velocidade pode ser consu-
mida depois durante o trabalho de manutenc ao de um programa cheio de atalhos
turtuosos.
Embora se (primeiro=segundo) possa ser considerado um erro de sin-
taxe, o gcc
6
n ao tem condic oes de detectar isto, uma vez que o resultado desta
operac ao, sendo uma express ao v alida para o gcc, pode ser passada como par ametro
` a func ao se().
Exmios programadores usam estes artifcios para conseguirem melhor de-
sempenho em seus programas e infelizmente n ao conseguem mais entende-los
duas ou tres semanas depois... (nem eles e nem os seus companheiros de equipe),
o que d a existencia, provavelmente, a sistemas operacionais bonitos, mas em-
perrados, e cheios de erros... praticamente impossveis de serem encontrados,
ate porque n ao s ao erros, s ao os chamados efeitos colaterais .
Os efeitos colaterais
7
s ao um risco em programac ao e sem d uvida devem ser
evitados a todo custo.
Programac ao n ao precisa mais ser econ omica, como nos primeiros dias
de sua existencia. A economia a ser feita deve ser no trabalho do programador
que, e, digamos assim, o itemcaro nesta area de trabalho. Computadores s ao
relativamente baratos, tem bastante mem oria e velocidade, o que permite que os
programas possam ser mais legveis e f aceis de serem mantidos. Programac ao e
coisa seria, n ao e brincadeira, de um programa mal feito podem depender vidas
ou eleic oes.
N ao podemos deixar de convid a-lo a fazer experiencias diversas para desco-
brir detalhes sobre os efeitos colaterais ... eles s ao m ultiplos e trazem preciosas
lic oes que podem evitar horas perdidas na correc ao de programas, muito em par-
ticular a troca de == por =. S ao exemplos dos tais insetos, (bugs), que infetam
programas enormes.
c e uma linguagem imperativa, quer dizer que nela existem apenas duas
op coes: Dada uma rela cao, ela sera:
verdadeira ou, exclusivamente,
5
mas pode ser lida por uma fun c ao como scanf(), e preciso saber reconhecer isto ou evitar
de usar scanf()
6
vamos escrever sempre gcc em vez de compilador da linguagem C de agora em diante
7
E difcil se livrar totalmente de efeitos colaterais, mas quando usados eles devem ser
documentados.
82 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
falsa.
Para o gcc, falso ca caracterizado pelo zero, qualquer outro valor diferente
de zero representa o verdadeiro. Este e um ponto que voce deve incorporar em
sua logica pessoal ao se tornar um c-programmer...
Exerccios: 13 Efeitos colaterais
Programar sem efeitos colaterais e difcil. No momento em que voce se tor-
nar um bom programador, dicilmente vai evitar de faze-lo, entretanto, n ao se
esqueca de que uma boa companhia para um efeito colateral e um coment ario,
que explique o que est a acontecendo, inclusive para voce mesmo, algum tempo
depois...
Nos exerccios abaixo estamos lhe dando exemplos de efeitos colaterais,
habitue-se, aqui nos exerccios, a escrever o c odigo incluindo os coment arios
explicativos, mesmo que o exerccio n ao lhe peca para faze-lo.
1. Escreva um pequeno programa, (reciclagem de logica01.c), para testar
que possveis combinac oes de dos operadores =, ==, tem sentido, como
em:
(primeiro==segundo=primeiro)
e determine o valor que resulta destas combinac oes. Use printf() para
ver o resultado. Soluc ao logica02.c
2. Construa uma func ao que faca uso util dos efeitos colaterais obtidos na
quest ao anterior, n ao se esquecendo da documentac ao que deixe claro o
que faz o programa. Soluc ao logica02.c
3. Construa um programa que verique se dois vetores de caracteres forneci-
dos (duas senhas) s ao iguais ou diferentes. Use strcmp() em vez de ==.
Soluc ao logica03 1.c.
4. Faca uma nova vers ao do programa logica03 1.c usando a func ao compara()
denida em ambiente.h.
5. Construa uma func ao em que sempre o teste do se seja zero, (falso),
qualquer que sejam os valores atribuidos ` as duas vari aveis que se pecam
ao usu ario.
Estaremos enganando o usu ario entao ?
6. Rode e leia sonho.c. Faca outros programas conversacionais, como sonho.c,
para adquirir pr atica com
se()/ou entao.
Veja sonho01.c.
4.2. M

ULTIPLAS ESCOLHAS. 83
4.2 M ultiplas escolhas.
Para escolhas m ultiplas gcc tem, a estrutura:
escolha() - switch()
que vamos estudar neste par agrafo.
As palavras reservadas, em portugues e em ingles para construir
escolha() estao abaixo em correspondencia:
escolha(variavel) inicio caso valor pare m
switch(variavel) case valor break
A fun cao escolha() recebe uma variavel e testa os seus valores contra uma
seq uencia planejada pelo programador.
O modelo e o seguinte:
escolha(variavel)
inicio
caso valor1: comando11;... ;pare;
caso valor2: comando21;... ;pare;
padrao: comandop1;... ;pare aten cao
caso valorn: comandon1;... ;pare;
m
A palavra-chave caso marca o incio de um novo teste e de uma nova
seq uencia de comandos que devem ser executados caso o teste se revele positivo.
Observa cao: 18 Uma cascata de execuc oes
A palavra-chave pare e essencial no uso desta estrutura, se ela n ao estiver
presente, os casos seguintes ser ao executados, depois do primeiro teste positivo.
Observe que voce pode fazer uso desta facilidade quando quiser que depois
que uma op cao verdadeira for identicada, uma seq uencia de outras sejam exe-
cutadas.
Neste caso elimine o pare, mas n ao se esqueca de colocar um coment ario
indicando que deseja que todas as opc oes sejam executadas portanto eliminou o
pare.
Observa cao: 19 Sugest ao: Arquivos lembrete
Crie um arquivo chamado 00escolha ou outro nome qualquer sugestivo,
por exemplo, 00switch, para reciclar esta estrutura.
Este metodo pode economisar um bom tempo de digitac ao, e vai ajud a-lo na
memorizac ao da sintaxe.
Deixe no diret orio de trabalho arquivos com os nomes das estruturas de uxo,
depois chame-os e cole-os no ponto adequado quando estiver redigindo um pro-
grama.
84 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
Voce pode usar este metodo com programas inteiros, e a reciclagem de pro-
gramas.
Os dois zeros antes do nome tem o efeito de forcar que os seus arquivos-
lembrete quem no topo da arvore de arquivos, quando eles foram listados sem
uma ordem especca. Tambem voce pode fazer uma listagem dos arquivos-
lembrete existentes com
ls 00* , ou no DOS dir 00*
Exerccios: 14 Estudo da func ao escolha() (switch())
1. Rode o programa
8
logica04.c, ele est a errado e os erros est ao indicados
no pr oprio programa, corrija o programa. logica04 1.c
2. Volte a rodar logica04.c e digite o ultimo caso correto, 3. Verique
que os anteriores n ao foram executados. Portanto escolha() age sequen-
cialmente ate encontrar uma primeira opc ao correta. Rode v arias vezes
logica04.c ate entender como funciona o switch() do c.
3. Melhore o programa logica04.c, acrescentando espacamento entre as
mensagens, letras mausculas, etc... de um jeito neste programa que est a
muito feio.
4. limitac ao de escolha() Experimente usar escolha() de forma mais in-
teligente, ver logica05.c. Tente dar aos casos um valor l ogico.
Soluc ao em logica05 1.c
Observa cao: 20 c interpretado
Espero que os autores de calc jamais leiam este livro... porque estou dimi-
nuindo o a import ancia de calc, injustamente. Verique isto.
Se voce estiver estudando c em um ambiente LinuX, quase certamente existe
no sistema um programa chamado calc. Este programa e uma linguagem de
programac ao que se assemelha ao c, mas e um interpretador de comandos. Se
voce digitar, dentro de calc,
(3==2)
ter a como resultado, imediatamente
0.
Experimente! Abra uma area
9
de trabalho, (shell), digite calc < enter >, e
dentro do calc digite (3==2).
Por que o resultado e zero?
calc e uma linguagem de programac ao bastante poderosa, mas exclusiva-
mente voltada para Matem atica e usa a estrutura l ogica de c. calc usa coman-
dos semelhantes ao da linguagem c, mas n ao e c, poristo e injusto o ttulo
acima.
calc n ao e c, certamente foi escrita em c como quase tudo que existe nos
computadores, mas calc e uma linguagem independente, interpretada, seme-
lhante ao c, que voce pode usar para aprender c.
8
em BC logi*.c, logi4 1.c
9
supondo que voce tem o calc instalado...
4.2. M

ULTIPLAS ESCOLHAS. 85
Interpretada signica que ela le um comando, faz sua an alise e avaliac ao
e imprime o resultado ou uma mensagem de erro.
Outro exemplo, em calc. Digite a seguinte frase tpica de c :
if (3==2) printf("esta certo"); else printf("esta errado");
e voce vai ver impresso na pr oxima linha,
esta errado.
Com calc voce pode testar as express oes da linguagem c quando tiver d uvidas
quanto ao valor delas.
A fun cao escolha() tem um uso limitado `a verica cao de constantes.

E
excelente na constru cao de menus, por exemplos. Ver o programa logica06.c,
que (por acaso) esta errado, como exemplo.
Exerccios: 15 Construc ao de um menu
1. Leia o programa logica06.c.

E um exemplo de como se pode fazer um
menu em c.
2. Rode logica06.c e corrija os seus erros.
Soluc ao logica06 1.c
3. Melhore o programa logica06 1.c incluindo espacamentos entre as frases
para tornar sua leitura mais agrad avel.
4. Um defeito tecnico, na linha em que se pede para digitar as opc oes, em
logica06 1.c, n ao deveria haver mudanca de linha. Corrija isto, se j a
n ao o tiver feito.
O programa logica06.c sera expandido e completado mais a frente.
Para terminar a discussao do escolha(), veja que outros casos podem estar
presentes e serem ignorados. Por exemplo, no caso de logica06.c, podiamos
ter incluido algumas novas rotinas de contabilidade, que planejamos produzir
no futuro, mas sem incluir no menu a sua listagem.
Como o usuario nao sabe de sua existencia, nao ira escolhe-las e assim pode-
riamos evitar que aparecesse a mensagem sobre as rotinas ainda nao construdas.
Utilidade: ca registrado no programa o que ainda pretendemos fazer, evita-
mos de dar explicanos que podem car sem a devida compreensao pelo p ublico
leigo.
Mas o que interessa mesmo aqui e registrar que escolhe(opcao) despreza
os casos cujos valores nao sejam contemplados pela variavel opcao. Observe,
entretanto, que gcc aceitaria uma op cao fora do menu e portanto a frase guar-
dada para o planejamento apareceria na tela ... claro que tem meios para evitar
isto, veja como nos exerccios.
Exerccios: 16 Testando a capacidade de escolha()
86 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
1. Veja em logica06 2.c que cou um caso escondido a ttulo de plane-
jamento, mas que ele pode ser executado se 7 for digitado.
2. Experimente colocar um se() evitando que os casos escondidos do plane-
jamento exponham os programadores ao ridculo...
Soluc ao logica06 3.c
Observa cao: 21 M ultiplas escolhas e seus problemas
A func ao switch() e uma das m ultiplas situac oes em que a linguagem c e
frouxa permitindo que acontecam situac oes inesperadas.
Elas n ao s ao, absolutamente, inesperadas, s ao erros de avaliac ao do pro-
gramador.
Aqui, como em outras tantas situac oes, lhe pedimos para reler o ultimo
par agrafo da introduc ao, tecnicas para programar bem. Uma dessas tecnicas
consiste em nunca fazer grandes programas, em vez disto, contrua pequenas
func oes que executem tarefas especcas e cujo aglomerado seja um grande pro-
grama. As pequenas func oes s ao f aceis de serem depuradas e situac oes, como
um item indesejado, cam na frente dos olhos.
Alem de fazer pequenos programas, se possvel constituidos de uma unica
func ao, (projeto difcil...), coment arios bem claros indicando possveis cascas
de banana devem ser includos.
Mais! Um programa contstitudo de uma unica funcao, certamente, e can-
didato a virar item de biblioteca.
Quando voce constr oi uma func ao deve cuidadosamente analisar as possveis
situac oes em que ela seria um risco e deixar isto registrado com um coment ario.
Exerccios: 17 if-else - switch
1. Um estacionamento de aeroporto tem as seguintes regras para cobran ca:
A taxa mnima e $2,00 pelas duas primeiras horas, n ao importanto
se o usu ario que menos de duas horas.
A cada hora que se passar, alem das primeiras duas horas, o usu ario
deve pagar $0,50 por hora, ate o limite de 24 horas;
Para estacionamentos que passem de 24 horas a cobranca passa a ser
feita por dia a raz ao de $13,00 por dia ou frac ao de dia.
Faca o programa para o c alculo das tarifas do estacionamento.
Soluc ao: estacionamento.c
2. Melhore o programa estacionamento.c tornando mais justo a cobranca
quando o tempo ultrapassa 24 horas levando em considerac ao frac ao de
dia tambem.
4.3. ENQUANTO() WHILE() 87
4.3 enquanto() while()
La cos s ao um tipo de estrutura de uxo de dados em que alguma coisa acon-
tece durante algum tempo. Por exemplo,
enquanto (estiveres na minha frente)
eu vou te olhar nos olhos;
Claro que vou deixar de lhe olhar nos olhos quando o objeto j a n ao mais
estiver na minha frente.
Vamos ver alguns exemplos menos sublimes e bem mais pr aticos.
Aproveitando a oportunidade, enquanto() sempre se escreve com letra min uscula,
mesmo no incio de uma frase... com letra mai uscula gcc nao entenderia
enquanto(), while().
Claro que voce pode alterar isto no arquivo traducao.h. Mas se, no Brasil,
estabelecermos um padrao para programa cao em portugues, todos deveremos
adotar o mesmo padrao. Por enquanto programar em portugues e uma ex-
periencia.
Dizemos que gcc e sensvel `a diferen ca entre letra mascula e mnuscula.
Portanto enquanto() e diferente de Enquanto(), e Enquanto() nao existe em
traducao.h.
Mas voce pode alterar isto, re-escrevendo o arquivo traducao.h e nele alte-
rando
enquanto ---> Enquanto.
e neste caso gcc so entenderia Enquanto().
A fun cao enquanto() analisa uma expressao e, se ela for verdadeira, executa
o comando que vem em seguida. Por exemplo, o seguinte algoritmo calcula a
soma dos 10 primeiros numeros inteiros estritamente positivos (a partir de 1).
Veja os comentarios logo a seguir.
(1) soma = 0 (1) soma = 0
(2) i = 1 (2) i = 1
(3) enquanto( i < 11) (3) while( i < 10)
(4) inicio (4)
(5) soma = soma + i (5) soma = soma + i
(6) i = i + 1 (6) i = i + 1
(7) m (7)
Comentarios:
1. Inicializa a variavel soma com zero; Aqui estamos comen cando a discutir
processamento de dados... soma e um buffer, um local onde se armaze-
nam dados para uso posterior. Alguns diriam que soma e um acumulador.
Os valores a serem somados vao ser acumulados nesta variavel, logo ela
tem que ser inicializada com zero. Se fossemos fazer multiplica coes suces-
sivas, a inicializa cao do buffer se faria com 1.
88 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
Porque, zero e o elemento neutro da adi cao, e um e o elemento neutro da
multiplica cao.
2. inicializa a variavel i com 1, porque e um contador n os, normalmente,
contamos de um em diante. Nao se esque ca de que c conta de zero em
diante... dizemos que c e de base 0. Consequentemente este programa
nao esta otimizado, esta perdendo espa co na memoria.
3. Teste, verica se i passa de 10, quando isto acontecer encerra o la co. A
variavel i e um contador.
4. inicio, marca o come co de um bloco logico. Em c e a chave-abrindo: .
5. Incrementa soma com o valor de i;
6. Incrementa i de uma unidade.
7. fim, marca o ponto nal de um bloco logico. Em c e a chave, , fechando
que termina os blocos.
Uma das diculdades iniciais em computa cao esta aqui presente nos itens
(5) e (6). Nao se tratam de igualdades matematicas ou equac oes.
O operador =, em algumas linguagens de computador, signica uma atri-
bui cao. Ha linguagens de computador que tem um smbolo diferente para este
operador, em algumas e uma seta, em outras, como Pascal, Maple, MuPAD, e
o smbolo
:=.
em c em Pascal
soma = soma + i; soma := soma + 1;
Assim
soma = soma + i
e um comando que se constitue da composi cao de dois operadores:
primeira opera cao a ser executada soma + i que adiciona o valor de i ao
valor de soma;
segunda opera cao a ser executada soma = soma + i que atribue o valor
calculado anteriormente, soma + i, `a soma, alterando, assim, o valor
guardado em soma.
Quer dizer que o la co descrito acima vai ser executado 10 vezes,
enquanto( i < 11):
O quadro seguinte mostra, a cada passo, qual e o valor de soma, do acrescimo
e do valor atualizado de soma.
4.3. ENQUANTO() WHILE() 89
no.oper. soma acrescimo soma atualisada status
1 0 1 1 CONTINUA
2 1 2 3 CONTINUA
3 3 3 6 CONTINUA
4 6 4 10 CONTINUA
5 10 5 15 CONTINUA
6 15 6 21 CONTINUA
7 21 7 28 CONTINUA
8 28 8 36 CONTINUA
9 36 9 45 CONTINUA
10 45 10 55 PARA
Observe que este la co calcula a soma dos termos de uma progress ao ar-
timetica de razao 1, desde o primeiro termo 1 ate o termo 10.
Exerccios: 18 1. Escreva um programa que imprima os termos de uma
p.a. dados o primeiro termo, a raz ao e o n umero de termos pelo teclado.
Soluc ao logica07.c
2. Melhore o programa logica07.c criando mensagens e di alogos com o
usu ario. Soluc ao logica07 1.c
3. Melhore programa logica07.c para que ele imprima os dados da p.a. em
linhas separadas. Acrescente tambem linhas separadoras com

4. Use a func ao limpa janela() para limpar o terreno e tirar a poluic ao vi-
sual da tela. A func ao limpa janela() est a denida na biblioteca ambiente.h.
5. Use a func ao apeteco2() para provocar paradas na execuc ao do programa
e permitir que o usu ario leia melhor o conte udo das mensagens, prosse-
guindo quando lhe parecer adequado. A func ao apeteco() est a denida
na biblioteca ambiente.h. Verique que h a v arios tipos de apeteteco().
6. Re-utilize programa logica07.c para calcular os termos de uma p.g.
7. Re-utilize programa logica07.c para calcular as atualizac oes de sua pou-
panca. Faca com o programa crie uma tabela para lhe mostrar a defasagem
da poupanca relativamente ao crescimento do dolar, por exemplo.
8. Faca um programa que compare o que acontece, se voce colocar 100 reais
na poupanca ou pegar 100 no cheque especial. Use imprima() assim
imprima(este mes na poupanca %f ou no cheque especial %fn,
poupanca, cheque);
observe que as vari aveis ter ao que ser do tipo real ou em c, float. Sobre
tudo na poupanca em que o incremento e de 0.05% ao mes...
90 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
Observe que logica07 1.c e segunda versao de logica07.c. O primeiro,
logica07.c, cabe inteiramente dentro da tela, sem os comentarios. Ele foi cui-
dadosamente depurado. Depois, na segunda versao, foram incluidas mensagens
explicativas ou auxiliares para conduzir o usuario a fornecer os dados.
Como logica07.c e pequeno e cabe inteiramente na tela, facilmente pude-
mos encontrar os erros cometidos e corrig-los todos.
Depois que um programa estiver funcionando, sem erros, podemos fazer-lhe
uma segunda versao incluindo
enfeites;
mensagens de comunica cao com o usuario;
incluir os comentarios.
Tudo isto e necessario, mesmo que o programa que um pouco maior do que a
tela.
Agora estamos melhorando um programa que ja funciona, mas teremos con-
trole da situa cao. Muitas vezes e esta hora de incluir comentarios porque o
programa esta funcionando e ja concluimos os truques para que ele casse me-
nor (os efeitos colaterais).
Exerccios: 19 Mas, por enquanto()
1. Observe que se um laco iniciar com
enquanto(1)
ele certamente nunca ir a parar sem uma ac ao mais forte
(Ctrl-C acionado no teclado...).
Use isto para alterar o programa estacionamento.c de modo que o ope-
rador n ao precise voltar a acionar o programa a cada cliente que sai. E
como o estacionamento e eterno o programa caria para sempre no ar.
Chamamos isto de loop innito porque e um laco que nunca para de ser
executado. Um programa que deve car sempre no ar, geralmente, e ge-
renciado por um loop innito que deixa na tela o menu de opc oes do
programa.
Em BC evite fazer isto. Primeiro aprenda a ligar nas options o acesso
ao Ctrl-C que pode estar desligado. Em Linux e f acil parar um programa
que esteja entalado... Em BC veja como fazer:
Abra um programa no editor, qualquer um, por exemplo
estacionamento.c
e escreva Ctrl deixando o cursor sobre esta palavra;
Clique no help e escolha topic search.
Voce vai parar em ctrlbrk. De enter;
Voce ser a conduzido ` a pagina das interrupc oes. Faca uma c opia do
exemplo que esta ao nal da p agina -
4.3. ENQUANTO() WHILE() 91
Copie para estacionamento.c o trecho
#define ABORT 0
int c_break(void)
{
printf("Control-Break pressed. Program aborting ...\n");
return (ABORT);
}
Agora voce pode criar um enquanto(1) que o programa ir a parar ao voce
apertar ctrl c.
Soluc ao estacionamento01.c. Fora do contexto. Usa func oes de trata-
mento do tempo. Ignore, inicialmente, a func ao ConverteTempo(). Use-
a. Este programa deve ser compilado em Linux com
gcc -Wall -oprog -lm estacionamento.c
a opc ao far a com que a biblioteca math.h seja usada.
2. Melhore estacionamento01.c uma vez que h a uma tremenda poluic ao
visual. Coloque
apeteco2(), limpa janela()
em locais adequados para melhorar o visual do programa.
3. Se voce j a estiver estudando integrais, facilmente pode transformar pro-
grama logica07.c num programa que calcule integrais. Se n ao estiver
estudando integrais, esqueca esta quest ao, por enquanto...
Soluc ao riemann04.c
esqueca por enquanto as outras vers oes de riemann.c que ser ao discutidas
mais a frente.
4. Melhore o programa logica06 3.c substituindo o se() por
enquanto(opcao > 6)
Soluc ao logica06 4.c.
5. Como logica06 4.c suja, irremediavelmente, a tela, use a func ao
limpa janela()
denida em ambiente.h para melhorar a performance do programa, frente
aos clientes mais exigentes. Se inspire em prog04 2.c .
Soluc ao logica06 5.c
6. Estude a func ao limpa janela() denida na biblioteca ambiente.h para
saber o que ela fez no programa anterior. Estude as func oes denidas em
ambiente.h para entender o funcionamento de uma biblioteca.
92 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
7. Coloque uma mensagem de sucesso no programa logica06 5.c usando a
func ao sucesso() denida em ambiente.h. Altere a mensagem, como al
se sugere, para atender ao seu gosto.
Voce foi conduzido a estudar a biblioteca ambiente.h. Quase todas as
fun coes da linguagem c se encontram denidas em alguma biblioteca. A lingua-
gem mesmo, sem as bibliotecas e mnima. Experimente apagar # include <stdio.h>
que se encontra em todos os programas e depois compila-lo, veja o que acontece.
4.4 Outro metodo para lacos.
Um metodo alternativo de fazer la cos e o para() (for()):
para(i = 0; i < 10; i = i + 1)
imprima("o termo %d da sucessao e --> %d",i + 1, 2 i + 3);
que vamos estudar neste paragrafo.
O efeito da expressao
para(i=0; i<10; i=i+1)
imprima("o termo %d da sucessao eh --> %d",i+1,2*i+3);
e o de imprimir sucessivamente os termos de uma sucessao, veja o resultado
obtido com calc .
for(i=0; i<10; i=i+1)
printf("o termo %d da sucessao eh --> %d\n",i+1,2*i+3);
o termo 1 da sucessao eh --> 3
o termo 2 da sucessao eh --> 5
o termo 3 da sucessao eh --> 7
o termo 4 da sucessao eh --> 9
o termo 5 da sucessao eh --> 11
o termo 6 da sucessao eh --> 13
o termo 7 da sucessao eh --> 15
o termo 8 da sucessao eh --> 17
o termo 9 da sucessao eh --> 19
o termo 10 da sucessao eh --> 21
Exerccios: 20 Rode usando calc
1. Rode a express ao abaixo com calc
for(i=0; i<10; i=i+1)
printf("o termo %d da sucessao eh --> %d\n",i+1,2*i+3);
4.4. OUTRO M

ETODO PARA LACOS. 93


Basta chamar calc, marcar o texto acima com o ratinho, col a-lo na tela
do calc e dar um <enter> para ver o resultado que est a apresentado
acima. Nos zemos isto mesmo, depois colamos o resultado do calc aqui.
2. Porque imprime ate o 10
o
e n ao apenas ate o 9
o
?
3. Usando calc apresente os termos de uma progress ao aritmetica de raz ao
0.5 com primeiro termo 3.
Soluc ao:
> for(i=0; i<10; i=i+1)
>> printf("o termo %d da sucessao --> %f\n",i+1,0.5*i-3);
Observe as diferen cas entre enquanto() e para(). Todos os dados ne-
cessarios ao funcionamento de para() devem ser fornecidos como parametros:
o valor inicial do contador;
o teste para nalizar o processo;
o metodo para fazer incrementos.
em suma, para() exige tres parametros.
Em c existe um atalho para fazer incrementos do tipo i = i + 1:
for(i=0; i<10; i++)
printf("o termo %d da sucessao eh --> %d\n",
i+1,2*i+3);
quer dizer que as duas expressoes
i = i+1 ; i++
sao equivalentes. Ha varios atalhos destes tipo reconhecidos pelo gcc que vamos
reunir no apendice. Ao faze-lo estamos claramente lhe dizendo que o seu uso
deve ser feito sob restri cao. Obviamente que o atalho sera executado com mais
rapidez, mas o programa cara mais dicil de ser lido.
Os exerccios lhe darao mais experiencia no uso de para() que mil palavras.
Exerccios: 21 Mais loops
1. Alerta Antes de fazer este exerccio, rodando c dentro do windows, veja
no manual como ativar o ctrl-c. Veja tambem, no ndice remissivo Ctrl-
c. Nos ambientes integrados existem uma opc ao para congurar o c e
ativar o ctrl-c que vem desativado para dar maior rapidez ao compilador.
Isto pode ser feito com uma instruc ao de compilac ao, e esta forma de fazer
e melhor porque n ao altera a congurac ao do ambiente integrado.
Experimente compilar e rodar o programa logica06 6.c. Ele n ao para
nunca, a n ao ser que voce o pare com ctrl-c. Leia o programa e analise
porque isto acontece. Verique o primeiro enquanto().
94 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
2. Altere logica06 6.c trocando
enquanto(1) --> enquanto (t)
e denindo t como inteiro em linha anterior, inicializando com o valor
t = 1. Compile e rode o programa. A unica maneira de par a-lo e com
ctrl-c, novamente.
3. Agora troque t por opcao e veja que o programa para digitando 0 como
opc ao n ao solicitada no menu. Experimente! Veja logica06 61.c e leia
ao nal dos coment arios.
4. Corrija o programa logica06 61.c para o menu informar que a sada do
programa se d a com
opcao = 0
soluc ao logica06 62.c
5. Corrija agora o programa logica06 5.c para que ele que no ar indeni-
damente ate que opcao = 0 seja escolhida.
Solu cao logica06 63.c
6. Corrija agora o programa logica06 5.c incluindo no menu a opc ao 0
para que o sistema pare.
Solu cao logica06 71.c
7. Porque n ao teria sentido resolver os exerccios deste bloco usando para()?
8. Traduza logica06 71.c para c.
Solu cao logica06 7.c
4.5 Parando no meio de um bloco.
Vamos estudar as fun c oes
pare, (break), voltar, (return)
nesta se c ao.
Com frequencia, dentro de um la co, precisamos de interrompe-lo, abrupta-
mente, sem que as demais fun coes sejam executadas. Quem faz isto e a fun cao
pare, (break), a mesma que estudamos junto com escolha(), (switch()).
Ao encontrar esta fun cao, gcc encerra o processo que estiver sendo execu-
tado dentro de um bloco e passa o controle do uxo para a proxima fun cao
imediatamente apos este bloco.

E isto que ocorre com escolha(), switch().
A gura (g. 4.6), pagina 95 mostra como isto se passa.
Veja uma situa cao-padrao:
4.5. PARANDO NO MEIO DE UM BLOCO. 95
para(i=0; i<100;i++)
inicio
fim
valor = 3*i+1;
imprima(\%d, valor);
se($valor > 100$)
pare;
continua aqui;
Figura 4.6: Ao encontrar pare() o uxo e desviado para a pr oxima fun c ao externa ao bloco.
para(i=0; i < 100;i++)
inicio
valor = 3 i + 1;
imprima(%d, valor);
se(valor > 100)
pare;
m
imprima(%d,i);
Vai sair do la co quando i = 34 sem executar os comandos internos para este
valor de i. Este la co resolve a equa cao (desigualdade)
3x + 1 > 100.
Exerccios: 22 Parando para resolver desigualdades
1. Verique que laco acima resolve resolve a desigualde:
3 i + 1 > 100
no conjunto dos inteiros, imprimindo 34, o primeiro n umero inteiro i que
a torna verdadeira. Soluc ao logica08.c.
2. Altere o programa que rodou o laco acima para resolver a desigualdade
3 i + 1 > 100
num intervalo de n umeros racionais, obviamente sem apresentar todas as
soluc oes, por que?
96 CAP

ITULO 4. CONTROLE L

OGICO DO FLUXO
3. Melhore estacionamento01 1.c permitindo que o tecnico em computac ao
pare o programa para fazer manutenc ao no micro.
Soluc ao: estacionamento01 2.c
4. Em estacionamento01 2.c usamos um vari avel do tipo
vetor de caracteres
com tamanho 1. Talvez fosse mais simples usar vari avel do tipo caracter,
estacionamento01 3.c que est a errado. Rode, veja as mensagens de
erro e procure entendere porque n ao funciona. Soluc ao nos coment arios
de estacionamento01 3.c .
5. Melhore o programa logica08.c incluindo mensagens adequadas de co-
municac ao com usu ario.
6. Escreva todos os coment arios necess arios ` a boa compreens ao do programa
logica08.c.
7. Resolva as seguintes desigualdades, usando programas em c.
(a) 3k + 2 > 100; k Z;
(b) 10 < 3k + 2 < 200; k Z;
(c) 10.5 < 3x + 2 < 20.7; x R;
Soluc ao: logica08 1.c; logica08 2.c; logica08 3.c Para resolver a ultima
desigualdade voce vai precisar de usar real em vez de inteiro como tipo
de dado. Veja o captulo 5 a respeito de tipos de dados.
8. Melhore os programas logica08 X.c escrevendo coment arios e incluindo
os mon ologos de comunicac ao com o usu ario, paradas, limpezas de tela
etc...
9. Melhore os programas logica08 X.c fazendo que saiam deixando a tela
limpa, mas permitindo que o usu ario consiga ler os dados, antes da limpeza
ser efetuada.
10. Altere o programa logica06 63.c para que o sistema saia do ar quando a
opc ao 0 for escolhida, mas usando pare (break), em vez de usar a op c ao
0 no enquanto(). Soluc ao logica06 64.c.
No programa logica08 3.c zemos uso dos atalhos k-=0.01, k+=0.01 que
gcc entende respectivamente como k=k-0.01, k=k+0.01.
Captulo 5
Criando funcoes
Em Matem atica, a express ao
y = f(x)
signica executar sobre o objeto x as operacoes compactadas em f ,
gerando um novo objeto que chamamos y ou f(x).
y e a imagem de x por f.
Resumimos no smbolo f um conjunto de opera c oes
a
.
Em C, o signcado de funcao n ao e exatamente este que temos em Ma-
tem atica, mas se encontra bem pr oximo no sentido de resumir um conjunto
de operacoes com um smbolo. Em computa c ao, como em Matem atica, a de-
ni c ao de fun c oes acrescenta novos vocabulos ` a linguagem, novos comandos,
dizemos em computa c ao.
As func
.
oes s ao algoritmos. Em C, o menor modulo executavel e uma fun c ao
e um programa se constitue de uma fun c ao principal() (main()) que pode
chamar uma lista de outras fun c oes denidas no mesmo arquivo ou em alguma
biblioteca includa no come co do arquivo.
a
por raz oes pr aticas e te oricas, precisamos da fun c ao trivial f(x) = x,
tambem chamada de identidade.
Nos captulos anteriores zemos os nossos primeiros programas, quase todos
com o formato:
programa em portugues programa em ingles
tipo de dados principal() tipo de dados main()
inicio
comando1; comando1;

comandoN; comandoN
m
97
98 CAP

ITULO 5. CRIANDO FUNC



OES
Programas formados de uma unica fun cao. Esta e uma metodologia antiga
e perigosa para escrever programas, porque com ela se desenvolvem programas
longos. Quando um programa for longo, se desenvolvendo por varias p aginas,
com dezenas, centenas ou milhoes de linhas, e difcil de se vericar a sua corre cao.
Deve-se fazer o contrario: escrever programas pequenos que execu-
tem uma unica tarefa de natureza bem simples.

E o que se entende
por programac ao modularizada que se encontra a meio caminho
das tecnicas mais recentes de programa cao, como programac ao
orientada a objeto, POO. No pen ultimo captulo faremos uma
breve apresenta cao desta tecnica.
Em c isto se faz construindo func oes.
Estivemos todo o tempo fazendo observa coes que o prepararam para chegar
ao meio do livro.
Voce esta chegando ao meio do livro.
Neste captulo vamos aprender a modularizar os programas, de forma sis-
tematica, usando o conceito de fun cao. Usaremos como ponto de partida os
diversos exemplos que construimos nos primeiros captulos e os iremos modi-
car. Eles serao assim a ideia motivadora na constru cao das fun coes ao mesmo
tempo que voce vera, de uma forma inteiramente natural, como aparecem as
fun coes que precisamos e, inclusive, ira aprender o metodo inverso de trabalho:
construir primeiro as func oes que realizam as pequenas tarefas que resolvem um
grande problema.
A teoria que necessitamos ja foi praticamente toda desenvolvida nos 4 captulos
anteriores o que nos resta agora e desenvolver tecnicas para construir programas
seguros e interligar pequenos programas num projeto maior.
Ainda faremos mais um aprofundamento teorico nos captulos 6 e 7 que se
encontram na outra metade do lvro, seguidos do estudo de alguns problemas
aplicados.
Mas as tecnicas basicas de programa cao voce as vai adquirir neste captulo
completando a logica do captulo anterior.
A tecnologia que precisamos e surpreendentemente simples:
como construir fun coes.
Vamos mostrar-lhe com um exemplo. Considere o seguinte programa:
99
# include <stdlib.h>
# include <stdio.h> // (1) leitura da biblioteca padrao
inteira principal()

char deposito[80];
inteiro numero;
imprima(Este programa lhe pede um numero maior do que 10 n);
imprima(Testa se o numero eh maior do 10 e o informa n;
imprima(se voce acertou. n);
imprima(Me de um numero maior do que 10);
leia(deposito, tamanho do(deposito), entrada pdr);
converte palavra(deposito, %d, & numero);
se (numero > 10) imprima(Voce acertou o combinado n);
ou entao imprima(Voce errou ! n);
voltar(0);

Ha tres momentos no programa:


Uma mensagem inicial;
uma entrada de dados;
um teste com as respectivas mensagens.
Vamos chamar a mensagem inicial de mensagens() e criar o bloco logico
inteira mensagens()

imprima(Este programa lhe pede um numero maior do que 10 n);


imprima(Testa se o numero eh maior do 10 e o informa n;
imprima(se voce acertou. n);
voltar(0);

Vamos criar outro bloco logico formado pelo teste e suas mensagens sob o
nome: resposta(). Mas agora vamos colocar uma variavel em
resposta(inteiro numero)
inteira resposta(inteiro numero)

se (numero > 10) imprima(Voce acertou o combinado n);


ou entao imprima(Voce errou ! n);
100 CAP

ITULO 5. CRIANDO FUNC



OES
voltar(0);

Agora a fun cao principal se resume a:


# include stdlib.h
# include stdio.h // (1) biblioteca padrao
inteira principal()

char deposito[80];
inteiro numero;
mensagens();
imprima(Me de um numero maior do que 10);
leia(deposito, tamanho do(deposito), entrada pdr);
converte palavra(deposito, %d, & numero);
resposta(numero);
voltar(0);

Ao passar por por mensagens() o programa vai buscar o conte udo desta
fun cao e o executa. Ao passar por resposta(numero) o programa vai buscar
o cont udo de resposta() e o executa com o valor que a vari avel numero tiver
recebido. Dizemos que o valor de numero foi passado para resposta().
Este programa se chama funcao.c, leia-o.
Este e o objetivo deste captulo: fun coes. Vamos repetir o que zemos com
o programa funcao.c mais uma vez e voce vai ser convidado a fazer uma lista
de exerccios em que ira colocar as maos para trabalhar na modulariza cao de
alguns programas.
5.1 Vericador de senhas.
Vamos construir um vericador de senhas, por exemplo, para um
servidor de internet.
Observe que nao estamos estabelendo um plano para montar um
servidor de internet, porque, para montar um servidor de inter-
net, precisa mais do que apenas saber testar senhas... faremos
um pequeno m odulo que sera importante na montagem do grande
projeto.
Infelizmente nao podemos garantir, ainda, que o conte udo deste
captulo possa ser imediatamente aplicado num grande projeto,
num servidor de rede, por exemplo, por favor, aguarde mais um
pouco, pelo menos ate terminar o livro... quando voce sabera
como encontrar o restante.
5.1. VERIFICADOR DE SENHAS. 101
A metodologia sera a mesma que usamos nos captulos anteriores.
Antes de discutir o signcado de fun cao e qual e formato generico de uma
fun cao em c, vamos iniciar um processo de metamorfose do programa inicial,
incita-lo a rodar cada uma das novas formas, analisar os comentarios ilustrativos
e assim conduzindo-o `a constru cao de programas mais completos.
Esta se cao esta baseada no programa funcao01.c
1
e suas transforma c oes:
funcao0X.c.
Exemplo: 6 Testando uma senha.
Veja o programa funcao01.c, compile-o, rode-o
gcc funcao01.c -Wall -oprog
prog
2
e depois o leia, analisando na tela o texto porque lhe faltam as mensagens ex-
plicativas: um defeito do programa que ser a explorado nos exerccios.
Este programa contem a parte central do que seria um m odulo vericador de
senhas de um sistema qualquer, de uma rede de computadores, ou de um termi-
nal banc ario. Obviamente ele ainda est a muito rudimentar e o nosso objetivo
aqui e o de torn a-lo mais sosticado.
Depois que voce tiver compreendido o seu funcionamento, passaremos ` a dis-
cuss ao das versoes melhoradas.
Leia o programa e os coment arios que se encontram no arquivo, chame-o para
uma tela do computador num editor de textos, enquanto voce roda o programa
noutra tela.
5.1.1 Metamorfoses do Leitor de Palavras.
Evolu cao funcao01.c funcao0X.c
Observe nossa mudanca de comportamento, nao colocamos o programa dentro
do texto, porque voce tem os programas em um disco ou pode ir busca-los num
site na internet. Porque nao tem mesmo sentido voce aprender uma linguagem
de programa cao apenas lendo um livro, voce tem que estar sentado na frente do
micro e ai pode abrir o programa noutra janela.
Analisando
funcao01.c
podemos observar que o algoritmo tem tres momentos:
apresenta cao A entrada de dados, quando a senha que vai ser testada e
fornecida.
analise O teste, compara c ao com o valor memorizado na variavel senha.
diagnostico A sada de dados em que e emitida:
mensagem de sucesso,
1
no diret orio do BC, procure func0X.c
2
Veja que trocamos, propositadamente, a ordem dos par ametros passados ao gcc, a ordem
e irrelevante. Talvez voce precise digitar ./prog
102 CAP

ITULO 5. CRIANDO FUNC



OES
ou, alternativamente, a de insucesso.
Quer dizer que o programa poderia ter sido escrito assim:

apresentacao();
analise(sinal);
diagnostico();

em que
apresentacao() e conjunto de mensagens iniciais que orientam o usuario
sobre o objetivo do programa;
analise() representa tudo que se encontra dentro do enquanto() e
diagnostico() e a parte nal.
O planejamento acima transforma o programa num script, um roteiro,
como no teatro, o no cinema, o diretor chama os atores, em ordem para que
cada um execute o seu papel. Aqui e a fun cao main() que vai representar o
trabalho do diretor do espetaculo.
A proxima lista de exerccios vai mostrar-lhe como voce deve transformar
funcao01.c funcao02.c
o programa que nalmente zemos esta ligeiramente diferente do planejamento
acima, sao coisas do planejamento: entre a proposta inicial e a nal sempre existe
uma diferenca, mas deixamos registradas as duas para que voce compreenda que
isto pode acontecer, sem maquilagens.
Voce esta sendo conduzido por tras da cena em vez de car sentado na
plateia.
Exerccios: 23 Construindo func oes
1. Rode e leia o programa funcao01.c. Como voce vericou, faltam men-
sagens. Coloque as mensagens de entrada e sada de dados. Rode o pro-
grama, depois de alterado.
2. Separe a analise de dados da func ao principal em funcao01.c, dentro do
editor de textos corte e cole a linhas de c odigo, depois do fim abrindo uma
nova func ao chamada
inteira analise()
n ao se esquecendo do par inicio,fim ou abrindo e fechando chaves. Com-
pile e rode o programa, se o compilador indicar erros, antes de ler a soluc ao
procure entender as reclamac oes do compilador.
Soluc ao funcao01 1.c
3. Rode o programa funcao01 1.c. Leia o programa para entender como ele
funciona e volte a rodar e ler ate car claro o processamento.
5.1. VERIFICADOR DE SENHAS. 103
4. alarme.c Escreva uma func ao que receba um n umero inteiro e emita duas
possibilidades de mensagem
Se o n umero for menor do que 3 de boas vindas ao usu ario e imprima
o n umero na tela.
Se o n umero for maior ou igual do que 3, de um beep de alarme, uma
mensagem de pesar, e imprima o n umero na tela.
5. Use o programa alarme.c e modique funcao01 1.c.: separe uma func ao
diagonostico(sinal) que faca a an alise do que aconteceu em func ao do
n umero de tentativas para entrar no sistema.
Soluc ao funcao01 2.c
6. Melhore a sada de dados de funcao01 2.c com algumas trocas de linha
e espacos entre os dados.
7. O programa funcao01 2.c oferece ao usu ario apenas duas possibilidades
para errar, apesar de anunciar que tres possibilidades cam garantidas,
n ao tem uma terceira possibilidade. Corrija isto dando-lhe tres possibili-
dades de erro.
8. Acrescente mensagens no programa funcao01 2.c informando ao usu ario
que ele ter a ate 3 possibilidades para fornecer a senha e que esta e secreta
e est a gravada no programa (voce pode escrever uma mentirazianha, dizer
que a senha est a em um arquivo secreto...)
9. Acrescente mensagens no programa funcao01 2.c informando ao usu ario
que, ap os errar tres vezes, o sistema s o lhe dar a possibilidade de novas
tentativas depois de uma hora. Mas n ao vamos implementar este aspecto
agora...
Soluc ao: funcao02.c
10. Rode o programa funcao02.c e veja como funciona. Depois leia o pro-
grama. Repita este processo ate entender o programa completamente.
11. Melhore o programa funcao02.c, suas mensagens, lay-out, etc...
12. Dena duas func oes: sucesso(), insucesso() que imprimam as men-
sagens acima de sucesso ou insucesso. Teste estas func oes isoladamente
como descrevemos acima, depois inclua as func oes em ambiente.h. Altere
funcao02.c para fazer uso das duas func oes criadas agora.
N ao se esqueca de incluir a linha
# include ambiente.h
13. Generalize, (aumente o grau de abstrac ao) das func oes sucesso(), insucesso()
deixando que elas recebam uma mensagem auxiliar indicando que tipo de
sucesso ou insucesso ocorreu.
Soluc ao em ambiente.h.
104 CAP

ITULO 5. CRIANDO FUNC



OES
Observa cao: 22 Como construir func oes
As func oes que foram objeto dos exerccios anteriores, foram testadas antes
de produzirmos o programa funcao02.c que e a modularizac ao de funcao01.c.
Leia os coment arios em funcao02.c em que explicamos tecnicamente
como se faz esta modularizac ao. Aqui, mais abaixo, vamos retomar esta dis-
cuss ao em termos mais genericos e menos tecnica. Leia tambem os co-
ment arios contidos nos m odulos de teste, funcao021.c, funcao022.c
O metodo
Tudo que zemos foi copiar e colar o conte udo dos programas primitivo co-
locando este conte udo sob tres etiquetas
apresentacao(), leitora(), diagnostico().
Este e o uso mais imediato das fun coes na linguagem c.
Vantagens?
Observe que sim e quais:
1. trabalho limpo Primeiro uma vantagem psicol ogica: O programa tem uma
func ao principal() que e um resumo limpo do trabalho.
2. favorece metologias distintas A subdivis ao em m odulos n ao e unica. Dois
programadores diferentes encontrariam certamente duas formas distintas
de denir os m odulos.
3. criar m oduloes reutiliz aveis Neste caso temos um problema muito simples
e forcamos a divis ao em tres m odulos.
Se bem aproveitado, este metodo deve criar pequenos m oduloes reutiliz aveis
em outros programas. . Reciclagem de programas.
4. Facilita a vericac ao dos programas A func ao diagonostico() contem um
se() e geralmente e bom fazer um m odulo separado para testar o se(),
vericar se seu comportamento e o esperado. As duas outras func oes po-
diam formam um unico m odulo, mas as dividimos em dois para ilustrar
melhor o metodo.
5. main() e o planejamento do trabalho Voce est a diante de um planeja-
mento vazio... programamos
A func ao principal() e uma especie de listagem de operac oes. Na
pr atica as operac oes mesmo, ser ao construidas depois. Em outras pa-
lavras, a func ao principal() pode funcionar como um planejamento do
trabalho, em que apenas descrevemos suas etapas, func oes.
6. teste de pequenos programas Cada uma dessas etapas pode ser testada se-
paradamente, e veja como:
5.1. VERIFICADOR DE SENHAS. 105
Escrevemos leitora(), em um arquivo separado, ver
funcao021.c
e lhe demos o nome de principal(), porque seria a unica func ao
do programa funcao021.c. Compilamos e rodamos e pudemos ver
os erros que sempre se cometem. Corrigidos os erros, o m odulo
leitora() cou pronto.
criac ao de bibliotecas Escrevemos diagnostico() em outro arquivo
separado, ver
funcao022.c .
Neste caso precisamos de uma outra func ao principal() para pas-
sar o valor da vari avel resultado que a func ao diagnostico()
analisaria para decidir qual frase seria emitida:
sucesso ou insucesso.
programas, o embelezamento N ao testamos o primeiro m odulo porque
era uma simples lista de imprima()s, mas o certo seria tambem
faze-lo porque poderia haver algum erro de formatac ao de dados, ou,
mais importante, poderiamos ter testado a beleza, a estetica das
mensagens. Depois que um programa est a funcionando podemos in-
cluir nele alguma arte, tendo cuidado para n ao criar polui c ao visual.
Os exerccios abaixo exploram esta tecnica. Rode os m odulos de teste,
tambem, para ver o efeito que eles tem.
Observa cao: 23 Pequenos programas que facam pouca coisa.
Esta e a tecnica onde o uso de func oes entra,
funcao01 1.c, funcao02.c
rodaram da mesma forma como funcao01.c, porem visualmente mais limpas e
todas suas partes podem ser vistas na tela, logo, f aceis para corrigir.
Esta experiencia deve lev a-lo a concluir que e vital a programac ao mo-
dularizada. Tambem deve convence-lo da import ancia de escrever pequenas
func oes que possam ser reutilizadas facilmente, como as func oes sucesso(),
insucesso(), apeteco() , denidas na biblioteca ambiente.h
A func ao leitora() mostra bem o que j a comentamos anteriormente. Divi-
dimos um problema em pequenas tarefas, cada tarefa executada por uma func ao
especca. A func ao leitora() pode ser utilizada em muitos contextos, e voce
vai ver isto acontecer aqui. Claro, n ao precisa ser como se encontra acima, com
alguma pequena modicac ao, por exemplo nas mensagens, (e ate isto pode ser
generalizado...)
3
, em vez de
Leitura de senha com sucesso.
poderiamos ter usado apenas
Sucesso.
3
esta generaliza c ao e o que se chama de abstracao, quer dizer tornar uma fun c ao menos
particular para que possa ser melhor reutilizada
106 CAP

ITULO 5. CRIANDO FUNC



OES
que no presente contexto signica sucesso de leitura da senha mas em outra
contexto signicaria outro tipo de sucesso. Ver o programa sucesso.c.
Observa cao: 24 Programas reutilizaveis
Esta e uma ideia central da programacao, fazer programas simples, tao simples, que
possam ser reutilizados em muitas circunstancias.
Alem do mais, um programa simples e pequeno e difcil de ter erros, e se tiver, e facil de
detecta-los.
Se um programa for pequeno e executar uma tarefa bem generica, os membros do grupo
de trabalho podem encontrar o que fazer com ele, isto e a chave do trabalho em grupo.
Onde escrevemos programa leia funcao...
Observa cao: 25 Roteiros e o teatro computacional.
Programar hoje se aproxima muito de tornar vivo um cen ario.
Primeiro construimos func oes;
quando voce avancar mais em computac ao ver a que em computac ao tudo
gira em torno de objetos e dos metodos que processam os dados denidos
por estes objetos. Veja o pen ultimo captulo.
As func oes, e mais do que elas os objetos, contem as informa c oes sobre
um pequeno modelo computacional.
Finalmente escrevemos a func ao principal, que e o roteiro, no mesmo
sentido que se usa em teatro, que chama os gurantes,
as outras func~oes,
fazendo rolar a cena,
rodar o programa ...
Muitas vezes escrevemos primeiro a func ao principal() que ent ao tem
o duplo papel, de planejamento do trabalho e de script ao nal.

E o que voce est a vendo no vericador de senhas, funcao02.c, construimos


as func oes que executam cada um dos pedacos isoladamente, depois a func ao
principal contem o script que executa o programa.

E assim que se programa
bem.
A express ao linguagens de roteiros
4
se refere ` as linguagens relativamente
recentes, e bem mais evoluidas, um exemplo e Python, outro Perl, mas em
qualquer linguagem moderna se pode programar da mesma forma. C++ e
um exemplo de linguagem em que se pode programar assim, esta ultima e uma
evoluc ao do C.
Exerccios: 24 Melhorando o leitor de senhas
1. Visite a nossa biblioteca ambiente.h, estude as func oes al denidas. In-
clua apeteco2(), apetecof() no leitor de senhas.
4
em ingles, script languages.
5.1. VERIFICADOR DE SENHAS. 107
2. Para limpar a tela antes do programa comecar, faca uso de
limpa janela().
Use esta func ao, junto com apetecof() para limpar a tela quando o pro-
grama terminar.
3. Altere a func ao mask() para que ela apresente os seus programas, (denida
em ambiente.h).
No espirito com que nos propusemos a escrever este captulo, baseado em
exemplos, vamos agora construir mais outro exemplo. Vamos usar uma outra
tecnica de trabalho que vai ser desenvolvida ao vivo, (porque voce dever a estar
rodando os programas).
5.1.2 Sistema de contabilidade geral
metamorfose de contabilidade.c
No prefacio deixamos a pergunta sobre uma tecnica de programar bem, com
uma resposta evasiva. Aqui voce vai encontrar uma pequena concretiza c ao do
metodo.
Mas, programar e uma arte... e voce, que esta lendo este livro, pretende ser
um artista.

E difcil o ensino das artes pelos aspectos subjetivos que elas envolvem. O
fato de que programar seja uma arte nao impede que tenha aspectos tecnicos e
e preciso desmiticar as artes, tambem. Podemos mostrar a nossa arte, e voce
desenvolver a sua. A grande regra e, seja independente e etico.
Obviamente, nao espere encontrar aqui o programa denitivo para gerenciar
a contabilidade geral nem mesmo de uma pequena empresa. Aqui voce vai en-
contrar um pequeno exemplo que pode ser o ponto de partida para o sistema
de contabilidade geral que voce ainda vai construir. Nao se esque ca que
nao somos contadores, portanto, apesar de que tenhamos recebido instru c oes
de um contador sobre este programa, a constru cao denitiva de um programa
nesta area tem que ser supervisionado por um prossional da mesma. Os pro-
gramadores resolvem problemas acompanhados e supervisionados por pessoal
especializado nas areas de interesse dos programas.
Vamos produzir as fun coes que completem, pelo menos parcialmente, o pro-
grama logica06.c, como prometemos anteriormente.
Primeiro vamos fazer o que devemos: criar um outro arquivo com o nome,
contabil.c, deixando intacto logica06.c porque aquele tem uma fun c ao es-
pecca para o trabalho do livro e nao deve ser mexido, apesar de dizermos no
ttulo que faremos as metamorfoses dele, vamos deixa-lo em sua forma original.
Exemplo: 7 Reciclagem de programas
A reciclagem de programas economisa tempo de digitac ao e oferece mais
seguranca e robustez aos sistemas. Um programa que esteja funcionando bem
deve ser re-utilizado (reciclado).
Para evitar de perder tempo, adquira algumas tecnicas:
108 CAP

ITULO 5. CRIANDO FUNC



OES
1. S o recicle programas que estejam funcionando bem.
2. Copie um programa que esteja funcionando bem para outro arquivo. Mo-
dique o novo e n ao mexa no velho.
3. Todo programa deve ter um cabecalho que identique o que o programa faz,
quem o fez, etc... inclusive as diculdades falhas e melhoras desejadas.
4. Ao reciclar mude o nome do programa internamente no cabecalho, isto
pode ser crucial quando voce zer buscas para encontrar o programa certo,
que voce precisa, para reciclar.
Esta maneira de agir deve ser uma regra de trabalho relativamente aos arquivos
que voce recebeu em disco com a observac ao de que os pode passar em frente
desde que nao os altere, a raz ao e esta descrita aqui. Se voce alterar algum
programa, deve trocar-lhe o nome, ate mesmo porque voce n ao vai querer que
ganhemos a fama pelo que voce zer, vai? Entretanto, n os queremos ter o
respeito pelo nosso trabalho.
Como guardar o que esta feito e iniciar uma altera cao ?
Em LinuX:
cp logica06.c contabil.c,
ou, usando algum gerenciador de arquivos de sua preferencia, fa ca a copia de
logica06 para o novo arquivo contabil.c.
Isto ja deve estar feito no disco que voce adquiriu com o livro, use outro nome
diferente de contabilidade.c para nao perder as modica coes que ja zemos
neste ultimo programa, por exemplo, contabil.c que tambem se encontra no
disco.
Observa cao: 26 Delineando o metodo de trabalho
Seguindo os princpios da Contabilidade, h a dois arquivos diferentes que
devemos criar e manipular, deve, haver e os contadores tem suas esqui-
sitices tecnicas, tudo que se paga, esta em haver e tudo que se recebe
ca em deve, vamos seguir estes princpios.
Vamos criar a func ao deve(), ou melhor, o prot otipo da func ao
5
deve(),
no arquivo deve.c.
A func ao principal() far a o seu papel de controladora de deve(), e
depois de testada e aprovada, ser a transferida para biblioteca
contabilidade.h
para ser chamada pelo programa contabil.c.
Todas as func oes que iremos aqui construir, ser ao transferidas para
contabilidade.h,
a nossa biblioteca de contabilidade geral, depois de serem testadas indivi-
dualmente e estiverem funcionando a contento.
5
a palavra prototipo e usada com um signicado especial, discutiremos isto no pr oximo
par agrafo
5.2. M

AQUINA DE CALCULAR. 109


5.1.3 Como registrar dinheiro
Vamos criar deve.c, leia o arquivo no disco. Este arquivo e semelhante ao
prog20 3.c e se quiser seguir a evolu cao do acesso ao disco, veja os programas
prog20 x.c e leia no captulo 7, mais aprofundadamente, as regras para acesso
a arquivos em disco. Aqui nos vamos limitar aos comentarios que se encon-
tram dentro dos programas para nao desviar a aten cao do assunto principal, as
fun coes.
Exerccios: 25 Alterando o arquivo deve.c
Leia o arquivo deve.c
1. Identique o local em se d a a leitura de dados da raz ao social de quem paga,
e elimine a vari avel intermedi aria deposito, use diretamente nome.
Soluc ao deve02.c
2. Leia o arquivo deve.dat onde os dados est ao sendo gravados. Altera
o registro no arquivo para que os dados quem separados por uma linha.
Soluc ao deve02.c
3. Torne possvel que o nome do arquivo seja lido pelo teclado. Soluc ao com
erro em deve03.c, ver deve04.c.
4. Substitua a vers ao do deve.c na biblioteca contabilidade.h e rode o
programa contabil.c
gcc -Wall -oprog contabil.c
o programa agora roda um pouco melhor do que antes.
5.2 Maquina de calcular.
Nesta se c ao vamos fazer algumas fun c oes que efetuam c alculos e passam os dados para outras
fun c oes.
Vamos criar uma biblioteca maquina.h deixando-a pronta para ser includa em uma interface
gr aca, (que n ao ser a feita aqui) mas inteiramente funcional para ser usada no modo texto.
5.2.1 O menu de opcoes
A seguinte lista de exerccios vai conduz-lo a constru cao do planejamento inicial
do trabalho.
Exerccios: 26 Planejamento da calculadora
1. Em LinuX execute
grep menu *.c | more
e voce vai ter uma listagem na tela de todos os programas contenham a
palavra menu. A mesma ferramenta existe tambem no Windows... ela
se chama
localizar
110 CAP

ITULO 5. CRIANDO FUNC



OES
Selecione um deles para iniciar o programa calculadora.c.
Soluc ao calculadora01 1.c. Outra soluc ao calculadora01.c
Observe que n ao vamos comecar com calculadora.c mas sim com calculadora01.c.
2. Tanto calculadora01.c, calculadora01 1.c tem um defeito estetico:
primeiro permitem a leitura dos n umeros, depois oferecem as opc oes do
sistema, icluindo parar. Corrija isto.
Soluc ao calculadora02.c
3. calculadora01 1.c representa uma outra linha de programa c ao. Analise
a diferenca com calculadora01.c. O uso de getchar() oferece riscos
e sugiro que voce evite esta func ao ate que sua pr atica aumente. Vamos
seguir com o metodo de calculadora01.c.
4. calculadora03.c termina o planejamento, mas est a funcionando muito
mal, est a muito poluida, visualmente, rode, analise, e corrija.
Soluc ao calculadora.c
5. Melhore o menu de opc oes em calculadora.c, se inspire em 162.c in-
clusive usando um unico printf que torne o programa mais legvel.
Parte II
Aprofundando os
conhecimentos
111
113
Voce deve ter visitado a maioria dos captulos desta segunda parte por su-
gestao feitas no texto anterior.
Todos os captulos desta segunda parte foram escritos como complemento ao
texto inicial. Rigorosamente falando, ao terminar a primeira parte, se voce tiver
feito todos os exerccios, analisados todos os programas sugeridos, o volume de
trabalho feito foi grande e voce ja sabe programar em c.
Se voce tiver feito isto, parabens. Certamente, para voce, a leitura dos
captulos desta segunda parte devem ser uma segunda leitura. Leia agora com
cuidado procurando compreender todos os detalhes. O objetivo, agora, e con-
duz-lo `a constru cao de bibliotecas, domnio de tecnicas mais avan cadas da lin-
guagem e prepara-lo para a produzir sistemas de maior porte. Voce encontrara
aqui varios esbo cos de sistemas, inacabados, mas voce devera conseguir terminar
aqueles que se sintonizarem com seus interesses.
Uma regra importante para aprender qualquer coisa, inclusive programar,
se dedique a um problema para o qual voce esteja motivado. Se
voce for professor, que tal usar a linguagem para construir um sistema de
controle academico para os seus cursos ?
se voce tem uma grande cole cao de m usicas, de lmes, de livros, que tal
construir um sistema de controle da sua colec ao ?
se algum parente ou amigo tem um comercio, que tal fazer o sistema de
contabilidade e estoques deste comercio ?
Voe ira encontrar dicas para qualquer um desses projetos entre os exerccios
ou programas que lhe apresentaremos. Escolha um objetivo e se concentre nele.
Use o livro para ir em busca do que voce precisar para produzir o seu projeto.
Voce vai encontrar aqui pelo menos as indica coes de onde encontrar o que voce
podera precisar para atingir o seu objetivo.
De agora em diante ignore a frase comum estes captulos foram pensados
para uma primeira leitura. Esta frase valia apenas enquanto voce se encontrava
ainda lendo a primeira parte...
Se voce quiser continuar usando os comandos em Portugues voce sabe como
fazer: usar e expandir o arquivo traducao.h e seguir programando em Por-
tugues.
Nos o encorajariamos a faze-lo, e a forma mnima, mais elementar de apren-
der a escrever outra linguagem de programa cao... e e tentando modicar que se
pode aprender a fazer coisas novas. Entretanto este e um livro sobre a lingua-
gem c e nao seria correto insistir nos programas em Portugues e manter este
ttulo para o livro. Mas voce pode tomar o rumo que quiser, e deve.
O objetivo do livro nesta segunda parte e discutir com mais profundidade as
estruturas de dados, as estruturas de controle de uxo, e estudar algumas das
bibliotecas padrao do c, enm, deixa-lo em condi cao de mergulhar na linguagem
em profundidade ou escolher outra linguagem mais propcia para o seu trabalho
porque voce ja deve ser um programador.
114
Voce esta entrando na segunda metade do livro.
Como obter informa coes.
Em LinuX existe um sistema de manuais que podem ser acessados de diversas
maneiras. Uma delas consiste em digitar info. A primeira vez que voce for usar
este sistema, digite
info info
para ter ler algumas informa coes iniciais de como funciona este sistema. Depois
apanhe um pouco ate descobrir a imensidao de informa coes que ele guarda. N ao
desisita ante as primeiras diculdades.
Voce sai do info digitando q e percorre suas pagina apertanto a barra de
espa cos. Pode ser a seta para baixo ou para cima ou Page up Page down.
Outro metodo que se considera em extin cao e
man
Este segundo sistema e um tradicional sistema de informa coes de maquinas
Unix que o info deve susbstituir aos poucos em LinuX.
Digitando man man voce vai poder ler algumas paginas sobre este sistema de
informa coes.
Voce sai do man digitando q e percorre suas pagina apertanto a barra de
espa cos, como no info.
Digitando
man gcc ; info gcc
voce vai poder ler uma serie de paginas com inorma cao tecnica sobre o compi-
lador gcc.
Digitando
info glib
voce vai poder ler as paginas sobre o sistema de bibliotecas do gcc.
Se voce aprender a usar emacs voce estara dentro de um poderoso editor
de textos, (entre outras coisas) e nele podera escolher, com o mouse, a op c ao
Info que ira colocar na tela as op coes do sistema de informa coes (manuais,
tutoriais etc...). O comando m abre um dialogo no pe da p agina onde voce
pode digitar Libc e a voce se encontra no manual de referencia do gcc.
ver info no ndice remissivo ao nal do livro
Outra forma de buscar informa coes, em LinuX, consiste em digitar info
nome palavra. Por exemplo info scanfira chamar a pagina do Manual do
LinuX em que voce podera ler a sintaxe de uso do scanf(). ver info no
ndice remissivo ao nal do livro
O ndice remissivo alfabetico
115
Este livro tem um ndice remissivo alfabetico que consideramos uma das
partes mais importantes do texto. Ele se propoe a fornecer informa coes e atalhos
para que voce consiga rapidamente elaborar um pequeno programa. Uma outra
fun cao que ele deve ter e a de permitir que voce recupere uma informa cao que
cou vaga. Inclusive o ndice aponta para outras fontes de consulta. O trabalho
na constru cao de umndice remissivo e quase o mesmo de escrever um livro, nos
justicamos assim, se ele nao conseguir atender `as suas expectativas em toda
sua extensao, mas neste caso reclame, bata duro nos autores, e claro, traga suas
sugestoes tambem, elas serao sempre benvindas para a proxima edi cao.
Procure no ndice remissivo informa caopara ver onde pode procurar mais
informa coes.
116
Captulo 6
Variavel global e local
As linguagens modernas de programa c ao
a
tem um conceito especial de variavel local que
se op oe ao conceito de variavel global.
Os exemplos v ao lhe deixar claro o que signicam estes conceitos, e vamos partir da an alise
de exemplos para construir o conceito.
As primeiras sec c oes fazem an alise do assunto e levantam a poeira, na ultima xamos os
detalhes, mas sugerimos que a ultima seja lida numa segunda leitura.
a
Deni c ao de moderno? e aquilo que usamos e atualizamos hoje...
6.1 Variavel global e local
Sem tentar denir logo no incio, deixe-nos apenas dizer que antes todas as
variaveis eram globais, quer dizer, podiam ser vistas, (pior, poderiam exercer
inuencia) em qualquer parte do programa.
Com a modulariza cao, as variaveis podem agora pertencer ao interior de um
modulo de programa cao, e c joga forte com este conceito:
Quando voce abrir um par de chaves, criou um modulo e, pode,
no come co deste novo bloco logico, criar variaveis que serao des-
truidas fora das chaves, (quando este bloco logico estiver fora de
uso).
Nao se trata apenas de existencia e destruic ao, que sao as ideias centrais
da frase anterior. Claro isto faz parte do proprio conceito de variavel local. Se
trata de um mecanismo para evitar que dados quem sem controle dentro de
um sistema.
Esta localiza cao protege o programa contra a existencia de variaveis que
quem zanzando, quais zumbis, perdidas dentro do programa...
Em suma, mesmo antes de entrarmos no assunto, e preciso convence-lo de que
as variaveis globais podem representar riscos muito grandes e devem ser evitadas
117
118 CAP

ITULO 6. VARI

AVEL GLOBAL E LOCAL


a todo custo. Ja dissemos antes, estamos repetindo, quando voce precisar denir
uma variavel global, deixe um comentario a respeito no cabe calho do programa
e ao lado da deni cao da variavel
int numero; // variavel global !!!
que lhe sirva de alerta para que, se possvel, alterar o status de variavel global.
A gura (g. 6.1), pagina 118 mostra a rela cao entre uma vari avel local,
uma vari avel global denidas em um modulo e um subm odulo do programa.
int numero=2;
int numero=20;
int numero=30;
Aqui numero
vale 2
Aqui numero
vale 20
Figura 6.1: Vari avel global e vari avel local.
Na gura (g. 6.1) voce pode identicar tres regioes,
O ambiente do programa todo, designado como externo;
um modulo;
um submodulo.
O modulo interno e chamado pelo externo, esta e uma situa cao comum, e
pode ser uma unica linha de programa, um loop, por exemplo.
Ha diversos fatos que podemos salientar com respeito `a variavel numero:
numero no bloco interno, nada tem o que ver com numero no bloco inter-
mediario. As duas podem ate ter tipos diferentes, o que nao seria nada
aconselhavel, neste caso deveriam ter identicadores diferentes.
O valor que numero tem no bloco intermediario, consequentemente, e di-
ferente do que a outra tem no bloco interno.
6.1. VARI

AVEL GLOBAL E LOCAL 119


Ha razoes fortes para que voce tenha variaveis tao distintas, mas com o
mesmo nome. Se voce estiver calculando uma soma, gostara, certamente
de chamar sempre a variavel que acumula os valores de soma.


E preciso ser cuidadoso com esta facilidade para nao pecar contra a legi-
bilidade do programa, a sua compreensao. Comentarios sempre ajudam.
Suxos permitem que voce use o nome adequado adaptado ao modulo em
que estiver a variavel, por exemplo soma interna, soma externa.
Resumindo, voce pode fazer o que a gura (g. 6.1) sugere, mas nao deve.
Inclusive o compilador ira advert-lo dizendo que o valor de numero ensobreia
1
o valor de numero, quando analisar o sub-modulo. Embora as tres variaveis
numero sejam tres variaveis diferentes, evite de fazer isto. Use
numero1, numero2, numero3
ou mesmo nomes mais sugestivos
numero de fora, numero do meio, numero de dentro
nunca esquecendo que a regra e que o programa que legvel. Se numero re-
presenta a quantidade de graos de feijao que o programa esta contabilizando,
porque nao chamar esta variavel de
numero grao feijao ?
Veja o seguinte exemplo que podemos etiquetar como grotesco, leia e rode o
programa grotesco.c.
O programa grotesco.c ilustra inclusive os riscos que fazem da linguagem
c um ambiente de programa cao delicioso...
Rode o programa grotesco.c e depois o leia. Fa ca isto diversas vezes ate
que que claro o signicado de variavel local e global.
Exerccios: 27 Tres vari aveis com o mesmo nome
Considere o programa, no disco, chamado global 01.c. Ele mostra como
se pode usar de forma abusiva a denic ao de vari aveis locais que e um
fato positivo nas linguagens modernas, mas que pode se voltar contra o
programador.
1. Leia global 01.c e justique os coment arios (41), (42), (43)
2. Altere a vari avel, escolha os nomes, de modo que o programa saia do loop.
O exemplo, no exerccio anterior e uma representa cao perfeita da gura (g.
6.1) em que uma variavel designada pelo nome numero existe em tres ambientes
distintos.
Neste exemplo temos tres ambientes dentro do macro ambiente representado
pelo programa, quero me referir ao arquivo onde esta esta fun cao e o cabe calho
do programa. Veja global 01.c, a variavel numero esta denida em tres ambi-
entes. Rigorosamente falando o singular esta errado, sao tres variaveis, denidas
em tres espacos de nomes, com endere cos diferentes na memoria.
1
shadows
120 CAP

ITULO 6. VARI

AVEL GLOBAL E LOCAL


Dentro do while() a variavel tem um valor que se encontra em permanente
altera cao e nada tem o que ver com a variavel que controla o la co.
Consequentemente este programa nao para nunca a nao ser com Ctrl-C. Rode
e veja os valores se alterando dentro do la co.
Observe outro fato, no bloco interno a variavel numero nao foi incializada e
o compilador lhe atribui um valor sobre o qual o programador nao tem controle.
Exerccios: 28 Vari avel global e local
1. Modique o programa global 01.c para que ele pare sozinho, acrecen-
tando uma vari avel contador para controlar o while().
2. Altere global 02.c para que voce possa ver as mensagens fora do laco e
vericar assim que as vari aveis numero s ao diferentes. Soluc ao global 03.c
3. Por que o 9 e impresso seguidamente por global 03.c ?
6.1.1 Comentarios sobre os exerccios
Em global 01.c, no nicio do ambiente interno, denimos a variavel local nu-
mero, que se encontra representada pelo mesmo nome que a vari avel global
denida no ambiente externo.
Para c se tratam de duas variaveis diferentes. Quando o compilador inicia
o processamento do ambiente interno, cria um novo espa co de nomes onde
registra a nova variavel numero que acontece ser designada pelo mesmo nome
que a variavel denida anteriormente.
Ate este momento nenhum problema. A coisa ate pode ser assim mesmo.
Podemos e ate devemos usar o mesmo nome para variaveis que venham a ter a
mesma fun cao em um modulo interno de um programa. Isto pode tornar as coi-
sas menos claras, mas tem suas razoes, e um comentario resolve este problema.
Esta e uma elipse da arte de programar.
Mas nao podemos considerar esta maneira de fazer como um metodo de
bem programar. A maneira de programar bem sugere que no bloco interno se
acrescente um suxo ao identicador da variavel.
Muito melhor do que esta confusao provocada com o uso do mesmo identica-
dor, seria usar uma pequena variante do nome:
numero, numero local, numeroL
por exemplo. Com a nova variante ca facil de identicar quem faz o que
e se guarda o espirito do nome: soma, numero, contador. Uma variavel que
deve contar, tem que ser chamada de contador, mas uma vari avel local que
for contar pode ser chamada de contador local.
Anal, as mesmas facilidades que temos nos permitem
construir um n umero grande de variaveis;
6.1. VARI

AVEL GLOBAL E LOCAL 121


com nomes parecidos, mas indicadores da funcionalidade da variavel;
diferenciados por suxos que indiquem em espa co de nomes as variaveis
tem seus endere cos.
O objetivo aqui, entretanto, e discutir o conceito de vari avel local em oposi cao
`a variavel global.
O exemplo, embora grotesco, ilustra o fato. Ao entrar em um bloco interno,
c permite que novas variaveis sejam criadas. As variaveis criadas em um bloco
interno sao locais, como dissemos acima, novo espa co de nomes e criado e nova
referencia e assim feita entre estas variaveis e seus valores.
Assim que o programa abandona o bloco, as variaveis al criadas sao des-
truidas. Deixam de existir.
Referencias a nomes iguais, como no programa acima, vao ter valores dife-
rentes dentro do bloco logico, onde vale o valor local, ou fora do bloco logico
onde vale o valor global.

E o que voce pode ver ao rodar global 01.c.
Quando voce abrir uma chave, num programa em c, uma novo espa co de
nomes sera criado. Para denir novas variaveis neste bloco, isto tem que aconte-
cer logo no nicio do bloco, antes de qualquer comando do bloco. Outro local e
ilegal e produzira algum tipo de erro, (nem sempre o mesmo), inclusive gcc n ao
lhe vai alertar que as variaveis foram denidas em local errado, ele simplesmente
vai se perder apresentando outros tipos de erro.
Alias, adquira um habito. Sempre que for
abrir uma nova chave, se pergunte se nao de-
veria denir uma nova fun cao...
Claro, o conceito global e relativo.
Imagine tres blocos de programa, um inserido no seguinte. A gura (g.
6.2) pagina 122, mostra isto.
Variaveis denidas no bloco medio serao globais relativamente ao bloco
mais interno,
e locais relativamente ao bloco mais externo.
Ainda tomando como referencia a gura (g. 6.2), uma variavel denida
no bloco logico A e visvel nos blocos logicos B,C,D a n ao ser que haja outra
vari avel com mesmo nome em alguma destas regioes interiores. Se houver uma
variavel com o mesmo nome, denida num bloco interno, os valores desta nova
vari avel vao se sobrepor ao da variavel externa, dentro do bloco.
122 CAP

ITULO 6. VARI

AVEL GLOBAL E LOCAL


A
B
D
C
int numero=2;
int numero=20;
int numero=30;
int numero=300;
Figura 6.2: Vari avel global e local
Sublinhando a ultima frase. Uma variavel numero denida em A sera so-
breposta por outra, de nome numero denida em B. O programa global 02.c
ilustra isto muito bem.
Uma variavel denida na bloco logico D nao existe nos blocos logicos A,B,C.
Ela sera destruida quando o programa sair do bloco D.
Um exemplo desta situa cao pode ser vista no programa global 04.c. Rode
o programa, e o leia para vericar que confere.
A situa cao descrita no exemplo acima, de variaveis com exatamente o mesmo
nome, em modulos encaixados, deve ser evitada. Nao conseguimos imaginar
nenhuma situa cao interessante em que este exemplo possa ser usado, sem riscos.
A unica utilidade deste exemplo, e voce deve rodar programa global 01.c
para ver o que acontece, e alerta-lo para nao fazer esta bobagem.
Mas importante do que discutir o exemplo, e compreender a importancia do
conceito e da metodologia que ele encerra. Vejamos algumas consequ ncias que
podemos deduzir do experimento feito acima.
As variaveis locais tem vida limitada, relativamente curta, produzem, por-
tanto, economia de processamento, importante em grandes programas;
as variaveis locais tendo vida local, permitem um controle mais efetivo
dos seus valores, sabemos exatamente em que modulo, programa, elas se
encontram, (ou pelo menos poderemos saber...).
uma grave confusao pode se originar de variaveis locais com nomes identicos
aos de variaveis globais.
O uso de suxos local ou L nos nomes das variaveis, tornam os nomes
diferentes, guardando o sentido que estes nomes tiverem.
6.2. T

ECNICAS COM O USO DE VARI

AVEIS LOCAIS 123


Se evitarmos a identidade de nomes entre variaveis locais e globais, podemos
concluir que o uso deste tipo de variavel e recomendado. Devemos tomar como
metodologia, sempre que for possvel adotar variaveis locais e evitar o uso de
variaveis globais.
Exerccios: 29 1. Faca um diagrama, como na gura (g. 6.1) para repre-
sentar o programas dos exerccios.
2. Chamamos nvel de profundidade de um programa, ao n umero inteiro que
meca a maior quantidade blocos encaixados num programa. A gura (g.
6.1) mostra um programa cujo nvel de profundidade e dois. C alcule o
nvel de profundidade dos programas dos exerccios.
3. Calcule o nvel de profundidade dos programas prog*.c que voce deve ter
em disco, (se n ao tiver, solicite pelo endereco tarcisio@e-math.ams.org).
O nvel de profundidade e uma medida para analisar a complexidade de
programas.
6.2 Tecnicas com o uso de variaveis locais
Na introdu cao, que por sinal estaria no momento oportuno para ser lida, insis-
timos numa tecnica de bem programar. A seguinte frase pertence a um outro
autor e e repetida, com nuances diferentes, em todo livro de programa cao: e
t ao difcil corrigir-se um programa ruim, que e melhor voltar a aprender a pro-
gramar e fazer outro programa.
Nao ha nada mais verdadeiro, apenas e preciso nao cair no mau habito de
sempre querer estar fazendo tudo de novo.

E preciso aprender as fazer coisas
corretamente, desde o princpio, em particular na arte de programar computa-
dores
2
.
Programar e uma arte, inserida na Ciencia dos Computadores. Um dos
parametros para medir se um programa e bom, indiscutivelmente e a beleza.
Observe que nao nos rerimos ao resultado do programa na tela, e isto tambem
e importante. O codigo do programa deve
ser bonito;
deve ser facil de ler;
deve ser escrito de tal forma que outras pessoas o consigam entender e
possam altera-lo com facilidade.
deve ser escrito de tal forma que possa ser reciclado.
O contrario desta lista de caractersticas seria um programa que somente
o autor consiga ler. O resultado, necessariamente, sera um codigo que nem o
autor conseguira ler algumas semanas depois.
2
ttulo de um livro de Donald Knutt
124 CAP

ITULO 6. VARI

AVEL GLOBAL E LOCAL


Como dissemos acima, na companhia de um autor renomado, programar
computadores e uma arte, e consequentemente e difcil ensinar esta arte a ou-
tras pessoas. Como arte, e uma questao pessoal, no sentido de que duas pessoas
que resolvam o mesmo problema, computacionalmente, quase com certeza, vao
escrever codigos distintos. Quase com certeza, tambem, os programas vao coin-
cidir nos aspectos fundamentais.
Voce vai ter que desenvolver sua propria arte em programa cao como cada
programador desenvolveu a sua. Isto nao nos impede, e muito pelo contrario, e
necessario, lermos os programas feitos por outros programadores para com eles
dominar os detalhes iniciais e os avan cados.
Quando ainda nao soubermos, temos que acompanhar os mestres;
quando ja formos mestres, temos que car atentos nas diculdades dos
discpulos para manter acesa a capacidade de crtica de nossos proprios
metodos.
A arrogancia, sem d uvida, e um indcio de corrup cao! e tome a palavra
corrupc ao no sentido que voce quiser. Funciona!
Ao nal desta se cao, vamos transformar um programa extenso em modulos
mostrando-lhe como eliminar as variaveis globais.
Vejamos um exemplo de programa que executa um item de um menu. O
programa esta incompleto, falta a implemta cao das fun coes
executa item do menu(inteiro item), apresentacao().
Abaixo vamos transforma-lo eliminando a variavel global.
Exemplo: 8 Programa com um unica vari avel global
1) tipo principal()
2)
3) inteiro item;
4) apresentacao();
5) item = menu do programa();
6) executa item do menu(item);
7) volta tipo de dados;
8)
Este programa tem apenas uma vari avel global, item, e se possvel, devemos
elimin a-la.
Este e um padr ao b asico de programas. Digamos que ele representa o pla-
nejamento inicial de qualquer projeto. Vamos analisar cada item tendo sempre
em mente a quest ao das vari aveis.
tipo principal() Porque todo programa, todo projeto, falando de forma
mais correta, tem uma func ao principal que gerencia o sistema de progra-
mas que formam o projeto. No meio dos que programam em c e comum
a armac ao de que o tipo da func ao principal deve ser inteiro.
6.2. T

ECNICAS COM O USO DE VARI

AVEIS LOCAIS 125


inteiro item; Uma vari avel global que vai servir de ligac ao entre o
menu do programa()
e a func ao que executa as opc oes do menu.

E a unica vari avel global do
sistema. A func ao
menu do programa()
apresenta as possibilidades do projeto e recebe do usu ario a sua intenc ao
sob forma de um n umero inteiro que vai passar para
executa item do menu(item).
apresentacao() Faz uma descric ao do sistema.
menu do programa(); O menu j a descrito.
executa item do menu(item); quem faz o trabalho.
volta tipo de dados; Todo programa deve terminar com este comando.
Num autentico programa em c deve ser sempre um inteiro, seguindo a
tradic ao. Este n umero deve informar ao sistema operacional se a execuc ao
do programa foi feita corretamente, e, em caso contr ario, informar o nvel
de falha na execuc ao do programa.
Nao precisamos, para um grande programa, mais do que uma variavel global,
e mesmo assim, uma, e muito. Todos os dados serao gerenciados localmente por
fun coes especcas chamadas a partir do menu que resolver ao todas as questoes
com as variaveis enquanto elas estiverem no ar, deixarao todos os dados gravados
em disco antes de sarem do ar, de modo que nao havera nenhum valor zanzando
pela memoria sem controle.
Abaixo as variaveis globais! e a regra.
Vamos agora reformular o programaacima mostrando-lhe como podemos
eliminar a unica variavel global. Veja como se faz e acompanhe as justicativas
que apresentaremos depois.
Exemplo: 9 Eliminando a vari avel global
Compare o programa do exemplo (ex. 8). Observe que numeramos as linhas e
agora algumas linhas v ao car faltando, porque foram eliminadas de um exemplo
para o outro.
1) inteira principal()
2)
4) apresentacao();
6) executa item do menu(menu do programa());
7) volta 0;
8)
126 CAP

ITULO 6. VARI

AVEL GLOBAL E LOCAL


Na linha (1), denimos o tipo de dados da func ao principal() como
inteira. Observe que na linha (7) agora est a retornando 0. N ao preci-
sava ser zero, poderia ser um n umero calculado dentro do programa que
indicasse ao sistema operacional o nvel de funcionamento do programa,
este e um detalhe mais especializado...
Desapareceu a linha 3, porque n ao precisamos de vari avel global.
Desapareceu a linha 5, porque a funcao menu do programa() foi parar
dentro da area de par ametros de
executa item do menu().
Desta forma, em vez de guardar a resposta de
menu do programa()
em uma vari avel global, repassamos esta resposta diretamente para a func ao
executa item do menu()
sendo assim desness ario o uso de vari aveis globais.


E preciso observar que o programa cou menos legvel. Agora estamos
usando o conceito fun cao composta para eliminar vari aveis globais. Em
computac ao este assunto e registrado sob a rubrica passagem de valor .
Isto deixa a l ogica do programa mais difcil de entender. Tem duas formas
de resolver este novo problema:
1. Coment arios explicativos colocados nos pontos crticos do programa
2. Uso de identificadores mais claros. Isto zemos no programa
acima: executa item do menu(), diz, com o seu nome, que ela re-
cebe a escolha feita em menu do programa() e vai execut a-la.
O tamanho dos identificadores e praticamente ilimitado: 256 carac-
teres (tres linhas). Ninguem precisa de algo t ao grande, mas podem ser
frases inteiras como executa item do menu().
Este programa existe, veja pensionato.c
3
, leia-o !
Eliminamos a variavel global.
Abaixo as variaveis globais! e a regra.
E esta regra se propaga para dentro das fun coes particulares do sistema. Um
bom sistema e feito de uma multidao de pequenas fun coes cuja reda cao deve
caber na tela e que tenha controle completo de todas as variaveis envolvidas.
Se algum dado for enviado para outra fun cao devemos nos arranjar para a
fun cao interessada receba este dado diretamente e voce esta vendo aqui uma
das principais fun c oes do comando return ao nal de cada fun c ao.
Eis um sistema seguro, eis uma forma avan cada de programar.
Vamos discutir na sec c`ao nal deste captulo, como c transfere valores entre
as fun coes.
3
no diret orio para DOS, procure pension.c
6.3. PASSANDO VALORES ENTRE FUNC

OES 127
Exerccios: 30 Transformando global em local
1. Leia e rode o programa padrao.c.
2. Transforme padrao.c num programa que faca alguma coisa.
3. Faca uma c opia do programa contabilidade.c em outro arquivo, por
exemplo teste.c e transforme as etapas do programa em func oes, pelo
menos tres:
apresentacao()
menu contabilidade()
executa contabilidade()
passe o valor de opcao para uma vari avel inteira da func ao principal e
passe esta vari avel como par ametro para executa contabilidade()
4. Elimine a vari avel que recebe a opc ao de menu contabilidade usando esta
func ao diretamente como par ametro de executa contabilidade().
soluc ao: pensionato.c
5. erro de compilac ao No programa pensionato.c, identique na func ao prin-
cipal()a linha
fim = executa pensionato(menu pensionato()); e nela troque
menu pensionato()
por
menu pensionato
rode o programa e analise a mensagem de erro produzida. Tente dar uma
explicac ao para a mensagem de erro.
soluc ao: ver ndice remissivo, ponteiros,tutorial.
6.3 Passando valores entre funcoes
Nesta se cao vamos trabalhar com o assunto: passando valores entre func oes.
Esperamos que voce rode e leia os programas na ordem como eles sao sugeridos
no texto, inclusive os coment arios contidos nos programas.
Observe que os programas sao parte integrante do texto do livro, embora dis-
tribuidos eletronicamente, em separado. Ninguem aprende a programar lendo
livros...apenas lendo livros!
Rigorosamente falando, em c existem apenas dois tipos de dados:
128 CAP

ITULO 6. VARI

AVEL GLOBAL E LOCAL


1. n umeros e sua variantes, inteiros, fracionarios (oat), (o que inclue carac-
teres, short int ...), e
2. vetores que sao os ponteiros, os objetos diretamente associados com um
endere co inicial e outro nal (calculado a partir do tipo de dado).
Consequentemente, a passagem de dados entre fun coes usando os ponteiros
tem que ser um pouco mais traumatica porque na verdade se esta passando um
endere co e o valor tem que ser lido indiretamente.
O exerccio 1, abaixo, merece sua aten cao, sem d uvida, mas talvez voce deve
tenta-lo diversas vezes, algumas vezes deixando-o para depois.

E um desao.
Exerccios: 31 Passagem de dados
1. Desao Transforme o programa 162.c para fazer a passagem de dados en-
tre menu() e executa() usando string, d, h, c em vez de caracteres,
como esta projetado atualmente, d, h, c.
Soluc ao programa 163.c.
2. Os programas 163.c e 162.c tem uma pessima apresentac ao. Melhore a
apresentac ao dos programas e envie uma c opia para o autor.
3. O programa 165.c e uma alterac ao de 163.c para que seja impresso o
endereco da vari avel. Analise o programa e idenque onde se faz isto.
4. Desao, outro? Transforme o programa 163.c para que sucessivamente as
func oes apresentacao(), menu() passem dados para executa().
Soluc ao programa 164.c, veja tambem o programa pensionato.c
5. Leia os coment arios no programa 164.c
Se voce conseguir resolver o problema, de forma diferente de 163.c, me
envie uma copia, eu irei colocar sua solu cao no livro, com seu nome, mas se
voce conseguir faze-lo sem variaveis globais...!
O objetivo do exerccio 1 e mostrar a diculdade de passar valores em c
quando estes valores nao forem inteiros. Observe tambem que switch() somente
aceita parametros inteiros, o que for cou que fosse substituido por uma cascata
de if-elses.
Numa compara cao, quando se passam valores usando vari aveis do tipo ponteiro
o que se faz e dizer em que endereco XXX o valor se encontra. Veja 164.c.
Vamos analisar o programa sexto.c para produzir uma versao melhorada
do mesmo.
Exerccios: 32 1. Rode o programa sexto.c. Compile,
gcc -Wall sexto.c -oprog
e rode
prog em alguns sistemas, ./prog
6.3. PASSANDO VALORES ENTRE FUNC

OES 129
2. Leia sexto.c procurando entender cada uma das suas tres func oes. Quan-
tas vari aveis globais o programa tem?
3. H a uma mensagem de advertencia no r otulo do programa sexto.c, leia e
identique no programa as vari aveis a que ela se refere.
4. Suite sexto01,sexto02,sexto03
(a) Leia e rode o programa sexto01.c
(b) Verique onde e usada a vari avel sinal na func ao
principal()
e qual sua raz ao.
(c) Verique que a vari avel sinal e desnecess aria, voce pode colocar di-
retamente
verificacao(senha)
como par metro do se(). Experimente isto e elimine esta vari avel
global. Soluc ao sexto02.c
(d) Verique onde a vari avel senha e utilizada na func ao
principal().
Torne esta vari avel local usando-a exclusivamente na fun c ao recepcao().
Soluc ao sexto03.c
(e) Observe que na compilac ao de sexto03.c h a uma advertencia (war-
ning). Conclua que soluc ao encontrada no programa sexto03.c
para tornar local a vari avel senha n ao e boa. Ela deve ser global
no ambito do prgrama, absolutamente global. Corrija o programa
sexto03.c
Soluc ao sexto04.c
(f ) Leia as observac oes presentes em todas as vers oes de sextoX.c e
resolva os problemas propostos.
130 CAP

ITULO 6. VARI

AVEL GLOBAL E LOCAL


Captulo 7
Os tipos basicos de dados
Neste captulo vamos discutir os tipos de dados b asicos de C. Entre eles existe
um de particular import ancia que deixamos para a ultima se c ao, ponteiros,
porque ele tem o que ver com todos os demais e tambem porque ele e de uso
intenso nos programas em C. A se c ao sobre ponteiros foi escrita a parte e
imagino que deve ser lida independentemente das demais, inclusive h a pon-
teiros
a
de outras partes do livro para ela.
Um agregado como 132345665, para a linguagem C, e semelhante ao agregado
hfgfabccb. C manipula tais agregados segundo certas regras incluidas no com-
pilador de uma forma tal que podemos chamar C de linguagem, porque, como
as linguagens naturais C obedece a uma sintaxe e tem alguma sem antica de
muito baixo nvel.
Na medida em que voce declarar corretamente os dados, C ir a aplicar a estes
dados as regras sint aticas correspondentes e, com igual import ancia, ir a se-
parar espa co de mem oria do tamanho certo para guardar estes dados.

E esta
a import ancia do tipo de dado na declara c ao de uma vari avel: determinar o
espa co que ela vai ocupar na mem oria e portanto o segmento de mem oria que
ser a usado.
a
Este uso da palavra ponteiro e tecnico, mas nada tem a ver com seu
signicado dentro da linguagem C. Aqui a palavra ponteiro quer dizer link,
uma liga c ao entre duas ideias como num texto em html...
7.1 Os n umeros em c
Este livro nao pretende discutir questoes matematicas, aqui, os n umeros sao
tipos de dado de uma determinada linguagem de programa cao e isto e diferente
do conceito de n umero em Matematica, embora, sob algum aspecto, os inteiros
em c tenham aspectos que somente se atinge em cursos mais avan cados de
Matematica, quando se estuda congruencia, em

Algebra.
131
132 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
7.1.1 Os n umeros inteiros
Vamos come car com os n umeros inteiros.
A forma de encarar os n umeros, numa linguagem de programa c ao, difere daquela com que
um matem atico ve este tipo de objeto. H a linguagens de programa c ao em que a vis ao ma-
tem atica de n umero chega a ser aproximada, Python, LISP, calc por exemplo, relativamente
a n umeros inteiros. Em Python ou em LISP o limite para se escrever um n umero inteiro ca
por conta da mem oria da m aquina.
Em C, os n umeros formam um conjunto nito e usa uma aritmetica apropriada para um
conjunto nito de n umeros, a da congruencia m odulo p. Este poderia ser um t opico para
um livro inteiro, de modo que vamos ter que cortar os horizontes para escrever dentro do
escopo deste livro, mas e preciso que o leitor saiba disto. O local onde voce pode se expandir
a respeito deste assunto e num livro de

Algebra.
Um n umero inteiro e um objeto que vai ocupar um determinado espa co da
memoria do computador e ao qual certas regras serao aplicadas. Este e um dos
pontos em que a linguagem c difere de maquina para maquina. Em LinuX
1
o
maior n umero inteiro positivo que o gcc reconhece e 2147483647.
No BC, se voce escrever int na area do editor (dentro de um programa
editado), e colocar o cursor sobre esta palavra, apertanto Ctr-l F1
2
, voce vai
receber uma ajuda no contexto, especca, sobre int na qual lhe vai ser dito
qual e o maior inteiro que o BC reconhece.
Como eu uso somente LinuX, me vejo na impossibilitade de vericar qual
e o maior inteiro reconhecido pela linguagem c em outros sistemas. Porem o
metodo indicado acima vai lhe mostrar qual e a capacida numerica do BC e,
certamente, o metodo funciona em outros sistemas.
Veja o resultado da opera cao aritmetica para n umeros nitos
2147483647 + 1 = 2147483648.
Voce pode vericar isto rodando o programa
#include <stdio.h>
int main()
{
printf("%d", 2147483647+1);
1
Voce pode encontrar esta informa c ao em /usr/lib/gcc-lib/i486-
linux/2.7.2.3/include/limits.h
2
se n ao funcionar, deixe o cursor sobre a palavra e, acionando o help escolha Topic search
7.1. OS N

UMEROS EM c 133
return 0;
}
apesar do aviso que o compilador lhe vai dar de que o programa produz um
overow, (estouro de dados). Voce pode ignorar este mensagem, tranquila-
mente. A mensagem de erro ocorre porque, embora c saiba bastante

Algebra,
nao se encontra convencido de que

Algebra e verdadeira... a linguagem calcula
corretamente o valor mas a opera cao esta ultrapassando o limite de memoria
reservado para n umeros inteiros, eis a razao do overow que signica est a der-
ramando...
Um programa que executa tarefa semelhante e inteiros.c. Leia o pro-
grama, rode-o, volte a le-lo.
Por exemplo observe que
2
32
= 4294967296 ; 2
31
= 2147483648
entretanto isto nao parece estar ligado ao programa que voce acabou de rodar.
Vamos pensar de outra forma. Lembrando a An alise combinat oria, se voce
tiver dois caracteres, 0, 1, para arranjar com repeti cao em uma matriz com
32 posi coes, o n umero de arranjos (com repeti cao) seria
2
32
= 4294967296.
Agora separe um bit para indicar se o n umero e positivo ou negativo.
Falei de bit, entenda que e uma posi cao na matriz de 32 posi coes acima.
Separar um bit lhe faz perder a possibilidade de usar 0, 1 uma vez, por-
tanto o conjunto dos numeros inteiros que se podem assim representar e
2
32
/2 = 4294967296/2 = 2
31
= 2147483648.
Ainda tem o zero, e assim a aritmetica de inteiros em c vai de
2147483648 . . . 1, 0, 1 . . . 2147483647
sendo esta a razao do resultado que voce obteve com o programa inteiros.c.
Quando pedirmos 2147483647 + 1 c respondera com 2147483648 e sucessiva-
mente 2147483648 + 1 = 2147483647 . . .
Como um byte corresponde a oito bits entao os inteiros no gcc ocupam 4
bytes de memoria:4 x 8 = 32.
Uma outra forma de obter a mesma informa cao junto com outras informa coes
ligadas aos tipos de dados escalares pode ser consultando o manual, ver no
ndice remissivo Libc. Veja tambem o ultimo captulo.
Se voce quiser saber o espa co ocupado na memoria por um inteiro, rode o
programa inteiros.c. e para compreender exatamente o que signica o
tamanho de um tipo de dado, altere manualmente o n umero que aparece no
programa inteiros.c, por exemplo, retirando alguns algarismos
3
, e voltando
3
A vers ao do programa, no disco, e a mais recente e pode ser diferente da que se encontra
no livro.
134 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
a rodar o programa. Nao tire muitos algarismo porque o programa podera
demorar muito rodando...mas, neste caso, tem o Ctrl-C para para-lo.
Exerccios: 33 Experiencia com inteiros
1. Faca um programa que adicione dois inteiros fornecidos pelo teclado.
Soluc ao: inteiros.c
2. Altere o programa inteiros.c para que um n umero seja lido pelo teclado
e seja testado.
Soluc ao: inteiros01.c
3. Se voce tiver usado n umeros muito grandes ao rodar inteiros01.c, vai
aparecer uma conta meio estranha. Tente encontrar uma explicac ao. Rode
inteiros02.c e n ao de muita import ancia ` a reclamac ao do compilador
sobre o tamanho das constantes dentro do programa. Neste caso pode ir
em frente.
4. Introduza em inteiros.c um teste para vericar se uma soma de dois
inteiros positivos ainda e positivo na aritmetica nita do gcc.
Soluc ao: inteiros03.c
5. Altere o programa inteiros.c para que ele rode a partir de um inteiro
grande acrescentando mais uma unidade ate chegar ao maior inteiro do
seu sistema. Ver sugest oes em inteiros01.c
6. Faca um programa que receba dois inteiros e depois lhe pergunte qual a
operac ao aritmetica para executar com eles e que ela seja executada.
7. Evoluc ao de um programa
(a) Quebre o programa
4
quatro operacoes.c em quatro m odulos que
devem ser chamados a partir de um menu.
(b) Torne o programa quatro operacoes.c numa m aquina de calcular
permanente na mem oria.
(c) O programa quatro operacoes01.c tem um lay-out de baixa qua-
lidade, reforme-o.
(d) O programa quatro operacoes01.c n ao usa mem oria para guardar
as operac oes executadas, altere isto.
(e) Inclua no programa
quatro operacoes02.c
uma informac ao de como parar o programa:
Ctrl-c
naturalmente...com o cursor na shell em que voce tiver rodado o
programa.
4
no diret orio do DOS, procure qua opr*.c
7.1. OS N

UMEROS EM c 135
(f ) Ofereca um meio mais evoluido para parar o programa
quatro operacoes02.c
Soluc ao: quatro operacoes03.c.
(g) Infelizmente o usu ario pode ser obrigado a digitar n umeros antes que
o programe pare... defeito do quatro operacoes03.c. Corrija isto.
(h) O programa quatro operacoes04.c tem um pessimo lay-out, cor-
rija isto se ainda n ao o houver feito.
(i) Refaca o programa quatro operacoes04.c usando a func ao switch().
Soluc ao:quatro operacoes05.c
Sugestoes:
1. Quando os inteiros crescerem alem do limite, tornam-se inteiros negativos, um teste
para detectar isto pode ser num < 0.
2. Uma variavel do tipo char pode receber os itens de um menu. Verique que se char e
aceito como tido de dados do switch
3. Maquina de calcular: ver o programa quatro operacoes.c.
4. Modularizacao? analise a suite quatro operacoesXX.c Use grep modulo quatro* para
encontrar em que programas aparece a palavra chave modulo (sem acento).
5. Maquina de calcular permanente? Loop innito... ver
quatro operacoes01.c
6. Use
grep assunto quatro*.c
para encontrar o programa que voce deseja, (os nossos programas tem um sistema de
palavras-chave para buscas deste tipo):
grep assunto *.c | more
Uma das experiencias feitas nos exerccios do bloco anterior foi a do tamanho
ocupado por um inteiro. No gcc e 32 bits o espa co necessario. Pode ser ate
mesmo o inteiro 0, ele ocupa o mesmo espa co do inteiro maximo. Isto signica
que gcc planeja
5
um espa co adequado para guardar n umeros inteiros. Se o
problema que voce for resolver nao precisar de n umeros t ao grandes, escolha um
tipo de dados mais modesto. Caso contrario voce vai gastar memoria a toa.
A biblioteca limits.h, que pode ser encontrada no diretorio
/usr/lib/gcc-lib/i386-linux/2.9XX/include/
6
,
contem as deni coes dos tamanhos de dados. As letras XX devem ser subs-
titudas para bater com a vers ao atual do gcc. Voce pode obter a versao digi-
tando
gcc -v
no meu caso o resultado e
tarcisio@linux:~/tex/c$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-linux/2.95.2/specs
gcc version 2.95.2 20000220 (Debian GNU/Linux)
5
Na verdade quem planeja e o programador!
6
Este caminho pode variar de m aquina para m aquina, com algum programa de busca de
arquivos, mc, por exemplo, voce pode localizar esta biblioteca.
136 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
XX = 5.2 porque a parte nal, 20000220, e a data da distribui c ao.
La voce pode encontrar, por exemplo, no caso do gcc:
LONG MIN e o espa co ocupado por um signed long int. e tambem o
menor n umero inteiro do tipo longo reconhecido pelo gcc. Dito de outra
forma, e tambem o menor n umero deste tipo que voce deve usar para nao
gastar espa co `a toa na memoria. Ainda repetindo de outra forma, se voce
precisar apenas de n umeros menores que 32 bits, entao nao deve escolher
este tipo de dados.
e o mesmo tamanho do tipo de dados int.
LONG MAX e o valor maximo que pode assumir um inteiro longo.
ULONG MAX e o valor maximo que gcc entende para um inteiro sem
sinal. Tem a mesma capacidade dos inteiros longos com sinal.
LONG LONG MIN e o menor valor que pode ser alcan cado por um inteiro
longo com sinal. De outra forma, representa o espa co ocupado por este
tipo de dados: 64 bits que e menor do que 2
64
.
Retomando o que diziamos no incio desta se cao, os n umeros no computador
formam um conjunto nito, como nao podia deixar de ser. Em algumas lin-
guagens, LISP, Python, e possvel manter esta barreira limitada pela memoria
do computador e ate pensar que nao existem barreiras... por um artifcio
especial que estas linguagens tem para trabalhar com aritmetica. Nao e o caso
do c embora estas linguagens tenham sido construidas em c.

E, lembre-se da introdu cao, ha coisas que nao podemos fazer com c mas que
podemos fazer com linguagens ou pacotes que foram feitos em c . . .
Observa cao: 27 A conta de dividir
A conta de dividir em quatro operacoesXX.c n ao est a errada, apenas n ao
e a divis ao habitual. Quando voce escrever em c, a/b, estar a calculando
apenas o quociente da divis ao entre os dois inteiros. Assim
3/4 0
porque o quociente na divis ao de 3 por 4 e o inteiro 0. Nesta divis ao o resto e
ignorado. No gcc h a func oes para recuperar o resto na divis ao inteira de modo
que se possa escrever os dados do algoritmo da divisao euclidiana
d ividendo = d ivisor q uociente + r esto
O programa numeros02.c
7
escreve os dados deste algoritmo.
H a outras func oes que executam tarefas semelhantes, mas com n umeros re-
ais. Leia mais a este respeito na pr oxima subsec ao sob o ttulo, func oes que
analisam n umeros reais.
7
no diretorio do DOS, procurar numer*.c
7.1. OS N

UMEROS EM c 137
7.1.2 Os n umeros reais
Esta se c ao se dedica aos n umeros n ao inteiros. Vou estar me referindo, nesta se c ao, aos
n umeros reais e estarei assim super-adjetivando os n umeros de que tratarei aqui, que nada
mais s ao do que n umeros racionais. Em ingles se usa a express ao float para se referir ao
que chamaremos de reais. Em Portugues existe a express ao n umero com ponto utuante
que corresponde ao float americano. Vou adotar real por ser mais curto, mas quero dizer
mesmo n umero com ponto utuante.
Como eu j a disse antes, em C, os n umeros formam um conjunto nito, e este e tambem o
caso dos n umeros reais. Existe uma aritmetica apropriada para estes n umeros contida
num padr ao elaborado e divulgado pela IEEE.

E bom lembrar que poderiamos escrever 100
p aginas sobre este assunto...voce tem aqui um resumo.
Ha muitos anos atras havia nas tabernas e sobretudo nas lojas de material
de construc ao, umas maquinas mecanicas proprias para o calculo com n umeros
reais
8
. As tais maquinas tinham duas teclas com setas para esquerda ou para
direita, ao lado do teclado, que permitiam deslizar a escala para direita ou para
a esquerda, era o ponto utuando, e correspondia a multiplicar por 10 ou dividir
por 10. Veja na gura as teclas vermelha, `a esquerda, com as setas. Apertando
as chaves laterais com o polegar e o apontador se limpava a memoria... e
rodando a manivela, `a direita, se fazia a multiplica cao (soma repetida) ou divisao
(subtra cao repetida) conforme o sentido da rota cao. Uma maquina mecanica
de multiplicar. (g. 7.1).
Figura 7.1: M aquina do balc ao do comercio, cole c ao do autor.
Quando voce escrever
173737823.
8
ponto utuante...
138 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
observe que o ponto nao foi um engano, gcc ira entender que nao se trata de
um inteiro e fara diferen ca entre
173737823., 17373782.3, 173737.823, 17373.7823
entretanto
173737823. = 173737823.0 = 173737823.00
Observe que o ponto utuou, era o que a maquina mecanica, de que fala-
mos acima, fazia.
O gcc usa os seguintes valores para denir a fronteira do conjunto nito de
n umeros reais:
1. reais com precisao simples
(a) FLT MIN 1.17549435E-38F
(b) FLT MAX 3.40282347E+38F
(c) FLT EPSILON 1.19209290E-07F
quer dizer com 9 algarismos signicativos.
2. reais com precisao dupla
(a) DBL MAX 1.7976931348623157E+308
(b) DBL MIN 2.2250738585072014E-308
(c) DBL EPSILON 2.2204460492503131E-016 portanto com 16 algaris-
mos signicativos.
para que voce possa ter uma ideia do que esta precisao pode signicar, analise
o seguinte exemplo, sem leva-lo muito a serio...
Exemplo: 10 Erro no acesso `a estacao espacial
Por favor, nao leve a serio este exemplo. De-lhe a import ancia indicada pelo tamanho da
letra. Um problema deste tipo se resolve com instrumentos bem mais avancados. Comentarios
ao nal.
Suponha que um programa monitorando o envio de uma nave espacial calcule o ponto de
encontro da mesma com `a esta c ao espacial internacional que se encontra em orbita terreste
num raio de 326 Km (ou 326.000 m)
9
a partir do centro da Terra.
Simplicando o processo de conducao da nave, como se nada mais houvesse entre seu
lancamento e sua chegada `a esta c ao espacial internacional, e seu o ponto de encontro estivesse
no centro da estacao que devera medir cerca de 120 metros quando estiver toda montada no
ano 2005
10
, vamos calcular o erro relativamente ao ponto de encontro com a precisao que
temos no gcc. Nossa simplicacao vai ao ponto de supor que tudo se encontra estatico
e portanto que a nave parte em linha reta de encontro `a esta c ao se dirigindo ao ponto
central. Quer dizer que estamos calculando a base de um triangulo isosceles cuja altura seria
326Km. A base deste triangulo e regiao de erro, a nave deveria chegar ao ponto central
onde se encontraria o acesso. Com erro de FLT EPSILON = 1.19209290E 07 teriamos
erro = FLT
E
PSILON 326000 = .03886222854 m isto e, 3cm de erro.
Obviamente nada neste exemplo e real, a nao ser aproximadamente as dimensoes,
9
os valores n ao s ao precisos, o raio terrestre n ao e examente 6 km, por exemplo
10
grato ao Prof. Emerson do Dep. de Fsica da UeVA por estas informa c oes, ver
http:www.nasa.gov
7.1. OS N

UMEROS EM c 139
Nao se enviam espaconaves numa rota perpendicular `a supercie da terra, apenas o
lancamento e feito numa perpendicular para diminuir o gasto de energia com a sada
da gravidade;
As naves seguem rotas em forma de espiral para permitir a entrada em orbita perto do
ponto de interesse e para melhor aproveitar a rotacao da terra e a forca de gravidade
dos planetas, da lua ou do sol, por exemplo;
A rota em espiral permite uma aproximacao tangencial da orbita da estacao espacial;
As naves possuem um controle feito por computador que corrige a rota a cada ciclo do
computador, quer dizer a cada milhonesimo de segundo;
O instrumento matematico usado neste tipo de problemas sao as equa c oes diferenciais
ordin arias vetoriais e nao semelhan ca de tri angulos ...
O exemplo serve apenas para mostrar que o erro FLT EPSILON = 1.19209290E 07
entre dois n umeros reais consecutivos e sucientemente pequeno para resolver um problema da
magnitude deste, envio de uma espaconave para se acoplar com outra, com uma aproximacao
aceitavel. Muito mais exatos cam os resultados com a precis ao dupla.
Entretanto, para salvar o exemplo, as aproximacoes feitas a cada milhonesimo de se-
gundo, podem usar semelhanca de trinangulos e neste caso as alturas dos triangulos serao
tao pequenas que a precisao nal sera de milhonesimos de centmetro (e nao os 3cm calcula-
dos acima).
Finalmente, para resolver problemas crticos, computadores sao especialmente planejados
com quantidade grande de memoria e neste momento, sim, a precisao da linguagem C pode
ser alterada, se for necessario. Mas, muito mais provavel e que se construa uma linguagem
apropriada para o problema, veja o que ja dissemos na introdu cao. Leia tambem a observacao
em real01.c.
Os programas realXX.c sao um complemento do presente texto. Eles vao
ser objeto dos exerccios seguintes.
Exerccios: 34 Experiencias com os reais
1. Leia e rode real.c. Veja os coment arios do compilador e procure en-
tender quais s ao os erros encontrados. H a coment arios sobre os erros no
programa corrigido real01.c.
2. Altere o programa real01.c para com ele fazer c alculo de areas de tri angulos
e quadrados. Corrija os erros em real01.c, leia os coment arios do com-
pilador.
Soluc ao: real04.c
3. O programa real04.c tem diversos defeitos na sada de dados, rode-o,
observe os defeitos e corrija o programa. Soluc ao: real05.c
4. Modularize real04.c de modo que o usu ario possa calcular areas de tri angulos,
ret angulos ou crculos separadamente. Faca observac ao sobre a area de
quadrados semelhante a que se faz sobre crculos. Sugest ao: reutilize o
programa menu.c. Veja tambem o programa vazio.c.
Soluc ao: real06.c
5. Corrija os diversos defeitos de lay-out das sadas de dados do programa
real06.c.
140 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
6. Crie uma biblioteca, aritmetica.h, nela coloque as func oes de real06.c.
Soluc ao: real07.c, aritmetica.h
7. Deixe o programa real07 no tamanho da tela.
Soluc ao: real08.c, aritmetica.h
8. O programa real08.c tem ainda alguns defeitos de apresentac ao, corrija-
os e expanda o programa para que ele execute mais operac oes. Tente
manter a func ao principal toda visvel na tela. Sada, crie uma func ao
executa() na biblioteca aritmetica.h chmada de real09.c... e elimine
o switch de real08.c, claro, esconda, se voce quiser pensar assim, o
switch em aritmetica.h
9. Faca um programa, chamado Matematica que execute algumas operac oes
geometricas e aritmeticas. Depois, distribua seu programa na rede, ele
pode ser um tutorial.
Nao se pode dizer que zemos muita matematica nos programas acima, de
fato nao. Entretanto voce pode ver como se podem construir programas mais
complicados a partir de programas mais simples.
A suite de programas realXX.c foi construida na sequencia denida pelos
exerccios do bloco anterior. Se voce analisar com aten cao ira encontrar aqui
uma resposta para aquela pergunta que cou no ar desde o incio:
Observa cao: 28 Existe alguma tecnica para programar bem?
Uma resposta simples para esta pergunta n ao existe. Conseguir responder
a esta pergunta equivaleria a criar uma receita simples para resolver qualquer
problema... obviamente isto e um absurdo.
Entretanto n os lhe mostramos aqui um metodo que ajuda a come car:
1. Quebre o problema em pedacinhos e resolva cada um destes pedacinhos;
2. N ao aceite que um programa que maior do que a tela do computador...
Um programa que car todo na tela e f acil de ser analisado. Os insetos
se escondem facilmente em programas que ocupam v arias telas ou milh oes
de linhas.
3. Se voce estiver precisando de tecnicas para detetizac ao (debug), certamente
seus programas s ao muito grandes. Quebre-os. Refaca tudo a partir do
comeco.
4. Aprenda a programar de forma simples e refaca os seus programas. Adi-
anta pouco corrigir programas quilometricos...
5. Crie func oes pequenas que resolvam tarefas interessantes e pequenas. Veja
menu.c, vazio.c, aritmetica.h e ambiente.h.
7.1. OS N

UMEROS EM c 141
Fun coes de variavel real
Vamos terminar esta se cao analisando algumas fun coes da biblioteca
11
glib.Voce
vai encontrar mais informa coes consultando info do LinuX. Use os comandos
Numa area de trabalho, digite info
Dentro do info digite m e responda glib ou libc.
Vamos nos xar nas fun coes que usaremos mais a frente e para isto colo-
caremos aqui indexa cao para facilitar sua busca de informa coes imediata. Mas
aprenda a consultar info, vale a pena.
As fun coes que escolhemos para descrever aqui, executam tarefas pouco usu-
ais mas de grande importancia na solu cao de diversos problemas. Elas fazem o
truncamento de n umeros ou situam um determinado n umero entre dois inteiros.
Fazem tambem a conversao de real em inteiro.
Elas estao denidas na biblioteca math.h.
Apresentamos as fun coes com sua sintaxe explicitada, por exemplo, a pri-
meira e
double ceil(double X)
apresentada no formato como apareceria se estivessemos declarando esta fun c ao
dentro de um programa.

E assim que voce ira encontrar a informa cao em libc.
A fun cao: double ceil (double X) calcula o inteiro mais pr oximo que seja
maior do que X. Assim ceil(X) sera um n umero do tipo real, mas inteiro,
e maior ou igual que X.
Quer dizer que
ceil(X) X;
ceil(X) e um n umero inteiro do tipo real.
Por exemplo
ceil(1.5) = 2.0
A palavra ceil vem de ceiling, (teto). Quer dizer que estamos calcu-
lando o teto inteiro de 1.5.
A fun cao:
double floor (double X)
calcula o inteiro mais proximo, e abaixo de X:
floor(1.5) = 1.0
floor(x) x;
floor(x) e um inteiro, do tipo real.
11
Mais abaixo vamos lhe mostrar como voce pode pesquisar as bibliotecas disponibilizadas
pelo BC.
142 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
A palavra oor e a palavra inglesa para (piso). 1.0 e o n umero inteiro
(real) que esta logo abaixo de 1.5. Escrevemos: n umero inteiro (real)
porque o resultado de floor() e um n umero real. Isto e importante, ao
calcular
como o resultado e um real: floor(3.5)/4 0.75 (7.1)
se o resultado fosse inteiro: floor(3.5)/4 0 (7.2)
Sao detalhes que esquecemos quando temos que fazer contas...e que se
perdem em programas com centenas de linhas.
A fun cao:
double rint (double X)
arredonda X para um inteiro guardando o tipo double, de acordo com o
metodo de arredondamento denido para c. Veja em glib com info.
Floating Point Parameters os varios tipos de arredondamento existentes.
O metodo default
12
, entretanto, e para o mais proximo inteiro. As-
sim, se no c que voce estiver usando, estiver preservada a especica c ao
de fabrica, rint(X) sera o inteiro mais proximo de X. Sera a alternativa
otimizada de escolha entre ceil(x), floor(x).
A fun cao: double modf (double VALOR, double *PARTE-INTEIRA) Esta
fun cao quebra o argumento VALOR em duas partes, A, B tal que:
A [1, 1];
B e inteiro mais proximo de zero;
A, B tem o mesmo sinal de VALOR.
Guarda o inteiro B em *PARTE-INTEIRA.
Devolve A na linha de comando
13
.
Por exemplo, modf (-2.8, &parte inteira) devolve -0.8 e guarda -2.0
em parte inteira, dois n umeros negativos porque V ALOR = 2.8 < 0.

E preciso terminar dizendo, estamos longe de ter esgotado as fun c oes de-
nidas em math.c. Consulte libc com auxlio de info para se dar contas disto.
Dentro de info use o comando m e digite glib ou libc.
7.1.3 Bibliotecas do BC

E atraves do help que voce vai descobrir e analisar as biliotecas disponveis com
o BC. Abra um programa qualquer e coloque o cursor sobre floor e clique no
botao help. Ao cair o menu, escolha Topic search e voce vai cair num help
sobre a fun cao floor().
12
a palavra default signica padr ao
13
Como C n ao e uma linguagem interpretada, n ao tem sentido falar em valores na linha
de comando... e sim, simplesmente, devolve A.
7.1. OS N

UMEROS EM c 143
Observe no canto direito superior MATH.H, possivelmente em amarelo.

E
um indicativo de que esta fun cao esta na biblioteca math.h. Se voce clicar
em MATH.H o help vai leva-lo para ver as fun coes desta biblioteca. Tudo que
dissemos acima sobre glib vale aqui para help do BC
Siga tela abaixo e voce vai encontrar um programa-exemplo ilustrando como
funciona esta fun cao.
Em math.h voce vai encontrar as outras fun coes cuja referencia zemos
acima. Aproveite para passar os olhos sobre os nomes das fun coes e voce vai
encontrar ceil() entre muitas outras. Des ca ate o nal da pagina e voce ir a
encontrar List of all header files.
Header file e o que chamo biblioteca. O texto esta enfatizado, coloque o
cursor sobre ele e de enter. Voce vai encontrar a mesma listagem que existe
sob Linux. Escolha alguma dessas bibliotecas para fazer uma analise rapida, e
pronto, voce ja sabe onde pode encontrar as informa coes. Saia e volte quando
precisar.
Cast - transformando tipos de dados
Ha uma opera cao em c chamada cast que serve para transforma cao entre dois
tipos de dados (de um maior para um menor).
Por exemplo, voce pode transformar um n umero do tipo real em outro do
tipo inteiro jogando o real dentro do inteiro e naturalmente perdendo
alguma informa cao: a parte fracionaria.
Mas tambem voce pode jogar inteiros nos reais, com rint(), ver cast.c).
Exerccios: 35 oat, ceil(), oor()
1. Rode e leia o programa floor.c.
2. Altere floor.c para calcular rint().
Veja o seguinte exemplo que e bem comum.
Exemplo: 11 Transformando dados
Considere um programa que calcule percentuais de dados inteiros, e o caso
de uma pesquisa de opni ao.
Os dados que v ao ser usados s ao
Total de pessoal entrevistadas, um inteiro;
n umero de pessoas que adota uma certa opini ao, outro inteiro
entretanto vamos querer calcular
opini ao
total
e a conta vai car errada, porque, voce j a viu, no incio deste captulo, que
3/4 = 0
144 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
em c.
A sada e escrever
((float)3)/4 = 0.75
A express ao, ((tipo) var) se chama
em, c, cast,
em portugues, transformac~ao do tipo de dados.
Observe que basta fazer ((float)3) porque se um dos fatores for tipo float o
resultado ser a deste tipo.
Utilidade desta opera cao? Inteiros ocupam menos espa co de mem oria que os
reais! Como o programa vai receber dados inteiros, e melhor denir as variaveis
que vao receber estes dados como inteiras ganhando espa co na mem oria e
tempo de processamento! No calculo nal se faz a transformac~ao do tipo de
dados, para conseguir o resultado corrreto.
Observe que se var for do tipo float entao
((int)var) floor(var)
Rode o programa cast.c para ver as limita coes da transforma cao de dados e
a perda de informa coes que ela pode acarretar. O seu uso ca restrito a n umero
pequenos.
O programa cast.c vai lhe mostrar que a equivalencia acima se torna dis-
cutvel quando os n umeros forem grandes.
7.2 Caracteres e vetores de caracteres.
Os caracteres
A palavra chave da linguagem c, para caracteres e char. Veja o programa
14
quatro operacoes02.c
onde a variavel operador esta denida como
char operador;
e deve receber um dos seguintes valores
+, , /,
Veja que o metodo, internamente (dentro do programa), consiste em escrever

e nao como escrevemos acima, nem


+ , , /, .
14
no diret orio do DOS, procure qua opr*.c
7.2. CARACTERES E VETORES DE CARACTERES. 145
Ha uma diferen ca substancial entre
+ ,

, +
a e um smbolo que pode (ou nao) ter um valor associado. Ent ao + e um
smbolo associado ao qual se encontra o algoritmo da adi c ao;
a e um caractere, e um dos 256 caracteres reconhecidos no teclado.
a e um vetor de caracteres, neste caso um vetor de tamanho 1.
Exerccios: 36 Diferenca - caracteres-strings
1. Altere o programa quatro operacoes02.c usando x em vez de x em
cada ocorrencia dos elementos de

e analise o resultado.
2. Altere o programa
15
quatro operacoes02.c usando x em vez de x em
cada ocorrencia dos elementos de

e analise o resultado.
O resultado da experiencia no primeiro exerccio foi a seguinte:
warning: comparison between pointer and integer
e a justicativa e:
x e um vetor (ponteiro...), e a diferen ca anunciada acima:
x e um vetor de caracteres
x e um caractere
e os vetores sao naturalmente ponteiros em c.
A variavel operador foi denida para receber um caractere;
Caracteres, junto com os n umeros sao os dados basicos, (leia: os valores
basicos) da linguagem c
Vetor e uma variavel indexada e isto se faz com (ponteiro) em c.
Vamos aprofundar mais esta questao na se cao sobre ponteiro, que e a
proxima, e voce, sem nenhum preconceito, pode le-la agora e depois retornar a
esta. Mas fa ca uma leitura rapida porque a presente discussao e fundamental.
15
no diret orio do DOS, procure qua opr*.c
146 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
Observa cao: 29 Valores basicos
Vamos rapidamente insistir na expressao valores b asicos da linguagem. Digamos que C
foi projetada para lidar com n umeros e caracteres. Seria pouco dizer isto, ela foi projetada
para trabalhar com os smbolos que voce pode encontrar no teclado de sua maquina, como por
exemplo *, 2,.
Seu objetivo seria criar outras linguagens, (originalmente um sistema operacional) que
soubesse lidar com estes objetos, os caracteres, de modo a criar expressoes que tivessem
signcado tanto para a maquina como para o ser humano que a fosse manipular.
Uma linguagem de baixo nvel, se dizia, (tem gente que ainda diz...)
Hoje a linguagem C se projetou alem deste objetivo estrito e podemos com ela fazer outros
tipos de trabalho, (de alto nvel...).
A solucao mais pratica, para manter a linguagem com sua especicacao inicial foi a de
criar os vetores para entender aglomerados de caracteres como este:
A = aglomerados de caracteres.
entao A e um vetor, quer dizer uma variavel formada de uma sucessao de caracteres,
numerados sequencialmente. Voltaremos logo abaixo a esta questao.
O segundo exerccio no bloco acima produziu outra reclama cao por parte do
gcc. Agora o compilador se perdeu totalmente... a lista de reclama c oes passou
de uma pagina porque o erro (operador == ) confundiu o resto da an alise.
agora e o nome de uma fun cao que tem uma sintaxe particular: ab, deve estar
entre dois caracteres que gcc possa identicar como n umeros.
A sintaxe e algo extremamente importante para as linguagens de programa c ao.
A precisao tem que ser total. Cada smbolo tem que estar colocado exatamente
nas condi coes especicadas. * e diferente de , tambem

,= 1 ;

2

,= 2.
Temos assim dois grandes tipos de dados em c com os quais podemos cons-
truir todos os outros:
caracteres: 1, 2, . . . , a, b, . . . ;
n umeros que sao formados a partir dos caracteres especiais 1,2,..,9,0
Vamos passar a discutir logo os vetores de caracteres e ao nal faremos
compara coes e exerccios que terminarao por completar as ideias.
Caracteres especiais
Ha varios caracteres especiais, a lista de exerccios seguinte e um tutorial sobre
caracteres.
Exerccios: 37 1. Leia, rode e leia o programa ascii.c e, claro, voce nada
viu. Leia os coment arios no programa.
2. Leia, rode e leia agora o programa ascii 1.c. Este programa imprime
um trecho da tabela ASCII, a partir de um ponto inicial que lhe vai ser
solicitado.
3. Em ascii 1.c responda inicialmente com o n umero 1 quando isto lhe for
pedido, e veja que nada ser a impresso. Veja a partir de quando alguma
coisa util e impressa respondendo ao programa outros pontos iniciais.
7.2. CARACTERES E VETORES DE CARACTERES. 147
4. O programa ascii 2.c e uma pequena variante de ascii 1.c. Veja qual
a diferenca.
5. Leia, rode e leia ascii 3.c. Este programa usa uma vari avel, pausa para
dar saltos de p aginas formadas de 60 elementos da tabela ASCII. Mas
verique que a impress ao ca mal feita em alguns casos, descubra por
que.
6. Altere ascii 3.c para que cada p agina contenha 80 elementos da tabela.
Soluc ao: ascii 4.c
7. Veja em qualquer dos programas asciiX.c como imprimir caracteres,
usando o formatador %c Faca um programa para imprimir
printf(%c,7);
o ascii 7 que aciona a campinha.
Soluc ao: apeteco2() em ambiente.h
ASCII e uma sigla que signica American Standard for Communication and
Information Interchange e foi criado, como o nome o indica, para criar um
padrao para comunica coes, possivelmente caminhando para se tornar obsoleto,
ou de uso restrito ao n ucleo interno do processamento de dados (como a deni cao
dos codigos de teclados).
Os primeiros codigos ASCII sao especiais servem para passar pagina, li-
nhas, controlam a campainha do sistema, etc... nao sendo porisso visveis
(possveis de serem impressos).
Vetores de caracteres
A palavra string signica um objeto do tipo
asdfafeqerr rere qerqe weqrqrerer
um conjunto de caracteres, o que pode incluir espa co em branco, enfeixados por
aspas duplas. Em c este objeto e um vetor de caracteres, quer dizer, uma
matriz com uma linha e varias colunas.
O primeiro elemento da matriz, a e indexado por zero e assim sucessiva-
mente os demais, por 1,2,etc...
Se dermos um nome ao vetor
frase = asdfafeqerr rere qerqe weqrqrerer
(e observe que a sintaxe acima nao sera aceita por c a nao ser na inicializa cao
e deni cao da variavel) entao
frase[0] =

, frase[1] =

, ...
A forma de fazer atribui cao a um vetor de caracteres, fora da area de inicia-
liza cao, e usando a fun cao strcpy(). A igualdade acima seria:
strcpy(frase,asdfafeqerr rere qerqe weqrqrerer)
depois do que, em algum ponto do ponto posterior do programa, frase[2] faz
referencia ao caracter d.
148 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
Um caracter especial, o nulo, (NULL), 0, fecha um vetor de caracteres.
Assim, no exemplo acima, temos:
frase[31]=e, frase[32]=r, frase[33]=0
entretanto, na declara cao de variaveis se pode ter:
char frase[80]
gerando as seguintes respostas:
sizeof(frase) -> 80; strlen(frase) -> 32
Veja mais a respeito de vetores de caracteres e as fun coes que os ma-
nipulam em info, use o comando m dando-lhe como resposta libc. Voce vai
encontrar, no ndice Character Handling, a lista das fun coes para manipular
strings.
Exerccios: 38 Caracteres e vetores de caracteres
1. Rode (n ao leia...) o programa carac01.c. Ele explica caract1.c. Acom-
panhe com caract1.c aberto em uma janela.
2. Leia e rode o programa caract1.c . Altere caract1.c para fazer uma
busca de um caractere qualquer fornecido pelo teclado.
3. Rode o programa caract7.c para ver o tamanho do espaco ocupado, na
mem oria, por um caractere. Leia o programa tambem.
4. Leia e rode o programa caract11.c , verique que o programa n ao se
explica. Moque-o para que o programa diga ao usu ario o que vai ser
feito.
5. Leia e rode o programa caract12.c , novamente este programa e execu-
tado sem grandes explicac oes. Inclua as mensagens necess arias.
6. Em caract12.c Troque o valor de busca para vericar segunda possibi-
lidade do programa.
7. O programa caract13.c tem um erro, mesmo assim merece ser estudado.
Leia o programa e descubra o erro.
Soluc ao caract14.c
7.3 Ponteiros.
Ponteiro e um super tipode vari avel em C no sentido de que e um tipo de vari avel de
qualquer outro tipo... tem ponteiro do tipo inteiro, tem ponteiro do tipo real (oat) etc...
Mas claro, esta n ao e a melhor forma de iniciar a discutir este assunto.
As variaveis do tipo ponteiro guardam endere cos na mem oria que ser ao associados ` as outra
vari aveis. Os exemplos a seguir v ao deixar bem claro o que e isto. O importante nesta
introdu c ao, e desmisticar (e ao mesmo tempo mostrar a import ancia), deste tipo de dados.

E dizer que ponteiro aponta para um endere co inicial de mem oria para guardar um tipo de
dado: inteiro, oat, etc...
7.3. PONTEIROS. 149
Voce pode criar uma variavel to tipo ponteiro com a seguinte declara cao:
tipo outro\_nome {\tt nome} *{\tt nome}ptr; // uma variavel do tipo ponteiro.
Com esta declara cao, voce
nomeprt Criou uma variavel do tipo ponteiro para guardar o endere co
de um determinado tipo de vari avel, por exemplo int. O nome da vari avel
e arbitrario, os programadores tem o habito de acrecentar ptrao nal
do nome para facilitar a identica cao, no programa, das variaveis do tipo
ponteiro.
criou uma variavel outro nomedo mesmo tipo que a variavel do tipo
ponteiro. Nao e necessario fazer isto, mas com frequencia e conveniente,
inclusve assim (insistindo):
tipo outro nome, nomeptr;
separou na memoria espa co suciente e necessario para associar com a
variavel nome. Por exemplo, se nome for do tipo int havera 4 bytes sepa-
rados a partir de um ponto inicial de memoria;
em algum momento, no c odigo do programa, voce devera incluir o seguinte
comando:
nomeptr = &nome;
que fara a associac ao entre nome e os endere cos reservados por nomeptr.
Exemplo: 12 Um tutorial sobre ponteiros
Os programas
pont.c, pont1.c,...pont16.c
representam alguns tutoriais sobre ponteiros. Vamos apresentar alguns deles
agora.
1. Primeira etapa.
Leia e rode os programas
pont.c, pont1.c, pont2.c
nesta ordem. Se possvel abra duas areas de trabalho (shells). Numa rode
o programa pontXX.c e na outra edite o programa para que voce possa
acompanhar o que ele est a fazendo.
2. Segunda etapa.
Vamos comentar o que voce viu. Se alguma coisa do presente coment ario
lhe parecer confuso, repita a primeira etapa e retorne ao ponto em que a
explicac ao lhe pareceu obscura.
A discuss ao est a baseada em cada um dos programas.
150 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
pont.c Criamos duas vari aveis de tipo int. Uma delas e um ponteiro
para um inteiro, numptr. Veja a forma como se declaram ponteiros:
int *numptr;
Inicialmente a vari avel num nada tinha o que ver com numptr. Ao
executar
num = *numptr
foi estabelecida uma ligac ao. Experimente alterar a ordem dos dois
comandos:
num=*numptr; num=6;
e voce vai ver que o resultado e o mesmo. Mas o comando
num=*numptr;
e o que estabelece a ligac ao entre as duas vari aveis. A partir de sua
execuc ao, alterac oes na vari avel num ser ao registrada por *numptr.
A vari avel numptr guarda um endereco de mem oria que pode ser as-
sociado a um inteiro, isto quer dizer, ela guarda o primeiro endereco
de um segmento de mem oria que pode guardar uma vari avel do tipo
inteiro: 4 bytes de mem oria.
pont1.c O programa comeca lhe pedindo um valor, mas n ao se deixe
envolver...
Observe que o programa cometeu um erro: n ao indicou que tipo de
dado espera, deveria ter dito: me forneca um valor inteiro para a
vari avel.
Veja outra forma de associar vari avel e vari avel do tipo ponteiro (ou
vari avel com endereco). O efeito e o mesmo que o obtido com a
metodo de pont.c, e apenas outro metodo.
Neste ponto voce pode ver o uso dos operadores
*, &
para acessar
* valor associado ao ponteiro;
& endereco do ponteiro.
pont2.c Como toda outra vari avel, podemos declarar um ponteiro
inicializado. Isto foi feito neste programa.
Voce pode ver a sequencia de n umeros
01234...01234
indicando o ndice de cada um dos valores, caracteres, dentro do vetor
de caracteres apontado pelo ponteiro.
Novamente vemos aqui o uso dos operadores
*, &
para acessar valor ou endereco.
O programa lhe mostra o tamanho do vetor, e voce pode ver uma
caracteristica da linguagem c que toma como ndice inicial o 0.
7.3. PONTEIROS. 151
Depois o programa percorre um laco usando os ndices do vetor de
caracteres e imprimindo o valor de cada novo endereco e mostrando o
endereco invari avel, sempre mostrado, o endereco inicial do segmento
de mem oria em que se encontra guardada o valor isto e um teste.
O ultimo valor de vetor e o NUL.
Exerccios: 39 Laborat orio com ponteiros Vamos trabalhar com os programas
pontXX.c
1. Experimente imprimir com printf(), o nome de alguma func ao e analise
o resultado. Por exemplo, altere a func ao main(), dentro do programa
menu.c para que ela contenha apenas o comando:
printf(executa);
Se der erro
16
... complete os par ametros de printf() com a formatac ao
adequada!
2. Altere o programa pont1.c incluindo novas vari aveis (com os respectivos
ponteiros) para que voce entenda como est a utilizando ponteiros.
3. Melhore pont1.c incluindo mensagem indicativa de que tipo de dado o
programa espera. N ao se esqueca de alterar o nome do programa, os pro-
gramas erradostem uma func ao especca de laborat orio e n ao devem ser
alterados.
4. Altere pont1.c solicitando outros tipos de dados, como caracteres, n umero
real, etc... N ao se esqueca de alterar o nome do programa.
5. Leia, rode e leia o programa pont2.c. Acrescente novas vari aveis, rode
novamente o programa ate que que claro o uso dos operadores &, *.
Observa cao: 30 Identicadores de func oes
Os identicadores das func oes s ao vari aveis do tipo ponteiro.
Observa cao: 31 Virtude e castigo.
Se pode dizer que o uso de ponteiros e tanto uma das diculdades basicas da linguagem
C, por um lado, e por outro lado, a sua principal virtude.
Com a capacidade de acessar e manipular os dados diretamente na memoria, a linguagem
ganha uma rapidez tpica da linguagem assembler que faz exclusivamente isto. Linguagens
mais evoluidas dentro da escala da abstracao nao permitem que o programador acesse dire-
tamente a memoria, elas fazem isto por eles. Com isto se ganha em seguranca que falta ao
C, (a seguranca nos programas em C tem que ser conquistada centmetro a centmetro...).
Melhor seria dizer, em vez de seguranca, abstra c ao, porque e possvel programar em C com
grande seguranca
deixando de usar ponteiros e perdendo assim uma das caractersticas da linguagem;
aprendendo a dominar os ponteiros e fazendo registro (comentarios) do seu uso quando
eles se tornarem decisivos.
16
compre outro livro...
152 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
Como ja dissemos anteriormente, se voce declarar uma vari avel como inteiro, e nela
guardar um n umero em formato de ponto utuante, o risco mais elementar que o seu pro-
grama pode correr e que o espa co de nomes reservado ao C pelo sistema operacional que
in util por superposicao de dados, e consequentemente o seu programa deixe de rodar. Um
risco maior e que o setor de memoria reservado ao C seja estourado e outros programas do
sistema venham a ser corrompidos e consequentemente o computador que pendurado.
Portanto, todo cuidado e pouco no uso de ponteiros, e por outro lado, se perde uma
grande possibilidade da linguagem se eliminarmos o uso dos ponteiros, ao programar em C.
Mas voce pode, literalmente, programar em C sem usar ponteiros. Tem autores que
sugerem fortemente esta atitude. Eu evito o uso de ponteiros, mas em geral nao preciso deles
para o meu trabalho.
Observe que numa mesma declara cao e possvel, com o uso da vrgula, de-
clarar variaveis do tipo ponteiro e do tipo comum:
int *n,m ;
n e do tipo ponteiro apontando para um n umero inteiro, e m e do tipo inteiro,
guardando o valor de um n umero inteiro. Mas se trata de um mau habito,
porque as duas declara coes, a que esta acima, e a que vem logo abaixo
int *nptr;
int m;
ocupam o mesmo espa co quando o programa for compilado e diferem de uma
pequena quantidade bytes
17
quando guardadas em disco, entretanto a segunda e
mais legvel que a primeira e deve ser esta a forma de escrever-se um programa,
da forma mais legvel, para que os humanos consigam le-los com mais facilidade,
uma vez que, para as maquinas, as duas formas sao identicas.
Nos escrevemos programas para que outras pessoas, que trabalham conosco,
na mesma equipe, possam ler com mais facilida e assim o trabalho em equipe
possa uir.
As seguintes declara coes podem ser encontradas nos programas:
/* duas variaveis do tipo ponteiro para guardar enderecos
de memoria onde esta\~ao guardados numeros inteiros. */
int *n,*m;
/* variaveis de tipo inteiro. */
int l,p;
char palavra;
/* variavel de tipo ponteiro apontando para local de memoria onde
se encontra guardada uma variavel de tipo char */
char *frase;
/* variavel de tipo ponteiro apontando para local de memoria onde
se encontra guardada uma variavel de tipo ponto flutuante. */
float *vetor;
signicando respectivamente que se criaram variaveis de tipos diversos algumas
do tipo ponteiro, como esta indicado nas observa coes.
17
um byte e formado de 8 bits, e um bit e um zero ou um 1
7.3. PONTEIROS. 153
7.3.1 Operacoes com ponteiros.
Crucial e o processo operatorio com ponteiros. Vamos discutir isto em dois
momentos:
acesso `as variaveis do tipo ponteiro
opera coes aritmeticas com ponteiros
Acesso aos ponteiros.
As opera coes de acesso aos ponteiros sao:
atribuir um valor ao endere co apontado. Isto pode ser feito de duas formas:
1. Veja pont1.c
numptr = &num;
se houver algum valor atribuido a num, o que sempre ha, entao ca
indiretamente atribuido um valor ao endere co &numptr
2. Veja pont.c
num = *numptr
Em ambos os caso, mais do que atribuir um valor a um endere co
o que esta sendo feito e associar um endere co a uma variavel. De
agora em diante mudan cas de valores em num sao automaticamente
associadas com o endere co &numptr.
explicitar o endere co.

E feito com o operador &.


ir buscar um valor associado ao endere co apontado.

E feito com o operador *


Opera coes aritmeticas com ponteiros.
Por razoes obvias, so ha duas opera coes que se podem fazer com ponteiros:
somar ou subtrair um n umero inteiro.
Ponteiro e endere co, e da mesma forma como nao teria sentido somar en-
dere cos de casas, nao tem sentido somar ponteiros, mas tem sentido somar um
n umero inteiro
18
a um ponteiro, ou subtrair.
Como um endere co e um n umero inteiro, c permite somar dois ponteiros.
Quando isto e feito, na verdade esta sendo somado o espa co ocupado por uma
variavel a um deteminado endere co.
Tambem a unica opera cao l ogica natural com ponteiros e a compara c ao para
determinar a igualdade ou uma desigualdade entre os valores para os quais eles
apontam.
18
como teria sentido somar ao endere co de uma casa 10 ou 20 metros para indicar onde
come ca a pr oxima casa, o mesmo se passa com os ponteiros e o tamanho do tipo de dado...
154 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
Exerccios: 40 Ponteiros
1. Rode e leia pont3.c, e faca o que o programa pede, e volte a rodar o
programa.
2. O programa pont4.c n ao pode ser compilado. Veja qual o erro e o corrija.
Depois de corrigido, rode o programa. N ao altere o programa, mude-lhe o
nome.
3. Altere o valor da vari avel em pont4.c e volte a rodar o programa. Altere
o valor da vari avel colocando nela uma frase que tenha sentido, volte a
rodar o programa.
4. Acrescente a mudanca de linha no comando de impress ao de pont4.c,
dentro do loop, e volte a rodar o programa.
5. Verique porque pont5.c n ao roda, corrija-o e depois rode o programa. A
soluc ao se encontra no comentario do programa.
6. Traduza para o ingles todos os programas da suite pontXX.c.
7.4 Manipulando arquivos em disco
Arquivos s ao um objeto ao qual est ao associados cinco metodos mais impor-
tantes:
fopen() abrir
fclose() fechar
fclose(arquivo,r) abrir para ler (read r)
fclose(arquivo,w) abrir para escrever (write w)
fclose(arquivo,a) abrir para acrescimos (append a)
fprintf() e a irm ao de printf() para enviar dados para arquivo em
disco.
fgets() faz leitura vinda de um arquivo. Observe a mudan ca na sin-
taxe.
A fun cao fopen() tem um papel especial aqui, veja os detalhes tecnicos nos
programas
leitura com fgets() prog20 X.c
escrita com fprintf() em agend4.c
Ha duas formas de usar fopen(). Uma simples:
fopen(nome do arquivo, w|r|a)
voce deve escolher um dos metodos w,r,a e uma outra forma mais algebrica
em que nome do arquivo e uma variavel e contem o nome do arquivo.
Se habitue de escrever sempre a companheira de de fopen(), a fun cao
fclose(nome do arquivo) na linha de baixo, assim que usar fopen(), para
evitar de esquecer.
7.5. MATRIZ, (ARRAY) 155
Nao fechar um arquivo pode deixa-lo corrompido.
A sequencia de programas prog20 X.c mostra a evolu cao de tentativas para
ler dados gravados num arquivo em disco, voce deve roda-los e ler os comentarios
que explicam porque os programas falharam. Sempre, o programa de maior
ndice e o programa mais correto da suite considerada.
Exerccios: 41 Uso de arquivos em disco
1. O programa prog20.c est a errado, ignore isto inicialmente. Leia, rode
e leia o programa para entender como ele funciona. Leia os coment arios
e se precisar, faca pequenas modicac oes com o objetivo de entender o
programa e faze-lo funcionar (n ao se esqueca de trocar-lhe o nome).
2. prog20.c n ao diz quantas ocorrencias foram encontradas da palavra es-
colhida. Altere isto para car sabendo quantas vezes aparece a palavra
escolhida, e apenas um erro de portugues...e claro, o resultado errado est a
tambem neste ponto!
Soluc ao prog20 7.c
3. O programa prog20.c est a fazendo uma estatstica errada. Tente desco-
brir o erro.
7.5 Matriz, (array)
Tabela de dados.
H a dois tipos de dados em C para tabular dados:
1. As matrizes, (arrays);
2. As estruturas (structs).
Neste par agrafo vamos estudar as matrizes, e no seguinte as estruturas.
As matrizes sao uma das inven coes mais antigas da matem atica moderna
19
.
Veja um exemplo:
/ =

1 2 3 1
2 1 3 2
2 1 3 2

(7.3)
A matriz / tem 12 elementos distribuidos em tres linhas e quatro colunas.
Cada linha tem quatro colunas, ou vice-versa cada coluna tem tres linhas.
Esta indecisao sob a forma de ver a distribui cao dos elementos de / for cou
uma conven cao chamada lico (linha-coluna). Por esta conven cao vamos ver
uma matriz como formada por linhas e as linhas formadas por colunas. Desta
forma o endere camento dos elementos na matriz ca denido:
19
Se voce de fato exigir uma deni c ao de matem atica moderna, que tal dizer que e aquela
que estamos usando e construindo hoje...
156 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
/
3 4
= 2
enquanto que que /
4 3
nao existe nesta matriz. A nota cao acima e matematica.
Em c diremos:
/[3][4] = 2;
ou melhor, podemos
20
atribuir o valor 2 `a posi cao 3, 4 da matriz /.
c entende as matrizes de modo diferente do que fazem as demais linguagens
de programac ao. Compare com os vetores de caracteres (strings) que
tambem sao matrizes.
As matrizes em c sao endere cos, portanto ponteiros. A declara c ao de
uma variavel do tipo matriz se faz assim:
float A[30][20];
ou mais genericamente:
tipo_de_dado identificador[num_lin][num_col];
Veja no programa-errado texto.c a deni cao da vari avel palavras, ob-
serve como falamos: a vari avel palavras. O identicador e palavras e nao
palavras[80][5].
Vamos insistir na observa cao que zemos acima, de que as matrizes em c
s ao ponteiros e corrigir o erro acima a respeito da atribui cao.
Veja as duas linhas seguintes de codigo para fazer atribui coes de valores `as
matrizes. Suponha que palavras represente uma matriz denida assim:
int palavras[10][5];
Vejamos agora como se fazem atribui coes de dados nos elementos das ma-
trizes:
Forma errada de atribuir valor ao endereco [i][j] :
fgets(deposito, sizeof(deposito), stdin);
sscanf(deposito, "%s", &palavras[i][k]);
Forma certa de atribuir valor ao endereco [i][j] :
fgets(deposito, sizeof(deposito), stdin);
sscanf(deposito, "%s", palavras[i][k]);
sem o redirecionador de endere co porque
palavras[i][k]
20
falso..., veja logo abaixo como e que se fazem atribui c oes!
7.5. MATRIZ, (ARRAY) 157
ja e um endere co (ou um ponteiro).
Observa cao: 32

Indices em C
Se fossemos denir ndices terminariamos por escrever outro livro
21
...
Falando levianamente, digamos que ndexacao serve para estabelecer a correspondencia
entre elementos de dois conjuntos, (seria portanto uma especie de funcao? resposta: sim).
Mas em geral nao queremos ver os ndices desta forma e sim como uma especie de conta-
gem
22
.
Veja a matriz A da matematica. Dissemos acima que o elemento 3, 4 era o dois:
A
3 2
= 2.
Exatamente como os apartamentos de um predio de 3 andares em que houvesse 4 apar-
tamentos por andar, 3, 4 e o n umero de um apartamento. A vrgula dene uma sintaxe
separando o indicativo da linha do indicativo da coluna.
As matrizes sao a estrutura de dados das tabelas retangulares com m utiplas entradas em
que todas as entradas sao do mesmo tipo:
1. apartamentos;
2. n umeros
nos exemplos que demos acima. Na proxima secao veremos tabelas em que os elementos sao
de formato e tipo diferentes, as estruturas.
Vamos terminar esta observacao falando de uma peculiaridade da linguagem C. Os ndices
em C comecam de zero. Quer dizer, quando denirmos
floatA[4][7]
teremos os seguintes enderecos disponveis:

a
0,0
a
0,1
a
0,2
a0, 3 a
0,4
a
0,5
a
0,6
a
1,0
a
1,1
a
1,2
a1, 3 a
1,4
a
1,5
a
1,6
a
2,0
a
2,1
a
2,2
a2, 3 a
2,4
a
2,5
a
2,6

(7.4)
E o programador deve tormar cuidado para otimizar seu uso da memoria.
Se nao usar os ndices a partir de zero, estara deixando memoria desocupada, mas re-
servada.
A declara cao
int a[4][7];
separa na memoria 28 espa cos para n umeros reais, portanto 28 x 4 bytes =
112 bytes vai ocupar a matriz a na memoria do computador ou no disco.
Existe uma maneira de falar, resumida, que caracteriza o tamanho de uma
matriz e a disposi cao de suas linhas e colunas: dizemos que a e matriz 4 x 7,
que se le 4 por 7.
Deni cao: 1 Dimens ao de uma matriz De forma mais geral, diremos que uma
matriz a e n x m, ou n por m se ela tiver n linhas e m colunas. Isto e
tambem o que se chama de dimens ao de uma matriz.
Exerccios: 42 Matrizes em c
21
que esta observa c ao n ao o assuste, mas tambem que certo de que ndice e um assunto
complexo
22
ora, isto volta a ser fun c ao...
158 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
1. Escreva um programa criando uma matriz 3 x 4 de inteiros. Coment ario:
voce vai precisar de um while.
2. Quanto de mem oria ocupa uma matriz 3 x 4 de inteiros. Resp 48 bytes.
3. Quanto de mem oria ocupa uma matriz 3 x 4 de reais. Resp 384 bytes =
12 x 32 bytes.
4. Use um programa que avalie o uso da mem oria no computador que voce
estiver usando e veja qual e maior matriz de n umeros reais que um pro-
grama poderia manipular nesta m aquina. A resposta n ao e unica, veja
uma quest ao, nesta lista, sobre disquetes.
5. Quais s ao os tamanhos m aximos de matriz que podemos guardar num
disquete de 1.4kb ?
Solu cao: 1 fatorando 1440, temos 1440 = 2 x 2 x 2 x 2 x 2 x 3 x 3 x 5
que pode gerar os seguintes pares de fatores:
2 x 720; 4 x 360; 8 x 180; 16 x 90; 32 x 45
96 x 15; 288 x 5; . . .
Isto e, todos os pares x x y; x y = 1440.
6. Usando matrizes para textos, que horror!
(a) Analise o programa erradotexto.c, rode-o.
(b) O erro do programa texto.c se encontra demonstrado ao final
do mesmo, no ultimo laco. Analise o que esta acontecendo
e tente a correc~ao.
correc~ao em texto01.c.
(c) atribuic~ao de valor Troque, em texto.c
palavras[1]= "Marcar consulta com um especialista.";
palavras[2]= "Agendar algum exame de laboratorio.";
palavras[3]= "Marcar uma consulta de ret^orno.";
palavras[4]= "Bater papo `a-toa.";
por
strcpy(palavras[1], "Marcar consulta com um especialista.");
strcpy(palavras[2], "Agendar algum exame de laboratorio.");
strcpy(palavras[3], "Marcar uma consulta de ret^orno.");
strcpy(palavras[4], "Bater papo `a-toa.");
e compile o programa. Procure assimilar a mensagem de erro
que surge, ela lhe diz incompatible types in assignment
significando que a atribuic~ao (assignment) tenta associar
tipos de dados
23
incompatveis.
23
A mensagem e est upida, n ao s ao os tipos de dados que s ao incompatveis...
7.6. ESTRUTURA, STRUCT. 159
(d) Observe que texto.c se comp~oe de tres etapas bem marcadas:
i. dialogo com o usuario;
ii. uma entrada de dados;
iii. uma sada de dados.
Marque estas etapas com comentarios.
soluc~ao em texto01.c.
(e) Transforme cada uma das etapas do programa texto01.c em uma
func~ao, modularizando o programa.
soluc~ao em texto02.c.
7.6 Estrutura, struct.
Dados estruturados, foi o grito de guerra da ciencia da computa c ao na decada
de 70. Claro, hoje continuamos aquela tarefa com um tipo de estrutura c ao
mais aprofundada, orientacao a objetos. Vamos ver aqui como se estrutura
a informa c ao, em C e por que. Mas n ao chegaresmos a discutir orientacao a
objetos, que e tpica de linguagens como C + +, Python, Java, entre outras
menos populares.
Uma estrutura, (struct), e uma constru c ao, em C de um novo tipo de dados
formado de campos onde dados de tipo diferentes s ao guardados. Dissemos
dados de tipos diferentes porque, se os dados forem do mesmo tipo ser a melhor
usar vetor em vez de uma estrutura.
Exemplos de estruturas s ao as tabelas dupla ou m ultipla entrada, em que
cada coluna (ou linha) guarda um tipo de dado.
O tipo de dado struct, estrutura, em c se inspira nas tabelas de dupla
ou m ultipla entrada, em que cada coluna (ou linha) guarda um tipo de dado:
entrev. \ dados salario idade turno prossao especialidade bairro
Jose 500,00 27 m,t professor literatura Junco
Maria 600,00 31 t,n professora sociologia Centro
Joao 1.000,00 45 m,n professor matematica Centro
Francisco 800,00 35 t,n medico ginecologia Junco
que poderia ser uma folha de censo com as respostas dadas por 4 entrevistados.
Quer dizer que para este censo se considerou importante registrar os campos
salario, idade, turno, prossao, especialidade,bairro
como caracterstica de cada entrevistado. Um cidadao, para este censo, se
caracteriza pelas propriedades acima. Nao interessa aqui discutir se este censo
esta mal elaborado, e certamente esta. Nosso objetivo e considerar um exemplo
160 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
de tabela e ver como e construida para exibir o instrumento da linguagem C
que pode produzir tabelas.
Para que um entrevistador exer ca sua fun cao, ele deve ser informado sobre
quais os valores aceitaveis para cada campo. Por exemplo, no campo expedi-
ente dois valores devem ser dados, tirados de
m, t, n
m de manh a, t de tarde ou n de noite.
Voce encontra a deni cao e exemplo de struct dentro dos programas estruturaX.c
no disco. No diretorio do BC, estruX.c
Exerccios: 43 tabelas e censos
1. Rode e leia o programa cadast.c
2. Altere o programa cadast.c para registrar os dados de uma turma de
alunos, com os campos nome, nota1,nota2,nota3, media final.
3. Crie uma entrada de dados para o programa e uma sada de dados, se n ao
tiver feito ainda.
Da mesma forma temos, por exemplo, tempo. Tempo e uma estru-
turacom os seguintes campos:
dia da semana(0..6) dia do ano(0..365) segundos (0..59)
minutos(0..59) hora(0..23) dia do mes(1..31)
mes(0..11) ano(1900 ...)
Ao lado de cada variavel da estrutura tempo, e apenas para informac ao
do usu ario, se encontram os valores que foram planejados. Em geral nao e
conveniente criar as variaveis com tais restri coes do ponto de vista de seus
valores, embora isto seja possvel e crie mais seguran ca para o programa (e mais
trabalho para o programador que deve criar mecanismos de verica c ao para os
dados fornecidos ou lidos automaticamente).
De maneira analoga poderiamos ter construido a tabela do censo, indicando
com brevidade, usando codigos, as informa coes de cada campo. Para prossao,
poderiamos ter usado a codica cao da Receita Federal. Para salario poderiamos
ter usado inteiros indicando m ultiplos do salario mnimo.
Feita uma especica cao deste tipo e possvel guardar a informa cao de
forma compactada. Assim, no caso do tempo, o conjunto de dgitos
200007011331290346
representa um determinado instante na seq uencia do tempo e poderia ser re-
escrito, em formato de facil leitura, para humanos:
7.6. ESTRUTURA, STRUCT. 161
2000.07.01.13.31.29.03.46
ou usando outro qualquer tipo de separador como
2000/07/01 13.31.29 03.46
porque denimos uma estrutura para caracterizar o tempo e agora com um
programa podemos facilmente passar da expressao apropriada para humanos
para a expressao apropriada para calculos algebricos no computador e vice-
versa.
Uma rotina pode entao ser construida para fazer uma algebra de tempo para
somar, subtrair tempos permitindo que um programa possa calcular prazos de-
corridos, ou detectar se a data para um deteminado evento chegou.
O gcc previu estas duas formas de tratar o tempo, humano e interno para
c alculo com as m aquinas. Cabe ao programador construir a tradu cao adequada.
Da mesma forma um programa de computador pode agir sobre o censo
para dele extrair informa coes qualicadas sobre uma determinada regiao, como
salario medio, concentra cao prossional, etc... atraves de uma algebra ade-
quada para tratar estes dados.
Observa cao: 33 Codicac ao e leitura humana
Codica cao e assunto para computadores. Programas devem ser escritos
para uma f acil comunicac ao com humanos que lem frases, e n ao c odigos.
As traduc oes, codigo frases podem ser feitas facilmente com func oes
em qualquer linguagem de programac ao, desde que as frases se restrinjam a um
conjunto bem denido de palavras. Inclusive estas frases podem car guardadas
em arquivos no computador e serem escolhidas a partir de pedacos digitados pelo
usu ario, como acontece nos m odulos de pesquisa dos programas na Internet.
Internamente os programas v ao trabalhar com os codigos.
Depois desta breve apresentac ao generica sobre estrutura de dados
24
, va-
mos nos especializar em alguns casos. Voce pode encontrar um mundo de in-
formac oes a respeito no info, no manual sobre Libc, veja no ndice remissivo
info ou Libc.
Vamos adotar aqui uma terminologia para fazer referencia aos dois formatos
sob os quais o gcc processa o tempo.
tempo para leitura, chamado em ingles de broken time, porque ele se
apresenta em campos, como se encontra descrito a seguir;
tempo para calculos, que se apresenta em estado bruto, em segundos,
a partir de um momento que foi denido como epoch, a epoca.

E relativamente facil passar de um para o outro entre estes dois tipos de


sistemas de processamento de informa coes relativas ao tempo, no ggc. Se voce
24
h a livros inteiros, com mais de 200 p aginas sobre o assunto...
162 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
tiver tempo no formato bruto em segundos, tempo para calculos, contando
desde a epoca, basta sair sub-dividindo em aglomerados sucessivos de anos e o
resto em meses, e assim assim sucessivamente ate saber qual e a data que aquele
n umero representa.
Por outro lado, um inteiro bruto e facil de ser somado ou subtraido de outro
permitindo assim uma algebra do tempo simples. Veja um exemplo:
Exemplo: 13 Traduc ao e algebra de tempo
Queremos saber qual o tempo que se passou entre
nal; 10 de Dezembro de 1998
e
inicio; 15 de Outubro de 1994.
Traduzimos inicio e nal para tempo bruto. Nos parece mais f acil se es-
tabelecermos uma epoca particular, por exemplo, 01 de Janeiro de 1994 e
calcularmos o n umero de segundos contidos em 15 de Outubro de 1994:
inicio = 24969600
e depois, relativamente a mesma epoca calcularmos o n umero de segundo
contidos em 10 de Dezembro de 1998:
final = 156297600
A diferenca em segundos e:
lapso = final inicio = 131328000
que e o lapso de tempo decorrido em segundos, que agora vamos quebrar, como
dizem os americanos, em anos, meses, dias, minutos e segundos. Se for para o
c alculo dos juros de uma dvida, iremos desprezar minutos e segundos.
Para isto criamos novas vari aveis, ano, mes para conter o n umero de segun-
dos em ano comercial e no mes comercial que tem 30 dias, porque esta e regra
legal para o c alculo do tempo decorrido. Depois faremos divis oes sucessivas:
anos = lapso/ano = 4.16438356164383561643
que diz se terem passado 4 anos, isto
4 ano = 126144000
restando portanto
resto = lapso 4 ano = 5184000
e nalmente vamos ver quantos meses se passaram. Para isto deniremos a
variavel mes:
mes = 30 24 60 60
7.6. ESTRUTURA, STRUCT. 163
e depois calculamos
25
meses = resto/mes = 2
Sendo assim o tempo legal decorrido entre as duas datas de 4 anos e 2 meses.
Exerccios: 44 Estrutura e algebra com o tempo
1. Escreva uma func ao que, recebendo duas datas diferentes, calcule o lapso
de tempo decorrido entre elas.
2. Melhore a func ao construida usando uma epoca denida no programa.
3. Faca uma func ao que calcule os juros devidos para uma certa soma entre
dois perodos dados.
4. Faca um programa para cadastrar os funcion arios de uma empresa regis-
trando os dados:
Nome, idade, altura, peso
cada um destes dados numa nova linha no arquivo.
Solu cao: cadapesX.c.
7.6.1 O tempo para os
humanos lerem
Para expressar o tempo em forma legvel pelos humanos,
Para fazer calculos algebricos com o conceito de tempo
Neste se cao vamos trabalhar com a escrita do tempo para os humanos lerem
e deixar os calculos do tempo para a proxima.
Voce pode encontrar mais informa coes tecnicas no manual do gcc, veja Libc
no ndice remissivo.
Tipo de dados: struct *tm
Este tipo de dados contem os seguintes campos:
int tm sec que representa o n umero de segundos e varia de 0..59.
int tm min N umero de minutos ate completar uma hora, varia cao 0..59.
int tm hour N umero de horas a apartir de meia noite, varia cao 0..23.
int tm mday N umero dos dias do mes, varia cao 1..31.
int tm mon Numera cao dos meses do ano, varia cao 0..11.
int tm year Numera cao dos anos a partir de 1900.
25
observe que se trata de uma multiplica c ao para n ao escrever 2592000, que seria a quanti-
dade segundos, porem, indecifr avel...
164 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
int tm wday Numera cao dos dias da semana, domingo=0 (Sunday). Va-
ria cao 0..6
int tm yday Numera cao dos dias do ano, a partir de 1
o
de Janeiro, variando
0..365.
int tm isdst Uma etiqueta (ag) para indicar se esta em vigor o hor ario
de verao. Se estiver em vigor,
1. tm isdst=1, se estiver em vigor;
2. tm isdst=0, se nao estiver em vigor;
3. tm isdst=< 0, se a informa cao nao estiver disponvel;
long int tm gmto

E o n umero de segundos que mede o afastamento do horario local (algebrico)


do horario-gmt. Por exemplo, deve ser adicionado -4*60*60 para se cor-
rigir o horario de Brasilia relativamente ao GMT. Pertence a biblioteca
GNU-C e nao existe em um ambiente ISO C.
const char *tm zone Nome da zona de tempo em uso, tambem inexistente
no ISO C.
Fun cao:
struct tm* localtime (const time t *TIME)
Na variavel TIME se encontra o endere co onde esta armazenado o tempo,
a fun cao localtime converte o conte udo de TIME em sua representa c ao
de tempo para leitura, relativamente a zona de tempo registrada na
maquina.
A fun cao devolve um ponteiro para este valor do tempo que pode ser
utilizado para recupera-lo e fazer as transforma coes que se deseje, veja
o programa hora.c. Veja mais detalhes em Libc, ver info no ndice
remissivo ao nal do livro.
Leia (ou releia) o exemplo 13, pagina 162. Veja tambem os programas da
serie horaX.c em que voce pode encontrar dicas de como automatizar os
caculos feitos no exemplo citado.
Fun cao: struct tm * gmtime (const time t *TIME)
Semelhante `a fun cao localtime. A diferen ca e que o tempo se apresenta
no formato UTC
26
26
esta sigla representa um acordo entre franc ofonos e angl ofonos na divis ao do mundo.... os
franceses dizem Universel temps coordone e os americanos dizem Universal Time Coordinated.
Ambos aceitam perder um pouquinho da sintaxe nas respectivas lnguas,fala-se que os ingleses
queriam medir o tempo em pes.
7.7. FORMATADORES PARA SA

IDA DE DADOS 165


Fun cao: time t mktime (struct tm *BROKENTIME)
A fun cao mktime e usada para converter o tempo fracionado no tempo do
calend ario. Completa tm yday , e tm wday que estejam faltando a partir
dos demais dados, num processo de noramaliza cao. Se nao for possvel
restaurar o tempo para o formato do calendario, o valor de retorno sera
-1. Esta fun cao tambem da valor a variavel tzname - nome da zona de
horario.
7.6.2 O tempo para o
computador fazer algebra
O exemplo 13, pagina 162 se constitue na motiva cao desta se cao.
Voce pode encontrar mais informa coes tecnicas no manual do gcc, veja Libc
no ndice remissivo.
Exerccios: 45 Estruturas
1. Verique que o programa texto.c usa indevidamente a tipo de dados
array, transforme-o usando struct que e tipo de dados natural para um
tal programa.
7.7 Formatadores para sada de dados
Nesta se c ao nal reunimos as informa c oes sobre como formatar os dados basicamente para
as fun c oes printf(), fprintf(), scanf(), sscanf().
Vamos aqui aplicar o assunto tipo de dados em dois dos momentos mais crticos de um
programa, na sada e na entrada de dados.
Dominando o uso destas fun c oes, vove estar a fazendo um tutorial pr atico sobre tipos de
dados.
Nesta se cao vamos estudar mais detalhadamente a sintaxe para a conversao
da dados necessaria para que
printf(), fprintf(), scanf(), sscanf()
leia ou escreva os dados de forma agradavel, ou no caso de scanf consiga inter-
pretar os dados que lhe forem oferecidos.
Apesar da posi cao deste captulo no livro cabe aqui uma apresenta cao expli-
cita destas fun coes, porque voce pode estar aqui de visita, vindo das primeiras
paginas do livro incentivado pela indexa cao do assunto.
Vocabulario: 7 printf(), fprintf(), scanf(), sscanf()
printf() Sada de dados.

E a func ao que imprime dados na tela e
que n os traduzimos por imprima() ou escreve().

E bastante complexa
porque admite uma grande quantidade de par ametros permitindo organizar
de forma perfeita a saida de dados na tela ou em papel.
166 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
fprintf() Sada dados.

E a func ao que imprime dados em um arquivo,
fprintf.
O primeiro f do nome quer dizer isto.

E muito semelhante printf(),
mas com diferencas especcos, voce vai ter que lhe dizer em que arquivo
as coisas devem ser impressas. Tambem voce vai ter que dizer de onde vem
as coisas. Veja nos programas agend1.c exemplos de uso desta func ao.
scanf() Entrada de dados.

E a func ao ultra-poderosa, ultra-simples e
sensvel para fazer entrada de dados. Tem uma sintaxe semelhante a de
printf(). Enquanto voce n ao tiver uma boa experiencia evite de usar
esta func ao.
Use sscanf() que e mais burocr atica, porem mais segura.
sscanf() Entrada de dados.

E a func ao muito poderosa para fazer
entrada de dados. Tem a mesma capacidade de scanf() porem sua sin-
taxe conduz melhor o programador a evitar os erros. Veja no arquivo
entra dados.c exemplo de uso desta func ao junto com fgets().
Vamos nos concentrar em printf uma vez que vale o que dissermos tambem
para fprintf e, em alguma medida, tambem para scanf. Vamos discutir as
diferen cas.
A gura (g. 7.2) pagina 166, mostra um exemplo e xa a terminologia que
vamos usar.
formatadores
a "stream"
printf("Vamos imprimir %d na base oito: %o \n", 30,30);
printf("%s %d %s %o \n",
"Vamos imprimir o nmero",
30,
"na base oito ",
30);
parmetros
4
2
Figura 7.2: duas formas equivalentes para imprimir 30 na base 8
7.7. FORMATADORES PARA SA

IDA DE DADOS 167


Dois metodos para formatadar os dados:
Os formatadores de dados imersos num vetor de caracteres.
O exemplo da (g. 7.2) mostra que os formatadores de dados podem
estar distribuidos (imersos) dentro de um vetor de caracteres oferecido
a printf que entao completara este vetor de caracteres expandindo
os correspondentes formatadores de dados na ordem em que eles forem
encontrados. A mascara se chama em inges, stream contem os formata-
dores sendo seguida por uma lista de parametros. Ver numero01.c como
exemplo deste metodo.
Os formatadores de dados numa mascara que tudo dene. Uma outra forma
de fazer, consiste em, escrever todos os formatadores de dados como um
primeiro parametro, chamado modelo, em ingles template, e fornecer, se-
parados por vrgulas, os correspondentes dados. Ver prog20.c, ao nal,
como um exemplo deste metodo. Leia inclusive a observa cao (20) ao nal.
A formata cao de dados da fun cao printf() tem a seguinte estrutura:
%modificadores tamanho [ . precisao] tipo de convers~ao
Veja os exemplos: nas guras (g. 7.3), (g. 7.4).
; x
3.14159265358979323848
; msg = "O valor de pi "
; printf("%s %25.15f \n",msg,x)
O valor de pi 3.141592653589793
; printf("%s %20.15f \n",msg,x)
O valor de pi 3.141592653589793
; printf("%s %15.15f \n",msg,x)
O valor de pi 3.141592653589793
; printf("%s %25.5f \n",msg,x)
O valor de pi 3.14159
f indica
tipo float
25.15
20.15 indicam
15.15 espao e
25.5 preciso
vetor de caracteres
s indica
Figura 7.3: Formata c ao de dados em printf()
Leia e rode o programa format1.c.
Da mesma forma como diversos tipos de dados podem ser impressos tambem
diversos formatadores, com seus espa camentos especcos podem ser includos
168 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
# include <stdio.h>
int main()
{
float x=3.141516171788;
char msg[50]="O numero pi aprox. ";
printf("%s %25.8f \n", msg,x);
printf("%s %25.18f \n", msg,x);
printf("O nmero pi aprox. %5.18lf \n",x);
printf("O nmero pi aprox. %lf \n",x);
printf("%s %5.5e \n", msg,x);
printf("O nmero pi aprox. %5.5lf \n",x);
return 0;
}
sada de dados
O numero pi aprox. 3.14151621
O numero pi aprox. 3.141516208648681641
O nmero pi aprox. 3.14151621
O nmero pi aprox. 3.141516
O numero pi aprox. 3.14152e+00
O nmero pi aprox. 3.14152
Figura 7.4: Uso de printf()
num vetor de caracteres, apenas observada a ordem com que eles sejam forne-
cidos. Rode e analise os dois programas citados e assim como os programas
formatoXX.c. Veja tambem formatadores no ndice remissivo deste livro.
Se voce desejar imprimir algum caracter especial, como %, em libc voce
vai ver como. Em particular % sera impresso pela linha de comando abaixo:
printf(O percentual do candidato X e %2.2f%%n);
Exerccios: 46 Formatac ao de dados
1. Leia e rode o programa format1.c
2. Altere o programa format1.c substituindo x = 3.141516171788 por x =
3.14 e analise o resultado.
3. Altere o programa format1.c substituindo %f por %lf e analise o resultado.
Solu cao: format2.c Veja a observac ao sobre aproxima cao arranjada
pelo compilador
4. Escreva um programa, format3.c para imprimir o smbolo % depois de
um n umero real (oat).
5. Altere o programa que voce acabou de fazer para que a frase anunciando
a inac ao do mes esteja na primeira linha e na segunda linha o ndice de
inac ao.
Solu cao: format3.c
7.7. FORMATADORES PARA SA

IDA DE DADOS 169


6. Crie vari aveis inteiras e use o coringa * para usar um formato vari avel
para imprimir espaco e precis ao de dados. Sugest ao: use um loop.
Solu cao: format4.c
7. Faca um programa que leia, com scanf() um n umero inteiro, um n umero
real (float), e imprima estes n umeros em duas linhas distintas com a
mensagem que indicando o tipo de n umero.
Solu cao errada em format5.c
8. Conserte o prorama errado format5.c.
Solu cao: format6.c
Observa cao: 34 Aproximacoes arrumadas pelo compilador
O programa format2.c exibe, p oe em evidencia, erros que o compilador insere nos n umeros.
Rode novamente o programa e o leia novamente tambem para entender o que dissemos.
Nao vamos apresentar uma solucao para este problema aqui, ela seria complicada para o
nvel do texto, mas obviamente que ela existe. Somente queremos alerta-lo para os erros de
arredondamento que o compilador produz, que precisam car sob controle.
Exerccios: 47 Acesso ao disco - fprintf()
1. Leia o programa cadast.c e registre a sintaxe da func ao fprintf(), se-
melhancas e dissemelhancas com printf().
2. Leia e rode o programa cadast.c, use nomes completos, nome e sobre-
nome
3. Leia o arquivo que voce tiver indicado para receber os dados e veja que
os dados foram truncados: foi gravado somente o primeiro nome de cada
funcion ario.
4. Troque converte palavra() ( sscanf()) por concatena palavras() (str-
cat()) e rode novamente o programa. Veja que os nomes foram guardados
completamente.
Soluc ao: cadapes3.c
5. Estude a suite de programas cadapesX.c rodando e lendo sucessivamente
os programas. Faca alterac oes nos programas para incluir mais dados no
cadastro de funcion arios.
6. Use o programa cadapes3.c para construir a sua agenda pessoal de en-
derecos com os campos: nome, endereco, telefone xo, telefone celular,
(outros dados que lhe parecerem importantes).
Soluc ao: agend1.c
7. O programa agend1.c tem um bloco com o coment ario isto e um teste,
deve ser apagado. Procure o coment ario e veja que a sintaxe de fprintf()
e semelhante a de printf(). Analise a diferenca.
170 CAP

ITULO 7. OS TIPOS B

ASICOS DE DADOS
8. A func ao sprintf() permite a composic ao autom atica de vetores de ca-
racteres(dentro de um programa). Ver compos autom.c. Altere agend.c
para vericar se o arquivo j a existe e usar um nome diferente.
sprintf(deposito, %s %d,NOME ARQ,extensao)
Dena convenientemente extensao, de lhe um valor adequado.
Soluc ao: agend3.c
O manual do gcc alerta que a func ao sprintf() e perigosa, o pr oximo
exerccio oferece uma alternativa.
9. Refaca a quest ao anterior usando strcat()
Soluc ao: agend4.c
Vocabulario: 8 sprintf(), fprintf()
Primeiro, deixe-nos lembr a-lo uma fonte de consulta, ajuda, . No sistema
info, digite esta palavra numa shell (em LinuX, obviamente), seguida de libc:
info libc
e voce tem um manual da linguagem c. Com a barra \ voce faz pesquisa de
palavras e o info vai abrir no pe da area de trabalho uma janela onde voce pode
digitar o nome de uma func ao da linguagem, por exemplo, sprintf. Tente.
Este livro teria 1000 p aginas se fossemos explicar tudo que existe. E para
que repetir, se o que existe e excelente. O nosso objetivo e condu-lo, pedagogi-
camente, pelo que j a existe.
sprintf()
int sprintf (char *S, const char *mascara, ...)
Semelhante a printf() mas guarda os dados no vetor de caracteres S. Ter-
mina os dados com o caractere NULL.

E uma func ao inteira devolvendo
o n umero de caracteres colocados em S menos um do NULL. O NULL n ao
e contado. Ver agend3.c. N ao oferece protec ao contra gravac ao de um
vetor de dados que supere o tamanho de S. Usar com cuidado.
fprintf()

E a sada de dados padr ao para arquivos em disco. Semelhante
a printf() com a diferenca de que o primeiro par ametro e do tipo FILE,
para onde s ao dirigidos os dados. Ver agend.c
Captulo 8
Matematica em c
Neste captulo, o primeiro par agrafo e um breve guia de referencia da lin-
guagem C especco para o assunto do captulo, onde voce poder a encontrar
rapidamente informa c oes sobre o uso das ferramentas da linguagem.
Aqui operadores aritmeticos e l ogicos.
Podemos fazer muita matematica com c e vamos deixar-lhe uma pequena
amostra do que e possvel fazer.
Em c podemos fazer programas para determina cao de codigos, ou melhor,
para valida cao de codigos.. Os programas que executam estas tarefas sao bas-
tante complicados porque fazem opera coes de compara cao com vetores de carac-
teres, uma pequena amostra disto se encontra no programa sexto06.c, usando
grep senha *.c
voce pode encontrar outros programas nossos que dao exemplos de compara cao
entre palavras. Mas codigos sao mais do que senhas, e pode ser uma aritmetica
muito pesada, nao vai ser possvel desenvolver tais programas aqui.
Vamos apresentar-lhe uma matem atica mais simples:
como calcular aproximadamente integrais;
o metodo para calculo de integrais que vamos usar chama-se somas de
Riemann, nao e o melhor nem o mais rapido, tem coisa melhor, mas os
outros partem deste, como se tratam de somas, antes aprenderemos a fazer
somas;
para fazer somas, precisamos de varreduras, antes aprenderemos a fazer
varreduras que tambem se encontra no caminho para fazer gr acos.

E o que faremos aqui.


171
172 CAP

ITULO 8. MATEM

ATICA EM c
8.1 Operadores aritmeticos e logicos
Este captulo se dedica ` a aritmetica em C mas e impossvel escrever um programa sem
usar operadores l ogicos, vamos, portanto, misturar os operadores aritmeticos e l ogicos neste
contexto.
Aritmetica e logica
Falamos de operadores na linguagem c de modo semelhante como se diz em
Matematica, opera cao:
em Matematica escrevemos a + b e dizemos que a opera cao de adi cao
entre os n umeros a, b. Voce executou uma opera cao matematica.
em Computa cao dizemos que o operador + se aplica aos n umeros 3, 4
(3, 4) 3 + 4;
e escrevemos apenas 3 + 4.
Mas quando voce, num programa, executar
x = 3 + 4;
nao e uma opera cao matematica que estara sendo executada e sim
primeiro a opera cao matematica 3 + 4, porque as senten cas, em c, s ao
executadas da direita para a esquerda, como em japones, e de dentro para
fora, se houver parenteses;
depois foi executada uma opera cao interna de registro de dados, guardando
na variavel x o valor calculado anteriormente
Previamente a variavel x deve ter sido denida;
agora o n umero inteiro 7 esta sendo sendo associado `a vari avel x.
Em Matematica, e porque os humanos sao inteligentes e conseguem deduzir
a confus ao de dados a partir do contexto, confundimos duas opera coes:
1. Associa cao de dados, que e feito em computa cao em c com o smbolo
=
2. Teste logico, que em Matematica se usa o mesmo smbolo, mas em c se
usa o smbolo ==
8.1. OPERADORES ARITM

ETICOS E L

OGICOS 173
Em Matematica, a expressao
3x + 4 = 0
e uma senten ca dita aberta, e com isto se quer dizer, podemos testar se um
determinado valor dado `a variavel x torna esta senten ca verdadeira ou falsa.
Em c nao teria sentido escrever esta expressao sem primeiro atribuir um valor
a x. Em suma, em c podemos fazer:
x = 10; (8.1)
(3x + 4 == 0) (8.2)
para vericar se e verdadeira para o valor 10 dado a x. Observe os parenteses,
eles sao um operador da linguagemc, o operador avalia cao, eles for cam o calculo
do seu conte udo.
Veja o programa logica08.c a este respeito. Verique isto com calc, por
exemplo
1
, execute em calc as seguintes linhas:
x=3
3*x+4==0
Depois de digitada a ultima linha, calc respondera com 0 porque tera veri-
cado que `a direita e `a esquerda de == se encontram objetos diferentes:
13 = 3x + 4 ,= 0 3x + 4 == 0 e falso.
Em Matematica estas diferen cas suts tem que ser determinadas a partir do
contexto pelos humanos. Em c, cujos programas sao escritos para as maquinas,
estes detalhes tem que ser cuidadosamente diferenciados.
O exemplo acima mostra que nao sera possvel falarmos de aritmetica sem
mencionar a logica. Embora este captulo esteja dedicado `a aritmetica, teremos
que mencionar os operadores logicos.
8.1.1 Uma lista seca de operadores
quase seca...
Em c existem alguns operadores, que vamos descrever detalhadamente abaixo
incluindo exemplos. Se voce tiver chegado ate aqui linearmente, muitos deles
ja serao seus conhecidos, porque voce os encontrou nos programas.
1. !

E operador logico, not. O nao logico;
2. ! =

E nega cao do operador logico igual. O diferente de;
3. = nao e um operador aritmetico, e um comando da linguagemc algumas
vezes identicado como atribui cao. Sobre tudo observe que e diferente
de == que aparece mais abaixo.
1
na ausencia do calc, fa ca um pequeno programa contendo somente estas linhas, reserve
teste.c para isto
174 CAP

ITULO 8. MATEM

ATICA EM c
4. % O operador mod, e a divisao inteira. As duas formas abaixo
sao equivalentes:
r = mod(a, b) r = a%b;
tem como resultado o resto na divisao de a por b.
int resto(int a, int b)
{
printf("O resto na divisao de %d por %d e %d ",a,b,mod(a,b))
return 0;
}
resto(4,6) -> O resto na divisao de 4 por 5 e 4.
Ha diversas aplica coes para esta fun cao, uma delas na valida cao de codigos,
como CPF em que o dgito pode ser o resto na divisao do n umero for-
mado pelos outros algarismos por um quociente escolhido. Assim se pode
vericar se um n umero apresentado como CPF tem legitimidade ou nao. O
quociente, o segundo parametro em mod(a,b), deve ser grande, em geral,
para aumentar a seguran ca, ou diminuir a chance nas tentativas falsas.
5. / A divisao comum se faz com o operador / e ainda ha uma divisao
inteira que com o operador //. Assim, o resultado do seguinte teste sera 1
6. //
(8//5) 5 + mod(8, 5) == 8
8//5 calcula o quociente na divisao de 8 por 5 e mod(8,5) calcula o resto
nesta divisao. A expressao do teste e a equa cao da divisao euclidiana:
divisor quociente + resto = dividendo.
Se voce copiar esta expressao para a folha do calc, ao dar enter ter a
como resposta:
1
porque a avalia cao logica entre as duas expressoes resultou em verdadeiro.
7. O operador multiplica cao;
Este operador e da multiplica cao em c como na maioria das linguagens
de programa cao.
Como a adi c ao, se parece com a multiplica cao da Matematica.
Se parece porque em Matematica, sempre podemos calcular a b dados
dois n umeros. Em c, depende do limite na memoria do computador.
Este seria um dos diferenciadores, c foi projetado para trabalhar com
n umeros inteiros dentro de uma faixa de grandeza. Alem desta faixa de
grandeza os resultados voltam a se repetir ciclicamente.
8.1. OPERADORES ARITM

ETICOS E L

OGICOS 175
Por, exemplo, apenas para podermos exemplicar com valores pequenos,
suponhamos que o c com que voce estivesse trabalhando se encontrasse
limitado aos inteiros de 9 ate 9. Neste caso,
3 2 = 6;
3 5 = (15 9) = 4;
3 6 = 0
Porque este seu c faria as contas e usaria o noves fora para dar a res-
posta, mas aceitando resultados entre 9 e 8.
8. + O operador adi cao;
Este e operador de adi cao valendo os mesmo comentarios que zemos com
respeito `a multiplica cao comparada com esta opera cao na Matem atica.
9. ++

E o operador incremento. Fica denido pela seguinte identidade:
(a + +) e identico a (a = a + 1)
Duas variantes deste operador: =+, =que exigem um parametro numerico.
=+ Sintaxe: x=+numero equivale a x = x + numero
= Sintaxe: x=numero equivale a x = x numero
Observe que se oat x, c prossegue somando uma unidade a x.
10. O operador subtra cao;
Este e operador de subtra cao valendo os mesmo comentarios que ze-
mos com respeito `a multiplica cao comparada com esta opera cao na Ma-
tematica.
11. O operador decremento;

E semelhante ao ++ para fazer subtra coes.


Sintaxe x equivale a x = x 1 Ver =.
12. > Operador para acessar um elemento de uma classe ou de uma es-
trutura;
13. / O operador divisao ;
Este e operador de divisao inteira quer dizer que a/b calcula apenas o
quociente na divisao entre os dois n umeros inteiros a, b. Se um dos n umeros
for do tipo float o operador imediatamente se acomoda ao tipo mais
amplo, oat tendo como resultado o n umero racional
a
b
.
Alem disto valem os comentarios que zemos com respeito `a multiplica cao
comparada com esta opera cao na Matematica.
176 CAP

ITULO 8. MATEM

ATICA EM c
14. < Operador logico menor do que ;

E um operador logico, quando c avalia a < b o resultado sera 0 ou 1


conforme esta expressao seja falsa ou verdadeira.
15. << Operador shift `a esquerda ; Voce vai precisar deste operador
quando seus programas se tornarem mais sosticados. Serve para agilizar
opera coes aritmetica e logicas.
Se voce conhece (viu) aquelas antigas maquinas de calcular com manivela
e duas orelhas que permitiam correr o carro para direita ou para esquerda,
entao voce tem aqui um exemplo computacional... << corre o carro para
esquerda. Por exemplo, 4 100 `a direita a expressao deste n umero em
binario. 4 << 1 100 << 1 = 1000 8 aumenta uma casa positional
no n umero (em seu formato binario).
Exemplos:
3 11 3 << 1 11 << 1 = 110 6
4 100 4 << 1 100 << 1 = 1000 8
8 1000 8 << 1 1000 << 1 = 10000 16
7 111 7 << 1 111 << 1 = 1110 14
5 101 5 << 2 101 << 2 = 10100 20
7 111 7 << 2 111 << 2 = 11100 =
10000 + 1000 + 100 16 + 8 + 4 = 28
Nas equa coes acima estamos usando para traduzir, nos dois sentidos,
de decimal para binario ou vice-versa.
Veja que em a << b, exatamente, o carro anda b casas posicionais para
esquerda, sempre na expressao binaria do n umero a.
Observa cao: 35 Para que servem as operac oes bin arias
S ao operac oes de baixo nvel e consequentemente muito r apidas. Os
dois operadores shift (translac ao) podem ser utilizados para multiplicar
ou dividir. S ao usados em c alculo l ogicos tambem uma vez que eles se
aplicam aos caracteres.
16. >> Operador shift `a direita ; Voce vai precisar deste operador quando
seus programas se tornarem mais sosticados. Serve para agilizar opera c oes
aritmetica e l ogicas.
Aqui voce tem o operador que corre o carro para a direita. Consequen-
temente ele e destrutivo (o que nao acontece com as maquinas de balcao
em que simplesmente o carro nao corre alem do limite fsico).
8.1. OPERADORES ARITM

ETICOS E L

OGICOS 177
a >> b corre o carropara direita, o n umero de casas indicadas pelo
paracimetro b, ate consumira.
Por exemplo, 4 100 `a direita a expressao deste n umero em binario.
4 >> 1 100 >> 1 = 10 2 aumenta uma casa positional no n umero
(em seu formato binario).
Exemplos:
3 11 3 >> 1 11 >> 1 = 1 1
4 100 4 >> 1 100 >> 1 = 10 2
8 1000 8 >> 1 1000 >> 1 = 100 4
7 111 7 >> 1 111 >> 1 = 11 3
5 101 5 >> 2 101 >> 2 = 1 1
7 111 7 >> 2 111 >> 2 = 1
Nas equa coes acima estamos usando para traduzir, nos dois sentidos,
de decimal para binario ou vice-versa.
Veja que em a >> b, exatamente, o carro anda b casas posicionais para
esquerda, sempre na expressao binaria do n umero a.
17. <= Operador logico menor ou igual a;
Associa `a expressao a <= b um dos valores 0, 1 conforme ela seja verda-
deira ou falsa considerando os dados guardados nas variaveis a, b.
Algumas vezes os programadores sao tentados a deixar dentro dos progra-
mas chaves secretas que eles conhecem.

E uma forma de garantir que
ninguem venha a substitu-lo na manuten cao de um programa.
Veja esta forma maldosa de atribuir zero a uma variavel
a = (5 <= 3);
Como 5 <= 3 sera avaliada como falsa, o resultado, depois de calculados
os parenteses, e zero que sera atribuido `a variavel a. Esta linha perdida
entre uma centena de linhas, e uma chave secreta violenta.
Pessimo exemplo, nao siga. Mas eventualmente ele pode ser util, neste
caso coloque comentarios dizendo o que esta fazendo.
18. == Operador logico igual;
Diferente de =.
a == b serve para testar se a e igual a b.
19. > Operador logico maior do que ;
Releia <= substituindo este por > com a leitura adequada....
178 CAP

ITULO 8. MATEM

ATICA EM c
20. >= Operador logico maior ou igual a;
Releia <= substituindo este por >= com a leitura adequada....
21. ? : Condicional dentro de uma expressao;
De mau estilo, torna o programa ilegvel. Veja o segmento de programa:
a = 3;
b = 7;
a > b? imprima(verdade):imprima(falso);
falso
ou ainda
a > b? imprima("verdade"):imprima("falso");
Equivale a se() ou entao, portanto use o se() ou entao.
22. O operador bit-logico xor (ou exclusivo);
23. Chaves - para delimitar blocos logicos de um programa;
24. [ O operador bit-logico or (ou) ;
25. [[ O operador logico or (ou) ;
26. O operador bit-logico nao (calcula o complemento de todos os bits,
onde estiver 0 coloca 1 e vice versa.) ;
8.2 Equacao do segundo grau
Vamos analisar a sucessao de programas prog6101.c ... prog6104.c que resolvem
equa coes do segundo grau. O programa prog6101.c e programa que foi feito
inicialmente sendo os demais evolu coes que ele sofreu. O prog6104.c e o top
de linhasendo um programa modularizado e com um lay-out agradavel para o
usuario. A recomenda cao e que voce primeiro rode os programas e depois os
estude.
Observa cao: 36 Compilando programas matem aticos
Se voce compilar com a linha de comandos:
gcc -Wall prog6101.c -oprog
o compilador vai emitir uma mensagem de erro dizendo desconhecer a func ao
pow. Isto acontece porque as func oe matem aticas implementadas pela Fundac~ao
Gnu sofreram uma compilac ao particular que as torna mais r apidas sendo ne-
cess ario fazer referencia a um tipo particular de acesso ` a biblioteca matem atica:
8.2. EQUAC

AO DO SEGUNDO GRAU 179
gcc -Wall -lm prog6101.c -oprog
com a instruc ao de compilac ao lm Experimente os dois modos de compilac ao
para ver o resultado.
Vamos discutir aqui o mais simples dos programas apenas, o primeiro deles.
Um programa que resolva equa coes do segundo grau deve, sequencialmente,
efetuar as seguintes opera coes:
Dialogo inicial Mostrar o formato da equa cao para estabelecer uma lin-
guagem de comunica cao (qual e o coeciente do termo do segundo grau,
do primeiro grau e do termo independente);
imprima("ax
2
+ bx + c = 0 n ");
imprima("Forneca-me os coeficientes -> a, b, c n");
Entrada de dados Ler os coecientes que o usuario ira digitar pelo teclado;
leia(deposito, tamanho do(deposito), entrada pdr);
converte palavra(deposito, "%f", &a);
leia(deposito, tamanho do(deposito), entrada pdr);
converte palavra(deposito, "%f", &b);
leia(deposito, tamanho do(deposito), entrada pdr);
converte palavra(deposito, "%f", &c);
A fun cao
leia(deposito, tamanho do(deposito), entrada pdr);
aguarda que algum dado seja fornecido pelo teclado. O usuario pode
responder com qualquer coisa, mesmo absurda.
A fun cao seguinte
converte\_palavra(deposito, "%f", &a);
toma o conte udo de deposito e vai lan ca-lo na variavel a. Eu ja tenho
gravado em disco um pequeno arquivo chamado entra dados em que
estas duas linhas se encontram gravadas e simplesmente eu as copio para o
programa que estiver fazendo quando quiser fazer uma entrada de dados.
Sempre uso a mesma variavel deposito com esta nalidade. Se eu me
esquecer de fazer a declara cao palavra deposito[80] o compilador vai
me anunciar este erro dizendo-me que a fun cao deposito esta sendo
denida implicitamente que signica que ele a desconhece...
algoritmo Calcular o delta para decidir se a equa cao tem solu coes reais
e quantas sao; delta = b*b - 4*a*c;
algoritmo Separar em tres op coes os calculos, dependendo do valor do
delta com uma mensagem adequada para cada caso. Veja na gura (g.
8.1) pagina 180,
180 CAP

ITULO 8. MATEM

ATICA EM c
se (delta >= 0)
inicio
delta = pow(delta,2);
if (delta == 0)
inicio
raiz1 = b/2*a;
imprima("Ha uma unica raiz: %f \n", raiz1);
imprima("\n ");
fim
ou\_entao
inicio
raiz1 = (b delta)/2*a;
raiz2 = (b + delta)/2*a;
imprima("As raizes sao \%f e \%f$\backslash$n ", raiz1, raiz2);
fim
fim
ou\_entao
inicio
imprima("A equacao eh impossivel no campo real $\backslash$n ");
fim
Figura 8.1: Equa c ao do segundo grau
O resultado desta analise e o programa prog6101.c. Rode primeiro o pro-
grama para ver seu funcionamento, depois leia o programa e verique que as
etapas acima descritas se encontram executadas.
Exerccios: 48 Equac ao do segundo grau
1. Rode o programa prog6101 e verique que o c odigo tem um defeito grave,
o usu ario ca sem saber o que deve fazer, porque o programa n ao o informa
de que se encontra ` a espera de uma entrada de dados. Corrija isto.
Soluc ao prog6102
2. Rode programa prog6101 com uma equac ao simples (que voce conheca as
raizes), verique que o programa calcula errado. Corrija o programa.
3. Rode o programa prog6102 em que o defeito de comunicac ao com o usu ario
foi corrigido. Mas verique que o programa continua calculando errado as
raizes. Corrija isto.
Soluc ao: prog6103.c
A soluc ao destes exerccios se encontram nos programas
prog6102.c prog6103.c prog6104.c
4. Corrija o di alogo na entrada de dados fazendo aparecer uma mensagem
indicando qual o coeciente que deve ser fornecido. Soluc ao prog6102.c
5. Estude o programa prog6103.c. Observe que nele foram incluidas as
func oes
mascara() logo no innicio.
obrigado(), apetecof(), copyleft() ao nal.
8.2. EQUAC

AO DO SEGUNDO GRAU 181
Rode o programa e veja o efeito destas func oes. Elas est ao denidas no ar-
quivo ambiente.h. Altere estas func oes (em ambiente) e roda o programa
para analisar os efeitos.
6. Altere as func oes obrigado(), apetecof(), copyleft() para atender
os seus interesses.
7. Estude o programa prog6104.c. Ele traz a seguinte inovac ao sobre
prog6103.c
modulariza as operac oes. O lay-out das comunicac oes com o usu ario
est a tambem melhorado.
8. Complete o programa prog6104.c para que ele resolva equac oes com soluc oes
complexas (n ao) reais. Acrescente um m odulo para fazer isto, mas n ao se
desconcerte se funcionar mal...
Soluc ao prog6105.c
9. Modularize mais o programa prog6105.c separando as rotinas para cal-
cular raizes complexas reais das raizes complexas n ao reais.
Soluc ao prog6106.c
Observa cao: 37 Modularizac ao dos programas
Um melhor ttulo para este texto seria nvel de abstra cao nos programas.
Na suite de programas prog6101.c, ..., prog6106.c n ao h a nenhuma
inovac ao essencial fora o caso do programa prog6103.c em que todos os defeitos
principais de prog6101.c foram sanados.
Os outros programas, principalmente prog6105.c, prog6106.c s ao rena-
mentos dos anteriores.
Uma pergunta se imp oe: trabalho necess ario ou in util.
Aqui vamos retomar, brevemente, uma observac ao feita na introduc ao destes
livro: como aprender a programar bem? Mesmo aqui, perto do m do livro, e
difcil de responder a esta pergunta...
Uma tentativa de resposta viria dentro de uma longa hist oria da computac ao
que obviamente n ao faremos aqui, ate mesmo porque n ao somos historiadores.
Mas vamos deixar uma breve resenha que n ao ser a muito clara por si pr opria,
entretanto, de tanto repassar os olhos sobre ela voce vai terminar compreendendo
qual o seu sentido.
Primeiro se programou o ENIAC para resolver cada problema individu-
almente.
Depois as linguas de programac ao foram criadas. Com uma linguagem de
programac ao resolvemos grupos de problemas, sem mexer no computador.
Observe que no item anterior se quer dizer que se alterava a congurac ao
da m aquina, literalmente.
182 CAP

ITULO 8. MATEM

ATICA EM c
Depois as linguagens de programac ao evoluiram passando a usar biblio-
tecas em que v arias operac oes comuns a todos os problemas passaram a
car disponveis para qualquer programa. Veja o que acontece com o pro-
grama prog6103.c, nele fazemos uso das func oes contidas na biblioteca
ambiente.h
mask(),, que identica todos os nossos programas. Criamos a nossa
marca, a simplesmente a repetimos em todos os programas.
copyleft(), estabelecemos uma vez por todas a quest ao da titulari-
dade dos programas.
obrigado(), pensamos uma vez em como fazer uma despedida, depois
simplesmente a repetimos.
apeteco(), esta e uma func ao importantssima, pese sua grande sim-
plicidade. Seu nome signica APerte uma TEcla para COntinuar e
de uma vez por todas resolvemos este detalhe em qualquer programa.
E a hist oria ainda continua, nas linguagens de programac ao montadas du-
rante os anos 90, se aprofundou a capacidade de abstrac ao permitindo progra-
mas com muito mais alcance. Surgiram as linguagens de programac ao a objeto
que s ao m odulos mais evoluidos ainda.

E o caso de c ++, Python, java, entre
outras menos recentes.
A modularizac ao e apenas um pequeno detalhe, um passo inicial, mas e
necess ario dominar desde logo este passo.
E repetindo, os m odulos de um programa n ao devem passar do tamanho da
tela porque os insetos adoram se esconder nas laterais...
8.3 Somas e integrais em c
Se voce nao sabe o que e integral, ou se voce tem medo de integrais,
melhor pular esta se cao. Se voce quiser aprender um pouco sobre
integral, acompanhe o processo.
Vamos estudar uma sucessao de variantes do programa
integral.c. Come caremos com uma versao simples ate al-
can carmos uma versao mais sosticada. A suite de programas
que estudaremos e:
integral01.c integral02.c integral03.c
8.3.1 Integral de funcoes univariadas
Sobre integral leia por exemplo [3] onde o assunto esta voltado para o c alculo
aproximado de integrais como e o espirito aqui. Para uma visao teorica mais
detalhada veja [4].
8.3. SOMAS E INTEGRAIS EM c 183
A integral de f, simbolicamente:
b

a
f
que se le
integral de f de a ate b,
e area da regiao limitada pelo graco de f, pelo eixo OX entre os pontos a, b.
Esta e uma deni cao elementar que serve a muitos propositos. Calcular
b

a
f
aproximadamente pode ser feito de varias maneiras, por exemplo, calculando as
areas de retangulos contidos na regiao acima descrita. Veja gracos em [4], ou
em qualquer livro de Calculo.
A ideia do algoritmo esta na gura (g. 8.2) pagina 183,
x = x + deltax;
}
soma = soma + f(x);
{
enquanto (x $<$ b)
x = a;
deltax = 0.001;
soma = 0;
soma = soma*deltax;
voltar(soma);
preciso
a soma das
calcula
alturas
deltax fica
em evidncia
Figura 8.2: C aculo da integral, aproximadamente.
em que fazemos a variavel x varrer o intervalo [a, b] com passo deltax. Quando
x for igual a b, ou ultrapassar este valor, entao o programa para devolvendo o
valor soma deltax
Dentro do loop, os valores de f calculados sobre a malha determinada em
[a, b] pelo passo deltax, vao sendo acumulados na variavel soma que foi inicia-
lizada com zero, soma = 0, fora do loop.
Isto equivale a dizer que somamos todos os valores de f calculados sobre
esta malha. A expressao matematica do loop e:
k=n1

k=0
f(x
k
).
e, naturalmente, e melhor que voce converse com um matematico (ou me envie
um e-mail...) se tiver alguma d uvida sobre o que esta dito aqui, do contrario
este livro se tornaria um livro de Matematica.
Quer dizer que somas ou varreduras se fazem com loops.
184 CAP

ITULO 8. MATEM

ATICA EM c
Analise o programa integral01.c, depois o rode para ver o resultado e volte
a le-lo para compreender melhor como ele funciona.
O algoritmo que apresentamos acima, e o loop da fun cao
Riemann()
que calcula Somas de Riemann. Ela esta etiquetada com o n umero (4) no
programa. Veja o comentario o algoritmo para calculo da integral.
A fun cao principal se ocupa de todos os detalhes.
Inicialmente conversa com o usuario solicitando o o intervalo de inte-
gra cao:
imprima("inicio do intervalo [a,b] de integracao");
Se seguem depois tres entradas de dados para receber os valores de
a, b, deltax.
que se encontram numeradas com (3), (3.1).
Finalmente uma unica linha de comando contem a mensagem nal e chama
Riemann()
imprima(" de %f \n",Riemann(_inicio,_fim,deltax)); // (4)
A etiqueta (4) marca os pontos em a fun cao Riemann() est a denida ou e
chamada.
Defeitos do programa integral01.c
O dialogo inicial com o usuario e pobre. Deveria ser mais longo dizendo qual
o objetivo do programa. As tres entradadas de dados dizem pouco sobre o que
pedem.
Um programa precisa ser mais elegante e conversar melhor com o usuario.
Claro, numa versao posterior deste programa (noutro livro...), podemos incluir
um ambiente graco deixando o programa trabalhar no por ao e apresentar em
janelinhas as mensagens instruindo o usuario sobre as entradas de dados. Mas
agora ja e possvel algo melhor do isto, veja os exerccios.
A sada de dados nal esta muito laconica. Ela poderia ate mesmo explicar
como o programa foi feito. Quando soubermos fazer gracos, (proxima sec cao),
seria o caso do programa ir mostrando o graco do que esta fazendo.
Exerccios: 49 Melhorando integral01.c
1. Melhore a entrada de dados de integral01.c explicando melhor o que o
programa se prop oe a fazer com cada um dos n umeros solicitados.
8.4. GR

AFICOS DE FUNC

OES USANDO c 185
2. Veja em integral02.c que espacamento colocado entre entre as sec oes do
programa n ao interferem com a l ogica e podem ser usados para facilitar
sua interpretac ao. Faca alterac oes semelhantes para tornar integral01.c
mais legvel e mais comunicativo.
3. Construa uma func ao para fazer a entrada de dados. Solu c ao integral03.c
4. Subdivida o programa em pequenos m odulos tornando a fun c ao principal
apenas uma listagem de tarefas. Soluc ao integral03.c
5. Melhore a sada de dados tornando-a mais verbosa.
8.4 Gracos de funcoes usando c
Voce vai ver aqui como poderia fazer uma pequeno tutorial para ensinar
gr acos de fun c oes aos seus alunos ou para voce mesmo, para seu aprendizado
pessoal.
Nesta se c ao faremos duas coisas:
Chamaremos um programa externo
Dentro do espirito do Unix, e LinuX e Unix: para que fazer outro pro-
grama se ja existe um que funciona bem? e e o caso com gr acos.
Existe um programa, de domnio p ublico, chamado GNUPLOT, com
vers oes para DOS e WINDOWS, inteiramente gr atis, que trabalha
muito bem com gr acos.
Vamos aqui aprender a chamar o GNUPLOT de dentro de um pro-
grama feito em C para que GNUPLOT fa ca o gr aco que precisamos.
Vamos reutilizar um programa
Para fazer o gr aco de uma fun c ao f precisamos varrer o domnio de
f para construir a matriz dos pontos (a
i
, f(a
i
)) em que i {1, . . . n}
sendo n a quantidade de pontos que vamos representar, ou a precis ao
com que faremos o gr a co.
Esta ideia e a mesma para calcular integrais usando Somas de Riemann,
logo vamos reutilizar os programas integral01.c ... que zemos an-
teriormente.
Este paragrafo esta baseado no programa grafun.c e o nosso objetivo e conduz-
lo a entender este programa.
Leia rapidamente grafun.c, inclusive a avalia cao do mesmo que pode ser
encontrada no come co: programa primario... ha uma lista de coisas que devem
ser feitas para que ele se torne um programa respeitavel.
Observe que grafun.c se encontra no estagio nal onde a sucessao de
programas
grafun01.c grafun02.c grafun03.c
o vai levar, logo ele nao deve ser facil de ser entendido. N ao se desespere,
entretanto... Vamos come car com grafun01.c, que se encontra no estagio
inicial.

E sempre assim, nao tenha d uvida, que come ca a vida de um programa.


Primeiro construimos um que funcione, depois passamos a melhora-lo. Melhor
186 CAP

ITULO 8. MATEM

ATICA EM c
uma galinha
2
na panela do que duas no terreiro.
Rode o programa grafun01.c e depois o leia.
gcc -Wall -lm grafun01.c -o grafun
e rode o executavel que foi criado:
grafun
ou possivelmente, dependendo da organiza cao de sua maquina, (se a tiver rece-
bido a mensagem de que o programa nao existe)
./grafun.
8.4.1 Comentando o programa grafun01.c
Vamos iniciar o comentario pelo centro (a parte mais importante) do programa.
O resto e periferico...
3
O centro do programa e:
dados = fopen("dados","w"); // (5.1)
x = _inicio;
enquanto (x <= _fim)
inicio
fprintf(dados, "%f %c %f\n",x, ,funcao(x));
fprintf(dados, "%f %c %f\n",x, ,0.);
x = x + delta;
fim
fclose(dados); // (5.2)
Isto porque estamos usando um metodo tpico do Unix. Se tem um programa
que faz gracos, eu nao vou perder tempo inventando um meio de fazer gracos,
eu vou usar este programa: Gnuplot.
Gnuplot faz gracos de distintas maneiras, numa delas ele precisa ler um
arquivo contendo os pares de pontos (x, f(x)) para fazer o graco da fun cao f.
Rode grafun01.c, depois edite o arquivo dados para ver o que foi escrito
al.
grafun01.c abre o arquivo dados e nele escreve os pares de pontos
(x, f(x)), (x, 0).
Depois o programa Gnuplot vai ler este arquivo e criar o graco.
Mas para fazer isto e preciso denir as variaveis:
x;
inicio;
m;
2
pensamento imediatista...as galinhas no terreiro p oem ovos!
3
voce n ao deve levar a serio os coment arios do autor...
8.4. GR

AFICOS DE FUNC

OES USANDO c 187
dados;
funcao();
Vamos ao come co do programa. Depois dos comentarios iniciais, o programa
come ca chamando as bibliotecas necessarias onde estao denidas as fun coes que
o programa precisa e inclusive nossas tradu coes.
Depois denimos duas fun c oes auxiliares:
inteira rotulo();
real funcao(real x); // (3) equacao cuja grafico se deseja
Em rotulo() uma marca simples para o programa dizendo o que ele faz. Em
funcao() denimos a equa cao da fun cao cujo graco desejamos.
Denimos as variaveis necessarias ao programa:
palavra deposito[60], titulo[80];
real inicio, m, x, delta;
ARQUIVO *dados; // (5.1) dados para o Gnuplot com (x,funcao(x))
ARQUIVO *transfere; // (5.3) linhas de comando do Gnuplot
palavra programa[18]=gnuplot transfere; // (6) programa externo
Leia grafun01.c vamos apenas observar as linhas:
deposito[strlen(deposito)-1]=\0; // (7.3)
copia_de_palavra(titulo,""); // (7.4)
concatena_palavras(titulo,deposito); // (7.5)
concatena_palavras(titulo,"");
Em (7.3) estamos cortando a variavel deposito para car com o tamanho
exato da expressao do ttulo que o usuario tiver escolhido. Colocando o
NULL na ultima posi cao vaga.
Em (7.4) estamos colocando aspas simples, necessario para Gnuplot que
exige que o texto que ele receba que entre aspas simples ou duplas.
Em (7.5) estamos fechando as aspas.
nalmente chegou o momento de lan car os dados em dados como dissemos
acima. Leia o arquivo dados. Depois abrimos o arquivo transfere
// **** redireciona output para transfere
transfere = fopen("transfere","w"); // (5.3)
fprintf(transfere, "set title %s \n",titulo);
fprintf(transfere, "set pointsize %f \n", 0.1);
188 CAP

ITULO 8. MATEM

ATICA EM c
fprintf(transfere, "set size %f ,%f \n", 1. , 0.7);
fprintf(transfere, "%s %s %s \n","plot","dados"," with points");
fprintf(transfere, "%s \n", "pause -2 ");
fclose(transfere); // fechando o arquivo transfere
escrevendo nele todos os comandos que Gnuplot precisa para fazer o graco. A
ultima fun cao fecha transfere: fclose(transfere). Leia o arquivo depois
de rodar o programa para ver o que foi nele escrito, e volte a ler grafun01.c.
Nao sei se voce vai acreditar, mas eu penei um bocado para aprender a
escrever corretamente os dados em disco. Nao espere entender isto de um tapa...
Rode grafun01.c, leia os arquivos dados e transfere, volte a ler e rodar
grafun01.c, e assim voce ira entendendo os comandos.
O programa grafun01.c termina chamando Gnuplot atraves da variavel
programa:
imprima("*** chama um processo externo, Gnuplot *** ");
system(programa); // (6.1) (6.2) chama programa {\tt Gnuplot}
Fa ca a seguinte experiencia que o vai ajudar a entender todo o teatro que
acabamos de montar. Execute numa shell do Linux, dentro do diretorio onde
voce esta rodando os programas o comando:
gnuplot transfere
para que voce volte a ver o graco.
Exerccios: 50 Entendendo e modicando grafun01.c
1. Compile grafun01.c! tem tanto erro que e melhor passar para grafun02.c.
Fica como desao, para quando voce adquirir mais experiencia, corrigir
este programa.

E um bom exerccio.
2. Melhor talvez abandonar grafun01.c, tem muito erro. Leia e rode grafun02.c.
O erro est a indicado nas primeiras linhas.
3. Apague
4
as bibliotecas denidas no incio do programa
# include <stdio.h> // (1) **** leitura da biblioteca stdio.h
# include <stdlib.h>
# include <string.h>
# include "traducao.h" // (2) **** leitura da biblioteca traducao.h
compile o programa e analise os erros (ufa... que quantidade enorme de
erros) apague as bibliotecas uma por uma...
4. Como voce j a deve ter rodado grafun02.c, vamos entender como funciona
Gnuplot. Rode:
gnuplot transfere
e veja que o resultado e o mesmo que rodar grafun02.c.
4
n ao obede ca! em vez de apagar, comente...
8.4. GR

AFICOS DE FUNC

OES USANDO c 189
5. Edite os arquivos dados, transfere. Eles foram criados por grafun02.c.
Tambem grafun02.c chamou Gnuplot e lhe passou os comandos contidos
em transfere
system(programa); // (6.1) (6.2) chama programa {\tt Gnuplot}
Altere esta linha em grafun01.c para
system("gnuplot transfere");
e volte a compilar. Haver a um erro, porque a vari avel programa deixou
de ser usada. Corrija este erro apagando a denic ao desta vari avel.
6. Dena mais duas outras func oes e faca Gnuplot colocar os seus gr acos
na tela.
Soluc ao grafun02.c
7. Dena uma biblioteca de func oes, veja menu funcao.h para que o pro-
grama nela v a buscar a equac ao que lhe interessa.
Soluc ao estude grafun03.c
8. Altere grafun03.c para que lhe seja permitido, primeiro, ver o arquivo
menu funcao.h de modo que, quando voce digitar o ttulo possa escrever
a equac ao da func ao. Observe que em LinuX voce pode facilmente me-
morizar a equac ao da func ao com o rato e colar na tela de execuc ao do
programa.
Soluc ao: grafun04.c
9. Modularize o programa grafun04.c de formas que a func ao principal()
seja apenas uma listagem de tarefas denidas pelos m odulos (func oes)
Soluc ao: grafun05.c
O programa grafun.c e a versao nal desta serie de estudos.
190 CAP

ITULO 8. MATEM

ATICA EM c
Captulo 9
Programacao avancada
Se voce chegou ate aqui fazendo todos os exerccios que encontrou no caminho
ent ao est a em condi c oes de dar o salto nal que este captulo lhe vai propor.
Esta li c ao e uma especie de diploma junto com um convite para continuar...
anal, todo diplomado deve continuar estudando.
Vamos construir dois programas:
O menu de op c oes de um programa para fazer gr acos de guras
geometricas (esperamos que voce o termine e nos envie uma c opia),
Um programa para fazer aritmetica com n umeros complexos.
Os dois programas car ao imcompletos, mas, j a zemos isto nos captulos
anteriores para envolve-lo diretamente no trabalho. Vamos deix a-lo a um
passo de prosseguir para programa c ao avan cada que deve ser feita com C++.
N ao se esque ca, C++ contem C.
9.1 Continuar se aprofundando em c
Dissemos que que continuar se aprofundando em C certamente seria estudar
C + +. Vamos discutir isto aqui. Observe que qualquer livro sobre C + +,
tem pelo menos uma 200 p aginas, portanto seria uma desonestidade querer lhe
dizer que ao nal deste captulo voce saber a programar nesta nova linguagem.
Apenas esperamos lhe mostrar que vale a pena consider a-la.
A linguagem de programa c ao c + +, e, em tese, uma outra linguagem de
programa cao, apenas ela entende c ou ainda, com mais precisao, c ++ extende
c, contendo todos os comandos de c e alem disto tem novas estruturas de
programa cao.
Os exerccios abaixo vao explorar estes fatos.
Exerccios: 51 c + + e uma extens ao c
1. Execute na linha de comandos:
c++ -Wall -oprog1 integral.c
e rode prog1. Este e o execut avel criado com o compilador do c + + a
partir do c odigo integral.c que e um programa escrito em c.
191
192 CAP

ITULO 9. PROGRAMAC

AO AVANCADA
2. Execute na linha de comandos:
gcc -Wall -oprog2 integral.c
e rode prog2. Este e o execut avel criado com o compilador do gcc a partir
do c odigo integral.c.
3. Execute na linha de comandos:
c++ -Wall -oprog3 integral.cc
e rode prog3. Este e o execut avel criado com o compilador do c + + a
partir do c odigo integral.cc que e um programa escrito em c + +.
4. Executando (em Linux)
ls -la prog* | more
voce vai poder vericar que
prog2 < prog1 < prog3
em que prog2 < prog1 signica que o c odigo do prog2 e menor do
que o c odigo do prog1, e procure encontrar uma justicativa para este
resultado.
5. Leia o programa integral.cc e veja quais s ao as not aveis diferencas entre
um programa em c + + ou em c.
O ultimo exerccio sugere que a substitui cao de printf() por cout trans-
formou um programa em c num programa em c + + o que seria uma grande
simplica cao.
Na verdade o que se costuma fazer e criar pequenas fun coes emc para us a-las
em programas escritos em c + +.
Na ultima parte deste captulo voce vai ver dois exemplos de como isto se
faz.
A justicativa para os tamanhos dos programas e a seguinte: prog2 e o
menor porque, naturalmente, e um programa em c e o compilador gcc esta
otimizado para compilar os programas nesta linguagem.
Consequentemente prog1 cou um pouco maior uma vez que o compilador
do c + + foi chamado para compilar um programa escrito em c.
Finalmente usamos o compilador do c + + para compilar uma mistura e o
resultado foi um executavel um pouco maior, mas que tambem pode ser execu-
tado.
Li cao: evite as misturas...
9.1.1 A linguagem c + +
Voce talvez ja tenha ouvido falar de programa cao orientada a objeto. Esta e uma
caracterstica fundamental de c + + e de algumas linguagens de programa c ao
como
Python,
Java.
9.1. CONTINUAR SE APROFUNDANDO EM c 193
Estas sao algumas das linguagens de programa cao voltadas para programa c ao
orientada a objetos. Existem dezenas delas.
c + + e uma linguagem bastante popular mas que perdeu um pouco de
terreno para Java que e uma linguagem mais simples e sob alguns aspectos mais
segura que c + +. Entretanto c + + e extremamente rapida, de 20 a 30 vezes
mais rapida que Java segundo a maioria dos analistas.
Tres pontos levam Java a se sobrepor a c + +,
simplicidade,
seguran ca,
e o poder economico de uma grande rma.
A simplicidade tem aspectos negativos, e a consequecia disto e que Java
esta crescendo em complexidade de modo que este aspecto (positivo) tende a
desaparecer.
A seguran ca dentro de c++ pode ser alcan cada se voce aprender a programar
bem. Lembre-se do que ja dissemos, repetindo o que dizem outros autores:
um programa mal escrito pode ser t ao ruim que e melhor voce re-aprender a
programar e fazer outro programa em vez de tentar corrigir o programa. Se
voce aprender a programar bem, a seguran ca em c + + pode ser facilmente
atingida e seus programas serao rapidos e conaveis como ha muitos rodando
por a.
O poder da grande rma aos poucos vai se diluindo frente a beleza, a coerencia
do software livre e de domnio p ublico de onde vem c ++ e Python. Embora o
Java tambem ja tenha sido tomado pelo software livre... n ao e a toa que uma
grande multinacional chama o software livre de cancer, porque vai terminar por
come-la... e, a liberdade e um cancer, para o poder.
Mas, e claro, se voce optar por Java, nao estara mal servido e o que aprender
aqui sobre c + + lhe vai ser util para programar bem em Java.
Seguindo o esquema que nos guiou ate aqui, construiremos um exemplo.
Vamos retomar o programa menu.c e construir, a partir dele, um novo programa
menu.cc. Nesta constru cao, e nos comentarios, lhe mostraremos um pouco de
c + + e da leveza que e programar orientado a objeto.
Existe uma diculdade inicial, devido a abstra cao deste novo estilo de pro-
grama cao, mas vamos lhe mostrar que vale a pena o salto.
9.1.2 Programacao orientada a objeto
Primeiro uma advertencia: leia esta sec ao sem lev a-la muito a serio, rapida-
mente. Passe logo para a seguinte em que vamos construir a pr atica. Depois de
ler a pr oxima sec ao volte para uma leitura mais detalhada desta, e ver a que ela
cou mais clara e, inclusive, lhe explicou melhor o que aconteceu na pr oxima.
Observa cao: 38 Abstrac ao em programac ao
194 CAP

ITULO 9. PROGRAMAC

AO AVANCADA
A palavra abstra cao e usada com o seu sentido liter ario exato, consiste em
produzir n ao exatamente programas mas modelos de programac~ao. Volte pos-
teriormente para ler este texto, quando tiver lido e rodado o primeiro programa
orientado a objeto.
H a muitas rotinasque se repetem dentro de uma tarefa, ent ao a ideia de
programar orientado a objeto consiste em captar tais rotinas e os seus objetivos
e colocar tudo isto numa unica capsula que pode ser chamada de qualquer lugar
de dentro da tarefa.
A palavra encapsular faz parte do jarg ao de programa cao orientada a objeto
e signica isto, construir o modelo constituido de variaveis, agora chamadas
de objetos, e as func oes que as alteram, agora chamadas de metodos .
Em c + + encapsulamos os objetos e os metodos em classes que s ao os
modelos que ser ao depois copiados, como a natureza faz com as moleculas de
DNA...
Leia os exemplos e depois volte a ler este texto.
Programar orientado a objeto exige algum aprofundamento na concep cao do
que e um programa. Os programas cam mais abstratos no sentido de que, em
vez de fazermos um programa, criamos uma classe de programas. Nosso com-
portamento nos captulos anteriores conduziu a isto aos poucos quando insis-
tentemente falamos de modulariza cao dos programas. Um programa orientado
a objeto em qualquer linguagem tem a seguinte estrutura geral:
# include sistema.h (1)
class sistema programa; (2)
int main() (3)

programa.init() (4)
programa.abre(programa.dados) (5)
programa.leia(programa.coisa) (5)
programa.faca(programa.coisa) (5)
programa.escreva(programa.coisa) (5)
programa.fecha(programa.dados) (5)
return 0; (6)

Explica coes
1. #include sistema.h e o metodo em c para incluir a leitura de bibliote-
cas. Aqui estamos supondo que no arquivo sistema.h esteja a classe que
precisamos.
Esta linha traz para a memoria todo o conte udo da classe mencionada.
Na classe sistema estao denidas todas as fun coes necessarias para comu-
nica cao com o sistema e os tipos de dados relacionados com os perifericos.
Por exemplo, cout e um metodo denido na biblioteca iostream.h que se
ocupa da sada de dados. La tambem esta denida cin, que e um metodo
para leitura de dados.
9.1. CONTINUAR SE APROFUNDANDO EM c 195
Na linguagem de orientac ao a objetos as fun coes agora recebem o nome de
metodos. Quando voce constroi uma classe, que e o prototipo de um objeto,
voce tambem dene os metodos que devem alterar as variaveis desta classe.
Entao cout, cin sao dois metodos denidos em iostream.h.
O sistema ca assim bastante protegido e claramente concebido. Tudo de
um determinado objeto ca junto com ele, o que torna facil a manuten c ao
e a reutiliza cao.
2. class sistema programa
e equivalente a uma deni cao de tipo de dado, aqui muito mais poderosa
porque cria um objeto a imagem da classe sistema, quer dizer, tendo
todos metodos e variaveis denidos no prot otipo sistema.

E o que se
chama tecnicamente de heranca.
programa herda as propriedades de sistema. .
Usa-se tambem a expressao: programa e uma inst ancia de sistema. Instan-
cia e um sinonimo de exemplo ou de representa cao.
Nem tudo de sistema ser a herdado por programa. O codigo pode estabe-
lecer restri coes declarando partes que sejam publicas ou privadas. Isto
e um detalhe a ser visto mais a frente. Entao programa herda tudo que
for declarado como p ublico da classe sistema
3. Como em c sempre ha uma fun caoprincipal.
4. O metodo init(), abreviado do ingles, intitialization tem a fun cao
de criar as variaveis que vao ser herdadas com valores apropriados. Da
mesma forma como se inicializam variaveis, ha tambem metodos para
destru-las, que nao vamos discutir aqui.
Em geral programa.init() e o primeiro item de main() e que serve para
inicializar as variaveis herdadas. Isto em geral e muito importante, mas
pode nao ser necessario em um determinado programa.
5. Aqui estamos supondo que em sistema foram denidos os metodos
abre(), leia(), escreva(). fecha()
e agora programa herdou estes metodos. A forma como eles devem ser
usados e com o operador pontoque hoje e universalmente usado
em reda coes de textos tecnicos. As rubricas dos planejamentos indi-
cam a precedencia de rubricas com suxos indicados pelo ponto;
na deni cao dos nos da Internet;
Assim programa.abre() e um metodo herdado por programa denido em
sistema.
O metodo abre denido em sistema esta possivelmente associado a um
arquivo em disco e agora este arquivo se torna a entrada ou a sada padrao.
Ao nal ele e fechado sem erro de fechar outro arquivo que nao interessava.
196 CAP

ITULO 9. PROGRAMAC

AO AVANCADA
Pode haver ate varios arquivos abertos sendo manipulados por outros ra-
mos do programa num sistema multi-tarefa em uso em varios computado-
res, tudo sob controle, sera fechado quando terminar de ser utilizado pela
inst^ancia de sistema que foi chamada.
programa.leia(programa.coisa)
quer dizer que existe um metodo em sistema com o nome leia() e que
vai ser aplicado a uma variavel que em sistema tem o identicador coisa.
6. E, como e imperativo, toda fun cao termina com um return, e sem-
premain() produz um inteiro ao final de suas operac~oes.
Usamos verbos e frases que nao pertencem a nenhuma linguagem de pro-
grama cao, mas que se parecem com c, que traduzem o que acontece em qual-
quer uma delas. Quando voce ver um programa em c ++ ir a logo reconhecer o
que zemos acima.
Veja as vantangens desta complicac ao...
Os metodos denidos em sistema se ocupam da seguran ca e dos deta-
lhes.
Quando voce quiser atualizar um sistema, tudo deve ser feito na classe
sistema. Se ela for bem feita o restante simplesmente herda as modi-
ca coes sem grandes traumas, algumas vezes sem que seja necessario me-
xer em coisa alguma dos programas que herdam metodos e objetos das
classes. Outras vezes pequenas modica coes sao necessarias.
Vou lhe dar um exemplo errado (que novidade)!
Observe a fun cao limpa janela(), denda em ambiente.h. Depende de
que ambiente.h voce vai ler... se for no diretorio do DOS ela usa uma
fun cao apropriada para este sistema. Se for em Linux, vai usar outra.
Alteramos apenas a biblioteca ambiente.h e todos os programas, usando
limpa janela() funcionam, podem ser usados nos dois sistemas.
Por que o exemplo esta errado ? porque ambiente.h nao e uma classe !
Mas a ideia e a mesma. Basta transformar ambiente.h em uma classe e
o exemplo ca perfeito.
Compare o c odigo acima com o conte udo de menu.cc e com o codigo de
menu.c e se conven ca que menu.cc e mais poderoso. Com o tempo voce
vai se convencer que tambem e mais simples.
Aparentemente uma complica cao nova apareceu, aumentou a quantidade
de texto para ser digitada: programa.qualqueroutracoisa(). Sempre
temos que digitar programa. Isto nao representa problema: simples-
mente nao digite programa. Escreva sua ideia. Quando compilar, o
compilador vai lhe dizer que qualqueroutracoisa() n ao existe... Ai voce
digita um sinal qualquer antes de todos os metodos e vari aveis e faz
uma troca automatica deste sinal por programa..
Voce evitou de digitar programa.!
9.2. O PROGRAMA MENU.CC 197
Finalmente, quando for executado
programa.fecha(programa.dados)
nao havera mais nada zanzando pelos sistema ligado ao disco e e nem ao
arquivo dados. Seguran ca total.
Se voce estiver achando este texto difcil, muito abstrato, lembre-se da ob-
serva cao feito ao come co. Era para fazer uma leitura rapida e passar `as se c oes
seguintes em que exemplos vao ser construdos, e depois voltar para uma se-
gunda leitura.
9.2 O programa menu.cc
Vamos reproduzir a ideia do programa menu.c que e um programa (incom-
pleto, verdade!) escrito em C com os novos conceitos de programacao orien-
tada a objetos.
9.2.1 Construcao da ideia
Leia o programa menu.c e rode este programa para ver onde queremos chegar.
Primeiro rode e depois leia.
Primeiro um pouco de propaganda. Leia os dois programas
menu.cc e
menu.c
e vamos compara-los sem entrar nos detalhes tecnicos da compara cao.
Veja que a fun cao executa() nos dois programas e a mesma.
Veja que a fun cao main() em um dos programas e mais simples.

E quase
uma lista de frases que dizem o que vao fazer. Costumo chamar esta
fun cao main() de script contrariando um pouco o linguajar tecnico de
computa cao em que esta palavra tem um signicado especial, aqui usamos
no espirito com que se usa, no do teatro:
main() em menu.cc e um script que chama os atores, na ordem certa,
para executarem o espetaculo. Os atores ja sabem o que fazer.
Ainda dentro do espirito de propaganda, no bom sentido, (se e que propa-
ganda pode ter um sentido bom...), compare os programas
menu.cc e menu mil.cc.
Obviamente, veja o nome, menu mil.cc e uma
1
versao muito melhorada do
anterior. Rode primeiro para se convencer deste detalhe:
c++ -Wall -oprog menu.cc
e rode ./prog.
Depois
1
mil e abrevia c ao de milenium...
198 CAP

ITULO 9. PROGRAMAC

AO AVANCADA
c++ -Wall -oprog menu mil.cc
e rode ./prog.
Agora leia os dois programas, menu.cc e menu mil.cc.
A classe que esta denida no arquivo ambi.h, que e a versao para c + + de
da velha ambiente.h.
Foi facil melhorar o programa menu.cc e dar-lhe a cara de menu mil.cc,
apenas incluindo a bilioteca ambi.h onde estao denidas as fun coes
limpa janela(), apetecof(), copyleft()
como ambi.h e uma classe pode ser utilizada com as modica coes descritas
anteriormente, usando o ponto para caracterizar a origem dos metodos e neste
caso chamariamos
amb.limpa janela(), amb.apetecof(), amb.copyleft()
em que amb seria uma inst^ancia da classe ambi.h.
Vamos aos passos na transforma cao de menu.c, em menu.cc usando a classe
informacao. Leia o arquivo ambi.h em que a classe esta gravada.
Observe a estrutura de uma classe, nao entre nos detalhes agora.
Come ca com a palavra chave
class
seguida do nome da classe
informacao.
A palavra-chave public:, terminada com dois pontos, marca uma
area em que estao denidas vari aveis e metodos que poderao ser uti-
lizados por qualquer inst ancia (exemplo) da classe, os objetos.
Segue a lista do que e p ublico e depois poderia haver uma lista de
variaveis ou metodos privativos da classe numa area etiquetada com
a palavra-chave private:.
Observe que tudo isto esta entre chaves e ao nal um ponto e vrgula.
Nesta area os metodos se encontram apenas anunciados, a imple-
menta cao vem depois.
A implmenta cao dos metodos vem logo abaixo, cada metodo iniciado
com a palavra-chave inline. Veja a sintaxe:
inline void informacao::init()
que copiamos do metodo init() e que podemos repetir de forma
mais abstrata (geral):
inline tipo informacao::nome()
em que informacao e o nome da classe.
Agora e usar a classe como em menu mil.
9.3. N

UMEROS COMPLEXOS 199


9.3 N umeros complexos
Vamos mostrar como criar uma classe chamada complexo que
dene um n umero complexo e depois fazer uso desta classe num
programa.
9.3.1 Que e n umero complexo
Os n umeros complexos sao aqueles n umeros que aparecem com as equa coes do
segundo grau quando o delta for negativo, as equa coes que n ao tem raizes reais.
Isto da origem a n umeros do tipo
z = 3 + 2i = a + bi; (9.1)
1(z) = 3 = a; (9.2)
(z) = 2 = b; (9.3)
Ou seja, um n umero complexo e um par de n umeros reais (a, b) a + bi.
Quando somamos dois n umeros complexos, usamos a regra da algebra soma
de termos semelhantes. Poristo somamos parte real com parte real e parte
imagin aria com parte imagin aria.
Quando multiplicamos dois n umeros complexos, usamos tambem a mesma
regra da algebra soma de termos semelhantes, mas antes, multiplicamos todos
os termos entre si (usando a propriedade distributiva), depois somamos o que
for semelhante.
Veja na gura (g. 9.1) pagina 200,
Para criar esta classe de objetos temos que ter pares ordenados e pelo
menos os seis metodos:
Metodo para extrair a parte real
Metodo para extrair a parte imaginaria
Metodo da soma
Metodo do produto
Metodo do produto por um escalar
Metodo para calcular o modulo
Em vez de diretamente criar uma classe, vamos primeiro fazer um programa
em c que execute estas tarefas todas, depois vamos transforma-lo em classe de
modo que nunca mais precisemos que repetir a tarefa inicial. Quando precisar-
mos de n umeros complexos faremos uma heranca.
200 CAP

ITULO 9. PROGRAMAC

AO AVANCADA
a + bi X
c + di

acbd + (ad + bc)i
parte
imaginria
parte
real
Figura 9.1: O produto de n umeros complexos: parte imagin aria se obtem em cruz
9.3.2 O programa em c
O programa em c e o trabalho experimental em que se baseia a constru cao da
classe, e aqui esta uma das razoes pelas quais voce deve aprender c...
A lista de exerccios seguinte o conduz a constru cao do programa complexos01.c.
Quer dizer que este programa contem as solu coes dos exerccios.
Exerccios: 52 Construc ao da algebra dos complexos
1. Faca um programa que entenda o que e um n umero complexo e possa
explicitar sua parte real e sua parte imaginaria. Soluc ao complex01.c
2. Extenda o programa complex01.c para que ele faca a soma de dois n umeros
complexos. Soluc ao complex02.c
3. Construa um programa que calcule a soma e o produto de dois n umeros
complexos. Soluc ao complex03.c
4. Transra todas as func oes de complex03.c, exceto main() para a bibli-
oteca complex.h, coloque a diretiva de compilac ao adequada para leitura
desta biblioteca e roda o programa. Soluc ao complex04.c, complex04.h
5. Complete a biblioteca complex.h para que sejam feitas as operac oes de
multiplicac ao por um escalar e c alculo do m odulo de um n umero com-
plexo. Altere a func ao entrada() e roda o programa. Soluc ao complex.c,
complex.h
6. Verique que os programas complexos01.c e complexos.c s ao apenas
vers oes de complex.c sem uso da bibliteca complex.h. Tome uma posic ao
sobre qual e o melhor dos metodos.
9.3. N

UMEROS COMPLEXOS 201


9.3.3 Construcao de complexo milenium plus.cc
Neste momento nao precisamos mais buscar um longo atalho para chegar no
nosso objetivo. Talvez ja tenha lido umas duas vezes a se cao inicial deste
captulo, voce ja deve ter compreendido claramente que, programar orientado a
objeto consiste em criar
o objeto um conjunto de dados, ou de tipos de dados, que descrevem o
objeto;
os metodos um conjunto de fun coes que, metodos, que manipulam o objeto
ou partes do objeto
encapsulados numa classe que podera ser re-utilizada em diversas inst ancias.
O que faremos agora e simplesmente transformar a biblioteca complex.h em
complexO.h e o programa complex.c em complexO.cc.
Leia os dois arquivos complexO.h, complexO.cc, e depois rode
c++ -Wall -oprog complexO.cc
./prog
para ver que o efeito e exatamente o mesmo que
gcc -Wall -oprog complexO.cc
./prog
mas que agora voce pode reaproveitar o conte udo da estrutura Complexo
com mais facilidade. Os exerccios lhe mostrarao como faze-lo.
Exerccios: 53 N umeros complexos orientados a objeto
Constru cao de uma classe derivada
1. Quando denimos os n umeros complexos em complexO.h, nos esquecemos
de denir m odulo. Dena uma nova classe, algebra, que herde o cont udo
de Complexo e tenha o metodo val abs comp() para calcular o m odulo dos
complexos. Soluc ao algebra.h
2. Altere o menu do programa complexO.cc para nele incluir a nova pos-
sibilidade do c alculo de m odulos de n umeros complexos, redija um novo
arquivo, n ao altere o existente. Soluc ao complexo milenium.cc.
3. Sem soluc ao neste livro... Construa uma classe menu retirando de
complexo milenium
todas as func oes de maneiras que que apenas a main(). Fica como desao
para o leitor, construir
complexo milenium platinum.cc
a vers ao denitiva.
Neste momento voce pode ver a constru cao de algebra.h como uma correc ao
feita `a classe complexo denida em complexO.h.
Mas nao e bem assim o nosso objetivo. Queremos que veja que voce pode
ter classes com menos propriedades, mais gerais, e com elas construir clas-
ses derivadas que tem mais propriedades. Se conven ca: quanto maior for o
202 CAP

ITULO 9. PROGRAMAC

AO AVANCADA
n umero de propriedades de uma classe, menos probabilidade vai haver para sua
re-utilizac ao.
O desao colocado como ultimo exerccio, no bloco anterior, mostra como po-
demos chegar a uma situa cao limite: o programa complexo milenium plainum.cc
denitivo que nunca sera alterado. Todas as altera coes ser ao feitas apenas em
classes especcas:
Novas propriedades dos n umeros complexos, serao includas na classe com-
plexo (observe que a classe algebra e desnecessaria, ela foi construda
apenas para dar um exemplo de classe derivada). As altera c oes, as no-
vas propriedades que queiramos incluir nos n umeros complexo, podem ser
feitas na classe complexo.
Altera coes no menu comentarios, enm, comunica cao com o usuario, serao
feitas na classe menu
Obviamente o trabalho ca departamentalizado, mas e bom nao esque-
cer que toda altera cao na classe complexo implica em possvel altera c ao
na classe menu, por exemplo, o acrescimo da possibilidade do calculo do
modulo de n umeros complexo nos obrigou a alterar o menu.
complexo gold Claro, quando precisarmos vender a proxima vers ao super
melhorada do nosso produto, ainda temos referencias como gold e plus para
garantir ao cliente que vale a pena investir no novssimo produto... Pensamos na
proxima edi cao deste livro lan car complexo gold XGL em que o desao estar a
resolvido. Aguarde...
Captulo 10
Manual introdutorio de
referencia
Na internet voce pode encontrar um mundo de informa c oes oferecidas, com
frequ uencia, gratuitamente. Por exemplo
Software http://www.gnu.org/graphics/agnuhead.html Este e o site
da Funda c ao para Software Livre (Free Software Foundation - FSF).
L a voce pode encontrar uma grande variedade de programas ou links
para outros sites onde programas podem ser encontrados.
Linux e software rodando em Linux http://debian.org Este e um dos
principais pontos de referencia para LinuX. L a voce vai encontrar cen-
tenas de outros sites.
Dicionario on line http://www.yourdictionary.com de repente, se
voce precisar de saber a tradu c ao de uma palavra...
s ao alguns dos sites onde voce pode encontrar informa c oes on line. Experi-
mente!
Neste captulo vamos mostrar como voce pode obter informa c oes na internet
ou na m aquina LinuX em que voce estiver trabalhando. Mas se acostume
com uma ideia relativamente nova: nao precisamos ter tudo guardado na
memoria, as informa c oes tem que car guardadas em bancos de dados, e
n os vamos ate elas quando precisarmos. Aqui voce vai saber onde existem
informa c oes para voce usar quando necessitar. N ao tente decorar nada, n ao
tente copiar tudo que encontrar. Use e aprenda onde se encontram as coisas.
203
204 CAP

ITULO 10. MANUAL INTRODUT

ORIO DE REFER

ENCIA
Se voce tiver chegado aqui sem ter lido nenhum programa a gostariamos de conhece-lo
pessoalmente, voce deve ser um tipo muito especial, mas por favor corrija este defeito...
Claro, voce j a deve ter lido muitos programas e visto nas primeiras linhas, logo depois dos
coment arios iniciais, o smbolo #. A mais comum de todas e # include ...
Este smbolo indica ao compilador que al se encontra uma instru c~ ao de compila c~ ao, quer
dizer, um comando que o gcc deve executar antes de come car a ler o programa.
Vamos discut-las aqui, mas n ao se esque ca da observa cao tantas vezes j a repetida: estamos
apenas levantando uma pontinha da coberta... h a ainda muita coisa que pode ser dita e um
local onde voce pode encontrar tudo e no manual da Libc de que j a falamos muitas vezes e
que voce pode consultar em LinuX com a sequencia:
Digite info libc. Ai voce esta no manual da Libc, edi c ao 1.0 mas n ao se assuste com
este n umero t ao baixo, ela j a surgiu muito boa... Digitando apenas info voce abre o
sistema de informa c oes do LinuX.
Procure o que voce deseja usando Crl-S e reponsdendo com a palavra chave desejada.
Funciona digitando apenas a /.
Ou comece por ler informalmente o seu conte udo para ver o que tem l a dentro. Voce
vai ent ao ver como este livro e diminuto... Voce toda libc apenas dando enter, e as
p aginas ir ao passando.
Para sair aperte q, algumas vezes ser a preciso colocar o cursor, com o ratinho, dentro
do texto, primeiro.
10.1 O Sistema operacional e a shell
Para que um computador rode sao necessarias dois processos basicos invisveis
para o usuario:
O assembler Uma pequena linguagem de maquina que e chamada de as-
sembler da maquina.

E o assembler que caracteriza a diferen ca entre as
maquinas.
O sistema operacional que e um programa de nvel um pouco mais alto
e bem mais sosticado que o assembler e que vai se comunicar com o
usuarios, com os programas e com os perifericos. LinuX e um sistema
operacional.
Em geral, a grande maioria dos usuarios, mesmo usuarios avan cados, nao
fazem uso direto do sistema operacional, alguns ate podem ignorar que ele existe.
Em LinuX, por exemplo, existe um terceiro programa que e quase um sistema
operacional, o X-windows, que toma conta da maquina e faz a comunica cao
usuarios-programas-LinuX-perifericos
tudo isto num ambiente graco em que o ratinho tem uma importancia quase
tao grande quanto a do teclado.
Se voce estiver acostumado e quiser se manter preso a esta gaiola graca,
salte desta se cao para a proxima e simplesmente ignore
X-windows, LinuX, assembler
mas isto nao seria tpico para um futuro programador na linguagem c . . .
Vamos deixar de lado o assembler, vamos conversar um pouquinho sobre
LinuX. Vamos tambem ignorar o X-windows que ele e tao perfeito qual um bu-
rocrata de categoria: trabalha sem que ninguem se de contas de sua existencia.
10.1. O SISTEMA OPERACIONAL E A SHELL 205
Quando voce atingir a perfei cao voce podera se interessar pelo X para eventual-
mente incluir algumas de suas propriedades em seus programas.
LinuX e um unixoide e c foi feito por programadores que nasceram na
perspectiva do Unix
1
, consequentemente e natural que quem deseje programar
em c precise saber como funciona o sistema operacional. A recproca e funda-
mental, quem quiser entender o sistema operacional tem que saber c. Porisso e
muito natural que em toda instala cao LinuX se encontre o gcc.
Mas ninguem usa LinuX diretamente. Usamos uma linguagem que se comu-
nica com o sistema operacional chamada bash que existe em diversos sabores
sh, bash, tcsh e outros. Sempre tem alguem que acha que uma delas e supe-
rior `as outras, mas elas fazem as mesmas coisas.
Esta linguagem se chama shell e voce pode car sabendo tudo (que e mais
importante) sobre shell com
info shell.
Leia a respeito do info em uma das se coes adiante neste caputlo (procure no
ndice remissivo). Voce pode ler todo o manual sobre a shell apenas acionando
a barra de espa cos, experimente.
A palavra inglesa shell tambem se refere a area de trabalho, talvez a razao
desta confusao venha do fato de que somente podemos usar os comandos da
shell quando abrirmos uma area de trabalho. E, que e uma area de trabalho?
Se voce estiver no X possivelmente, no pe da tela tem umcone que lembra
uma tv. Clique nele e ira se abrir uma area de trabalho. Agora digite
info shell
e leia o manual da shell. Obviamente, o cone com a pequena tv n ao
precisa estar no pe da tela, onde ele estiver, clique nele...
Se voce nao estiver no X, no modo graco, entao voce ja se encontra numa
shell ... digite
info shell
e leia o manual da shell.
Se nao houver nenhum cone lembrando uma tv no X, clique no botao
que inicia os menus e voce vai encontrar a palavra shell, escolha uma das
op coes que lhe oferecerem e, quando aparecer uma pequena janela, ative
com o ratinho, digite
info shell
e leia o manual da shell.
Se nada isto der certo, entre em contacto comigo...mas me de alguma
pista sobre o que estiver acontecendo, por exemplo, se o computador est a
ligado, sem tem energia eletrica, enm qualquer coisa que ajude a saber
como come car. Uma alternativa: se houver alguem a volta,
pergunte,
lhe asseguramos, foi assim que come camos.
1
foi feito para fazer o Unix
206 CAP

ITULO 10. MANUAL INTRODUT

ORIO DE REFER

ENCIA
10.2 As instrucoes de compilacao.
1. #define Veja como exemplo traducao.h. Objetivo denir macros, cons-
tantes. Por exemplo voce pode denir um modesto assim
# define pi 3.1415
2. #ifdef#endif Muito poderosa, em geral voce vai necessitar dela em pro-
gramas mais avan cados. Serve para alterar outras diretivas, como include
ou outras deni coes. Veja o exemplo
lookup.c
logo no incio do programa. Se voce usar ifdef tem que usar tambem
endif para marcar o m do bloco.
3. # else Cria uma alternativa dentro de uma deni cao, ver lookup.c.
4. #ifndef Tradu cao: se n ao estiver denido. Semelhante a # ifdef para
o caso de nao estar ainda denido.
5. #include Inclusao de bibliotecas, veja traducao.h
6. #undef Cancela uma deni cao. . Se voce quiser corrigir um muito
pequeno use esta diretiva e depois dena novamente com tamanho
melhor...
10.3 Instrucoes na linha de comando
Ao compilar um programa qualquer voce deve ter digitado:
gcc -Wall -oprog programa.c
em que programa.c e o nome do arquivo que contem o programa que voce deseja rodar, o
codigo fonte prog e nome que voce deseja dar ao programa execut avel, -Wall diz ao gcc que
ele deve ser falador e lhe explicar em detalhe todos os erros que encontrar. Naturalmente
gcc e o nome do compilador. Aqui gcc obedece a uma regra do Unix, e LinuX e Unix, que
estabelece que os programas podem ser modicados por par ametros fornecidos na linha de
comando.
Voce pode compilar um programa simplesmente digitando
gcc programa.c
e entao o gcc ira criar, silenciosamente, um arquivo executavel chamado a.out
e se voce digitar
a.out
o programa ira rodar, naturalmente se tudo tiver dado certo. Se alguma coisa der
errado, gcc ira avisa-lo, mesmo que voce nao tenha solicitado a ajuda, entretanto
erros menores que gerariam apenas uma advertencia nao ir ao aparecer.
A instru cao -Wall na linha de comandos e reponsavel pela lista de erros
e advertencias. Sem ela gcc vai trabalhar mudo a nao ser que haja erros
alguns dos quais serao informados ao usuario.
10.3. LINHA DE COMANDO 207
A intru cao -o indica ao gcc o nome do arquivo executavel. Se voce a
omitir ele vai criar o arquivo a.out.
Se houver um arquivo terminado com .c gcc vai considerar este como a
origem do c odigo fonte, o programa que deve ser compilado.
Se voce incluir a op cao -c, o gcc ira apenas fazer a analise sintatica do
codigo fonte e criar um arquivo programa.o em que programa e prexo
do arquivo que contem o codigo fonte. Mas se voce tambem incluir
-oprog
ele vai colocar o arquivo criado em prog que, entretanto, nao sera exe-
cutavel. Esta op cao -c e util para grandes programas am de vericar a
sintaxe porque e um pouco mais rapida.
Se voce digitar
gcc --help | more
o compilador vai lhe mostrar uma listagem das instru coes de compila c ao que
podem ser fornecidas na linha de comando com uma breve descri cao. Ver na
Libc descri coes mais detalhadas ou com info gcc
2
uma ajuda mais tecnica
sobre o compilador. Evite de se perder, entretanto, va devagar porque ha muita
informa cao.
Em LinuX existe um formato compilado das fun coes que se encontram nas
bibliotecas que e mais eciente e mais rapido de ser usado, mas para acessa-los e
preciso usar a instru cao de compila cao lm na linha de comando. O programa
grafun.c, por exemplo, se compilado com
gcc -Wall -oprog grafun.c
vai lhe apresentar erros inexperados, como dizer-lhe que a fun cao sin e desco-
nhecida. A sada e compila-lo com
gcc -lm -Wall -oprog grafun.c
que vai informar ao gcc que deve usar a biblioteca compilada. Abaixo voce
tem uma listagem parcial do comando gcc --help. Se voce quiser ler o seu
conte udo com calma, execute o seguinte:
gcc --help > teste e o resultado desta listagem vai car guardada no
arquivo teste. Preste aten cao, se o arquivo existir, ele vai ser perdido
cando agora os dados desta listagem nele. Porisso sugerimos teste, ou
lixo, etc... nomes que voce deve usar para arquivos temporarios. Evite
de usar temp ou tmp porque estes arquivos sao usados pelo sistema.
Leia o arquivo com um editor de textos.
O smbolo >e um comando do LinuX chamado de redirecionador da sada
de dados. Sem ele os dados iriam para a sada de dados padr aoque
normalmente e o vdeo.
Segue abaixo um trecho do resultado de gcc --help com a tradu cao para
portugues.
2
na pr osima sec c ao discutimos o sistema info
208 CAP

ITULO 10. MANUAL INTRODUT

ORIO DE REFER

ENCIA
Usage: gcc [options] file...
Options:
--help Mostra esta ajuda
(Use -v --help, em geral para obter ajuda sobre processos)
-save-temps Preserva os arquivos temporarios
-pipe Usa pipes em vez de arquivos temporarios
-B <directory> Acrescenta <directory> aos caminhos de busca do
compilador
-b <machine> Executa gcc para <machine>, se instalado
-V <version> Roda a versao <version>, do gcc, se instalado
-v Mostra os programas chamados pelo compilador
-E Apenas Preprocessamento, nao compila nem
assembla nem link-edita.
-lm Use a biblioteca compilada de matematica
-S Apenas compila, nao cria o assembler ...
-c Compila e cria o assembler, mas nao link-edita.
-o <file> Coloca o executavel em <file>
-x <language> Escolhe a linguaguem:
Linguagens aceitas inclue: c, c++, assembler, none
none significa que gcc deve escolher
a linguagem a partir da extensao.
Observe que as op coes nao apresentadas podem ser importantes, entretanto
nao agora no incio. Inclusive algumas dessas que apresentamos n ao lhe serao
signicativas agora. Se voce tiver analisado o resultado do gcc --help vai
observar que acrescentamos uma que la nao estava explicitada, lm.
10.4 Operadores aritmeticos e logicos
Veja no ndice remissivo alfabetico em que captulo se encontram os operadores
aritmeticos e logicos.
10.5 A libc
Voce acessa a libc com
info libc

E o manual mais completo sobre a linguagem C que voce pode encontrar, e se


encontra ao alcance de seus dedos, dentro da m aquina LinuX que voce estiver
usando. Aqui vamos apresentar alguns ashes deste manual.
Para falar a verdade vamos mostrar-lhe como, usando info, voce pode pas-
sear num dos sites mais completos da internet , a maquina LinuX em que
voce estiver trabalhando. Como no resto do livro, coloque os dedos no teclado
do computador e nos acompanhe na viagem.
Se voce digitar apenas info lhe vai ser apresentado um ndice geral com
todas as informa coes sobre programas ou pacotes instalados na maquina. Vale
a pena come car por a se voce ainda nao fez isto.
10.5. A LIBC 209
Se voce estiver usando xemacs basta clicar com o ratinho no canto superior
direito, help e escolher info (online docs). Neste caso voce pode viajar
apenas usando o ratinho. Se voce for um professor talvez seja interessante ler
as primeiras linhas do info para ver que voce pode criar informa coes sobre o
seu curso dentro do sistema Linux...
Os manuais dentro do info estao marcados com um asterisco, de um enter
ao lado de um nome com asterisco e voce entra no manual daquele pacote.
Procure libc usando:
Ctrl S
usando a barra / se voce estiver entrado no info fora do xemacs
Dentro do xemacs voce pode usar os botoes a semelhan ca do que voce faria
na internet para ir e voltar (ou sair) exit.
Se voce tiver entrado no info no modo texto, use q para sair. Para retor-
nar para um nvel superior, dentro da arvore de informa c oes, use u (up) ou
p (previous). As teclas pgU e pgDn funcionam para subir ou descer o texto
dentro da pagina em uso.
E, naturalmente, info info lhe da todas as informa coes sobre o sistema de
informa coes. E tudo isto e uma otima oportunidade para aprender ingles...
Procure agora libc usando um dos metodos descritos acima.
No momento em que estamos terminando esta versao do livro, se encon-
tra instalada neste maquina a versao 0.10 da libc, um n umero extremamente
modesto para o seu poder de informa coes. Os primeiros topicos sao:
* Introduction:: Purpose of the GNU C Library. Aqui voce vai encontrar
uma descri cao do que lhe oferece a libc e como usa-la.
* Error Reporting:: How library functions report errors.
O ttulo diz tudo, mas deixe-nos acrescentar, aqui voce vai descobrir para
que serve o ultimo comando da fun cao principal(), o return numero.
* Memory:: Allocating virtual memory and controlling paging.

E um topico avan cado, os itens do manual absolutamente nao se encontram


arrumados em ordem crescente de diculdade.
* Character Handling:: Character testing and conversion functions.
Traduzindo a descri cao: testando caracteres e fun coes de convers ao.
* String and Array Utilities:: Utilities for copying and comparing strings
and arrays.
Traduzindo a descri cao: utilitarios para copiar e comparar vetores de
caracteres (strings) e vetores.
* Character Set Handling:: Support for extended character sets.
210 CAP

ITULO 10. MANUAL INTRODUT

ORIO DE REFER

ENCIA
* Locales:: The country and language can aect the behavior of library
functions.
Traduzindo a descri cao: Pas e lingua podem afetar o comportamento
das fun coes nas bibliotecas. Explicando melhor, com um exemplo, as
fun coes que manipulam data podem se acondicionar para a forma como
escrevemos as datas no Brasil.
* Message Translation:: How to make the program speak the users lan-
guage.
Traduzindo a descri cao: Como fazer os programas falar a linguagem do
usuario. Aqui voce ja pode ver um defeito do nosso livro, nao usamos esta
possibilidade, as mensagens de erro podem aparecer em diversas linguas
naturais.
Se voce entrar neste topico vera que o primeiro paragrafo diz uma das
verdades menos compreendidas pelos programadores:
A comunica cao dos programas com os seres humanos deve ser planejado
para facilitar a tarefa destes, (dos humanos). Uma das possibilidades con-
siste em usar as mensagens na lingua que o usuario preferir. Exatamente
o contrario do que muita gente imagina quando escreve programas, que
os humanos e que tem que se adaptar `a informatica... Entretanto ainda
nao esta facil de traduzir as mensagens de erro, e poriso que eu deixei esta
questao de lado, pelo menos no momento.
O pequeno excerto que apresentei acima deve-lhe mostrar que vale a pena
estudar a libc.
Poderiamos continuar analisando todo o manual, mas isto transforamaria
este livro em volume de mil paginas, e inutilmente porque voce tem a libc na
ponta dos seus dedos, em ingles, e verdade. Mas se voce n ao se preocupar em
dominar o ingles, pelo menos para leitura (facil), tem muito coisa interessante
que vai car car longe do seu alcance.
10.6 Manual do compilador gcc
Faremos referencia aqui ` as informa c oes on line que podem ser obtidas numa m aquina LinuX
sobre o compilador gcc. Vamos discutir info gcc. Leia o par agrafo anterior, neste captulo,
sobre o sistema info.
Vamos supor que voce digitou numa shell do Linux
info gcc
vamos lhe mostrar uma forma diferente de usar info
Voce pode ler todo o manual do gcc como se fosse um livro, (pouco util), e
melhor procurar questoes que resolvam problemas pendentes.
Mas se voce quiser ler como se fosse um livro eletronico (que de fato ele e)
basta ir dando toques na barra de espa co e as paginas irao correndo antes os
10.6. MANUAL DO COMPILADOR GCC 211
seus olhos na tela do micro. Vale a pena fazer para uma primeira leitura (se
aplica melhor `a libc).
Os primeiros toques na barra de espa co vao lhe permitir uma leitura do
ndice. Em seguida ao ndice voce vai cair no primeiro captulo se continuar
dando toques na barra de espa co e assim sucessivamente.
Observe que as teclas PgUp, PgDn funcionam como esperado, para subir e
descer paginas. Se voce tiver uma boa instala cao LinuX provavelmente nao
precisara de alguns itens como instalac~ao e semelhantes. Mas certamente sera
interessante fazer varias leituras do captulo *Invoking GCC::. Fa ca varias
leituras, uma primeira, rapida, e depois outras em que voce vai se demorar em
algum topico que lhe chame sua aten cao.
Quando seus programas ganharam mais densidade, quando tiver um pro-
jeto, vai precisar usar do utilitario make que tambem existe no BC. Ele serve
para interligar diversos programas e bibliotecas em unico codigo otimizando o
resultado.
Finalmente voce encontra quase ao nal do livro a famosa GPL.
212 CAP

ITULO 10. MANUAL INTRODUT

ORIO DE REFER

ENCIA
Referencias Bibliogracas
[1] Bell, David I. Landon Curt Noll and others CALC - An arbitrary precision
calculator - Debian GNULinux distribution http://www.debian.org
[2] Jargas, Aurelio M. Express oes regulares - Revista do Linux - Mar co 2000,
pagina 48 e Julho 2000, pagina 32
[3] Praciano-Pereira, T. C alculo numerico Computacional - uma introduc ao com
Pascal Editora da Universidade Estadual Vale do Acara u - 1999
edic ao eletr onica (copyleft) http://www.uvanet.br/matematica/livros.php
[4] Praciano-Pereira, T. Exerccios de C alculo Edi coes do Labortorio de Ma-
tematica Computacional da Universidade Estadual Vale do Acara u - 2001
edic ao eletr onica (copyleft) http://www.uvanet.br/matematica/livros.php
[5] Oualline, Steve Practical C Programming - OReilly - 1997 - confuso, mas
correto - primeira leitura
[6] Loudon, Kyle Mastering Algorithms with C - OReilly - 1999 - primeira
edi cao. - bem escrito, avan cado
213

Indice Remissivo
===, 81
==, 80, 81
a.out, 207
abstra cao e seguran ca, 152
abstra cao, 106, 193
acesso
arquivo, 154
disco, 154
acesso a ponteiro, 153
agenda
endere cos, 169
ajuda, 207
online, 170
algebra de tempo, 162
alterando c, 56
ambiente, 19
integrado, 20
programa cao, 19, 20
ambiente integrado, 20, 33
ambiente.h, 56
apeteco(), 105, 106
area de trabalho, 205
aritmetica, 133
aritmeticas
opera cao
ponteiro, 153
opera coes, 172
aritmeticos
operadores, 172
arquivo
acesso, 154
escrita, 61
estruturas, 83
leitura, 61
lembrete, 83
reciclagem, 83
arquivo corrompido, 155
arquivo executavel, 207
arquivos tempor arios, 207
array, 155, 209
ASCII, 47, 56, 146, 147
ASCII, tabela, 63
assembler, 80
atalho, 96
atribui cao, 80
atribuir, 156
autor, 19
endere co, 123
avalia cao, 80
backup, 33
BANCOS, 55, 58
base de numera c ao, 55
base zero
ndice, 39
basico, valores, 146
BC, 12, 37, 143
biblioteca, 142
bibliotecas, 141
diretorios, 22
oor(), 142
help, 59, 143
math.h, 143
bem programar, 16, 86
biblioteca, 35, 86, 92, 143
string.h, 66
BC, 142
constantes, 136
gcc, 141
gcc - DebianGnuLinuX, 135
padrao, 135
214

INDICE REMISSIVO 215


bibliotecas de c, 114
bit, 64, 65, 133
bit, byte, 152
bit,byte, 133
bloco
logico, 50
bloco logico, 37, 50
Borland C, 25
break, 71, 83, 94
desvio do uxo, 94, 95
buer
aditivo, 87
multiplicativo, 87
bug, 16
bugs, 81
byte, 64, 65
byte, bit, 133, 152
bytes
32, 133
n umero, 133
C
matematica, 171
c + +, 106, 159, 182
c gratuito, 12
c interpretado, 84
c personalizado, 35
calc, 84, 85, 92
caminho, 21
caractere, 145
caracteres, 47, 62, 144, 209
numericos, 62
vetor, 40, 47, 48, 64, 65
vetor de, 146, 148
vetores de, 147, 209
Caracteres especiais, 146
caracteres, vetor, 69
cascata de execu coes, 83
case, 83
caso, 83
cast, 47, 143, 144
ceil(), 143
char, 50, 51, 144
checker, 41
classe, 198
classe derivada, 201
codica cao, 161
codigo fonte, 25, 26, 206, 207
codigos
valida cao, 171
cogido fonte, 25
colateral
efeito, 80
colateral, efeito, 81, 82
comando
linha de, 206
comando novo, 35
comentario, 28, 34, 86
comentarios, 46, 90
como rodar programas, 24, 25
compara(), 66
compara palavras(), 66
compila, 80
compila cao
instru coes, 206
compila cao, 24
avisos, 79
diretiva, 49, 50
erro, 178
matematica, 178
compilador
advertencias, 206
analise sintatica, 207
enganado, 80
erro na aprox., 169
erros, 206
compilar, 26, 206
programa, 101
rodar, 38, 43, 54
compile, 26
concatena palavras(), 66
constru cao de fun coes, 104
contabilidade, 107, 108
contador
base 0, 88
base 1, 88
copia de palavra(), 66
cores, 47
corrompido
arquivo, 155
criando informa coes, 209
Ctrl-c
216

INDICE REMISSIVO
BC, 90
dado
tipo de, 47
dados
BC, formata c ao, 59
BC, tipo, 59
entrada, 38, 51, 5961, 66, 166
espa co na memoria, 131
formata cao, 57, 58
formatadores de, 34, 36, 40, 44
47
leitura, 5961
redirecionador, 207
sada, 61, 165, 166
tipo, 128, 131
tipo de, 36, 41
tipo, identicador, 58
dados basicos, 146
dados, tipo, 135
DBL EPSILON, 138
DBL MAX, 138
DBL MIN, 138
DebianGnuLinuX, 135
declara coes de erros, 209
default, 142
dene, 206
depura cao de programas, 90
derivada, classe, 201
desigualdades, 95, 96
detetiza cao, 16
deve, haver, 108
dimensao de matriz, 157
direcionador &, 14
direcionador de memoria, &, 14
diretiva
compila cao, 50
dene, 206
else, 206
endif, 206
ifdef, 206
included, 206
undef, 206
diretiva de compila cao, 50
disco
abrir arquivo, 154
acesso, 154
fechar arquivo, 154
divisao
algoritmo
div. Euclid., 136
inteira, 136
djdev, 26
DOS
gcc, 12
editor e programas, 33
efeito colateral, 81, 82
encapsular, 194
endere camento, erro, 14
endere camento indireto, 13
endere co do autor, 123
endere cos, agenda, 169
enfeites, 90
enganando
compilador, 80
enquanto(), 87, 93
enquanto() (while()), 71
entrada
de dados, 60
entrada de dados, 166
equa cao
segundo grau, 76, 78
erro
de sintaxe, 80
envio de naves, 138
logico, 80
programa, 151
sintaxe, 80
erro com reais, 138
erro de endere camento, 14
erro, ponteiro, 14
erros, 53, 209
codigo, 37
return, 37
escolha(), 83, 84, 86
escolha() (switch()), 71
escolhas m ultiplas, 83, 84
escreva(), 50
espa co
naves
rotas, 138, 139

INDICE REMISSIVO 217


espa co de nomes, 41, 119
espacial
esta cao, 138
especiais, Caracteres, 146
esqueleto.c, 21, 61
estruturas, 155
arquivo, 83
execu coes
em cascata, 83
executavel, 26
DOS, 25
LinuX, 26
executavel, arquivo, 207
expandindo, 167
expandindo c, 56
expressao
avalia cao, 80
externos, processos, 189
fclose(), 154
fgets(), 51, 154
Fibonacci, 48
gura
diretorios
BC, 22
equa cao, 180
Fluxograma, 78
uxograma, 7577
formatadores, 166
integral, 183
maquina, 137
printf(), 167, 168
Produto de complexos, 200
se() ou entao, 74
Variavel Local, 122
m, inicio, 50
oat, 47, 137, 143
oor(), 143
oor.c, 143
FLT EPSILON, 138
FLT MAX, 138
FLT MIN, 138
utuante
n umero
ponto, 137
ponto, 137, 138
uxograma, 75, 76
fonte
codigo, 25
fonte, codigo, 207
fonte, codigo , 206
fopen(), 154
for(), 92, 94
formal
linguagem, 48
formata cao, 56
BC, tipo de dado, 59
dados, 58
formata cao de dado, 58
formatadores, 36
formatadores da dados, 47
formatadores de dados, 46
fprint(), 166
fprintf(), 154, 165, 170
FSF, 12
fun cao
passando valor, 127
fun coes
constru cao, 104
gracos, 185
fun cao, 36, 50, 58, 98, 102
corre cao, 105
reutilizavel, 106
fun cao composta, 126
fun coes
como construir, 104
construindo, 102
metodo, 105
vantagens, 104
fun coes matematicas, 207
garrafa destampada, 39
gcc, 12, 81
biblioteca, 141
para DOS, 12
glib, 114, 142
global
variavel, 37
global, variavel, 117
globaliza cao, 51
Gnu, 12
Gnu - funda cao, 178
218

INDICE REMISSIVO
GPL, 53, 211
gratuito,c, 12
grotesco, 119
haver, deve, 108
header le, 143
help, 59, 207
heran ca, 195
horas perdidas, 81
humano
programas, 210
IDE, 20, 33
identidade cultural, 51
identicador, 41, 64
identicadores, 65
IEEE, 137
if(), 71
if() else, 71
if(), se(), 71
if()/else, 71, 7577
igualdade
teste, 80
imperativa
linguagem, 81
imprima(), 50, 56
include, 50
incremento, 88
ndice, 157
ndice
base zero, 39
ndice e memoria, 157
innito, la co, 135
innito, Loop, 135
innito, loop, 90
info, 161, 208210
glib, 114, 141, 142
informa cao, 204
lendo como um livro, 211
libc, 114, 142
informa cao
info, 204
informa cao
internet, 203
tamanho, 64
tamanho , 65
informa coes, 114
criando, 209
ingles, 210
aprender, 209
inicio,m, 50
init(), 195
insetos, 16, 81
instancia, 195
instru coes
de compila cao, 206
insucesso(), 105
int, 47
integral.c, 184
integral, 182
inteiro
tamanho, 133
inteiros, 47, 55
inteiros modulo, 134
internacional
esta cao espacial, 138
internet, 208
informa cao, 203
programas, 203
interpretador c, 84, 85
joe, 23, 24
la co, 92
la co
condi cao, 88
La co innito, 135
leitura
texto, 46
leitura de dados, 5961
ler(), 51
riscos, 57
letra mascula, 87
letra min uscula, 87
Libc, 114, 141, 161, 204
libc, 114, 142, 208
introdu cao, 209
linha
mudan ca, 36
linha de comando, 206
LinuX, 24, 53
local

INDICE REMISSIVO 219


variavel, 37
logica, 71, 82
logicas
opera coes, 172
logico
bloco, 37, 50
logicos
operadores, 172
loop, 92
condi cao, 88
Loop innito, 135
loop innito, 90
macro, 64, 65
expansao, 57
macros, 63, 64
main(), 36, 50, 51, 102
planejamento, 104
make, 211
malha, 183
man, 114
matematica, 171
compila cao, 178
gracos, 171
integrais, 171
series, 171
somas de Riemann, 171
matematica com C, 171
matematicas
fun coes, 178, 207
matriz, 155
matriz,dimensao, 157
&, memoria
direcionador, 14
memoria, 209
checker, 41
problema, 39
memoria, direcionador, 33
memoria
direcionador &, 14
memoria e ndice, 157
men.cc, 193
mensagens, 90
tradu cao, 210
menu, 85, 107
metodos, 106, 194
meu c, 35
Microsoft C, 23
misterios, 58
modelos
programa cao, 194
modulariza cao, 105, 117, 181
modulo
inteiros, 134
modulo espacial, 138
mudan ca
de linha, 36
multi-usuario, 56
m ultiplas escolhas, 83, 84, 86
museu
ordem no acervo, 42
piano, 42
novo comando, 35
numera cao, base, 55
n umero
byte, 133
bytes, 133
inteiro, 132, 133
limite no gcc, 132, 133
matematica, 131
ponto utuante, 137
racional, 137
real, 137
tamanho, 138
tipo de dado, 132
um tipo de dado, 131
n umero fracionario, 47
n umero inteiro, 47
n umero real, 47, 137
n umeros, 47, 55
inteiros, 55
inteiros, varia cao, 55
Objeto
programa cao orientada, 98
objeto, 195, 198
programa cao oo, 193
objetos, 106, 194
OOP,ver POO, 98
opera cao, ponteiro, 153
opera coes
220

INDICE REMISSIVO
aritmeticas, 172
logicas, 172
operacional, sistema, 204
operadores
aritmeticas, 172
logicos, 172
padrao lingustico, 51
padrao.c, 61
padroniza cao, 154
palavra, 51, 64, 65
Palavra chave, 68
para(), 92, 94
para() (for()), 71
pare, 83, 94
desvio do uxo, 94, 95
pare (break), 71
passagem de valor, 126
return, 126
pequenos programas, 86
Perl, 106
planejamento, 106
main(), 104
vazio, 73, 74, 104
plano de trabalho, 108
polui cao visual, 105
ponteiro, 42, 148, 149
acesso, 153
associa cao
endere co, 153
variavel, 150
declara cao, 149, 150
endere co, 149
opera cao, 153
opera cao logica, 153
soma, 153
subtra cao, 153
tutorial, 151
velocidade, 42
verica cao, 41
ponteiro, erro, 14
ponto utuante, 137
POO, 98
Portugues
programar em, 49
portugues, programa, 29
praticidade, 60
precisao dos reais, 138
primeiro programa, 38
primeiro.c, 28, 29
principal(), 36, 50, 51
print(), 165
printf(), 50, 56, 165
private, 195
problema
crtico, 139
novo programa, 26
processos externos, 189
produto, 57
program
reset, 21
program reset, 26
programa
bonito, 46
busca de, 135
compilar, 101
depura cao, 90
editor, 33
estrutura, 35, 49
fun cao, 49
main(), 49
o primeiro, 38
prototipos, 50
re-inicializa c ao, 26
reciclagem, 36, 68, 107
rodar, 19
ruim, 123
seguran ca, 105
tecnica, 140
tecnica de trabalho, 107
uma fun cao, 36
programar
portugues, 35
Programar bem, 58
programar bem, 16, 86
programar em Portugues, 49
programas
o embelezamento, 105
reutiliza cao, 106
verica cao, 104
programas robustos, 41
programmer

INDICE REMISSIVO 221


C, 82
projeto, 211
prototipo, 50, 195
prototipos, 50
p ublic, 195
Python, 106, 159, 182
ratinho, 204
reais, precisao, 138
real, 47, 137
fun coes, 141
processamento, 141
reciclagem, 104
arquivo, 83
exemplo, 196
programas, 36
reciclagem de programa, 107
reciclar
estrutura, 83
redirecionador
dados, 207
reserva
copia, 33
reset
program, 21, 26
return, 37, 94
passagem de valor, 126
signcado, 126
return(), 71
reutiliza cao, 68, 104106
reutiliza cao de fun cao, 106
Riemann, 184
somas de, 184
Riemann, soma de, 182
risco, scanf(), 36
robustos, programas, 41
roda, 26
rodando gcc, 211
rodar
compilar, 38, 43, 54
programa, 19
rodar programa, 24, 26
rodar programas, 24, 25
Rodar um programa, 44
rotas de espa co-naves, 138
roteiro, 102
roteiros, 106
run, 21, 26
sada
padrao, 80
sada de dados, 165, 166
scanf(), 51, 165, 166
risco, 36
riscos, 57, 58
script, 102
script languanges, 106
se() (if()), 71
se() ou entao, 71
se(), if(), 71
se()/ou entao, 7577
se()/ou entao (if()/else), 71
secreta
chave, 177
seguran ca e abstra cao, 152
seguran ca, programa, 105
senhas, teste de, 101
shell, 24, 28, 204, 205
smbolo, 64, 65, 145
sintaxe, 71
sistema operacional, 204
sizeof, 69
sizeof(), 67
sprintf(), 170
sscanf(), 165, 166
standard output, 80
strcat(), 66
strcmp(), 66, 67
uso correto, 68
strcpy(), 66
string, 36, 40, 43, 4648, 50
strings, 47, 156
strlen, 69
strlen(), 66, 67
struct, 155
sucesso(), 105
switch(), 71, 83, 84, 86
tabela ASCII, 47, 63
tabela de aloca cao, 41
tamanho do inteiro, 133
tamanho da(), 69
222

INDICE REMISSIVO
tamanho de palavra(), 66, 67
tecnica
programar bem, 140
tempo
algebra, 162, 163
para humanos, 161
para maquinas, 161
tempo, algebra, 162
temporarios
arquivos, 207
teste de senhas, 101
texto
leitura de, 46
tipo de dado, 30, 47
transforma cao, 143, 144
tipo de dados, 41, 135
Torvalds, Linus, 53
trabalho, plano, 108
trabalho, regra, 33
tradu cao, 35
tradu cao das mensagens, 210
tradu cao de C, 51
traducao.h, 49
tutorial, 185
ASCII, 146
caracteres, 146
compara(), 70
oor.c, 143
gracos, 185
ponteiro, 151
ponteiros, 127, 149
strcmp(), 70
tipo de dados, 165
unidade logica
bloco, 50
Unix, 53
uso de c, 70
uso de c, 15
valor
passando, 127
passando ponteiro, 128
valor, passagem, 126
valores basicos, 146
variaveis, 65
variaveis padronizadas, 60
variavel, 48, 64
cria cao, 117
destrui cao, 117
eliminando, 125
endere co, 119
espa co de nomes, 119
fun cao composta, 126
global, 37, 117119
global local, 127
linguagem comum, 48
local, 37, 117119
local, denominaca cao, 119
passando valor, 127
programa cao, 48
variavel local, 37
varia cao dos ndices, 157
varredura, 183
vazio
planejamento, 73, 74, 104
velocidade
ponteiro, 42
verica cao de programas, 104
vetor
de caracteres, 64, 65, 145
vetor de caracteres, 36, 63
vetores
de caracteres, 69, 156
vetores de reais, 47
vi, 24
visual
polui cao, 105
vocabulario, 50
voltar, 94
voltar() (return()), 71
while(), 71, 87, 93
word, 64, 65
wpe, 23
X-windows, 204
xcoral, 23
xemacs, 23
xwpe, 23