Buscar

10 lições para aprender linguagem c

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 222 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 222 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 222 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

10 lic¸o˜es
para aprender
a linguagem C
em Portugueˆs.
Tarcisio Praciano Pereira1
Universidade Estadual Vale do Acarau´
Sobral, 12 de julho de 2005- Ceara´
1Dep de Matema´tica - U.V.A. - tarcisio@e-math.ams.org
Tarcisio Praciano Pereira
PhD em Matema´tica
10 LIC¸O˜ES
PARA APRENDER A LINGUAGEM C
em portugueˆs
Edic¸a˜o eletroˆnica
3
Pereira, Tarcisio Praciano
P496c 10 lic¸o˜es para aprender C
Sobral: UVA, 2001
224.p
Bibliografia
ISBN: solicitado
1 - A linguagem C
I. Tı´tulo
CDD xxx.xx
4
Lista de Figuras
1.1 a´rvore de direto´rios - 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 sa´ıda dados . . . . . . . . 77
4.5 Fluxograma da equac¸a˜o do segundo grau. . . . . . . . . . . . . . . . . 78
4.6 Ao encontrar pare() o fluxo e´ desviado para a pro´xima func¸a˜o externa ao
bloco. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.1 Varia´vel global e varia´vel local. . . . . . . . . . . . . . . . . . . . . . . 118
6.2 Varia´vel global e local . . . . . . . . . . . . . . . . . . . . . . . . . . 122
7.1 Ma´quina do balca˜o do come´rcio, colec¸a˜o do autor. . . . . . . . . . . . . 137
7.2 duas formas equivalentes para imprimir 30 na base 8 . . . . . . . . . . . 166
7.3 Formatac¸a˜o de dados em printf() . . . . . . . . . . . . . . . . . . . . 167
7.4 Uso de printf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
8.1 Equac¸a˜o do segundo grau . . . . . . . . . . . . . . . . . . . . . . . . 180
8.2 Ca´culo da integral, aproximadamente. . . . . . . . . . . . . . . . . . . 183
9.1 O produto de nu´meros complexos: parte imagina´ria se obtem em cruz . . . 200
5
6 LISTA DE FIGURAS
Suma´rio
Introduc¸a˜o ................................... . . . . . . . . . . . . . . . . . . . . 10
I Usandos os comandos em Portugueˆs 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 Ana´lise do prog02 1.c . . . . . . . . . . . . . . . . . . . . 46
3 Nu´meros e Letras 53
3.1 Brincando com nu´meros 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 lo´gico do fluxo 71
4.1 O condicional se() (if()) . . . . . . . . . . . . . . . . . . . . . . 71
4.2 Mu´ltiplas escolhas. . . . . . . . . . . . . . . . . . . . . . . . . . . 83
4.3 enquanto() while() . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.4 Outro me´todo para lac¸os. . . . . . . . . . . . . . . . . . . . . . . 92
4.5 Parando no meio de um bloco. . . . . . . . . . . . . . . . . . . . 94
5 Criando func¸o˜es 97
5.1 Verificador 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 Ma´quina de calcular. . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.2.1 O menu de opc¸o˜es . . . . . . . . . . . . . . . . . . . . . . 109
7
8 SUMA´RIO
II Aprofundando os conhecimentos 111
6 Varia´vel global e local 117
6.1 Varia´vel global e local . . . . . . . . . . . . . . . . . . . . . . . . 117
6.1.1 Comenta´rios sobre os exerc´ıcios . . . . . . . . . . . . . . . 120
6.2 Te´cnicas com o uso de varia´veis locais . . . . . . . . . . . . . . . 123
6.3 Passando valores entre func¸o˜es . . . . . . . . . . . . . . . . . . . 127
7 Os tipos ba´sicos de dados 131
7.1 Os nu´meros em C . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
7.1.1 Os nu´meros inteiros . . . . . . . . . . . . . . . . . . . . . 132
7.1.2 Os nu´meros reais . . . . . . . . . . . . . . . . . . . . . . . 137
7.1.3 Bibliotecas do BC . . . . . . . . . . . . . . . . . . . . . . . 142
7.2 Caracteres e vetores de caracteres. . . . . . . . . . . . . . . . . . 144
7.3 Ponteiros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.3.1 Operac¸o˜es 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 sa´ıda de dados . . . . . . . . . . . . . . . . . 165
8 Matema´tica em C 171
8.1 Operadores aritme´ticos e lo´gicos . . . . . . . . . . . . . . . . . . 172
8.1.1 Uma lista seca de operadores . . . . . . . . . . . . . . . . 173
8.2 Equac¸a˜o do segundo grau . . . . . . . . . . . . . . . . . . . . . . 178
8.3 Somas e integrais em C . . . . . . . . . . . . . . . . . . . . . . . . 182
8.3.1 Integral de func¸o˜es univariadas . . . . . . . . . . . . . . . 182
8.4 Gra´ficos de func¸o˜es usando C . . . . . . . . . . . . . . . . . . . . 185
8.4.1 Comentando o programa grafun01.c . . . . . . . . . . . 186
9 Programac¸a˜o avanc¸ada 191
9.1 Continuar se aprofundando em C . . . . . . . . . . . . . . . . . . 191
9.1.1 C ++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
9.1.2 Programac¸a˜o orientada a objeto . . . . . . . . . . . . . . 193
9.2 O programa menu.cc . . . . . . . . . . . . . . . . . . . . . . . . . 197
9.2.1 Construc¸a˜o da ide´ia . . . . . . . . . . . . . . . . . . . . . 197
9.3 Nu´meros complexos . . . . . . . . . . . . . . . . . . . . . . . . . 199
9.3.1 Que e´ nu´mero complexo . . . . . . . . . . . . . . . . . . . 199
9.3.2 O programa em C . . . . . . . . . . . . . . . . . . . . . . 200
9.3.3 Construc¸a˜o de complexo milenium plus.cc . . . . . . . 201
SUMA´RIO 9
10 Manual introduto´rio de refereˆncia 203
10.1 O Sistema operacional e a shell . . . . . . . . . . . . . . . . . . . 204
10.2 instruc¸o˜es de compilac¸a˜o . . . . . . . . . . . . . . . . . . . . . . . 206
10.3 linha de comando . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
10.4 Operadores aritme´ticos e lo´gicos . . . . . . . . . . . . . . . . . . 208
10.5 A libc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
10.6 Manual do compilador gcc . . . . . . . . . . . . . . . . . . . . . . 210
Bibliografia ............................................................................... 212
10 SUMA´RIO
Introduc¸a˜o.
Toda manha˜, na Africa, uma corc¸a se levanta e sabe
tera´ que ser mais ra´pida que o mais ra´pido dos leo˜es,
ou sera´ morta.
Toda manha˜ um lea˜o se levanta e sabe
tera´ que superar a mais lenta das corc¸as,
ou morrera´ de fome.
Na˜o importa se voceˆ e´ lea˜o ou corc¸a
quando o sol se levantar,
e´ melhor sair correndo.
- autor desconhecido
Como usar este livro.
Para comec¸ar, sugerimos que na˜o leia, agora, esta introduc¸a˜o. Leia primeiro
o resto do livro, depois a introduc¸a˜o, porque, lhe confessamos, primeiro escre-
vemos o livro, depois a introduc¸a˜o. Mas se voceˆ quiser insistir, fac¸a uma leitura
ra´pida e depois volte para ler com mais cuidado. Voceˆ vai ver que, enta˜o, vale
a pena.
Este livro tem dez cap´ıtulos em que lhe apresentamos as te´cnicas ba´sicas
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
portugueˆs por duas razo˜es:• para vencer a dificuldade psicolo´gica com o Ingleˆs, creamos um arquivo
que traduz os comandos da linguagem C para o Portugueˆs, de modo que
voceˆ se inicie sem a dificuldade lingu´ıstica;
• para mostrar-lhe que com C podemos facilmente construir outra lingua-
gem, neste caso e´ “C em portugueˆs”. Isto mostra o poder da linguagem.
Mas voceˆ na˜o deve se enganar com o apoio lingu´ıstico e nem queremos induz´ı-
lo no erro de que e´ possivel viver sem o ingleˆs. Por esta mesma raza˜o 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 Ingleˆs.
Na segunda parte usaremos apenas os comandos em ingleˆs.
O conteu´do das duas partes do livro, em linha gerais e´ o seguinte:
1. A primeira parte, constituida dos cinco primeiros cap´ıtulos, devera´ deixa´-
lo escrevendo pequenos programas em C e todos os exemplos sera˜o em
“portugueˆs” com a traduc¸a˜o ao lado. Depois voceˆ tomara´ sua decisa˜o, se
SUMA´RIO 11
quiser continuar escrevendo seus programas em Ingleˆs, como e´ habitual,
ou continuar a escreveˆ-los em portugueˆs.
Observe que os programas em “portugueˆs” rodam da mesma forma como
os programas em “ingleˆs”, eles na˜o sa˜o de mentira.
2. Na segunda parte vamos avanc¸ar em profundidade em algumas direc¸o˜es. A
partir dai so´ apresentaremos pedac¸os de programas, porque os programas
inteiros voceˆ pode consegu´ı-los num disco ou via Internet, veja como fazer
na bibliografia, ou envie e-mail para
tarcisio@e-math.ams.org
solicitando os programas. Voceˆ pode usar este enderc¸o para consultas
ra´pidas, mas, por favor, na˜o espere que lhe possamos dar um curso parti-
cular via internet.
Se voceˆ quiser continuar programando em “portugueˆs” esta sera´ uma
opc¸a˜o sua e ate´ la´ voceˆ tera´ aprendido como fazer.
O me´todo que vamos usar no livro se assemelha a`quele que usaram quando
voceˆ era pequeno, para aprender a sua lingua materna. Mostraram-lhe va´rias
vezes o mesmo objeto, cadeira, e lhe disseram: “cadeira”, a´ı voceˆ aprendeu a
diferenc¸a “lo´gica” entre uma cadeira e uma mesa.
Vamos lhe mostrar pequenos programas, pedir que voceˆ os rode num com-
putador em que o C esteja instalado1. Depois iremos comentar os programas e
lhe indicar como voceˆ os pode alterar, e assim por diante.
Parte do me´todo consiste do estilo com que os cap´ıtulos foram escritos: ha´
superposic¸a˜o entre eles, quer dizer, o mesmo assunto, o mesmo conceito, aparece
va´rias vezes, aumentando de intensidade nos cap´ıtulos de “nu´mero maior”. E´ o
me´todo de explicac¸a˜o lo´gica da diferenc¸a entre cadeira e mesa, de tanto falar,
termina ficando claro o que as coisas sa˜o. Voceˆ sera´ inclusive convidado a pular
para os cap´ıtulos mais avanc¸ados com frequeˆncia e, na˜o tenha du´vida em fazeˆ-lo,
se achar que esta´ bem la´ na frente, na˜o precisa voltar atra´s...
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 fundac¸a˜o GNU, procure em www.gnu.org ou envie e-mail para
o autor. Veja abaixo instruc¸o˜es mais detalhadas,
1se voceˆ tiver acesso a um computador rodando LinuX, enta˜o o C estara´ com toda certeza
instalado
12 SUMA´RIO
• deˆ prefereˆncia ao C da Borland, BC que todos que o analisam consideram
melhor que o Microsoft C,
• se voceˆ na˜o tiver mesmo nenhuma outra opc¸a˜o, use o que tiver a` ma˜o, mas
aprenda o C.
• Se voceˆ usa Linux e por alguma raza˜o complicada precisar de usar Borland
C, voceˆ pode fazeˆ-lo sob dosemu. Foi assim que as verso˜es do programas
para BC foram testadas por mim.
Este livro foi escrito em cima do gcc, Gnu C Compiler (o Compilador C da
Fundac¸a˜o para Software Livre, 2 Free Software Foundation, FSF). A FSF criou
tambe´m uma versa˜o do gcc para rodar em DOS e em Windows de modo que se
voceˆ na˜o tiver comprado um pacote de C, voceˆ pode obter um, gratuito, direta-
mente da FSF no enderec¸o http://www.gnu.org procure “What we provide”e
voceˆ vai ser direcionado para os diversos programas que feitos sob o patroc´ınio
desta fundac¸a˜o, 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 dif´ıcil. Voceˆ vera´ que e´ fa´cil iniciar o seu aprendi-
zado em C. Mas seria uma mentira dizer-lhe que o conteu´do deste livro
e´ suficiente para que se torne um ex´ımio programador. Prometemos que
ao te´rmino deste livro voceˆ podera´ estar fazendo alguns programas in-
teressantes e com muita vontade de continuar. Na bibliografia voceˆ vai
encontrar dicas de como fazer isto.
• E´ uma linguagem perigosa, voceˆ pode estragar o computador.
Na˜o 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ˆ tambe´m pode deixar o sistema operacional confuso
gravando algum dado impro´prio em local indevido de memo´ria, mas na
pior das hipo´teses a soluc¸a˜o para o problema vai consistir em desligar a
ma´quina e depois ter cuidado com o programa que causou esta confusa˜o.
Na absoluta pior das hipo´teses, voceˆ pode ter que instalar tudo de novo,
se o seu programa houver se intrometido por cima do sistema operacional
2GNU e´ uma sigla que representa a FSF e tambe´m o nome de um tipo de ant´ılope, “large
African antelope having a head with horns like an ox and a long tufted tail”, copiado do meu
diciona´rio gratuito produzido pelo Lab. de Cieˆncias Cognitivas de Princeton.
SUMA´RIO 13
gravado no disco... mas para fazer isto so´ um programa bem avanc¸ado e
muito mal intencionado.
Claro, logo aqui no comec¸o podemos dizer quem pode causar tais trans-
tornos para que voceˆ aprenda a manipular com cuidado o vila˜o: sa˜o as
varia´veis do tipo ponteiro porque elas fazem refereˆncia aos enderec¸os das
varia´vei na memo´ria RAM3. Consequentemente, se voceˆ mandar escrever
dados muito grandes em uma varia´vel de tamanho pequeno, havera´ uma
invasa˜o em a´reas de memo´ria e pode ser dif´ıcil de predizer as consequeˆncias
desta invasa˜o.
E´ isto que se chama de enderec¸amento indireto . A maioria das lingua-
gens de programac¸a˜o na˜o usa este recurso, nelas voceˆ pode apenas fazer
enderec¸amento direto, usando o pro´prio nome da varia´vel. Veja o seguinte
exemplo:
Exemplo: 1 Enderec¸amento indireto e indireto
numero = 23; // enderec¸amento direto
&numero ← 23;// enderec¸amento indireto
A primeira atribuic¸a˜o e´ a comum nas linguagens de programac¸a˜o, foi atri-
buido o valor 23 diretamente a` varia´vel numero. Na segunda linha estamos
dizendo que o valor 23 seja “associado”ao enderec¸o de nu´mero.
Na˜o e´ assim que se faz em C, veja o programa
endereco indireto.c,
mas na˜o se preocupe com entendeˆ-lo completamente agora. Estamos lhe
dizendo que olhe o programa apenas para contrabalanc¸ar as duas linhas
acima que na˜o sa˜o reais em programac¸a˜o, apenas uma tentativa de transmitir-
lhe o que significa enderec¸amento indireto. No programa
endereco indireto.c
voceˆ pode ver como e´ que realmente se faz.
Em C tambe´m fazemos atribuic¸o˜es diretas de valores nas varia´vei, mas,
ale´m disto, C pode acessar, quando voceˆ usar ponteiros, a memo´ria de
forma absoluta, e a´ı se encontra o risco de que voceˆ mande escrever por
cima de alguma parte do sistema operacional, por exemplo...e neste caso,
com certeza a ma´quina vai parar. Desligando-a e novamente ligando, uma
versa˜o nova do sistema operacional vai ser instalada a partir do disco e
tudo voltara´ ao normal. Este e´ o grande dano que obviamente deve ser
evitado e por isto primeiro entenda ponteiros antes de usa´-los.
Mas aqui voceˆ ira´ aprender o que e´ um ponteiro,vai aprender a compre-
ender o que pode estar acontecendo e dominar os poderes da linguagem.
Voceˆ sabe que pode levar um choque ele´trico pegando de mal jeito nos
fios, mas nem por isso voceˆ prefere viver no escuro...
3Random Access Memory, e´ a memo´ria que voceˆ adquire a mais ou a menos para sua
ma´quina e na qual os programas tem direito a fazer registros.
14 SUMA´RIO
Observac¸a˜o: 1 A func¸a˜o scanf() e o direcionador “&”.
O s´ımbolo “&” se chama algumas vezes “redirecionador”de memo´ria, porque ele as-
socia enderec¸o e memo´ria. Algumas func¸o˜es da linguagem C fazem atribuic¸a˜o de
dados via enderec¸o, e´ o caso da func¸a˜o scanf() e poristo ela representa um problema,
com frequeˆncia. Ela exige, um “direcionador de registro”, & na frente de algumas
varia´veis. Sua omissa˜o fara´ com o compilador o advirta do erro e se voceˆ na˜o levar
a se´rio a adverteˆncia pode acontecer que com o valor lido seja colocado numa posic¸a˜o
de memo´ria dif´ıcil de prever. Se o sistema operacional na˜o tiver um bom controle do
uso da memo´ria, e este e´ o caso do “windows”, isto pode levar a sobreposic¸a˜o de uma
varia´vel do sistema e consequentemente a uma parada cardia´ca violenta do mesmo...
mas em geral o “ctrl-alt-del”resolve o problema e o “windows”vai lhe brindar o disco
com um monte de lixo quando se re-iniciar.
Evite de esquecer o “&” antes das varia´veis quando usar scanf. Mas na˜o precisa se
assustar, o compilador que voceˆ estiver usando dentro, mesmo dentro do ”windows”,
lhe fara´ uma adverteˆncia se voceˆ esquecer um “&” na primeira etapa da compilac¸a˜o
do programa, tenha apenas o cuidado de levar a se´rio a adverteˆncia e corrija o esque-
cimento. Ha´ outras func¸o˜es que, como scanf() exigem o &. Tome o mesmo cuidado
nestes outros casos.
• Existem outras formas de copiar informac¸o˜es em lugares errados, elas sera˜o
identificadas mais adiante, e todas esta˜o ligadas ao uso indevido do en-
derec¸amento de memo´ria. Um exemplo comum como utilizac¸a˜o de uma
varia´vel 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 n’outra “a´rea de trabalho” e “matando” o programa
mal comportado.
A prevenc¸a˜o para este problema consiste no uso cuidadoso das varia´veis
segundo a declarac¸a˜o das mesmas. Claro, e´ verdade, se espera de um
programador da linguagem C muita atenc¸a˜o no uso de varia´veis.
O nosso objetivo consiste em deixa´-lo em condic¸o˜es de escolher um dos ca-
minhos seguintes:
• Se aprofundar em C para construir programas que executem tarefas dif´ıceis
com esta linguagem, mas usando um outro livro, na˜o este. Na bibliografia
voceˆ ira´ encontrar alternativas.
• Escolher uma outra linguagem, vamos lhe sugerir algumas, usando a ex-
perieˆncia adquirida aqui. Queremos lhe dizer com esta segunda opc¸a˜o que
C pode ser uma linguagem introduto´ria antes de voceˆ se definir por uma
linguagem apropriada para o seu desenvolvimento, que pode ser em C,mas
ha´ muitas outras para escolher. Ao final deste livro voceˆ deve se encontrar
no ponto de fazer esta escolha.
• Iniciar o estudo de C pelos seus aspectos de linguagem de alto n´ıvel, dei-
xando para o final os indicativos de como se aprofundar na linguagem.
E porque C e´ ta˜o importante, mesmo que finalmente voceˆ va´ programar em
outra linguagem? Algumas das respostas para esta pergunta sa˜o as seguintes:
SUMA´RIO 15
• A primeira e´ aquela que ja´ mencionamos algumas linhas atra´s, 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 consequeˆncia, por tra´s de tudo
isto sempre podemos encontrar as pegadas desta importante linguagem.
• Em geral, na soluc¸a˜o de problemas computacionais se usa C como uma
linguagem final para escrever na forma definitiva os algoritmos que esta˜o
rodando bem e sem erros e muitas vezes para escrever pequenos pedac¸os
cr´ıticos do algoritmo, na˜o o algoritmo todo. Quer dizer que se comec¸a a
escrever numa outra linguagem que, por alguma raza˜o, 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 n´ıvel na qual se
produzem os programas. Neste caso, o que e´ comum fazer-se e´, continuar
espandindo esta outra linguagem com novos mo´dulos escritos em C. Esta
e´, possivelmente, o uso mais comum da linguagem C.
• Seria um erro na˜o mencionar aqui a estensa˜o 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 tambe´m C como uma linguagem de estensa˜o. 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 construc¸a˜o de outras ferramentas. Na˜o espere, obviamente, encontrar
nada revoluciona´rio a n´ıvel de um livro introduto´rio, como este...
Por todas estas razo˜es e´ importante conhecer a linguagem C.
Por outro lado ela e´ fa´cil de se aprender e serve como uma primeira linguagem
de programac¸a˜o. E´ este o intuito principal deste livro: apresentar C como
uma primeira linguagem de programac¸a˜o. Por exemplo, e´ fac´ılimo escrever
programas em Portugueˆs que rodem em C e seria um pouco mais dif´ıcil de fazer
o mesmo em qualquer outra linguagem de programac¸a˜o.
Observac¸o˜es e outros meios de comunicac¸a˜o.
O texto e´ completado com observac¸o˜es de dois tipos. Um dos tipos se chama
claramente “observac¸a˜o”, o outro sa˜o as notas de rodape´.
Voceˆ deve ler as observac¸o˜es na ordem em que elas aparecerem, mas sem
lhes dar muita importaˆncia numa primeira leitura.
16 SUMA´RIO
Para lhe permitir uma busca mais acurada de informac¸o˜es, o livro tem um
ı´ndice remissivo alfabe´tico, ao final, em que todos os conceitos que surgem nas
observac¸o˜es se encontram indexados, de forma que voceˆ podera´ facilmente re-
tornar a eles quando achar necessa´rio. Tambe´m se encontram indexadas todas
as palavras-chave do texto.
Quando falamos usamos encenac¸a˜o para completar o sentido das palavras
usadas no discurso: mexemos as ma˜os, o corpo e alteramos a entonac¸a˜o da
voz. Para suprir um pouco deste teatro usaremos uma convenc¸a˜o tipogra´fica:
texto em ita´lico representa material que voceˆ deve olhar com cuidado, possivel-
mente na˜o esta´ definido ainda e estamos usando a concepc¸a˜o intuitiva do termo.
Quando usarmos texto tipogra´fico estaremos fazendo refereˆncia a um termo
te´cnico ja´ definido anteriormente ou considerado bem conhecido como tal. As
palavras da linguagem C sera˜o escritas no estilo tipogra´fico. Quan-do usar-
mos letra pequena estamos lhe querendo dizer que o assunto e´ poleˆmico e que ha´
muito mais coisa para ser dito do que estamos conseguindo dizer naquele mo-
mento. Usamos texto sublinhado para chamar sua atenc¸a˜o de um detalhe que
poderia passar desapercebido, tem o mesmo sentido texto em negrito.
Existe alguma te´cnica para programar bem?
Bom, chamar de te´cnica 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
te´cnica de programac¸a˜o.
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 sa˜o modularizadas, quer
dizer, um programa e´ um aglomerado de pequenos programas. Voceˆ vai aos
poucos entender o que queremos dizer, mas torne esta ide´ia uma obsessa˜o: nunca
fac¸a um programa que passe em tamanhoda tela do micro.
O maior problema de um programador sa˜o 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 fica do tamanho da tela, a gente
consegue rapidamente detectar os “insetos” e enta˜o na˜o e´ necessa´ria nenhuma
te´cnica de dedetizac¸~ao para consertar programas defeituosos. Mais a` frente
vou chamar sua atenc¸a˜o dos ambientes de programac¸a˜o com que voceˆ podera´ tra-
balhar, eles esta˜o equipados com instrumentos para fazer esta “dedetizac¸a˜o”nos
programas.
Voceˆ pode muito bem viver sem estes “instrumentos” de ana´lise de pro-
gramas se aprender, desde o in´ıcio, a programar bem, e, por outro lado, se
o seu programa for ruim, nem elas adiantam muito... e´ ta˜o dif´ıcil consertar
um programa mal feito, que e´ mais fa´cil re-aprender a programar e fazer outro
programa.
Parte I
Usandos os comandos em
Portugueˆs
17
Cap´ıtulo 1
Uma primeira suite de
programas
1.1 Como rodar um programa.
Depende do que voceˆ dispo˜e como ambiente de programac¸a˜o.
Infelizmente alguns ambientes tem mais o objetivo de se apoderarem do
usua´rio do que ajuda´-lo a ser um indiv´ıduo livre e criativo. Mas, se voceˆ com-
prou este livro, enta˜o voceˆ quer ser livre e criativo, logo se prepare para descobrir
as coisas por si pro´prio e conte com algum aux´ılio por parte deste livro, mas na˜o
espere que o livro seja uma muleta para quem na˜o quer superar as suas pro´prias
dificuldades. Use o enderec¸o eletroˆnico do autor1 para tirar algumas du´vidas,
mas fac¸a 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¸a˜o, para ser franco, treˆs 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 atenc¸a˜o o primeiro, C da Borland, que e´ consi-
derado por todos trabalham como esta linguagem como o melhor existente para
Windows. Tambe´m 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 padro˜es habituais de ambientes
gra´ficos 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 na˜o e´ um manual para estes ambientes,
e sim um livro para ensina´-lo a programar em C, portanto a nossas discussa˜o
1tarcisio@member.ams.org
19
20 CAPI´TULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS
sobre ambientes de determinados pacotes, tem que ser breve. Ale´m do mais,
todos estes pacotes computacionais tem manuais que lhe podera˜o apresentar
suas possiblidades de forma muito mais efetiva do que no´s poderiamos fazer
aqui.
A melhor forma para dominar estes ambientes integrados de programac¸a˜o
consiste em gastar algum tempo descobrindo a funcionalidade dos boto˜es que
eles oferecem. Voceˆ podera´ fazer isto com tranquilidade e sem o menor receio de
estragar o sistema, porque ele foi feito para ser usado. A pior coisa que poderia
acontecer seria que voceˆ apagar algum programa gravando outro por cima, e isto
com certeza vai acontecer em algum momento, portanto e´ melhor que acontec¸a
logo no comec¸o quando o prejuizo ainda sera´ pequeno... Portanto perca algum
tempo experimentando os boto˜es do ambiente integrado.
Os dois outros ambientes sera˜o apenas citados, se voceˆ na˜o tiver opc¸a˜o para
trabalhar em LinuX, devera´ completar o conteu´do deste livro com o manual
do C correspondente, mas fique tranqu¨ılo, as diferenc¸as sa˜o pequenas e sa˜o
importantes apenas no comec¸o.
1. O ambiente BC Suponhamos que voceˆ esteja no Windows e que esteja
usando o BC, Borland C. Como ja´ disse, gaste algum tempo para reco-
nhecer o ambiente integrado2 do BC, o IDE3. Ele se chama assim, ambi-
ente integrado, porque lhe oferece um atelier onde produzir os programas,
guarda´-los, e automaticamente roda´-los. Observo que voceˆ tambe´m corre
o risco se tornar excessivamente dependente do ambiente integrado, pro-
cure evitar esta dependeˆncia, e fac¸a um uso inteligente do ambiente, aos
poucos voceˆ mesmo vera´ o que esta adverteˆncia significa.
Assim que voceˆ tiver gasto uns quinze minutos experimentando o ambiente
integrado, passe para o quarto item desta lista.
Ao estabelecer quinze minutos estamos exatamente querendo lhe dizer que
na˜o procure entender tudo que se encontra a` sua disposic¸a˜o dentro do am-
biente integrado, e voceˆ logo vai ver que, se aprender a programar correta-
mente, muitas das “ferramentas”dispon´ıveis sa˜o inu´teis, e, pelo contra´rio,
se voceˆ vier a precisar delas isto significa que estara´ programando mal....
e a´ı sera´ preciso, de fato, usar estas ferramentas.
Parte do que ha´ dispon´ıvel no ambiente integrado so´ lhe sera´ u´til mais a
frente, quando seus programas ganharem mais densidade e ja´ estiverem
caminhando na direc¸a˜o de um projeto.
Digamos que, no momento, o mais importante e´ aprender a
• abrir um arquivo, (co´digo fonte), encontrar um arquivo no disco; Para
isto use o bota˜o File. Experimente agora, clique no bota˜o e vai cair
um menu com
(a) new, (novo) se voceˆ quiser comec¸ar um novo programa. Nunca
fac¸a isto! Entre os meus programa tem um que se chama esqueleto.c,
2muito semelhante ao ambiente do Turbo C
3IDE - Integrated Development Environment
1.1. COMO RODAR UM PROGRAMA. 21
comece abrindo este programa para na˜o comec¸ar do zero... Crie
um esqueleto.c para voceˆ.... Veja abaixo o que voceˆ pode fazer
com “esqueleto.c” !
(b) open para voceˆ abrir um programa existente no disco. Voceˆ pode
indicar o caminho onde o BC deve procurar o arquivo;
(c) save para voceˆ gravar o programa que estiver escrevendo, ob-
serve que basta acionar F2
(d) save as, (gravar como), para voceˆ escolher um outro nome de ar-
quivo onde gravar o programa. Use esta opc¸a˜o com o “esqueleto.c”.
Abra esqueleto.c e o grave com o nome que desejar. Voceˆ ja´
tera´ o novo programa na sua frente depois que fizer isto. Expe-
rimente, abra “esqueleto.c” e o grave como “teste.c”.
(e) change dir e´ para mudar direto´rio, provavelmente pouco u´til no
comec¸o.
(f) print para enviar para a impressora uma co´pia do programa que
estiver na tela.
(g) DOS shell para usar o DOS, pouco u´til para os usua´rios do windows...
(h) quit quando voceˆ quiser ir embora...
• procurar uma palavra num arquivo e trocar palavras erradas e isto
voceˆ vai fazer com o bota˜o search, (procura). Nos editores de texto,
em geral isto se faz com o bota˜o edit, aqui na˜o. Se voceˆ quiser
traduzir para o ingleˆs os nosso programas, vai usar este bota˜o. Nele
tem
(a) find para procurar uma palavra.
(b) replace para procurar e trocar palavras. Va˜o aparecer dois
campos, no primeiro para voceˆ indicar qual a palavra que deve
ser trocada, no segundo, o que a deve substituir.
Ha´ va´rias opc¸o˜es para voceˆ ligar ou desligar sensı´vel a` maı´uscula,
palavras completas, express~oes regulares, pergunta ao trocar,
forward (pra frente), backward (pra tra´s), from cursor (a par-
tir do cursor), entire scope (no documento todo), OK, change
all (muda tudo), cancel e help...
(c) go to line number (vai para uma linha de nu´mero), e espera
que voceˆ indique o nu´mero da linha.
• rodar o programa guardado num arquivo. Voceˆ vai usar o botaˆo run.
Quando clicar cai um menu contendo
(a) run que vai rodar o programa
(b) program reset, bota˜o important´ıssimo.
Quando voceˆ tiver rodado um programa e, depois, fizer modi-
ficac¸o˜es, se pedir para rodar, o BC vai rodar o anterior.
Clique no program reset - (renova o programa), e depois no
run.
Este e´ um erro comum, se voceˆ alterar um programa e tudo voltar
acontecer como antes, se lembrede fazer o reset.
22 CAPI´TULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS
• compilar um programa. Voceˆ vai fazer isto com o bota˜o compile.
Clique no bota˜o e ao cair o menu, escolha compile.
• configurar os direto´rios de trabalho Se voceˆ tiver instalado o pacote
usando o instalador enta˜o na˜o tem porque se preocupar com este
item. Se sua instalac¸a˜o na˜o for a padronizada voceˆ corre riscos de
que o C da Borland na˜o encontre os arquivos necessa´rios. Neste caso
voceˆ deve ir ao bota˜o Options, la´ escolher a Directories (direto´rios)
e registrar cuidadosamente a a´rvore dos direto´rios onde se encontram
os arquivos. Veja na figura (fig. 1.1) pa´gina 22, como se encontra
Figura 1.1: a´rvore de direto´rios - BC
organizada a a´rvore de direto´rio no meu micro de trabalho. E´ pre-
ciso indicar o disco e todo o caminho anterior aos direto´rios que BC
procura:
BGI BIN OUT BINOUT INCLUDE LIB
Ao abrir o item Directories voceˆ ja´ deve encontrar uma sec¸a˜o de
arquivos. Veja se tudo esta´ de acordo com sua instalac¸a˜o.
• help
C da Borland tem um aux´ılio (help) muito bom que e´ preciso apren-
der a usar. Infelizmente na˜o ira´ funcionar com os programas escritos
em portugueˆs. Experimente o programa4 primeiro01.c. O comando
4os programas para BC ganharam nomes mais curtos, em vez de primeiro01.c, procure
prim01.c
1.1. COMO RODAR UM PROGRAMA. 23
inicial do programa e´ clsscr(); que serve para limpar a tela. Co-
loque o cursor sobre esta palavra e aperte ctrl-F1. O resultado
e´ uma pequena5 janela com informac¸o˜es espec´ıficas sobre este co-
mando. Aprenda a fazer uso destas informac¸o˜es, elas sa˜o um manual
da linguagem on-line. Para sair do help, acione a tecla ESC.
Se voceˆ apertar F1 vira´ o manual do C da Borland. E´ um conjunto
de va´rias janelas descrevendo toda a linguagem. Eu na˜o poderia
deixar de sugerir que voceˆ se habituasse a ler este manual on-line.
Infelizmente em ingleˆs, mas se voceˆ na˜o se acostumar a, pelo menos,
ler em ingleˆs, ficara´ cortado de grande parte das informac¸o˜es tecnico-
cient´ıficas. Voceˆ sai do manual acionando a tecla ESC.
2. O ambiente C da Microsoft Se voceˆ estiver o usando o Microsoft C,
tambe´m voceˆ vai dispor de um ambiente integrado bem parecido com o
ambiente do Borland C.
Leia o item anterior e gaste uns 15 minutos para ganhar experieˆncia com
o Microsoft C e depois passe para o quarto item desta lista. O objetivo
principal e´ carregar um programa para dentro do editor de textos e depois
roda´-lo. Valem as mesmas observac¸o˜es que ja´ fizemos sobre a configurac¸a˜o
da a´rvore de direto´rios. Nenhum sistema operacional pode advinhar onde
se encontram os seus programas ou os arquivos de dados, tudo isto tem
que ser registrado nas opc¸o˜es.
Como sempre, o ideal e´ instalar os pacotes usando o programa apropriado
para isto, ele se ocupara´ de toda a configurac¸a˜o ba´sica. Na˜o fazer isto e´
querer dores de cabec¸a. Se voceˆ for um usua´rio experiente, podera´, possi-
velmente, brincar com a configurac¸a˜o, caso contra´rio use os instaladores.
3. Em ambiente Linux Em geral ningue´m instala Linux manualmente6,
tudo e´ feito por um instalador que vem junto com a distribuic¸a˜o adqui-
rida. Estes instaladores, habitualmente, deixam a linguagem C instalada
corretamente, ate´ mesmo porque C e´ a linguagem natural para Linux, de
modo que, tudo que voceˆ tem que fazer e´ trabalhar com seus programas
no seu direto´rio pessoal.
Em LinuX voceˆ conta com diversos ambientes integrados, por exemplo,
wpe, xwpe, xcoral, xemacs ou o espartano joe, para citar alguns.
Em alguns deles voceˆ deve indicar o modo com que deseja trabalhar, o
modo C . O xemacs entra no modo C automa´ticamente se voceˆ abrir um
arquivo com extensa˜o “.c”. Se o xemacs estiver bem instalado voceˆ pode
contar com um ambiente integrado muito poderoso lhe oferecendo inclusive
uma ajuda “on-line” sobre os conceitos da linguagem. Aprenda a usar o
ambiente integrado que voceˆ tiver escolhido. Se voceˆ tiver pacieˆncia para
usa´-lo, tera´ uma poderosa ferramenta nas ma˜os.
5se na˜o funcionar, coloque o cursor sobre a palavra, clique no bota˜o help e, no menu que
cair, escolha topic search; procure help no ı´ndice remissivo
6nem Linux, e nem nenhum outro sistema complexo
24 CAPI´TULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS
Se tiver escolhido joe a´ı voceˆ vai penar um pouquinho mais, mas foi porque
voceˆ mesmo quis...eu uso o joe e me dou muito bem. joe e´ um editor
de textos muito poderoso mas dif´ıcil de usar pois e´ orientado a comandos
no padra˜o dos editores da Borland, do Turbo C ou do Turbo Pascal, ou
ainda do “wordstar” dos anos 80 que foi um poderoso ambiente de edic¸a˜o
para aquela e´poca.
Ainda existe uma outra possibilidade, seria usar o vi, mas se esta for a sua
escolha, enta˜o, fora de du´vidas voceˆ pertence a facc¸a˜o mais xiita do Unix
e eu na˜o tenho du´vidas de que voceˆ esta´ lendo este livro somente para sa-
can(*) o autor... porque certamente voceˆ deve ser um ex´ımio programador
em C.
4. Comec¸ando a trabalhar Suponhamos que voceˆ ja´ tenha ganho experieˆn-
cia com o ambiente integrado de sua escolha. Abra agora uma janela de
edic¸a˜o. Escolha o primeiro bota˜o a` esquerda onde estiver escrito “FILE”ou
“ARQUIVO”.
Se o ratinho7na˜o estiver dispon´ıvel, voceˆ pode chegar ao menu superior
com F108 e depois manipular os boto˜es do menu usando as setas para
esquerda, direita ou para baixo.
Clique com o ratinho, (ou com a seta para baixo) e escolha “open” ou
“abrir”, para abrir um dos programas que voceˆ ja´ deve ter gravado no
HD. Este in´ıcio sera´ semelhante em todos os ambientes. Escolha o pri-
meiro programa abaixo e rode-o. Os manuais que acompanham BC ou
Microsoft C trazem programas bem elementares do tipo “primeiro.c”e
lhe informam como roda´-lo. E´ tudo que voceˆ precisa para comec¸ar, depois
aos poucos voceˆ ira´ aprendendo como usar melhor o ambiente ate´ o limite
do necessa´rio, (ou se preferir, fique um expert no uso destes ambientes...).
5. Em LinuX a coisa pode ser ta˜o simples como escrever numa ”shell”9
gcc -v primeiro.c -oprimeiro
ou
gcc -Wall primeiro.c -oprimeiro
em que
• gcc e´ o nome do compilador produzido e distribuido pela Fundac¸a˜o
GNU, “g”indica isto, “cc”signfica “compilador c”.
• -v e´ sua solicitac¸a˜o de “verbosidade”, voceˆ deseja que o compilador
lhe diga o que fizer. Evite esta opc¸a˜o no comec¸o, para na˜o se afogar
nas informac¸o˜es que lhe sera˜o apresentadas. Use -Wall em vez de
-v.
7tambe´m chamado mouse....
8em alguns casos sera´ com F9, ESC ou TAB, sem du´vida, e´ melhor garantir que o ratinho
funcione...
9uma a´rea de trabalho
1.1. COMO RODAR UM PROGRAMA. 25
• -Wall Parecido com -v, mas lhe apresenta apenas as reclamac¸o˜es
mais importantes, muito bom para quem se inicia.
• primeiro.c e´ o nome do arquivo-fonte10.
• -o e´ a opc¸a˜o de compilac¸a˜o que indica qual e´ o nome do arquivo que
devera´ ser criado. Neste exemplo escolhi primeiro.
Em princ´ıpio o Borland C aceita alguma coisa do tipo:
bc primeiro.c
para fazer o que descrevemos acima, produzindo um arquivo chamado
primeiro.exe. Pore´m, voceˆ tera´ dificuldades com o caminho para que
BC encontre o programa que voceˆ deseja compilar. A forma mais sim-
pels de usar Borland C e´ mesmo dentro do ambiente integrado onde voceˆ
facilmente configura os direto´rios em que se encontram os seus programas.
Vamos supor o uso do ambiente integrado11. Abra um programa, prim01.c,
por exemplo. Com o programa vis´ıvel na janela de edic¸a˜o, clique no bota˜o
RUN e seu programa sera´ compilado e em seguida executado. Os programas
deste livro podem ter12 um defeito que sera´ preciso corrigir, para que eles
funcionem bem em C da Borland. Vamos descrever o “problema” e a
soluc¸a˜o:
• Quando um programa termina de ser executado, dentro do ambiente
integrado, o ambiente automaticamente retorna ao texto do programa
(co´digo fonte). Consequ¨eˆncia, voceˆ pode na˜o ver o resultado do pro-
grama. Para programa pequenos, como os nossos primeiros progra-
mas, voceˆ pode ficar coma sensac¸a˜o de que nada aconteceu...
• De fato isto na˜o e´ um problema, voceˆ logo vera´ que e´ uma vantagem,
porque assim o ambiente o tra´s de volta ao texto do programa (co´digo
fonte) colocando uma marca vermelha em cima de algum erro que o
compilador tenha encontrado.
• Mas se na˜o houver erros, e´ decepcionante... e voceˆ podera´ evi-
tar acrescentando no programa, antes do comando return13, o co-
mando getchar() Tentamos incluir em todos os programas o co-
mando pausar() que e´ uma redefinic¸a˜o do getchar(), mas podere-
mos ter esquecido em algum caso. Se na˜o acontecer nada, verifique
ao final do programa se na˜o falta pausar() ou getchar().
Dentro do Windows/DOS, um arquivo so´ pode ser executado, se terminar
com as extenso˜es
.exe .com .bat
10arquivo fonte e´ o arquivo em que se encontra o programa que voceˆ escreveu
11IDE
12tentamos eliminar este problema, mas ainda pode ter ficado em algum programa, voceˆ
deve, enta˜o ser alertado
13que por regra, todos os programas em C devem ter como u´ltima instruc¸a˜o
26 CAPI´TULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS
Em LinuX na˜o e´ o nome que indica isto, mas alguns dados internos do ar-
quivo e gcc se ocupa disto, ”primeiro", compilado com as intruc¸~oes
descritas acima, sera´ um programa executa´vel.
Observac¸a˜o: 2 Erros e problemas
Problemas ao usar BC. Observe que, ao enumerar problemas, na˜o estamos
sugerindo que um pacote e´ de baixa qualidade. Na˜o existem grandes programas,
sem erros, a na˜o ser os programas mais mais simples. O defeito se encontra em
esconder os erros. Isto e´ de fato indecente. Este livro tinha muitos erros que
foram corrigidos com aux´ılio de leitores amigos.
Dificilmente conseguiriamos listar todos os problemas, mas indicaremos al-
guns mais importantes no momento apropriado, como agora.
Quando voceˆ rodar um programa, se fizer uma alterac¸a˜o no mesmo, observe o
item program reset (re-inicializac¸a˜o do programa) dentro do menu RUN. Com
frequ¨eˆncia o compilador guarda na memo´ria a versa˜o anterior do programa.
Eis a raza˜o deste bota˜o. Aperte o bota˜o antes de voltar a compilar ou rodar o
programa.
Se voceˆ ainda na˜o apertou em todos os boto˜es do ambiente integrado que
estiver usando, fac¸a-o agora, para pelo menos ver o que eles conte´m.
Se voceˆ na˜o alterar nada, na˜o ira´ estragar nada, tambe´m...olhar na˜o faz
mal14.
Vocabula´rio: 1 compilar, compile, executa´vel, rodar, run
• compilar em ingleˆs, compile, e´ uma das func¸o˜es do “compilador”, fazer
uma ana´lise sinta´tica do co´digo fonte para verificar se as regras (sintaxe)
da linguagem de programac¸a˜o foram todas respeitadas. Se isto for verdade,
o compilador cria um executa´vel.
• executa´vel e´ um arquivo que o sistema operacional considera que pode fa-
zer algum processo, produzir um resultado. Este e´ o objetivo principal dos
programas de computador...este conceito se opo˜e ao de co´digo fonte. Ao
criar um executa´vel, este programa podera´ ser executado em outro com-
putador, que roda o mesmo sistema operacional. Se voceˆ tiver compilado
com o BC, podera´ rodar o programa em qualquer computador sob Windows.
Se voceˆ tiver compilado com gcc, podera´ roda´-lo em qualquer computador
sob Linux15.
• co´digo fonte e´ o texto que voceˆ escreveu como programa e gravou em um
arquivo no disco. Ele precisa ser compilado para que seja gerado um exe-
cuta´vel que o sistema operacional ira´ permitir que rode.
• rodar, em ingleˆs run, executar um programa.
Agora vamos apresentar-lhe um bloco de exerc´ıcios. Voceˆ na˜o conseguira´
aprender nada sem fazer exerc´ıcios, muito menos podera´ aprender a programar
14algumas vezes, talvez...
15existe um compilador gratuito, djdev para DOS/Windows, veja no ı´ndice remissivo
1.1. COMO RODAR UM PROGRAMA. 27
sem fazer exerc´ıcios de programac¸a˜o16. A grande maioria dos programas deste
livro, sa˜o exerc´ıcios. Os programas “dialogam” com voceˆ pedindo que voceˆ
volte a ler o programa e corrija erros que deixamos nos programas. Em geral o
programa seguinte conte´m a correc¸a˜o de um erro, e mais outro erro...
Exerc´ıcios: 1 Os primeiros programas
O objetivo deste bloco de exerc´ıcios e´ a compreensa˜o do programa
primeiro.c
Vamos enta˜o pedir que voceˆ
rode e leia,
nesta ordem, os programas primeiro01.ca, primeiro02.c, ...
primeiro07.c que ira˜o desembocar em primeiro.c que se encon-
tra editado a seguir.
apara DOS,Windows, use os programas com nomes curtos, prim01.c,
prim02.c,. . . porque primeiro01.c se confunde com primeiro02.c
1. Rode e depois leia primeiro01.c.
gcc primeiro01.c -Wall -oprog
./prog17
2. Volte a a rodar e ler primeiro01.c procurando entender cada linha de
comando do programa. Em particular leia os “comenta´rios”, o texto inicial
do programa, e veja como ele se encontra destacado do corpo do programa.
Analise o objetivo dos comenta´rios, inclusive o registro de que o programa
conte´m erros.
3. Corrija o comenta´rio de primeiro01.c indicando qual e´ o erro o programa
comete: a falta de \n.
4. Rode e depois leia primeiro02.c.
gcc primeiro02.c -Wall -oprog
./prog
Altere o programa, como ele mesmo sugere, e tente compila´-lo, analise a
mensagem de erro. Experimente apagar alguns “ponto-e-v´ırgulas”, com-
pile e analise a mensagem de erro. A falta de um u´nico “ponto e v´ırgula”
pode gerar uma imensida˜o de mensagens de erro. Experimente, apague18
um “ponto-e-virgula” e compile o programa. Esta e´ uma dificuldade que
os compiladores teˆm, antes se perder na leitura de uma enxurrada de men-
sagens de erro verifique se na˜o falta um simples ‘ponto e v´ırgula”.
5. Rode o programa primeiro03.c. Ele mente, corrija-o.
16repetiremos mais ainda algumas vezes esta observac¸a˜o, para conscientiza´-lo de que na˜o
sera´ apenas lendo, que aprendera´ a programar
17se o sistema estiver bem instalado na˜o sera´ necessa´rio “./”, bastara´ “prog”...
18voceˆ na˜o precisa apagar, basta colocar // na frente
28 CAPI´TULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS
6. Rode os programas primeiro04.c, primeiro05.c e fac¸a o que eles suge-
rem.
7. Leia e rode o programa primeiro06.c. Este programa e´ um contra-
exemplo. Ficou muito grande, saiu da tela. Veja como ele e´ extranho,
tem uma linha de nu´mero 12 que aparece va´rias vezes, isto e´ um sintoma
de imperfeic¸a˜o...
8. Melhore a redac¸a˜o no programa primeiro07.c, tem letra ma´ıscula depois
de v´ırgula, e precisa de algumas mundac¸as de linhas... mas tome cuidado
para que o resultado na˜o fique ileg´ıvel...
9. Um exerc´ıcio importante: como re-utilizar um programa. Escolha algum
dos programas que voceˆ acabou de usar, algum que lhe tiver parecido es-
pecial. Grave-o com outro nome, por exemplo teste.c19. Em Linux sera´
o mesmo se voceˆ estiver usando alguma IDE, ou numa,20 shell, digite
cp primeiro01.c teste.c
Agora voceˆ tem o mesmo texto de primeiro01.c (ou prim01.c) dentro
do arquivo (ainda na˜o gravado) teste.c. Rode este novo programa depois
que voceˆ nele fac¸a algumas modificac¸o˜es que lhe parec¸am interessantes.
Este e´ o me´todo que no´s, programadores, usamos para construir novos
programas...nunca comec¸amos do zero.
No u´ltimo exerc´ıcio lhe contamos o segredo de como escrever novos progra-
mas. Deixe-me contar-lhe outro. Entre os programas que voceˆ recebeu esta˜o
dois iguais, esqueleto.c e padrao.c. Sa˜o este programas que usamos para
comec¸ar a escrever outro.Crie os seus, com os seus dados, e com as estruturas
de programac¸a˜o que considerar ba´sicas.
O texto abaixo e´ uma co´pia do arquivo primeiro.c que voceˆ tem no disco.
Nele na˜o ha´ os sinais de acentuac¸a˜o da lingua portuguesa, e´ um programa de
computador e na˜o um texto em nossa lingua.
/∗ Programa primeiro.c
Assunto: Escreve algumas frases e recebe uma informacao pelo teclado.
Programa com erros na saida de dados, nao imprime o que se espera.
COMENTARIO
Este texto inicial do programa eh um COMENTARIO e
se encontra demarcado com ”barra+asterisco”no
inicio e depois ”asterisco+barra”ao final.
Programa define a variavel ’coisa’ como um vetor de caracteres
com30 coordenadas.
por Tarcisio Praciano Pereira - 10 licoes para aprender C
Sobral, julho de 2001 - UVA
∗/
// isto aqui tambem eh um COMENTARIO
19no BC escolha “save-as” e use a caixa de dia´logo que aparece para, nela, escrever teste.c
20a´rea de trabalho
1.1. COMO RODAR UM PROGRAMA. 29
#include < stdio.h >
#include ”traducao.h”
principal()
inicio
palavra coisa[30]; // variavel
imprima(”%s\n”, ”Escreva uma frase no teclado, ”);
imprima(”%s\n”, ”pode ser o seu nome, por exemplo: ”);
ler(”%s”, coisa);// leitura de dados pelo teclado
imprima(”%s\n”,-————————————–”);
imprima(”Voce escreveu: %s %c\n”, coisa,’ ?’);
imprima(”%s\n”,-———————————–”);
imprima(”%s\n”,”Agora leia o programa para ”);
imprima(”%s\n”,”acompanhar a critica que vai ser feita.”);
imprima(”%s\n”,-————————————–”);
imprima(”%s\n”,”Observe que ’ler’ nao obedeceu a regra”);
imprima(”%s\n”,”de uso do direcionador & de enderecos,”);
imprima(”%s\n”,”como anunciamos no texto....”);
voltar 0; // todo programa deve terminar com este comando
fim
Exerc´ıcios: 2 Ana´lise de primeiro.c
1. Rode o programa primeiro.c e depois o leia.
2. Ao compilar primeiro.c, voceˆ recebeu uma adverteˆncia:
primeiro.c:22: warning: return-type defaults to int
porque foi omitido o tipo de principal() e ao final o valor devolvido e´
zero. Um conflito. Corrija isto, dado um tipo para principal():
inteira principal()
A adverteˆncia se compo˜e de treˆs partes, separadas por “dois pontos”que e´
o “separador oficial do Unix:
• primeiro.c o nome do programa;
• 22 a linha em que o erro foi detectado;
• warning, um aviso. Se o erro for mais grave sera´ error. E´ o tipo
de dados da func¸a˜o principal() que na˜o foi fornecido.
Em C todas as func¸o˜es ou varia´veis tem que ter um tipo.
3. Rode o programa primeiro.c digitando o seu nome sem espac¸os.
4. Digite uma sequ¨eˆncia de mais de 30 caracteres como resposta ao programa,
e analise o resultado.
30 CAPI´TULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS
A soluc¸a˜o para que o compilador deixe de reclamar contra primeiro.c e´
definir
inteira principal()
Deixamos este erro ficar de propo´sito, para justificar esta observac¸a˜o. Ao mesmo
tempo acrescentamos: somente na segunda parte e´ que discutiremos a fundo a
questa˜o do tipo de dados a que se encontra afeto este problema.
Infelizmente vamos ter que trabalhar com tipos de dados antes de conse-
guirmos explicar tudo direitinho eis a raza˜o do erro ter ficado. Afinal, erros sa˜o
parte do aprendizado...
Se voceˆ quiser avanc¸ar este assunto, veja o cap´ıtulo 7 onde discutimos tipos
de dados, voceˆ deve, agora, fazer uma leitura ra´pida daquele cap´ıtulo para se
inteirar desta noc¸a˜o.... e voltar logo para ca´.
Voceˆ esta´ aprendendo a programar em C, com os comandos traduzidos para o
Portugueˆs, e os programas em portugueˆs estara˜o rodando...
No pro´ximo cap´ıtulo trabalharemos com a suite de programas “prog*.c”...
la´ discutiremos esta notac¸a˜o extranha, formatadores de dados que aparecem
dentro da func¸a˜o imprima(). Mas pode fazer uma leitura ra´pida do cap´ıtulo 2
agora.
Exerc´ıcios: 3 Alterando primeiro.c
Os dois u´ltimos exerc´ıcios desta lista esta˜o fora do contexto, e portanto sa˜o
dif´ıceis para o iniciante. Eles se eoncontram aqui apenas para mostrar alguma
coisa do que pode ser feito com C.
1. Altere o texto dentro da func¸a˜o imprima(), por exemplo, mande escrever
o seu nome.
2. Altere substancialmente o texto de todas as func¸o˜es imprima() no pro-
grama, por exemplo, mande escrever os nomes dos seus amigos e amigas.
3. Altere o texto das func¸o˜es imprima do programa, por exemplo, para escre-
ver uma pequena lista telefoˆnica. Pode ser a sua lista telefoˆnica particu-
lar...
4. Voceˆ viu que um programa pode colocar um texto na tela, altere primeiro.c
para colocar um texto seu na tela do computador, por exemplo, um lem-
brete sobre as coisas que voceˆ deve fazer no dia. O executa´vel assim criado,
pode ser incluido no autoexec.bat do DOS/Windows e rodar sempre que
voceˆ ligar o computador.
1.1. COMO RODAR UM PROGRAMA. 31
5. ** fora do contexto Rode o programa agender01 p.c e depois o leia:
gcc -Wall -oprog agender01 p.c
./prog
A primeira linha serve para compilar o programa, quer dizer, pedir ao gcc
que crie um programa executa´vel a partir do co´digo fonte. A segunda linha
e´ para executar o arquivo executa´vel prog.
6. ** fora do contexto Se voceˆ quiser compor sua lista telefoˆnica em disco,
veja agender01 p.c. Tente modificar o programa, sem se preocupar com
entendeˆ-lo, e fac¸a sua agenda. Se precupe apenas com alterar as mensa-
gens dentro das func¸o˜es imprima(), imprime arq(). O arquivo produ-
zido pelo programa podera´ ser lido, e editado, depois, com qualquer editor
de textos e enviado para a impressora.
32 CAPI´TULO 1. UMA PRIMEIRA SUITE DE PROGRAMAS
Cap´ıtulo 2
O segundo programa em C
2.1 Programas e erros...
Observac¸a˜o: 3 Regras de trabalho
• Vamos sempre comec¸ar por lhe apresentar um programa;
• voceˆ deve digita´-lo1 num editor de textos2;
• depois rode o programa com o compilador que estiver a` sua disposic¸a˜o
e em seguida leia os comenta´rios que faremos e tambe´m os comenta´rios
feitos pelo compilador, sobretudo porque voceˆ pode ter esquecido de digitar
algum direcionador de memo´ria & ;
• tome a iniciativa de fazer alterac¸o˜es nos programas usando a experieˆncia
que for adquirindo, mas grave-os com nomes diferentes; Aqui voceˆ vai ad-
quirir experieˆncia sobre um erro muito comum: perder programas porque
gravou por cima algum outro programa. Esta e´ uma dor de cabec¸a co-
mum a todos os programadores. Tenha por ha´bito fazer backup, co´pia de
reserva, dos seus programas. Tenha o cuidado de gravar a alterac¸a˜o de
um programa, com outro nome:
prog01.c prog02.c ...prog101.c
e voceˆ vai sempre encontrar o mais recente, ou algum mais antigo que
funcionava ta˜o bem. . .
• aos poucos deixaremos de transcrever os programas no livro, e´ mais pra´tico
que voceˆ leia os programas com um editor de textos, inclusive quando os
rodar, e´ interessante teˆ-los numa tela ao lado.
1Todos os programas do livro se encontram distribuidos em disco para economisar-lhe a
digitac¸a˜o. Basta “carrega´-los” para o editor.
2grave os programas no modo texto, (sem acentos) Se voceˆ estiver usando alguma IDE
(ambiente integrado) o editor e´ pro´prio para programac¸a˜o. Se estiver usando algum editor
como word, tome o cuidado para gravar os programas no modo texto.
33
34 CAPI´TULO 2. O SEGUNDO PROGRAMA EM C
Exemplo: 2 O primeiro programa
/* Programa prog01.c
Assunto: le uma palavra pelo teclado e a imprime
por Tarcisio Praciano Pereira - 10 licoes para aprender C
Sobral, julho de 2002 - UVA
*/
# include < stdio.h > // (1) leitura da biblioteca stdio.h
# include ”traducao.h”// (2) leitura da biblioteca traducao.h
inteiro principal() // (3) inicio do programa, tipo palavra
inicio
palavra coisa; // (4) declaracao de variavel
imprima(”%s\n”,
”escreva alguma coisa pelo teclado, palavra, numero...”); // (5)
ler(”%c”,&coisa); // (6)
imprima(”%s%c\n”,”O primeiro caracter da coisa foi −− > ”,coisa); // (7)
imprima(”%s\n”,”==========================”);
voltar(0); // (8)
fim // (9)
Comenta´rios do programa.
Os comenta´rios sa˜o parte integrante de um programa e de forma alguma
devem ser considerados um “apeˆndice extra perfeitamente dispensa´vel”. Um
programa e´ uma pec¸a de abstrac¸a˜o, escrito em linguagem te´cnica, em geral
muito conciso, e, consequentemente, dif´ıcil de ser lido. Os comenta´rios veˆm
suprir informac¸o˜es complementares e tornam o programa leg´ıvel.
Comenta´rios podem ser caracterizados de duas formas:
• Com duas barras, “//”. O compilador ignora o que venha depois ate´ o
final da linha.
• Entre os sinais ’/’ e ’*’ no comec¸o, e revertidos ao final ’*’ e ’/’. Veja
logo no inicio do programa.
Quando se vai escrever um comentario longo, este segundo metodo,e´ o mais ade-
quado. Pequenos comenta´rios, como acima, depois de um comando, e´ preferivel
usar o primeiro metodo. Mas a decisa˜o e o estilosa˜o seus. Ha´ programadores
que usam colunas de asteriscos no in´ıcio e no final de cada linha de um bloco
de comenta´rios para torna´-lo mais ostensivo. Vale tudo, desde que voceˆ na˜o se
atrapalhe (nem atrapelhe os outros) com a poluic¸a˜o visual...
Os comenta´rios servem para explicar o programa (inclusive para o pro´prio
autor...) ou tambe´m como parte do planejamento do trabalho. No inicio do
programa os comenta´rios dizem o que o programa faz, quem fez o programa,
as modificac¸o˜es que se pretendem fazer nele, os defeitos que ainda existam, etc...
2.1. PROGRAMAS E ERROS... 35
Os comenta´rios que fizemos usando “//” tem uma numerac¸a˜o que vai servir
de refereˆncia para uma sec¸a˜o de observac¸o˜es que costumamos fazer ao final dos
programas. Veja, por exemplo, musica.c, na˜o tente compreender o programa
agora, veja apenas como estamos usando os comenta´rios numerados. E, claro,
voceˆ pode rodar e ler o programa, mas observe (leia o programa) ele necessita
que no sistema exista um programa chamado bell que acione o alto-falante
do computador. Troque bell pelo nome certo. Se este programa na˜o existir
nada vai acontecer.
1. A linguagem C, como toda linguagem moderna, e´ expans´ıvel, quer dizer,
voceˆ pode criar novos comandos, sa˜o as func¸o˜es. Cada func¸a˜o e´ um novo
comando. Estes comandos novos ficam com frequ¨eˆncia dentro de arquivos
chamados ’bibliotecas’. O programa comec¸a lendo a biblioteca padra˜o do
C para Input/Output - < stdio.h > Entrada/Saida. Leia tambe´m a nossa
biblioteca, traducao.h, em que fizemos as traduc¸o˜es dos comandos da
linguagem C. As bibliotecas sa˜o arquivos com a extensa˜o “.h” e ficam
colocados em direto´rios espec´ıficos que o gcc sabe quais sa˜o. Quando
quisermos incluir uma biblioteca nossa, como “traducao.h”, temos que
usar aspas em volta da biblioteca e enta˜o gcc vai procura´-la no direto´rio
de trabalho, ou no direto´rio indicado pelo caminho que indicarmos:
# include "/home/meu nome/C/minha biblioteca.h"
2. erro grave concluir da observac¸a˜o anterior que voceˆ pode construir uma
linguagem C especial para voceˆ, com seus pro´prios comandos. E´ verdade,
mas seria inu´til. Linguagens, mesmo de computador, existem para que
as pessoas se comuniquem. O conhecimento e´ social e na˜o individual.
So´ podemos ser avanc¸ados na medida em que o grupo social o seja junto
conosco. Na˜o teria sentido criar o seu C! Mas tem sentido pensarmos em
programar em Portugueˆs, aqui no Brasil, e seguir entendendo programac¸a˜o
em Ingleˆs.
3. Exerc´ıcio: Experimente! Apague
# include < stdio.h >
e rode o programa:
gcc -Wall prog01.c -oprog.
Como resultado voceˆ vai receber a informac¸a˜o que printf(), scanf()
esta˜o sendo usados pela primeira:
prog01.c:14:
warning: implicit declaration of function ‘printf’
O gcc vai ignorar, pedantemente, a nossa traduc¸a˜o ”imprima”e vai lhe fa-
lar de ”printf”fazendo o mesmo com ”scanf”. Porque no´s na˜o traduzimos
o compilador.
4. estrutura de um programa Ha´ dois tipos de func¸o˜es num programa:
36 CAPI´TULO 2. O SEGUNDO PROGRAMA EM C
• main() A func¸a˜o “principal()”,
• e as outras que a “principal()”chama.
Todo programa tem que ter uma func¸a˜o principal() e depois deve ter
outras func¸o˜es que executam tarefas espec´ıficas, tarefas auxilia´res.
Neste programa a func¸a˜o “principal()”chama apenas outras func¸o˜es que
se encontram definidas na biblioteca ’stdio.h’. Portanto as outras func¸o˜es
podem ja´ existir em alguma bibilioteca e inclusive podem ja´ ter sido usadas
e testadas por outro programa (melhor ainda).
5. Cada func¸a˜o e´ um pequeno programa. Neste sentido a linguagem C ja´
nasceu “moderna”, no espirito de programac¸a˜o modular. Um programa se
constitui essencialmente de sua func¸a˜o principal que ira´ colocar em ac¸a˜o
os demais atores, as outras func¸o˜es, que foram feitas sob-medida para
executar pequenas tarefas espec´ıficas. Assim, um grupo grande de func¸o˜es
pode existir para compor, quando necessa´rio, um determinado programa.
Isto se chama hoje reciclagem de programas ou em ingleˆs, re-use of
programs.
6. Varia´veis, func¸o˜es, tem que ter um tipo. A sintaxe da declarac¸a˜o de
varia´veis e´
< tipo dados >< nome da variavel >;
Pode haver va´rias varia´veis do mesmo tipo na mesma declarac¸a˜o, separa-
das por v´ırgulas.
7. leia acima... A linguagem C na˜o distingue varia´veis e func¸o˜es em primeira
instaˆncia. Inclusive o compilador, quando encontrar erros, vai se referir
a`s varia´veis como func¸o˜es.
8. A func¸a˜o ’imprima()’ (printf()) exige que comecemos dizendo que tipo
de dados lhe fornecemos para imprimir: ”%s”, quer dizer que vem uma
’frase’, (string), para ser impressa. O s´ımbolo “\n” e´ um ’comando’:
mudanc¸a de linha. Voceˆ vera´ depois que “\n” na˜o e´ um comando, agora
adianta pouco discutir esta diferenc¸a semaˆntica.
9. ’ler()’ e´ a traduc¸a˜o de ’scanf()’ que e´ um comando muito ra´pido e pode
conduz´ı-lo a erros. Use “leia()”(fgets()) como voceˆ vera´ nos pro´ximos
programas. Usamos “ler()”para que o programa ficasse simples, mas e´ um
defeito.
Warning, Warning, Warning, Warning....!!!!
Rode prog04 2.c3 para ver o risco do scanf(). Leia os comenta´rios,
dentro do programa.
10. Aqui ’imprima’ tem dois formatadores de dados, %d para inteiros, e %s
para frases (strings).
3no direto´rio BC este programa se chama prg04 2.c
2.1. PROGRAMAS E ERROS... 37
11. Toda func¸a˜o da linguagem C deve terminar com o comando “voltar()”
(return), e, com frequeˆncia, com um nu´mero. Mais a frente voceˆ vai ver
que isto e´ falso... Este nu´mero pode ser usado para fornecer ao sistema in-
formac¸o˜es sobre o comportamento da func¸a˜o, erros cometidos por ela, (na
verdade pelo programador...). Devolvendo zero significa que tudo correu
bem.
12. Os algoritmos comec¸am com “inicio”, “{”, e termina com “fim” “}”. De
forma mais precisa, Os “blocos lo´gicos” comec¸am com “inicio” “{” e
terminam com “fim”, “}”.
Vocabula´rio: 2 Bloco lo´gico e varia´vel local
• bloco lo´gico e´ um conjunto de ac¸o˜es, de comandos, que tenham um objetivo
espec´ıfico. Uma func¸a˜o e´ um bloco lo´gico, mas dentro de func¸o˜es voceˆ pode
encontrar mais blocos lo´gicos. E´ um conceito difuso mas que aos poucos
voceˆ compreendera´.
Sempre que voceˆ encerrar um conjunto de comandos entre chaves voceˆ tera´
criado, para a linguagem C, um bloco lo´gico.
Veja a importaˆncia deste fato: no in´ıcio de um bloco lo´gico voceˆ pode
definir varia´veis locais que deixam de existir a` sa´ıda do bloco.
• varia´vel local sa˜o varia´veis criadas dentro4 de um bloco lo´gico. Elas tem
sua existeˆncia associadas ao bloco lo´gico em que forem criadas. O conceito
que se opo˜e a este e´ o de varia´vel global. Podemos dizer que voceˆ deve
evitar o uso de varia´veis globais e se habituar a usar apenas varia´veis
locais.
• varia´vel global Sa˜o varia´veis criadas fora de blocos lo´gicos e que portanto
ficam sendo reconhecidas por distintos blocos lo´gicos. Algumas vezes somos
forc¸ados a criar este tipo de varia´vel, entretanto devemos inclusive deixar
indicativos no cabec¸alho do programa apontando a existeˆncia delas numa
tentativa de elimina´-las, se poss´ıvel. Como estas varia´veis tem uma
existeˆncia ampla, ha´ riscos que no planejamento nos esquec¸amos de suas
presenc¸as e elas, assim, interfiram nos resultado de forma inexperada.
Varia´veis globais sa˜o um risco a ser evitado. Quando voceˆ tiver que definir
uma varia´vel global, indique isto no cabec¸alho do programa como uma
forma de aviso de existe um problema no programa.
No disco que acompanha este livro, ha´ um direto´rio chamado BC em que os
programas foram testados em ambiente Borland, BC ou TC. Tambe´m os nomes
dos programas ficam dentro do limite do DOS de oito caracteres. Programas que
fujam a este padra˜o tem seus nomes corrompidos pelo ambiente de programac¸a˜o
da Borland.
4no in´ıcio de um bloco lo´gico
38 CAPI´TULO 2. O SEGUNDO PROGRAMA EM C
Exerc´ıcios: 4 Alterac¸o˜es no programa5 prog01.c
1. Compile e roda o programa6 prog01.c.
2. Se voceˆ digitouuma palavra, o programa guardou somente a primeira letra.
Experimente digitar nu´meros, analise o resultado.
3. Altere7 prog01.c, subsitua
palavra coisa; // (3) declaracao de variavel
por
palavra coisa[30]; // (3) declaracao de variavel,
agora compile-o e veja que o resultado foi desconcertante, uma montanha
de erros foram anunciados.
gcc -Wall -oprog prog01.c
prog, para executar o programa.
Leia o relato´rio de erros e veja nos pro´ximos exerc´ıcios a sa´ıda.
4. Substitua
ler("%c",&coisa); // (5)
imprima("%s%c\\n","A primeira letra foi -> ",coisa); // (6)
por
ler("%s",coisa); // (5)
imprima("%s%s\n","A primeira letra foi -> ",coisa); // (6)
e veja o resultado digitando uma palavra com ate´ 29 letras.
5. Digite tambe´m uma palavra com mais de 30 letras. Digite duas palavras,
quer dizer, duas “strings” separadas por um espac¸o, por exemplo. Analise
por que da´ errado.
6. Fac¸a algumas experieˆncias alternado as tres linhas aqui discutidas e veja
os resultados. Mas, somente rode os programas se o compilador na˜o apon-
tar erros ou “warnings” porque este programa usa vetores de caracteres
que sa˜o ponteiros. Ponteiros devem ser usados com cuidado porque fazem
acesso direto a` memo´ria da ma´quina.
5no diretorio BC este programa se chama prg01.c
6em BC prg01.c
7no diretorio BC este programa se chama prg01.c
2.1. PROGRAMAS E ERROS... 39
Algo pode ter sa´ıdo errado quando voceˆ rodou este programa. Vamos ana-
lisar o que pode ter acontecido. Primeiro voceˆ pode ter digitado um nu´mero.
Experimente, se na˜o o fez.
Se voceˆ tiver digitado um nu´mero, o programa rodou, sem problemas, apesar
de que ele na˜o tenha sido feito para isto. Observe que foi um erro8, porque se
voceˆ desejasse que o programa lesse um nu´mero, voceˆ deveria ter dito isto. Foi
um erro do programador, na˜o do programa. Programas na˜o erram, eles fazem
apenas aquilo para o qual foram planejados9.
Com o programa modificado, se voceˆ tiver escrito uma frase de verdade,
o programa so´ imprimiu a primeira palavra. Porque quando ele encontrou o
primeiro espac¸o considerou encerrada a leitura da varia´vel coisa[30] e, natu-
ralmente, somente imprimiu a primeira palavra.
Experimente colocar a frase entre aspas, veja o resultado.
Lic¸a˜o: 1 C roda aquilo que na˜o se espera...
Um dos mitos por traz da linguagem C e´ que com ela se fazem programas
que rodam muito ra´pido. Isto pode ser verdade, e uma das razo˜es se encontra no
fato de que o compilador espera que voceˆ na˜o cometa erros e reduz ao mı´nimo
a verificac¸a˜o da lo´gica do programa.
E´ comum se dizer que um programa em C sempre faz alguma coisa...
mesmo que na˜o seja o que se espera. Isto na˜o e´ um defeito da linguagem,
acontece que C e´ considerada uma linguagem para programadores profissionais,
poristo na˜o tem sido considerada uma linguagem para inciantes...
O programa acima foi feito para escrever frases, mas escreve tambe´m nu´meros.
Num programa grande e complexo isto poderia ser um desastre. Claro, o pro-
grama lhe pedia para escrever alguma coisa, isto na˜o se faz! A comunicac¸a˜o
usua´rio-programador deve ser mais completa e sempre clara. Ale´m disto o
pro´prio programa deve ter recursos de verificac¸a˜o do que o usua´rio esta´ fazendo
e deve enta˜o orienta´-lo a repetir a operac¸a˜o de forma correta. Na verdade “pro-
gramas” so´ fazem aquilo para o qual foram planejados.
Observac¸a˜o: 4 Comenta´rios dos exerc´ıcios
• Ha´ uma diferenc¸a fundamental entre
palavra coisa; // (3) declaracao de variavel
e
palavra coisa[30]; // (3) declaracao de variavel,
No primeiro caso, C entende que “coisa” e´ um simples caractere, um dos 256 caracteres
que voceˆ pode produzir com o teclado.
No segundo caso, C entende que “coisa[30]” e´ um “vetor” de caracteres.
C enumera os ı´ndices a partir de zero, que dizer que voceˆ tem direito de usar
coisa[0], coisa[1], . . . , coisa[29], coisa[30]
e se o vetor estiver construido corretamente, coisa[31]=’\0’ e´ o NULL, um caracter
especial que marca o fim dos vetores.
Voceˆ na˜o tem o direito de fazer uso deste u´ltimo espac¸o de forma diferente sem o risco
de erros no seu programa, e´ como se voceˆ guardasse uma garrafa cheia destampada...
8E´ preciso desmistificar os erros, errar e´ natural de quem esta´ aprendendo, simplesmente.
9tem gente que diz “desenhados”, que horror.
40 CAPI´TULO 2. O SEGUNDO PROGRAMA EM C
Este u´ltimo caractere se chama NULL e serve para marcar o fim dos vetores corre-
tamente construidos. Claro que voceˆ pode construir vetores incorretamente, correndo
riscos de que seus dados se misturem produzindo erros.
• Veja a diferenc¸a entre estas duas linhas:
ler("%c",&coisa); // (5)
imprima("%s%c\\n","A primeira letra foi -> ",coisa); // (6)
e
ler("%s",coisa); // (5)
imprima("%s%s\n","A primeira letra foi -> ",coisa); // (6)
O formatador %s anuncia a`s func¸o˜es “imprima()“ e “ler()“ que vira´ um “vetor de
caracteres” ou string.
Aqui tambe´m se encontra uma das dificuldades no uso de ’ler()’ (scanf()). Esta func¸a˜o
da linguagem C e´ muito sens´ıvel... ela sempre guarda os dados atrave´s dos seus en-
derec¸os. E´ o que se encontra expresso em
ler("%c",&coisa); // (5)
que poder´ıamos traduzir como
“guarde o caracter que vem pelo teclado na variavel cujo enderec¸o e´ &coisa”.
• Tudo muda quando declaramos “palavra coisa[30];” porque coisa[30], sendo um vetor,
e´ uma sucessa˜o de 30 enderec¸os, para C, um vetor de enderec¸os. Antes chamamos de
vetor de caracteres. Mais a frente voceˆ vai ver que existem outros tipos de vetores.
Todo vetor e´ um vetor de enderec¸os de um certo tipo de dados. Aqui estamos com um
vetor de caracteres. Leia a respeito de tipos de dados no cap´ıtulo 7, mas fac¸a apenas
uma leitura ra´pida.
• Usar o redirecionador de enderec¸os num enderec¸o e´ errado. Vamos dizer isto de outra
forma, usando uma linguagem te´cnica.
1. Existem varia´veis do tipo “enderec¸o”, sa˜o os ponteiros.
2. Ale´m disto precisamos declarar que tipo de ponteiro. Leia mais a respeito no
cap´ıtulo sobre ponteiros, veja no ı´ndice remissivo.
3. Quando uma varia´vel for um ponteiro, enta˜o na˜o sera´ correto usar o direciona-
dor “&” na frente desta varia´vel em ler() scanf(). Seria o mesmo que dizer
guarde este dado no enderec¸o enderec¸o X.
• Isto justifica que deixemos de lado a funcao ’ler()’ (scanf()) nos primeiros passos do
uso da linguagem. Iremos fazer um uso de um me´todo mais complicado, entretanto
mais seguro,evitando esta discussa˜o inicial deixando-a para um momento em que o
estudante de C esteja mais a vontade com a linguagem.
Rode e leia o programa10 prob scanf.c. Sobretudo leia os comenta´rios ao final do
programa.
10dentro do BC o nome aparece cortado, tem mais de oito caracteres. Troque o nome arquivo
para prbscanf.c
2.1. PROGRAMAS E ERROS... 41
• Existe um compilador para a linguagem C, chamado checker que faz uma verificac¸a˜o do
uso da memo´ria pela varia´veis do tipo ponteiro e pode alertar para problemas deixados
dentro de um programa.
Sintaxe: checker -gcc programa.c [comandos do gcc] Na˜o pude encontrar um similar
para DOS, na˜o sei se existe.
Observac¸a˜o: 5 Programas robustos.
Agora ficou claro que na˜o se espera que voceˆ escreva nu´meros. Mas para frente voceˆ vai
aprender a criar estruturas de controle de entradas de dados que aconselhara˜o o usua´rio a
re-escrever o que se pede, no caso de que ele tenha respondido com alguma inconvenieˆncia.
Sa˜o me´todos para fazer programas seguros, ou robustos. Esta´ cedo, entretanto, para uma
discussa˜o mais aprofundada sobre este assunto.
Vocabula´rio: 3 Dados, varia´vel
• dados E´ complicado discutir o que sa˜o dados, um programa todo pode ser
um dado... mas se tentarmos simplificar as coisas para comec¸ar a discu-
tir, programas servem para manipular dados, quer dizer transformar uma
informac¸a˜o bruta em uma informac¸a˜o tratada, manipulada, lapidada...
“processada”.
O programa prog01.c parece r´ıdiculo, pede um nome e volta a escreveˆ-lo
na tela. Mas ele poderia ter pedido o “seu nome” para compararcom os
dados de um banco interno de nomes afim de permitir-lhe ou negar-lhe a
entrada no sistema. Enta˜o o seu nome e´ uma informac¸a˜o que, comparada
com um banco de clientes, diz se voceˆ pode ou na˜o ter acesso a`s outras
informac¸o˜es.
• varia´vel Para guardar dados se criou um sistema engenhoso que usa tres
etapas.
– Uma tabela formada de palavras, chamadas identificadores, associa-
das aos enderec¸os, uma tabela de alocac¸a˜o que e´ basicamente o que
cada usua´rio, ou programador, usa. Estas palavras sa˜o chamadas
“varia´veis”. Em certas linguagens esta tabela se chama de “espac¸o
de nomes”.
– A cada tal varia´vel se associa um enderec¸o inicial no segmento de
memo´ria reservado para tal onde se inicia o conteu´do da varia´vel
e, pelo seu tipo, se calcula onde devera´ terminar reservando-se o
pro´ximo enderec¸o inicial de outra varia´vel. Por esta raza˜o voceˆ pre-
cisa declarar o tipo da varia´vel que voceˆ pretende usar.
– Uma associac¸a˜o dos elementos do espac¸o de nomes com seus respec-
tivos enderecos iniciais, chamada ainda de “alocac¸a˜o”. Esta alocac¸a˜o
e´ dinaˆmica porque as varia´veis sa˜o criadas e destru´ıdas portanto os
enderec¸os iniciais mudam durante a execuc¸a˜o de um programa. Voceˆ,
e qualquer outro programador, na˜o precisa se preocupar com isto, esta´
e´ uma atribuic¸a˜o do sistema operacional.
Em C, o uso do enderec¸o, pelo programador, e´ uma das caracter´ısticas
da linguagem havendo um tipo particular de varia´vel que opera sobre o
42 CAPI´TULO 2. O SEGUNDO PROGRAMA EM C
enderec¸o, as varia´veis do tipo ponteiro. Voceˆ pode programar em C sem
usar ponteiros, mas o atrativo e´ que podemos acelerar os programas com
seu uso, como tambe´m torna´-los mais perigosos. Como ja´ dissemos, pegar
nos fios ele´tricos de mal jeito pode levar a` morte, mas voceˆ na˜o prefere
viver no escuro... aprenda a usar ponteiros. Mas deixe para fazer uso
deles quando tiver uma compreensa˜o segura de como funcionam.
Veja um exemplo bem simples que mostra a importaˆncia do uso de enderec¸os
para acelerar a manipulac¸a˜o da informac¸a˜o.
Exemplo: 3 Uso de ponteiros e a velocidade Pense no seguinte exemplo, um
enorme armazem em que uma instituic¸a˜o tem guardados todo o seu acervo,
tomemos o caso de um museu.
Sempre novos itens chegam e seria imposs´ıvel prever de antema˜o onde cada
um deles seria guardado, inclusive sera´ preciso adquirir de vez em quando uma
nova casa para abrigar o acervo sempre crescente do museu, (imagine que os
governantes se preocupam com os museus e sempre esta˜o liberando mais verba
para enriquecer a instituic¸a˜o...)
Como manter o acervo organizado? As pec¸as va˜o chegando e simplesmente
recebem um nu´mero de ordem de chegada, e um enderec¸o em que se encontram
guardados (pode ser a identificac¸a˜o de uma sala em um determinado pre´dio).
No fim do dia a lista que identifica os itens do acerto e´ novamente ordenada (por
ordem alfabe´tica) o que significa que se re-orientam os ponteiros entre objetos e
enderec¸os. E´ muito menos pesado trocar a indicac¸a˜o
piano21 → casa10 - sala 30
do que manter sempre o piano21 no mesmo lugar... quando houver um con-
certo e for preciso levar o piano21 para o audito´rio, o lugar dele na˜o precisa
ficar reservado, outros objetos podem ocupar o seu lugar, e depois ele pode ser
guardado n’outro enderec¸o e o cadastro vai simplesmente ser re-organizado com
a troca
piano21 → casa15 - sala 3
porque seria muito mais dif´ıcil estar mudando de lugar pianos.
A exemplificac¸a˜o acima se aplica literalmente a qualquer banco de dados,
quer dizer um programa que associe distintas informac¸o˜es como nomes de pes-
soas objetos, enderec¸os, contas banca´rias, por exemplo um cata´logo telefoˆnico.
Um banco de dados fica inu´til se na˜o estiver ordenado, porque enta˜o sim-
plesmente os dados ficaram perdidos, imagine um cata´logo telefoˆnico em que os
nomes dos usua´rios na˜o aparec¸am em ordem alfabe´tica, seria inu´til!
Mas os bancos de dados sa˜o dinaˆmicos no sentido de que sempre estamos
colocando novos nomes ou retirando nomes ou qualquer outro tipo de dados, con-
sequentemente vivem desordenados. Como os dados podem ocupar muito espac¸o
na memo´ria do computador, (igual pianos no acervo do museu), e´ preferivel or-
denar os enderec¸os que sa˜o relativamente pequenos. Aı´ entram os ponteiros para
acelerar o processamento.
Observac¸a˜o: 6 Abstrac¸a˜o e varia´vel
2.1. PROGRAMAS E ERROS... 43
Os computadores, atravez de va´rios sistemas de co´digos, podem guardar informac¸o˜es
praticamente de quase todo tipo. A palavra “abstrac¸a˜o” adquiriu um sentido novo com a
cieˆncia da computac¸a˜o, ela distingue as informac¸o˜es pelo que se entende hoje como de n´ıveis
de abstrac¸a˜o. Antes abstrac¸a˜o era sinoˆnimo de dif´ıcil, hoje caracteriza o n´ıvel de complexi-
dade de um conceito no sentido de que ele comporte uma quantidade maior de informac¸o˜es.
Por exemplo, um nu´mero guarda um tipo de informac¸a˜o que podemos considerar como de
primeiro n´ıvel de abstrac¸a˜o.
Mas, um par ordenado de nu´meros tem um n´ıvel maior de abstrac¸a˜o porque pode guardar
informac¸a˜o na˜o nume´ricas como enderec¸os de apartamentos de um pre´dio de va´rios andares.
Em ternos ordenados de nu´meros poderiamos guardar a informac¸a˜o de quantos habitantes
existe por apartamento... Nos dois u´ltimos casos os “nu´meros” deixaram de ser nu´meros e
passaram ser co´digos.
Esta e´ evoluc¸a˜o dos “nu´meros”, que vistos como co´digos, criam novos tipos de dados e
sucessivos niveis de abstrac¸a˜o. Veja que “nu´mero de telefone” na˜o e´ nu´mero, e sim co´digo...
voceˆ na˜o somaria dois nu´meros de telefone, somaria ?
A memo´ria de um computador tem um enderec¸amento “dinaˆmico” semelhante a de um
edif´ıcio de apartamentos. Dinaˆmico porque a cada instante mudam
• os enderec¸os;
• os habitantes;
• o tamanho dos apartamentos.
Os habitantes sa˜o as “varia´veis”. Aqui, a` diferenc¸a com o que ocorre num edif´ıcio de
apartamentos, o tamanho dos apartamentos se adaptam ao tamanho das varia´veis... Ao
definir uma varia´vel se estabelece o enderec¸o do ponto inicial de memo´ria que ela vai ocupar
e do tipo de dado que ela vai representar, (ou “conter”, com se diz comumente), e assim
se marca o in´ıcio de uma pro´xima “varia´vel”. ou o outro enderec¸o inicial. Se o sistema
operacional for bem feito, ele fica monitorando o uso das varia´veis para realocar o espac¸o na
memo´ria, levar para o disco, ou trazer de volta do disco, pa´ginas de memo´ria.
Veja a nova formulac¸a˜o de prog01.c → prog02.c.
Primeiro compile11 e rode prog02.c:
gcc -Wall -oprog prog02.c
prog, para executar o programa, ou ./prog
Exemplo: 4 prog02
/* Programa prog02.c
Assunto:le uma frase pelo teclado e a imprime
Programa errado, compile e corrija o erro. Ver exercicios.
por Tarcisio Praciano Pereira - 10 licoes para aprender C
Sobral, julho de 2000 - UVA
*/
#include <stdio.h>
#include <string.h>
#include "traducao.h"
palavra principal()
11em BC procure prg02.c
44 CAPI´TULO 2. O SEGUNDO PROGRAMA EM C
inicio
palavra coisa1[30], coisa2[30], coisa3[30]; //(0)
imprima("%s%\n", "escreva uma frase curta pelo teclado, ");// (1)
imprima("%s\n", "digamos, com tres palavras.. "); // (2)
imprima("%s\n"," pode ser o seu nome, por exemplo ");//(3)
ler("%s%s%s",coisa1,coisa2,coisa3); //(4) ainda usa ’scanf’
imprima("%s%s%s\n",coisa1,coisa2,coisa3); //(5)
fim
/* Comentarios:
0) declaracao de tres variaveis - vetores do tipo string.
1,2,3) mensagens orientando o usuario a fornecer os dados.
em (1) tem um erro que o compilador detecta.
4) Leitura de dados com ’ler’ (scanf) observe a ausencia do
direcionador de endereco &, desnecessario porque as
variaveis sao do tipo ponteiro, declaracao implicita.
5) Um unico ’imprima’ imprime todos os dados.
*/
Rode o programa para ver o que acontece. Programinha ruim, na˜o e´? Claro,
estamos apenas comec¸ando. Vejamos alguns defeitos e como poder´ıamos corrig´ı-
los.
Exerc´ıcios: 5 Alterando e entendendo prog02.c
1. Compile e rode o programa

Outros materiais