Documente Academic
Documente Profesional
Documente Cultură
Meu nome Rodrigo de Oliveira Plotze. Sou doutor na rea de Computao Grfica e Processamento de
Imagens pelo Instituto de Cincias Matemticas e de Computao da USP So Carlos. Desenvolvo
pesquisas na rea de Viso Computacional aplicada Biologia e Medicina, na qual tenho diversos
trabalhos publicados em peridicos nacionais e internacionais. Trabalho como docente dos cursos de Ps-
Graduao em Desenvolvimento de Software (Java e .NET) no Claretiano Centro Universitrio, e,
tambm, em cursos de graduao em Cincia da Computao, Engenharia da Computao e Sistemas de
Informaes em outras Instituies de Ensino Superior.
e-mail: rodrigoplotze@gmail.com
LABORATRIO DE PROGRAMAO
Batatais
Claretiano
2014
Ao Educacional Claretiana, 2010 Batatais (SP)
Verso: dez./2014
005.133P786l
Plotze,RodrigodeOliveira
Laboratriodeprogramao/RodrigodeOliveiraPlotzeBatatais,SP:
Claretiano,2014.
330p.
ISBN:9788583772583
1.Estruturascondicionaisederepetio.2.Vetores.3.Matrizes.4.Registros.
5.Ponteiros.6.Programaomodular.7.Recursividade.I.Laboratriodeprogramao.
CDD005.133
Todos os direitos reservados. proibida a reproduo, a transmisso total ou parcial por qualquer forma
e/ou qualquer meio (eletrnico ou mecnico, incluindo fotocpia, gravao e distribuio na web), ou o
arquivamento em qualquer sistema de banco de dados sem a permisso por escrito do autor e da Ao
Educacional Claretiana.
Unidade6 ARQUIVOS
1 OBJETIVO...................................................................................................................................................... 299
2 CONTEDO................................................................................................................................................... 299
3 ORIENTAES PARA O ESTUDO DA UNIDADE...........................................................................................299
4 INTRODUO UNIDADE...........................................................................................................................300
5 ESTRUTURA BSICA PARA MANIPULAO DE ARQUIVOS.......................................................................300
6 EXERCCIOS RESOLVIDOS............................................................................................................................309
7 QUESTES AUTOAVALIATIVAS....................................................................................................................328
8 CONSIDERAES ......................................................................................................................................... 328
9 REFERNCIA BIBLIOGRFICA......................................................................................................................329
Caderno de
Referncia de
Contedo
CRC
Contedo
Introduo aos conceitos bsicos de programao de computadores. Instalao e configurao de ambiente de
desenvolvimento. Estruturas condicionais. Estruturas de repetio. Vetores e Matrizes. Registros. Ponteiros. Progra-
mao modular. Passagem de parmetros. Recursividade. Arquivos.
1. INTRODUO
Seja bem-vindo!
Voc est iniciando o estudo de Laboratrio de Programao, na qual ter a possibilidade
de aprender como desenvolver programas de computador utilizando a linguagem de programa-
o C. Para facilitar a sua compreenso, o contedo foi dividido em seis unidades.
Durante este estudo, voc conhecer desde os conceitos fundamentais para construo
de programas, como estruturas sequenciais, estruturas de controle e estruturas de dados, at
aspectos avanados, como programao modular e alocao dinmica de memria.
Um dos aspectos fundamentais para o desenvolvimento de programas o armazenamen-
to de informaes. Para isso, estudaremos como manipular arquivos por meio da linguagem de
programao C. Com o contedo a ser estudado, alm de criar arquivos no sistema operacional,
saberemos como gravar e recuperar informaes.
Tambm fundamental que voc, como desenvolvedor, acompanhe a evoluo das tec-
nologias utilizadas no desenvolvimento de aplicaes. Para isso, no utilize apenas este material
como fonte de informao. essencial que complemente sua formao consultando outras fon-
tes, como livros, revistas e internet. Alm disso, no se esquea de compartilhar suas experin-
8 Laboratrio de Programao
cias por meio dos Fruns e da Lista na Sala de Aula Virtual, pois assim, alm de contribuir para o
aprendizado de outras pessoas, voc consolidar seu conhecimento.
Aps essa introduo aos conceitos principais, apresentamos a seguir, no tpico Orienta-
es para Estudo, algumas orientaes de carter motivacional, dicas e estratgias de aprendi-
zagem que podero facilitar o seu estudo.
Que voc tenha um bom e proveitoso estudo!
Abordagem Geral
Neste tpico, apresenta-se uma viso geral do que ser estudado nesta obra. Aqui, voc
entrar em contato com os assuntos principais deste contedo de forma breve e geral e ter
a oportunidade de aprofundar essas questes no estudo de cada unidade. No entanto, essa
Abordagem Geral visa fornecer-lhe o conhecimento bsico necessrio a partir do qual voc pos-
sa construir um referencial terico com base slida cientfica e cultural para que, no futuro
exerccio de sua profisso, voc a exera com competncia cognitiva, tica e responsabilidade
social.
Laboratrio de Programao tem como objetivo principal a sua iniciao desenvolvimento
de programas de computador. Alm disso, voc conhecer a linguagem de programao C e as
principais estruturas utilizadas na elaborao de programas.
Antes de iniciar o estudo especfico sobre a programao, importante que alguns aspec-
tos a respeito da organizao dos computadores sejam apresentados. As mquinas de computar,
popularmente conhecidas como computadores, tm como principal objetivo o processamento
de informaes. Para isso, um fluxo linear de transformao realizado em dados, os quais so
inseridos por meio de um dispositivo de entrada. Os dados so processados, e, por fim, apresen-
tados em perifricos conhecidos como dispositivos de sada.
O processamento das informaes efetuado por um componente especfico do compu-
tador, conhecido como processador. Essa parte integrante fundamental para o funcionamento
do sistema e geralmente conhecida como o crebro do computador. Para que as informa-
es sejam processadas, o processador possui um conjunto finito de instrues, as quais reali-
zam tarefas especficas.
Por exemplo: o processador possui uma instruo destinada realizao de contas de so-
mar, conhecida como sum. Todas as informaes processadas no processador so armazenadas
em um componente denominado memria principal. A memria principal mantm os dados
enquanto o programa de computador est sendo executado, por isso esse tipo de memria
conhecida como voltil. Alm disso, o computador pode utilizar informaes armazenadas de
maneira persistente. Ele utiliza um tipo especfico de memria conhecida como memria secun-
dria. Os principais exemplos de memria secundria so os discos rgidos, o CD-ROM (Compact
Disc Read Only Memory Disco Compacto Memria Somente de Leitura), o DVD-ROM (Digital
Versatile Disk Read Only Memory Disco Verstil Digital Somente de Leitura), o BD-ROM (Bluray
Disc Real Only Memory), entre outros.
Para que o computador seja capaz de processar as informaes, necessrio que os dados
sejam alimentados por meio dos dispositivos de entrada. Esses dispositivos tm como objetivo
carregar os dados no computador. Os principais exemplos de dispositivo de entrada so o mouse
Caderno de Referncia de Contedo 9
Com a evoluo dos computadores, tanto em relao aos componentes fsicos (hardware),
quanto aos componentes lgicos (software), a complexidade do desenvolvimento dos programas
foi aumentando. Para simplificar a escrita e principalmente para agilizar o processo de elabora-
o dos programas de computadores, foram criadas linguagens de programao mais prximas
ao cotidiano dos programadores. Essas linguagens so conhecidas como linguagens de progra-
mao de alto nvel. Por meio delas, as instrues de programao foram agrupadas em um ni-
co comando. Por exemplo, se com uma linguagem de mquina era necessrio escrever algumas
dezenas de linhas para exibir o nome de uma pessoa na tela ou o resultado do clculo de uma
equao, com as linguagens de mquina essas linhas foram reduzidas para uma nica instruo.
Na linguagem de programao Pascal, o comando que exibe uma informao na tela denomi-
nado writeln, enquanto na linguagem de programao C, que ser abordada neste material, o
comando chamado printf. Com a evoluo das linguagens de programao, o desenvolvimen-
to de programas de computador se tornou algo fascinante.
Quando voc utiliza uma linguagem de programao para escrever programas, as instru-
es usadas no desenvolvimento so conhecidas como cdigo-fonte do programa, ou simples-
mente cdigo-fonte. A principal vantagem em utilizar linguagens de alto nvel para elaborao
de cdigos-fontes est na relao entre a linguagem de programao e o algoritmo. O primeiro
passo para a elaborao de um programa de computador com qualidade a codificao do al-
goritmo. Um algoritmo representa a sequncia organizada de instrues que devero ser reali-
zadas para a execuo de uma determinada tarefa. Os algoritmos so especificados por meio de
uma linguagem comum aos seres humanos, a qual podem ser definida, por exemplo, utilizando
portugus estruturado. Neste caso, voc pode utilizar instrues do tipo escreva, leia, dentre
outras. Com a elaborao do algoritmo, torna-se mais simples o desenvolvimento do programa
com a linguagem de alto nvel, pois necessria apenas a traduo do algoritmo para a lingua-
gem de programao escolhida.
O processo de desenvolvimento de um programa utilizando uma linguagem de programa-
o envolve uma etapa fundamental, que a verificao do cdigo-fonte. Essa verificao tem
como objetivo avaliar se o cdigo foi escrito de maneira correta, a partir das instrues dispon-
veis na linguagem de programao escolhida. Todo esse processo gerenciado e realizado por
um programa especfico, conhecido como compilador. De forma prtica, o compilador verifica
o cdigo-fonte do programa, e caso as instrues tenham sido codificadas de maneira correta
transforma o cdigo-fonte em cdigo-objeto. O cdigo-objeto representa o cdigo compilado
do programa; porm, no permite sua execuo.
Para transformar um cdigo-objeto em um programa executvel, necessrio outro pro-
grama especfico, denominado linker. Na linguagem de programa C, por exemplo, o processo
completo de compilao de um programa realizado em trs fases: programa.c programa.
obj programa.exe.
Os programas de computador so criados em programas especficos conhecidos como
ambientes de desenvolvimento, do ingls Integrated Development Environment, ou simples-
mente IDE. Esses ambientes oferecem aos desenvolvedores de programas um conjunto imenso
de recursos capazes de facilitar e simplificar a elaborao do programa. Alm disso, permitem
que os programas sejam exaustivamente testados para que nenhum erro seja detectado aps o
lanamento ou disponibilizao da verso final do programa.
Neste estudo, voc aprender a elaborar programas utilizando a linguagem de programa-
o de alto nvel C. Assim, para a codificao, sero necessrias a instalao e a configurao de
um ambiente de desenvolvimento integrado. Para usurios de sistemas operacionais Microsoft,
Caderno de Referncia de Contedo 11
Para cada varivel utilizada no programa de computador, um tipo est associado. A associa-
o de um tipo a uma varivel conhecida como tipo de dados. Uma varivel pode armazenar
apenas informaes do tipo a que est vinculada, e com isso poder executar um conjunto de
operaes. Por exemplo: um tipo de dados para armazenamento de informaes numricas na
linguagem de programao C denominado int. Esse tipo adequado para manipulao de va-
lores numricos inteiros, ou seja, que no possuam a parte fracionria. Um tipo inteiro permite
o armazenamento de valores como -5, -32, -85, 0, 12, 48, 43452. Alm disso, esse tipo permite a
realizao das seguintes operaes: soma, subtrao, multiplicao, diviso e resto da diviso.
//programa principal
void main()
{
//declarao das variveis
int a;
int b;
int c;
//sada na tela
printf(O resultado da soma %i \n, c);
operadores relacionais, por meio dos quais possvel estabelecer comparaes entre
as informaes manipuladas pelos programas, tais como maior que, menor que,
maior ou igual a, menor ou igual a;
operadores lgicos, adequados para situaes em que necessrio agrupar diversas
expresses lgicas. A utilizao desses operadores muito semelhante aos operadores
empregados na lgica matemtica e o resultado de sua avaliao associado s tabe-
las verdade. Para cada operador lgico da linguagem de programao C anexado um
smbolo. Por exemplo: para o operador lgico que representa a operao de conjuno
(e) so utilizados os smbolos &&, e a operao de disjuno (ou) simbolizada pelos
caracteres ||.
Estruturas de Controle
A linguagem de programao C possui um conjunto de estruturas de controle que possibilita
ao programador controlar o fluxo de execuo dos programas. Essas estruturas so essenciais para
a construo de qualquer tipo de programa de computador e so utilizadas tambm em aplicaes
comerciais e cientficas. Na linguagem de programao C, as estruturas de controle so divididas
em dois grupos, que so denominados estruturas condicionais e estruturas de repetio.
As estruturas condicionais so utilizadas para determinar a direo do fluxo de execuo
no interior dos programas. Por meio da avaliao de uma expresso condicional, o programa
poder executar uma ou outra tarefa. Nesse contexto, a linguagem de programao C possui
trs estruturas capazes de especificar condies:
1) estrutura condicional simples: a execuo de um determinado trecho de cdigo de-
pende da avaliao de uma condio, e o trecho ser executado apenas e somente
quando o resultado da avaliao for verdadeiro. Na programao, essa estrutura con-
dicional conhecida como if;
2) estrutura condicional composta: semelhante estrutura condicional simples. A prin-
cipal diferena em relao anterior o mapeamento do que ser executado quando
o resultado da avaliao condicional for falso. Assim, a estrutura condicional compos-
ta determina o que ser executado pelo programa tanto para o resultado for verda-
deiro quanto para o resultado falso. Na programao, essa estrutura representada
pela instruo if...else;
3) estrutura de seleo mltipla: nesse tipo de estrutura, um determinado trecho de c-
digo ser executado a partir da avaliao mutuamente exclusiva de uma condicional.
Dessa forma, considerando um conjunto de possibilidades de execuo, o programa
executar apenas um determinado trecho de cdigo. Na linguagem de programao
C, esse tipo de estrutura pode ser codificado por meio das instrues if...else if...else,
ou tambm pela utilizao de uma estrutura condicional denominada switch.
As estruturas de repetio tambm fazem parte da estrutura de controle da linguagem de
programao C. Uma estrutura de repetio permite a especificao de um lao de repetio no
interior dos programas. Esses laos podero ser executados uma nica vez, mas tambm pode-
ro ser executados vrias vezes. Existe tambm a possibilidade de um lao de repetio no ser
executado, a partir da avaliao da condicional associada ao critrio de parada do lao.
Na linguagem de programao C, as estruturas de repetio podem ser codificadas por
meio de dois comandos:
1) for, o qual permite ao programador definir quantas vezes um trecho de cdigo do
programa ser executado. Nesse tipo de estrutura, necessrio que uma varivel de
controle seja associada para contar o nmero de vezes que o trecho do cdigo j foi
repetido;
2) while, possibilita ao programador construir uma estrutura de repetio que ser exe-
cutada sempre que o resultado de uma expresso condicional for verdadeira. O fun-
cionamento da estrutura de repetio while muito semelhante ao for. Porm, com
essa estrutura, possvel solucionar problemas em que no previamente definido o
nmero de vezes que um bloco de comandos deve ser repetido.
Programao modular
A reutilizao de cdigo-fonte na programao de computadores um recurso fundamen-
tal para elaborao de sistemas com qualidade. A programao modular representa uma tcnica
eficiente para o reaproveitamento de cdigo, e utiliza como estratgia a diviso do cdigo em
pequenas partes denominadas funes.
Arquivos
A manipulao de informaes de maneira persistente uma tcnica que pode ser em-
pregada por meio da utilizao dos arquivos. Um arquivo permite que os dados manipulados
pelos programas sejam armazenados em um dispositivo de memria secundria, tal como um
disco rgido.
Enfim, chegamos ao final de nossa abordagem, e esperamos que voc tenha aproveitado
ao mximo os tpicos apresentados. muito importante destacar que apenas o estudo terico
da linguagem de programao C no ser suficiente para seu aprendizado: fundamental que
Caderno de Referncia de Contedo 15
voc pratique! Para isso, instale o ambiente de desenvolvimento de sua preferncia e comece
desde j a programar!
Glossrio de Conceitos
O Glossrio de Conceitos permite a voc uma consulta rpida e precisa das definies con-
ceituais, possibilitando-lhe um bom domnio dos termos tcnico-cientficos utilizados na rea de
conhecimento dos temas tratados em Laboratrio de Programao. Veja, a seguir, a definio
dos principais conceitos:
1) Algoritmo: o algoritmo a descrio de uma sequncia de passos que deve ser segui-
da para a realizao de uma tarefa (Ascencio, 1999).
2) Arquivos: so utilizados para o armazenamento persistente de informaes. Esse tipo
de estrutura capaz de guardar dados na memria secundria de maneira permanente.
3) Comandos de atribuio: para inserirmos os valores ou operaes em uma varivel,
utilizamos os comandos de atribuio. Por meio deles, conseguimos adicionar um de-
terminado valor na posio de memria reservada pela varivel.
4) Comentrio: um recurso imprescindvel para uma boa prtica de programao. Por
meio dos comentrios, o programador pode documentar o algoritmo e, com isso, au-
mentar a clareza do cdigo. Um aspecto importante a ser destacado a respeito dos
comentrios que eles so desconsiderados durante a execuo do algoritmo ou do
programa. Isso significa que eles no interferem no contedo do algoritmo; por isso,
podemos escrever qualquer tipo de informao para facilitar seu entendimento.
5) Constante: um dado definido no algoritmo que no pode ter seu valor modificado.
O conceito de constante que uma determinada informao no poder ser alterada
ao longo da execuo.
6) Estrutura condicional: quando voc utiliza uma estrutura condicional na elaborao
de um algoritmo, possvel selecionar, com base em uma ou mais condies, qual
parte do algoritmo dever ser executada.
7) Estruturas de dados: estabelecem mecanismos para a organizao dos dados, de for-
ma que podemos trabalhar com as informaes de maneira prtica e eficiente. Alm
disso, elas so capazes de manipular grandes quantidades de informaes. As estru-
turas de dados tambm so conhecidas como variveis compostas. So divididas em
dois grupos: estruturas de dados homogneas e estruturas de dados heterogneas.
8) Estrutura de repetio: so recursos utilizados na construo de algoritmos e progra-
mas que permitem ao programador definir quais blocos de instrues sero repetidos
at que ocorra certa condio.
9) Identificador: o nome de uma varivel. O identificador possui regras muito bem
definidas para a especificao de nomes. Alm dos nomes das variveis, os nomes dos
algoritmos, das constantes e das sub-rotinas tambm so considerados identificado-
res.
10) Programa: conjunto de instrues que realizam um determinado nmero de tarefas
por meio do computador.
11) Programao modular: tem como objetivo a construo de algoritmo em pequenas
partes, ou mdulos, que so chamadas de sub-rotinas.
12) Variveis: dados que podem ter seu valor alterado durante a execuo do algoritmo.
Quando voc declara uma varivel em um programa, significa que voc est reser-
vando um espao da memria principal (RAM) para o armazenamento de uma de-
terminada informao. O tamanho do espao reservado depende do tipo de dados
utilizado na varivel.
Organizao de
Computadores
Comandos de Compiladores e
Entrada e Sada Interpretadores
Processador e
Memria
Programao de
Tipos de Dados
int, char, float, Computadores
etc.
Estrutura
Sequencial
Estrutura de
Controle
Constantes e
Variveis if e switch
Expresses
Matemticas e Lgicas
registros
vetores e (struct)
matrizes
ponteiros
Arquivos
Modularizao
Como pode observar, esse Esquema oferece a voc, como dissemos anteriormente, uma
viso geral dos conceitos mais importantes deste estudo. Ao segui-lo, ser possvel transitar
entre os principais conceitos abordados e descobrir o caminho para construir o seu processo de
ensino-aprendizagem, como, por exemplo, o conceito de estrutura de controle, o qual implica
o conhecimento das estruturas condicionais if e switch, alm das estruturas de repetio for,
while e do..while.
Questes Autoavaliativas
No final de cada unidade, voc encontrar algumas questes autoavaliativas sobre os con-
tedos ali tratados, as quais podem ser de mltipla escolha ou abertas com respostas objetivas
ou dissertativas.
Responder, discutir e comentar essas questes, bem como relacion-las com a prtica do en-
sino de algoritmos e programao pode ser uma forma de voc avaliar o seu conhecimento. Assim,
mediante a resoluo de questes pertinentes ao assunto tratado, voc estar se preparando para
a avaliao final, que ser dissertativa. Alm disso, essa uma maneira privilegiada de voc testar
seus conhecimentos e adquirir uma formao slida para a sua prtica profissional.
Bibliografia Bsica
fundamental que voc use a Bibliografia Bsica em seus estudos, mas no se prenda s
a ela. Consulte, tambm, as bibliografias complementares.
Dicas (motivacionais)
Este estudo convida voc a olhar, de forma mais apurada, a Educao como processo de
emancipao do ser humano. importante que voc se atente s explicaes tericas, prticas e
cientficas que esto presentes nos meios de comunicao, bem como partilhe suas descobertas
com seus colegas, pois, ao compartilhar com outras pessoas aquilo que voc observa, permite-
-se descobrir algo que ainda no se conhece, aprendendo a ver e a notar o que no havia sido
percebido antes. Observar , portanto, uma capacidade que nos impele maturidade.
Voc, como aluno dos Curso de Graduao, necessita de uma formao conceitual slida
e consistente. Para isso, voc contar com a ajuda do tutor a distncia, do tutor presencial e,
sobretudo, da interao com seus colegas. Sugerimos, pois, que organize bem o seu tempo e
realize as atividades nas datas estipuladas.
importante, ainda, que voc anote as suas reflexes em seu caderno ou no Bloco de
Anotaes, pois, no futuro, elas podero ser utilizadas na elaborao de sua monografia ou de
produes cientficas.
Leia os livros da bibliografia indicada, para que voc amplie seus horizontes tericos. Co-
teje-os com o material didtico, discuta a unidade com seus colegas e com o tutor e assista s
videoaulas.
Caderno de Referncia de Contedo 19
No final de cada unidade, voc encontrar algumas questes autoavaliativas, que so im-
portantes para a sua anlise sobre os contedos desenvolvidos e para saber se estes foram
significativos para sua formao. Indague, reflita, conteste e construa resenhas, pois esses pro-
cedimentos sero importantes para o seu amadurecimento intelectual.
Lembre-se de que o segredo do sucesso em um curso na modalidade a distncia parti-
cipar, ou seja, interagir, procurando sempre cooperar e colaborar com seus colegas e tutores.
Caso precise de auxlio sobre algum assunto, entre em contato com seu tutor. Ele estar
pronto para ajudar voc.
3. REFERNCIA BIBLIOGRFICA
ASCENCIO, A. F. G. Lgica de programao com Pascal. So Paulo: Makron Books, 1999.
1. OBJETIVOS
Compreender os conceitos de organizao de computadores.
Reconhecer e interpretar as principais linguagens de programao.
Instalar e configurar o ambiente para desenvolvimento.
2. CONTEDOS
Organizao de computadores.
Sistemas operacionais.
Linguagens de programao.
Ambientes de desenvolvimento integrados.
4. INTRODUO UNIDADE
Nesta primeira unidade, voc ter a oportunidade de estudar como os computadores so
organizados e quais so seus principais componentes fsicos e lgicos. Tais conceitos so essen-
ciais para a construo de programas de computadores.
Alm disso, ao longo desta unidade voc poder aprender quais so os principais elemen-
tos que compem a arquitetura de um computador, desde o processador at o sistema opera-
cional.
Voc conhecer, ainda, quais passos so necessrios para construir um programa e os
principais conceitos envolvidos nesse contexto, tais como: compiladores, linguagens de progra-
mao e ambientes de desenvolvimento.
5. ORGANIZAO DE COMPUTADORES
O principal objetivo de um computador realizar o processamento de grandes volumes
de dados. Considerando essa capacidade, eles executam milhares de operaes a velocidades
incrveis. Essas operaes so organizadas por meio de um conjunto de instrues que so cha-
madas de programas de computador.
Segundo Tanenbaum (2003), um programa determina quais aes so necessrias para
um computador realizar o processamento dos dados. Para que isso ocorra, os programas con-
tam com diversos tipos de instrues para manipulao de dados. Essas instrues so executa-
das por meio de um componente de hardware denominado processador.
O processador, por sua vez, considerado o crebro do computador; ele possui um con-
junto especfico de instrues que pode executar, e sua principal funcionalidade a transfor-
mao de dados, os quais ficam armazenados em um componente conhecido como memria
principal. A memria principal, ou memria RAM, um local em que o processador busca as
informaes e as instrues que devem ser executadas. Essa memria pode guardar qualquer
tipo de dados. No entanto, esses dados ficam disponveis apenas enquanto o computador esti-
ver ligado. Alternativamente, esses dados podem ser armazenados de maneira permanente por
meio da memria secundria, como, por exemplo, em discos rgidos.
Geralmente, o carregamento dos dados na memria do computador realizado por meio
de elementos conhecidos como dispositivos de entrada. Como exemplos desses dispositivos
de entrada, temos: teclado, mouse, digitalizadores (scanner), dentre outros. Em contrapartida,
a disponibilizao das informaes realizada por meio de componentes conhecidos como dis-
positivos de sada, tais como: monitores, impressoras etc.
A Figura 1 representa graficamente um computador e seus respectivos componentes.
U1 - Introduo Programao de Computadores 23
memria
secundria
dispositivos dispositivos
de entrada de sada
memria
principal
Sistemas operacionais
Um sistema operacional um programa de computador que possui caractersticas espe-
ciais, responsvel por gerenciar os recursos computacionais, alm de fornecer uma interface
entre os programas do usurio e o hardware do computador (Tanenbaum, 2003).
Todo usurio de computador utiliza algum tipo de sistema operacional, mesmo sem saber,
pois ele o primeiro programa executado quando o computador ligado. Os primeiros siste-
mas operacionais eram complexos e poucos usurios eram capazes de manipul-los. Entretanto,
hoje em dia, eles se tornaram mais simples e intuitivos, de forma que qualquer tipo de usurio,
desde uma criana at um adulto, pode oper-lo facilmente.
Existem diversos tipos de sistemas operacionais, cujas principais diferenas esto relacio-
nadas aos recursos que cada um disponibiliza aos usurios. Em geral, esses sistemas podem ser
divididos em dois grupos:
sistemas operacionais para uso domstico;
sistemas operacionais para uso comercial (servidores).
Veremos, a seguir, quais so os sistemas operacionais para uso domstico e para uso co-
mercial.
Os sistemas operacionais para uso domstico tm como principal caracterstica a facilida-
de de uso. Eles so adequados para usurios que no possuem grandes habilidades com com-
putadores. Nessa famlia de sistemas operacionais, podemos destacar:
Microsoft Windows (Figura 2).
Linux (Figura 3).
Mac OS (Figura 4).
Nas Figuras 2, 3 e 4, voc pode observar as imagens que representam cada um desses
sistemas operacionais.
Microsoft Windows
Linux
Mac OS
O sistema operacional Mac OS distribudo pela Apple e muito utilizado por usurios
que precisam trabalhar com recursos grficos, como, por exemplo, processamento de imagens
e editorao de vdeo. A verso mais recente desse sistema operacional a Mac OS X.
O Quadro 1 apresenta os principais sistemas operacionais disponveis no mercado e seus
respectivos endereos na internet. Esses endereos so ricas fontes de informaes a respeito
de cada sistema operacional e foram acessados em 12 de mar. 2012.
Existem alguns sistemas operacionais que possuem verses para usurios domsticos e
tambm para servidores, como o caso do Windows e do Linux. Entretanto, alguns sistemas
operacionais so exclusivos para servidores, como, por exemplo, o Unix e o Solaris. A Figura 5
apresenta uma tela do sistema operacional Solaris.
O sistema operacional Solaris desenvolvido pela Sun Microsystems e da famlia Unix.
Inicialmente, era um sistema operacional proprietrio, mas atualmente possui uma verso gra-
tuita denominada OpenSolaris.
6. LINGUAGENS DE PROGRAMAO
Como vimos no incio desta unidade, os computadores so capazes de executar aes
que so especificadas por meio dos programas. Dessa forma, para que um computador realize
tarefas, necessrio que os programas sejam escritos em uma linguagem que ele entenda. Essa
linguagem conhecida como linguagem de programao.
Uma linguagem de programao permite que o computador seja programado para execu-
tar um conjunto determinado de aes. Com a linguagem de programao, podemos construir
programas para os mais variados propsitos, tais como: controlar o estoque de uma empresa,
analisar operaes financeiras de um banco, calcular a mdia entre duas notas de alunos, dentre
tantas outras.
Na prtica, o computador entende uma nica linguagem de programao, que conhe-
cida como linguagem de mquina. No entanto, essa linguagem pouco intuitiva para os seres
humanos, tornando quase impossvel o desenvolvimento de programas.
Segundo Deitel (2005), cada computador possui uma linguagem de mquina especfica,
que definida pelo seu projeto de hardware. Dessa forma, a programao de computadores por
meio da linguagem de mquina realizada utilizando instrues numricas, que so representa-
das por sequncias binrias de zeros (0s) e uns (1s). Alternativamente, essas sequncias podem
ser representadas em sistemas de numerao hexadecimal.
Observe, a seguir, uma instruo tpica em linguagem de mquina:
debug c:\windows\system32\mspaint.exe
d 0 100
1 load 100
2 add 200
3 store resultado
Por exemplo, suponha que voc precise escrever uma determinada mensagem no mo-
nitor. Em linguagem de montagem, voc precisaria escrever um conjunto substancial de linhas
para executar essa tarefa. Entretanto, em uma linguagem de alto nvel, como, por exemplo, a
linguagem de programao C, voc tem uma nica instruo que realiza essa tarefa (printf).
Veja o cdigo a seguir, que ilustra como possvel escrever uma mensagem na tela utilizando a
linguagem C.
1 printf(Ol seja bem-vindo!);
entrada
cdigo cdigo
sada
fonte objeto
A seguir, apresentamos uma listagem com algumas linguagens de programao que reali-
zam a compilao do cdigo-fonte:
1) C;
2) C++;
3) Cobol;
4) Delphi (Object-Pascal);
5) Fortran;
6) Pascal;
7) Visual Basic.
7. AMBIENTES DE DESENVOLVIMENTO
Os ambientes de desenvolvimento integrados, do ingls Integrated Development Environment
(IDE), fornecem aos programadores todos os recursos necessrios para escrever e testar os pro-
gramas de computador.
Aprenderemos, tambm, a construir programas na linguagem de programao C. Precisa-
remos, ento, utilizar um ambiente de desenvolvimento integrado que suporte essa linguagem.
H dezenas de ambientes para programao para a linguagem C. Os principais so:
Netbeans (disponvel em: <http://www.netbeans.org/>. Acesso em: 12 mar. 2012).
O NetBeans um ambiente de desenvolvimento que suporta diversas linguagens;
muito utilizado para programao na linguagem Java, mas tambm oferece recursos
para desenvolvimento de programas na linguagem C. um ambiente de desenvolvi-
mento gratuito e de cdigo-fonte aberto, distribudo pela empresa Sun Microsystems
(disponvel em: <http://www.sun.com/>. Acesso em: 12 mar. 2012). Alm disso, um
ambiente multiplataforma, o que significa que funciona em qualquer sistema opera-
cional, como, por exemplo, Windows e Linux.
Code::Blocks (disponvel em: <http://www.codeblocks.org/>. Acesso em: 12 mar. 2012).
O Code::Blocks, ou simplesmente C::B, um ambiente de desenvolvimento integrado
para as linguagens C e C++. um ambiente multiplataforma, gratuito e de cdigo-
-fonte aberto, possuindo verses para Windows e Linux.
Microsoft Visual C++ Express Edition (disponvel em: <http://www.microsoft.com/
Express/vc/>. Acesso em: 12 mar. 2012).
O Visual C++ Express Edition o ambiente para desenvolvimento da Microsoft para
construes de programas na linguagem C e C++. A expresso "Express Edition refe-
re-se a um conjunto de ambientes para desenvolvimento que a Microsoft disponibiliza
de forma gratuita.
Outros ambientes de desenvolvimento, no menos importantes, so:
Dev-C++ (disponvel em: <http://www.bloodshed.net/devcpp.html>. Acesso em: 12
mar. 2012).
Instalao do NetBeans
1) Acesse o endereo <http://www.netbeans.org/downloads/index.html> e selecione a
opo de download do NetBeans para C/C++ (Figura 14).
U1 - Introduo Programao de Computadores 35
2) Caso seja necessrio, voc pode configurar o Comando Make, informando o diretrio
de instalao (Figura 21b).
U1 - Introduo Programao de Computadores 39
2) Na janela Novo Projeto, selecione a categoria C/C++, e, em projetos (lado direito) se-
lecione Aplicativo de C/C++. Clique no boto Prximo. Especifique o nome do projeto.
Por exemplo, MeuPrimeiroProjeto, e clique no boto Finalizar.
3) Com o novo projeto criado, clique com o boto direito do mouse em Arquivos de
cdigo-fonte. Selecione a opo Novo, e, em seguida, clique em Arquivo C Principal
(Figura 23).
7) Com isso, seu ambiente est pronto para escrever novos programas!
4) Terminada a instalao, voc pode executar o ambiente. Na primeira vez que o am-
biente for executado, selecione qual compilador C ser utilizado na gerao dos pro-
gramas. Selecione o GNU GCC Compiler e, em seguida, clique em OK (Figura 27).
6) Dessa forma, seu ambiente de desenvolvimento est pronto para voc escrever pro-
gramas na linguagem C.
3) Na primeira vez que um novo projeto criado, voc visualizar a tela mostrada na
Figura 30. Selecione a opo "Skip this page next time e clique em Next.
5) Na Figura 32, esto ilustrados a definio, o ttulo do projeto (Project Title) e a pasta
na qual o projeto ser criado (Folder to create project in). Finalmente, clique em Next.
7) Pronto! Seu primeiro projeto na linguagem C est criado. O arquivo que contm o
cdigo-fonte do programa pode ser visualizado na guia Projects, do lado esquerdo
(Figura 34).
8. QUESTES AUTOAVALIATIVAS
Sugerimos que voc procure responder, discutir e comentar as questes a seguir que
tratam da temtica desenvolvida nesta unidade.
A autoavaliao pode ser uma ferramenta importante para voc testar o seu desempenho.
Se voc encontrar dificuldades em responder a essas questes, procure revisar os contedos
estudados para sanar as suas dvidas. Esse o momento ideal para que voc faa uma reviso
desta unidade. Lembre-se de que, na Educao a Distncia, a construo do conhecimento
ocorre de forma cooperativa e colaborativa; compartilhe, portanto, as suas descobertas com os
seus colegas.
Confira, a seguir, as questes propostas para verificar o seu desempenho no estudo desta
unidade:
1) O que um programa de computador?
6) Os computadores so capazes de executar aes que so especificadas por meio dos programas. Dentro deste
contexto, o que linguagem de programao?
7) Relacione linguagem de mquina e linguagem de montagem. Pensando nas duas definies, investigue: o que
so montadores ou assemblers?
15) Explique o processo de criao e compilao de um programa na linguagem C utilizando o ambiente Code::Blocks.
9. CONSIDERAES
Terminamos o estudo da primeira unidade! Nela, voc teve a oportunidade de aprender
os principais conceitos sobre organizao de computadores, sistemas operacionais e linguagens
de programao. Alm disso, conheceu os procedimentos para a instalao e configurao do
ambiente de desenvolvimento integrado para programao na linguagem C. Esse ambiente ser
fundamental para o estudo das prximas unidades, nas quais escreveremos diversos programas
na linguagem C.
1. OBJETIVOS
Elaborar programas com a linguagem de programao C.
Criar programas que possibilitem a exibio e o recebimento de informaes digitadas
pelo usurio.
Criar programas que utilizem expresses aritmticas e lgicas.
2. CONTEDOS
Introduo linguagem de programao C.
Comandos de entrada e sada.
Expresses aritmticas.
Expresses lgicas.
Bibliotecas (math.h e string.h).
Exerccios resolvidos (transformando algoritmos em programas).
2) Para o estudo desta unidade, sugerimos que voc leia o Captulos 1, Conceitos bsi-
cos e o Captulo 2, Estrutura sequencial, da obra: ASCENCIO, A. F. G. Fundamentos
da programao de computadores: algoritmos, Pascal e C/C++. So Paulo: Prentice
Hall, 2002.
3) Ao final da unidade, voc encontrar um conjunto de exerccios resolvidos. funda-
mental para seu aprendizado que voc os codifique no ambiente de sua preferncia.
Para verificar o funcionamento correto dos programas, voc pode comparar a sada da
implementao realizada por voc com as sadas ao final de cada algoritmo, indicadas
como "Resultado da execuo do programa".
4. INTRODUO UNIDADE
Nesta unidade, iniciaremos nosso estudo sobre o desenvolvimento de programas utili-
zando a linguagem de programao C. Antes de comearmos, fundamental que voc j tenha
instalado e configurado seu ambiente de desenvolvimento (os passos para instalao esto des-
critos na Unidade 1).
Veremos, agora, um pouco de histria.
A linguagem de programao C, ou simplesmente linguagem C, foi inventada e implemen-
tada na dcada de 1970 por Dennis Ritchie. Inicialmente, foi utilizada para o desenvolvimento de
programas para o sistema operacional Unix. Essa linguagem nasceu a partir de uma linguagem
mais antiga chamada BCPL (desenvolvida por Martin Richards), que influenciou outra linguagem
chamada B (inventada por Ken Thompson). A evoluo da linguagem B levou ao desenvolvimen-
to da linguagem C (SCHILDT, 1997).
A linguagem C permite a construo de programas em diversos sistemas operacionais,
como Windows, Linux, Unix, Solaris etc. No entanto, ela no multiplataforma, o que significa,
por exemplo, que os programas para Windows no funcionam em outros sistemas operacionais.
Para que um programa escrito em Windows funcione em outros sistemas operacionais, ele pre-
cisa ser recompilado.
Para conhecer um pouco mais sobre a linguagem C, ao longo desta unidade teremos a
oportunidade de iniciar os conceitos introdutrios para a construo de programas que a utili-
zam. Para isso, veremos desde os principais conceitos para entrada e sada de informaes at
os operadores aritmticos e lgicos.
Dessa forma, observaremos, finalmente, como possvel transformar algoritmos em pro-
gramas.
Bom estudo!
A primeira linha do programa contm uma instruo utilizada para a incluso de bibliote-
cas. As bibliotecas, por sua vez, possuem funes que o programador pode utilizar para facilitar
o desenvolvimento do seu programa. Por exemplo, a linguagem C possui uma biblioteca espec-
fica para funes matemticas (math.h). Nessa biblioteca, voc encontra funes para calcular
raiz quadrada, seno, cosseno, tangente, logaritmo, dentre outras.
Suponha que voc est construindo um programa para calcular a raiz quadrada de um
nmero. Com a utilizao da biblioteca matemtica, no preciso estudar como a raiz quadrada
de um nmero calculada. Em vez disso, voc apenas utiliza a funo para o clculo da raiz qua-
drada (sqrt). Essa funo calcula a raiz e retorna o resultado. Simples, no?!
Depois de declaradas as bibliotecas, um programa em C deve obrigatoriamente possuir
uma funo principal (main). A funo principal (ou bloco principal) responsvel por determi-
nar o local em que os comandos do programa so escritos.
Para definirmos um bloco principal, utilizamos a instruo main(), seguida de um smbolo
de abre chaves {. A partir desse ponto, todas as instrues para o funcionamento do programa
devem ser definidas. Ao final das instrues, devemos fechar o bloco principal, com o smbolo
de fecha chaves }.
O comando printf (Linha 5 da estrutura anterior) uma das principais instrues da lin-
guagem C. Por meio dele, podemos exibir informaes na tela. Esse comando pode ser utilizado
diversas vezes ao longo do programa.
O programa a seguir demonstra uma verso alternativa para uma estrutura bsica de
um programa na linguagem C. Veja no exemplo que, em vez de utilizarmos apenas a instruo
main(), usamos, tambm, int main(). Alm disso, uma instruo return 0 foi adicionada ao pro-
grama.
comum desenvolvermos programas que executam funes e retornam resultados. Em
geral, esses resultados so retornados para o sistema operacional. Quando definimos o bloco
principal como int main(), significa que o resultado da execuo desse bloco ser um nmero in-
teiro. J a instruo return 0 indica que o valor 0 retorna com a execuo do programa. Convm
ressaltar que poderamos utilizar qualquer valor de retorno.
Assim, quando escrevemos programas na linguagem C que no retornam valores, pode-
mos receber mensagens de aviso durante o processo de compilao. Isso ocorre, pois alguns
compiladores utilizam as especificaes definidas pela ANSI (American National Standards
Institute). Segundo a ANSI, a estrutura bsica de um programa na linguagem C deve conter as
seguintes instrues:
1 #include <stdio.h>
2
3 int main()
4 {
5 printf(Meu segundo programa! \n);
6 return 0;
7 }
3) float: esse tipo de dado utilizado para manipulao de nmeros reais. Um nmero
real aquele que pode possuir uma parte decimal, ou seja, nmeros com casas deci-
mais, por exemplo: 5,32; 10,28; -15,19; 0,93. Um dado do tipo float ocupa 32 bits (4
bytes) de memria e possui 6 dgitos de preciso (0.123456).
Vale ressaltar que os nmeros so especificados segundo o padro americano. Portan-
to, a separao de casas decimais realizada por meio de ponto (.) e no de vrgula
(,), como estamos acostumados no padro brasileiro. Por exemplo, o valor real 324,56
deve ser especificado como 324.56.
4) double: esse outro tipo de dado que pode ser utilizado para armazenar valores reais.
A principal diferena entre o tipo float e double com relao preciso. Enquanto o
tipo float possui seis dgitos de preciso, o tipo double tem preciso de at 10 dgitos
(0.1234567890).
Nesse caso, o armazenamento de uma informao em memria com o tipo double
ocupa 64 bits (8 bytes).
5) void: esse tipo de dado utilizado para representar ausncia de valor. No comum
associarmos o tipo void a uma determinada informao dentro do programa. Ele
mais utilizado para definir valores de retorno de funes ou para criao de ponteiros.
Esses tpicos sero aprofundados nas prximas unidades.
O Quadro 2 apresenta os principais tipos de dados da linguagem C. Observe.
Variveis
Um programa de computador manipula constantemente informaes armazenadas na
memria principal (RAM). Para que isso seja possvel, cada posio da memria possui um en-
dereo nico. Assim, os programas podem facilmente acessar as informaes.
Uma varivel a principal forma de manipulao de informaes dentro dos programas.
Cada uma possui um nome que representa uma posio especfica na memria do computador,
o que facilita a manipulao dos dados, uma vez que no precisamos guardar os endereos re-
ferentes s posies em que os dados se encontram na memria.
Ao longo da execuo do programa, uma varivel, como o prprio nome indica, pode ter
seu valor modificado. A alterao do valor contido em uma varivel realizada por meio do ope-
rador de atribuio. Esse operador representado pelo smbolo de igualdade (=).
Dentro da estrutura bsica de um programa escrito na linguagem de programao C, a
declarao das variveis sempre deve ser realizada dentro do bloco principal do programa, logo
aps o smbolo de abre chaves {, que indica o incio do bloco.
Para declararmos uma varivel, sempre devemos indicar, inicialmente, qual o seu tipo
(int, char, float, double etc.), e, em seguida, qual o seu nome. Tambm no podemos nos es-
quecer de inserir um smbolo de ponto-e-vrgula ao final da instruo. A sintaxe da declarao
de variveis definida do seguinte modo:
<tipo_da_varivel> <nome_da_varivel>;
No comando de atribuio, o nome da varivel que receber o valor deve sempre ser co-
locado ao lado esquerdo do operador de atribuio. Do lado direito, devemos especificar qual
valor, ou expresso, ser armazenado na varivel. Por fim, devemos inserir o smbolo de ponto-
-e-vrgula para indicar o final da instruo. O comando de atribuio possui a seguinte sintaxe:
fim cdigo 1
U2 Fundamentos da Linguagem de Programao C 55
fim cdigo 2
Resultado da execuo do programa:
A = 10
B = 20
C = 30
A = 20
B = 30
C = 20
Veja que, no Cdigo 2, na Linha 16, so declaradas trs variveis do tipo int. Como essas
variveis so do mesmo tipo, no precisamos declar-las em linhas separadas, como mostrado
a seguir:
16 int a;
17 int b;
18 int c;
Da forma como foi declarada na Linha 16, economizamos algumas linhas de cdigo. Entre-
tanto, essa simplificao pode ser realizada apenas com variveis do mesmo tipo.
Nas linhas de 19 a 21, so realizadas as atribuies de valores s variveis a, b, c, respecti-
vamente, 10, 20 e 30. Nas linhas de 24 a 26, os valores armazenados nas variveis so exibidos
na tela.
As linhas de 29 a 31 ilustram outra maneira de atribuio, na qual, em vez de atribuir valo-
res diretamente, foram atribudos os valores contidos nas variveis. Esse tipo de atribuio ser
muito utilizado ao longo dos exemplos que estudaremos.
U2 Fundamentos da Linguagem de Programao C 57
fim cdigo 3
Note que, nesse exemplo, uma varivel do tipo inteiro declarada (Linha 14), porm,
nenhum valor atribudo a ela. Em seguida, na Linha 17, o contedo dessa varivel exibido
na tela. Quando executamos esse programa pela primeira vez, temos o seguinte resultado (o
resultado pode variar de computador para computador):
Veja que, cada vez que o programa executado, a varivel a recebe um valor diferente.
Esse fato demonstra que as variveis, quando so criadas, possuem um valor aleatrio. Por isso,
fundamental que sejam atribudos valores a todas as variveis declaradas.
Outra maneira de atribuir valores s variveis durante sua declarao. Dessa forma, po-
demos declarar e inicializar o valor da varivel. O Cdigo 4 do programa a seguir demonstra
como possvel atribuir valores s variveis durante a sua declarao.
cdigo 4
1 /*
2 * Programa para exemplificar como possvel
3 * declarar e inicializar o valor de uma varivel
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13 // declarao das variveis
14 int a = 10;
15 int b = 20, c = 30;
16
17 //exibe o valor das variveis na tela
18 printf(A = %i \n, a);
19 printf(B = %i \n, b);
20 printf(C = %i \n, c);
21
22 return 0;
23 }
fim cdigo 4
Constantes
As constantes so um recurso utilizado na construo dos programas para definir que uma
determinada informao no pode ter seu valor alterado. como se voc atribusse um valor a
uma varivel e esse valor no pudesse ser modificado ao longo da execuo do programa.
A declarao de uma constante segue praticamente a mesma sintaxe da declarao de
uma varivel. No entanto, precisamos adicionar a palavra reservada const antes do tipo da vari-
vel. Assim, a sintaxe de uma constante tem a seguinte estrutura:
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13 // declarao da constante
14 const int a = 10;
15
16 //exibe o valor na tela
17 printf(A = %i \n, a);
18
19 return 0;
20 }
fim cdigo 5
Na Linha 14, temos a definio de uma constante do tipo inteiro denominada a. Note que,
alm de especificarmos o nome da constante, temos de definir, tambm, qual valor est asso-
ciado a ela. A atribuio de um valor a uma constante pode ser realizada apenas no ato da sua
declarao.
A tentativa de atribuir um valor a uma constante em outras partes do programa gera um
erro de compilao, e, com isso, o programa no pode ser executado. Por exemplo, se adicionar-
mos a instruo a seguir na Linha 15 do programa, o cdigo-fonte no ser compilado.
15 a = 20;
A mensagem indica que foi atribudo um valor a uma varivel somente de leitura, ou seja,
uma constante.
Identificadores
Os nomes utilizados para definir variveis e constantes so chamados de identificadores.
Esses nomes, tambm, sero utilizados para especificar os nomes de funes, o que aprende-
remos nas prximas unidades.
importante observar que a linguagem de programao C faz diferena entre letras mai-
sculas e minsculas. Isso significa que um identificador definido com letras minsculas, por
exemplo, idade, diferente de um identificador especificado com letras maisculas, tal como
IDADE. O termo comumente utilizado para diferenciao de maisculas e minsculas case-
-sensitive.
Por exemplo, as linhas a seguir representam trs variveis que, apesar de possurem o
mesmo nome de identificao, so consideradas diferentes pela linguagem de programao C.
1 int numero;
2 int Numero;
3 int NUMERO;
A principal instruo para entrada de dados na linguagem C o comando scanf. Esse co-
mando faz parte da biblioteca stdio.h; assim, necessariamente, todo programa que utilizar esse
comando incluir essa biblioteca.
Para utilizao desse comando, devemos indicar qual tipo de dados ser recebido por
meio de um especificador de formato. Alm disso, uma varivel deve ser informada para rece-
ber o valor digitado pelo usurio. O Cdigo 6, do programa apresentado a seguir, ilustra a utili-
zao do comando scanf para leitura de dados.
cdigo 6
1 /*
2 * Programa para exemplificar a utilizao
3 * do comando scanf para entrada de dados
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13
14 // declarao das variveis
15 int numero;
16
17 // entrada de dados
18 printf(Digite um numero e pressione ENTER: );
19 scanf(%i, &numero);
20
21
22 // exibio do resultado na tela
23 printf(O numero digitado foi %i \n, numero);
24
25 return 0;
26 }
fim cdigo 6
No exemplo do Cdigo 6, voc pde observar a utilizao do comando scanf para entrada
de dados (Linha 19). Note que a informao recebida do usurio do tipo inteiro, e, por isso, foi
necessria a utilizao do especificador de formato %i.
Quando utilizamos o comando scanf, dois pontos precisam ser destacados:
O especificador de formato deve sempre ser indicado entre aspas duplas, como, por
exemplo, %i.
Uma varivel deve ser informada para receber o valor digitado pelo usurio. Alm dis-
so, necessrio que o smbolo & seja especificado antes do nome da varivel, como,
por exemplo, &numero. A utilizao do smbolo & significa que o valor recebido ser
armazenado no endereo de memria da varivel numero. importante destacar que
a omisso do smbolo & no comando scanf um dos principais erros cometidos pelos
iniciantes em programao.
O Cdigo 7 demonstra a utilizao do comando scanf para entrada de dados do tipo float.
cdigo 7
1 /*
2 * Programa para exemplificar a utilizao
3 * do comando scanf para entrada de dados
4 *
5 * Autor: Joo da Silva
U2 Fundamentos da Linguagem de Programao C 63
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13
14 // declarao das variveis
15 float nota1, nota2, media;
16
17 // entrada de dados
18 printf(Informe a primeira nota: );
19 scanf(%f, ¬a1);
20
21 printf(Informe a segunda nota: );
22 scanf(%f, ¬a2);
23
24 // clculo da mdia aritmtica
25 media = (nota1+nota2)/2;
26
27
28 // exibio do resultado na tela
29 printf(Media = %f \n, media);
30
31 return 0;
32 }
fim cdigo 7
Note que no exemplo do Cdigo 7 utilizamos uma varivel para calcular a mdia aritmti-
ca entre as notas informadas pelo usurio (Linha 25). Como as variveis de entrada so do tipo
float, os especificadores de formato utilizados foram %f.
Como o tipo de dados float tem preciso de seis dgitos, o resultado da mdia exibido
com seis casas decimais (0.000000). Em breve, aprenderemos como formatar corretamente a
sada, de acordo com o nmero de casas decimais que desejamos.
O exemplo do Cdigo 8 demonstra a utilizao do comando de entrada scanf para o tipo
de dados char. Lembre-se de que esse tipo de dados empregado na manipulao de caracte-
res.
cdigo 8
1 /*
2 * Programa para exemplificar a utilizao
3 * do comando scanf para entrada de dados
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13
14 // declarao das variveis
15 char tamanho;
16
17
printf(Qual o tamanho de camiseta que voce usa [P, M ou G] : );
18 scanf(%c,&tamanho);
19
20
21 // exibio do resultado na tela
22
printf(Voce usa camiseta no tamanho %c \n, tamanho);
23
24 return 0;
25 }
fim cdigo 8
Outra forma de ler caracteres do teclado por meio do comando getchar, o qual realiza a
leitura de um caractere informado pelo usurio e aguarda o pressionamento da tecla enter. No
Cdigo 8, podemos substituir a utilizao do comando scanf pelo comando getchar modifican-
do apenas a Linha 18.
18 tamanho = getchar();
Voc tambm pode realizar a leitura de caracteres por meio do comando getch, que fun-
ciona exatamente da mesma forma que o comando getchar, com uma nica diferena: o usu-
rio no precisar pressionar a tecla enter. A leitura realizada automaticamente. Voc pode
alterar o programa anterior para utilizao do getch.
18 tamanho = getch();
O tipo de dados char tambm pode ser utilizado para leitura de conjuntos de caracteres.
Esses conjuntos so conhecidos em programao como strings. Para realizar a leitura de uma
string, necessrio informar o seu nmero de caracteres. Para identificar o final da string,
colocado um caractere especial NULL, representado por \0.
U2 Fundamentos da Linguagem de Programao C 65
Por exemplo: a instruo a seguir declara uma varivel do tipo char capaz de armazenar
um conjunto de at 10 caracteres.
1 char nome[10];
Suponha que essa varivel receba a seguinte informao: Joo da Silva. Visualmente, te-
mos a seguinte representao:
J o o d a S i l v a \0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
fim cdigo 9
fim cdigo 10
importante observar que todas as informaes literais exibidas pelo comando printf de-
vem ser colocadas entre aspas duplas.
O comando printf tambm pode ser utilizado para exibir o contedo de variveis. Para
isso, basta indicar qual o tipo de varivel ser exibida por meio de um especificador de formato.
Por exemplo, para exibir uma varivel do tipo inteiro, utilizamos o especificador %i:
Voc pode notar que, quando o programa est sendo executado, o especificador de for-
mato substitudo pelo contedo da varivel. No exemplo anterior, o especificador de formato
%i substitudo pelo valor 10, contido na varivel nmero.
Podemos utilizar o comando printf para exibir diversas informaes ao mesmo tempo.
Para isso, utilizamos a regra anterior, em que indicamos qual tipo de dados ser apresentado.
Nesse caso, para cada varivel exibida na tela, devemos inserir um especificador de formato. Por
exemplo:
1 int A = 10;
2 int B = 20;
3 int C = 30;
4 printf(A = %i, B = %i e C = %i, A,B,C);
Alm disso, podemos mesclar a exibio de tipos de dados, ou seja, em um mesmo printf,
podemos apresentar dados de tipos diferentes.
1 int A = 10;
2 char B = F;
3 float C = 125.80;
4 printf(A = %i, B = %c e C = %f , A,B,C);
Podemos, ainda, utilizar o comando printf para exibir o resultado de uma expresso. Por
exemplo:
1 int A = 10;
2 int B = 20;
3 int C = 30;
4 printf(Resultado = %i , (A+B+C));
Como aprendemos anteriormente, toda varivel ocupa uma posio na memria princi-
pal. Utilizando o comando printf e o especificador de formato %u, podemos visualizar qual o
endereo de memria em que a varivel foi armazenada. O exemplo no Cdigo 11 demonstra
esse recurso. Perceba que, alm de utilizar o especificador de formato, precisamos utilizar o
operador & na varivel.
cdigo 11
1 /*
2 * Programa para exemplificar a utilizao
3 * do especificador de formato %u e o operador &
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 int numero;
13
14 printf(Informe um numero: );
15 scanf(%i, &numero);
16
17
printf(Numero = %i, endereco = %u \n, numero, &numero);
18
19 return 0;
20 }
fim cdigo 11
U2 Fundamentos da Linguagem de Programao C 69
No Cdigo 12, o programa apresenta a utilizao dos principais cdigos de barra invertida.
cdigo 12
1 /*
2 * Programa para exemplificar a utilizao
3 * dos cdigos de barra invertida
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13 // exemplo do cdigo para nova linha
14 printf(Ola, \nJoao da Silva \nseja bem-vindo ao sistema!\n);
15
16 //pular uma linha
17 printf(\n);
18
19 // exemplo do cdigo de tabulao
20 printf(Nome \tIdade \n);
21 printf(Carlos \t21 \n);
22 printf(Ana \t32 \n);
23 printf(Jose \t28 \n);
24 printf(\n);
25
26 // aspas duplas
27 printf(Texto entre \aspas duplas\ n\n);
28
29 // aspas simples
fim cdigo 12
Nome Idade
Carlos 21
Ana 32
Jose 28
Atencao!
Quando utilizamos o comando printf, podemos controlar a largura das informaes que
sero exibidas na tela. Para isso, podemos utilizar alguns caracteres entre o smbolo de i% e o
caractere que representa o formato. O exemplo do Cdigo 13 ilustra a utilizao desse tipo de
controle:
cdigo 13
1 /*
2 * Programa para exemplificar a utilizao
3 * do controle de largura dos campos
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13 /*
14 * Exemplo para nmeros
15 */
16
U2 Fundamentos da Linguagem de Programao C 71
fim cdigo 13
Nome = Jose
Nome = Antonio
Nome = Ana
Nome = Jose
Nome = Antonio
Nome = Ana
Nome = Jose
Nome = Antonio
Nome = Ana
fim cdigo 14
U2 Fundamentos da Linguagem de Programao C 73
Alm do comando printf, temos mais dois comandos que podem ser utilizados para exibi-
o de informaes na tela:
putchar: utilizado, exclusivamente, para exibio de caracteres (char) na tela.
puts: utilizado para exibio de conjuntos de caracteres (strings) na tela.
Observe, no Cdigo 15, a aplicao desses comandos.
cdigo 15
1 /*
2 * Programa para exemplificar a utilizao
3 * dos comandos putchar e puts
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13 char nome[20];
14 char sexo;
15
16 //leitura das informaes
17 printf(Informe o nome: );
18 gets(nome);
19
20 printf(Informe o sexo [M ou F]: );
21 sexo = getchar();
22
23 //exibio dos dados na tela
24 printf(Seu nome e: );
25 puts(nome);
26 printf(Seu sexo e: );
27 putchar(sexo);
28
29 return 0;
30 }
fim cdigo 15
8. EXPRESSES ARITMTICAS
Os computadores so especialistas na resoluo de clculos matemticos. Para realizar
esses clculos, eles utilizam as expresses matemticas. Essas expresses so formadas por um
conjunto de smbolos especiais conhecidos como operadores aritmticos.
Observe os principais operadores aritmticos da linguagem C, listados no Quadro 7.
O Cdigo 16 ilustra a utilizao de operadores aritmticos. Esse programa tem como obje-
tivo a converso entre temperaturas em Fahrenheit para graus Celsius.
cdigo 16
1 /*
2 * Programa para exemplificar a utilizao
3 * dos operadores aritmticos
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13
14 float temperatura;
15 float conversao;
16
17 printf(Informe a temperatura em Fahrenheit: );
18 scanf(%f, &temperatura);
U2 Fundamentos da Linguagem de Programao C 75
19
20 //converso de F para C
21 conversao = (temperatura-32) * 5/9;
22
23 //resultado
24 printf(Temperatura em graus Celsius = %.2f \n, conversao);
25
26 return 0;
27 }
fim cdigo 16
30
printf(O resto da divisao e igual a %i \n, resto);
31
32 return 0;
33 }
fim cdigo 17
Qualquer tipo de expresso matemtica pode ser resolvida utilizando os operadores arit-
mticos. Entretanto, devemos obedecer ordem dos parnteses utilizados nas expresses.
Como exemplo, considere a expresso a seguir:
26 (10 + ( 20 / 3) )
+ 5* ( 4* ( 3 8 ) )
12
( 9%2 )
O programa que resolve essa expresso ser apresentado no Cdigo 18.
cdigo 18
1 /*
2 * Programa para demonstrar a resoluo de
3 * expresses matemticas complexas
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13
14 float expressao;
15
16 expressao = (26/12)+5*( (10+(20/3))/(9%2) ) - (4*(3-8) );
17
18 printf(Resultado da expressao = %.2f \n,expressao);
19
20 return 0;
21 }
fim cdigo 18
Em algumas expresses, podemos ter operadores com a mesma prioridade. Nesses casos,
resolvemos inicialmente os operadores que esto mais esquerda, e, em seguida, os operado-
res mais direita. Por exemplo, considere a seguinte expresso matemtica:
10 + 20 6* 2 / 4
1 resultado = 10+20-6*2/4;
Resultado da execuo do programa:
Nmero = 11;
Resultado da execuo do programa:
Numero = 9;
++numero;
numero++;
30
31 return 0;
32 }
fim cdigo 19
Numero 1 = 11
Numero 2 = 11
Operadores de atribuio
Os operadores de atribuio tm como objetivo a alterao do valor de uma varivel le-
vando em considerao seu valor inicial. Por exemplo, considere a operao tpica de atribuio
a seguir:
Note que, na operao de atribuio, em vez de utilizarmos apenas o operador =, foi em-
pregado o operador +=. Essa operao equivalente seguinte expresso:
36
37
38 printf(Operador: %= \n);
39 num = 10;
40 num %= 7;
41 printf(Numero = %i \n\n,num);
42
43 return 0;
44 }
fim cdigo 20
Operador: -=
Numero = 8
Operador: *=
Numero = 50
Operador: /=
Numero = 5
Operador: =
Numero = 3
9. EXPRESSES LGICAS
As expresses lgicas permitem ao programador estabelecer relaes entre valores ou
variveis dentro dos programas. Uma expresso lgica sempre resulta em um valor lgico, que
pode ser considerado verdadeiro ou falso.
Quando trabalhamos com expresses lgicas, trs tipos de operadores podem ser empre-
gados:
Operadores de igualdade: utilizados para estabelecer equivalncia entre dados pre-
sentes nos programas, tambm podem ser empregados para avaliar se uma determi-
nada varivel igual, ou diferente, outra varivel. Os operadores de igualdade so
listados no Quadro 10:
cdigo 21
1 /*
2 * Programa para exemplificar a utilizao
3 * dos operadores de igualdade
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13 int num1, num2;
14 int op_igualdade, op_diferenca;
15
16 printf(Informe o primeiro numero: );
17 scanf(%i, &num1);
18
19 printf(Informe o segundo numero: );
20 scanf(%i, &num2);
21
22 //operador de igualdade
23 op_igualdade = num1 == num2;
24
25 //operador de diferena
26 op_diferenca = num1 != num2;
27
28 printf(%i e igual a %i = %i \n, num1,num2,op_igualdade);
29 printf(%i e diferente de %i = %i \n, num1,num2,op_diferenca);
30
31 return 0;
32 }
fim cdigo 21
Resultado da execuo do programa:
Informe o primeiro numero: 10
Informe o segundo numero: 5
10 e igual a 5 = 0
10 e diferente de 5 = 1
No Cdigo 22, temos um programa que demonstra a utilizao dos operadores relacio-
nais, verifique:
cdigo 22
1 /*
2 * Programa para exemplificar a utilizao
3 * dos operadores relacionais
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13 int num1, num2;
14 int maior,menor,maiorigual,menorigual;
15
16 printf(Informe o primeiro numero: );
17 scanf(%i, &num1);
18
19 printf(Informe o segundo numero: );
20 scanf(%i, &num2);
21
22 maior = num1 > num2;
23 menor = num1 < num2;
24 maiorigual = num1 >= num2;
25 menorigual = num1 <= num2;
26
27
printf(%i e maior que %i = %i \n, num1,num2,maior);
28
printf(%i e menor que %i = %i \n, num1,num2,menor);
29
printf(%i e maior ou igual que %i= %i \n, num1,num2,maiorigual);
30
printf(%i e menor ou igual que %i= %i \n, num1,num2,menorigual);
31
32 return 0;
33 }
fim cdigo 22
Lembre-se de que utilizamos nmeros inteiros para representar esses valores lgicos, em
que o valor Verdadeiro (true) igual a 1 e o valor Falso (false) igual a 0.
Operadores lgicos: utilizados para concatenar, ou seja, ligar diversas expresses lgi-
cas. Esses operadores seguem os mesmos tipos de conectivos lgicos da lgica mate-
mtica; no entanto, na linguagem C, eles recebem uma simbologia diferente. O Quadro
12 apresenta os principais operadores lgicos.
cdigo 23
1 /*
2 * Programa para exemplificar a utilizao
3 * dos operadores lgicos
4 *
5 * Autor: Joo da Silva
6 */
7
U2 Fundamentos da Linguagem de Programao C 85
fim cdigo 23
Negacao (!)
!1 = 0
!0 = 1
Conjuncao (&&)
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
Disjuncao (||)
1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
10. BIBLIOTECAS
A linguagem de programao C possui uma infinidade de bibliotecas que auxiliam o traba-
lho do programador. Essas bibliotecas, quando utilizadas, devem ser referenciadas no cabealho
do programa por meio da diretiva include.
Uma biblioteca importante da linguagem C a biblioteca math.h, que contm diversas
funes matemticas implementadas, as quais podem ser utilizadas na construo de progra-
mas. O Quadro 13 apresenta algumas funes da biblioteca math.h.
cdigo 24
1 /*
2 * Programa para demonstrar algumas
3 * funes da biblioteca math.h
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9 #include <math.h>
10
11 int main()
12 {
13 float numero;
14
15
printf(===== Biblioteca Matematica =====\n);
16
17 printf(\n=> Arredondamento \n);
18 printf(Informe um numero: );
19 scanf(%f, &numero);
20
printf(Arredondamento para cima = %.2f \n, ceil(numero));
21
printf(Arredondamento para baixo = %.2f \n, floor(numero));
22
23 printf(\n=> Valor Absoluto \n);
24 printf(Informe um numero negativo: );
25 scanf(%f, &numero);
26
printf(Valor absoluto = %.2f \n, fabs(numero));
27
28 printf(\n=> Logaritmo \n);
29 printf(Informe um numero: );
30 scanf(%f, &numero);
31
printf(Log natural e^x = %.2f \n, exp(numero));
32
printf(Log natural = %.2f \n, log(numero));
33
printf(Log de base 10 = %.2f \n, log10(numero));
34
35 printf(\n=> Potenciacao \n);
36 printf(Informe um numero: );
37 scanf(%f, &numero);
38
printf(%.2f ao quadrado = %.2f \n, numero, pow(numero,2));
39
printf(%.2f ao cubo = %.2f \n, numero,pow(numero,3));
40
41 printf(\n=> Raiz Quadrada \n);
42 printf(Informe um numero: );
43 scanf(%f, &numero);
44
printf(Raiz quadrada de %.2f= %.2f \n,numero,sqrt(numero));
45
46 return 0;
47 }
fim cdigo 24
=> Arredondamento
Informe um numero: 8.62
Arredondamento para cima = 9.00
Arredondamento para baixo = 8.00
=> Logaritmo
Informe um numero: 2.5
Log natural e^x = 12.18
Log natural = 0.92
Log de base 10 = 0.40
=> Potenciacao
Informe um numero: 2
2.00 ao quadrado = 4.00
2.00 ao cubo = 8.00
Esse outro exemplo, descrito no Cdigo 25, demonstra a utilizao da biblioteca math.h
na resoluo de problemas trigonomtricos envolvendo seno, cosseno e tangente. Nesse pro-
grama, o usurio dever informar um ngulo em graus, o qual ser convertido para radianos. Em
seguida, sero calculados seu seno, cosseno e tangente.
cdigo 25
1 /*
2 * Programa para demonstrar algumas
3 * funes da biblioteca math.h
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9 #include <math.h>
10
11 int main()
12 {
13 const float PI = 3.1415;
14
15 float graus, radianos;
16
17 printf(Informe um angulo em graus: );
18 scanf(%f, &graus);
19
20 radianos = (graus*PI)/180;
21
printf(%.2f graus = %.2f radianos \n,graus,radianos);
U2 Fundamentos da Linguagem de Programao C 89
22
23
printf(Cosseno %.2f graus = %.2f \n,graus, cos(radianos));
24
printf(Seno %.2f graus = %.2f \n,graus, sin(radianos));
25
printf(Tangente %.2f graus = %.2f \n,graus, tan(radianos));
26
27 return 0;
28 }
fim cdigo 25
16 strcpy(nome,Joao);
17 strcpy(sobrenome,da Silva);
18 printf(Nome = %s \n, nome);
19 printf(Sobrenome = %s \n, sobrenome);
20
21 strcat(nome,sobrenome);
22 printf(Nome = %s \n, nome);
23
24
printf(O nome e Joao da Silva? %i\n,strcmp(nome,Joao da Silva));
25
printf(O nome e Joao da Silva? %i\n, strcmp(nome,Jose da Silva));
26
27
printf(O nome %s possui %i caracteres \n, nome, strlen(nome));
28
29 return 0;
30 }
fim cdigo 26
12 {
13 float base, altura, area;
14
15 printf(Calculo da Area do Triangulo\n);
16
17 printf(Informe a base: );
18 scanf(%f, &base);
19 printf(Informe a altura: );
20 scanf(%f,&altura);
21
22 //clculo da rea do tringulo
23 area = (base*altura)/2;
24
25 //resultado
26 printf(A area do triangulo e = %.2f, area);
27
28 return 0;
29 }
fim cdigo 27
2) Escreva um algoritmo que receba um nmero inteiro do teclado e imprima na tela seu
sucessor (numero +1) e seu antecessor (numero 1).
cdigo 28
1 /*
2 * Programa para determinar o sucessor
3 * e o antecessor de um nmero inteiro.
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 int main()
12 {
13 int numero;
14
15 //leitura das informaes
16 printf(Informe um numero: );
17 scanf(%i, &numero);
18
19 //escrita do resultado na tela
fim cdigo 28
3) Escreva um algoritmo que receba um nmero inteiro positivo e maior que zero. Cal-
cule e apresente na tela:
a) a raiz quadrada do nmero;
b) o nmero ao quadrado;
c) o nmero ao cubo.
cdigo 29
1 /*
2 * Programa para demonstrar algumas
3 * funes da biblioteca math.h
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9 #include <math.h>
10
11 int main()
12 {
13 float numero, raizquadrada;
14 float quadrado, cubo;
15
16 printf(Informe um numero: );
17 scanf(%f, &numero);
18
19 //raiz quadrada
20 raizquadrada = sqrt(numero);
21
22 //nmero elevado ao quadrado
23 quadrado = pow(numero, 2);
24
25 //nmero elevado ao cubo
26 cubo = pow(numero,3);
27
28 //resultado
29 printf(Raiz quadrada = %.2f \n, raizquadrada);
30 printf(Quadrado = %.2f \n, quadrado);
31 printf(Cubo = %.2f \n, cubo);
U2 Fundamentos da Linguagem de Programao C 93
32
33 return 0;
34 }
fim cdigo 29
Resultado da execuo do programa:
Informe um numero: 25
Raiz quadrada = 5.00
Quadrado = 625.00
Cubo = 15625.00
4) Um trabalhador recebeu seu salrio mensal e precisa pagar as contas de gua, luz e
telefone. Escreva um algoritmo que solicite ao usurio o salrio e os valores das contas
de gua, luz e telefone. Em seguida, calcule e apresente na tela quanto sobrou para o
trabalhador aps o pagamento das contas.
cdigo 30
1 /*
2 * Programa para calcular o restante do
3 * salrio de um trabalhador
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10
11 int main()
12 {
13 float salario, agua, luz, telefone;
14 float restante;
15
16 printf(Informe seu salario: );
17 scanf(%f,&salario);
18 printf(Valor da conta de Agua: );
19 scanf(%f,&agua);
20 printf(Valor da conta de Luz: );
21 scanf(%f,&luz);
22 printf(Valor da conta de Telefone: );
23 scanf(%f,&telefone);
24
25 //clculo do restante
26 restante = salario - (agua+luz+telefone);
27
28 //resultado
29 printf(O restante do seu salario R$ %.2f , restante);
30
31 return 0;
32 }
fim cdigo 30
5) Elabore um algoritmo que realize a converso de moedas. Esse algoritmo dever so-
licitar ao usurio a cotao do dlar, bem como a cotao do euro. Em seguida, o
usurio dever informar o valor, em reais, que deseja converter. Aps os clculos ne-
cessrios, o algoritmo exibir na tela:
a) o valor em reais convertido para dlar;
b) o valor em reais convertido para euro.
cdigo 31
1 /*
2 * Programa para converter moedas
3 *
4 * Autor: Joo da Silva
5 */
6
7 #include <stdio.h>
8
9 int main()
10 {
11 float valor_reais, cotacao_dolar, cotacao_euro;
12 float valor_dolar, valor_euro;
13
14 printf(Informe um valor para conversao (em reais): );
15 scanf(%f,&valor_reais);
16 printf(Cotacao do Dolar: );
17 scanf(%f,&cotacao_dolar);
18 printf(Cotacao do Euro: );
19 scanf(%f,&cotacao_euro);
20
21 //converso real para dlar
22 valor_dolar = valor_reais / cotacao_dolar;
23
24 //converso real para euro
25 valor_euro = valor_reais / cotacao_euro;
26
27 //resultado
28 printf(Valor em dolar = %.2f \n , valor_dolar);
29 printf(Valor em euro = %.2f \n, valor_euro);
30
31 return 0;
32 }
fim cdigo 31
U2 Fundamentos da Linguagem de Programao C 95
fim cdigo 32
7) Uma pessoa deseja emagrecer 25% do seu peso atual. Para isso, voc dever escrever
um programa na linguagem C capaz de calcular qual ser o peso dessa pessoa aps
emagrecer o percentual desejado. O programa dever solicitar pessoa seu peso atu-
al e exibir as informaes resultantes na tela.
cdigo 33
01 /*---------------------------------------------
02 *
03
* Exemplo de uma aplicao com o objetivo de calcular as condies de pagamento de um
04 * produto.
05 *
06 * Autor: Joo da Silva
07 *
08 *-------------------------------------------*/
09
10 /*---------------------------------------------
11 * BIBLIOTECAS
12 *-------------------------------------------*/
13 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
14
15 /*--------------------------------------------*
16 * PROGRAMA PRINCIPAL
17 *-------------------------------------------*/
18 int main()
19 {
20 // declarao das variveis globais
21 float peso_atual;
U2 Fundamentos da Linguagem de Programao C 97
22 float peso_novo;
23
24 printf(------------------------------\n);
25 printf(| CALCULO DO PESO \n);
26 printf(------------------------------\n);
27 printf(\n);
28 printf(Informe seu peso atual: );
29 scanf(%f,&peso_atual);
30
31 peso_novo = peso_atual-(peso_atual*0.25);
32
33 printf(\nO novo peso da pessoa apos emagrecer 25%% serah = %0.2f \n\n,peso_novo);
34
35 return 0; // fim da aplicao
36 }
fim cdigo 33
8) Uma loja de departamentos est realizando uma grande promoo de seus produtos.
Seus clientes podero comprar qualquer item da promoo e pagar nas seguintes con-
dies:
a) vista, com 20% de desconto no valor do produto;
b) 1 + 1 sem juros, com 10% de desconto no valor do produto;
c) 1 + 2 sem juros, com 5% de desconto no valor do produto;
d) 1 + 3 sem juros, e sem desconto no valor do produto;
e) 1 + 4 sem juros, e sem desconto no valor do produto;
f) 1 + 5 sem juros, e sem desconto no valor do produto;
91
printf(......Restante: 3x de R$ %0.2f (tres parcelas)\n, condicao_pagamento_04);
92 printf(\n); //pular uma linha
93 printf(>>>Condicao 05: \n);
94
printf(..............: 1 + 4 sem juros e sem desconto no valor do produto \n);
95
printf(.......Entrada: 1x de R$ %0.2f \n, condicao_pagamento_05);
96 printf(......Restante: 4x de R$ %0.2f (quatro parcelas)\n, condicao_
pagamento_05);
97 printf(\n); //pular uma linha
98 printf(>>>Condicao 06: \n);
99
printf(..............: 1 + 5 sem juros e sem desconto no valor do produto \n);
100
printf(.......Entrada: 1x de R$ %0.2f \n, condicao_pagamento_06);
101 printf(......Restante: 5x de R$ %0.2f (cinco parcelas)\n, condicao_
pagamento_06);
102 printf(\n); //pular uma linha
103 printf(>>>Condicao 07: \n);
104
printf(..............: 1 + 6 sem juros e sem desconto no valor do produto \n);
105
printf(.......Entrada: 1x de R$ %0.2f \n, condicao_pagamento_07);
106
printf(......Restante: 6x de R$ %0.2f (seis parcelas)\n, condicao_pagamento_07);
107 printf(\n); //pular uma linha
108 printf(>>>Condicao 08: \n);
109
printf(..............: 1 + 7 sem juros e sem desconto no valor do produto \n);
110
printf(.......Entrada: 1x de R$ %0.2f \n, condicao_pagamento_08);
111
printf(......Restante: 7x de R$ %0.2f (sete parcelas)\n, condicao_pagamento_08);
112 printf(\n); //pular uma linha
113 printf(>>>Condicao 09: \n);
114
printf(..............: 1 + 8 sem juros e sem desconto no valor do produto \n);
115
printf(.......Entrada: 1x de R$ %0.2f \n, condicao_pagamento_09);
116
printf(......Restante: 8x de R$ %0.2f (oito parcelas)\n, condicao_pagamento_09);
117 printf(\n); //pular uma linha
118 printf(>>>Condicao 10: \n);
119
printf(..............: 1 + 9 sem juros e sem desconto no valor do produto \n);
120
printf(.......Entrada: 1x de R$ %0.2f \n, condicao_pagamento_10);
121
printf(......Restante: 9x de R$ %0.2f (nove parcelas)\n, condicao_pagamento_10);
122 printf(\n); //pular uma linha
123
124 return 0; // fim da aplicao
125
126 }
fim cdigo 34
cdigo 35
01 /*---------------------------------------------------
02 *
03 * Exemplo de uma aplicao capaz de construir interfaces grficas
04 * com o usurio utilizando os caracteres da tabela ASCII. Essa
05 * aplicao demonstra os principais caracteres utilizados
06 * na elaborao de interfaces grficas.
07 *
08 * Autor: Joo da Silva
09 *
10 *-------------------------------------------------*/
11
12 /*---------------------------------------------------
13 * BIBLIOTECAS
14 *-------------------------------------------------*/
15 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
16
17 /*--------------------------------------------------*
18 * PROGRAMA PRINCIPAL
19 *-------------------------------------------------*/
20 int main()
21 {
22 // declarao das variveis globais
23
24
25 printf(------------------------------------\n);
26 printf(| INTERFACES GRFICAS COM A TABELA ASCII \n);
27 printf(----------------------------------------\n);
28 printf(\n); //pular uma linha
29 printf(\n); //pular uma linha
30 printf(>>>Caracteres para preenchimento\n);
31 printf(\n);
32 printf(Codigo da Tabela 176, caractere resultante %c \n, 176);
33 printf(......................Exemplo: %c%c%c%c%c \n\n,176,176,176,176,176);
34 printf(Codigo da Tabela 177, caractere resultante %c \n, 177);
35 printf(......................Exemplo: %c%c%c%c%c \n\n,177,177,177,177,177);
36 printf(Codigo da Tabela 178, caractere resultante %c \n, 178);
37 printf(......................Exemplo: %c%c%c%c%c \n\n,178,178,178,178,178);
38
39 printf(\n); //pular uma linha
40 printf(>>>Caracteres para construcao de janelas (simples)\n);
41 printf(\n);
42 printf(Codigo da Tabela 218, caractere resultante %c \n, 218);
43 printf(Codigo da Tabela 196, caractere resultante %c \n, 196);
44 printf(Codigo da Tabela 191, caractere resultante %c \n, 191);
45 printf(Codigo da Tabela 179, caractere resultante %c \n, 179);
46 printf(Codigo da Tabela 217, caractere resultante %c \n, 217);
47 printf(Codigo da Tabela 192, caractere resultante %c \n, 192);
48 printf(Codigo da Tabela 180, caractere resultante %c \n, 180);
49 printf(Codigo da Tabela 193, caractere resultante %c \n, 193);
50 printf(Codigo da Tabela 194, caractere resultante %c \n, 194);
51 printf(Codigo da Tabela 195, caractere resultante %c \n, 195);
52 printf(Codigo da Tabela 197, caractere resultante %c \n, 197);
53 printf(......................Exemplo: \n);
printf(\t\t\t %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
54
\n,218,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191);
55 printf(\t\t\t %c \t EXEMPLO %c\n,179,179);
printf(\t\t\t %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
56
\n,192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217);
57 printf(\n); //pular uma linha
58 printf(>>>Caracteres para construcao de janelas (duplo)\n);
59 printf(\n);
60 printf(Codigo da Tabela 201, caractere resultante %c \n, 201);
61 printf(Codigo da Tabela 205, caractere resultante %c \n, 205);
62 printf(Codigo da Tabela 187, caractere resultante %c \n, 187);
63 printf(Codigo da Tabela 186, caractere resultante %c \n, 186);
64 printf(Codigo da Tabela 188, caractere resultante %c \n, 188);
65 printf(Codigo da Tabela 200, caractere resultante %c \n, 200);
66 printf(Codigo da Tabela 185, caractere resultante %c \n, 185);
67 printf(Codigo da Tabela 202, caractere resultante %c \n, 202);
68 printf(Codigo da Tabela 203, caractere resultante %c \n, 203);
U2 Fundamentos da Linguagem de Programao C 103
fim cdigo 35
cdigo 36
01 /*---------------------------------------------------
02 *
03 * Exemplo de aplicao com o objetivo de apresentar
04 * um conjunto de informaes na tela de maneira tabulada
05 * por meio dos cdigos de barra invertida
06 *
07 * Autor: Joo da Silva
08 *
09 * Importante: Como a apresentao de informaes na
10 * tela em modo console (ou prompt de comando) no
11 * demonstra adequadamente os acentos da lngua
12 * portuguesa, TODAS as sadas e informaes textuais
13 * foram propositalmente codificadas SEM acento.
14 *----------------- ---------------------------------*/
15
16 /*-----------------------------------------------------
17 * BIBLIOTECAS
18 *---------------------------------------------------*/
19 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
20
21 /*----------------------------------------------------*
22 * PROGRAMA PRINCIPAL
23 *---------------------------------------------------*/
24 int main()
25 {
26 // declarao das variveis globais
27 char titulo_do_programa[30] = INFORMACOES PESSOAIS;
28
29 char pessoa1_nome[20] = Joao da Silva;
30 char pessoa1_datanascimento[20] = 03/04/1968;
31 char pessoa1_telefone[20] = (11) 3323-2233;
32
33 char pessoa2_nome[20] = Carlos Antonio;
34 char pessoa2_datanascimento[20] = 08/10/1976;
35 char pessoa2_telefone[20] = (12) 8342-4432;
36
37 char pessoa3_nome[20] = Francisco Jose;
38 char pessoa3_datanascimento[20] = 12/12/1982;
39 char pessoa3_telefone[20] = (11) 3334-5533;
40
41 char pessoa4_nome[20] = Ana Maria;
42 char pessoa4_datanascimento[20] = 11/09/1980;
fim cdigo 36
11) Altere o programa anterior para que todas as informaes sejam apresentadas em
forma de tabela. Para isso, utilize os caracteres ASCII para separao dos dados.
cdigo 37
01 /*--------------------------------------------
02 *
03 * Exemplo de aplicao com o objetivo de apresentar
04 * um conjunto de informaes na tela de maneira tabulada
05 * por meio dos cdigos de barra invertida
06 *
07 * Autor: Joo da Silva
08 *
09 * Importante: Como a apresentao de informaes na tela
10 * em modo console (ou prompt de comando) no
11 * demonstra adequadamente os acentos da lingua
12 * portuguesa, TODAS as sadas e informaes textuais
13 * foram propositalmente codificadas SEM acento.
14 *------------------------------------------*/
15
16 /*--------------------------------------------
17 * BIBLIOTECAS
18 *------------------------------------------*/
19 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
20
21 /*-------------------------------------------*
22 * PROGRAMA PRINCIPAL
23 *------------------------------------------*/
24 int main()
25 {
26 // declarao das variveis globais
27 char titulo_do_programa[30] = INFORMACOES PESSOAIS;
28
79 printf(%c,195);
80 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
81 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
82 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,197,196,196,196,196);
83 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
84 printf(%c%c%c%c%c%c%c%c%c,196,196,196,197,196,196,196,196,196,196);
85 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
86 printf(%c%c%c,196,196,196,196);
87 printf(%c \n,180);
printf(%c %s \t%c %s \t%c %s %c \n,179, pessoa2_nome, 179, pessoa2_
88
datanascimento,179,pessoa2_telefone,179);
89 printf(%c,195);
90 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
91 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
92 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,197,196,196,196,196);
93 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
94 printf(%c%c%c%c%c%c%c%c%c,196,196,196,197,196,196,196,196,196,196);
95 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
96 printf(%c%c%c,196,196,196,196);
97 printf(%c \n,180);
printf(%c %s \t%c %s \t%c %s %c\n,179, pessoa3_nome, 179, pessoa3_
98
datanascimento,179,pessoa3_telefone,179);
99 printf(%c,195);
100 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
101 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
102 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,197,196,196,196,196);
103 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
104 printf(%c%c%c%c%c%c%c%c%c,196,196,196,197,196,196,196,196,196,196);
105 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
106 printf(%c%c%c,196,196,196,196);
107 printf(%c \n,180);
printf(%c %s \t\t%c %s \t%c %s %c \n,179, pessoa4_nome, 179, pessoa4_
108
datanascimento,179,pessoa4_telefone,179);
109 printf(%c,192);
110 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
111 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
112 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,193,196,196,196,196);
113 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
114 printf(%c%c%c%c%c%c%c%c%c,196,196,196,193,196,196,196,196,196,196);
115 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
116 printf(%c%c%c,196,196,196,196);
117 printf(%c \n,217);
118
119 return 0; // fim da aplicao
120 }
fim cdigo 37
24 float total_imposto;
25
26 // APRESENTAO DAS INFORMAES NA TELA
27 // Construo de uma interface grfica utilizando cdigos da tabela ASCII
28 printf(%c,201);
29 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
30 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
31 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
32 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
33 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
34 printf(%c\n,187);
35 printf(%c %s\t\t\t %c\n,186,titulo_do_programa,186);
36 printf(%c,200);
37 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
38 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
39 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
40 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
41 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
42 printf(%c \n\n,188);
43
44 printf(Informe o valor venal do veiculo: );
45 scanf(%f,&valor_venal_veiculo);
46
47 printf(Informe a aliquota do imposto (Exemplo 4% = 0.04): );
48 scanf(%f,&aliquota_ipva);
49
50 //calculo do imposto
51 total_imposto = valor_venal_veiculo*aliquota_ipva;
52
53
54 //apresentao dos resultados (sada na tela)
55 printf(\n\n>>> RESULTADO <<< \n);
56 printf(......Total de imposto a ser pago R$ %0.2f \n, total_imposto);
57
58
59 return 0; // fim da aplicao
60
61 }
fim cdigo 38
13) Escreva um programa capaz de calcular e apresentar em metros por segundo o valor
da velocidade de um maratonista que tenha percorrido uma determinada distncia
em quilmetros em um determinado tempo, marcado em segundos. Para isso utilize
a seguinte frmula: Velocidade = (Distncia em quilmetros * 1000) / (Tempo em mi-
nutos * 60).
cdigo 39
01 /*---------------------------------------------------
02 *
03 * Exemplo de aplicao com o objetivo de calcular a velocidade
04 * de um maratonista em metros por segundo
05 *
06 * Autor: Joo da Silva
07 *
08 *-------------------------------------------------*/
09
10 /*---------------------------------------------------
11 * BIBLIOTECAS
12 *-------------------------------------------------*/
13 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
14
15 /*--------------------------------------------------*
16 * PROGRAMA PRINCIPAL
17 *-------------------------------------------------*/
18 int main()
19 {
20 // declarao das variveis globais
21 char titulo_do_programa[30] = MARATONA;
22 float distancia_quilometros;
23 float distancia_metros;
24 float tempo_minutos;
25 float tempo_segundos;
U2 Fundamentos da Linguagem de Programao C 113
26 float velocidade_maratonista;
27
28 // APRESENTAO DAS INFORMAES NA TELA
29 // Construo de uma interface grfica utilizando cdigos da tabela ASCII
printf(%c%c%c%c%c%c%c%c%c,178,178,178,178,178,178,
30
178,178,178,178);
printf(%c%c%c%c%c%c%c%c%c,178,178,178,178,178,178,
31
178,178,178,178);
printf(%c%c%c%c%c%c%c%c%c,178,178,178,178,178,178,
32
178,178,178,178);
33 printf(%c\n,178);
34
35 printf(%c%c%c%c%c%c%c%c,176,176,176,176,176,176,176,176);
36 printf( %s ,titulo_do_programa);
37 printf(%c%c%c%c%c%c%c%c\n,176,176,176,176,176,176,176,176);
38 printf(%c%c%c%c%c%c%c%c%c,178,178,178,178,178,178,178,178,178,178);
39 printf(%c%c%c%c%c%c%c%c%c,178,178,178,178,178,178,178,178,178,178);
40 printf(%c%c%c%c%c%c%c%c%c,178,178,178,178,178,178,178,178,178,178);
41 printf(%c\n\n,178);
42
43 printf(Informe a distancia em Km: );
44 scanf(%f,&distancia_quilometros);
45
46 printf(Informe o tempo em minutos: );
47 scanf(%f,&tempo_minutos);
48
49 //calculos necessrios
50 distancia_metros = distancia_quilometros*1000;
51 tempo_segundos = tempo_minutos*60;
52 velocidade_maratonista = distancia_metros/tempo_segundos;
53
54
55 //apresentao dos resultados (sada na tela)
56 printf(\n\n>>> RESULTADO <<< \n);
printf(......Velocidade do maratonista em Metros por segundo = %0.2f \n,
57
velocidade_maratonista);
58
59
60 return 0; // fim da aplicao
61 }
fim cdigo 39
3) Nos cdigos de programao, reflita sobre a utilidade da diretiva #include e do bloco main{ .... }.
4) Quais relaes podem ser definidas em uma anlise comparativa entre a estrutura bsica de algoritmos e pro-
gramas na linguagem C?
5) Considerando que os dados se dividem em tipos especficos em funo das caractersticas das informaes que
eles armazenam, explique os tipos de dados int, char, float e void.
6) O que uma varivel? Apresente um exemplo de declarao de uma varivel do tipo int, uma do tipo char, uma
do tipo float e uma do tipo void.
8) Refletindo sobre a sintaxe de um comando de atribuio, ilustre, por meio de um cdigo na linguagem C, a atri-
buio do valor 42 para uma varivel do tipo int.
9) Ilustre, por meio de um cdigo na linguagem C, a atribuio do valor 25.98 para uma varivel do tipo float.
10) Explique o que ocorre quando um valor do tipo 25.66 atribudo para uma varivel do tipo int.
11) Apresente um exemplo de um comentrio de uma nica linha e um exemplo de um comentrio com mltiplas
linhas.
12) Qual a utilidade da inicializao das variveis? E qual sua relao com o lixo de memria?
15) Os nomes utilizados para definir variveis e constantes so chamados de identificadores. Apresente pelo me-
nos cinco identificadores vlidos e cinco identificadores invlidos na linguagem C e explique o porqu de essa
linguagem ser chamada de case-sensitite.
26) Explique como uma varivel do tipo char pode ser utilizada para armazenar um conjunto de caracteres.
27) Declare uma varivel capaz de armazenar o nome completo de uma pessoa.
31) Qual a funo do cdigo de barra invertida \n e a funo do cdigo de barra invertida \t?
32) Qual cdigo de barra invertida, no comando printf, utilizado para exibir uma aspa dupla?
33) Qual cdigo de barra invertida, no comando printf, utilizado para exibir uma barra invertida?
13. CONSIDERAES
Enfim, terminamos o contedo da Unidade 2. Este o momento para treinarmos os con-
ceitos apresentados ao longo desta unidade. Por isso, importantssimo que voc estude os
exerccios resolvidos.
1. OBJETIVOS
Controlar o fluxo de execuo dos algoritmos por meio das estruturas condicionais.
Especificar blocos de comando por meio das estruturas de repetio.
2. CONTEDOS
Estruturas de controle.
Estruturas condicionais.
Estruturas de repetio.
4. INTRODUO UNIDADE
Na unidade anterior, pudemos estudar os conceitos fundamentais para a construo de
programas, desde variveis at expresses lgicas e aritmticas. Nesta unidade, teremos a pos-
sibilidade de aprender recursos mais avanados para o desenvolvimento de programas, conhe-
cidos como estruturas de controle.
As estruturas de controle fornecem ao programador um mecanismo para controlar o fluxo
de execuo dos programas. Esses mecanismos so conhecidos como estruturas condicionais e
estruturas de repetio.
Uma estrutura condicional permite ao programador determinar, com base em uma ex-
presso lgica, se um trecho do programa deve ser executado. As estruturas condicionais da
linguagem C so: if, if-else e switch.
Com uma estrutura de repetio, voc pode observar que possvel definir que a execu-
o de um trecho do cdigo seja repetida por um determinado nmero de vezes. As estruturas
de repetio tambm so conhecidas como laos de repetio. Na linguagem C, h trs meca-
nismos de repetio: for, while e do-while.
Nesta unidade, aprenderemos como criar programas utilizando as estruturas de controle
(tanto as condicionais quanto as de repetio).
5. ESTRUTURA CONDICIONAL
Na linguagem de programao C, h trs tipos de estruturas condicionais:
estrutura condicional simples;
estrutura condicional composta;
estrutura seleo mltipla.
Essas estruturas possibilitam a definio do trecho do cdigo-fonte, que ser executado
com base em uma ou mais condies lgicas.
Vamos conhec-las melhor.
1 if ( condicao )
2 {
3
//trecho do cdigo
4 }
U3 Estruturas de Controle 119
O trecho do cdigo ser executado sempre que a condio definida for verdadeira. Na lin-
guagem C, para que uma expresso lgica seja verdadeira, seu resultado deve ser diferente de
zero. As expresses lgicas com resultados iguais a zero so representadas como falsas.
Na sintaxe anterior, os smbolos { e } delimitam o trecho do cdigo que pertence a estru-
tura condicional.
O Cdigo 1 demonstra a utilizao da estrutura condicional simples associada aos opera-
dores de igualdade. Acompanhe-o atentamente.
cdigo 1
1 /*
2 * Programa para demonstrar a utilizao
3 * de estruturas condicionais simples
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 int a, b;
13
14 printf(Informe o valor de A: );
15 scanf(%i,&a);
16 printf(Informe o valor de B: );
17 scanf(%i,&b);
18
19 if ( a == b )
20 {
21 printf(A e igual a B \n);
22 }
23
24 if ( a != b )
25 {
26 printf(A e diferente de B \n);
27 }
28
29 return 0;
30 }
fim cdigo 1
No Cdigo 1, voc pode observar que as mensagens do comando de sada printf so exi-
bidas somente quando a condio da expresso lgica satisfeita.
fim cdigo 2
U3 Estruturas de Controle 121
1 if ( condicao )
2 {
3 // trecho do cdigo 1
4 }
5 else {
6 // trecho do cdigo 2
7 }
O trecho do Cdigo 1 (Linha 3) ser executado apenas quando o resultado da condio for
verdadeiro (diferente de zero), enquanto o trecho do Cdigo 2 (Linha 6) ser executado apenas
quando a condio for falsa (igual a zero).
No Cdigo 3 do programa a seguir, demonstrada a utilizao da estrutura condicional
composta. Este exemplo tem como objetivo calcular o peso ideal de uma pessoa. Para isso, o
programa deve receber sua altura e sexo, e, com base nas frmulas descritas a seguir, dever
determinar o peso ideal:
frmula do peso ideal para homens: (72,7 * altura) 58,0;
frmula do peso ideal para mulheres: (62,1 * altura) 44,7.
cdigo 3
1 /*
2 * Programa para demonstrar a utilizao
3 * de estruturas condicionais compostas
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9 #include <ctype.h>
10
11 int main()
12 {
13 float altura, pesoideal;
14 char sexo;
15
16
17 printf(Informe a altura: );
18 scanf(%f,&altura);
19
20 fflush(stdin);
21 printf(Informe o sexo [m = masculino; f = feminino]: );
22 scanf(%c,&sexo);
23
24 //Converso do caractere de Minsculo para Maisculo
25 sexo = toupper(sexo);
26
27 //clculo do peso ideal
28 if ( sexo == M)
29 {
30 printf(\nMasculino\n);
31 pesoideal = (72.7 * altura) - 58.0;
32 }else{
33 printf(\nFeminino\n);
34 pesoideal = (62.1 * altura) - 44.7;
35 }
36
37 //resultado
38 printf(Seu peso ideal e = %.2f , pesoideal);
39
40 return 0;
41 }
fim cdigo 3
Masculino
Seu peso ideal e = 72.86
do comando fflush, o programa pode no executar a instruo scanf(%c,&sexo), uma vez que
o buffer pode conter dados desnecessrios.
Outro recurso interessante a utilizao do comando toupper, responsvel pela conver-
so de um caractere minsculo para maisculo. Caso o usurio tenha digitado o sexo m, por
exemplo, o comando toupper realizar a converso desse caractere para maisculo, ou seja,
para M. Alm do comando toupper, h o comando tolower, que realiza o processo inverso,
converte um caractere maisculo para minsculo (M para m). Ambos esto disponveis na
biblioteca ctype.h. Se esse comando no fosse utilizado, precisaramos alterar a estrutura con-
dicional, conforme est demonstrado na Linha 28 a seguir.
28 if ( ( sexo == M) || ( sexo == m) )
Utilizando uma estrutura condicional composta, diversos testes condicionais podem ser
executados. Com isso, podemos avaliar sucessivamente vrias condies at que um determi-
nado trecho seja executado. Esse tipo de estrutura conhecido como condicional aninhada.
No Cdigo 4, o programa recebe como entrada o tipo do funcionrio e o valor do salrio
mensal. Os funcionrios do tipo Gerente (G), que atingirem um total de vendas superior a R$
100.000,00, devero ter um bnus de R$ 350,00 no salrio, caso contrrio, recebero apenas o
salrio. J os funcionrios do tipo Vendedor (V), que venderem acima de R$ 5.000,00 ganharo
uma comisso de 5% sobre o valor vendido, caso contrrio, a comisso de 2%.
cdigo 4
1 /*
2 * Programa para demonstrar a utilizao
3 * de estruturas condicionais compostas
4 * com if aninhado
5 *
6 * Autor: Joo da Silva
7 */
8
9 #include <stdio.h>
10 #include <ctype.h>
11
12 int main()
13 {
14 float salario, cotavendas,totalvendas;
15 float novosalario;
16 char tipofuncionario;
17
18 //leitura das variveis
19 printf(Tipo funcionario [g=gerente; v=vendedor] : );
20 scanf(%c,&tipofuncionario);
21 printf(Salario: );
22 scanf(%f,&salario);
23
24 //Converso para Minsculo
25 tipofuncionario = tolower(tipofuncionario);
26
27 if ( tipofuncionario == g)
28 {
29 /*
30 * funcionrio = Gerente
31 */
32 printf(Cota de vendas: );
33 scanf(%f,&cotavendas);
34
35 if ( cotavendas >= 100000)
36 {
37 novosalario = salario + 350.00;
38
printf(Salario mensal do Gerente= %.2f\n, novosalario);
39 }else{
40 printf(Salario mensal do Gerente= %.2f \n, salario);
41 }
42
43 }else{
44
45 /*
46 * funcionrio = Vendedor
47 */
48
49 if ( tipofuncionario == f)
50 {
51 printf(Total vendido: );
52 scanf(%f,&totalvendas);
53
54 if ( totalvendas >= 5000)
55 {
56 // comisso de 5%
57 novosalario = salario + (salario * (5/100));
58 }else{
59 //comisso de 2%
60 novosalario = salario + (salario * (2/100));
61 }
62
63
printf(Salario mensal do Vendedor= %.2f\n, novosalario);
64
65 }else{
66 printf(Tipo de funcionario invlido.\n);
67 }
68 }
69
70 return 0;
71 }
fim cdigo 4
U3 Estruturas de Controle 125
cdigo 5
1 /*
2 * Programa para demonstrar a utilizao
3 * de estruturas condicionais composta
4 * com os operadores lgicos
5 *
6 * Autor: Joo da Silva
7 */
8
9 #include <stdio.h>
10
11 int main()
12 {
13 float nota1, nota2;
14 float media;
15
16 //leitura das variveis
17 printf(Informe a 1a nota : );
18 scanf(%f,¬a1);
19 printf(Informe a 2a nota : );
20 scanf(%f,¬a2);
21
22 //clculo da mdia
23 media = (nota1+nota2) /2;
24 printf(Media = %.1f \n, media);
25
26 if ( ( media >= 0 ) && ( media < 2 ) )
27 {
28
29 printf(Reprovado \n);
30
31 }else{
32
33 if ( ( media >= 2 ) && ( media < 5 ) ) {
34 printf(Exame \n);
35 }else{
36 printf(Aprovado \n);
37 }
38
39 }
40
41 return 0;
42 }
fim cdigo 5
1 switch( variavel )
2 {
3 case valor1:
4 // trecho do cdigo
5 break;
6
7 case valor2:
8 // trecho do cdigo
9 break;
10
11 case valor3:
12 // trecho do cdigo
13 break;
14
15 default:
16 // trecho do cdigo
17
18 }
cdigo 6
1 /*
2 * Programa para demonstrar a utilizao
3 * de estruturas de seleo mltipla
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 int codigo;
13
14 //leitura das variveis
15 printf(Informe o tipo do funcionario: );
16 scanf(%i,&codigo);
17
18 switch(codigo)
19 {
20 case 1:
21 printf(Diretor \n);
22 break;
23
24 case 2:
25 printf(Gerente de Projeto \n);
26 break;
27
28 case 3:
29 printf(Programador \n);
30 break;
31
32 case 4:
33 printf(Estagiario \n);
34 break;
35
36 default:
37 printf(Tipo de funcionario invalido \n);
38 }
39
40 return 0;
41 }
fim cdigo 6
6. ESTRUTURA DE REPETIO
Ao longo desta unidade, voc ter a oportunidade de estudar as estruturas de repetio.
Essas estruturas so utilizadas para solucionar muitos problemas encontrados na construo de
programas.
As estruturas de repetio, tambm conhecidas como laos, so utilizadas para indicar
trechos do cdigo-fonte que devero ser repetidos. Elas so muito empregadas no desenvolvi-
mento de programas, pois facilitam o trabalho do programador na elaborao do cdigo-fonte.
H, tambm, milhares de problemas computacionais que envolvem a repetio de trechos
do cdigo-fonte. Esses problemas podem ser facilmente solucionados por meio das estruturas
de repetio. A linguagem C possui trs tipos de estrutura de repetio:
for;
while;
do...while.
4 // trecho do cdigo
5
6 }
O parmetro de inicializao da estrutura define o valor inicial que ser atribudo va-
rivel contador. A condio de parada determina qual valor dever ser atingido pela varivel
contadora (ou valor final). J o parmetro de incremento ou decremento especifica como ser o
comportamento do contador. Podemos definir um contador incremental (++), no qual seu valor
sempre ser acrescido, ou podemos especificar um contador decremental (--), em que seu valor
ser decrescido.
O Cdigo 7 demonstra a utilizao do comando for para exibir na tela nmeros entre 1 e
10. Neste exemplo, foi utilizado um contador incremental de um em um.
cdigo 7
1 /*
2 * Programa para demonstrar a utilizao
3 * da estrutura de repetio for
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 int contador;
13
14 for ( contador = 1; contador <= 10; contador++)
15 {
16 printf(%i \n, contador);
17 }
18
19 return 0;
20 }
fim cdigo 7
No prximo exemplo, no Cdigo 8, observe que o conjunto de nmeros que ser impresso
na tela determinado em funo dos valores informados pelo usurio. Nesse caso, a varivel
valor_inicial representa o valor inicial que ser atribudo ao contador, enquanto a varivel va-
lor_final determina a condio de parada da contagem.
cdigo 8
1 /*
2 * Programa para demonstrar a utilizao
3 * da estrutura de repetio for
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 int contador;
13 int valor_inicial, valor_final;
14
15 printf(Informe o valor inicial: );
16 scanf(%i,&valor_inicial);
17 printf(Informe o valor final: );
18 scanf(%i,&valor_final);
19
20
for (contador=valor_inicial; contador<=valor_final; contador++)
21 {
22 printf(%i \n, contador);
23 }
24
25 return 0;
26 }
fim cdigo 8
Veja que ainda temos mais uma situao em que muitos problemas computacionais en-
volvem estruturas de repetio e necessitam que o valor de uma determinada varivel seja
acumulado ao longo dos laos de repetio. Esse recurso de acumular o valor de uma varivel
conhecido como Acumulador.
Embora na maioria das vezes esse mecanismo seja empregado para acumular a soma de
uma varivel, tambm podemos utiliz-lo para acumular a subtrao, a multiplicao ou a divi-
U3 Estruturas de Controle 131
so. Entretanto, importante observar que, para utilizarmos acumuladores, sempre necess-
rio inicializar a varivel utilizada como acumulador com o valor zero (exceto para multiplicao,
em que se deve ser inicializado com 1). Com isso, podemos garantir que nenhum valor prvio
afetar o processo do acumulador.
O programa a seguir (Cdigo 9) demonstra a utilizao do recurso de acumulador para
somar os nmeros entre 1 e 10.
cdigo 9
1 /*
2 * Programa para demonstrar a utilizao
3 * do acumulador
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 int i; // contador
13 int soma;
14
15 //inicializao do acumulador
16 soma = 0;
17
18 for( i = 1; i <= 10; i++)
19 {
20 //acumulador
21 soma += i;
22 }
23
24 printf(Soma = %i \n, soma);
25
26 return 0;
27 }
fim cdigo 9
de repetio for. No entanto, a estrutura while pode ser utilizada em problemas em que no
sabemos o nmero de vezes que o lao de repetio ser repetido.
Dessa forma, a estrutura while pode ser empregada em laos de repetio com ou sem
contadores. A sintaxe da estrutura while sem contador definida como segue:
1 while ( <condicao> )
2 {
3 // trecho de cdigo
4 }
1 <inicializao>
2 while ( condicao )
3 {
4
5 <incremento ou decremento>
6 }
Quando utilizamos a estrutura de repetio com contador, devemos observar que a ini-
cializao da varivel contadora deve ser realizada antes da estrutura (Linha 1). Alm disso,
necessrio especificar o incremento ou decremento da varivel contadora (Linha 5).
O comparativo a seguir demonstra a utilizao das estruturas de repetio for e while na
resoluo de um mesmo problema. O objetivo exibir dez vezes o nome do usurio na tela.
Observe as duas estruturas.
Soluo utilizando for:
1 i = 1;
2 while ( i <= 10 )
3 {
4 printf(%s \n, Joao da Silva);
5 i++;
6 }
U3 Estruturas de Controle 133
fim cdigo 10
Joao da Silva
Deseja continuar [S ou N]? s
Joao da Silva
Deseja continuar [S ou N]? s
Joao da Silva
Deseja continuar [S ou N]? s
Joao da Silva
Deseja continuar [S ou N]? s
Joao da Silva
Deseja continuar [S ou N]? s
Joao da Silva
Deseja continuar [S ou N]? s
Joao da Silva
Deseja continuar [S ou N]? n
Voc pode observar nesse exemplo que no existe uma varivel contadora. Ao contrrio,
a repetio da estrutura determinada pela varivel continuar. O usurio deve informar, a cada
repetio, se deseja (ou no) continuar com o lao.
No prximo exemplo, no Cdigo 11, utilizaremos a estrutura while para ler um conjunto
de notas das provas realizadas pelos alunos do Claretiano. O lao de repetio ser executa-
do sempre que uma nota vlida for informada. Uma nota vlida precisa, necessariamente, ser
maior ou igual a zero, e menor ou igual a dez. Ao final, o algoritmo exibir a quantidade de notas
vlidas lidas, alm da mdia das notas.
cdigo 11
1 /*
2 * Programa para demonstrar a utilizao
3 * da estrutura while
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 float nota = 0;
13 float soma = 0;
14 int totalnotas = 0;
15
16 while ( (nota >= 0) && (nota <= 10) )
17 {
18
19 printf(Nota: );
20 scanf(%f,¬a);
21
22 if ( (nota >= 0) && (nota <= 10) )
23 {
U3 Estruturas de Controle 135
fim cdigo 11
Resultado da execuo do programa:
Nota: 5.5
Nota: 9.8
Nota: 6.2
Nota: 7.4
Nota: -1
Total de notas lidas: 4
Media das notas: 7.2
1 do{
2
3 //trecho do cdigo
4
5 }while ( <condicao> );
A condio de parada da estrutura do...while definida por meio de uma expresso lgi-
ca, que pode conter operadores lgicos e relacionais.
O prximo programa, descrito no Cdigo 12, demonstra a utilizao da estrutura de repe-
tio do...while. Este exemplo tem como objetivo exibir na tela os nmeros pares entre 1 e 10.
cdigo 12
1 /*
2 * Programa para demonstrar a utilizao
3 * da estrutura de repetio do...while
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 int i;
13
14 i = 1;
15
16 do{
17
18 if ( (i % 2) == 0 )
19 {
20 printf(%i \n,i);
21 }
22 i++;
23 }while ( i <= 10 );
24
25 return 0;
26 }
fim cdigo 12
44
45 }else if (idade > 60) {
46
47 faixa5++;
48
49 }
50
51 fflush(stdin);
52 printf(Deseja continuar (S ou N)? );
53 continuar = getche();
54
55
}while ( (continuar == S) || (continuar == s) );
56
57
printf(\n\nNumero pessoas 1 - 15 anos: %i \n, faixa1);
58
printf(Numero pessoas 16 - 30 anos: %i \n, faixa2);
59
printf(Numero pessoas 31 - 45 anos: %i \n, faixa3);
60
printf(Numero pessoas 46 - 60 anos: %i \n, faixa4);
61
printf(Numero pessoas > 60 anos: %i \n, faixa5);
62
63 return 0;
64 }
fim cdigo 13
7. EXERCCIOS RESOLVIDOS
Os exerccios deste tpico foram selecionados de contedos preexitentes da disciplina Al-
goritmos e Programao, com o intuito de demonstrar como possvel transformar algoritmos
em programas.
U3 Estruturas de Controle 139
46 votos_vencedor = votos3;
47 }
48
49 printf(O candidato %s venceu a eleicao com %i votos \n, nome_vencedor,votos_
vencedor);
50
51 return 0;
52 }
fim cdigo 14
2) Escreva um programa que analise os dados de uma pesquisa realizada entre os habi-
tantes da cidade de Taboo do Norte. Os dados coletados foram: idade, sexo (M/F) e
salrio. O objetivo da pesquisa saber: (a) mdia do salrio dos habitantes; (b) maior
e menor idade do grupo; (c) quantidade de mulheres com salrios superiores a R$
600,00.
A execuo do programa deve terminar quando uma idade negativa for informada.
cdigo 15
1 /*
2 * Programa para analisar os dados
3 * de uma pesquisa
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 int idade, contador, feminino;
13 int maior, menor;
14 float salario,soma;
15 char sexo;
16
17 //inicializao das variveis
18 idade = 0;
19 soma = 0;
20 contador = 0;
21 feminino = 0;
22
23 while ( idade >= 0 )
24 {
U3 Estruturas de Controle 141
fim cdigo 15
3) O Cdigo Americano para Troca de Informaes, conhecido comumente como ASCII, do in-
gls American Standard Code for Information Interchange, foi criado para representar um
conjunto de caracteres para utilizao em aplicaes. Inicialmente, esse conjunto contava
com um total de 127 cdigos diferentes, desde cdigos para o controle do fluxo de dados, at
os caracteres da lngua inglesa, tais como letras maisculas e minsculas de A at Z, bem
como os dgitos de 0 (zero) a 9 (nove), e os sinais grficos de pontuao.
Com o surgimento dos microcomputadores pessoais e a popularizao mundial das
aplicaes, foi necessrio representar caracteres acentuados, especialmente por conta
da diversidade de lnguas, como, por exemplo, o portugus. Com isso, o conjunto origi-
nal (contendo 127 caracteres) foi estendido para 256 caracteres codificados, contem-
plando com isso caracteres acentuados, alm de uma srie de sinais grficos.
Para demonstrar a diversidade da ASCII, construa uma aplicao capaz de apresentar
na tela os cdigos presentes na tabela, bem como o nmero decimal referente ao c-
digo.
cdigo 16
1 /*----------------------------------------------
2 *
3 * Exemplo de um programa capaz de apresentar na tela o conjunto
4 * de caracteres da tabela ASCII.
5 *
6 * Autor: Joo da Silva
7 *
8 *--------------------------------------------*/
9
10 /*----------------------------------------------
11 * BIBLIOTECAS
12 *--------------------------------------------*/
13 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
14
15 /*---------------------------------------------*
16 * PROGRAMA PRINCIPAL
17 *--------------------------------------------*/
18 int main()
19 {
20 // declarao das variveis globais
21 int i = 0;
U3 Estruturas de Controle 143
22
23
24 // SADA DE DADOS
25 for ( i = 0; i < 256; i++ )
26 {
27 printf(%i \t %c \n,i,i);
28 }
29
30 return 0; // fim da aplicao
31 }
fim cdigo 16
4) Altere o programa anterior para que o usurio seja capaz de informar o intervalo que
ele deseja visualizar da tabela ASCII. Para isso, o programa dever solicitar ao usurio
um valor inicial e um valor final, os quais representam o intervalo desejado.
cdigo 17
1 /*--------------------------------------------------
2 *
3 * Exemplo de um programa capaz de apresentar na tela o conjunto
4 * de caracteres da tabela ASCII.
5 *
6 * Autor: Joo da Silva
7 *
8 *------------------------------------------------*/
9
10 /*--------------------------------------------------
11 * BIBLIOTECAS
12 *------------------------------------------------*/
13 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
14
15 /*-------------------------------------------------*
16 * PROGRAMA PRINCIPAL
17 *------------------------------------------------*/
18 int main()
19 {
20 // declarao das variveis globais
21 char titulo_do_programa[30] = Tabela ASCII;
22 int i = 0;
23 int valor_inicial;
24 int valor_final;
25
26 //TITULO DO PROGRAMA
27 printf(%c, 218);
28 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
29 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
30 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
31 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
32 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
33 printf(%c\n,191);
34 printf(%c %s\t\t\t\t %c\n,179,titulo_do_programa,179);
35 printf(%c,192);
36 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
37 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
38 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
39 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
40 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
41 printf(%c \n\n,217);
42
43
44 // ENTRADA DE DADOS
45 printf(Informe o valor inicial: );
46 scanf(%i,&valor_inicial);
47 printf(Informe o valor final: );
48 scanf(%i,&valor_final);
49
50 printf(Caracteres do intervalo informado: \n\n);
51
52 // SADA DE DADOS
53 for ( i = valor_inicial; i <= valor_final; i++ )
54 {
55 printf(%i \t %c \n,i,i);
56 }
57
58 return 0; // fim da aplicao
59 }
fim cdigo 17
U3 Estruturas de Controle 145
10 /*-----------------------------------------------------
11 * BIBLIOTECAS
12 *---------------------------------------------------*/
13 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
14 #include <stdlib.h> //para utilizao da instruo system
15
16 /*----------------------------------------------------*
17 * PROGRAMA PRINCIPAL
18 *---------------------------------------------------*/
19 int main()
20 {
21 // declarao das variveis globais
22 char titulo_do_programa[30] = MOVIMENTACAO CONTA CORRENTE;
23
24 //informacoes do cliente
25 char cliente_nome_titular[30];
26 int cliente_numero_conta;
27 int cliente_numero_agencia;
28 float cliente_saldo = -1;
29
30 int opcao_desejada;
31 float valor_saque;
32 float valor_deposito;
33
34
35 do{
36 //
37 // MENU PRINCIPAL
38 //
39 system(cls); //limpar as informacoes da tela
40 printf(%c,218);
41 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
42 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
43 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
44 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
45 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
46 printf(%c\n,191);
47 printf(%c >>> %-39s %c \n,179,titulo_do_programa,179);
48 printf(%c,192);
49 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
50 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
51 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
52 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
53 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
54 printf(%c\n\n,217);
55
56 printf( [1] Cadastrar cliente \n);
57 printf( [2] Inicializar saldo do cliente \n);
58 printf( [3] Realizar Saque na conta corrente \n);
59 printf( [4] Realizar Deposito na conta corrente \n);
U3 Estruturas de Controle 147
fim cdigo 18
semelhante em outros ambientes, como, por exemplo, no NetBeans. Este resultado obtido
com a compilao e a execuo do cdigo-fonte apresentado no Cdigo 18.
6) Utilizando como base o exerccio anterior, crie uma aplicao para simular as opera-
es de movimentao de uma conta de poupana. Neste programa, podero ser ca-
dastrados os dados do cliente: nome do titular, nmero da conta e nmero da agncia,
bem como o saldo. Algumas funcionalidades que o sistema dever apresentar so: (I)
cadastrar um novo cliente; (II) inicializar o saldo do cliente; (III) realizar uma operao
de aplicao e atualizar o saldo; (IV) realizar uma operao de resgate e atualizar o
saldo; (V) atualizar o saldo da poupana em funo da porcentagem de rendimento
mensal; (VI) exibir informaes a respeito do cliente e (VII) finalizar a aplicao.
cdigo 19
1 /*------------------------------------------------------
2 *
3 * Exemplo de aplicao com o objetivo de simular a movimentao
4 * da conta de poupana de um cliente
5 *
6 * Autor: Joo da Silva
7 *
8 *----------------------------------------------------*/
9
10 /*------------------------------------------------------
11 * BIBLIOTECAS
12 *----------------------------------------------------*/
13 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
14 #include <stdlib.h> //para utilizao da instruo system
15
16 /*-----------------------------------------------------*
17 * PROGRAMA PRINCIPAL
18 *----------------------------------------------------*/
19 int main()
20 {
fim cdigo 19
54 //
55 system(cls); //limpar as informacoes da tela
56 printf(%c,218);
57 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
58 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
59 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
60 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
61 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
62 printf(%c\n,191);
63 printf(%c >>> %-39s %c \n,179,titulo_do_programa,179);
64 printf(%c,192);
65 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
66 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
67 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
68 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
69 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
70 printf(%c\n\n,217);
71
72 printf( [1] Cadastrar jogador \n);
73 printf( [2] Exibir jogador com o maior numero de gols (artilheiro) \n);
74 printf( [3] Exibir jogador com o menor numero de gols \n);
75 printf( [4] Exibir a media de gols do campeonato (por jogador) \n);
76 printf( [0] Sair do sistema \n\n);
77
78 printf( Selecione a opcao desejada: );
79 scanf(%i,&opcao_desejada);
80
81 switch(opcao_desejada){
82
83 case 1:
84 system(cls); //limpar as informacoes da tela
85 printf(\n\n%c%c%c%c>> CADASTRAR JOGADOR \n\n,195,196,196,196);
86 fflush(stdin);
87 printf(Informe o nome completo do jogador.: );
88 gets(jogador_nomecompleto);
89 fflush(stdin);
90 printf(Informe o nome do time do jogador..: );
91 gets(jogador_nometime);
92 printf(Informe o numero de gols do jogador: );
93 scanf(%i,&jogador_numerogols);
94
95 if ( total_jogadores == 0 ){
96 // como este eh o primeiro jogador devemos copiar suas informacoes
97 // pois ateh o momento ele eh o jogador com mais e menos gols
98
99 //maior numero de gols
100 strcpy(jogador_maior_numero_gols_nomecompleto,jogador_nomecompleto);
101 strcpy(jogador_maior_numero_gols_nometime,jogador_nometime);
102 jogador_maior_numero_gols_numerogols = jogador_numerogols;
103
U3 Estruturas de Controle 157
151
152 break;
153
154 case 3:
155 system(cls); //limpar as informacoes da tela
156 printf(\n\n%c%c%c%c>> MENOR NUMERO DE GOLS \n\n,195,196,196,196);
157
printf(Nome do jogador.....: %s \n, jogador_menor_numero_gols_
158
nomecompleto);
printf(Nome do time (clube): %s \n, jogador_menor_numero_gols_
159
nometime);
printf(Numero de gols......: %i \n, jogador_menor_numero_gols_
160
numerogols);
161
162 fflush(stdin);
printf(\nOperacao realizada com SUCESSO! \n\nPressione <ENTER> para o
163
menu principal\n\n);
164 getchar();
165 break;
166
167 case 4:
168 system(cls); //limpar as informacoes da tela
169 printf(\n\n%c%c%c%c>> MEDIA DE GOLS \n\n,195,196,196,196);
170
171 media_golsmarcados = ((float)total_golsmarcados/(float)total_jogadores);
printf(A media de gols no campeonato foi de %0.2f gols por jogador
172
\n,media_golsmarcados);
172
173 fflush(stdin);
printf(\nOperacao realizada com SUCESSO! \n\nPressione <ENTER> para o
174
menu principal\n\n);
175 getchar();
176 break;
177
178 }
179
180 }while(opcao_desejada != 0);
181
182
183 printf(\n\n\n\n); //pular linhas
184 return 0; // fim da aplicao
185 }
fim cdigo 20
8) Elabore um algoritmo que exiba na tela um grfico horizontal de barras em funo dos
valores informados pelo usurio. Como entrada, este algoritmo dever receber cinco
Claretiano - Centro Universitrio
160 Laboratrio de Programao
nmeros inteiros, cada nmero representando uma barra do grfico. O tamanho das
barras est vinculado ao valor especificado pelo usurio. Como exemplo, considere a
seguinte entrada:
a) nmero 1: 30;
b) nmero 2: 8;
c) nmero 3: 45;
d) nmero 4: 68;
e) nmero 5: 18.
28 barra_grafico_04,barra_grafico_05;
29
30 int i;
31 char opcao_desejada;
32
33 do{
34 //
35 // MENU PRINCIPAL
36 //
37 system(cls); //limpar as informacoes da tela
38 printf(%c,218);
39 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
40 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
41 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
42 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
43 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
44 printf(%c\n,191);
45 printf(%c >>> %-39s %c \n,179,titulo_do_programa,179);
46 printf(%c,192);
47 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
48 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
49 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
50 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
51 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
52 printf(%c\n\n,217);
53
54
55 printf(Informe o valor da 1a barra do grafico: );
56 scanf(%i,&barra_grafico_01);
57 printf(Informe o valor da 2a barra do grafico: );
58 scanf(%i,&barra_grafico_02);
59 printf(Informe o valor da 3a barra do grafico: );
60 scanf(%i,&barra_grafico_03);
61 printf(Informe o valor da 4a barra do grafico: );
62 scanf(%i,&barra_grafico_04);
63 printf(Informe o valor da 5a barra do grafico: );
64 scanf(%i,&barra_grafico_05);
65
66 printf(\n\n%c%c%c%c>> GRAFICO \n\n,195,196,196,196);
67
68 //gerar barra do grafico 01
69 for( i = 1; i <= barra_grafico_01; i++){
70 printf(.);
71 }
72 printf(\n);
73 //gerar barra do grafico 02
74 for( i = 1; i <= barra_grafico_02; i++){
75 printf(.);
76 }
77 printf(\n);
fim cdigo 21
19 * PROGRAMA PRINCIPAL
20 *-------------------------------------------------------*/
21 int main()
22 {
25
26 //valores do grafico
27 int barra_grafico_01,barra_grafico_02,barra_grafico_03,
28 barra_grafico_04,barra_grafico_05;
29
30 int i;
31 char opcao_desejada;
32
33 do{
34 //
35 // MENU PRINCIPAL
36 //
38 printf(%c,218);
39 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
40 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
41 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
42 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
43 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
44 printf(%c\n,191);
46 printf(%c,192);
47 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
48 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
49 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
50 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
51 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
52 printf(%c\n\n,217);
53
54
56 scanf(%i,&barra_grafico_01);
58 scanf(%i,&barra_grafico_02);
60 scanf(%i,&barra_grafico_03);
62 scanf(%i,&barra_grafico_04);
64 scanf(%i,&barra_grafico_05);
65
67
70 printf(%c,178);
71 }
72 printf(\n);
75 printf(%c,178);
76 }
77 printf(\n);
80 printf(%c,178);
81 }
82 printf(\n);
85 printf(%c,178);
86 }
87 printf(\n);
90 printf(%c,178);
91 }
92 printf(\n);
93
94
95 fflush(stdin);
96 printf(\n\n\n);
98 scanf(%c,&opcao_desejada);
101
103
104
107 }
fim cdigo 22
9) Altere o algoritmo anterior de forma que o usurio seja capaz de escolher qual sm-
bolo deve ser colocado nas barras do grfico. Considerando as entradas do exerccio
anterior, por exemplo, sendo o smbolo informado igual a $, o grfico produzido ser:
---------------------------------------------------------------------------------
Grfico de Barras
---------------------------------------------------------------------------------
[30] $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
[ 8] $$$$$$$$
[45] $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
[68] $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
[18] $$$$$$$$$$$$$$$$$$
---------------------------------------------------------------------------------
Ao supor que o smbolo especificado pelo usurio foi igual a +, temos o seguinte grfico:
-------------------------------------------------------------------------------------
Grfico de Barras
-------------------------------------------------------------------------------------
[30] ++++++++++++++++++++++++++++++
[ 8] ++++++++
[45] +++++++++++++++++++++++++++++++++++++++++++++
[68] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[18] ++++++++++++++++++
-------------------------------------------------------------------------------------
cdigo 23
1 /*-------------------------------------------------
2 *
3 * Exemplo de aplicao com o objetivo de criar um grfico de
4 * barras em funo dos valores informado pelo usurio. Neste
5 * exemplo o usurio poder especificar qual o smbolo ser
6 * utilizado nas barras do grfico
7 *
U3 Estruturas de Controle 167
58 fflush(stdin);
59 printf(Informe o simbolo que sera utilizado nas barras do grafico: );
60 simbolo = getchar();
61
62 printf(Informe o valor da 1a barra do grafico: );
63 scanf(%i,&barra_grafico_01);
64 printf(Informe o valor da 2a barra do grafico: );
65 scanf(%i,&barra_grafico_02);
66 printf(Informe o valor da 3a barra do grafico: );
67 scanf(%i,&barra_grafico_03);
68 printf(Informe o valor da 4a barra do grafico: );
69 scanf(%i,&barra_grafico_04);
70 printf(Informe o valor da 5a barra do grafico: );
71 scanf(%i,&barra_grafico_05);
72
73 printf(\n\n%c%c%c%c>> GRAFICO \n\n,195,196,196,196);
74
75 //gerar barra do grafico 01
76 printf([%02i] ,barra_grafico_01);
77 for( i = 1; i <= barra_grafico_01; i++){
78 printf(%c,simbolo);
79 }
80 printf(\n);
81
82 //gerar barra do grafico 02
83 printf([%02i] ,barra_grafico_02);
84 for( i = 1; i <= barra_grafico_02; i++){
85 printf(%c,simbolo);
86 }
87 printf(\n);
88
89 //gerar barra do grafico 03
90 printf([%02i] ,barra_grafico_03);
91 for( i = 1; i <= barra_grafico_03; i++){
92 printf(%c,simbolo);
93 }
94 printf(\n);
95
96 //gerar barra do grafico 04
97 printf([%02i] ,barra_grafico_04);
98 for( i = 1; i <= barra_grafico_04; i++){
99 printf(%c,simbolo);
100 }
101 printf(\n);
102 //gerar barra do grafico 05
103 printf([%02i] ,barra_grafico_05);
104 for( i = 1; i <= barra_grafico_05; i++){
105 printf(%c,simbolo);
106 }
107 printf(\n);
U3 Estruturas de Controle 169
108
109
110 fflush(stdin);
111 printf(\n\n\n);
112 printf( Deseja continuar [S] ou [N]? );
113 scanf(%c,&opcao_desejada);
114 //conversao da opcao desejada para maiusculo
115 opcao_desejada = toupper(opcao_desejada);
116
117 }while(opcao_desejada != N);
118
119
120 printf(\n\n\n\n); //pular linhas
121 return 0; // fim da aplicao
122 }
fim cdigo 23
10) Uma pizzaria deseja controlar as entregas de pizzas realizadas por seus entregadores.
Com isso, voc dever elaborar um programa na linguagem C, que atenda s seguintes
funcionalidades:
a) Cadastrar entrega dever ser informado o nome do entregador, o dia da sema-
na (segunda-feira, tera-feira, quarta-feira, quinta-feira, sexta-feira, sbado ou do-
mingo) e a quantidade de pizzas.
b) Total de pizzas entregues.
c) Total de pizzas por dia da semana.
d) Melhor dia da semana maior nmero de pizzas entregues.
e) Pior dia da semana menor nmero de pizzas entregues.
cdigo 24
1 /*-----------------------------------------------------------
2 *
3 * Exemplo de aplicao com o objetivo de cadastrar as entregas
4 * de pizzas realizadas por uma pizzaria. Alm disso, a aplicao
5 * dever informar alguns dados estatstico a respeito das entregas.
6 *
7 * Autor: Joo da Silva
8 *
9 *---------------------------------------------------------*/
10
11 /*-----------------------------------------------------------
12 * BIBLIOTECAS
13 *---------------------------------------------------------*/
14 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
15 #include <stdlib.h> //para utilizao da instruo system
16 #include <string.h> //para utilizao da funo strcpy
17
18 /*----------------------------------------------------------*
19 * PROGRAMA PRINCIPAL
20 *---------------------------------------------------------*/
21 int main()
U3 Estruturas de Controle 171
22 {
23 // declarao das variveis globais
24 char titulo_do_programa[50] = SISTEMA DE ENTREGAS - PIZZARIA;
25
26 //informacoes da entrega
27 char entrega_nomeentregador[40];
28 int entrega_diasemana;
29 int entrega_quantidadepizzas;
30 int entrega_quantidade_segunda;
31 int entrega_quantidade_terca;
32 int entrega_quantidade_quarta;
33 int entrega_quantidade_quinta;
34 int entrega_quantidade_sexta;
35 int entrega_quantidade_sabado;
36 int entrega_quantidade_domingo;
37
38 //variaveis auxiliares
39 int opcao_desejada;
40 int aux_quantidade_pizzas;
41 int aux_informacao_desejada;
42 char melhor_dia_da_semana[40];
43 char pior_dia_da_semana[40];
44
45
46 //INICIALIZAR VARIAVEIS
47 entrega_quantidadepizzas = 0;
48 entrega_quantidade_segunda = 0;
49 entrega_quantidade_terca = 0;
50 entrega_quantidade_quarta = 0;
51 entrega_quantidade_quinta = 0;
52 entrega_quantidade_sexta = 0;
53 entrega_quantidade_sabado = 0;
54 entrega_quantidade_domingo = 0;
55
56
57 do{
58 //
59 // MENU PRINCIPAL
60 //
61 system(cls); //limpar as informacoes da tela
62 printf(%c,218);
63 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
64 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
65 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
66 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
67 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
68 printf(%c\n,191);
69 printf(%c >>> %-39s %c \n,179,titulo_do_programa,179);
70 printf(%c,192);
71 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
72 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
73 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
74 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
75 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
76 printf(%c\n\n,217);
77 printf(\t[1] CADASTRAR NOVA ENTREGA \n);
78 printf(\t[2] INFORMACOES ESTATISTICAS \n);
79 printf(\t[0] SAIR DA APLICACAO \n);
80 fflush(stdin);
81 printf(\n\n);
82 printf(\tSelecione a opcao desejada: );
83 scanf(%i,&opcao_desejada);
84 //conversao da opcao desejada para maiusculo
85 opcao_desejada = opcao_desejada;
86
87 switch(opcao_desejada){
88
89 case 1: // CADASTRAR NOVA ENTREGA
90 system(cls); //limpar as informacoes da tela
91 printf(\n\n%c%c%c%c>> CADASTRAR NOVA ENTREGA \n,195,196,196,196);
92 printf(%c\n,179);
93 printf(%c\n,179);
94
95 do{
96 fflush(stdin);
printf(%c%c%c%c%c%cInforme o nome do entregador:
97
,195,196,196,194,196,196);
98 gets(entrega_nomeentregador);
99
printf(%c%c%c%c%c%cInforme o dia da semana:
100
\n,195,196,196,197,196,196);
printf( %c%c%c%c%c%c%c%c%c%c%c%c%c%c[1] Domingo
101 \n,195,196,196,196,196,196,196,196,196,196,196,
196,196,196);
printf( %c%c%c%c%c%c%c%c%c%c%c%c%c%c[2] Segunda-feira
102 \n,195,196,196,196,196,196,196,196,196,
196,196,196,196,196);
printf( %c%c%c%c%c%c%c%c%c%c%c%c%c%c[3] Terca-feira
103 \n,195,196,196,196,196,196,196,196,196,196,
196,196,196,196);
printf( %c%c%c%c%c%c%c%c%c%c%c%c%c%c[4] Quarta-feira
104 \n,195,196,196,196,196,196,196,196,196,196,
196,196,196,196);
printf( %c%c%c%c%c%c%c%c%c%c%c%c%c%c[5] Quinta-feira
105 \n,195,196,196,196,196,196,196,196,196,196,
196,196,196,196);
printf( %c%c%c%c%c%c%c%c%c%c%c%c%c%c[6] Sexta-feira
106 \n,195,196,196,196,196,196,196,196,196,196,
196,196,196,196);
printf( %c%c%c%c%c%c%c%c%c%c%c%c%c%c[7] Sabado
107 \n,192,196,196,196,196,196,196,196,196,196,196,
196,196,196);
108 printf( \nSelecione o dia da semana desejado: );
109 scanf(%i,&entrega_diasemana);
110
111 printf(Informe a quantidade de pizzas: );
U3 Estruturas de Controle 173
112 scanf(%i,&aux_quantidade_pizzas);
113
entrega_quantidadepizzas = entrega_quantidadepizzas + aux_
114
quantidade_pizzas;
115
116 if ( entrega_diasemana == 1 ){
entrega_quantidade_domingo = entrega_quantidade_domingo + aux_
117
quantidade_pizzas;
118 }else if ( entrega_diasemana == 2){
entrega_quantidade_segunda = entrega_quantidade_segunda + aux_
119
quantidade_pizzas;
120 }else if ( entrega_diasemana == 3){
entrega_quantidade_terca = entrega_quantidade_terca+ aux_
121
quantidade_pizzas;
122 }else if ( entrega_diasemana == 4){
entrega_quantidade_quarta = entrega_quantidade_quarta + aux_
123
quantidade_pizzas;
124 }else if ( entrega_diasemana == 5){
entrega_quantidade_quinta = entrega_quantidade_quinta + aux_
125
quantidade_pizzas;
126 }else if ( entrega_diasemana == 6){
entrega_quantidade_sexta = entrega_quantidade_sexta + aux_
127
quantidade_pizzas;
128 }else if ( entrega_diasemana == 7){
entrega_quantidade_sabado = entrega_quantidade_sabado + aux_
129
quantidade_pizzas;
130 }else{
131 fflush(stdin);
132 printf(\n\n);
133 printf(>>>>ERRO: O dia da semana informado nao eh valido!\n);
134 printf(\n\n);
135 getchar();
136 system(cls);
137 }
138 }while( entrega_diasemana < 1 || entrega_diasemana > 7);
139
140 fflush(stdin);
141 printf(\n\n);
142 printf(>>>>INFO: PIZZA cadastrada com SUCESSO!\n);
143 printf(\n\n);
144 getchar();
145
146 break;
147 case 2: // INFORMACOES ESTATISTICAS
148 system(cls); //limpar as informacoes da tela
149 printf(\n\n%c%c%c%c>> INFORMACOES ESTATISTICAS \n,195,196,196,196);
150 printf(%c\n,179);
151 printf(%c%c%c%c\n,195,196,196,191);
printf( %c%c%c%c%c%c%c%c%c%c%c%c%c%c[1] Total de pizzasentregues
152 \n,195,196,196,196,196,196,196,
196,196,196,196,196,196,196);
printf( %c%c%c%c%c%c%c%c%c%c%c%c%c%c[2] Total de pizzas por dia da
153 semana\n,195,196,196,196,196,
196,196,196,196,196,196,196,196,196);
fim cdigo 24
8. QUESTES AUTOAVALIATIVAS
Esta unidade abordou alguns dos conceitos primordiais na elaborao de programas. Es-
sas estruturas, tanto as condicionais quanto as de repetio, sero utilizadas por voc ao longo
de sua carreira profissional. Aproveite as questes autoavaliativas a seguir para testar seus co-
nhecimentos e consolidar seu aprendizado.
1) Explique a sintaxe bsica da estrutura condicional simples if e a sintaxe da estrutura condicional composta if...
else.
4) Explique a sintaxe bsica da estrutura de seleo mltipla switch e a sintaxe bsica da estrutura de repetio for.
5) Como a estrutura de repetio for pode ser utilizada para exibir os nmeros pares entre 1 e 100?
6) Explique a sintaxe bsica da estrutura de repetio while e a sintaxe da estrutura de repetio do...while.
7) Observamos que o acumulador um recurso computacional utilizado para acumular os valores de uma deter-
minada varivel. Reflita sobre o seu funcionamento em uma aplicao.
8) Explique como uma estrutura de repetio pode ser utilizada para calcular a mdia de um conjunto de dez ele-
mentos do tipo float (ou double).
9) Explique como uma estrutura de repetio pode ser utilizada para contar quantos nmeros primos existem
entre 1 e 100.
10) Explique como realizado o processo para determinar o maior elemento de um conjunto por meio de uma es-
trutura de repetio. Voc pode considerar, por exemplo, que um usurio digitou um conjunto de vinte nmeros
do tipo inteiro e necessrio determinar qual o maior elemento desse conjunto.
11) Com base no item anterior, explique como possvel determinar o menor elemento de um conjunto.
9. CONSIDERAES
Terminamos o estudo de mais uma unidade, na qual voc teve a oportunidade de apren-
der sobre as estruturas de controle. Alm disso, voc pde perceber que essas estruturas so
utilizadas para determinar o fluxo de execuo dentro dos programas, e pde notar, tambm,
que existem dois grupos principais de estruturas de controle, que so: as estruturas condicionais
e as estruturas de repetio.
Na prxima unidade, voc ter contato com a criao e a manipulao de vetores e matri-
zes e de registros. Estudar, tambm, o conceito de ponteiros, aprendendo como estes podem
ajud-lo a acessar dados.
Vamos l?
1. OBJETIVOS
Criar e manipular vetores e matrizes.
Criar e manipular registros.
Compreender o conceito de ponteiros.
Acessar dados por meio dos ponteiros.
2. CONTEDOS
Estruturas de dados homogneas: vetores e matrizes.
Estruturas de dados heterogneas: registros.
Ponteiros.
sada de cada programa. Essa uma tima forma de colocar em prtica o que apren-
deu na unidade.
3) Revise os conceitos estudados at o momento. Eles sero essenciais para compreen-
der o contedo desta unidade.
4. INTRODUO UNIDADE
Nesta unidade, teremos a oportunidade de estudar as metodologias essenciais para a ela-
borao de programas de computador. fundamental que voc atente para este estudo, pois
essas metodologias abrem um leque imenso de possibilidades na construo de programas e
podem tornar o desenvolvimento mais simples e profissional.
Inicialmente, aprenderemos as estruturas de dados, as quais fornecem ao programador
um ferramental para a organizao e a manipulao de grandes conjuntos de dados; as trs
principais estruturas so: vetores, matrizes e registros.
Alm disso, discutiremos o conceito de alocao dinmica de memria. Essa tcnica im-
portante para o desenvolvedor, pois permite que seja realizado o gerenciamento da quantidade
de memria utilizada pelo programa.
Fique atento a todo o contedo que ser apresentado nesta unidade.
5. VETORES
Quando construmos programas, comum manipularmos inmeras informaes na me-
mria. A utilizao de variveis pode ser uma soluo para esse problema. No entanto, no
uma maneira simples e prtica.
Com a utilizao de variveis, os programadores podem contar com os vetores, que so
capazes de organizar sequencialmente grandes conjuntos de dados na memria; alm disso, os
vetores fornecem um mecanismo simples para recuperao das informaes.
Os vetores so uma estrutura de dados homognea, ou seja, eles sempre manipulam da-
dos do mesmo tipo. Podemos criar, por exemplo, um vetor para armazenar um conjunto de
notas de alunos. Nesse caso, como as notas permitem casas decimais, devemos criar um vetor
do tipo float ou double. Tambm possvel criar vetores de outros tipos de dados, tais como
int, char etc.
Suponha que voc precise armazenar um conjunto de dados contendo os pesos de dez
pessoas e outro conjunto contendo suas alturas. Essas estruturas podem ser visualizadas por
meio das representaes a seguir:
vetor_de_pesos
86 72 78 64 74 59 62 88 61 82
0 1 2 3 4 5 6 7 8 9
vetor_de_alturas
1.78 1.82 1.90 1.85 1.74 1.83 1.62 1.82 1.65 1.66
0 1 2 3 4 5 6 7 8 9
U4 Estrutura de Dados e Ponteiros 183
Em decorrncia das caractersticas dos dados armazenados, os dois vetores podem ser
definidos pelo tipo float. Na linguagem C, a declarao dessas estruturas definida como se v
a seguir:
1 float vetor_de_pesos[10]
2 float vetor_de_alturas[10]
Veja que, na declarao dos vetores, sempre devemos especificar o tipo de dados que
ser manipulado; em seguida, o nome da estrutura; e, por fim, entre colchetes, a quantidade de
informaes que ser armazenada (nesse caso, dez pessoas).
O acesso s informaes nos vetores efetuado por meio das posies conhecidas como
ndices. Um ndice um nmero inteiro que representa a posio, dentro da estrutura do vetor,
em que uma determinada informao est armazenada.
Por exemplo, para armazenar o valor 86 na posio 0 do vetor_de_pesos, utilizamos o
seguinte comando:
1 vetor_de_pesos[0] = 86;
Da mesma forma, caso seja necessrio recuperar uma informao de uma determinada
posio do vetor, tambm utilizamos os ndices. Por exemplo, para escrevermos na tela o conte-
do da posio 6 do vetor_de_altura, utilizamos a seguinte instruo:
fim cdigo 1
Resultado da execuo do programa:
Peso da pessoa 0: 86
Altura da pessoa 0: 1.78
Peso da pessoa 1: 72
Altura da pessoa 1: 1.82
Peso da pessoa 2: 78
Altura da pessoa 2: 1.90
Peso da pessoa 3: 64
Altura da pessoa 3: 1.85
Peso da pessoa 4: 74
Altura da pessoa 4: 1.74
Peso da pessoa 5: 59
Altura da pessoa 5: 1.83
Peso da pessoa 6: 62
Altura da pessoa 6: 1.62
Peso da pessoa 7: 88
Altura da pessoa 7: 1.82
Peso da pessoa 8: 61
Altura da pessoa 8: 1.65
Peso da pessoa 9: 82
Altura da pessoa 9: 1.66
Como estudamos na Unidade 2, a estrutura de dados vetor pode ser utilizada para arma-
zenar conjuntos de caracteres, tambm conhecidos como strings. Dessa forma, a manipulao
de cada caractere presente na string efetuada por meio dos ndices.
O Cdigo 2 demonstra a utilizao de vetores de caracteres. No exemplo, uma string in-
formada pelo usurio armazenada no vetor nome. Em seguida, exibe-se na tela caractere por
caractere dessa string. Note que foi utilizada a funo strlen da biblioteca string.h. Essa biblio-
teca retorna o nmero de caracteres da string.
cdigo 2
1 /*
2 * Programa para demonstrar a utilizao
3 * da estrutura de dados Vetor com tipo de dados char
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10
11 int main()
12 {
13 char nome[15];
14 int i;
15
16 printf(Informe seu nome: );
17 gets(nome);
18
19 //Exibio caractere por caractere
20 for( i = 0 ; i < strlen(nome); i++ ){
21 printf(Caractere da posicao %i = %c \n,i,nome[i]);
22 }
23
24 return 0;
25 }
fim cdigo 2
6. MATRIZES
A matriz uma maneira alternativa de manipulao de dados homogneos. Por meio
dela, possvel armazenar e recuperar dados multidimensionais. O que significa que, ao con-
trrio dos vetores, que so estruturas de dados unidimensionais (uma linha e vrias colunas), as
matrizes podem conter vrias linhas e vrias colunas. Os dados armazenados em matrizes so
semelhantes s tabelas.
Tomando por base, por exemplo, o problema do tpico anterior, em que era necessrio
armazenar os pesos e as alturas de dez pessoas, podemos utilizar uma matriz contendo duas
linhas e dez colunas. Na primeira linha, podem ser armazenadas as informaes referentes aos
pesos e, na segunda linha, as informaes referentes s alturas. Visualmente, essa estrutura
representada da seguinte forma:
matriz_de_pessoas
86 72 78 64 74 59 62 88 61 82
1.78 1.82 1.90 1.85 1.74 1.83 1.62 1.82 1.65 1.66
0 1 2 3 4 5 6 7 8 9
Veja que, com as matrizes, podemos armazenar os dados em uma nica estrutura. Entre-
tanto, importante observar que isso s possvel uma vez que todos os dados so do mesmo
tipo.
A declarao de uma matriz segue o mesmo modelo da declarao de um vetor; no entan-
to, alm de definir o nmero de linhas, devemos especificar tambm o nmero de colunas. A
declarao da matriz para armazenar os pesos e as alturas de dez pessoas pode ser especificada
da seguinte maneira:
1 float matriz_de_pessoas[2][10];
U4 Estrutura de Dados e Ponteiros 187
28 maior_peso = matriz_de_pessoas[0][0];
29 maior_altura = matriz_de_pessoas[1][0];
30
31 for ( idx = 0; idx < 10; idx++ ){
32
33 if ( matriz_de_pessoas[0][idx] > maior_peso ){
34 maior_peso = matriz_de_pessoas[0][idx];
35 }
36
37 if ( matriz_de_pessoas[1][idx] > maior_altura ){
38 maior_altura = matriz_de_pessoas[1][idx];
39 }
40
41 }
42
43 //exibir resultados na tela
44 printf(\nMaior peso: %.2f \n, maior_peso);
45 printf(Maior altura: %.2f \n, maior_altura);
46
47 return 0;
48 }
fim cdigo 3
Veja, no Cdigo 4, um exemplo da estrutura de dados matrizes que utilizada para calcu-
lar todos os valores possveis para tabuada de 1 a 10. Os resultados so armazenados em uma
matriz de 10 por 10 elementos. Neste exemplo, importante destacar a utilizao de duas estru-
turas de repetio aninhadas. Note que a estrutura de repetio for, da Linha 19, executada no
U4 Estrutura de Dados e Ponteiros 189
interior da estrutura for, que iniciou na Linha 18. A estrutura mais externa utilizada para varrer
as linhas da matriz, enquanto a estrutura mais interna varre as colunas.
cdigo 4
1 /*
2 * Programa para demonstrar a utilizao
3 * da estrutura de dados Matriz
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10
11 int main()
12 {
13 int tabuada[10][10];
14 int lin; // ndice para linha
15 int col; // ndice para coluna
16
17 // calcular todas as tabuadas
18 for ( lin = 0; lin < 10; lin++ ){
19 for ( col = 0; col < 10; col++ ){
20 tabuada[lin][col] = (lin+1)*(col+1);
21 }
22 }
23
24 // escrever dados na tela em forma de tabela
25 for ( lin = 0; lin < 10; lin++ ){
26 printf([%2i] , lin+1);
27 for ( col = 0; col < 10; col++ ){
28 printf(%4i,tabuada[lin][col]);
29 }
30 printf(\n);
31 }
32
33 return 0;
34 }
fim cdigo 4
7. REGISTROS
Uma estrutura do tipo registro permite a manipulao de dados heterogneos, o que
significa que, em uma nica estrutura, podemos armazenar informaes de tipos de dados di-
ferentes.
Suponha que seja necessrio construir um programa para armazenar a idade (int), o sexo
(char) e a altura (float) de um conjunto de dez pessoas. A princpio, podemos pensar em uma
soluo utilizando vetores, na qual sero necessrios trs vetores, sendo um para cada informa-
o a ser manipulada: idade, sexo e altura.
Entretanto, se utilizarmos os registros, podemos agregar essas trs informaes em uma
nica estrutura. Assim, tornamos a manipulao dos dados mais simples. Com isso, o progra-
mador pode criar novos tipos de dados conforme sua necessidade. As informaes contidas em
uma estrutura so conhecidas como campos.
Na linguagem C, a definio de uma estrutura do tipo registro especificada da seguinte
forma:
1 struct tipopessoa{
2 int idade;
3 char sexo;
4 float altura;
5 };
1 struct tipopessoa{
2 int idade;
3 char sexo;
4 float altura;
5 }pessoa1;
U4 Estrutura de Dados e Ponteiros 191
Note que, na declarao anterior, criamos uma varivel pessoa1 pertencendo estrutura
tipopessoa. Para atribuirmos valores a essa varivel, utilizamos o seguinte mecanismo:
1 pessoa1.idade = 22
2 pessoa1.sexo = M
3 pessoa1.altura = 1.68
<nome_da_estrutura>.<nome_do_campo>
30 printf(Altura: );
31 scanf(%f, &pessoa1.altura);
32
33
34 //leitura das informaes da pessoa 2
35 fflush(stdin);
36 printf(Nome: );
37 gets(pessoa2.nome);
38 printf(Idade: );
39 scanf(%i, &pessoa2.idade);
40 fflush(stdin);
41 printf(Sexo: );
42 scanf(%c,&pessoa2.sexo);
43 printf(Altura: );
44 scanf(%f, &pessoa2.altura);
45
46 //exibir informaes na tela
47 printf( Pessoa1 Pessoa2 \n);
48 printf( Nome: %-10s %-10s \n, pessoa1.nome, pessoa2.nome);
49 printf( Idade: %-10i %-10i \n, pessoa1.idade,pessoa2.idade);
50 printf( Sexo: %-10c %-10c \n, pessoa1.sexo,pessoa2.sexo);
51 printf(Altura: %-10.2f %-10.2f \n, pessoa1.altura,pessoa2.altura);
52
53 return 0;
54 }
fim cdigo 5
Pessoa1 Pessoa2
Nome: Joao Ana
Idade: 22 23
Sexo: M F
Altura: 1.72 1.66
Observe que, da mesma forma que criamos vetores de qualquer tipo de dados, tambm
podemos criar vetores de estruturas. O prximo exemplo, no Cdigo 6, demonstra a utilizao
de um vetor de estruturas capaz de armazenar o nome, a idade, o sexo e a altura de um conjunto
de cinco pessoas. Para isso, ser utilizada a estrutura de registro juntamente com os vetores.
cdigo 6
1 /*
2 * Programa para demonstrar a utilizao
3 * da estrutura de dados Registro
U4 Estrutura de Dados e Ponteiros 193
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 //declarao da estrutura
11
12
13
14 int main()
15 {
16 struct tipopessoa{
17 char nome[20];
18 int idade;
19 char sexo;
20 float altura;
21 };
22
23 struct tipopessoa pessoa[5];
24 int i;
25
26 for ( i = 0; i<5; i++){
27 fflush(stdin);
28 printf(Nome: );
29 gets(pessoa[i].nome);
30 printf(Idade: );
31 scanf(%i, &pessoa[i].idade);
32 fflush(stdin);
33 printf(Sexo: );
34 scanf(%c,&pessoa[i].sexo);
35 printf(Altura: );
36 scanf(%f, &pessoa[i].altura);
37 }
38
39 //exibir informaes na tela
40 for ( i = 0; i<5; i++){
41 printf(Pessoa %i \n, i);
42 printf(-Nome: %s \n, pessoa[i].nome);
43 printf(-Idade: %i \n, pessoa[i].idade);
44 printf(-Sexo: %c \n, pessoa[i].sexo);
45 printf(-Altura: %.2f \n, pessoa[i].altura);
46 }
47
48 return 0;
49 }
fim cdigo 6
8. PONTEIROS
Os ponteiros so um tipo de varivel que guarda um endereo de memria de outra varivel.
So considerados poderosos recursos da linguagem de programao C. Por meio deles, podemos
acessar o contedo de uma determinada varivel sem acess-la diretamente (MIZRAHI, 1990).
Quando definimos uma varivel do tipo ponteiro, necessrio especificar qual tipo de
dados est associado a ele. Por exemplo, se definirmos um ponteiro do tipo inteiro, este poder
fazer referncia (ou apontar) apenas para variveis do tipo inteiro (int). Da mesma maneira,
ponteiros do tipo float apontam apenas para variveis do tipo float, e assim sucessivamente.
Para voc declarar uma varivel do tipo ponteiro, basta inserir o smbolo de asterisco (*)
antes do nome da varivel. A declarao de ponteiros possui a seguinte sintaxe:
U4 Estrutura de Dados e Ponteiros 195
<tipo_de_dados> *<nome_da_variavel>
Exemplos:
1 int *pIdade;
// exemplo de ponteiro para int
2 char *pNome;
// exemplo de ponteiro para char
3 float *pValor; // exemplo de ponteiro para float
1 int idade;
2 int *pIdade;
3
4 idade = 22;
5 pIdade = &idade;
No cdigo apresentado, idade (Linha 1) uma varivel do tipo inteiro que, inicialmente,
recebeu o valor 22 (Linha 4). A varivel pIdade (Linha 2) uma varivel do tipo ponteiro que
pode ser apontada para uma varivel do tipo inteiro.
Utilizando o operador de endereamento, podemos fazer que o ponteiro pIdade faa uma
referncia para o endereo de memria da varivel idade, como ilustrado na Linha 5. Essa refe-
rncia lida como "pIdade aponta para varivel idade.
importante observar que uma varivel do tipo ponteiro guarda apenas os endereos de
memria das variveis e no os dados armazenados por elas.
O programa descrito no Cdigo 7 demonstra a utilizao do operador de endereamento.
Voc pode observar neste exemplo que o endereo de memria da varivel idade o mesmo
endereo apontado pela varivel pIdade.
cdigo 7
1 /*
2 * Programa para demonstrar a utilizao
3 * de Ponteiros
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 int idade;
13 int *pIdade;
14
15 idade = 22;
16 pIdade = &idade;
17
18 printf(Endereco da variavel idade: %u \n, &idade);
19 printf(Endereco apontado pela variavel pIdade: %u \n, pIdade);
20
21 return 0;
22 }
fim cdigo 7
Observe que, por meio dos ponteiros, podemos tambm modificar o valor de uma deter-
minada varivel. Para isso, utilizamos o operador indireto representado pelo smbolo asterisco
*. Esse operador pode ser empregado para atribuir um valor a uma varivel apontada por um
ponteiro, sem a necessidade de acessar a varivel diretamente.
O Quadro 1 apresenta resumidamente as principais operaes com ponteiros.
21
22 printf(Informacoes da variavel pIdade \n);
23 printf(--endereco: %u \n, &pIdade);
24 printf(--valor...: %i \n, pIdade);
25 printf(--endereco apontado: %u \n, pIdade);
26 printf(--valor apontado...: %i \n\n, *pIdade);
27
28 return 0;
29 }
fim cdigo 8
fim cdigo 9
U4 Estrutura de Dados e Ponteiros 199
Veja que as variveis do tipo ponteiro tambm podem ser utilizadas com estruturas do
tipo registro. Da mesma forma que ponteiros so criados para tipos comuns como int, char ou
float, tambm possvel criar ponteiros para os registros.
No Cdigo 10, o programa demonstra a utilizao de ponteiros em estrutura do tipo regis-
tro. Note que a definio da estrutura segue os mesmos moldes especificados anteriormente,
de modo que a nica alterao est relacionada declarao da varivel ponteiro (Linha 19).
cdigo 10
1 /*
2 * Programa para demonstrar a utilizao
3 * de Ponteiros
4 *
5 * Autor: Joo da Silva
6 */
7
8 #include <stdio.h>
9
10 int main()
11 {
12 struct tipoaluno{
13 char *nome[20];
14 char *curso[30];
15 int ra;
16 };
17
18 struct tipoaluno aluno;
19 struct tipoaluno *pAluno;
20
21
22 printf(Nome do aluno: );
23 gets(aluno.nome);
24 printf(Curso do aluno: );
25 gets(aluno.curso);
26 printf(RA do aluno: );
27 scanf(%i,&aluno.ra);
28
29 //pAluno aponta para a estrutura aluno
30 pAluno = &aluno;
31
32 /*
33 * exibio das informaes do aluno por meio
34 * do ponteiro pAluno
35 */
36 printf(Informacoes do aluno\n);
37 printf(--Nome.: %s \n, pAluno->nome);
38 printf(--Curso: %s \n, pAluno->curso);
39 printf(--RA...: %i \n\n, pAluno->ra);
40
41 //alterao do nome do curso
42 strcpy(pAluno->curso,Ciencia da Computacao);
43
44 /*
45 * exibio das informaes do aluno por meio
46 * da estrutura registro
47 */
48 printf(Informacoes do aluno\n);
49 printf(--Nome.: %s \n, aluno.nome);
50 printf(--Curso: %s \n, aluno.curso);
51 printf(--RA...: %i \n, aluno.ra);
52
53 return 0;
54 }
fim cdigo 10
Informacoes do aluno
--Nome.: Joao da Silva
--Curso: Sistemas de Informacao
--RA...: 12345
Informacoes do aluno
--Nome.: Joao da Silva
--Curso: Ciencia da Computacao
--RA...: 12345
Voc pode observar uma alterao importante nas linhas 37 a 39, que a utilizao do
operador seta ->. Esse operador empregado no acesso aos campos da estrutura registro, quan-
do trabalhamos com ponteiros. Por exemplo, para atribuirmos o RA 12345 estrutura definida
anteriormente, temos:
U4 Estrutura de Dados e Ponteiros 201
1 pAluno->ra = 54321;
1 (*pAluno).ra = 54321;
9. EXERCCIOS RESOLVIDOS
No deixe de verificar todos os exerccios resolvidos, pois esse um momento importante
para fixar os contedos estudados e retirar as possveis dvidas.
Os exerccios 1, 2 e 3 foram selecionados de contedos preexistente da disciplina Algorit-
mos e Programao, com o intuito de demonstrar como possvel transformar algoritmos em
programas.
1) Elabore um algoritmo para controlar as notas dos alunos de uma escola. Esse algorit-
mo deve receber duas notas de cinco alunos e apresentar na tela as seguintes infor-
maes:
a) mdia de cada aluno;
b) mdia da turma;
c) maior mdia;
d) porcentagem de alunos aprovados (mdia >= 5);
e) porcentagem de alunos reprovados (mdia < 5).
cdigo 11
1 /*
2 * Programa para controlar as notas dos alunos
3 *
4 * Autor: Joo da Silva
5 */
6
7 #include <stdio.h>
8
9 int main()
10 {
11
12 //declarao das variveis
13 float vet_media[5];
14 int i, totalalunos;
15 float nota1,nota2, soma, maior;
16 float aprovados,reprovados;
17
18
19 //leitura das informaes
20 totalalunos = 5;
21 i = 0;
22 while ( i < totalalunos ) {
23 printf(Nota 1a prova: );
24 scanf(%f,¬a1);
25 printf(Nota 2a prova: );
26 scanf(%f,¬a2);
27
28 //calcular mdia
29 vet_media[i] = (nota1+nota2)/2;
30 printf(Media do aluno = %.1f \n, vet_media[i]);
31
32 i++;
33 }
34
35 soma = 0;
36 maior = vet_media[0];
37 aprovados = 0;
38 reprovados = 0;
39
40 for (i=0; i < totalalunos; i++){
41 //soma das mdias
42 soma += vet_media[i];
43
44 if ( vet_media[i] > maior ) {
45 maior = vet_media[i];
46 }
47
48 if ( vet_media[i] >= 5 ) {
49 aprovados++;
50 }else{
51 reprovados++;
52 }
53 }
54
55 printf(Media da turma: %.1f \n, (soma/totalalunos) );
56 printf(Maior media: %.1f \n, maior);
57 printf(Aprovados: %.1f%% \n, ((float)(aprovados/totalalunos)*100));
58 printf(Reprovados: %.1f%% \n, ((float)(reprovados/totalalunos)*100));
59
60
61 return 0;
62 }
fim cdigo 11
U4 Estrutura de Dados e Ponteiros 203
Nota 1a prova: 8
Nota 2a prova: 1
Mdia do aluno = 4.5
Nota 1a prova: 5
Nota 2a prova: 3
Mdia do aluno = 4
69
70 case 2: //alterar produtos j cadastrados
71
72 printf( \n Codigo do produto para alteracao: );
73 scanf(%i,&codigo);
74
75 // verificar se o produto j foi cadastrado
76 achou = 0;
77 i = 0;
78 while ((i<total_produtos) && (achou==0)){
79
80 if (produtos[i].codigo==codigo) {
81 achou = 1;
82 //guardar a posio do produto
83 posicao = i;
84 }
85
86 i++;
87 }
88
89 if (achou != 0) {
90 printf(\n Alteracao do produto\n);
91 printf(Codigo : );
92 scanf(%i,&produtos[posicao].codigo );
93 fflush(stdin);
94 printf(Descricao: );
95 gets( produtos[posicao].descricao );
96 printf(Valor Unitario: );
97 scanf(%f,&produtos[posicao].vlunit );
98 printf(Quantidade: );
99 scanf(%i,&produtos[posicao].qtde );
100
101 printf(\nProduto alterado com sucesso!\n);
102
103 }else{
104 printf(\nProduto no encontrado.\n);
105 }
106 break;
107
108 case 3: //exibir todos os produtos
109
110 printf(Relatorio dos Produtos \n);
111 printf(Codigo----Descricao---------Vl Unit.--Qtde\n);
112 for (i = 0; i < cont_produtos; i++){
113 printf(%-10i, produtos[i].codigo);
114 printf(%-18s, produtos[i].descricao);
115 printf(%8.2f, produtos[i].vlunit);
116 printf(%6i\n, produtos[i].qtde);
117 }
118 break;
fim cdigo 12
---------Menu de Opcoes---------
[1] Cadastrar
[2] Alterar
[3] Exibir Todos
[4] Exibir Estoque Baixo
[5] Sair
1
Codigo: 123
Descricao: Computador Core 2 Duo
Valor Unitario: 1350.00
Quantidade: 5
---------Menu de Opcoes---------
[1] Cadastrar
[2] Alterar
[3] Exibir Todos
[4] Exibir Estoque Baixo
[5] Sair
5
Programa finalizado
cdigo 13
1 /*
2 * Programa inicializar os elementos de um vetor
3 * utilizando ponteiros
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 /*
12 * FUNO PRINCIPAL
13 */
14 int main()
15 {
16 int v[5];
17 int i;
18 int *p;
19
20 //exibir vetor
21 for ( i = 0; i < 5; i++){
22 printf(Posicao %i = %i \n,i,v[i]);
23 }
24
25 //inicializar vetor
26 p = &v; // ponteiro para primeira posio do vetor (0)
27
28 for ( i = 0; i < 5; i++){
29
30 // atribuir zero posio atual do vetor e incrementar
31 // o ndice
32 *p++ = 0;
33
34 }
35
36 //exibir vetor
37 for ( i = 0; i < 5; i++){
38 printf(Posicao %i = %i \n,i,v[i]);
39 }
40
41 return 0;
42 }
fim cdigo 13
Posicao 0 = 0
Posicao 1 = 0
Posicao 2 = 0
Posicao 3 = 0
Posicao 4 = 0
31 //declaracao da matriz
32 int matriz[NUM_LINHAS][NUM_COLUNAS];
33 int linha;
34 int coluna;
35 int numero_valido;
36
37 //
38 // MENU PRINCIPAL
39 //
40 system(cls); //limpar as informacoes da tela
41 printf(%c,218);
42 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
43 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
44 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
45 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
46 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
47 printf(%c\n,191);
48 printf(%c >>> %-39s %c \n,179,titulo_do_programa,179);
49 printf(%c,192);
50 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
51 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
52 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
53 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
54 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
55 printf(%c\n\n,217);
56
57 for (linha = 0; linha < NUM_LINHAS; linha++){
58 for ( coluna = 0; coluna < NUM_COLUNAS; coluna++){
59 matriz[linha][coluna] = linha*coluna;
60 }
61 }
62
63 printf(>>>LEITURA dos dados da matriz\n\n);
64 for (linha = 0; linha < NUM_LINHAS; linha++){
65 for ( coluna = 0; coluna < NUM_COLUNAS; coluna++){
66
67 do{
68 printf(Informe o valor da linha %i e coluna %i: ,linha,coluna);
69 scanf(%i,&matriz[linha][coluna]);
70
71 // garantir que os valores sejam validos e estejam dentro do
72 // intervalo desejado
73 if ( matriz[linha][coluna] >= 0 && matriz[linha][coluna] < 100 ){
74 numero_valido = 1;
75 }else{
76 numero_valido = 0;
77 printf( ***valor informado eh invalido!\n);
78 }
79 }while( numero_valido = 0 );
80
81
82 }
83 }
84
85 printf(\n\n);
86 printf(>>>APRESENTACAO dos dados da matriz\n\n);
87 printf(\t %c,218);
88 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,194,196,196,196,196,196);
89 printf(%c%c%c%c%c%c%c%c%c%c,194,196,196,196,196,194,196,196,196,196,196);
90 printf(%c\n,191);
91 for (linha = 0; linha < NUM_LINHAS; linha++){
printf(Linha %i %c %02i %c %02i %c %02i %c %02i %c\n,linha, 179,matriz[linha]
[0],179,
92
matriz[linha][1],179,matriz[linha][2],179,
matriz[linha][3],179);
93
94 if ( linha < NUM_LINHAS-1 ){
95 printf(\t %c,195);
96 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,197,196,196,196,196,196);
printf(%c%c%c%c%c%c%c%c%c%c,197,196,196,196,
97
196,197,196,196,196,196,196);
98 printf(%c\n,180);
99 }else{
100 printf(\t %c,192);
101 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,193,196,196,196,196,196);
printf(%c%c%c%c%c%c%c%c%c%c,193,196,196,196,
102
196,193,196,196,196,196,196);
103 printf(%c\n,217);
104 }
105 }
106
107 printf(\n\n\n\n); //pular linha
108 return 0; // fim da aplicao
109 }
fim cdigo 14
5) Altere o algoritmo anterior (Cdigo 14) de maneira que os dados da matriz sejam
preenchidos com valores aleatrios. Em seguida, apresente essas informaes na tela.
cdigo 15
1 /*-------------------------------------------------
2 *
3 * Exemplo de uma aplicao capaz de ler um conjunto de dados e
4 * armazena-los em uma matriz.
5 *
6 * Autor: Joo da Silva
7 *
8 *-----------------------------------------------*/
9
10 /*-------------------------------------------------
11 * BIBLIOTECAS
12 *-----------------------------------------------*/
13 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
14 #include <stdlib.h> //para utilizao da instruo system
15 #include <iostream.h> //para utilizao da funo time dos numeros aleatorios
16
17 /*-------------------------------------------------
18 * CONSTANTES
19 *-----------------------------------------------*/
20 #define NUM_LINHAS 5
21 #define NUM_COLUNAS 4
22
23
24 /*------------------------------------------------*
25 * PROGRAMA PRINCIPAL
26 *-----------------------------------------------*/
27 int main()
28 {
29 // declarao das variveis globais
30 char titulo_do_programa[30] = MANIPULACAO DE MATRIZES;
31
32 //declaracao da matriz
33 int matriz[NUM_LINHAS][NUM_COLUNAS];
34 int linha;
35 int coluna;
36 int numero_valido;
37
38 //
39 // MENU PRINCIPAL
40 //
41 system(cls); //limpar as informacoes da tela
42 printf(%c,218);
43 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
44 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
45 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
46 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
47 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
48 printf(%c\n,191);
49 printf(%c >>> %-39s %c \n,179,titulo_do_programa,179);
50 printf(%c,192);
51 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
52 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
53 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
54 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
55 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
56 printf(%c\n\n,217);
57
58 for (linha = 0; linha < NUM_LINHAS; linha++){
59 for ( coluna = 0; coluna < NUM_COLUNAS; coluna++){
60 matriz[linha][coluna] = linha*coluna;
61 }
62 }
63
64 //inicializar o gerador de numeros randomicos
65 srand(time(NULL));
66
67 printf(>>>LEITURA dos dados da matriz (aleatorios)\n\n);
68 for (linha = 0; linha < NUM_LINHAS; linha++){
69 for ( coluna = 0; coluna < NUM_COLUNAS; coluna++){
70
71 do{
72
73 //
74 // GERACAO DE NUMEROS ALEATORIOS
75 //
U4 Estrutura de Dados e Ponteiros 213
76 //
77
78 // gera um nmero aleatrio entre 0 e
79 // 99 (inclusive)
80 int valor_aleatorio = rand() % 99 ;
81
printf(Informe o valor da linha %i e coluna %i:
82
%i\n,linha,coluna,valor_aleatorio);
83 matriz[linha][coluna] = valor_aleatorio;
84
85 // garantir que os valores sejam validos e estejam dentro do
86 // intervalo desejado
87 if ( matriz[linha][coluna] >= 0 && matriz[linha][coluna] < 100 ){
88 numero_valido = 1;
89 }else{
90 numero_valido = 0;
91 printf( ***valor informado eh invalido!\n);
92 }
93 }while( numero_valido = 0 );
94
95
96 }
97 }
98
99 printf(\n\n);
100 printf(>>>APRESENTACAO dos dados da matriz\n\n);
101 printf(\t %c,218);
102 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,194,196,196,196,196,196);
printf(%c%c%c%c%c%c%c%c%c%c,194,196,196,196,
103
196,194,196,196,196,196,196);
104 printf(%c\n,191);
105 for (linha = 0; linha < NUM_LINHAS; linha++){
printf(Linha %i %c %02i %c %02i %c %02i %c %02i %c\n,linha, 179,matriz[linha]
106 [0],179,
matriz[linha][1],179,matriz[linha][2],179,matriz[linha][3],179);
107
108 if ( linha < NUM_LINHAS-1 ){
109 printf(\t %c,195);
110 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,197,196,196,196,196,196);
printf(%c%c%c%c%c%c%c%c%c%c,197,196,196,196,
111
196,197,196,196,196,196,196);
112 printf(%c\n,180);
113 }else{
114 printf(\t %c,192);
115 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,193,196,196,196,196,196);
printf(%c%c%c%c%c%c%c%c%c%c,193,196,196,196,
116
196,193,196,196,196,196,196);
117 printf(%c\n,217);
118 }
119 }
120
121 printf(\n\n\n\n); //pular linha
122 return 0; // fim da aplicao
123 }
fim cdigo 15
6) Elabore um algoritmo que contenha uma matriz de 10x4 elementos. O usurio dever
informar qual valor ele deseja armazenar na matriz, que deve ser do tipo inteiro, bem
como a posio em que esse valor dever ser armazenado. Para garantir o correto fun-
cionamento do algoritmo, voc dever verificar se a posio informada pelo usurio
valida. Crie um menu para facilitar a utilizao da aplicao que tenha duas opes:
(i) adicionar elemento e (ii) listar elementos. Alm disso, uma opo deve ser utilizada
para finalizar a aplicao.
cdigo 16
1 /*-------------------------------------------------
2 *
U4 Estrutura de Dados e Ponteiros 215
53 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
54 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
55 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
56 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
57 printf(%c\n,191);
58 printf(%c >>> %-39s %c \n,179,titulo_do_programa,179);
59 printf(%c,192);
60 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
61 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
62 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
63 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
64 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
65 printf(%c\n\n,217);
66
67 printf(\t[1] ADICIONAR ELEMENTO NA MATRIZ \n);
68 printf(\t[2] LISTAR ELEMENTOS \n);
69 printf(\t[0] SAIR DA APLICACAO \n);
70 fflush(stdin);
71 printf(\n\n);
72 printf(\tSelecione a opcao desejada: );
73 scanf(%i,&opcao_desejada);
74
75
76 if ( opcao_desejada == 1 ){
77
78 do{
79 system(cls); //limpar as informacoes da tela
80 printf(\n\n%c%c%c%c>> ADICIONAR ELEMENTO NA MATRIZ \n,195,196,196,196);
81 printf(%c\n,179);
82 printf(%c\n,179);
83 printf(%c%c%c%c%c%cInforme a linha...: ,195,196,196,194,196,196);
84 scanf(%i,&linha);
85 printf(%c%c%c%c%c%cInforme a coluna..: ,195,196,196,197,196,196);
86 scanf(%i,&coluna);
87
88 if ( !( linha >=0 && linha < NUM_LINHAS ) ) {
89 fflush(stdin);
90 printf(\n\n);
91 printf(>>>>ERRO: A linha informada nao eh valida!\n);
92 printf(\n\n);
93 getchar();
94 }else{
95 if ( !(coluna >=0 && coluna < NUM_COLUNAS) ) {
96 fflush(stdin);
97 printf(\n\n);
98 printf(>>>>ERRO: A coluna informada nao eh valido!\n);
99 printf(\n\n);
100 getchar();
101 }else{
102 fflush(stdin);
U4 Estrutura de Dados e Ponteiros 217
printf(%c%c%c%c%c%cInforme o elemento:
103
,192,196,196,193,196,196);
104 scanf(%i,&matriz[linha][coluna]);
105 }
106 }
107
}while ( !( linha >=0 && linha < NUM_LINHAS ) || !(coluna >=0 && coluna <
108
NUM_COLUNAS) );
109
110 fflush(stdin);
111 printf(\n\n);
112 printf(>>>>INFO: OPERACAO realizada com com SUCESSO!\n);
113 printf(\n\n);
114 getchar();
115
116 }else if ( opcao_desejada == 2 ){
117 system(cls); //limpar as informacoes da tela
118 printf(\n\n%c%c%c%c>> LISTAR ELEMENTOS DA MATRIZ \n,192,196,196,196);
119
120 printf(%c,218);
printf(%c%c%c%c%c%c%c%c%c%
121
cc,196,196,196,196,196,196,194,196,196,196,196,196);
printf(%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c,196,
122
196,194,196,196,196,196,196,196,194,196,196,196,196,196,196,196);
123 printf(%c\n,191);
124 for (linha = 0; linha < NUM_LINHAS; linha++){
125 printf(%c %04i %c %04i %c %04i %c %04i %c\n,179,matriz[linha][0],
179,matriz[linha][1], 179,matriz[linha][2], 179,matriz[linha]
126
[3],179);
127 if ( linha < NUM_LINHAS-1 ){
128 printf(%c,195);
printf(%c%c%c%c%c%c%c%c%c%c
129
%c,196,196,196,196,196,196,197,196,196,196,196,196,196,196);
printf(%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c,196,
130
196,197,196,196,196,196,196,196,197,196,196,196,196,196);
131 printf(%c\n,180);
132 }else{
133 printf(%c,192);
printf(%c%c%c%c%c%c%c%c%c%c
134
%c,196,196,196,196,196,196,193,196,196,196,196,196,196,196);
printf(%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c,196,
135
196,193,196,196,196,196,196,196,193,196,196,196,196,196);
136 printf(%c\n,217);
137 }
138 }
139
140 fflush(stdin);
141 printf(\n\n);
142 printf(>>>>INFO: OPERACAO realizada com com SUCESSO!\n);
143 printf(\n\n);
144 getchar();
145
146 }
147 }while(opcao_desejada != 0);
148
fim cdigo 16
7) Escreva um algoritmo que receba duas matrizes de 3x3 elementos, some os valores
dessas matrizes e armazene em uma terceira matriz. Ao final, apresente os resultados
na tela.
cdigo 17
1 /*-------------------------------------------------
2 *
3 * Exemplo de uma aplicao capaz de ler duas matrizes de 3x3,
4 * realizar a soma entre elas e apresentar os resultados na tela.
5 *
6 * Autor: Joo da Silva
7 *
8 *-----------------------------------------------*/
9
10 /*-------------------------------------------------
11 * BIBLIOTECAS
12 *-----------------------------------------------*/
13 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
14 #include <stdlib.h> //para utilizao da instruo system
15
16 /*-------------------------------------------------
17 * CONSTANTES
18 *-----------------------------------------------*/
19 #define NUM_LINHAS 3
20 #define NUM_COLUNAS 3
21
22
23 /*------------------------------------------------*
24 * PROGRAMA PRINCIPAL
25 *-----------------------------------------------*/
26 int main()
27 {
28 // declarao das variveis globais
29 char titulo_do_programa[40] = SOMA DE MATRIZES;
30
31 //declaracao da matriz
32 int matrizA[NUM_LINHAS][NUM_COLUNAS];
33 int matrizB[NUM_LINHAS][NUM_COLUNAS];
34 int matrizC[NUM_LINHAS][NUM_COLUNAS];
35 int linha;
36 int coluna;
37
38 int opcao_desejada;
39
40 //INICIALIZAR MATRIZES COM ZERO
41 for (linha = 0; linha < NUM_LINHAS; linha++){
42 for ( coluna = 0; coluna < NUM_COLUNAS; coluna++){
43 matrizA[linha][coluna] = 0;
44 matrizB[linha][coluna] = 0;
45 matrizC[linha][coluna] = 0;
46 }
47 }
48
49 //
50 // MENU PRINCIPAL
51 //
52 do{
53 system(cls); //limpar as informacoes da tela
54 printf(%c,218);
55 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
56 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
57 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
58 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
59 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
60 printf(%c\n,191);
61 printf(%c >>> %-39s %c \n,179,titulo_do_programa,179);
62 printf(%c,192);
63 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
64 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
65 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
66 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
67 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
68 printf(%c\n\n,217);
69
70 printf(\t[1] LEITURA DA MATRIZ A \n);
71 printf(\t[2] LEITURA DA MATRIZ B \n);
72 printf(\t[3] SOMA DAS MATRIZES (A+B) \n);
73 printf(\t[0] SAIR DA APLICACAO \n);
74 fflush(stdin);
75 printf(\n\n);
U4 Estrutura de Dados e Ponteiros 221
fim cdigo 17
U4 Estrutura de Dados e Ponteiros 223
O sistema dever ser capaz de armazenar at cem pacientes e todas as informaes de-
vem ser armazenadas em uma estrutura do tipo registro.
cdigo 18
1 /*-------------------------------------------------
2 *
3 * Exemplo de uma aplicao capaz controlar os pacientes de um
4 * consultrio odontolgico
5 *
6 * Autor: Joo da Silva
7 *
8 *-----------------------------------------------*/
9
10 /*-------------------------------------------------
11 * BIBLIOTECAS
12 *-----------------------------------------------*/
13 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
14 #include <stdlib.h> //para utilizao da instruo system
15 #include <string.h> //para manipulao de strings
16
17 /*-------------------------------------------------
18 * CONSTANTES
19 *-----------------------------------------------*/
20 #define TOTAL_PACIENTES 5
21
22 /*-------------------------------------------------
23 * ESTRUTURA DO TIPO REGISTRO
24 *-----------------------------------------------*/
25 struct tipo_data{
26 int dia;
27 int mes;
28 int ano;
29 };
30
31 struct tipo_paciente{
32 int codigo;
33 char nome[60];
34 char endereco[80];
35 struct tipo_data data;
36 char telefone[14];
37 int ativo; // 0 = inativo e 1 = ativo;
38 };
39
40
41
42 /*------------------------------------------------*
43 * PROGRAMA PRINCIPAL
44 *-----------------------------------------------*/
45 int main()
46 {
147
148 fflush(stdin);
149 printf( %c Nome..............: ,219);
150 gets(pacientes[paciente_atual].nome);
151
152 fflush(stdin);
153 printf( %c Endereco..........: ,219);
154 gets(pacientes[paciente_atual].endereco);
155
156 fflush(stdin);
157 printf( %c Data de Nascimento: \n,219);
printf( %c ...........Dia: ,219);
158
scanf(%i,&pacientes[paciente_atual].data.dia);
printf( %c ...........Mes: ,219);
159
scanf(%i,&pacientes[paciente_atual].data.mes);
printf( %c ...........Ano: ,219);
160
scanf(%i,&pacientes[paciente_atual].data.ano);
161
162 fflush(stdin);
163 printf( %c Telefone..........: ,219);
164 gets(pacientes[paciente_atual].telefone);
165
166 //DETERMINAR STATUS DO PACIENTE
167 pacientes[paciente_atual].ativo = 1;
168
169
170 //INCREMENTAR TOTAL DE PACIENTE
171 paciente_atual++;
172
173 fflush(stdin);
174 printf(\n\n);
175 printf(>>>>INFO: OPERACAO realizada com com SUCESSO!\n);
176 printf(\n\n);
177 getchar();
178
179 }else{
180 fflush(stdin);
181 printf(\n\n);
printf(>>>>ERRO: O total de %i pacientes jah foi atingido\n, TOTAL_
182
PACIENTES);
183 printf(\n\n);
184 getchar();
185 }
186
187
188
189 }else if ( opcao_desejada == 2 ){
190
191 system(cls); //limpar as informacoes da tela
192 printf(%c,218);
193 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
194 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
U4 Estrutura de Dados e Ponteiros 229
195 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
196 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
197 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
198 printf(%c\n,191);
199 printf(%c %c%c %-40s %c \n,179,175,175,titulo_do_programa,179);
200 printf(%c,192);
201 printf(%c%c%c%c%c%c%c%c%c,196,196,196,194,196,196,196,196,196,196);
202 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
203 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
204 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
205 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
206 printf(%c\n,217);
207 printf( %c\n,179);
208 printf( %c%c%c%c>>> ALTERAR DADOS CADASTRAIS\n,192,196,196,196,175);
209 printf(\n\n);
210
211
212 printf( %c Informe o codigo do paciente: ,219);
213 scanf(%i,&codigo_paciente_pesquisar);
214
215 //PESQUISAR SE O PACIENTE EXISTE NO SISTEMA
216 paciente_encontrado = false;
217 posicao = 0;
218 while ( paciente_encontrado == false && posicao < TOTAL_PACIENTES ){
219 if ( pacientes[posicao].codigo == codigo_paciente_pesquisar ){
220 paciente_encontrado = true;
221 }else{
222 posicao++;
223 }
224 }
225
226 if ( paciente_encontrado == true ){
227
228 printf(\n);
229 printf( %c INFORME OS NOVOS DADOS DO PACIENTE \n,219);
230 printf( %c Codigo............: ,219);
231 scanf(%i,&pacientes[posicao].codigo);
232
233 fflush(stdin);
234 printf( %c Nome..............: ,219);
235 gets(pacientes[posicao].nome);
236
237 fflush(stdin);
238 printf( %c Endereco..........: ,219);
239 gets(pacientes[posicao].endereco);
240
241 fflush(stdin);
242 printf( %c Data de Nascimento: \n,219);
printf( %c ...........Dia: ,219);
243
scanf(%i,&pacientes[posicao].data.dia);
292 scanf(%i,&codigo_paciente_pesquisar);
293
294 //PESQUISAR SE O PACIENTE EXISTE NO SISTEMA
295 paciente_encontrado = false;
296 posicao = 0;
297 while ( paciente_encontrado == false && posicao < TOTAL_PACIENTES ){
298 if ( pacientes[posicao].codigo == codigo_paciente_pesquisar ){
299 paciente_encontrado = true;
300 }else{
301 posicao++;
302 }
303 }
304
305 if ( paciente_encontrado == true ){
306 printf(\n);
printf( %c INFORME O NOVO STATUS DO PACIENTE....: [1] ATIVO
307
\n,219);
308 printf( %c .................: [2] INATIVO \n,219);
309 printf( %c ......Selecione o status desejado: ,219);
310 scanf(%i,&paciente_status);
311
312 if ( paciente_status == 2){
313 paciente_status = 0; // inativo
314 }
315
316 pacientes[posicao].ativo = paciente_status;
317
318 fflush(stdin);
319 printf(\n\n);
320 printf(>>>>INFO: OPERACAO realizada com com SUCESSO!\n);
321 printf(\n\n);
322 getchar();
323
324 }else{
325 fflush(stdin);
326 printf(\n\n);
printf(>>>>INFO: O paciente com o codigo informado NAO foi
327
encontrado.\n);
328 printf(\n\n);
329 getchar();
330 }
331 }else if ( opcao_desejada == 4 ){
332
333 system(cls); //limpar as informacoes da tela
334 printf(%c,218);
335 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
336 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
337 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
338 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
339 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
340 printf(%c\n,191);
477
478 }else if ( opcao_desejada == 6 ){
479
480 system(cls); //limpar as informacoes da tela
481 printf(%c,218);
482 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
483 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
484 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
485 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
486 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
487 printf(%c\n,191);
488 printf(%c %c%c %-40s %c \n,179,175,175,titulo_do_programa,179);
489 printf(%c,192);
490 printf(%c%c%c%c%c%c%c%c%c,196,196,196,194,196,196,196,196,196,196);
491 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
492 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
493 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
494 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
495 printf(%c\n,217);
496 printf( %c\n,179);
printf( %c%c%c%c>>> RELATORIO DE PACIENTES POR CODIGO
497
\n,192,196,196,196,175);
498 printf(\n\n);
499
500
501 //
502 // ORDENACAO DOS PACIENTES UTILIZANDO O METODO POR SELECAO
503 //
504 // Informao
505 // O selection sort (do ingls, ordenao por seleo) um
506 // algoritmo de ordenao baseado em se passar sempre o menor
507 // valor do vetor para a primeira posio (ou o maior dependendo
508 // da ordem requerida), depois o de segundo menor valor para a
509 // segunda posio, e assim feito sucessivamente com os (n-1)
510 // elementos restantes, at os ltimos dois elementos.
511 //
512 // Fonte: http://pt.wikipedia.org/wiki/Selection_sort
513
514 int i, j, min;
515 struct tipo_paciente tmp[TOTAL_PACIENTES];
516 struct tipo_paciente aux;
517
518 //COPIAR PACIENTES PARA UMA ESTRUTURA TEMPORARIA
519 for( posicao = 0; posicao < TOTAL_PACIENTES; posicao++){
520 tmp[posicao] = pacientes[posicao];
521 }
522
523 for ( i = 0; i < TOTAL_PACIENTES; i++){
524 min = i;
525 for ( j = i+1; j < TOTAL_PACIENTES; j++){
526 if ( tmp[j].codigo < tmp[min].codigo ){
527 min = j;
528 }
529 }
530 if ( i != min ){
531 // TROCAR
532 aux = tmp[i];
533 tmp[i] = tmp[min];
534 tmp[min] = aux;
535 }
536 }
537
538 //EXIBIR DADOS NA TELA
539 for ( posicao = 0; posicao < TOTAL_PACIENTES; posicao++){
540
541 if ( tmp[posicao].codigo != -1 ){
542 printf( %c Codigo............: %i \n,219, tmp[posicao].codigo);
543 printf( %c Nome..............: %s \n,219, tmp[posicao].nome);
printf( %c Endereco..........: %s \n,219, tmp[posicao].
544
endereco);
545 printf( %c Data de Nascimento: \n,219);
printf( %c ...........Dia: %i \n,219, tmp[posicao].data.
546
dia);
printf( %c ...........Mes: %i \n,219, tmp[posicao].data.
547
mes);
printf( %c ...........Ano: %i \n,219, tmp[posicao].data.
548
ano);
printf( %c Telefone..........: %s \n,219, tmp[posicao].
549
telefone);
550
551 if ( tmp[posicao].ativo == 1 ){
552 printf( %c Status............: %s \n\n,219, ATIVO);
553 }else{
554 printf( %c Status............: %s \n\n,219, INATIVO);
555 }
556 }
557
558 }
559
560 fflush(stdin);
561 printf(\n\n);
562 printf(>>>>INFO: OPERACAO realizada com com SUCESSO!\n);
563 printf(\n\n);
564 getchar();
565
566
567 }else if ( opcao_desejada == 7 ){
568
569 system(cls); //limpar as informacoes da tela
570 printf(%c,218);
571 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
572 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
573 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
U4 Estrutura de Dados e Ponteiros 237
574 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
575 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
576 printf(%c\n,191);
577 printf(%c %c%c %-40s %c \n,179,175,175,titulo_do_programa,179);
578 printf(%c,192);
579 printf(%c%c%c%c%c%c%c%c%c,196,196,196,194,196,196,196,196,196,196);
580 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
581 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
582 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
583 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
584 printf(%c\n,217);
585 printf( %c\n,179);
printf( %c%c%c%c>>> RELATORIO DE PACIENTES POR NOME
586
\n,192,196,196,196,175);
587 printf(\n\n);
588
589
590 //
591 // ORDENACAO DOS PACIENTES UTILIZANDO O METODO POR SELECAO
592 //
593 int i, j, min;
594 struct tipo_paciente tmp[TOTAL_PACIENTES];
595 struct tipo_paciente aux;
596
597 //COPIAR PACIENTES PARA UMA ESTRUTURA TEMPORARIA
598 for( posicao = 0; posicao < TOTAL_PACIENTES; posicao++){
599 tmp[posicao] = pacientes[posicao];
600 }
601
602 for ( i = 0; i < TOTAL_PACIENTES; i++){
603 min = i;
604 for ( j = i+1; j < TOTAL_PACIENTES; j++){
605 if ( strcmpi(tmp[min].nome,tmp[j].nome) > 0 ){
606 min = j;
607 }
608 }
609 if ( i != min ){
610 // TROCAR
611 aux = tmp[i];
612 tmp[i] = tmp[min];
613 tmp[min] = aux;
614 }
615 }
616
617 //EXIBIR DADOS NA TELA
618 for ( posicao = 0; posicao < TOTAL_PACIENTES; posicao++){
619
620 if ( tmp[posicao].codigo != -1 ){
621 printf( %c Codigo............: %i \n,219, tmp[posicao].codigo);
622 printf( %c Nome..............: %s \n,219, tmp[posicao].nome);
fim cdigo 18
cdigo 19
1 /*-------------------------------------------------
2 * >>> IMPORTANTE
3 * Este exercicio foi implementado com PONTEIROS, cujo objetivo
4 * principal gerenciar adequadamente a quantidade de memria
5 * utilizada pela aplicao.
6 *
7 *-----------------------------------------------*/
8
9 /*-------------------------------------------------
10 *
11 * Exemplo de uma aplicao capaz de controlar informacoes a
12 * respeito dos pacientes de um consultorio odontologico.
13 *
14 * Autor: Joo da Silva
15 *
16 *-----------------------------------------------*/
17
18 /*-------------------------------------------------
19 * BIBLIOTECAS
20 *-----------------------------------------------*/
21 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
22 #include <stdlib.h> //para utilizao da instruo system
23 #include <string.h> //para manipulacao de strings
24
25 /*-------------------------------------------------
26 * ESTRUTURA DO TIPO REGISTRO
27 *-----------------------------------------------*/
28 struct tipo_data{
29 int dia;
30 int mes;
31 int ano;
32 };
33
34 struct tipo_paciente{
35 int codigo;
36 char nome[60];
37 char endereco[80];
38 struct tipo_data data;
39 char telefone[14];
40 int ativo; // 0 = inativo e 1 = ativo;
41
42 // ponteiro para o prximo paciente
43 struct tipo_paciente *proximo;
44 };
45
46 struct conjunto_pacientes{
47 struct tipo_paciente *inicio;
48 struct tipo_paciente *fim;
49 int total_pacientes;
50 };
51
52
53
54 /*------------------------------------------------*
55 * PROGRAMA PRINCIPAL
56 *-----------------------------------------------*/
57 int main()
58 {
59 // declarao das variveis globais
60 char titulo_do_programa[40] = CONSULTORIO ODONTOLOGICO;
61
62 //declaracao da estrutura de ponteiros que armazenar
63 //os pacientes
64 struct conjunto_pacientes pacientes;
65
66 //declaracao de uma estrutura temporria que ser utilizada
67 //em diversas operaes ao longo da aplicao
68 struct tipo_paciente *aux;
69
70 // int paciente_atual;
71
72 //variveis auxiliares
73 int codigo_paciente_pesquisar;
74 char nome_paciente_pesquisar[60];
75 int posicao;
76 int paciente_status;
77 bool paciente_encontrado = false;
78
79 int opcao_desejada;
80
81 //INICIALIZAR ESTRUTURA DE PONTEIROS
82 pacientes.inicio = NULL;
83 pacientes.fim = NULL;
84 pacientes.total_pacientes = 0;
85
86 //
87 // MENU PRINCIPAL
88 //
89 do{
90 system(cls); //limpar as informacoes da tela
91 printf(%c,218);
92 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
93 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
94 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
95 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
96 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
97 printf(%c\n,191);
98 printf(%c %c%c %-40s %c \n,179,175,175,titulo_do_programa,179);
99 printf(%c,195);
U4 Estrutura de Dados e Ponteiros 243
100 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
101 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
102 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
103 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
104 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
105 printf(%c\n,180);
106 printf(%c %c%c %-40s %c \n,179,175,175,MENU PRINCIPAL,179);
107 printf(%c %-43s %c \n,179, ,179);
108 printf(%c %-40s %c \n,179, [1] CADASTRAR NOVO PACIENTE ,179);
109 printf(%c %-40s %c \n,179, [2] ALTERAR DADOS CADASTRAIS ,179);
110 printf(%c %-40s %c \n,179, [3] ALTERAR STATUS DO PACIENTE ,179);
111 printf(%c %-40s %c \n,179, [4] PESQUISAR PACIENTE POR CODIGO ,179);
112 printf(%c %-40s %c \n,179, [5] PESQUISAR PACIENTE POR NOME ,179);
113 printf(%c %-40s %c \n,179, [6] RELATORIO DE PACIENTES POR CODIGO ,179);
114 printf(%c %-40s %c \n,179, [7] RELATORIO DE PACIENTES POR NOME ,179);
115 printf(%c %-43s %c \n,179, ,179);
116 printf(%c %-40s %c \n,179, [0] SAIR DA APLICACAO ,179);
117 printf(%c,192);
118 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
119 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
120 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
121 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
122 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
123 printf(%c\n,217);
124
125 fflush(stdin);
126 printf(\n\n);
127 printf( %s ,Selecione a opcao desejada: );
128 scanf(%i,&opcao_desejada);
129
130
131 if ( opcao_desejada == 1 ){
132
133 system(cls); //limpar as informacoes da tela
134 printf(%c,218);
135 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
136 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
137 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
138 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
139 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
140 printf(%c\n,191);
141 printf(%c %c%c %-40s %c \n,179,175,175,titulo_do_programa,179);
142 printf(%c,192);
143 printf(%c%c%c%c%c%c%c%c%c,196,196,196,194,196,196,196,196,196,196);
144 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
145 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
146 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
147 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
148 printf(%c\n,217);
149 printf( %c\n,179);
250
251 printf(\n);
252 printf( %c INFORME OS NOVOS DADOS DO PACIENTE \n,219);
253 printf( %c Codigo............: ,219);
254 scanf(%i,&aux->codigo);
255
256 fflush(stdin);
257 printf( %c Nome..............: ,219);
258 gets(aux->nome);
259
260 fflush(stdin);
261 printf( %c Endereco..........: ,219);
262 gets(aux->endereco);
263
264 fflush(stdin);
265 printf( %c Data de Nascimento: \n,219);
266 printf( %c ...........Dia: ,219); scanf(%i,&aux->data.dia);
267 printf( %c ...........Mes: ,219); scanf(%i,&aux->data.mes);
268 printf( %c ...........Ano: ,219); scanf(%i,&aux->data.ano);
269
270 fflush(stdin);
271 printf( %c Telefone..........: ,219);
272 gets(aux->telefone);
273
274 //DETERMINAR STATUS DO PACIENTE
275 aux->ativo = 1;
276
277 fflush(stdin);
278 printf(\n\n);
279 printf(>>>>INFO: OPERACAO realizada com com SUCESSO!\n);
280 printf(\n\n);
281 getchar();
282
283 }else{
284 fflush(stdin);
285 printf(\n\n);
printf(>>>>INFO: O paciente com o codigo informado NAO foi
286
encontrado.\n);
287 printf(\n\n);
288 getchar();
289 }
290 }else if ( opcao_desejada == 3 ){
291
292 system(cls); //limpar as informacoes da tela
293 printf(%c,218);
294 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
295 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
296 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
297 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
298 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
299 printf(%c\n,191);
U4 Estrutura de Dados e Ponteiros 247
350 printf(\n\n);
printf(>>>>INFO: O paciente com o codigo informado NAO foi
351
encontrado.\n);
352 printf(\n\n);
353 getchar();
354 }
355 }else if ( opcao_desejada == 4 ){
356
357 system(cls); //limpar as informacoes da tela
358 printf(%c,218);
359 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
360 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
361 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
362 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
363 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
364 printf(%c\n,191);
365 printf(%c %c%c %-40s %c \n,179,175,175,titulo_do_programa,179);
366 printf(%c,192);
367 printf(%c%c%c%c%c%c%c%c%c,196,196,196,194,196,196,196,196,196,196);
368 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
369 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
370 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
371 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
372 printf(%c\n,217);
373 printf( %c\n,179);
printf( %c%c%c%c>>> PESQUISAR PACIENTE POR CODIGO
374
\n,192,196,196,196,175);
375 printf(\n\n);
376
377
378 printf( %c Informe o codigo do paciente: ,219);
379 scanf(%i,&codigo_paciente_pesquisar);
380
381 //PESQUISAR SE O PACIENTE EXISTE NO SISTEMA
382 paciente_encontrado = false;
383 struct tipo_paciente *aux;
384 aux = pacientes.inicio;
385 while ( paciente_encontrado == false && aux != NULL ){
386 if ( aux->codigo == codigo_paciente_pesquisar ){
387 paciente_encontrado = true;
388 }else{
389 aux = aux->proximo;
390 }
391 }
392
393 if ( paciente_encontrado == true ){
394
395 printf(\n);
396 printf( %c Codigo............: %i \n,219, aux->codigo);
397 printf( %c Nome..............: %s \n,219, aux->nome);
398 printf( %c Endereco..........: %s \n,219, aux->endereco);
U4 Estrutura de Dados e Ponteiros 249
448 fflush(stdin);
449 printf( %c Informe o nome do paciente: ,219);
450 gets(nome_paciente_pesquisar);
451
452 //PESQUISAR SE O PACIENTE EXISTE NO SISTEMA
453 paciente_encontrado = false;
454 struct tipo_paciente *aux;
455 aux = pacientes.inicio;
456 while ( paciente_encontrado == false && aux != NULL ){
457 if ( strcmp(nome_paciente_pesquisar,aux->nome) == 0 ){
458 paciente_encontrado = true;
459 }else{
460 aux = aux->proximo;
461 }
462 }
463
464 if ( paciente_encontrado == true ){
465
466 printf(\n);
467 printf( %c Codigo............: %i \n,219, aux->codigo);
468 printf( %c Nome..............: %s \n,219, aux->nome);
469 printf( %c Endereco..........: %s \n,219, aux->endereco);
470 printf( %c Data de Nascimento: \n,219);
471 printf( %c ...........Dia: %i \n,219, aux->data.dia);
472 printf( %c ...........Mes: %i \n,219, aux->data.mes);
473 printf( %c ...........Ano: %i \n,219, aux->data.ano);
474 printf( %c Telefone..........: %s \n,219, aux->telefone);
475
476 if ( aux->ativo == 1 ){
477 printf( %c Status............: %s \n,219, ATIVO);
478 }else{
479 printf( %c Status............: %s \n,219, INATIVO);
480 }
481
482 fflush(stdin);
483 printf(\n\n);
484 printf(>>>>INFO: OPERACAO realizada com com SUCESSO!\n);
485 printf(\n\n);
486 getchar();
487
488 }else{
489 fflush(stdin);
490 printf(\n\n);
printf(>>>>INFO: O paciente com o nome informado NAO foi
491
encontrado.\n);
492 printf(\n\n);
493 getchar();
494 }
495
496 }else if ( opcao_desejada == 6 ){
497
U4 Estrutura de Dados e Ponteiros 251
594 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
595 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
596 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
597 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
598 printf(%c\n,191);
599 printf(%c %c%c %-40s %c \n,179,175,175,titulo_do_programa,179);
600 printf(%c,192);
601 printf(%c%c%c%c%c%c%c%c%c,196,196,196,194,196,196,196,196,196,196);
602 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
603 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
604 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
605 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
606 printf(%c\n,217);
607 printf( %c\n,179);
printf( %c%c%c%c>>> RELATORIO DE PACIENTES POR NOME
608
\n,192,196,196,196,175);
609 printf(\n\n);
610
611
612 //Estrutura temporria utilizada para ordenao dos elementos
613 struct tipo_paciente *tmp;
tmp = (struct tipo_paciente *) malloc (pacientes.total_pacientes *
614
sizeof(struct tipo_paciente));
615
616 struct tipo_paciente str;
617 int i=0,j=0, min=0;
618
619
620 //COPIAR OS DADOS DA ESTRUTURA DINMICA PARA UMA ESTRUTURA TEMPORRIA
621 aux = pacientes.inicio;
622 while ( aux != NULL ){
623 tmp[i].codigo = aux->codigo;
624 strcpy(tmp[i].nome,aux->nome);
625 strcpy(tmp[i].endereco,aux->endereco);
626 tmp[i].data.dia = aux->data.dia;
627 tmp[i].data.mes = aux->data.dia;
628 tmp[i].data.ano = aux->data.mes;
629 strcpy(tmp[i].telefone,aux->telefone);
630 tmp[i].ativo = aux->ativo;
631
632 aux = aux->proximo;
633 i++;
634 }
635
636
637 //Ordenao dos elementos por Seleo
638 for ( i = 0; i < pacientes.total_pacientes ; i++){
639 min = i;
640 for ( j = i+1; j < pacientes.total_pacientes; j++){
641 if ( strcmpi(tmp[min].nome,tmp[j].nome) > 0 ){
642 min = j;
643 }
644 }
645 if ( i != min ){
646 // TROCAR elementos
647 str = tmp[i];
648 tmp[i] = tmp[min];
649 tmp[min] = str;
650 }
651 }
652
653 //EXIBIR DADOS NA TELA
654 for ( posicao = 0; posicao < pacientes.total_pacientes; posicao++){
655
656 if ( tmp[posicao].codigo != -1 ){
657 printf( %c Codigo............: %i \n,219, tmp[posicao].codigo);
658 printf( %c Nome..............: %s \n,219, tmp[posicao].nome);
printf( %c Endereco..........: %s \n,219, tmp[posicao].
659
endereco);
660 printf( %c Data de Nascimento: \n,219);
printf( %c ...........Dia: %i \n,219, tmp[posicao].data.
661
dia);
printf( %c ...........Mes: %i \n,219, tmp[posicao].data.
662
mes);
printf( %c ...........Ano: %i \n,219, tmp[posicao].data.
663
ano);
printf( %c Telefone..........: %s \n,219, tmp[posicao].
664
telefone);
665
666 if ( tmp[posicao].ativo == 1 ){
667 printf( %c Status............: %s \n\n,219, ATIVO);
668 }else{
669 printf( %c Status............: %s \n\n,219, INATIVO);
670 }
671 }
672
673 }
674
675 fflush(stdin);
676 printf(\n\n);
677 printf(>>>>INFO: OPERACAO realizada com com SUCESSO!\n);
678 printf(\n\n);
679 getchar();
680
681 }
682
683 }while(opcao_desejada != 0);
684
685 printf(\n\n\n\n); //pular linha
686 return 0; // fim da aplicao
687 }
fim cdigo 19
U4 Estrutura de Dados e Ponteiros 255
8) Declare um registro para armazenar informaes a respeito de um cliente de uma loja de departamentos.
9) Qual operador utilizado para armazenar ou recuperar dados de uma estrutura do tipo registro?
12) Qual operador de ponteiro tem como funo o retorno do endereo de memria da varivel apontada?
13) Ilustre, por meio de um cdigo na linguagem C, como possvel apresentar na tela o contedo de uma varivel
apontada por um ponteiro.
14) Ilustre, por meio de um cdigo na linguagem C, como possvel apresentar na tela o endereo de uma varivel
apontada por um ponteiro.
11. CONSIDERAES
Nesta unidade, voc teve a oportunidade de aprender os principais conceitos de estrutu-
ras de dados e ponteiros. Nas estruturas de dados, estudamos como possvel manipul-los por
meio de vetores e matrizes. Alm disso, aprendemos que os registros podem organizar informa-
es de maneira heterognea. Em ponteiros, compreendemos seu conceito e como eles podem
ser utilizados na construo de programas.
Na Unidade 5, voc aprender a desenvolver programas utilizando os conceitos de pro-
gramao modular. Alm disso, a partir de seu estudo, poder reconhecer e construir funes
recursivas.
At l!
1. OBJETIVOS
Desenvolver programas utilizando os conceitos de programao modular.
Reconhecer e construir funes recursivas.
2. CONTEDOS
Programao modular (funes).
Passagem de parmetros por valor.
Passagem de parmetros por referncia.
Recursividade.
4. INTRODUO UNIDADE
Na unidade anterior, voc aprendeu a utilizar estruturas de dados na construo de pro-
gramas. Nesta unidade, voc ser convidado a estudar o modo como possvel utilizar os con-
ceitos de programao modular para a elaborao de programas na linguagem C.
Voc ver que a programao modular uma tcnica importante para a reutilizao do
cdigo-fonte, e que tem como objetivo a diviso do cdigo em pequenas partes, chamadas de
funes.
Aprender, ainda, que uma funo tem as mesmas caractersticas das sub-rotinas utiliza-
das nos algoritmos, ou seja, a modularizao do cdigo para a realizao de uma tarefa espec-
fica. Quando construmos algoritmos, a linguagem de programao C permite a criao de dois
tipos de mdulos: procedimentos e funes.
Nesse sentido, podemos, ento, construir funes que no retornam valores, que so
equivalentes aos procedimentos nos algoritmos, e, tambm, construir funes que retornam
valores, que so iguais s funes dos algoritmos.
Bom estudo!
5. FUNES
Todos os programas escritos na linguagem de programao C utilizam o conceito de fun-
es. Desse modo, para um programa funcionar corretamente, essencial que ele possua ao
menos uma funo, denominada main. Essa funo determina o local em que a execuo do
programa deve comear.
Ao longo do estudo das unidades, voc utilizou diversas funes disponveis na linguagem
C, como, por exemplo: sqrt (para o clculo da raiz quadrada), strcpy (para copiar contedos en-
tre strings), printf (para exibir informaes na tela), dentre outras.
Veja como , de maneira geral, a sintaxe da estrutura de uma funo na linguagem C:
1 <tipo_de_retorno> <nome_da_funcao>( <lista_de_parametros> ){
2
3 //declarao das variveis locais
4
5 /*
6 * bloco de comandos
7 */
8
9 }
Funes que retornam valores: o objetivo realizar algum tipo de tarefa e retornar
valores funo principal. Esse tipo de funo pode retornar qualquer tipo de dados
da linguagem C, tais como: int, char, float, double etc.
O nome da funo (<nome_da_funcao>) um identificador, que deve seguir os mesmos
critrios utilizados para definio de nomes de variveis e utilizado para chamar a funo em
determinadas partes do programa.
A lista de parmetros (<lista_de_parametros>) especifica um conjunto de informaes
que podem ser passadas para as funes. Os parmetros podem ser utilizados para passar da-
dos de uma funo para outra, bem como para retornar dados das funes. Esse conceito ser
descrito no decorrer do estudo desta unidade.
A declarao das variveis locais (Linha 3) define um conjunto de variveis que funciona-
ro apenas dentro da funo. Essas variveis no podem ser acessadas fora do bloco da funo,
que est delimitado pelos smbolos de abre chaves { e fecha chaves }. importante salientar que
variveis declaradas dentro da funo principal (main) podem ser acessadas em qualquer parte
do cdigo inclusive dentro de qualquer funo.
O bloco de comandos especifica quais tarefas devero ser executadas pela funo. Qual-
quer comando da linguagem C pode ser utilizado dentro do bloco.
O exemplo a seguir (Cdigo 1) demonstra a utilizao do conceito de funes na constru-
o de programas em que foram utilizadas apenas funes que no retornam valores.
cdigo 1
1 /*
2 * Programa para demonstrar a utilizao de funes
3 *
4 * Autor: Joo da Silva
5 */
6
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 //assinaturas das funes
12 void soma(int a, int b);
13 void multiplicacao(int a, int b);
14
15
16 /*
17 * FUNO PRINCIPAL
18 */
19 int main()
20 {
21
22 int num1;
23 int num2;
24
25 num1 = 10;
26 num2 = 20;
fim cdigo 1
Multiplicacao de 10 e 20 = 200
Soma de 3 e 2 = 5
Multiplicacao de 3 e 2 = 6
U5 Programao Modular 261
1 /*
2 * Programa para demonstrar a utilizao de funes com retorno
3 *
4 * Autor: Joo da Silva
5 */
6
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 //assinaturas das funes
12 int soma(int a, int b);
13 int multiplicacao(int a, int b);
14
15
16 /*
17 * FUNO PRINCIPAL
18 */
19 int main()
20 {
21
22 int num1;
23 int num2;
24 int resultado;
25
26 num1 = 10;
27 num2 = 20;
28
fim cdigo 2
U5 Programao Modular 263
Multiplicacao de 10 e 20 = 200
Soma de 3 e 2 = 5
Multiplicacao de 3 e 2 = 6
6. PASSAGEM DE PARMETROS
A lista de parmetros um recurso utilizado para passar informaes para as funes.
Nessa lista, devemos informar o tipo de dados e o nome do parmetro. Quando definimos uma
lista contendo mais de um parmetro, esses parmetros devem ser separados por vrgula.
A passagem de parmetro para uma funo pode ser realizada de duas maneiras:
Passagem de parmetro por valor: qualquer tipo de alterao realizada nos parme-
tros (ao longo das instrues da funo) no propagado para a funo principal. Em
outras palavras, caso o valor do parmetro dentro da funo seja alterado, o valor no
ser enviado para fora da funo (quando a funo terminar).
Passagem de parmetro por referncia: as alteraes ocorridas no interior da funo
so propagadas para a funo principal. Para que isso ocorra, devemos transformar
os parmetros em ponteiros. Assim, qualquer tipo de alterao no parmetro afetar
diretamente a posio de memria da varivel original.
importante observar que a passagem de parmetros por valor ou por referncia pode
ser utilizada em funes que retornam e que no retornam valores.
O Cdigo 3 demonstra a passagem de parmetros por valor.
cdigo 3
1 /*
2 * Programa para demonstrar a passagem de parmetros por valor
3 *
4 * Autor: Joo da Silva
5 */
6
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 //assinaturas das funes
12 void exibirvalor(int valor);
13
14
15 /*
16 * FUNO PRINCIPAL
17 */
18 int main()
19 {
20 int numero;
21
22 numero = 10;
23
24 //valor da varivel ANTES da funo
25 printf(Numero = %i \n, numero);
26
27 //chamada da funo
28 exibirvalor(numero);
29
30 //valor da varivel APS a funo
31 printf(Numero = %i \n, numero);
32
33 return 0;
34 }
35
36 void exibirvalor(int valor){
37
38 // atribuir valor 20 ao parmetro
39 valor = 20;
40
41 //valor da varivel no INTERIOR da funo
42 printf(Numero = %i \n, valor);
43
44 }
fim cdigo 3
U5 Programao Modular 265
Numero = 20
Numero = 10
No programa, para demonstrar a passagem de parmetros por valor, voc pode observar
que a varivel numero foi inicializada com o valor 10 (Linha 22), o que pode ser demonstrado
pela exibio do seu valor na tela (Linha 25).
A varivel numero passada como parmetro para funo exibirvalor, o nome do pa-
rmetro que faz referncia a essa varivel valor. Dentro da funo, esse parmetro recebe o
valor 20 (Linha 39) e o resultado exibido na tela (Linha 42).
Ao final da execuo da funo, o valor da varivel numero novamente exibido na tela.
Entretanto, como possvel observar no resultado da execuo do programa, seu valor no foi
alterado para o valor 20. Como resultado, temos a exibio na tela do valor original da varivel
definido antes da chamada da funo.
Esse programa demonstra que, apesar de alterarmos o valor de um parmetro no interior
de uma funo, essa alterao no propagada para fora da funo. Dessa forma, voc acabou
de conhecer a principal caracterstica da passagem de parmetros por valor.
A seguir, o Cdigo 4 demonstra um programa com a passagem de parmetros por refern-
cia.
cdigo 4
1 /*
2 * Programa para demonstrar a passagem de parmetro por referncia
3 *
4 * Autor: Joo da Silva
5 */
6
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 //assinaturas das funes
12 void exibirvalor(int *valor);
13
14
15 /*
16 * FUNO PRINCIPAL
17 */
18 int main()
19 {
20 int numero;
21
22 numero = 10;
23
24 //valor da varivel ANTES da funo
25 printf(Numero = %i \n, numero);
26
27 //chamada da funo
28 exibirvalor(&numero);
29
30 //valor da varivel APS a funo
31 printf(Numero = %i \n, numero);
32
33 return 0;
34 }
35
36 void exibirvalor(int *valor){
37
38 // atribuir valor 20 ao parmetro
39 *valor = 20;
40
41 //valor da varivel no INTERIOR da funo
42 printf(Numero = %i \n, *valor);
43
44 }
fim cdigo 4
Numero = 20
Numero = 20
cdigo 5
1 /*
2 * Programa para demonstrar a passagem de vetores como parmetro
3 *
4 * Autor: Joo da Silva
5 */
6
7 //declarao das bibliotecas
8 #include <stdio.h>
9
10 //assinaturas das funes
11 void carregarVetor(int v[], int num);
12 void imprimirVetor(int v[], int num);
13 float mediaVetor(int v[], int num);
14
15 /*
16 * FUNO PRINCIPAL
17 */
18 int main()
19 {
20 int vetor[5];
21 float media;
22
23 carregarVetor(vetor,5);
24 imprimirVetor(vetor,5);
25
26 media = mediaVetor(vetor,5);
27 printf(Media dos elementos = %.2f \n,media);
28
29 return 0;
30 }
31
32 void carregarVetor(int v[], int num){
33
34 int i;
35
36 for ( i = 0; i < num; i++ ){
37 printf(Valor da posicao %i = ,i);
38 scanf(%i,&v[i]);
39 }
40
41 }
42
43 void imprimirVetor(int v[], int num){
44
45 int i;
46
47 printf(\nValores do vetor \n);
48 for ( i = 0; i < num; i++ ){
49 printf(Posicao %i = %i \n,i,v[i]);
50 }
51
52 }
53
54
55 float mediaVetor(int v[], int num){
56
57 int i;
58 float soma = 0;
59
60 for ( i = 0; i < num; i++ ){
61 soma += v[i];
62 }
63
64 return (float)soma/num;
65
66 }
fim cdigo 5
Valor da posicao 1 = 2
Valor da posicao 2 = 3
Valor da posicao 3 = 4
Valor da posicao 4 = 5
Valores do vetor
Posicao 0 = 1
Posicao 1 = 2
Posicao 2 = 3
Posicao 3 = 4
Posicao 4 = 5
cdigo 6
1 /*
3 *
5 */
8 #include <stdio.h>
10 //definio da estrutura
11 struct tipodata{
12 int dia;
13 int mes;
14 int ano;
15 };
16
20
21 /*
22 * FUNO PRINCIPAL
23 */
24 int main()
25 {
27
28 lerData(&hoje);
29
31 return 0;
32 }
33
34
37
38 printf(Dia: );
39 scanf(%i,&data->dia);
40 printf(Mes: );
41 scanf(%i,&data->mes);
42 printf(Ano: );
43 scanf(%i,&data->ano);
44
45 }
46
49 return data.ano;
50 }
fim cdigo 6
Mes: 05
Ano: 2009
7. RECURSIVIDADE
A recursividade uma tcnica utilizada na elaborao de funes, na qual uma funo
pode realizar uma chamada de si mesma. Para exemplificar a utilizao do conceito de recursi-
vidade, considere o problema de somar todos os elementos de um vetor. Uma possvel soluo
sequencial para esse problema est apresentada no Cdigo 7.
cdigo 7
1 /*
2 * Programa para somar os elementos de um vetor sequencialmente
3 *
4 * Autor: Joo da Silva
5 */
6
7 //declarao das bibliotecas
8 #include <stdio.h>
9
10 //assinaturas das funes
11 int somarVetor(int v[], int num);
12
13 /*
14 * FUNO PRINCIPAL
15 */
16 int main()
U5 Programao Modular 271
17 {
18 int vetor[] = {10,20,30,40,50};
19 int resultado;
20
21 resultado = somarVetor(vetor,5);
22 printf(Soma do vetor = %i \n, resultado);
23
24 return 0;
25 }
26
27 int somarVetor(int v[], int num){
28
29 int i;
30 int soma = 0;
31
32 for( i = 0; i < num; i++){
33 soma += v[i];
34 }
35
36 return soma;
37
38 }
fim cdigo 7
A principal funcionalidade do programa demonstrada nas Linhas 32, 33 e 34, que rea-
lizam o somatrio dos elementos do vetor. Para que essa soma seja possvel, foi utilizada uma
estrutura de repetio.
Verifique no programa a seguir, descrito no Cdigo 8, o mesmo problema apresentado no
Cdigo 7, agora implementado de forma recursiva. A principal alterao que esse programa
no utiliza estruturas de repetio. O fato de no utilizar laos de repetio na resoluo de pro-
blemas uma caracterstica essencial das funes recursivas.
cdigo 8
1 /*
2 * Programa para somar elementos de um vetor com recursivamente
3 *
4 * Autor: Joo da Silva
5 */
6
7 //declarao das bibliotecas
8 #include <stdio.h>
9
10 //assinaturas das funes
11 int somarVetor(int v[], int num);
12
13 /*
14 * FUNO PRINCIPAL
15 */
16 int main()
17 {
18 int vetor[] = {10,20,30,40,50};
19 int resultado;
20
21 resultado = somarVetor(vetor,4);
22 printf(Soma do vetor = %i \n, resultado);
23
24 return 0;
25 }
26
27 int somarVetor(int v[], int num){
28
29 if ( num == 0 ){
30 return v[0];
31 }else{
32 return v[num] + somarVetor(v,num-1);
33 }
34 }
fim cdigo 8
Analisando o Cdigo 8, voc pode observar que a soma dos elementos do vetor foi reali-
zada sem a utilizao de laos de repetio. O problema foi solucionado apenas com chamadas
recursivas da prpria funo (somarVetor).
No Cdigo 9 do programa a seguir, veja uma soluo recursiva para calcular o fatorial de
um nmero.
cdigo 9
1 /*
2 * Programa para calcular o fatorial de um nmero
3 * de maneira recursiva
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 //assinaturas das funes
12 int fatorial(int num);
U5 Programao Modular 273
13
14 /*
15 * FUNO PRINCIPAL
16 */
17 int main()
18 {
19 int numero;
20
21 printf(Informe um numero: );
22 scanf(%i,&numero);
23
24 printf(Fatorial de %i = %i \n,numero,fatorial(numero));
25
26 return 0;
27 }
28
29 int fatorial(int num){
30
31 if ( num <= 1 ){
32 return 1;
33 }else{
34 return num * fatorial(num-1);
35 }
36
37 }
fim cdigo 9
Fatorial de 5 = 120
8. EXERCCIOS RESOLVIDOS
Confira a implementao dos programas desenvolvidos. Neste tpico, voc encontrar as
solues escritas na linguagem de programao C. Essa uma tima forma para fixar os conte-
dos.
1) Construa um programa capaz de gerenciar o peso e a altura de um conjunto de cin-
quenta pessoas. Para isso, voc deve utilizar um vetor definido a partir de uma es-
trutura de dados do tipo registro. Crie uma funo para cadastrar as pessoas e uma
funo para exibir o ndice de Massa Corprea (IMC = peso/altura2). O clculo do IMC,
tambm, deve ser realizado por meio de uma funo.
cdigo 10
1 /*
2 * Programa para calcular o IMC de um conjunto
3 * de pessoas
4 *
55 printf(\nPrograma finalizado.\n);
56 break;
57
58 default:
59 printf(Opcao invalida.);
60 break;
61
62 }
63
64 }while ( opcao != 3 );
65
66 return 0;
67 }
68
69
70 //FUNO para adicionar uma nova pessoa ao vetor
71 void cadastrar(struct tipopessoa p[], int *pos){
72
73 if ( *pos < TOTALPESSOAS ){
74
75 fflush(stdin);
76 printf(Nome: );
77 gets(p[*pos].nome);
78 printf(Peso: );
79 scanf(%f,&p[*pos].peso);
80 printf(Altura: );
81 scanf(%f,&p[*pos].altura);
82
83 *pos = *pos + 1;
84
85 }else{
86 printf(\no limite de pessoas foi atingido\n);
87 }
88 }
89
90 //FUNO para exibir o IMC das pessoas
91 void exibirIMC(struct tipopessoa p[], int pos){
92
93 int i;
94 float valor;
95
96 for ( i = 0; i < pos; i++){
97 //chamada da funo para clculo do IMC
98 valor = imc(p[i].peso,p[i].altura);
99
100 printf(Nome: %s \n, p[i].nome);
101 printf(IMC.: %.2f \n\n,valor);
102 }
103
104 }
105
106 //FUNO para calcular o IMC de uma pessoa
107 float imc(float peso, float altura){
108 return peso/(altura*altura);
109 }
Fim cdigo 10
-------Menu-------
[1] cadastrar
[3] sair
Opcao desejada: 1
Peso: 74
Altura: 1.80
-------Menu-------
[1] cadastrar
[3] sair
Opcao desejada: 1
Peso: 60
Altura: 1.69
U5 Programao Modular 277
-------Menu-------
[1] cadastrar
[3] sair
Opcao desejada: 2
IMC.: 22.84
IMC.: 21.01
-------Menu-------
[1] cadastrar
[3] sair
Opcao desejada: 3
Programa finalizado.
2) Escreva um programa capaz de calcular potenciao (um nmero elevado ao outro).
Para isso, voc dever criar uma funo recursiva, que receba como parmetro a base
e o expoente, e retorne o resultado.
cdigo 11
1 /*
2 * Programa para calcular a potncia de um nmero
3 * de maneira recursiva
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10
11 //assinaturas das funes
12 int potencia( int b, int e);
13
14 /*
15 * FUNO PRINCIPAL
16 */
17 int main()
18 {
19 int base, expoente;
20 int resultado;
21
22 printf(Base: );
23 scanf(%i,&base);
24 printf(Expoente: );
25 scanf(%i,&expoente);
26
27 resultado = potencia(base,expoente);
28
29 printf(%i elevado a %i = %i \n,base,expoente,resultado);
30
31 return 0;
32 }
33
34 //FUNO para calcular a potncia de um nmero
35 int potencia( int b, int e){
36
37 if ( e == 0 ){
38 return 1;
39 }else{
40 return b * potencia(b,e-1);
41 }
42
43 }
fim cdigo 11
Expoente: 3
2 elevado a 3 = 8
44 //Gabaritos
45 typedef tipo_alternativas gabarito_oficial[NUM_QUESTOES];
46 typedef tipo_candidatos gabarito_candidatos;
47
48 /*------------------------------------------------*
49 * ASSINATURAS DOS MTODOS (MDULOS)
50 *-----------------------------------------------*/
51 void menu_principal(char *titulo_do_programa, int *opcao_desejada);
52 void menu_secundario(char *titulo_do_programa,char *subtitulo_do_programa);
53 void mensagem(char *msg);
54 void ler_gabarito_oficial(gabarito_oficial g);
55 void ler_gabarito_candidatos(gabarito_candidatos *g);
56 void gabarito_correcao(gabarito_oficial go,gabarito_candidatos *gc);
57 void exibir_resultados_candidatos(gabarito_candidatos *gc);
58
59
60
61 /*------------------------------------------------*
62 * PROGRAMA PRINCIPAL
63 *-----------------------------------------------*/
64 int main()
65 {
66 // declarao das variveis globais
67 char titulo_do_programa[40] = SISTEMA GAB@ARITOS;
68
69 gabarito_oficial oficial;
70 gabarito_candidatos candidatos;
71 char continua;
72
73 //Inicializar variveis
74 candidatos.inicio = NULL;
75 candidatos.fim = NULL;
76 candidatos.total_candidatos = 0;
77
78 int opcao_desejada;
79
80 do{
81 menu_principal(titulo_do_programa,&opcao_desejada);
82
83 switch(opcao_desejada){
84 case 1:
85 menu_secundario(titulo_do_programa,LER GABARITO OFICIAL);
86 ler_gabarito_oficial(oficial);
87 mensagem(OPERACAO realizada com SUCESSO!);
88 break;
89 case 2:
90 do{
91 menu_secundario(titulo_do_programa,LER GABARITOS DOS CANDIDATOS);
92 ler_gabarito_candidatos(&candidatos);
93 fflush(stdin);
U5 Programao Modular 281
193 }
194 //-------------------------------------------------
195 //FUNO: ler_gabarito_oficial
196 // Realize a leitura do gabarito oficial da prova.
197 void ler_gabarito_oficial(gabarito_oficial g)
198 {
199 int i = 0;
200 printf( %c INFORMACOES SOBRE A PROVA \n,219);
201 printf( %c Total de questoes %i\n, 219, NUM_QUESTOES);
202 printf( %c\n,219);
203 printf( %c Leitura das respostas corretas\n,219);
204 for( i = 0; i < NUM_QUESTOES; i++)
205 {
206 fflush(stdin);
207 printf( %c Questao [%02i]: ,219,i+1);
208 //Leitura da resposta correta
209 //A alternativa convertida para maiscula para facilitar
210 //a correo.
211 g[i].correta = toupper(getchar());
212 }
213
214 }
215
216 //-------------------------------------------------
217 //FUNO: ler_gabarito_candidatos
218 // Realiza a leitura dos gabaritos dos candidatos
219 // Essa funo manipula uma instruo de dados dinmica com ponteiros
220 void ler_gabarito_candidatos(gabarito_candidatos *g)
221 {
222 printf( %c INFORMACOES SOBRE A PROVA \n,219);
223 printf( %c Total de questoes ......: %i\n, 219, NUM_QUESTOES);
224 printf( %c Total de gabaritos lidos: %i\n, 219, g->total_candidatos);
225 printf( %c\n,219);
226
227 //Alocar memria para leitura de um novo gabarito
228 candidato *novo;
229 novo=(candidato *) malloc (sizeof(candidato));
230
231 printf( %c Num Inscricao: ,219);
232 scanf(%i,&novo->num_inscricao);
233
234 fflush(stdin);
235 printf( %c Num RG.......: ,219);
236 gets(novo->num_rg);
237
238 fflush(stdin);
239 printf( %c Nome.........: ,219);
240 gets(novo->nome);
241
242 printf( %c\n,219);
fim cdigo 12
1 /*-------------------------------------------------
2 *
3 * Exemplo de uma aplicao capaz de controlar informacoes a
4 * respeito dos pacientes de um consultorio odontologico.
5 *
6 * >>>IMPORTANTE: ESSA IMPLEMENTAO UTILIZA PROGRAMAO MODULAR!
7 *
8 * Autor: Joo da Silva
U5 Programao Modular 287
9 *
10 *-----------------------------------------------*/
11
12 /*-------------------------------------------------
13 * BIBLIOTECAS
14 *-----------------------------------------------*/
15 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
16 #include <stdlib.h> //para utilizao da instruo system
17 #include <string.h> //para manipulacao de strings
18
19 /*-------------------------------------------------
20 * ESTRUTURA DO TIPO REGISTRO
21 *-----------------------------------------------*/
22 struct tipo_data{
23 int dia;
24 int mes;
25 int ano;
26 };
27
28 struct tipo_paciente{
29 int codigo;
30 char nome[60];
31 char endereco[80];
32 struct tipo_data data;
33 char telefone[14];
34 int ativo; // 0 = inativo e 1 = ativo;
35
36 // ponteiro para o prximo paciente
37 struct tipo_paciente *proximo;
38 };
39
40 struct conjunto_pacientes{
41 struct tipo_paciente *inicio;
42 struct tipo_paciente *fim;
43 int total_pacientes;
44 };
45
46 typedef struct tipo_paciente paciente;
47
48 /*------------------------------------------------*
49 * ASSINATURAS DOS MDULOS
50 *-----------------------------------------------*/
51 int menu_principal(char *titulo_do_programa, int *opcao_desejada);
52 void menu_secundario(char *titulo_do_programa,char *subtitulo_do_programa);
53 void mensagem(char *msg);
54 void paciente_cadastrar(struct conjunto_pacientes *p);
55 paciente* pesquisar_paciente_codigo(struct conjunto_pacientes *p);
56 paciente* pesquisar_paciente_nome(struct conjunto_pacientes *p);
57 void paciente_exibir(paciente *p);
58 paciente* paciente_ordenar(struct conjunto_pacientes *p, int tipo);
59
60
61 /*------------------------------------------------*
62 * PROGRAMA PRINCIPAL
63 *-----------------------------------------------*/
64 int main()
65 {
66 // declarao das variveis globais
67 char titulo_do_programa[40] = CONSULTORIO ODONTOLOGICO;
68
69 //declaracao da estrutura de ponteiros que armazenar
70 //os pacientes
71 struct conjunto_pacientes pacientes;
72
73 paciente *aux;
74
75 //Variveis auxiliares
76 int posicao;
77 int paciente_status;
78 int opcao_desejada;
79
80 //INICIALIZAR ESTRUTURA DE PONTEIROS
81 pacientes.inicio = NULL;
82 pacientes.fim = NULL;
83 pacientes.total_pacientes = 0;
84
85 //
86 // MENU PRINCIPAL
87 //
88 do{
89 menu_principal(titulo_do_programa,&opcao_desejada);
90
91 if ( opcao_desejada == 1 ){
92
93 menu_secundario(titulo_do_programa,CADASTRAR NOVO PACIENTE);
94 paciente_cadastrar(&pacientes);
95 mensagem(OPERACAO realizada com com SUCESSO!);
96
97 }else if ( opcao_desejada == 2 ){
98
menu_secundario(titulo_do_programa,ALTERAR DADOS CADASTRAIS NOVO
99
PACIENTE);
100 paciente *aux = pesquisar_paciente_codigo(&pacientes);
101
102 if ( aux != NULL ){
103 printf(\n);
104 printf( %c INFORME OS NOVOS DADOS DO PACIENTE \n,219);
105 printf( %c Codigo............: ,219);
106 scanf(%i,&aux->codigo);
107
108 fflush(stdin);
U5 Programao Modular 289
205
206 /*------------------------------------------------*
207 * IMPLEMENTAO DAS FUNES
208 *-----------------------------------------------*/
209
210 //-------------------------------------------------
211 //FUNO: menuprincipal
212 // Exibe o menu principal da aplicao e recebe a opo desejada
213 // pelo usurio.
214 int menu_principal(char *titulo_do_programa, int *opcao_desejada)
215 {
216 system(cls); //limpar as informacoes da tela
217 printf(%c,218);
218 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
219 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
220 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
221 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
222 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
223 printf(%c\n,191);
224 printf(%c %c%c %-40s %c \n,179,175,175,titulo_do_programa,179);
225 printf(%c,195);
226 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
227 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
228 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
229 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
230 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
231 printf(%c\n,180);
232 printf(%c %c%c %-40s %c \n,179,175,175,MENU PRINCIPAL,179);
233 printf(%c %-43s %c \n,179, ,179);
234 printf(%c %-40s %c \n,179, [1] CADASTRAR NOVO PACIENTE ,179);
235 printf(%c %-40s %c \n,179, [2] ALTERAR DADOS CADASTRAIS ,179);
236 printf(%c %-40s %c \n,179, [3] ALTERAR STATUS DO PACIENTE ,179);
237 printf(%c %-40s %c \n,179, [4] PESQUISAR PACIENTE POR CODIGO ,179);
238 printf(%c %-40s %c \n,179, [5] PESQUISAR PACIENTE POR NOME ,179);
239 printf(%c %-40s %c \n,179, [6] RELATORIO DE PACIENTES POR CODIGO ,179);
240 printf(%c %-40s %c \n,179, [7] RELATORIO DE PACIENTES POR NOME ,179);
241 printf(%c %-43s %c \n,179, ,179);
242 printf(%c %-40s %c \n,179, [0] SAIR DA APLICACAO ,179);
243 printf(%c,192);
244 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
245 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
246 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
247 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
248 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
249 printf(%c\n,217);
250
251 fflush(stdin);
252 printf(\n\n);
253 printf( %s ,Selecione a opcao desejada: );
254 scanf(%i,&*opcao_desejada);
255 }
256
257 //-------------------------------------------------
258 //FUNO: menu_secundario
259 // Desenha na tela os menus secundrios da aplicao
260 void menu_secundario(char *titulo_do_programa,char *subtitulo_do_programa)
261 {
262 system(cls); //limpar as informacoes da tela
263 printf(%c,218);
264 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
265 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
266 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
267 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
268 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
269 printf(%c\n,191);
270 printf(%c %c%c %-40s %c \n,179,175,175,titulo_do_programa,179);
271 printf(%c,192);
272 printf(%c%c%c%c%c%c%c%c%c,196,196,196,194,196,196,196,196,196,196);
273 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
274 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
275 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
276 printf(%c%c%c%c%c%c%c%c%c,196,196,196,196,196,196,196,196,196,196);
277 printf(%c\n,217);
278 printf( %c\n,179);
279 printf( %c%c%c%c>>> %s\n,192,196,196,196,subtitulo_do_programa);
280 printf(\n\n);
281 }
282
283 //-------------------------------------------------
284 //FUNO: mensagem
285 // Exibe uma mensagem na tela
286 void mensagem(char *msg)
287 {
288 fflush(stdin);
289 printf(\n\n);
290 printf(>>>>INFO: %s\n,msg);
291 printf(\n\n);
292 getchar();
293 }
294
295 //-------------------------------------------------
296 //FUNO: paciente_cadastrar
297 // Cadastra um novo paciente na aplicao
298 void paciente_cadastrar(struct conjunto_pacientes *p)
299 {
300 paciente *novo;
301 novo=(paciente *) malloc (sizeof(paciente));
302
303 printf( %c Codigo............: ,219);
304 scanf(%i,&novo->codigo);
U5 Programao Modular 293
305
306 fflush(stdin);
307 printf( %c Nome..............: ,219);
308 gets(novo->nome);
309
310 fflush(stdin);
311 printf( %c Endereco..........: ,219);
312 gets(novo->endereco);
313
314 fflush(stdin);
315 printf( %c Data de Nascimento: \n,219);
316 printf( %c ...........Dia: ,219); scanf(%i,&novo->data.dia);
317 printf( %c ...........Mes: ,219); scanf(%i,&novo->data.mes);
318 printf( %c ...........Ano: ,219); scanf(%i,&novo->data.ano);
319
320 fflush(stdin);
321 printf( %c Telefone..........: ,219);
322 gets(novo->telefone);
323
324 //DETERMINAR STATUS DO PACIENTE
325 novo->ativo = 1;
326
327 // ESPECIFICAR O PONTEIRO PARA O PRXIMO ELEMENTO
328 novo->proximo = NULL;
329
330 // ADICIONAR NOVO ELEMENTO A LISTA DE PACIENTES
331 if ( p->inicio == NULL ){
332 p->inicio = novo;
333 p->fim = novo;
334 }else{
335 p->fim->proximo = novo;
336 p->fim = p->fim->proximo;
337 }
338
339 // INCREMENTAR O TOTAL DE PACIENTES
340 p->total_pacientes++;
341 }
342
343 //-------------------------------------------------
344 //FUNO: pesquisar_paciente
345 // Pesquisa se o paciente j foi cadastrado, retornando um valor
346 // verdadeiro (true) ou falso (false).
347 // Essa pesquisa realizada por CDIGO
348 paciente* pesquisar_paciente_codigo(struct conjunto_pacientes *p)
349 {
350 int chave;
351
352 printf( %c Informe o codigo do paciente: ,219);
353 scanf(%i,&chave);
354
455 min = j;
456 }else if ( tipo == 2 ){
457 if ( strcmpi(tmp[min].nome,tmp[j].nome) > 0 )
458 min = j;
459 }
460 }
461 if ( i != min ){ // TROCAR elementos
462 str = tmp[i];
463 tmp[i] = tmp[min];
464 tmp[min] = str;
465 }
466 }
467
468 return tmp;
469 }
fim cdigo 13
9. QUESTES AUTOAVALIATIVAS
As questes autoavaliativas desta unidade foram elaboradas com base nos conceitos de
programao modular. Estes fundamentos so aplicados na elaborao dos mais variados tipos
de programas e so essenciais para a organizao do cdigo-fonte, bem como para sua reutiliza-
o. Aproveite as questes para realizar uma reviso desses conceitos.
1) Explique a estrutura geral de uma funo na linguagem C.
2) Descreva as diferenas entre as funes que retornam valores e as funes que no retornam valores.
3) Apresente a declarao (em linguagem C) de uma funo que retorna valor e de uma funo que no retorna
valor.
4) As assinaturas das funes so utilizadas para informar quais funes adicionais foram definidas pelo programa-
dor, em qual parte do programa devem ser declaradas essas assinaturas?
7) O que recursividade?
10. CONSIDERAES
Nesta unidade, foram apresentados os principais conceitos para modularizao de progra-
mas. Alm de aprender que, na linguagem C, os programas podem ser modularizados utilizando
funes, voc pde aprender, tambm, a definir e utilizar funes, bem como os tipos de passa-
gem de parmetros por valor e referncia. Alm disso, teve a oportunidade de construir funes
recursivas e transformar funes sequenciais em recursivas.
Agora, convidamos voc a estudar a ltima unidade. Vamos l!
1. OBJETIVO
Construir programas para armazenar dados em arquivos.
2. CONTEDO
Manipulao de arquivos.
4. INTRODUO UNIDADE
Ao longo do estudo das unidades anteriores, voc teve a oportunidade de aprender como
manipular informaes por meio de variveis, vetores, matrizes e registros. Essas estruturas so
essenciais para a construo de programas. No entanto, h um problema crucial: quando o pro-
grama finalizado, todos os dados armazenados nessas estruturas so perdidos.
Nesta unidade, vamos aprender uma nova estrutura para manipulao de informaes,
em que os dados podem ser armazenados permanentemente. Essa estrutura conhecida como
arquivo. Voc aprender como criar, ler e escrever (gravar) informaes em arquivos.
Bom estudo!
1 FILE *pArquivo;
Depois de criado o ponteiro para o arquivo, o prximo passo realizar a abertura do ar-
quivo. Esse processo executado pela funo fopen. O trecho da instruo a seguir ilustra a
abertura de um arquivo denominado teste.txt.
1 FILE *pArquivo
2 pArquivo = fopen(teste.txt,w)
Na funo fopen, dois parmetros devem ser informados: o nome do arquivo (teste.txt) e
o modo de abertura, que define quais operaes podero ser efetuadas no arquivo. Essas ope-
raes so especificadas no Quadro 1.
1 FILE *pArquivo;
2 pArquivo = fopen(teste.txt,w);
3
4 if ( pArquivo == NULL ){
5 printf(Erro na abertura do arquivo.\n);
6 exit(1);
7 }
8
9 // operaes de leitura e escrita
10
Analisando o trecho da instruo anterior, veja que a condio avaliada na Linha 4 verifica
se o arquivo foi aberto corretamente. Quando o arquivo no pode ser aberto, a funo fopen
retorna NULL. Com isso, exibida a mensagem de erro da Linha 5. Alm disso, a instruo exit(1)
finaliza imediatamente a execuo do programa. Para utilizar a funo exit, necessrio incluir
a biblioteca stdlib.h.
Para concluir a estrutura bsica para manipulao de um arquivo, devemos realizar uma
chamada funo fclose, que responsvel pelo fechamento de um arquivo aberto. A utilizao
da funo simples. Veja a demonstrao no trecho a seguir:
1 FILE *pArquivo;
2 pArquivo = fopen(teste.txt,w);
3
4 if ( pArquivo == NULL ){
5 printf(Erro na abertura do arquivo.\n);
6 exit(1);
7 }
8
9 // operaes de leitura e escrita
10
11 fclose(pArquivo);
12
Agora que voc j estudou os comandos bsicos para abertura e fechamento do arquivo,
vamos aprender como escrever e ler seus dados. O Quadro 2 apresenta os principais comandos.
Considere que pArquivo um ponteiro para o tipo file.
O programa a seguir (Cdigo 1) demonstra a utilizao dos comandos fputc e fgetc para
leitura e escrita de caracteres no arquivo.
cdigo 1
1 /*
2 * Programa capaz de realizar a leitura e escrita de
3 * caracteres (char) em um arquivo texto
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10 #include <stdlib.h>
11
12 /*
13 * FUNO PRINCIPAL
14 */
15 int main()
16 {
17
18 FILE *pArquivo;
19 char c;
20
21 pArquivo = fopen(caracteres.txt,w+);
22
23 if ( pArquivo == NULL ){
24 printf(Erro na abertura do arquivo.\n);
25 exit(1);
26 }
27
28 /*
29 * ESCREVER CARACTERES NO ARQUIVO
30 */
31 do{
32 fflush(stdin);
33 printf(Digite um caractere (ou @ para sair): );
34 scanf(%c, &c);
35
36 //escrevendo caractere no arquivo
37 fputc(c,pArquivo);
38
39 }while (c != @);
U6 - Arquivos 303
40
41 /*
42 * LER CARACTERES NO ARQUIVO
43 */
44 printf(\nLeitura dos Caracteres do Arquivo\n);
45 rewind(pArquivo);
46
47 while ( !feof(pArquivo) ){
48
49 c = fgetc(pArquivo);
50 printf(Caractere: %c \n, c);
51
52 };
53
54 fclose(pArquivo);
55
56 return 0;
57 }
fim cdigo 1
Caractere: a
Caractere: 2
Caractere: k
Caractere: 9
Caractere: $
Caractere: y
Caractere: @
Caractere:
Note que, no Cdigo 1, os caracteres so escritos (ou gravados) no arquivo por meio
do comando fputc (Linha 37). Para terminar a leitura dos caracteres, o smbolo @ deve ser
informado.
Na Linha 45, o comando rewind foi utilizado para reposicionar o indicador de posio
do arquivo no incio. Esse procedimento necessrio para que a leitura dos caracteres seja
realizada do incio para o fim. Na Linha 47, utilizado o comando feof, que uma maneira de
verificar se a leitura do arquivo chegou ao fim. Todo arquivo possui um caractere especial que
representa seu fim, comumente conhecido como EOF (End-Of-File). A funo feof realiza um
teste para determinar se o final do arquivo foi atingido.
J na Linha 49, o comando fgetc utilizado para ler caractere por caractere do arquivo.
Esse comando est dentro do lao de repetio while, que s termina quando o final do arquivo
(EOF) encontrado.
O prximo exemplo (Cdigo 2) demonstra a utilizao dos comandos fputs e fgets para
leitura e escrita de conjunto de caracteres (strings) no arquivo.
cdigo 2
1 /*
2 * Programa capaz de realizar a leitura e escrita de
3 * caracteres (char) em um arquivo texto
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12
13 /*
14 * FUNO PRINCIPAL
15 */
16 int main()
17 {
18
19 FILE *pArquivo;
20 char texto[20];
21
22 pArquivo = fopen(strings.txt,w+);
23
24 if ( pArquivo == NULL ){
25 printf(Erro na abertura do arquivo.\n);
26 exit(1);
27 }
28
29
30 /*
31 * ESCREVER CARACTERES NO ARQUIVO
32 */
33 do{
34 fflush(stdin);
U6 - Arquivos 305
fim cdigo 2
String: Brasil
String: Argentina
String: Chile
String: Inglaterra
Dessa forma, a Linha 42 realiza a escrita das informaes no arquivo, por meio da funo
fputs. Esse comando escreve uma string no arquivo.
Na Linha 56, os dados contidos no arquivo so carregados por meio do comando fgets.
Para leitura da string, necessrio informar uma varivel que receber a string carregada (texto),
o nmero de caracteres que deve ser lido (19) e, tambm, o ponteiro para o arquivo (pArquivo).
Os caracteres sero lidos do arquivo at o tamanho especificado (19) ou at que um caractere
de nova linha (\n) seja encontrado.
O prximo programa, descrito no Cdigo 3, demonstra a utilizao dos comandos fwrite e
fread. Esses comandos so utilizados para escrita e leitura de qualquer tipo de dados no arquivo.
Os arquivos que armazenam qualquer tipo de dados so chamados de arquivos binrios.
cdigo 3
1 /*
3 * registros em um arquivo
4 *
6 */
9 #include <stdio.h>
10 #include <stdlib.h>
U6 - Arquivos 307
11 #include <string.h>
12 #include <ctype.h>
13
15 struct tipopessoa{
16 char nome[30];
17 int idade;
18 }pessoa;
19
20 int main()
21 {
22 FILE *pArquivo;
23 char continuar;
24
26 pArquivo = fopen(pessoas.dat,w+b);
27
28 if ( pArquivo == NULL){
30 exit(1);
31 }
32
33
35 do{
36 fflush(stdin);
37 printf(\nNome.: );
38 gets(pessoa.nome);
39 printf(Idade: );
40 scanf(%i,&pessoa.idade);
41
43 fwrite(&pessoa,sizeof(pessoa),1,pArquivo);
44
48
49
52
53 while ( !feof(pArquivo) ){
54
56 fread(&pessoa,sizeof(pessoa),1,pArquivo);
57
58 if ( !feof(pArquivo) ){
61 }
62 }
63
64 fclose(pArquivo);
65
66 return 0;
67 }
fim cdigo 3
Idade: 23
Idade: 42
Idade: 29
Idade: 23
Idade: 42
Idade: 29
U6 - Arquivos 309
Veja que a Linha 43 utiliza o comando fwrite para escrever os dados no arquivo, enquanto
a Linha 56 utiliza o comando fread para realizar a leitura dos dados do arquivo.
6. EXERCCIOS RESOLVIDOS
1) Utilizando o conceito de arquivos, crie um programa para controlar os dados dos fun-
cionrios de uma empresa. Esse programa dever ser capaz de inserir, remover e listar
os funcionrios, e, alm disso, de salvar e carregar os funcionrios cadastrados no
disco.
cdigo 4
1 /*
2 * Programa capaz de realizar a leitura e escrita de
3 * registros em um arquivo
4 *
5 * Autor: Joo da Silva
6 */
7
8 //declarao das bibliotecas
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12
13 //nmero total de funcionrios
14 #define TOTALFUNC 5
15
16 //definio da estrutura registro
17 struct tipofuncionario{
18 int codigo; //cdigo do funcionrio
19 char nome[30]; // nome do funcionrio
20 float salario; // salrio do funcionrio
21 int ativo; // 1 = ativo; 0 = inativo
22 };
23
24 //assinaturas das funes
25 void inicializar(struct tipofuncionario f[]);
26 void listar(struct tipofuncionario f[]);
27 void inserir(struct tipofuncionario f[]);
28 void remover(struct tipofuncionario f[]);
29 void salvar(struct tipofuncionario f[]);
30 void carregar(struct tipofuncionario f[]);
31
32 /*
33 * FUNO PRINCIPAL
34 */
35 int main()
36 {
37 int opcao;
38 struct tipofuncionario func[TOTALFUNC];
39
40 inicializar(func); //inicializar vetor
41
42 do{
43 printf(------Controle de Funcionarios------\n);
44 printf( [1] Inserir \n);
45 printf( [2] Remover \n);
46 printf( [3] Listar \n);
47 printf( [4] Carregar (arquivo)\n);
48 printf( [5] Salvar (arquivo)\n);
49 printf( [6] Sair \n\n);
50 printf(Opcao desejada: );
51 scanf(%i,&opcao);
52
53 switch(opcao){
54 case 1: inserir(func);
55 break;
56 case 2: remover(func);
57 break;
58 case 3: listar(func);
59 break;
60 case 4: inicializar(func);
61 carregar(func);
62 break;
63 case 5: salvar(func);
64 break;
65
66 case 6: printf(\nPrograma finalizado\n);
67 break;
68 default: printf(\nOpcao invalida.\n);
69 }
70 }while ( opcao != 6 );
71
72 return 0;
73 }
74
75 //------------------------------------------
76 //FUNO para inicializar todas as posies do vetor
77 //------------------------------------------
78 void inicializar(struct tipofuncionario f[]){
79 int i;
80 for ( i = 0; i < TOTALFUNC; i++){
81 f[i].codigo = 0;
82 strcpy(f[i].nome,);
83 f[i].salario = 0.0;
84 f[i].ativo = 0;
85 }
86 }
87 //------------------------------------------
88 //FUNO para exibir na tela os funcionrios ativos
89 //------------------------------------------
90 void listar(struct tipofuncionario f[]){
91 int i = 0;
92 while ( i < TOTALFUNC ){
93 if ( f[i].ativo != 0 ){ // exibir funcionrios ativos
U6 - Arquivos 311
94 printf(Codigo: %i \n,f[i].codigo);
95 printf(Nome: %s \n,f[i].nome);
96 printf(Salario: %.2f \n\n,f[i].salario);
97 }
98 i++;
99 }
100 }
101 //------------------------------------------
102 //FUNO para inserir um funcionrio
103 //------------------------------------------
104 void inserir(struct tipofuncionario f[]){
105 int i, pos;
106 printf(\n--Inserir funcionario--\n);
107
108 //procurar uma posio para inserir o funcionrio
109 i = 0;
110 pos = -1;
111 while ( (i < TOTALFUNC) && (pos == -1) ){
112 if ( f[i].ativo == 0 ){
113 pos = i;
114 }
115 i++;
116 }
117
118 if ( pos != -1 ){
119 printf(Codigo.: );
120 scanf(%i,&f[pos].codigo);
121 fflush(stdin);
122 printf(Nome...: );
123 gets(f[pos].nome);
124 printf(Salario: );
125 scanf(%f,&f[pos].salario);
126 f[pos].ativo = 1;
127 printf(\nFuncionario inserido com sucesso.\n);
128 }else{
129 printf(\nTodas as posicoes da lista estao ocupadas\n);
130 }
131 }
132 //------------------------------------------
133 //FUNO para remover um funcionrio
134 //------------------------------------------
135 void remover(struct tipofuncionario f[]){
136 int codigo, i, pos;
137
138 printf(\nInforme o codigo do funcionario: );
139 scanf(%i,&codigo);
140
141 //procurar funcionrio
142 i = 0;
143 pos = -1;
144 while ( (i < TOTALFUNC) && (pos == -1) ){
145 if ( f[i].codigo == codigo ){
fim cdigo 4
Esses dados podem ser facilmente exportados para o formato CSV no Excel. Para isso, uti-
lize a opo Salvar Como e, em Tipo, selecione CSV (separado por vrgula) (*.csv). O resultado
pode ser visualizado no bloco de notas e apresentado na Figura 2.
O objetivo deste exerccio o desenvolvimento de uma aplicao que seja capaz de car-
regar um arquivo do tipo CSV e apresentar os dados na tela. Para isso, utilize os comandos da
linguagem C para manipulao de arquivos.
cdigo 5
1 /*---------------------------------------------
2 *
3 * Exemplo de uma aplicao capaz de carregar um arquivo do tipo
4 * CSV e apresentar as informaes na tela.
5 *
6 * Autor: Joo da Silva
7 *
8 *-------------------------------------------*/
9
10 /*---------------------------------------------
11 * BIBLIOTECAS
12 *-------------------------------------------*/
13 #include <stdio.h> //instrues de entrada e sada (printf e scanf)
14 #include <stdlib.h> //para utilizao da instruo system
15 #include <string.h> //para utilizao da funo strtok
16
17 /*---------------------------------------------
18 * ESTRUTURA DO TIPO REGISTRO
19 *-------------------------------------------*/
20
21 struct tipo_arquivo_csv{
22 int codigo;
23 char nome[40];
24 float nota1;
25 float nota2;
26
27 struct tipo_arquivo_csv *proximo;
28 };
29
30 typedef struct tipo_arquivo_csv csv;
31
32 /*---------------------------------------------
33 * ASSINATURAS DOS MTODOS (OU MDULOS)
34 *-------------------------------------------*/
35 void trocar_caractere(char *str, char de, char para);
36 int ler_arquivo_csv(char *nomearquivo, csv reg[], int *n);
37 void exibir_dados(csv reg[], int n);
38
39
40 /*--------------------------------------------*
41 * PROGRAMA PRINCIPAL
42 *-------------------------------------------*/
43 int main()
44 {
45 int total_linhas=0;
46 csv registros[100];
47
48 ler_arquivo_csv(dados.csv,registros,&total_linhas);
49 exibir_dados(registros,total_linhas);
50
51 printf(\n\n\n\n); //pular linha
52 return 0; // fim da aplicao
53 }
U6 - Arquivos 315
54
55
56
57 //---------------------------------------------
58 //FUNO: trocar_caractere
59 // Troca um caractere de uma string por outro
60 void trocar_caractere(char *str, char de, char para)
61 {
62 char *pos = strchr(str,de);
63 str[(pos-str)] = para;
64 }
65
66 //---------------------------------------------
67 //FUNO: ler_arquivo_csv
68 // Carrega o contedo de um arquivo do tipo CSV e armazena em um
69 // vetor de registros
70 int ler_arquivo_csv(char *nomearquivo, csv reg[], int *n)
71 {
72 FILE *pArquivo; // ponteiro para o arquivo CSV
73
74 //Abertura do arquivo
75 pArquivo = fopen(nomearquivo,r);
76
77 //Verificar se o arquivo foi realmente aberto
78 if ( pArquivo == NULL){
79 printf(Erro na abertura do arquivo.\n);
80 return 0;
81 }
82
83 //leitura do arquivo
char tmp[4096]; // varivel temporrio que armazenar 1 (uma) linha inteira do
84
arquivo
85 char campo[200]; // varivel que armazenar apenas 1 (um) campo
86
87 //leitura do cabealho do arquivo
88 fgets(tmp,4096,pArquivo);
89
90 while ( !feof(pArquivo) )
91 {
92 fgets(tmp,4096,pArquivo);
93
94 //DICA
95 // ---> atoi = converte uma string em um valor inteiro
96 // ---> atof = converte uma string em um valor float
97 // ---> strtok = divide uma string em partes em funo
98 // do caractere desejado. Neste caso vamos
99 // dividir a string sempre que encontrarmos
100 // o delimitador (;)
101
102
103 //== leitura do campo cdigo (RA)
104 strcpy(campo,strtok(tmp,;\r\n));
105 reg[*n].codigo = atoi(campo); //converter para inteiro
106
107 //== leitura do campo nome
108 strcpy(campo,strtok(NULL,;\r\n));
109 strcpy(reg[*n].nome,campo);
110
111 //== leitura do campo nota 1
112 strcpy(campo,strtok(NULL,;\r\n));
113 trocar_caractere(campo,,,.);
114 reg[*n].nota1 = atof( campo );
115
116 //== leitura do campo nota 2
117 strcpy(campo,strtok(NULL,;\r\n));
118 trocar_caractere(campo,,,.);
119 reg[*n].nota2 = atof( campo );
120
121
122 //incrementar o nmero de linhas
123 *n = *n + 1;
124 }
125
126 fclose(pArquivo);
127
128 }
129
130 //---------------------------------------------
131 //FUNO: exibir_dados
132 // Apresenta na tela o contedo do vetor de registros
133 void exibir_dados(csv reg[], int n)
134 {
135 int i = 0;
136
137 for ( i = 0; i < n; i++)
138 {
139 printf(Codigo (RA).: %i \n, reg[i].codigo);
140 printf(Nome........: %s \n, reg[i].nome);
141 printf(Nota Prova 1: %0.2f \n, reg[i].nota1);
142 printf(Nota Prova 2: %0.2f \n, reg[i].nota2);
143 printf(Media.......: %0.2f \n\n, (reg[i].nota1+reg[i].nota2)/2);
144 }
145
146 printf(Total de registros no arquivo: %i \n,n);
147
148 }
fim cdigo 5
3) Nos exerccios resolvidos da unidade anterior foi desenvolvido um programa capaz de
corrigir automaticamente gabaritos de uma prova de vestibular. O programa elabora-
do permite a leitura do gabarito oficial da prova, bem como os gabaritos dos candida-
tos. No entanto, para o correto funcionamento da aplicao necessrio que todos
os dados (dos gabaritos) sejam digitados. Para melhorar a usabilidade do programa,
vamos construir uma nova verso em que as informaes dos gabaritos sero carrega-
das a partir de dois arquivos texto:
a) gabarito_oficial.csv: contm o gabarito oficial da prova, em que as alternativas
corretas de cada questo so definidas;
b) gabaritos_candidados.csv: contm o gabarito de cada candidato da prova. Lem-
brando que alm das alternativas corretas, o gabarito de cada candidato contm
o nmero de inscrio, o nmero do RG e o nome completo do candidato.
Para demonstrar o funcionamento do programa, considere o seguinte arquivo para o ga-
barito oficial, em que a primeira informao representa o nmero da prova.
gabarito_oficial.csv
44321; d; a; b; c; b; c; a; d; d; b; e; a; e; b; e; a; d; e; a; c;
gabaritos_candidatos.csv
101;23568956;Joao da Silva;c;b;e;e;e;d;d;c;a;d;a;e;b;e;d;a;b;d;a;c
102;23802312;Carlos Antonio;c;d;c;e;d;a;d;b;b;a;c;a;a;a;a;c;d;c;e;e
103;24035668;Ana Maria;c;b;b;b;c;d;b;d;a;e;b;a;b;a;d;e;d;b;c;e
104;24269024;Marcos Felipe;b;c;d;c;a;d;d;d;a;a;d;e;c;a;a;b;e;d;d;d
106;24735736;Sandro Mendes;d;b;b;d;e;b;c;b;a;b;a;b;d;c;d;e;c;d;e;b
107;24969092;Vitor Carlos;a;d;b;b;c;a;d;a;c;d;c;e;e;e;e;e;b;c;e;d
108;25202448;Barbara Lopes;c;d;b;b;e;a;b;c;d;e;c;a;c;c;e;d;e;b;b;e
109;25435804;Thiago Silva;a;c;a;d;c;a;d;e;d;c;d;b;b;a;e;e;c;e;a;c
110;25669160;Tiago Antonio;e;d;a;a;b;b;a;a;b;b;d;b;b;b;b;b;e;b;e;b
112;26135872;Carlos Felipe;b;e;d;d;e;c;b;b;e;e;b;e;d;c;c;e;a;b;c;e
113;26369228;Maco Antonio;a;e;c;d;c;a;c;b;d;d;a;c;c;e;a;d;d;b;a;c
114;26602584;Mario Andrade;d;d;d;e;b;a;e;e;b;b;a;d;e;e;a;b;d;b;b;b
115;26835940;Fabio Santos;c;d;d;c;c;b;b;a;b;b;c;b;c;c;e;d;c;c;e;c
116;27069296;Felipe Mello;c;d;a;e;c;e;d;e;b;d;a;c;a;a;d;d;d;e;a;d
117;27302652;Catia Maria;a;b;b;e;a;d;d;d;d;a;b;c;d;c;d;d;e;c;e;b
118;27536008;Amanda Aparecida;b;e;e;b;d;b;c;a;a;e;d;e;e;b;a;d;e;b;d;d
119;27769364;Helena Silva;b;d;a;a;d;e;a;e;d;e;b;b;d;e;a;b;d;c;b;a
121;28236076;Rogerio Jose;d;c;c;c;a;b;b;c;b;d;b;c;e;a;a;b;b;b;d;e
122;28469432;Jose Carlos;c;c;e;e;b;b;b;a;a;d;e;b;c;b;b;e;b;d;a;d
123;28702788;Jose Silva;a;c;b;a;b;d;a;a;b;d;d;a;d;a;b;c;e;c;d;a
124;28936144;Roberto Carlos;a;d;b;c;a;b;b;c;e;a;b;c;e;e;e;b;d;b;b;b
125;29169500;Thais Silva;a;b;b;c;c;b;e;a;a;c;d;d;c;e;d;b;b;c;d;d
126;29402856;Salete Rosa;c;c;e;b;d;e;c;e;c;a;a;a;d;b;d;b;c;d;d;a
128;29869568;Antonio Andrade;b;b;b;b;e;e;c;b;a;c;b;a;d;c;a;c;e;e;a;e
129;30102924;Felipe Jose;b;c;a;e;a;c;a;d;a;b;e;b;a;e;d;c;e;b;a;d
130;30336280;Roselito Antonio;a;c;b;d;c;c;d;c;b;d;d;c;b;b;a;d;a;c;b;e
cdigo 6
1 /*---------------------------------------------
2 *
3 * Exemplo de uma aplicao capaz de corrigir automaticamente
U6 - Arquivos 319
110 break;
111 case 2:
112 menu_secundario(titulo_do_programa,LER GABARITOS DOS CANDIDATOS);
113 ler_gabarito_candidatos(&candidatos);
114 mensagem(OPERACAO realizada com SUCESSO!);
115 break;
116 case 3:
117 menu_secundario(titulo_do_programa,RELATORIO DOS CANDIDATOS);
118 gabarito_correcao(oficial,&candidatos);
119 exibir_resultados_candidatos(&candidatos);
120 mensagem(OPERACAO realizada com SUCESSO!);
121 break;
122 }
123
124 }while(opcao_desejada != 0);
125
126 printf(\n\n\n\n); //pular linha
127 return 0; // fim da aplicao
128 }
129
130 /*--------------------------------------------*
131 * IMPLEMENTAO DOS MTODOS (MDULOS)
132 *-------------------------------------------*/
133 void menu_principal(char *titulo_do_programa, int *opcao_desejada)
134 {
135 system(cls); //limpar as informacoes da tela
136 printf(%c,201);
137 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
138 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
139 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
140 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
141 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
142 printf(%c\n,187);
143 printf(%c %c%c %-40s %c \n,186,175,175,titulo_do_programa,186);
144 printf(%c %-40s %c \n,186,Correcao automatica de gabaritos,186);
145 printf(%c,204);
146 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
147 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
148 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
149 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
150 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
151 printf(%c\n,185);
152 printf(%c %c%c %-40s %c \n,186,175,175,MENU PRINCIPAL,186);
153 printf(%c %-43s %c \n,186, ,186);
154 printf(%c %-40s %c \n,186, [1] LER GABARITO OFICIAL ,186);
155 printf(%c %-40s %c \n,186, [2] LER GABARITOS DOS CANDIDATOS ,186);
156 printf(%c %-40s %c \n,186, [3] RELATORIO DOS CANDIDATOS ,186);
157 printf(%c %-43s %c \n,186, ,186);
158 printf(%c %-40s %c \n,186, [0] SAIR DA APLICACAO ,186);
159 printf(%c,200);
160 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
161 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
162 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
163 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
164 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
165 printf(%c\n,188);
166
167 fflush(stdin);
168 printf(\n\n);
169 printf( %s ,Selecione a opcao desejada: );
170 scanf(%i,&*opcao_desejada);
171 }
172
173 void menu_secundario(char *titulo_do_programa,char *subtitulo_do_programa)
174 {
175 system(cls); //limpar as informacoes da tela
176 printf(%c,201);
177 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
178 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
179 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
180 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
181 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
182 printf(%c\n,187);
183 printf(%c %c%c %-40s %c \n,186,175,175,titulo_do_programa,186);
184 printf(%c,200);
185 printf(%c%c%c%c%c%c%c%c%c,205,205,205,203,205,205,205,205,205,205);
186 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
187 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
188 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
189 printf(%c%c%c%c%c%c%c%c%c,205,205,205,205,205,205,205,205,205,205);
190 printf(%c\n,188);
191 printf( %c\n,186);
192 printf( %c%c%c%c>>> %s\n,200,205,205,205,subtitulo_do_programa);
193 printf(\n\n);
194 }
195
196 //---------------------------------------------
197 //FUNO: mensagem
198 // Exibe uma mensagem na tela
199 void mensagem(char *msg)
200 {
201 fflush(stdin);
202 printf(\n\n);
203 printf(>>>>INFO: %s\n,msg);
204 printf(\n\n);
205 getchar();
206 }
207 //---------------------------------------------
208 //FUNO: ler_gabarito_oficial
209 // Realize a leitura do gabarito oficial da prova.
210 void ler_gabarito_oficial(gabarito_oficial g)
211 {
212
213 //==CARREGAR ARQUIVO CONTENDO O GABARITO OFICIAL
214 FILE *pArquivo; // ponteiro para o arquivo CSV
215 pArquivo = fopen(gabarito_oficial.csv,r); //Abertura do arquivo
U6 - Arquivos 323
216
217 if ( pArquivo == NULL){
218 mensagem(Erro na abertura do arquivo.\n);
219 }else{
220 //variveis auxiliares
char linha[4096]; // varivel temporria que armazenar 1 (uma) linha do
221
arquivo
222 char campo[200]; // varivel que armazenar apenas 1 (um) campo
223 int numeroprova;
224
225 //leitura da linha contendo o gabarito oficial
226 fgets(linha,4096,pArquivo);
227
//Carregar o nmero da prova e
228
armazenar na varivel numeroprova
//A informao do nmero da prova est
229
armazenada no primeiro campo
230 //do arquivo.
231 strcpy(campo,strtok(linha,;\r\n));
232 numeroprova = atoi(campo); //converter para inteiro
233
234 printf( %c INFORMACOES SOBRE A PROVA \n,219);
235 printf( %c Numero da prova....: %i\n, 219, numeroprova);
236 printf( %c Total de questoes..: %i\n, 219, NUM_QUESTOES);
237 printf( %c\n,219);
238 printf( %c Leitura das respostas corretas\n,219);
239
240 //Leitura das questes corretas armazenadas no arquivo
241 for( int i = 0; i < NUM_QUESTOES; i++)
242 {
243 strcpy(campo,strtok(NULL,;\r\n));
244 g[0].alternativas[i].correta = *campo;
printf( %c Questao [%02i]: %c \n,219,i+1,g[0].alternativas[i].
245
correta);
246 }
247 }
248
249 }
250
251 //---------------------------------------------
252 //FUNO: ler_gabarito_candidatos
253 // Realiza a leitura dos gabaritos dos candidatos
254 // Essa funo manipula uma instruo de dados dinmica com ponteiros
255 void ler_gabarito_candidatos(gabarito_candidatos *g)
256 {
257 printf( %c INFORMACOES SOBRE A PROVA \n,219);
258 printf( %c Total de questoes ......: %i\n, 219, NUM_QUESTOES);
259
260
261 //==CARREGAR ARQUIVO CONTENDO O GABARITO DOS CANDIDATOS
262 FILE *pArquivo; // ponteiro para o arquivo CSV
263 pArquivo = fopen(gabaritos_candidatos.csv,r); //Abertura do arquivo
264
265 if ( pArquivo == NULL){
fim cdigo 6
7. QUESTES AUTOAVALIATIVAS
Os arquivos representam uma das primeiras maneiras de armazenamento persistente de
informaes nos computadores. Esse recurso precursor dos bancos de dados, e hoje em dia
ainda amplamente utilizado na elaborao de programas. As questes autoavaliativas desta
unidade foram elaboradas com base nos conceitos de arquivos. Aproveite as questes para ava-
liar seus conhecimentos.
1) Explique o termo fluxo ou stream.
5) Apresente quais comandos so utilizados para escrita e quais so utilizados para leitura de informaes em
arquivos.
8. CONSIDERAES
Chegamos ao fim do estudo desta unidade. Voc teve a oportunidade de aprender como
manipular arquivos utilizando a linguagem C. Alm disso, os exemplos demonstraram como
possvel salvar informaes em arquivos texto e binrios, bem como ler os dados armazenados.
Esse conceito importantssimo para a construo de programas.
U6 - Arquivos 329
9. REFERNCIA BIBLIOGRFICA
SCHILDT, H. C completo e total. So Paulo: Makron Books, 1997.