Dez Lições para Aprender A Linguagem C
Dez Lições para Aprender A Linguagem C
Dez Lições para Aprender A Linguagem C
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. - [email protected]
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
[email protected]
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.
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
[email protected]
19
20 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...
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 )
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();
calcula raizes(a,b,c);
ou entao
imprima(equacao impossivel);
voltar 0;
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
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
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);
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)
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
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
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 6. VARI
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
ITULO 6. VARI
ITULO 6. VARI
ITULO 6. VARI
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
ITULO 6. VARI
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
, +
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 = #
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.
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.
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
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
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
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.
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;
ITULO 8. MATEM
ATICA EM c
14. < Operador logico menor do que ;
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.
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
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
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
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
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
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
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
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