Baixe o app para aproveitar ainda mais
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
Compartilhar