Você está na página 1de 284

Programao 2

Snia Virginia Alves Frana

Recife, 2009

Universidade Federal Rural de Pernambuco Reitor: Prof. Valmar Corra de Andrade Vice-Reitor: Prof. Reginaldo Barros Pr-Reitor de Administrao: Prof. Francisco Fernando Ramos Carvalho Pr-Reitor de Extenso: Prof. Paulo Donizeti Siepierski Pr-Reitor de Pesquisa e Ps-Graduao: Prof. Fernando Jos Freire Pr-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira Pr-Reitora de Ensino de Graduao: Prof. Maria Jos de Sena Coordenao Geral de Ensino a Distncia: Prof Marizete Silva Santos Produo Grfica e Editorial Capa e Editorao: Allyson Vila Nova, Rafael Lira, Italo Amorim e Glaydson da Silva Reviso Ortogrfica: Ivanda Martins Ilustraes: Diego Almeida Coordenao de Produo: Marizete Silva Santos

Sumrio
Plano da Disciplina ...............................................................................5 Apresentao ........................................................................................9 Conhecendo o Volume 01 ..................................................................10 Captulo 1 Introduo ao C .............................................................13 1.1. Programas e Programao de Computadores ..........................13 1.2. Linguagens de Programao.....................................................15 1.3. Breve Histrico da Linguagem de Programao C ...................18 1.4. Criao, Compilao e Execuo de um Programa ..................19 Captulo 2 Conceitos Preliminares para Programar em C ...........24 2.1. Estrutura de um Programa Bsico em C ...................................25 2.2. Palavras Reservadas do C ........................................................28 2.3 Uso de Comentrios ...................................................................29 2.4. Os Fundamentos do Ambiente C...............................................31 2.5. Conhecendo o Dev-cpp .............................................................34 Captulo 3 Tipos de Dados, Variveis e Constantes .....................40 3.1. Tipos de dados ..........................................................................40 3.2. Variveis e Constantes ..............................................................42 3.3. Operador de Atribuio (=) ........................................................49

Captulo 4 Comandos de Entrada e Sada de Dados....................54 4.1. Entrada de Dados ......................................................................54 4.2. Sada de Dados .........................................................................59 4.3. Erros Frequentes no Uso dos Comandos de Entrada e Sada .65 4.4. Primeiros programas em C ........................................................66 Captulo 5 Operadores, Expresses e Funes Matemticas .....75 5.1. Operadores Bsicos ..................................................................75 5.2. Operadores Aritmticos de Atribuio ......................................87 5.3. Operadores ++ e -- ....................................................................87 5.4. Converso de tipo......................................................................88 5.5. Funes Matemticas (biblioteca math.h) .................................90

Plano da Disciplina
Carga horria: 60h

Ementa da Disciplina
Introduo linguagem de programao C. Tipos de dados, variveis, operadores aritmticos, relacionais e lgicos. Comandos de entrada e sada. Estruturas de seleo e repetio. Modularizao. Vetores e registros. Ponteiros. Arquivos. Manipulao de caracteres. Comandos de tela. Comandos de manipulao de data e hora.

Objetivos
Objetivo Geral Apresentar tcnicas de programao estruturada utilizando como ferramenta a linguagem de programao C Objetivos Epecficos Desenvolver a capacidade de soluo de problemas de programao, com o uso da linguagem C. Introduzir mtodos de otimizao para garantir eficincia e segurana aos programas. Desenvolver o auto-aprendizado.

Contedo Programtico
Mdulo 1 - Introduo Linguagem de Programao C Carga Horria do Mdulo 01: 15 h Objetivo do Mdulo 01: Introduo ao C e seus comandos bsicos, para possibilitar a construo dos primeiros programas nesta linguagem. Contedo Programtico do Mdulo 1 Introduo ao C

Conceito de programa e linguagem de programao Introduo ao C: Um breve histrico Etapas de desenvolvimento de um programa Comandos Bsicos do C Estrutura de um programa C Diretivas de compilao Uso de comentrio Tipos de dados Variveis, constantes, identificadores e atribuio Comandos de entrada e sada Operadores aritmticos, relacionais e lgicos Modificadores de tipos de dados Funes matemticas Mdulo 2 Estruturas de Controle de Fluxo e Modularizao Carga Horria do Mdulo 2: 15 h Objetivo do Mdulo 2: Possibilitar o conhecimento das estruturas de controle (seleo e repetio) do C e mtodos para modularizao dos programas (criao de procedimentos e funes). Contedo Programtico do Mdulo 2: Estruturas de Controle de Fluxo Sequncia Estrutura de seleo: If e Switch Estrutura de repetio: for, do/while e while Comando break Modularizao Construo de mdulos: funes e procedimentos Passagem de parmetros e escopo de variveis Comando return

Mdulo 3 Armazenamento de Dados em Vetores, Registros e Arquivos Carga horria do Mdulo 03: 15 h Objetivo do Mdulo 03: Apresentar as formas de armazenamento de dados homogneos (vetores) e heterogneos (registros), alm dos comandos para manipulao de arquivos. Contedo Programtico do Mdulo 03: Tipos de Dados Homogneos e Heterogneos Vetores Registros Vetor de registro Arquivos Ponteiros Comandos para manipulao de arquivo Mdulo 4 Comandos Avanados Carga Horria do Mdulo 4: 15 h Objetivo do Mdulo 4: Apresentar comandos mais avanados da linguagem C, tais como: manipulao de caracteres, comandos de tela (para melhorias na interface dos programas) e manipulao de data e hora. Contedo Programtico do Mdulo 4: Comandos para Manipulao de Caracteres e Strings Comandos da biblioteca ctype e string Validao de campos Comandos de Tela Interface Comandos da biblioteca conio Comandos para Manipulao de data e hora Comandos da biblioteca time

Avaliao
Avaliao prtica em laboratrio correspondendo a 60% da nota.

Resoluo de listas de exerccios, que sero enviadas atravs do ambiente virtual (30%). Avaliao referente participao do aluno nas aulas presenciais e ambiente virtual: fruns de discusso, chats, etc (10%).

Bibliografia
Bsica: SCHILDT, Herbert. C Completo e Total. So Paulo: Makron, 1996. DEITEL, H, M e DEITEL, P. J. Como Programar em C. Rio de Janeiro: LTC, 1999. Complementar: ASCENIO, Ana Fernanda Gomes e CAMPOS, Edilene Aparecida Veneruchi. Fundamentos de Programao de Computadores. So Paulo: Prentice Hall, 2002.

Apresentao
Caro(a) aluno(a), Seja bem-vindo (a) ao primeiro mdulo da disciplina Programao II. Nesta disciplina, voc ir aprender a programar na linguagem de programao C, uma das mais utilizadas mundialmente. Desenvolver programas e garantir que estes sejam confiveis, eficientes e agradveis de usar requer conhecimento tcnico e muito treinamento. Este livro foi escrito pensando em voc, que est iniciando neste mundo da programao de computadores e que precisa ser apresentado, com tranquilidade, a um conjunto de novos conceitos. Os assuntos sero transmitidos gradativamente, de forma que voc os absorva com naturalidade. Este livro contm muitos exemplos de questes resolvidas, comentadas em detalhes, para que voc no encontre dificuldades para aprender cada assunto. Alm de apresentar dicas para que voc desenvolva seus programas de forma eficiente e no cometa os principais erros de programao que ocorrem com quem est iniciando a programar. Ao final de cada captulo, voc poder testar o seu aprendizado e assimilar melhor o que foi estudado, atravs da resoluo de exerccios. Isto muito importante! No deixe de resolv-los. De antemo, informamos que programar muito bom, voc vai gostar! Nada melhor do que ver um programa rodando e saber que foi voc quem o criou. Mas, no desanime se encontrar alguma dificuldade durante esta caminhada. s vezes o programa d um erro e no sabemos onde est o problema. Seja persistente! Ao longo do tempo, a experincia vai te dar mais segurana e voc conseguir encontrar tais erros com facilidade. O objetivo deste primeiro mdulo fazer uma introduo linguagem C, conhecer um pouco da sua histria e iniciar o estudo da sintaxe da linguagem, que possibilitar a construo de programas bsicos. Ao final deste primeiro mdulo, voc j estar desenvolvendo seus primeiros programas em C. O que voc est esperando? Vamos comear? Bons estudos! Professora Snia Virginia Alves Frana

Programao 2

Conhecendo o Volume 01
Neste primeiro volume, voc ir encontrar o mdulo 01 da disciplina: Programao II. Este volume est estruturado em cinco captulos, que sero estudados ao longo de 15h/aula. Para facilitar seus estudos, veja a organizao deste primeiro volume. Captulo 1: Introduo ao C Carga Horria do Captulo 1: 2 h/aula Objetivos do Captulo 1: Introduzir os conceitos bsicos da rea de programao e apresentar um breve histrico sobre a linguagem C. Contedo Programtico do Captulo 1 Conceito de programas e programao de computadores; Linguagens de programao; Breve histrico da linguagem de programao C; Etapas do desenvolvimento de um programa. Captulo 2: Conceitos Preliminares para Programar em C Carga Horria do Captulo 2: 3 h/aula Objetivos do Captulo 2: Apresentar detalhes mais especficos da linguagem, necessrios para dar incio programao em C. Neste captulo, tambm ser apresentado o ambiente de programao que utilizaremos no desenvolvimento dos programas. Contedo Programtico do Captulo 2 Estrutura de um programa bsico C; Palavras reservadas do C; Uso de comentrios; Fundamentos do ambiente C; Conhecendo o Dev-cpp.

10

Programao 2

Captulo 3: Tipos de Dados, Variveis e Constantes Carga Horria do Captulo 3: 2 h/aula Objetivos do Captulo 3: Apresentar os tipos de dados suportados pelo C e introduzir o conceito de variveis e constantes Contedo Programtico do Captulo 3 Tipos de dados; Variveis e constantes; Operador de atribuio; Captulo 4: Comandos de Entrada e Sada de Dados Carga Horria do Captulo 4: 4 h/aula Objetivos do Captulo 4: Apresentar os comandos de entrada e sada de dados do C. Neste captulo, voc ter acumulado conhecimento suficiente para desenvolver os primeiros programas em C. Contedo Programtico do Captulo 4 Entrada de dados; Sada de dados; Desenvolvimento dos primeiros programas C. Captulo 5: Operadores, Expresses e Funes Matemticas Carga Horria do Captulo 5: 4 h/aula Objetivos do Captulo 5: Apresentar os operadores bsicos (aritmticos, relacionais e lgicos), alm de funes complementares para o desenvolvimento de programas que executem expresses mais complexas. Contedo Programtico do Captulo 5 Operadores aritmticos, lgicos e relacionais; Operadores aritmticos de atribuio; Operadores ++ e --; 11

Programao 2

Converso de tipos; Funes matemticas. Ao final de cada captulo voc encontrar: A seo Atividades e Orientaes de Estudo: que contm exerccios para a fixao do assunto estudado, alm de indicao de fruns de discusso. A seo Conhea Mais: que contm dicas de sites e livros que devem ser lidos para ampliar os seus conhecimentos. A seo Vamos Revisar?: que apresenta um resumo dos principais tpicos abordados no captulo.

12

Programao 2

Captulo 1 Introduo ao C
Vamos conversar sobre o assunto? Neste primeiro captulo, ser feita uma apresentao do que programao e quais as principais linguagens de programao do mercado, dando nfase linguagem C. Este captulo importante, porque conheceremos um pouco da histria da linguagem de programao que iremos aprender nesta disciplina. Sempre que conhecemos uma pessoa nova, queremos saber alguns detalhes da sua vida, no mesmo? Quantos anos ela tem, onde nasceu, quem so seus pais, etc. Neste captulo, tambm, sero introduzidos conceitos utilizados na rea de programao, visando a nossa preparao para nos lanarmos nesse mundo intrigante da criao de programas computacionais. Ento, prontos (as) para o desafio?

Saiba Mais
1 Alm dos software aplicativo e software de sistema, ainda possivel utilizar a categoria software embutido ou embarcado, destinado a funcionar dentro de uma mquina que no um computador. Normalmente, estes software tm um propsito muito especfico, como, por exemplo: controlar a injeo eletrnica de um carro ou gerenciar o cozimento dos alimentos no forno de microndas. Mais recentemente, surgiu tambm o software como servio, que um software que roda diretamente na internet, no sendo necessrio instalar nada no computador do usurio.

1.1. Programas e Programao de Computadores


Um programa de computador um conjunto de instrues que descrevem uma tarefa que ser executada por um computador. Um programa de computador tambm conhecido como software, software aplicativo, software de sistema ou simplesmente programa. O termo software mais utilizado quando feita uma referncia parte no fsica do sistema computacional, juntamente com o termo hardware, que faz referncia ao conjunto de componentes eletrnicos que constituem um computador. Os programas que permitem ao usurio fazer uma ou mais tarefas especficas, como as planilhas eletrnicas, editores de texto e jogos so chamados de software aplicativo ou aplicao. J os programas que do suporte funcional aos computadores, como os sistemas operacionais e drivers de dispositivos, so chamados de software de sistema1. O ato de desenvolver programas chamado de programao de computadores. A programao o processo de escrita, teste e manuteno de um programa (ASCENIO e CAMPOS, 2002). O desenvolvimento de programas baseado em metodologias ou processos formalizados conhecido por engenharia de software. 13

Programao 2

Os programas so escritos em uma linguagem de programao. Assim como o Portugus, o Ingls e o Espanhol, as linguagens de programao tm as suas regras e devemos segu-las para escrever nossos programas corretamente. Portanto, a programao de computadores uma cincia e, por isso, devemos seguir uma metodologia para termos como resultado: programas seguros e eficientes. Em uma disciplina anterior, vocs aprenderam a desenvolver algoritmos, que so uma sequncia de passos para realizar uma tarefa ou resolver um problema. Utilizamos algoritmos no nosso cotidiano para realizar atividades corriqueiras, definindo a sequncia de passos que deve ser executada para atingirmos um objetivo, como, por exemplo, os passos que executamos para tomar banho, calibrar um pneu ou fazer um bolo.

Figura 1.1: Exemplos de algoritmos

Para efetuarmos estas atividades, seguimos uma sequncia lgica de passos. Se esses passos no tiverem uma lgica, podemos no conseguir atingir o nosso objetivo. Se vocs observarem, para fazer um bolo, existe uma ordem em que os ingredientes devem ser adicionados receita, caso no sigamos esta ordem, o bolo no ficar bom. Na programao ir ocorrer a mesma coisa, devemos passar as instrues ao computador, utilizando uma linguagem de programao, seguindo uma lgica a lgica computacional. Na prxima seo vamos abordar as linguagens de programao, de uma forma mais abrangente, tratando os principais conceitos que envolvem este assunto. Vamos seguir em frente?

14

Programao 2

1.2. Linguagens de Programao


atravs das linguagens de programao que poderemos criar nossos programas. Uma linguagem de programao um conjunto de regras sintticas e semnticas usadas para definir um programa. O conjunto de cdigos (palavras e smbolos), compostos de acordo com essas regras, constituem o cdigo fonte do nosso programa. Para ser executado pelo processador, o cdigo fonte precisa ser traduzido para cdigo de mquina. Aprender uma linguagem de programao um pouco similar a aprender um novo idioma. Temos que saber o significado das palavras, as regras da estruturao das frases, etc., para podermos nos comunicar corretamente no novo idioma.

Figura 1.2: Aprenda a dar ordens ao seu computador

Existem vrias linguagens de programao. Vocs sabiam que cada linguagem de programao possui o seu conjunto de regras e um modo de funcionamento prprio? A escolha de uma linguagem de programao para o desenvolvimento de um programa deve estar atrelada ao tipo de problema que deseja resolver. Existem linguagens 15

Programao 2

que so melhores para resolver um certo tipo de questo do que outras. De acordo com Sebesta (2003), as linguagens de programao vm sendo classificadas de vrias formas: por gerao, de acordo com o paradigma de programao, quanto ao grau de abstrao, de acordo com a estrutura de tipos, dentre outras. Uma das classificaes mais utilizadas quanto ao grau de abstrao. Segundo esta classificao, as linguagens de programao so divididas em trs grupos: linguagens de mquina, linguagens de baixo nvel e linguagens de alto nvel. A linguagem de mquina a linguagem natural dos computadores. Estas linguagens so ininteligveis para o ser humano no treinado. As linguagens de mquina so representadas por sequncias de bits (zeros e uns). Estas sequncias representam instrues que sero executadas pelo processador do computador. As instrues correspondem a sequncias muito simples de operaes, tais como: transferir um dado em memria para a CPU ou somar dois valores. As linguagens de mquina so dependentes do processador, isto , uma determinada linguagem de mquina s poder usada por um tipo de computador.
Saiba Mais
No contexto da informtica, a portabilidade de um programa a sua capacidade de ser compilado ou executado em diferentes arquiteturas (seja de hardware ou de software).
2

Esse termo tambm vem sendo utilizado pelas empresas de telefonia mvel, quando se referem portabilidade de nmero, ou seja, voc muda de operadora, mas nao muda o nmero do celular.

As linguagens de baixo nvel so prximas da linguagem de mquina. No entanto, os zeros e uns que formam uma instruo foram substitudos por palavras que representam tais instrues, tornando-as um pouco mais legveis. Estas linguagens so mais voltadas para a mquina, isto , so escritas usando as instrues do microprocessador do computador. So chamadas de linguagens Assembly (que significa montagem). Estas linguagens apresentam as seguintes vantagens: os programas so executados com maior velocidade de processamento (j que so executadas diretamente pela mquina) e ocupam menos espao na memria. No entanto, de modo geral, os programas em Assembly tm pouca portabilidade2 (um cdigo gerado para um tipo de processador no serve para outro) e no so estruturados, tornando a programao mais difcil. As linguagens de alto nvel so mais prximas linguagem humana (do Ingls, por exemplo) e mais distantes das linguagens de mquina. Por isso, so linguagens mais simples de entender, j que, em geral, utilizam uma sintaxe estruturada, tornando seu cdigo mais legvel. Necessitam de compiladores ou interpretadores para gerar instrues do microprocessador. Interpretadores fazem 16

Programao 2

a interpretao de cada instruo do programa fonte executando-a dentro de um ambiente de programao, Basic e Java so exemplos de linguagens interpretadas. Os compiladores fazem a traduo de todas as instrues do programa fonte gerando um programa executvel. Estes programas executveis (*.exe) podem ser executados fora dos ambientes de programao. A linguagem C e Pascal so exemplos de linguagens compiladas. As linguagens de alto nvel ainda podem ser divididas de acordo com a sua aplicao: genricas (como C, Java e Pascal, que servem para o desenvolvimento de programas de propsito geral) ou especficas (como Fortran - utilizada para execuo de clculos matemticos, LISP - desenvolvimento de aplicaes na rea de inteligncia artificial e CLIPPER utilizada para aplicaes que manipulam bancos de dados). As vantagens das linguagens de alto nvel so: portabilidade (por serem compiladas ou interpretadas podem ser executadas em vrias plataformas com pouqussimas modificaes) e facilidade de desenvolvimento de programas. No entanto, as rotinas geradas so mais genricas (e mais complexas) e por isso so mais lentas e ocupam mais memria. A figura 1.3, a seguir, apresenta um trecho de cdigo escrito em linguagem de mquina, linguagem de baixo nvel e linguagem de alto nvel, respectivamente.
Linguagem de Mquina 10110101 11100110 11000100 Linguagem de Baixo Nvel LOAD BASE ADD BONUS STORE SALARIO Linguagem de Alto Nvel

Salario = Base + Bonus

Figura 1.3: Trecho de cdigo em diferentes linguagens

Notem como o cdigo em linguagem de mquina incompreensvel. Difcil entender essas seqncias de zeros e uns, no mesmo? O cdigo na linguagem de baixo nvel mais legvel e passamos a entender as instrues. Na linguagem de alto nvel, o cdigo fica menor e muito mais simples. Em qual tipo de linguagem vocs querem programar? Nem precisamos parar para pensar, no mesmo?

17

Programao 2

Figura 1.4: Linguagens de baixo nvel x linguagens de alto nvel

1.3. Breve Histrico da Linguagem de Programao C


Vamos conhecer um pouco sobre a histria do C? A linguagem de programao C nasceu em 1972 nos laboratrios Bell, Estados Unidos. Seus criadores so Brian Kernighan e Dennis M. Ritchie. A linguagem C foi criada a partir da linguagem B (sugestivo, no ?), que havia sido desenvolvida no final dos anos 60 por Ken Thompson. O C uma linguagem de alto nvel, compilada e estruturada3. No entanto, o C possui instrues de baixo nvel, bem prximas linguagem de mquina, que s o Assembler possui. O objetivo dos seus criadores era usar o C para desenvolver o sistema operacional UNIX, que originalmente foi escrito em Assembly (linguagem de baixo nvel). Desde ento, espalhou-se por muitos outros sistemas e tornouse uma das linguagens de programao mais usadas, e influenciando o desenvolvimento de muitas outras linguagens como C++ e Java. Com a linguagem C podemos construir programas organizados e concisos (caractersticas dos programas das linguagens de alto 18

Saiba Mais
3 Uma linguagem considerada estruturada quando permite que o programador pegue trechos de maior uso do seu programa e transforme-os em pequenos mdulos (procedimentos e funes) que sero reutilizados sempre que necessrio.

Programao 2

nvel), ocupando pouco espao de memria e com alta velocidade de execuo (como o Assembler). Infelizmente, dada toda a flexibilidade da linguagem, tambm poderemos escrever programas desorganizados e difceis de serem compreendidos. Portanto, cabe ao programador de C utilizar boas prticas de programao, para ter programas legveis e de fcil manuteno. Existem inmeras razes para que o C seja uma das linguagens mais preferidas dos programadores. As caractersticas da linguagem C mostram o porqu de sua ampla aceitao. Vejamos algumas caractersticas da linguagem C. Portabilidade entre mquinas e sistemas operacionais; Dados compostos em forma estruturada; Programas estruturados; Total interao com o sistema operacional; Cdigo compacto e rpido, quando comparado ao cdigo de outras linguagens de alto nvel. Agora que j conhecemos um pouco mais da linguagem C, vamos entender o processo de desenvolvimento de um programa. Quais so os passos que devemos seguir para termos um programa pronto? Vamos comear a falar sobre isto agora mesmo. Continuem firmes na leitura!

1.4. Criao, Compilao e Execuo de um Programa


Nesta seo vamos estudar as etapas de desenvolvimento de um programa em C. O desenvolvimento de um programa dividido em trs etapas, como mostra a figura 1.5.

Figura 1.5: Estados do desenvolvimento de um programa em C

A primeira etapa para o desenvolvimento de um programa em C 19

Programao 2

a criao do programa fonte, que consiste no texto formado pelo conjunto de comandos que ns desejamos que o computador execute. O programa fonte deve ser escrito respeitando as regras da linguagem. De modo geral, os programas fontes so digitados em editores de texto genricos ou especficos dos ambientes de programao. No prximo captulo deste volume, vamos conhecer detalhadamente o ambiente de programao que ser utilizado para o desenvolvimento dos nossos programas em C. Com o programa fonte pronto, passamos para a etapa de compilao. O compilador um programa que verifica se o programa fonte no apresenta nenhum erro de sintaxe e gera o programa executvel. Quando o programa fonte apresenta algum problema, dizemos que ocorreu um erro de compilao. Assim, o programador dever avaliar o programa fonte, para a retirada tais erros. Normalmente, os compiladores indicam os provveis erros de sintaxe cometidos pelo programador. Se o programa no tiver erros de sintaxe, o compilador ir gerar o programa executvel. A etapa final consiste na execuo do programa executvel. Neste momento, o programador dever testar se o programa est produzindo os resultados esperados. Quando o programa apresenta algum erro nesta fase, como, por exemplo, mostrar um resultado incorreto, dizemos que ocorreu um erro de lgica ou erro de execuo. Isso ocorre porque, apesar do programa no ter apresentado erros de sintaxe, o que tornou possvel a gerao do programa executvel, a sequncia de comandos no foi definida de forma correta. Quando ocorre um erro de lgica, o programador dever revisar o seu programa fonte e pass-lo novamente pela fase de compilao, para que um novo executvel, sem erros, seja gerado. Como o compilador no nos avisa onde esto os erros de lgica, estes so mais difceis de serem corrigidos. Aps ter certeza que o programa executvel est correto, sem erros de lgica, o programador poder entreg-lo ao seu cliente. importante fazermos vrios testes nos nossos programas. Testar com vrios valores e verificar se est realmente tudo como esperado. No fica bem nosso cliente ficar ligando, dizendo que o programa est com BUG!4 Lembrem-se sempre, o computador s executa as instrues que ns mandarmos. Se houver erros, a responsabilidade ser nossa que no fizemos o programa corretamente! Vocs no vo querer passar por uma situao como essa? Vo? 20

Saiba Mais
Bug um erro no funcionamento de um programa. tambm chamado de erro de lgica, e pode causar discrepncias no objetivo ou impossibilidade de utilizao de um programa de computador. O uso do termo bug para descrever defeitos inexplicveis foi parte do jargo da engenharia por vrias dcadas. Acredita-se que o termo foi criado por Thomas Edison quando um inseto (bug, em Ingls) causou problemas de leitura em seu fongrafo em 1878.
4

Programao 2

Nesta fase de execuo do programa executvel, ns tambm devemos verificar a usabilidade do programa, ou seja, se o programa ficou fcil de ser utilizado pelo seu usurio. Quando o programa de difcil utilizao ou confunde o usurio, induzindo-o ao erro, ele perde o interesse em utiliz-lo ou compr-lo. Tambm devemos verificar se nosso programa tem um bom desempenho, ou seja, se ele processa rapidamente as operaes. Usurio no gosta de programa lento, no mesmo?

Atividades e Orientaes de Estudo Agora o momento de analisarmos se os assuntos abordados neste captulo foram bem absorvidos. Foram vistos muitos conceitos novos, no mesmo? Vamos responder as questes a seguir. Caso sintam necessidade, releiam alguma seo que no foi muito bem assimilada ou complementem as respostas com a leitura dos sites indicados na prxima seo. Vocs esto preparados(as)? 1. Para que serve uma linguagem de programao? 2. Quais as desvantagens das linguagens de baixo nvel? 3. Por que desejamos programas portveis? 4. O que motivou a criao da linguagem C? 5. A linguagem C de baixo ou alto nvel? 6. A linguagem C compilada ou interpretada? 7. Por que os erros de lgica so mais difceis de serem corrigidos? 8. Por que devemos nos preocupar com a usabilidade dos nossos programas?

Conhea Mais Para ampliar os seus conhecimentos sobre os assuntos tratados neste captulo, visite o site da OReilly. Neste endereo, 21

Programao 2

http://oreilly.com/pub/a/oreilly/news/languageposter_0504.html, foi disponibilizado um pster, muitssimo interessante, como uma rvore genealgica das principais linguagens de programao dos ltimos 50 anos. Vale a pena dar uma olhada. muito importante que vocs se cadastrem em algum frum de discusso sobre a linguagem C. Assim, vocs podero conversar e trocar idias com programadores de C mais experientes. Exemplos de fruns de C: DevMedia e Linha de cdigo.

Vamos revisar? Vamos dar uma reforada em nosso aprendizado com esta pequena reviso dos principais conceitos apresentados neste captulo. Observem o resumo a seguir: Programa: um conjunto de instrues que descrevem uma tarefa que ser executada por um computador. Programao de Computadores: o processo de escrita, teste e manuteno de um programa. Algoritmo: sequncia de passos para realizar uma tarefa ou resolver um problema. Linguagem de Programao: um conjunto de regras sintticas e semnticas usadas para definir um programa. Linguagem de mquina: a linguagem natural dos computadores. As instrues so formadas por zeros e uns. Estas linguagens no so legveis para um programador sem experincia. Linguagens de baixo nvel: so linguagens escritas usando as instrues do microprocessador do computador. Estas linguagens so mais difceis de entender e criar programas. Linguagens de alto nvel: so linguagens mais prximas linguagem humana e mais distantes das linguagens de mquina. So linguagens mais simples de entender, j que, em geral, utilizam uma sintaxe estruturada, tornando seu cdigo mais legvel. Compiladores: so programas que fazem a traduo de todas as instrues do programa fonte gerando um programa executvel.

22

Programao 2

Interpretadores: so programas que interpretam cada instruo do programa fonte executando-a dentro de um ambiente de programao. Compilao: o processo, executado pelo compilador, que verifica se existem erros de sintaxe no cdigo fonte e gera um programa executvel. Erro de sintaxe: ocorre durante o processo de compilao do programa, quando o programador, ao editar o seu programa fonte, no respeita alguma regra de sintaxe da linguagem de programao. Erro de lgica: ocorre durante a execuo de um programa, devido um erro na lgica dos comandos.

23

Programao 2

Captulo 2 Conceitos Preliminares para Programar em C


Vamos conversar sobre o assunto? Neste captulo, sero abordados conceitos preliminares que iro nos preparar para programar em C. Estes conceitos esto relacionados estrutura de um programa bsico em C. Aqui, tambm, ser apresentado o ambiente de programao que utilizaremos para o desenvolvimento dos nossos programas o Dev-cpp. Este ambiente apresenta uma interface amigvel, que facilitar o processo de programao. Vocs devem baixar e instalar o Dev-Cpp5, o quanto antes, no computador que ser utilizado para a prtica desta linguagem. importante que vocs tenham pacincia neste incio de aprendizado, j que precisamos, inicialmente, acumular o conhecimento necessrio para a construo de um programa completo em C. Visando facilitar o aprendizado, em alguns momentos, ser feito um paralelo entre a sintaxe do C e do Portugol do VisuAlg6 (linguagem utilizada para escrever algoritmos).

Saiba Mais
5 O Dev-cpp uma ferramenta gratuita e pode ser baixada acessando o site: www.bloodshed. net/devcpp.html

Saiba Mais
Conhea mais o VisuAlg pesquisando no site: http://www. apoioinformatica. inf.br/visualg/ linguagem.htm
6

24

Programao 2

Figura 2.1: Qualidades de um programador: ateno, pacincia e persistncia

Vale lembrar que qualquer linguagem de programao assimilada atravs da resoluo de exerccios. importantssimo que a prtica de programar faa parte da rotina de vocs. Assim, separem sempre um tempo para resolver as questes propostas neste material. Vocs vo perceber o quanto bom ver um programa rodando! Que venha o C!

2.1. Estrutura de um Programa Bsico em C


Nesta seo, vamos estudar a estrutura de um programa bsico em C. Visando facilitar o entendimento e no sobrecarregar vocs com muitos detalhes, alguns elementos da estrutura do programa sero omitidos. Mas, no momento certo, abordaremos tais elementos, certo? Assim, a estrutura do programa que ser apresentada nesta seo, a estrutura mnima de um programa em C. Nas linguagens de programao em geral, existe uma estrutura que indica a ordem em que deve ser disposto cada elemento do programa. Esta ordem deve ser respeitada para que nossos programas fiquem corretos. Como ser a estrutura de um programa em C? A estrutura bsica de um programa C deve seguir a seguinte ordem: 1. Incluso de bibliotecas (quando necessrio); 2. Declarao das constantes (quando necessrio); 3. Programa principal; 25

Programao 2

Declarao de variveis (quando necessrio); Seqncia de comandos. Para entendermos melhor a estrutura bsica de um programa C, vamos analisar o programa de exemplo 2.1, abaixo. Este programa calcula o cubo de um nmero inteiro fornecido pelo usurio. Na sequncia, temos este programa resolvido utilizando o portugol, que do conhecimento de vocs. Assim, fica fcil compararmos a estrutura do programa em C, com a estrutura do algoritmo. No se preocupem em entender cada comando do exemplo abaixo, estamos apenas comeando a estudar o C, certo?
Exemplo 2.1: Programa C Clculo do cubo de um nmero

1 2 3 4 5 6 7 8 9 10 11

#include <stdio.h> main() { int num,c; printf(Cubo de um numero\n\n); printf(Digite o numero: ); scanf(%d,&num); c = num*num*num; printf(\nCubo de %d = %d,num,c); getche(); }

Segue abaixo o algoritmo, escrito no VisuAlg, que calcula o cubo de um nmero.

26

Programao 2

Exemplo 2.2: Algoritmo Calculo do cubo de um nmero

1 2 3 4 5 6 7 8 9 10

algoritmo Cubo var num, c: inteiro inicio escreval(Cubo de um numero) escreva(Digite o numero: ) leia(num) c <- num*num*num escreval(Cubo de , num, = , c) fimalgoritmo

Um programa em C inicia com a incluso de bibliotecas. Uma biblioteca um arquivo que contm comandos complementares, que so utilizados pelo nosso programa. Para a incluso de uma biblioteca devemos usar um comando que chamado de diretiva de compilao. Este comando informa ao compilador quais bibliotecas devem ser anexadas ao programa executvel. Assim, o comando para a incluso de uma biblioteca tem a seguinte sintaxe:
Sintaxe #include <nome_do_arquivo_da_ biblioteca>

De acordo com a sintaxe, para incluir uma biblioteca ao nosso programa devemos colocar a diretiva de compilao #include e, entre os smbolos < e >, colocamos o nome do arquivo da biblioteca. De maneira geral, os arquivos de biblioteca tm a terminao .h (esse h vem de header, ou seja, este um arquivo de cabealho). Para cada biblioteca, que ser includa no nosso programa, devemos colocar um comando #include. No exemplo 2.1, na linha 1, feita a incluso de uma biblioteca: stdio.h. Na medida em que formos aprendendo os comandos, sero indicadas quais bibliotecas devem ser includas no programa. A quantidade de bibliotecas e quais bibliotecas sero 27

Programao 2

Saiba Mais
7 Do Ingls, main significa principal. Todo programa C comea a sua execuo a partir do programa principal. Assim, o programa principal uma parte obrigatria na estrutura de um programa C.

includas, depende dos comandos que sero utilizados no programa. Pode ser que em um programa, no seja necessrio incluir nenhuma biblioteca. O segundo item da estrutura de um programa C a declarao das constantes, esse item opcional, s constar no nosso programa, caso seja necessrio. Veremos a declarao de constantes, em detalhes, no prximo captulo. No exemplo 2.1 no foi necessrio o uso de constantes. O terceiro item da estrutura do programa C o programa principal. no programa principal que colocaremos a sequncia de comandos que deve ser executada para a soluo do problema que desejamos resolver. Ns devemos informar onde comea e termina o programa principal. O programa principal inicia com: main()7, como mostra a linha 2, do exemplo 2.1. A sequncia de comandos do programa principal delimitada por um par de chaves: { (abre chaves) e } (fecha chaves). As chaves que delimitam o corpo do programa principal8 aparecem nas linhas 3 e 11, do exemplo 2.1. Fazendo uma comparao com o algoritmo do exemplo 2.2, as chaves fazem o papel do inicio e fimalgoritmo, das linhas 4 e 10. Logo no incio do programa principal, devem ser declaradas as variveis (que sero abordadas no prximo captulo). A declarao de variveis um item opcional, pode acontecer de no precisarmos declarar variveis no nosso programa. No exemplo 2.1, a declarao de variveis feita na linha 4. Foram declaradas duas variveis do tipo inteiro: num e c. No algoritmo, exemplo 2.2, as variveis so declaradas fora do programa principal, na seo de declarao de variveis (linhas 2 e 3). Aps a declarao das variveis, colocamos a sequncia de comandos que o programa dever executar. O programa termina com o fecha chaves que delimita o programa principal. Agora que j sabemos como a estrutura de um programa bsico em C, vamos comear a aprender a sintaxe dos comandos para darmos incio ao desenvolvimento dos nossos programas.

Saiba Mais
8 Chamamos de corpo do programa principal toda a sequncia de comandos que faz parte do programa principal. Ou seja, a seqncia de comando que aparece entre as chaves de abertura e trmino do programa principal.

2.2. Palavras Reservadas do C


Como mencionado no captulo anterior, as linguagens de programao so formadas por um conjunto de regras de sintaxe e 28

Programao 2

semntica que ditam como o programa deve ser escrito. Com isso, dentro dessas regras, existe um conjunto de palavras que tem um significado para a linguagem de programao so as palavras reservadas. Uma palavra reservada , essencialmente, um comando e, na maioria das vezes, as palavras reservadas de uma linguagem definem o que pode ser feito e como pode ser feito. As palavras reservadas so de uso exclusivo da gramtica da linguagem, por isso, no podem ser utilizadas, pelo programador, para dar nome a alguma varivel, constante ou funo do seu programa. Assim, um programador no pode ter uma varivel chamada int no seu programa C, j que int uma palavra reservada que indica um tipo de dado. Na linguagem C temos 32 palavras reservadas. Todas as palavras reservadas do C so escritas em minsculo. A tabela abaixo mostra as palavras reservadas, conforme definido pelo padro ANSI9, para a linguagem C.
auto break case char const switch volatile continue default do double else typedef while enum extern float for goto union if int long register unsigned return short signed sizeof static struct void

Saiba Mais
9 A sigla ANSI significa: American National Standards Institute (Instituto Nacional Americano de Padronizao). uma organizao que tem por objetivo facilitar a padronizao dos trabalhos de seus membros.

No Dev-cpp, ambiente de programao que ser utilizado, sempre que digitarmos uma palavra reservada no nosso programa, esta aparecer em negrito. Isto facilita no momento da programao, pois no precisaremos decorar esta lista de palavras reservadas. Que alvio! Assim que uma palavra ficar em negrito no nosso programa, poderemos verificar se estamos utilizando-a de forma correta.

Saiba Mais
Ao desenvolver nossos programas utilizando boas prticas de programao, teremos como resultado um cdigo fonte mais legvel e um progama executvel mais seguro e eficiente. Ao longo deste material sero ensinadas boas prticas de programao.
10

2.3 Uso de Comentrios


Os comentrios so utilizados para documentar um programa. A colocao de comentrios em um programa uma das boas prticas de programao10. Os comentrios iro facilitar o entendimento e manuteno de programas. Por exemplo, um programador responsvel por desenvolver o sistema de controle de vendas 29

Programao 2

da sua empresa. Como o sistema grande, aps um tempo, ele no lembrar mais o porqu de ter colocado uma sequncia de comandos no seu programa. Se o programa estiver bem comentado, o programador poder, rapidamente, ter esta resposta. Alm disso, quando desenvolvemos programas em grupo, importante que os demais membros do grupo entendam o raciocnio do nosso programa e isso pode ser explicado atravs dos comentrios. Os comentrios podem ser colocados em qualquer parte do programa. Quando o compilador identifica um comentrio, ele os ignora, j que os comentrios so apenas informaes para o programador. A linguagem C fornece dois tipos de comentrios: de linha e de bloco. Vamos detalhar como funciona cada um deles. Os comentrios de linha so mais utilizados quando desejamos comentar uma nica linha do nosso programa. Um comentrio de linha possui a sintaxe a seguir:
Sintaxe // texto do comentrio

Saiba Mais
No Devcpp, quando colocamos um comentrio, as letras do texto comentado ficam cinza
11

Um comentrio de linha inicia com duas barras // e, na sequncia, vem o texto do comentrio. O exemplo 2.3, a seguir, apresenta um programa comentado. Na linha 7 temos o exemplo de um comentrio de linha. Este comentrio serviu para informar para que serve a varivel C. Assim que o compilador encontra //, ele ignora todo texto que vem aps as duas barras11. Este tipo de comentrio age apenas na linha que ele inserido. O segundo tipo de comentrio disponvel na linguagem C o comentrio de bloco. Os comentrios de bloco so utilizados quando queremos fazer um comentrio maior, que compreenda mais de uma linha de comentrio. A sintaxe do comentrio de bloco a seguinte:
Sintaxe /* texto do comentrio texto do comentrio texto do comentrio */

Um comentrio de bloco inicia com barra-asterisco /* e termina por asterisco-barra */. O compilador ir ignorar tudo o que encontrar 30

Programao 2

entre estes dois smbolos. Veja no exemplo 2.3, que nas linhas 2, 3, e 4 aparece um comentrio de bloco. Este tipo de comentrio do exemplo utilizado para identificar quem o programador quando o programa foi feito e o que o programa faz. Devemos Adotar este tipo de comentrio no incio dos nossos programas. Assim, ao abrir um programa, rapidamente, saberemos para que ele serve. Devemos tomar cuidado para no esquecer o */ que fecha o comentrio de bloco.
Exemplo 2.3: Programa C Comentado Calculo do cubo de um nmero

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

#include <stdio.h> /* Programador: Snia Frana Data: 09/03/2009 Programa calcular o cubo de um nmero main() { int Num, C; // C guarda o cubo do numero printf(Cubo de um numero\n\n); printf(Digite o numero: ); scanf(%d,&Num); C = Num*Num*Num; printf(\nCubo de %d = %d,Num,C); getche(); } */

2.4. Os Fundamentos do Ambiente C


Na seo 1.5, do captulo anterior, foram abordados os processos de criao, compilao e execuo de um programa. Nesta seo, vamos detalhar um pouco mais estes processos, entendendo os 31

Programao 2

fundamentos do ambiente C. A figura 2.2 apresenta um ambiente C, com as seis fases pelas quais passa um programa, desde a sua edio, at a sua execuo.

Figura 2.2: Ambiente C

A fase 1 compreende a edio do nosso programa. O programa criado com a utilizao de um editor e armazenado no disco do computador (HD - Hard Disk). O arquivo que contm o nosso programa tem a terminao .c, e este chamado de programa fonte ou cdigo fonte. Ao terminar a edio do programa, o programador solicita que o seu cdigo fonte seja compilado. O compilador traduz o cdigo fonte para o cdigo em linguagem de mquina (tambm chamado de cdigo objeto). Vocs se lembram das diretivas de compilao? Antes da traduo, temos a fase 2, em que o pr-processador 32

Programao 2

analisa o cdigo fonte, executando as diretivas de compilao. O pr-processador tambm responsvel por eliminar os comentrios que o programador colocou no seu cdigo fonte. O pr-processador ativado automaticamente pelo compilador. Na fase 3, que ocorre o processo de compilao, aps o cdigo fonte ter sido pr-processado. Para que o processo de compilao seja concludo, o programa no pode apresentar erros de sintaxe. Na fase 4, ocorre o processo de linking, que consiste na ligao do cdigo objeto, gerado pelo compilador, com o cdigo das funes que esto disponveis nas bibliotecas que inclumos no nosso programa. Ou seja, no exemplo 2.1, em que foi includa uma biblioteca, o linker dever localizar o arquivo da biblioteca e fazer a ligao com o cdigo objeto. Esta fase termina com a gerao do programa executvel, armazenando-o no disco do computador. No Dev-cpp, o programa executvel armazenado no mesmo diretrio que tiver armazenado o cdigo fonte. Na Figura 2.3, temos um diretrio contendo o arquivo do cdigo objeto (.c C source file) e o programa executvel (.exe application). O arquivo do programa executvel no pode ser editado, o que ns podemos editar o arquivo do cdigo fonte.

Figura 2.3: Diretrio contendo cdigo objeto e o programa executvel

Saiba Mais
CPU a sigla para Central Processing Unit, em Ingls, ou Unidade Central de Processamento. A CPU a parte do computador que processa as instrues contidas em um programa.
12

As fases 5 e 6 consistem na execuo do programa executvel. Para dar incio a execuo de um programa, necessrio que o mesmo esteja na memria principal do computador. Isto feito na fase 5, pelo carregador do programa. O carregador pega o programa executvel que est armazenado no disco e o transfere para memria principal. Assim que o programa est na memria principal do computador, ele est pronto para ser executado. A execuo de um programa feita pela CPU12, que executa as instrues do programa, uma aps a outra, at o seu trmino. 33

Programao 2

Na prxima seo, vamos conhecer o Dev-Cpp, que possibilitar a criao, compilao e execuo dos nossos programas. Com o Devcpp poderemos observar as fases aqui descritas.

2.5. Conhecendo o Dev-cpp


Saiba Mais
C++ uma linguagem de programao que surgiu a partir do C.
13

O Dev-Cpp um ambiente de programao que edita, compila e executa programas C e C++13. Sabem porque iremos usar o Devcpp para desenvolver nossos programas? O Dev-cpp gratuito (muito importante!) e possui uma interface bastante amigvel (mais importante ainda!). A Figura 2.4 apresenta a tela principal do Devcpp.

Figura 2.4: Tela principal do Dev-cpp

Como mencionado no incio deste captulo, vocs devero baixar o Dev-cpp e instalar no seu computador, para que possamos fazer os nossos programas. O processo de instalao no apresenta dificuldades. Vocs s devem ficar atentos no momento que for questionado sobre qual idioma deseja utilizar, para que faa a escolha do idioma correto (Portugus), certo? Assim, a interface do Dev-cpp ficar toda em Portugus, facilitando os seus estudos. Vamos analisar a tela principal do Dev-cpp, apresentada na figura 2.4. Na parte 1 temos o menu principal do Dev-cpp, que disponibiliza 34

Programao 2

as seguintes opes: Arquivo: o menu arquivo disponibiliza, basicamente, as opes para criar, salvar, imprimir e fechar arquivos. Editar: neste menu encontraremos as opes: copiar, colar, selecionar, refazer e desfazer. Localizar: as opes deste menu nos possibilita localizar alguma palavra no programa fonte, alm de permitir substituies de uma palavra por outra. Exibir: neste menu temos as opes que nos permite exibir ou esconder itens da interface do ambiente, como por exemplo: barra de ferramenta e barra de status. Projeto: permite a adio ou remoo de arquivos em um projeto. Executar: atravs deste menu que iremos chamar as opes para a compilao e execuo do nosso programa. Debug: o debugador auxilia o programador a encontrar erros no programa, tornando possvel acompanhar passo a passo a execuo dos comandos do programa. Neste menu teremos as opes para utilizao do debugador. Ferramentas: no menu ferramentas temos as opes para configurar o ambiente (mudar cores, tipo de letra, dentre outros) e tambm a opo para atualizao do Dev-cpp. CVS14: este menu utilizado por quem faz o controle de verses dos programas. Apesar de ser uma funo bastante interessante, mais utilizado quando trabalhamos em grupo ou com programas grandes. Janela: neste menu esto disponveis as opes que nos permitem escolher qual janela de edio deve ficar visvel no momento. Utilizamos esta opo quando temos vrios programas abertos ao mesmo tempo. Ajuda: neste menu encontramos o help do Dev-cpp. Na parte 2, da Figura 2.4, temos os cones de atalhos para as opes mais utilizadas no Dev-Cpp. Se vocs deixarem o mouse sobre o cone, aparecer um texto, que informa o que ele faz. Na parte 3 temos a rea de edio do programa. Para a rea de edio ficar 35
Saiba Mais
O CVS, ou Concurrent Version System (Sistema de Verses Concorrentes) um sistema de controle de verses que permite que se trabalhe com diversas verses do mesmo arquivo. Este sistema mantm as verses antigas do seu arquivo e os logs de quem e quando manipulou os arquivos.
14

especialmente til para se controlar verses de um software durante seu desenvolvimento, ou para composio colaborativa de um documento.

Programao 2

disponvel, vocs devero escolher a opo Arquivo/Novo/Arquivo Fonte. nesta rea que digitaremos os nosso programas (cdigo fonte). A parte 4 fica visvel quando nosso programa apresenta algum erro de compilao. O compilador indicar em qual linha foi encontrado um erro, e fornece uma dica do que pode ser o erro. Mesmo que vocs tenham instalado o Dev-cpp em Portugus, as mensagens de erro so apresentadas em Ingls. Por isso, importante que vocs comecem a se familiarizar com estas mensagens, para que consigam tirar mais rapidamente os erros dos programas. Segue abaixo um roteiro do que vocs precisam fazer para editar, compilar e executar seus programas no Dev-cpp: 1. Crie um arquivo fonte novo na opo: Arquivo/Novo/Arquivo Fonte; 2. Digite o programa fonte na rea de edio. Ao terminar de editlo, salve o arquivo;
Saiba Mais
O erro de compilao pode no estar na linha que o complilador est indicando. O erro poder estar: na linha que ele est indicando, na linha imediatamente acima, ou ainda, em linhas mais acima (menos comum de acontecer).
15

3. Compile o programa na opo: Executar/Compilar; 4. Se der algum erro no programa, vejam as indicaes de erro fornecidas pelo compilador15. Conserte os erros, salve o arquivo e compile novamente. Isto deve ser feito at que seja apresentada uma mensagem indicando que o programa no tem erros de compilao. 5. Se vocs acessarem o diretrio que o arquivo do cdigo fonte foi armazenado, notaro que foi criado um arquivo com a extenso .exe (com o mesmo nome do arquivo do cdigo fonte). Este programa executvel. Para execut-lo, escolha a opo Executar/Executar no Dev-cpp. Imediatamente, aparecer a janela de execuo do programa, como mostra a Figura 2.5.

Figura 2.5: Janela do programa em execuo

nesta janela que o programa ser executado. Aqui o usurio 36

Programao 2

dever fornecer os dados solicitados pelo programa, neste caso o programa est solicitando que seja digitado um nmero. Alm disso, tambm receber os resultados fornecidos pelo programa. Quando a execuo de um programa finalizada, esta janela ser fechada automaticamente. Agora que j conhecemos o ambiente de desenvolvimento de programa C, precisamos aprender os comandos para fazer um programa completo. Nos prximos captulos iremos ver tais comandos, para podermos comear a programar. No fiquem ansiosos(as), a nossa hora de programar est chegando!

Atividades e Orientaes de Estudo Vamos resolver mais uma lista de exerccios? Note que estamos conhecendo, ao poucos, os detalhes que envolve a programao de computadores. A resoluo das atividades propostas far com que estes conceitos sejam assimilados de forma mais natural. sempre importante complementar o nosso conhecimento com a leitura de livros e materiais disponveis na Internet, indicados na seo Conhea Mais. Ser que vocs esto lembrados (as) das respostas para as questes abaixo? 1. Quando que precisamos incluir uma biblioteca em um programa C? 2. O que diretiva de compilao? 3. O que deve ter no corpo do programa principal? 4. O que uma palavra reservada? 5. Porque devemos comentar nossos programas? 6. Qual a funo do pr-processador no momento da compilao de um programa? 7. Qual o papel do linker no processo de compilao? 8. Qual elemento do computador responsvel pela execuo do programa?

37

Programao 2

Conhea Mais Vocs podero aprender mais sobre boas prticas de programao nos sites: http://www.ibm.com/developerworks/aix/library/au-hook_ duttaC.html http://www2.eletronica.org/artigos/eletronica-digital/ programando-em-c-boas-praticas Para conhecer mais detalhes do ambiente de programao que iremos utilizar, acessem os sites: http://www.bloodshed.net/dev/index.html http://www.uniqueness-template.com/devcpp/

Vamos revisar? Nesta seo iremos revisar os principais tpicos vistos neste captulo. Vale a pena dar uma lida para verificar como est o nosso aprendizado. Observem o resumo a seguir: A estrutura bsica de um programa C deve seguir a seguinte ordem: incluso de bibliotecas, declarao das constantes e programa principal. No corpo de programa principal temos: declarao de variveis e seqncia de comandos. Uma biblioteca um arquivo que contm comandos complementares, que so utilizados pelo programa. Para a incluso de uma biblioteca devemos usar um comando que chamado de diretiva de compilao. As palavras reservadas de uma linguagem definem o que pode ser feito e como pode ser feito. O programador no pode utilizar uma palavra reservada da linguagem para dar nome as suas variveis, constantes e funes. O uso de comentrio nos programas uma boa prtica de programao, e facilita o entendimento do cdigo fonte.

38

Programao 2

Passos para o desenvolvimento de um programa: edio, prprocessamento, compilao, ligao (linking), carregamento e execuo. O compilador traduz o cdigo fonte para o cdigo em linguagem de mquina. O pr-processador analisa o cdigo fonte, executando as diretivas de compilao. O linker faz a ligao do cdigo objeto, gerado pelo compilador, com o cdigo das funes que esto disponveis nas bibliotecas que inclumos no programa. Ao ser executado, um programa deve ser carregado na memria. O carregador, tambm conhecido por loader, e responsvel por acessar o programa armazenado no disco e carreg-lo para a memria principal do computador. Os programas so executados passo a passo pelo processador do computador.

39

Programao 2

Captulo 3 Tipos de Dados, Variveis e Constantes


Saiba Mais
A linguagem C no possui o tipo lgico, que armazena verdadeiro ou falso.
16

Vamos conversar sobre o assunto? Programas so feitos para manipular dados. Armazenar notas, calcular mdias, alterar um endereo, etc. Os dados so a essncia de um programa. Dados precisam ser armazenados e modificados ao longo da execuo do programa. Neste captulo, iremos conhecer os tipos de dados suportados pela linguagem C e aprender a definir constantes e variveis. Inicialmente, os comandos sero apresentados em separado. Mas, logo em seguida, veremos o ponto em que cada comando deve ser colocado na estrutura do programa, certo? Tenham pacincia! Vocs iro notar que muito dos conceitos estudados nos captulos anteriores sero referenciados neste captulo. Mas isto no problema, no mesmo? Vamos continuar os nossos estudos, conhecendo mais um pouco da linguagem C.

Saiba Mais
Bit uma abreviatura de Binary Digit (dgito binrio). Este termo foi criado pelo engenheiro belga Claude Shannon que em 1949 para simbolizar uma unidade de informao. Tudo na informtica medido em bits, desde o tamanho de um nmero at a velocidade de transferncia de dados em uma rede. Por ser uma unidade binria, pode ter apenas dois valores, zero ou um.
17

3.1. Tipos de dados


Nesta seo, vamos aprender um conceito importante em programao, que : tipo de dados. De maneira geral, os programas manipulam dados, armazenando-os e, muitas vezes, modificando seus valores. Primeiramente, vamos conhecer quais os tipos de dados so manipulados na linguagem C. Basicamente, a linguagem C, manipula quatro tipos de dados: inteiro, real, caractere e void16. Para cada tipo de dado, necessria uma quantidade de bits17 para armazen-lo. Alm disso, cada tipo de dado possui um conjunto de operaes que pode ser executada sobre ele. Nas subsees seguintes, vamos detalhar cada tipo de dado separadamente. 3.1.1. Inteiro Os dados do tipo inteiro so toda e qualquer informao numrica que pertena ao conjunto dos nmeros inteiros relativos (negativo, nulo ou positivo). Os nmeros inteiros, em C, se dividem em trs tipos, como mostra a tabela a seguir.

A partir do bit, surgiu o byte, que nada mais do que um conjunto de 8 bits. Existem diversos mltiplos dos bytes: um kilobyte (KB), equivalente a 1.024 bytes; um megabyte (MB), equivalente a 1.024 KB; e um gigabyte, equivalente a 1.024 MB.

40

Programao 2

Tipo Short Int Long

Tamanho 16 bits 32 bits 64 bits

Intervalo Suportado -32.768 a +32.767 -2.147.483.648 a + 2.147.483.647 -9.223.372.036.854.775.808 a +9.223.372.036.854.775.807 Ateno


A memria a parte do computador que tem como funo o armazenamento de dados. Quando um dado vai ser armazenado, precisamos reservar uma quantidade de memria para isto.
18

Qual a diferena entre cada um deles? A diferena entre os tipos short, int e long a quantidade de memria18 que reservada para armazen-los. Veja como simples: medida que se utiliza mais memria, aumenta o intervalo do valor que pode ser armazenado. Por exemplo, para armazenar um dado do tipo short, so reservados 16 bits de memria. Com isso, o tipo short pode suportar um nmero inteiro no intervalo de -32.768 a +32.767, como apresentado na tabela. Portanto, dependendo do valor que ser armazenado, deve ser escolhido um tipo (short, int ou long) que comporte tal valor. Por exemplo, para armazenar a idade de um funcionrio, o tipo short o mais adequado (j que a idade de uma pessoa um valor que raramente ultrapassa 100). No entanto, para armazenar a quantidade de eleitores de uma cidade, deve-se usar o tipo int (note que em muitas cidades, a quantidade de eleitores ultrapassar o maior valor suportado pelo tipo short: 32.767). Para facilitar nosso estudo, neste material, sempre ser usado o tipo int para armazenar os dados inteiros. 3.1.2. Real Os dados do tipo real so toda e qualquer informao numrica que pertena ao conjunto de nmeros reais (negativo, positivo ou nulo). Os nmeros reais, em C, podem ser de dois tipos, como mostra a tabela abaixo:
Tipo float double Tamanho 32 bits 64 bits Intervalo Suportado 3.4E-38 a 3.4E+38 1.7E-308 a 1.7E+308

Para o tipo float so reservados 32 bits de memria, o que possibilita armazenar um valor no intervalo 3.438 a 3.438. Como o tipo float suporta valores bem altos, neste material, sempre ser usado o tipo float para armazenar os dados reais. 41

Programao 2

3.1.3. Caractere Na linguagem C, os caracteres so do tipo char, representados por toda e qualquer informao composta por um nico caractere alfa numrico (a, b, c,...z, A, B, C,...Z, 0...9) ou especial (como por exemplo: ; # ? @ ! < ?). O tipo char armazena um nico caractere. Quando se deseja armazenar vrios caracteres, necessrio definir um vetor de caractere (mais detalhes na seo 3.2.2). Por exemplo, o nome de um aluno formado por uma cadeia de caracteres, assim, ser necessrio usar um vetor de caracteres. Cada caractere armazenado ocupa o espao de 8 bits de memria. Um caractere deve ser representado entre apstrofo, por exemplo: a. Mas, quando temos uma cadeia de caracteres, esta deve ser representada entre aspas dupla, por exemplo: Pedro Goncalves. 3.1.4. Void Em Ingls, void quer dizer vazio e isto mesmo que o void . Void um tipo que no armazena nada (um tanto esquisito, no ?). Este tipo serve para indicar que um resultado no tem um tipo definido. Ele utilizado quando estamos definindo funes nos nossos programas. Permiti-nos desenvolver funes que no retornam nada e funes que no tm parmetros. Voltaremos a falar do tipo void no Volume 2, no captulo que aborda modularizao.

3.2. Variveis e Constantes


Agora que j sabemos os tipos de dados manipulados pela linguagem C, vamos aprender como reservar espaos de memria para o armazenamento dos nossos dados. Qualquer dado que seja manipulado pelo programa deve ficar armazenado na memria principal do computador. Para que o armazenamento seja possvel, precisaremos reservar espaos na memria principal do computador. As variveis e constantes so unidades bsicas de armazenamento dos dados em programao. Elas so um espao de memria reservado para armazenar um certo tipo de dado e possuem um identificador (nome) para referenciar o seu contedo. Dessa forma, nossos dados ficam armazenados em constantes ou variveis. Uma varivel pode conter, a cada instante, valores diferentes. No 42

Programao 2

entanto, as constantes referem-se a valores fixos que no podem ser alterados durante a execuo do programa. O modo como cada constante representada depende do seu tipo (este assunto ser detalhado um pouco mais a frente). Para entender o conceito de variveis e constantes, vamos fazer a seguinte analogia: um armrio cheio de gavetas de tamanhos diferentes. Acompanhem o raciocnio: Pedro tem um armrio e decide que em cada gaveta ser guardado um tipo de roupa: camisa, bermuda, cala, etc.

Figura 3.1: Armrio cheio de gavetas

Em uma dada gaveta, s podem ser armazenadas camisas. No ser permitido o armazenamento de calas nesta gaveta. Para facilitar a identificao, Pedro coloca uma etiqueta informando o que cada gaveta guarda. Com isso, Pedro poder identificar, rapidamente, em qual a gaveta esto guardadas suas camisas. Agora vamos associar a ideia das gavetas com a ideia de variveis, constantes e tipo. As gavetas que guardam as roupas so como os espaos de memria que armazenam nossos dados. Assim como uma gaveta s pode armazenar um tipo de roupa, os espaos de memria so especificados para armazenar um tipo de dado. Dependendo do tipo de roupa, a gaveta precisa ser maior ou menor. Da mesma forma, dependendo do tipo de dado, feito uma reserva de mais ou menos memria para armazen-lo (de acordo com as tabelas da seo 3.1). As etiquetas das gavetas so os identificadores dos nossos 43

Programao 2

espaos de memria. Assim, iremos encontrar, facilmente, um dado armazenado nos nossos espaos de memria. Quando temos uma varivel, o contedo da nossa gaveta pode mudar ao longo do tempo. Mas, no caso de uma constante, seu contedo ser sempre o mesmo. Nas prximas sees, vamos aprender as regras para dar nomes s nossas variveis e constantes e como criar as nossas gavetas espaos de memria (variveis e constantes). 3.2.1. Identificadores Para que o compilador saiba quais dados estamos querendo manipular, eles precisam ter um nome. como ns, todos temos um nome. Sabemos quando algum est nos chamando quando falam o nosso nome. Vai acontecer a mesma coisa com os espaos de memria dos nossos programas, precisamos identific-los, de alguma forma. Os identificadores so os nomes que damos as nossas variveis, constantes, funes e procedimentos usados no programa. Para criar um identificador necessrio respeitar as regras a seguir: O primeiro caractere deve ser uma letra ou _ (underscore); O restante do nome deve ser formado por caracteres pertencentes ao seguinte conjunto: a,b,c,..z, A,B,C,...Z, 0,1,2,...,9, _ (ou seja: letras, nmeros e underscore); No deve haver espao em branco (ou seja, no existe identificadores compostos, formados por dois ou mais nomes); No utilizar acentos, nem cedilha; Os identificadores podem ter at 32 caracteres; No deve haver identificadores repetidos (Se dermos o mesmo nome para duas variveis do nosso programa, o compilador no vai saber qual delas ser chamada, e isso no pode acontecer). A linguagem C faz distino de maisculas e minsculas. Assim, os identificadores: Media, MEDIA, MediA e media, so diferentes. O fato de termos uma nica letra de forma diferente (maiscula ou minscula), j faz com que os identificadores se diferenciem. Esta propriedade chamada de case sensibility (sensibilidade a letras maisculas e minsculas).

44

Programao 2

DICA: Boa Prtica de Programao Escolham bem os nomes das variveis e constantes do programa. Os identificadores escolhidos devem ser claros, a fim de explicitar o contedo que ser armazenado, mas tambm no devem ser extensos para no dificultar a escrita.

A seguir, vamos verificar exemplos de identificadores corretos e incorretos: Identificadores corretos: a, x2, Nome_Aluno, Media, SalarioFuncionario. Note que, quando queremos usar identificadores com mais de uma palavra, que foi o caso de Nome_Aluno, usamos o _ para ligar uma palavra a outra. Ou usamos as palavras juntas, como o exemplo SalarioFuncionario. Lembrando que no podemos usar espao em branco. Identificadores incorretos: 2m (comeou com nmero), media* (caractere * no permitido), Nome disciplina (no pode haver espao em branco), funcionrio (no pode acentuar). At este momento, vimos os conceitos de tipos de dados, variveis, constantes e identificadores. Na prxima seo, estes conceitos sero utilizados em conjunto, para que possamos declarar as nossas variveis, ou seja, criar espaos de memria para armazenar os dados manipulados pelo nosso programa. Continuemos a nossa leitura. 3.2.2. Declarao de Variveis Para que se possa usar uma varivel em um programa, primeiramente, necessrio fazer a declarao dela. A declarao de uma varivel informa ao processador duas coisas: o identificador (nome) da varivel e o seu tipo de dado. As variveis precisam de um nome para que o processador saiba onde desejamos armazenar o nosso dado. Alm disso, toda varivel precisa ser associada a um tipo de dado, para que o processador reserve o espao de memria necessrio para o seu armazenamento. Como visto na seo 3.1, cada tipo de varivel, ocupa uma quantidade de bits diferente. Resumindo, toda varivel possui um nome, um tipo e um contedo (ou valor que armazenado na varivel).

45

Programao 2

A declarao de variveis deve obedecer a seguinte sintaxe:


Sintaxe tipo [variavel_1, variavel_2, ...];

Onde tipo o tipo de dado (int, float, char) e variavel_1 o nome da varivel a ser declarada. O nome da varivel deve seguir a regra dos identificadores (mencionadas na seo 3.2.1). Se houver mais de uma varivel do mesmo tipo, seus nomes so separados por vrgulas. Notem que, no final do comando, aparece um ponto e virgula (;), indicando ao compilador que o comando terminou.
Exemplo 3.1: Declarao de Variveis 1 2 3 int float char idade, matricula; media, total; letra, nome_aluno[20];

As variveis idade e matricula so espaos de memria que armazenam nmeros inteiros. As variveis media e total armazenam nmeros reais. Note que na linha 3, temos as variveis letra e nome_aluno. Quando uma varivel caractere tem apenas um nico caractere, na sua declarao, necessrio apenas dar um nome a esta varivel. Quando houver necessidade de armazenar vrios caracteres, temos o que chamado de cadeia de caracteres, vetor de caracteres ou string. Uma cadeia de caracteres forma uma palavra ou frases. Para declarar uma varivel capaz de armazenar uma cadeia de caracteres, devemos colocar ao lado do nome da varivel, entre colchetes, um valor inteiro, que significa quantos caracteres podem ser armazenados nesta cadeia. Assim, a varivel nome_aluno, declarada na linha 3, tem capacidade de armazenar uma palavra/frase com at 20 caracteres. A figura 3.2 representa a memria do computador, aps a declarao das variveis do exemplo. Cada caixa representa uma varivel. E, cada varivel possui o seu identificador. Assim, esta declarao de variveis resultou na reserva de seis espaos na memria. Toda vez que precisarmos acessar ou armazenar o contedo de uma varivel, utilizaremos o seu identificador.

46

Programao 2

Figura 3.2: Representao da memria do computador aps a declarao de um conjunto de variveis

Ateno Como dito anteriormente, o C difere as letras minsculas das maisculas. Assim, os tipos de dados e comandos que iremos aprender ao longo da disciplina, DEVEM ser escritos em minsculo. Se vocs fizerem a seguinte declarao : Int x,y; Vai ocorrer um erro no momento da compilao do seu programa, j que o C no conhece o tipo Int com I maisculo. Fiquem atentos, pois esse um erro comum para quem est comeando a programar em C.

De acordo com o que foi visto, quando estudamos a estrutura da um programa C, as variveis devem ser declaradas logo quando inicia o corpo do programa principal. Vamos estudar, a seguir, como fazemos para declarar as nossas constantes. 3.2.3. Declarao de Constantes Diferente das variveis, as constantes mantm seu valor ao longo do programa. Para indicar ao compilador que se trata de uma constante, a diretiva de compilao #define utilizada. Segue a sintaxe da declarao de uma constante.
Sintaxe #define <identificador> <valor>

47

Programao 2

No necessrio colocar o ponto e vrgula no final da linha e tambm no precisa informar o tipo de dado da constante. O valor de uma constante no pode ser modificado, de maneira alguma, ao longo da execuo do programa. O modo como cada constante representada depende do seu tipo. Constantes do tipo inteiro so representadas por nmeros sem o componente fracionrio, por exemplo, 123 e 2009. Constantes reais precisam do uso de ponto decimal seguido do componente fracionrio do nmero, por exemplo, 302.54. Constantes caractere so colocadas entre apstrofos, por exemplo, a. Constantes cadeia de caractere so colocadas entre aspas duplas, por exemplo, Casa e Maria. A seguir so apresentadas as declaraes de quatro constantes:
Exemplo 3.2: Declarao de Constantes 1 2 3 4 #define DIAS 7 #define PI 3.1416 #define RESPOSTA s #define DISCIPLINA Matemtica

De acordo com o exemplo, a constante DIAS ir armazenar sempre 7. Como o valor que esta constante recebeu foi um valor inteiro, o compilador entende, automaticamente, que esta uma constante inteira. Da mesma forma, como a constante PI recebeu 3.1416 (um nmero real), o compilador saber que se trata de uma constante do tipo real. A constante RESPOSTA armazena um char e DISCIPLINA uma cadeia de caracteres. interessante declarar uma constante quando sabemos que um valor no ser modificado ao longo da execuo do programa. Por questes de padronizao, declare as suas constantes com todas as letras em maisculo, como apresentado nos exemplos. Assim voc estar diferenciando-as das variveis. De acordo com a estrutura de um programa C, as nossas constantes so declaradas no incio do programa, logo aps incluirmos as bibliotecas que sero utilizadas. Esto lembrados(as) disso? Se no esto, deem uma revisada na seo 2.1, certo? Ao serem criadas, as constantes j recebem o valor que elas vo armazenar ao longo do programa. Isto no acontece com as variveis. 48

Programao 2

Mas como fazemos para armazenar um valor em uma varivel? Esta resposta vocs encontraro na prxima seo.

3.3. Operador de Atribuio (=)


Esse operador utilizado para armazenar um valor em uma dada varivel. Assim, o operador de atribuio nos possibilita armazenar um dado em um espao de memria, que foi previamente declarado. importante que o dado que ser armazenado seja compatvel com o tipo da varivel que receber a atribuio. Por exemplo, as variveis reais podem receber valores reais e inteiros. No entanto, uma varivel inteira, no pode receber um valor real. Segue a sintaxe do operador de atribuio.
Sintaxe Variavel = Valor; Variavel_1 = Variavel_2; Variavel = Expresso Aritmtica; Variavel = funo; Variavel_1 = variavel_2 = variavel_3 = valor;

O operador de atribuio representado pelo smbolo =. No lado esquerdo do operador da atribuio, temos a varivel que vai receber o valor. No lado direito do operador, temos o valor que ser atribudo varivel. Ao final da linha de atribuio deve ter um ponto e vrgula. Notem que o operador de atribuio permite vrias possibilidades. Para um melhor entendimento, o exemplo 3.3 apresenta cada uma das possibilidades do operador de atribuio.

49

Programao 2

Exemplo 3.3: Comando de atribuio

1 2 3 4 5 6 7 8 9

float Media, X, Y, Z; int J, L, M, K, A, B; char Letra; Media = 7.5; Letra = D; X = Y; K = A + B; Z = sqrt(4); J = L = M = 10;

Nas linhas 1, 2 e 3, temos a declarao das variveis. Lembrem que s podemos armazenar algum valor, caso tenhamos declarado as variveis. Uma vez que necessrio ter reservado espaos de memria para nossos dados, entendido?
Saiba Mais
Onde aparece o = do comando de atribuio, nos lemos: recebe. Assim, o comando da linha 4 do exemplo 3.3, seria lido: Media recebe 7.5.
19

Na linha 4, a varivel Media recebeu 7.5 (para nmeros reais, devemos utilizar ponto ao invs de virgula, para separar a parte inteira da parte fracionria do nmero)19. Na linha 5, temos uma atribuio para uma varivel char com um nico caractere. Note que, neste caso, o valor que a varivel receber vem entre apstrofo. Assim, a varivel Letra est recebendo D.

Ateno O operador de atribuio no usado para variveis do tipo char com vrios caracteres. Este tipo de atribuio ser visto no captulo Comandos de Manipulao de Caracteres, do Volume 4.

Na linha 6, a varivel X receber o valor que est armazenado na varivel Y. Na linha 7, a varivel K ir receber o resultado da 50

Programao 2

expresso A + B, ou seja, ser obtido o valor armazenado na varivel A, depois o valor da varivel B, os valores so somados e o resultado atribudo a varivel K. Uma varivel sempre recebe um valor. Quando a atribuio tem uma expresso matemtica, a expresso resolvida e o resultado atribudo a varivel. Na linha 8, a varivel Z receber o resultado da chamada da funo sqrt (que faz o clculo da raiz quadrada de um nmero). Veremos mais detalhes sobre estas funes no captulo 5. Na linha 9, aparece o que chamamos de atribuio em cadeia. Quando vrias variveis vo receber o mesmo valor, ao invs de ser feita uma atribuio de cada vez, podemos dizer: variavel1 = variavel2 = variavel3 = valor. Ns podemos atribuir o mesmo valor a quantas variveis quisermos. Coloquei um exemplo com trs, certo? No exemplo da linha 9, as variveis K, L e M vo receber 10. Mas tem um detalhe, ns s podemos usar a atribuio em cadeia quando todas as variveis que iro receber o valor so do mesmo tipo. Assim, nesta atribuio do exemplo, as trs variveis K, L e M so do mesmo tipo: int.

Atividades e Orientaes de Estudo Temos agora mais uma lista de exerccios para consolidar o nosso entendimento do assunto visto neste captulo. Vocs perceberam quantas coisas novas ns j aprendemos at aqui? Como uma linguagem de programao envolve vrios detalhes, so os exerccios que vo nos ajudar a no esquecer deles. Prontos (as) para acertar todas as questes? 1. Identifique os tipos dos valores abaixo (int, float, char de um caractere ou char de vrios caracteres):
1) 1000 5) 456 9) BRASIL 2) 09 6) 34 10) l 3) 1.56 7) C 11) - 5.6 4) VERDADE 8) 45.8976 12) 300

2. Abaixo, temos exemplos de identificadores. Assinale os identificadores vlidos e descreva o erro dos operadores invlidos. 51

Programao 2

1) endereco 5) usuario6 9) nome aluno

2) 21brasil 6) nome*usuario 10) mdia

3) fone$com 7) end*a-6 11) _pais

4) nome_usuario 8) #media 12) Media_da_Turma

3. De acordo com as declaraes abaixo, assinale os comando de atribuio invlidos e descreva o erro. int NUM, X, SOMA; float MEDIA, K, L; ( ( ( ( ( ( ( ( ) SOMA = NUM + 2; ) MEDIA = SOMA; ) NUM = K + L; ) X = X + 1 ) L = SOMA - K;

) SOMA + 2 = NUM + 10; ) S = SOMA; ) X = SOMA - NUM;

Conhea Mais Comece a aprofundar mais seus conhecimentos com a leituras dos livros clssicos da linguagem C: O mais autntico de todos, tem como autores os criadores desta linguagem: C - A Linguagem de Programao, de B. W. Kernighan e D. M. Ritchie, editora Campus. Este um livro relativamente difcil de ler, mas a Bblia da linguagem. Dois textos mais didticos so: C Completo e Total, de Herbert Schildt, pela editora MAKRON Books. Como programar em C, de H. M. Deitel e P. J. Deitel, pela editora LTC. 52

Programao 2

A vantagem de ver vrios livros que um autor acaba complementado o que o outro escreveu. Alm disso, um autor pode explicar um certo assunto de forma mais clara que o outro. Por isso bom sempre dar uma olhada em livros novos e material disponvel na Internet.

Vamos revisar? Vamos fazer uma reviso do assunto que foi visto neste captulo, fazendo a leitura do resumo a seguir: Os tipos de dados manipulados pelo C so: inteiro, real, caractere e void. O tipo inteiro se divide em: int, short ou long. A diferena entre os trs tipos a quantidade de memria reservada para armazenlos. O tipo real se divide em: float e double. O tipo char armazena um caractere. Quando desejamos armazenar vrios caracteres, para formar um nome ou frase, precisamos declarar uma cadeia de caracteres. As variveis so espaos de memria onde armazenamos nossos dados. Uma varivel possui um nome, um tipo e um valor. Para que um varivel passe a existir, precisamos fazer a sua declarao. Ao declarar uma varivel, damos a ela um nome, e dizemos que tipo de dado pode ser armazenado na varivel. Os nomes da variveis so os identificadores. Para dar um nome a uma varivel, precisamos seguir a regra de criao de identificadores. As constantes so espaos de memria onde armazenamos um valor que no ser alterado durante a execuo do programa. O comando de atribuio utilizado quando desejamos armazenar um valor em uma varivel. A atribuio de um valor a uma varivel s poder ser executada se o tipo de dado que a varivel armazena for compatvel com o valor que ser atribudo.

53

Programao 2

Captulo 4 Comandos de Entrada e Sada de Dados


Vamos conversar sobre o assunto? Um programa que no fornece resultados, nem recebe valores para serem processados, no tem muita utilidade. De um modo geral, o objetivo pelo qual escrevemos programas a obteno de resultados (Sadas) depois da realizao de clculos ou pesquisas (Processamento) atravs do fornecimento de um conjunto de dados (Entradas). Neste captulo, iremos a estudar os comandos de entrada e sada de dados. Assim, com o comando de entrada poderemos fornecer dados para que sejam processados pelo programa. Com o comando de sada poderemos receber os resultados do processamento dos nossos dados. Uma boa notcia que, a partir deste captulo, teremos adquirido conhecimento suficiente para construir um programa completo em C! Ficaram felizes? Ento no vamos perder mais tempo, vamos logo aprender os comandos de entrada e sada de dados.

Saiba Mais
Voce sabe quem inventou o mouse? Embora tenha sido inventado por Bill Enghlish, a sua patente pertence a Douglas Engelbart. Ele apresentou este perifrico pela primeira vez em 1968 e o chamou de XY Position Indicator For A Display System. O primeiro mouse era feito de madeira, com apenas um boto. O invento de Engelbart ficou sem muita utilizao devido a falta de necessidade de tal dispositivo, j que a maioria dos computadores utilizavam apenas textos sem cursores na tela. Vocs se imaginam sem um mouse em seus computadores?
20

4.1. Entrada de Dados


O comando de entrada de dados utilizado quando desejamos fornecer um valor para um nosso programa. A entrada de dados feita atravs de um dispositivo de entrada de dados. Os dispositivos mais comuns so: teclado, mouse20, tela sensvel ao toque, scanner, dentre outros. A figura 4.1 apresenta alguns destes dispositivos.

Figura 4.1: Dispositivos de Entrada de Dados

54

Programao 2

Nesta seo, iremos aprender como executar a entrada de um dado (ou a leitura de um dado, como tambm chamada) atravs do teclado. A execuo do comando de leitura pressupe que os dados sero fornecidos do meio externo (teclado), e sero armazenados na memria (variveis). O comando que faz a leitura de um dado fornecido via teclado e o armazena em uma varivel do programa o scanf. Fazendo um paralelo com o Portugol, o scanf o comando leia. Vamos ver a sua sintaxe.
Sintaxe scanf(string de controle, &variavel);

O comando scanf tem um certo nvel de detalhes, para entend-lo, vamos por partes. Na primeira parte do scanf, entre as aspas, aparece a string de controle. O que vem a ser a string de controle? A string de controle indicar que tipo de dado ser lido neste momento. A string de controle deve assumir um dos valores abaixo:
String de Controle %d %f %c %s Significado leitura de nmeros inteiros leitura de nmeros reais leitura de um caractere leitura de cadeia de caracteres
21

Saiba Mais
Ns acessamos uma varivel atravs do seu nome. No entanto, o processador acessa uma varivel utilizando o endereo de memria dela. Cada varivel criada no nosso programa possui um endereo de memria. Ns no precisamos conhecer o endereo de memria de uma varivel, certo? S precisamos saber o nome dela.

Assim, quando formos ler um dado que vai ser armazenado em uma varivel do tipo inteiro, a string de controle deve ser %d. Se o valor a ser lido, for um nmero real, a string de controle ser %f. Quando o dado a ser lido for um nico caractere, a string de controle %c e para ler uma cadeia de caracteres, utilizado %s. Com a resoluo de exerccios, vocs no esquecero o significado de cada string de controle, certo? Na segunda parte do scanf, colocamos o nome da varivel que vai armazenar o valor que ser fornecido via teclado, entendido? Notem que antes do nome da varivel, aparece um & (e-comercial). O & faz parte da sintaxe do scanf e no pode ser esquecido. NUNCA! Na linguagem C, o & significa: Endereo de memria21. Assim, o comando scanf indica que o dado ser lido via teclado e ser 55

Programao 2

armazenado no endereo de memria da varivel. O comando scanf tambm termina com ponto e vrgula. Vamos analisar o exemplo 4.1, que apresenta o uso do scanf.
Exemplo 4.1: Comando de Entrada - scanf 1 2 3 4 5 6 int idade; float salario; char letra, nome[20]; scanf(%d, &idade); scanf(%f, &salario); scanf(%c, &letra);

Nas linhas 1 a 3, temos as declaraes das nossas variveis. No scanf da linha 4, temos a leitura da varivel idade. Como esta varivel do tipo int, a string de controle %d. Na linha 5, temos a leitura da varivel salrio, que do tipo float. Assim, a string de controle %f. Por fim, na linha 6, temos a leitura da varivel letra, que do tipo char, contendo apenas um caractere. Por conta disso, a string de controle foi %c. A string de controle vem sempre entre aspas duplas, certo? Note que tambm foi declarada uma varivel chamada nome, que uma cadeia de 20 caracteres. No entanto, o comando scanf no funciona corretamente nas leituras de cadeias de caractere. Portanto, quando for necessrio fazer a leitura de variveis deste tipo, teremos que usar um outro comando, que ser visto na prxima seo. 4.1.1. Entrada de Cadeia de Caracteres Como mencionado, o comando scanf no funciona de maneira correta ao ler uma cadeia de caracteres. O problema que, se nesta cadeia de caractere tiver um espao em branco, separando uma palavra da outra, ao encontrar o espao em branco, o processador entende que a leitura terminou, desprezando parte do nosso dado. Ento j viu, no d para ficar com o dado pela metade, no mesmo? A soluo usar outro comando de leitura, especfico para a leitura de cadeias de caracteres. Este comando o gets. A sintaxe do gets a seguinte: 56

Programao 2

Sintaxe fflush(stdin); gets(varivel);

Para a execuo de um gets, precisamos informar apenas a varivel que ir receber o valor lido. Note tambm que antes do gets, temos o comando fflush. assim mesmo. Sempre que tivermos um gets, antes temos que executar um fflush. No esquea disso, certo? O comando fflush um comando que limpa o buffer de entrada de dados (stdin). Esto querendo saber o que o buffer de entrada? O buffer um espao de memria que armazena, temporariamente, os nossos dados. assim, suponha que o programa est solicitando que seja digitado o nome do usurio. O usurio vai teclando cada letra que forma seu nome. Ao terminar de digitar, ele tecla enter. O enter indica ao processador, que o usurio encerrou aquela entrada de dados. Enquanto no for teclado o enter, o processador vai armazenado cada tecla que est sendo pressionada, no buffer de entrada. Aps o enter ser pressionado, o processador pega o nome completo do usurio, que est no buffer de entrada, e transfere para a varivel. Pode parecer complexo, mas no . A questo que, enquanto no terminamos de digitar o dado, ele est sendo formado. S depois de finalizada a entrada, que ele pode ser transferido para a varivel. A Figura 4.2 ilustra o esquema da entrada de dados.

4.2: Esquema da entrada de dados

A execuo do fflush nos assegura que o buffer de entrada est limpo, sem o contedo de algum dado que foi teclado anteriormente. 57

Programao 2

No caso de entradas de dados usando o scanf, no necessrio limpar o buffer de entrada.

Ateno O gets e o fflush so comandos que se encontram em uma biblioteca chamada stdio.h. Portanto, se voc for utilizar estes comandos, esta biblioteca dever ser includa na seo de incluso de bibliotecas do programa. A incluso feita com a diretiva de compilao #include e fica assim: #include <stdio.h>.

Vamos agora analisar o exemplo 4.2, que apresenta o uso do comando gets.
Exemplo 4.2: Comando de Entrada - fgets 1 2 3 4 5 char nome_aluno[20], endereco[50]; fflush(stdin); gets(nome_aluno); fflush(stdin); gets(endereco);

Na linha 1, temos as declaraes das variveis nome_aluno e endereco. A varivel nome_aluno armazena at 20 caracteres e a varivel endereco armazena at 50 caracteres. Antes de executar o gets da linha 3, responsvel por ler o nome_aluno, temos, na linha 2, o fflush, responsvel por limpar o buffer de entrada. Na sequncia, temos a leitura da varivel endereco. Assim, necessria a execuo de um novo fflush antes do gets da linha 5. Notem que na leitura de uma varivel cadeia de caractere, s usamos o nome dela, desprezamos o colchetes e o nmero que indica quantos caracteres ela armazena. Agora que sabemos como fazer a entrada de dados via teclado, vamos aprender a apresentar os dados na tela. S falta este comando para darmos incio a criao dos nossos programas. Estamos bem perto! Vamos em frente!

58

Programao 2

4.2. Sada de Dados


O comando de sada de dados utilizado quando desejamos ver o resultado do processamento do nosso programa. Este comando tambm utilizado para passar mensagens na tela, solicitando que o usurio faa algo, como por exemplo, digitar a idade dele. Os dispositivos de sadas de dados mais comuns so: monitor, impressora e caixas de som. A figura 4.3 apresenta tais dispositivos.

Figura 4.3: Dispositivos de sada de dados

Vamos agora aprender o comando que fornece a sada de dados para o dispositivo de sada padro que a tela do computador. Este comando o printf. Fazendo um paralelo com o Portugol, o printf o comando escreva. Vamos ver a sua sintaxe.
Sintaxe printf(string de controle); printf(string de controle, lista de argumentos);

Existem duas sintaxes para o printf. Na primeira, s temos a string de controle, entre as aspas dupla. Usamos esta sintaxe quando queremos escrever apenas texto na tela. Na segunda, alm da string de controle, temos a lista de argumentos. Esta sintaxe aplicada quando iremos escrever texto e valores armazenados nas variveis. Apesar de aparecer aqui uma string de controle, ela no similar a do scanf, certo? No printf, a string de controle uma mscara que especifica (formata) o que ser impresso e de que maneira ser impresso. Na string de controle pode conter: texto, cdigos especiais e especificadores de formatos. Calma! Vamos detalhar mais. Primeiramente, vamos ver quais so os cdigos especiais que podem aparecer na string de controle do printf. Os cdigos especiais so formados por uma barra invertida (\), seguida de uma letra. O cdigo especial, indica uma ao que deve ser executada pelo printf. 59

Programao 2

A tabela a seguir apresenta os cdigos especiais e o seu significado.


Cdigo Especial \n \t \ \\ \a Ao Muda o cursor para o incio da linha seguinte. tabulao (tab) Escreve uma aspas dupla na tela Escreve uma barra invertida na tela D um alerta sonoro

Vamos analisar exemplos bem simples de printf, que escrevem, apenas um texto na tela.
Exemplo 4.3: Comando de Sada printf Escrevendo textos apenas

1 2 3 4

printf(Ola Mundo!); printf(\nBom Dia...); printf(\n\nIsso eh um teste.\a); printf(\n\nAte \nmais... \ntchau);

A execuo desta sequncia de printf do exemplo 4.3, resulta na seguinte tela (Figura 4.4).

Saiba Mais
A tela tem as seguintes dimenses: 80 colunas x 25 linha. Assim, conseguimos escrever em uma linha de tela, 80 caracteres. E conseguimos ter uma tela com at 25 linhas.
22

Figura 4.4: Tela de execuo de um programa: uso do printf

Vamos entender cada printf do exemplo 4.3. Um detalhe essencial que devemos saber: o printf escreve um texto na tela, no ponto em que o cursor se encontra no momento. Quando um programa executado, o cursor se encontra na primeira coluna, da primeira linha da tela22. No primeiro printf do exemplo, a string de controle tem apenas o texto que 60

Programao 2

queremos colocar na tela: Ola Mundo!23. Aps terminar este printf, o cursor estar posicionado aps a exclamao. Na sequncia, na linha 2, temos um printf cuja string de controle : \nBom Dia.... O \n serviu para fazer com que o cursor mudasse para o incio da linha seguinte e logo em seguida, o texto Bom dia.. foi impresso, e o cursor ficou no final desta linha. No printf da linha 3, temos a string de controle: \n\nIsso eh um teste.\a. A string de controle comea com dois \n. Isso faz com que o cursor mude de linha duas vezes. Assim, teremos uma linha em branco na tela. Alm disso, na string de controle, tambm temos um \a, que faz com que seja disparado um beep(sinal sonoro) quando este printf for executado. interessante usar o sinal sonoro quando quisermos chamar a ateno do usurio. Finalmente, na linha 4, temos o printf com a string de controle: \n\nAte \nmais... \ntchau. Como a string de controle comea com dois \n, o cursor muda de linha duas vezes, e escreve Ate. Na sequncia, temos outro /n, o que fez o cursor mudar novamente de linha e escrever mais.... Por fim, temos outro \n, o cursor vai mudar de linha e escreve tchau. Notem que um nico printf, pode resultar em um texto em vrias linhas da tela. Isso no possvel no Portugol. Vamos ver agora, como escrevemos textos e valores, armazenados nas nossas variveis, na tela do computador. Para isto, temos que saber mais um detalhe que vai aparecer na string de controle, que so os especificadores de formato. Um especificador de formato marca o lugar e o formato de impresso das variveis, contidas na lista argumentos (vejam a segunda sintaxe do printf). Deve haver um especificador de formato para cada varivel a ser impressa. Todos os especificadores de formato comeam com um %. Os especificadores de formato so apresentados na tabela a seguir.
Especificador de Formato %d %f %c %s %% Uso Escrever um valor do tipo inteiro Escrever um valor do tipo real Escrever um caractere Escrever uma cadeia de caracteres Escrever o caractere %
23

Saiba Mais
Ateno: No use acentos nos textos que sero escritos na tela. No volume 4, aprenderemos como acentuar nossos textos.

61

Programao 2

Neste caso de impresso na tela, quando temos textos e valores, na string de controle, devemos colocar um especificador de formato, no ponto onde queremos que um valor seja impresso. O especificador deve ser relativo ao tipo de dado que ser impresso. Aps a string de controle, coloca-se uma vrgula, e na sequncia vem a lista de variveis que ser impressa. Assim, ns primeiro montamos a frase (string de controle), informando em que ponto entraro os valores (usando os especificadores de formato) e depois, informamos quais variveis sero utilizadas. Vamos ver alguns exemplos.
Exemplo 4.4: Comando de Sada printf Escrevendo textos e valores

1 2 3 4 5 6 7 8 9 10

int X, Y, mat, idade; float A; X = 1; Y = 3; A = 7.5; mat = 123; idade = 25; printf(O valor de A = %f, A); printf(\n\nO aluno de matricula %d tem %d anos, mat, idade); printf(\n\nResultado da soma: %d, X+Y);

A sequncia do exemplo 4.4 iniciada com a declarao das variveis e com a atribuio de valores, para que possamos entender melhor a montagem dos printf. No primeiro printf, da linha 8, queremos que seja apresentado o valor da varivel float A. Assim, montamos a string de controle, informando o ponto da frase onde deve ser colocado o valor da varivel A, utilizando o especificador de formato de valores reais, o %f. Veja na Figura 4.5, a tela resultante da execuo desta sequncia de comandos.

62

Programao 2

Figura 4.5: Tela de execuo de um programa usando printf com textos e valores

Quando pedimos para que um nmero real seja apresentado na tela, este mostrado com uma preciso de seis casa decimais. Por isso, o valor da varivel A, aparece como 7.500000. Podemos decidir quantas casas decimais devem ser apresentadas, nem sempre queremos trabalhar com tantas casas decimais, bem como, poderemos precisar trabalhar com um nmero com mais casas decimais. Aprenderemos daqui a pouco como informar quantas casas decimais devem ser apresentadas, quando um nmero real for impresso na tela. Por enquanto, vamos continuar a anlise do exemplo 4.4, certo? No segundo printf, na linha 9, queremos que seja apresentado o nmero de matrcula do aluno e a sua idade. Aqui temos um printf que ir apresentar mais de um valor. O raciocnio o mesmo. Montamos a string de controle, informando onde vai aparecer o valor das variveis, utilizando o especificador de formato. O que muda depois da string de controle. Aps a vrgula, devemos colocar as variveis que sero impressas, na ordem que elas devem aparecer na frase. Ou seja, se na ordem da frase, vem primeiro a matrcula do aluno, ento, colocase primeiro a varivel mat. Quando temos mais de uma varivel, elas so separadas por vrgula. Notem que continuamos usando os cdigos especiais na string de controle, neste caso foi colocado o /n, para mudar o cursor de linha. Na linha 10, temos um printf que ir apresentar o resultado de um expresso matemtica. Isto tambm possvel. Assim, na parte do printf que indicamos a varivel que ser impressa, ns colocamos a expresso matemtica. A expresso resolvida e o seu resultado apresentado na tela. Vamos ver agora como fazer para que nossos nmeros reais sejam apresentados com a quantidade de casa decimais que quisermos. O que vai mudar o especificador de formato dos nmeros reais, o %f. Agora ele deve ser assim: entre o % e o f, colocaremos um ponto, seguido de um nmero, que representa quantas casas decimais ns 63

Programao 2

queremos que sejam apresentadas. Vejam os printf do exemplo 4.5.


Exemplo 4.5: Comando de Sada printf formatando nmeros reais

1 2 3 4 5 6 7

float A, B,C; A = 3.4; B = 1.12345; C = 7.56789; printf(A = %.1f, A); printf(\n\nB = %.2f, B); printf(\n\nC = %.2f, C);

Primeiro, temos as declaraes e atribuies para trs variveis reais. Na linha 5, temos o printf que imprime o valor da varivel A, vejam como ficou o especificador de formato: %.1f. Neste caso, queremos que seja apresentada apenas uma casa decimal deste nmero. Vejam a Figura 4.6, que apresenta a tela resultante da execuo desta sequncia de comandos.

Figura 4.6: Tela de execuo de programa: formatao de nmeros reais

Nas linhas 6 e 7, temos os printf que imprimem os valores das variveis B e C. Neste caso, queremos que sejam apresentadas duas casas decimais, por isso, o especificador de formato ficou: %.2f. S vamos ver mais um detalhe. Notem que, quando pedimos para que um nmero seja apresentado com poucas casas decimais, o printf apresenta um valor arredondado. Como assim? Veja o valor que foi atribudo a varivel C, na linha 4 do exemplo: 7.56789. Veja agora o valor que foi apresentado na tela de execuo do programa: 64

Programao 2

7.57. Funciona assim: se queremos que sejam apresentadas apenas duas decimais, o printf vai verificar qual valor tem na terceira casa decimal, se tiver um valor maior ou igual a cinco, ele arredonda o valor apresentado. Se for um nmero menor que 5, ele no arredonda. Observe o valor da varivel B. Terminamos aqui os comandos de entrada e sada. Como estes comandos tem muitos detalhes, ficamos sujeitos a cometer vrios erros quando os utilizamos: esquecer uma vrgula, uma aspa, dentre outros. Na prxima seo, iremos ver uma lista dos erros mais comuns que ocorrem com o uso destes comandos. Com esta lista, poderemos encontrar os erros dos nossos programas mais rapidamente, certo?

4.3. Erros Frequentes no Uso dos Comandos de Entrada e Sada


Nesta seo, ser apresentada uma lista com os erros que so mais frequentemente cometidos por quem est iniciando a programar, e que precisa ficar atento a tantos detalhes da sintaxe dos comandos. Vamos ver, na tabela abaixo, os erros que podemos cometer no uso do scanf, gets e printf.
Comando Scanf Erros Esquecer o & antes do nome da varivel. Trocar a string de controle. Por exemplo, no lugar de um %d, usar um %f. Esquecer o ; no final do comando. Esquecer as aspas da string de controle. Esquecer a vrgula entre a string de controle e a varivel. Fazer a leitura de uma varivel que no foi declarada. Consequncia O programa compila, como se no tivesse erro, mas durante a execuo ele trava. O programa compila, mas a varivel receber um valor esquisito (normalmente, um valor bem grande) O compilador avisa que tem erro. O compilador avisa que tem erro. O compilador avisa que tem erro.

O compilador avisa que tem erro.

65

Programao 2

Gets

Esquecer de colocar o comando fflush antes do gets.

O programa compila, como se no tivesse erro, mas durante a execuo, o processador pula a execuo do comando gets. O compilador avisa que tem erro. O compilador avisa que tem erro. O compilador avisa que tem erro.

Esquecer de incluir a biblioteca stdio.h. printf No fechar a string de controle. Esquecer a vrgula entre as variveis que sero impressas. Usar um especificador de formato incompatvel com o valor que ser impresso. Esquecer de colocar um especificador de formato.

O programa compila, mas ser impresso um valor esquisito.

O programa compila, mas no imprime o valor da varivel.

Notem na coluna consequncia, que mesmo que sejam cometidos alguns tipos de erros, o programa vai compilar e s durante a execuo que notaremos algo estranho. Ateno: podem ocorrer outros erros que no foram mencionados nesta lista, estes so apenas os mais comuns. Pronto, enfim poderemos comear a fazer os nossos primeiros programas! J sabemos, declarar variveis, atribuir valores a elas, ler valores via teclado e apresentar resultados na tela. Com esses comandos, j podemos fazer uns programas simples em C. Para comear, vocs j tem devem ter instalado o Dev-cpp nos seus computadores. Na prxima seo, veremos dois programas completos comentados. Agora de verdade, vamos programar!

4.4. Primeiros programas em C


isso, vamos comear com o nosso primeiro programa em C. Ele ser simples, mas com o tempo iremos aumentado o nvel de complexidade dos nossos programas. Antes de tudo, vamos a alguns detalhes (Mais detalhes?). Primeiro, vocs devem executar o Devcpp e escolher a opo: Arquivo/Novo/Arquivo Fonte. NO devemos trabalhar com projetos, certo? Em seguida, comecem a digitar o programa.

66

Programao 2

Ateno Por padro, o Dev-cpp salva os nossos programas no formato do c++ (ou seja, .cpp). Sempre que forem salvar os programas, lembrem de informar que vocs querem que este seja salvo no formato .c. Fiquem atentos a isso! A Figura 4.7 mostra a tela de como devemos salvar nossos programas. No momento que solicitamos que o programa seja salvo, aberta uma janela para escolha do diretrio que o programa ser salvo, o nome dele e podemos tambm escolher o formato, na opo: Save as Type. Nesta opo, voc deve escolher: C source files (*.c). S isso. Se voc salvar seu programa como .cpp, ele ficar dando erros.

Figura 4.7: Tela do Dev-cpp: salvando um programa c.

O nosso primeiro programa em C ir ler dois nmeros inteiros e apresenta a soma destes dois nmeros. Segue abaixo o programa completo. Em seguida, vamos comentar cada linha.

67

Programao 2

Programa Completo 4.1: Ler dois nmeros inteiros e calcula a soma

1 2 3 4 5 6 7 8 9 10 11 12 13

//Ler dois numeros e calcula a soma main() { int n1, n2, soma; printf(Calcular a soma de dois numeros\ n\n); printf(Primeiro valor: ); scanf(%d, &n1); printf(Segundo valor: ); scanf(%d, &n2); soma = n1 + n2; printf(\n\nA soma dos dois numeros = %d\n\ n,soma); system(pause); }
Comentrios sobre cada linha do Programa completo 4.1

Saiba Mais
Ao ler um enunciado de uma questo procure identificar as variveis de entrada, ou seja, quais valores sero fornecidos pelo usurio e qual resultado o programa precisa processar. E assim, faa a declarao das suas variveis.
24

Linha 1: De acordo com a estrutura de um programa C, este inicia com incluso das bibliotecas, quando necessrio. Neste exemplo, no utilizamos nenhum comando que se fez necessria a incluso de biblioteca. Assim, na linha 1 temos um comentrio, indicando o que o programa faz. Sempre coloquem esse tipo de comentrio no programa. Assim, ele ficar bem documentado. Linha 2: incio do programa principal, que definido pelo: main(). Linha 3: temos um abre chaves, que ir delimitar o corpo do programa principal. Linha 4: temos as declaraes das trs variveis do programa24: 68

Programao 2

n1 e n2 (para armazenar os nmeros que sero fornecidos pelo usurio) e soma (que armazena a soma dos dois nmeros). Linha 5: um printf que serve para colocar, no incio da tela, o ttulo do que o programa faz. Isso importante para que o usurio saiba para que serve o programa. Linha 625: colocamos este printf para que o usurio saiba que precisa fornecer o primeiro valor. Linha 7: scanf que l o primeiro valor e armazena na varivel n1. Linha 8: printf para que o usurio saiba que precisa fornecer o segundo valor. Linha 9: scanf que l o segundo valor e armazena na varivel n2. Linha 10: agora que j temos os dois valores armazenados nas variveis n1 e n2, podemos executar a soma. Nesta linha, temos o comando que atribui a soma das variveis n1 e n2 para a varivel soma. Linha 11: printf que apresenta o resultado, que est armazenado na varivel soma. Linha 12: nesta linha, temos um comando novo. o seguinte, assim que terminada a execuo do nosso programa, o processador fecha, automaticamente, a janela onde o programa estava sendo executado. Por conta disso, acabamos sem ver algum resultado que tenha sido impresso na tela. Para fazer com que a janela no feche ao trmino da execuo, foi colocado o comando system(pause). Este comando d uma pausa na execuo do programa e fica aguardando que o usurio pressione alguma tecla26. Com esta pausa, poderemos ver os resultados apresentados. Assim que pressionamos algo no teclado, a janela ir fechar. Portanto, no final dos nossos programas, teremos que colocar o system(pause), certo? Um outro comando que faz a mesma coisa o getche(), no prximo exemplo, usaremos o getche(), para que vocs possam conhec-lo. Linha 13: fecha chaves, indicando o final do programa principal. 69
25

Saiba Mais
Importante: sempre que temos que fazer uma leitura de dados (com scanf ou gets), devemos colocar uma mensagem para que o usurio saiba o que ele deve digitar. Assim, todo scanf (ou gets), deve ter um printf antes, informado o que o usurio tem que fazer. O programa precisa se comunicar com um usurio.

Saiba Mais
O comando system(pause) escreve na tela de execuo do programa a seguinte mensagem: Press any key to continue... ou Pressione qualquer tecla para continuar...
26

Programao 2

Vocs devem digitar, compilar e executar este programa utilizando o Dev-cpp. Comecem a se familiarizar com a sintaxe do C. Tambm procurem se familiarizar com o ambiente de programao. Em breve, vocs no estaro mais tendo que consultar as sintaxes dos comandos com tanta frequncia. Vamos logo fazer outro programa! Nosso segundo programa ir ler o nome do usurio e o ano em que ele nasceu e como resultado imprime uma mensagem dizendo quanto anos o usurio tem.
Programa Completo 4.2: Ler o nome e a idade do usurio e informar a sua idade.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

#include <stdio.h> //Ler o nome e a idade do usurio e informar a sua idade. main() { char nome[20]; int ano, idade; printf(Calcular a idade o usuario\n\n); printf(Seu nome: ); fflush(stdin); gets(nome); printf(Ano que voce nasceu: ); scanf(%d, &ano); idade = 2009 - ano; printf(\n\n%s, voce esta com %d anos., nome, idade); getche(); }

70

Programao 2

Programa Completo 4.2: Ler o nome e a idade do usurio e informar a sua idade. Vamos ver o que est sendo feito em cada linha do programa completo 4.2. Linha 1: Neste programa ns teremos que ler uma varivel que uma cadeia de caractere: o nome do usurio. Assim, precisaremos usar o gets e o fflush. Estes comandos ficam na biblioteca stdio.h. Na linha 1, temos a incluso desta biblioteca. Linha 2: Comentrio indicando o que o programa faz. Linha 3: incio do programa principal, que definido pelo: main(). Linha 4: temos um abre chaves, que ir delimitar o corpo do programa principal. Linha 5: declarao da varivel do tipo char, que armazena o nome do usurio. Linha 6: declarao das variveis inteiras: ano (que armazena o ano de nascimento do usurio) e idade (que armazenar a idade do usurio, que ser calculada pelo programa). Linha 7: printf que indica o que o programa faz, no incio da tela de execuo. Linha 827: printf que solicita que seja digitado o nome do usurio. Linha 9: temos o comando fflush, que DEVE sempre vir antes do comando gets. Linha 10: gets que efetuar a leitura do nome do usurio. Linha 11: printf para que o usurio saiba que precisa fornecer o ano de nascimento. Linha 12: scanf que l o ano de nascimento do usurio. Linha 13: atribuio que descobre quantos anos o usurios tem. Para isso, subtramos o ano atual (2009), do ano que o usurio nasceu. O resultado atribudo para a varivel idade. Linha 14: printf que apresenta o resultado. Notem que o nome do usurio vai aparecer na frase. A string de controle comea no dois \n, solicitando que o cursor mude de linha e logo temos 71
27

Saiba Mais
Importante: sempre que temos que fazer uma leitura de dados (com scanf ou gets), devemos colocar uma mensagem para que o usurio saiba o que ele deve digitar. Assim, todo scanf (ou gets), deve ter um printf antes, informado o que o usurio tem que fazer. O programa precisa se comunicar com um usurio.

Programao 2

um %s, isto porque queremos que a resposta seja iniciada com o nome do usurio. Um exemplo de frase de resposta : Carolina, voc esta com 10 anos. Linha 15: temos o comando getche(), similar ao system(pause), faz com que a tela de execuo no feche ao final do programa. A vantagem do getche() que ele no escreve nada na tela. Lembram que o system(pause) coloca uma frase na tela? Linha 16: fecha chaves, indicando o final do programa principal. A seguir, temos as telas de execuo dos programas completos 4.1 e 4.2.
Tela de execuo do Programa completo 4.1 Tela de execuo do Programa completo 4.2

Figura 4.8: Telas de execuo dos programas completos 4.1 e 4.2

Com esses dois programa completamente comentados, j d para vocs comearem a treinar sozinhos. No queiram acertar tudo de primeira, vo com calma e sejam persistentes. Vejam que a sintaxe da linguagem C cheia de detalhes que precisamos ter muita ateno. Na prxima seo, vocs encontraro sugestes de exerccios.

Atividades e Orientaes de Estudo Como vocs j devem ter notado, uma linguagem de programao envolve muitos detalhes. Vocs s iro aprender realmente, se fizerem muitos exerccios. a prtica que far com que esta gama de detalhes seja assimilada. Portanto, aqui vai mais uma lista de exerccios. Esta para ser resolvida no computador, certo? Podem comear a ligar seus computadores!

72

Programao 2

1. Faa um programa que leia dois nmeros reais A e B e os imprima na tela. O valor da varivel A deve ser apresentado com duas casa decimais e o valor da varivel B com trs casas decimais. 2. Faa um programa que leia o nome do usurio e escreva uma frase de saudao, desejando um bom dia de trabalho para o mesmo. A resposta deve ter o formato deste exemplo: Ola Joao, tenha um otimo dia de trabalho!. Faca o programa soar um sinal sonoro(beep) ao escrever esta frase. 4. Faa um programa que leia dois nmeros inteiros A e B e imprima o resultado da subtrao de A por B. A resposta deve ter o seguinte formato: 6 2 = 4. 3. Faca um programa que leia o nome do usurio e a sua idade e imprima quantos anos ele ter em 2020. A resposta deve ter o formato deste exemplo: Carlos, em 2020 voce estara com 45 anos. 5. Faa um programa que leia o nome do usurio, a idade do usurio, o nome da me do usurio e a idade da me do usurio. O programa devera imprimir na tela quantos anos a me do usurio tinha quando ele nasceu. A resposta deve ter o formato deste exemplo: Carlos, quando voce nasceu, Dona Cecilia tinha 27 anos.

Conhea Mais Aumente os seus conhecimentos sobre comandos de entrada e sada de dados acessando site especializados na linguagem C. Muitos professores e instituies disponibilizam materiais na rede e o principal, vocs podem encontrar muitos enunciados de exerccios. Vocs j se inscreveram em um frum de discusso da linguagem de programao C? Nessa fase em que estamos iniciando a programar, ter auxlio de programadores experientes muito importante. No deixem de se inscrever, certo?

73

Programao 2

Vamos revisar? Para dar uma revisada nos tpicos tratados neste captulo, observem o resumo a seguir: Dispositivos de entrada: so utilizados para passar informaes para o computador. So exemplos de tais dispositivos: teclado e mouse. Dispositivos de sada: so utilizados para apresentar informaes processadas pelo computador. scanf: um dos comandos de leitura do C. Esta comando no adequado para a leitura de cadeia de caracteres. gets: comando especfico para a leitura de cadeia de caracteres. Para utiliz-lo, necessrio incluir no programa a biblioteca stdio.h. fflush: comando que faz a limpeza do buffer de entrada de dados. Sempre que fizermos uma leitura de cadeia de caracteres, devemos colocar o comando fflush. printf: comando de sada de dados. O printf pode ser usado para imprimir textos, valores de variveis e resultados de expresses aritmticas. getche() e system(pause): comandos para provocar uma parada na tela de execuo, fazendo com que o usurio possa conferir o resultado processado pelo programa.

74

Programao 2

Captulo 5 Operadores, Expresses e Funes Matemticas


Vamos conversar sobre o assunto? Gostaram de ter feito os primeiros programas em C? Foram programas simples, que utilizavam o assunto visto at o momento. Vamos continuar avanando no estudo da linguagem C e aumentando, gradativamente, o nvel de complexidade dos nossos programas. Neste captulo, iremos aprender quais operadores esto disponveis na linguagem C e como utiliz-los, atravs da montagem de expresses aritmticas, relacionais e lgicas. Tambm iremos abordar as principais funes da biblioteca matemtica. Com o assunto deste captulo, teremos habilidades para resolver questes que requerem a construo de expresses, seja aritmtica, relacional ou lgica. Vamos em frente!

5.1. Operadores Bsicos


Em toda linguagem de programao, existem operadores que nos permitem armazenar, modificar, comparar e avaliar dados no computador. Aqui veremos trs tipos de operadores: aritmticos, relacionais e lgicos. Nas prximas sees, ser feito o detalhamento de cada um dos tipos de operadores. 5.1.1 Operadores Aritmticos Usamos os operadores aritmticos quando precisamos executar operaes aritmticas (matemticas) sobre os nossos dados (variveis). A tabela abaixo apresenta os operadores aritmticos do C. Notem que o operador da multiplicao um asterisco.
Operador + * Descrio Adio Subtrao Multiplicao

75

Programao 2

/ % ()

Diviso Retorna o resto da diviso inteira de a por b Parnteses

Vamos dar uma ateno especial aos operadores da diviso(/) e resto(%). O resultado de uma diviso, em C, depende dos tipos dos dados que esto sendo divididos. A tabela abaixo apresenta o resultado da operao de diviso, de acordo com os tipos de dados do numerador e do denominador.
numerador / denominador inteiro / inteiro inteiro/ real real / inteiro real/real resultado inteiro real real real

Quando dois nmeros inteiros so divididos, o resultado a parte inteira do quociente da diviso. Quando pelo menos um dos elementos (numerador e/ou denominador) real, o resultado um nmero real. Vamos analisar a sequncia de comandos a seguir:
Exemplo 5.1: Uso de Operadores Aritmticos

1 2 3 4 5 6 7 8 9

int X, Y, Z, W; float K, L, M; X = 19; Y = 3; Z = X/Y; W = X % Y; K = 19; L = 3; M = K/L;

76

Programao 2

Nas linhas 1 e 2, temos as declaraes das variveis: quatro inteiras (X, Y, Z e W) e trs reais (K, L, e M). Nas linhas 3 e 4 so atribudos valores nas variveis X e Y, que passam a armazenar tais valores. Na linha 5, temos um comando de atribuio, em que a varivel Z receber o resultado da diviso entre a varivel X (19) e a varivel Y (3). Como as variveis X e Y so inteiras, o resultado ser a parte inteira do quociente da diviso. Assim, se temos: 19/3 = 6.333333, ser considerado apenas a parte inteira do resultado, ou seja, 6. Portanto, nesta atribuio da linha 5, a varivel Z vai receber 6. Na linha 6, a varivel W vai receber o resto da diviso de X por Y, ou seja, o resto da diviso de 19 por 3. A figura 5.1 ilustra como a operao do resto feita.

Figura 5.1: Resto de uma diviso

A operao do resto funciona da seguinte forma: os dois nmeros vo sendo divididos, neste caso: 19 dividido por 3 (primeiro quadro da figura 5.1). Assim, 19 por 3 d 6 e sobra 1. Como o 1 no d pra ser dividido por 3, a conta para e pega o resto da diviso que 1. Portanto, o resultado da operao X%Y (neste caso, 19%3) 1. Este resultado ser atribudo a varivel W.

Ateno O operador do resto (%) s pode ser usado quando as variveis envolvidas so do tipo inteiro. No poderemos usar tal operador para obter resto de diviso de nmeros reais. Outra coisa: o operador % no tem nada haver com percentagem, certo? Nas linhas 7 e 8 so atribudos valores nas variveis K e L, que passam a armazenar tais valores. Na linha 9, temos um comando 77

Programao 2

de atribuio, em que a varivel M receber o resultado da diviso entre a varivel K (19) e a varivel L (3). As variveis K e L so reais (float). Dessa forma, teremos 19/3 = 6.333333. O resultado completo ser atribudo a varivel M, ou seja 6.33333, sem desprezar a parte fracionria do resultado. A figura 5.2 apresenta o valor que ficou armazenado em cada uma das variveis, aps a execuo da sequncia de comandos. Note que, nas variveis reais, mesmo que seja atribudo um valor inteiro, como por exemplo, na linha 7, que foi atribudo 19 varivel K, no momento que o valor armazenado, ele passa a ter a parte fracionria do nmero. Por isso, a varivel K aparece com 19.000000 de contedo (lembrem-se que o ponto deste nmero, est representando uma virgula, certo?).

Figura 5.2: Resultado final das variveis

5.1.1.1 Prioridade dos Operadores Uma questo que devemos tomar bastante cuidado ao montar uma expresso aritmtica a prioridade dos operadores. A prioridade que o operador aritmtico tem sob o outro que vai determinar como a expresso ser resolvida. Na matemtica, quando montamos uma expresso, usamos parnteses, colchetes e chaves. Nas linguagens de programao, ns s temos os parnteses. Os parnteses tm um papel importante nas expresses e possibilitam que a ordem das operaes seja alterada. Expresses entre parnteses so calculadas primeiro, portanto eles fornecem o maior grau de prioridade s expresses que envolvem. Podemos ter pares de parnteses envolvendo outros pares. Dizemos que os parnteses esto aninhados. Neste caso, as expresses dentro dos parnteses mais internos so avaliadas primeiro. 78

Programao 2

A tabela abaixo apresenta a prioridade de resoluo dos operadores aritmticos:


Prioridade 1 2 3 Operador Operaes embutidas em parnteses mais internos % (resto) e/ou * (multiplicao) e/ou / (diviso) + (adio) e/ou (subtrao)

De acordo com a tabela, as expresses entre parnteses tem maior prioridade, portanto, so resolvidas primeiro. Na sequncia, resolve os operadores resto e/ou multiplicao e/ou diviso, e, finalmente, resolve os operadores de adio e/ou subtrao. Quando aparecem operadores de mesma prioridade em uma expresso, o operador mais esquerda ser avaliado primeiro. Vamos analisar o exemplo 5.2, a seguir, e verificar qual o valor final das variveis A, B, C e D.
Exemplo 5.2: Prioridade de Operadores

1 2 3 4 5 6 7 8 9

int X, Y, Z, W, A, B, C, D; X = 19; Y = 3; Z = 4; W = 2; A = X + Y * Z; B = (X + Y) * Z; C = X Y * Z / W; D = (X-Y) * (Z/W);

Na linha 1, temos as declaraes das variveis que sero usadas (todas elas so do tipo int). Nas linhas 2 a 5, so atribudos valores s variveis X, Y, Z e W. Vamos acompanhar a resoluo de cada expresso das linhas 6 a 9 na figura 5.3. A parte da expresso que 79

Programao 2

aparece circulada, a que tem prioridade de resoluo.

Figura 5.3: Acompanhamento da resoluo das expresses aritmticas

No primeiro quadro (atribuio para a varivel A), aparecem na expresso os operadores da adio e multiplicao. Como a multiplicao tem prioridade, esta resolvida primeiro. Posteriormente, o operador da adio resolvido e assim o resultado que ser atribudo varivel A. No segundo quadro (atribuio para a varivel B), a expresso tambm composta por operadores de adio e multiplicao. No entanto, a adio aparece entre parnteses. Sabe-se que a operao dentro dos parnteses ter prioridade. Assim, a adio resolvida e, posteriormente, a multiplicao. No terceiro quadro (atribuio para a varivel C), aparecem na expresso os operadores de subtrao, multiplicao e diviso. O operador de subtrao o de menor prioridade. No entanto, os operadores de multiplicao e diviso tem a mesma prioridade. Dessa forma, o operador da multiplicao ser resolvido primeiro, j que ele aparece mais a esquerda da expresso. Na sequncia, a diviso resolvida. E, finalmente, a subtrao. Finalmente, no quarto quadro (atribuio para a varivel D), aparecem na expresso os operadores de subtrao, multiplicao, diviso e parnteses. Primeiro, resolvida a expresso dentro do parntese mais a esquerda. Posteriormente, a expresso entre parnteses mais a direita. Finalizando com a resoluo da multiplicao.

80

Programao 2

5.1.2 Operadores Relacionais Os operadores relacionais so utilizados para comparar valores de variveis ou expresses aritmticas. Uma expresso aritmtica tem como resultado um valor numrico. No caso de uma expresso relacional, o resultado ser sempre um valor lgico: Verdade ou Falso. Na tabela abaixo so apresentados os operadores relacionais do C.
Operador == != < > <= >= Descrio Igualdade Diferena ( ) Menor Maior Menor ou Igual ( ) Maior ou Igual ( )

Vamos aprender como montar uma expresso relacional. Segue abaixo as possveis sintaxes de expresses relacionais.
Sintaxe Variavel operador Valor Varivel1 operador varivel2 Variavel operador Expresso Aritmtica Expresso Aritmtica operador Expresso Aritmtica

Notem que podemos montar a expresso relacional de vrias formas. Na tabela abaixo so apresentados exemplos de expresses relacionais.
Exemplo 5.3: Expresses relacionais

1 2 3 4

X == 10 X > Y X < Y + Z X * Y > Z / W

81

Programao 2

Na linha 1, temos uma expresso relacional que verifica se a varivel X igual a 10 (ou ela ser igual a 10 ou no, resultando em verdade ou falso). Na linha 2, temos uma expresso relacional que compara duas variveis. Esta expresso verifica se o valor da varivel X maior que o valor da varivel Y. Na linha 3, a expresso relacional compara o valor da varivel X com o resultado da expresso aritmtica Y + Z. Por fim, na linha 4, temos uma expresso relacional que compara o resultado de duas expresses aritmticas. Suponha que X = 1, Y = 5, Z = 8 e W = 2. Vamos ver o resultado das expresses do exemplo 5.3 (V verdade e F falso):
Resultados das expresses relacionais do exemplo 5.3

1 2 3 4

X == 10 X > Y X < Y + Z X * Y > Z / W

=> 1 == 10 => 1 > 5 => 1 < 5 + 8 => 1 * 5 > 8 / 2

=> F => F => 1 < 13 => 5 > 4 => V => V

Quando as expresses relacionais so compostas por expresses aritmticas (como os exemplos das linhas 3 e 4), a prioridade de resoluo da expresso aritmtica. Assim, primeiro resolve-se a expresso aritmtica e a comparao feita com o resultado da mesma. 5.1.3 Operadores Lgicos Os operadores lgicos servem para interligar duas ou mais expresses relacionais. Uma expresso lgica representa a unio de expresses relacionais, permitindo que os resultados de vrias expresses relacionais sejam transformados em um nico resultado lgico (verdade ou falso). Os operadores lgicos so: E, OU e NO. A tabela a seguir apresenta como os operadores lgicos so representados na linguagem C.

82

Programao 2

Operador Lgico E OU NO

Operador Lgico em C && || !

Os resultados das expresses lgicas obedecem s tabelas que veremos a seguir, que dependem dos resultados das expresses relacionais envolvidas. Quando montamos uma expresso lgica, as expresses relacionais devem ser colocadas entre parnteses. Comearemos estudando a tabela de resultados do operador lgico E. Quando este operador interliga duas expresses relacionais, o resultado da expresso lgica s ser verdade se as duas expresses relacionais forem verdade. Em qualquer outra situao, o resultado ser falso.
Tabela de Resultado do Operador Lgico E (&&) Expresso Relacional 1 V V F F Expresso Relacional 2 V F V F Resultado V F F F

Vejamos um exemplo: um aluno s ser aprovado se a sua mdia for maior ou igual a 7. E, se a quantidade de faltas for menor que 15. As duas condies precisam ser verdade, para o aluno ser aprovado. Se o aluno tem a mdia maior que 7, mas tem mais de 15 faltas, ele no ser aprovado. A expresso lgica para testar esta situao apresentada na linha 1 do exemplo 5.4, a seguir.
Exemplo 5.4: Expresses Lgicas com operador e (&&)

1 2 3

(media >= 7.0) && (faltas < 15) (A < 5) && (B <> 5) (X > 10) && (Y > 50) && (Z < 25)

83

Programao 2

Quando temos mais de duas expresses relacionais, como o caso do exemplo da linha 3, a expresso lgica vai sendo resolvida da esquerda para a direita. Para acompanhar a resoluo das expresses do exemplo, vamos supor que: media = 8.0, faltas = 18, A=3, B=4, X = 15, Y= 70 e Z=30. Vejamos a figura 5.4 a seguir.

Figura 5.4: Resultado das expresses lgicas do operador &&

No primeiro quadro da figura, a primeira expresso relacional verdade e a segunda expresso falsa. De acordo com a tabela de resultados do operador lgico E, verdade && falso d falso. No segundo quadro, as duas expresses relacionais so verdade. Assim, de acordo com a tabela de resultados do operador lgico E, verdade && verdade d verdade. Finalmente, no terceiro quadro temos trs expresses relacionais. Neste caso, iremos resolver a expresso lgica, da esquerda para a direita. Comeamos encontrando o resultado da primeira expresso relacional, com a segunda (ou seja, (X>10) && (Y>50)). E depois, pegamos este resultado e continuamos resolvendo o restante da expresso, sempre da esquerda para a direita. Podemos interligar vria expresses relacionais, atravs dos operadores lgicos. Agora vamos analisar a tabela de resultados do operador lgico OU. Quando tivermos duas expresses relacionais interligadas pelo operador lgico ou, o resultado da expresso lgica s ser falso se as duas expresses relacionais forem falsas. Nos demais casos, o resultado da expresso ser verdade.
Tabela de Resultado do Operador Lgico OU (||) Expresso Relacional 1 V V F F Expresso Relacional 2 V F V F Resultado V V V F

84

Programao 2

Vejamos um exemplo: para o aluno ingressar em um curso superior - ele deve ser aprovado no vestibular OU ele deve ser um portador de diploma. Apenas uma situao precisa ser verdade. Assim, se o aluno nem passou no vestibular, nem portador de diploma, no poder ingressar no curso. A expresso lgica para testar esta situao apresentada na linha 1 do exemplo 5.5, a seguir. Vejam outros exemplos de expresses lgicas com o operador OU.
Exemplo 5.5: Expresses Lgicas com operador ou (||)

(Aprovado_Vestibular == S) || (Portador_Diploma == S)

2 3

(A < 3) || (B < 2) (X < 12) || (Y > 1) || (Z < 35)

A tabela de resultados do operador lgico NO apresentada a seguir. Notem que a finalidade deste operador inverter(ou negar, como comumente chamado) o resultado de uma expresso relacional. Assim, se a expresso relacional verdade, a sua negativa falso.
Tabela de Resultado do Operador Lgico No (!) Expresso Relacional V F Resultado F V

No exemplo 5.6, temos duas expresses lgicas com o operador NAO. Este operador deve ser colocado na frente da expresso relacional.
Exemplo 5.6: Expresses Lgicas com operador no (!)

1 2

!(X < 12) !(Y == 10)

A figura 5.5, ilustra uma situao cotidiana, do uso de operadores lgicos.

85

Programao 2

Figura 5.5: Uso cotidiano de operadores lgicos

Ns tambm poderemos ter expresses lgicas, em que aparecem mais de um tipo de operadores lgicos, alm de operadores aritmticos. Vejamos o exemplo 5.7.
Exemplo 5.7: Expresses Lgicas com vrios operadores

1 2 3 4

(X > 10) && (Y < 30) || (Z == 1) (A == 2) || (B <> C) && (D < 1) || (E > 10) !(A == 1) || (B <= C + B)

(X + Y < Z + W) && (A < 3 + D) || (F < 5)

Nestes casos, vamos ver a tabela de prioridade de operadores, para a resoluo de tais expresses.
Prioridade 1 2 3 4 5 Operador Operaes embutidas em parnteses mais internos; Resto e/ou multiplicao e/ou diviso; Adio e/ou Subtrao; Operadores Relacionais; Operadores Lgicos.

Primeiro, resolveremos as expresses aritmticas (seguindo a prioridade dos operadores aritmticos), depois as expresses relacionais e, finalmente, as expresses lgicas. 86

Programao 2

5.2. Operadores Aritmticos de Atribuio


A linguagem C oferece um conjunto de operadores que uma combinao de operador de atribuio e operador aritmtico, so os operadores aritmticos de atribuio. Eles so utilizados para representar de maneira reduzida uma operao aritmtica, seguida de uma atribuio. A prxima tabela apresenta os operadores aritmticos de atribuio e como utiliz-los em nossos programas.
Operador += -= *= /= %= Exemplos de Uso X += 4; Y -= X; Z *= W; K /= 7; L %= M; Descrio Equivale a X = X + 4; Equivale a Y = Y X; Equivale a Z = Z * W; Equivale a K = K / 7; Equivale a L = L % M

Como pode ser visto, a sintaxe do operador aritmtico de atribuio : um operador aritmtico(+, -, *, /, %) seguido do operador da atribuio (=). Uma expresso com este tipo de operador, significa que a varivel do lado esquerdo da atribuio, alm de receber o resultado, tambm far parte da expresso aritmtica. Vejamos o exemplo dado para o operador +=. A expresso X += 4, quer dizer que: ser obtido o valor da varivel X, adiciona 4, e este resultado atribudo a prpria varivel X. Neste caso, como se fosse um acumulador: acumule 4 ao valor que j tem na varivel X.

5.3. Operadores ++ e -Os operadores ++ e -- so utilizados aps o nome de uma varivel e servem para incrementar (++) ou decrementar (--) uma unidade da varivel, ou seja, somar 1 ou subtrair 1 do valor da varivel. A tabela abaixo apresenta os operadores ++ e --, seguidos de exemplos de uso. Aps o ++ ou --, devemos colocar um ponto e vrgula.
Operador ++ -Exemplos de Uso X++; Y--; Descrio Equivale a X = X + 1; Equivale a Y = Y -- 1;

87

Programao 2

Saiba Mais
Os operadores ++, -- e operadores aritmticos de atribuio fazendo com que as nossas expresses fiquem menores, j que precisamos escrever menos coisas para a montagem da expresso.
28

No exemplo X++, significa que, se X=5, ser somado 1 ao valor da varivel X, e assim, X finalizar com 6. Da mesma forma, no exemplo Y--, significa que, se Y=5, ser subtrado 1 do valor da varivel Y, e assim, Y finalizar com 428.

5.4. Converso de tipo


Quando usamos operadores aritmticos, temos que lembrar que o resultado da expresso depende do tipo das variveis envolvidas. Por exemplo, quando dividimos dois nmeros inteiros, o resultado a parte inteira do quociente da diviso. Mas, quando dividimos nmeros reais, o resultado vem completo, a parte inteira e a parte fracionria do quociente. Outro detalhe que precisamos lembrar que alguns operadores s podem ser usados por um tipo de dado. Este o caso do operador do resto, ns s podemos utiliz-lo com dados do tipo inteiro. Por conta disso, algumas vezes desejamos, momentaneamente, modificar o tipo do contedo de uma varivel. Isto , queremos que uma varivel se comporte como se ela fosse de um tipo diferente do que ela foi declarada. Por exemplo: declaramos uma varivel como int e queremos, momentaneamente, que seu contedo seja utilizado como um float. Este procedimento chamado de converso de tipo ou casting (moldagem, em Ingls). A converso de tipo usada em uma expresso aritmtica e feita da seguinte forma: antes da varivel, colocamos entre parnteses, o tipo que queremos que a varivel seja nesta expresso aritmtica. importante salientar que a converso de tipo feita com o dado armazenado em uma varivel, mas a varivel continua tendo o seu tipo original. Vamos ver o exemplo 5.8, que apresenta uso de converso de tipo.

88

Programao 2

Exemplo 5.8: Converso de tipo

1 2 3 4 5 6 7

int A,B,C; float X,Y; A=3; B=5; X=6.5; C = (int)X % B; Y = (float)A/B;

Nas linhas 1 e 2, temos as declaraes de cinco variveis. Nas linhas 3, 4, e 5 foram atribudos valores as variveis A, B e X. Na linha 6, precisamos executar uma operao para obter o resto da diviso entre a varivel X (que do tipo float) e a varivel B (que do tipo int). Esta operao no seria possvel, j que o operador do resto no aceita nmeros reais na expresso. No entanto, esta operao se torna possvel, se fizermos a converso de tipo da varivel X. Queremos que, nesta expresso, o contedo de X seja um inteiro. Para isso, colocamos (int) na frente da varivel X, como mostra a linha 6 do exemplo. Como a varivel X tem 6.5 armazenado, nesta conta, a parte fracionria ser desprezada e a conta ser feita considerando que X 6. Assim, 6 % 5 = 1. Ento, 1 o valor que ser atribudo a varivel C. Vamos ver agora a atribuio da linha 7. Neste caso, estamos querendo fazer a diviso entre dois nmeros inteiros. Esta conta possvel, mas ela traz como resultado, apenas a parte inteira do quociente. No entanto, h situaes em que queremos dividir dois nmeros inteiros, e receber o resultado completo, parte inteira e fracionria do quociente. Este o caso da linha 7. Para que o resultado venha completo, basta que o contedo de uma das variveis se comporte como um float. Com isso, um float dividido por um int, temos como resultado um float. Dessa forma, fizemos a converso de tipo da varivel A, solicitando que seu contedo se comporte como um float. Nesta linha 7 teremos, ento, 3.0/5 = 0.6. Este o valor que ser atribudo a varivel Y. 89

Programao 2

5.5. Funes Matemticas (biblioteca math.h)


A linguagem de programao C possui uma biblioteca que agrupa um conjunto de funes matemticas. a biblioteca math.h. Nesta seo, vamos ver quatro funes matemticas, da biblioteca math.h, que utilizaremos com mais frequncia nos nossos programas. So as funes para encontrar a raiz quadrada de um nmero, potncia (elevar um nmero a uma potncia) e duas funes de arredondamento. Esta biblioteca possui outras funes, mas estas so as mais utilizadas nos nossos programas. As funes matemticas precisam receber um ou vrios parmetros e nos retornam um resultado. Por exemplo, para descobrir a raiz quadrada de um nmero, a funo precisa saber de que nmero ser calculada a raiz quadrada. Este nmero que fornecido a funo o parmetro. Vamos ver a tabela a seguir, em que feita a descrio destas funes.
Funo sqrt Descrio Funo para encontrar a raiz quadrada de um nmero. A funo sqrt precisa receber como parmetro, o nmero que desejamos encontrar a sua raiz quadrada. O resultado desta funo um nmero real. Como uma funo retorna um resultado, devemos atribu-lo a uma varivel. Funo para encontrar a potncia de um nmero, ou seja, eleva um nmero a um expoente: AB. Assim, se A = 4 e B = 3, 4 elevado a 3 64. A funo pow ir receber dois parmetros. O primeiro a base (neste exemplo o A) e o segundo o expoente (neste caso o B). Esta funo retorna um nmero real como resultado. A funo ceil serve para arredondar um nmero real. Esta funo arredonda o nmero para cima. Assim, ela retornar como resultado: o primeiro nmero inteiro maior que o nmero que desejamos arredondar. Por exemplo: se x = 1.34, e desejamos arredondar com a funo ceil, o resultado ser 2.0. Ou seja, o primeiro nmero inteiro acima de 1.34. Apesar do arredondamento, esta funo retorna um nmero real como resultado. Exemplos de uso R = sqrt(16); R = sqrt(A);

pow

P = pow(3,4); P = pow(A, 3);

ceil

Z = ceil(1.67); Z = ceil(Z);

90

Programao 2

floor

A funo floor serve para arredondar um nmero real. Esta funo arredonda o nmero para baixo. Assim, ela retornar como resultado: o primeiro nmero inteiro menor que o nmero que desejamos arredondar. Por exemplo: se x = 1.34, e desejamos arredondar com a funo floor, o resultado ser 1.0. Ou seja, o primeiro nmero inteiro abaixo de 1.34. Apesar do arredondamento, esta funo retorna um nmero real como resultado.

Z = floor(1.67); Z = floor(Z);

Ateno Sempre que usarmos estas funes nos nossos programas, devemos incluir a biblioteca matemtica, com a diretiva de compilao: #include <math.h>. Devemos ficar atentos ao tipo de dado que a funo retorna, para que seja feita a atribuio para uma varivel compatvel com o tipo do resultado. Por exemplo, no podemos atribuir o resultado da funo pow, para uma varivel inteira.

Programas Resolvidos Nesta seo, vamos acompanhar a resoluo de dois programas completos, que utilizaro os comando aprendidos neste captulo. Vamos l? No primeiro programa que iremos analisar, o aluno fornecer seu nome e as duas notas que tirou nas provas de programao. Como resultado, o programa vai imprimir a mdia do aluno. Segue abaixo o programa completo 5.1. Em seguida, vamos comentar cada linha.

91

Programao 2

Programa Completo 5.1: Ler o nome e duas notas do usurio e imprimir a mdia.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

#include <stdio.h> //ler o nome e as duas notas do aluno e imprimir a media main() { char nome[20]; float nota1, nota2, media; printf(Calcular a media do aluno\n\n); printf(Seu nome: ); fflush(stdin); gets(nome); printf(Nota 1: ); scanf(%f, &nota1); printf(Nota 2: ); scanf(%f, &nota2); media = (nota1 + nota2)/2; printf(\n\n%s, media); getche(); } sua media = %.2f, nome,

Comentrios sobre cada linha do Programa completo 5.1: Linha 1: Como iremos ler o nome do aluno, precisamos incluir a biblioteca stdio.h onde esto os comandos fflush e gets. Linha 2: Comentrio informando o que o programa faz. 92

Programao 2

Linha 3: incio do programa principal, que definido pelo: main(). Linha 4: um abre chaves, que ir delimitar o corpo do programa principal. Linhas 5 e 6: declaraes das quatro variveis do programa: nome, nota1, nota2 e mdia. Linha 7: um printf que serve para colocar, no incio da tela, o ttulo do que o programa faz. Linha 8: printf para que o usurio saiba que precisa fornecer seu nome. Linha 9: comando fflush, que DEVE sempre vir antes do comando gets. Utilizado para limpar o buffer de entrada de dados. Linha 10: gets que efetuar a leitura do nome do usurio. Linha 11: printf para que o usurio saiba que precisa fornecer a primeira nota. Linha 12: scanf que l a primeira nota e armazena na varivel nota1. Linha 13: printf para que o usurio saiba que precisa fornecer a segunda nota. Linha 14: scanf que l a segunda nota e armazena na varivel nota2. Linha 15: clculo da mdia do aluno. Notem que a soma das nota1 e nota2 aparece entre parnteses. Devemos lembrar que o operador da diviso tem prioridade maior que o operador da soma. Assim, para que a soma das notas seja feita primeiro, ela deve vir entre parnteses. No esqueam deste detalhe! Linha 16: printf que apresenta a mdia do aluno. Notem que na mensagem, tambm ser escrito o nome do aluno. A mdia do aluno ser apresentada com duas casas decimais (%.2f) Linha 17: comando getche que faz com que a tela de execuo do programa fique aberta, e assim podemos ver o resultado do programa. Nesta linha tambm poderamos usar o system(pause).

93

Programao 2

Linha 18: fecha chaves, indicando o final do programa principal. importante que vocs digitem estes programas resolvidos, no Dev-cpp, assim vo se familiarizando com a sintaxe do C, certo? Vamos fazer o outro programa? Nosso segundo programa ir ler um nmero e vai imprimir a sua raiz quadrada. Segue abaixo o programa completo 5.2. Em seguida, vamos comentar cada linha.

Programa Completo 5.2: Ler um nmero e imprimir a raiz quadrada

1 2 3 4 5 6 7 8 9 10 11 12 }

#include <math.h> //ler um nmero e encontrar a raiz quadrada main() { float num, raiz; printf(Calcular a raiz quadrada de um numero\ n\n); printf(Numero: ); scanf(%f, &num); raiz = sqrt(num); printf(\n\nA raiz quadrada de %.1f = %.1f., num, raiz); getche();

Comentrios sobre cada linha do Programa completo 5.2: Linha 1: Para encontrar a raiz quadrada, iremos utilizar a funo sqrt da biblioteca math.h. Assim, precisamos inclu-la no nosso programa. Linha 2: Comentrio informando o que o programa faz. 94

Programao 2

Linha 3: incio do programa principal, que definido pelo: main(). Linha 4: um abre chaves, que ir delimitar o corpo do programa principal. Linha 5: as declaraes das duas variveis do programa: num e raiz. Linha 6: printf que serve para colocar, no incio da tela, o ttulo do que o programa faz. Linha 7: printf para que o usurio saiba que precisa fornecer o nmero. Linha 8: scanf que l o nmero e armazena na varivel num. Linha 9: clculo da raiz quadrada do nmero. Usamos a funo sqrt, passando como parmetro o nmero que foi digitado pelo usurio (que est armazenado na varivel num). O resultado da funo sqrt atribudo varivel raiz. Linha 10: printf que apresenta o resultado. Notem que ser apresentada apenas uma casa decimal (%.1f) das variveis num e raiz. Linha 11: comando getche que faz com que a tela de execuo do programa fique aberta, e assim podemos ver o resultado do programa. Linha 12: fecha chaves, indicando o final do programa principal. A figura 5.6 apresenta as duas telas de execuo dos programas completos 5.1 e 5.2.

Figura 5.6: Telas de execuo dos programas completos 5.1 e 5.2

95

Programao 2

Com estes dois programas comentados, podemos dar incio resoluo de mais uma lista de exerccios. Continuem programando!

Atividades e Orientaes de Estudo Temos mais uma lista de exerccios para consolidar o entendimento do assunto visto neste captulo. A maior parte das questes deve ser resolvida no computador, certo? Continuem fazendo os programas e sempre que der erro tenham calma para encontr-los. Fiquem atentos(as) com a sintaxe de cada comando, para no cometer erros com tanta frequncia. Vamos iniciar nosso novo treino? 1. Dados os valores inteiros abaixo:
MEDIA 0 NOTA 2 TOTAL 10 Z 0 K 7 X 4 I 80 J -1 A -4

Quais os valores resultantes depois da execuo dos passos a seguir: 1) X = TOTAL/NOTA; 2) X = X+1; 3) NOTA = X; 4) TOTAL = NOTA + X + TOTAL; 5) MEDIA = 3; 6) K += 9; 7) Z = J / 5; 8) K = I % 5; 9) I ++; 10) I = I+2*A;

2. De acordo com os valores das variveis abaixo, encontre o resultado das expresses lgicas com VERDADE ou FALSO:
A 10 B 3 C 2 D 2 E 25

a) A == D b) (A>B) && (C==D) c) (E+2<B+C) && (A==10)

96

Programao 2

d) (D*E>100) || (B<5) e) (E==25) && (A >B+C+D) && (C<B) f) !(A < 15) && (B>=3) g) (D>2) || (C == 7) && (E > 20) 3. Faa um programa que leia um nmero qualquer e imprima o seu cubo. 4. Uma empresa vai dar um aumento de salrio ao seu funcionrio. Faa um programa para ler o salrio do funcionrio e o percentual de reajuste. Calcular e escrever o valor do novo salrio. 5. Faa um programa para ler o nmero de votos brancos, nulos e vlidos de uma eleio. Calcular e escrever o percentual que cada um representa em relao ao total de eleitores. 6. Faa um programa que leia o nmero total de prestaes de um consrcio, o total de prestaes pagas e o valor atual da prestao. O programa deve calcular e apresentar o saldo devedor atual e a quantidade de prestaes sem pagar. 7. Dada as seguintes entradas: quilometragem inicial, quilometragem final, litros consumidos, preo do litro de combustvel. Faa um programa que imprima o seguinte Relatrio: distncia percorrida, Valor total gasto e o consumo do carro(quantos quilmetros percorre com 1 litro de combustvel). 8. Um motorista de txi deseja calcular o rendimento de seu carro na praa. Sabendo-se que o preo do combustvel de R$2.59, faa um programa para ler: a marcao do odmetro (Km) no incio do dia, a marcao (Km) no final do dia, a quantidade de litros de combustvel gasto e o valor total (R$) recebido dos passageiros. Calcular e escrever: a mdia do consumo em km/l e o lucro (lquido) do dia. 9. Faa um programa que leia os preos de uma mercadoria em abril e maio. Tendo como base a variao dos preos desta mercadoria, calcule a taxa de inflao. 10. Faa um programa que leia o tempo de durao de um evento em uma fbrica expressa em segundos e mostre-o expresso em horas, minutos e segundos. 97

Programao 2

11. Faa um programa para um caixa eletrnico, que l o valor que o cliente quer sacar e calcula o menor nmero possvel de notas de 100,00, 50, 20 e 10 reais em que o valor lido pode ser decomposto. Escrever o valor do saque e a relao de notas necessrias. Suponha que o sistema monetrio no utiliza centavos. Ateno: S digite nmeros mltiplos de 10. Exemplo: Valor: R$ 380,00 Notas de R$ 100,00: 3 Notas de R$ 50,00: 1 Notas de R$ 20,00: 1 Notas de R$ 10,00: 1

Conhea Mais Pesquisem na Internet outra funes matemticas disponveis na biblioteca math.h. Comecem a pesquisa pelo site: http://visualcplus.blogspot.com/2006/03/mathh.html

Vamos revisar? Para revisarmos os tpicos tratados neste captulo, observem o resumo a seguir: Os operadores aritmticos so utilizados quando desejamos resolver expresses aritmticas. Devemos prestar ateno no tipo das variveis que esto sendo utilizadas na expresso, pois o tipo interfere no resultado da expresso. Os operadores relacionais so utilizados quando desejamos comparar valores de variveis. O resultado de uma expresso relacional sempre verdade ou falso. Os operadores lgicos servem para interligar duas ou mais expresses relacionais. O resultado de uma expresso lgica sempre verdade ou falso.

98

Programao 2

Podemos utilizar os operadores aritmticos de atribuio para reduzir o tamanho das expresses aritmticas. Os operadores ++ e incrementam ou decrementam 1 de uma varivel. Na biblioteca math.h podem ser encontradas funes matemticas para encontrar a raiz quadrada de um nmero, potncia, arredondamento de nmeros reais, dentre outras.

Consideraes Finais
Neste volume, tivemos a oportunidade de iniciar nosso aprendizado na linguagem de programao C. Nos captulos 1 e 2, conhecemos os principais conceitos desta rea (programao, linguagem de programao, um pouco do histrico do C, dentre outros), nos preparando para um melhor entendimento da linguagem de programao C. Nos captulos 3, 4 e 5, comeamos a estudar a sintaxe da linguagem de programao C, vimos os tipos de dados manipulados pela linguagem, os comandos de entrada e sada e a utilizao dos operadores aritmticos, relacionais e lgicos. Estes assuntos nos deram o conhecimento suficiente para iniciar o desenvolvimento dos nossos primeiros programas em C. Mas estamos apenas no incio. Temos mais trs volumes, que nos daro a capacidade de desenvolver programas mais complexos. Continuem firmes nos estudos! At o prximo mdulo.

Referncias ARAJO, Jairo. Dominando a Linguagem C. So Paulo: Cincia Moderna, 2004. ASCENIO, Ana Fernanda Gomes e CAMPOS, Edilene Aparecida Veneruchi. Fundamentos de Programao de Computadores. So Paulo: Prentice Hall, 2002. DEITEL, H, M e DEITEL, P. J. Como Programar em C. Rio de Janeiro: LTC, 1999. LAUREANO, Marcos. Programando em C Para Linux, Unix e 99

Programao 2

Windows. Rio de Janeiro: Brasport, 2005. MIZRAHI, Victorine Viviane. Treinamento em Linguagem C Curso Completo. So Paulo: Makron, 1999. MONTGOMERY, Eduard. Programando em C: Simples e Prtico. So Paulo: Alta Books, 2006. OLIVEIRA, Ulisses. Programando em C Volume I Fundamentos. So Paulo: Cincia Moderna, 2004. SCHILDT, Herbert. C Completo e Total. So Paulo: Makron, 1996. SEBESTA, Robert. Conceitos de Linguagem de Programao. So Paulo: Makron, 2003.

Conhecendo a Autora
Sou graduada em Cincia da computao pela Universidade Federal de Sergipe. Fiz mestrado e doutorado na Universidade Federal de Pernambuco, desenvolvendo pesquisas nas reas de Sistemas Distribudos e Geoprocessamento. Comeei a ensinar em 2000, nos cursos de Cincia da Computao e Sistemas de Informao. Desde o incio da minha carreira como professora, ministro disciplinas de Programao e tenho uma paixo pela linguagem C. Atualmente, encontrei uma nova paixo: Educao a Distncia.

100

Programao 2
Snia Virginia Alves Frana

Recife, 2009

Universidade Federal Rural de Pernambuco Reitor: Prof. Valmar Corra de Andrade Vice-Reitor: Prof. Reginaldo Barros Pr-Reitor de Administrao: Prof. Francisco Fernando Ramos Carvalho Pr-Reitor de Extenso: Prof. Paulo Donizeti Siepierski Pr-Reitor de Pesquisa e Ps-Graduao: Prof. Fernando Jos Freire Pr-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira Pr-Reitora de Ensino de Graduao: Prof. Maria Jos de Sena Coordenao de Ensino a Distncia: Prof Marizete Silva Santos Produo Grfica e Editorial Capa e Editorao: Allyson Vila Nova, Rafael Lira, Italo Amorim e Mrcio Heitor Reviso Ortogrfica: Marcelo Melo Ilustraes: Diego Almeida e Glaydson da Silva Coordenao de Produo: Marizete Silva Santos

Sumrio
Apresentao ........................................................................................5 Conhecendo o Volume 2 ......................................................................6 Captulo 1 Estruturas de Seleo .....................................................8 1.1. Estruturas de Controle .................................................................8 1.2. If Else (se seno)..................................................................9 1.2.1. If Simples ............................................................................10 1.2.2. If Composto ........................................................................14 1.2.3. If Aninhado..........................................................................19 1.3. Switch (Escolha-Caso) ..............................................................24 1.4. Identao de um Programa .......................................................31 Captulo 2 Estruturas de Repetio ...............................................39 2.1. For (para... faa) ........................................................................39 2.2. While (enquanto... faa teste no incio) ..................................46 2.3. Do/while (repita... at - teste no final) ........................................49 2.4. Uso do break na Estrutura de Repetio...................................56 Captulo 3 Modularizao................................................................64 3.1. O que so mdulos e por que utiliz-los? .................................64 3.2. Estrutura de um mdulo ............................................................66

3.3. Em que ponto do programa os mdulos devem ser implementados? ...............................................................................69 3.4. Escopo das Variveis ................................................................70 3.5. Parmetros ................................................................................71 3.6. Contexto do Mdulo (Ao ou Resultado) .................................72 3.7. Ativando Funes ......................................................................73

Apresentao
Caro(a) aluno(a), Seja bem-vindo (a) ao segundo mdulo da disciplina Programao II. Nesta disciplina, voc est aprendendo a programar na linguagem de programao C, uma das mais utilizadas mundialmente. No volume I, voc aprendeu os comandos bsicos do C, que permitiram a construo dos primeiros programas nesta linguagem. Neste volume II, ser dado um novo passo, conhecendo um pouco mais desta linguagem, analisando novos comandos que melhoraro a capacidade de resolver problemas computacionais. Este livro segue a mesma ideia do volume I, os assuntos so apresentados de forma gradativa, com muitos exemplos de programas completos e comentados, visando um bom entendimento, principalmente para as pessoas que esto iniciando no mundo da programao. Ao final de cada captulo, voc poder testar o seu aprendizado e assimilar melhor o que foi estudado, atravs da resoluo de exerccios. Isto muito importante! No deixe de resolv-los. Vale lembrar que, para um bom andamento dos estudos destes novos assuntos, voc ter que ter assimilado o contedo do volume I, pois este continuar sendo utilizado em todos os nossos programas. Mas isto no um problema para quem vem resolvendo questes de programao regularmente, no mesmo? O objetivo deste segundo mdulo apresentar as estruturas de controle de fluxo: seleo e repetio. Alm disso, tambm ser analisada a diviso de programas em mdulos/funes, visando a um desenvolvimento mais rpido e um cdigo mais legvel. Ao final deste mdulo, voc vai perceber o quanto a sua capacidade de resolver programas foi aumentada. Convido-lhe para uma nova etapa no conhecimento da linguagem de programao C. Vamos comear? Bons estudos! Snia Virginia Alves Frana

Programao 2

Conhecendo o Volume 2
Neste segundo volume, vocs iro encontrar o mdulo 02 da disciplina: Programao II. Este volume est estruturado em trs captulos, que sero estudados ao longo de 15h/aula. Para facilitar seus estudos, veja a organizao deste volume. Captulo 1: Estruturas de Seleo Carga Horria do Captulo 01: 5 h/aula Objetivos do Captulo 1: Apresentar a sintaxe das duas estruturas de seleo (if e switch), disponveis na linguagem de programao C. Contedo Programtico do Captulo 1 Estruturas de controle Estrutura de seleo if: simples, composto e aninhado Estrutura de seleo switch. Captulo 2: Estruturas de Repetio Carga Horria do Captulo 02: 5 h/aula Objetivos do Captulo 2: Apresentar a sintaxe das trs estruturas de repetio (for, while e do/while), disponveis na linguagem de programao C. Contedo Programtico do Captulo 2 Estrutura de repetio for Estrutura de repetio while Estrutura de repetio do/while Comando break. Captulo 3: Modularizao de Programas Carga Horria do Captulo 03: 5 h/aula Objetivos do Captulo 3: Apresentar como se criam mdulos(funes e procedimentos) em um programa C. 6

Programao 2

Contedo Programtico do Captulo 3 Estrutura de um mdulo Variveis locais e globais Parmetros Chamada de um mdulo Comando return. Ao final de cada captulo vocs encontraro: A seo Atividades e Orientaes de Estudo: que contm exerccios para a fixao do assunto estudado, alm de indicao de fruns de discusso. A seo Conhea Mais: que contm dicas de sites e livros que devem ser lidos para ampliar os seus conhecimentos. A seo Vamos Revisar?: que apresenta um resumo dos principais tpicos abordados no captulo.

Programao 2

Captulo 1 Estruturas de Seleo


Vamos conversar sobre o assunto? Nos programas que desenvolvemos at este momento, todos os comandos que aparecem no programa so executados, ou seja, o processador vai passando e executando cada um dos comandos do programa. Existem situaes em que no queremos que todos os comandos sejam executados. Nestes casos, devemos utilizar alguma estrutura de seleo, que nos permite desviar de uma sequncia de comandos do programa. Neste captulo, iremos aprender a utilizar as estruturas de seleo disponveis na linguagem C, que so: if e switch. Estas estruturas correspondem ao se e escolha do Portugol. As estruturas de seleo tambm podem ser chamadas de: estruturas de deciso ou estruturas de desvio. Vamos avanar, um pouco mais, nossos conhecimentos em C?

1.1. Estruturas de Controle


De um modo geral, os comandos de um programa so executados um aps o outro, na ordem em que foram escritos de cima para baixo e da esquerda para a direita. Este o fluxo de execuo de um programa. Mas, atravs do uso de estruturas de controle, podemos controlar o fluxo de execuo dos nossos programas. Existem trs tipos de estruturas de controle: Sequncia: nesta estrutura, todos os comandos so executados uma nica vez, de forma linear, um aps o outro. At ento, nossos programas foram desenvolvidos desta forma. Seleo: esta estrutura permite que um grupo de comandos seja executado ou no, dependendo do resultado de uma condio (representada por expresses relacionais ou lgicas). Dessa forma, poderemos ter um conjunto de comandos do nosso programa que no vai ser executado. Repetio: com estas estruturas, poderemos fazer com que uma sequncia de comandos seja executada vrias vezes.

Programao 2

Para entender melhor as estruturas de controle, vamos fazer a seguinte analogia: imagine que o nosso programa uma estrada. As retas so as sequncias. Os entroncamentos so as estruturas de seleo, que nos permitem pegar um caminho ou outro. As rotatrias e os retornos so as estruturas de repetio, que nos permitem passar vrias vezes pelo mesmo local. A Figura 1.1 apresenta estradas com retas, entroncamentos e rotatrias.

Figura 1.1: Retas, entroncamentos e rotatrias

Nas prximas sees, deste captulo, vamos conhecer as estruturas de seleo do C. No captulo seguinte, conheceremos as estruturas de repetio.

1.2. If Else (se seno)


A estrutura de seleo if a estrutura de seleo mais simples. No entanto, esta estrutura resolve todo e qualquer problema de seleo. Esta estrutura permite executar um entre vrios blocos de comandos. A escolha de qual bloco ser executado depende do resultado de uma condio (expresso relacional ou lgica, apresentadas no captulo 5 do volume I1). A sintaxe geral para o comando if apresentada abaixo:
Sintaxe

Ateno
1 Vale lembrar que o resultado de uma expresso relacional ou expresso lgica sempre verdade ou falso.

if (condio) bloco_de_comandos1; else bloco_de_comandos2;

Neste comando, a condio verificada e, caso o resultado seja verdade, o bloco_de_ comandos1 ser executado. Caso contrrio, o bloco_de_comandos2 executado. Note que somente um dos blocos 9

Programao 2

ser executado. Apesar de possuir uma forma geral, esta estrutura pode se apresentar de modos ligeiramente diferentes: if simples, composto ou aninhado. Nas prximas sees vamos analisar, separadamente, cada uma das possibilidades de sintaxe.

1.2.1. If Simples
O if simples o if sem o else. O if simples utilizado quando se deseja executar uma sequncia de comandos, apenas se a condio for verdade. Dessa forma, no existe uma sequncia de comandos para ser executada quando a condio falsa. A figura 1.2 apresenta o fluxograma do if simples. A condio do if ser testada, se for verdade, o bloco de comandos vinculado ao if executado. Se for falso, o bloco de comandos vinculado ao if desviado.

Figura 1.2: Fluxograma do if simples

As sintaxes para o if simples so as seguintes:


Sintaxe

if (condio) comando;

if (condio) { comando1; comando2; }

Quando o if simples tem apenas um comando, utilizamos a sintaxe da esquerda. Quando o if simples tem mais de um comando para ser executado, devemos colocar a sequncia de comandos entre chaves. 10

Programao 2

As chaves servem para que o compilador saiba quantos comandos2 vo ser desviados, caso a condio seja falsa. Quando no colocamos as chaves, o compilador entende que apenas um comando deve ser desviado. A figura 1.3 apresenta dois exemplos aplicando a sintaxe do if simples.
if simples com um comando main() { comando 1; comando 2; comando 3; if (condicao) comando 4; comando 5; comando 6; comando 7; } }
Figura 1.3: Exemplos de if simples

Ateno
At ento, tnhamos somente as chaves que delimitavam o corpo do programa principal. Veremos que as chaves tambm aparecero em outras situaes.
2

if simples com mais de um comando main() { comando 1; comando 2; comando 3; if (condicao) { comando 4; comando 5; } comando 6; comando 7;

Ateno
As condies do if devem vir entre parnteses. Se tivermos mais de uma expresso relacional, estas so conectadas por operadores lgicos. O abre chaves que delimita o bloco de comandos vinculado ao if colocado aps a condio do if. O fecha chaves colocado aps o ltimo comando do bloco de comandos do if. O if e o else devem ser escritos todo em letras minsculas.

Vamos analisar os exemplos da figura 1.3. O programa principal da esquerda formado por sete comandos. O programa vai sendo executado, passando pelos comando1, comando2 e comando3. Ao chegar no if, a condio avaliada. Se a condio for verdade, o comando4 ser executado. Se esta condio for falsa, o comando4 ser desviado (ou seja, no ser executado). Na sequncia, so executados os comando5, comando6 e comando7. O programa principal da direita tambm composto de sete comandos. Os comando1, comando2 e comando3 so executados. Na seqncia, temos o if, que tem a sua condio avaliada. Se a condio for verdade, os comando4 e comando5 so executados. Caso contrrio, os comando4 e comando5 so desviados. Como este if possui dois comandos, foi necessrio coloc-los entre chaves. Na sequncia, os comando6 e comando7 so executados.

11

Programao 2

Vamos ver um exemplo do uso do if simples? O programa 1.1 solicita o saldo atual do cliente e o valor que ele deseja retirar no banco. O programa vai calcular e apresentar o valor do saldo do cliente, aps o saque. Caso o saldo fique negativo, deve ser escrito uma mensagem informando esta situao ao cliente.
Programa Completo 1.1

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

main() { float saldo,valor_saque; printf(Banco Poupe Aqui\n\n\n); printf(Saldo atual: R$ ); scanf(%f,&saldo); printf(\n\nValor do saque: R$ ); scanf(%f,&valor_saque); saldo = saldo valor_saque; printf(\n\nSaldo \n\n,saldo); if(saldo<0) printf(\nAtencao: sua conta ficou com saldo NEGATIVO!\a); getche(); } apos o saque: R$%.2f

Comentrios sobre o programa completo 1.1: Linha 1: incio do programa principal, que definido pelo: main(). Linha 2: temos um abre chaves, que ir delimitar o corpo do programa principal. Linhas 3: temos as declaraes das duas variveis do programa: saldo e valor_saque. Linha 4: um printf que serve para colocar, no incio da tela, o ttulo do que o programa faz. Neste caso, foi colocado o nome do banco. 12

Programao 2

Linha 5: printf para que o usurio saiba que precisa fornecer o seu saldo atual. Linha 6: scanf que l o saldo do cliente. Linha 7: printf para que o usurio saiba que precisa fornecer o valor do saque. Linha 8: scanf que l o valor do saque. Linha 9: Como j sabemos o valor do saldo e quanto ser sacado, podemos calcular quanto ficar o saldo depois do saque. Linha 10: printf para apresentar o valor do saldo aps o saque. Linha 11: if que testa se o saldo ficou negativo. A condio para informar se o saldo est negativo o saldo ser um valor menor que zero (saldo < 0). Assim, a condio do if montada e colocada entre parnteses. Se o saldo for menor que zero, a mensagem de saldo negativo deve ser apresentada. Linha 12: printf para mostrar que o saldo ficou invlido. Veja que este comando est vinculado ao if, dessa forma, ele s ser executado se a condio do if for verdade. Como o if tem apenas um comando, no precisamos colocar chaves. Linha 13: comando getche que faz com que a tela de execuo do programa fique aberta, e assim podemos ver o resultado do programa. Nesta linha tambm poderamos usar o system(pause). Linha 14: fecha chaves, indicando o final do programa principal. A figura 1.4 apresenta duas telas de execuo do programa completo 1.1. No primeiro caso, o saldo permanece positivo aps o saque. Dessa forma, o comando vinculado ao if no foi executado. No segundo caso, o saldo ficou negativo aps o saque, assim, o comando vinculado ao if foi executado (printf que imprime mensagem de saldo negativo).

13

Programao 2

Saldo positivo aps o saque

Saldo negativo aps o saque

Figura 1.4: Telas de execuo do programa completo 1.1

Agora que j sabemos como usar o if simples, vamos aprender a utilizar o if composto.

1.2.2. If Composto
O if composto o if com o else, dessa forma, teremos uma sequncia de comandos que executada quando a condio resulta em verdade e uma outra sequncia que executada quando a condio falsa. A figura 1.5 apresenta o fluxograma do if composto. A condio do if ser testada, se for verdade, o bloco de comandos 1 executado. Se for falsa, o bloco de comandos 2 executado. Notem que apenas um dos bloco de comando ser executado.

14

Programao 2

Figura 1.5: Fluxograma do if composto

Seguem abaixo as sintaxes para o if composto:


Sintaxe Caso 1 Caso 2

if (condio) comando1; else comando2;

if (condio) { comando1; comando2; } else comando3;

Caso 3

Caso 4

if (condio) comando1; else { comando2; comando3; }

if (condio) { comando1; comando2; } else { comando3; comando4; }

De um modo geral, na sintaxe do if composto, teremos o if, juntamente com a condio que ser testada. Abaixo da linha do 15

Programao 2

if, temos um comando ou uma sequncia de comandos que ser executada se a condio for verdade. Logo em seguida temos o else e um comando ou um sequncia de comandos que executada quando a condio do if falsa. Vamos ver qual a diferena entre as quatro sintaxes. Existe uma regra que diz: se tivermos mais de um comando para ser executado quando a condio for verdade, temos que colocar a sequncia de comandos entre chaves. Para um nico comando, as chaves no so necessrias. A mesma regra vale para a sequncia de comandos do else, mais de um comando, a sequncia deve vir entre chaves. Analisando a tabela com as quatro sintaxes temos: Caso 1: Se a condio for verdade, apenas um comando ser executado. Se a condio for falsa, apenas um comando ser executado. Como tivemos um comando na sequncia do if e um comando na sequncia do else, no necessrio colocar chaves. Caso 2: Se a condio for verdade, vrios comandos sero executados. Dessa forma, necessrio colocar as chaves para delimitar a sequncia de comandos do if. Quando a condio for falsa, apenas um comando ser executado. Assim, no necessita colocar as chaves no comando do else. Caso 3: Se a condio for verdade, apenas um comando ser executado. Com isso, no precisamos colocar as chaves no comando do if. No entanto, se a condio for falsa, vrios comandos devem ser executados. Com isso, a sequncia de comandos do else deve vir entre chaves.
Ateno
O else no tem condio. A condio do if. Se a condio for falsa, a sequncia do else executada. Tomar cuidado com as chaves que delimitam a sequncia de comandos do if e do else.

Caso 4: Se a condio for verdade, vrios comandos sero executados. Dessa forma, precisamos colocar a sequncia de comandos do if entre chaves. Se a condio for falsa, tambm sero executados vrios comandos. Assim, a sequncia do else precisa ser colocada entre chaves. Vamos analisar um programa completo que utiliza o if composto. Este programa l o nome do aluno e as suas duas notas. Em seguida, calcula a mdia do aluno e apresenta uma mensagem informando se o aluno foi aprovado ou reprovado (considerar que a mdia para ser aprovado igual ou maior que 7.0).

16

Programao 2

Programa Completo 1.2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

#include <stdio.h> main() { float n1, n2, media; char nome[20]; printf(Caderneta de Notas\n\n); printf(Nome do aluno: ); fflush(stdin); gets(nome); printf(Nota 1: ); scanf(%f,&n1); printf(Nota 2: ); scanf(%f,&n2); media = (n1+n2)/2; if (media>=7) printf(\n\n%s foi aprovado(a) com media %.1f\n,nome, media); else printf(\n\n%s foi reprovado(a) com media %.1f\n,nome, media); getche(); }

Comentrios sobre o programa completo 1.2: Linha 1: incluso da biblioteca stdio, devido o comando fflush, que ser usado quando formos ler o nome do aluno. Linha 2: incio do programa principal, que definido pelo: main(). Linha 3: temos um abre chaves, que ir delimitar o corpo do programa principal. 17

Programao 2

Linhas 4 e 5: temos as declaraes das variveis do programa. Linha 6: o printf que serve para colocar, no incio da tela, o ttulo do que o programa faz. Neste caso, ser colocado caderneta de notas. Linhas 7 a 13: leitura das variveis de entrada: nome do aluno, a primeira e a segunda nota. Linha 14: clculo da mdia do aluno. Linha 15: if composto que verifica qual o valor da mdia, para escrever a mensagem se o aluno foi aprovado ou reprovado. Para o aluno ser aprovado, a mdia tem que ser maior ou igual a 7. A montagem da condio feita utilizando operadores relacionais. Alm disso, a condio foi colocada entre parnteses. Linha 16: printf que executado quando a condio do if for verdade. Neste caso, quando a mdia do aluno for maior ou igual a 7. Note que a mensagem informa que o aluno foi aprovado. Como apenas um comando est vinculado ao if, no houve a necessidade de colocar chaves. Linha 17: temos um else, que indica que tambm teremos uma sequncia de comandos para ser executada quando a condio do if for falsa, ou seja, mdia do aluno menor que 7. Linha 18: printf que executado quando a condio do if for falsa. Note que a mensagem informa que o aluno foi reprovado. Como apenas um comando est vinculado ao else, no houve a necessidade de colocar chaves. Linha 19: comando getche que faz com que a tela de execuo do programa fique aberta, e assim podemos ver o resultado do programa. Linha 20: fecha chaves, indicando o final do programa principal. A figura 1.6 apresenta duas telas de execuo do programa completo 1.2. No primeiro caso, o aluno aprovado e no segundo caso, reprovado.

18

Programao 2

Aluno aprovado

Aluno reprovado

Figura 1.6: Telas de execuo do programa completo 1.2

Agora s falta estudarmos o ltimo tipo de if, que o if aninhado. Vamos aprender mais um pouco?

1.2.3. If Aninhado
O if composto, visto na seo anterior, usado quando temos duas possibilidades de resposta. Por exemplo, ou o aluno aprovado ou reprovado. Apenas uma situao ir ocorrer. O if aninhado ocorre quando temos mais de duas possibilidades de respostas (ou situao). Por exemplo, ao comparar dois nmeros (x e y), temos trs possibilidades de resposta: x menor que y, x maior que y, ou ainda, x e y so iguais. Assim, a primeira possibilidade ser testada na condio do if (verificando se x menor que y). Se a condio for falsa, ainda temos duas possibilidades de resposta. Para fazer esta verificao, necessitamos de um outro if. Este novo if ser colocado dentro da sequncia de comandos do else. Assim, teremos um if dentro do outro, por isso chamado de if aninhado. 19

Programao 2

A seguir, so apresentadas duas sintaxes de if aninhado. No caso 1, temos trs possibilidades de respostas e no caso 2, quatro possibilidades. Vale lembrar que podemos ir aninhando um if dentro do outro, sem um limite de aninhamento. S depende de quantas possibilidades de situaes teremos que testar.
Sintaxe Caso 1: trs possibilidades de resposta Caso 2: quatro possibilidades de resposta

if (condio1) comando1; else { if (condicao2) comando2; else comando3; }

if (condio1) comando1; else { if (condicao2) comando2; else { if (condicao3) comando3; else comando4; } }

Ateno
Existe if sem else (que o primeiro caso de if que estudamos if simples), mas todo else est vinculado a um if. No colocar ponto e vrgula depois da condio do if

No caso 1, se a condio1 do primeiro if for verdade, o comando1 ser executado e toda a sequncia do else desviada. No entanto, se a condio1 do if for falsa, o fluxo do programa desviado para o else. Quando chega no else, encontrada uma sequncia de comandos (por isso necessrio coloc-la entre chaves). Mas, nesta sequncia tem um if, que precisa ter a sua condio avaliada. Se a condicao2 deste if for verdade, o comando2 executado. Caso seja falsa, o fluxo do programa desviado para o else e executa o comando3. Dessa forma, apenas um dos comandos (comando1, comando2 ou comando3) ser executado, os demais sero desviados. Um comportamento similar ocorre com o caso 2, que analisa quatro possibilidades de respostas. Vamos analisar um programa completo que utiliza o if aninhado. 20

Programao 2

Neste programa, sero lidos dois nmeros inteiros(x e y) e seus valores sero comparados. O programa ir escrever uma das trs mensagens: x maior que y, x menor que y ou x e y so iguais. Na sequncia, as linhas do programa sero comentadas.
Programa Completo 1.3

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

main() { int x, y; printf(Compara Numeros\n\n); printf(X: ); scanf(%d,&x); printf(\nY: ); scanf(%d,&y); if (x > y) else { if (x < y) printf(\n\n%d eh menor que %d,x,y); else } getche(); } printf(\n\nX e Y sao iguais: %d,x); printf(\n\n%d eh maior que %d,x,y);

Comentrios sobre o programa completo 1.3: Linha 1: incio do programa principal, que definido pelo: main(). Linha 2: temos um abre chaves, que ir delimitar o corpo do programa principal. Linha 3: temos as declaraes das variveis do programa. Linha 4: o printf que serve para colocar, no incio da tela, o ttulo 21

Programao 2

do que o programa faz. Neste caso, ser colocado Compara Nmeros. Linhas 5 a 8: leitura das variveis de entrada: x e y. Linha 9: Agora que j conhecemos o valor de x e y, devemos comear a comparao. Nesta linha temos um if, com a condio para verificar se x maior que y. Se esta condio for verdade, o comando da linha 10 ser executado e todos os comandos dentro do else sero desviados. Linha 10: printf para escrever que x maior que y. Linha 11: temos um else, o programa ter seu fluxo desviado para o else, caso a condio do if seja falsa. Notem que, se o x no maior que y, ainda temos que descobrir se x menor que y ou se x e y so iguais. Por conta disto, na sequncia de comandos deste else, ser necessrio colocar um if composto. Por termos uma seqncia de comandos, devemos coloc-la entre chaves. Linhas 12: abre chaves para informar que comear a sequncia de comandos do else, alm do if que verifica a segunda possibilidade de resposta: se x menor que y. Linha 13: printf para escrever que x menor que y. Este printf executado caso a condio do if da linha 12 seja verdade. Linhas 14: temos um else, que est vinculado ao if da linha 12. Ou seja, se a condio deste if for falsa, o fluxo do programa desviado para este else. Linha 15: printf para escrever que x e y so iguais. Este printf executado caso a condio do if da linha 12 seja falsa. Linhas 16 e 17: temos o getche() e o fecha chaves, indicando o final do programa principal. A figura 1.7 apresenta telas de execuo do programa completo 1.3, mostrando as trs possibilidades de respostas.

22

Programao 2

X menor que Y

X maior que Y

X igual a Y

Figura 1.7: Telas de execuo do programa completo 1.3

Agora que j sabemos utilizar os trs casos da estrutura de seleo if: simples, composto e aninhado, vamos analisar um outro tipo de estrutura de seleo disponvel no C, que o switch. Vale lembrar que o if um tipo de estrutura de seleo que pode ser aplicada em qualquer situao em que seja necessria tomar uma deciso no programa. O switch apresenta algumas restries e nem sempre poderemos utiliz-lo. No entanto, o switch tem uma sintaxe mais limpa que a do if. Dessa forma, sempre que for possvel o seu uso, interessante inclu-lo no programa. Vamos ver como o switch funciona?

23

Programao 2

Figura 1.8: Quadrinhos sobre deciso

1.3. Switch (Escolha-Caso)


O switch uma estrutura de deciso que permite a execuo de uma sequncia de comandos a partir da anlise do valor de uma varivel inteira ou de uma varivel com um nico caractere. Normalmente, o switch usado quando sabemos os provveis valores que uma varivel pode armazenar, e para cada valor, temos que executar uma sequncia de comandos diferente. A grande restrio do switch que ele no funciona para variveis reais, nem cadeia de caracteres. Alm disso, o switch testa se a varivel igual a um valor. No caso de uma condio usada no if, ns podemos usar qualquer tipo de varivel, alm de podermos verificar se seus valores so: menor que, maior que, diferente de, etc., e no apenas a igualdade. Por conta dessas restries, no em toda situao de seleo que o switch pode ser utilizado. No Portugol, o switch o comando escolhacaso. Significando que uma sequncia de comandos ser escolhida, caso a varivel tenha um certo valor. Vamos analisar as sintaxes do switch.

24

Programao 2

Sintaxe Caso 1: sem o default Caso 2: com o default

switch (variavel) { case valor1: comando1; comando2; break;

switch (variavel) { case valor1: comando1; comando2; break;

case valor2: comando3; comando4; break;

case valor2: comando3; comando4; break;

case valor3: comando5; comando6; } break;

case valor3: comando5; comando6; break;

default: comando7; comando8; } break;

A sintaxe do switch a seguinte: aps o switch, colocamos o nome da varivel que ser avaliada, entre parnteses. Para cada possvel valor que a varivel pode assumir, colocaremos um case e ao lado, o valor da varivel seguido de dois pontos(:). Em seguida, colocamos a sequncia de comandos que deve ser executada, caso a varivel tenha este valor. A sequncia de comandos deve ser finalizada com o comando break, obrigatoriamente. Assim, para cada valor que a varivel pode assumir, teremos um case e a sequncia de comandos. A sequncia de comandos no precisa vir entre chaves. No entanto, temos as chaves que abre e fecha o comando switch. Ao executar o switch, o processador ir procurar um case que tenha o valor que a varivel est armazenado no momento. Quando encontrar, executa a sequncia de comandos relacionada a este valor e o break faz com que o fluxo do programa seja desviado para o primeiro comando depois da chaves que fecha o switch. Assim, s ser executada a sequncia de comandos de um nico case. No entanto, caso a varivel no esteja armazenando um dos valores 25

Programao 2

previstos, nenhuma sequncia de comandos ser executada. Alm dos case com os provveis valores das variveis, tambm podemos colocar a clusula default no nosso switch (Caso 2, da sintaxe). O default funciona como um else, ou seja, se a varivel no tiver nenhum dos valores previstos nos case, ser executada a sequncia de comandos do default. O default opcional, assim, podemos ter switch com ou sem default. Abaixo, temos o exemplo 1.1 que apresenta um switch sem o default. A varivel cargo inteira e pode assumir os valores 1, 2 ou 3. Dependendo do cargo do funcionrio, dado um aumento diferenciado ao salrio do mesmo. Notem o break no final de cada sequncia de comandos dos case.
Exemplo 1.1: Switch sem default

Ateno
O default deve ser, sempre, a ltima sequncia de comandos do switch. No podemos colocar dois case testando o mesmo valor. Quando a varivel do switch for um char, devemos colocar os possveis valores da varivel entre apstrofos, por exemplo: case a:.

1 2 3 4 5 6 7 8

switch (cargo) { case 1: sal = sal + 200; break;

case 2: sal = sal + 400; break;

case 3: sal = sal + 600; } break;

No exemplo 1.2 temos um switch com o default. Neste exemplo, se a varivel cargo no estiver com 1, 2 ou 3, ser executada a sequncia de comandos do default. Ou seja, qualquer outro valor diferente dos valores previstos, a sequncia de comandos do default ser executada.

26

Programao 2

Exemplo 1.2: Switch com default

1 2 3 4 5 6 7 8 9 10

switch (cargo) { case 1: sal = sal + 200; break;

case 2: sal = sal + 400; break;

case 3: sal = sal + 600; break;

default: sal = sal + 100; } break;

Uma outra situao que pode acontecer : uma mesma sequncia de comandos deve ser executada para diferentes valores da varivel. Por exemplo, para os funcionrios dos cargos 1 e 2 ser dado o mesmo aumento salarial. Assim, para no repetirmos a mesma sequncia de comandos no case 1 e 2, faremos como mostra a linha 2 do exemplo 1.3. Coloca-se o primeiro case com o respectivo valor e aps os dois pontos, vem o prximo case e o valor que ser testado. Podemos colocar quantos case sejam necessrios.
Exemplo 1.3: Switch

1 2 3 4 5 6 7 8

switch (cargo) { case 1: case 2: sal = sal + 200; break;

case 3: sal = sal + 600; break;

default: sal = sal + 100; } break;

Vamos analisar um programa completo que faz uso do switch. Uma empresa conceder um aumento de salrio aos seus funcionrios, 27

Programao 2

varivel de acordo com o cargo, conforme a tabela abaixo. Faa um programa que leia o cargo de um funcionrio (1-Gerente,2Engenheiro,3-Tcnico) e o seu salrio atual e calcule o novo salrio. Se o cargo do funcionrio for invlido, dever ser impressa uma mensagem de erro. Como resultado, mostre o salrio antigo, o novo salrio e a diferena de salrio.
Cargo Gerente Engenheiro Tcnico Percentual 10% 20% 30%

28

Programao 2

Programa Completo 1.4

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 25

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

printf(\nSalario Antigo..............: R$ %.2f\n,sal); printf(\nSalario Novo................: R$ %.2f\n,nsal); printf(\nDiferenca %.2f\n,nsal - sal); } getche(); } de Salarios: R$

29

Programao 2

Comentrios sobre o programa completo 1.4: Linhas 3 e 4: temos as declaraes das variveis do programa. O cargo do funcionrio ser armazenado em uma varivel do tipo int. Quando tiver armazenado 1, significa que o funcionrio um gerente, 2 engenheiro e 3 tcnico. Linha 5: o printf que serve para colocar, no incio da tela, o ttulo da empresa. Linha 6: printf que solicita que o usurio digite o cargo do funcionrio. Como estamos usando uma legenda, ou seja, um nmero representando cada cargo, precisamos colocar neste printf o significado de cada nmero. Linha 7: scanf para ler o cargo do funcionrio. Linha 8: printf para solicitar a digitao do salrio do funcionrio. Linha 9: scanf para l o salrio do funcionrio. Linha 10: switch que avalia o cargo do funcionrio, para calcular seu novo salrio. Cada cargo tem um aumento de salrio diferente. Como foi solicitado que imprima uma mensagem de erro quando o cargo foi invlido, ser colocado o default. Linhas 11 a 15: nestas linhas temos os case de cada valor da varivel cargo, alm do default. Para cada case, colocamos a frmula para o clculo do novo salrio. No default, temos o printf que escreve a mensagem de cargo invlido. Notem que o break aparece no final da sequncia de comando de cada case.

Ateno
Ateno: neste programa a varivel cargo armazenar 1 (quando o cargo for gerente), 2 (quando for engenheiro) e 3 (quando for tcnico). Dessa forma, esta varivel ser do tipo inteiro.

Linha 16: este if foi colocado para testar se o cargo digitado vlido. Sendo vlido, podemos apresentar os resultados. Linhas 17 a 23: temos os printf que apresentam os resultados do programa: o salrio antigo, o novo e a diferena dos salrios. Linhas 24 e 25: temos o getche() e o fecha chaves, indicando o final do programa principal. A figura 1.9 apresenta duas telas de execuo do programa completo 1.4.

30

Programao 2

Cargo Vlido

Cargo Invlido

Figura 1.9: Telas de execuo do programa completo 1.4

Notem que, quando o cargo invlido, apenas a mensagem de erro apresentada. Quando o cargo vlido, os resultados so apresentados. Agora que j sabemos usar as estruturas de seleo do C, vamos abrir um parnteses para falar sobre a identao dos comandos dos programas.

1.4. Identao de um Programa


A identao a forma como alinhamos os comandos do nosso programa. O alinhamento faz com que o cdigo fique mais fcil de ser lido. Vamos entender a identao do programa completo 1.4, analisando a figura 1.10.

31

Programao 2

main() { int cargo; float sal, nsal; printf(Empresa Legal\n\n\n); printf(Cargo(1-Gerente\2-Eng.\3-Tecnico): ); scanf(%d,&cargo); printf(\nSalario atual: ); scanf(%f,&sal); switch (cargo) { } if ((cargo>=1) && (cargo<=3)) { } getche(); }
Figura 1.10: Cdigo Identado

case 1: nsal=sal*1.1; break; case 2: nsal=sal*1.2; break; case 3: nsal=sal*1.3; break; defaul: printf(\n\nCargo break; Invalido!\n);

prinft(\n\n____________________________\n); prinft(\n\nResultados\n\n); prinft(\nSalario Antigo...: R$ %.2f\n, sal); prinft(\nSalario Novo....: R$ %.2f\n, nsal); prinft(\nDiferenca: R$ %.2f\n, nsal - sal);

Cada chaves que abre deve ficar no mesmo alinhamento da chaves que fecha. Assim, a chaves que abre o programa, fica alinhada com a chaves que fecha o programa. Com as chaves alinhadas fica mais fcil 32

Programao 2

de verificar se alguma chave est descasada. As chaves3tambm devem ficar alinhadas com a estrutura que elas esto delimitando. Vejam a chaves do main, do switch e do if. Notem tambm, que a sequncia de comandos dentro do switch e do if fica um pouco mais para dentro. Dessa forma, ns destacamos os comandos que esto dentro da estrutura. Quando colocamos todos os comandos do nosso programa no mesmo alinhamento, fica mais difcil de visualizar quais comandos fazem parte de uma estrutura de controle. A figura 1.11 apresenta o mesmo cdigo, mas sem a identao, vejam que o switch e o if ficam menos visveis.

Dica de Programao
3 Sempre que abrir uma chaves no seu programa, j coloque a chaves que fecha. Assim no corre o risco de esquecer a chaves que fecha uma sequncia de comandos.

33

Programao 2

main() { int cargo; float sal, nsal; printf(Empresa Legal\n\n\n); printf(Cargo(1-Gerente\2-Engenheiro\3-Tecnico): ); scanf(%d,&cargo); printf(\nSalario atual: ); scanf(%f,&sal); switch (cargo) {case 1: nsal=sal*1.1; break; case 2: nsal=sal*1.2; break; case 3: nsal=sal*1.3; break; defaul: printf(\n\nCargo Invalido!\n); break;} if ((cargo>=1) && (cargo<=3)) {prinft(\n\n____________________________\n); prinft(\n\nResultados\n\n); prinft(\nSalario Antigo..........: R$ %.2f\n, sal); prinft(\nSalario Novo...........: R$ %.2f\n, nsal); prinft(\nDiferenca de Salarios: R$ %.2f\n, nsal - sal); } getche (); }
Figura 1.11: Cdigo sem Identao

Bem melhor ler o cdigo identado, no mesmo? No deixem de identar todos os programas. Vocs vero que fica mais fcil e rpido de entender.

34

Programao 2

Atividades e Orientaes de Estudo Os nossos programas vo comear a crescer de tamanho e, a cada captulo que avanamos, teremos novas possibilidades de fazer coisas bem interessantes. Nesta seo, temos uma lista de programas que devemos resolver, para efetivar o nosso conhecimento nas estruturas de seleo. Vocs iro notar que algumas questes s podem ser feitas usando o if, mas outras podem ser resolvidas com o uso do switch. Liguem o computador e comecem a programar! 1. Faa um programa que l 2 valores A e B (inteiros) e informa se A divisvel por B ou no. 2. Faa um programa que leia um nmero inteiro e mostre uma mensagem indicando se este nmero par ou mpar, e se positivo ou negativo. 3. Tendo como dados de entrada a altura e o sexo(1-feminino/2masculino) de uma pessoa, construa um programa que calcula e escreve seu peso ideal, utilizando as seguintes frmulas: para homens: (72.7*altura)-58 para mulheres: (62.1*altura)-44.7 4. Um hotel cobra R$ 50,00 reais a diria e mais uma taxa de servios. A taxa de servios de: 15,30 por dia, se nmero de dirias <15 10,00 por dia, se nmero de dirias =15 8,50 por dia, se nmero de dirias >15 Faa um programa que l a quantidade de dias que o hspede ficou no hotel e imprime a taxa e total a pagar. 5. Elaborar um programa que ir ler trs nmeros inteiros diferentes e informa qual o maior valor. 6. Elaborar um programa que ir ler quatro inteiros diferentes e informa qual o menor valor. 7. Escrever um programa que l a matrcula do aluno e suas 3 notas. Calcular a mdia e verificar qual o seu conceito, conforme 35

Programao 2

a tabela:
Mdia >= 9,0 >= 7,5 e < 9,0 >= 6,0 e < 7,5 >= 4,0 e < 6,0 < 4,0 Conceito A B C D E

O programa deve escrever a matrcula do aluno, suas notas, a mdia, o conceito correspondente e a mensagem: APROVADO se o conceito for A, B ou C e REPROVADO se o conceito for D ou E. 8. Escrever um programa que l a hora de incio e hora de trmino de um jogo, ambas subdivididas em dois valores distintos: horas e minutos. Calcular e escrever a durao do jogo, tambm em horas e minutos, considerando que o tempo mximo de durao de um jogo de 24 horas e que o jogo pode iniciar em um dia e terminar no dia seguinte. 9. Fazer um programa que leia uma data (dia e ms) e informe se primavera, vero, outono ou inverno. Sabe-se que as estaes, no hemisfrio sul, comeam nas seguintes datas: Primavera: 22/Set Vero: 21/Dez Outono: 20/Mar Inverno: 20/Jun 10. Faa um programa para ler o peso de uma encomenda, tipo de entrega(1-sedex, 2-sedex 10) e regio onde ser entregue a encomenda(1- Norte, 2-Nordeste, 3-Centro-Oeste, 4-Sudeste, 5-Sul). Calcular o valor de postagem baseado nas tabelas abaixo:
At 1 Kg De 1 Kg a 5 Kg R$ 5,00 R$ 10,00

36

Programao 2

Acima de 5 Kg

R$ 15,00 + R$ 3,00 por Kg excedente

Para entrega por Sedex Para entrega por Sedex 10

Adicionar R$ 9,00 Adicionar R$ 11,00

Para entregar na regio Norte Para entregar na regio Nordeste Para entregar na regio Centro-Oeste Para entregar na regio Sudeste Para entregar na regio Sul

Adicionar R$ 3,00 Adicionar R$ 2,00 Adicionar R$ 6,00 Adicionar R$ 5,00 Adicionar R$ 7,00

Conhea Mais Para ampliar nossos conhecimentos sobre os assuntos tratados neste captulo, leiam o captulo que aborda as estruturas de seleo, do livro: SCHILDT, Herbert. C Completo e Total. So Paulo: Makron, 1996.

Vamos Revisar? Vamos revisar um pouco o assunto visto neste captulo? Faamos uma leitura do resumo a seguir: Estruturas de seleo servem para analisar condies e valores de variveis verificando se uma sequncia de comandos deve ser executada ou desviada. As estruturas de seleo do C so: if e switch. O if pode ser: simples(quando no tem o else), composto (quando tem o else) e aninhado (quando temos um outro if dentro da sequncia de comandos do else). 37

Programao 2

O if avalia uma condio, se a mesma for verdade, a sequncia de comandos do if executada. O switch uma estrutura de seleo que avalia o valor de uma varivel inteira ou caractere. No final da sequncia de comando do case, devemos colocar um break, forando a sada da estrutura de seleo switch. A identao dos comando de um programa torna o cdigo mais legvel e fcil de entender.

38

Programao 2

Captulo 2 Estruturas de Repetio


Vamos conversar sobre o assunto? Neste captulo, vamos abordar as estruturas de repetio. Como mencionado da seo 1.1 do captulo anterior, com estas estruturas poderemos repetir uma sequncia de comandos quantas vezes forem necessrio. A linguagem de programao C fornece trs tipos de estrutura de repetio: for, while e do/while. Entendendo as caractersticas de cada estrutura de repetio, poderemos escolher a mais adequada para resolver um dado problema. Vamos em frente!

Figura 2.1: Quadrinho sobre repetio

2.1. For (para... faa)


A estrutura de repetio for equivalente ao para/faa do Portugol. Esta estrutura costuma ser utilizada quando sabemos quantas vezes a sequncia de comandos deve ser repetida. A contagem dos ciclos feita por uma varivel chamada de contador. A estrutura for tambm chamada de estrutura de repetio com contador. Sua sintaxe a seguinte:

39

Programao 2

Sintaxe

for (var-controle = atualizao_var-controle) comando1; for (var-controle = atualizao_var-controle) { comando1; comando2; comandon; }

inicio;

condio;

inicio;

condio;

Onde: var-controle: a varivel que controla a quantidade de repeties. Esta varivel inicializada e atualizada a cada repetio. incio: o valor inicial da varivel que controla o for. Ao iniciar a repetio, a varivel de controle inicializada com este valor. condio: expresso relacional ou lgica que testada ao final de cada repetio. Se a condio for verdade a sequncia de comandos executada mais uma vez. Quando a condio falsa, a repetio para. Dessa forma, temos que ter certeza que algum momento a condio se tornar falsa. Caso contrrio, entraremos em um loop infinito. Ou seja, o programa fica repetindo a sequncia de comandos infinitamente. atualizao_var-controle: a cada vez que a repetio executada, a varivel de controle deve ser atualizada. Nesta parte do for, colocamos a expresso que atualizar a varivel de controle. com esta atualizao que faremos com que a condio do for se torne falsa e a repetio tenha fim. Notem que cada parte do for separada por ponto e vrgula. Mas no colocamos o ponto e vrgula depois do comando que atualiza a varivel de controle, nem aps o fecha parnteses. A estrutura de repetio for funciona da seguinte forma: 40

Programao 2

Passo 1: a varivel de controle inicializada. Passo 2: a condio analisada. Se for verdade, a sequncia de comandos da repetio executada. Passo 3: ao terminar de executar a sequncia de comandos da repetio, a varivel de controle atualizada. E retorna ao passo 2, verificando se a condio continua sendo verdade (para repetir mais uma vez a sequncia de comandos) ou se falsa ( parando a repetio). A figura 2.2 apresenta o funcionamento da estrutura de repetio for.

Ateno
A varivel de controle do for deve ser do tipo inteiro. O for deve ser escrito todo em minsculo.

Figura 2.2 Funcionamento da estrutura de repetio for.

Assim como o if, se houver mais de um comando vinculado ao for, devemos colocar a sequncia de comandos entre chaves. Se houver apenas um comando, no h necessidade de colocar as chaves. Vamos ver dois exemplos do uso do for. No exemplo 2.1 temos um for que ser repetido 10 vezes. A varivel de controle i inicializada com 1. Cada vez que finalizada uma execuo do comando vinculado ao for, incrementado 1 valor da varivel 14. Esta repetio vai parar quando i for igual a 11. Cada vez que o for executado, escrito o valor atual de i na tela. Assim, ser escrito de 1 a 10 na tela.
Exemplo 2.1: for com varivel de controle sendo incrementada

Ateno
Esto lembrados do operador ++? Este operador acrescenta uma unidade a uma varivel. Ele foi abordado na seo 5.3 do Volume I.
4

1 2

for (i=1; i<=10; i++) printf(\nO valor de i= %d, i);

No exemplo 2.2, temos um for que tambm ser repetido 10 vezes. No entanto, a varivel de controle inicia com 10 e decrementada a 41

Programao 2

cada final da repetio. Notem que esta repetio vai parar quando o i 0. Este for tambm faz a impresso de 1 a 10 na tela. S que, dessa vez, os nmeros sero impressos na ordem decrescente.
Exemplo 2.2: for com varivel de controle sendo decrementada

1 2

for (i=10; i>=1; i--) printf(\nO valor de i= %d, i);

Vamos agora analisar um programa completo que usa o comando for. Uma loja quer calcular um bnus que dar a cinco clientes. O bnus depende de quanto cada cliente comprou. Os clientes que compraram menos de R$ 500 recebero de bnus 10% do valor das compras. Os clientes que compraram a partir de R$ 500 recebero de bnus, 15% do valor das compras. O programa deve ler o cdigo do cliente e o valor das compras e escrever o valor do bnus, para cada um dos cinco clientes.

42

Programao 2

Programa Completo 2.1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

main() { float valor; int cod, i; for (i=1; i<=5; i++) { system(cls); printf(Loja Compre Tudo\n\n); printf(Codigo do Cliente %d: ,i); scanf(%d,&cod); printf(\nValor das compras: ); scanf(%f,&valor); if (valor<500) printf(\n\nValor do bonus R$ %.2f\n,

valor*0.1); else

printf(\n\nValor do bonus R$ %.2f\n, valor*0.15); printf(\n\ntecle continuar...); } } getche(); enter para

Comentrios sobre o programa completo 2.1: Linhas 2 e 3: temos as declaraes das variveis do programa. O valor das compras, o cdigo do cliente e o i, que ser a varivel de controle do for. Linha 4: primeira linha do for, indicando que a varivel i ser inicializada com 1, a condio para permanecer repetindo i ser menor ou igual a 5 e o incremento do i, que ter seu valor aumentado em uma unidade a cada repetio. Da linha 5 at 17 temos a sequncia de comandos que ser repetida 5 vezes. 43

Programao 2

Ateno
5 cls significa clear screen. Ou seja, limpe a tela.

Linha 5: abre chaves para delimitar a sequncia de comandos vinculada ao for. Nesta linha tambm temos um comando novo: system(cls); Este comando5 limpa a tela, eliminado tudo que tem escrito. Com o uso deste comando, cada vez que formos cadastrar os dados de um novo cliente, a tela limpa, ficando assim mais organizado. Depois vocs podem comentar esse comando do programa e vejam o que acontece sem ele. Linha 6: printf para colocar o nome da empresa. Linha 7: printf para solicitar a digitao do cdigo do funcionrio. Vejam que nesta mensagem, colocado o valor do i, isto interessante para que o usurio saiba qual cliente est sendo digitado no momento, se o primeiro, o quarto, etc. Linha 8: scanf para ler o cdigo do cliente. Linha 9: printf que solicita o valor das compras do cliente. Linha 10: scanf para ler o valor das compras do cliente. Linhas 11: Como j sabemos o valor das compras do cliente, devemos calcular o valor do bnus. O bnus pode ser de 15% ou 10%. Para decidir qual bnus o cliente levar, usaremos uma estrutura de deciso. Assim, nesta linha temos um if composto, que verifica se o valor das compras menor que R$500. Linhas 12: printf que executado se a condio do if for verdade. Notem que no prprio printf feita a conta de quanto o cliente receber de bnus. Aqui dado um bnus de 10% ao cliente. Linha 13: temos o else, j que se trata de um if composto. Linha 14: printf que executado se a condio do if for falsa. Aqui dado um bnus de 15% ao cliente. Linha 15: temos os printf que d uma mensagem para que o usurio tecle enter e d prosseguimento a um novo cadastro. Linha 16: temos o getche() que faz com que possamos ver o valor do bnus do cliente.

Ateno
Fiquem atentos a identao do programa.
6

Linha 17: fecha chaves que delimita a sequncia de comandos do for. Linha 18: fecha chaves do programa principal6.

44

Programao 2

A figura 2.3 apresenta uma tela de execuo do programa completo 2.1.

Figura 2.3: Tela de execuo do programa completo 2.1

Na prxima seo iremos estudar o segundo tipo de estrutura de repetio do C, o while.

Figura 2.4: Quadrinho - O castigo de Pablo

45

Programao 2

2.2. While (enquanto... faa teste no incio)


Saiba Mais
Iterao um termo muito utilizado na computao e significa repetio.
7

A estrutura de repetio while equivalente ao enquanto/faa do Portugol. Nesta estrutura uma condio avaliada, e enquanto a condio for verdade, a sequncia de comandos ser executada. Se a condio for falsa, a repetio ser interrompida. O while avalia a condio antes da primeira iterao7, isto significa que, eventualmente, pode no ocorrer sequer a primeira iterao. Por isso, esta estrutura chamada tambm de: repetio que faz teste no incio. A sintaxe do while a seguinte:
Sintaxe

while (condio) comando; while (condio) { comando1; comando2; comandon; }

Ao lado do while colocamos a condio (entre parnteses) que ser avaliada e que faz com que a repetio seja executada ou no. Ao final de cada iterao, a condio avaliada para verificar se continua sendo verdade, para que a repetio seja executada mais uma vez ou pare. No while tambm poder acontecer o problema de loop infinito. Por isso, temos que ter certeza que em algum momento a condio se tornar falsa, para que a repetio tenha fim. Seguindo a mesma regra do if e do for, se tivermos mais de um comando vinculado ao while, devemos colocar a sequncia de comandos entre chaves. Podemos ler o comando while da seguinte forma: enquanto a condio for verdade, faa esta sequncia de comandos. A figura 2.5 apresenta o esquema de funcionamento da estrutura while.

46

Programao 2

Figura 2.5: Funcionamento da estrutura de repetio while

Como podemos ver na figura 2.5, antes de entrar na sequncia de comandos do while a condio testada, se for verdade, executa os comandos vinculados ao while, quando termina, retorna para testar a condio novamente. Enquanto for verdade, fica repetindo a sequncia de comandos. Quando for falsa, desvia para o primeiro comando depois do while. Vamos analisar o programa completo 2.2, que resolve a mesma questo do programa completo 2.1, s que usando a estrutura de repetio while. Para garantir que a repetio ser executada 5 vezes, ser declarada uma varivel responsvel por contar cada vez que terminada uma iterao do while. O valor desta varivel ser testado na condio do while, e a repetio ser executada enquanto o contador for menor ou igual a 5.

47

Programao 2

Programa Completo 2.2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

main() { float valor; int cod, contador; contador = 1; while (contador<=5) { system(cls); printf(Loja Compre Tudo\n\n); printf(Codigo do Cliente %d: ,contador); scanf(%d,&cod); printf(\nValor das compras: ); scanf(%f,&valor); if (valor<500) printf(\n\nValor do bonus R$ %.2f\n,

valor*0.1); else

printf(\n\nValor do bonus R$ %.2f\n, valor*0.15); contador++; enter para

printf(\n\ntecle continuar...); } } getche();

Comentrios sobre o programa completo 2.2: Linhas 3 e 4: temos as declaraes das variveis do programa. O valor das compras, o cdigo do cliente e o contador que ir controlar a repetio. Linha 5: Nesta linha temos a inicializao do contador. Assim, 48

Programao 2

atribudo 1 ao contador. Isto indica que iremos comear a primeira iterao do while. Linha 6: temos o while, juntamente com a condio de permanncia da repetio. Assim, esta repetio feita enquanto o contador for menor ou igual a 5. Notem que, obrigatoriamente, a condio vir entre parnteses, certo? Linhas 7 a 20: sequncia de comandos vinculada ao while, que ser executada cinco vezes. Para cada cliente pedido o seu cdigo e o valor das suas compras. O bnus calculado de acordo com o valor das compras e apresentado na tela. Linha 17: observem que nesta linha somado mais 1 ao valor do contador. Dessa forma, cada vez que passamos pela repetio, o contador vai aumentado seu valor, at fazer com que a condio se torne falsa e a repetio pare. Quando usamos o for, a inicializao, a condio e o incremento da varivel do controle fica tudo ao lado do for. No while, temos estas trs partes, s que separadas: na linha 5 tivemos a inicializao do contador, na linha 6 temos a condio e na linha 17 o incremento do contador. Se esquecermos de incrementar o contador, a condio no se tornar falsa, nunca, e entraremos em um loop infinito. Linha 21: fecha chaves do programa principal. A execuo deste programa resulta em uma tela idntica a do programa anterior, apresentada na figura 2.3. Vamos agora entender o funcionamento do terceiro e ltimo tipo de repetio do C, que o do/while.

2.3. Do/while (repita... at - teste no final)


A estrutura de repetio do/while equivale ao repita...at do Portugol. A principal diferena entre o do/while e o while o ponto onde a condio testada. Como vimos na seo anterior, a condio do while fica no incio do bloco e assim, a verificao feita antes de executar o bloco de comandos. Se a condio for falsa j no primeiro teste, os comando vinculados ao while no so executados nenhuma vez. No caso do do/while, a condio s vem aps a sequncia de comandos. Com isso, o teste s feito aps a execuo dos comandos 49

Programao 2

do do/while. A sintaxe do do/while a seguinte:


Sintaxe

do comando; while (condio); do { comando1; comando2; comandon; } while (condio);

Ateno
8 No colocamos ponto e virgula aps a condio do if, nem aps a condio do while.

O comando do/while comea com o do, e logo em seguida colocamos a sequncia de comandos que ser repetida. Aps a sequncia de comandos, coloca-se o while com a condio que ser testada para verificar se continua a repetio ou no. Quando tivermos mais de um comando, as chaves que delimitam os comandos do do/ while so obrigatrias. Prestem ateno o local correto das mesmas. O abre chaves que indica o incio da sequncia deve vir depois do do. O fecha chaves que indica o final da sequncia, deve vir antes do while. Outro detalhe importante que, depois da condio (que deve vir entre parnteses), devemos colocar um ponto e vrgula8. O esquema da execuo do do/while apresentado na figura 2.6.

Figura: 2.6: Funcionamento da estrutura de repetio do/while

O do serve, na verdade, para indicar que a sequncia de comandos vai comear. A sequncia de comandos executada e, ao encontrar 50

Programao 2

o while, a condio testada. Se a condio for verdade, retorna ao primeiro comando da sequncia. Se a condio for falsa, executa o primeiro comando depois do do/while. O comando do/while pode ser lido da seguinte forma: faa a sequncia de comandos enquanto a condio for verdade. Agora, vamos fazer o programa completo 2.1, usando o do/while. Do mesmo modo que foi necessrio no while, teremos que ter uma varivel que serve de contador, para ficar verificando se j executou a repetio cinco vezes.

51

Programao 2

Programa Completo 2.3: uso do do/while

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

main() { float valor; int cod, contador; contador = 1; do { system(cls); printf(Loja Compre Tudo\n\n); printf(Codigo do Cliente %d: ,contador); scanf(%d,&cod); printf(\nValor das compras: ); scanf(%f,&valor); if (valor<500) printf(\n\nValor do bonus R$ %.2f\n,

valor*0.1); else

printf(\n\nValor do bonus R$ %.2f\n, valor*0.15); contador++; enter para

printf(\n\ntecle continuar...); } } getche(); while (contador <=5);

Comentrios sobre o programa completo 2.3: Linhas 3 e 4: temos as declaraes das variveis do programa. O valor das compras, o cdigo do cliente e o contador que ir controlar a repetio. Linha 5: Nesta linha temos a inicializao do contador. 52

Programao 2

Linha 6: temos o do, indicando que ser iniciada uma estrutura de repetio do/while. Linhas 7 a 19: sequncia de comandos vinculada ao do/while, que ser executada cinco vezes. Para cada cliente pedido o seu cdigo e o valor das suas compras. O bnus calculado de acordo com o valor das compras e apresentado na tela. Notem que na linha 17 temos o incremento do contador. Linha 20: temos o fecha chaves e o while, juntamente com a condio que avaliada para que prossiga uma nova repetio da sequncia de comandos ou pare de executar o do/while. Linha 21: temos o fecha chaves do programa principal. Vimos aqui um mesmo problema sendo resolvido com os trs tipos de repetio do C. No problema em questo, foi mencionado quanto elementos (clientes) seriam cadastrados. Assim, estes programas SEMPRE repetem a sequncia 5 vezes. Em vrias situaes, no sabemos previamente quantos elementos sero cadastrados. Dessa forma, no saberamos o valor a ser colocado na condio da estrutura de repetio para indicar a sua parada. Mas tem uma soluo: quando no soubermos quantos elementos sero cadastrados, usaremos o do/while, da forma como ser apresentada no programa completo abaixo. Este programa tem o mesmo enunciado do programa 2.1, no entanto, ele poder cadastrar uma quantidade indeterminada de clientes.

53

Programao 2

Programa Completo 2.4: uso do do/while

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

main() { float valor; int cod, continuar; do { system(cls); printf(Loja Compre Tudo\n\n); printf(Codigo do Cliente: ); scanf(%d,&cod); printf(\nValor das compras: ); scanf(%f,&valor); if (valor<500) printf(\n\nValor do bonus R$ %.2f\n,

valor*0.1); else

printf(\n\nValor do bonus R$ %.2f\n, valor*0.15); printf(\n\n\nDeseja (1-sim/2-nao)? ); } } cadastrar outro

scanf(%d, &continuar); while (continuar==1);

Comentrios sobre o programa completo 2.4: Notem que no teremos a varivel contador. Teremos agora uma varivel inteira que foi chamada de continuar. A condio de parada deste do/while avalia o valor armazenado na varivel continuar. Linhas 3 e 4: temos as declaraes das variveis do programa. O valor das compras, o cdigo do cliente e a varivel inteira continuar que ir controlar a repetio. 54

Programao 2

Linha 5: do que inicia a sequncia da repetio. Linhas 6 a 17: sequncia de comandos vinculada ao do/while. Nesta sequncia temos a solicitao dos dados do cliente, e apresentao do bnus que o cliente tem direito. Linha 16: Aps apresentar o valor do bnus, feita a seguinte pergunta ao usurio: deseja cadastrar outro (1-sim/2-no)? . Na linha 16 temos o printf que escreve esta pergunta na tela. O usurio dever digitar 1 se quiser cadastrar outro, que significa: sim, eu quero cadastrar. Ou digitar 2 porque no tem mais clientes para cadastrar. Linha 17: scanf para ler a resposta do cliente, que deve ser 1 para continuar ou 2 para parar. O valor que o usurio digitar, ser armazenado na varivel continuar. Linha 18: temos o fecha chaves e o while, juntamente com a condio que avaliada para que prossiga uma nova repetio da sequncia de comandos ou pare de executar o do/while. Notem que a condio : (continuar == 1). Ou seja, enquanto o usurio estiver respondendo 1, informando que quer continuar cadastrando, novos cadastros sero feitos. A parada ocorre quando o usurio responde 2. Dessa forma, no precisamos determinar a quantidade de vezes que a repetio ser executada. A execuo depender apenas da resposta do usurio. Assim, uma vez ns poderemos executar a repetio 2 vezes, na outra 10, na outra 3, etc. Diferente da outra forma de resolver, que sempre executava uma quantidade de vezes pr-determinada. A resoluo da questo desta forma, trs mais flexibilidade ao programa, uma vez que o usurio repete o cadastro quantas vezes ele desejar. Uma outra observao que no houve a necessidade de colocarmos o getche(). A questo que, como ns tivemos que fazer a leitura da varivel continuar, o scanf que l esta varivel, faz com que a tela fique parada esperando o usurio fornecer a resposta. Por isso, no houve necessidade de colocar o getche(). Linha 19: temos o fecha chaves do programa principal. A figura 2.7 apresenta uma tela de execuo do programa completo 2.4.

55

Programao 2

Ateno
Todas as estruturas de repetio so escritas em minsculo. Atentem a identao dos comandos do programa. A sequncia de comandos de uma estrutura de controle, seja de repetio ou de seleo, poder ser composta por qualquer comando vlido da linguagem. Assim, poderemos ter uma estrutura de repetio dentro da outra. Se houver necessidade de colocar um for na sequncia de comandos de outro for, devemos utilizar uma varivel de controle diferente para cada for

Figura 2.7: Tela de execuo do programa completo 2.4

De acordo com a figura 2.7, aps os usurio fornecer os dados do cliente e receber o valor do bnus que o cliente tem direito, feita a pergunta se ele deseja ou no cadastrar outro. Assim que for respondido 2, ou seja, no quer mais cadastrar, a janela do programa ir fechar. Enquanto estiver respondendo 1, novos cadastros so feitos.

2.4. Uso do break na Estrutura de Repetio


Vimos anteriormente o comando break finalizando a sequncia de comandos de um case, da estrutura de seleo switch. Mas, este comando tambm pode ser usado para forar o encerramento de uma estrutura de repetio. Se um break for executado dentro de uma estrutura de repetio, o fluxo do programa ser desviado para o primeiro comando depois da repetio. Mesmo que a repetio ainda no tenha sido executada a quantidade de vezes que foi determinada. Normalmente, o comando break colocado na sequncia de comandos de uma estrutura de seleo e s executado, caso alguma situao acontea. Vamos analisar o programa completo 2.5. Neste programa, o cliente tem um limite de R$ 200 no carto de crdito da loja. Conforme as suas compras vo sendo passadas no caixa, seu saldo vai sendo avaliado. Se a compra de um novo item ultrapassar o limite permitido, o programa deve parar a venda. Mas, se ele tiver limite, a compra pode ser feita e finalizada normalmente.

56

Programao 2

Programa Completo 2.5: uso do break na repetio

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

main() { float preco, total; int continuar; total = 0; do { system(cls);

printf(Loja Compre Tudo - Adicionar produto\n\n); printf(Preco do produto: ); scanf(%f,&preco); if ((total + preco) <= 200) else { printf(\n\nA adicao deste produto vai extrapolar o seu limite!); finalizar...); printf(\n\nTecle enter para total = total + preco;

getche(); break; }

printf(\n\nDeseja (1-sim/2-nao)? );

adicionar

outro

scanf(%d, &continuar);

} while (continuar==1); printf(\n\nTotal a pagar: %.2f, total); getche(); }

Comentrios sobre o programa completo 2.5: Linhas 2 e 3: declarao das variveis do programa: preo 57

Programao 2

do produto, total das compras e continuar (para verificar se a repetio deve ser executada ou no). Linha 4: inicializao da varivel total, que armazena o valor total das compras9. Linha 5: do que inicia a sequncia da repetio. Linhas 6 a 20: sequncia de comandos vinculada ao do/while. Nesta sequncia temos a solicitao do preo do produto que o cliente est comprando. A cada novo produto comprado preciso verificar se o total da compra extrapola os 200 reais do limite do carto. Esta verificao feita no if da linha 10. Se o limite extrapolar, ser executada a sequncia de comandos do else da linha 12. Assim, impressa uma mensagem que no pode mais adicionar produtos e, logo em seguida, executa o break da linha 16, forando a sada do do/while. Como no pode mais comprar produtos, temos que sair da repetio. Por isso foi usado o break. Mas, se a compra no extrapolar o limite, o cliente vai fazendo as compras dos produtos que ele desejar. Dessa forma, a execuo do break ocorre mediante a ocorrncia de uma situao, que neste caso foi o estouro do limite. Linha 21: Aps sair da repetio, devemos imprimir quanto foi o valor das compras do cliente. Neste printf ser escrito o total. Linhas 22 e 23: temos getche() e o fecha chaves do programa principal. A figura 2.8 apresenta duas telas de execuo do programa completo 2.5.
Adio de produto na Nota Fiscal

Ateno
Sempre que uma varivel for servir de acumulador, seu contedo deve ser inicializado. Normalmente com zero.
9

58

Programao 2

Adio de produto que extrapola o limite

Figura 2.7: Telas de execuo do programa completo 2.5

Agora que j vimos alguns exemplos completos de programas que utilizam as estruturas de repetio, que tal resolvermos umas questes?

Atividades e Orientaes de Estudo Estamos aqui, mais uma vez, para colocar nossos conhecimentos em prtica. Nesta lista, temos 12 questes que utilizam comandos de repetio. Nos enunciados, quando for indicado que a quantidade de elementos desconhecida, resolva a questo utilizando um do/ while (que pergunta se o usurio quer continuar ou parar). Coloquem comentrios nos seus programas, deixando-os bem documentados. Alm disso, prestem muita ateno para manter o cdigo identado. importante ser um programador organizado. Vamos comear? 1. Uma empresa deseja aumentar seus preos em 20%. Faa um programa que leia o cdigo e o preo de custo de cada produto e calcule o preo novo. Calcule tambm, a mdia dos preos com e sem aumento. Mostre o cdigo e o preo novo de cada produto e, no final, as mdias. A quantidade de dados que sero cadastrados desconhecida. 2. Pablo tem 1,50 m e cresce 2 centmetros por ano, enquanto Edson tem 1,10 m e cresce 3 centmetros por ano. Construa um programa que calcule e imprima quantos anos sero necessrios para que Edson seja maior que Pablo. 3. Escrever um programa que leia 5 pares de valores, o primeiro valor a matrcula do aluno, e o segundo a sua altura em 59

Programao 2

centmetros. Encontre o aluno mais alto e o mais baixo. Mostre a matrcula do aluno mais alto e do mais baixo, junto com suas alturas. 4. Escrever um programa que leia um conjunto de 10 informaes contendo, cada uma delas, a altura e o sexo(1- mas/2- fem), calcule e mostre o seguinte: a maior e a menor altura da turma a mdia da altura das mulheres a mdia da altura da turma. 5. Foi feita uma pesquisa entre os 50 habitantes de uma regio. Foram coletados os dados de idade, sexo (1-mas/2-fem) e salrio. Faa um programa que informe: a mdia de salrio do grupo; maior e menor idade do grupo; quantidade de mulheres com salrio at R$ 200. 6. Com o lanamento de notebooks no mercado nacional, um fabricante deseja obter determinadas informaes dos seus possveis consumidores. Para cada empresa ou rgo pesquisado foi digitado os seguintes dados: Preferncia desejada (fabricante): 1-Toshiba/2-HP/3-Sony Possuem computadores de grande porte: 1-Sim/2-No Necessitam de notebooks: 1. Sim/2. No Deseja-se saber: A quantidade de empresas pesquisadas; Quantas empresas possuem computadores de grande porte; Percentual de empresa que necessitam de notebooks Percentual de empresas que tem preferncia pela Toshiba. A quantidade desconhecida. de dados que sero cadastrados

7. Foi feita uma pesquisa estatstica nas 50 principais cidades de quatro Estados para coletar dados sobre acidentes de trnsito. Foram obtidos os seguintes dados: 60

Programao 2

Cdigo da cidade Estado (1-PE, 2-PB, 3-RN, 4-CE) Nmero de veculos de passeio (em 2008) Nmero de acidentes de trnsito com vtimas (em 2008) Deseja-se saber: qual o maior e o menor ndice de acidentes de trnsito e a que cidades pertencem; qual a mdia de veculos nas cidades; qual a mdia de acidentes com vtimas entre as cidades do Estado de Pernambuco. 8. A Empresa Legal decidiu fazer um levantamento dos candidatos que se inscreveram para preenchimento de vaga no seu quadro de funcionrios, utilizando processamento eletrnico e voc foi contratado, ento faa um programa que: Leia um conjunto de informaes para cada candidato, contendo: nmero de inscrio do candidato, idade, sexo(1fem/2-mas), experincia anterior(1-sim/2-nao) Calcule: Quantidade de candidatos Quantidade de candidatas Mdia de idade dos homens com experincia Percentagem dos homens com mais de 45 anos, entre os homens Quantidade de mulheres com idade inferior a 35 anos e com experincia Menor idade entre as mulheres que j tem experincia no servio A quantidade desconhecida. de dados que sero cadastrados

9. Faa um programa para realizar a totalizao dos votos da eleio para a prefeitura concorrida entre 3 candidatos. Para cada seo so informados o nmero de votos do candidato 61

Programao 2

A, o nmero de votos do candidato B, o nmero de votos do candidato C, o nmero de votos brancos e o nmero de votos nulos. A quantidade de sees que sero cadastradas desconhecida. Determine e imprima: O nmero de votantes; O total de votos de cada candidato; O total de votos brancos e total de votos nulos; O total de votos vlidos; O candidato com maior nmero de votos; Se a eleio foi vlida e para isso o total de votos brancos mais votos nulos deve ser menor que o total de votos vlidos; Se haver segundo turno, para no haver segundo turno basta que o total de votos do candidato vencedor seja maior que 50% dos votos vlidos Percentual de votos nulos. 10. Ler 20 notas e imprimir as trs maiores.

Conhea Mais Vocs podero encontrar mais detalhes sobre estruturas de repetio no livro: ASCENIO, Ana Fernanda Gomes e CAMPOS, Edilene Aparecida Veneruchi. Fundamentos de Programao de Computadores. So Paulo: Prentice Hall, 2002. O interessante que, os autores primeiro do as explicaes em Portugol, e depois fazem a traduo para a sintaxe da linguagem de programao C e Pascal.

62

Programao 2

Vamos Revisar? Vamos revisar as estruturas de repetio? Observem o resumo a seguir: As estruturas de repetio possibilitam que uma sequncia de comandos possa ser executada vrias vezes. As estruturas de repetio da linguagem de programao C so: for, while e do/while. A estrutura de repetio for mais utilizada quando sabemos quantas vezes uma repetio ser executada. A estrutura de repetio while avalia o resultado de uma condio para verificar se deve ou no executar uma sequncia de comandos. Enquanto a condio for verdade, a repetio executada. A condio do while fica no incio da sequncia de comandos. A estrutura de repetio do/while tambm avalia uma condio para permanecer repetindo a execuo de uma sequncia de comandos. No entanto, a condio s avaliada aps a execuo da sequncia de comandos. O comando break tambm pode ser utilizado para forar a parada de uma repetio. Quando no tomamos cuidado de tornar a condio de uma repetio falsa, ocorre o loop infinito.

63

Programao 2

Captulo 3 Modularizao
Vamos conversar sobre o assunto? Neste captulo, vamos aprender a programar de forma modularizada. At agora, toda a sequncia de comandos dos nossos programas foi escrita dentro do programa principal (main), em um bloco nico. Vocs vo ver que podemos dividir os nossos programas em mdulos. A modularizao uma das alternativas mais utilizadas para desenvolver grandes programas, pois deixa o cdigo mais legvel e aumenta a produtividade dos programadores. No entanto, a modularizao apresenta muitas outras vantagens. Vamos descobrir isso agora?

3.1. O que so mdulos e por que utiliz-los?


A melhor maneira de desenvolver um programa grande construlo a partir de pequenas partes, que so chamadas de mdulos. Esta tcnica chamada dividir para conquistar, uma estratgia de guerra criada pelos romanos e muito utilizada por Napoleo Bonaparte10, quando tentou conquistar o mundo. Como o territrio a ser conquistado era muito extenso, ele o dividiu em pequenos territrios e foi conquistando cada parte por vez. Uma vantagem desta tcnica que focamos a nossa ateno em um problema pequeno de cada vez. No final, teremos a soluo do problema como um todo. Para compreender melhor este conceito, vamos fazer uma analogia: suponham que ns precisamos construir uma casa. Mas esta no uma atividade simples, devido a sua complexidade. No entanto, podemos dividir esse problema em partes menores: alvenaria, sistema eltrico, sistema hidrulico, acabamento, pintura, etc. e assim, fica mais simples de entendermos cada parte separadamente (Figura 3.1). Caso ainda existam partes complexas, podemos continuar dividindo em partes ainda menores. Por exemplo, o sistema hidrulico pode ser dividido em caixa de gua, bombas, canos, registros, etc. Este processo de decomposio contnua tambm conhecido como refinamentos sucessivos, porque se parte de um problema complexo e abrangente, que sucessivamente dividido at resultar em problemas mais simples e especficos. 64

Saiba Mais
Napoleo Bonaparte foi imperador da Frana e esteve no poder durante 15 anos. Nesse tempo conquistou grande parte do continente europeu. Os bigrafos afirmam que seu sucesso deu-se devido ao seu talento como estrategista, alm do seu esprito de liderana.
10

Programao 2

Alvenaria

Sistema Eltrico

Pintura

Sistema Hidrulico Figura 3.1: Divises da construo de uma casa

Os mdulos (tambm chamados de funes, rotinas ou subprogramas) so a essncia da programao estruturada. Os mdulos so segmentos de programa que executam uma tarefa especfica. Os mdulos servem para dividir um grande programa em diversas partes menores. De acordo com as boas prticas de programao: sempre que possvel, evite cdigos extensos, separando os mesmos em mdulos, visando a um rpido entendimento e uma manuteno facilitada. A modularizao permite que cada mdulo do programa seja escrito, testado e revisado individualmente sem alterar o funcionamento do programa como um todo. Os programadores podem testar suas funes separadamente, permitindo que muitos erros do sistema completo sejam retirados antes que ele esteja totalmente pronto. A modularizao tambm permite que um programa seja escrito por vrios programadores ao mesmo tempo, cada um desenvolvendo um mdulo em separado. como a construo de uma casa, que podemos contratar vrios funcionrios. Esta diviso do trabalho acelera o desenvolvimento dos programas e reduz custos. Uma outra utilizao da modularizao quando um trecho de cdigo utilizado vrias vezes em um programa. Devemos colocar este trecho em um mdulo e, sempre que preciso, fazemos a chamada do mdulo. Com isso, reduzimos a quantidade de linhas de cdigo do programa. A maior parte das linguagens de programao fornece um conjunto de funes (mdulos) que so utilizadas pelos programadores, evitando que o mesmo tenha que implement-las. A utilizao de 65

Programao 2

funes que j existem, diminui o tempo de desenvolvimento do programa. Alm disso, o fato de utilizar uma funo que j foi testada em diversos programas, reduz o risco de erros. como se costuma dizer: no vamos reinventar a roda. Se a funo est pronta, disponvel e correta, o programador no deve perder tempo em implementar a mesma coisa. s fazer uso da mesma. Um exemplo de uso de mdulos que j existem, quando utilizamos alguma funo da biblioteca math, como sqrt (raiz quadrada) e pow (potncia). As prximas sees descrevem como devemos fazer para desenvolver programas modularizados.

3.2. Estrutura de um mdulo


Ao receber um problema, o programador dever verificar se este problema pode ser resolvido com uma soluo particionada ou modularizada. Vamos usar o seguinte exemplo: fazer um programa que calcule a mdia do aluno e verifique se o mesmo foi aprovado ou reprovado. A princpio, podemos pensar que o clculo da mdia do aluno e a descoberta da sua situao (aprovado ou reprovado) sero implementados em dois mdulos. Dessa forma, nosso programa seria formado por 2 mdulos, alm do programa principal. Mas poderemos notar, durante a implementao, que algumas partes de cdigo se repetem em diversos pontos do programa e por isso, elas tambm so candidatas a se tornarem mdulos. A sintaxe para construir mdulos, em C, a seguinte:
Sintaxe

tipo_de_retorno parmetros])

nome_da_funo([declarao

de

{ [declarao de variveis locais] bloco de instrues da funo [return ] }

Toda a declarao de mdulos/funes darieve seguir ao formato acima. As partes entre colchetes so opcionais. Vamos ver o que significa cada componente da estrutura de um mdulo: Tipo_de_retorno: especifica qual o tipo de dado retornado 66

Programao 2

pela funo, podendo ser qualquer tipo de dado da linguagem (int, float, char, etc.). Se a funo no retorna nenhum valor, devemos definir o retorno como void, que significa ausente de retorno. Vale ressaltar que existe apenas um valor de retorno para funes em C. Um exemplo de mdulo que retorna um valor o sqrt, ou seja, ao ser executado, ele nos retorna a raiz quadrada de um nmero. Nome da funo: indica o nome pelo qual o bloco de cdigo correspondente funo ser chamado. atravs do nome da funo que poderemos cham-la quando desejarmos a sua execuo. As regras para nomear um funo so as mesmas que utilizamos para nomear as nossas variveis. Declarao de parmetros: na declarao de parmetros que informamos ao compilador quais sero as entradas da funo. Para cada um dos parmetros deve ser declarado o seu tipo e nome. Se a funo no receber nenhum parmetro, deve-se deixar os parnteses sem nada entre eles. Os parmetros servem para passarmos alguma informao para a funo. A funo sqrt recebe um nmero real como parmetro. Para calcular uma raiz quadrada, a funo precisa que o programador informe de qual valor ser calculada a raiz quadrada. O valor que fornecido a funo, o parmetro. J a funo pow, precisa receber dois parmetros para que possa elevar um nmero a um expoente qualquer. Declarao das variveis locais: as variveis que so especficas de um mdulo so chamadas de variveis locais. Todas as variveis locais devem ser declaradas dentro da funo, antes de qualquer comando. Uma varivel local somente pode ter seu valor acessado dentro da funo em que foi declarada. Um mdulo pode no ter nenhuma varivel local. Corpo da funo: sequncia de comandos que compem a funo. similar ao corpo do programa principal. O corpo de uma funo delimitado por chaves. return: o comando return finaliza a execuo da funo que est sendo executada. Se a funo retornar algum valor (o tipo de retorno no void) este comando obrigatrio. Se a funo tiver retorno do tipo void, este comando no precisa ser colocado. 67

Programao 2

A figura 3.2 apresenta uma funo que calcula a mdia das duas notas de um aluno.

Tipo de retorno

Lista de parmetros Nome da funo

float calc_media(float n1, float n2) { float m; m = (n1 + n2)/2; return m; } Retorno da funo

Varivel Local

Figura 3.2: Funo para calcular a mdia do aluno

Vamos identificar cada parte da estrutura desta funo. Esta funo se chama calc_media e precisa receber dois parmetros para calcular a mdia do aluno. Os parmetros so as duas notas do aluno: n1 e n2. Como cada nota um nmero real, na frente de cada parmetro colocado o seu tipo (float) e separa por vrgula. Mesmo que os parmetros sejam do mesmo tipo, precisamos colocar o tipo de cada parmetro, na frente do seu nome. O objetivo desta funo calcular uma mdia. Dessa forma, ao terminar a sua execuo, a funo ir retornar a mdia do aluno. Por isso, o tipo de retorno da funo float. Como esta funo tem um retorno, no final da sequncia de comandos, devemos colocar o comando return, e ao lado dele, o nome da varivel que tem armazenado o valor que ser retornado. Neste caso, a varivel que tem este valor m. Esta uma varivel local, ou seja, uma varivel que foi declarada dentro deste mdulo. Por conta disto, s pode ser usada no mdulo calc_media. Vamos discutir um pouco mais sobre alguns dos conceitos apresentados, para depois iniciarmos a implementao de mais funes. 68

Programao 2

3.3. Em que ponto do programa os mdulos devem ser implementados?


A execuo de um programa C sempre iniciada pelo main(), que o mdulo principal do programa, por isso ele tem esse nome. Um programa pode ter vrias funes, bem como poder utilizar funes definidas em outros programas. Alm disso, uma funo poder fazer uso de outra funo. Dessa forma, as funes definidas no programa devem ser escritas antes do programa principal. E ainda, se a funcao1, faz uso da funcao2, a funo2 deve ser escrita antes da funcao1. Isto feito por uma razo. Ao compilar o programa, o compilador precisa conhecer, com antecedncia, quais so os tipos de retorno e quais so os parmetros das funes para que o cdigo seja gerado corretamente. por isto que as funes so colocadas antes do programa principal. Quando o compilador chegar no programa principal (main), ele j ter compilado as funes e j saber seus formatos. Quando so utilizadas funes que esto em outros programas, o programador dever informar, atravs da diretiva #include, a biblioteca ou o arquivo onde a funo foi implementada. O caso mais comum o uso de funes que esto nas bibliotecas padro do C, como por exemplo, o comando para limpar o buffer de entrada: fflush(stdin), que se encontra na biblioteca stdio (standard in/out). A figura 3.3 apresenta a nova estrutura dos nossos programas C.
Incluso das Bibliotecas Declarao de Constantes Declarao de Variveis Globais Declarao dos Mdulos Programa Principal
Figura 3.3: Nova estrutura dos programas C

O que temos nesta nova estrutura a seo de declarao de variveis globais, que so as variveis que so utilizadas por todos os mdulos do programa (mais detalhes na prxima seo). Alm da seo de declarao dos mdulos, que vem antes do programa principal. neste ponto do programa que devemos declarar nossos mdulos. 69

Programao 2

3.4. Escopo das Variveis


Quando programamos sem utilizar modularizao, as variveis so declaradas no incio do programa principal. Com esta forma de declarao, as variveis s podem ser acessadas pelo programa principal. Agora que comearemos a programar com mdulos, para que uma varivel possa ser acessada por todos os mdulos do programa, ela deve ser declarada fora de qualquer mdulo. Estas variveis so chamadas de globais. As variveis globais devem ser declaradas fora de qualquer mdulo e programa principal, logo aps a incluso das bibliotecas. Quando programamos de forma modularizada, em alguns casos, uma determinada varivel utilizada apenas por um mdulo especfico, o que no justifica uma definio global, pois somente ser utilizada dentro dos limites do mdulo. Quando isto acontece, a varivel deve ser declarada dentro do mdulo e denominada varivel local. O escopo ou abrangncia de uma varivel indica por quais mdulos do programa esta varivel visvel e pode ser utilizada. Assim, podemos dizer, ento, que as variveis globais so visveis por todos os mdulos, e as variveis locais, so visveis apenas ao mdulo onde esta foi declarada. Podemos ter quantos mdulos quisermos com uma varivel local chamada x, por exemplo, e elas no apresentaro conflito entre si. Vamos analisar a figura 3.4 a seguir:
int A, B, C; Modulo 1 int x, y, z;

Modulo 2 int x, w;

Figura 3.4: Escopo de variveis locais e globais

As variveis A, B e C so globais, portanto, podem ser utilizadas pelos mdulos 1 e 2. No mdulo 1 temos as variveis x, y e z, que s podem ser utilizadas por este mdulo. Dessa forma, o mdulo 2 70

Programao 2

no tem acesso a tais variveis. Notem que, tanto o mdulo 1 quanto o mdulo 2, tem uma varivel chamada x. Variveis com o mesmo nome em mdulos diferentes no causam conflito no programa. Tambm pode ocorrer de uma funo ter uma varivel local com o mesmo nome de uma varivel global, quando isto acontece, a funo dar preferncia varivel local11. Um ponto interessante que devemos atentar ao declarar as variveis do programa que as variveis locais s existem (e consequentemente, ocupam memria) enquanto o mdulo estiver ativo e so destrudas quando a execuo do mdulo termina. Com isso, h uma melhor utilizao da memria do programa.

Ateno
Lembrem que no podemos ter duas variveis globais com o mesmo nome.
11

3.5. Parmetros
Ao desenvolver um mdulo, devemos ficar atentos para que o mesmo seja definido de forma bem genrica, com o objetivo de que este possa ser reutilizado mais vezes. Por exemplo, se criamos um mdulo para calcular 2 elevado a 3, a sua aplicao ser muito restrita. Porm se generalizarmos o mdulo de forma a torn-lo capaz de calcular o valor de qualquer base elevada a qualquer expoente, sua aplicao ser mais abrangente. Portanto, dizemos que um mdulo generalizado quando ele for parametrizado. A utilizao de parmetros nos mdulos funciona de forma muito similar s funes matemticas, como por exemplo:

f (x , y) = x y
em que x e y so parmetros. Essa funo foi definida em termos de parmetros x e y. Para calcularmos a funo para algum valor particular de x e y devemos substitu-los pelos valores dos argumentos desejados.

f (3 , 2) = 3 2 = 9
Uma correspondncia estabelecida entre os parmetros da definio e os argumentos utilizados. No exemplo, o parmetro x foi substitudo pelo 3 e o parmetro y foi substitudo pelo 2. importante perceber que a ordem dos parmetros crucial, pois f(3,2) no o mesmo que f(2,3). Uma funo pode receber qualquer nmero de parmetros. Mas 71

Programao 2

tambm poderemos escrever uma funo que no receba nenhum parmetro. No caso de uma funo sem parmetros pode-se escrevla da seguinte forma: deixando a lista de parmetros vazia, mantendo entretanto os parnteses. O exemplo 3.1 apresenta uma funo sem parmetros.
Exemplo 3.1: funo sem parmetro

1 2 3 4 5

void cabecalho() { system(cls); printf(Faculdade Legal\n); printf(__________________________________\n); }

A funo cabecalho, apresentada no exemplo 3.1 tem o objetivo de limpar a tela e escrever o nome da empresa no incio da tela, alm de passar uma linha logo abaixo. Como esta funo no precisou receber nenhuma informao para a sua execuo, ela no tem parmetros, mas temos que colocar os parnteses em branco logo aps o nome da funo. Esta funo tambm no tem retorno, por isso o tipo de retorno void.

3.6. Contexto do Mdulo (Ao ou Resultado)


Um mdulo possui o contexto de ao quando ele se preocupa com um processo em particular, como por exemplo, o mdulo responsvel por fazer o cadastramento dos dados dos alunos ou o mdulo responsvel por apresentar todos os dados dos alunos cadastrados. Neste tipo de mdulo, teremos a execuo de uma ao que o cadastramento de alunos ou a listagem dos dados dos alunos. Um mdulo possui o contexto de resultado quando a sua caracterstica a de calcular um resultado. Para exemplificar podemos pensar no mdulo que responsvel por calcular a mdia das duas notas de um aluno. Ao ser executado, este mdulo retornar como resultado, a mdia do aluno. A essncia de um mdulo com contexto de resultado que seu conjunto de aes visa um objetivo nico, retornar ao ponto de sua chamada, um valor. Para que um mdulo retorne um valor, em C, ser 72

Programao 2

necessrio que seja indicado qual o valor a ser retornado, o que ser efetuado com a utilizao do comando return. Vamos analisar mais uma vez a funo que calcula a mdia do aluno.
Exemplo 3.2

1 2 3 4 5

float calc_media(float n1, float n2) { float m; m = (n1 + n2)/2; } return m;

A funo calc_media recebe como parmetro as duas notas do aluno e retorna como resultado um float, que a sua mdia. As duas notas passadas como parmetros nas variveis n1 e n2 so somadas e depois divididas por 2. No final da funo, temos o comando return, que retorna o valor da varivel local m, que tem armazenado a mdia do aluno. No necessrio usar o comando return nas funes que no retornam nenhum valor (contexto de ao).

3.7. Ativando Funes


A ativao de um mdulo ocorre quando um determinado ponto do programa contm o identificador do mdulo (nome do mdulo). A ativao conhecida como chamada de um mdulo e serve para execut-lo. Uma chamada de funo feita escrevendo-se o nome da funo seguido dos argumentos fornecidos, entre parnteses. Se no houver argumentos, ainda assim devem ser mantidos os parnteses, para que o compilador diferencie a chamada da funo de uma varivel. As funes s podem ser chamadas depois de terem sido declaradas. Quando queremos chamar uma funo que retorna valor, devemos cham-la atravs de um comando de atribuio, para que o valor que ela retorna de resultado, seja armazenado nesta varivel. Este tipo de funo tambm pode ser chamada/ativada em um comando de sada. Dessa forma, ao invs de armazenamos o resultado, o apresentamos na tela. Durante a chamada de um mdulo, o fluxo de execuo do 73

Programao 2

programa desviado para o mdulo chamado, e logo aps a sua concluso, o fluxo de execuo do programa retorna para o comando seguinte aps a sua ativao. A figura 3.5 mostra a ativao de dois mdulos no programa. Vale lembrar que aps a ativao de um mdulo, todas as suas variveis locais so desalocadas da memria.
main() { comando1; comando2; comando3; comando4; } modulo1(); void modulo1() { comando1; comando2; comando3;

comando5; comando6; void modulo2() { modulo2(); comando1; comando2; comando3; comando7; comando8; }
Figura 3.5: Chamada de Funes

comando4; }

Para ilustrar melhor o assunto explanado, o programa completo 3.1 apresenta um programa que calcula o quadrado de um nmero. Foram definidos dois mdulos, alm do programa principal (main). no main que as funes deste exemplo sero chamadas.

74

Programao 2

Programa Completo 3.1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

void escreva_cabecalho() { system(cls); printf(Encontrar quadrado de um numero\n); printf(_______________________________\n\n); }

int quadrado(int numero) { int q; q = numero*numero; return q; }

main() { int n, r; escreva_cabecalho(); printf(\nInforme o numero: ); scanf(%d, &n); r = quadrado(n); printf(\n\nResultado\n\n); printf(O quadrado de %d = %d\n\n, n, r); getche(); }

O programa comea a sua execuo pelo programa principal (linha 13). Logo no incio, encontra a chamada para a funo escreva_ cabecalho. A funo escreva_cabecalho usada para escrever o ttulo do programa, esta funo, no recebe parmetros, nem retorna nenhum valor, ela apenas escreve um texto na tela. A chamada desta funo foi feita na linha 15, logo aps a declarao das variveis do programa principal. Para chamar esta funo, foi necessrio apenas 75

Programao 2

informar o seu nome e, como ela no tem parmetros, os parnteses so colocados sem nada entre eles. Na sequncia do programa, ser lido o nmero que se deseja calcular o quadrado e logo em seguida feita a chamada da funo quadrado (linha 18). A funo quadrado recebe um parmetro inteiro (que o nmero que se deseja calcular o quadrado) e retorna como resultado um valor inteiro. Como mencionado anteriormente, funes que retornam valor, devem ser chamadas atravs de um comando de atribuio. Neste caso, a varivel r, receber o retorno da funo quadrado. Alm disso, como esta funo precisa saber de qual nmero ser calculado o quadrado, na chamada da funo, entre os parnteses, devemos colocar o valor ou a varivel que ser utilizada no clculo, neste caso, ser passado como parmetro o valor da varivel n. O programa finaliza apresentado o resultado, que o quadrado do nmero (linhas 19 e 20). A figura 3.6 apresenta a tela de execuo do programa completo 3.1

Figura 3.6: Tela de execuo do programa completo 3.1

Nos demais volumes deste livro, estaremos desenvolvendo nossos programas de forma modularizada. Quando passarmos a desenvolver programas maiores, veremos com mais clareza as vantagens de usar a modularizao.

Atividades e Orientaes de Estudos Vamos treinar o desenvolvimento de mdulos? Para cada questo abaixo, crie um programa principal, para que se possa testar/chamar 76

Programao 2

o mdulo desenvolvido. 1. Desenvolva uma funo que recebe as trs notas do aluno como parmetro e retorne a sua mdia. 2. Desenvolva uma funo que recebe dois nmeros inteiros como parmetro, e retorna o resto da diviso do primeiro parmetro pelo segundo. 3. Desenvolva uma funo que receba trs nmeros inteiros como parmetros e retorne o menor valor. 4. Desenvolva uma funo que recebe o ano de nascimento do usurio e retorna a sua idade. Faa o clculo usando o ano atual. 5. Desenvolva uma funo que recebe como parmetro o ms atual e retorna quantos meses faltam para o final do ano. 6. Desenvolva uma funo que recebe como parmetros o dia do ms, o ms e o ano e retorna quantos dias faltam para o final do ms. Lembrem que os meses que tm 28, 29, 30 ou 31 dias. Ser realizado um frum de discusso que discutir sobre modularizao de programas em C. importante que vocs participem ativamente deste frum. uma oportunidade para discutirmos e trocarmos idias sobre este assunto to abrangente. Apaream por l!

Conhea Mais Vocs podem aumentar o entendimento deste assunto lendo o captulo 7 do livro: LAUREANO, Marcos. Programando em C Para Linux, Unix e Windows. Rio de Janeiro: Brasport, 2005.

Vamos Revisar? Vamos fazer uma reviso do assunto que foi visto neste captulo, 77

Programao 2

fazendo a leitura do resumo a seguir: Modularizao um tcnica de programao que tem como objetivo desenvolver o programa de maneira mais simples e legvel. Um mdulo deve ser bem especfico, ou seja, deve ser projetado para resolver uma nica ao. As variveis declaradas dentro de um mdulos so de uso exclusivo deste mdulo e so chamadas de variveis locais. As variveis globais podem ser acessadas por qualquer mdulo do programa. Um programa C comea a sua execuo a partir do programa principal (main). Se o mdulo retornar algum valor, devemos utilizar o comando return. Os mdulos que recebem parmetros tem mais chances de serem reutilizados. Para ativar a execuo de um mdulo, devemos fazer a sua chamada. Ao iniciar a execuo de um mdulo, o fluxo do programa desviado para o mdulo chamado. Ao terminar, o fluxo de execuo do programa volta para o ponto onde o mdulo foi chamado.

78

Programao 2

Consideraes Finais
Neste volume, demos continuidade ao nosso aprendizado na linguagem de programao C. Nos captulos 1 e 2, conhecemos as estruturas de repetio, que tem a capacidade de mudar o fluxo de execuo do programa, desviando de uma parte de comandos ou fazendo com que um grupo de comandos fosse executado vrias vezes. No captulo 3, foi abordada a modularizao, que nos permite uma programao mais organizada, reaproveitamento de cdigo e desenvolvimento do programa em etapas. Esperamos que vocs estejam a cada dia, gostando mais da linguagem de programao C. Temos mais dois volumes, que nos daro a capacidade de desenvolver programas ainda mais complexos. Continuem firmes nos estudos! At o prximo mdulo.

Referncias ARAJO, Jairo. Dominando a Linguagem C. So Paulo: Cincia Moderna, 2004. ASCENIO, Ana Fernanda Gomes e CAMPOS, Edilene Aparecida Veneruchi. Fundamentos de Programao de Computadores. So Paulo: Prentice Hall, 2002. DEITEL, H, M e DEITEL, P. J. Como Programar em C. Rio de Janeiro: LTC, 1999. LAUREANO, Marcos. Programando em C Para Linux, Unix e Windows. Rio de Janeiro: Brasport, 2005. MIZRAHI, Victorine Viviane. Treinamento em Linguagem C Curso Completo. So Paulo: Makron, 1999. MONTGOMERY, Eduard. Programando em C: Simples e Prtico. So Paulo: Alta Books, 2006. OLIVEIRA, Ulisses. Programando em C Volume I Fundamentos. So Paulo: Cincia Moderna, 2004. SCHILDT, Herbert. C Completo e Total. So Paulo: Makron, 1996.

79

Programao 2

Conhecendo a Autora
Snia Virginia Alves Frana Sou graduada em Cincia da computao pela Universidade Federal de Sergipe. Fiz mestrado e doutorado na Universidade Federal de Pernambuco, desenvolvendo pesquisas nas reas de Sistemas Distribudos e Geoprocessamento. Comeei a ensinar em 2000, nos cursos de Cincia da Computao e Sistemas de Informao. Desde o incio da minha carreira como professora, ministro disciplinas de Programao e tenho uma paixo pela linguagem C. Atualmente, encontrei uma nova paixo: Educao a Distncia.

80

Programao 2
Snia Virginia Alves Frana

Recife, 2009

Universidade Federal Rural de Pernambuco Reitor: Prof. Valmar Corra de Andrade Vice-Reitor: Prof. Reginaldo Barros Pr-Reitor de Administrao: Prof. Francisco Fernando Ramos Carvalho Pr-Reitor de Extenso: Prof. Paulo Donizeti Siepierski Pr-Reitor de Pesquisa e Ps-Graduao: Prof. Fernando Jos Freire Pr-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira Pr-Reitora de Ensino de Graduao: Prof. Maria Jos de Sena Coordenao de Ensino a Distncia: Prof Marizete Silva Santos Produo Grfica e Editorial Capa e Editorao: Allyson Vila Nova, Rafael Lira, Italo Amorim e Marcella Almeida Reviso Ortogrfica: Marcelo Melo Ilustraes: Diego Almeida e Glaydson da Silva Coordenao de Produo: Marizete Silva Santos

Sumrio
Apresentao ........................................................................................5 Conhecendo o Volume 3 ......................................................................6 Captulo 1 Armazenamento de Dados em Vetores .........................8 1.1 O que so vetores? ......................................................................8 1.2 Declarao de Vetores .................................................................9 1.3 Referncia a elementos de vetor ................................................ 11 1.4 Inicializao de vetores ..............................................................13 1.5 Leitura de elementos para o vetor ..............................................15 1.6 Impresso dos elementos de um vetor.......................................22 1.7 Tamanho de um vetor e segmentao de memria ...................27 1.8 Passando vetores como parmetros de funes .......................28 Captulo 2 Armazenamento de Dados em Registros ....................35 2.1 O que so registros? ..................................................................35 2.2 Declarao de um Registro ........................................................36 2.3 Acessando os campos do registro ..............................................39 2.4 Vetor de registro .........................................................................40 2.5 Acessando os campos do vetor de registro ................................42 2.6 Usando vetor de registro ............................................................43

Captulo 3 Armazenamento de Dados em Arquivos .....................61 3.1 O que so arquivos?...................................................................61 3.2 Comandos para manipular arquivos binrios .............................64 3.3 Implementao das operaes bsicas em um arquivo.............76 Consideraes Finais .......................................................................102 Conhecendo a Autora .......................................................................104

Apresentao
Caro(a) aluno(a), Seja bem-vindo (a) ao terceiro mdulo da disciplina Programao II. Neste mdulo, vamos dar mais um passo no nosso aprendizado sobre a linguagem de programao C. Nos dois volumes anteriores, aprendemos os comandos bsicos do C, a utilizar as estruturas de controle (seleo e repetio) e a modularizar nossos programas em mdulos ou funes. Com estes assuntos, adquirimos a capacidade de desenvolver programas mais elaborados. Neste livro, ns vamos aprender novas formas de armazenar nossos dados. Com os vetores e registros, poderemos manusear um volume maior de dados, de forma facilitada. Outro assunto muito importante que ser abordado neste volume o armazenamento de dados em arquivos. Atualmente, ao terminar a execuo do programa, todos os dados que foram digitados so perdidos. Com o armazenamento de dados em arquivos, isto no acontece. Assim, iremos desenvolver programas com operaes como: cadastro de elementos, remoo, alterao, consultas, listagens, etc. Continuem resolvendo as questes propostas no final de cada captulo, alm de executar buscas na Internet, visando um maior aprofundamento de cada assunto. Ao final deste mdulo, teremos a capacidade de resolver questes com operaes presentes nos principais sistemas de controle do mercado, como por exemplo: sistema de controle de estoque, sistema de controle de cliente, etc. Vamos comear mais uma nova etapa no conhecimento da linguagem de programao C? Bons estudos! Professora Snia Virginia Alves Frana

Programao 2

Conhecendo o Volume 3
Neste terceiro volume, vocs iro encontrar o mdulo 03 da disciplina: Programao II. Este volume est estruturado em trs captulos, que sero estudados ao longo de 15h/aula. Para facilitar seus estudos, veja a organizao deste volume. Captulo 1: Armazenamento de Dados em Vetores Carga Horria do Captulo 1: 5 h/aula Objetivos do Captulo 1: Apresentar o uso de vetores para o armazenamento de dados. Contedo Programtico do Captulo 1 Definio de vetores; Declarao, leitura e escrita de dados em vetores; Passagem de vetores como parmetros de funes; Captulo 2: Armazenamento de Dados em Registros Carga Horria do Captulo 2: 5 h/aula Objetivos do Captulo 2: Apresentar o uso de registros para o armazenamento de dados. Contedo Programtico do Captulo 2 Definio de registros; Declarao, leitura e escrita de dados em registros; Vetor de registro; Captulo 3: Armazenamento de Dados em Arquivos Carga Horria do Captulo 3: 5 h/aula Objetivos do Captulo 3: Apresentar os principais comandos para o armazenamento de dados em arquivos. Com os arquivos, os dados manipulados no programa podem ser armazenados definitivamente. Contedo Programtico do Captulo 3 Definio de arquivos; 6

Programao 2

Ponteiros;

Comandos para manipulao de dados em arquivos; Ao final de cada captulo vocs encontraro: A seo Atividades e Orientaes de Estudo: que contm exerccios para a fixao do assunto estudado, alm de indicao de fruns de discusso. A seo Conhea Mais: que contm dicas de sites e livros que devem ser lidos para ampliar os seus conhecimentos. A seo Vamos Revisar?: que apresenta um resumo dos principais tpicos abordados no captulo.

Programao 2

Captulo 1 Armazenamento de Dados em Vetores


Vamos conversar sobre o assunto? Neste terceiro volume, vamos aprender novas formas de armazenar nossos dados. Comearemos aprendendo como armazenar os dados em vetores. Com os vetores, ns podemos armazenar um grande conjunto de dados, facilitando o acesso e manuseio dos mesmos. Os dados so a alma de um programa. Assim, a manipulao dos dados de forma mais adequada e facilitada, trar ganhos para o programa e para o programador. Vamos continuar a nossa caminhada?

1.1 O que so vetores?


Imaginem que um professor nos encomendou um programa, que tenha que armazenar as mdias dos 50 alunos de uma turma. Como faramos para armazenar essas mdias? At o ponto que estudamos a linguagem C, teramos que declarar 50 variveis do tipo float, uma por uma. Que trabalheira, no mesmo? E se o professor tivesse 300 alunos? Passaramos um tempo s declarando variveis e, alm disso, teramos muito trabalho para fazer o controle das mesmas. Mas no se preocupem, com os vetores, o professor pode ter mais de 1000 alunos, que a declarao e manuseio dos dados ser bem fcil.
Saiba Mais
Em ingls, um vetor chamado de array (que significa cadeia). Assim, quando temos um array, temos uma cadeia de inteiros, reais ou caracteres.
1

Os vetores so usados quando precisamos armazenar um conjunto de dados do mesmo tipo. Por exemplo: armazenar as 50 mdias dos alunos de uma turma (todas as mdias so do tipo float). Os vetores so bem convenientes j que iremos colocar todas as informaes dentro de um mesmo conjunto e faremos referncia de cada dado, individualmente, atravs de um ndice1. De maneira mais formal, os vetores so chamados de estruturas de dados homogneas (j que armazenam dados do mesmo tipo). Os vetores so formados por dados de mesmo tipo (homogneo) e possuem nmero fixo de elementos (esttico). Para entendermos melhor os vetores, vamos visualizar a sua representao grfica, na figura 1.1.

Programao 2

media

3.0 0

7.5 1

5.8 2

9.5 3

8.2 4

Figura 1.1: Representao grfica de um vetor

Na figura 1.1 temos um vetor chamado media, formado por 5 elementos. Vocs lembram quando tnhamos uma varivel simples? Representvamos com uma nica caixa. Agora, com os vetores, teremos um conjunto de dados, por isso ele formado por vrias caixas. Em cada uma delas poderemos armazenar um valor. Todas as caixas tm um nico nome. Neste exemplo, o vetor se chama media. Notem que, abaixo de cada caixa temos um nmero. Estes nmeros so chamados de ndices. atravs do ndice, que iremos informar qual das caixas do vetor que estamos querendo acessar. J que todas as caixas tm um nico nome (media), a forma de diferenciar uma da outra o ndice. Entenderam? Na linguagem C, o ndice de um vetor, comea a partir de 0. Assim, em um vetor com 5 elementos, os ndices variam de 0 a 4 (como no exemplo da figura 1.1). Por isso, o primeiro elemento do vetor media est na posio de ndice 0. Podemos dizer que a mdia do segundo aluno est na posio de ndice 1 do vetor media, e igual a 7.5. Esta no a nica maneira de estruturar um conjunto de dados. Tambm podemos organizar dados sob forma de tabelas. Neste caso, cada dado referenciado por dois ndices e dizemos que se trata de um conjunto bidimensional (ou matriz). Vamos aprender, nas prximas sees, como manusear os vetores nos nossos programas.

1.2 Declarao de Vetores


Como j foi mencionado, um vetor um conjunto de variveis do mesmo tipo, que possuem um nome identificador e um ndice de referncia. A sintaxe para a declarao de um vetor a seguinte:
Sintaxe

tipo identificador[tamanho];

Programao 2

onde: tipo: o tipo de dados que o vetor armazena: int, float, char, etc. identificador: o nome do vetor. As regras para nomear um vetor so as mesmas usadas para nomear variveis, constantes e funes. tamanho: o tamanho do vetor. Isto , o nmero de elementos que o vetor pode armazenar. A seguir, so apresentados exemplos de declaraes de vetores. Os vetores so declarados na seo de declarao de variveis do programa. Se estivermos desenvolvendo um programa modularizado, podemos declarar o vetor como uma varivel local de um mdulo.
Exemplo 1.1: declarao de vetores

1 2 3
Ateno
2 Ns j havamos utilizado vetor de caracteres, j que trabalhamos com variveis que armazenam uma cadeia de caracteres. No prximo volume, teremos um captulo dedicado a este assunto.

int idade[100]; float nota[25]; char nome[80];

No primeiro exemplo, temos a declarao de um vetor chamado idade, que pode armazenar at 100 nmeros inteiros. No segundo exemplo, temos um vetor chamado nota, com capacidade para armazenar at 25 nmeros reais. E, finalmente, no terceiro exemplo, temos um vetor chamado nome, com capacidade de armazenar at 80 caracteres2. Ao declararmos o vetor, j temos que ter uma previso de quantos elementos sero armazenados no mesmo. Com isso, o processador saber quanto de memria precisa ser reservada para armazenar os dados do vetor, ao executar o programa. A quantidade de memria (em bytes) usada para armazenar um vetor pode ser calculada como:
quantidade de memria = tamanho do tipo * tamanho do vetor

O tamanho do tipo indica quantos bytes um determinado tipo de varivel utiliza para ser armazenado (vimos este assunto no Volume 1 Captulo 3). Ao compilar o programa, a quantidade de memria necessria para armazenar o vetor alocada. Os vetores tm tamanhos fixos e no podemos armazenar mais elementos do que a quantidade que foi solicitada no momento da declarao do vetor. Por 10

Programao 2

isso, so chamados de estticos. A quantidade de elementos no pode aumentar em tempo de execuo do programa. Tambm possvel declarar um vetor com tamanho parametrizado: usando uma constante. Declaramos uma constante com a diretiva #define, no incio do programa, e depois declaramos o vetor com esta constante como tamanho do vetor. Deste modo, podemos alterar o nmero de elementos do vetor antes de qualquer compilao do programa. Esta uma maneira simples de administrar o espao de memria usado pelo programa, e tambm testar os limites de um vetor.
Exemplo 1.2: Declarao de vetor usando uma constante no local do tamanho do vetor.

1 2

#define TAMANHO 30 int valor[TAMANHO];

No exemplo 1.2, o vetor valor ter capacidade de armazenar 30 elementos (este o valor da constante TAMANHO).

1.3 Referncia a elementos de vetor


Agora que j sabemos como criar os vetores, a partir da sua declarao, vamos aprender como acessar um elemento do vetor. Segue abaixo a sintaxe.
Sintaxe

identificador[indice]

onde: identificador: o nome do vetor que queremos acessar. ndice: o ndice do elemento do vetor que queremos acessar. Cada elemento do vetor referenciado pelo nome do vetor e, entre colchetes, tem-se o ndice, que um nmero inteiro. O ndice ir indicar qual elemento do vetor estamos querendo referenciar. A seguir, so apresentadas algumas atribuies a elementos de um vetor chamado valor, que composto por 10 elementos do tipo float.

11

Programao 2

Exemplo 1.3: Acessando os elementos de um vetor

1 2 3 4 5 6

float valor[10]; int x; x = 3; valor[1] = 6.6; valor[x] = 9.9 valor[x+2] = 10.0;

//declarao do vetor

Entre os colchetes, que indicam o ndice do vetor que ser acessado, podemos ter: um valor (exemplo da linha 4), uma varivel (exemplo da linha 5) ou uma expresso (exemplo da linha 6). Devemos ter cuidado quando usamos variveis e expresses, pois estas devem ser inteiras e devem ter um valor dentro da capacidade de armazenamento do vetor. Ou seja, se o vetor foi declarado com tamanho 10, no podemos tentar acessar o ndice 18 do vetor. Na linha 4, foi atribudo 6.6 ao elemento de ndice 1 do vetor valor. Na linha 5, como a varivel x tem armazenado 3, ento o valor[3], receber 9.9. Quando temos uma expresso, que o caso da linha 6, a expresso resolvida primeiro. Assim, como x = 3, e entre os colchetes temos x+2, o resultado ser 5. Dessa forma, valor[5] receber 10.0. A seguir, temos a situao final do vetor valor, aps as atribuies dos valores do exemplo.
Valor 0 6.6 1 2 9.9 3 4 10.0 5 6 7 8 9

Figura 1.2: Situao do vetor valor aps atribuies

Viram como fcil trabalhar com vetor? Em uma nica linha, ns criamos um conjunto de variveis, do tamanho da nossa necessidade. Posteriormente, acessamos cada uma destas variveis utilizando o nome do vetor e o ndice da varivel. Na prxima seo, vamos ver como fazemos para inicializar os elementos de um vetor, no momento da declarao.

12

Programao 2

1.4 Inicializao de vetores


No momento da declarao de um vetor, tambm podemos inicializar os seus elementos, fazendo a atribuio de valores aos mesmos. A sintaxe para a inicializao dos elementos de um vetor a seguinte:
Sintaxe

tipo identificador[tamanho] = {lista de valores};

Onde: tipo: o tipo dos elementos do vetor: int, float, char, etc. identificador: o nome do vetor. tamanho: o tamanho do vetor. Isto , o nmero de elementos que o vetor pode armazenar. lista de valores: uma lista, separada por vrgulas, dos valores de cada elemento do vetor. A lista de valores colocada entre chaves. Vamos ver a seguir, exemplos de inicializao de vetores.
Exemplo 1.4: Inicializao de vetores

1 2 3 4

int idade[7] = {12, 30, 14, 7, 13, 15, 6}; char vogal[5] = {a, e, i, o, u}; float nota[5] = {8.4, 6.9, 4.5}; float media[5] = {0};

No exemplo da linha 1, temos o vetor chamado idade e para cada posio do vetor, foi atribudo um valor. Aps esta atribuio, o vetor idade ficar assim:
idade 12 0 30 1 57 2 25 3 18 4 15 5 13 6

Figura 1.3: Situao do vetor idade aps inicializao

No segundo exemplo, temos um vetor de caracteres, chamado vogal. Quando inicializamos um vetor deste tipo de varivel, os valores 13

Programao 2

devem ser colocados entre apstrofo. Ao final desta atribuio, o vetor vogal ficar como mostra a figura 1.4.
vogal a 0 e 1 i 2 o 3 u 4

Figura 1.4: Situao do vetor idade aps inicializao

Na linha 3, temos a inicializao do vetor nota, que composto por cinco elementos. Notem que, entre as chaves, no temos cinco valores. Temos apenas trs. Quando no quisermos inicializar todo o vetor, podemos colocar apenas os valores dos primeiros elementos, e aos demais, ser atribudo zero (automaticamente). Vejam na figura 1.5 como ficar o vetor nota, aps a sua inicializao.
nota 8.4 0 6.9 1 4.5 2 0.0 3 0.0 4

Figura 1.5: Situao do vetor idade aps inicializao

Seguindo o raciocnio do exemplo anterior, quando precisarmos inicializar todos os elementos do vetor com zero, fazemos como mostra o exemplo da linha 4. Colocamos apenas um zero entre as chaves, o primeiro elemento ser inicializado com zero, e os demais tambm. Neste caso, o vetor media ficar como apresentado na figura 1.6.
media 0.0 0 0.0 1 0.0 2 0.0 3 0.0 4

Figura 1.6: Situao do vetor media aps inicializao

Opcionalmente, podemos inicializar os elementos do vetor enumerando-os um a um. No exemplo 1.5, a seguir, observem que estas duas inicializaes so possveis:

14

Programao 2

Exemplo 1.5: Inicializao de vetores

1 2 3 4 5 6

int valor[3] = {7,4,20}; ou int valor[3]; valor[0] = 7; valor[1] = 4; valor[2] = 20;

Na prxima seo, vamos aprender a armazenar, em um vetor, valores que so fornecidos via teclado.

1.5 Leitura de elementos para o vetor


Agora suponham que os valores que vo ser armazenados no vetor sejam fornecidos pelo usurio, via teclado. O que devemos fazer? Devemos utilizar uma estrutura de repetio, para controlar o preenchimento dos dados no vetor, um por um. Assim, podem ocorrer duas situaes: Ns sabemos quantos elementos o usurio vai digitar; Ns no sabemos a quantidade de elementos que o usurio vai digitar. Vamos ver como tratar cada uma das situaes? Quando ns sabemos quantos elementos o usurio vai digitar, poderemos usar uma estrutura de repetio como o for, que ir repetir a leitura dos elementos, na quantidade definida. Vamos ver o Programa Completo 1.1 a seguir: o usurio precisa armazenar 5 elementos em um vetor de inteiros, chamado valor.

15

Programao 2

Programa Completo 1.1: Ler 5 nmeros inteiros, armazenando-os em um vetor

1 2 3 4 5 6 7 8 9 10 11

main() { int valor[5]; int i; printf(Cadastro dos elementos do vetor Valor \n\n); for (i=0; i<5; i++) { printf(\n\nElemento %d: ,i+1); scanf(%d,&valor[i]); } getche(); }

Comentrios sobre o Programa Completo 1.1: Linha 3: declarao do vetor valor, que tem a capacidade de armazenar 5 nmeros inteiros. Linha 4: declarao da varivel i, que ir controlar o for. Linha 5: printf para que o usurio saiba que ser feito o cadastro dos elementos no vetor. Linha 6: for que ser repetido 5 vezes, fazendo a leitura dos elementos do vetor. Notem que a varivel de controle do for, o i, inicializado com 0. Isso acontece porque o primeiro ndice do vetor 0. Linha 7: Abre chaves que inicia a sequncia de comandos do for (j que teremos mais de um comando). Nesta linha, tambm temos o printf para que o usurio saiba qual elemento do vetor est sendo cadastrado no momento. Vejam que neste printf temos a expresso: i+1. O motivo de colocarmos esta expresso no printf que, como o i comea com zero e vai at 4, no ficaria muito interessante que sasse uma mensagem, na tela, informando que o usurio estaria cadastrando o elemento 0. O correto dizer que ele est cadastrando o elemento 1. Por 16

Programao 2

isso, usamos a expresso i+1. Linha 8: scanf que l o valor, armazenando no vetor. Notem que estamos usando a varivel i, no ndice do vetor. Dessa forma, o i vai variando a cada vez que o for repetido, e assim, os elementos so armazenados em ndices diferentes do vetor. Com isso, nenhum elemento ir sobrepor o outro. Linha 9: fecha chaves que indica o final da sequncia de comandos do for. Linha 10: comando getche que faz com que a tela de execuo do programa fique aberta, e assim podemos ver o resultado do programa. Linha 11: fecha chaves, indicando o final do programa principal. A figura 1.7, apresenta a tela de execuo do Programa Completo 1.1.

Figura 1.7: Tela de execuo do Programa Completo 1.1

Para facilitar o entendimento, vamos fazer um acompanhamento dos valores das variveis do Programa Completo 1.1, ao longo da sua execuo. Vamos considerar que o usurio est cadastrando os valores apresentados na figura 1.7. A figura 1.8 mostra os valores das variveis do programa, conforme o programa vai sendo executado.

17

Programao 2

i 0

i+1 1 10 0 10 0 1 15 1

valor

10 0 10 0

15 1 15 1

9 2 9 2 3 6 3 4 4

10 0

15 1

9 2

6 3

12 4

Figura 1.8: Acompanhamento das variveis do Programa Completo 1.1

O que fazemos quando no sabemos quantos elementos sero armazenados no vetor? Neste caso, como no sabemos quantas vezes o for deve ser executado, poderemos fazer a leitura dos dados que sero colocados no vetor, usando um do/while, como mostra o Programa Completo 1.2, a seguir. Neste programa, iremos fazer a leitura de uma quantidade indeterminada de nmeros inteiros, armazenando em um vetor.

18

Programao 2

Programa Completo 1.2: Ler um conjunto de nmeros inteiros, armazenando-os em um vetor.

1 2 3 4 5 6 7 8 9 10 11 12 13

main() { int valor[5]; int q, continuar; q=0; printf(Cadastro dos elementos do vetor Valor \n\n); do { printf(\n\nElemento %d: ,q+1); scanf(%d,&valor[q]); q++; printf(\n\nCadastrar (1-sim/2-nao)? ); scanf(%d, &continuar); } while ((continuar==1) && (q<5)); } outro elemento

Neste caso, a leitura ser finalizada quando o vetor ficar cheio, com cinco elementos, ou quando o usurio decidir que no deseja mais continuar a leitura. Neste ltimo caso, saberemos quantos elementos foram armazenados no vetor atravs da varivel q. esta varivel que indica, tambm, em qual ndice do vetor o elemento deve ser armazenado3. Comentrios sobre o Programa Completo 1.2: Linhas 2: declarao do vetor valor, que tem a capacidade de armazenar 5 nmeros inteiros. Linha 3: declarao das variveis q (que controla a quantidade de elementos que j foram cadastrados no vetor) e continuar (que armazena a resposta do usurio informando se quer cadastrar mais elementos ou no). Linha 4: inicializao da varivel q com 0. Linha 5: printf para que o usurio saiba que ser feito o cadastro 19

Ateno
3 Quando no sabemos quantos elementos sero cadastrados, temos que estipular um valor para a quantidade de elementos que sero armazenados no vetor. Isso se d porque temos que saber o tamanho do vetor no momento da sua declarao.

Programao 2

dos elementos no vetor. Linha 6: do indicando o incio da repetio. Linha 7: Abre chaves que inicia a sequncia de comandos do do/while (j que teremos mais de um comando). Nesta linha tambm temos o printf para que o usurio saiba qual elemento do vetor est sendo cadastrado no momento. Linha 8: scanf que l o valor que ser armazenado no vetor. Notem que estamos usando a varivel q, no ndice do vetor. Linha 9: incremento da varivel q, indicando que mais um elemento foi cadastrado no vetor. Atravs do valor de q, saberemos se o vetor j est cheio ou no. Linha 10: prinft que pergunta ao usurio se deseja cadastrar outro elemento no vetor. O usurio pode parar o cadastro dos elemento do vetor, no momento que ele desejar. Nesse caso, o vetor pode ficar com posies sem valores armazenados. Linha 11: scanf para ler a resposta do usurio. Linha 12: fecha chaves do do/while e while com a condio que faz com que a repetio fique sendo executada. Como a condio formada por duas expresses relacionais, ns colocamos cada expresso relacional entre parnteses e depois colocamos toda a expresso entre parnteses. As expresses esto conectadas pelo operador && (e). Com isso, quando uma das expresses der falso, a repetio para. Vai parar porque o vetor est cheio (q=5) ou porque o usurio desejou parar, respondendo 2 a pergunta se deseja continuar. Linha 13: fecha chaves, indicando o final do programa principal. A figura 1.9, apresenta a tela de execuo do Programa Completo 1.2.

20

Programao 2

Figura 1.9: Tela de execuo do Programa Completo 1.2

Vamos acompanhar o valor das variveis do Programa Completo 1.2? A Figura 1.9 mostra o cadastramento de 3 elementos no vetor. O usurio respondeu que no queria mais cadastrar aps dar entrada ao terceiro elemento. A figura 1.10 mostra os valores das variveis do programa, conforme o programa vai sendo executado.
q q+1 12 0 1 2 3 4 valor

12 0

15 1 2 3 4

12 0

15 1

18 2 3 4

Figura 1.10: Acompanhamento das variveis do Programa Completo 1.2

Agora que j sabemos colocar informaes em um vetor via teclado, vamos ver como apresentar, na tela, os valores armazenados em um vetor.

21

Programao 2

1.6 Impresso dos elementos de um vetor


Quando desejarmos apresentar os elementos que esto armazenados no vetor, devemos utilizar uma estrutura de repetio, que far com que cada uma das posies do vetor seja visitada e seu contedo apresentado. Vale lembrar que, quando declaramos um vetor, indicamos a sua capacidade de armazenamento. Mas durante a execuo do programa, pode ser que o usurio no armazene dados suficiente para preencher todas as posies do vetor. Assim, quando formos imprimir os dados de um vetor, precisamos saber quantos elementos tm armazenado no momento da impresso. O Programa Completo 1.3, mostra a leitura e a impresso dos dados armazenados em um vetor.
Programa Completo 1.3: Ler e imprimir um conjunto de nmeros inteiros, armazenando-os em um vetor.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

main() { int valor[5]; int q, continuar, i; q=0; printf(Cadastro dos elementos do vetor Valor \n\n); do { printf(\n\nElemento %d: ,q+1); scanf(%d,&valor[q]); q++; printf(\n\nCadastrar (1-sim/2-nao)? ); scanf(%d, &continuar); } while ((continuar==1) && (q<5)); printf(\n\nElementos do Vetor: ); for (i=0; i<q; i++) printf( %d ,valor[i]); getche(); } outro elemento

22

Programao 2

At a linha 12, o Programa Completo 1.3 , praticamente, idntico ao Programa Completo 1.2. A nica diferena que temos, na linha 3, a declarao da varivel i, que ser usada no for que imprimir os elementos do vetor. Vamos ver o que est acontecendo nas demais linhas? Linha 13: printf para informar que sero apresentados os elementos do vetor. Notem que o texto entre aspas no termina com \n. Isso se d porque no queremos que o cursor v para a linha seguinte. Linha 14: for que ser utilizado para percorrer o vetor, acessando cada uma das posies do vetor. A varivel que tem a informao de quantos elementos foram armazenados no vetor q. Dessa forma, o i do for vai variar de 0 at q-1. Uma vez que se q for 3, a ltima posio ocupada no vetor 2. Linha 15: printf que apresenta o elemento do vetor, na posio de ndice i. Este printf tambm no tem o \n, porque queremos que os elementos do vetor sejam impressos um ao lado do outro. Este o nico comando do for, por isso no houve a necessidade de delimitar com chaves. Linha 16: getche que evita o fechamento da janela de execuo do programa, e assim poderemos ver os elementos do vetor impresso. Linha 17: fecha chaves, indicando o final do programa principal. A figura 1.11 apresenta a tela de execuo do programa 1.3. Foram cadastrados os mesmos valores do exemplo anterior.

23

Programao 2

Figura 1.11: Tela de execuo do Programa Completo 1.3

Neste caso, apesar do vetor ter sido declarado com 5 posies, s foram preenchidas 3 posies. Vejam que, aps o usurio responder que no quer mais cadastrar, os elementos do vetor so apresentados um ao lado do outro. Vamos ver outro Programa Completo? Neste programa iremos ler as matrculas e notas dos alunos de uma turma e imprimir as matrculas dos alunos de tiveram nota acima da mdia das notas da turma.
Programa Completo 1.4

1 2 3 4 5 6 7 8 9 10

main() { int mat[10]; float nota[10]; int q, i, continuar; float soma, media; soma = 0; q=0; do { system(cls);

printf(Universidade Aberta do Brasil UFRPE\n\n);

24

Programao 2

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

q+1);

printf(\n\nDados

do

Alunos

%d\n\n,

printf(\nMatricula: ); scanf(%d,&mat[q]); printf(\nNota: ); scanf(%f,&nota[q]); soma = soma + nota[q]; q++; ); printf(\n\nCadastrar outro(1-sim/2-nao)? scanf(%d, &continuar); } while ((continuar==1) && (q<10)); media = soma/q; system(cls); printf(Universidade Aberta do Brasil - UFRPE \n\n); printf(Media da turma: %.2f\n\n\n,media); printf(Alunos turma\n\n); com nota acima da media da

for (i=0; i<q; i++) { if (nota[i]>media) printf(%d \n,mat[i]); } ); printf(\n\nDigite getche(); } qualquer tecla para sair

Comentrios sobre o Programa Completo 1.4: Linhas 2 a 5: declarao das variveis do programa. Vejam que precisamos de um vetor para armazenar as matrculas e um outro para armazenar as notas. 25

Programao 2

Linhas 6 e 7: inicializao das variveis soma (que acumula as notas de todos os alunos) e q (que conta quantos elementos foram cadastrados no vetor). Linhas 8 a 20: do/while que faz a leitura das matrculas e das notas de cada aluno, armazenando nos respectivos vetores. Neste do/while, o usurio pode parar o cadastro no momento que ele desejar. Para calcularmos a mdia da turma, temos que somar as notas de todos os alunos e dividir pela quantidade de alunos. Assim, enquanto estivermos no do/while, estamos acumulando as notas de todos os alunos na varivel soma. Linha 21: ao sair do do/while, a mdia da turma pode ser calculada. Linha 22: usa o system(cls) para limpar a tela e dar incio a tela que ir apresentar os resultados. Linha 24: printf para apresentar a mdia da turma. Linhas 26 a 29: for para visitar cada posio do vetor que armazena as notas dos alunos. Quando verifica que a nota do aluno maior que a mdia da turma (armazenada na varivel media), a matrcula do aluno apresentada. A figura 1.12 apresenta a tela de execuo do programa 1.4, na fase do cadastramento dos dados dos alunos (matrcula e nota).

Figura 1.12: Tela de Execuo do Programa Completo 1.4 Cadastro de Alunos

A figura 1.13 apresenta a tela de execuo do programa completo 1.4, na fase do apresentao dos resultados.

26

Programao 2

Figura 1.13: Tela de Execuo do Programa Completo 1.4 Apresentao dos Resultados

1.7 Tamanho de um vetor e segmentao de memria


Na linguagem C, devemos ter cuidado com os limites de um vetor. Embora na declarao tenhamos que definir o tamanho de um vetor, o C no faz nenhum teste de verificao de acesso a um elemento dentro do vetor ou no. Por exemplo, se declaramos um vetor como int valor[5], teoricamente, s tem sentido usarmos os elementos valor[0], valor[1], valor[2] , valor[3] e valor[4]. Porm, o C no acusa erro se usarmos valor[12] em algum lugar do programa. Estes testes de limite devem ser feitos dentro do programa, pelo programador. Este fato se deve maneira como o C trata os vetores. A memria do computador um espao (fsico) particionado em pores de 1 byte. Se declararmos um vetor como int valor[3], estamos reservando 12 bytes (3 segmentos de 4 bytes lembrando que cada int ocupa 4 bytes) de memria para armazenar os seus elementos. O primeiro segmento ser reservado para valor[0], o segundo segmento para valor[1] e o terceiro segmento para valor[2]. O segmento inicial chamado de segmento base, de modo que valor[0] ser localizado no segmento base. Quando acessamos o elemento valor[i], o processador acessa o segmento localizado em base+i. Se i for igual a 2, estamos acessando o segmento base+2 ou valor[2] (o ltimo segmento reservado para o vetor). Porm, se i for igual a 7, estamos acessando o segmento base+7 que no foi reservado para os elementos do vetor e que provavelmente est sendo usado por uma outra varivel ou contm uma informao inesperada (lixo). 27

Programao 2

Observem que o acesso a um segmento fora do espao destinado a um vetor pode destruir informaes reservadas de outras variveis. Estes erros so difceis de detectar, pois o compilador no gera nenhuma mensagem de erro. Por isso, a soluo mais adequada sempre avaliar os limites de um vetor antes de manipul-lo. Como feito no Programa Completo 1.2 que vai cadastrando os elementos no vetor e para quando o vetor completa a sua capacidade. A princpio, este fato poderia parecer um defeito da linguagem, mas na verdade trata-se de um recurso muito poderoso do C. Poder manipular sem restries todos os segmentos de memria uma flexibilidade apreciada por programadores mais experientes.

1.8 Passando vetores como parmetros de funes


Os vetores, assim como as variveis simples, podem ser usados como argumentos de funes. Veremos como se declara uma funo que recebe um vetor como parmetro e como se chama uma funo passando um vetor como parmetro. A sintaxe de uma funo que recebe um vetor como parmetro a seguinte:
Sintaxe

tipo_retorno nome_funo(tipo_vetor nome_vetor[]) { //corpo da funo }

Onde: tipo_retorno: o tipo de retorno da funo. nome_funo: o nome da funo. tipo_vetor: o tipo de dados dos elementos do vetor. nome_vetor: o nome do vetor. Observe que depois do nome do vetor temos o [ e o ], mas no colocamos nada entre eles. Neste caso, no necessrio informar o tamanho do vetor. Quando formos chamar uma funo que recebe um vetor como 28

Programao 2

parmetro, usamos a seguinte sintaxe:


Sintaxe

nome_da_funo(nome_do_vetor);

Onde: nome_da_funo: o nome da funo que ser chamada. nome_do_vetor: o nome do vetor que queremos passar como parmetro. Neste caso, indicamos apenas o nome do vetor, sem os colchetes. O exemplo 1.6, a seguir, apresenta a declarao de uma funo que tem um vetor como parmetro e a chamada da funo.
Exemplo 1.6: declarao e chamada de uma funo que tem um vetor como parmetro

1 2 3 4 5 6 7 8 9 10 11 12

float media(float vetor[],float N) { //corpo da funo }

main() { float valor[30]; // declarao do vetor float n; ... med = media(valor, n); // passagem do vetor para a funo ... }

Ateno: Ao contrrio das variveis comuns, o contedo de um vetor pode ser modificado pela funo chamada. Isto significa que podemos passar um vetor para uma funo e alterar os valores de seus elementos. Isto ocorre porque a passagem de vetores para funes feita de modo especial dito passagem por endereo. Portanto, devemos ter cuidado ao manipular os elementos de um 29

Programao 2

vetor dentro de uma funo para no modific-los por descuido.

Atividades e Orientaes de Estudos Vamos fazer um conjunto de exerccios, usando o assunto que acabamos de aprender? Segue abaixo uma lista de exerccios em que os dados sero armazenados em vetores. Vamos comear? 1. Ler um conjunto de nmeros e imprimi-los na ordem inversa da leitura. A quantidade de nmeros tambm ser lida e ser no mximo 10. 2. Ler o tamanho e os elementos de dois vetores e, em seguida, caso os vetores tenham o mesmo tamanho, gere e imprima o vetor SOMA, onde seus elementos sero formados pela soma dos elementos de mesmos ndices dos dois vetores lidos. Exemplo:
A 1 0 4 1 7 2 2 3 9 4

3 0

5 1

11 2

4 3

8 4

Soma

4 0

9 1

18 2

6 3

17 4

3. Ler um vetor de nmeros e imprimir os valores armazenados nas posies PARES e, em seguida, os valores armazenados nas posies MPARES. Exemplo:
V 1 0 4 1 7 2 2 3 9 4

Valores nas posies pares: 1 7 9 30

Programao 2

Valores nas posies impares: 4 2 4. Ler dois vetores e caso tenham tamanhos iguais, armazene seus elementos alternadamente em um terceiro vetor. Exemplo:
A 1 0 4 1 7 2 2 3 12 4

3 0

5 1

11 2

4 3

15 4

Resultante

1 0

3 1

4 2

5 3

7 4

11 5

2 6

4 7

12 8

15 9

5. Ler um vetor de nmeros inteiros e imprimir as posies do maior e do menor elemento do vetor. Assuma que no existem elementos repetidos no vetor. Exemplo:
V 14 0 13 1 7 2 22 3 9 4

O menor elemento se encontra na posio 2 O maior elemento se encontra na posio 3 6. Ler um vetor de nmeros e inverter a ordem dos elementos desse vetor no prprio vetor. Exemplo: Vetor antes de ser invertido:
V 14 0 13 1 7 2 22 3 9 4

Vetor depois de ser invertido:

31

Programao 2

9 0

22 1

7 2

13 3

14 4

7. Ler dois vetores de nmeros e gerar um terceiro vetor formado pela INTERSECO dos dois vetores lidos. O resultado da interseo de dois conjuntos : os elementos que fazem parte dos dois conjuntos. Exemplo:
A 1 0 4 1 7 2 2 3 12 4

3 0

4 1

2 2

14 3

25 4

interseccao

4 0

2 1 2 3 4

8. Ler dois vetores de nmeros e gerar um terceiro vetor formado pela DIFERENA dos dois vetores lidos. O resultado da diferena de dois conjuntos : os elementos do conjunto A que no fazem parte do conjunto B. Exemplo:
A 1 0 4 1 7 2 2 3 12 4

3 0

4 1

2 2

14 3

25 4

Diferenca

1 0

7 1

12 2 3 4

32

Programao 2

9. Ler dois vetores de nmeros e gerar um terceiro vetor formado pela UNIO dos dois vetores lidos. O resultado da unio de dois conjuntos : todos os elementos que fazem parte dos conjuntos A e B. Exemplo:
A 1 0 4 1 7 2 2 3 12 4

3 0

4 1

2 2

14 3

25 4

Unio

1 0

4 1

7 2

2 3

12 4

3 5

14 6

25 7 8 9

10. Ler um vetor de nmeros e imprimir os nmeros que se repetem nesse vetor. Exemplo:
V 1 0 4 1 7 2 1 3 2 4 1 5 4 6 25 7 3 8 7 9

Os nmeros que se repetem no vetor so: 1 4 7

Conhea Mais Para ampliar nossos conhecimentos sobre os assuntos tratados neste captulo, leiam o captulo que aborda armazenamento em vetores, do livro: SCHILDT, Herbert. C Completo e Total. So Paulo: Makron, 1996.

33

Programao 2

Vamos Revisar? Vamos lembrar rapidinho o que foi visto neste captulo? Leia o resumo a seguir, composto com os principais conceitos apresentados. Vetores: conhecidos como estruturas de dados homogneas, os vetores so um conjunto de variveis que armazenam elementos do mesmo tipo. ndices: para acessar um elemento do vetor, precisamos indicar em que posio do vetor est o elemento. No momento da declarao dos vetores, precisamos indicar quantos elementos sero armazenados no mesmo. de responsabilidade do programador o acesso aos elementos do vetor. Se o programa tentar acessar uma posio que no existe no vetor, o compilador no indicar o erro. Quando passamos um vetor como parmetro de uma funo, seus valores podem ser alterados

34

Programao 2

Captulo 2 Armazenamento de Dados em Registros


Vamos conversar sobre o assunto? Neste captulo, vamos aprender mais uma forma de armazenamento de dados, que so os registros. Nos registros podemos agrupar dados de tipos diferentes. Por conta disto, os registros so chamados de estruturas de dados heterogneas. Assim como os vetores, os registros vo facilitar o gerenciamento dos dados dos nossos programas, que esto cada vez maiores. Veremos, tambm, como unir os conceitos de vetores e registros, trabalhando com vetor de registro. Leiam este captulo com calma e ateno, uma vez que iremos utilizar registros em muitas situaes nos nossos programas, certo?

2.1 O que so registros?


Ns j sabemos que um conjunto homogneo de dados composto por variveis do mesmo tipo (vetores). Mas, e se tivermos um conjunto em que os elementos no so do mesmo tipo? Teremos, ento, um conjunto heterogneo de dados, que so chamados de registros. O registro uma das principais formas de estruturar os dados no programa. O conceito de registro visa facilitar o agrupamento de variveis de tipos diferentes, mas que possuem uma relao lgica. Um registro um conjunto de uma ou mais variveis, que podem ser de tipos diferentes, agrupadas sobre um nico nome. O fato de variveis agrupadas em um registro poderem ser referenciadas por um nico nome, facilita a manipulao dos dados armazenados nestas estruturas. Como exemplo de um registro, imaginem uma estrutura que armazene as diversas informaes do boletim de um aluno. O boletim formado por um conjunto de informaes logicamente relacionadas, porm de tipos diferentes, tais como: nmero de matrcula (inteiro), nome do aluno (caractere), nome da disciplina (caractere), mdia (real) e situao (caractere), que so subdivises do registro (elementos de conjunto), tambm chamadas de campos. Logo, um registro composto por campos que so partes que especificam cada uma das informaes. A figura 2.1 apresenta o boletim de notas de um aluno.

35

Programao 2

Boletim de Notas Matricula...: 12345 Nome........: Michel Disciplina..: Matemtica Mdia........: 10.0 Situao....: Aprovado

Figura 2.1 Boletim de Notas

Notem que, o boletim composto por informaes de diferentes tipos. No entanto, todas as informaes do boletim esto relacionadas ao mesmo aluno. O agrupamento de informaes de tipos diferentes, que tem uma relao lgica, facilitar a manipulao de dados. Nas prximas sees, vamos aprender a declarar e manipular registros.

2.2 Declarao de um Registro


Para declarar uma varivel, precisamos informar o seu tipo e dar um nome mesma. Mas, um registro formado por vrias variveis de tipos diferentes. Como iremos declarar um registro? Para declarar um registro, necessrio informar quais variveis, e seus respectivos tipos, fazem parte do registro. Dessa forma, precisamos declarar cada campo do registro, agrupando-os em um novo tipo de dado. A declarao de um registro passa por duas fases: definio de um novo tipo de dado e declarao do registro propriamente dito. Vamos entender melhor isso tudo? Primeiramente, precisamos definir quais campos fazem parte do registro e criar um novo tipo de dado para o nosso programa. Precisamos criar um novo tipo de dado porque no conseguiramos representar o tipo de informao que o registro armazena, utilizando os tipos primitivos disponveis na linguagem: int, float, char, etc. Uma vez que o registro agrupa variveis de tipos de dados diferentes. Para criar um novo tipo de dado, utilizamos a seguinte sintaxe:

36

Programao 2

Sintaxe

typedef struct { declarao das variveis; } nome_do_tipo;

Onde: typedef: indica que um novo tipo de dado ser definido. struct: indica que o tipo de dado que ser definido um registro, ou seja, um agrupamento de variveis de tipos de dados diferentes. declarao das variveis: so as variveis que fazem parte do registro. Neste local, precisamos especificar quais as variveis iro compor o registro, alm do tipo das mesmas. As variveis so colocadas entre chaves. nome_do_tipo: dado um nome ao novo tipo de dado que est sendo criado. S depois que o novo tipo de dado criado, que o registro poder ser declarado. Na sequncia, vamos ver a declarao de um registro. Assim como toda varivel, ao declarar uma varivel que um registro, precisamos dizer que tipo de dado o registro armazena. Neste caso, iremos dizer que o registro do tipo de dado que acabamos de definir no typedef. A sintaxe a seguinte:
Sintaxe

nome_do_tipo

nome_do_registro;

Onde: nome_do_tipo: o nome do tipo de dado que definimos no nosso programa, formado pelo agrupamento de vrias variveis. nome_do_registro: o nome da varivel registro que est sendo declarada. O nome de um registro segue as regras dos identificadores. O exemplo 2.1 apresenta a declarao do registro do boletim do aluno:

37

Programao 2

Exemplo 2.1: Definio de tipo e declarao de registro

1 2 3 4 5

typedef struct { int matricula; situao[10]; char nome[20], disciplina[20], float media; } Tipo_Aluno; Tipo_Aluno aluno;

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

38

Programao 2

matricula nome disciplina situacao media

aluno
Figura 2.2: Representao grfica do registro aluno

Notem que, a varivel aluno (que um registro) formada pelos campos definidos no Tipo_Aluno. Como uma varivel registro formada por vrios campos, precisamos utilizar uma forma diferenciada para informar qual campo do registro ns estamos querendo acessar. Lembram dos vetores, que precisvamos dizer qual elemento do vetor seria acessado? Com os registros vai acontecer algo parecido. Mas isto, ns vamos aprender na prxima seo.

2.3 Acessando os campos do registro


De acordo com a figura 2.2, a varivel aluno um registro formado por vrios campos. Para acessar um campo de um registro, devemos usar a seguinte sintaxe:
Sintaxe

nome_do_registro.campo

Onde: nome_do_registro: o nome da varivel registro que queremos acessar. Aps o nome_do_registro devemos colocar um ponto, que ir separar o nome do registro, do campo que vem logo em seguida. campo: o campo do registro que ser acessado. 39

Programao 2

Pensem da seguinte forma: suponham que queremos acessar o registro aluno, do exemplo 2.1. Ao acessarmos esta varivel, ela possui vrios campos. Precisamos dizer qual deles ser acessado no momento. A seguir, so apresentados exemplos de acesso aos campos do registro aluno. Ao acessar um campo do registro, podemos atribuir valores, como mostra o exemplo 2.2.
Exemplo 2.2: Acesso aos campos de um registro

1 2 3 4

aluno.matricula = 12345; scanf(%f, &aluno.media); gets(aluno.nome); printf(Situacao do aluno: %s, aluno.situacao);

Saiba Mais
O ponto que aparece neste comando, deve ser lido como campo. Assim, a leitura do comando da linha 1 seria: aluno no campo matricula recebe 12345.
4

Na linha 1, estamos acessando o campo matricula do registro aluno. Assim, colocamos o nome do registro, o ponto e o campo que queremos acessar. Com acesso ao campo, fizemos uma atribuio4. Na linha 2, estamos acessando o campo media do registro aluno. Neste caso, ao invs de atribuir um valor ao campo de registro, estamos fazendo uma leitura via teclado e armazenando o valor digitado no campo media. Como o campo media do tipo float, colocamos o %f no scanf, indicando que ser lido um nmero real. Na linha 3, temos o comando de leitura gets, responsvel por ler variveis do tipo char. Neste gets, estamos fazendo uma leitura via teclado e armazenando o valor digitado no campo nome do registro aluno. Na linha 4, temos um printf que apresenta a situao do aluno. Para isso, acessamos o campo situacao do registro aluno. Notem que, se tivermos vrios alunos em uma turma, precisaremos de vrias variveis registro do tipo Tipo_Aluno, uma para cada aluno. Para fazer isso de forma mais simplificada, devemos juntar os conceitos de vetores e registros e criar um vetor de registro. Vamos aprender como faz isto?

2.4 Vetor de registro


Os vetores so formados por um conjunto de dados do mesmo tipo. No captulo anterior, utilizamos vetores que armazenavam dados 40

Programao 2

de tipos primitivos, ou seja, tipos disponveis na linguagem int, float, char, etc. Veremos que podemos utilizar como elemento do vetor no apenas um tipo primitivo, mas tambm os tipos construdos (tipos definido pelo programador), neste caso, os registros. Imaginem que queremos armazenar os boletins dos 50 alunos de uma turma. Para isso, ser necessrio um registro diferente para cada aluno. Para agrupar todos estes registros, iremos definir um vetor de registro. Como possumos 50 alunos, podemos criar um vetor no qual cada posio, armazena um Tipo_Aluno. Para declarar um vetor de registro, precisamos antes definir os elementos do registro, utilizando o typedef struct, e assim, definir um novo tipo de dado que ser utilizado no programa. Aps definirmos o novo tipo de dado, o vetor poder ser declarado. Para declararmos um vetor, precisamos informar o tipo de dado que o vetor armazena, damos um nome ao vetor e informamos, entre colchetes, o tamanho do vetor. O exemplo 2.3 apresenta a declarao do vetor de registro alunos:
Exemplo 2.3: definio do registro e declarao do vetor de registro

1 2 3 4 5

typedef struct { int matricula; situao[10]; char nome[20], disciplina[20], float media; }Tipo_Aluno; Tipo_Aluno alunos[50];

Neste exemplo, cada uma das 50 posies do vetor alunos ir armazenar todos os dados que compe o Tipo_Aluno, ou seja: matricula, nome, disciplina, situacao e media. A figura 2.3, a seguir, representa o vetor de registro declarado no exemplo.
matricula nome disciplina media situacao 0 matricula nome disciplina media situacao 1 ... matricula nome disciplina media situacao 48 matricula nome disciplina media situacao 49

alunos

Figura 2.3: Representao grfica do vetor de registro aluno

41

Programao 2

Se apenas com os vetores, j havamos adquirido uma facilidade na declarao e manipulao de um grande conjunto de variveis, com os vetores de registros, esta facilidade ser aumentada. Vamos aprender, na prxima seo, como acessamos um campo de um vetor de registro.

2.5 Acessando os campos do vetor de registro


Quando precisamos acessar um elemento do vetor, informamos, entre colchetes, o ndice do elemento do vetor que ser acessado. Quando queremos acessar um campo do registro, informamos o nome da varivel registro, colocamos um ponto e o nome do campo que queremos acessar. J no caso de um vetor de registro, temos que usar a seguinte sintaxe:
Sintaxe

nome_do_vetor[indice].campo

Onde: nome_do_vetor: nome do vetor que queremos acessar. [ndice]: ndice do vetor que ser acessado. .campo: campo do registro que ser acessado. O exemplo 2.4 apresenta acessos a campos do vetor de registro alunos.
Exemplo 2.4: Acesso aos elementos de um vetor de registro

1 2 3 4

alunos[2].media = 7.5; alunos[3].matricula = 12345; gets(alunos[0].nome); scanf(%d,&alunos[2].matricula);

Na linha 1, acessamos o elemento de ndice 2 do vetor alunos e atribumos 7.5 ao campo media. Na linha 2, acessamos o elemento de ndice 3 do vetor alunos e atribumos 12345 ao campo matricula. Nas linhas 3 e 4, temos acessos atravs de comandos de entrada 42

Programao 2

de dados. Na linha 3, temos um gets, que obtm o nome do aluno, via teclado, e armazena no ndice 0 do vetor alunos, no campo nome. Na linha 4, temos o scanf que l a matrcula do aluno, armazenando no ndice 2 do vetor alunos, no campo matricula.

2.6 Usando vetor de registro


Vamos fazer um programa completo usando vetor de registro? Este programa ser um pouco maior do que os outros programas que j fizemos, e apresentar uma gama de coisas novas. Alm do uso de vetor de registro, aprenderemos a mostrar os dados do vetor de registro em forma de tabela. Vamos comear? Primeiramente, vamos ler e entender o enunciado do Programa Completo 2.1: Faa um programa que cadastre e apresente os dados dos alunos de uma escola. Os dados dos alunos devem ser armazenados em um vetor de registro, com a capacidade de armazenar at 20 alunos. A quantidade de alunos que ser cadastrada desconhecida. No momento do cadastro sero informados os seguintes dados para cada aluno: matrcula, nome, srie(1-4) e se tem irmo na escola (1-sim/0-nao). O programa ir calcular o valor da mensalidade do aluno, que depende da srie do aluno e se o mesmo tem irmo na escola. Valor da Mensalidade: 1 Serie: R$110, 2 Serie: R$130, 3 Serie: R$160, 4 Serie: R$170. O aluno que tiver irmo na escola, receber 20% de desconto no valor da mensalidade. Quando o usurio decidir que no deseja mais cadastrar, o programa apresentar os dados de todos os alunos, em forma de tabela. Para facilitar o entendimento deste enunciado, vejam os exemplos das telas que so apresentadas durante a execuo do programa:
Colgio Legal Cadastro de Aluno Matricula..: Nome.......: Serie(1-4): Irmao na escola (1-sim/0-nao): Cadastrar outro aluno (1-sim/0-nao)?

43

Programao 2

Colgio Legal Relatrio Geral Matricula xx xx xx xx xx Nome xxxxx xxxxx xxxxx xxxxx xxxxx Serie x x x x x Irmao x x x x x Mensalidade xx.xx xx.xx xx.xx xx.xx xx.xx

Tecle enter para sair...


Figura 2.4:Exemplos de telas do programa completo 2.1

A primeira tela representa a operao de cadastramento dos dados dos alunos. Nesta tela, que sero fornecidos os dados para o cadastramento dos alunos. Como a mensalidade um dado calculado pelo programa, o usurio no fornecer este dado no momento do cadastro. A segunda tela representa a apresentao dos dados de todos os alunos, em forma de tabela (listagem ou relatrio). Cada linha da tabela apresentar os dados de um aluno. Como precisamos armazenar os vrios dados de cada um dos alunos da escola, se faz necessrio o uso de um vetor de registro. Segue o cdigo do programa completo 2.1, que ser comentado posteriormente.

44

Programao 2

Programa Completo 2.1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

#include <stdio.h> main() { typedef struct{ int mat, serie, irmao; char nome[20]; float mens; } Tipo_Aluno;

Tipo_Aluno alunos[20]; int qa, i, resp; qa =0; do { system(cls); printf(Colegio Legal\n); printf(\n\nCadastro de Alunos\n\n); printf(\nMatricula.: ); scanf(%d,&alunos[qa].mat); printf(\nNome......: ); fflush(stdin); gets(alunos[qa].nome); printf(\nSerie(1-4): ); scanf(%d,&alunos[qa].serie); ); printf(\nIrmao na escola(1-sim/0-nao):

scanf(%d,&alunos[qa].irmao); switch(alunos[qa].serie) { case 1: alunos[qa].mens = 110; break; case 2: alunos[qa].mens = 130; break; case 3: alunos[qa].mens = 160; break; case 4: alunos[qa].mens = 170; break; }

45

Programao 2

29 30 31 32 33 34 35 36 37 38 39 40 41 42

if (alunos[qa].irmao == 1) alunos[qa].mens = alunos[qa].mens*0.8; qa++; printf(\n\nDeseja sim/0-nao)? ); cadastrar outro aluno(1-

scanf(%d,&resp); }while ((resp == 1) && (qa <20)); system(cls); printf(Colegio Legal\n); printf(\n\nRelatorio Geral\n); printf(\n________________________________); printf(\nMatricula Mensalidade); Nome Serie Irmao

printf(\n________________________________); for(i = 0; i < qa; i++) alunos[i].mat, alunos[i].nome, alunos[i].serie, alunos[i].irmao, alunos[i].mens); printf(\n_______________________________); printf(\nTecle enter para sair...); getche(); } printf(\n%9d %-20s %5d %5d %11.2f,

43 44 45 46

Comentrios sobre o Programa Completo 2.1 Linha 1: incluso da biblioteca stdio.h devido o uso do comando fflush. Linha 2: incio do programa principal. Linhas 3 a 6: definio de um novo tipo de dado, que ser chamado de Tipo_Aluno. O Tipo_Aluno formado pelos dados dos alunos: mat (matrcula), nome, serie, irmao (indica se tem irmo na escola) e mens (mensalidade). Linha 7: declarao do vetor de registro alunos, com capacidade de armazenar 20 elementos do Tipo_Aluno. 46

Programao 2

Linha 8: declarao das variveis qa (que ir controlar a quantidade de alunos cadastrados no vetor), i (utilizada como varivel de controle do for) e resp (utilizada para saber se o usurio deseja continuar cadastrando novos alunos). Linha 9: inicializao da varivel qa com 0; Linhas 10 a 34: repetio do tipo do/while que ir controlar o cadastro dos dados dos alunos no vetor de registro. Este do/while ir parar a sua execuo se o vetor ficar cheio (20 elementos) ou se o usurio no quiser mais cadastrar. Linha 11: Cada vez que o do/while executado, queremos que a tela seja limpa. Para isso, usamos o system(cls). Esta linha tem, tambm, o abre chaves que indica o incio da sequncia de comandos do do/while. Linhas 12 e 13: printf para indicar o nome do colgio (Colgio Legal) e para indicar o que est sendo feito nesta tela (Cadastro de Alunos). Linhas 14 e 15: printf informando que o usurio deve digitar a matrcula do aluno e scanf que obtm a matrcula do aluno, armazenado-a no vetor de registro alunos, na posio qa e no campo mat. Notem que a varivel qa iniciou com 0. Na primeira vez que o do/while for executado, os dados dos alunos sero armazenados na posio 0 do vetor. A cada vez que a repetio executada, a varivel qa incrementada de uma unidade. Assim, os dados de cada aluno sero armazenados em uma posio, diferente, no vetor de registro. Linhas 16 a 18: printf informando que o usurio deve digitar o nome do aluno. fflush para limpar o buffer e, em seguida, o gets responsvel por ler o nome do aluno, armazenando no vetor de registro alunos, na posio qa e no campo nome. Linhas 19 e 20: printf informando que o usurio deve digitar a srie do aluno (que pode ser de 1 a 4). scanf responsvel por ler a srie do aluno, armazenando no vetor de registro alunos, na posio qa e no campo serie. Linhas 21 e 22: printf informando que o usurio deve digitar se o aluno tem irmo na escola (digitar 1 se tiver irmo e 0 se no tiver irmo na escola). scanf responsvel por ler se o aluno tem irmo na escola, armazenando no vetor de registro alunos, na 47

Programao 2

posio qa e no campo irmao. Linhas 23 a 28: depois de obter todos os dados de um aluno, o programa vai calcular o valor da mensalidade do aluno, verificando a srie e se tem irmo na escola. Como cada uma das sries da escola tem um valor diferente de mensalidade, este switch serve para verificar em que srie o aluno est matriculado, para atribuir ao campo mens do registro do aluno, o valor da mensalidade correspondente a sua srie. Linhas 29 e 30: if para verificar se o aluno tem irmo na escola. De acordo com o enunciado, os alunos que tem irmo na escola, recebem uma desconto de 20% na sua mensalidade. Como o if s tem um comando, no foi necessrio o uso de chaves. Linha 31: neste momento, todo o registro do aluno j foi preenchido. Com isso, fazemos o incremento da varivel qa, informando que mais um aluno acabou de ser cadastrado. Linhas 32 e 33: printf que pergunta se o usurio deseja continuar cadastrando novos alunos. scanf para ler a resposta do usurio (1 se ele deseja continuar cadastrando e 0 se deseja parar). Linha 34: fechamento do do/while com a condio que faz a repetio parar. Como mencionado anteriormente, este do/ while fica em execuo enquanto tem posies disponveis no vetor ou enquanto o usurio desejar. Nesta linha, termina a fase de cadastramento dos dados dos alunos no vetor de registro. Linhas 35 a 47: Esta sequncia de comando serve para apresentar os dados dos alunos que foram armazenados no vetor de registro. Por uma questo de organizao, estes dados sero apresentados na forma de tabela. Assim, cada linha da tabela corresponder aos dados de um aluno, ou seja, uma posio do vetor de registro. Para que a tabela fique alinhada, precisamos saber que: a tela tem 80 colunas por 25 linhas. Dessa forma, temos que distribuir as informaes de um jeito que no extrapole as 80 colunas da tela. Para entender melhor esta parte do programa, acompanhem os comandos, observando a figura 2.9 (tela de execuo do programa). Linha 35: limpa a tela para darmos incio apresentao dos dados de todos os alunos. 48

Programao 2

Linhas 36 e 37: printf para informar o nome do colgio e para informar o que esta tela faz (Relatrio Geral). Linha 38: printf para passar uma linha na tela. Esta linha vai delimitar o cabealho da tabela. Linha 39: printf que imprime os ttulos de cada coluna da tabela. A tabela ser composta pelas seguintes colunas: Matricula, Nome, Serie, Irmao e Mensalidade. Os ttulos que devemos dar as colunas da tabela so sempre indicados nos enunciados das questes, certo? Sigam esta dica, porque vocs esto comeando a aprender a fazer tabelas agora. Este printf cheio de detalhes, mas vamos ver isso agora, observando a figura 2.5. O resultado deste printf a linha que est indicada com a seta.

Figura 2.5: Apresentao dos dados em forma de tabela

Vamos ver quais so os passos para montar o printf da linha 39 (cabealhos/ttulos das colunas da tabela). Para cada coluna da tabela, verifiquem quantas letras tem no seu cabealho. Por exemplo, a palavra matrcula, tem 9 letras. Vejam que, na figura 2.5, tem a indicao de quantas letras tem em cada um dos cabealhos. A quantidade de letras que tiver o cabealho, ser a largura da coluna. Agora, precisamos verificar se os dados dos alunos vo extrapolar a largura de cada uma das colunas da tabela. Vamos ver uma por uma: Matricula: a coluna que ser utilizada para apresentar a matrcula, tem uma largura de 9 espaos (quantidade de letras da palavra matrcula). Vamos considerar que nossas matrculas tem sempre menos que 9 dgitos. 49

Programao 2

Assim, a largura de 9 espaos para esta coluna, suficiente. Nome: a palavra nome s tem 4 letras. Vejam que o nome do aluno foi declarado com 20 letras. Assim, se deixarmos a coluna Nome, com largura 4, no ser suficiente para apresentar os nomes dos alunos. Quando a quantidade de letras do cabealho menor que o contedo que vem na coluna da tabela, devemos completar a coluna com espaos em branco at fazer com que a coluna tenha a largura que precisamos. Srie: tem 5 letras. A srie do aluno varia entre 1 e 4, dessa forma, a largura da coluna Serie (5 espaos), ser suficiente para apresentar o dado. Irmo: tambm tem 5 letras. A varivel que armazena se o aluno tem ou no irmo na escola, varia entre 0 e 1, dessa forma, a largura da coluna Irmao (5 espaos), ser suficiente para apresentar o dado. Mensalidade: tem 11 letras. Esta largura suficiente para apresentar o valor da mensalidade do aluno. Agora que j sabemos que apenas a coluna Nome no tem largura suficiente para apresentar os nomes dos alunos, vamos ver quantos espaos em branco ns temos que colocar depois da palavra Nome, para que esta coluna tenha a largura que precisamos. Se o nome do aluno tem at 20 letras e a palavra Nome tem apenas 4 letras, faremos a seguinte conta: 20 4 = 16. Assim, depois da palavra Nome, temos que colocar 16 espaos em branco, para que a nossa coluna passe a ter a largura que precisamos (20). Por fim, temos que definir um espaamento para separar uma coluna da outra. Nos nossos exemplos, vamos usar sempre trs espaos separando uma coluna da outra. A padronizao do espaamento entre as colunas visa facilitar a programao, j que estamos vendo este assunto agora e o mesmo cheio de detalhes. Agora vamos montar o printf, vejam a figura 2.6. Ns vamos colocando os ttulos das colunas da tabela, e entre cada palavra, vamos colocando trs espaos em branco, 50

Programao 2

que foi o espaamento definido para separar as colunas. S no caso da coluna nome, que depois que colocamos Nome, devemos dar os 16 espaos em branco para que ela passe a ser uma coluna de largura 20. Mas ainda teramos que dar mais 3 espaos em branco, que para separar a coluna nome, da coluna serie.

Figura 2.6: Detalhamento do printf da linha 39

O printf est pronto! A primeira vista, parece complicado, mas depois vocs estaro fazendo a tabela bem rpido. Linha 40: printf para passar uma linha na tela. Esta linha vai delimitar o cabealho da tabela. Linha 41: for para visitar cada uma das posies do vetor e apresentar os dados dos alunos. A varivel de controle do for, o i, vai variar de 0 at a ultima posio ocupada do vetor. A varivel que tem esta informao o qa. Linha 42: este printf que vai fazer a montagem das linhas da tabela, apresentado os dados dos alunos que esto armazenados no vetor de registro. Este printf tambm tem macetes, pois est relacionado com o printf da linha 39. Vamos l! Lembram que fizemos a contagem para saber a largura de cada coluna da tabela? Vamos precisar desta informao agora. Na primeira parte do printf, temos a string de controle (a figura 2.7 faz o detalhamento dessa parte do printf). Sabemos que as colunas da tabela so: matricula( nmero inteiro e esta coluna deve ter largura 9), nome (vetor de caracteres com at 20 letras), serie (nmero inteiro e esta coluna tem largura 5), irmo (nmero inteiro e esta coluna tem largura 5) e mensalidade (nmero real e esta coluna tem largura 11). Alm disso, sabemos que entre cada coluna, ns colocamos trs espaos em branco. Com estas informaes, vamos montar a string de controle do printf da 51

Programao 2

linha 42.

Figura 2.7: Detalhamento do printf da linha 42

Entre o % e a letra que indica o que vai ser impresso (%d, %s ou %f), devemos colocar a largura da coluna. A primeira coluna da tabela a da matricula, que um nmero inteiro e que tem largura 9. Por isso, temos o %9d. Aps cada uma das formataes, colocamos trs espaos em branco, j que foi o espaamento definido entre as colunas da tabela. No caso da varivel caractere nome do aluno (que a segunda coluna da tabela) colocamos %-20s (o para que o nome do aluno seja alinhado pela esquerda). Nas demais formataes no precisamos colocar o -, s utilizamos em campos caractere. Aps a string de controle, colocamos as variveis que sero apresentadas na tela, na ordem em que as colunas foram definidas. Linha 43: printf para passar uma linha na tela. Esta linha vai fechar a tabela. Linha 44: printf que informa que o usurio deve teclar enter para sair. Linha 45: getche() que evita que a tela de execuo feche antes de vermos os resultados. Linha 46: fecha chaves do programa principal. A figura 2.8 apresenta a tela de execuo do programa 2.1, na fase do cadastramento dos alunos.

52

Programao 2

Figura 2.8: Tela de execuo do programa completo 2.1 - Cadastro

A figura 2.9 apresenta a tela de execuo do programa 2.1, na fase do apresentao dos dados de todos os alunos cadastrados, em forma de tabela.

Figura 2.9: Tela de execuo do programa completo 2.1 Relatrio Geral

Viram como esta questo cheia de detalhes? Mas no se assustem, a explicao precisava ser minuciosa, para que cada linha do programa fosse entendida. Agora precisamos treinar esse tipo de questo. No percam tempo!

Atividades e Orientaes de Estudos Vamos resolver mais uma lista de exerccios? Esta lista composta por questes em que se faz necessrio o uso de vetor de registro. DICA: sempre coloque as tabelas com os mesmos cabealhos propostos nos enunciados (exemplos de telas). Mos a obra! 1. Uma empresa de turismo deseja um programa que calcule o valor das viagens dos clientes. Sero informados os seguintes 53

Programao 2

dados: cdigo do cliente, nome, roteiro desejado(1-Brasil, 2-EUA, 3-frica), tipo de quarto (1-Standard, 2-Luxo), Se deseja alugar carro(1-sim/0-nao) e a quantidade de dias. A quantidade de clientes desconhecida. O programa ir calcular o total da viagem usando os valores da tabela abaixo, que variam de acordo com o roteiro escolhido. A diria do quarto de luxo R$30 mais cara que o valor da diria em um quarto standard. Exemplo: Se a pessoa escolher roteiro 2, em quarto de luxo, a diria ir custar: 320 + 30 = R$ 350.
Roteiro 1 2 3 Diria Hotel Quarto Standard R$ 170 R$ 350 R$ 370 Diria - Aluguel de carro R$ 50 R$ 60 R$ 75

Total da Viagem: dias*diriahotel + dias*diariacarro(se o cliente for alugar carro) Armazenar os dados em um vetor de registro. Imprimir os dados em forma de tabela. Exemplo das telas:
Viagem Legal Turismo Cadastro de Cliente Codigo: Nome: Roteiro (1-Brasil, 2-EUA, 3-frica): Tipo de Quarto (1- Standard, 2-Luxo): Alugar Carro (1-sim/0-nao)? Quantidade de Dias: Inserir outro (1-sim,0-nao)? Viagem Legal Turismo Relatrio Geral Cdigo xx xx xx Nome xxxxx xxxxx xxxxx Roteiro x x x Quarto x x x Carro x x x Dias xx xx xx Total xx.xx xx.xx xx.xx

Tecle enter para sair...

54

Programao 2

2. Faa um programa para montar a folha de pagamento dos empregados de uma empresa. Para cada empregado sero lidos os seguintes dados: matricula, nome, cargo(1-Analista de Sistemas/2- programador), sexo(1-mas/2-fem), anos de experincia e quantidade de filhos. O programa ir calcular para cada empregado o seu salrio. Sabe-se que:
Cargo 1 2 Salrio Base R$ 2500 R$ 1700

O salrio ser calculado da seguinte forma: Cada cargo tem o salrio base. Alm do salrio base, o empregado recebe os seguintes adicionais: R$ 50, para cada ano de experincia e R$ 40 por cada filho. Portanto, um analista de sistemas com trs anos de experincia e dois filhos ter o salrio = 2500 + 50*3 + 40*2 = R$ 2730. Armazenar as informaes em um vetor de registros. Imprimir o relatrio geral em forma de tabela contendo os dados de cada empregado. A quantidade de empregados da empresa desconhecida (declarar o vetor com capacidade de armazenar 20 funcionrios). Exemplos das telas:
Empresa Legal Cadastro de Funcionario Matricula: Nome: Cargo(1-Analista de Sistemas, 2- programador): Sexo(1-mas/2-fem): Anos de experincia: Quantidade de filhos: Cadastrar outro (1-sim/2-nao)?

55

Programao 2

Empresa Legal Listagem Geral Matricula xx xx xx xx Nome xxxxx xxxxx xxxxx xxxxx Cargo x x x x Sexo x x x x Anos xx xx xx xx Q. Filho x x x x Salrio xxx.xx xxx.xx xxx.xx xxx.xx

Tecle enter para sair...

3. Faa um programa para uma empresa de celular contendo as seguintes operaes: cadastro de clientes e listagem geral. Para cada cliente devemos armazenar: cdigo, nome, sexo (1-feminimo/2-masculino), quantidade de ligaes, plano que o cliente est associado (1-Dia/2-Noite/3-Fixo/4-Empresarial) e Valor da conta. O programa ir calcular o valor da conta de cada cliente. Sabe-se que, cada plano tem uma tarifa diferenciada, segundo a tabela abaixo:
Plano Dia Noite Fixo Empresarial Valor de 1 ligao 1.30 1.60 1.25 1.10

Armazenar os dados em um vetor de registro. Aps o cadastro dos clientes, apresentar a listagem com os dados de todos os clientes, em forma de tabela. A quantidade de clientes desconhecida. Declare o vetor com capacidade de receber at 50 clientes. Exemplos das telas:

56

Programao 2

Ligue Mais Cadastro de Cliente Cdigo: Nome: Sexo(1-fem/2-mas): Quantidade de Ligaes: Plano(1-Dia/2-Noite/3-Fixo/4-Empresarial): Cadastrar outro (1-sim/0-nao)? Ligue Mais Listagem Geral Codigo xx xx xx xx Nome xxxxx xxxxx xxxxx xxxxx Sexo x x x x Quant. Lig. xx xx xx xx Plano x x x x Total xxx.xx xxx.xx xxx.xx xxx.xx

Tecle enter para sair...

4. Um professor quer um programa para o clculo da mdia dos alunos de uma turma. Sero informadas a matrcula, nome (20 caracteres), e as trs notas dos alunos. O professor descarta a menor nota do aluno e a media calculada com as duas maiores notas. Calcular a mdia e apresentar os resultados em forma de tabela, aps o cadastramento. Armazenar os dados em um vetor de registro. A quantidade de alunos desconhecida, declare o vetor com capacidade de receber at 20 alunos. Exemplos das Telas:
Universidade Legal Cadastro de aluno Matricula: Nome: Nota 1: Nota 2: Nota 3: Cadastraroutro (1-sim/0-nao)?

57

Programao 2

Universidade Legal Relatrio Geral Matricula x x x x xxxxxxxxx xxxxxxxxx xxxxxxxxx xxxxxxxxx Nota1 x.x x.x x.x x.x Nota2 x.x x.x x.x x.x Nota3 x.x x.x x.x x.x Media x.x x.x x.x x.x

Tecle enter para sair...

5. O MEC quer um programa para fazer um relatrio sobre os plos de educao a distncia da UFRPE. Para cada plo so informados os seguintes dados: cdigo do plo, cidade, total de alunos, total de tutores, se possui laboratrio de informtica (1-sim/0-no) e se possui laboratrio de cincias (1-sim/0-no). O MEC quer saber quanto deve ser liberado de verba para cada plo. O calculo ser feito da seguinte forma: Por cada aluno so liberados: R$ 100 Por cada tutor so liberados: R$ 500 Se o plo tem no tem laboratrio de informtica so liberados: R$ 20.000 Se o plo no tem laboratrio de cincias so liberados: R$ 17.000 Ex: um plo com 150 alunos, com 15 tutores, que tem laboratrio de informtica, mas no tem laboratrio de cincias: Verba = 100 x 150 + 500 x 15 + 17000 = 15000 + 7500 + 17000 = 39500. Armazenar os dados dos plos em um vetor de registro. A quantidade de plos desconhecida. Declarar o vetor com a capacidade de armazenar at 20 plos. Aps o cadastros dos plos, apresentar todos os dados dos plos em forma de tabela. Exemplos das telas:

58

Programao 2

Ministrio da Educao Cadastro de Polo Codigo: Cidade: Quantidade de alunos: Quantidade de tutores: Tem lab. de informatica (1-sim/0-nao)? Tem lab. de ciencias (1-sim/0-nao)? Cadastrar outro plo (1-sim,0-nao)? Ministrio da Educao Listagem Geral Codigo xx xx xx xx Cidade xxxxx xxxxx xxxxx xxxxx Alunos xxx xxx xxx xxx Tutores xxx xxx xxx xxx LI x x x x LC x x x x Verba Liberada xxxxx.xx xxxxx.xx xxxxx.xx xxxxx.xx

Tecle enter para sair...

Conhea Mais Vocs podero aprender mais sobre registros e vetores de registros lendo os livros: MONTGOMERY, Eduard. Programando em C: Simples e Prtico. So Paulo: Alta Books, 2006. SCHILDT, Herbert. C Completo e Total. So Paulo: Makron, 1996.

Vamos Revisar? Nesta seo iremos revisar os principais tpicos vistos neste 59

Programao 2

captulo. Vale a pena dar uma lida para verificar como est o nosso aprendizado. Observem o resumo a seguir: Os registros so um agrupamento de variveis de tipos diferentes, mas que tem uma relao lgica. Por ser formado por elementos de diferentes tipos, os registros so chamados de estruturas de dados heterogneas. Para declarar uma varivel registro, precisamos definir um novo tipo de dado para o programa, utilizando o typedef. Cada elemento do registro chamado de campo. Unindo os conceitos de vetores e de registros, temos os vetores de registro que facilitam a declarao e o manuseio de grandes volumes de dados.

60

Programao 2

Captulo 3 Armazenamento de Dados em Arquivos


Vamos conversar sobre o assunto? Neste captulo, vamos aprender a armazenar nossos dados de forma definitiva. At ento, ao terminar a execuo de um programa, todos os dados que foram armazenados nas variveis eram perdidos. Em muitas aplicaes isto no pode acontecer. Por exemplo, um professor precisa ter certeza de que todo o trabalho para digitar as notas dos alunos da turma no ser perdido quando ele fechar o programa. Com os arquivos, poderemos armazenar os dados e recuper-los quando necessrio. Este captulo abordar os comandos que nos possibilitaro manipular dados armazenados em um arquivo. Vamos comear?

3.1 O que so arquivos?


Os arquivos so estruturas de dados manipuladas fora do ambiente do programa. Considera-se como ambiente do programa a memria principal, onde nem sempre conveniente manter certas estruturas de dados. De modo geral, os arquivos so armazenados na memria secundria, como, por exemplo: disco rgido (HD), CD e pendrive. 3.1.1. Como os arquivos so organizados? A linguagem C utiliza o conceito de fluxo de dados (stream) para manipular os vrios tipos de dispositivos de armazenamento e seus diferentes formatos. Os dados podem ser manipulados em dois diferentes tipos de fluxos: fluxos de texto e fluxos binrios. Um fluxo de texto (text stream) composto por uma sequncia de caracteres, que pode ou no ser dividida em linhas, terminadas por um caractere de final de linha. Um fluxo binrio (binary stream) composto por uma sequncia de bytes, que so lidos, sem traduo, diretamente do dispositivo externo. A Figura 3.1 ilustra estes dois tipos de fluxos.

61

Programao 2

Figura 3.1: Fluxo de dados

No fluxo de texto, os dados so armazenados como caracteres sem converso para a representao binria. Cada um dos caracteres ocupa um byte. O nmero 12 ocupa dois bytes e o nmero 113 ocupa 3 bytes. Um caractere em branco foi inserido entre cada um dos nmeros para separ-los, de modo que a funo de entrada e sada possa descobrir que so dois nmeros inteiros (12 e 113) e no o nmero 12113. No fluxo binrio, cada nmero inteiro ocupa 32 bits (4 bytes) e armazenado na forma binria. Observem que, em arquivos binrios, no h necessidade de separar os nmeros j que eles sempre ocupam 32 bits. Os arquivos binrios so utilizados quando queremos armazenar registros completos. Com estes arquivos, poderemos acessar qualquer registro de forma mais rpida. No caso dos arquivos texto, quando queremos encontrar alguma informao, temos que fazer uma varredura sequencial no arquivo, tornando a busca pouco eficiente. Neste captulo, ser dada nfase ao armazenamento de dados em arquivos binrios. Nas prximas sees, iremos conhecer os comandos para manipular este tipo de arquivo. 3.1.2 Ponteiros Antes de comearmos a conhecer os comandos de manipulao de arquivos binrios, vamos ver um conceito que ser utilizado neste captulo, que : ponteiro. Um ponteiro um tipo de varivel que armazena um endereo de memria. Ns j vimos variveis que armazenam nmeros inteiros, nmeros reais e caracteres. Ao trabalhar com arquivos, precisamos saber em qual endereo de memria o arquivo est armazenado. O endereo de memria onde o arquivo 62

Programao 2

est armazenado ser colocado em uma varivel que armazena endereo de memria (ponteiro). Para declarar uma varivel que capaz de armazenar um endereo de memria, usamos a seguinte sintaxe:
Sintaxe

tipo

*nome_do_ponteiro;

Onde: tipo: tipo de varivel que o ponteiro armazena endereo. Podemos dizer que nosso ponteiro armazena o endereo de uma varivel inteira, real, caractere, etc. Para este captulo, estaremos utilizando um ponteiro que vai armazenar o endereo de um arquivo. *: o asterisco na frente do nome de uma varivel simboliza que a varivel que est sendo declarada um ponteiro. nome_do_ponteiro: daremos um nome nossa varivel que armazena endereos. O exemplo 3.1 apresenta exemplos de declaraes de ponteiros que armazenam endereos de memria de arquivos.
Exemplo 3.1: Declarao de ponteiros para arquivos

1 2

FILE *p aluno; FILE *p produto;

Na linha 1, temos a declarao do ponteiro paluno, que ir armazenar o endereo de um arquivo (FILE). Devemos colocar o FILE em maisculo. Na linha 2, temos a declarao de outro ponteiro, pproduto, que armazena o endereo de um FILE. Quando queremos inicializar uma varivel real ou inteira, atribumos zero s mesmas. Quando precisarmos inicializar um ponteiro, devemos atribuir: NULL. Quando um ponteiro armazena NULL, quer dizer que ele no est armazenando um endereo no momento. Tenham calma, daqui a pouco o conceito de ponteiros ficar mais claro. Vamos comear a conhecer os comandos de manipulao de arquivos binrios e entenderemos melhor onde o conceito de ponteiro ser aplicado. 63

Programao 2

3.2 Comandos para manipular arquivos binrios


Como j mencionado, os arquivos binrios so utilizados quando queremos armazenar registros. como se tivssemos um vetor de registro, s que os dados no so perdidos ao terminar a execuo do programa. A figura 3.2 mostra a representao grfica de um arquivo binrio.

Figura 3.2: Representao grfica de um arquivo binrio

O arquivo binrio formado por um conjunto de registros, armazenados um aps o outro. As operaes realizadas em um arquivo binrio dependero do local onde se encontrar o leitor. Pense no leitor como se fosse a agulha de uma vitrola (Figura 3.3). Para tocar uma msica, a agulha passa sobre o disco, fazendo a leitura da msica. Dependendo de onde a agulha seja posicionada, tocada uma msica do disco.

Figura:3.3: Vitrola com agulha tocando uma msica

O leitor do arquivo passar sobre os registros, fazendo a leitura dos mesmos. Ns podemos colocar o leitor sobre qualquer registro e executar uma operao sobre o mesmo (leitura e/ou gravao). O arquivo tem uma marcao indicando onde ele termina (end of file). Nas prximas sees, iremos detalhar os comandos para manipular arquivos binrios. As operaes para a manipulao de arquivo esto na biblioteca stdio.h. Com isso, ao trabalhar com arquivos, devemos 64

Programao 2

incluir esta biblioteca nos nossos programas. 3.2.1 Declarao de um ponteiro para arquivo Na linguagem C, as funes que manipulam arquivos trabalham com o conceito de ponteiros para arquivo. Com isso, teremos uma varivel que armazenar o endereo de memria onde est armazenado nosso arquivo. Ns vimos na seo 3.2.1 (exemplo 3.1), como fazemos para declarar um ponteiro para um arquivo. Devemos declarar um ponteiro para cada arquivo que formos manipular no nosso programa. 3.2.2 Comando para abrir um arquivo A maior parte das operaes sobre um arquivo (leitura, gravao, etc) s pode ser executada com o arquivo aberto. O comando de abertura do arquivo (fopen) apresenta a seguinte sintaxe:
Sintaxe

ponteiro_arquivo = fopen(nome_do_arquivo, modo_de_abertura);

Onde: ponteiro_arquivo: ao abrir um arquivo, a funo fopen retorna o endereo de memria do arquivo. Por conta disso, devemos atribuir o endereo de memria do arquivo, para um ponteiro. Aps o arquivo ser aberto, usaremos este endereo de memria para acess-lo. nome_do_arquivo: determina qual arquivo dever ser aberto. Neste espao colocado o nome do arquivo, da forma que foi salvo no diretrio. O comando fopen procura o arquivo que desejamos abrir, no mesmo diretrio onde est armazenado o programa executvel. modo_de_abertura: informa que tipo de uso voc vai fazer do arquivo. O modo de abertura indica o que faremos no arquivo: leitura, gravaes e alteraes. Alm disso, o modo de abertura tambm vai indicar se queremos que um novo arquivo seja criado. A tabela abaixo, apresenta os principais modos de abertura.

65

Programao 2

Modo r+b

Significado Abre um arquivo binrio para leitura e escrita. O arquivo deve existir antes de ser aberto. Dessa forma, este modo de abertura s pode ser usado se o arquivo que estamos querendo abrir, j existe no nosso computador. Cria um arquivo binrio para leitura e escrita. Se o arquivo no existir, ele ser criado. Se j existir, o contedo anterior ser destrudo. Este modo de abertura tem a capacidade de criar novos arquivos. Mas, se solicitarmos que seja aberto um arquivo que j existe, o contedo do arquivo ser apagado. Acrescenta dados ou cria um arquivo binrio para leitura e escrita. Caso o arquivo j exista, novos dados podem ser adicionados, apenas, no final do arquivo. Se o arquivo no existir, um novo arquivo ser criado.

w+b

a+b

O exemplo 3.2, apresenta o uso do fopen.


Exemplo 3.2: Abertura de arquivo

1 2 3 4 5

FILE *paluno, *pprofessor; paluno = fopen(alunos.bin, w+b); pprofessor = fopen(professores.bin, r+b); if (pprofessor == NULL) printf(Arquivo de professores no existe);

Na linha 1, temos a declarao de dois ponteiros para armazenar os endereos dos arquivos que iremos abrir logo em seguida. Na linha 2, temos um fopen que ir abrir o arquivo alunos.bin, utilizando o modo de abertura w+b. Caso o arquivo alunos.bin no exista, ele ser criado (com o nome que passamos como parmetro). Normalmente, usamos o modo de abertura w+b quando executamos o nosso programa pela primeira vez. Neste momento, o arquivo ainda no existe. Dessa forma, desejamos que o mesmo seja criado. Mas, se o arquivo alunos.bin j existir, todo o seu contedo ser apagado. E, como resultado, teremos o arquivo aberto, mas sem nenhum registro armazenado. Ao abrir o arquivo, o endereo de memria do arquivo ser armazenado no ponteiro paluno. Na linha 3, temos um fopen que abrir o arquivo professores. bin, utilizando o modo de abertura r+b. Este modo de abertura s utilizado para arquivos que j existem, pois, diferente do modo de abertura w+b, ele no tem a capacidade de criar um arquivo novo. Se tentarmos abrir um arquivo que no existe, o fopen retornar NULL. 66

Programao 2

Para saber se um arquivo foi aberto corretamente, podemos fazer um teste como mostra as linhas 4 e 5. Aps executar um fopen, verificamos se o ponteiro est com NULL. Caso afirmativo, porque a abertura no foi executada corretamente. Uma vez aberto, o arquivo fica disponvel para leituras e gravaes atravs da utilizao de funes adequadas. 3.2.3 Comando para fechar um arquivo Aps terminar de usar um arquivo, devemos fech-lo. Para isso, usamos a funo fclose, que tem a seguinte sintaxe.
Sintaxe

fclose(ponteiro_arquivo);

Onde: ponteiro_arquivo: o ponteiro que tem armazenado o endereo de memria do arquivo que queremos fechar. S podemos fechar arquivos que esto abertos. O exemplo 3.3, apresenta o uso do comando fclose. Vamos utilizar os ponteiros declarados no exemplo anterior.
Exemplo 3.3: Fechamento de arquivo

1 2

fclose(palunos); fclose(pprofessores);

Na linha 1, fechamos o arquivo que est armazenado no endereo de memria palunos (que o ponteiro que armazena o endereo do arquivo). Ns s utilizamos o nome do arquivo (o nome que est salvo no diretrio), no momento da abertura. Depois de aberto, s utilizamos seu endereo de memria, certo? 3.2.4 Comando para ler um registro armazenado no arquivo Vamos aprender a ler os dados de um registro armazenado no arquivo? Neste comando, teremos vrios detalhes e devemos ter em mente o seguinte: A leitura feita a partir do ponto onde o leitor se encontra. Ao abrir o arquivo, o leitor posicionado no incio do primeiro 67

Programao 2

registro, como mostra a figura 3.2. medida que vamos executando leituras, o leitor vai se deslocando. Dessa forma, precisamos ter noo da posio onde o leitor se encontra. Nos arquivos binrios, SEMPRE fazemos a leitura de um registro completo, independente de quantos campos ele tenha. Um arquivo deve armazenar registro do mesmo tipo. Se os registros so do mesmo tipo, cada um deles ocupar o mesmo espao de memria. Dessa forma, o leitor sempre se deslocar em intervalos regulares. Vamos entender isto melhor, daqui a pouco. Vamos, primeiro, ver a sintaxe do comando de leitura:
Sintaxe

fread (&registro, numero_de_bytes, quantidade, ponteiro_arquivo);

Onde: &registro: o registro que armazenar os dados do registro lido do arquivo. assim, ns pegamos um registro que est no arquivo, e armazenamos no registro passado como parmetro. numero_de_bytes: na verdade, o que o comando de leitura faz informar que o leitor precisa se deslocar, fazendo a leitura de uma certa quantidade de bytes. A quantidade de bytes que o leitor deve se deslocar exatamente quantos bytes de memria o registro ocupa. Por exemplo: se o nosso arquivo armazena registros de alunos, composto pelos campos: matricula (int), nota1 (float), nota2 (float) e media (float). Sabe-se que um int ocupa 4 bytes e um float, tambm, ocupa 4 bytes. Dessa forma, teremos: 4 bytes para a matricula + 4 bytes para a nota1 + 4 bytes para a nota2 + 4 bytes para a media = 16 bytes. Assim, esse registro ocupa 16 bytes (Figura 3.4). esse o nmero de bytes que o leitor dever ler, para recuperar o registro de um aluno, armazenado no arquivo. Existe uma funo chamada sizeof que informa quantos bytes ocupa um tipo de dado. Assim, no precisamos estar lembrados de quantos bytes um int ocupa. Alm disso, no precisamos fazer as contas para saber quantos bytes o nosso registro ocupa. Para utilizar a funo sizeof, precisamos apenas, passar como parmetro 68

Programao 2

para a funo, que tipo de dado queremos saber quantos bytes ele ocupa. Por exemplo: sizeof(int) ou sizeof(TAluno). No caso de um registro, a funo vai fazer as contas de quantos bytes cada um dos campos do registro ocupa, e retorna a soma.
4 bytes 4 bytes 4 bytes 4 bytes

matricula

nota1

nota2

media

Figura 3.4: Campos do registro aluno

quantidade: neste terceiro parmetro, usaremos SEMPRE 1. Este parmetro significa quantas vezes a leitura ser executada. Ns sempre queremos que seja feita a leitura de um registro por vez. Por isso, sempre utilizaremos 1. ponteiro_arquivo: precisamos informar em qual arquivo a leitura ser feita. Com isso, passamos o endereo de memria onde o arquivo que ser lido est armazenado. Assim, utilizamos o ponteiro que tem o endereo do arquivo. Agora vamos ver o exemplo 3.4, que apresenta a leitura de um registro do arquivo. Para um melhor entendimento, foram feitas as declaraes das variveis que sero usadas no fread.
Exemplo 3.4: Leitura de um registro do arquivo

1 2 3 4 5 6 7 8

typedef {

int matricula; float nota1, nota2, media;

} TAluno

TAluno aluno; FILE *paluno;

fread(&aluno, sizeof(TAluno), 1, paluno);

Nas linhas 1 a 3 temos a declarao de um novo tipo de dado, que o agrupamento dos dados do aluno. Este tipo foi chamado de TAluno. Na linha 5, temos a declarao da varivel aluno, que um 69

Programao 2

registro do tipo TAluno. Na linha 6 declaramos um ponteiro chamado paluno, que armazena endereo de memria de arquivo.
Ateno
No esquecer de colocar o & na frente da varivel.
5

Na linha 8 que temos o comando de leitura. Vamos interpretar cada parte do comando. No primeiro parmetro, temos a varivel registro que vai armazenar as informaes lidas do arquivo5. Assim, o registro que for lido do arquivo, ser armazenado no registro aluno. No segundo parmetro, precisamos dizer quantos bytes sero lidos. Se iremos ler os dados do registro do aluno, precisamos saber quantos bytes ele ocupa. Para isso, foi usada a funo sizeof. Como parmetro do sizeof foi colocado TAluno, que um tipo criado no programa e que queremos saber quantos bytes esse tipo de dado ocupa. No terceiro parmetro, ns sempre usaremos 1. Finalmente, no quarto parmetro informamos o endereo do arquivo em que ser feita a leitura. Neste caso, o endereo do arquivo est armazenado no ponteiro paluno. Aps a leitura de um registro do arquivo, o leitor estar posicionado no incio do prximo registro. A Figura 3.5 apresenta a posio do leitor antes e depois da execuo do fread.

Figura 3.5: Posio do leitor antes e aps a execuo de um fread

Agora que j sabemos como fazer para ler um registro que est armazenado no arquivo, vamos aprender a gravar um registro no arquivo.

70

Programao 2

3.2.5 Comando para gravar um registro no arquivo Para gravar um registro em um arquivo binrio, ns utilizamos o comando fwrite. Este comando muito parecido com o fread. A diferena que o fread l uma sequncia de bytes no arquivo, e armazena em um registro (primeiro parmetro do fread). E o fwrite, pega um registro, e armazena suas informaes no arquivo. Vamos ver a sintaxe do fwrite:
Sintaxe

fwrite(&registro, numero_de_bytes, quantidade, ponteiro_arquivo);

Onde: &registro: o registro que ser armazenado no arquivo. numero_de_bytes: a quantidade de bytes que sero gravadas no arquivo. Neste parmetro, tambm usaremos o sizeof. quantidade: neste terceiro parmetro, tambm, usaremos SEMPRE 1. Este parmetro significa quantas vezes a gravao ser executada. Ns sempre queremos que seja feita a gravao de um registro por vez. Por isso, sempre utilizaremos 1. ponteiro_arquivo: precisamos informar em qual arquivo a gravao ser feita. Assim, utilizamos o ponteiro que tem o endereo do arquivo. Agora vamos ver o exemplo 3.5, que apresenta a gravao de um registro no arquivo. Para um melhor entendimento, foram feitas as declaraes das variveis que sero usadas no fwrite.

71

Programao 2

Exemplo 3.5: Leitura de um registro do arquivo

1 2 3 4 5 6 7 8

typedef {

int matricula; float nota1, nota2, media;

} TAluno

TAluno aluno; FILE *paluno;

fwrite(&aluno, sizeof(TAluno), 1, paluno);

Na linha 8 que temos o comando de gravao. Vamos interpretar cada parte do comando. No primeiro parmetro, temos a varivel registro que ser gravada no arquivo. No segundo parmetro, precisamos dizer quantos bytes sero gravados. Para isso, foi usada a funo sizeof. No terceiro parmetro, ns sempre usaremos 1. Finalmente, no quarto parmetro informamos o endereo do arquivo em que ser feita a gravao. Neste caso, o endereo do arquivo est armazenado no ponteiro paluno. Devemos lembrar que o comando de gravao no arquivo (fwrite) executado na posio onde o leitor se encontra no momento. Se o leitor estiver posicionado no incio de um registro e executarmos um fwrite, o registro ser gravado sobre o outro. Dessa forma, quando vamos inserir um novo registro no arquivo, devemos posicionar o leitor num ponto do arquivo que no tenha nenhum registro armazenado, ou seja, no final do arquivo. Vamos ver como faz isso? 3.2.6 Comando para posicionar o leitor em um ponto do arquivo As operaes de leitura e gravao so feitas na posio onde o leitor se encontra no momento. Podemos mudar a posio do leitor, colocando-o em um ponto especfico do arquivo. Este comando o fseek. A sintaxe do fseek a seguinte:
Sintaxe

fseek(ponteiro_arquivo,numero_de_bytes, origem);

72

Programao 2

Onde: ponteiro_arquivo: precisamos informar em qual arquivo o leitor est sendo posicionado. numero_de_bytes: a quantidade de bytes que o leitor ir se deslocar pelo arquivo, at chegar no local desejado. origem: determina a partir de onde os nmero_de_bytes de deslocamento do leitor sero contados. Os possveis valores so:
Origem SEEK_SET SEEK_CUR SEEK_END Significado O deslocamento do leitor ser contado a partir do incio do arquivo. O deslocamento do leitor ser contado a partir da sua posio corrente. O deslocamento do leitor ser contado a partir do final do arquivo.

O exemplo 3.6 apresenta o uso do comando fseek.


Exemplo 3.6: Comando fseek

1 2

fseek(paluno, 0,SEEK_END); fseek(paluno, 2*sizeof(paluno), SEEK_SET);

No exemplo da linha 1, temos um fseek que ser muito utilizado em nossos programas. Neste fseek solicitado que seja feito o posicionamento do leitor do arquivo de endereo paluno. O deslocamento do leitor ser feito iniciando a contagem a partir do fim do arquivo (SEEK_END)6. O nmero de bytes que o leitor ir se deslocar 0. Este tipo de fseek usado quando queremos gravar um novo registro do nosso arquivo. Jogamos o leitor para o fim do arquivo e no deslocamos nenhum byte. Com isso, temos a garantia que o leitor no est sobre nenhum registro. Dessa forma, podemos gravar um novo registro, sem perder registros que j haviam sido gravados no nosso arquivo. No fseek da linha 2, foi solicitado que o leitor seja posicionado no incio do arquivo (SEEK_SET), antes do deslocamento ser efetivado. Notem que, no segundo parmetro, foi passada uma expresso 2 * o tamanho de um registro. Neste caso, significa que o leitor ir deslocar a quantidade de bytes ocupadas por 2 registros, com isso, ir se posicionar no incio do terceiro registro. 73

Ateno
6 O parmetro origem, deve ser colocado todo em letra maiscula.

Programao 2

A figura 3.6 apresenta a posio do leitor aps a execuo dos fseek do exemplo.

Figura 3.6: Posio do leitor aps a execuo dos fseek do exemplo 3.6

3.2.7 Comando para posicionar o leitor no incio do arquivo Ns podemos posicionar o leitor no incio do arquivo, utilizando o comando rewind. A sua sintaxe a seguinte:
Sintaxe

rewind(ponteiro_arquivo);

Onde: ponteiro_arquivo: o ponteiro que tem o endereo do arquivo que queremos posicionar o leitor. O exemplo 3.7 apresenta o uso do comando rewind.
Exemplo 3.7: Uso do comando rewind

rewind(paluno);

O comando rewind utilizado quando precisamos fazer uma varredura por todos os registros do arquivo. A varredura iniciada colocando o leitor no incio do arquivo. 74

Programao 2

3.2.8 Comando para verificar se chegou ao final do arquivo Quando fazemos uma varredura no arquivo, no sabemos quantos registros tem armazenados no mesmo. No entanto, precisamos saber o momento de parar de executar a leitura dos registros. O comando feof (end of file) informa se o leitor chegou ao final do arquivo ou no. A sintaxe do feof a seguinte:
Sintaxe

int feof(ponteiro_arquivo);

Onde: int: o retorno da funo. A funo feof retorna um nmero inteiro, que indica se o arquivo terminou ou no. Quando a funo retorna zero, significa que ainda no chegou no final do arquivo. Qualquer valor diferente de zero, indica que chegou ao final do arquivo. ponteiro_arquivo: o ponteiro que tem o endereo do arquivo que queremos verificar se chegou ao fim. O exemplo 3.8 apresenta o uso do comando feof.
Exemplo 3.8: uso do comando feof

while (feof(paluno)==0)

Normalmente, o feof usando como condio de um while, como mostra o exemplo 3.8. Este while ser executado enquanto no chegar no final do arquivo. 3.2.9 Comando para remover um arquivo Quando desejamos apagar um arquivo do diretrio, podemos utilizar o comando remove. Este comando s pode ser utilizado em arquivos fechados. A sua sintaxe a seguinte:
Sintaxe

remove(nome_do_arquivo);

Onde: nome_do_arquivo: o nome do arquivo que queremos apagar. 75

Programao 2

Neste caso, utilizado o nome do arquivo salvo no diretrio do nosso computador. O exemplo 3.9 apresenta o uso do comando remove.
Exemplo 3.9: uso do comando remove

remove(alunos.bin);

Neste exemplo, computador.

arquivo

alunos.bin

ser

removido

do

3.2.10 Comando para renomear um arquivo Ns podemos renomear um arquivo no diretrio do nosso computador. Para isso, utilizamos o comando rename. Este comando, tambm, s pode ser utilizado em arquivos fechados. A sua sintaxe a seguinte:
Sintaxe

rename(nome_do_arquivo, novo_nome_do_arquivo);

Onde: nome_do_arquivo: o nome do arquivo que queremos renomear. Neste caso; utilizado o nome do arquivo salvo no diretrio do nosso computador. novo_nome_do_arquivo: o novo nome para o nosso arquivo. O exemplo 3.10 apresenta o uso do comando rename.
Exemplo 3.10: uso do comando rename

rename(alunos.bin, alunos_temp.bin);

Neste exemplo, o arquivo alunos.bin, ser renomeado para alunos_temp.bin.

3.3 Implementao das operaes bsicas em um arquivo


Agora a hora de fazermos o nosso programa completo, que 76

Programao 2

ir aplicar os comandos de manipulao de arquivo, descritos na seo 3.2. Este programa ir gerenciar os dados dos alunos de uma turma, que sero armazenados em um arquivo. O registro do aluno composto pela matrcula, nome e mdia do aluno. O programa implementar as seguintes operaes: cadastrar aluno, remover aluno, consultar aluno por matrcula, alterar mdia do aluno e listagem de todos os alunos. Mais uma vez, teremos um programa cheio de detalhes, bem maior do que os que fizemos at ento. Por isso, o programa completo 3.1 foi desenvolvido de forma modularizada. Para facilitar o entendimento deste programa, que tem quase 200 linhas, o mesmo foi dividido em 8 partes. Vamos comear? Na primeira parte do programa completo 3.1, teremos as declaraes das variveis globais do programa. Alm, de mdulos auxiliares, que sero utilizados ao longo do programa, por outros mdulos.
Programa Completo 3.1- Parte 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 } void linha() { int i; for (i=1; i<=80; i++) printf(_); FILE *paluno; TAluno aluno_aux, aluno_nulo; typedef struct{ int mat; char nome[20]; float med; } TAluno; #include <stdio.h>

77

Programao 2

17 18 19 20 21 22 23 24 25 26 27

void cabec() { system(cls); printf(Universidade Pernambuco\n); linha(); } Federal Rural de

void abre_arquivo() { paluno = fopen(aluno.dat, r+b); if (paluno == NULL) paluno = fopen(aluno.dat, w+b); }

Comentrios sobre o Programa Completo 3.1, Parte 1: Linha 1: incluso da biblioteca stdio.h devido o uso do comando fflush e comandos de manipulao de arquivo. Linhas 3 a 6: definio de um novo tipo de dados TAluno, que agrupa os dados de um aluno. O tipo TAluno composto pela matrcula, nome e mdia do aluno. Linha 8: declarao do ponteiro paluno, que armazenar o endereo do arquivo com os registros dos alunos. Linha 9: declarao de dois registros: aluno_aux e aluno_nulo. O registro aluno_aux, ser utilizado quando precisamos ler ou gravar um registro no arquivo. O registro aluno_nulo ser utilizado no momento da remoo de um aluno do arquivo. As variveis declaradas nas linhas 8 e 9 so globais, por isso, podem ser acessadas por todos os mdulos do programa. Linhas 11 a 15: temos o primeiro mdulo do nosso programa. O mdulo linha tem como objetivo, passar uma linha na tela. Este mdulo ser chamado pelos demais mdulos do programa. Linhas 17 a 21: temos a sequncia de comandos do mdulo cabec. O mdulo cabec faz o cabealho das tela. Ao iniciar uma operao do programa (cadastro, remoo, etc), a tela deve ser limpa e precisamos colocar o nome da universidade no topo 78

Programao 2

da tela. O mdulo cabec vai: limpar a tela, colocar o nome da instituio e passar uma linha (fazendo uso do mdulo linha). Linhas 23 a 27: temos a sequncia de comandos do mdulo que responsvel por abrir o arquivo dos alunos, e deix-lo disponvel para uso. Vamos entender a lgica deste mdulo? Primeiramente, feita uma tentativa de abrir o arquivo dos alunos alunos.dat com o modo de abertura r+b, no comando fopen. Lembrem que o modo de abertura r+b s pode ser utilizado quando o arquivo j existe. O processador vai procurar o arquivo alunos.dat no diretrio. Se o arquivo no for encontrado, o ponteiro paluno, ficar com NULL. Mas, se for encontrado, o endereo de memria do arquivo ser armazenado no ponteiro paluno. Na sequncia (linha 25), temos um if que testa o valor do ponteiro paluno. Se o ponteiro paluno estiver com NULL, significa que o arquivo alunos.dat no existe ainda e precisa ser criado. Se isso acontecer, o comando vinculado ao if executado. Este comando um fopen, s que agora utiliza o modo de abertura w+b, que deve ser utilizado para arquivos que no existe. Mas, por que no abrimos o arquivo usando logo o w+b? Vocs devem estar lembrados, que o modo de abertura w+b apaga todos os registros de um arquivo quando ele j existe. Assim, tentamos primeiro abrir o arquivo com r+b (utilizado para arquivos que j existem e abre o arquivo sem apagar os registros). Se der erro, porque o arquivo no existe. Com isso, tentamos abrir com o modo de abertura w+b. Vamos agora para a parte 2 do programa completo 3.1. Nesta parte temos o mdulo inserir, que responsvel pelo cadastro dos registros dos alunos no arquivo. Para fazer o cadastro de um registro no arquivo binrio, devemos obter os dados do aluno, montando o registro que iremos gravar no arquivo. Quando o registro estiver com todas as informaes do aluno (mat, nome e media), o mesmo poder ser gravado no final do arquivo.

Ateno
7 O nome do arquivo que ns passarmos como parmetro no fopen ser utilizado para salvar nosso arquivo no diretrio. Por exemplo, aps a execuo do mdulo abre_ arquivo, teremos um arquivo chamado alunos. dat no diretrio onde est salvo o programa executvel. Por conveno, coloque os arquivos de dados sempre com a extenso dat ou bin.

79

Programao 2

Programa Completo 3.1- Parte 2 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 } paluno); \n\n); void inserir() { int resp; do { cabec(); printf(\n\nCadastrar novo aluno\n\n); printf(\nMatricula: ); scanf(%d, &aluno_aux.mat); printf(\nNome.....: ); fflush(stdin); gets(aluno_aux.nome); printf(\nMedia....: ); scanf(%f, &aluno_aux.med); fseek(paluno, 0, SEEK_END); fwrite(&aluno_aux, sizeof(TAluno), 1,

printf(\n\nAluno cadastrado com sucesso! cadastrar outro

printf(\nDeseja (1-sim/0-nao)? ); scanf(%d, &resp); } while (resp ==1);

Comentrios sobre o Programa Completo 3.1, Parte 2 Linha 28: incio do mdulo inserir. Linha 29: declarao da varivel resp. Esta varivel ir armazenar a resposta do usurio, quando for perguntado se ele deseja cadastrar mais alunos. Linha 30: incio de um do/while. O mdulo inserir ficar executando enquanto o usurio desejar cadastrar novos alunos. Nesta linha, tambm temos a chamada do mdulo cabec. Cada vez que um cadastro feito, a tela vai ser limpa, para iniciar um 80

Programao 2

novo cadastro. Linha 31: printf que informa o que esta tela faz cadastro de alunos. Linhas 32 e 33: printf solicitando que seja digitada a matrcula do aluno e scanf que l esta informao. Os dados do aluno vo sendo colocados no registro aluno_aux. Linhas 34 a 36: printf solicitando que seja digitado o nome do aluno, fflush para limpar o buffer de entrada (j que teremos a leitura de uma sequncia de caractere) e o gets que l o nome do aluno e armazena no registro aluno_aux. Linhas 37 e 38: printf solicitando que seja digitada a mdia do aluno e scanf que l esta informao. Neste momento, o registro aluno_aux acabou de ser todo preenchido com os dados do aluno e j pode ser gravado no arquivo. Linha 39: para gravar o registro no arquivo, devemos posicionar o leitor no final do arquivo para no correr o risco de fazer a gravao sobre algum outro registro. Para isso, executado o fseek. Linha 40: com o leitor posicionado no final do arquivo, podemos executar o fwrite, que vai gravar o contedo do registro aluno_ aux, no nosso arquivo. Linha 41: printf para informar que o aluno foi cadastrado com sucesso. Linhas 42 e 43: printf para pergunta se o usurio deseja cadastrar outro aluno e scanf que l a resposta para esta pergunta. Linha 44: final do do/while, com a condio de parada. O do/ while executado enquanto o usurio estiver respondendo que quer cadastrar mais alunos. Notem que, no precisamos nos preocupar com a capacidade do arquivo. Vamos armazenando quantos registros desejarmos. Linha 45: fecha chaves que indica o final do mdulo inserir. A figura 3.7 apresenta a tela de execuo do programa 3.1, na tela de cadastro de novo aluno.

81

Programao 2

Figura 3.7: Tela de cadastro de aluno

Vamos ver agora o cdigo de dois mdulos que sero utilizados pelos mdulos: consultar aluno por matrcula, remover aluno e alterar mdia do aluno. Quando fazemos uma consulta, alterao ou remoo, precisamos localizar o registro do aluno no arquivo e apresentar o registro para o usurio. Por isso, foi criado um mdulo responsvel para procurar um registro no arquivo e, outro mdulo, responsvel por apresentar os dados do registro de um aluno. Vamos l, entender a parte 3 do nosso programa completo 3.1!
Programa Completo 3.1- Parte 3 46 47 48 49 50 51 52 53 54 55 56 paluno); else { fread(&aluno_aux, sizeof(TAluno), 1, int procura(int matp) { int p; p = 0; rewind(paluno); fread(&aluno_aux, sizeof(TAluno), 1, paluno); while (feof(paluno)==0) { if (aluno_aux.mat == matp) return p;

p++;

82

Programao 2

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 } } }

return -1;

void mostre(int pos) { fseek(paluno, pos*sizeof(TAluno), SEEK_SET); fread(&aluno_aux, sizeof(TAluno), 1, paluno); printf(\n\n); linha(); printf(Matricula linha(); printf(%9d %-20s %5.1f\n, aluno_aux.mat, Nome Media\n);

aluno_aux.nome, aluno_aux.med); linha();

Comentrios sobre o Programa Completo 3.1, Parte 3: Linhas 46 a 60: temos a sequncia de comandos do mdulo procura. O mdulo recebe um parmetro, que a matrcula do aluno que est sendo procurado. Ao finalizar a sua execuo, esse mdulo retorna um int que pode ser: -1 (significa que procurou o registro do aluno no arquivo e no achou) ou um nmero positivo (que significa em qual posio do arquivo o registro foi encontrado). Este mdulo possui uma varivel local p, que incrementada cada vez que feita a leitura de um registro no arquivo. o valor desta varivel que indica em que posio do arquivo o registro foi encontrado. Para localizar o registro de um aluno, com uma dada matrcula, precisamos percorrer todo o arquivo, at encontrar o registro ou at o arquivo chegar ao fim. Para percorrer o arquivo, colocamos o leitor no incio do mesmo (usando o rewind linha 49) e efetuamos vrios fread, at que chegue no final do arquivo (while da linha 51). Logo aps posicionar o leitor no incio do 83

Programao 2

arquivo, fazemos a leitura do primeiro registro do arquivo, para verificar se no o final de arquivo (end of file). Lembrem que, assim que um fread executado, o leitor j fica posicionado no incio do prximo registro, pronto para um novo fread. Quando um registro do arquivo tem a mesma matrcula que est sendo procurada, significa que encontramos o aluno. Com isso, j pode ser dado o retorno, indicando a posio onde o registro foi encontrado (linha 52 e 53). Se fizermos a leitura de todos os registros do arquivo e no encontrar nenhum aluno com a matrcula procurada, o mdulo retornar -1 (linha 59). Linhas 62 a 72: temos a sequncia de comandos do mdulo mostre. Este mdulo recebe como parmetro a posio do registro que deve ser apresentado, recupera o registro no arquivo e apresenta os dados do registro em forma de tabela. O mdulo comea com o posicionamento do leitor no incio do registro que deve ser mostrado (linha 63). Notem que, no fseek, no campo que indica o tamanho do deslocamento que o leitor vai dar, feita a conta: pos*sizeof(TAluno). Vamos entender o porqu desta conta. A varivel pos indica em que posio o registro est armazenado no arquivo (se ele o primeiro, segundo, etc.). Consequentemente, saberemos quantos registros tem armazenados antes do registro que queremos mostrar. E assim, saberemos sobre quantos registros o leitor dever se deslocar, at ser posicionado no incio do registro desejado. Com o leitor no ponto certo, podemos fazer a leitura do registro do aluno, armazenando seus dados no registro aluno_aux (linha 64). Aps isto, precisamos apenas apresentar os dados do aluno (linhas 65 a 71). Vamos agora entender o mdulo responsvel por consultar um aluno atravs do seu nmero de matrcula. O mdulo consultar vai solicitar que o usurio informe a matrcula do aluno que deseja consultar. Atravs do uso do mdulo procura descoberta em que posio o registro do aluno se encontra armazenado no arquivo. Se o aluno estiver armazenado no arquivo, seus dados so apresentados, atravs do uso do mdulo mostre. Se o aluno no for encontrado, apresentada uma mensagem de erro.

84

Programao 2

Programa Completo 3.1- Parte 4 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 } \n\n); else mostre(posicao); printf(\n\nDeseja (1-sim/0-nao)? ); scanf(%d, &resp); } while (resp == 1); consultar outro void consultar() { int resp, matcon, posicao; do{ cabec(); printf(\n\nConsultar Aluno\n\n\n); printf(Matricula do aluno: ); scanf(%d, &matcon); posicao = procura(matcon); if (posicao == -1) printf(\n\nMatricula nao encontrada!

Comentrios sobre o Programa Completo 3.1, Parte 4 Linha 73: incio do mdulo consultar. Linha 74: declarao das variveis locais: resp, matcon (matricula que ser consultada) e posicao (armazena em que posio o registro foi localizado). Linha 75: incio de um do/while. O mdulo consultar ficar executando enquanto o usurio desejar consultar alunos. Nesta linha, tambm temos a chamada o mdulo cabec. Cada vez que uma consulta feita, a tela vai ser limpa, para iniciar uma nova consulta. Linha 76: printf que informa o que esta tela faz consultar aluno. Linhas 77 e 78: printf solicitando que seja digitada a matrcula 85

Programao 2

do aluno que deseja consultar e scanf que l esta informao. Linha 79: chamada do mdulo procura, passando a matrcula que desejamos consultar como parmetro. O retorno do mdulo procura armazenado na varivel posicao. Linhas 80 a 83: if que verifica se a varivel posicao tem armazenado -1. Se sim, porque o aluno no foi encontrado. Com isso, escrita uma mensagem de erro. Caso posicao no esteja com -1, porque o aluno foi encontrado e seus dados devem ser apresentados. Para apresentar os dados do aluno, fazemos uma chamada ao mdulo mostre, passando a posio onde o aluno foi encontrado, como parmetro. Linhas 84 e 85: printf para perguntar se o usurio deseja consultar outro aluno e scanf que l a resposta para esta pergunta. Linha 86: final do do/while, com a condio de parada. O do/ while executado enquanto o usurio estiver respondendo que quer consultar mais alunos. Linha 87: fecha chaves que indica o final do mdulo consultar. A figura 3.8 apresenta a tela de execuo do programa completo 3.1, na tela de consulta aluno por matrcula.

Figura 3.8: Tela de consulta aluno por matrcula

Vamos agora entender o mdulo responsvel por remover um aluno do arquivo. O mdulo da remoo inicia de forma muito similar ao da consulta. Primeiro, solicitado o nmero da matrcula do aluno 86

Programao 2

que ser removido, seu registro localizado e apresentado para que o usurio possa ter certeza que vai remover o registro certo. Na verdade, um registro no removido do arquivo, o que fazemos gravar sobre o registro do aluno que queremos remover, um registro com os dados zerados (aluno_nulo). Assim, toda vez que temos um registro com a matrcula igual a zero no arquivo, significa que ele um registro que foi removido. Se o aluno no for encontrado, apresentada uma mensagem de erro.
Programa Completo 3.1- Parte 5 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 else { mostre(posicao); printf(\n\nDeseja remover o aluno void remover() { int matrem, conf, resp, posicao; aluno_nulo.mat = 0; aluno_nulo.med = 0; do{ cabec(); printf(\n\nRemover aluno\n\n\n); printf(Matricula: ); scanf(%d, &matrem); posicao = procura(matrem); if (posicao == -1) printf(\nAluno nao encontrado!!\a);

(1-sim/0-nao)? );

scanf(%d, &conf); if (conf == 1) { fseek(paluno,posicao*sizeof (TAluno),SEEK_SET); f w r i t e ( & a l u n o _ n u l o , sizeof(TAluno), 1, paluno); sucesso!); } printf(\n\nAluno removido com

87

Programao 2

108 109 110 111 112 113 114 } }

else printf(\nRemocao cancelada!);

printf(\n\n\nDeseja (1-sim/0-nao)? ); scanf(%d, &resp); } while (resp ==1);

remover

outro

Comentrios sobre o Programa Completo 3.1, Parte 5: Linha 88: incio do mdulo remover. Linha 89: declarao das variveis locais: resp, matrem (matricula que ser removida), conf (confirmao se deseja remover realmente) e posicao (armazena em que posio o registro foi localizado). Linhas 90 e 91: inicializao dos campos do registro aluno_ nulo. Linha 92: incio de um do/while. O mdulo remover ficar executando enquanto o usurio desejar remover alunos. Nesta linha, tambm temos a chamada do mdulo cabec. Cada vez que uma remoo feita, a tela vai ser limpa, para iniciar uma nova remoo. Linha 93: printf que informa o que esta tela faz remover aluno. Linhas 94 e 95: printf solicitando que seja digitada a matrcula do aluno que deseja remover e scanf que l esta informao. Linha 96: chamada do mdulo procura, passando a matrcula que desejamos remover como parmetro. O retorno do mdulo procura armazenado na varivel posicao. Linhas 97 a 110: if que verifica se a varivel posicao tem armazenado -1. Se sim, porque o aluno no foi encontrado. Com isso, escrita uma mensagem de erro. Caso posicao no esteja com -1, porque o aluno foi encontrado e seus dados devem ser apresentados. Para apresentar os dados do aluno, 88

Programao 2

fazemos uma chamada ao mdulo mostre, passando a posio onde o aluno foi encontrado como parmetro. Aps ver os dados do aluno, o usurio pode desistir de remov-lo. Na linha 102, temos o scanf que l se o usurio confirma ou no a remoo. A remoo, propriamente dita, executada nas linhas 104 e 105. Na linha 104 temos o posicionamento do leitor sobre o registro que queremos remover. E, na linha 105, temos a gravao do registro aluno_nulo sobre o registro antigo. Linhas 111 e 112: printf para pergunta se o usurio deseja remover outro aluno e scanf que l a resposta para esta pergunta. Linha 113: final do do/while, com a condio de parada. O do/ while executado enquanto o usurio estiver respondendo que quer remover mais alunos. Linha 114: fecha chaves que indica o final do mdulo remover. A figura 3.9 apresenta a tela de execuo do programa 3.1, na tela de remoo de aluno.

Figura 3.9: Tela de remoo do registro do aluno

Agora vamos entender o mdulo responsvel pela alterao da mdia do aluno. Este mdulo parecido com a remoo. Primeiro, solicitado o nmero da matrcula do aluno que ser alterado, seu registro localizado e apresentado para que o usurio possa ter certeza que vai alterar o registro certo. Na alterao, gravamos um registro com a mdia alterada, sobre o antigo registro do aluno. 89

Programao 2

Programa Completo 3.1- Parte 6 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 \n\n); SEEK_SET); paluno); else { mostre(posicao); a media do void alterar() { int matalt, conf, resp, posicao; do { cabec(); n\n); printf(\n\nAlterar media do aluno\n\

printf(Matricula: ); scanf(%d, &matalt); posicao = procura(matalt); if (posicao == -1) printf(\nAluno,nao encontrado!!\a);

printf(\n\nAlterar aluno(1-sim/0-nao)? ); scanf(%d, &conf); if (conf == 1) {

printf(\nNova media: ); scanf(%f, &aluno_aux.med);

printf(\nMedia alterada com sucesso! fseek(paluno,posicao*sizeof(TAluno), fwrite(&aluno_aux,sizeof(TAluno), mostre(posicao); 1,

printf(\nMedia do aluno alterada com sucesso!\n); } else

90

Programao 2

138 139 140 141 142 143

\n\n); }

printf(\n\nAlteracao

cancelada!

printf(\n\nDeseja (1-sim/0-nao)? ); scanf(%d, &resp); }while (resp ==1); }

alterar

outro

Comentrios sobre o Programa Completo 3.1, Parte 6: Linha 115: incio do mdulo alterar. Linha 116: declarao das variveis locais: resp, matalt (matricula que ser alterada), conf (confirmao se deseja alterar a mdia do aluno) e posicao (armazena em que posio o registro foi localizado). Linha 117: incio de um do/while. O mdulo alterar ficar executando enquanto o usurio desejar alterar alunos. Nesta linha, tambm temos a chamada do mdulo cabec. Cada vez que uma alterao feita, a tela vai ser limpa, para iniciar uma nova alterao. Linha 118: printf que informa o que esta tela faz alterar mdia do aluno. Linhas 119 e 120: printf solicitando que seja digitada a matrcula do aluno que deseja alterar e scanf que l esta informao. Linha 121: chamada do mdulo procura, passando a matrcula que desejamos alterar como parmetro. O retorno do mdulo procura armazenado na varivel posicao. Linhas 122 a 139: if que verifica se a varivel posicao tem armazenado -1. Se sim, porque o aluno no foi encontrado. Com isso, escrita uma mensagem de erro. Caso posicao no esteja com -1, porque o aluno foi encontrado e seus dados devem ser apresentados. Para apresentar os dados do aluno, fazemos uma chamada ao mdulo mostre, passando a posio onde o aluno foi encontrado como parmetro. Aps ver os dados do aluno, o usurio pode desistir de alterar a sua mdia. Na 91

Programao 2

linha 127, temos o scanf que l se o usurio confirma ou no a alterao. Se o usurio confirma que quer alterar, solicitada a nova mdia do aluno (linha 130). A alterao, propriamente dita, executada nas linhas 132 e 133. Na linha 132, temos o posicionamento do leitor sobre o registro que queremos alterar. E, na linha 133, temos a gravao do registro alterado sobre o registro antigo. Aps os dados serem alterados, o registro do aluno reapresentado atravs de uma chamada ao mdulo mostre (linha 134). Linhas 140 e 141: printf para pergunta se o usurio deseja alterar outro aluno e scanf que l a resposta para esta pergunta. Linha 142: final do do/while, com a condio de parada. O do/ while executado enquanto o usurio estiver respondendo que quer alterar mais alunos. Linha 143: fecha chaves que indica o final do mdulo alterar. A figura 3.10 apresenta a tela de execuo do programa completo 3.1, na tela de alterao de mdia do aluno.

Figura 3.10: Tela de alterao de mdia do aluno

Veremos, agora, o ltimo mdulo do programa, que a listagem. Este mdulo responsvel por apresentar todos dados dos alunos que esto armazenados no arquivo. Os dados sero apresentados em forma de tabela. Devemos lembrar que s iremos apresentar os 92

Programao 2

registros vlidos do arquivo, ou seja, registros com matrcula zerada no devem ser apresentados.
Programa Completo 3.1- Parte 7 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 } paluno); } linha(); printf(tecle enter para voltar ao menu...); getche(); mat, void listagem() { cabec(); printf(\n\nListagem Geral\n\n\n); linha(); printf(Matricula linha(); rewind(paluno); fread(&aluno_aux, sizeof(TAluno), 1, paluno); while (feof(paluno)==0) { if (aluno_aux.mat != 0) printf(%9d %-20s %5.1f\n, aluno_aux. Nome Media\n);

aluno_aux.nome, aluno_aux.med); fread(&aluno_aux, sizeof(TAluno), 1,

Comentrios sobre o Programa Completo 3.1, Parte 7 Linha 144: incio do mdulo listagem. Linha 145: chamada ao mdulo cabec, responsvel por limpar a tela e escrever o nome da instituio. Linha 146: printf que informa o que esta tela faz listagem geral. Linha 147: chamada do mdulo linha, para iniciar o desenho da tabela. 93

Programao 2

Linha 148: printf que escreve os cabealhos das colunas da tabela. Linha 149: mais uma chamada ao mdulo linha. Linha 150: posiciona o leitor no incio do arquivo, para que possamos varrer o arquivo, visitando todos os registros do arquivo. Linha 151: Leitura do primeiro registro do arquivo, para verificar se no o final do arquivo. Linhas 152 a 157: while que executado enquanto no chegar no final do arquivo. Para cada registro lido, verificado se o mesmo tem a matrcula igual a zero. Se sim, o registro no apresentado na listagem. Linha 158: chamada do mdulo linha, para fechar a tabela. Linha 159: printf informando que o usurio deve teclar enter para sair da listagem. Linha 160: getche para que possamos ver a listagem. Linha 161: fecha chaves que indica o final do mdulo listagem. A figura 3.11 apresenta a tela de execuo do programa completo 3.1, na tela de listagem dos dados de todos os alunos.

Figura 3.11: Tela de listagem de dados de todos os alunos

O programa principal do programa completo 3.1 apresentado a seguir. no programa principal que sero feitas as chamadas aos mdulos que o usurio deseja executar no momento. 94

Programao 2

Programa Completo 3.1- Parte 8 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 main() { int op; abre_arquivo(); do{ cabec(); printf(\n\nOpcoes: \n\n\n); printf( printf( printf( matricula\n\n); \n\n); printf( printf( printf( linha(); printf(Informe a opcao desejada: ); scanf(%d, &op); switch(op) { case 1: inserir(); break; case 2: remover(); break; case 3: consultar(); break; case 4: alterar(); break; case 5: listagem(); break; case 6: limpar(); break; case 0: fclose(paluno); break; invalida!); default: break; printf(\n\n\aOpcao 1- Cadastrar novo aluno\n\n); 2- Remover aluno\n\n); 34Consultar media aluno do por aluno

Alterar

5- Listagem geral\n\n); 0- Sair\n\n);

95

Programao 2

186 187 188 }

} } while (op != 0);

Comentrios sobre o Programa Completo 3.1, Parte 8: Linha 162: incio do programa principal. Linha 163: declarao da varivel local op, que vai armazenar a operao que o usurio deseja executar. Linha 164: chamada do mdulo abre_arquivo, disponibilizando o mesmo para uso. Linhas 165 a 187: do/while responsvel por ler a operao que o usurio que executar e fazer a chamada do mdulo que executar a implementa a operao. Linha 188: fecha chaves do programa principal. A figura 3.12 apresenta a tela de execuo do programa 3.1, na tela do menu principal, onde informada a operao que desejamos executar.

Figura 3.12: Tela do menu principal

E assim, terminamos mais um programa completo. Agora, colocar a mo no teclado e comear a programar, armazenando dados em arquivos. 96

Programao 2

Atividades e Orientaes de Estudos Temos agora mais uma lista de exerccios para consolidar o nosso entendimento do assunto visto neste captulo. Se preparem, pois as questes esto maiores. Mas, isso bom porque vemos que estamos fazendo programas interessantes, no mesmo? 1. Faa um programa para um shopping contendo as seguintes telas:
Tela de Menu Shopping Center Opes: 1 .Cadastrar loja 2. Consultar loja 3. Listagem de todas as lojas 0. Sair Entre com a opo: Cadastro Shopping Center Cadastro de Loja Cdigo: Nome: rea: Tipo(1-Confeces, 2-Alimentao, 3-Livros, 4- Servios): Cadastrar outra (1-Sim/0-Nao)?

Consulta Shopping Center Consultar Loja Cdigo da loja que deseja consultar: Cdigo xxx Nome xxxxxxx rea xx Tipo xx Condomnio xxxx

Consultar outra (1-Sim/0-Nao)?

97

Programao 2

Relatrio Geral Shopping Center Listagem Geral Codigo xxx xxx xxx Nome xxxxxxx xxxxxxx xxxxxxx rea xx xx xx Tipo xx xx xx Condomnio xxxxx xxxxx xxxxx

Tecle enter para voltar ao menu...

O programa ir armazenar os dados das lojas em um arquivo. O programa ir calcular o valor do condomnio de cada loja. O valor do condomnio depende da rea e do tipo da loja. Veja tabela abaixo:
Tipo da loja 1 2 3 4 Valor do m R$ 50 R$ 65 R$ 80 R$ 95

2. Faa um programa para uma Agncia de Turismo armazenando os dados em um arquivo. O programa dever ter as seguintes funes: Cadastrar roteiro, Consultar roteiro, Listagem de todos os roteiros e Simular valor de viagem. A seguir, sugestes de telas.
Tela Principal Vida Boa Turismo Opes: 1- Cadastrar roteiro 2- Consultar roteiro 3- Listagem de todos os roteiros 4- Simular viagem 0- Sair Entre com a opo:

98

Programao 2

Tela de Cadastro Vida Boa Turismo Cadastrar Roteiro Cdigo: Pas(1-Brasil, 2-Espanha, -3-Italia): Cidade: Diria de Hotel: R$ Diria Aluguel de Carro: R$ Inserir outro(1-sim,2-no)?

Tela de Remoo de Roteiro Vida Boa Turismo Consultar Roteiro Cdigo do roteiro a ser consultado: Cdigo xxx Pas x Cidade xxxxxxxx Diria Hotel xxx Carro xxxx

Consultar outro (1-Sim/0-Nao)? Tela de Listagem de todos os roteiros Vida Boa Turismo Listagem de todos os roteiros Cdigo xxx xxx xxx Pas x x x Cidade xxxxxxxx xxxxxxxx xxxxxxxx Diria Hotel xxx xxx xxx Carro xxxx xxxx xxxx

Pgina x de x... Tecle enter Tecle enter para voltar ao menu...

99

Programao 2

Tela para simular valor de viagem Vida Boa Turismo Simular Viagem Cdigo do roteiro: Cdigo xxx Pas x Cidade xxxxxxxx Diria Hotel xxx Carro xxxx

Quantidade de dias: Alugar carro(1-sim, 2-no)? Valor total da viagem = R$ xxxxx Simular outro roteiro(1-sim, 2-no)?

Observaes: Os dados do roteiro devem ser armazenados em um arquivo. No pode cadastrar roteiros com cdigos repetidos. O valor da viagem deve ser calculado com base nos valores do roteiro escolhido; viagem = quantos dias * valor diria hotel + quantos dias * valor diria carro (caso alugue carro). Na consulta deve passar o cdigo do roteiro e apresentar os dados do roteiro. Na listagem, apresentar os dados de todos os roteiros em forma de tabela.

Conhea Mais Para melhorar o nosso conhecimento sobre manipulao de arquivos binrios, vejam este assunto nos livros: LAUREANO, Marcos. Programando em C Para Linux, Unix e Windows. Rio de Janeiro: Brasport, 2005. MIZRAHI, Victorine Viviane. Treinamento em Linguagem C Curso Completo. So Paulo: Makron, 1999.

100

Programao 2

Vamos revisar? Vamos fazer uma reviso do assunto que foi visto neste captulo, lendo o resumo a seguir: Os arquivos servem para armazenar nossos dados de forma definitiva. Os arquivos binrios so adequados para o armazenamento de registros. Cada registro que armazenado no arquivo ocupa a mesma quantidade de memria. Toda operao sobre um arquivo ser executada no ponto onde o leitor se encontra. Com o comando fseek, podemos colocar o leitor sobre o registro que desejamos ler ou gravar. S podemos manipular um arquivo que esteja aberto. Aps o uso do arquivo, devemos fech-lo. O arquivo criado pelo programa salvo no mesmo diretrio em que est armazenado o nosso programa executvel.

101

Programao 2

Consideraes Finais
Neste volume, tivemos a oportunidade de aprender como armazenar dados em vetores, registros e arquivos. O armazenamento adequado dos dados possibilitou o desenvolvimento de programas com operaes mais elaboradas como: cadastro de elementos, remoo, alterao, consultas e listagens. Perceberam o quanto nossos programas evoluram desde o nosso primeiro programa completo, at hoje? Vejam que todos os conceitos que aprendemos esto sempre em uso nos nossos programas. Isto bom porque nos acostumamos com a sintaxe dos comandos. Agora, temos apenas mais um mdulo para finalizar a nossa caminhada, em busca do aprendizado da linguagem de programao C. Continuem firmes nos estudos! Estamos quase no final! At o prximo mdulo.

102

Programao 2

Referncias

ARAJO, Jairo. Dominando a Linguagem C. So Paulo: Cincia Moderna, 2004. ASCENIO, Ana Fernanda Gomes e CAMPOS, Edilene Aparecida Veneruchi. Fundamentos de Programao de Computadores. So Paulo: Prentice Hall, 2002. DEITEL, H, M e DEITEL, P. J. Como Programar em C. Rio de Janeiro: LTC, 1999. LAUREANO, Marcos. Programando em C Para Linux, Unix e Windows. Rio de Janeiro: Brasport, 2005. MIZRAHI, Victorine Viviane. Treinamento em Linguagem C Curso Completo. So Paulo: Makron, 1999. MONTGOMERY, Eduard. Programando em C: Simples e Prtico. So Paulo: Alta Books, 2006. OLIVEIRA, Ulisses. Programando em C Volume I Fundamentos. So Paulo: Cincia Moderna, 2004. SCHILDT, Herbert. C Completo e Total. So Paulo: Makron, 1996.

103

Programao 2

Conhecendo a Autora
Sou graduada em Cincia da computao pela Universidade Federal de Sergipe. Fiz mestrado e doutorado na Universidade Federal de Pernambuco, desenvolvendo pesquisas nas reas de Sistemas Distribudos e Geoprocessamento. Comeei a ensinar em 2000, nos cursos de Cincia da Computao e Sistemas de Informao. Desde o incio da minha carreira como professora, ministro disciplinas de Programao e tenho uma paixo pela linguagem C. Atualmente, encontrei uma nova paixo: Educao a Distncia.

104

Você também pode gostar