You are on page 1of 139

Aprendendo

a
Programar
Programando
na
Linguagem C
Para Iniciantes
Jaime Evaristo
Terceira Edio
Revisada/Ampliada
Edio Digital
(cpias autori!adas"
Aprendendo
a
Programar
Programando
na
Linguagem C
Jaime Evaristo
Professor Adjunto
Instituto de Computao
Universidade Federal de Alagoas
Aos meus netos
Mateus, itor e Lu!as
"um#rio
1 Introduo Programao................................................................................................................. 4
1.1 Organizao bsica de um computador..................................................................................... 4
1.2 Linguagem de mquina..............................................................................................................4
1.3 Programas de computadores......................................................................................................
1.4 L!gica de programao.............................................................................................................."
1. #eso$uo de prob$emas............................................................................................................ "
1." Processador de um a$goritmo.....................................................................................................%
1.& '(emp$os de a$goritmos matemticos..................................................................................... 1)
1.* Linguagens de a$to n+,e$.......................................................................................................... 13
1.% -inta(e e sem.ntica de uma instruo..................................................................................... 14
1.1) -istemas de computao........................................................................................................ 14
1.11 '(erc+cios propostos.............................................................................................................. 1
2. Introduo Linguagem /............................................................................................................. 1&
2.1 0ari,eis simp$es..................................................................................................................... 1&
2.2 /onstantes................................................................................................................................ 1*
2.3 '(press1es aritm2ticas............................................................................................................. 1%
2.4 #e$a1es................................................................................................................................... 2)
2. '(press1es $!gicas................................................................................................................... 2)
2." 'strutura de um programa em /.............................................................................................. 21
2.& 'ntrada dos dados de entrada...................................................................................................21
2.* -a+da de dados......................................................................................................................... 23
2.% /omando de atribuio............................................................................................................ 2*
2.1) '(emp$os Parte I.................................................................................................................... 3)
2.11 3un1es de bib$ioteca.............................................................................................................33
2.12 '(erc+cios propostos.............................................................................................................. 34
3 'struturas de se$eo....................................................................................................................... 3"
3.1 O que 2 uma estrutura de se$eo.............................................................................................3"
3.2 O comando i4........................................................................................................................... 3"
3.3 O comando i4 e$se.................................................................................................................... 3&
3.4 O operador condiciona$ ternrio.............................................................................................. 3*
3. '(emp$os Parte II.....................................................................................................................3*
3." O comando s5itc6................................................................................................................... 44
3.& '(emp$os Parte III................................................................................................................... 4
3.* '(erc+cios propostos................................................................................................................ 4&
4. 'struturas de repetio................................................................................................................... 4%
4.1 Para que ser,em as estruturas de repetio..............................................................................4%
4.2 O comando 4or......................................................................................................................... )
4.3 O comando 56i$e..................................................................................................................... 2
4.4 O comando do 56i$e................................................................................................................ "
4. O comando brea7 em estruturas de repetio.......................................................................... &
4." '(emp$os Parte I0................................................................................................................... *
4.& '(erc+cios propostos................................................................................................................ "3
. 3un1es e ponteiros........................................................................................................................ "
.1 O que so 4un1es.................................................................................................................... "
.2 Para que ser,em 4un1es.........................................................................................................."&
.3 Passagem de par.metros.......................................................................................................... "*
.4 Ponteiros.................................................................................................................................. &2
. Passagem de par.metros por re4er8ncia no 9urbo / 2.)1....................................................... &3
." :ma urna e$etr;nica................................................................................................................. &3
.& #ecursi,idade...........................................................................................................................&
.* :sando 4un1es de outros arqui,os......................................................................................... &%
.% <9ipos< de ,ari,eis................................................................................................................. *)
.1) :ma ap$icao =ist!ria da >atemtica.............................................................................. *2
.11 '(erc+cios propostos.............................................................................................................. *3
" 0etores.............................................................................................................................................*4
".1 O que so ,etores..................................................................................................................... *4
".2 ?ec$arao de um ,etor unidimensiona$..................................................................................*4
".3 0etores e ponteiros.................................................................................................................. *
".4 Lendo e escre,endo um ,etor.................................................................................................. *
". '(emp$os Parte I0................................................................................................................... *"
"." 0etores mu$tidimensionais...................................................................................................... %)
".& '(emp$os Parte 0.................................................................................................................... %2
".* :ma ap$icao esporti,a.......................................................................................................... %4
".% '(erc+cios propostos................................................................................................................ %
& Pesquisa e ordenao....................................................................................................................... %%
&.1 Introduo................................................................................................................................ %%
&.2 Pesquisa sequencia$..................................................................................................................%%
&.3 Pesquisa binria....................................................................................................................... %%
&.4 Ordenao.............................................................................................................................. 1)1
&. '(erc+cios propostos.............................................................................................................. 1)3
*. /adeias de caracteres @stringsA..................................................................................................... 1)4
*.1 Introduo.............................................................................................................................. 1)4
*.2 3un1es de bib$ioteca para manipu$ao de cadeias de caracteres........................................ 1)
*.3 '(emp$os Parte 0I................................................................................................................. 1)&
*.4 '(erc+cios propostos.............................................................................................................. 111
% 'struturas e Brqui,os.................................................................................................................... 113
%.1 O que so estruturas............................................................................................................... 113
%.2 '(emp$os Parte 0II................................................................................................................114
%.3 O que so arqui,os.................................................................................................................11"
%.4 Brqui,os de registros @Brqui,os binriosA.............................................................................11&
%. Brqui,o te(to......................................................................................................................... 12"
%." '(erc+cios propostos.............................................................................................................. 13)
1) Co1es bsicas de a$ocao din.mica de mem!ria .................................................................... 132
1).1 O que 2 a$ocao din.mica.................................................................................................. 132
1).2 Brmazenando dinamicamente um po$in;mio...................................................................... 133
1).3 Listas.................................................................................................................................... 134
1).4 '(erc+cios propostos............................................................................................................ 13"
Dib$iogra4ia....................................................................................................................................... 13&
Endice remissi,o................................................................................................................................13*
$ Introduo % Programao
$&$ 'rgani(ao )#si!a de um !omputador
:m computador 2 constitu+do de quatro unidades bsicasF unidade de entradaG unidade de sadaG
unidade de processamento central e memria. /omo indica sua denominaoG uma unidade de entrada 2 um
dispositi,o que permite que o usurio interaHa com o computadorG 4ornecendoI$6e dados e in4orma1es que
sero processadasG sendo o teclado o seu e(emp$o mais tri,ia$. :ma unidade de sadaG por seu turnoG ser,e
para que seHam 4ornecidos ao usurio do computador os resu$tados do processamento rea$izado. O monitor
de vdeo e uma impressora so e(emp$os de unidades de sa+da. B unidade central de processamento 2
respons,e$ por todo o processamento requeridoG sendo muito con6ecida por cpuG acrossemia de central
processing unit. J a memria armazena dados e in4orma1es que sero uti$izados no processamentoG
armazenamento temporrioG pois quando o computador 2 des$igado tudo que est ne$a armazenado dei(a de
s8I$o @dizemos que toda a mem!ria 2 <apagada<A.
$&* Linguagem de m#+uina
Linguagens de !omuni!ao
',identementeG 6 a necessidade de que as unidades que comp1em um computador se comuniquem
umas com as outra. Por e(emp$oG um dado 4ornecido pe$o tec$ado de,e ser armazenado na mem!riaK para a
cpu rea$izar uma operao aritm2ticaG e$a ,ai LbuscarM ,a$ores que esto armazenados na mem!riaG e assim
por diante. Para que 6aHa comunicao entre as unidades do computador 2 necessrio que se estabe$ea uma
linguagem.
Os seres 6umanos se comunicam basicamente atra,2s de duas $inguagensF a $inguagem escrita e a 4a$a.
:ma comunicao atra,2s de uma $inguagem escrita 2 constitu+da de pargrafosG os quais cont8m perodosG
que cont8m frases, que so constitu+das de palavrasG sendo cada uma das pa$a,ras 4ormadas por letras e esta
sequ8ncia termina a+. BssimG uma letra 2 um ente indi,is+,e$ da $inguagem escrita eG em 4uno distoG 2
c6amada smbolo bsico desta $inguagem. 'ste e(emp$o 4oi apresentado para que se Husti4ique a a4irmao
de que toda $inguagem requer a e(ist8ncia de smbolos bsicos, como I e para mais um e(emp$o I os
fonemas para a $inguagem 4a$ada.
A linguagem de !omuni!ao entre as unidades
/omo a comunicao entre as unidades do computador teria que ser obtida atra,2s de 4en;menos
4+sicosG os cientistas que conceberam os computadores atuais estabe$eceram dois s+mbo$os bsicos para a
$inguagem. 'sta quantidade de s+mbo$os 4oi esco$6ida pe$o 4ato de que atra,2s de 4en;menos 4+sicos 2 muito
4ci$ obter dois estados distintos e no con4und+,eisG como passar corrente e$2tricaNno passar corrente
e$2tricaG estar magnetizadoNno estar magnetizadoG etc.G podendo cada um destes estados ser um dos
s+mbo$os. Bssim a $inguagem uti$izada para comunicao interna num computadorG c6amada linguagem de
mquinaG possui apenas dois s+mbo$os. /ada um destes s+mbo$os 2 denominado bit @binary digitA e e$es so
representados por ) @zeroA e 1 @umA. 'sta 4orma de representar os bit's Husti4ica a sua denominaoF binary
digitG que signi4ica d+gito binrio @a$2m distoG bit em ing$8s signi4ica 4ragmentoA. PortantoG as palavras da
$inguagem de mquina so sequ8ncias de bitsG ou seHaG sequ8ncias de d+gitos zero e um.
' !,digo A"CII
Para que 6aHa a possibi$idade da comunicao do 6omem com o computadorG 2 necessrio que as
pa$a,ras da $inguagem escrita seHam traduzidas para a $inguagem de mquina e ,iceI,ersa. Para que isto seHa
poss+,e$G 2 necessrio que se estabe$ea qua$ a sequ8ncia de bitOs que corresponde a cada caractere usado na
$inguagem escrita. Ou seHaG 2 necessrio que se estabe$ea uma codi4icao em sequ8ncia de bitOs para cada
um dos caracteres. :ma codi4icao muito uti$izada 2 o cdigo ASCII @American Standard Code for
Information Interchange ou Cdigo adr!o Americano para Interc"mbio de Informa#$esAG estabe$ecido pe$o
A%SI @American %ational Standards InstituteA. Cesta codi4icaoG cada caractere 2 representado por uma
sequ8ncia de oito bits @norma$menteG um conHunto de oito bitOs 2 c6amado byteA. -! para e(emp$i4icar @ser
,isto ao $ongo do $i,ro queG em gera$G no 6 necessidade de que se con6ea os c!digos dos caracteresAG
apresentamos a tabe$a abai(o com os c!digos B-/II de a$guns caracteres.
Tabela 1 Cdigos ASCII de alguns caracteres
/aractere /!digo B-/II
'spao em branco ))1)))))
P ))1))))1
< ))1)))1)
. . . . . .
) ))11))))
1 ))11)))1
. . . . . .
B )1)))))1
D )1))))1)
. . . . . .
Q )1)11)1)
. . . . . .
a )11))))1
. . . . ..
Obser,e a necessidade de se 6a,er codi4icado o espa#o em branco @este <caractere< 2 uti$izado para
separar nossas pa$a,rasA e de se 6a,er codi4icado di4erentemente as $etras maiuscu$as e minRscu$asG para que
se possa considerI$as como coisas distintas.
Le,ando em conta que cada sequ8ncia de zeros e uns pode ser ,ista como a representao de um
nRmero inteiro no sistema binrio de numera#!o S',aristoG J 2))2TG podemosG at2 para 4aci$itar a sua
manipu$aoG associar a cada c!digo B-/II o inteiro correspondenteG obtendo assim o que se costuma
c6amar de cdigo ASCII decimal. Por e(emp$oG como 1)))))1 2 a representao do nRmero @decima$A " no
sistema binrio de numeraoG dizemos que o cdigo ASCII decimal de B 2 ".
$&- Programas de !omputadores
Para que um computador ten6a a$guma uti$idadeG e$e de,e e(ecutar um programa que ten6a uma
4ina$idade espec+4ica. &ames so programas que t8m como obHeti,o propiciar entretenimento aos seus
usurios. rocessadores de te'to so programas que permitem que te(tos seHam digitadosG impressos e
armazenados para 4uturas modi4ica1es ou impress1es. lanilhas eletr(nicas so programas que o4erecem
recursos para manipu$ao de tabe$as de ,a$ores num2ricos. %avegadores permitem acessos a pginas da
internetG a rede mundia$ de computadores. 'stes programas destinamIse a usurios finaisG aque$as pessoas
que ,o uti$izar o computador com um determinado obHeti,o espec+4icoG usando para ta$ um programa que
e$a aprendeu a usarG no tendo nen6uma preocupao re$ati,a ao 4uncionamento interno do sistema
computadorNprograma. Por e(emp$oG um usurio de um processador de te(to de,e aprender o que 4azer para
que o processador destaque em negrito a$guma parte do te(to ou $oca$ize uma pa$a,raG no 6a,endo
necessidade de saber como o programa rea$iza estas a1es.
Ca ,erdadeG para que um processador de te(to propicie ao usurio a possibi$idade de que te(tos seHam
digitadosG corrigidosG gra,adosG inseridos em outros te(tos e de que pa$a,ras seHam $oca$izadas dentro de um
te(toG 2 necessria a e(ecuo de muitas instru1es com obHeti,os bem mais espec+4icos e restritos. :m
programa de computador 2G na rea$idadeG um conHunto de instru1es que podem ser e(ecutadas pe$o
computadorG de ta$ 4orma que a e(ecuo de subconHuntos destas instru1es permitem a rea$izao de a1es
mais gen2ricas.
U muito grande o nRmero de instru1es dos programas citados acimaG c6egando casa dos mi$6ares.
#igorosamente 4a$andoG um programa dos acima citados so conHunto de programas menoresG cada um de$es
com obHeti,os mais restritosG e que podem ser e(ecutados de 4orma integrada. U comum se uti$izar a pa$a,ra
ing$esa soft)are para designar um conHunto de programas com obHeti,os mais restritos queG sendo e(ecutados
de 4orma integradaG propiciam a e(ecuo de a1es bem mais gen2ricas.
B parte da /i8ncia da /omputao que trata do desen,o$,imento de soft)ares 2 denominada
*ngenharia de Soft)are. Catura$menteG o estudo da *ngenharia de Soft)are de,e ser precedido da
aprendizagem do desen,o$,imento de programas LmenoresMG ao que comumente 2 denominada de
rograma#!o de Computadores.
$&. L,gi!a de programao
-endo um conHunto de instru1es cuHas e(ecu1es redundam na rea$izao da tare4a para a qua$ 4oi
desen,o$,idoG o desen,o$,imento de um programa requer a uti$izao de um racioc+nio +mpar em re$ao aos
racioc+nios uti$izados na so$uo de prob$emas de outros campos do saber. Por e(emp$o @e de 4orma
simp$i4icadaA ao se tentar reso$,er um prob$ema de >ec.nica Ce5toniana de,eIse procurar capturar da
especi4icao da questo as grandezas 4+sicas en,o$,idas e ap$icar as 4!rmu$as que re$acionam estas
grandezas.
Para se desen,o$,er um programa que reso$,a um determinado prob$ema 2 necessrio que
encontremos uma sequ8ncia de instru1es que cuHas e(ecu1es resu$tem na so$uo da questo. U comum se
uti$izar a termo algoritmo para indicar uma sequ8ncia de instru1es que reso$,em um dado prob$emaG
4icandoG neste casoG o termo programa para indicar um a$goritmo que pode ser e(ecutado num computador.
B +gica de rograma#!o pode ser entendida como o conHunto de racioc+nios uti$izados para o
desen,o$,imento de a$goritmos @eG portantoG de programasA.
Por e(emp$oG imagine a seguinte questoF um sen6orG in4e$izmente bastante gordoG est numa das
margens de um rio com uma raposaG uma dRzia de ga$in6as e um saco de mi$6o. O sen6or pretende atra,essar
o rio com suas cargasG num barco a remo que s! comporta o sen6or e uma das cargas. ',identementeG o
sen6or no pode dei(ar em uma das margensG sozin6osG a raposa e a ga$in6aG nem a ga$in6a e o mi$6o. B
questo 2 escre,er um a$goritmo que oriente o sen6or a rea$izar o seu intento. Catura$menteG na primeira
,iagemG e$e no pode $e,ar a raposa @neste casoG as ga$in6as comeriam o mi$6oAG nem o mi$6o @caso em que a
raposa de,oraria as ga$in6asA. LogoG na primeira ,iagem e$e de,e $e,ar as ga$in6as. /omo e$e estar presente
na c6egadaG na segunda ,iagem e$e pode $e,ar a raposa ou o mi$6o. >asG e a ,o$ta para apan6ar terceira
cargaV B so$uo 2 e$e ,o$tar com as ga$in6as eG a+G atra,essar o mi$6oG H que no 6 prob$ema em que a
raposa e o mi$6o 4iquem Huntos. 'scre,endo as instru1es na sequ8ncia em que e$as de,em ser e(ecutadasG
teremos o seguinte a$goritmo.
1. Btra,esse as ga$in6as.
2. #etorne sozin6o.
3. Btra,esse a raposa.
4. #etorne com as ga$in6as.
. Btra,esse o mi$6o.
". #etorne sozin6o.
&. Btra,esse as ga$in6as.
$&/ 0esoluo de pro)lemas
:ma pergunta que o $eitor pode estar se 4azendo 2F como ,ou <descobrir< que a primeira instruo
de,e ser a tra,essia das ga$in6asV
B$gumas tare4as para as quais se pretende escre,er um a$goritmo podem ser ,istas como um prob$ema
a ser reso$,ido. O e(emp$o anterior 2 um e(emp$o c$aro de uma tare4a com esta caracter+stica. '(istem
a$gumas t2cnicas que podem ser uti$izadas para a reso$uo de prob$emas. Co e(emp$o anteriorG para se
de4inir qua$ seria a primeira instruoG como e(istem apenas tr8s possibi$idadesG ,eri4icaIse o que aconteceria
ao se esco$6er determinada instruo. 3oi o queG de passagemG 4oi 4eito acimaF se o 6omem atra,essasse
primeiro o mi$6oG a raposa de,oraria as ga$in6asK se o 6omem atra,essasse primeiro a raposaG as ga$in6as
comeriam o mi$6o. Ceste casoG podemos dizer que 4oi uti$izada a t2cnica da e(austoF como o nRmero de
a$ternati,as era pequenoG ana$isamos todas e$asG uma a uma.
'sta t2cnica pode ser uti$izada tamb2m na so$uo do seguinte prob$emaF disp1eIse de tr8s es4eras
id8nticas na 4ormaG sendo duas de$as de mesmo peso e a terceira de peso maior. B questo 2 descobrir qua$ a
es4era de peso di4erenteG rea$izandoIse apenas uma pesagem numa ba$ana de dois pratos. Para isto
c6amemos de B e D as es4eras de mesmo peso e de / a de maior peso. -e optarmos por co$ocar duas es4eras
num dos pratos e a outra es4era no outroG temos as seguintes possibi$idadesF
aA @BWDG /A.
bA @BW/G DA.
cA @DW/G BA.
Co primeiro casoG pode acontecer qua$quer coisaF a ba$ana pode 4icar equi$ibradaG se Peso@/A X
Peso@BWDAK 4icar inc$inada para o $ado esquerdoG se Peso@/A Y Peso@BWDA ou 4icar inc$inada para o $ado
direito se Peso@/A Z Peso@BWDA. Obser,e que nada pode distinguir a es4era /. Cos dois R$timos casosG a
ba$ana se inc$inar para a esquerdaG masG outra ,ezG nada distingue a es4era /. Por e(austoG resta ento
esco$6ermos duas es4eras e co$ocarmos cada uma de$as num dos pratos da ba$ana. Bgora os casos poss+,eis
soF
aA @BG DA.
bA @BG /A.
cA @DG /A.
Co primeiro casoG a ba$ana 4icar equi$ibradaG o que indica que a mais pesada 2 aque$a no esco$6idaK
nos outros dois casosG a ba$ana se inc$inar para a direitaG indicando que a es4era mais pesada 2 aque$a que
ocupa o prato respecti,o. 9emos ento o seguinte a$goritmoF
1. 'sco$6a duas es4eras.
2. /o$oque cada uma das es4eras esco$6idas num dos pratos da ba$ana.
3. -e a ba$ana 4icar equi$ibradaG 4ornea como resposta a es4era no esco$6idaK caso contrrioG 4ornea
como resposta a es4era do prato que est num n+,e$ mais bai(o.
:ma outra t2cnica de reso$uo de prob$emas consiste em se tentar reso$,er casos particu$ares da
questo ou reso$,er a questo para dados menores do que os dados que 4oram 4i(ados. Para e(emp$i4icarG
consideremos a seguinte questoF como obter e(atamente 4 $itros de gua dispondo de dois recipientes com
capacidades de 3 $itros e $itros
1
V /omo 4 X 3 W 1 ou 4 X [ 1 conseguiremos reso$,er a questo se
conseguirmos obter 1 $itro. >as isto 2 4ci$G pois 1 X 3 W 3 [ P 9emos ento o seguinte a$goritmoF
1. 'nc6a o recipiente de 3 $itros.
2. 9rans4ira o conteRdo do recipiente de 3 $itros para o recipiente de $itros.
3. 'nc6a o recipiente de 3 $itros.
4. /om o conteRdo do recipiente de 3 $itrosG comp$ete o recipiente de $itros.
. 's,azie o recipiente de $itros.
". 9rans4ira o conteRdo do recipiente de tr8s $itros para o recipiente de $itros.
&. 'nc6a o recipiente de 3 $itros.
*. 9rans4ira o conteRdo do recipiente de 3 $itros para o recipiente de $itros.
Para compreender o a$goritmoG seHam B e D os recipientes de 3 $itros e de $itrosG respecti,amenteG e
indiquemos por @\G nA o 4ato de o recipiente , conter n $itros de gua. Co in+cio temos @BG )A e @DG )A eG ap!s
a e(ecuo de cada instruoG teremosF
1. @BG 3AG @DG )A.
2. @BG )AG @DG 3A.
3. @BG 3AG @DG 3A.
4. @BG 1AG @DG A.
1
B so$uo desta questo 4oi necessria num 4i$me da s2rie ?uro de >atar para o protagonista desati,ar uma bomba.
. @BG 1AG @DG )A.
". @BG )AG @DG 1A.
&. @BG 3AG @DG 1A.
*. @BG )AG @DG 4A.
Outras quest1es que podem ser $e,antadas soF 6 outras so$u1esV '(iste a$guma so$uo que rea$ize
a mesma tare4a com uma quantidade menor de instru1esV Para responder a estas quest1es ta$,ez seHa
interessante $embrar que 4 X [ 1. -igni4ica queG se conseguirmos tirar 1 $itro do recipiente de $itros
quando e$e esti,er c6eioG reso$,eremos a questo. Para conseguir istoG basta que o recipiente de 3 $itros
conten6a 2 $itros. ' para se obter 2 $itrosV B+ basta ,er que 2 X [ 3. Podemos ento reso$,er a questo com
o seguinte a$goritmoG constitu+do de apenas seis instru1esF
1. 'nc6a o recipiente de $itros.
2. /om o conteRdo do recipiente de $itrosG enc6a o de 3 $itros.
3. 's,azie o recipiente de 3 $itros.
4. 9rans4ira o conteRdo do recipiente de $itros para o recipiente de 3 $itros.
. 'nc6a o recipiente de $itros.
". /om o conteRdo do recipiente de $itrosG comp$ete o recipiente de 3 $itros.
Bp!s a e(ecuo de cada uma das instru1es teremosF
1. @BG )AG @DG A.
2. @BG 3AG @DG 2A.
3. @BG )AG @DG 2A.
4. @BG 2AG @DG )A.
. @BG 2AG @DG A.
". @BG 3AG @DG 4A.
:ma outra t2cnica bastante uti$izada 2 se tentar raciocinar a partir de uma so$uo con6ecida de uma
outra questo. Para compreender isto considere as duas seguintes quest1esF imagine uma re$ao de n
nRmerosG os quais podem ser re4erenciados por a
i
com i X 1G 2G ...G n e queiramos somI$os com a restrio de
que s! sabemos e4etuar somas de duas parce$as. Para reso$,er esta questoG podemos pensar em casos
particu$aresF se n X 2G basta somar os dois nRmerosK se n X 3G basta somar os dois primeiros e somar esta
soma com o terceiro. Catura$mente este racioc+nio pode ser reproduzido para n Y 3. B questo 2 que a soma
dos dois primeiros de,e estar <guardada< para que se possa somI$a com o terceiroG obtendoIse a soma dos
tr8s primeirosK esta soma de,e ser <guardada< para que seHa somada com o quarto e assim sucessi,amente.
Para isto podemos estabe$ecer uma refer-ncia soma <atua$<G a qua$ ser a$terada quando a soma com o
e$emento seguinte 4or e4etuada. Bt2 para somar os dois primeirosG podeIse pensar em somar <a soma do
primeiro< com o segundo.
9emos ento o seguinte a$goritmoF
1. 3aa i X 1.
2. 3aa -oma X a
1
.
3. #epita n [ 1 ,ezes as instru1es 3.1 e 3.2.
3.1. -ubstitua i por i W 1.
3.2. -ubstitua -oma por -oma W a
i
.
Por e(emp$oF se n X e a
1
X *G a
2
X 4G a
3
X %G a
4
X 13 e a

X &G a e(ecuo do a$goritmo resu$taria nas


seguintes a1esF
1. i X 1.
2. -oma X *.
3.1.1. i X 2.
3.2.1. -oma X * W 4 X 12
3.1.2. i X 3.
3.2.2. -oma X 12 W % X 21.
3.1.3. i X 4.
3.2.3. -oma X 21 W 13 X 34.
3.1.4. i X .
3.2.4. -oma X 34 W & X 41.
Catura$menteG na e(ecuo acima estamos indicando por 3.1.( e 3.2.( a e(ecuo de ordem ( das
instru1es 3.1 e 3.2.
/omo ,eremos ao $ongo do $i,roG este a$goritmo 2 bastante uti$izado em programaoG sendo mais
comum at2 o primeiro termo da re$ao ser <somado< dentro da repetio. Ceste casoG para que o primeiro
seHa somadoG 2 necessrio que Soma seHa iniciali.ado com ) @zeroAG 4icando assim o a$goritmoF
1. 3aa i X ).
2. 3aa -oma X ).
3. #epita n ,ezes as instru1es 3.1 e 3.2.
3.1. -ubstitua i por i W 1.
3.2. -ubstitua -oma por -oma W a
i
.
/on6ecendo este a$goritmoG 2 4ci$ ento reso$,er a questo de se ca$cu$ar o produto de n nRmeros nas
mesmas condi1esG e a+ ,emos como uti$izar uma so$uo con6ecida para reso$,er um prob$ema. ?e,eIse
inicia$izar uma re4er8ncia roduto com 1 eG numa repetioG mu$tip$icar os nRmeros como 4oi 4eito no caso
da somaF
1. 3aa i X ).
2. 3aa Produto X 1.
3. #epita n ,ezes as instru1es 3.1 e 3.2.
3.1. -ubstitua i por i W 1.
3.2. -ubstitua Produto por Produto ( a
i
.

$&1 Pro!essador de um algoritmo
Ob,iamenteG um a$goritmo de,e ser e(ecutado por a$gum agente. 'ste agente pode ser uma pessoa
munida de certos equipamentos e utens+$ios ou por mquinas proHetadas para e(ecutar automaticamente
a$gumas instru1es bsicas. O a$goritmo para a tra,essia do sen6or gordo com as ga$in6asG sua raposa e seu
saco de mi$6o seria e(ecutado pe$o ta$ sen6orG que esta,a para ta$ munido do barco e de remos. O a$goritmo
para obteno de quatro $itros de gua a partir de recipientes de conteRdos cinco $itros e tr8s $itros poderia ser
e(ecutado por uma pessoa que dispusesse dos dois recipientes e de gua em abund.ncia. Ceste R$timo casoG
quem sabeG a pessoa poderia ser substitu+da por um rob;.
O agente que e(ecuta um a$goritmo 2 c6amado processador e 2 e,idente que para que o a$goritmo seHa
e(ecutado 2 necessrio que o processador seHa capaz de e(ecutar cada uma das suas instru1es. -e o sen6or
gordo no souber remar e$e no ser capaz de atra,essar o rio. :ma pessoa que no seHa capaz de es,aziar
um recipiente que pese cinco qui$os no ser capaz de e(ecutar o a$goritmo dos quatro $itros de gua.
B$guns autores de $i,ros com obHeti,os id8nticos a este I 4aci$itar a aprendizagem da programao de
computadores I iniciam seus te(tos discorrendo e(c$usi,amente sobre resolu#!o de problemasG encarando o
processador como uma <cai(a preta< que recebe as instru1es 4ormu$adas pe$o a$goritmo e 4ornece a so$uo
do prob$emaG no $e,ando em conta o processador quando da 4ormu$ao do ta$ a$goritmo. 'ntendemos que
esta no 2 a me$6or abordagemG ,isto que o con6ecimento do que o processador pode e(ecutar pode ser
de4inidor na e$aborao do a$goritmo. Por e(emp$oF imagine que queiramos e$aborar um a$goritmo para
e(trair o a$garismo da casa das unidades de um inteiro dado @apresentaremos posteriormente uma questo
bastante prtica cuHa so$uo depende deste a$goritmoA. ',identementeG o a$goritmo para reso$,er esta
LgrandeM questo depende do processador que ,ai e(ecutI$o. -e o processador 4or um ser 6umano que saiba
o que 2 nRmero inteiroG a$garismo e casa das unidadesG o a$goritmo teria uma Rnica instruoF
1. 3ornea o a$garismo das unidades do inteiro dado.
Por2mG se o processador 4or um ser 6umano que saiba o que 2 nRmero inteiro e a$garismoG mas no
saiba o que 2 casa das unidadesG o a$goritmo no poderia ser mais esse. Ceste casoG para reso$,er a questoG o
processador de,eria con6ecer mais a$guma coisaG comoG por e(emp$oG ter a noo de <mais direita<G 4icando
o a$goritmo agora comoF
1. 3ornea o a$garismo <mais direita< do nRmero dado.
' se o processador 2 uma mquina e no sabe o que 2 a$garismoG casa das unidadesG <mais direita<G
etc.V Cesta 6ip!teseG quem est e$aborando o a$goritmo de,eria con6ecer que instru1es o processador 2
capaz de e(ecutar para poder escre,er o seu a$goritmo. Por e(emp$oG se a mquina 2 capaz de determinar o
resto de uma di,iso inteiraG o a$goritmo poderia serF
1. /6ame de n o inteiro dadoK
2. /a$cu$e o resto da di,iso de n por 1)K
3. 3ornea este resto como o a$garismo pedido.
B$gumas das quest1es anteriores so importantes para se desen,o$,er o racioc+nioG mas no 2 este tipo
de questo que se pretende discutir ao $ongo deste $i,ro. 'stamos interessados em a$goritmos paraF
1. #eso$,er prob$emas matemticosG como a$goritmos para determinar a m2dia aritm2tica de ,rios
nRmeros dadosG determinar as ra+zes de uma equao do segundo grauG encontrar o m(imo di,isor comum
de dois nRmeros dadosG tota$izar as co$unas de uma tabe$aG etc.
2. #eso$,er quest1es gen2ricasG como a$goritmos para co$ocar em ordem a$4ab2tica uma re$ao de
nomes de pessoasG atua$izar o sa$do de uma conta bancria na qua$ se 4ez um dep!sitoG corrigir pro,as de um
teste de mR$tip$a esco$6aG cadastrar um no,o usurio de uma $ocadoraG etc..
Ca $inguagem co$oquia$G o a$goritmo para o c$cu$o da m2dia pode ser escrito de 4orma muito simp$esF
1. ?etermine a quantidade de nRmerosK
2. -ome os nRmeros dadosK
3. ?i,ida esta soma pe$a quantidade de nRmeros.
]ua$quer pessoa que saiba contarG somar e di,idir nRmeros 2 capaz de e(ecutar este a$goritmo
dispondo apenas de $pis e pape$. B questo que se p1e 2F e se a re$ao conti,er 13.42" nRmerosV B ta$
pessoa 2 capaz de e(ecutarG por2mG quanto tempo $e,ar para 4az8I$oV
:m outro aspecto a ser obser,ado 2 que nem sempre a $inguagem co$oquia$ 2 e4iciente para se
escre,erem as instru1es. Cessa $inguagem o a$goritmo para determinao das ra+zes de uma equao do
segundo grau teria uma instruo di4+ci$ de escre,er e di4+ci$ de compreender comoF
n. -ubtraia do quadrado do segundo coe4iciente o produto do nRmero quatro pe$o produto dos dois
outros coe4icientes.
Isto pode ser parcia$mente reso$,ido uti$izandoIse uma $inguagem pr!(ima da $inguagem matemtica
que H 4oi uti$izada em e(emp$os da seo anterior. Co caso da equao do segundo grau ter+amos o seguinte
a$goritmoG que nos 2 ensinado nas R$timas s2ries do ensino 4undamenta$F
1. /6ame de aG b e c os coe4icientes da equao.
2. /a$cu$e d X b^ I 4ac.
3. -e d Z ) 4ornea como resposta a mensagemF B equao no possui ra+zes reais.
4. -e d _ )
4.1 /a$cu$e (
1
X @Ib W raiz@dAAN2a e (
2
X @Ib I raiz@dAAN2a.
4.2 3ornea (
1
e (
2
como ra+zes da equao.
?e maneira mais ou menos e,identeG rai./d0 est representando a raiz quadrada de d e a e(ecuo
deste a$goritmo requer que o processador seHa capaz de determinar ,a$ores de e(press1es aritm2ticasG ca$cu$ar
ra+zes quadradasG e4etuar compara1es e que con6ea a $inguagem matemtica.
B$goritmos para prob$emas gen2ricos so mais comp$icados e as $inguagens uti$izadas anteriormente
no so adequadas @para o caso da ordenao de uma re$ao de nomesG 4oram desen,o$,idos ,rios
a$goritmos e teremos oportunidade de discutir a$guns de$es ao $ongo deste $i,roA.
$&2 E3emplos de algoritmos matem#ti!os
Para uma primeira discusso em termos de aprendizagem de desen,o$,imento de a$goritmos e
uti$izando a $inguagem usada no e(emp$o da equao do segundo grauG apresentamos a seguir a$guns
e(emp$os de a$goritmos que obHeti,am a so$uo de quest1es da matemtica. Para e$es supomos que o
processador seHa capaz de e4etuar somasG subtra1es e di,is1es decimaisG de rea$izar compara1esG de repetir
a e(ecuo de um conHunto de instru1es um nRmero determinado de ,ezes ou enquanto uma condio seHa
atendida.
$& Co e(emp$o do a$goritmo para obteno do a$garismo da casa das unidades de um inteiro dado
supomos que o processador seria capaz de ca$cu$ar o resto de uma di,iso inteira. Obser,ando que no est
suposto que o nosso processador seHa capaz de determinar restos de di,is1es inteirasG ,amos discutir um
a$goritmo para a determinao do quociente e do resto da di,iso de dois inteiros positi,os dados. Por
e(emp$oF se o di,idendo 4or 3) e o di,isor 4or &G o a$goritmo de,e 4ornecer os ,a$ores 4 para o quociente e 2
para o resto. 3omos ensinados queG para determinar o quocienteG de,er+amosG por tentati,aG encontrar o
nRmero que mu$tip$icado pe$o di,isor resu$tasse no maior nRmero menor que o di,idendo. Co e(emp$o
num2rico citadoG poder+amos tentar o e ter+amos (& X 3 que 2 maior que 3)K tentar+amos o 3 obtendo
3(& X 21 que ta$,ez seHa pequeno demais em re$ao ao 3)K a+ tentar+amos o 4 obtendo 4(& X 2*G
encontrando ento o quociente 4. :m a$goritmo para so$ucionar esta questo poderia serF
1. /6ame de ?1 e ?2 o di,idendo e o di,isor dados.
2. 3aa I X 1.
3. repita 3.1 at2 I(?2 Y ?1.
3.1. -ubstitua I por I W 1.
4. /a$cu$e ] X I [ 1.
. /a$cu$e # X ?1 I ](?2.
". 3ornea # para o resto e ] para o quociente pedidos.
Co e(emp$o num2rico propostoG ter+amos a seguinte tabe$a com os ,a$ores obtidos durante a e(ecuo
do a$goritmoF
?1 ?2 I ](I ] #
3) &
1 &
2 14
3 21
4 2*
3
4 2
*& O a$goritmo abai(o determina o menor di,isor maior que 1 de um inteiro dado. B ideia 2 ,eri4icar
se d X 2 2 di,isor eG no sendoG ,eri4icar se 3 ou 4 ou G etcG 2 di,isor. B procura por um di,isor ,ai at2 que
um di,isor seHa encontrado. Catura$menteG uti$izando o a$goritmo anteriorG o nosso processador agora sabe
determinar o resto da di,iso inteira de um inteiro ( por outro inteiro ` no nu$o. Isto ser indicado por
#esto@(G `A. Para encontrar um di,isor de n basta encontrar um inteiro d ta$ que #esto@nG dA X ).
1. /6ame de C o inteiro dado.
2. 3aa ? X 2.
3. #epita 3.1 enquanto #esto@CG ?A )
3.1 -ubstitua ? por ? W 1
4. 3ornea ? para o di,isor procurado.
-& /omo se depreende 4aci$mente da sua denominaoG o m'imo divisor comum @mdcA de dois
nRmeros dados 2 o maior nRmero que os di,ide. Bntes o mdc s! era uti$izado para simp$i4ica1es de 4ra1es
ordinriasK atua$mente e$e 2 uti$izado na determinao de chaves p1blicas para sistemas de criptogra4ia #-B
S',aristoG JG 2))2T. Por e(emp$oG mdc@"4G "A X *. ?e maneira !b,iaG o a$goritmo abai(o determina o mdc de
dois nRmeros dadosF
1. /6ame de ( e de ` os nRmeros.
2. ?etermine ?@(AG o conHunto dos di,isores de (.
3. ?etermine ?@`AG o conHunto dos di,isores de `.
4. ?etermine IG a interseo de ?@(A e ?@`A.
. ?etermine >G o maior e$emento do conHunto I.
". 3ornea > como o mdc procurado.
O c$cu$o de mdc@12)G *4A com este a$goritmo seriaF
1. ( X 12)G ` X *4.
2. ?@12)A X a1G 2G 3G 4G G "G *G 1)G 12G 1G 2)G 24G 3)G 4)G ")G 12)b.
3. ?@*4A X a1G 2G 3G 4G "G &G 12G 14G 21G 2*G 42G *4b.
4. I X a1G 2G 3G 4G "G 12b.
. > X 12.
Obser,e que o a$goritmo anterior determina o menor di,isor de um inteiro no determinando todos os
di,isoresG como necessrio neste e(emp$o. Obser,e tamb2m que estamos supondo que o nosso processador 2
capaz de determinar a interseo de dois conHuntos.
B matemtica 4ornece uma outra 4orma de se ca$cu$ar o mdc de dois inteirosF determinaIse a
decomposi#!o em fatores primos dos dois inteiros e o mdc 2 o produto dos 4atores primos comuns as duas
decomposi1es com as menores mu$tip$icidades.
Para o e(emp$o dado acima ter+amosF
12) 2 *4 2
") 2 42 2
3) 2 21 3
1 3 & &
1
1 1
o que nos d 12) X 2
3
(3( e *4 X 2
2
(3(& eG portantoG mdc@12)G *4A X 2
2
(3 X 12.
0a$e obser,ar que escre,er este a$goritmo na $inguagem in4orma$ que estamos uti$izando 2 bastante
comp$icado.
Ca 6 dR,ida que o primeiro a$goritmo para o c$cu$o do mdc apresentado 2 de compreenso bastante
simp$es. Por2mG comentaremos posteriormente que e$e 2 computaciona$mente bastante ine4iciente no sentido
de que sua e(ecuo podeG dependendo dos ,a$ores de ' e yG demandar um tempo acima do razo,e$.
Por incr+,e$ que possa parecerG o a$goritmo mais e4iciente para o c$cu$o do m(imo di,isor comum de
dois nRmeros 4oi desen,o$,ido pe$o matemtico grego 'uc$ides duzentos anos Bntes de /risto. O algoritmo
de *uclides nos 2 apresentado nas s2ries intermedirias do ensino 4undamenta$ atra,2s de um esquema como
o diagrama do e(emp$o abai(oG cuHo obHeti,o 2 determinar @de no,oPA o m(imo di,isor comum de 12) e *4.
1 2 3
12) *4 3" 12
O esquema 4unciona da seguinte 4ormaF di,ideIse 12) por *4 obtendoIse resto 3"K a partir da+G
repetemIse di,is1es at2 que o resto seHa zeroG sendo o di,idendo da di,iso atua$ o di,isor da di,iso anterior
e o di,isor da di,iso atua$ o resto da di,iso anterior. O R$timo di,isor 2 o m(imo di,isor procurado. /omo
se pode ,erG estas instru1es escritas desta 4orma no so nada compreens+,eisG o que 4az com e$as seHam
transmitidas ora$mente nas sa$as do ensino 4undamenta$. Co cap+tu$o 4 @quatroAG teremos a oportunidade de
discutir este a$goritmo com deta$6es e ,eremos que e$e 2 um a$goritmo bastante interessante no
desen,o$,imento da $!gica de programao.
.& ?iscutiremos agora o a$goritmo para o c$cu$o da m2dia de uma re$ao contendo um nRmero
grande @digamosG 1) )))A de nRmeros dados. Co caso da equao do segundo grauG eram tr8s os dados de
entrada eG portantoG os c6amamos de aG bG e c2 >as agora so 1) ))) os dados de entradaP :ma so$uo
poss+,e$ 2 receber os nRmeros um a umG somandoIos antes de receber o seguinteG con4orme ,imos na seo
1..
1. /6ame de B o primeiro nRmero dado.
2. 3aa - X B.
3. #epita % %%% ,ezes as instru1es 3.1 e 3.2.
3.1 /6ame de B o pr!(imo nRmero dado.
3.2 -ubstitua o ,a$or de - por - W B.
4. /a$cu$e > X -N1) ))).
. 3ornea > para o ,a$or da m2dia.
Por e(emp$oG se a re$ao de nRmeros 4osse aG 3G *G 11G ...b at2 a quarta e(ecuo de 3.1 e 3.2
ter+amos a seguinte tabe$aF
B - >

3 *
* 1"
11 2&
'st 4ci$ perceber que ap!s %.%%%c e(ecuo das instru1es 3.1 e 3.2 a ,ari,e$ - conter a soma de
todos os nRmeros da re$aoG o que Husti4ica a instruo 4.
/& :m outro e(emp$o que Husti4ica p$enamente a necessidade do con6ecimento do que o processador 2
capaz de e(ecutar 2 a determinao do maior nRmero de uma re$ao de nRmeros. -e o processador 4or um
a$uno do ensino m2dio e a re$ao conti,er poucos nRmerosG uma simp$es o$6ada na re$ao permitir se
identi4icar o maior nRmero. >asG e se o processador 4or um a$uno das c$asses iniciais do ensino 4undamenta$V
' se a re$ao conti,er 1) ))) nRmerosV ' se os nRmeros esti,erem escritos em 4orma de 4rao ordinriaV
:ma so$uo poss+,e$ 2 supor que o maior nRmero 2 o primeiro da re$ao e comparar este suposto
maior com os demais nRmerosG a$terandoIo quando 4or encontrado um nRmero na re$ao maior do que
aque$e que at2 aque$e momento era o maior.
1. /6ame de B o primeiro nRmero dado.
2. 3aa > X B.
3. #epita % %%% ,ezes as instru1es 3.1 e 3.2.
3.1 /6ame de B o pr!(imo nRmero dado.
3.2 -e B Y > substitua o ,a$or de > por B.
4. 3ornea > para o ,a$or do maior nRmero.
Para e(emp$i4icarG supon6a que a entrada 4osse o conHunto aG 3G *G 11G 1)...b. Bt2 a quinta e(ecuo
das instru1es 3.1 e 3.2 ter+amos a seguinte tabe$aF
B >

3
* *
11 11
1)
$&4 Linguagens de alto n5vel
/omputadores digitais 4oram concebidos para e(ecutarem instru1es escritas em $inguagem de
mquina. Isto signi4ica que um computador 2 capaz de e(ecutar um a$goritmo escrito nesta $inguagem. :m
a$goritmo escrito em $inguagem de mquina 2 norma$mente c6amado de programa ob3eto. Cos prim!rdios
da computaoG os a$goritmos que se pretendiam que 4ossem e(ecutados por um computador eram escritos
em $inguagem de mquinaG o que torna,a a tare4a de desen,o$,imento de a$goritmos muito traba$6osaG
de,ido ao 4ato de que era necessrio que se con6ecesse qua$ sequ8ncia de bits correspondia instruo
pretendida. Catura$menteG esta di4icu$dade acontecia pe$o 4ato de que o ser 6umano no est 6abituado a uma
$inguagem com apenas dois s+mbo$os bsicos. :m grande a,ano ocorreu na computao quando se
conseguiu desen,o$,er programas que traduzissem instru1es escritas originariamente numa $inguagem dos
seres 6umanos para a $inguagem de mquina. O surgimento de programas para esta 4ina$idade permitiu o
desen,o$,imento de a$goritmos em $inguagens que uti$izam caracteresG pa$a,ras e e(press1es de um idiomaG
ou seHaG uma $inguagem cuHos s+mbo$os bsicos e cuHas pa$a,ras esto no cotidiano do ser 6umano. :ma
$inguagem com esta caracter+stica 2 c6amada linguagem de alto nvelG onde alto nvel a+ no se re4ere
qua$idade e sim ao 4ato de que e$a est mais pr!(ima da $inguagem do ser 6umano do que da $inguagem da
mquina @quando a$guma coisa est mais pr!(ima da mquina do que do ser 6umano dizemos que e$a 2 de
bai'o nvelA. /omo e(emp$os de $inguagens de a$to n+,e$ temos ascalG CG 4elphiG 5isual 6asic, 7ava e C
88
.
:m a$goritmo escrito numa $inguagem de a$to n+,e$ 2 c6amado programa fonte ou simp$esmente programa
/omo 4oi dito acimaG um programa fonte de,e ser traduzido para a $inguagem de mquina. = dois
tipos de programas que 4azem istoF os interpretadores que traduzem os comandos para a $inguagem de
mquina um a um e os compiladores que traduzem todo o programa para a $inguagem de mquina. :m
compi$ador ao receber como entrada um programa 4onte 4ornece como sa+da um programa escrito em
$inguagem de mquinaG c6amado programa ob3eto. B compila#!o do programaG portantoG gera um programa
que pode ento ser e(ecutado. U comum nos re4erirmos e(ecuo do programa 4onte quando se est
e(ecutando o programa obHeto.
J um interpretador traduz para a $inguagem de mquina os comandos do programa um a umG
e(ecutandoIos em seguida. Bssim a interpreta#!o de um programa no gera um programa obHeto.
$&6 "inta3e e sem7nti!a de uma instruo
' +ue 8 sinta3e
?issemos que um programa escrito em $inguagem de a$to n+,e$ 2 traduzido para a $inguagem de
mquina por um compi$ador ou cada instruo 2 traduzida por um interpretador. U natura$ se admitir queG
para que o compi$ador consiga traduzir uma instruo escrita com caracteres de a$gum idioma para
instru1es escritas como sequ8ncias de zeros e unsG 2 necessrio que cada instruo seHa escrita de acordo
com regras preestabe$ecidas. 'stas regras so c6amadas sinta'e da instruo e quando no so obedecidas
dizemos que e(iste erro de sinta'e.
-e o programa 4onte cont2m a$gum erro de sinta(eG o compi$ador no o traduz para a $inguagem de
mquina @isto 2G o compi$ador no compila o programaA e indica qua$ o tipo de erro cometido e a instruo
onde este erro aconteceu. -e o programa 4onte 4or interpretadoG e$e 2 e(ecutado at2 a instruo que cont2m o
erroG quando ento 2 interrompida a sua e(ecuo e o ta$ erro 2 indicado.
' +ue 8 sem7nti!a
Catura$menteG cada instruo tem uma 4ina$idade espec+4ica. Ou seHaG a e(ecuo de um instruo
resu$ta na rea$izao de a$guma aoG digamos parcialG e 2 a sequ8ncia das a1es parciais que redunda na
rea$izao da tare4a para a qua$ o programa 4oi escrito. B ao resu$tante da e(ecuo de uma instruo 2
c6amada sem"ntica da instruo. In4e$izmenteG um programa pode no conter erros de sinta(e @eG portantoG
pode ser e(ecutadoAG mas a sua e(ecuo no 4ornecer como sa+da o resu$tado esperado para a$guma entrada.
Ceste casoG dizemos que o programa cont2m erros de lgica queG ao contrrio dos erros de sinta(e que so
detectados pe$o compi$ador ou pe$o interpretadorG soG s ,ezesG de di4+ci$ deteco.
Co nosso entendimentoG para aprender a programar numa determinada $inguagem 2 necessrio que se
aprenda as instru1es daque$a $inguagem @para que se con6ea o que o processador 2 capaz de 4azerAG a
sinta(e de cada um destes instru1es e as suas sem.nticas. B$iado a istoG de,eIse ter um bom
desen,o$,imento de lgica programa#!o para que se esco$6a as instru1es necessrias e a sequ8ncia segundo
a qua$ estas instru1es de,em ser escritasG para que o programaG ao ser e(ecutadoG e(ecute a tare4a
pretendida. 3e$izmente ou in4e$izmenteG para cada tare4a que se pretende no e(iste apenas uma sequ8ncia de
instru1es que a rea$ize. Ou seHaG dado um prob$ema no e(iste apenas um programa que o reso$,a. ?e,emos
procurar o melhor programaG entendendoIse como melhor programa um programa que ten6a boa
legibilidadeG cuHa e(ecuo demande o menor tempo poss+,e$ e que necessiteG para sua e(ecuoG a uti$izao
m+nima da mem!ria.
'(iste um conHunto de instru1es que 2 comum a todas as $inguagens de a$to n+,e$ e cuHas sem.nticas
permitem e(ecutar a maioria das tare4as. B aprendizagem das sem.nticas destas instru1es e das suas
sinta(es em a$guma $inguagem de programao @a$iado ao desen,o$,imento da lgica de programa#!oA
permite que se aprenda com 4aci$idade outra $inguagem do mesmo paradigma.
$&$9 "istemas de !omputao
/omo 4oi dito anteriormenteG a cpu de um computador 2 capaz de e(ecutar instru1es @escritas em
$inguagem de mquinaG permitam a repetioA. Ou seHaG um computador 2 capaz de e(ecutar programas e s!
para isto 2 que e$e ser,e. -e um computador no esti,er e(ecutando um programa e$e para nada est
ser,indo. /omo 4oram concebidos os computadores atuaisG um programa para ser e(ecutado de,e estar
armazenado na sua memria. O armazenamento dos programas @e todo o gerenciamento das intera1es entre
as di,ersas unidades do computadorA 2 4eito por um programa c6amado sistema operacional. :m dos
primeiros sistemas operacionais para gerenciamento de microcomputadores 4oi o 49S /4is: 9perating
System0. ]uando um computador 2 $igadoG de imediato o sistema operaciona$ 2 armazenado na mem!ria e s!
a partir da+ o computador est apto a e(ecutar outros programas. 'stes programas podem ser um gameG que
trans4orma o <computador< num poderoso ,e+cu$o de entretenimentoK podem ser um processador de te'toG
que trans4orma o <computador< num poderoso ,e+cu$o de edio de te(tosK podem ser uma planilha
eletr(nicaG que trans4orma o <computador< num poderoso ,e+cu$o para manipu$ao de tabe$as num2ricasG
podem ser programas para gerenciarG por e(emp$oG o dia a dia comercia$ de uma 4armcia e podem ser
ambientes que permitam o desen,o$,imento de games ou de programas para gerenciar o dia a dia comercia$
de uma 4armcia. 9a$,ez com e(ceo de um gameG os programas citados acima soG na ,erdadeG conHuntos
de programas que podem ser e(ecutados de 4orma integrada. :m conHunto de programas que podem ser
e(ecutados de 4orma integrada 2 c6amado soft)are. Por seu turnoG as unidades do computadorG associadas a
outros equipamentos c6amados perif;ricosG como uma impressoraG constituem o hard)are. O que nos 2 Rti$ 2
um conHunto soft)are W hard)are. :m conHunto deste tipo 2 c6amado de um sistema de computa#!o. ?e
agora em dianteG os nossos processadores sero sistemas de computa#!o. Isto 2G queremos escre,er
programas que seHam e(ecutado por um sistema de computa#!o.
/omo 4oi dito acimaG o desen,o$,imento de um programa que gerencie o dia a dia comercia$ de uma
4armcia requer um compi$ador @ou um interpretadorA que o traduza para a $inguagem de mquina.
BntigamenteG as empresas que desen,o$,iam compi$adores desen,o$,iam apenas estes programasG de ta$
sorte que o programador necessita,a uti$izar um processador de te(to parte para edio do programa 4onte.
Btua$menteG os compi$adores so integrados num sistema de computao que cont2mG entre outrosF
1. rocessador de te'toG para a digitao dos programas 4ontesK
2. 4epuradorG que permite que o programa seHa e(ecutado comando a comandoG o que 4aci$ita a
descoberta de erros de $!gicaK
3. <elpG que descre,e as sinta(es e as sem.nticas de todas as instru1es da $inguagemK
4. +in:erG que permite que um programa uti$ize outros programas.
#igorosamente 4a$andoG um sistema constitu+do de um compi$ador e os soft)ares $istados acima
de,eria ser c6amado de ambiente de programa#!oK 2 mais comumG entretantoG c6amI$oG simp$esmenteG de
compilador.
Os ambientes de programao que uti$izamos para desen,o$,er os programas deste $i,ro 4oram o
compi$ador 9urbo /G ,erso 2.)1G e 9urbo /WWG ,erso 3.)G ambos desen,o$,idos pe$a 6orland
International, Inc2G o primeiro em 1%** e o segundo em 1%%2. /omo se pode ,erG so sistemas desen,o$,idos
6 bastante tempo @as coisas em computao andam muito mais rpidoAG H estando dispon+,eis gratuitamente
na internet2 'staremosG portantoG uti$izando um compi$ador Lpuro /M e um compi$ador /WWG que 2 up grade
da $inguagem / para a programa#!o orientada a ob3etoG paradigma que no est no escopo deste $i,ro.
$&$$ E3er!5!ios propostos
$& 9r8s +ndiosG conduzindo tr8s brancosG precisam atra,essar um rio dispondo para ta$ de um barco cuHa
capacidade 2 de apenas duas pessoas. Por quest1es de seguranaG os +ndios no querem 4icar em minoriaG em
nen6um momento e em nen6uma das margens. 'scre,a um a$goritmo que oriente os +ndios para rea$izarem a
tra,essia nas condi1es 4i(adas. @/abe obser,ar queG usua$menteG este e(erc+cio 2 enunciado en,o$,endo tr8s
Hesu+tas e tr8s canibais. B a$terao 4eita 2 uma modesta contribuio para o resgate da ,erdadeira 6ist!ria
dos +ndiosA.
*& O Hogo con6ecido como =orre de <ani consiste de tr8s torres c6amadas origemG destino e au'iliar
e um conHunto de n discos de di.metros di4erentesG co$ocados na torre origem na ordem decrescente dos seus
di.metros. O obHeti,o do Hogo 2G mo,endo um Rnico disco de cada ,ez e no podendo co$ocar um disco sobre
outro de di.metro menorG transportar todos os discos para torre destinoG podendo usar a torre au'iliar como
passagem intermediria dos discos. 'scre,a a$goritmos para este Hogo nos casos n X 2 e n X 3.
-& Imagine que se dispon6a de tr8s es4eras numeradas 1G 2 e 3 iguais na 4ormaG duas de$as com pesos
iguais e di4erentes do peso da outra. 'scre,a um a$goritmo queG com duas pesagens numa ba$ana de dois
pratosG determine a es4era de peso di4erente e a re$ao entre seu peso e o peso das es4eras de pesos iguais.
.& B m;dia geom;trica de n nRmeros positi,os 2 a raiz nI2sima do produto destes nRmeros. -upondo
que o processador 2 capaz de ca$cu$ar ra+zes nI2simasG escre,a um a$goritmo para determinar a m2dia
geom2trica de n nRmeros dados.
/& -abendo que o dia )1N)1N1%)) 4oi uma segundaI4eiraG escre,a um a$goritmo que determine o dia da
semana correspondente a uma dataG posterior a )1N)1N1%))G dada. Por e(emp$oG se a data dada 4or
23N)1N1%))G o a$goritmo de,e 4ornecer como resposta teraI4eira.
1& O s6o5 de uma banda de roc7G que ser rea$izado na margem de um rioG de,e comear e(atamente
s 21 6. BtrasadosG s 2) 6 43 minG os quatro integrantes da banda esto na outra margem do rio e
necessitamG para c6egar ao pa$coG atra,essar uma ponte. = somente uma $anterna e s! podem passar uma ou
duas pessoas Huntas pe$a ponteG e sempre com a $anterna. /ada integrante possui um tempo di4erente para
atra,essar a ponteF o ,oca$ $e,a 1) minutosG o guitarrista minutosG o bai(ista 2 minutos e o baterista 1
minuto. ',identementeG quando dois atra,essam HuntosG o tempo necessrio 2 o do mais $ento. 'scre,a um
a$goritmo que permita que a banda atra,esse a ponte de modo que o s6o5 comece na 6ora marcada.
2& #eso$,a a questo 3 para o caso de oito es4erasG com tr8s pesagens.
4& 'scre,a um a$goritmo para determinar o resto de uma di,iso inteira uti$izando uma mquina de
ca$cu$ar que e4etue apenas as quatro opera1esF adioG subtraoG mu$tip$icao e di,iso.
')servao
Propostas de solu:es dos e3er!5!ios propostos podem ser soli!itadas atrav8s de mensagem
eletr;ni!a para jaime<!!en&ufal&)r !om assunto 0E"P'"=A" LI0' C, ane3ando o formul#rio
a)ai3o devidamente preen!>ido&
?ome Categoria
$
Instituio
*
Curso
*
Cidade@Estado
$
CategoriaA do!ente, estudante, autodidata
*
"e do!ente ou estudante
*& Introduo % Linguagem C
*&$ ari#veis simples
' +ue 8 uma vari#vel
Co cap+tu$o 1 4oi dito que uma das unidades bsicas de um computador 2 a memriaG cuHa 4ina$idade 2
armazenar dados e in4orma1es que sero manipu$ados pe$a unidade central de processamento2 Caque$e
cap+tu$o tamb2m 4oi dito que os programas para serem e(ecutados de,em estar armazenados na mem!ria. Ou
seHaG a mem!ria armazena programas que sero e(ecutados e dados que estes programas ,o manipu$ar.
Catura$menteG os dados que o programa ,ai manipu$ar podem ser dados de entrada ou dados gerados pe$a
e(ecuo do programa.
Para que possa armazenar dados e in4orma1esG a mem!ria 2 di,idida em partesG c6amadas posi#$es
de memria. O sistema operaciona$ que gerencia o sistema de computao pode acessar cada uma destas
posi1es para armazenar tais dados. Para que o acesso s posi1es de mem!ria seHa poss+,e$G a cada uma
de$as est associada uma sequ8ncia de bitdsG c6amada endere#o da posio de mem!ria. /omo uma
sequ8ncia de bitOs corresponde a um nRmero inteiro escrito no sistema binrioG cada endereo pode ser ,isto
como um inteiro escrito no sistema decima$. Bssim temos posi1es de mem!ria de endereo 12)% ou 2114G
por e(emp$o.
:ma varivel simples @ou simp$esmente varivelA 2 uma posio de mem!ria cuHo conteRdo pode ser
modi4icado durante a e(ecuo de um programa. B re4er8ncia a uma ,ari,e$ no programa 2 4eita atra,2s do
seu identificadorK os ,a$ores que podem ser ne$a armazenados dependem do seu tipo de dado.
' identifi!ador
O identificador 2 uma sequ8ncia de $etrasG d+gitos e caractere para sub$in6amento esco$6ida pe$o
programador e @como 4oi dito acimaA ser uti$izado no programa para se 4azer re4er8ncia que$a ,ari,e$ @o
primeiro caractere do identi4icador no pode ser um d+gitoA. /omo um programa de,e ser $eg+,e$ por outros
programadores @e pe$o pr!prio programadorAG 2 uma boa prtica se esco$6er um identi4icador de uma ,ari,e$
que ten6a a$guma re$ao com a sua 4ina$idade. -e uma ,ari,e$ de,e armazenar uma somaG um identi4icador
muito bom para e$a ser Soma. -e uma ,ari,e$ ,ai receber nRmerosG e$a poderia ser identi4icada por %um ou
por %umero. Os compi$adores da $inguagem / 4azem distino entre $etras maiuscu$as e minRscu$as eG
portantoG %umero e numero so dois identi4icadores di4erentes. >anteremosG de um modo gera$G a seguinte
con,eno ao $ongo do te(toF quando um identi4icador possuir mais de um caractereG iniciI$oIemos por $etra
maiuscu$a e quando o identi4icador ti,er um Rnico caractereG uti$izaremos $etra minRscu$a.
/omo ,eremos ao $ongo do $i,roG a $inguagem / 4i(a a$guns identi4icadores para a sinta'e de suas
instru1es. 'stes identi4icadores no podem ser uti$izados nos programasG sendo con6ecidos por palavras
reservadas. B$gumas das pa$a,ras reser,adas em / soF
Tabela 2 Palavras reservadas da linguagem C
auto doub$e int struct
brea7 e$se $ong s5itc6
case enum register t`pede4
c6ar e(tern return union
const 4$oat s6ort unsigned
continue 4or -igned ,oid
de4au$t goto sizeo4 ,o$ati$e
do i4 static 56i$e
' tipo de dado
O tipo de dado associado a uma ,ari,e$ 2 o conHunto dos ,a$ores que podem ser ne$a armazenados. B
$inguagem / disp1e dos tipos de dados discriminados na tabe$a a seguir.
Tabela 3 Tipos de dados da Linguagem C
?enominao CRmero de D`tes /onHunto de ,a$ores
c6ar 1 caracteres codi4icados no c!digo B-/II
int 2 nRmeros inteiros de [32&"* a 32&"&
$ong ou $ong int 4 nRmeros inteiros de ["3" a "3
4$oat 4 nRmeros reais de [3G4(1)
3*
a [3G4(1)
I3*
e 3G4(1)
I3*
a 3G4(1)
3*
doub$e * nRmeros reais de [1G&(1)
3)*
a I1G&(1)
I3)*
e 1G&(1)
I3)*
a 1G&(1)
3)*
,oid ) conHunto ,azio
B uti$izao void ser me$6or e(p$icada no cap+tu$o G quando estudarmos fun#$es2
:ma obser,ao importante 2 que os tipos float e doubleG rigorosamente 4a$andoG no armazenam
nRmeros reais e sim nRmeros de um sistema de ponto flutuanteG que no cont2m todos os reais entre dois
nRmeros reais dados. O estudo de sistemas de ponto 4$utuante 4oge ao escopo deste $i,ro e 2 4eitoG
norma$menteG em discip$inas do tipo 9rgani.a#!o e Arquitetura de Computadores e Clculo %um;rico.
0a$e $embrar queG de um modo gera$G um b`te cont2m oito bitOs e cabe ressa$tar queG em a$gumas
situa1esG 2 importante se con6ecer a quantidade necessria de b`tes para uma ,ari,e$ de um determinado
tipo.
Be!larao de vari#veis
Para que o sistema de computao possa reser,ar as posi1es de mem!ria que sero uti$izadas pe$o
programaG associar identi4icadores aos endereos destas posi1es de mem!ria e de4inir a quantidade de b`tes
de cada posio de acordo com o tipo de dado pretendidoG um programa escrito em / de,e conter a
declara#!o de variveisG 4eita atra,2s da seguinte sinta(eF
9ipo de dado Lista de identi4icadoresK
Por e(emp$oG um programa para determinar a m2dia de uma re$ao de nRmeros dados pode ter a
seguinte dec$araoF
int ]uantK
4$oat CumG -omaG >ediaK
B ideia 2 que >uant seHa uti$izada para armazenar a quantidade de nRmerosK %um para armazenar os
nRmeros @um de cada ,ezAK Soma para armazenar a soma dos nRmerosK e ?edia para armazenar a m2dia
procurada.
Cas se1es 2.& e 2.% ,eremos as instru1es em / para o armazenamento em ,ari,eis de dados de
entrada e de dados gerados pe$a e(ecuo do a$goritmo. :m ,a$or armazenado em uma ,ari,e$ 2
comumente re4erido como sendo o conte1do da ,ari,e$ ou o valor da ,ari,e$. 9amb2m 2 comum se re4erir
ao identi4icador da ,ari,e$ como sendo a pr!pria ,ari,e$.
*&* Constantes
/omo uma ,ari,e$G uma constante tamb2m 2 uma posio de mem!ria qua$ de,em ser associados
um identificador e um tipo de dado. O que caracteriza uma constante @e da+ sua denominaoG emprestada da
matemticaA 2 o 4ato de que o conteRdo de uma constante no pode ser modi4icado durante a e(ecuo do
programa. 'ste conteRdo 2 4i(ado quando da dec$arao da constante o que de,e ser 4eito de acordo com a
seguinte sinta(eF
const 9ipo de ?ado Identi4icador X 0a$orK
Por e(emp$oG um programa para processar c$cu$os qu+micos poderia ter uma dec$arao do
tipo
const 4$oat CumB,ogadro X ".)23'W23K
onde a e(presso ".)23'W23 2 a 4orma que os compi$adores / uti$izam para representar os ,a$ores do tipo
float na nota#!o cientficaG ou seHa ".)23'W23 X ".)23 ( 1)
23
.
:m programa para c$cu$os de reas de 4iguras p$anasG per+metros de po$+gonos inscritos em
circun4er8nciasG etc.G poderia ter uma dec$arao do tipo
const 4$oat Pi X 3.141"K
'sta dec$arao 2 desnecessria quando o sistema uti$izado 2 o 9urbo /WW 3.)G pois esse sistema
disponibi$iza uma constante pr;@definidaG identi4icada por >ePIG que pode ser uti$izada em qua$quer parte do
programa e cuHo ,a$or 2 uma apro(imao do nRmero irraciona$ .
*&- E3press:es aritm8ti!as
/omo era de se esperarG os compi$adores da $inguagem / so capazes de a,a$iar e(press1es
aritm2ticas que en,o$,am as opera1es binrias de mu$tip$icaoG di,isoG soma e subtrao e a operao
unria de troca de sinal. Para isto so usados os seguintes operadores aritm;ticos binriosF
Tabela 4 Operadores aritmticos
Operador Operao
W adio
I subtrao
f mu$tip$icao
N di,iso
e o operador aritm;tico unrio @CA para a troca de sina$. 'sses operadores atuam com operandos do tipo int
ou do tipo float. -e um dos operandos 4or do tipo float o resu$tado da operao ser do tipo floatK se os dois
operandos 4orem do tipo int o resu$tado 2 tamb2m do tipo int. Co caso do operador de di,iso NG se os dois
operandos 4orem do tipo int o resu$tado da operao 2 do tipo int e igua$ ao quociente da di,iso do primeiro
operando pe$o segundo. Por e(emp$oG o resu$tado de 3)N4 2 &. -e quisermos a di,iso decima$ teremos de
escre,er 3).) N &.) ou 3).) N & ou 3) N &.). Ou seHa cada uma destas di,is1es 2 igua$ a &. e este ,a$orG ta$
como e$e 2G pode ser armazenado numa ,ari,e$ do tipo float. O que acontece 2 que no armazenamento de
um ,a$or do tipo float numa ,ari,e$ do tipo int a parte decima$ do ,a$or 2 desprezadaG s! sendo armazenada
a parte inteira do nRmero.
:ma e(presso que en,o$,a di,ersas opera1es 2 a,a$iada de acordo com as regras de prioridade da
matemticaF em primeiro $ugar 2 rea$izada a operao troca de sina$G em seguida so rea$izadas as
mu$tip$ica1es e di,is1es eG 4ina$menteG as somas e subtra1es. Por e(emp$oG a e(presso * W 2fI3 2 a,a$iada
como * W @I"A X 2. Catura$menteG a prioridade pode ser a$terada com a uti$izao de par8ntesesF a e(presso
@* W 2AfI3 resu$ta em 1)f@I3A X I3). 'mboraG o sistema no e(iHaG ,amos sempre uti$izar par8nteses para
separar o operador unrio para troca de sina$ de a$gum operador binrio. BssimG * W 2fI3 ser indicada por *
W 2f@I3A. :ma e(presso no parentesada contendo operadores de mesma prioridade 2 a,a$iada da esquerda
para direita. Por e(emp$oG 1)N2f3 2 igua$ a @1)N2Af3 X f3 X 1.
Operandos podem ser conteRdos de ,ari,eis. Ceste casoG o operando 2 indicado pe$o identificador da
,ari,e$ @2 para isto que ser,e o identi4icadorG para se 4azer re4er8ncia aos ,a$ores que na ,ari,e$ esto
armazenadosA.
B$2m dos operadores aritm2ticos usuaisG os compi$adores / disponibi$izam o operador mduloG
indicado por gG que ca$cu$a o resto da di,iso do primeiro operando pe$o segundo. Por e(emp$oG 3) g 4 X 2
e g & X . 'ste operador atua apenas em operandos do tipo intG resu$tando um ,a$or deste mesmo tipo. Por
e(emp$oG se - 2 uma ,ari,e$ do tipo floatG a e(presso - g gerar um erro de compi$ao. :ma e(presso
do tipo 3).) g & tamb2m gerar erro de compi$aoG pe$o 4ato de que um dos operandos no 2 inteiro. 'ste
erro 2 indicado pe$o sistema pe$a mensagem Illegal use of floating point in function 222 @:so i$ega$ de tipo
float na 4uno ...AG onde as retic8ncias esto substituindo o identificador da fun#!oG como ser discutido
posteriormente.
*&. 0ela:es
Os ambientes que imp$ementam a $inguagem / e4etuam compara#$es entre ,a$ores num2ricosG
rea$izadas no sentido usua$ da matemtica. 'ssas compara1es so c6amadas rela#$es e so obtidas atra,2s
dos operadores relacionais D @maior do queAG DE @maior do que ou igual aAG F @menor do queAG FE @menor
do que ou igual aAG XE @igualA e PX @diferenteA.
O resu$tado da a,a$iao de uma re$ao 2 1 @umAG se a re$ao 4or matematicamente ,erdadeiraG ou )
@zeroAG se a re$ao 4or matematicamente 4a$sa. BssimG 3 Y resu$ta no ,a$or ) @zeroAG enquanto que & ZX &
resu$ta no ,a$or 1 @umA. -endo um ,a$or 1 @umA ou ) @zeroAG o resu$tado da a,a$iao de uma re$ao pode ser
armazenado numa ,ari,e$ do tipo int.
Os operandos de uma re$ao podem ser e(press1es aritm2ticas. Cestes casosG as e(press1es
aritm2ticas so a,a$iadas em primeiro $ugar paraG em seguidaG ser a,a$iada a re$ao. Por e(emp$oG a re$ao
3f4 I Z 2f3 I 4 resu$ta no ,a$or ) @zeroAG pois 3f4 I X & e 2f3 I 4 X 2. Isto signi4ica que os operadores
re$acionais t8m prioridade mais bai(a que os aritm2ticos.
*&/ E3press:es l,gi!as
Os compi$adores / tamb2m a,a$iam e'press$es lgicas obtidas atra,2s da ap$icao dos operadores
lgicos binrios hhG AA e B a duas re$a1es ou da ap$icao do operador lgico unrio P a uma re$ao.
-e #
1
e #
2
so duas re$a1esG a a,a$iao da ap$icao dos operadores $!gicos binriosG de acordo com
os ,a$ores de #
1
e #
2
G so dados na tabe$a abai(o.
Tabela ! Avalia"#o de e$press%es lgicas
#
1
#
2
@#
1
Ahh@#
2
A @#
1
Aii@#
2
A @#
1
A j @#
2
A
1 1 1 1 )
1 ) ) 1 1
) 1 ) 1 1
) ) ) ) )
Ou seHaG uma e(presso $!gica do tipo @#
1
Ahh@#
2
A s! recebe o ,a$or 1 @umA se os ,a$ores de #
1
e de #
2
4orem iguais a 1 @umAK uma e(presso $!gica do tipo @#
1
Aii@#
2
A s! recebe o ,a$or ) @zeroA se os ,a$ores de #
1
e
de #
2
4orem iguais a ) @zeroAK uma e(presso $!gica do tipo @#1A j @#2A s! recebe o ,a$or 1 @umA se apenas
um dos ,a$ores de #1 e #2 4or igua$ a 1. O $eitor H de,e ter percebido que o operador hh age como o
conecti,o e da nossa $inguagemK o operador ii atua como o nosso eCou e o operador j como o conecti,o ou.
B ap$icao do operador unrio P simp$esmente in,erte o ,a$or origina$ da re$aoF
Tabela & Operador un'rio (
#
1
P#
1
1 )
) 1
/onsiderando que os operadores hh, ii e j possuem o mesmo grau de prioridadeG se uma e(presso
no parentesada possuir mais de uma re$aoG e$a ser a,a$iada da esquerda para direita. O operador unrio P
tem prioridade em re$ao aos operadores binrios. BssimG P @ Y 3A ii @ Z 3A tem ,a$or ) @zeroAG pois P @ Y
3A 2 uma re$ao 4a$sa e Z 3 tamb2m 2. /onsiderando que os operadores $!gicos t8m prioridade mais bai(a
que os operadores re$acionaisG os par8nteses nas e(press1es acima so desnecessriosK por2m entendemos
que a co$ocao de$es 4aci$ita a $eitura da e(presso.
Os sistemas / 2.)1 e /WW 3.) tamb2m disponibi$izam os operadores $!gicos h e i cuHas ap$ica1es so
id8nticas s ap$ica1es de hh e iiG respecti,amente. B di4erena entre h e hhG por e(emp$oG 2 a seguinteF se
em @#1A hh @#2A o ,a$or de #1 4or ) @zeroA o ,a$or #2 no 2 mais a,a$iadoG enquanto que em @#1A h @#2A o
,a$or de #2 2 a,a$iadoG independentemente do ,a$or de #1.
*&1 Estrutura de um programa em C
'stamos tentando aprender a escre,er programas na $inguagem /. J ,imos que se o programa
necessitar manipu$ar ,ari,eisG estas de,em ser dec$aradas. 0eremos no cap+tu$o que um programa pode
conter fun#$es. Ca ,erdadeG ,eremos que um programa em / 2 um conHunto de 4un1es de4inidas pe$o
programadorG 4un1es que uti$izaro outras 4un1es de4inidas pe$o programador e a$gumas 4un1es
o4erecidas pe$o sistema @as 4un1es o4erecidas pe$o sistema so c6amadas fun#$es de biblioteca ou fun#$es
pr;@definidasA. 0eremos no citado cap+tu$o que uma 4uno de,e ser de4inida com a seguinte estrutura.
9ipo de ?ado Identi4icador da 4uno@Lista de par.metrosA
a
?ec$arao de ,ari,eis
-equ8ncia de instru1es
b
onde o signi4icado de +ista de par"metros ser e(p$icado no cap+tu$o H re4erido e a Sequ-ncia de instru#$es
cont2m comandosG ativa#$es de fun#$es pr;@definidas e ativa#$es de fun#$es definidas pelo usurio no
prprio programa ou em outros programas.
9odo programa em / de,e conter uma 4uno identi4icada por main @cuHa traduo 2 principalAG com
$ista de par.metros ,azia e tipo de dado no obrigat!rio. 'sta ser sempre a primeira 4uno do programa a
ser e(ecutada. ?esta 4ormaG o menor programa em / 2
main@A
a
b
'ste programa pode ser e(ecutadoG mas nada rea$izaG de,ido ao 4ato de que e$e no cont2m nen6uma
instruo. Obser,e que todo o corpo da 4uno de,e estar disposto entre c6a,es. Bs c6a,es so uti$izadas em
outros pontos de um programa e so c6amadas delimitadores. Os de$imitadoresG o identi4icador main e os
par8ntesesG dispostos ao $ado do identi4icador mainG so os Rnicos e$ementos obrigat!rios de um programa.
/omo os compi$adores / ignoram espaos em brancoG caracteres de tabu$ao e caracteres de mudana de
$in6aG no e(iste um esti$o obrigat!rio de se editar programas em /. Por e(emp$oG o programa acima poderia
ser escrito de uma das seguintes maneiras.
main
@
A
a
b
ou
main@Aab
ou
main@
Aab
',identementeG um programador em / de,e procurar escre,er seus programas num esti$o que o4erea
uma boa $egibi$idadeG o que ,ai 4aci$itar a sua compreenso por outra pessoa e a descoberta de poss+,eis erros
de $!gica.
*&2 Entrada dos dados de entrada
A funo scan)*+
B maioria dos programas manipu$a dados que so 4ornecidos pe$o usurio durante a e(ecuo do
programa. 'stes dados constituem a entrada do programa eG natura$menteG de,em ser armazenados em
,ari,eis. Por e(emp$oG um programa para determinao das ra+zes de uma equao do segundo grau de,e
receber como entrada os ,a$ores dos tr8s coe4icientes da equaoF so estes ,a$ores que identi4icam a
equao.
?e um modo gera$G os compi$adores / permitem a recepo de dados de entrada @e o consequente
armazenamento em ,ari,eisA atra,2s da 4uno de bib$ioteca scanf/0 que possui a seguinte sinta(eF
scan4@'(presso de contro$eG Lista de ,ari,eisAK
B+G *'press!o de controle de,e ser escrita entre aspas e cont2m os cdigos de convers!o que indicam
como o sistema de,e armazenar os dados digitados no tec$ado e caracteres que o usurio de,e digitar
separando a digitao destes dados. Ca +ista de variveis as ,ari,eis so separadas por ,+rgu$as e cada uma
de$as de,e ser precedida do operador de endere#o h. 'ste operador indica o endereo da posio de
mem!ria de4inida para a ,ari,e$ identi4icada na $ista de ,ari,eis.
]uando da e(ecuo desta 4unoG a 3anela de edi#!o 2 substitu+da pe$a 3anela do usurio e o sistema
4ica aguardando que o usurio digite um nRmero de ,a$ores igua$ ao nRmero de ,ari,eis da $ista de ,ari,eis
@ medida que so digitadosG os ,a$ores aparecem na te$a do usurioA. B conc$uso da entrada dos dados 2
4eita com a digitao da tec$a ZenterY e quando isto 2 4eitoG o sistema armazena os dados digitados na
,ari,e$ respecti,a @no sentido da ordem da co$ocao da ,ari,e$ na $ista e da digitao do ,a$orAG de acordo
com o cdigo de convers!o.
Por e(emp$oG
kinc$ude Zstdio.6Y
main@A
a
int Bnos
scan4@<gd<G hBnosA
b
2 um programa em / que armazena um ,a$or inteiro digitado no tec$ado na ,ari,e$ Anos @ou seHaG para nada
ser,eG pois o inteiro armazenado naque$a posio de mem!ria Les,aneceM quando a e(ecuo do programa 2
encerradaA.
]uando se ,ai dar entrada em mais de um dado atra,2s de uma mesma ati,ao da 4uno scanf/0G
podeIse 4i(ar caracteres que de,ero ser digitados quando da entrada dos dados. Por e(emp$oG se
pretendemos dar entrada numa dataG podemos ter o seguinte trec6o de programaF
kinc$ude Zstdio.6Y
main@A
a
int ?iaG >esG BnoK
scan4@<gdNgdNgd<G h?iaG h>esG hBnoAK
. . .
b
e a data pretendida de,e ser digitada no 4ormato ddNmmNaaaaG de,endo o usurio digitar as barras entre as
digita1es do dia e do m8s e deste e do ano. B conc$uso se d com a digitao da tec$a ZenterYG como se
esti,esse digitando um Rnico dado. B digitao das barras 2 necessria pe$o 4ato de que e$as esto separando
os c!digos de 4ormatao na e(presso de contro$e. -e ap!s a digitao do ,a$or da ,ari,e$ 4ia 4or acionada
a tec$a ZenterYG a e(ecuo da 4uno 2 encerrada e os ,a$ores de ?es e Ano no podem ser digitados.
-e no 6 nen6um caractere separando os c!digos de 4ormataoG a digitao dos dados pode ser
interca$ada pe$a digitao da tec$a ZenterY ou da Zbarra de espaosY. U o casoG por e(emp$oG do trec6o de
programa
main@A
a
int iK
c6ar cK
scan4@<gc gd<G hcG hiAK
. . .
b
onde as digita1es do caractere que se pretende armazenar na ,ari,e$ c e do inteiro a ser armazenado em i
de,em ser separadas pe$o acionamento da tec$a ZenterY ou da Zbarra de espaoY. U necessrio notar que a
digitao de um ,a$or de um tipo di4erente do tipo da ,ari,e$ no pro,oca erro de e(ecuoG masG
e,identementeG pode pro,ocar erro de $!gica do programa. Por e(emp$oG se na e(ecuo do comando
scanf/DEc EdD, hc, hi0F digitarmos 5ZenterY.%ZenterYG o caractere ) 2 armazenado na ,ari,e$ c e o
inteiro 2 armazenado na ,ari,e$ i. PortantoG se o dado de entrada 4osse rea$mente .%G o resu$tado do
processamento poderia ser 4ornecido com erros. -e o dado de entrada poderia ser .%G a ,ari,e$ para seu
armazenamento de,eria ter sido de4inida com float.
's !,digos de !onverso e a instruo Gin!lude Fstdio&>D
Os cdigos de convers!o de acordo com o tipo de dado da ,ari,e$ onde os ,a$ores digitados sero
armazenados so apresentados na tabe$a a seguir.
Tabela , Cdigos de convers#o da )un"#o scan)*+
/!digo '$emento armazenado
gc um Rnico caractere
gd ou gi um inteiro do sistema decima$
go um inteiro do sistema octa$
g( um inteiro do sistema 6e(adecima$
g$d um ,a$or do tipo long
ge um nRmero na notao cient+4ica
g4 um nRmero em ponto 4$utuante
gs uma cadeia de caracteres
B instruo Ginclude Hstdio2hI que precede a 4uno main/0 2 necessria pe$os seguintes 4atos. /omo
dissemos acimaG para se de4inir uma 4uno 2 necessrio 4i(ar o tipo de dado que e$a retornaG o identificador
da fun#!o e a lista de par"metrosG com seus identi4icadores e seus tipos de dadosK este conHunto de e$ementos
2 c6amado prottipo da fun#!o. Para que a 4uno main/0 ati,e uma outra 4uno @seHa uma 4uno de4inida
pe$o usurio ou uma fun#!o de bibliotecaAG o seu prot!tipo de,e ser de4inido antes ou no interior da 4uno
main/0.
Os prot!tipos das 4un1es do sistema encontramIse reunidosG de acordo com obHeti,os seme$6antesG
em arqui,os c6amados arquivos de cabe#alhos @header filesA @o cabe#alho de uma 4uno inc$ui o seu
prot!tipoG as ,ari,eis dec$aradas dentro da 4uno e outras dec$ara1es e de4ini1es que no so instru1es
propriamente ditasA. B instruo Ginclude Hstdio2hI <ane(a< 4uno main/0 os prot!tipos das 4un1es de
bib$ioteca que e(ecutam a1es padr1es de entrada e de sa+da @stdio ,em de standard input outputG entrada e
sa+da padro e h 2 a e(tenso padro dos arqui,os de cabea$6osA. B no inc$uso de um include pro,oca
erro de compi$ao no sistema /WW 3.)1. Isto no acontece no / 2.)1G por2mG 6 casos em que esta no
inc$uso gera erros de $!gica @a entrada de dados no 2 4eita do modo que se espera,aA.

*&4 "a5da de dados

A funo printfHI
B e(ibio dos resu$tados do processamento e de mensagens 2 4eita atra,2s da 4uno pr2Ide4inida
printf/0G cuHo prot!tipo est contido tamb2m no arqui,o stdio2h. -ua sinta(e 2 a seguinteF
print4@'(presso de contro$eG Lista de argumentosAK
onde *'press!o de controle cont2m mensagens que se pretende que seHam e(ibidasG cdigos de formata#!o
@id8nticos aos c!digos de con,erso da 4uno scanf/0A que indicam como o conteRdo de uma ,ari,e$ de,e
ser e(ibido e cdigos especiais para a e(ibio de a$guns caracteres especiais e rea$izao de a1es que
permitam 4ormatar a sa+da do programa. B +ista de argumentos pode conter identi4icadores de ,ari,eisG
e(press1es aritm2ticas ou $!gicas e ,a$ores constantes.
Co primeiro casoG o conteRdo da ,ari,e$ 2 e(ibidoK no segundo casoG a e(presso 2 a,a$iada e o seu
resu$tado 2 e(ibidoK no terceiro caso o ,a$or constante 2 e(ibido. B ordem de e(ibio dos conteRdos de
,ari,eisG dos resu$tados das e(press1es e dos ,a$ores constantes re$acionados na $ista de argumentos 2 dada
pe$a ordem em que estes e$ementos esto $istadosK a posio dentro da mensagem contida na e(presso de
contro$e 2 4i(ada pe$a posio do c!digo de 4ormatao respecti,o. ]uandoG na e(presso de contro$eG um
c!digo de 4ormatao 2 encontrado o conteRdo da ,ari,e$G o resu$tado da e(presso ou o ,a$or constante
respecti,o @no sentido da ordem da co$ocao da ,ari,e$ na $ista e da co$ocao do c!digo de 4ormatao na
e(presso de contro$eA 2 e(ibido.
Por e(emp$oG a 4uno printf/0 no programa abai(o cont2m uma e(presso de contro$e que no possui
c!digos de 4ormatao. Isto signi4ica que apenas a mensagem ser e(ibida. BssimG o programa
kinc$ude Zstdio.6Y
main@A
a
print4@<'stou aprendendo a programar em /<AK
b
2 um programa em / que 4az com que seHa e(ibida na te$a a mensagem *stou aprendendo a programar em
C.
J o programa abai(oG cont2m uma 4uno printf/0 que possui quatro caracteres de contro$e
kinc$ude Zstdio.6Y
main@A
a
4$oat aG bG cK
scan4@<g4 g4 g4<G haG hbG hcAK
print4@<g4 G g4 e g4 g4<G aG b G cG @a W b W cAN3AK
b
]uando da e(ecuo deste programaG o sistemaG para e(ecuo da 4uno scanf/0G aguarda que seHam
digitados tr8s ,a$ores num2ricos. ]uando isto 2 4eitoG o sistema armazena estes tr8s ,a$ores nas ,ari,eis aG b
e cG respecti,amente. Ca e(ecuo do R$timo comandoG o sistema e(ibe os ,a$ores armazenados nas ,ari,eis
aG b e cG em seguida a,a$ia a e(presso /a 8 b 8 c0CJ e e(ibe o seu ,a$or na te$a. BssimG o programa 4ornece a
m2dia aritm2tica de tr8s nRmeros dados.
/omo um outro e(emp$o e considerando que o resu$tado de uma e(presso $!gica 2 um inteiroG o
programa
kinc$ude Zstdio.6Y
main@A
a
print4@<gd<G Y 3AK
b
e(ibe na te$a o ,a$or 1G pois a re$ao Y 3 2 ,erdadeira.
Cos dois e(emp$os anterioresG uti$izamos e(press1esG uma aritm2tica e uma $!gicaG como argumentos
de uma 4uno printf/0. Co nosso entendimentoG no 2 uma boa prtica de programao se uti$izar e(press1es
como argumentos de uma 4uno printf/0. -e o ,a$or de uma e(presso 2 Rti$ para a$guma coisaG e$e de,e ser
armazenado em a$guma ,ari,e$ @,eremos isto na pr!(ima seoA e esta de,e ser uti$izada para o
4ornecimento de resu$tados.
Fa!ilitando a e3e!uo de um programa
B possibi$idade de que mensagens possam ser e(ibidas permite que o pr!prio programa 4aci$ite a sua
e(ecuo e que torne compreens+,eis os resu$tados 4ornecidos. ?a 4orma em que est escrito acimaG a
e(ecuo do programa que 4ornece a m2dia de tr8s nRmeros dados 2 di4icu$tada pe$o 4ato de que a e(ecuo
da 4uno scanf/0 4az com que o sistema aguarde a digitao dos nRmeros pretendidos @o cursor 4ica
simp$esmente piscando na te$a do usurioA e o usurio pode no saber o que est se passando. B$2m distoG a
e(ecuo da 4uno printf/0 e(ibe apenas o resu$tado da e(pressoG sem indicao a que aque$e ,a$or se
re4ere. -em dR,idaG o programa re4erido 4icaria muito me$6or da seguinte 4orma.
kinc$ude Zstdio.6Y
main@A
a
4$oat aG bG cK
print4@<?igite tr8s nRmeros<AK
scan4@<g4 g4 g4<G haG hbG hcAK
print4@<B media dos numeros g4 G g4 e g4 2 igua$ a g4<G aG bG cG @a W b W cAN3AK
b
B e(ibio de uma mensagem pode ser tamb2m obtida atra,2s da 4uno puts/0G cuHo prot!tipo est no
arqui,o stdio2h. Por e(emp$oG o comando printf/K4igite tr-s n1merosL0 pode ser substitu+do pe$o comando
puts/K4igite tr-s n1merosL0.
Fi3ando o nJmero de !asas de!imais
O padro uti$izado pe$a maioria dos compi$adores / 2 e(ibir os nRmeros de ponto flutuante com seis
casas decimais. O nRmero de casas decimais com as quais os nRmeros de ponto 4$utuante sero e(ibidos pode
ser a$terado pe$o programa. Para isso de,eIse acrescentar &n ao c!digo de 4ormatao da sa+daG sendo n o
nRmero de casas decimais pretendido. Por e(emp$oG se o programa que determina a m2dia de tr8s nRmeros
4osse e(ecutado para a entrada ".2G *.4 e & seria e(ibido na te$a o seguinte resu$tado
B media dos numeros ".2)))))G *.)))) e &.)))))) 2 igua$ a &.2))))
-e o comando de sa+da do programa 4osse
print4@<B media dos numeros g.24 G g.24 e g.24 2 igua$ a g.14<G aG bG cG @a W b W cAN3AK
a sa+da seria
B media dos numeros ".2)G *. e &.)) 2 igua$ a &.3
Obser,e que a m2dia dos nRmeros dadosG de 4atoG 2 igua$ a &.2". /omo o c!digo da 4ormatao da
sa+da da m2dia 4oi E2MfG e$a 4oi e(ibida com uma casa decima$ e o sistema e4etua os arredondamentos
necessrios. Obser,e tamb2m a uti$izao do ponto @e no da ,+rgu$aA como separador das partes inteiras e
4racionrias. Isto 2 sempre necessrio quando o ambiente de programao que se est uti$izando 4oi
desen,o$,ido nos 'stados :nidosG o que 2 o mais 4requente.
Alin>ando a sa5da
O programa pode 4i(ar a co$una da te$a a partir da qua$ o conteRdo de uma ,ari,e$G ou o ,a$or de uma
constante ou o ,a$or de uma e(presso ser e(ibido. Isto 2 obtido acrescentadoIse um inteiro m ao c!digo de
4ormatao. Ceste casoG m indicar o nRmero de co$unas que sero uti$izadas para e(ibio do conteRdo da
,ari,e$ ou do ,a$or da constante. Por e(emp$oG $e,andoIse em conta que a 4rase <'stou aprendendo a
programar< cont2m ,inte e oito caracteresG o programa abai(o
kinc$ude Zstdio.6Y
main@A
a
print4@<g3*s<G <'stou aprendendo a programar<AK
b
e(ibe na te$a a 4rase re4erida a partir da d2cima co$una.
Obser,e que este programa tamb2m e(emp$i4ica a uti$izao de uma constante @no casoG uma cadeia de
caracteresA como um argumento da 4uno printf/0. Obser,e tamb2m que re4er8ncias a constantes do tipo
cadeia de caracteres de,em ser 4eitas com a cadeia escrita entre aspas. Bs aspas distinguem para o sistema
uma cadeia de caracteres constante de um identi4icador de ,ari,e$. O mesmo e4eito poderia ser obtido com
o programa
kinc$ude Zstdio.6Y
main@A
a
print4@< 'stou aprendendo a programar<AK
b
onde e(istem dez espaos em branco entre o abre aspas e a $etra '.
Para se 4i(ar a co$una a partir da qua$ e o nRmero de casa decimais com que um nRmero de ponto
4$utuante ser e(ibidoG de,eIse uti$izar dois par.metros separados por um ponto. Por e(emp$oG considerando
que se e(ibirmos o nRmero 3.141" com duas casas decimais e$e 4icar com quatro caracteresG o programa
kinc$ude Zstdio.6Y
main@A
a
print4@<g14.24<G 3.141"AK
b
e(ibir na te$a 3.14 a partir da d2cima co$una.
O recurso da e(ibio de ,a$ores uti$izando um nRmero pr2Ide4inido de co$unas pode ser uti$izado para
a$in6ar direita a sa+da do programa. Por e(emp$oG se os conteRdos das ,ari,eis do tipo float (G ` e z so
1)3.4G .3"&* e 4.)G a sequ8ncia de comandos
print4@<g13.24<G (AK
print4@<g13.24<G `AK
print4@<g13.24<G zAK
e(ibe na te$a
1)3.4
.3&
4.))
0a$e obser,ar que 2 poss+,e$ obter o mesmo e4eito com uma Rnica ati,ao @ou chamadaA da 4uno
printf/0G como ,eremos a seguirF
print4@<g13.24 ln g13.24 ln g13.24 <G (G `G zAK
E3i)indo nJmeros K!omo !ara!teresK e vi!eCversa
:ma ,ari,e$ do tipo char armazena os c!digos B-/II dos caracteres suportados pe$o sistema. /omo
este armazenamento 2 4eito atra,2s de cadeias de bitOsG na ,erdadeG o que 2 armazenado so nRmeros inteiros
compreendidos entre [12* e 12&. Bos nRmeros de ) a 12& correspondem os caracteres de c!digo B-/II
iguais ao pr!prio nRmero e aos nRmeros de I1 a I12* correspondem os caracteres de c!digo B-/II iguais aos
nRmeros situados no inter,a$o de 12* a 2G respecti,amente.
O c!digo de 4ormatao da sa+da 2 que indicar a 4orma como o conteRdo de uma ,ari,e$ do tipo
char ser e(ibido. -e c 2 uma ,ari,e$ do tipo charG podeIse associar a sua sa+da com os c!digos gdG goG
g(G gc. Co primeiro caso o nRmero armazenado em c 2 e(ibidoK no segundo caso este nRmero ser e(ibido
no sistema octa$K no terceiroG o nRmero ser e(ibido no sistema 6e(adecima$ e no R$timo caso ser e(ibido o
caractere como comentado acima. Por e(emp$oG se o conteRdo da ,ari,e$ char c 2 "&G o comando
print4@<gc gd go g(<G cG cG cG cAK
e(ibir na te$a
/ "& 1)3 43
B razo 2 disto 2 que "& 2 o c!digo B-/II de / no sistema decima$G 1)3 2 este c!digo no
sistema octa$ e 43 2 o c!digo B-/II de / no sistema 6e(adecima$.
]uando um argumento 2 uma constanteG e$e ser e(ibido de 4orma que depende do c!digo de
4ormatao. ]uando a constante 2 uma cadeia de caracteresG no 6 muito o que 4azerF a e(ecuo do
comando
print4@<'ste comando e(ibir a pa$a,ra gs<G <paz<AK
e(ibir na te$a a 4rase
'ste comando e(ibir a pa$a,ra paz
da mesma maneira que o comando
print4@<'ste comando e(ibir a pa$a,ra paz<AK
que 2 muito mais simp$es.
Por2mG quando a constante 2 um caractere ou um nRmero inteiroG o que ser e(ibido depende do
c!digo de 4ormatao. Por e(emp$oG o comando
print4@<gc<G OBOAK
e(ibe o caractere BG enquanto que o comando
print4@<gd<G OBOAK
e(ibir o nRmero ". Por sua ,ezG o comando
print4@<gd<G "AK
e(ibe o nRmero "G enquanto que o comando
print4@<gc<G "AK
e(ibe o caractere B.
Obser,e que re4er8ncias a constantes caracteres 2 4eita com o caractere escrito entre ap!stro4osG
enquanto que re4er8ncias a cadeias de caracteres so 4eitas com as cadeias escritas entre aspasG como H 4oi
obser,ado antes.
's !,digos espe!iais
?e acordo com a tabe$a abai(oG os cdigos especiais permitem a e(ibio de a$guns caracteresG como
gG lG dentro de uma mensagem e a rea$izao de a1es que permitem a 4ormatao da sa+da de modo que
esta seHa e$egante e agrad,e$ para o usurio.
Tabela - Cdigos especiais da )un"#o print)*+
/!digo Bo
ln $e,a o cursor para a pr!(ima $in6a
lt e(ecuta uma tabu$ao
lb e(ecuta um retrocesso
l4 $e,a o cursor para a pr!(ima pgina
la emite um sina$ sonoro @beepA
l< e(ibe o caractere <
ll e(ibe o caractere l
lg e(ibe o caractere g
:ma obser,ao interessante 2 que o c!digo La pode ser obtido atra,2s do caractere de c!digo B-/II
igua$ a &. BssimG a e(ecuo dos comandos printf@<la<AK e printf@<gc<G &AK rea$izam a mesma ao de emisso
de um sina$ sonoro.
B uti$izao do c!digo Ln permite que a e(ibio de constantes ou de conteRdos de ,ari,eis atra,2s da
4uno printf/0 possa ser 4eita em $in6as di4erentes. Co e(emp$o dado na seo anterior sobre o a$in6amento
da sa+da dos dadosG a sa+da poderia ser 4eita com uma Rnica c6amada da 4uno printf/0. #epetindo o re4erido
e(emp$oG se os conteRdos das ,ari,eis do tipo float (G ` e z so 1)3.4G .3"&* e 4.)G o comando
print4@<g13.24<Nn g13.24 ln g13.24<G (G `G zAK
e(ibe na te$a
1)3.4
.3&
4.))
*&6 Comando de atri)uio
Arma(enando dados gerados pelo programa
B seo 2.& apresentou o comando que permite que se armazene em ,ari,eis a entrada do
programa. Bgora ,eremos como armazenar dados gerados durante a e(ecuo de um programa.
/onsidere um programa para o c$cu$o da m2dia de uma re$ao de nRmeros. Catura$menteG a
quantidade de nRmeros da re$ao @se no 4oi 4ornecida a prioriA de,e ser de a$guma 4orma
determinada e armazenada em a$guma ,ari,e$ para que possa ser uti$izada no c$cu$o 4ina$ da
m2dia pretendida.
O armazenamento de dados gerados pe$o pr!prio programaG a$tera1es no conteRdo de ,ari,eis e
determina1es de resu$tados 4inais de um processamento so rea$izados atra,2s do comando de atribui#!oG
que de,e ser escrito com a seguinte sinta(e.
Identi4icador de ,ari,e$ X e(pressoK
B e(presso do segundo membro pode se resumir a um ,a$or constante pertencente ao tipo de
dado da ,ari,e$ do primeiro membroG caso em que o ,a$or 2 armazenado naque$a ,ari,e$. -e no
4or este o casoG a e(presso 2 a,a$iada eG se 4or do mesmo tipo da ,ari,e$ do primeiro membroG o
resu$tado 2 armazenado na ,ari,e$.
B e(presso do segundo membro pode en,o$,er a pr!pria ,ari,e$ do primeiro membro. Ceste casoG o
conteRdo anterior da ,ari,e$ ser uti$izado para a a,a$iao da e(presso e ser substitu+do pe$o ,a$or desta
e(presso. Por e(emp$oG se i 2 uma ,ari,e$ do tipo int ou do tipo float o comando i X i W 1K 4az com que o
seu conteRdo seHa incrementado de uma unidade.
0eremos ao $ongo do $i,ro que comandos do tipo i X i W 1K aparecem com muita 4requ8ncia. B
$inguagem / o4erece uma 4orma simp$i4icada de escre,er este comandoF iWWK. 'sta sinta(e se tornou to
caracter+stica da $inguagem / que sua <amp$iao< para incorporar recursos de programao orientada a
obHetos 4oi denominada /WW @de 4orma seme$6anteG o comando i X i [ 1 pode ser escrito iIIKA. O incremento
de uma ,ari,e$ de uma unidade tamb2m pode ser obtido atra,2s do comando WWi e estas e(press1es podem
4igurar em e(press1es aritm2ticas. B di4erena entre iWW e WWi pode ser entendida no seguinte e(emp$o. B
sequ8ncia de comandos
i X 2K
H X iWWK
7 X WWiK
rea$iza as seguintes a1esF
i X 2G armazena em i o ,a$or 2K
H X iWWG armazena em 3 o ,a$or 2 e armazena em i o ,a$or 3 @incrementa o ,a$or de iAK
7 X WWiG armazena em i o ,a$or 4 @incrementa o ,a$or de iA e armazena o ,a$or 4 na ,ari,e$ 3.
Um e3emplo simplesA determinando a parte fra!ion#ria de um
nJmero
/omo dissemos na seo 2.3G o armazenamento de um ,a$or de ponto 4$utuante numa ,ari,e$ do tipo
int 4az com que seHa armazenada na ,ari,e$ a parte inteira do ,a$or de ponto 4$utuante. Isto permite que se
e(traia 4aci$mente a parte 4racionria de um nRmero. Por e(emp$oG o programa a seguir 4ornece a parte
4racionria de um nRmero dadoG ca$cu$ada como a di4erena entre e$e e a sua parte inteira.
Nf Programa que 4ornece a parte 4racionria de um nRmero dado fN
kinc$ude Zstdio.6Y
main@A
a
4$oat CumG 3racK
int InteiroK
print4@<?igite um numero <AK
scan4@<g4<G hCumAK
Inteiro X CumK
3rac X Cum I InteiroK
print4@<B parte 4racionaria de g4 eO g4 <G CumG 3racAK
b
= que se ter cuidado com nRmeros 4racionrios. J 4oi dito que o sistema @e qua$quer ambiente para
programaoA no armazena e(atamente todos os nRmeros reaisG armazenandoG de 4atoG apro(ima1es da
maioria de$es. Por e(emp$oG se modi4icssemos o comando de sa+da do programa anterior para
print4@<B parte 4racionaria de g4 eO g.%4 <G CumG 3racAK
e o e(ecutssemos para a entrada 2.413*1 ter+amos como sa+da a 4rase
B parte 4racionaria de 2.413*1 eO ).413*1))1P
O ponto de e(c$amao @que no 4az parte da sa+da do programaA 4oi posto pe$o 4ato de que a
sa+da esperada para esta entrada seria ).413*1.
Com)inando !omandos de atri)uio !om operadores aritm8ti!os
O comando de atribuio pode ser combinado com operadores aritm2ticos para substituir atribui1es
cuHa e(presso do segundo membro conten6a a ,ari,e$ do primeiro membro. -e ' 4or o identi4icador da
,ari,e$ e m 4or um operador aritm2ticoG a atribuio
( X ( m @e(pressoAK
pode ser indicadaG simp$esmenteG por
( mX e(pressoK
Por e(emp$oG
( fE 4K equi,a$e a ( X (f4K
( WX K equi,a$e a ( X ( W K
( gX ` W 1K equi,a$e a ( X ( g @` W 1AK
( IX K equi,a$e a ( X ( [ K
( NX 2K equi,a$e a ( X (N2K.
?e acordo com o obHeti,o do $i,roG e,itaremos a uti$izao destas op1es o4erecidas pe$a
$inguagem /G por entendermos que e$as podem di4icu$tar a $egibi$idade do comando. Co nosso
entendimentoG s! programadores mais e(perientes de,em usar estes recursos.
Lendo !ara!teres
B$em da possibi$idade de se dar entrada em caracteres atra,2s da 4uno scanf/0 com c!digo de
con,erso <gc<G podeIse dar entrada em caracteres uti$izandoIse as 4un1es getch/0 e getche/0 cuHos
cabea$6os encontramIse no arqui,o conio2h. Para a e(ecuo destas 4un1es 2 necessrio que se acione uma
tec$aK quando isto 2 4eitoG o caractere correspondente 2 retornado pe$a 4uno e pode ento ser armazenado
numa ,ari,e$ do tipo char atra,2s de um comando de atribuio. B di4erena entre estas 4un1es 2 que na
primeira o caractere digitado no aparece na te$a de traba$6oG o que acontece com a segunda 4uno. Por
e(emp$oG a e(ecuo do programa
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
main@A
a
c6ar cK
c X getc6@AK
print4@<0oce digitou a $etra gc ln<G cAK
b
digitandoIse a $etra B dei(a a te$a de traba$6o da seguinte 4orma
0oce digitou a $etra B
enquanto que a e(ecuo do programa
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
main@A
a
c6ar cK
c X getc6e@AK
print4@<0oce digitou a $etra gc ln<G cAK
b
dei(a a te$a de traba$6o da seguinte 4ormaF
B
0oc8 digitou a $etra B
*&$9 E3emplos Parte I
$& 0o$tando ao programa do c$cu$o da m2dia de tr8s nRmeros dadosG obser,e que a m2dia 4oi
ca$cu$ada e e(ibidaG mas no 4oi armazenada. -e este programa 4izesse parte de um programa maior @e isto
norma$mente aconteceP Co se usa computao para uma questo to simp$esPA e esta m2dia 4osse necessria
em outra parte do programaG aque$e trec6o teria que ser rescrito. U uma boa prticaG portantoG que resu$tados
4inais de processamento seHam armazenados em ,ari,eisG sendo ento os conteRdos destas ,ari,eis
e(ibidos atra,2s da 4uno printf/0. BssimG o programa re4erido 4icaria me$6or escrito da seguinte 4orma.
Nf Programa que determina a m2dia de tr8s nRmeros dados fN
kinc$ude Zstdio.6Y
main@A
a
4$oat aG bG cG >ediaK
puts@<?igite tr8s nRmeros<AK
scan4@<g4 g4 g4<G haG hbG hcAK
>edia X @a W b W cAN3K
print4@<B media dos nRmeros g4 G g4 e g4 2 igua$ a g4 <G aG bG cG >ediaAK
b
*& Bgora apresentaremos um programa que recebendo um nRmero inteiro como entrada 4ornece o
a$garismo da casa das unidades deste nRmeroG questo discutida no cap+tu$o 1. /omo ,imos naque$e cap+tu$oG
o a$garismo procurado 2 o resto da di,iso do nRmero dado por 1). 9emos ento o seguinte programa @no
cap+tu$o " ,eremos um programa que necessita da so$uo desta questoA.
Nf Programa que determina o a$garismo da casa das unidades de um inteiro dado fN
kinc$ude Zstdio.6Y
main@A
a
int CumG :nidadesK
print4@<?igite um inteiro<AK
scan4@<gd<G hCumAK
:nidades X Cum g 1)K
print4@<O a$garismo da casa das unidades de gd eO gd <G CumG :nidadesAK
b
-& -e quis2ssemos um programa para in,erter um nRmero com dois a$garismos @por e(emp$oG se a
entrada 4osse &4G a sa+da de,eria ser 4&A poder+amos uti$izar o seguinte 4atoF se ( e ` so os a$garismos de um
nRmero @casa das dezenas e casa das unidadesG respecti,amenteAG ento este nRmero 2 ( . 1) W `. BssimG a
in,erso seria ` . 1) W ( e bastaria e(trair os dois a$garismos do nRmero dado e uti$izar a e(presso acima.
B e(trao do a$garismo da casa das unidades 4oi mostrada no e(emp$o anterior. ' o a$garismo da casa das
dezenasV Dasta ,er que e$e 2 o quociente da di,iso do nRmero por 1) e este quociente 2 obtido atra,2s do
operador N com operandos inteiros. 9emos ento o seguinte programa.
Nf Programa que in,erte um nRmero com dois a$garismos fN
kinc$ude Zstdio.6Y
main@A
a
int CumG :nidadesG ?ezenasG In,ertidoK
print4@<?igite um inteiro com dois a$garismos<AK
scan4@<gd<G hCumAK
:nidades X Cum g 1)K
?ezenas X CumN1)K
In,ertido X :nidades f 1) W ?ezenasK
print4@<O in,ertido de gd eO gd <G CumG In,ertidoAK
b
?i4ici$mente o caro $eitor ,ai escre,er um programa com este obHeti,o @para que ser,e
in,erter um nRmero com dois a$garismosVA. 'sta questo e a$gumas outras esto sendo discutidas
aqui apenas como e(emp$os para o desen,o$,imento da $!gica de programao e pe$o 4ato de que
podem ser trec6os de programas maioresG o que ser mostrado no pr!(imo e(emp$o.
.& Imagine que queiramos um programa que determine o menor mR$tip$o de um inteiro dado maior do
que um outro inteiro dado. Por e(emp$oG se a entrada 4osse 13 e 1))G a sa+da de,eria ser 1)4 @1)4 2 o menor
mR$tip$o de 13 que 2 maior que 1))A. /omo
di,idendo X di,isor ( quociente W resto e resto Z di,isorG
temos que o ,a$or da e(presso
di,idendo I resto W di,isor
2 o mR$tip$o procurado.
NfPrograma que determina o menor mR$tip$o de um inteiro maior que outro inteirofN
kinc$ude Zstdio.6Y
main@A
a
int CumG ?i,isorG >en>u$tip$oK
print4@<?igite o inteiro do qua$ o nRmero procurado de,e ser mR$tip$o<AK
scan4@<gd<G h?i,isorAK
print4@<?igite o inteiro que de,e ser menor que o mR$tip$o ln<AK
scan4@<gd<G hCumAK
>en>u$tip$o X Cum I Cum g ?i,isor W ?i,isorK
print4@<O menor mu$tip$o de gd maior do que gd eO gd ln<G ?i,isorG CumG >en>u$tip$oAK
b
/& 0amos uti$izar o racioc+nio desen,o$,ido no e(emp$o anterior para escre,er um programa que ser
parte 4undamenta$ de uma ap$icao prtica a ser discutida no pr!(imo cap+tu$o. O e(emp$o mostrar
tamb2m a$go mais ou menos !b,ioG mas que de,e ser destacadoF um programador s! 2 capaz de escre,er um
programa que reso$,a um determinado prob$ema se e$e souber reso$,er o ta$ prob$ema <na mo<G ou seHaG
com a uti$izao apenas de $pis e pape$.
9rataIse de um programa para determinar a quantidade de mR$tip$os de um inteiro dado :
compreendidos @estritamenteA entre dois inteiros ' e y dados. Por e(emp$oG se a entrada 4or : X &G ' X 1) e y X
42G o programa de,e retornar a mensagem a quantidade de m1ltiplos de N compreendidos entre MO e PQ ; P
@que so 14G 21G 2*G 3A.
:ma so$uo Lna moM desta questo uti$iza progress$es aritm;ticasG assunto da >atemtica que 2
estudada no 'nsino >2dio. :ma progress!o aritm;tica de primeiro termo a
M
e ra.!o r 2 uma sequ-ncia de
nRmeros a
M
G a
Q
G ...G a
n
cuHa di4erena entre dois termos consecuti,os 2 constante e igua$ a r. U 4ci$ pro,ar que
a
n
X a
M
W @n [ 1Ar.
Ca nossa questoG a
M
2 o menor mR$tip$o de : maior que ' @e(emp$o anteriorAG a
n
2 o maior mR$tip$o de
: menor que y e r 2 igua$ a :. U 4ci$ ,er que o maior mR$tip$o de : menor que y 2 dado por @y [ 1A [ @y [ 1A g
:G sendo y [ 1 uti$izado para gerenciar o caso em que y 2 mR$tip$o de :G H que queremos mR$tip$os de :
menor que y.
NfPrograma que determina o nRmero de mR$tip$os de um inteiro 7 situados entre dois inteiros ( e `fN
kinc$ude Zstdio.6Y
main@A
a
int iG (G `G aG 7G Cum>u$tip$os X )K
print4@<?igite os inteiros ( e ` @` Y (A<AK
scan4@<gd gd<G h(G h`AK
a X ` I 1K
print4@<?igite o inteiro 7 ln<AK
scan4@<gd<G h7AK
Cum>u$tip$os X @a I a g 7 I ( W ( g 7AN7K
print4@<O nRmero de mu$tip$os de gd compreendidos entre gd e gd eO gd ln<G 7G (G `G
Cum>u$tip$osAK
b
1& O programa a seguirG a$2m de ser muito interessante no sentido do desen,o$,imento da $!gica de
programaoG ser uti$izado @a sequ8ncia de comandos da 4uno main/0A em outros programas. -eu obHeti,o
2 permutar os conteRdos de duas ,ari,eis. Ou seHaG supon6amos queG atra,2s de comandos de entrada o
programa armazenou nas ,ari,eis ' e y os ,a$ores & e 1* e pretendamos que o programa 4aa com que o
conteRdo de ' passe a ser 1* e o de y passe a ser igua$ a &. n primeira ,istaG bastaria a sequ8ncia de
comandos
( X `K
` X (K
Ocorre queG quando o segundo comando 4osse e(ecutadoG o primeiro H teria sido e o conteRdo de '
no seria mais o origina$. Co nosso e(emp$oG ter+amos a seguinte situao
( `
1& *
*
*
e a permuta no teria sido 4eitaG a$2m do 4ato de que o conteRdo origina$ de ' teria sido perdido. :ma
a$ternati,a 2 considerar uma ,ari,e$ au(i$iar que <guarde< o conteRdo de ' antes que este seHa substitu+do
pe$o conteRdo de y. 9er+amos assim o seguinte programa.
Nf Programa que permuta os conteRdos de duas ,ari,eis fN
kinc$ude Zstdio.6Y
main@A
a
4$oat (G `G Bu(K
print4@<?igite os dois numeros <AK
scan4@<g4 g4<G h(G h`AK
print4@<'ntrada ( X g).14G ` X g).14 ln<G (G `AK
Bu( X (K
( X `K
` X Bu(K
print4@<-aida ( X g).24G ` X g).24 ln<G (G `AK
b
/abe obser,ar que a permuta dos conteRdos pode ser obtida sem a uti$izao da ,ari,e$ Au'. Isto 2
dei(ado para que o $eitor descubra a so$uoG sendo apresentado como e(erc+cio proposto.
*&$$ Fun:es de )i)liote!a
/omo dissemos na seo 2.G os compi$adores / o4erecem di,ersas 4un1es com obHeti,os pr2I
determinados e que podem ser e(ecutadas durante a e(ecuo de um programa. Para isto a e(ecuo da
4uno de,e ser so$icitada no programa como uma instruoG como operando de uma e(presso ou como
argumento de outra 4uno @a so$icitao da e(ecuo de uma 4uno 2 norma$mente c6amada de ativa#!o ou
chamada da 4unoA. Para que o programador possa co$ocar no seu programa uma instruo que ati,e uma
4uno 2 necessrio que e$e con6ea o identificador da 4unoG quantos e de que tipo so os argumentos com
que e$as de,em ser ati,adas e o tipo de ,a$or que e$a retorna ao programa quando termina sua e(ecuo
@como H 4oi ditoG este conHunto constitui o prottipo da 4unoA. B de4inio de uma 4uno pr2Ide4inida se
4az atra,2s da seguinte sinta(e.
Identi4icador da 4uno@Lista de argumentosA
sendo que a $ista de argumentos pode ser ,azia. B tabe$a a seguir apresenta a$gumas das 4un1es pr2I
de4inidas dos compi$adores /G indicando o tipo dos seus argumentos e comentando o seu ,a$or de retorno.
Tabela 12 Algumas )un"%es de biblioteca
Identi4icador Brgumentos O que retorna
4abs@(A doub$e 0a$or abso$uto do argumento (
acos@(A doub$e Brco cuHo ,a$or do coIseno 2 o argumento (
asin@(A doub$e Brco cuHo ,a$or do seno 2 o argumento (
atan@(A doub$e Brco cuHo ,a$or da tangente 2 o argumento (
cos@(A doub$e /oIseno do argumento (
$og@(A doub$e Logaritmo natura$ do argumento (
$og1)@(A doub$e Logaritmo decima$ do argumento (
po5@(G `A doub$eG doub$e Brgumento ( e$e,ado ao argumento `
po51)@(A int 1) e$e,ado ao argumento (
random@(A int :m nRmero a$eat!rio entre ) e ( I 1
sin@(A doub$e -eno do argumento (
sqrt@(A doub$e #aiz quadrada do argumento (
tan@(A doub$2 9angente do argumento (
to$o5er@(A c6ar /on,erte o caractere ( para minRscu$o
toupper@(A c6ar /on,erte o caractere ( para maiuscu$o
O prot!tipo da 4uno random/0 se encontra no arqui,o stdlib2h e os prot!tipos das 4un1es tolo)er/0 e
toupper/0 esto no arqui,o ctype2h. Os prot!tipos das outras 4un1es esto no arqui,o math2h queG como seu
nome indicaG cont2m os prot!tipos das 4un1es matemticas. Para que a 4uno random/0 seHa ati,ada 2
necessrio que sua ati,ao seHa precedida pe$a ati,ao da 4uno randomi.e/0 que ati,a o gerador de
n1mero aleatrio. Por e(emp$oG o programa abai(o e(ibir um nRmero a$eat!rio entre ) e %%.
Nf programa que e(ibeG a$eatoriamenteG um nRmero entre ) e %% fN
kinc$ude Zstdio.6Y
kinc$ude Zstd$ib.6Y
main@A
a
int (K
randomize@AK
( X random@1))AK
print4@<gd ln<G (AK
b
O e(emp$o a seguirG a$2m de pretender moti,ar o pr!(imo cap+tu$oG ressa$ta uma obser,ao H 4eita
anteriormenteF um programador s! 2 capaz de escre,er um programa que reso$,a um determinado prob$ema
se e$e souber reso$,er o ta$ prob$ema <na mo<G ou seHaG com a uti$izao apenas de $pis e pape$. 9rataIse de
um programa que ca$cu$e a rea de um tri.ngu$oG dados os comprimentos dos seus $ados. Catura$menteG s! 2
capaz de escre,er este programa aque$e que con6ecer a 4!rmu$a abai(oG que d a rea do tri.ngu$o cuHos
$ados t8m comprimentos aG b e cF
A @ . A @ . A @ . c p b p a p p S
onde
2
c b a
p
+ +

2 o semipermetro do tri.ngu$o. /om istoG temos o seguinte programa.


NfPrograma que determina a rea de um tri.ngu$o de $ados de comprimentos dadosfN
kinc$ude Zstdio.6Y
kinc$ude Zmat6.6Y
main@A
a
4$oat (G `G zG BreaG -emiPerK
print4@<?igite os comprimentos dos $ados do triangu$o<AK
scan4@<g4 g4 g4<G h(G h`G hzAK
-emiPer X @( W ` W zAN2K
Brea X sqrt@-emiPer f @-emiPer I (A f @-emiPer I `A f @-emiPer I zAAK
print4@<B area do triangu$o de $ados g4 G g4 e g4 eO igua$ a g4 ln<G (G `G zG BreaAK
b
-e este programa 4or e(ecutado com entrada 3G 4 e temos -emiPer X " e
3" A " @ . A 4 " @ . A 3 " @ . " S
eG como era de se esperarG a rea do tri.ngu$o cuHos $ados t8m comprimento 3G 4 e unidades de
comprimento 2 igua$ a " unidades de rea.
BgoraG se este programa 4osse e(ecutado para entrada 1G 2 e ter+amos -emiPer X 4G
24 A 4 @ . A 2 4 @ . A 1 4 @ . 4 S e ocorreria erro de e(ecuo pois o sistema @como era de se
esperarA no ca$cu$a raiz quadrada de nRmero negati,o.
O que acontece 2 que nem sempre tr8s nRmeros podem ser comprimentos dos $ados de um tri.ngu$o @a
matemtica pro,a que isto s! acontece se cada um de$es 4or menor do que a soma dos outros doisA. BssimG o
comando que ca$cu$a a Area s! de,eria ser e(ecutado se os ,a$ores digitados para 'G yG e . pudessem ser
comprimentos dos $ados de um tri.ngu$o.
*&$* E3er!5!ios propostos
$& B,a$ie cada uma das e(press1es abai(o.
aI @I@I%A W sqrt@@I%Af@I%A I 4f3f"AAN@2f3A.
)I @@po5@3G 2A XX %A hh @acos@)A XX )AA ii @4 g * XX 3A.
*& 'scre,a programas para
aI /on,erter uma temperatura dada em graus 3a6ren6eit para graus /e$sius.
)I oerar o invertido de um nRmero com tr8s a$garismos @e(emp$oF o invertido de 4%* 2 *%4A.
!I -omar duas 4ra1es ordinriasG 4ornecendo o resu$tado em 4orma de 4rao.
dI ?eterminar o maior mR$tip$o de um inteiro dado menor do que ou igua$ a um outro inteiro dado
24 A 4 @ . A 2 4 @ . A 1 4 @ . 4 S
@e(emp$oF o maior mR$tip$o de & menor que ) 2 4%A.
eI ?eterminar o per+metro de um po$+gono regu$ar inscrito numa circun4er8nciaG dados o nRmero de
$ados do po$+gono e o raio da circun4er8ncia.
-& 'scre,a um programa que permute o conteRdo de duas ,ari,eis sem uti$izar uma ,ari,e$ au(i$iar
@,er e(emp$o da seo 2.%A.
.& :ma $oHa ,ende seus produtos no sistema entrada mais duas presta1esG sendo a entrada maior do
que ou igua$ s duas presta1esK estas de,em ser iguaisG inteiras e as maiores poss+,eis. Por e(emp$oG se o
,a$or da mercadoria 4or #m 2&)G))G a entrada e as duas presta1es so iguais a #m %)G))K se o ,a$or da
mercadoria 4or #m 3)2G&G a entrada 2 de #m 1)2G& e as duas presta1es so a iguais a #m 1))G)). 'scre,a
um programa que receba o ,a$or da mercadoria e 4ornea o ,a$or da entrada e das duas presta1esG de acordo
com as regras acima. Obser,e que uma Husti4icati,a para a adoo desta regra 2 que e$a 4aci$ita a con4eco e
o consequente pagamento dos bo$etos das duas presta1es.
/& :m inter,a$o de tempo pode ser dado em diasG 6orasG minutosG segundos ou sequ8ncias
<decrescentes< destas unidades @em dias e 6orasK em 6oras e minutosK em 6orasG minutos e segundosAG de
acordo com o interesse de quem o est manipu$ando. 'scre,a um programa que con,erta um inter,a$o de
tempo dado em segundos para 6orasG minutos e segundos. Por e(emp$oG se o tempo dado 4or 3 *) segundosG
o programa de,e 4ornecer 1 6 4 min 1) s.
1& 'scre,a um programa que con,erta um inter,a$o de tempo dado em minutos para 6orasG minutos e
segundos. Por e(emp$oG se o tempo dado 4or 14.*& minG o programa de,e 4ornecer 2 6 2 min 2.2 s @,a$e
$embrar que o ponto 2 o separador da parte inteiraA.
2& :m programa para gerenciar os saques de um cai(a e$etr;nico de,e possuir a$gum mecanismo para
decidir o nRmero de notas de cada ,a$or que de,e ser disponibi$izado para o c$iente que rea$izou o saque. :m
poss+,e$ crit2rio seria o da <distribuio !tima< no sentido de que as notas de menor ,a$or dispon+,eis 4ossem
distribu+das em nRmero m+nimo poss+,e$. Por e(emp$oG se a mquina s! disp1e de notas de #m )G de #m 1)G
de #m e de #4 1G para uma quantia so$icitada de #m *&G o programa de,eria indicar uma nota de #m )G tr8s
notas de #m 1)G uma nota de #m e duas notas de #m 1. 'scre,a um programa que receba o ,a$or da quantia
so$icitada e retorne a distribuio das notas de acordo com o crit2rio da distribuio !tima.
4& ?e acordo com a >atemtica 3inanceiraG o c$cu$o das presta1es para amortizao de um
4inanciamento de ,a$or 3 em n presta1es e a uma ta(a de Huros i 2 dada pe$a 4!rmu$a P X 3Na
niG
onde
a
ni
X @@1 W iA
n
[ 1AN@i . @1 W iA
n
A. 'scre,a um programa que determine o ,a$or das presta1es para
amortizao de um 4inanciamentoG dados o ,a$or do 4inanciamentoG o nRmero de presta1es para amortizao
e a ta(a de Huros.
')servao
Propostas de solu:es dos e3er!5!ios propostos podem ser soli!itadas atrav8s de mensagem
eletr;ni!a para jaime<!!en&ufal&)r !om assunto 0E"P'"=A" LI0' C, ane3ando o formul#rio
a)ai3o devidamente preen!>ido&
?ome Categoria
$
Instituio
*
Curso
*
Cidade@Estado
$
CategoriaA do!ente, estudante, autodidata
*
"e do!ente ou estudante
- - Estruturas de seleo
-&$ ' +ue 8 uma estrutura de seleo
O R$timo e(emp$o do cap+tu$o anterior apresenta,a um programa para ca$cu$ar a rea de um tri.ngu$oG
dados os comprimentos dos seus $ados. 3oi ,isto que o comando que ca$cu$a,a a rea so$icitada s! de,ia ser
e(ecutado com a certeza anterior de que os ,a$ores dados como entrada poderiam ser comprimentos dos
$ados de um tri.ngu$o. Ou seHaG o ta$ comando s! de,eria ser e(ecutado se ' H y 8 . e y H ' 8 . e . H ' 8 yG
condio que garante que os ,a$ores armazenados nas ,ari,eis 'G y e . so comprimentos dos $ados de um
tri.ngu$o. BssimG em a$gumas situa1esG a$guns comandos s! de,em ser e(ecutados se a$guma condio 4or
satis4eita.
U muito 4ci$ encontrar situa1es em que a e(ecuo de uma ou mais instru1es de,e estar
condicionada ao 4ato de que uma condio seHa satis4eita. Por e(emp$oG ,eremos a$goritmos para ordenar
uma re$ao de nRmeros que necessitam co$ocar em ordem crescente os conteRdos de duas ,ari,eis. U !b,io
que para ordenar em ordem crescente os conteRdos de duas ,ari,eis ' e y s! 2 necessrio se 4azer a$guma
coisa se o conteRdo de ' 4or maior que o conteRdo de yG ou seHaG se ' Y y.
= situa1es tamb2m em que 6 necessidade de que se 4aa uma esco$6a entre duas ou mais
sequ8ncias de instru1es qua$ a sequ8ncia de,e ser e(ecutada. Por e(emp$oG se pretendemos ,eri4icar se um
nRmero n 2 par podemos determinar o resto da di,iso de n por 2. -e este resto 4or zeroG ento o nRmero 2
par. -e este resto 4or 1G o nRmero 2 +mpar.
0a$e $embrar que os a$goritmos que o ,i,er e(ige que e(ecutemos diuturnamente so pontuados de
esco$6as e decis1esF se n!o chover, iremos para a praiaG se chover, iremos para o shoppingK se estiver
fa.endo frio, vista um casaco.
B ,eri4icao de que uma condio 2 satis4eita eG a partir da+G uma determinada sequ8ncia de
comandos de,e ser e(ecutada 2 c6amada de estrutura de sele#!oG estrutura de decis!o ou comando de
sele#!o.
-&* ' !omando i)
O comando if 2 uma estrutura de deciso que decide se uma sequ8ncia de comandos ser ou no
e(ecutada. -ua sinta(e 2
i4 @'(pressoA
a
sequ8ncia de comandos
b
sendo os de$imitadores opcionais se a sequ8ncia de comandos cont2m um Rnico comando.
B sem.ntica deste comando 2 muito simp$esF se o ,a$or da *'press!o 4or di4erente de zeroG o sistema
e(ecutar a sequ8ncia de comandosK caso contrrio o sistema no e(ecutar a sequ8ncia de comandos e a
instruo ap!s o comando if passa a ser e(ecutada.
Por e(emp$oG se queremos um programa que determine o maior de dois nRmeros dadosG podemos
supor que o primeiro de$es 2 o maiorG armazenandoIo numa ,ari,e$ ?aior e depoisG atra,2s de um comando
ifG ,eri4icar se o maior procurado 2 o segundo dos nRmeros dadosK neste caso o conteRdo da ,ari,e$ ?aior
de,e ser a$terado.
NfPrograma para determinar o maior de dois nRmeros dados fN
kinc$ude Zstdio.6Y
main@A
a
4$oat aG bG >aiorK
print4@<?igite os dois numeros<AK
scan4@<g4 g4<G haG hbAK
>aior X aK
i4 @b Y aA
>aior X bK
print4@<O maior dos numeros g4 G g4 eO g4 <G aG bG >aiorAK
b
:m outro e(emp$o de uti$izao do comando if aparece num programa que pretenda ordenar os
conteRdos de ,ari,eis ' e y. Para isto s! 6 de necessidade de se rea$izar a$guma ao se o conteRdo de y 4or
maior do que o conteRdo de '. Ceste casoG o que de,e ser 4eito 2 a permuta dos conteRdos de ' e de y. 9emos
ento o seguinte programa.
Nf Programa para ordenar os conteRdos de duas ,ari,eis fN
kinc$ude Zstdio.6Y
main@A
a
4$oat (G `G Bu(K
print4@<?igite os dois numeros<AK
scan4@<g4 g4<G h(G h`AK
print4@</onteudos originais de ( e de `F g4 G g4 lnF <G (G `AK
i4 @` Z (A
a
Bu( X (K
( X `K
` X Bu(K
b
print4@</onteudos de ( e de ` ordenadosF g4 G g4F ln<G (G `AK
b
Obser,e que a sequ8ncia de comandos
Bu( X(K
( X `K
` X Bu(K
rea$iza a permuta dos conteRdos das ,ari,eis ' e yG como discutido em e(emp$o do cap+tu$o anterior.
-&- ' !omando i) else
O comando if else 2 uma estrutura de deciso que decide entre duas sequ8ncias de comandos qua$ ,ai
ser e(ecutadaG sendo de4inido atra,2s da seguinte sinta(eF
i4 @'(pressoA
a
-equ8ncia de comandos 1
b
e$se
a
-equ8ncia de comandos 2
b
B sem.ntica deste comando 2 a seguinteF se o ,a$or de *'press!o 4or di4erente de zeroG o sistema
e(ecutar a sequ8ncia de comandos 1K caso contrrio o sistema e(ecutar a sequ8ncia de comandos 2.
Por e(emp$oG se queremos um programa que ,eri4ique a paridade de um nRmero dadoG poder+amos
,eri4icar se o resto da di,iso do nRmero por dois 2 igua$ a ). -e isto 4or ,erdadeG o nRmero 2 parK se no 4or
,erdadeG o nRmero dado 2 +mpar.
Nf Programa para ,eri4icar se um nRmero eO par fN
kinc$ude Zstdio.6Y
main@A
a
int (G `K
print4@<?igite o numero<AK
scan4@<gd<G h(AK
i4 @( g 2 XX )A
print4@<gd eO par ln<G (AK
e$se
print4@<gd eO impar ln<G (AK
b
>esmo considerando que os compi$adores da $inguagem / no consideram espaos nem mudanas de
$in6aG obser,e que estamos procurando escre,er cada instruo em uma $in6a e a sequ8ncia ,incu$ada
estrutura de deciso com uma tabu$ao di4erente da tabu$ao em que esto postos o if e o else. 'sta 4orma
de se editar um programaG c6amada indenta#!oG de,e ser praticada por todo programador pois e$a 4aci$ita
sobremaneira a $egibi$idade dos programas. -e o programa acima 4osse digitado da 4orma seguinte
Nf Programa para ,eri4icar se um nRmero 2 parfN
kinc$ude Zstdio.6Y
main@Aa
int (G `K print4@<?igite o numero<AK scan4@<gd<G h(AK
i4 @( g 2 XX )A print4@<gd eO par ln<G (AK e$se
print4@<gd eO impar ln<G (AK
b
e$e seria e(ecutado da mesma 4ormaG por2m a sua $egibi$idade estaria preHudicada.
-&. ' operador !ondi!ional tern#rio
]uando as duas op1es de um comando if else cont8m apenas uma atribuio a uma mesma ,ari,e$G
podeIse uti$izar o operador condicional ternrio que possui a seguinte sinta(eF
0ari,e$ X '(presso $!gica V '(presso 1 F '(presso 2K
Ca e(ecuo deste comando a *'press!o lgica 2 a,a$iada e se 4or di4erente de zero o ,a$or da
*'press!o M 2 atribu+do 5arivelK caso contrrioG o ,a$or da *'press!o Q 2 atribu+do. Por e(emp$oG se (G ` e
?aior so tr8s ,ari,eis do tipo float o armazenamento do maior dos conteRdos de ( e de ` na ,ari,e$
?aior poderia ser obtido com a seguinte atribuioF
>aior X @( Y `A V ( F `K
/omo um outro e(emp$oG para se armazenar na ,ari,e$ Abs%um o ,a$or abso$uto do conteRdo de uma
,ari,e$ %um @sem uti$izar a 4uno fabs/0A bastaria o comandoF
BbsCum X @Cum YX )A V Cum F ICumK
-&/ E3emplos Parte II
9& ?e um modo gera$G as $iga1es te$e4;nicas so cobradas pe$as suas dura1es. O sistema registra os
instantes em que a $igao 4oi iniciada e conc$u+da e 2 acionado um programa que determina o inter,a$o de
tempo decorrido entre aque$es dois instantes dados. O programa abai(o recebe dois instantes dados em 6oras
e minutos e determina o inter,a$o de tempo @em 6oras e minutosA decorrido entre e$es.
NfPrograma que determina o inter,a$o de tempo decorrido entre dois instantesfN
inc$ude Zstdio.6Y
main@A
a
int 61G min1G 62G min2G 6G minK
puts@<?igite o instante inicia$ @6oras e minutosA<AK
scan4@<gd gd<G h61G hmin1AK
puts@<?igite o instante 4ina$<AK
scan4@<gd gd<G h62G hmin2AK
6 X 62 I 61K
min X min2 I min1K
i4 @@6 Z )A ii @@6 XX )A hh @min Z )AAA
puts@<la?ados in,a$idosP O segundo instante 2 anterior ao primeiro<AK
e$se
a
i4 @min Z )A
a
6 X 6 I 1K
min X min W ")K
b
print4@ <'ntre os instantes gd6 gdmin e gd6 gdmin passaramIse gd6 gdmin<G 61G min1G 62G
min2G 6G minAK
b
b
$& Co R$timo e(emp$o do cap+tu$o 2G apresentamos um programa que ca$cu$a,a a rea de um tri.ngu$oG
dados os comprimentos dos seus $ados. Co 4ina$ de$eG mostramos que o mesmo no 4ornecia respostas
satis4at!rias para todas as entradas e comentamos que o c$cu$o da rea de,eria ser precedido da ,eri4icao
de que os dados de entrada so de 4ato comprimentos dos $ados de um tri.ngu$o. O programa re4eridoG escrito
agora de 4orma comp$eta e corretaG seria o seguinte.
Nf Programa para ca$cu$ar a rea de um tri.ngu$ofN
kinc$ude Zstdio.6Y
kinc$ude Zmat6.6Y
main@A
a
4$oat (G `G zG BreaG -emiPK
print4@<?igite os comprimentos dos $ados do triangu$o<AK
scan4@<g4 g4 g4<G h(G h`G hzAK
i4 @@( Z ` W zA hh @` Z ( W zA hh @z Z ( W `AA
a
-emiP X @( W ` W zAN2K
Brea X sqrt@-emiP f @-emiP I (A f @-emiP I `A f @-emiP I zAAK
print4@<B area do triangu$o de $ados g4 G g4 e g4 eO igua$ a g4 ln<G (G `G zG BreaAK
b
e$se
print4@<Os nRmeros g4G g4 g4 no podem ser comprimentos dos $ados de um tri.ngu$oln<G (G `G
zAK
b
*& Programas que manipu$am datas @por e(emp$oG um programa que determine o nRmero de dias entre
duas datas dadasA cont8m trec6os que ,eri4icam se um ano dado 2 bisse(to. -abendo que um ano 2 bisse(to
se e$e 2 mR$tip$o de quatroG ter+amos o seguinte programa.
NfPrograma que ,eri4ica se um dado ano 2 bisse(to fN
kinc$ude Zstdio.6Y
main@A
a
int BnoK
print4@<?igite o ano<AK
scan4@<gd<G hBnoAK
i4 @Bno g 4 XX )A
print4@<gd eO bisse(to gd ln<G BnoAK
e$se
print4@<gd no eO bisse(to gd ln<G BnoAK
b
#igorosamente 4a$andoG 6 anos mR$tip$os de quatro que no so bisse(tos. -o aque$es mR$tip$os de
1)) que no so mR$tip$os de 4)). Por e(emp$oG o ano 2))) 4oi um ano bisse(toG mas o ano de 21)) no
ser. Para que o programa detecte estas e(ce1esG a e(presso $!gica que contro$a o comando if de,e ser
amp$iada e ta$,ez seHa mais 4ci$ considerar a condio para que um ano no seHa bisse(toF no de,e ser
mR$tip$o de quatro ou se 4or mR$tip$o de 1)) no de,e ser mR$tip$o de 4)). Obser,e que agora optamos por
uma e(presso $!gica que garantisse o 4ato de que o ano dado no 2 bisse(to.
Nf Programa que ,eri4ica se um dado ano 2 bisse(to fN
kinc$ude Zstdio.6Y
main@A
a
int BnoK
print4@<?igite o ano<AK
scan4@<gd<G hBnoAK
i4 @@Bno g 4 PX )A ii @@Bno g 1)) XX )A hh @Bno g 4)) PX )AAA
print4@<gd nao eO bisse(to ln<G BnoAK
e$se
print4@<gd eO bisse(to ln<G BnoAK
b
-& O programa para ordenar os conteRdos de duas ,ari,eisG ,isto na seo 3.2G 2 um caso muito
particu$ar da questo mais gera$ da ordena#!o de uma re$ao de nRmeros ou de nomesG prob$ema que tem
,asta ap$icao na ,ida prticaG principa$mente na ordenao de uma $ista de nomes @este prob$ema tamb2m 2
con6ecido como classifica#!oA. Para a so$uo gera$ e(istem di,ersos a$goritmos com este obHeti,o. Co
cap+tu$o & teremos oportunidade de discutir programas baseados em a$guns destes a$goritmos. Por enquantoG
,eHamos um programa que ordene tr8s nRmeros dados. B$2m de e(emp$i4icar o comando ifG o programa
abai(o mostra como se pode @e se de,eA uti$izar racioc+nios anteriores para se escre,er programas.
-eHa ento um programa que receba tr8s nRmeros inteirosG armazeneIos nas ,ari,eis 'G y e . e que ao
4ina$ da sua e(ecuo dei(e os conteRdos de 'G de y e de . na ordem crescente. :ma ideia bem interessante 2
armazenar na ,ari,e$ ' o menor dos nRmeros e em seguida ordenar os conteRdos de y e de .G que 2
e(atamente o prob$ema de ordenar os conteRdos de duas ,ari,eisG que 4oi re4erido acima. Ob,iamenteG para
se e(ecutar a primeira ao pretendida @armazenar na ,ari,e$ ' o menor dos nRmerosA s! 2 necessrio se
4azer a$guma coisa se o ,a$or de ' H no 4or o menor dos nRmeros dadosG ou seHaG se ' Y y ou ' Y .. Cesta
6ip!teseG o menor de$es 2 y ou . e este menor de,e ser permutado com '. 9emos ento o seguinte programa.
Nf Programa para ordenar tr8s nRmeros dadosfN
kinc$ude Zstdio.6Y
main@A
a
4$oat (G `G zG Bu(K
print4@<?igite os tres numeros<AK
scan4@<g4 g4 g4<G h(G h`G hzAK
print4@<Cumeros dadosF g4 G g4 G g4 ln<G (G `G zAK
i4 @@( Y `A ii @( Y zAA Nf ,eri4ica se ( no 2 o menor fN
i4 @` Z zA Nf neste caso ` 2 o menor fN
a
Bu( X (K Nf troca os conteRdos de ( e de ` fN
( X `K
` X Bu(K
b
e$se Nf neste caso z 2 o menor fN
a
Bu( X (K Nf troca os conteRdos de ( e de z fN
( X zK
z X Bu(K
b
i4 @` Y zA Nf ,eri4ica se z e ` ainda no esto ordenados fN
a
Bu( X `K Nf troca o conteRdo de ` e de z fN
` X zK
z X Bu(K
b
print4@<Cumeros ordenadosF g4 G g4 G g4 ln<G (G `G zAK
b
Obser,e que se a e(presso $!gica do primeiro comando if 4or ,erdadeiraG o sistema e(ecutar outro
comando if. Ceste casoG dizemos que os comandos esto aninhados. Obser,e tamb2m que escre,emos no
programa a$gumas 4rases e(p$icati,as das a1es pretendidas. 'sta 4rases so c6amadas comentrios e de,em
ser escritas entre os pares de caracteres Nf e fN. ]uando o compi$ador encontra o par de caracteres Nf procura
um outro par fN e desconsidera tudo o que ,em entre os dois pares. Isto permite que o programador dei(e
registrado no pr!prio programa as obser,a1es que e$e ac6ar con,eniente. /omo a edio dos programas
com indentaoG a prtica de se co$ocar comentrios nos programas 2 muito importante. /omo os programas
discutidos neste $i,ro sero precedidos de e(p$ica1es pr2,iasG a uti$izao de comentrios aqui ,ai se
restringir indicao do obHeti,o do programa @como H ,+amos 4azendoA.
B ao rea$izada pe$a primeira estrutura de deciso do programa acima pode ser obtida atra,2s de
outro a$goritmo. B ideia 2 a seguinteF co$ocaIse na ,ari,e$ ' o menor dos ,a$ores inicia$mente armazenados
nas ,ari,eis ' e y. 'm seguidaG repeteIse o racioc+nio com os ,a$ores armazenados @agoraA em ' e em ..
Nf Programa para ordenar tr8s nRmeros dados @,erso 2AfN
kinc$ude Zstdio.6Y
main@A
a
4$oat (G `G zG Bu(K
print4@<?igite os tres numeros<AK
scan4@<g4 g4 g4<G h(G h`G hzAK
print4@<Cumeros dadosF g4 G g4 G g4 ln<G (G `G zAK
i4 @( Y `A
a
Bu( X (K
( X `K
` X Bu(K
b
i4 @( Y zA
a
Bu( X (K
( X zK
z X Bu(K
b
i4 @` Y zA
a
Bu( X `K
` X zK
z X Bu(K
b
print4@<Cumeros ordenadosF g4 G g4 G g4 ln<G (G `G zAK
b
.& :m outro e(emp$o que i$ustra muito bem a uti$izao do comando if 2 um programa para determinar
as ra+zes de uma equao do segundo grau. -abemos da matemtica que uma equao a(
2
W b( W c X ) s!
tem ra+zes reais se b
2
I 4ac Z ). BssimG um programa para encontrar as ra+zes reais @dei(aremos o caso
comp$eto da determinao das ra+zes reais e comp$e(as como e(erc+cio propostoA poderia ser o seguinte.
NfPrograma que ca$cu$a as ra+zes de uma equao do segundo grau fN
kinc$ude Zstdio.6Y
kinc$ude Zmat6.6Y
main@A
a
4$oat aG bG cG ?e$taG (1G (2K
print4@<?igite os coe4icientes<AK
scan4@<g4 g4 g4<G haG hbG hcAK
i4 @a PX )A
a
?e$ta X bfb I 4fafcK
i4 @?e$ta YX )A
a
(1 X @Ib W sqrt@?e$taAAN@2faAK
(2 X @Ib I sqrt@?e$taAAN@2faAK
print4@<Bs raizes da equacao de coe4icientes g4 G g4 e g4 sao g4 e g4 <G aG bG cG (1G (2AK
b
e$se
print4@<B equacao nao tem raizes reais<AK
b
e$se
print4@<B equacao nao e do segundo grau<AK
b
/& Imaginemos agora uma esco$a que adote no seu processo de a,a$iao a rea$izao de duas
a,a$ia1es bimestrais e que o regime de apro,ao dos a$unos seHa o seguinteF
iA -e a m2dia das a,a$ia1es bimestrais 4or superior ou igua$ a &G)G o a$uno est aprovadoG com m2dia
4ina$ igua$ m2dia das a,a$ia1es bimestrais.
iiA -e a m2dia das a,a$ia1es bimestrais 4or in4erior a G)G o a$uno est reprovadoG com m2dia 4ina$
igua$ m2dia das a,a$ia1es bimestrais.
iiiA Co ocorrendo nen6um dos casos anterioresG o a$uno se submete a uma prova final e a sua m2dia
4ina$ ser a m2dia ponderada desta pro,a 4ina$ @com peso 4A e a m2dia das a,a$ia1es bimestrais @com peso
"A. Ceste casoG o a$uno estar apro,ado se a sua m2dia 4ina$ 4or superior ou igua$ a G.
O programa abai(o recebendo as notas das a,a$ia1es bimestrais eG se 4or o casoG a nota da pro,a 4ina$G
4ornece a m2dia 4ina$ do a$uno e a sua condio em re$ao apro,ao.
Nf Programa para ,eri4icar apro,ao de um a$unofN
kinc$ude Zstdio.6Y
main@A
a
4$oat Dim1G Dim2G >edDimG Pr3ina$G >ed3ina$K
print4@<?igite as duas notas bimestrais<AK
scan4@<g4 g4 <G hDim1G hDim2AK
>edDim X @Dim1 W Dim2AN4K
>ed3ina$ X >edDimK
i4 @@>edDim Z &A hh @>edDim YX AA
a
print4@<?igite a nota da pro,a 4ina$<AK
scan4@<g4<G hPr3ina$AK
>ed3ina$ X @>edDim f " W Pr3ina$ f 4AN1)K
b
i4 @>ed3ina$ Y .A
print4@<B$uno apro,ado com media 4ina$ g.24 ln<G >ed3ina$AK
e$se
print4@<B$uno repro,ado com media 4ina$ g).24 ln<G >ed3ina$AK
b
1& Para um e(emp$o de um programa que uti$iza ,rios comandos if anin6adosG supon6amos que uma
empresa decidiu dar um aumento esca$onado a seus 4uncionrios de acordo com a seguinte regraF 13g para
os sa$rios in4eriores ou iguais a #m 2))G))K 11g para os sa$rios situados entre #m 2))G) e #m 4))G))
@inc$usi,eAK % g para os sa$rios entre #m 4))G)) e #m *))G)) @inc$usi,eA e &g para os demais sa$rios. :m
programa que receba o sa$rio atua$ de um 4uncionrio e 4ornea o ,a$or do seu no,o sa$rio poderia ser o
seguinte.
NfPrograma para atua$izar sa$riosfN
kinc$ude Zstdio.6Y
main@A
a
4$oat -Btua$G -Co,oG IndiceK
print4@<?igite o sa$rio atua$<AK
scan4@<g4<G h-Btua$AK
i4 @-Btua$ ZX 2))A
Indice X 1.13K
e$se
i4 @-Btua$ ZX 4))A
Indice X 1.11K
e$se
i4 @-Btua$ ZX *))A
Indice X 1.)%K
e$se
Indice X 1.)&K
-Co,o X -Btua$fIndiceK
print4@<Btua$ X g.24 ln Co,o X g.24 ln< G -Btua$G -Co,oAK
b
Obser,e que a sequ8ncia associada opo else 2 iniciada com um outro comando if. B$guns autores
pre4erem destacar um 4ato como este de4inindo um <no,o comando< denominandoIo else if.
2& :m outro e(emp$o que uti$iza comandos de se$eo anin6ados e em que a esco$6a da e(presso
$!gica que contro$ar o comando if 2 importante 2 um programa que determine o nRmero de dias de um m8s
@um programa como este seria parte integrante de um programa que manipu$asse datasA. /omo os meses de
trinta dias so quatro e os de trinta e um dias so seteG usamos os primeiros para o contro$e do comando de
se$eo.
Nf Programa que determina o nRmero de dias de um m8s dado fN
kinc$ude Zstdio.6Y
main@A
a
int >esG BnoG Cum?iasK
print4@<?igite o mes<AK
scan4@<gd<G h>esAK
i4 @@>es XX 4 A ii @>es XX "A ii @>es XX %A ii @>es XX 11AA
Cum?ias X 3)K
e$se
i4 @>es XX 2A
a
print4@<?igite o ano<AK
can4@<gd<G hBnoAK
i4 @Bno g 4 PX )A
Cum?ias X 2*K
e$se
Cum?ias X 2%K
b
e$se
Cum?ias X 31K
print4@<O mes gd tem gd dias<G >esG Cum?iasAK
b
Co cap+tu$o " ,eremos que o programa acima pode ser bastante simp$i4icado.

-&1 ' !omando s.itc/
>uitos programas so desen,o$,idos de modo que e$es podem rea$izar ,rias tare4asG de 4orma
independente. Por e(emp$oG um programa que gerencie um cai(a e$etr;nico de um banco de,e o4erecer ao
usurio a$gumas op1es em re$ao ao que e$e pretende rea$izar na sua conta como a emisso do sa$do
atua$G a emisso de um e(tratoG a rea$izao de um saque e a rea$izao de um dep!sito. U comum que um
programa que permita a rea$izao de ,rias tare4as inicie apresentando ao usurio um menu de op#$es com a
indicao das di,ersas tare4as que o programa pode e(ecutar e a permisso de que o usurio esco$6a a tare4a
pretendida. /omoG em gera$G so ,rias as op1es dispon+,eis @cada uma de$as com uma sequ8ncia espec+4ica
de comandosA e s! uma das op1es ser a esco$6idaG 2 necessria uma estrutura que decide entre ,rias
sequ8ncias de comandos qua$ ,ai ser e(ecutada ou quais ,o ser e(ecutadas.
O comando s)itch tem este obHeti,o e de,e ser escrito com a seguinte sinta(eF
s5itc6@'(pressoA
a
case constante1 F
-equ8ncia de instru1es 1
case constante2 F
-equ8ncia de instru1es 2
. . .
case constante n F
-equ8ncia de instru1es n
de4au$t F
-equ8ncia de comando (
b
B+G a *'press!o argumento do comando de,e resu$tar num ,a$or do tipo int ou num ,a$or do tipo char
eG opciona$menteG a u$tima instruo de cada uma das sequ8ncias Sequ-ncia de instru#$es i 2 brea:. B
sem.ntica deste comando 2 bem simp$esF a *'press!o 2 a,a$iada e as sequ8ncias de instru1es situadas entre
o ,a$or da e(presso apresentado nos cases e um comando brea: ou o de$imitador do comando so
e(ecutadas. -e o ,a$or da *'press!o 4or di4erente de todas as op1es dadas pe$as constantes associadas aos
casesG a sequ8ncia de instru1es ,incu$ada ao default ser e(ecutada. Por e(emp$oG o programa
kinc$ude Zstdio.6Y
main@A
a
int (K
print4@<?igite um nRmero inteiro entre 1 e ln<AK
scan4@<gd<G h(AK
s5itc6 @(A
a
case 1 F print4@<0a$or de (F gd ln<G (AK
case 2 F print4@<0a$or do dobro de gdF gd ln<G (G 2f(AK
case 3 F print4@<0a$or do trip$o de gdF gd ln<G (G 3f(AK
case 4 F print4@<0a$or do quadrup$o de gdF gd ln<G (G 4f(AK
de4au$t F print4@<0a$or digitadoF gd ln<G (AK
b
b
e(ecutado para ( X 1 e(ecuta todas as sequ8ncias ,incu$adas aos cases 4ornecendo a seguinte sa+daF
0a$or de (F 1
0a$or do dobro de 1F 2
0a$or do trip$o de 1F 3
0a$or do quadrup$o de 1F 4
0a$or digitadoF 1
-e 4or e(ecutado para ( X 3G s! as sequ8ncias a partir do case J sero e(ecutadas e a sa+da serF
0a$or do trip$o de 3F %
0a$or do quadrup$o de 3F 12
0a$or digitadoF 3
e se 4or e(ecutado ( X 1) apenas a sequ8ncia ,incu$ada condio default ser a e'ecutada e a sa+da serF
0a$or digitado F 1)
9r8s obser,a1esF
1. B sequ8ncia de instru1es ,incu$ada a uma opo case pode ser ,aziaG caso em queG e,identementeG
nada 2 e(ecutadoK
2. -e apenas uma sequ8ncia de comandos de,e ser e(ecutadaG de,eIse encerrI$a com um brea:K
3. B opo default 2 opciona$F se e$a no aparece no comando e o ,a$or da *'press!o 4or di4erente de
todos os ,a$ores dispon+,eisG nada 2 e(ecutado e a instruo $ogo ap!s o comando s)itch passa a ser
e(ecutada.
-&2 E3emplos Parte III

$& O programa para determinar o nRmero de dias de um m8s @e(emp$o & da seo anteriorA poderia
uti$izar o comando s)itchF
Nf Programa para determinar o numero de dias de um mesfN
kinc$ude Zstdio.6Y
main@A
a
int >esG BnoG Cum?iasK
print4@<?igite o mes ln<AK
scan4@<gd<G h>esAK
s5itc6 @>esA
a
case 2 F
print4@<?igite o ano<AK
scan4@<gd<G hBnoAK
i4 @Bno g 4 PX )A
Cum?ias X 2*K
e$se
Cum?ias X 2%K
brea7K
case 4 F
case " F
case % F
case 11 F Cum?ias X 3)K brea7K
de4au$t F Cum?ias X 31K
b
print4@<O mes de numero gd tem gd dias ln<G >esG Cum?iasAK
b
Obser,e que se o m8s de entrada 4or 2G o programa pede o ano para determinar se e$e 2 bisse(to. B+G
determina o nRmero de dias e a instruo brea: encerra o comando s)itch. -e a entrada 4or 4G com a
sequ8ncia de comandos ,incu$ada ao case 4 2 ,azia @eG portantoG no cont2m brea:A as sequ8ncias ,incu$adas
aos cases seguintes so e(ecutadas at2 o brea: do case 11 @para os meses 4G "G % e 11 o nRmero de dias 2
igua$ a 3)PA. -e a entrada no 4or 2G 4G "G % e 11 a opo default ser e(ecutada eG portantoG o m8s ter 31 dias.
',identementeG 4ica 4a$tando discutir a possibi$idade de uma entrada in,$ida comoG por e(emp$oG 13. Isto
ser discutido no pr!(imo cap+tu$o.
*& 0eHamos um e(emp$o onde a e(presso do comando s)itch retorna um ,a$or do tipo char. 9rataIse
da gerao de uma ca$cu$adora para as quatro opera1es aritm2ticas bsicas.
Nf/a$cu$adora e$etr;nicafN
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
main@A
a
4$oat Op1G Op2G #esK
c6ar OperadorK
c$rscr@AK
print4@<?igite a operapao deseHadaln<AK
scan4@<g4 gc g4<G hOp1G hOperadorG hOp2AK
s5itc6 @OperadorA
a
case OWOF
#es X Op1 W Op2K brea7K
case OIOF
#es X Op1 I Op2K brea7K
case OfOF
#es X Op1 f Op2K brea7K
case ONOF
i4 @Op2 PX )A
#es X Op1 N Op2K brea7K
b
c$rscr@AK
i4 @Operador XX ONO hh Op2 XX )A
print4@<?i,isao por zeroPPP<AK
e$se
print4@<g.24 gc g.24 X g.24 ln<G Op1G OperadorG Op2G #esAK
getc6@AK
b
-& :m outro e(emp$o interessante de uti$izao do comando s)itch 2 um programa que determine o
dia da semana de uma data dada. 9omando como base o ano de 1")) @em 1*2 o Papa oregorio III instituiu
mudanas no ca$endrio ento ,igenteA e sabendo que o dia primeiro daque$e ano 4oi um sbadoG para se
determinar o dia da semana de uma data dada basta se ca$cu$ar o nRmero de dias decorridos entre a data dada
e o dia )1N)1N1")). /omo a associao do dia da semana a uma data 2 peri!dicaG de per+odo &G o resto da
di,iso do nRmero de dias re4erido acima por & indica a re$ao entre o dia da semana procurado e o sbadoF
se o ta$ resto 4or ) @zeroAG o dia da semana 2 sbadoK se o resto 4or 1 o dia da semana 2 domingoG e assim
sucessi,amente.
Para ca$cu$ar o nRmero de dias entre uma data dada e )1N)1N1")) basta mu$tip$icar o nRmero de anos
por 3" e acrescentar a quantidade de anos bisse(tos e o nRmero de dias decorridos no ano corrente.
Para ca$cu$ar a quantidade de anos bisse(tos entre 1")) e o ano da data dada basta ca$cu$ar a e(presso
>uantidade de m1ltiplos de P R >uantidade de m1ltiplos de MOO 8 >uantidade de m1ltiplos de POOG onde
>uantidade de m1ltiplos de ' re4ereIse quantidade de mR$tip$os de ' compreendidos entre 1")) e o ano da
data dadaG como discutido no e(emp$o da seo 2.1).
Para ca$cu$ar o nRmero de dias decorridos no ano da data dada basta ...@isto est e(p$icado nos
comentrios do programaA.
Nf Programa para determinar o dia da semana de uma data dada fN
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
main@A
a
int ?iaG >esG BnoG ?ias?oBnoG ?ias31G BnosDissG Bu(G >u$t4G >u$t1))G >u$t4))K
$ong int BnosG Cum?iasK
c$rscr@AK
print4@<?igite a data no 4ormato ddNmmNaaaaln<AK
scan4@<gdNgdNgd<G h?iaG h>esG hBnoAK
Bnos X Bno I 1"))K
Nf Cumero de meses com 31 dias ate o m8s dado fN
i4 @>es Z %A
?ias31 X >esN2K
e$se
?ias31 X @>es W 1AN2K
NfCumero de dias do ano dadoG considerando 4e,ereiro com tendo 3) diasfN
?ias?oBno X 3)f@>es I 1A W ?ia W ?ias31K
Nf#eti4ica o numero de dias de 4e,ereirofN
i4 @>es Y 2A
i4 @@Bno g 4 PX )A ii @@Bno g 1)) XX )A hh @Bno g 4)) PX )AAA
?ias?oBno X ?ias?oBno I 2K
e$se
?ias?oBno X ?ias?oBno I 1K
NfCumero de anos bisse(tos entre o ano dado e 1"))fN
Bu( X Bno I 1K
>u$t4 X @Bu( I @Bu( g 4A I 1"))AN4K
>u$t1)) X @Bu( I @Bu( g 1))A I 1"))AN1))K
>u$t4)) X @Bu( I @Bu( g 4))A I 1"))AN4))K
BnosDiss X >u$t4 I >u$t1)) W >u$t4))K
NfCumero de dias entre a data dada e )1N)1N1"))fN
Cum?ias X Bnosf3" W ?ias?oBno W BnosDissK
Nf?ia da semanafN
print4@<ln?ataF gdNgdNgd ?ia da semanaF<G ?iaG >esG BnoAK
s5itc6@Cum?ias g &A
a
case ) F print4@< -abado<AK brea7K
case 1 F print4@< ?omingo<AK brea7K
case 2 F print4@< -egunda<AK brea7K
case 3 F print4@< 9erca<AK brea7K
case 4 F print4@< ]uarta<AK brea7K
case F print4@< ]uinta<AK brea7K
case " F print4@< -e(ta<AK brea7K
b
getc6@AK
b
0a$e obser,ar que este programa dar uma LrespostaM mesmo que a data dada no seHa uma data
,$idaG como 2%N)2N2))% por e(emp$o. Isto ser discutido no pr!(imo cap+tu$o.
0a$e obser,ar tamb2m que o programa rea$iza pe$o menos duas a1es com obHeti,os espec+4icos e
racioc+nios pr!priosF o c$cu$o do nRmero de anos bisse(tos entre 1")) e ano da data dada e a determinao
do nRmero de dias decorridos no re4erido ano. Co cap+tu$o ,amos mostrar que se pode @se de,eA escre,er
subprogramas @fun#$esA para rea$izar cada uma destas a1es.
-&4 E3er!5!ios propostos
$& #eescre,a o programa do e(emp$o zero da seo 3. de modo que os instantes seHam dados @e o
inter,a$o de tempo 4ornecidoA em 6oras minutos e segundos&
*& 'scre,a um programa que rea$ize arredondamentos de nRmeros uti$izando a regra usua$ da
matemticaF se a parte 4racionria 4or maior do que ou igua$ a )GG o nRmero 2 arredondado para o inteiro
imediatamente superiorG caso contrrioG 2 arredondado para o inteiro imediatamente in4erior.
-& 'scre,a um programa para ,eri4icar se um inteiro dado 2 um quadrado per4eitoG e(ibindoG nos casos
a4irmati,osG sua raiz quadrada.
.& 'scre,a um programa para determinar o maior de tr8s nRmeros dados.
/& 'scre,a um programa para c$assi4icar um tri.ngu$o de $ados de comprimentos dados em escaleno
@os tr8s $ados de comprimentos di4erentesAG issceles @dois $ados de comprimentos iguaisA ou equiltero @os
tr8s $ados de comprimentos iguaisA.
1& 'scre,a um programa para ,eri4icar se um tri.ngu$o de $ados de comprimentos dados 2 ret"nguloG
e(ibindoG nos casos a4irmati,osG sua hipotenusa e seus catetos.
2& 'scre,a um programa para determinar as ra+zes reais ou comp$e(as de uma equao do segundo
grauG dados os seus coe4icientes.
4& 'scre,a um programa para determinar a idade de uma pessoaG em anos meses e diasG dadas a data
@diaG m8s e anoA do seu nascimento e a data @diaG m8s e anoA atua$.
6& 'scre,a um programa queG recebendo as duas notas bimestrais de um a$uno da esco$a re4erida no
e(emp$o da seo 3.G 4ornea a nota m+nima que e$e de,e obter na pro,a 4ina$ para que e$e seHa apro,ado.
')servao
Propostas de solu:es dos e3er!5!ios propostos podem ser soli!itadas atrav8s de mensagem
eletr;ni!a para jaime<!!en&ufal&)r !om assunto 0E"P'"=A" LI0' C, ane3ando o formul#rio
a)ai3o devidamente preen!>ido&
?ome Categoria
$
Instituio
*
Curso
*
Cidade@Estado
$
CategoriaA do!ente, estudante, autodidata
*
"e do!ente ou estudante
.& Estruturas de repetio
.&$ Para +ue servem as estruturas de repetio
:m $ocutor brasi$eiro ao narrar um Hogo de 4utebo$ americano nos 'stados :nidos recebe a in4ormao
do p$acar e$etr;nico sobre a temperatura do estdio medida em graus 3a6ren6eit. Catura$menteG e$e de,e
4ornecer aos te$espectadores brasi$eiros a temperatura em graus /e$sius. Para istoG o $ocutorG de posse de um
computadorG poderia uti$izar o programa abai(oG que 4oi so$icitado no primeiro item do segundo e(erc+cio da
seo 2.12.
NfPrograma que con,erte uma temperatura dada em graus 3a6ren6eit para graus /e$siusfN
kinc$ude Zstdio.6Y
main@A
a
4$oat 3a6ren6eitG /e$siusK
print4@<?igite a temperatura em 3a6ren6eit<AK
scan4@<g4<G h3a6ren6eitAK
/e$sius X f @3a6ren6eit I 32AN%K
print4@<B temperatura de g.24 3a6ren6eit corresponde a g.24 /e$sius <G 3a6ren6eitG /e$siusAK
b
-e o p$acar e$etr;nico indicasse uma temperatura de ")
o
3G o narrador e(ecutaria o programa com a
entrada ") e receberia a sa+da
B temperatura de ") graus 3a6ren6eit corresponde a 1. graus /e$sius
/ertamenteG seria mais prtico a produo da transmisso do e,ento disponibi$izar para o $ocutor uma
tabe$a contendo as temperaturas poss+,eis em graus 3a6ren6eit e as correspondentes em graus /e$sius. B
con4eco desta tabe$a poderia ser 4eita atra,2s de um programa que conti,esse ,rios comandos que
ca$cu$assem para cada temperatura em graus 3a6ren6eit pretendida a correspondente temperatura em graus
/e$sius e e(ibissem estas temperaturas. Ceste casoG no 6a,eria necessidade de comando de entradaK por2mG
para cada temperatura em graus 3a6ren6eit pretendidaG 6a,eriaG pe$o menosG um comando de atribuio e a
c6amada da 4uno printf/0. -e a 4ai(a de temperatura em graus 3a6ren6eit a ser coberta pe$a tabe$a 4osse de
,inte a oitenta grausG ter+amos um programa como o programa abai(o.
NfPrograma @muito ruimA que gera uma tabe$a de con,erso de temperaturas em graus 3a6ren6eit para
graus /e$sius fN
kinc$ude Zstdio.6Y
main@A
a
int 3a6ren6eitK
print4@<9abe$a de con,ersao graus 3a6ren6eitNgraus /e$sius ln<AK
print4@<IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIln<AK
print4@<lt 3a6ren6eit lt i lt /e$siusln<AK
print4@<IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIln<AK
3a6ren6eit X 1)K
print4@<lt g4 lt i lt g4 ln<G 3a6ren6eitG .)f@3a6ren6eit I 32AN%AK
3a6ren6eit X 11K
print4@<lt g4 lt i lt g4 ln<G 3a6ren6eitG .)f@3a6ren6eit I 32AN%AK
. . .
Nf>ais <uma poro< de comandosP fN
3a6ren6eit X *)K
print4@<lt g4 lt i lt g4 ln<G 3a6ren6eitG .)f@3a6ren6eit I 32AN%AK
b
Isto seria contornado se pud2ssemos repetir a e(ecuo dos comandos que gerariam as temperaturas
em graus 3a6ren6eit e as correspondentes em graus /e$sius. B $inguagem / possui os comandos forK )hile e
do )hileG c6amados estruturas de repeti#!o ou la#osG cuHas e(ecu1es redundam em repeti1es da e(ecuo
de uma determinada sequ8ncia de comandos.
.&* ' !omando )or
O comando for 2 uma estrutura de repetio que repete a e(ecuo de uma dada sequ8ncia de
comandos um nRmero de ,ezes que pode ser determinado pe$o pr!prio programaG de,endo ser escrito com a
seguinte sinta(eF
4or @inicia$iza1esK condi1es de manuteno da repetioK incrementosA
a
sequ8ncia de comandos
b
/omo os nomes indicamG em iniciali.a#$esG so atribu+dos ,a$ores iniciais a ,ari,eisK em condi#$es
de manuten#!o da repeti#!oG estabe$ecemIseG atra,2s de uma e(pressoG as condi1es nas quais a e(ecuo
da sequ8ncia de comandos ser repetidaK em incrementosG incrementamIse ,ari,eis. ]uando um comando
for 2 e(ecutadoG a sequ8ncia de comandos da rea das iniciali.a#$es 2 e(ecutada. 'm seguidaG a e(presso
que 4i(a as condi#$es de manuten#!o da repeti#!o 2 a,a$iada. -e o ,a$or desta e(presso no 4or nu$oG a
sequ8ncia de comandos 2 e(ecutadaG sendo em seguida e(ecutada a sequ8ncia de comandos da rea dos
incrementos. Co,amente a e(presso das condi#$es de manuten#!o da repeti#!o 2 a,a$iada e tudo se repete
at2 que o seu ,a$or seHa igua$ a zero.
Por e(emp$oG o programa
kinc$ude Zstdio.6Y
main@A
a
int iK
4or @i X 1K i ZX 1)K i X i W 1A
print4@<gd <G iAK
b
e(ibe na te$a os nRmeros 1G 2G 3G 4G G "G &G *G %G 1). Por seu turnoG o programa
kinc$ude Zstdio.6Y
main@A
a
int iK
4or @i X 1)K i YX )K i X i I 2A
print4@<gd <G iAK
b
e(ibe na te$a os nRmeros 1)G *G "G 4G 2G ). J o programa
kinc$ude Zstdio.6Y
main@A
a
int iK
4or @i X 1K i ZX 1)K i X i W 2)A
print4@<gd <G iAK
b
e(ibeG apenasG o nRmero 1.
B sem.ntica do comando for imp$ica que a sequ8ncia de comandos pode no ser e(ecutada nem uma
Rnica ,ez. Dasta que na <primeira< e(ecuo do comando for a e(presso que contro$a a repetio assuma o
,a$or zero. Por e(emp$oG o programa abai(o no e(ibe nen6um ,a$or na te$a.
kinc$ude Zstdio.6Y
main@A
a
int iK
4or @i X 11K i ZX 1)K i X i W 2)A
print4@<gd <G iAK
b
/om o comando forG a questo da gerao de uma tabe$a de con,erso de temperaturas em graus
3a6ren6eit para graus /e$sius seria simp$es.
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
main@A
a
int 3a6ren6eitK
4$oat /e$siusK
c$rscr@AK
print4@<9abe$a de con,erso graus 3a6ren6eitNgraus /e$sius ln<AK
print4@<IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIln<AK
print4@<lt 3a6ren6eit lt i lt /e$siusln<AK
print4@<IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIln<AK
4or @3a6ren6eit X 2)K 3a6ren6eit ZX *)K 3a6ren6eit X 3a6ren6eit W 1A
a
/e$sius X .)f@3a6ren6eit I 32AN%K
print4@<lt g.24 lt i lt g.24 ln<G 3a6ren6eitG /e$siusAK
b
b
Ca e(ecuo do comando forG a ,ari,e$ Sahrenheit 2 inicia$izada com o ,a$or 2)G este ,a$or 2
comparado com *)G a correspondente temperatura em graus /e$sius 2 ca$cu$ada e os dois ,a$ores so
e(ibidos. 'm seguidaG o conteRdo de Sahrenheit 2 incrementado de uma unidade e tudo se repete at2 que
Sahrenheit atinHa o ,a$or *1. ?esta 4ormaG a e(ecuo deste programa gera a seguinte tabe$a
9abe$a de con,erso graus 3a6ren6eitNgraus /e$sius
3a6ren6eit /e$sius
2) I"."&
21 I.11
22 I."
23 I.))
. . . . . .
&% 2"G11
*) 2"G"&
Obser,e que toda a repetio 2 contro$ada pe$a ,ari,e$ Sahrenheit. Cum caso como esteG a ,ari,e$
em 4oco 2 c6amada varivel de controle da estrutura de repetio. 0a$e obser,ar tamb2m queG ao contrrio
de outras $inguagens @Pasca$G por e(emp$oAG a ,ari,e$ de contro$e no tem que ser necessariamente do tipo
int. Por e(emp$oG se quis2ssemos que a tabe$a tamb2m 4ornecesse temperaturas em graus 3a6ren6eit
4racionrias @meio em meio grauG por e(emp$oAG poder+amos e(ecutar o seguinte programa.
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
main@A
a
4$oat /e$siusG 3a6ren6eitK
c$rscr@AK
print4@<9abe$a de con,erso graus 3a6ren6eitNgraus /e$sius ln<AK
print4@<IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIln<AK
print4@<lt 3a6ren6eit lt i lt /e$siusln<AK
print4@<IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIln<AK
4or @3a6ren6eit X 2)K 3a6ren6eit ZX *)K 3a6ren6eit X 3a6ren6eit W ).A
a
/e$sius X .)f@3a6ren6eit I 32AN%K
print4@<lt g.24 lt i lt g.24 ln<G 3a6ren6eitG /e$siusAK
b
b
/abe obser,ar que a sequ8ncia de comandos cuHa e(ecuo se pretende repetir pode ser co$ocada na
rea dos incrementos. O programa acima 4icaria ento com a seguinte 4ormaF
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
main@A
a
4$oat /e$siusG 3a6ren6eitK
c$rscr@AK
print4@<9abe$a de con,erso graus 3a6ren6eitNgraus /e$sius ln<AK
print4@<IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIln<AK
print4@<lt 3a6ren6eit lt i lt /e$siusln<AK
print4@<IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIln<AK
4or @3a6ren6eit X 2)K 3a6ren6eit ZX *)K /e$sius X .)f@3a6ren6eit [ 32AN%G print4@<lt g.24 lt i lt g.24
ln<G 3a6ren6eitG /e$siusAG 3a6ren6eit X 3a6ren6eit W ).AK
b
Obser,e queG neste casoG o comando for 2 conc$u+do com um pontoIeI,+rgu$a e que a $eitura do
programa 4ica bastante di4icu$tada. 'ste 4ato 4az com que esta prtica no seHa incenti,ada ao $ongo do $i,ro.
Obser,e tamb2m que apro,eitamos a oportunidade para apresentar mais uma 4uno de bib$ioteca do
sistemaK trataIse de clrscr/0 cuHa e(ecuo resu$ta na $impeza da 3anela do usurioG o que e,ita que resu$tados
da e(ecuo de um programa seHam con4undidos com resu$tados de e(ecu1es anteriores @clrscr ,em de
clear screen que signi4ica <$impa te$a<A. /omo indicado na segunda instruo do programaG o cabea$6o da
4uno clrscr/0 encontraIse no arqui,o conio2h.
.&- ' !omando ./ile
Para introduzir uma no,a estrutura de repetio e coteHI$a com o comando forG considere um
programa para encontrar um divisor prprio de um inteiro dado @um divisor prprio de um inteiro n 2 um
di,isor de n di4erente de$e e de 1A. 'sta questo 2 importante na ,eri4icao da primalidade de um inteiroF
um nRmero que no tem di,isores pr!prios 2 dito primo. /om a uti$izao do comando for ter+amos a
seguinte so$uo para esta questo.
NfPrograma que determina um di,isor pr!prio de um inteiro fN
kinc$ude Zstdio.6Y
main@A
a
int CumG iG ?i,isorK
print4@<?igite um numeroF <AK
scan4@<gd<G hCumAK
?i,isor X )K
4or @i X 2K i Z CumK i X i W 1A
i4 @Cum g i XX )A
?i,isor X iK
i4 @?i,isor PX )A
print4@<gd 2 di,isor pr!prio de gd ln<G ?i,isorG CumAK
e$se
print4@<gd no tem di,isores pr!prios ln<G CumAK
b
:m prob$ema com este programa 2 que e$e retorna sempreG se e(istirG o maior di,isor pr!prio. Isto
signi4ica que se a entrada 4or um nRmero par a estrutura de repetio no 2 interrompida quando o di,isor 2 2
encontradoG o queG e,identementeG ,ai preHudicar a per4ormance do programa. Isto pode ser contornado pois
os compi$adores / permitem que uma ,ari,e$ de contro$e de um comando for ten6a o seu conteRdo a$terado
dentro do pr!prio comando. /om istoG o programa acima 4icaria da seguinte 4orma.
kinc$ude Zstdio.6Y
main@A
a
int CumG iG ?i,isorK
print4@<?igite um nRmero inteiroF <AK
scan4@<gd<G hCumAK
?i,isor X )K
4or @i X 2K i Z CumK i X i W 1A
i4 @Cum g i XX )A
a
?i,isor X iK
i X CumK
b
i4 @?i,isor PX )A
print4@<gd eO di,isor pr!prio de gd ln<G ?i,isorG CumAK
e$se
print4@<gd no tem di,isores pr!prios ln<G CumAK
b
Cesta ,ersoG quando o primeiro di,isor pr!prio 2 encontradoG o comando i T %umF 4az com que a
e(ecuo do comando for seHa interrompida. B prtica de encerrar um comando for atra,2s da a$terao do
conteRdo da ,ari,e$ de contro$e no ser aqui incenti,ada pe$o 4ato de que isto desestrutura o programaG
di4icu$tando sua $egibi$idade. B$2m dissoG 6 situa1es em que no se pode con6ecer o nRmero m(imo de
repeti1es de uma estrutura de repetio. Ca ,erdadeG a questo centra$ 2 que o comando for de,e ser
uti$izado quando o nRmero de repeti1es de e(ecuo de uma sequ8ncia de comandos 2 con6ecido a priori.
]uando isto no acontece @que 2 o caso do e(emp$o anteriorF no se sabe a priori se e quando um di,isor
pr!prio ,ai ser encontradoAG de,eIse usar o comando )hileG que possui a seguinte sinta(eF
56i$e @'(pressoA
a
-equ8ncia de comandos
b
sendo os de$imitadores opcionais se a sequ8ncia possui um s! comando @como acontece nas outras
estruturas de repetioA.
B sem.ntica deste comando 2 !b,iaF a sequ8ncia de comandos 2 e(ecutada enquanto o ,a$or da
*'press!o 4or di4erente de zero. Catura$menteG pode ocorrer que a sequ8ncia de comandos no seHa
e(ecutada nen6uma ,ezG isto ocorrendo se o ,a$or da *'press!o 4or igua$ a zero quando da <primeira<
e(ecuo do comando @o teste 2 4eito antes da e(ecuo da sequ8ncia de comandosA. Por outro $adoG 2
necessrio que um dos comandos da sequ8ncia de comandos a$tere conteRdos de ,ari,eis que aparecem na
*'press!o de modo que em a$gum instante e$a se torne igua$ a zero. ?o contrrioG a sequ8ncia de comandos
ter sua e(ecuo repetida inde4inidamenteG o programa nunca termina eG e,identementeG no e(ecuta a tare4a
para a qua$ 4oi desen,o$,ido. ]uando isto acontece 2 comum se dizer que o programa est em looping2
/om o comando )hile as quest1es $e,antadas acima sobre o programa para determinar um di,isor
pr!prio de um inteiro dado so reso$,idas e temos o seguinte programaF
NfPrograma que determina o menor di,isor pr!prio de um inteiro fN
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
main@A
a
int CumG dG >etK
print4@<?igite o numeroF <AK
scan4@<gd<G hCumAK
>et X CumN2K
d X 2K
56i$e @Cum g d PX ) hh d Z >etA
dWWK
i4 @d ZX >etA
print4@<gd 2 di,isor de gd ln<G dG CumAK
e$se
print4@<gd no tem di,isores pr!prios<G CumAK
getc6@AK
b
Obser,e queG ao contrrio dos e(emp$os anterioresG a estrutura tamb2m seria interrompida quando a
,ari,e$ com a qua$ se procura um di,isor atingisse a <metade< do inteiroK isto se e(p$ica pe$o 4ato de que se
um inteiro no possui um di,isor pr!prio menor do que sua <metade<G ento e$e 2 primo. 'sta ,erso ainda
pode ser me$6orada uti$izandoIse o 4ato discutido em S',aristoG J 2))2T de que se um inteiro no possui um
di,isor pr!prio menor do que ou igua$ a sua raiz quadradaG e$e no tem di,isores pr!prios. Le,ando isso em
contaG ter+amos o seguinte programa.
NfPrograma que determina o menor di,isor pr!prio de um inteirofN
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
kinc$ude Zmat6.6Y
main@A
a
int CumG dK
4$oat rK
print4@<?igite o numeroF <AK
scan4@<gd<G hCumAK
r X sqrt@CumAK
d X 2K
56i$e @Cum g d PX ) hh d ZX rA
dWWK
i4 @d ZX rA
print4@<gd 2 di,isor de gd ln<G dG CumAK
e$se
print4@<gd no tem di,isores pr!prios<G CumAK
getc6@AK
b
/omo H 4oi ditoG um nRmero inteiro que no tem di,isores pr!prios 2 c6amado n1mero primo. BssimG
o comando de sa+da ,incu$ado opo else poderia ser
print4@<gd 2 primo<G CumAK
0a$e obser,ar que o comando d X 2K dos programas acima atribuiu um valor inicial ,ari,e$ d. 'ste
,a$or 2 incrementado de uma unidade enquanto um di,isor no 4oi encontrado. :m comando de atribuio
de um ,a$or inicia$ a uma ,ari,e$ 2 c6amado iniciali.a#!o da varivel e os compi$adores da $inguagem /
permitem que inicia$iza1es de ,ari,eis seHam 4eitas no instante em que e$as so dec$aradas. BssimG as
dec$ara1es de ,ari,eis dos programas acima poderiam ter sido 4eitas da seguinte 4ormaF
int CumG iG d X 2K
Ceste $i,roG na maioria das ,ezes ,amos optar por inicia$izar as ,ari,eis imediatamente antes da
necessidade. B razo desta opo 2 que 6 situa1esG como mostraremos no pr!(imo e(emp$oG em que no se
pode simp$esmente inicia$izar uma ,ari,e$ quando da sua dec$arao.
Obser,e que o R$timo comando dos R$timos dois programas 4oi uma c6amada da 4uno getch/0. /omo
H 4oi ditoG a e(ecuo desta 4uno requer a digitao de a$guma tec$a. Isto 4az com a Hane$a do usurio @que
e(ibe o resu$tado do processamentoA permanea ati,a at2 que uma tec$a seHa acionada.
0epetindo a e3e!uo de um programa
:ma outra ap$icao importante do comando )hile diz respeito a ap$ica1es sucessi,as de um
programa. O $eitor de,e ter obser,ado que os programas anteriores so e(ecutados apenas para uma entrada.
-e quisermos a sua e(ecuo para outra entrada precisamos e(ecutar o programa de no,o.
PodeIse repetir a e(ecuo de um programa quantas ,ezes se queiraG co$ocandoIo numa estrutura
de4inida por um comando )hileG contro$ada pe$o ,a$or de a$gum dado de entrada. Ceste casoG o ,a$or que
encerra a e(ecuo pode ser in4ormado dentro da mensagem que indica a necessidade da digitao da
entrada. O programa anterior poderia ser ento escrito da seguinte 4orma.
NfPrograma que determina o menor di,isor pr!prio de um inteiro fN
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
kinc$ude Zmat6.6Y
main@A
a
int CumG dK
4$oat rK
print4@<?igite o numero @zero para encerrarAF <AK
Cum X 1K
56i$e @Cum PX )A
a
scan4@<gd<G hCumAK
r X sqrt@CumAK
d X 2K
56i$e @Cum g d PX ) hh d ZX rA
dWWK
i4 @d ZX rA
print4@<gd 2 di,isor de gd ln<G dG CumAK
e$se
print4@<gd 2 primo<G CumAK
b
b
Obser,e queG neste casoG a ,ari,e$ d no pode ser inicia$izada quando da sua dec$arao. Obser,e
tamb2m que no 6 necessidade da 4uno getch/0G pois a pr!pria repetio da e(ecuo dei(a a Hane$a do
usurio aberta.
B$guns programadores pre4erem que a repetio da e(ecuo de um programa seHa determinada por
uma pergunta ao usurio do tipo L?eseHa continuar @-NCAVM. Ceste casoG 6 necessidade de uma ,ari,e$ do
tipo char para receber a resposta e contro$ar a repetio da e(ecuo do programa.
kinc$ude Zstdio.6Y
kinc$ude Zct`pe.6Y
kinc$ude Zconio.6Y
kinc$ude Zmat6.6Y
main@A
a
int CumG dK
4$oat rK
c6ar cK
c X O-OK
56i$e @toupper@cA XX O-OA
a
print4@<?igite o numeroF <AK
scan4@<gd<G hCumAK
r X sqrt@CumAK
d X 2K
56i$e @Cum g d PX ) hh d ZX rA
dWWK
i4 @d ZX rA
print4@<gd 2 di,isor de gd ln<G dG CumAK
e$se
print4@<gd 2 primo<G CumAK
puts@<?eseHa continuar @-NCAV<AK
c X getc6@AK
b
b
0a$e $embrar que a 4uno toupper/0 retorna o argumento no 4ormato maiuscu$o. 'sta 4uno 4oi
ati,ada aqui para que o usurio no se preocupe em digitar como resposta $etras maiuscu$as. ]ua$quer $etra
que 4or digitadaG a 4uno a torna maiuscu$a e o sistema a compara com - @maiuscu$oA.
.&. ' !omando do ./ile
/omo dissemos na seo anteriorG o nRmero de e(ecu1es da sequ8ncia de comandos associada a um
comando )hile pode ser zero. = situa1es onde 2 importante se garantir a e(ecuo de uma sequ8ncia de
comandos pe$o menos uma ,ez. :ma situao onde isto 2 importante 2 a ,eri4icao da consist-ncia dos
dados de entrada. 'sta ao consiste em se dotar o programa de recursos para recusar dados incompat+,eis
com a entrada do programaG s! <recebendo< dados que satis4aam s especi4ica1es @$!gicas ou
estabe$ecidasA dos dados de entrada. Por e(emp$oG se a entrada 2 um nRmero correspondente a um m8s do
anoG o programa no de,e aceitar uma entrada que seHa menor do que 1 nem maior do que 12. :ma so$uo
para esta questo uti$izando o comando )hile poderia ser a seguinteF
int >esK
print4@<?igite o m8sF <AK
scan4@<gd<G h>esAK
56i$e @@>es Z 1A ii @>es Y 12AA
a
print4@<la ?igitacao erradaP ?igite de no,o ln<AK
print4@<?igite o m8sF <AK
scan4@<gd<G h>esAK
b
Obser,e queG como a ,eri4icao da condio de repetio 2 4eita no <in+cio< do comandoG 6 a
necessidade de uma $eitura antes da estrutura e outra dentro de$a @s! para $embrarG la emite um beepA.
O comando do )hile de4ine uma estrutura de repetio que garante que uma sequ8ncia de comandos
seHa e(ecutada pe$o menos uma ,ez. -ua sinta(e 2F
do
a
-equ8ncia de comandosK
b
56i$e @'(pressaoAK
e sua sem.ntica 2 a seguinteF a sequ8ncia de comandos 2 e(ecutada e a *'press!o 2 a,a$iadaK se o ,a$or da
*'press!o 4or di4erente de zeroG a sequ8ncia de comandos 2 no,amente e(ecutada e tudo se repeteK do
contrrioG o comando que segue a estrutura 2 e(ecutado. U importante obser,ar a necessidade do pontoIeI
,+rgu$a encerrando o do )hile.
B consist8ncia da entrada de um dado re$ati,o a um m8s uti$izando um comando do )hile poderia ser
a seguinte.
int >esK
do
a
print4@<?igite mesF <AK
scan4@<gd<G h>esAK
i4 @@>es Z 1A ii @>es Y 12AA
print4@<la ?igitacao erradaP ?igite de no,o ln<AK
b
56i$e @@>es Z 1A ii @>es Y 12AAK
B uti$izao do comando do )hile para e(ecu1es sucessi,as de um programa 2 mais natura$G quando
a repetio da e(ecuo 2 4eita atra,2s da resposta pergunta 4ese3a continuar /SC%0U . 9er+amos a$go comoF
kinc$ude Zstdio.6Y
main@A
a
c6ar #espK
do
a
-equ8ncia de comandos do programa propriamente ditoK
print4@<?eseHa continuar @-NCAV<AK
scan4@<gc<G h#espAK
b
56i$e @toupper@#espA XX O-OAK
b
.&/ ' !omando brea0 em estruturas de repetio
?a mesma 4orma que sua ati,ao num case interrompe a e(ecuo de uma estrutura s)itchG a
e(ecuo de um comando brea: dentro de uma estrutura de repetio interrompe as e(ecu1es da sequ8ncia
de comandos da estruturaG mesmo que a condio de manuteno da repetio no ten6a sido negada. /om o
uso do brea:G o programa acima que determina,a o menor di,isor pr!prio de um inteiro poderia ter a
seguinte 4ormaF
kinc$ude Zstdio.6Y
kinc$ude Zmat6.6Y
main@A
a
4$oat rK
int CumG dK
print4@<?igite um numero F <AK
scan4@<gd<G hCumAK
d X 2K
r X sqrt@CumAK
56i$e @d ZX rA
i4 @Cum g d XX )A
brea7K
e$se
d X d W 1K
i4 @d ZX rA
print4@<gd eO di,isor proprio de gd ln<G dG CumAK
e$se
print4@<gd eO primo ln<G CumAK
b
Ceste $i,roG o uso do brea: em estruturas de repetio no ser estimu$ado ,isto que sua uti$izao
pode trazer prob$emas de legibilidade aos programas.
.&1 E3emplos Parte I
$& /onsideremos um programa para determinar a soma dos n primeiros nRmeros +mparesG n dado. Por
e(emp$oG se 4or 4ornecido para n o ,a$or "G o programa de,e retornar 3"G pois 1 W 3 W W & W % W 11 X 3".
Catura$menteG o sistema pode gerar os nRmeros impares que se pretende somarG atra,2s do comando
Impar T M e da repetio do comando Impar T Impar 8 Q. Catura$menteG tamb2mG para que o sistema gere o
pr!(imo +mparG o anterior H de,e ter sido somado. Isto pode ser 4eito atra,2s do comando Soma T O e da
repetio do comando Soma T Soma 8 Impar. 9emos ento o seguinte programa.
NfPrograma que soma os n primeiros nRmeros +mparG n dadofN
kinc$ude Zstdio.6Y
main@A
a
int -omaG ImparG nG iK
print4@<?igite o ,a$or de nF <AK
scan4@<gd<G hnAK
Impar X 1K
-oma X )K
4or @i X 1K i ZX nK i X i W 1A
a
-oma X -oma W ImparK
Impar X Impar W 2K
b
print4@<-oma dos gd primeiros nRmeros imparesF gd ln<G nG -omaAK
b
Obser,e que os comandos Impar T M e Soma T O atribuem um ,a$or inicia$ s ,ari,eis para que estes
,a$ores iniciais possam ser uti$izados nas primeiras e(ecu1es dos comandos Soma T Soma 8 Impar e
Impar T Impar 8 Q. /omo H dissemosG nos re4erimos a comandos que atribuem ,a$ores iniciais a ,ari,eis
para que estes ,a$ores possam ser uti$izados na primeira e(ecuo de um comando que ter sua e(ecuo
repetida como iniciali.a#!o da varivel2
:ma outra obser,ao interessante 2 queG como e(iste uma 4!rmu$a que d o iI2simo nRmero +mpar
@a
i
X 2i I 1AG o programa acima poderia ser escrito de uma 4orma mais e$eganteG prescindindoG inc$usi,eG da
,ari,e$ Impar.
NfPrograma que soma os n primeiros nRmeros imparG n dadofN
kinc$ude Zstdio.6Y
main@A
a
int -omaG nG iK
print4@<?igite o ,a$or de nF <AK
scan4@<gd<G hnAK
-oma X )K
4or @i X 1K i ZX nK i X i W 1A
-oma X -oma W 2fi I 1K
print4@<-oma dos gd primeiros nRmeros imparesF gd ln<G nG -omaAK
b
Optamos por apresentar a primeira ,erso pe$o 4ato de que nem sempre a 4!rmu$a para gerar os termos
da sequ8ncia que se pretende somar 2 to simp$es ou 2 muito con6ecida. Por e(emp$oG o e(erc+cio nRmero 2
da seo 4.& pede para somar os quadrados dos n primeiros nRmeros naturais eG neste casoG embora a 4!rmu$a
e(istaG e$a no 2 to con6ecida.
*& :m dos e(emp$os da seo anterior apresenta,a um programa que determina,aG se e(istisseG um
di,isor pr!prio de um inteiro dado. Imaginemos agora que queiramos um programa que apresente a $ista de
todos os di,isores de um inteiro n dado. Ceste casoG o programa pode percorrer todos os inteiros desde um
at2 a metade de n ,eri4icando se cada um de$es 2 um seu di,isor. 9emos ento o seguinte programa.
kinc$ude Zstdio.6Y
main@A
a
int CumG iK
print4@<?igite o numeroF <AK
scan4@<gd<G hCumAK
print4@<?i,isores pr!prios de gdF ln<G CumAK
4or @i X 2K i ZX CumN2K i X i W 1A
i4 @Cum g i XX )A
print4@<gd ln<G iAK
b
0a$e obser,ar queG ao contrrio do que 4oi dito na seo 2.%G os ,a$ores de sa+da deste programa no
esto sendo armazenados. O que acontece 2 que ainda no temos condi1es de armazenar uma quantidade
inde4inida de e$ementos. 'ste prob$ema ser reso$,ido no cap+tu$o ".
-& Ca seo 1. discutimos um a$goritmo que determina,a o quociente e o resto da di,iso entre dois
inteiros positi,os dados. 'mbora os compi$adores de / possuam o operador g que ca$cu$a o resto de uma
di,iso inteira entre dois inteiros positi,osG ,amos apresentarG por ser interessanteG a imp$ementao do
a$goritmo re4erido.
NfPrograma que determina o quociente e o resto da di,iso entre dois inteiros positi,osfN
kinc$ude Zstdio.6Y
main@A
a
int ?i,idendoG ?i,isorG ]uocG #estoK
print4@<?igite o di,idendo e o di,isor @di4erente de zeroPAF <AK
scan4@<gd gd<G h?i,idendoG h?i,isorAK
]uoc X 1K
56i$e @]uoc f ?i,isor ZX ?i,idendoA
]uoc X ]uoc W 1K
]uoc X ]uoc I 1K
#esto X ?i,idendo I ]uoc f ?i,isorK
print4@<]uociente e resto da di,iso de gd por gdF gd e gdln<G ?i,idendoG ?i,isorG ]uocG #estoAK
b
.& 'm muitos casos 6 necessidade de que um dos comandos da sequ8ncia que ter sua e(ecuo
repetida atra,2s de uma estrutura de repetio seHa uma outra estrutura de repetio @num caso deste dizemos
que as estruturas esto aninhadasA. Para um e(emp$oG seHam B X a1G 2G 3G ...G nb e um programa que pretenda
e(ibir o produto cartesiano B(B. Obser,e que para cada ,a$or da primeira componente o programa de,e
gerar todas as segundas componentes. ?e,emos terG portantoG uma estrutura de repetio para gerar as
primeiras componentes e uma outraG ,incu$ada a cada ,a$or da primeira componenteG para gerar as segundas
componentes.
NfPrograma para gerar um produto cartesianofN
kinc$ude Zstdio.6Y
main@A
a
int nG iG HK
print4@<?igite o numero de e$ementos do conHuntoF <AK
scan4@<gd<G hnAK
print4@<a<AK
4or @i X 1K i ZX nK i X i W 1A
4or @H X 1K H ZX nK H X H W 1A
print4@<@gdG gdAG <G iG HAK
print4@<b<AK
b
/& U interessante obser,ar que a ,ari,e$ de contro$e da estrutura interna pode depender da ,ari,e$ de
contro$e da estrutura e'terna. Por e(emp$oG se ao in,2s dos pares ordenadosG quis2ssemos os subconHuntos do
conHunto B com dois e$ementosG o programa no de,eria e(ibir o subconHunto a1G 1bG que possui um s!
e$ementoG e de,eria e(ibir apenas um dos subconHuntos a1G 2b e a2G 1b H que e$es so iguais. Isto pode ser
obtido inicia$izando H com uma unidade maior do que o ,a$or de i.
NfPrograma para gerar um conHunto de subconHuntos de um conHuntofN
kinc$ude Zstdio.6Y
main@A
a
int nG iG HK
print4@<?igite o numero de e$ementos do conHuntoF <AK
scan4@<gd<G hnAK
print4@<a<AK
4or @i X 1K i ZX nK i X i W 1A
4or @H X i W 1K H ZX nK H X H W 1A
print4@<agdG gdbG <G iG HAK
print4@<b<AK
b
1& -eHa um programa para o c$cu$o da m2dia de uma dada quantidade de nRmeros. Ca seo 1.
discutimos um a$goritmo para determinar a m2dia de 1).))) nRmeros dados. Ca ocasio discutimos que
uti$izar+amos uma Rnica ,ari,e$ para receber os nRmeros sendo que um ,a$or subsequente s! seria so$icitado
depois que o anterior 4osse <processado<. B di4erena agora 2 que a quantidade de nRmeros ser um dado de
entradaG o que torna o programa de ap$icao mais ,ariada. /omo a quantidade de nRmeros ser dadaG podeI
se uti$izar uma estrutura for para receber e somar os nRmeros.
NfPrograma para ca$cu$ar a media de n numerosG n dadofN
kinc$ude Zstdio.6Y
main@A
a
int nG iK
4$oat CumG -omaG >ediaK
-oma X )K
print4@<?igite o numero de e$ementosF <AK
scan4@<gd<G hnAK
print4@<ln ?igite os e$ementosF<AK
4or @i X 1K i ZX nK i X i W 1A
a
scan4@<g4<G hCumAK
-oma X -oma W CumK
b
>edia X -omaNnK
print4@<>edia X g4<G >ediaAK
b
2& O e(emp$o acima tem o incon,eniente de que sua e(ecuo e(ige que se saiba anteriormente a
quantidade de nRmeros e isto no ocorre na maioria dos casos. 0eHamos ento um programa para determinar
a m2dia de uma re$ao de nRmeros dadosG sem que se con6ea pre,iamente a quantidade de$es. Ceste casoG
no de,emos uti$izar o comando forG pois no sabemos o nRmero de repeti1esP BssimG o comando )hile
de,e ser uti$izadoK por2mG uma pergunta de,e ser 4ormu$adaF qua$ a e(presso $!gica que contro$ar a
estruturaV B so$uo 2 <acrescentar< re$ao um ,a$or sabidamente di4erente dos ,a$ores da re$ao e
uti$izar este ,a$or para contro$ar a repetio. 'ste ,a$or 2 con6ecido como flag. /omo dito $ogo acimaG de,eI
se ter certeza que o flag no consta da re$ao. Isto no 2 comp$icadoG pois ao se escre,er um programa se
tem con6ecimento de que ,a$ores o programa ,ai manipu$ar e a esco$6a do flag 4ica 4aci$itada. Por e(emp$oG
se o programa ,ai manipu$ar nRmeros positi,os podeIse usar I1 para o flag. B$2m do flagG o programa
necessita de uma ,ari,e$ @no caso Cont de contadorA que determine a quantidade de nRmeros da re$aoG
pois este ,a$or ser uti$izado no c$cu$o da m2dia.
NfPrograma para ca$cu$ar a media de uma re$acao de numerosfN
kinc$ude Zstdio.6Y
main@A
a
int /ontK
4$oat CumG -omaG >ediaK
-oma X )K
print4@<ln ?igite os e$ementos@I1 para encerrarAF<AK
scan4@<gd<G hCumAK
/ont X )K
56i$e @Cum PX I1A
a
-oma X -oma W CumK
/ont X /ont W 1K
scan4@<g4<G hCumAK
b
>edia X -omaN/ontK
print4@<>edia X g4<G >ediaAK
b
4& Ca seo 1." apresentamos o algoritmo de *uclides para a determinao do m'imo divisor comum
de dois nRmeros dados. Para re$embrarG ,eHamos como ca$cu$ar o m(imo di,isor comum de 2)4 e *4.
2 2 3
2)4 *4 3" 12
O a$goritmo 2 o seguinteF di,ideIse 2)4 por *4 obtendoIse resto 3"K a partir da+ repeteIse di,is1es at2
que o resto seHa zeroG sendo o di,idendo da di,iso atua$ o di,isor da di,iso anterior e o di,isor da di,iso
atua$ o resto da di,iso anterior. O R$timo di,isor 2 o m(imo di,isor procurado.
'scre,er este a$goritmo numa $inguagem de programao 2 muito simp$esG pois uma estrutura de
repetio e comandos de atribuio permitem que se obten6a 4aci$mente a sequ8ncia de di,is1es deseHadasG
Latua$izandoM o di,idendoG o di,isor e o resto.
NfPrograma para determinar o m(imo di,isor comum de dois nRmeros positi,osfN
kinc$ude Zstdio.6Y
main@A
a
int (G `G ?i,idendoG ?i,isorG >dcG #estoK
print4@<?igite os dois numeros ln<AK
scan4@<gd gd<G h(G h`AK
?i,idendo X (K
?i,isor X `K
#esto X ?i,idendo g ?i,isorK
56i$e @#esto PX )A
a
?i,idendo X ?i,isorK
?i,isor X #estoK
#esto X ?i,idendo g ?i,isorK
b
>dc X ?i,idendoK
print4@<mdc@gdG gdA X gd ln<G (G `G >dcAK
b
Cote a necessidade da uti$izao das ,ari,eis 4ividendo e 4ivisor. B$2m de 4aci$itarem a
compreenso do a$goritmoG e$as so uti$izadas no processamento e tero seus conteRdos a$terados durante a
e(ecuo do programa. -e usssemos as ,ari,eis ( e `G os ,a$ores dos dados de entrada seriam perdidos o
queG e,identementeG no de,e ocorrer. Co cap+tu$o G quando estudarmos 4un1esG estas ,ari,eis tero outra
conotao.
n primeira ,istaG o programa de,eria inicia$mente determinar o maior dos nRmeros ( e `G
armazenandoIo em a. O quadro seguinte mostra que isto no 2 necessrioG apresentando a simu$ao da
e(ecuo do programa para ( X "* e ` X 14*.
( ` a b #esto >dc
"* 14* "* 14* "*
14* "* 12
"* 12 *
12 * 4
* 4 )
4
6& :m outro a$goritmo matemtico cuHa imp$ementao numa $inguagem de programao apresenta
um bom e(emp$o do uso de estruturas de repetio 2 o a$goritmo para a determinao do mnimo m1ltiplo
comum @mmcA de dois nRmeros dados. /omo indica a pr!pria denominaoG o mnimo m1ltiplo comum de
dois nRmeros 2 o menor nRmero que 2 di,is+,e$ pe$os dois nRmeros. B matemtica pro,a que o mmc de dois
nRmeros 2 o produto dos di,isores primos dos dois nRmerosG comuns ou noG ambos com as suas
mu$tip$icidades. Para se obter os di,isores primosG rea$izaIse di,is1es sucessi,as pe$os primos que so
di,isores de pe$o menos um dos nRmeros.
B tabe$a seguinte mostra o c$cu$o do m+nimo mR$tip$o comum dos nRmeros 3") e 42)G como nos 2
ensinado no ensino 4undamenta$.
3")G 42)2
1*)G 21)2
%)G 1)2
4G 1)3
1G 33
G 3
1G &&
1G 1>>/ X 2M2M2M3M3MM& X 2 2)
Obser,e queG quando um di,isor primo 2 encontradoG repeteIse a di,isoG com o quociente no $ugar do
di,idendo at2 se obter um nRmero que no 2 mR$tip$o daque$e di,isor. B+G incrementaIse o ta$ di,isor. Isto 2
4eito at2 que ambos os quocientes seHam iguais a 1. 9emos o seguinte programa.
NfPrograma para determinar o minimo mu$tip$o comum de dois numeros positi,osfN
kinc$ude Zstdio.6Y
main@A
a
int (G `G dG aG bG iG >mcK
print4@<?igite os dois numeros ln<AK
scan4@<gd gd<G h(G h`AK
a X (K
b X `K
>mc X 1K
i X 2K
56i$e @@a PX 1A ii @b PX 1AA
a
56i$e @@a g i XX )A ii @b g i XX )AA
a
i4 @a g i XX )A
a X aNiK
i4 @b g i XX )A
b X bNiK
>mc X >mc f iK
b
i X i W 1K
b
print4@<mmc@gdG gdA X gd ln<G (G `G >mcAK
b
$9& B questo do mnimo m1ltiplo comum 2 muito interessante como e(emp$o para a aprendizagem de
programao pe$o 4ato de que podemos apresentar um outro a$goritmo de compreenso bem mais simp$es
que o anterior. B ideia 2 a seguinteF (G 2(G 3(G etc. so mR$tip$os de (. Para se obter o m+nimo mR$tip$o
comum basta que se tome o primeiro destes nRmeros que seHa mR$tip$o tamb2m de `.
NfPrograma para determinar o m+nimo mR$tip$o comum de dois nRmeros positi,osfN
kinc$ude Zstdio.6Y
main@A
a
int (G `G iG >mcK
print4@<?igite os dois numeros ln<AK
scan4@<gd gd<G h(G h`AK
>mc X (K
56i$e @>mc g ` PX )A
>mc X >mc W (K
print4@<mmc@gdG gdA X gd ln<G (G `G >mcAK
b
.&2 E3er!5!ios propostos
$& >ostre a con4igurao da te$a ap!s a e(ecuo do programa
kinc$ude Zstdio.6Y
main@A
a
int iG aG qG 9ermoK
4or @i X K i Y )K i X i I 1A
a
a X iK
q X 3K
9ermo X aK
56i$e @9ermo ZX % f aA
a
print4@<gd ln<G 9ermoAK
9ermo X 9ermo f qK
b
b
b
*& 'scre,a um programa que determine a soma dos quadrados dos n primeiros nRmeros naturaisG n
dado.
-& 'scre,a um programa para ca$cu$ar a soma dos n primeiros termos das sequ8ncias abai(oG n dado.
aA
1
2
3

*
G G G ...

_
,

bA 1
1
2
1
3
1
4
G G G G ...

_
,

.& O e(emp$o 1) da seo anterior apresenta,a uma so$uo para a questo do mnimo m1ltiplo comum
de simp$es compreenso. :m prob$ema que esta so$uo possui 2 que se o primeiro ,a$or digitado 4osse
muito menor do que o segundoG o nRmero de repeti1es necessrias para se c6egar ao mmc seria muito
grande. #e4aa o e(emp$oG tomando o maior dos nRmeros dados como base do racioc+nio a$i uti$izado.
/& :m nRmero inteiro 2 dito perfeito se o dobro de$e 2 igua$ soma de todos os seus di,isores. Por
e(emp$oG como os di,isores de " so 1G 2G 3 e " e 1 W 2 W 3 W " X 12G " 2 per4eito. B matemtica ainda no
sabe se a quantidade de nRmeros per4eitos 2 ou no 4inita. 'scre,a um programa que $iste todos os nRmeros
per4eitos menores que um inteiro n dado.
1& O nRmero 3.)2 possui a seguinte caracter+sticaF 3) W 2 X e
2
X 3 )2. 'scre,a um programa
que escre,a todos os nRmeros com quatro a$garismos que possuem a citada caracter+stica.
2& 'scre,a um programa que escre,a todos os pares de nRmeros de dois a$garismos que apresentam a
seguinte propriedadeF o produto dos nRmeros no se a$tera se os d+gitos so in,ertidos. Por e(emp$oG %3(13 X
3%(31 X 1.2)%.
4& 'scre,a um programa para determinar o nRmero de a$garismos de um nRmero inteiro positi,o dado.
6& :m nRmero inteiro positi,o 2 dito semiprimo se e$e 2 igua$ ao produto de dois nRmeros primos. Por
e(emp$oG 1 2 semiprimo pois 1 X 3 ( K % 2 semiprimo pois % X 3 ( 3K 2) no 2 semiprimo pois 2) X 2 ( 1)
e 1) no 2 primo. Os nRmeros semiprimos so 4undamentais para o sistema de criptogra4ia #-B a',aristoG JG
2))2T. 'scre,a um programa que ,eri4ique se um inteiro dado 2 semiprimo.
$9& ]uando um nRmero no 2 semiprimoG a >atemtica pro,a que e$e pode ser escrito de maneira
Rnica como um produto de pot8ncias de nRmeros primos distintos. 'ste produto 2 c6amado de decomposi#!o
em fatores primos do nRmero e os e(poentes so c6amados de multiplicidade do primo respecti,o. Por
e(emp$oG 3") X 2
3
(3
2
(. 'scre,a um programa que obten6a a decomposio em 4atores primos de um inteiro
dado.
$$& 'scre,a um programa que trans4orme o computador numa urna eletr(nica para e$eioG em
segundo turnoG para presidente de um certo pa+sG s quais concorrem os candidatos *3IB$ibab e %3I
B$capone. /ada ,oto de,e ser dado pe$o nRmero do candidatoG permitindoIse ainda o ,oto )) para voto em
branco. ]ua$quer ,oto di4erente dos H citados 2 considerado nuloK em qua$quer situaoG o e$eitor de,e ser
consu$tado quanto con4irmao do seu ,oto. Co 4ina$ da e$eio o programa de,e emitir um re$at!rio
contendo a ,otao de cada candidatoG a quantidade ,otos em brancoG a quantidade de ,otos nu$os e o
candidato e$eito.
$*& B sequ-ncia de Sibbonaci 2 a sequ8ncia @1G 1G 2G 3G G *G 13G ...A de4inida por
a
se n ou n
a a se n
n
n n


+ >

'

1 1 2
2
1 2
G
G

'scre,a um programa que determine o nI2simo termo desta sequ8nciaG n dado.
$-& B s;rie harm(nica S
n
+ + + + + 1
1
2
1
3
1
... ... 2 divergente. Isto signi4ica que dado qua$quer rea$ 7
e(iste n
)
ta$ que 1
1
2
1
3
1
)
+ + + + > ...
n
: . 'scre,a um programa que dado um rea$ 7 determine o menor
inteiro n
)
ta$ que - Y 7. Por e(emp$o se 7 X 2G o programa de,e 4ornecer n
)
X 4G pois
1
1
2
1
3
1
4
2 )*3 + + + G .... e 1
1
2
1
3
1*333 + + G ....
$.& ?ois nRmeros inteiros so ditos amigos se a soma dos di,isores de cada um de$es @menores que
e$esA 2 igua$ ao outro. Por e(emp$oG os di,isores de 22) so 1G 2G 4G G 1)G 11G 2)G 22G 44G e 11) e 1 W 2 W 4
W W 1) W 11 W 2) W 22 W 44 W W 11) X 2*4 e os di,isores de 2*4 so 1G 2G 4G &1 e 142 e 1 W 2 W 4 W &1 W
142 X 22). 'scre,a um programa que determine todos os pares de inteiros amigos menores que um inteiro
dado.
$/& 'scre,a um programa que escre,a todos os subconHuntos com tr8s e$ementos do conHunto a1G 2G 3G
...G nbG n dado.
$1& :m inteiro positi,o ( 2 dito uma pot-ncia prima se e(istem dois inteiros positi,os p e 7G com p
primoG tais que ( X p
7
. 'scre,a uma 4uno que receba um inteiro e ,eri4ique se e$e 2 uma pot8ncia prima.
$2& :m inteiro positi,o ( 2 dito uma pot-ncia perfeita de base . e e'poente y se e(istem dois inteiros
positi,os z e ` tais que ( X z
`
. 'scre,a uma 4uno que receba um inteiro e ,eri4ique se e$e 2 uma pot8ncia
per4eita.
')servao
Propostas de solu:es dos e3er!5!ios propostos podem ser soli!itadas atrav8s de mensagem
eletr;ni!a para jaime<!!en&ufal&)r !om assunto 0E"P'"=A" LI0' C, ane3ando o formul#rio
a)ai3o devidamente preen!>ido&
?ome Categoria
$
Instituio
*
Curso
*
Cidade@Estado
$
CategoriaA do!ente, estudante, autodidata
*
"e do!ente ou estudante
/& Fun:es e ponteiros
/&$ ' +ue so fun:es
/omo dissemos no cap+tu$o 2G um programa em / pode @e de,eA ser escrito como um conHunto de
fun#$es que so e(ecutadas a partir da e(ecuo de uma 4uno denominada main/0. /ada 4uno pode
conter dec$ara1es de ,ari,eisG instru1esG ati,a1es de 4un1es do sistema e de outras 4un1es de4inidas
pe$o programador. Catura$menteG o obHeti,o de uma 4uno de,e ser a rea$izao de a$guma <subItare4a<
espec+4ica da tare4a que o programa pretende rea$izar. BssimG podeIse escre,er 4un1es para a $eitura dos
dados de entradaG para a sa+da do programaG para a determinao da m2dia de ,rios e$ementosG para a troca
dos conteRdos de uma ,ari,e$G para o c$cu$o do m(imo di,isor comum de dois nRmeros dadosG etc.
Corma$menteG a rea$izao da <subItare4a< para a qua$ a 4uno 4oi escrita 2 c6amada de retorno da 4uno.
'ste retorno pode ser a rea$izao de uma ao gen2ricaG como a $eitura dos dados de entradaG ou um ,a$or
espec+4icoG como o c$cu$o do m(imo di,isor comum de dois nRmeros dados.
/omo 4oi dito na seo citadaG uma 4uno de,e ser de4inida com a seguinte sinta(eF
9ipo de ?ado Identi4icador da 4uno@Lista de par.metrosA
a
?ec$arao de ,ari,eis
-equ8ncia de instru1es
b
ondeG como tamb2m H 4oi ditoG o conHunto =ipo de 4ado Identificador da fun#!o/+ista de par"metros0 2
c6amado prottipo da 4uno. B+G =ipo de dado 2 intG charG floatG ou um dos seus <mR$tip$os<G quando a
4uno de,e retornar um ,a$or espec+4ico e void se a 4uno de,e rea$izar uma ao gen2rica sem retornar um
,a$or de4inido. Por seu turnoG +ista de par"metros 2 um conHunto de ,ari,eis uti$izadas para a 4uno
receber os ,a$ores para os quais a 4uno de,e ser e(ecutadaK estes ,a$ores so c6amados argumentosG queG
comparando uma 4uno com um programaG constituem os dados de entrada da 4uno.
Ca dec$arao de ,ari,eis so dec$aradas as ,ari,eis que as instru1es da 4uno ,o manipu$ar
internamente. 'stas ,ari,eis @e os par.metros da 4unoA s! so acess,eis pe$as instru1es da 4uno eG por
esta razoG so c6amadas variveis locais @na seo . so apresentados maiores deta$6esA.
-e a 4uno de,e retornar um ,a$orG uma de suas instru1es de,e ter a seguinte sinta(eF
return @e(pressoAK
sendo os par8nteses 4acu$tati,os. B sem.ntica desta instruo 2 e,identeF a e(presso 2 a,a$iada e o seu ,a$or
2 retornado 4uno que a ati,ou. B$2m disso @e isto agora no 2 e,identeAG a e(ecuo desta instruo
interrompe a e(ecuo da 4uno e o processamento retorna 4uno que ati,ou a 4uno em discusso.
B ati,ao @ou chamadaA da 4uno por outra 4uno se 4az com a re4er8ncia ao identi4icador da
4uno seguido dos argumentos em re$ao aos quais se pretende e(ecutar a 4uno. Por e(emp$oG o c$cu$o
do m(imo di,isor comum de dois nRmeros dadosG discutido no cap+tu$o anteriorG poderia ser reescrito da
seguinte 4ormaF
Nf3uno que retorna o m(imo di,isor comum de dois nRmeros positi,os dadosfN
int >a(?i,/om@int (G int `A
a
int #estoK
#esto X ( g `K
56i$e @#esto PX )A
a
( X `K
` X #estoK
#esto X ( g `K
b
return @`AK
b
Nf3uno principalF recebe os nRmeros e ati,a a 4uno ?a'4ivCom/0fN
main@A
a
int >dcG aG bK
print4@<?igite os dois inteiros<AK
scan4@<gd gd<G haG hbAK
>dc X >a(?i,/om@aG bAK
print4@<>dc@gdG gdA X gd ln<G aG bG >dcAK
b
-e este programa 4or e(ecutado para a entrada a X 2)4 e b X 1*4G a e(ecuo do comando
>dc X >a(?i,/om@aG bA
c6amaria a e(ecuo da 4unoG recebendo o par.metro ' o conteRdo de a e o par.metro y o conteRdo de b.
Ou seHaG as instru1es da 4uno seriam e(ecutadas para a entrada ( X 2)4 e ` X 1*4 e ter+amos a seguinte
sequ8ncia de ,a$ores para as ,ari,eis $ocais 'G y e Vesto at2 a interrupo da estrutura )hileF
( ` #esto
2)4 1*4 2)
1*4 2) 4
2) 4 )
Ceste instanteG a instruo return /y0 2 e(ecutada e o processamento retorna ao comando
>dc X >a(?i,/om@aG bA
e o ,a$or 4 2 armazenado na ,ari,e$ >dc.
'm a$guns sistemasG uma 4uno s! pode ati,ar uma outra 4uno que 4oi de4inida pre,iamente @como
no e(emp$o anteriorA ou cuHo prot!tipo esteHa e(p$icitado como uma das suas instru1es. Por e(emp$oG o
programa aqui re4erido poderia ter o seguinte 4ormatoF
main@A
a
int >dcG aG bK
int >a(?i,/om@int (G int `AK NfProt!tipo da 4uno que ,ai ser de4inida posteriormente fN
print4@<?igite os dois inteiros<AK
scan4@<gd gd<G haG hbAK
>dc X >a(?i,/om@aG bAK
print4@<>dc@gdG gdA X gd ln<G aG bG >dcAK
b
int >a(?i,/om@int (G int `A
a
int #estoK
#esto X ( g `K
56i$e @#esto PX )A
a
( X `K
` X #estoK
#esto X ( g `K
b
return @`AK
b
/&* Para +ue servem fun:es
',identementeG no 6 grandes ,antagens do programa que ca$cu$a o m(imo di,isor comum escrito
com uma 4uno em re$ao que$e do e(emp$o H citadoG que rea$iza,a todas as a1es necessrias dentro da
4uno main/0. Ca ,erdadeG a uti$izao de 4un1es s! 2 bastante ,antaHosa quando se trata de programas
grandesG capazes de rea$izar di,ersas tare4as independentesG mas re$acionadas. Por e(emp$oG um programa
que gerencie as contas correntes de um banco de,e ser capazG entre outras coisasG de 4ornecer o sa$do de uma
dada contaK atua$izar o sa$do em 4uno da ocorr8ncia de uma retirada ou de um dep!sitoK cadastrar uma
no,a contaK e(c$uir do cadastro uma dada contaG etc. Catura$menteG embora estas tare4as esteHam
re$acionadasG de,eIse pretender que e$as seHam rea$izadas de 4orma independenteG pois um dado c$iente num
dado momento pode querer a rea$izao de apenas uma de$as.
Cum caso como esteG o programa de,e possuir uma 4uno para cada uma das tare4as pretendidasG
4icando a cargo da 4uno main/0 a c6amada de uma ou de outra 4uno de acordo com a tare4a pretendida.
Isto permite que ,rios programadores desen,o$,am o programa @cada um desen,o$,endo a$gumas 4un1esAG
4aci$ita a rea$izao de testes de correo do programa @as 4un1es podem ser testadas de 4orma iso$adaA e a
manuteno posterior do programa @modi4ica1es necessrias no programa podem 4icar restritas a
modi4ica1es em a$gumas das 4un1esA. Ca ,erdadeG a modulari.a#!o do programa s! traz bene4+cios e de,e
ser uma prtica de todo programador.
U comum que um programa <mu$tiItare4a< como o e(emp$i4icado acima seHa iniciado com a
disponibi$izao para o usurio das di,ersas tare4as que e$e 2 capaz de e(ecutar. Corma$menteG este conHunto
de tare4as 2 c6amado de menu de op#$es e pode ser obtido atra,2s de uma 4uno que no retorna nen6um
,a$or. /onsiderando apenas as tare4as $istadas acimaG o menu de op1es do programa re4erido poderia ser
constru+do a partir da seguinte 4uno.
,oid >enu@A
a
print4@<1I-a$do ln 2I?ep!sito ln 3I#etirada ln 4ICo,a conta ln I'ncerra conta ln "I-ai do
programaAK<
b
Ceste casoG uma das primeiras instru1es da 4uno main/0 2 a ati,ao da 4uno ?enu/0 com a
simp$es re4er8ncia ao seu identi4icador seguido de par8nteses ,azios e de pontoIeI,+rgu$aF
main@A
a
>enu@AK
. . .
b
Obser,e que esta 4uno e(emp$i4ica uma 4uno que no retorna um ,a$or @da+ ser do tipo ,oidA e
cuHa +ista de par"metros 2 ,azia.
Btua$menteG com a disponibi$izao das $inguagens ,isuais @0isua$DasicG ?e$p6i e outrasAG os menus
de op#$es so disponibi$izados atra,2s de interfaces programaNusurio @contendo bot$esG banners e outras
denomina1esA e as ati,a1es das 4un1es que e(ecutam a tare4a pretendida 2 4eita atra,2s de mouses ou
mesmo atra,2s de toque manua$ na te$a do computador. '(istem a$gumas bibliotecas grficas que permitem
que se criem interfaces de programas em /K por2mG o estudo destas bib$iotecas no est no escopo deste
$i,ro.
Outra ap$icao importante de 4un1es se d quando 6 necessidade de que o programa determine a
mesma grandeza para ,a$ores di4erentes. :m e(emp$o t+pico desta necessidade aparece num programa que
determine medidas estat+sticasG como m;dia aritm;ticaG medianaG desvio m;dioG desvio padr!oG de uma
re$ao de nRmeros. /omo o desvio m;dio 2 a m2dia aritm2tica dos ,a$ores abso$utos dos des,ios em re$ao
m2diaG o seu c$cu$o e(igir a determinao da m2dia aritm2tica da re$ao e a m2dia aritm2tica dos
des,ios. 'scre,eremos ento uma 4uno para o c$cu$o da m2dia de uma re$ao qua$quer e a uti$izaremos
para os c$cu$os das duas m2dias necessrias. 'ste e(emp$o ser ,isto no cap+tu$o seguinte.
/&- Passagem de par7metros
:ma outra poss+,e$ uti$izao de 4un1es 2 para substituir uma sequ8ncia de instru1es que se repete
em ,rias partes do programa. Por e(emp$oG o e(emp$o 3 da seo 3.4 apresenta,a um programa para
ordenar tr8s nRmerosF
Nf Programa para ordenar tres numeros dadosfN
kinc$ude Zstdio.6Y
main@A
a
4$oat (G `G zG Bu(K
print4@<?igite os tres numeros<AK
scan4@<g4 g4 g4<G h(G h`G hzAK
print4@<Cumeros dadosF g4 G g4 G g4 ln<G (G `G zAK
i4 @@( Y `A ii @( Y zAA Nf ,eri4ica se ( no 2 o menor fN
i4 @` Z zA Nf neste caso ` 2 o menor fN
a
Bu( X (K Nf troca os conteRdos de ( e de ` fN
( X `K
` X Bu(K
b
e$se Nf neste caso z 2 o menor fN
a
Bu( X (K Nf troca os conteRdos de ( e de z fN
( X zK
z X Bu(K
b
i4 @` Y zA Nf ,eri4ica se z e ` ainda no esto ordenados fN
a
Bu( X `K Nf troca o conteRdo de ` e de z fN
` X zK
z X Bu(K
b
print4@<Cumeros ordenadosF g4 G g4 G g4 ln<G (G `G zAK
b
Obser,e que uma sequ8ncia de comandos com o mesmo obHeti,o @trocar os conteRdos de duas
,ari,eisA se repete. Cum caso como este poder+amos escre,er uma 4uno que rea$izasse aque$a ao
pretendida eG entoG esta 4uno seria uti$izada para substituir a sequ8ncia re4erida.
Por enquanto temos o seguinte prob$ema. -e de4inirmos a 4uno
,oid 9roca@4$oat (G 4$oat `A
a
4$oat Bu(K
Bu( X (K
( X `K
` X Bu(K
b
e a e(ecutarmos passando as ,ari,eis a e bG apenas os conteRdos de a e de b sero passados para ' e para y e
a troca rea$izada pe$a 4uno s! a4eta os conteRdos de ' e de yG no modi4icando os conteRdos de a e de b que
2 o que se pretendia. Ou seHaG a 4uno =roca recebe apenas os <,a$ores< de a e de b e as a1es rea$izadas
pe$a 4uno inter4ere apenas nos par.metros ' e yG no a$terando nada em re$ao aos argumentos a e b.
Ceste casoG dizemos que os par.metros 4oram passados por valor.
O sistema 9urbo /WW 3.) o4erece a possibi$idade de que a e(ecuo de uma 4uno a$tere conteRdos
de ,ari,eis Lno $ocaisM. Para istoG no prot!tipo da 4uno os par.metros de,em ser precedidos de h. Ceste
casoG os argumentos para ati,ao da 4uno t8m que ser ,ari,eis e qua$quer a$terao no conteRdo do
par.metro se re4$ete no conteRdo da ,ari,e$ argumento. ?izIse ento que a passagem dos par.metros 2 4eita
por refer-ncia.
/om este tipo de passagem de par.metroG o programa acima poderia ser escrito da seguinte
4ormaF
Nf Programa para ordenar tres numeros dadosfN
kinc$ude Zstdio.6Y
,oid 9roca@4$oat haG 4$oat hbA
a
4$oat Bu(K
Bu( X aK
a X bK
b X Bu(K
b
main@A
a
4$oat (G `G zG Bu(K
print4@<?igite os tres numeros<AK
scan4@<g4 g4 g4<G h(G h`G hzAK
print4@<Cumeros dadosF g4 G g4 G g4 ln<G (G `G zAK
i4 @@( Y `A ii @( Y zAA
i4 @` Z zA
9roca@(G `AK
e$se
9roca@(G zAK
i4 @` Y zA
9roca@`G zAK
print4@<Cumeros ordenadosF g4 G g4 G g4 ln<G (G `G zAK
b
B passagem de par.metro por re4er8ncia permite que entrada de dados seHa 4eita atra,2s de uma
4uno. Isto pode ser Rti$G por e(emp$oG em programas mu$titare4as em que o nRmero de entradas pode ,ariar
de acordo com a tare4a pretendida. Para e(emp$i4icar apresentaremos um programa para tratar nRmeros
comp$e(os. Catura$menteG um programa com este obHeti,o de,e estar apto a somar e mu$tip$icar comp$e(osG
casos em que a entrada ser dois nRmeros comp$e(osG e a determinar o m!du$o e a 4orma po$ar de um
comp$e(oG quando entrada ser apenas de um nRmero. B$2m de e(emp$i4icar a entrada de dados atra,2s de
uma 4unoG o programa abai(o e(emp$i4ica um programa mu$titare4a Lcomp$etoM.
NfPrograma para $gebra dos nRmeros comp$e(osfN
kinc$ude Zstdio.6Y
kinc$ude Zmat6.6Y
,oid Le/omp$e(o@4$oat haG 4$oat hbA
a
puts@<?igite a parte rea$ ZenterY parte imaginaria<AK
scan4@<g4 g4<G haG hbAK
b
4$oat >odu$o@4$oat aG 4$oat bA
a
return sqrt@afa W bfbAK
b
,oid Po$ar@4$oat aG 4$oat bG 4$oat hcG 4$oat hdA
a
c X >odu$o@aG bAK
d X asin@bNcAK
b
,oid -oma@4$oat aG 4$oat bG 4$oat cG 4$oat dG 4$oat heG 4$oat h4A
a
e X a W cK
4 X b W dK
b
,oid Produto@4$oat aG 4$oat bG 4$oat cG 4$oat dG 4$oat heG 4$oat h4A
a
e X afc I bfdK
4 X afd W bfcK
b
,oid >enu@A
a
puts@<1I>odu$o ln 2I 3orma po$ar ln 3I-oma ln 4IProduto ln I'ncerra ln ?igite sua opcaoF <AK
b
main@A
a
4$oat (G `G zG 5G tG uK
int OpcK
>enu@AK
scan4@<gd<G hOpcAK
s5itc6 @OpcA
a
case 1F
Le/omp$e(o@(G `AK
z X >odu$o@(G `AK
print4@<ig.24 W g.24ii X g.24<G (G `G zAK
brea7K
case 2F
Le/omp$e(o@(G `AK
Po$ar@(G `G zG 5AK
print4@<g.24 W g.24i X g.24@cosg.24 W iseng.24A<G (G `G zG 5G 5AK
brea7K
case 3F
Le/omp$e(o@(G `AK
Le/omp$e(o@zG 5AK
-oma@(G `G zG 5G tG uAK
print4@<@g.24 W g.24iA W @g.24 W g.24iA X g.24 W g.24i<G (G `G zG 5G tG uAK
brea7K
case 4F
Le/omp$e(o@(G `AK
Le/omp$e(o@zG 5AK
Produto@(G `G zG 5G tG uAK
print4@<@g.24 W g.24iA W @g.24 W g.24iA X g.24 W g.24i<G (G `G zG 5G tG uAK
brea7K
b
b
O e(emp$o a seguir me$6ora sobremaneira a $egibi$idade do programa @parte de$eA que determina o dia
da semana de uma data posterior ao ano de 1")) dada apresentado no cap+tu$o 3. L precis,amos
determinar o nRmero de dias decorridos entre )1N)1N1")) e a data dada. 0imos que precis,amos determinarG
entre outras coisasF o nRmero de dias H decorridos no ano da data dada @para isto precis,amos determinar se
ta$ ano era bisse(to e o nRmero de dias 31 H ocorridosA e a quantidade de anos bisse(tos entre 1")) e o ano
da data dada. B boa t2cnica de programao sugere que cada ao parcia$ do programa seHa e(ecutada por
uma 4uno.
9emos ento a seguinte proposta para um programa que determine o nRmero de dias dias decorridos
entre duas datas dadas @este programa 2 uti$izado em aposentadoriasF pe$a $egis$ao atua$ @no,embro de
2))*A um traba$6ador de uma empresa pri,ada adquire o direito de se aposentar quando comp$eta 3 anos de
ser,ioG sendo este c$cu$o a partir da soma do nRmero de dias traba$6ados nas @possi,e$menteA ,rias
empresas nas quais o interessado traba$6ouA.
NfPrograma para determinar o nRmero de dias entre duas datas dadasfN
kinc$ude Zconio.6Y
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
Nf0eri4ica se um ano 2 bisse(to @retornoF -imI1NCaoI)AfN
int '6Disse(to@int BnoA
a
return @@Bno g 4 XX )A hh @@Bno g 1)) PX )A ii @Bno g 4)) XX )AAAK
b
Nf#etorna o nRmero de dias 31 ocorridos at2 o m8s dadofN
int Cum?ias31@int >esA
a
i4 @>es Z %A
return >esN2K
e$se
return @>es W 1AN2K
b
Nf#etorna o nRmero de dias de um ano at2 uma data dadafN
int Cum?iasBte:ma?ata@int ?iaG int >esG int BnoA
a
int Cum?iasK
NNCumero de dias considerando todos os meses com 3) dias
Cum?ias X 3)f@>es I 1AK
NNBcrescentando o nRmero de dias 31 H ocorridos no ano e o nRmero de dias do m8s corrente
Cum?ias X Cum?ias W Cum?ias31@>esA W ?iaK
NN#eti4icando o nRmero de dias de 4e,ereiro @se e$e H ocorreuA
i4 @>es Y 2A
i4 @'6Disse(to@BnoAA
Cum?ias X Cum?ias I 1K
e$se
Cum?ias X Cum?ias I 2K
return Cum?iasK
b
Nf#etorna o nRmero de dias de uma ap!s uma data dadafN
int Cum?iasBpos:ma?ata@int ?iaG int >esG int BnoA
a
i4 @'6Disse(to@BnoAA
return 3"& I Cum?iasBte:ma?ata@?iaG >esG BnoAK
e$se
return 3"" I Cum?iasBte:ma?ata@?iaG >esG BnoAK
b
Nf#etorna o nRmero de anos bisse(tos entre dois anos dadosfN
int CumBnosDisse(tos@int Bno1G int Bno2A
a
int Bu(G >u$t4G >u$t1))G >u$t4))K
Bu( X Bno2 I 1K
>u$t4 X @Bu( I @Bu( g 4A I Bno1 W @Bno1 g 4AAN4K
>u$t1)) X @Bu( I @Bu( g 1))A I Bno1 W @Bno1 g 1))AAN1))K
>u$t4)) X @Bu( I @Bu( g 4))A I Bno1 W @Bno1 g 4))AAN4))K
return >u$t4 I >u$t1)) W >u$t4))K
b
main@A
a
int ?ia1G >es1G Bno1G ?ia2G >es2G Bno2G BnosG Cum?iasG ?ias?oBno3ina$G ?ias?oBnoInicia$K
c$rscr@AK
print4@<?ata inicia$ @ddNmmNaaaaAln<AK
scan4@<gdNgdNgd<G h?ia1G h>es1G hBno1AK
print4@<?ata 4ina$ @ddNmmNaaaaAln<AK
scan4@<gdNgdNgd<G h?ia2G h>es2G hBno2AK
Bnos X Bno2 I Bno1 I 1K
?ias?oBno3ina$ X Cum?iasBte:ma?ata@?ia2G >es2G Bno2AK
?ias?oBnoInicia$ X Cum?iasBpos:ma?ata@?ia1G >es1G Bno1AK
Cum?ias X Bnosf3" W ?ias?oBno3ina$ W ?ias?oBnoInicia$ W CumBnosDisse(tos@Bno1G Bno2AK
print4@<ln?ata inicia$F gdNgdNgd?ata 4ina$F gdNgdNgd Cumeros de diasF gd<G ?ia1G >es1G Bno1G
?ia2G >es2G Bno2G Cum?iasAK
getc6@AK
b
'mbora o help do 9urbo /WW 3.) a4irme que em / a Rnica passagem de par.metro 2 por ,a$orG
conseguimosG no 9urbo / 2.)1G uma 4orma de passagem de par.metros por re4er8ncia. Para isto uti$izaremos
ponteiros que a$2m de permitir esta 4orma de passagem de par.metros tem outras ap$ica1es importantes em
programao em / e em /WW.
/&. Ponteiros
Co cap+tu$o 2G 4oi dito que a cada posio de mem!ria 2 associado um nRmero inteiro c6amado
endere#o da posio de mem!ria. /omo uma varivel 2 uma posio de mem!riaG a cada ,ari,e$ 2
associado um endereo.
:m ponteiro 2 uma ,ari,e$ capaz de armazenar um endereo de outra ,ari,e$G sendo dec$arado com
a seguinte sinta(eF
9ipo de dado fIdenti4icadorK
B sem.ntica desta dec$arao pode ser assim entendidaF Identificador 2 capaz de armazenar o
endereo de uma ,ari,e$ de tipo =ipo de dado. Por e(emp$oG uma dec$arao do tipo
int fpK
indica que p 2 uma ,ari,e$ capaz de armazenar o endereo de uma ,ari,e$ do tipo int. Ca prtica dizemos
que p aponta para um inteiro. BssimG ponteiros tamb2m so c6amados apontadores. /omo ponteiros so
,ari,eisG podeIse atribuir um ponteiro a outro do mesmo tipo. Por e(emp$oG so ,$idas as seguintes
instru1esF
int fpG ftG iK
p X hiK
t X pK
poisG como dissemos no cap+tu$o 2G o operador de endere#o h 4ornece o endereo da ,ari,e$ em que e$e est
operando. ?este modoG p receber o endereo de i o que tamb2m acontecer com t quando da e(ecuo do
comando t X p.
-e p 2 um ponteiroG a indicao Wp num programa acessa o conteRdo da ,ari,e$ para a qua$ p aponta.
Bssim podemos ter o seguinte programaF
kinc$ude Zstdio.6Y
main@A
a
4$oat faG fbK
4$oat Bu(G (G `K
( X 1K Nf o conteRdo de ( agora 2 igua$ a 1 fN
` X 2K Nf o conteRdo de ` agora 2 igua$ a 2 fN
a X h(K Nf a aponta para ( fN
b X h`K Nf b aponta para ` fN
Bu( X faK Nf o conteRdo de Bu( agora 2 1 @conteRdo de (A fN
fa X fbK Nf o conteRdo de ( agora 2 2 @conteRdo de `A fN
fb X Bu(K Nf o conteRdo de ` agora 2 1 fN
print4@<( X g4 e ` X g4 ln<G (G `AK
b
9emos ento um programa I certamente um pouco so4isticado I para permutar os conteRdos de duas
,ari,eis.
]ua$quer que seHa o tipo de ,ari,e$ apontada por um ponteiroG podeIse <atribuirI$6e< a constante )
@zeroA e podeIse comparar um ponteiro com esta constante. O sistema o4erece uma constante simb!$ica
%X++ que pode @e norma$mente o 2A ser uti$izado no $ugar do zero paraG mnemonicamenteG indicar mais
c$aramente que este 2 um ,a$or especia$ para um ponteiro. /omo ,eremos daqui por dianteG este ,a$or
especia$ de ponteiro ser uti$izado para inicia$iza1es de ponteirosG para valores de escape de estruturas de
repetio e para retorno de 4un1es quando a$guma ao pretendida no 2 conseguida.
/&/ Passagem de par7metros por referNn!ia no =ur)o C *&9$
B uti$izao de ponteiros como par.metros de 4un1es permite a passagem de par.metros por
re4er8ncia no 9urbo / 2.)1. /onsidere um par.metro p do tipo ponteiro. /omo p armazenar um endereoG
se 4or passado para p o endereo de uma ,ari,e$ que possa ser apontada por e$eG qua$quer ao rea$izada no
ponteiro a4etar o conteRdo da ,ari,e$.
O caso da 4uno =roca/0G comentada na seo anteriorG poderia ser de4inida da seguinte 4ormaF
,oid troca@4$oat faG 4$oat fbA
a
4$oat Bu(K
Bu( X faK
fa X fbK
fb X Bu(K
b
e suas ati,a1es de,eriam ser 4eitas atra,2s de =roca/h(G h`0.
/&1 Uma urna eletr;ni!a
B passagem de par.metros por refer-ncia tamb2m 2 muito Rti$ quando se pretende que uma 4uno
retorne mais de um ,a$or. :m destes ,a$ores pode ser retornado pe$o comando return/0 e os demais podem
ser retornados para ,ari,eis que 4oram passadas por refer-ncia para par.metros da 4uno.
O e(emp$o abai(oG uma me$6or resposta de um e(erc+cio proposto no cap+tu$o anteriorG trans4orma um
computador numa urna e$etr;nica para a e$eioG em segundo turnoG para a presid8ncia de um certo pa+sG s
quais concorrem dois candidatos AlibabG de nRmero *%G e AlcaponeG de nRmero %3G sendo permitido ainda
o ,oto em branco @nRmero %%A e considerando como ,oto nu$o qua$quer ,oto di4erente dos anteriores.
B 4uno Confirma/0 de,e retornar dois ,a$oresF o primeiro paraG no caso de con4irmao do ,otoG
permitir sua contabi$izao e o segundo paraG ainda no caso de con4irmao do ,otoG interromper a estrutura
do )hileG o que permitir a recepo do ,oto seguinte. Obser,e tamb2m a passagem por re4er8ncia do
par.metro da 4uno Computa5oto/0. = necessidade de que seHa desta 4ormaG pe$o 4ato de que esta 4uno
a$terar conteRdos de ,ari,eis di4erentes.
kinc$ude Zstdio.6Y
kinc$ude Zct`pe.6Y
kinc$ude Zdos.6Y
kinc$ude Zconio.6Y
Nf3uno para con4irmao do ,otofN
int /on4irma@c6ar fsG c6ar fpA
a
int rK
c6ar /on4K
print4@<0oce ,otou em gsP /on4irma seu ,oto @-CAV <G sAK
44$us6@stdinAK
scan4@<gc<G h/on4AK
i4 @toupper@/on4A XX O-OA
a
fp X OsOK
r X 1K
b
e$se
a
fp X OnOK
print4@<la 0ote de no,oF <AK
sound@1)))AK
de$a`@*))))AK
nosound@AK
r X )K
b
return rK
b
Nf3uno para computar cada ,oto con4irmado para o candidatofN
,oid /omputa0oto@int fpA
a
fp X fp W 1K
b
Nf3uno principa$fN
main@A
a
int B$ibabaG B$caponeG Cu$osG DrancosG '$eitoresG 0otoK
c6ar -imG /ontK
c$rscr@AK
B$ibaba X B$capone X Cu$os X Drancos X )K
do
a
do
a
print4@< *% I B$ibaba ln %3 I B$capone ln %% I Dranco ln<AK
print4@<?igite seu ,otoF <AK
scan4@<gd<G h0otoAK
s5itc6 @0otoA
a
case *%F
i4 @/on4irma@<B$ibaba<G h-imA XX 1A
/omputa0oto@hB$ibabaAK
brea7K
case %3F
i4 @/on4irma@<B$capone<G h-imA XX 1A
/omputa0oto@hB$caponeAK
brea7K
case %%F
i4 @/on4irma@<Drancos<G h-imA XX 1A
/omputa0oto@hDrancosAK
brea7K
de4au$tF
i4 @/on4irma@<Cu$o<G h-imA XX 1A
/omputa0oto@hCu$osAK
brea7K
b
c$rscr@AK
b
56i$e @-im PX OsOAK
print4@<Outro e$eitor @-NCAV <AK
44$us6@stdinAK
scan4@<gc<G h/ontAK
b
56i$e @toupper@/ontA XX O-OAK
'$eitores X B$ibaba W B$capone W Drancos W Cu$osK
print4@<9ota$ de e$eitores gd ln B$ibaba gd ln B$capone gd ln Drancos gd ln Cu$os gd<G '$eitoresG
B$ibabaG B$caponeG DrancosG Cu$osAK
b
O arqui,o de cabea$6os dos2h cont2m as 4un1es sound/n0G nosound/0 e delay/n0. B primeira emite
um som de 4requ8ncia n 6ertzK a segunda interrompe a emisso de som e a terceira suspende a e(ecuo do
programa por n mi$issegundos.
B razo da c6amada da 4uno fflush/0 2 a seguinte. 'm a$guns sistemasG quando a$gum dado de
entrada 2 digitado para e(ecuo da 4uno scanf/0G os compi$adores / no o armazena diretamente na
posio de mem!ria respecti,aG armazenandoIo inicia$mente numa regio c6amada buffer paraG ao 4ina$ da
e(ecuo da 4uno de $eitura trans4erir o conteRdo do buffer para a mem!ria. -e quando da e(ecuo de
uma 4uno de $eitura o conteRdo do buffer no esti,er ,azioG 2 este conteRdo @natura$menteG indeseHadoA que
ser armazenado na ,ari,e$. B ati,ao de fflush/stdin0 <descarrega< todo o buffer dos dados digitados no
tec$ado e assim a 4uno de $eitura aguardar que o dado rea$mente pretendido seHa digitado. U prudenteG
portantoG preceder $eituras de caracteres e de cadeias de caracteres pe$a c6amada de fflush/stdin0.
Obser,e que um ponteiro do tipo char 2 capaz de LarmazenarM uma cadeia de caracteres @mais deta$6es
no cap+tu$o *A. Obser,e tamb2m que uti$izamos iniciali.a#$es sucessivas no comando B$ibaba X B$capone X
Cu$os X Drancos X ). 'sta 4orma de inicia$izar ,ari,eis tamb2m 2 ,$idaG mas no ser muito uti$izada neste
$i,ro.
Para conc$uir @por enquantoA o estudo de ponteirosG ,a$e ressa$,ar queG sendo ,ari,eis capazes de
receber endereos @portantoG ,a$ores do tipo intA podeIse somar e subtrair ponteiros. Co cap+tu$o &G ,eremos
um e(emp$o onde isto ser Rti$.
/&2 0e!ursividade
B$gumas 4un1es matemticas podem ser estabe$ecidas de ta$ 4orma que as suas de4ini1es uti$izemG
de modo recorrenteG a pr!pria 4uno que se est de4inindo. :m e(emp$o tri,ia$ @no bom sentidoA de um caso
como este 2 a 4uno fatorial. Co ensino m2dio aprendemos que o 4atoria$ de um nRmero natura$ n 2 o
produto de todos os nRmeros naturais de 1 at2 o re4erido nG ou seHaG nP X 1 . 2 . 3 . ... . n. /omo mostra o
e(emp$o abai(oG 2 muito simp$es se escre,er uma 4uno @fun#!o iterativaA que ca$cu$e o 4atoria$ de nF basta
se inicia$izar um ,ari,e$ com 1 eG numa estrutura de repetioG ca$cu$ar os produtos 1 ( 2 X 2G 2 ( 3 X "K " (
4 X 24K 24 ( X 12)K ...K etc.G at2 mu$tip$icar todos os naturais at2 n.
$ong int 3atoria$@int nA
a
$ong int 3atK
int iK
3at X 1K
4or @i X 2K i ZX nK i X i W 1A
3at X 3at f iK
return @3atAK
b
'mbora o conceito anterior seHa de simp$es compreensoG 2 matematicamente mais e$egante de4inir o
4atoria$ de um natura$ n por

'

>

1 G AP 1 @ .
1 ) G 1
P
n se n n
n ou n se
n
?esta 4ormaG o 4atoria$ de n 2 de4inido a partir dos 4atoriais dos naturais menores que e$e. Isto signi4ica
que para o c$cu$o do 4atoria$ de um determinado nRmero natura$ 6 necessidade de que se recorra aos
4atoriais dos naturais anteriores. Por e(emp$oG 4P X 4 . 3P X 4 . @3 . 2PA X @4 . 3A . @2 . 1PA X 4 . 3 . 2 . 1 X 24.
:ma de4inio com estas caracter+sticas 2 dita uma de4inio por recorr-ncia ou uma de4inio recursiva.
:m outro e(emp$o de uma de4inio recursi,a 4oi dada no e(erc+cio 12 da seo 4.F a sequ-ncia de
Sibbonaci 2 a sequ8ncia @a
n
A de4inida por

'

> +

2 AG 2 @ A 1 @
2 1 G 1
A @
n se n Sibb n Sibb
n ou n se
n Sibb
Obser,e que o termo de ordem n 2 de4inido a partir de termos anteriores. Isto signi4ica que para o
c$cu$o de um determinado termo 6 necessidade de que se recorra a ,a$ores de todos os termos anteriores.
Por e(emp$oG para a determinao de a

necessitamos con6ecer a
4
e a
3
K para a determinao destes doisG
necessitamos con6ecer a
2
e a
1
.
Catura$menteG uma de4inio recursi,a de,e conter uma condio que interrompa a recorr-ncia. 'sta
condio 2 c6amada condi#!o de escape. Co caso do 4atoria$ a condio de escape 2 n X ) ou n X 1K na
sequ8ncia de 3ibbonaciG a condio de escape 2 n X 1 ou n X 2. B e(presso que rea$iza propriamente a
recorr8ncia pode ser c6amada e'press!o de recorr-ncia
O surpreendente 2 que os ambientes para desen,o$,imento de programasG de um modo gera$G
o4erecem recursos para imp$ementao de fun#$es recursivas da mesma maneira que e$as so
escritas em matemtica. Por e(emp$oG a imp$ementao recursi,a do 4atoria$ em / pode ser 4eita
simp$esmente da seguinte 4ormaF
$ong int 3at#ec@int nA
a
i4 @@n XX )A ii @n XX 1AA
return @1AK
e$se
return @n f 3at#ec@n I 1AAK
b
U interessante ter uma ideia do que acontece na recursi,idade. ]uando se ati,a uma 4uno recursi,aG
cada no,a c6amada da mesma 2 empi$6ada na c6amada pilha de memriaG at2 que a condio de escape 2
atingida. B partir da+G cada ati,ao pendente 2 desempi$6ada @e,identementeG na ordem in,ersa do
empi$6amentoA e as opera1es ,o sendo rea$izadas.
-e ati,armos a 4uno acima com n X @com um comando print4@<gd<gG 3at#ec@AAG por
e(emp$oA ter+amos a seguinte sequ8ncia de opera1esF
1 I Bp!s a ati,ao de 3at@A
3at@A n
M3at@4A
2 I Bp!s a ati,ao de 3at@4A
3at@A n 3at@4A n
M3at@4A 4M3at@3A 3
3 I Bp!s a ati,ao de 3at@3A
3at@A n 3at@4A n 3at@3A n
M3at@4A 4M3at@3A 3 3M3at@2A 2
4 I Bp!s a ati,ao de 3at@2A
3at@A n 3at@4A n 3at@3A n 3at@2A n
M3at@4A 4M3at@3A 3 3M3at@2A 2 2M3at@1A 1
I Bp!s a ati,ao de 3at@1A
3at@A n 3at@4A n 3at@3A n 3at@2A n
M3at@4A 4M3at@3A 3 3M3at@2A 2 2M1 X 2 1
3at@A n 3at@4A n 3at@3A n
M3at@4A 4M3at@3A 3 3M2 X " 2
3at@A n 3at@4A n
M3at@4A 4M" X 24 3
3at@A n
M24 X 12)
'mbora a uti$izao da recursi,idade apresente a ,antagem de programas mais simp$esG e$a tem o
incon,eniente de sacri4icar a e4ici8ncia do programa. Isto ocorre de,ido necessidade de c6amadas
sucessi,as da 4uno e das opera1es de empi$6amento e desempi$6amentoG o que demanda um tempo maior
de computao e uma maior necessidade de uso de mem!ria. 'sta obser,ao 4az com que a so$uo no
recursi,a @c6amadaG como H dissemosG fun#!o iterativaA seHa pre4er+,e$. Co cap+tu$o & apresentaremos um
e(emp$o de uma 4uno recursi,a que 2 to e4iciente quanto a 4uno iterati,a.
>esmo 4un1es que no possuam intrinsecamente um de4inio recursi,a pode ser imp$ementada
recursi,amenteG muitas das ,ezes com uma $!gica mais 4ci$ de compreender do que a da so$uo iterati,a.
Por e(emp$oG a 4uno que determina o m(imo di,isor comum de dois inteiros dados apresentada na seo
.1 pode ser escrita recursi,amente da seguinte 4ormaF
Nf3uno recursi,a que retorna o m(imo di,isor comum de dois inteiros positi,os dadosfN
int >a(?i,/om@int (G int `A
a
int #estoK
#esto X ( g `K
i4 @#esto XX )A
return `K
e$se
return >a(?i,/om@`G #estoAK
b
:m outro e(emp$o interessante de recursi,idade 2 a imp$ementao do Hogo con6ecido como =orre de
<aniG Hogo que consiste em tr8s torres c6amadas origemG destino e au'iliar e um conHunto de n discos de
di.metros di4erentesG co$ocados na torre origemG na ordem decrescente dos seus di.metros. O obHeti,o do
Hogo 2G mo,endo um Rnico disco de cada ,ez e no podendo co$ocar um disco sobre outro de di.metro
menorG transportar todos os discos para pi$6a destinoG podendo usar a torre au'iliar como passagem
intermediria dos discos.
Indicando torre 1 torre 2 o mo,imento do disco que no momento est parte superior da
torre 1 para a torre 2G ter+amos a seguinte so$uo para o caso n X 2F
1. origem au(i$iar
2. origem destino
3. au(i$iar destino
Para n X 3G a so$uo seriaF
1. origem destino
2. origem au(i$iar
3. destino au(i$iar
4. origem destino
. au(i$iar origem
". au(i$iar destino
&. origem destino
Obser,e que os tr8s mo,imentos iniciais trans4erem dois discos da torre origem para a torre au'iliarG
uti$izando a torre destino como au(i$iarK o quarto mo,imento trans4ere o maior dos discos da origem para
destino e os R$timos mo,imentos trans4erem os dois discos que esto na au'iliar para destino uti$izando
origem como torre au(i$iar.
BssimG a operao >o,e@3G origemG au(i$iarG destinoA I mo,e tr8s discos da origem para destino
usando au'iliar como torre au(i$iar I pode ser decomposta em tr8s etapasF
1A >o,e@2G origemG destinoG au(i$iarA I mo,e dois discos de origem para au(i$iar usando destino
como au(i$iarK
2A >o,e um disco de origem para destino
3A >o,e@2G au(i$iarG origemG destinoA I mo,e dois discos de au(i$iar para destino usando origem como
au(i$iar.
O interessante 2 que 2 4ci$ mostrar que este racioc+nio se genera$iza para n discosG de modo que a
operao >o,e@nG aG bG cA pode ser obtida com as seguintes opera1esF
1A >o,e@nI1G aG cG bA
2A >o,e um disco de a para c
3A >o,e@nI1G bG aG cA
O mais interessante ainda 2 que isto pode ser imp$ementado em /G atra,2s do seguinte programaF
Nf Programa que imp$ementa o Hogo 9orre de =anoifN
kinc$ude Zstdio.6Y
,oid >o,e?isco@c6ar t1S1)TG c6ar t2S1)TA
a
print4@<gs IIY gs ln<G t1G t2AK
b
,oid =anoi@int (G c6ar oS1)TG c6ar aS1)TG c6ar dS1)TA
a
i4 @( Y )A
a
=anoi@( I 1G oG dG aAK
>o,e?isco@oG dAK
=anoi@( I 1G aG oG dAK
b
b
main@A
a
int nK
print4@<?igite o numero de discos ln<AK
scan4@<gd<G hnAK
=anoi@nG <origem<G <au(i$iar<G <destino<AK
b
/&4 Usando fun:es de outros ar+uivos
Os compi$adores / permitem que um programa uti$ize 4un1es de4inidas em outros programas. Dasta
que o re4erido programa seHa inc$u+do na instruo Ginclude D%omeArquivoD. Por e(emp$oG imagine que a
dec$arao de ,ari,eis e a 4uno abai(o
kinc$ude Zstdio.6Y
int (G `K
int >a(?i,/om@int aG int bA
a
int #estoK
#esto X a g bK
56i$e @#esto PX )A
a
a X bK
b X #estoK
#esto X a g bK
b
return bK
b
esteHam num arqui,o mdc2c. /omo a matemtica pro,a que o produto de dois nRmeros inteiros 2 igua$ ao
produto do m(imo di,isor comum dos nRmeros pe$o m+nimo mR$tip$o comumG a 4uno ?a'4ivCom/0
poderia ser uti$izada para se escre,er um programa para o c$cu$o do m+nimo mR$tip$o comum de dois
nRmeros dados. 'ste programa poderia uti$izar as ,ari,eis (G ` e ?dc dec$aradas no arqui,o mdc2c.
9er+amos ento o seguinte programaF
NfPrograma que ca$cu$a o minimo mu$tip$o comum de dois numeros uti$izando uma 4uno de4inida
em outro arqui,ofN
kinc$ude Zstdio.6Y
kinc$ude <mdc.c<
main@A
a
int mG >mcK
print4@<?igite os numeros <AK
scan4@<gd gd<G h(G h`AK
m X >a(?i,/om@(G `AK
>mc X @( f `ANmK
print4@<>mc@gdG gdA X gd ln<G (G `G >mcAK
b
B re4er8ncia ao arqui,o que ,ai ser Linc$u+doM no programa pode ser 4eita com o caminho do arqui,o
escrito entre aspas ou com o nome do arqui,o entre Z YG se e$e est gra,ado na pasta padro dos arqui,os de
cabea$6o 2h.
/&6 K=iposK de vari#veis
ari#veis lo!ais
/omo 4oi dito na seo .1G as ,ari,eis dec$aradas no interior de uma 4uno @variveis locaisG para
$embrarA s! so acess,eis por instru1es desta 4uno. Ca rea$idadeG e$as s! e(istem durante a e(ecuo da
4unoF so <criadas< quando a 4uno 2 ati,ada e so <destru+das< quando termina a e(ecuo da 4uno. Por
esta R$tima razoG ,ari,eis $ocais tamb2m so c6amadas variveis automticas e variveis din"micas.
9amb2m so ,ari,eis $ocais os par.metros da 4uno. Isto e(p$ica a necessidade de dec$arI$osG de4inindoIse
seus identi4icadores e seus tipos de dados.
ari#veis glo)ais e o modifi!ador e$tern
-e uma ,ari,e$ de,e ser acessada por mais de uma 4uno e$a de,e ser dec$arada 4ora de qua$quer
4unoG sendo c6amadaG neste casoG de varivel global. :ma ,ari,e$ g$oba$ pode ser re4erenciada em
qua$quer 4uno do programa eG embora isto no seHa aconse$6,e$G podeIse identi4icar uma ,ari,e$ $oca$
com o mesmo identi4icador de uma ,ari,e$ g$oba$. Ceste casoG re4er8ncias ao identi4icador comum dentro
da 4uno na qua$ a ,ari,e$ $oca$ 4oi de4inida re4ereIse a esta ,ari,e$ $oca$. IstoG natura$menteG impede a
4uno de acessar a ,ari,e$ g$oba$.
O modificador de varivel e'tern permite que um programa uti$ize ,ari,eis de4inidas e inicia$izadas
em 4un1es de um outro arqui,o que ten6a sido <inc$u+do< atra,2s da instruo kinc$ude <ComeBrqui,o<G
como ,isto na seo .*. Co cap+tu$o seguinte apresentaremos um e(emp$o bastante esc$arecedor do uso do
modi4icador e'tern.
ari#veis est#ti!as
/omo uma ,ari,e$ $oca$ dei(a de e(istir quando se encerra a e(ecuo da 4unoG o R$timo ,a$or ne$a
armazenado 2 perdido. Pode ocorrer que o R$timo ,a$or armazenado numa ,ari,e$ $oca$ seHa necessrio para
uma c6amada subsequente da 4uno. Bp!s a e(ecuo de uma 4unoG o R$timo ,a$or armazenado numa
,ari,e$ $oca$ pode ser preser,ado para ser uti$izado numa c6amada posterior da 4uno atra,2s do
modificador de varivel static. Co 9urbo / 2.)1 e no 9urbo /WW 3.)G uma ,ari,e$ $oca$ static de,e ser
inicia$izada por um ,a$or constante ou o endereo de uma ,ari,e$ g$oba$G quando da sua dec$arao. Ceste
casoG considerando que receber endereosG uma ,ari,e$ static de,e ser de4inida como um ponteiro.
Por e(emp$oG o programa abai(o uti$iza uma ,ari,e$ esttica para guardar o ,a$or de =ermo em cada
ati,ao da 4uno &eraA/0 paraG com este ,a$orG obter o ,a$or do termo seguinte.
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
int a1K
int oeraPB@int rA
a
static int f9ermo X ha1K
f9ermo X f9ermo W rK
return @f9ermoAK
b
main@A
a
int iG #azaoK
c$rscr@AK
print4@<?igite o primeiro termo e a razqoF <AK
scan4@<gd gd<G ha1G h#azaoAK
print4@<Progressao Britmetica de primeiro termo gd e razao gdF lngd <G a1G #azaoG a1AK
4or @i X 1K i ZX %K i X i W 1A
print4@<gd <G oeraPB@#azaoAAK
b
Catura$menteG concordo com o $eitor que est pensando que e(istem programas para gerao de
progress1es aritm2ticas bem mais simp$es.
:ma outra ap$icao de ,ari,eis estticas pode ser obtida numa 4uno que determine a
decomposio em 4atores primos de um inteiro dadoG e(erc+cio proposto no cap+tu$o anterior. :m a$goritmo
para determinar a decomposio em 4atores primos de um inteiro 2 e4etuar di,is1es sucessi,as pe$os primos
di,isoresG sendo o nRmero de di,is1es pe$o primo rea$izadas a sua mu$tip$icidade. Por e(emp$oG para se obter
a decomposio de 1.4)) ter+amos
14)) 2
&)) 2
3) 2
1&
3
& &
1 14)) X 2
3
(
2
(&
Bs 4un1es abai(oG a primeira iterati,a e a segunda recursi,aG retornam a decomposio de um inteiro
passado para o par.metro n.
,oid ?ecomp3atores@int nA
a
int dG mK
d X 2K
56i$e @n Y 1A
a
m X )K
56i$e @n g d XX )A
a
mWWK
n X n N dK
b
i4 @m Y )A
print4@<ltgdltgdln<G dG mAK
dWWK
b
b
,oid ?ecomp3atores#ec@int nA
a
static int d X 2K
int m X )K
i4 @n Y 1A
a
56i$e @n g d XX )A
a
mWWK
n X n N dK
b
i4 @m Y )A
print4@<ltgdltgdln<G dG mAK
dWWK
?ecomp3atores#ec@nAK
b
b
Obser,e que como d 4oi de4inida como estticaG o seu ,a$or da u$tima e(ecuo da 4unoG obtido
atra,2s do comando d88G 2 preser,ado permitindo que um no,o di,isor primo seHa procurado.
O ,a$or de uma ,ari,e$ esttica 2 preser,ado para uma pr!(ima e(ecuo da 4uno pe$o 4ato
de queG na ,erdadeG e$a no 2 destru+da quando se encerra a e(ecuo da 4unoG como se e$a 4osse
uma ,ari,e$ g$oba$. B di4erena entre ,ari,e$ $oca$ esttica e ,ari,e$ g$oba$ 2 que a primeira
continua s! podendo ser acessada pe$a 4uno onde e$a 4oi de4inida.
/&$9 Uma apli!ao % Oist,ria da Matem#ti!a
'm 1*1&G /6ristian oo$dbac6G um pro4essor de >atemtica e de =ist!ria nascido na B$eman6aG numa
carta que escre,eu ao matemtico Leonard 'u$er 4ez a seguinte a4irmaoF todo nRmero par maior quer dois
2 a soma de dois nRmeros primos. 'mbora a ,eracidade desta a4irmaoG con6ecida 6oHe como Con3ectura
de &oldbachG H ten6a sido ,eri4icada para todos os nRmeros pares menores do que 12(1)
1&
@6ttpFNN555.ieeta.ptNrtosNgo$dbac6.6tm$G acessada em 14N12N2))*AG ainda no se conseguiu pro,I$a
integra$menteG apesar dos es4oros H despendidos por muitos matemticos.
O programa abai(oG permite a ,eri4icao da Con3ectura de &old6ach para qua$quer nRmero par
menor que 32.&"&.
kinc$ude Zmat6.6Y
kinc$ude Zstdio.6Y
int Primo@int nA
a
int d X 2K
4$oat r X sqrt@nAK
56i$e @ngd PX ) hh d ZX rA
dWWK
i4 @d ZX rA
return )K
e$se
return 1K
b
,oid oo$dbac6@int nG int haG int hbA
a
int i X 2K
56i$e @PPrimo@iA ii PPrimo@n I iAA
iWWK
a X iK
b X n I iK
b
main@A
a
int (G `G zK
print4@<?igite um inteiro par <AK
scan4@<gd<G h(AK
oo$dbac6@(G `G zAK
print4@<Primos cuHa soma s igua$ a gdF gd e gd ln<G (G `G zAK
b
/&$$ E3er!5!ios propostos
$& 'scre,a uma 4uno que retorne o 7I2simo d+gito @da direita para esquerdaA de um inteiro nG 7 e n
dados. Por e(emp$oG teesimo?igito@2*4G 3A X *.
*& O fatorial mpar de um nRmero n +mpar positi,o 2 o produto de todos os nRmeros +mpares positi,os
menores do que ou iguais a n. Indicando o fatorial mpar de n por ni temosG ni X 1 . 3. . ... . n. Por
e(emp$oG &i X 1 . 3 . . & X 1). 'scre,a 4un1es iterati,as e recursi,as para a determinao do 4atoria$ +mpar
de um inteiro +mpar dado.
-& /omo na questo anteriorG o fatorial primo /ou primorialA de um nRmero primo positi,o 2 o produto
de todos os primos positi,os menores do que ou iguais a e$eF pk X 2 . 3 . . & . ... .p @sendo 2k X 2A. Por
e(emp$oG &k X 2 . 3 . . & X 21). 'scre,a um programa que determine o 4atoria$ primo de um primo dado.
.& 'scre,a 4un1esG iterati,a e recursi,aG que retornem a soma dos a$garismos de um inteiro positi,o
dado.
/& 'scre,a uma 4uno recursi,a que retorne o nI2simo termo da sequ8ncia de 3ibbonaciG n dado.
1. 'scre,a uma 4uno recursi,a que gere uma tabuada de mu$tip$icaoG e(ibindoIa no 4ormato @para
posicionar a sa+da podeIse uti$izar a 4uno goto'y/0A.
1(2 X 2 1(3 X 3 1(4 X 4 . . .
2(2 X 4 2(3 X " 2(4 X * . . .
3(2 X " 3(3 X % 3(4 X 12 . . .
. . . . . . . . . . . .
%(2 X 1* %(3 X 2& %(4 X 3" . . .
2& 'scre,a uma 4uno recursi,a que determine o mnimo m1ltiplo comum de dois inteiros dados.
4& 'scre,a 4un1esG recursi,a e iterati,aG que imp$ementem a 4uno po)/0.
')servao
Propostas de solu:es dos e3er!5!ios propostos podem ser soli!itadas atrav8s de mensagem
eletr;ni!a para jaime<!!en&ufal&)r !om assunto 0E"P'"=A" LI0' C, ane3ando o formul#rio
a)ai3o devidamente preen!>ido&
?ome Categoria
$
Instituio
*
Curso
*
Cidade@Estado
$
CategoriaA do!ente, estudante, autodidata
*
"e do!ente ou estudante
1 etores
1&$ ' +ue so vetores
Co e(emp$o " da seo 4." discutimos uma 4uno para a determinao da m2dia de uma re$ao de
nRmeros dados. Para ta$G uti$izamos uma ,ari,e$ simp$es para receber os nRmerosG sendo que cada ,ez que
um nRmeroG a partir do segundoG era recebido o anterior era <perdido<. Ou seHaG a re$ao de nRmeros no era
armazenada. Imagine que a re$ao 4osse uma re$ao de notas esco$ares e a$2m da m2dia se quisesse
tamb2m saber a quantidade de a$unos que obti,eram nota acima da m2dia ou uma outra medida estat+stica
@desvio m;dioG por e(emp$oA que dependesse da m2dia. Ceste casoG 6a,eria a necessidade de que a re$ao
4osse redigitada o queG a$2m da dup$icidade do traba$6oG 4aci$itaria os erros de digitao. U importante ento
que e(ista uma <,ari,e$< capaz de armazenar ,rios ,a$ores simu$taneamente de ta$ 4orma que se possa
acessar cada um de$es independentemente de se acessar os demais.
:m outro e(emp$o 2 o caso do e(emp$o 2 da seo 4.". L quer+amos a re$ao dos di,isores de um
inteiro dado e estes di,isores eram apenas e(ibidosG no sendo armazenadosG como recomendado na seo
2.%. Bt2 aque$e momentoG a di4icu$dade de se armazenar os di,isores residia no 4ato de que no se sabe a
priori o nRmero de di,isores de um inteiro dado eG portantoG no saber+amos quantas ,ari,eis de,er+amos
dec$arar.
:m vetor 2 um conHunto de ,ari,eis de um mesmo tipo de dado as quais so acessadas e
re4erenciadas atra,2s da aposio de ndices ao identi4icador do ,etor.
1&* Be!larao de um vetor unidimensional
:m vetor unidimensional @ou simp$esmente vetorA 2 dec$arado atra,2s da seguinte sinta(eF
9ipo de dado Identi4icadorSnTK
onde =ipo de dado 4i(ar o tipo de dado das ,ari,eis componentes do ,etor e n indicar o nRmero das tais
componentes.
Por e(emp$oG a dec$arao
int 0etorS1)T
de4inir um conHunto de dez ,ari,eis do tipo intG enquanto que a dec$arao
c6ar /adeiaS1))T
de4inir um conHunto de cem ,ari,eis do tipo char. /omo cada ,ari,e$ do tipo int uti$iza dois b`tes de
mem!ria e cada ,ari,e$ do tipo char uti$iza apenas um b`teG a ,ari,e$ 5etor ocupar ,inte b`tes de
mem!ria enquanto que a ,ari,e$ Cadeia ocupar cem b`tes.
Os compi$adores / possuem uma 4uno de bib$iotecaG si.eof/0G que retorna o nRmero de b`tes
ocupado por uma ,ari,e$ ou por um ,etor. Por e(emp$oG o programa
kinc$ude Zstdio.6Y
main@A
a
4$oat (K
int ,S3)TK
print4@<Cumero de b`tes de ( X gd lnCumero de b`tes de , X gd ln<G sizeo4@(AG sizeo4@,AAK
b
e(ibir na te$a a seguinte sa+daF
Cumero de b`tes de ( X 4
Cumero de b`tes de , X ")
/ada componente de um ,etor pode ser acessada e re4erenciada atra,2s de +ndices associados ao
identi4icador do ,etorG sendo o +ndice da primeira componente igua$ a zero. BssimG as componentes do ,etor
Cadeia do e(emp$o acima sero identi4icadas por /adeiaS)TG /adeiaS1TG ...G /adeiaS%%T.
O +ndice de uma componente pode ser re4erido atra,2s de uma e(presso que resu$te num ,a$or
inteiro. Por e(emp$oG a sequ8ncia de comandos
int iG ]uadradosS1))TK
4or @i X 1K i ZX 1))K i X i W 1A
]uadradosSi I 1T X i f iK
armazena no ,etor >uadrados os quadrados dos cem primeiros inteiros positi,os.
:ma coisa em que o programador em / de,e se preocupar 2 o 4ato de que os compi$adores / no
,eri4icam se os ,a$ores atribu+dos a um +ndice esto dentro dos $imites de4inidos na dec$arao do ,etor. -e
os $imites no 4orem obedecidosG podem ocorrer erros de $!gica na e(ecuo programa ou con4$itos com o
sistema operaciona$ @pro,ocandoG at2 mesmoG travamento no sistemaA.
1&- etores e ponteiros
U muito importante obser,ar que o identi4icador de um ,etor em / 2G na ,erdadeG um ponteiro que
aponta para o primeiro e$emento do ,etor. ]uando se dec$ara
int ,S1)TK
est se reser,ando um conHunto de dez posi1es de mem!ria cont+guasG cada uma de$as com dois b`tesG como
mostra a 4igura abai(oF
,
,S)T ,S1T ,S%T
B partir da+G qua$quer re4er8ncia ao identi4icador v 2 uma re4er8ncia ao endereo da componente ,S)TG
de ta$ 4orma queG se ti,ermos a dec$arao
int fpK
os comandos
p X h,S)TK p X ,K
e(ecutam a mesma aoF armazenam no ponteiro p o endereo de ,S)T.
-endo um ponteiro que aponta para sua primeira componenteG um ,etor pode ser um par.metro de
uma 4unoG podendo receber endereos. ?essa 4ormaG qua$quer ao rea$izada no ,etor a4etar o conteRdo
do ,etor passado como argumentoK ou seHaG a passagem de par.metros do tipo ,etor 2 sempre 4eita por
refer-ncia. 'sta obser,ao tamb2m Husti4ica a possibi$idade de que par.metros do tipo ,etor seHam
dec$arados como um ponteiroF ,oid 4uncao@int f,A.
1&. Lendo e es!revendo um vetor
/omo 4oi dito na seo ".1G ,etores ser,em para armazenar uma re$ao de dados do mesmo tipo. :ma
4uno para 4azer este armazenamento depende do con6ecimento ou no da quantidade de e$ementos da
re$ao. Ca 6ip!tese do nRmero de e$ementos da re$ao ser con6ecidoG basta usar uma 4unoG do tipo voidG
com dois par.metrosF um para receber o ,etor que ,ai armazenar a re$ao e outro para receber a quantidade
de e$ementos da re$ao. ?entro da 4unoG podeIse uti$izar um comando for.
kinc$ude Zstdio.6Y
,oid Brmazena#e$acaoC@int f,G int tA
a
int iK
print4@<?igite os e$ementos da re$acao ln<AK
4or @i X )K i Z tK iWWA
scan4@<gd<G h,SiTAK
b
-e o nRmero de e$ementos da re$ao no 2 con6ecido a prioriG de,eIse uti$izar um flag para encerrar a
entrada dos dadosG de acordo com o que 4oi comentado na seo 4.". U importante que a 4unoG para
uti$iza1es posterioresG determine o nRmero de e$ementos da re$ao. 'ste ,a$or pode ser retornado atra,2s
do comando return/0. ?entro da 4uno podeIse uti$izar um comando )hile que de,er ser e(ecutado
enquanto o dado de entrada 4or di4erente do flag esco$6ido.
int Brmazena#e$acao@int f,A
a
int iK
i X )K
print4@<?igite os e$ementos da re$acao @I1 para encerrarA<AK
scan4@<gd<G h,SiTAK
56i$e @,SiT PX I1A
a
i X i W 1K
scan4@<gd<G h,SiTAK
b
return @iAK
b
Obser,e a dup$a 4ina$idade da ,ari,e$ iF e$a ser,e para inde(ar as componentes e para determinar a
quantidade de e$ementos da re$ao.
Para se e(ibir uma re$ao de dados armazenados num ,etorG basta uma 4uno com dois par.metrosF
um para receber o ,etor onde a re$ao est armazenada e o outro para receber a quantidade de e$ementos da
re$ao. 'sta quantidade est armazenada em a$guma ,ari,e$F e$a 4oi um dado de entrada ou 4oi determinada
na ocasio do armazenamento da re$ao.
,oid '(ibe#e$acao@int f,G int tA
a
int iK
4or @i X )K i Z tK iWWA
print4@<gd <G ,SiTAK
print4@<ln<AK
b
1&/ E3emplos Parte I
Os e(emp$os a seguirG a$2m de re4orar ,rios aspectos da uti$izao de ,etoresG so muito Rteis no
desen,o$,imento da $!gica de programao.
$& Para introduzir o estudo dos ,etores nos re4erimosG na seo ".1G ao prob$ema de se determinar o
nRmero de a$unos de uma turma que obti,eram notas maiores que a m2dia. /om a uti$izao de ,etoresG
podemos ca$cu$ar a ta$ m2dia e depois <percorrer< no,amente o ,etorG comparando cada nota com a re4erida
m2dia. 9er+amos ento o seguinte programaF
kinc$ude Zstdio.6Y
int BrmazenaCotas@4$oat f,A
a
int iK
i X )K
print4@<?igite as notas @I1 para encerrarA<AK
scan4@<g4<G h,SiTAK
56i$e @,SiT PX I1A
a
i X i W 1K
scan4@<g4<G h,SiTAK
b
return @iAK
b
Nf3uno para determinar a m2dia de uma re$ao de nRmerosfN
4$oat >edia@4$oat f,G int tA
a
int iK
4$oat -omaK
-oma X )K
4or @i X )K i Z tK iWWA
-oma X -oma W ,SiTK
return @-omaNtAK
b
main@A
a
int iG ]uantG CotasDoasK
4$oat fpG >edK
]uant X BrmazenaCotas@pAK
>ed X >edia@pG ]uantAK
CotasDoas X )K
4or @i X )K i Z ]uantK i X i W 1A
i4 @pSiT Y >edA
CotasDoas X CotasDoas W 1K
print4@<>edia das notasF g4 ln<G >edAK
print4@<Cotas maiores que a mediaF gd<G CotasDoasAK
b
*& Imagine que quis2ssemos o desvio m;dio das notas do e(emp$o anterior. 'sta medida estat+stica 2
assim de4inidaF o desvio de um elemento em rela#!o Y m;dia aritm;tica 2 a di4erena entre o e$emento e a
m2dia aritm2tica da re$aoK o desvio m;dio 2 a m2dia aritm2tica dos ,a$ores abso$utos dos des,ios.
Podemos entoG como 4izemos acimaG escre,er uma 4uno para ca$cu$ar a m2dia da re$ao de notasG
armazenar os ,a$ores abso$utos dos des,ios em um ,etor e uti$izar a 4uno que ca$cu$a a m2dia para ca$cu$ar
a m2dia destes ,a$ores abso$utos.
4$oat ?es,io>edio@4$oat f,G int tA
a
int iK
4$oat fdK
4$oat >edK
>ed X >edia@,G tAK
4or @i X )K i Z tK iWWA
dSiT X abs@,SiT I >edAK
return@>edia@dG tAAK
b
Obser,e que este e(emp$o i$ustra outra ,antagem do uso de 4un1esF a mesma 4uno ?edia 4oi
uti$izada para determinao de m2dias de re$a1es di4erentes.
-& Imaginemos agora que queiramos uma 4uno que retorne o maior ,a$or de uma re$ao armazenada
em um ,etor. :ma poss+,e$ so$uo 2 supor que o maior ,a$or procurado 2 o primeiro e$emento do ,etor eG
em seguidaG percorrer o ,etor comparando cada componente com o ,a$or queG at2 o momentoG 2 o maiorG
substituindo o ,a$or deste maior e$emento quando se encontra uma componente maior que e$e.
4$oat >aior'$emento@4$oat f,G int tA
a
int iK
4$oat >aiorK
>aior X ,S)TK
4or @i X 1K i Z tK i X i W 1A
i4 @,SiT Y >aiorA
>aior X ,SiTK
return@>aiorAK
b
Obser,e que a 4uno acima retorna o maior e$emento armazenado no ,etorG mas no retorna a posio
deste maior e$ementoG o que em muitas situa1es 2 indispens,e$. Para isto 2 necessrio um par.metro com
passagem por re4er8nciaG como ,isto no cap+tu$o anterior. 'ste par.metro recebe o ,a$or zero e em seguida o
,a$or da posio onde 4oi encontrada uma componente maior do que ?aior.
4$oat >aior'$emento@4$oat f,G int tG int fpA
a
int iK
4$oat >aiorK
>aior X ,S)TK
fp X )K
4or @i X 1K i Z tK i X i W 1A
i4 @,SiT Y >aiorA
a
>aior X ,SiTK
fp X iK
b
return@>aiorAK
b
:ma c6amada desta 4uno ,ai requererG a$2m do ,etor p onde est armazenada a re$aoG duas
,ari,eisG digamos ?aior e osK nestas condi1es a ati,ao da 4uno ser 4eita atra,2s do comando
>aior X >aior'$emento@pG ]uantG hPosAK
onde p 2 o ,etor onde est armazenada a re$aoG >uant 2 a quantidade de e$ementos da re$ao e Zos 2 o
endereo da ,ari,e$ que ir armazenar a posio da ocorr8ncia do maior e$emento procurado.
0a$e ressa$tar queG na 4uno acimaG adotamos a passagem por re4er8ncia <4ormato 9urbo / 2.)1< que
tamb2m 4unciona no 9urbo /WW 3.).
.& O e(emp$o a seguir tem o obHeti,o de mostrar que o +ndice de acesso s componentes de um ,etor
pode ser dado atra,2s de e(press1esG como H 4oi dito anteriormente. O e(emp$o mostra uma 4uno queG
recebendo dois ,etores com a mesma quantidade de e$ementosG gera um ,etor interca$ando as componentes
dos ,etores dados. Bssim se ,
1
X a4G *G 1G %b e ,
2
X a2G G &G 3b a 4uno de,e gerar o ,etor , X a4G 2G *G G 1G
&G %G 3b. Obser,e que as componentes +mpares de v so os e$ementos de v
M
e as componentes pares so os
e$ementos de v
Q
.
,oid Interca$a0etor@4$oat f,1G 4$oat f,2G 4$oat f,G int tA
a
int iK
4or @i X )K i Z 2 f tK i X i W 1A
i4 @i g 2 XX 1A
,SiT X ,2S@i I 1AN2TK
e$se
,SiT X ,1SiN2TK
b
/& Bgora apresentaremos um e(emp$o que mostra um ,etor cuHas componentes so cadeias de
caracteresG a$2m de mostrar como um ,etor de caracteres pode ser inicia$izado. 9rataIse de uma 4uno que
retorna o nome do m8s correspondente a um nRmero dadoG que poderia ser usada num programa que
escre,esse por e(tenso uma data da no 4ormato ddNmmNaaaa.
c6ar fCome>es@int nA
a
c6ar fComeS13T X a<>es i$ega$<G <Janeiro<G <3e,ereiro<G <>arco<G <Bbri$<G <>aio<G <Jun6o<G <Ju$6o<G
<Bgosto<G <-etembro<G <Outubro<G <Co,embro<G <?ezembro<bK
i4 @@n Y )A hh @n Z 13AA
return@ComeSnTAK
e$se
return@ComeS)TAK
b
Obser,e que a inicia$izao do ,etor se 4az quando da sua dec$araoG com a enumerao dos ,a$ores
das componentes entre c6a,esG como a matemtica 4az com conHuntos. Obser,e tamb2m que a 4uno
%ome?es/0 retorna um ponteiro para uma ,ari,e$ do tipo charG o que signi4ica que retornar uma cadeia de
caracteres @uma stringAG poisG como ,eremos no pr!(imo cap+tu$oG uma string 2 um ,etor de caracteres. 'ste
4ato tamb2m 2 indicado no ,etor %ome que 2 um ,etor de ponteiros para ,ari,eis do tipo char.
1& 'ste e(emp$o mostra uma situao em que 6 a necessidade de ,rios ,etores. 9rataIse de um
programa para administrar os pedidos de uma $anc6oneteG cuHo cardpio 2 o seguinteF
/odigo Produto Preo
1)1 #e4rigerante 1.2)
1)2 -uco 1.))
1)3 -andu+c6e 2.)
1)4 -a$gado 1.))
1) 9orta 2.))
:ma poss+,e$ so$uo 2 considerar tr8s ,etores g$obaisG inicia$izados como no e(emp$o anteriorG de ta$
4orma que seHa poss+,e$ para cada pedido gerar ,etores com os c!digos dos produtos so$icitados eG a partir
da+G se possa armazenar as quantidades de cada item do pedido.
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
int /odST X a1)1G 1)2G 1)3G 1)4G 1)bK
c6ar fProdST X a<#e4rigerante<G <-uco<G <-anduic6e<G <-a$gado<G <9orta<bK
4$oat PrecosST X a1.2)G 1.))G 2.)G 1.))G 2.))bK
int Pedido@int fcG int fqG 4$oat f,A
a
int i X )K
do
a
do
a
puts@</!digo @1)) para encerrar o pedidoAF<AK
scan4@<gd<G hcSiTAK
i4 @cSiT Z 1)) ii cSiT Y 1)A
print4@<la /odigo in,a$ido<AK
b
56i$e @cSiT Z 1)) ii cSiT Y 1)AK
i4 @cSiT PX 1))A
a
puts@<]uantidade<AK
scan4@<gd<G hqSiTAK
,SiT X qSiTfPrecosScSiT I 1)1TK
iWWK
b
b
56i$e @cSiT PX 1))AK
return iK
b
,oid '(ibePedido@int fcG int fqG 4$oat f,G int tA
a
int iK
4$oat 9ota$ X ).)K
c$rscr@AK
puts@</!digo ?iscriminao ]uantidade 0a$or ln<AK
4or @i X )K i Z tK iWWA
a
print4@<gd gs g1).d g1).24ln<G /odScSiT I 1)1TG ProdScSiT I 1)1TG qSiTG ,SiTAK
9ota$ X 9ota$ W ,SiTK
b
print4@<ln0a$or tota$ do pedidoF g.24lnln<G 9ota$AK
b
main@A
a
int CumItensG fItensG f]uantK
4$oat f0a$orK
c6ar - X OnOK
do
a
c$rscr@AK
CumItens X Pedido@ItensG ]uantG 0a$orAK
i4 @CumItens PX )A
'(ibePedido@ItensG ]uantG 0a$orG CumItensAK
puts@<Outro pedido @-NCAV<AK
44$us6@stdinAK
scan4@<gc<G h-AK
b
56i$e @toupper@-A PX OCOAK
b
2& >ostraremos agora um e(emp$o cuHo obHeti,o 2 desen,o$,er o racioc+nio recursi,o uti$izando
,etores. 9rataIse de uma 4uno recursi,a para a determinao da soma das componentes de um ,etorG coisa
H 4eita iterati,amente no interior da 4uno ?edia/0 desen,o$,ida no e(emp$o 1. OraG como uma 4uno que
trata ,etores recebe sempre o ,etor e o seu taman6oG podemos recursi,amente LdiminuirM o taman6o do ,etor
atra,2s do decremento do par.metro respecti,o at2 que o ,etor Lten6a apenas uma componenteMG quando
ento a soma das componentes se reduzir a esta LRnicaM componente.
Nf3uno recursi,a que retorna a soma das componentes de um ,etorfN
int -oma/omp#ec@4$oat f,G int tA
a
i4 @t XX 1A
return ,Si [ 1TK
e$se
return ,St I 1T W -oma/om#ec@,G t [ 1AK
b
1&1 etores multidimensionais
Ca seo ".1 4oi dito que um ,etor 2 um conHunto de ,ari,eis de mesmo tipoG c6amadas componentes
do ,etor. B $inguagem / permite que as componentes de um ,etor seHam tamb2m ,etoresG admitindo que se
armazene uma matri. da matemticaG uma tabela de dupla entrada queG por e(emp$oG enumere as dist.ncias
entre as capitais brasi$eiras ou um $i,ro considerando a pginaG a $in6a e a co$una em que cada caractere se
$oca$iza.
B dec$arao de um ,etor mu$tidimensiona$ 2 uma e(tenso natura$ da dec$arao de um ,etor
unidimensiona$F
9ipo de dado Identi4icadorSn
1
TSn
2
T ... Sn
7
TK
onde : indica a dimens!o e n
M
G n
Q
G ...G n
:
indicam o nRmero de componentes em cada dimens!o.
Por e(emp$oG a dec$arao
int >atS1)TS*TK
de4ine um ,etor de dez componentesG cada uma de$as sendo um ,etor de oito componentes. Ou seHaG ?at 2
um conHunto de 1) ( * X *) ,ari,eis do tipo int.
Para um outro e(emp$oG a dec$arao
c6ar Li,roS&2TS3)TS3)TK
de4ine uma ,ari,e$ capaz de armazenar os caracteres de um $i,ro com at2 setenta duas pginasG cada pgina
possuindo trinta $in6as e cada $in6a possuindo trinta co$unas.
B inicia$izao de um ,etor mu$tidimensiona$ tamb2m segue o padro da inicia$izao de um ,etor
unidimensiona$G com a ressa$,a de que as componentesG que agora so ,etoresG de,em estar entre c6a,es. Por
e(emp$oG se quis2ssemos um ,etor bidimensiona$ para armazenar os nRmeros de dias dos meses do anoG
4azendo a distino entre anos bisse(tos e no bisse(tos poder+amos dec$arar e inicia$izar um ,etor
4ias?eses da seguinte 4ormaF
int ?ias>eses X aa)G 31G 2*G 31G 3)G 31G 3)G 31G 31G 3)G 31G 3)G 31bG a)G 31G 2%G 31G 3)G 31G 3)G 31G 31G
3)G 31G 3)G 31bbK
onde a primeira componente re4ereIse aos dias dos meses de um ano no bisse(to e a segundoG aos dias dos
meses de um ano bisse(to @este ,etor ser uti$izado num e(emp$o a seguir eG na ocasioG ser e(p$icada a
razo da primeira componente de cada ,etor componente ser zeroA.
:m ,etor bidimensiona$ 2 usua$mente c6amado de matri. e os nRmeros de componentes so
c6amadosG respecti,amenteG n1mero de linhas e n1mero de colunas. 'stes dois nRmeros separados por ( @que
2 $ido porA 2 a ordem da matriz. BssimG a ,ari,e$ ?at do e(emp$o acima est apta a armazenar at2 uma
matriz de ordem * ( 1). 'stas denomina1esG emprestadas da matemticaG so Husti4icadas pe$o 4ato de queG
embora as componentes de um ,etor bidimensiona$ seHam armazenadas de 4orma consecuti,a @a primeira
componente do segundo ,etor $ogo ap!s a R$tima componente do primeiro ,etorAG uma matrizG para 4aci$itar
sua compreensoG pode ser imaginada como constitu+da de linhas e de colunas. Por e(emp$oG o ,etor
4ias?eses do e(emp$o acima pode ser imaginado como sendo
) 31 2* 31 3) 31 3) 31 31 3) 31 3) 31
) 31 2% 31 3) 31 3) 31 31 3) 31 3) 31
4aci$itando a compreenso de re4er8ncias do tipo 4ias?eses[M\[Q\ que indica o e$emento da segunda $in6a @a
primeira 2 de +ndice zeroA e da terceira co$una @a primeira 2 de +ndice zeroA.
-e o nRmero de $in6as e o nRmero de co$unas de uma tabe$a so con6ecidosG o seu armazenamento em
uma matriz 2 muito simp$es. Dasta uti$izar dois comandos for anin6adosG contro$ados pe$o nRmero de $in6as
e pe$o nRmero de co$unasG respecti,amente.
,oid Brmazena9abe$a>C@4$oat >atS1)TS1)TG int mG int nA
a
int iG HK
print4@<?igiteG por $in6aG os e$ementos da matriz<AK
4or @i X )K i Z mK i X i W 1A
4or @H X )K H Z nK H X H W 1A
scan4@<g4<G h>atSiTSHTAK
b
-e o nRmero de $in6as e o nRmero de co$unas de uma tabe$a no so con6ecidosG podeIse usar um
dup$o )hile anin6adoG de4inindoIse um flag para encerramento da digitao dos e$ementos de cada $in6a e
um outro flag para encerramento da digitao da matriz. Catura$menteG a 4uno de,er retornar o nRmero
de $in6as e o nRmero de co$unas da tabe$aG o que Husti4ica os ponteiros m e n da proposta abai(o.
,oid Brmazena9abe$a@4$oat >atS1)TS1)TG int hmG int hnA
a
int iG HK
print4@<?igiteG por $in6aG os e$ementos da matriz @I1 para encerrar cada $in6a e I2 para encerrar a
matriz<AK
i X )K
H X )K
scan4@<g4<G h>atSiTSHTAK
56i$e @>atSiTSHT PX I2A
a
56i$e @>atSiTSHT PX I1A
a
H X H W 1K
scan4@<g4<G h>atSiTSHTAK
n X HK
b
i X i W 1K
H X )K
scan4@<g4<G h>atSiTSHTAK
b
m X iK
b
:ma 4uno para e(ibir uma tabe$a armazenada numa matriz tamb2m 2 muito simp$es. DastaG para que
a matriz seHa e(ibida na 4orma de tabe$aG mudar a $in6a cada ,ez que a e(ibio de uma $in6a 2 conc$u+da.
,oid '(ibe9abe$a@4$oat >atS1)TS1)TG int mG int nA
a
int iG HK
4or @i X )K i Z mK i X i W 1A
a
4or @H X )K H Z nK H X H W 1A
print4@<g.14 <G >atSiTSHTAK
print4@<ln<AK
b
b
1&2 E3emplos Parte
$& :m dos e(emp$os do cap+tu$o 3 apresenta,a uma 4uno que recebia uma data e 4ornecia o dia da
semana correspondente. Ceste programa precisamos ca$cu$ar o nRmero de dias do ano decorridos at2 aque$a
data. /om a uti$izao da matriz 4ias?eses comentada acimaG podemos escre,er 4aci$mente uma 4uno
com este obHeti,o.
int ?iaBno@int dG int mG int aA
a
int ?ias>esS2TS13T X aa)G 31G 2*G 31G 3)G 31G 3)G 31G 31G 3)G 31G 3)G 31bG
a)G 31G 2%G 31G 3)G 31G 3)G 31G 31G 3)G 31G 3)G 31bbK
int iK
i4 @@@a g 4 XX )A hh @a g 1)) PX )AA ii @a g 4)) XX )AA
4or @i X 1K i Z mK i X i W 1A
d X d W ?ias>esS1TSiTK
e$se
4or @i X 1K i Z mK i X i W 1A
d X d W ?ias>esS)TSiTK
return@dAK
b
Lembrando que o ,a$or de uma e(presso $!gica 2 1 @umA se e$a 4or ,erdadeira e ) @zeroA se e$a 4or
4a$saG poder+amos armazenar o ,a$or da e(presso $!gica que garante que um ano 2 bisse(to e uti$izar o
conteRdo desta ,ari,e$ para esco$6er a componente do ,etor 4ias?eses que ser uti$izadaF 1 @umA se 4or
bisse(to e @)A zeroG caso contrrio.
int ?iaBno@int dG int mG int aA
a
int iGDissK
Diss X @@a g 4 XX )A hh @a g 1)) PX )AA ii @a g 4)) XX )AK
4or @i X 1K i Z mK i X i W 1A
d X d W ?ias>esSDissTSiTK
return@dAK
b
B razo de termos considerado a primeira componente igua$ a ) @zeroA 4oi para compatibi$izar o
nRmero correspondente a cada m8s com a componente do ,etorG H que @repetindo pe$a R$tima ,ezA a primeira
componente de um ,etor 2 de +ndice zero.
*& /omo no e(emp$o em que o pr!prio sistema gerou os quadrados dos cem primeiros nRmeros
inteirosG o sistema pode gerar uma matriz. Para e(emp$i4icar istoG apresentaremos uma 4uno que gera a
matri. identidade de ordem n. Para um inteiro positi,o dadoG a matri. identidade de ordem n 2 a matriz I
n
X
@i
rs
AG de ordem n(nG dada por i
rs
X 1G se r X sG e i
rs
X )G se r s. 'sta matriz 2 muito importante no estudo das
matrizesG sendo uti$izadaG por e(emp$oG para a determinao da matri. inversa de uma matriz in,ers+,e$. Por
e(emp$oG se n X 3G temos
I
3
1 ) )
) 1 )
) ) 1

_
,

,oid oera>atriz:nidade@int >atS1)TS1)TG int mA


a
int iG HK
4or @i X )K i Z mK i X i W 1A
4or @H X )K H Z mK H X H W 1A
i4 @i XX HA
>atSiTSHT X 1K
e$se
>atSiTSHT X )K
b
-& ]uando o nRmero de $in6as de uma matriz 2 igua$ ao nRmero de co$unas a matriz 2 dita matri.
quadrada. Ceste casoG os e$ementos de +ndices iguais constituem a diagonal principal. B soma dos
e$ementos da diagona$ principa$ de uma matriz quadrada 2 o tra#o da matriz. /omo mais um e(emp$o de
programas que manipu$am matrizesG a 4uno abai(o determina o tra#o de uma matriz quadrada dada.
Obser,e que para percorrer a diagona$ principa$ no 6 necessidade de um dup$o for.
4$oat 9raco@4$oat >atS1)TS1)TG int mG int nA
a
int iK
4$oat 9rK
9r X )K
i4 @m XX nA
a
4or @i X )K i Z mK i X i W 1A
9r X 9r W >atSiTSiTK
return@9rAK
b
e$se
print4@<B matriz nao e quadrada<AK
b
.& :ma tabe$a que enumere as dist.ncias entre ,rias cidades 2 uma matriz sim;tricaF os termos
sim2tricos em re$ao diagonal principal so iguaisG ou seHa >atSiTSHT X >atSHTSiT. Ob,iamenteG a digitao
de uma matriz com esta propriedade pode ser simp$i4icadaG de,endoIse digitar apenas os termos que esto
acima da diagona$ principa$.
,oid Brmazena>atriz-imetrica@4$oat >atS1)TS1)TG int mA
a
int iG HK
print4@<?igiteG por $in6aG os e$ementos da matrizG a partir da diagona$<AK
4or @i X )K i Z mK i X i W 1A
4or @H X iK H Z mK H X H W 1A
a
scan4@<g4<G h>atSiTSHTAK
>atSHTSiT X >atSiTSHTK
b
b
Obser,e que a inicia$izao de 3 no segundo comando for 4oi com o ,a$or de cada i do primeiro. B
razo disto 2 que s! sero digitados os termos acima da diagona$ principa$G termos em que H i.
/& Cos e(emp$os anterioresG sempre <percorremos a matriz pe$os e$ementos de suas $in6as<. O pr!(imo
e(emp$o mostra um caso em que 2 necessrio percorrer as co$unas. 9rataIse de uma questo muito comum
da tota$izao das co$unas de uma tabe$a.
,oid 9ota$iza/o$unas@4$oat >atS1)TS1)TG int mG int nA
a
int iG HK
4or @H X )K H Z nK H X H W 1A
a
>atSmTSHT X )K
4or @i X )K i Z mK i X i W 1A
>atSmTSHT X >atSmTSHT W >atSiTSHTK
b
b
1&4 Uma apli!ao esportiva
Cesta seoG apresentaremos um programa para administrar o p$acar de um set de um Hogo de ,;$ei de
praia. ?e acordo com as regras em ,igora,am nas O$imp+adas de Pequim @2))*AG para uma equipe ,encer um
set de uma partida e$a de,eria obter um m+nimo de 21 pontos para os sets LnormaisM ou de 1 pontos para um
set de desempateG desde que a di4erena entre sua pontuao e a do ad,ersrio 4osse superior ou igua$ a dois.
kinc$ude Zstdio.6Y
kinc$ude Zconio.6Y
kinc$ude Zmat6.6Y
,oid >ostraP$acar@c6ar f9ime1G c6ar f9ime2G int Pontos1G int Pontos2A
a
print4@<g2)s g2d ( g2d gI2)sln<G 9ime1G Pontos1G Pontos2G 9ime2AK
b
,oid 0eri4ica>udanca@int Pontos1G int Pontos2G int mudA
a
i4 @ @Pontos1WPontos2Agmud XX )A
a
puts@<BtencaoP mudanca de quadraP ?igite uma tec$a para continuar< AK
getc6@AK
b
b
,oid 3imde-et@c6ar f9ime1G c6arf9ime2G int Pontos1G int Pontos2A
a
puts@<3I> ?' -'9P<AK
i4@Pontos1YPontos2A
print4@<gs<G9ime1AK
e$se
print4@<gs< G9ime2AK
puts@< gan6ou o setP<AK
puts@<P$acar 4ina$F <AK
>ostraP$acar@9ime1G9ime2GPontos1GPontos2AK
b
,oid main@A
a
c6ar fComeS2TK
int 'quipe1S2))TG 'quipe2S2))TK
int -etG >udancaG -aqueG PontoG ?i4K
c$rscr@AK
puts@<?igite os nomes dos paisesF<AK
gets@ComeS)TAK
4$us6a$$@AK
gets@ComeS1TAK
puts@<?igite a quantidade de pontos do set @1N21AF<AK
scan4@<gd<Gh-etAK
>udanca X -etN3K
'quipe1S)T X )K
'quipe2S)T X )K
-aque X )K
c$rscr@AK
do
a
Nf '(ibe o p$acar atua$ fN
puts@<P$acar atua$F<AK
>ostraP$acar@ComeS)TG ComeS1TG 'quipe1S-aqueTG 'quipe2S-aqueTAK
i4 @-aque PX )A
0eri4ica>udanca@'quipe1S-aqueTG 'quipe2S-aqueTG >udancaAK
-aqueWWK
puts@<?igite a equipe que marcou ponto @1N2AF< AK
scan4@<gd<GhPontoAK
i4 @PontoXX1A
a
'quipe1S-aqueT X 'quipe1S-aqueI1TW1K
'quipe2S-aqueT X 'quipe2S-aqueI1TK
b
e$se
a
'quipe1S-aqueT X 'quipe1S-aqueI1TK
'quipe2S-aqueT X 'quipe2S-aqueI1TW1K
b
?i4 X abs@'quipe1S-aqueT I 'quipe2S-aqueTAK
c$rscr@AK
b
56i$e@@@'quipe1S-aqueTZ-etA hh @'quipe2S-aqueT Z -etAA ii @?i4 Z 2A AK
3imde-et@ComeS)TGComeS1TG'quipe1S-aqueTG'quipe2S-aqueTAK
getc6@AK
b
1&6 E3er!5!ios propostos
9& 'scre,a uma 4uno recursi,a que retorne o maior e$emento de um ,etor.
$& 'scre,a uma 4uno que e(iba as componentes de um ,etor na ordem in,ersa daque$a em que 4oram
armazenadas.
*& :m ,etor 2 palndromo se e$e no se a$tera quando as posi1es das componentes so in,ertidas. Por
e(emp$oG o ,etor , X a1G 3G G 2G 2G G 3G 1b 2 pa$+ndromo. 'scre,a uma 4uno que ,eri4ique se um ,etor 2
pa$+ndromo.
-& 'scre,a uma 4uno que receba um ,etor e o decompon6a em dois outros ,etoresG um contendo as
componentes de ordem +mpar e o outro contendo as componentes de ordem par. Por e(emp$oG se o ,etor
dado 4or , X a3G G "G *G 1G 4G 2G 3G &bG o ,etor de,e gerar os ,etores u X a3G "G 1G 2G &b e 5 X aG *G 4G 3b.
.& 'scre,a uma 4uno que decompon6a um ,etor de inteiros em dois outros ,etoresG um contendo as
componentes de ,a$or +mpar e o outro contendo as componentes de ,a$or par. Por e(emp$oG se o ,etor dado
4or , X a3G G "G *G 1G 4G 2G 3G &b a 4uno de,e gerar os ,etores u X a3G G 1G 3G &b e 5 X a"G *G 4G 2b.
/& :m vetor do #
n
2 uma nIup$a de nRmeros reais , X a(
1
G (
2
G ...G (
n
bG sendo cada (
i
c6amado de
componente. B norma de um ,etor , X a(
1
G (
2
G ...G (
n
b 2 de4inida por
' ' '
n 1
2
2
2 2
+ + + ...
. 'scre,a uma
4uno que receba um ,etor do #
n
G n dadoG e 4ornea sua norma.
1& O produto escalar de dois ,etores do #
n
2 a soma dos produtos das componentes correspondentes.
Isto eG se u X a(
1
G (
2
G ...G (
n
b e , X a`
1
G `
2
G ...G `
n
bG o produto escalar 2 (
1
.`
1
W (
2
.`
2
... W (
n
.`
n
. 'scre,a uma
4uno que receba dois ,etores do #
n
G n dadoG e 4ornea o produto esca$ar de$es.
2& B amplitude de uma re$ao de nRmeros reais 2 a di4erena entre o maior e o menor ,a$ores da
re$ao. Por e(emp$oG a amplitude da re$ao G &G 1G 2G 23 21G 3G " 2
23 I 2 X 21. 'scre,a uma 4uno que receba uma re$ao de nRmeros e 4ornea sua amplitude.
4& O desvio padr!o de uma re$ao de nRmeros reais 2 a raiz quadrada da m2dia aritm2tica dos
quadrados dos des,ios @,er e(emp$o 2G seo ".4A. 'scre,a uma 4uno que receba uma re$ao de nRmeros
reais e 4ornea o seu desvio padr!o.
6& 'scre,a uma 4uno que 4ornea as componentes distintas de um ,etor dado. Por e(emp$oG se o
,etor dado 4or , X a3G 2G 1G 3G 4G 1G G G 2b a 4uno de,e 4ornecer , X a3G 2G 1G 4G b.
$9& Co cap+tu$o 2 4oi pedida uma 4uno para e(trair o a$garismo da casa das unidades de um inteiro
dado. Bparentemente esta questo no tem interesse prtico. 0eHamos um prob$ema cuHa so$uo depende
deste prob$ema. B$gumas empresas que rea$izam sorteios de pr8mios entre seus c$ientes o 4azem atra,2s dos
sorteios da $oteria 4edera$G sendo gan6ador o nRmero 4ormado pe$os a$garismos das casas das unidades dos
nRmeros sorteados no cinco pr8mios da re4erida $oteria. Por e(emp$oG se o sorteio da $oteria 4edera$ deu como
resu$tado os nRmeros 234$G ))23.G 11231G )123/ e 234*G o pr8mio da ta$ empresa seria dado ao c$iente
que possu+sse o bi$6ete de nRmero $.1/*. 'scre,a uma 4uno que receba os nRmeros sorteados pe$a $oteria
4edera$ e 4ornea o nRmero que gan6ar o pr8mio de acordo com as regras acima.
$$& 'scre,a uma 4uno que insira um ,a$or dado num ,etor numa posio dada. Por e(emp$oG se o
,etor 4or , X a3G *G G %G 12G 3bG o ,a$or dado 4or 1) e a posio dada 4or 4G a 4uno de,e 4ornecer
, X a3G *G G $9G %G 12G 3b.
$*& 'scre,a uma 4uno que insira um ,a$or dado num ,etor ordenado de modo que o ,etor continue
ordenado. Por e(emp$oG se o ,etor dado 4or , X a2G G &G 1)G 12G 13b e o ,a$or dado 4or "G a 4uno de,e
4ornecer o ,etor , X a2G G 1G &G 1)G 12G 13b.
$-& 'scre,a uma 4uno que de$ete uma componente de ordem dada de um ,etor dado. Por e(emp$oG
se o ,etor dado 4or , X a2G G &G 1)G 12G 13b e a componente a ser de$etada 4or a de ordem 4G programa de,e
4ornecer o ,etor , X a2G G &G 12G 13b.
$.& 'scre,a uma 4uno queG dadas duas re$a1es de nRmerosG cada uma de$as com nRmeros distintosG
4ornea os nRmeros que aparecem nas duas $istas. Por e(emp$oG se as re$a1es 4orem u X a%G 32G 4G 21G "G
"&G 42G b e 5 X a24G 42G 32G 12G 4G 11G "&G ""G &*bG a 4uno de,e 4ornecer o ,etor , X a32G 4G "&G 42b.
$/. 'scre,a uma 4uno queG dado um ,etor ordenadoG 4ornea a maior di4erena entre duas
componentes consecuti,asG 4ornecendo tamb2m as ordens das componentes que geraram esta maior
di4erena. Por e(emp$oG se o ,etor dado 4or , X a3G G %G 1"G 1&G 2)G 2"G 31bG a 4uno de,e 4ornecer como
maior di4erena o ,a$or & @1" I %A e as ordens 4 e 3.
$/P& Imagine que as in4$a1es mensais ocorridas num certo pa+s no per+odo de )1N2))) a 12N2))*
esteHam armazenadas num ,etor. 'scre,a uma 4uno que determine os meses e os respecti,os anos em que
ocorreram a maior in4$ao do per+odo.
$1& :ma a,a$iao esco$ar consiste de ) quest1es obHeti,asG cada uma de$as com op1esG , X a1G 2G
3G 4 e bG sendo apenas uma de$as ,erdadeira. 'scre,a uma 4uno que receba a sequ8ncia de respostas
corretasG o gabaritoG e corriHa um cartoIresposta dado.
$2& 'scre,a uma 4uno que 4ornea o ,a$or num2rico de um po$in;mio P@(A dadoG para um ,a$or de (
dado. Por e(emp$oG se o po$in;mio dado 4or P@(A X (
3
W 2( I 1 e o ,a$or de ( dado 4or 2G a 4uno de,e
4ornecer P@2A X 2
3
W 2(2 I 1 X 11.
$4& O@sA ,a$or@esA de maior 4requ8ncia de uma re$ao de ,a$ores num2ricos 2@soA c6amado@sA moda
da re$ao. 'scre,a uma 4uno que receba uma re$ao de notas esco$ares maiores do que zero e menores do
que ou iguais a 1)G com uma casa decima$G e 4ornea a@sA moda@sA desta re$ao. Por e(emp$oG se a re$ao de
notas 4or , X a*G)K 3GG 4GK *G)K "G)K 4GK "G)K 3GK 2GK "G)K %G)b a 4uno de,e 4ornecer o ,a$or "G)
@4requ8ncia 3A.
$6& 'scre,a uma 4uno que receba um nRmero inteiro n e 4ornea o nRmero 4ormado pe$os a$garismos
de n escritos na ordem in,ersa. Por e(emp$oG se o nRmero dado 4or 3*&"G a 4uno de,e 4ornecer "&*3.
*9& B matemtica pro,a que a con,erso de um nRmero do sistema decima$ para o sistema binrio
pode ser 4eita atra,2s de di,is1es sucessi,as do nRmero e dos quocientes sucessi,amente obtidos por 2G
sendo ento o nRmero binrio dado pe$a sequ8ncia iniciada por 1 e seguida pe$os restos obtidos nas di,is1es
sucessi,asG na ordem in,ersa em que so obtidos. Por e(emp$oG para se con,erter 22 do sistema decima$ para
o sistema binrio temosF 22 g 2 X )K 11 g 2 X 1K g 2 X 1K 2 g 2 X ) eG portantoG 22 X @1)11)A
2
. 'scre,a
uma 4uno que con,erta um nRmero positi,o dado no sistema decima$ de numerao para o sistema binrioG
usando o a$goritmo acima.
*$& O e(erc+cio 1) da seo 4. so$icita,a uma 4uno que determinasse a decomposi#!o em fatores
primosG 4ornecendo os 4atores primiti,os e suas respecti,as multiplicidades. Ca ocasio os 4atores primos e
suas mu$tip$icidades eram apenas e(ibidos no sendo armazenados. >odi4ique a 4uno re4erida para que os
4atores primos e as suas mu$tip$icidades seHam armazenadosG antes de serem e(ibidos.
**& B :ni,ersidade 3edera$ de B$agoas adota o sistema de ,eri4icao de aprendizagem $istado no
e(emp$o da seo 3.4G com o adendo de que ter direito a uma reavalia#!o um a$uno que obti,er uma nota
in4erior a &G) em a$gum bimestre. Ceste casoG a nota obtida na rea,a$iao substitui a menor das notas
bimestrais obtidas. 'scre,a uma 4uno queG recebendo as notas das a,a$ia1es bimestrais eG se 4or o casoG a
nota da rea,a$iao eG se 4or o casoG a nota da pro,a 4ina$G 4ornea a m2dia 4ina$ de um a$uno da :3BL e a
sua condio em re$ao apro,ao.
*-& 'scre,a uma 4uno que 4ornea a transposta de uma matriz dada.
*.& :m dos m2todos para a se estudar as so$u1es de um sistema linear de n equa#$es a n incgnitas
ap$ica opera#$es elementares sobre as linhas da matri. dos coeficientesG sendo a permuta de duas $in6as uma
destas opera1es e$ementares. 'scre,a uma 4uno que permute as posi1es de duas $in6as de uma matriz
dadas.
*/& :ma matriz quadrada 2 dita triangular se os e$ementos situados acima de sua diagona$ principa$
so todos nu$os. 'scre,a uma 4uno que receba uma matriz quadrada e ,eri4ique se e$a 2 triangular.
*1& O e(emp$o 4 deste cap+tu$o apresentou uma 4uno para armazenar uma matriz sim2trica. 'ste
e(erc+cio quer a$go contrrioF escre,a uma 4uno que ,eri4ique se uma matriz dada 2 sim2trica.
*2& 'scre,a uma 4uno que determine o produto de duas matrizes.
*4& 'scre,a uma 4uno que determine as m2dias de cada uma das $in6as de uma matriz. Por e(emp$oG
se a matriz dada 4or
3 & 4 "
4 4
2 " 1

_
,

a 4uno de,e 4ornecer a matriz


3 & 4 " )
4 4 4
2 " 1 3
G
G
G

_
,

.
*6& 'scre,a um programa que determine o menor ,a$or de cada uma das $in6as de uma matriz dadaG
4ornecendo o +ndice da co$una que cont2m este menor ,a$or. Por e(emp$oG se a matriz dada 4or
3 & 4 "
2 4
2 " 1

_
,

G a 4uno de,e 4ornecer uma tabe$a do tipo


Lin6a >enor ,a$or /o$una
1 3 1
2 2 2
3 1 4
:ma 4uno como esta poderia receber os preos de di,ersos produtos praticados por ,rios
supermercados e 4orneceriaG para cada produtoG o menor preo e o supermercado que pratica este me$6or
preo.
-9& Co e(emp$o 4 da seo anterior ,imos como armazenar uma matriz sim2trica. Ca prticaG uma
matriz deste tipo ocorreG por e(emp$oG numa tabe$a de dist.ncias entre cidadesG como a seguinte tabe$aG que
d as dist.ncias a2reasG em :mG entre as capitais dos estados nordestinos @BracaHuG 3orta$ezaG Joo PessoaG
>acei!G Cata$G #eci4eG -a$,adorG -o Lu+sG 9eresinaA.
B 3 JP > C # - -L 9
B ) *12 43* 21) ) 3%* 2"& 121* 12&2
3 *12 ) "2 &3) 444 "4) 1)1* "4) 432
JP 41* "2 ) 2*4 144 11) &* 12)* %*&
> 21) &3) 2%4 ) 423 1%1 4"4 122) 112"
C ) 414 144 423 ) 22 *2 1)"4 *43
# 3%* "4) 11* 1%1 22 ) "4 11%& %3
- 2"& 1)1* &* 4"4 *2 "4 ) 131% 1)))
-L 121* "4) 12)* 122) 1)"4 11%& 131% ) 32)
9 12&2 432 %*& 112" *43 %3 1))) 32) )
Imagine que uma compan6ia de transporte a2reo estabe$ea que uma ,iagem entre duas cidades que
distem mais de 4)) tm de,e ter uma esca$a. 'scre,a um programa que armazene uma tabe$a das dist.ncias
a2reas entre n cidades eG dadas duas cidadesG determineG se 4or o casoG a cidade em que de,e se rea$izar uma
esca$a para que o percurso seHa o menor poss+,e$. Por e(emp$oG nas condi1es estabe$ecidasG a ,iagem entre
>acei! e -o Lu+s de,e ter uma esca$a em 3orta$eza @o percurso >acei!N3orta$ezaN-o Lu+s 2 de 13&) tmK o
percursoG por e(emp$oG >acei!N#eci4eN-o Lu+s 2 de 13** tmA.
-$& @Prob$ema no tri,ia$A :ti$izando uma 4uno recursi,aG escre,a um programa que gere as
combina1es dos nRmeros 1G 2G ...G n com ta(a :G n e : dados. Por e(emp$oG se n X e 7 X 3G o programa de,e
gerar as combina1es
1G 2G 3
1G 2G 4
1G 2G
1G 3G 4
1G 3G
1G 4G
2G 3G 4
2G 3G
3G 4G
')servao
Propostas de solu:es dos e3er!5!ios propostos podem ser soli!itadas atrav8s de mensagem
eletr;ni!a para jaime<!!en&ufal&)r !om assunto 0E"P'"=A" LI0' C, ane3ando o formul#rio
a)ai3o devidamente preen!>ido&
?ome Categoria
$
Instituio
*
Curso
*
Cidade@Estado
$
CategoriaA do!ente, estudante, autodidata
*
"e do!ente ou estudante
2 Pes+uisa e ordenao
2&$ Introduo
Ceste cap+tu$oG discutiremos dois prob$emas c$ssicos de computao. O primeiro de$esG pesquisaG
busca ou consultaG consiste em se ,eri4icar se um dado ,a$or est armazenado num ,etor @ou num campo de
um registro de um arquivoG como ,eremos no cap+tu$o %A.
-o ,rios os e(emp$os de pesquisas em computao. :ma busca por pginas da internet que
conten6am um determinado assuntoK uma busca no #egistro Caciona$ de 0e+cu$os Butomotores
@#'CB0B>A na tentati,a de se encontrar o nome do proprietrio do ,e+cu$o de uma p$aca dadaK uma busca
nos registros da #eceita 3edera$ a respeito de um /P3 dado.
O segundo prob$ema 2 con6ecido como ordena#!o ou classifica#!o @introduzido super4icia$mente no
cap+tu$o 3A consiste em se co$ocar numa ordem preestabe$ecida uma re$ao de ,a$ores. Co cap+tu$o re4eridoG
mostramos como ordenar uma re$ao contendo tr8s ,a$ores. Ceste cap+tu$oG apresentaremos a$goritmos para
ordenar uma $ista com qua$quer nRmero de ,a$ores. B ordenao de uma re$ao 2 rea$izada para que a
$eitura dos resu$tados seHa 4aci$itada ou para queG como ,eremos abai(oG pesquisas seHam rea$izadas com mais
e4ici8ncia. :m e(emp$o prtico da necessidade da ordenao ocorre na con4eco da $ista dos apro,ados
num concurso ,estibu$ar. B$gumas uni,ersidades di,u$gam esta $ista com os nomes dos apro,ados em ordem
a$4ab2tica e outras em ordem de c$assi4icao. 9anto num caso como no outro 6 necessidade de ordenao.
2&* Pes+uisa se+uen!ial
O m2todo de busca de mais 4ci$ compreenso 2 o que temos uti$izado at2 agora e 2 c6amado
pesquisa sequencial. 'ste m2todo consiste em se percorrerG a partir da componente zeroG todo o ,etor
comparandoIse o ,a$or de cada componente com o ,a$or pesquisado. Catura$menteG a pesquisa se encerra
quando o ,a$or pesquisado 2 encontrado ou quando se atinge o 4ina$ do ,etorG signi4icandoG neste casoG que a
pesquisa no 4oi bem sucedida.
B 4uno abai(o pesquisaG numa re$ao de inteiros armazenada em vG um inteiro passado para o
par.metro '. Obser,e que o par.metro t receber a quantidade de e$ementos da re$ao e que a 4uno
retornar a posio do ,a$or procurado na re$aoG se a pesquisa 4or bem sucedidaG e I1 se o ,a$or procurado
no 4or encontrado.
int Pesq-eq@int f,G int tG int (A
a
int iK
i X )K
56i$e @@,SiT PX (A hh @i Z tAA
i X i W 1K
i4 @i XX tA
return I1K
e$se
return i W 1K
b
2&- Pes+uisa )in#ria
U muito 4ci$ perceber que o m2todo da pesquisa binria 2 bastante ine4icienteF imagine que este
m2todo 4osse uti$izado para se pesquisar a pa$a,ra .umbaia num dicionrio da $+ngua portuguesa @a
prop!sitoG .umbaia signi4ica cortesia e(ageradaK cumprimento ruidoso e ser,i$A.
]uando a re$ao est ordenadaG e(iste um m2todo de buscaG c6amado pesquisa binriaG bem mais
e4iciente do que a pesquisa sequencia$F comparaIse o e$emento pesquisado com a componente <centra$< da
re$aoK se 4orem iguaisG a pesquisa 2 encerrada com sucessoK se o e$emento pesquisado 4or menor que a
componente centra$ repeteIse a pesquisa em re$ao <primeira metade< da re$aoK se o e$emento
pesquisado 4or maior repeteIse a pesquisa em re$ao <segunda metade< da re$ao. Por e(emp$oG uma
pesquisa do nRmero & na re$ao a1G 3G 4G G "G *G 1)G 11G 12G 1G 1*G 1%G 2)G 21G 22G 2G 2"b comearia
comparandoIse & com 12K como & Z 12G pesquisaIse & na re$ao a1G 3G 4G G "G *G 1)G 11bK para isto comparaI
se & com eG como & Y G pesquisaIse este ,a$or na re$ao a"G *G 1)G 11bK pesquisaIse na re$ao a"G *bK
pesquisaIse em a"b e conc$uiIse que & no est re$ao.
int PesqDinaria@int f,G int tG int (A
a
int iG /entra$K
i X )K
/entra$ X tN2K
56i$e @@( PX ,S/entra$TA hh @i ZX tAA
a
i4 @( Z ,S/entra$TA
t X /entra$ I 1K
e$se
i X /entra$ W 1K
/entra$ X @i W tAN2K
b
i4 @i Y tA
return @I1AK
e$se
return@/entra$AK
b
B pesquisa binria tamb2m 2 importante no desen,o$,imento da $!gica de programao pe$o 4ato de
que 2 uma 4uno que pode ser imp$ementada recursi,amenteG sem que a imp$ementao recursi,a seHa
menos e4iciente do que a no recursi,a. Para perceber a recursi,idade basta ,er que a mesma pesquisa se
repeteG sendo queG em cada repetioG o ,etor pesquisado tem a$terado a posio da sua R$tima componente
ou da sua primeira componente.
int PesqDin#ec@int f,G int iG int tG int (A
a
int /entra$K
/entra$ X @i W tAN2K
i4 @,S/entra$T XX (A
return @/entra$ W 1AK
e$se
i4 @t Z iA
return @I1AK
e$se
i4 @( Z ,S/entra$TA
PesqDin#ec@,G iG /entra$ I 1G (AK
e$se
PesqDin#ec@,G /entra$ W 1G tG (AK
b
2&. 'rdenao
' SelecSort
O a$goritmo SelectSort consiste em se se$ecionarG sucessi,amenteG o maior e$ementoG o segundo maior
e$ementoG o terceiro maior e$ementoG etc.G eG ap!s cada se$eoG armazenar o ,a$or se$ecionado num ,etor
au(i$iar na posio que mant2m o ta$ ,etor au(i$iar ordenado. Por e(emp$oG se se pretende a ordenao em
ordem crescenteG o <primeiro maior ,a$or< 2 armazenado na R$tima posio do ,etor au(i$iarK o <segundo
maior ,a$or< 2 armazenado na penR$tima posio do ,etor au(i$iar e assim sucessi,amente. Para que se
obten6a o <segundo maior ,a$or< do ,etorG e(c$u+mos o <primeiro maior ,a$or< atribuindo a esta componente
um ,a$or sabidamente menor do que todos os ,a$ores armazenados no ,etor. Por e(emp$oG se os ,a$ores do
,etor so positi,os podeIse atribuir I1 a cada componente H se$ecionada e H armazenada no ,etor au(i$iar.
Para e(emp$i4icar o m2todoG ,amos ordenar o ,etor , X aG 2G &G 1G *b. Dasta percorrer o ,etor ,ezes
se$ecionando sucessi,amente *G &G G 2 e 1 e rea$izando as seguintes atribui1esF
1. Bu( X a G G G G *b
, X aG 2G &G 1G I1b
2. Bu( X a G G G &G *b
, X aG 2G I1G 1G I1b
3. Bu( X a G G G &G *b
, X aI1G 2G I1G 1G I1b
4. Bu( X a G 2G G &G *b
, X aI1G I1G I1G 1G I1b
. Bu( X a1G 2G G &G *b
, X aI1G I1G I1G I1G I1bG
Para 4ina$izarG basta armazenar nas componentes de v as componentes de Au'.
,oid >aior'$emento@int f,G int tG int hmG int hpA
a
int iG PosK
m X ,S)TK
Pos X )K
4or @i X 1K i Z tK i X i W 1A
i4 @,SiT Y mA
a
mX ,SiTK
Pos X iK
b
p X PosK
b
,oid -e$ect-ort@int f,G int tA
a
int iG PosG Bu(S))TK
4or@i X )K i Z tK i X i W 1A
a
>aior'$emento@,G tG Bu(St I 1 I iTG PosAK
,SPosT X I1K
b
4or @i X )K i Z tK i X i W 1A
,SiT X Bu(SiTK
b
Obser,e queG como o par.metro m 2 passado por re4er8nciaG a 4uno ?aior*lemento/0 H armazena no
,etor Au' os maiores e$ementos de vG nas suas posi1es de4initi,as.
= uma outra ,erso do SelectSort que prescinde de um ,etor au(i$iar. -e o ,etor cont2m :
componentesG esta ,erso consiste em se comparar a maior dentre as 7 I 1 primeiras componentes com a
componente de ordem :G permutandoIse suas posi1es se aque$a maior componente 4or menor do que esta
R$tima. 'sta operao co$oca o maior e$emento na R$tima posio do ,etorG como deseHado. 'ste racioc+nio 2
repetido no ,etor das 7 I 1 primeiras componentes e assim sucessi,amente.
,oid -e$ect-ort0ersao2@int f,G int tA
a
int PosG 7G mK
7 X t I 1K
56i$e @7 Y )A
a
>aior'$emento@,G 7G mG PosAK
i4 @,S7T Z ,SPosTA
a
,SPosT X ,S7TK
,S7T X mK
b
7IIK
b
b
' 1ubbleSort
O a$goritmo 6ubbleSort consiste em se percorrer o ,etor a ser ordenado ,rias ,ezesG comparandoIse
cada e$emento com o seguinteG permutando suas posi1es se e$es no esti,erem na ordem pretendida. BssimG
cada ,ez que o ,etor 2 percorrido o maior @ou o menorA e$emento ainda no ordenado 2 co$ocado na sua
posio de ordenao de4initi,a. Catura$menteG o ,etor ser percorrido at2 que no 6aHa mais trocas a se
4azerG quando ento e$e estar ordenado. Por e(emp$oG se o ,etor a ser ordenado em ordem crescente 4or
, X aG 1G %G 3G &G 2bG ter+amos as seguintes con4igura1es para vG de acordo com a ordem de percursoF
Percurso ,
) aG 1G %G 3G &G 2b
1 a1G G %G 3G &G 2b
a1G G 3G %G &G 2b
a1G G 3G &G %G 2b
a1G G 3G &G 2G %b
2 a1G 3G G &G 2G %b
a1G 3G G 2G &G %b
3 a1G 3G 2G G &G %b
4 a1G 2G 3G G &G %b
B seguinte 4uno imp$ementa o a$goritmo descrito acima.
,oid Dubb$e-ort@int f,G int tA
a
int HG sG Bu(K
do
a
s X 1K
t X t I 1K
4or @H X )K H Z tK H X H W 1A
i4 @,SHT Y ,SH W 1TA
a
Bu( X ,SHTK
,SHT X ,SH W 1TK
,SH W 1T X Bu(K
s X )K
b
b
56i$e @s XX )AK
b
Obser,e que a ,ari,e$ s ,eri4ica se 6ou,e a$guma troca para que outro percurso seHa rea$izado.
Obser,e tamb2m que o comando t X t [ 1 se Husti4ica pe$o 4ato de que no percurso de ordem iG i [ 1
e$ementos H esto em suas posi1es de4initi,as.
2&/ E3er!5!ios propostos
$& B$gumas pessoas ac6am que so azaradas quando procuram uma 4ic6a numa pi$6aG sempre tendo
receio que a 4ic6a procurada seHa uma das R$timas da pi$6a. :ma pessoa que acredite ser assim azarada pode
pesquisar a ta$ 4ic6a pesquisandoG sucessi,amenteG a parte superior e a parte in4erior da pi$6a. BssimG ,eri4ica
a primeira 4ic6aG em seguidaG a R$timaG em seguidaG a segunda 4ic6aG em seguidaG a penR$tima e assim
sucessi,amente. 'scre,a uma 4uno que imp$emente este m2todo de pesquisa.
*& B a$goritmo InsertSort para ordenao de um ,etor 5et consiste em se tomar um ,etor au(i$iar Au'G
contendo uma Rnica componente 0etS)T. 'm seguidaG inseremIse as demais componentes de 0etG uma a umaG
em Au' de modo que Au' se manten6a ordenado. 'scre,a uma 4uno que imp$emente o InsertSort.
-& 'scre,a uma ,erso recursi,a do SelectSort.
')servao
Propostas de solu:es dos e3er!5!ios propostos podem ser soli!itadas atrav8s de mensagem
eletr;ni!a para jaime<!!en&ufal&)r !om assunto 0E"P'"=A" LI0' C, ane3ando o formul#rio
a)ai3o devidamente preen!>ido&
?ome Categoria
$
Instituio
*
Curso
*
Cidade@Estado
$
CategoriaA do!ente, estudante, autodidata
*
"e do!ente ou estudante
4& Cadeias de !ara!teres HstringsI
4&$ Introduo
/omo H sabemos uma dec$arao do tipo
c6ar /adS1)TK
de4ine um conHunto de dez posi1es de mem!riaG cada uma de$as de um b`teG capazes de armazenar ,ari,eis
do tipo char. /omo dissemos de passagem no cap+tu$o anteriorG um ,etor cuHas componentes so do tipo
char constitui uma cadeia de caracteres ouG emprestado do ing$8sG uma string.
B$2m da quantidade de b`tesG o que di4erencia a dec$arao acima da dec$arao
int ,S1)TK
2 queG enquanto o ,etor v no pode ser re4erenciado g$oba$mente com um comando do tipo scanf/DEvD, v0 ou
printf/DEvD, v0 os compi$adores / cont8m recursos para re4er8ncia a uma string como se e$a 4osse uma
,ari,e$ simp$es.
?esta 4ormaG com a dec$arao acimaG podemos ter um programa como o seguinteF
kinc$ude Zstdio.6Y
main@A
a
c6ar /adS1)TK
print4@<?igite uma pa$a,ra<AK
scan4@<gs<G /adAK
print4@<B pa$a,ra digitada 4oiF gs <G /adAK
b
0a$e $embrar queG de acordo com o cap+tu$o 2G <gs< tanto 2 o cdigo de convers!o da 4uno scanf/0
para armazenamento de uma cadeia de caracteres como 2 o cdigo de formata#!o da 4uno printf/0 para
e(ibio de uma string. 0a$e tamb2m obser,ar a no co$ocao do operador de endereo h em scanf/DEsD,
Cad0. Para compreender este 4ato basta $embrar que um ,etor 2 um ponteiro. Binda ,a$e obser,ar que a
tentati,a de se armazenar em Cad uma cadeia com mais de 1) caracteres no 2 recusada pe$o sistemaG mas
podem ocorrer armazenamentos indeseHados. Para que o taman6o da cadeia no 4ique $imitadoG de,eIse
dec$arar a cadeia como um ponteiroF c6ar f/adK.
9amb2m 2 poss+,e$ se 4azer atribui1es e(p$+citas a uma string. Por e(emp$oG poder+amos <so4isticar<
o programa acimaG escre,endoIoF
kinc$ude Zstdio.6Y
main@A
a
c6ar /adS4)TG -trS4)T X <?igite uma pa$a,ra<K
print4@<gs<G -trAK
scan4@<gs<G /adAK
print4@<B pa$a,ra digitada 4oiF gsln<G /adAK
b
B re4er8ncia e(p$+cita a uma string 2 poss+,e$ pe$o 4ato de que o sistema co$oca no 4ina$ da cadeia o
caractere nuloG indicado por Ol)OG tanto numa atribuio @como -tr X <?igite uma pa$a,ra<KA como numa
entrada atra,2s da 4uno scanf/0. U este caractere nu$o que indica ao sistema o 4ina$ da string para que e$e
possa processI$a de acordo com o pretendidoG como e(ibiI$a atra,2s da 4uno printf/0G por e(emp$o.
U necessrio $embrar que a aposio automtica do caractere nu$o no 4ina$ da string 4ora se de4inir n
numa dec$arao do tipo
c6ar /adSnTK
uma unidade maior do que o nRmero de caracteres da cadeia que se pretende armazenar em Cad.
Ceste 4ormato de dec$araoG podeIse inicia$izar uma string quando da sua dec$araoG co$ocando o
,a$or inicia$ pretendido entre c6a,esG que no so necessrias no 9urbo /WW 3.).
kinc$ude Zstdio.6Y
main@A
a
c6ar /adS1))TG -trS2)T X a<?igite uma pa$a,ra<bK
print4@<gs ln<G -trAK
scan4@<gs<G /adAK
print4@<B pa$a,ra digitada 4oiF gs ln<G /adAK
b
Bgora o sistema ,eri4ica o nRmero de caracteres da cadeia que se pretende armazenarG recusandoG em
n+,e$ de compi$aoG se este nRmero 4or maior do que n.
O armazenamento de uma cadeia de caracteres atra,2s da 4uno scanf/0 tem uma $imitao em 4uno
de que esta 4uno considera tamb2m @a$2m da digitao de ZenterYA o espao em branco como 4ina$izador
da string. Isto imp$ica que uma cadeia de caracteres que possua um espao em branco @o nome de uma
pessoaG por e(emp$oA no possa ser comp$etamente armazenada.
Para estes casosG de,eIse uti$izar a 4uno gets/0 cuHo prot!tipo est no arqui,o stdio2h e armazena no
argumento com o qua$ 4oi ati,ado uma cadeia de caracteres digitada no tec$ado. Bssim para se armazenar
uma 4rase ou o nome comp$eto de uma pessoaG o programa acima de,eria ser modi4icado para o seguinte
programaF
kinc$ude Zstdio.6Y
main@A
a
c6ar /adS4)TK
print4@<?igite a 4rase<AK
gets@/adAK
print4@<B 4rase digitada 4oiF gs ln<G /adAK
b
#epetindo o que H 4oi ditoG 2 necessrio um certo cuidado com e(ecu1es sucessi,as das 4un1es
scanf/0 @para stringsA e gets/0. O que acontece 2 o seguinteF quando os dados esto sendo digitadosG e$es so
armazenados numa rea c6amada buffer e as e(ecu1es das 4un1es aqui re4eridas 4azem o sistema
armazenar os dados do buffer na ,ari,e$ pretendida. BssimG se no esti,er ,azioG o conteRdo do buffer ser
armazenado por uma pr!(ima ati,ao de uma destas 4un1es. U prudenteG entoG <es,aziar< o buffer antes de
uma c6amada de uma segunda c6amada de scanf/0 ou de gets/0G isto podendo ser 4eitos atra,2s da instruo
fflhush/stdin0 @no pr!(imo cap+tu$oG 4aremos comentrios sobre stdinA.
4&* Fun:es de )i)liote!a para manipulao de !adeias de
!ara!teres
Bo contrrio de outras $inguagensG / no possui operador que atue com operandos do tipo cadeia de
caracteres. ]ua$quer manipu$ao de strings 2 4eita atra,2s de 4un1es da bib$ioteca padro de /. Cesta
seoG apresentaremos a$gumas destas 4un1esG cuHos prot!tipos esto no arqui,o string2h.
aI ?eterminando o comprimento de uma string.
B 4uno de prot!tipo
int str$en@c6ar fsA
retorna o nRmero de caracteres da string armazenada em sG sem considerar o caractere nu$o.
Por e(emp$oG a sequ8ncia de instru1es
c6ar f/adK
int /ompK
/ad X <:ni,ersidade 3edera$ de B$agoas<K
/omp X str$en@/adAK
armazenar na ,ari,e$ Comp o ,a$or 31.
0a$e obser,ar que o par.metro de strlen/0 pode ser uma constanteF podemos ter um comando
printf/DEdD, strlen/D6rasilD00K
)I /omparando duas strings.
B comparao entre duas strings em re$ao ordem a$4ab2tica 2 4eita atra,2s da 4uno de prot!tipo
int strcmp@c6ar fs
1
G c6ar fs
2
AK
que retorna a di4erena entre os c!digos B-/II dos primeiros caracteres di4erentes do dois par.metrosG que
podem ser constantes. Por e(emp$oG a c6amada str/DCasaD, DCasoD0F retorna 14G que 2 a di4erena entre os
c!digos B-/II de OoO @111A e o de OaO @%&A. Catura$menteG se as cadeias so iguaisG a 4uno retorna ) @zeroA.
!I /on,ertendo maiuscu$as para minRscu$as e ,iceI,ersa.
B con,erso das $etras de uma string de minRscu$as para maiuscu$as 2 4eita atra,2s da 4uno de
prot!tipo
c6ar fstrupr@c6ar fsAK
enquanto que a con,erso in,ersa 2 4eita atra,2s da 4uno
c6ar fstr$5r@c6ar fsAK
podendo o par.metro ser uma constante.
dI /oncatenando uma string a outra.
B concatenao de uma cadeia de caracteres a uma outra cadeia 2 4eita atra,2s da 4uno
c6ar fstrcat@c6ar fs
1
G c6ar fs
s
AK
que retorna a cadeia s
1
acrescida dos caracteres de s
2
G que pode ser uma constante. Por e(emp$oG a sequ8ncia
de instru1es
c6ar f-trK
-tr X </omputa<K
strcat@-trG <dor<AK
armazena em Str a cadeia </omputador<.
eI 3azendo c!pia de uma string.
-e s
1
e s
2
4oram de4inidas como strings no se pode 4azer uma atribuio do tipo
s
M
T s
Q
. -e pretendemos armazenar o conteRdo de s
Q
em s
M
de,emos uti$izar a 4uno
c6ar fstrcp`@c6ar fs1G c6ar fs2AK
que 4az uma c!pia do conteRdo de s
Q
em s
M
G podendo s
Q
ser uma constante.
fI /opiando parte de uma string.
PodeIse copiar os n primeiros caracteres de uma string atra,2s da 4uno
c6ar fstrncp`@c6ar fs1G c6ar fs2G int nAK
que armazena em s
M
os n primeiros caracteres de s
Q
G podendo este segundo par.metro ser uma constante. U
necessrio obser,ar que o caractere nu$o no 2 armazenadoG de,endo isto ser 4eito pe$o programa.
gI 0eri4icando se uma string 2 subcadeia de outra string.
Para se ,eri4icar se uma dada cadeia de caracteres est contida em outra cadeiaG uti$izaIse a
4uno
c6ar fstrstr@c6ar fs1G c6ar fs2AK
que retorna um ponteiro para a primeira posio a partir da qua$ s
Q
ocorre em s
M
G retornando %X++ se s
Q
no
est contida em s
M
. Por e(emp$oG a e(ecuo do programa
kinc$ude Zstdio.6Y
kinc$ude Zstring.6Y
main@,oidA
a
c6ar f-tr1 X <Logica de Programacao<G f-tr2 X <grama<G fpK
p X strstr@-tr1G -tr2AK
i4 @p PX C:LLA
print4@<B l<u$timal< substring de gs que contem gs eF gs.ln<G -tr1G -tr2G pAK
e$se
print4@<gs nao esta contida em gs<G -tr2G -tr1AK
b
e(ibe na te$a a a4irmaoF
B <u$tima< substring de Logica de Programacao que contem grama e gramacao.
>I /on,ertendo uma string em nRmeros
/omo ,eremos em e(emp$os a seguirG muitas ,ezes 2 pre4er+,e$ que um dado de entrada seHa um ,etor
de caracteresG mesmo que a 4uno necessite rea$izar opera1es matemticas com e$e. B con,erso de uma
subcadeia de d+gitos para os tipos intG long ou floatG respecti,amenteG 2 4eita atra,2s das 4un1es
int atoi@c6ar fsAK
$ong ato$@c6ar fsAK
doub$e ato4@c6ar fsAK
cuHos prot!tipos esto no arqui,o stdlib2h. 'stas 4un1es retornam o nRmero @no 4ormato respecti,oA
correspondente primeira @da esquerda para direitaA subcadeia de s que pode ser con,ertida G retornando )
@zeroA se o primeiro caractere de s no 4or um d+gito ou um dos caracteres W e [ @se o primeiro caractere 4or
W ou IG para que 6aHa a$guma con,erso o segundo de,e ser um d+gitoA.
4&- E3emplos Parte I
$& B 4uno a seguir e(c$ui uma dada quantidade n de caracteres a partir de uma posio dada p. Para
conseguir e(c$uir os n caracteresG <trazemos< a substring 4ormada pe$os R$timos caracteres que no sero
e(c$u+dos mais o caractere nu$o para a posio p. Catura$menteG se o nRmero de caracteres a serem e(c$u+dos
4or maior do que o dispon+,e$G todos os caracteres a partir de p sero e(c$u+dos. Isto 2 obtido atra,2s da
4uno strncpy/0.
kinc$ude Zstdio.6Y
kinc$ude Zstring.6Y
,oid ?e$eta/aracteres@c6ar fsG int nG int pA
a
int iG /ompK
c6ar fBu(K
/omp X str$en@sAK
i4 @p W n ZX /ompA
a
i X pK
56i$e @i ZX /omp I nA
a
sSiT X sSi W nTK
i X i W 1K
b
b
e$se
sSpT X Ol)OK
b
*& B pr!(ima 4uno insere uma cadeia s
M
numa cadeia s
Q
a partir de uma posio p dada.
,oid Insere@c6ar fs1G c6ar fs2G int pA
a
int iG c1G c2K
c6ar aS2)TK
c1 X str$en@s1AK
c2 X str$en@s2AK
4or @i X )K i Z c1 W c2 K iWWA
i4 @i Z pA
aSiT X s1SiTK
e$se
i4 @i Z p W c2A
aSiT X s2Si I pTK
e$se
aSiT X s1Si I c2TK
aSiT X Ol)OK
strcp`@s1G aAK
b
-& B 4uno strstr/0 comentada acima ,eri4ica se uma string s
1
est contida numa string s
2
mas no
retorna a posio a partir da qua$ s
Q
ocorre em s
M
. B 4uno abai(o reso$,e esta questo atra,2s da di4erena
dos comprimentos de s
M
e da cadeia que a c6amada strstr/sM, sQ0 retorna.
int Pos@c6ar fs1G c6ar fs2A
a
c6ar fBu(K
Bu( X strstr@s1G s2AK
i4 @Bu( PX C:LLA
return@str$en@s1A I str$en@Bu(AAK
e$se
return @I1AK
b
.& /om a 4uno strncpy/0 podeIse copiar os n primeiros caracteres de uma string. /onsiderando que
um ponteiro de caracteres armazena o endereo da posio de mem!ria do primeiro caractere da string, que
as posi1es de mem!ria que armazenam as componentes de um ,etor so cont+guas e que cada ,ari,e$ do
tipo char ocupa um byteG se s 2 um ponteiro do tipo char e p 2 um inteiroG s W p ser um ponteiro que
apontar para o caractere de ordem p. BssimG strncpy/sM, sQ 8 p, n0 armazenar em s1 os n caracteres de s2
a partir da posio p.
/& B pr!(ima 4uno con,erte uma data dada @como uma cadeia de caracteresA no 4ormato americano
mmCddCaaaa para o 4ormato brasi$eiro ddCmmCaaaa. O a$goritmo usa a 4uno strncpy/0 @com a obser,ao
do e(emp$o anteriorA para e(trair o diaG o m8s e o ano e a 4uno strcat/0 para concatenar na ordem
pretendida.
,oid /on,erte?ata@c6ar fsA
a
c6ar f?iaG f>esG fBnoK
strncp`@>esG sG 3AK
>esS3T X Ol)OK
strncp`@?iaG s W 3G 3AK
?iaS3T X Ol)OK
strncp`@BnoG s W "G 4AK
BnoS4T X Ol)OK
strcat@?iaG >esAK
strcat@?iaG BnoAK
strcp`@sG ?iaAK
b
1& :m programa que manipu$e datas de,e possuir uma 4uno que ,eri4ique se a data dada era ,$ida.
Isto no ocorreria se o ,a$or do m8s 4osse maior que 12 ou queG por e(emp$oG se o m8s 4osse Hun6o e o dia
4osse 31.
int 0eri4ica?ata@c6ar sS11TA
a
int iG dG mG aG 0eri4icaK
c6ar ?iaS3TG >esS3TG BnoSTK
strncp`@?iaG sG 2AK
?iaS3T X Ol)OK
strncp`@>esG s W 3G 2AK
>esS3T X Ol)OK
strcnp`@BnoG s W "G 4AK
BnoS4T X Ol)OK
d X atoi@?iaAK
m X atoi@>esAK
a X atoi@BnoAK
0eri4ica X 1K
i4 @@m ZX 12A hh @m YX 1A hh @d YX 1A hh @d ZX 31AA
s5itc6@mA
a
case 2F
i4 @@@a g 4 XX )A hh @a g 1)) PX )AA ii @a g 4)) XX )AA
i4 @d Y 2%A
0eri4ica X )K
e$seK
e$se
i4 @d Y 2*A
0eri4ica X )K
brea7K
case 4F case "F case %F case 11F
i4 @d Y 3)A
0eri4ica X )K
brea7K
b
e$se
0eri4ica X )K
return@0eri4icaAK
b
0a$e obser,ar que os comandos 5erifica T O poderiam ser substitu+dos por return/O0. Ceste casoG o
R$timo comando seria return/M0.
2& Os compi$adores / ignoram espaos em branco digitados num programa. :ma maneira de se tornar
isto poss+,e$ 2G antes da compi$aoG e$iminar todos os espaos em branco <sup2r4$uos<G ou seHaG dei(ar duas
pa$a,ras sempre separadas por um Rnico espao em branco. B 4uno abai(oG uti$izando a 4uno
4eletaCaracteres/0G rea$iza ta$ ao.
,oid '(c$uiDrancos-uper4$uos@c6ar fsA
a
int iG CumDrancosK
i X )K
56i$e @sSiT PX Ol)OA
a
CumDrancos X )K
56i$e @sSiT XX O OA
a
CumDrancos X CumDrancos W 1K
i X i W 1K
b
i4 @CumDrancos Y 1A
a
i X i I CumDrancosK
?e$eta/aracteres@sG CumDrancos I 1G iAK
b
i X i W 1K
b
b
4& B questo a seguir 2 bem interessante. 9rataIse de um programa que determine o dgito verificador
de um nRmero de uma conta correnteG de um nRmero de matr+cu$a de um estudante de uma esco$aG etc. O
d+gito ,eri4icador ser,e para a pre,eno de poss+,eis erros de digitao. Por e(emp$oG se a matr+cu$a 3)24I
& 4osse digitada erroneamente como 3%24I&G o erro seria detectadoG pois o d+gito ,eri4icador da conta 3%24
seria " e no &. '(istem ,rios m2todos para a determinao do d+gito ,eri4icador. :m de$es 2 dado pe$o
seguinte a$goritmoF
1. >u$tip$icaIse os nRmeros correspondentes aos d+gitos da contaG da direita para esquerdaG
por 2G por 3G etc..
2. -omaIse os produtos obtidos no item 1.
3. ?eterminaIse o resto da di,iso da soma obtida no item 2 por 11.
4. -ubtraiIse de 11 o resto obtido no item 3
. -e o ,a$or obtido no item 4 4or 1) ou 11 o d+gito ,eri4icado 2 igua$ a zeroK senoG o d+gito 2 o ,a$or
obtido no item re4erido.
Por e(emp$oG se o nRmero da conta 4or 3)24G temos
1. (2 X 1)G 4(3 X 12G 2(4 X *G )( X )G 3(" X 1*
2. 1) W 12 W * W ) W 1* X 4*
3. #esto@4*G 11A X 4
4. 11 I 4 X &
. ?+gito ,eri4icador X &.
B 4uno abai(o imp$ementa este a$goritmo. Obser,e que 4oi uti$izado molde para con,erter caracteres
em inteiros e ,iceI,ersa.
int Brmazena?igitos@c6ar fsG int f,A
a
int iG /ompK
/omp X str$en@sAK
4or @i X )K i Z /ompK i X i W 1A
,SiT X @intA @sSiT I O)OAK
return@iAK
b
c6ar /a$cu$a?igito@c6ar fsA
a
c6ar cK
int tG iG HG ?igitoG f,K
t X Brmazena?igitos@sG ,AK
?igito X )K
H X 2K
4or @i X t I 1K i YX )K i X i I 1G H X H W 1A
?igito X ?igito W ,SiTfHK
?igito X ?igito g 11K
?igito X 11 I ?igitoK
i4 @@?igito XX 1)A ii @?igito XX 11AA
?igito X )K
c X @c6arA ?igito W O)OK
return @cAK
b
4&. E3er!5!ios propostos
$& :ma pa$a,ra 2 palndroma se e$a no se a$tera quando $ida da direita para esquerda. Por e(emp$oG
raiar 2 palndroma. 'scre,a um programa que ,eri4ique se uma pa$a,ra dada 2 pa$+ndroma.
*& :m dos recursos disponibi$izados pe$os editores de te(to mais modernos 2 a determinao do
nRmero de pa$a,ras de um te(to. 'scre,a um programa que determine o nRmero de pa$a,ras de um te(to
dado.
-& O e(erc+cio 21 do cap+tu$o " so$icita,a um programa que con,ertesse um nRmero dado no sistema
decima$ para o sistema binrio. Pe$a $imitao do sistema em tratar nRmeros inteirosG uma so$uo que
tratasse a con,erso como sendo do tipo long seria $imitada. 'scre,a um programa para a con,erso citadaG
tratando o ,a$or em binrio como uma cadeia de caracteres.
.& 'scre,a um programa que con,erta um nRmero do sistema binrioG dado como uma cadeia de zeros
e unsG para o sistema decima$ de numerao.
/& #eescre,a a 4uno apresentada no e(emp$o * deste cap+tu$o de ta$ modo que e$e possaG a$2m de
gerar d+gitos ,eri4icadoresG ,eri4icar se uma conta dada @inc$uindo o d+gito ,eri4icadorA 4oi digitada
incorretamenteG incorreo esta detectada pe$o d+gito ,eri4icador.
1& Os editores de te(to possuem um recurso que permite o usurio substituir uma subIcadeia de um
te(to por outra cadeia de caracteres. 'scre,a um programa que rea$ize esta ao numa 4rase dada.
2& Bs compan6ias de transportes a2reos costumam representar os nomes dos passageiros no 4ormato
1ltimo sobrenomeCnome. Por e(emp$oG o passageiro /ar$os ?rumond de Bndrade seria indicado por
BndradeN/ar$os. 'scre,a um programa que receba um nome e o escre,a no 4ormato acima.
4& Bs normas para a e(ibio da bib$iogra4ia de um artigo cient+4icoG de uma monogra4iaG de um $i,ro
te(toG etc.G e(igem que o nome do autor seHa escrito no 4ormato 1ltimo sobrenome, sequ-ncia das primeiras
letras do nome e dos demais sobrenomes, seguidas de ponto final. Por e(emp$oG Bnt;nio /ar$os Jobim seria
re4erido por JobimG B. /.. 'scre,a um programa que receba um nome e o escre,a no 4ormato de bib$iogra4ia.
6. U muito comum que os t+tu$os de documentos como a,isosG dec$ara1esG atestadosG etc.G apaream
em $etras maiuscu$as separadas por um espao em branco. 'scre,a uma 4uno que receba uma pa$a,ra e a
retorne no 4ormato acima.
$9& 'scre,a uma 4uno que gere $ogins para usurios de um sistema de computao baseado na
seguinte regraF o $ogin 2 composto pe$as $etras iniciais do nome do usurio.

')servao
Propostas de solu:es dos e3er!5!ios propostos podem ser soli!itadas atrav8s de mensagem
eletr;ni!a para jaime<!!en&ufal&)r !om assunto 0E"P'"=A" LI0' C, ane3ando o formul#rio
a)ai3o devidamente preen!>ido&
?ome Categoria
$
Instituio
*
Curso
*
Cidade@Estado
$
CategoriaA do!ente, estudante, autodidata
*
"e do!ente ou estudante
6 Estruturas e Ar+uivos
6&$ ' +ue so estruturas
:m ,etor 2 capaz armazenar di,ersos ,a$oresG com a ressa$,a de que todos seHam de um mesmo tipo
de dado. :m programa que gerencie os recursos 6umanos de uma empresa manipu$a dados de tipos
di4erentes re$ati,os a cada um dos 4uncionrios. Por e(emp$oG para cada 4uncionrio de,eIse ter sua
matr+cu$aG seu nomeG seu endereoG o cargo que e$e ocupaG o nRmero de seus dependentesG o seu sa$rioG a
data de admissoG etc. Obser,e queG nomeG matr+cu$aG endereoG data de admisso e cargo que e$e ocupa
podem ser tratados com ,ari,eis do tipo stringG por2mG como e,entua$mente 6a,er necessidade de se
e4etuar opera1es aritm2ticas com e$esG o nRmero de dependentes de,e ser tratado como do tipo int e ,a$or do
sa$rioG do tipo float.
B uti$izao de uma ,ari,e$ simp$es para cada um destes e$ementosG imp$icariaG como so ,rios
4uncionriosG a necessidade de ,rios ,etoresG o que poderia atrapa$6ar a $egibi$idade e a manuteno do
programaG a$em de di4icu$tar a possibi$idade de armazenamento dos dados em discoG con4orme ,eremos
numa seo posterior.
:ma estrutura 2 um conHunto de ,ari,eisG denominadas campos ou membrosG que podem ser de tipos
di4erentes. U comum se associar um identi4icador a uma estruturaG c6amado etiqueta da estruturaG para que se
possa de4inir uma ,ari,e$ deste tipo.
B de4inio de uma estrutura 2 4eita com a seguinte sinta(eF
struct 9'strutura
a
9ipo de dado Identi4icador do campo 1K
9ipo de dado Identi4icador do campo 2K
. . .
9ipo de dado Identi4icador do campo nK
bK
ondeG para cada campoG =ipo de dado pode ser qua$quer tipoG at2 mesmo uma estrutura. -e esta dec$arao
4or 4eita 4ora de qua$quer 4unoG a estrutura =*strutura ser g$oba$ e qua$quer 4uno do programa pode
dec$arar uma ,ari,e$ capaz de armazenar ,a$ores de acordo com os tipos de dados dos camposG isto sendo
4eito a partir de uma dec$arao do tipo
struct 9'strutura Identi4icadorK
Por e(emp$oG para o programa do e(emp$o acima poder+amos de4inir as estruturas
struct 9'ndereco
a
c6ar #uaS4)TK
c6ar CumeroSTK
c6ar DairroS1)TK
c6ar /epS%TK
bK
struct 9'strutura
a
c6ar >atricu$aS11TK
c6ar ComeS4)TK
struct 9'ndereco 'nderecoK
int Cum?ependentesK
4$oat -a$arioK
c6ar /argoS*TK
bK
e ento uma 4uno poderia ter uma ,ari,e$ dec$arada da seguinte 4ormaF
struct 9'strutura #egistroK
Ca ,erdadeG ao se de4inir struct =*strutura est se de4inindo um novo tipo de dado e isto Husti4ica a
de4inio de uma ,ari,e$G no caso VegistroG do tipo de dado struct =*strutura. B $inguagem / o4erece uma
outra 4orma de se de4inir um no,o tipo de dado. 9rataIse da dec$arao typedef que poderia ser uti$izado para
se de4inir a estrutura acima da seguinte 4ormaF
t`pede4 struct
a
c6ar >atricu$aS11TK
c6ar ComeS4)TK
struct 9'ndereco 'nderecoK
int Cum?ependentesK
4$oat -a$arioK
c6ar /argoS*TK
b
9'struturaK
Ceste casoG a dec$arao de uma ,ari,e$ do tipo =*strutura seria 4eita sem a re4er8ncia ao tipo structF
9'strutura #egistroK
B re4er8ncia a um campo particu$ar da estrutura se 4az com a aposio do identi4icador da ,ari,e$
estrutura e o identi4icador do campo separados por um ponto. Co e(emp$o anterior poder+amos ter comandos
do tipo
#egistro.-a$ario X 4)).))K
scan4@<gs<G #egistro.>atricu$aAK
gets@@#egistro.'nderecoA.#uaAK
sendo os par8nteses de @#egistro.'nderecoA.#ua no obrigat!rios.

6&* E3emplos Parte II
$& 0eHamos um programa para contro$ar as ,endas de uma $oHaG no sentido deG ao 4ina$ do diaG seHa
e(ibida uma $ista re$acionando todos os produtos ,endidos e os ,endedores respecti,os
kinc$ude Zstring.6Y
kinc$ude Zconio.6Y
kinc$ude Zstdio.6Y
t`pede4 struct
a
c6ar ProdS2)TK
c6ar 0endS4TK
4$oat PrecoK
b
90endaK
,oid Le?ados@90enda ,S1))TG int htA
a
int i X )K
puts@<?igite produto ,endedor preo @pN encerrar digite ) para o produto<AK
puts@LProdutoMAK scan4@<gs<G ,SiT.ProdAK
56i$e @strcmp@,SiT.ProdG <)<A PX )A
a
44$us6@stdinAK
puts@L0endedorMAK
scan4@<gs<G ,SiT.0endAK
puts@LPreoMAK
scan4@<g4<G h,SiT.PrecoAK
iWWK
44$us6@stdinAK
puts@LProdutoMAK
scan4@<gs<G ,SiT.ProdAK
b
t X i I 1K
b
,oid '(ibe?ados@90enda ,S1))TG int tA
a
int iK
4or @i X )K i ZX tK iWWA
print4@<gs gs g.24 ln<G ,SiT.ProdG ,SiT.0endG ,SiT.PrecoAK
b
main@A
a
90enda 5S1))TK
int qK
Le?ados@5G qAK
'(ibe?ados@5G qAK
getc6@AK
b
*& Imagine que ten6a sido rea$izada uma pesquisa com 2) pessoas a respeito de sa$rioG idadeG nRmero
de 4i$6os e se(o. O programa abai(o recebe os dados co$etados na pesquisa e 4ornece a m2dia sa$aria$G a
m2dia das idades e o nRmero de mu$6eres cuHo sa$rio 2 maior #m ))G)).
kinc$ude Zstring.6Y
kinc$ude Zconio.6Y
kinc$ude Zstdio.6Y
kinc$ude Zstd$ib.6Y
t`pede4 struct
a
int -a$arioG IdadeG Cum3i$6osK
c6ar -e(oK
b
9?adosK
Nf#ecebe os dados da co$eta e os armazena num ,etor de registroshN
,oid Le?ados@9?ados ,S2)TG int hiA
a
4or @i X )K i Z 2)K iWWA
a
print4@<-a$arioF <AK scan4@<gd<G h,SiT.-a$arioAK
print4@<IdadeF <AK scan4@<gd<G h,SiT.IdadeAK
print4@<Cumero de 4i$6osF <AK scan4@<gd<G h,SiT.Cum3i$6osAK
44$us6@stdinAK
print4@<-e(oF <AK scan4@<gd<G h,SiT.-e(oAK
b
b
Nf?etermina os indicadores pretendidos
,oid Indicadores@9?ados ,S2)TG int tG int h>ed-a$G int h>edIdadeG int hCum>u$6eresG int
h>aior-a$A
a
int iG -omaIdade X )G -oma-a$ X )K
Cum>u$6eres X )G >aior-a$ X )K
4or @i X )K i Z tK iWWA
a
-oma-a$ X -oma-a$ W ,SiT.-a$arioK
-omaIdade X -omaIdade W ,SiT.IdadeK
i4 @,SiT.-e(o XX O3O hh ,SiT.-a$ario Y ))A
Cum>u$6eresWWK
i4 @,SiT.-a$ario Y >aior-a$A
>aior-a$ X ,SiT.-a$arioK
b
>edIdade X -omaIdadeNtK
>ed-a$ X -oma-a$NtK
b
main@A
a
9?ados 5S2)TK
int qK
int >edia-a$G >ediaIdadeG >u$6eresG >aior-a$arioK
c$rscr@AK
Le?ados@5G qAK
c$rscr@AK
'(ibe?ados@5G qAK
Indicadores@5G qG >edia-a$G >ediaIdadeG >u$6eresG >aior-a$arioAK
print4@<ln>edia -a$aria$F gdln>ediaIdadeF gdlnCumero de mu$6eres com sa$arios superiores a #m
))G))F gdln>aior -a$ rioF gdln<G >edia-a$G >ediaIdadeG >u$6eresG >aior-a$arioAK
getc6@AK
b
6&- ' +ue so ar+uivos
Bt2 o momentoG os dados manipu$ados pe$os nossos programas @dados de entradaG dados gerados pe$o
programa e resu$tados do processamentoA 4oram armazenados na mem!ria do computador queG como H 4oi
ditoG 2 uma mem!ria ,o$ti$G no sentido de que todas as in4orma1es ne$a armazenadas so perdidas quando a
e(ecuo do programa 2G por qua$quer moti,oG encerrada.
U e,idente que um programa que gerencia os recursos 6umanos de uma empresa no pode manipu$ar
os dados re$ati,os aos 4uncionrios apenas na mem!ria do computador. Isto imp$icariaG por e(emp$oG a
necessidade de que 4ossem digitados todos os dados em todas as e(ecu1es do programa. U e,idente que os
dados re$ati,os a cada um dos 4uncionrios da empresa de,em estar armazenadosG de 4orma permanenteG em
um discoG de modo que o programa que gerencia os recursos 6umanos possa acessI$os em e(ecu1es
distintas.
?ados e in4orma1es reunidos e armazenados num disco constituem um arquivo e a $inguagem /
permite que se manipu$e arqui,os em discosG 4ornecendo recursos para a rea$izao das opera1es bsicas
que podem ser ne$es e(ecutadasF criao de um arqui,oG a$terao dos dados de um arqui,oG e(c$uso de
dados de uma arqui,oG inc$uso de no,os dados no arqui,oG e(ibio @na te$a ou em 4ormato impressoA do
conteRdo de uma arqui,oG etc..
6&. Ar+uivos de registros HAr+uivos )in#riosI
Os arqui,os de uso mais comum na prtica de programao em / so os arqui,os que armazenam
dados oriundos de estruturas. Por e(emp$oG um sistema que gerencie uma $ocadora de 4itas de,e manipu$ar
um arqui,o que armazene para cada 4itaG um c!digoG o t+tu$o do 4i$meG o temaG a data de aquisioG o preo de
custoG o ,a$or da $ocaoG etc. Co momento da entradaG estes dados podem ser armazenados numa estrutura
para seremG em seguidaG armazenados num arqui,o. :m conHunto de dados re$ati,o a uma 4ita @neste
e(emp$oA 2 c6amado registro e um arqui,o em que um conHunto de registros est armazenado 2 c6amado
arquivo de registros. Cesse casoG os dados so gra,ados em 4ormato an$ogo ao 4ormato uti$izado para
armazenamento em mem!ria. Por esta razoG estes arqui,os tamb2m so c6amados arquivos binrios.
:ma grande parte das opera1es que so 4eitas em arqui,os requer a ,eri4icao de que o registro que
se pretende manipu$ar est armazenado no arqui,o. Isto e(ige que os registros possuam um campo cuHos
,a$ores seHam distintos entre siG sendo o ,a$or deste campo um identi4icador do re4erido registro. 'sta 2 a
4uno de campos do tipo /P3G matr+cu$asG p$acas de ,e+cu$osG etc.. :m campo identi4icador dos registros de
um arqui,o 2 c6amado chave.
Criando um ar+uivo de registros
:m arqui,o 2 criado atra,2s da 4uno fopen/0G que possui dois par.metros do tipo string e retorna um
ponteiro para uma estrutura pr2Ide4inida SI+* @um ponteiro que aponta para uma estrutura SI+* 2 c6amado
ponteiro de arquivoA. O primeiro dos par.metros de fopen/0 4i(a o nome com o qua$ o arqui,o ser gra,ado
no disco e o segundo par.metro 2 a string <5b< que indica o 4ormato binrio para o arqui,o que se est
criando. -eG por a$guma razoG o arqui,o no 4or criadoG a 4uno fopen/0 retorna o ponteiro %X++.
Por e(emp$oG o programa abai(oG criaG no disco da unidade BG um arqui,o denominado =este2arq.
kinc$ude Zstdio.6Y
3IL' f/riaBrqui,o@c6ar sS12TA
a
3IL' fpK
p X 4open@sG <5b<AK
return@pAK
b
main@A
a
3IL' fPontBrqui,oK
PontBrqui,o X /riaBrqui,o@<BFl9este.arq<AK
i4 @PontBrqui,o PX C:LLA
print4@<Brqui,o 9este.arq criado como sucesso<AK
e$se
print4@<O arqui,o 9este.arq no 4oi criado<AK
b
B 4uno fopen/0G a$2m de criar um arqui,o gra,ado no disco associaG atra,2s do que e$a retornaG um
ponteiro para o arqui,o re4erido. 'ste ponteiro 2 uti$izado para se re4erenciar o ta$ arqui,o no restante do
programa e 2 c6amado flu'o. U o caso do ponteiro de arqui,o ontArquivo do e(emp$o anterior. ]ua$quer
re4er8ncia a e$e ser uma re4er8ncia ao arqui,o =este2arq.
B criao de um arqui,o com a ati,ao de fopen/%omeArquivo, D)bD0 de,e ser so$icitada com
caute$a. -e o arqui,o de nome %omeArquivo e(istirG a c6amada re4erida <apagar< todo o seu conteRdo. O
tipo de caute$a necessria ,eremos a seguir.
Qravando registros em um ar+uivo
O programa anteriorG apenas cria o arqui,o no disco no gra,ando nen6um registro. -eG ap!s a sua
e(ecuoG procurarmos com o ]indo)s *'plorer o arqui,o =este2arqG encontrI$oIemos com a indicao de
que seu conteRdo tem zero b`tes. Ou seHa 2 um arqui,o va.io. U natura$ que se crie um arqui,o para gra,ar
registros e isto pode ser 4eito quando da sua criao.
B gra,ao de registros em um arqui,o 2 4eito atra,2s da 4uno f)rite/0 que possui quatro
par.metrosF
1. :m ponteiro r para uma ,ari,e$ do tipo void que receber o endereo da ,ari,e$ do tipo estrutura
que cont2m os dados que se quer armazenarK
2. :m inteiro n que receber o taman6oG em b`tesG do registro a ser armazenadoK
3. :m inteiro q que receber o nRmero de registros que sero armazenadosK
4. :m ponteiro de arqui,o p que receber o 4$u(o associado atra,2s da 4uno fopen/0 ao arqui,o de
disco onde os dados sero armazenados.
Para se criar um arqui,o de registros com a estrutura =Vegistro de4inida na seo anterior eG $ogo em
seguidaG gra,ar registros no arqui,oG ter+amos o seguinte programa.
kinc$ude Zstdio.6Y
struct 9#egistro
a
c6ar >atS4TK
c6ar ComeS4)TK
4$oat -a$arioDrutoK
bK
Nf3uno que cria um arqui,o em discoG dei(andoIo apto a armazenar dados fN
3IL' f/riaBrqui,o@c6ar sS12TA
a
3IL' fpK
p X 4open@sG <5b<AK
return@pAK
b
Nf3uno que gra,a dados armazenados numa estrutura em um arqui,ofN
,oid ora,a#egistros@c6ar sS12TA
a
3IL' fpK
struct 9#egistro rK
print4@<>atricu$a @para encerrarG digite matricu$a )AF <AK
44$us6@stdinAK
gets@r.>atAK
56i$e @@r.>atAS)T PX O)OA
a
print4@<ComeF <AK
44$us6@stdinAK
gets@r.ComeAK
print4@<-a$ario brutoF <AK
scan4@<g4<G hr.-a$DrutoAK
45rite@hrG sizeo4@rAG 1G pAK
print4@<>atricu$a @para encerrarG digite matricu$a )AF <AK
44$us6@stdinAK
gets@r. >atAK
b
4c$ose@pAK
b
main@A
a
3IL' fPontBrqui,oK
c6ar ComeBrqS12TK
print4@<?igite o nome do arqui,o<AK
gets@ComeBrqAK
PontBrqui,o X /riaBrqui,o@ComeBrqAK
i4 @PontBrqui,o PX C:LLA
ora,a#egistros@ComeBrqAK
e$se
print4@<O arqui,o gs nao pode ser criado ln<G ComeBrqAK
b
B 4uno fclose/0 <4ec6a< um arqui,o para que o sistema operaciona$ possa atua$izar a tabe$a do
diret!rio de arqui,os. Obser,e que esta 4uno tem um par.metro que receber o 4$u(o associado ao arqui,o
que se pretende 4ec6ar. U necessrio que todo arqui,o <aberto< seHa 4ec6ado antes do encerramento da
e(ecuo do programa.
E3i)indo o !onteJdo de um ar+uivo
Para se ter acesso ao conteRdo de um arqui,o 2 necessrio que este conteRdo seHa trans4erido para
mem!ria do computador paraG em seguidaG ser e(ibido na te$a pe$a 4uno printf/0 ou impresso por uma
impressora atra,2s da 4uno fprintf/0 @,eremos isto numa seo seguinteA. B trans4er8ncia do conteRdo de
um arqui,o para mem!ria pode ser 4eita registro a registroG armazenando cada um de$es em uma estruturaG ou
atra,2s de um conHunto de registrosG armazenandoIo num ,etor de estruturas. Bqui optaremos pe$a primeira
a$ternati,a.
B trans4er8ncia de registros de um arqui,o para a mem!ria 2 4eita atra,2s da 4uno fread/0 queG como
a 4uno f)rite/0G possui quatro par.metrosF
1. :m ponteiro para uma ,ari,e$ do tipo void que receber o endereo da ,ari,e$ que armazenar os
dados contidos no registroK
2. :m inteiro que receber o taman6oG em b`tesG da estrutura que armazenar o registro na mem!riaK
3. :m inteiro que receber o nRmero de registros que sero trans4eridos para a mem!ria @com a opo
aqui esco$6ida este par.metro sempre ser igua$ a 1AK
4. :m ponteiro de arqui,o que receber o 4$u(o associadoG atra,2s da 4uno fopen/0G ao arqui,o de
disco que cont2m os registros.
Para que seHa poss+,e$ a ap$icao da 4uno fread/0 2 necessrio que o arqui,o esteHa <aberto para
$eitura<G o que 2 4eito tamb2m atra,2s da 4uno fopen/0 agora com segundo par.metro <rb<. ]uando 2 4eita
uma c6amada da 4uno fopen/0 com os argumentos Come do Brqui,o e <rb<G o primeiro registro do arqui,o
4ica dispon+,e$ para $eitura @registramos este 4ato dizendo que o ponteiro de leitura e grava#!o aponta para o
primeiro registroA.
/onsiderandoIse que ap!s a e(ecuo da 4uno fread/0 o ponteiro de $eitura e gra,ao a,ana
automaticamente para o pr!(imo registroG podeIse percorrer todo o arqui,o at2 atingir o seu 4ina$G que 2
4ornecido pe$a 4uno feof/0. 'sta 4uno tem como par.metro um ponteiro de arqui,o e retorna um nRmero
di4erente de zero quando o ponteiro de $eitura e gra,ao aponta para o 4ina$ do arqui,o.
Por e(emp$oG podeIse e(ibir na te$a o conteRdo do arqui,o gerado acima atra,2s da seguinte 4uno.
Nf3uno que e(ibe na te$a o conteRdo de um arqui,o fN
,oid '(ibeBrqui,o@c6ar sS12TA
a
3IL' fpK
struct 9#egistro rK
p X 4open@sG <rb<AK
4read@hrG sizeo4@rAG 1G pAK
56i$e @4eo4@pA XX )A NfOuG o que 2 o mais uti$izadoG 56i$e @P4eo4@pAAfN
a
print4@<gs lb gs lb g4 ln<G r.>atG r.ComeG r.-a$arioDrutoAK
4read@hrG sizeo4@rAG 1G pAK
b
4c$ose@pAK
b
erifi!ando a e3istNn!ia de um ar+uivo
B ati,ao de fopen/0 no modo <rb< @o segundo par.metro de fopen/0 2 c6amado modo de abertura do
arquivoA permite que se escre,a uma 4uno para ,eri4icar a e(ist8ncia de um arqui,oG que ser Rti$ para
e,itar uma ati,ao <desastrada< de fopen/0G H queG como dissemos acimaG a ati,ao desta 4uno no modo
<5b< apaga todo o conteRdo do arqui,o que possuir o nome passado para o primeiro par.metro desta 4uno.
Isto imp$ica a necessidade de que se ten6a cuidado na abertura de um arqui,o no modo <5b<G pois se 4or
passado um nome de um arqui,o que H e(iste todo o seu conteRdo ser perdido. U prudenteG portantoG que a
abertura de um arqui,o no modo aqui discutido seHa precedida de uma 4uno que ,eri4ique se um arqui,o
com o nome esco$6ido H e(iste. :ma 4uno com este obHeti,o 2 bastante simp$esG pois a 4uno fopen/0
retorna %X++ se 4or ati,ada no modo <rb< com o arqui,o que no e(iste.
int '(isteBrqui,o@c6ar sS12TA
a
3IL' fpK
p X 4open@sG <rb<AK
i4 @p XX C:LLA
return@)AK
e$se
a
4c$ose@pAK
return@1AK
b
b
Bssim a 4uno CriaArquivo/0 de4inida anteriormente de,eria ser escrita da seguinte 4ormaF
3IL' f/riaBrqui,o@c6ar sS12TA
a
3IL' fpK
p X 4open@sG <rb<AK
i4 @p XX C:LLA
a
p X 4open@sG <5b<AK
return@pAK
b
e$se
print4@<la Brqui,o gs H e(isteP<AK
b
Lo!ali(ando um registro num ar+uivo
:ma operao muito comum em arqui,os 2 a ,eri4icao de que um determinado registro est ne$e
armazenado. 'sta operao 2 norma$mente @como H 4oi dito no cap+tu$o &A c6amada consultaG pesquisa ou
busca e de,e ser 4eita de acordo com o ,a$or da c6a,e do registro ou de um outro campo queG re$ati,amenteG
identi4ique o registro. Co e(emp$o que estamos discutindoG a consu$ta pode ser 4eita pe$o campo ?at @de
matr+cu$aA ou pe$o campo %ome. 'm gera$G a consu$ta se processa com a $oca$izao do registroG a
consequente e(ibio do seu conteRdo e o retorno da posio que e$e ocupa no arqui,o.
B $oca$izao do registro pode ser 4eitaG abrindoIo com fopen/0 e o percorrendo at2 que o ,a$or da
c6a,e seHa encontradoK a e(ibio do seu conteRdo pode ser 4eita atra,2s das 4un1es fread/0 e fprintf/0G e a
posio que e$e ocupa no arqui,o 2 4ornecida por uma das 4un1es fgetpos/0 e ftell/0 que possuem os
prot!tipos
int 4getpos@3IL' fpG 4poset fposAK
$ong 4te$$@3IL' fpAK
ondeG na primeiraG fpos^t 2 um tipo de dado pr2Ide4inido.
Cas duas 4un1esG p receber o ponteiro associado ao arqui,o onde est se rea$izando a pesquisaK a
posio do registro pesquisado @dada pe$a ordem do R$timo b`te ocupado pe$o R$timo campo deste registroA 2
armazenada na ,ari,e$ cuHo endereo 4or passado para o par.metro pos de fgetpos/0 ou ser retornado pe$a
4uno ftell/0. /omo em ,etoresG o primeiro b`te ocupado pe$o primeiro campo do primeiro registro 2 o de
ordem zero.
Nf3uno que ,eri4ica se um registro com matricu$a dada pertence ao arqui,oG retornando sua posio
no arqui,ofN
int /onsu$ta#egistro@c6ar sS12TG c6ar s1S12TA
a
3IL' fpK
int Bc6ou X )K
struct 9#egistro rK
4poset D`teK
p X 4open@s1G <rb<AK
4read@hrG sizeo4@rAG 1G pAK
56i$e @P4eo4@pA hh Bc6ou XX )A
i4 @strcmp@sG r.>atA XX )A
a
4getpos@pG hD`teAK
Bc6ou X 1K
b
e$se
4read@hrG sizeo4@rAG 1G pAK
i4 @Bc6ou XX )A
return @I1AK
e$se
return@D`teAK
b
/omo no nosso e(emp$o o taman6o da estrutura 2 de 4* b`tes @4 b`tes para o campo >atG 4) para o
campo Come e 4 para o campo -a$arioDrutoAG se o registro pesquisado 4or o primeiro a 4uno retornar 4*G
se o registro pesquisado 4or o segundoG a 4uno retornar retorna %"G se 4or o terceiroG a 4uno retornar 144
e assim por diante. -e o registro no esti,er no arqui,oG a 4uno retornar [1.
]uando o registro 2 encontradoG seu conteRdo est armazenado na estrutura r. BssimG para e(ibir o
conteRdo do registroG basta no comando if /strcmp/s, r2?at0 TT O0 inc$uir o comando
print4@<>atricu$aF gs ln ComeF gs ln -a$arioF g4 ln<G r.>atG r.ComeG r.-a$DrutoAK
Para escre,er a 4uno acima com a 4uno ftell/0 bastaria se substituir os comando fgetpos/p, h6yte0
pe$o comando 6yte T ftell/p0.
/onsiderando que a instruo return/0 interrompe a e(ecuo de uma 4unoG a 4uno acima poderia
prescindir da ,ari,e$ AchouF
int /onsu$ta#egistro1@c6ar sS12TG c6ar s1S12TA
a
3IL' fpK
struct 9#egistro rK
4poset D`teK
p X 4open@s1G <rb<AK
4read@hrG sizeo4@rAG 1G pAK
56i$e @P4eo4@pAA
i4 @strcmp@sG r.>atA XX )A
a
4getpos@pG hD`teAK
return@D`teAK
b
e$se
4read@hrG sizeo4@rAG 1G pAK
return @I1AK
b
Optamos pe$a primeira ,erso pe$o 4ato de que e(istem $inguagens que no possuem instru1es do tipo
return/0 eG nestas $inguagensG ter+amos de escre,er a 4uno como na ,erso inicia$.
0a$e obser,ar que as 4un1es ConsultaVegistro/0 acima uti$izam a pesquisa sequencial. -e os registros
dos arqui,os esti,erem ordenados pe$o campo ?at poder+amos ter uti$izado a pesquisa binriaG queG como
estudado no cap+tu$o &G 2 bem mais e4iciente.
Alterando o !onteJdo de um registro
ns ,ezesG 6 necessidade de que os dados de um registro seHam a$terados. Co arqui,o que estamos
uti$izando como e(emp$o isto poderia ocorrer no caso de uma promoo de um 4uncionrio que imp$icasse
um aumento no seu sa$rio bruto ou no caso de uma 4uncionria que a$terou o seu nome em 4uno de um
casamento.
:ma 4uno para a$terar os dados de um registro de,eG inicia$menteG abrir o arqui,o para $eitura e
gra,aoG o que 2 4eito atra,2s da 4uno fopen/0 no modo <rbW<. 3eito istoG a 4uno de,e receber o ,a$or da
c6a,e do registro e com este ,a$or c6amar a 4uno ConsultaVegistro/0 de4inida acima para obter a posio
do registro pretendido. 9endo esta posioG de,e posicionar o ponteiro de $eitura e gra,ao naque$e registro
e rea$izar as a$tera1es que so deseHadas. Para posicionar o ponteiro de $eitura e gra,ao num determinado
registro uti$izaIse a 4uno fsetpos/0 cuHo prot!tipo 2
int 4setpos@3IL' fpG 4poset fposAK.
Cuma ati,ao desta 4unoG o par.metro p recebe o ponteiro associado ao arqui,o e pos recebe a
posio do registroG obtido pe$a 4uno fgetpos/0 ou pe$a 4uno ftell/0.
Co e(emp$o que estamos discutindoG podemos a$terar o campo %ome de um registro de campo ?at
dado uti$izando a seguinte 4uno.
Nf3uno que a$tera o nome de um registroG dada a matr+cu$a fN
,oid B$tera#egistro@c6ar sS4TG c6ar s1S12TA
a
c6ar cK
struct 9#egistro rK
4poset D`teK
int 9amK
3IL' fpK
9am X sizeo4@rAK
D`te X /onsu$ta#egistro@sG s1AK
i4 @D`te PX I1A
a
D`te X D`te [ 9amK
p X 4open@s1G <rbW<AK
4setpos@pG hD`teAK
4read@hrG 9amG 1G pAK
print4@<Come atua$F gs ln B$tera @-NCAV <G r.ComeAK
44$us6@stdinAK
scan4@<gc<G hcAK
i4 @toupper@cA XX O-OA
a
print4@<l?igite o no,o nomeF ln<AK
gets@r.ComeAK
4setpos@pG hD`teAK
45rite@hrG 9amG 1G pAK
b
b
e$se
print4@<ln #egistro nao encontrado ln<AK
4c$ose@pAK
b
Obser,e queG ao contrrio das 4un1es anterioresG optamos por armazenar o ,a$or de si.eof/r0 na
,ari,e$ =amG para e,itar ,rias c6amadas dessa 4uno. Obser,e tamb2m que o comando 6yte T 6yte R =am
posiciona o ponteiro no in+cio do registro que se pretende a$terar.
Outra 4uno que posiciona o ponteiro de $eitura e gra,ao num registro de posio con6ecida 2 a
4uno fsee:/0 que tem o seguinte prot!tipoF
int 4see7@3IL' fpG $ong posG int origA
B+G p receber o 4$u(o associado ao arqui,o e pos indicar a no,a posio do ponteiroG a partir da
posio dada pe$o ,a$or passado para orig. O sistema possui tr8s constantes pr2Ide4inidasG S**_^S*=G
S**_^CXV e S**_^*%4 que podem ser passados para o par.metro orig. B primeira toma como origem o
registro zero do arqui,oK a segundaG o registro apontado pe$o ponteiro de $eitura e gra,ao @registro
corrente0K a terceiraG o 4ina$ do arqui,o. Co caso da posio do registro ser obtida por fgetpos/0 ou por ftell/0G
o ,a$or que de,e ser passado para orig 2 S**_^S*=.
?esta 4ormaG para se escre,er a 4uno AlteraVegistro/0 escrita acima uti$izandoIse a 4uno fsee:/0
basta substituir os comandos fsetpos/p, h6yte0 pe$o comando fsee:/p, 6yte, S**_^S*=0.
B constante S**_^*%4G a 4uno fsee:/0 e a 4uno ftell/0 permitem determinar o taman6oG em b`tesG
de um arqui,o. Dasta posicionar o ponteiro de $eitura e gra,ao no 4ina$ do arqui,o atra,2s de fsee:/p, O,
S**_^*%40 e obter a posio do ponteiro atra,2s de ftell/p0.
int 9aman6oBrqui,o@c6ar fsA
a
3IL' fpK
int 9aman6oK
p X 4open@sG <rt<AK
4see7@pG )G -''te'C?AK
9aman6o X 4te$$@pAK
4c$ose@pAK
return@9aman6oAK
b
/om esta 4uno 2 poss+,e$ se determinar o nRmero de registros de um arqui,o. Dasta di,idir o
taman6o do arqui,o pe$o taman6o de cada registroF
int Cum#egistros@c6ar fsA
a
3IL' fpK
struct 9#egistro rK
p X 4open@sG <rt<AK
return@9aman6oBrqui,o@sANsizeo4@rAAK
4c$ose@pAK
b
0a$e obser,ar queG da mesma 4orma que a c6amada de fsee:/p, O, S**_^*%40 posiciona o ponteiro
de $eitura e gra,ao no 4ina$ do arqui,oG fsee:/p, O, S**_^S*=0 posiciona o ta$ ponteiro no in+cio do
arqui,o @e(iste outra 4orma de apontar o ponteiro de $eitura e gra,ao para o in+cio do arqui,oF re)ind/p0A.
In!luindo novos registros num ar+uivo
B inc$uso de no,os registros em um arqui,o 2 4eita de 4orma bastante simp$esG pois a 4uno fopen/0
ati,ada no modo <abW< abre um arqui,o e permite que no,os registros seHam ne$e gra,ados. Catura$menteG a
inc$uso de um no,o registro de,e ser precedida da ,eri4icao de que o ta$ registro H est armazenado no
arqui,oG o que impediria uma no,a inc$uso. 9emos a seguinte sugesto para atingir o obHeti,o aqui
propostoF
Nf 3uno que inc$ui um no,o registro num arqui,o fN
,oid Inc$ui#egistro@struct 9#egistro rG c6ar sS12TA
a
c6ar cK
$ong D`teK
int 9amK
3IL' fpK
9am X sizeo4@rAK
D`te X /onsu$ta#egistro@r.>atG sAK
i4 @D`te XX I1A
a
p X 4open@sG <abW<AK
45rite@hrG 9amG 1G pAK
b
e$se
print4@<ln #egistro Ha cadastrado ln<AK
4c$ose@pAK
b
E3!luindo um registro de um ar+uivo
Outra operao muito uti$izada em arqui,os 2 a e(c$uso de um registro. Co nosso e(emp$oG esta
operao seria necessriaG por e(emp$oG na ocasio de um pedido de demisso de um 4uncionrio. :ma
poss+,e$ so$uo 2G ap!s $oca$izar o registroG gra,ar todos os outros registros num arqui,o au(i$iarG =empG
e(c$uir do disco o arqui,o origina$ e renomear o arqui,o =emp com o nome do arqui,o origina$.
B maioria dos compi$adores / e(c$uem um arqui,o atra,2s da 4uno remove/0 que possui um
par.metro do tipo ,etor de caracteres para receber o nome do arqui,o a ser remo,ido. Para renomear um
arqui,oG os compi$adores / possuem a 4uno rename/0 que possui dois par.metros do tipo ,etor de
caracteresG de,endo o primeiro receber o nome atua$ do arqui,o e o segundo receber o no,o nome que se
pretende.
?entro do e(emp$o que estamos estudandoG a 4uno abai(o recebendo o ,a$or do campo r2?at e o
nome do arqui,oG e(c$uiG se a matr+cu$a dada 4or uma matr+cu$a cadastradaG o registro correspondente.
Nf3uno que e(c$ui um registro de matr+cu$a dada fN
,oid '(c$ui#egistro@c6ar sS4TG c6ar s1S12TA
a
struct 9#egistro rK
c6ar cK
$ong D`teK
int 9amG #egK
3IL' fpG ftK
9am X sizeo4@rAK
D`te X /onsu$ta#egistro@sG s1AK
i4 @D`te PX I1A
a
p X 4open@s1G <rb<AK
D`te X D`te [ 9amK
4setpos@pG hD`teAK
4read@hrG 9amG 1G pAK
print4@<>atricu$aF gs lb ComeF gs ln<G r.>atG r.ComeAK
print4@<'(c$ui este registro @-NCAV <AK
44$us6@stdinAK
scan4@<gc<G hcAK
i4 @toupper@cA XX O-OA
a
t X 4open@<9emp<G <5b<AK
re5ind@pAK NfPrimeiro registro do arqui,ofN
#eg X )K
4read@hrG 9amG 1G pAK
56i$e @P4eo4@pAA
a
i4 @#eg PX D`teA
45rite@hrG 9amG 1G tAK
#eg X #eg W 9amK
4read@hrG 9amG 1G pAK
b
4c$ose@pAK
4c$ose@tAK
remo,e@s1AK
rename@<9emp<G s1AK
b
b
e$se
print4@<ln #egistro nao encontrado ln<AK
b
6&/ Ar+uivo te3to
Outra 4orma de arqui,o que os compi$adores / manipu$am so os c6amados arquivos te'tos. Cestes
arqui,osG tamb2m criados atra,2s da 4uno fopen/0G agora no modo <5t<G cadeias de caracteres podem ser
armazenadas b`te a b`teG atra,2s do c!digo ASCII de cada caractere.
B gra,ao de te(to em um arqui,o te(to pode ser 4eita atra,2s da 4uno fprintf/0 queG a$2m dos
par.metros da 4uno printf/0G e(ige um primeiro par.metro do tipo 4$u(o que indicar o arqui,o onde o te(to
ser gra,ado. Por e(emp$oG o programa abai(o cria um arqui,o =este2t't e gra,a ne$e a 4rase Isto ; um teste.
kinc$ude Zstdio.6Y
main@A
a
3IL' fPontBrqui,oK
PontBrqui,o X 4open@<9este.t(t<G <5t<AK
4print4@PontBrqui,oG <Isto 2 um teste<AK
4c$ose@PontBrqui,oAK
b
Bp!s a e(ecuo deste programaG qua$quer processador de te(to que edite te(tos em ASCII @inc$usi,e
o 6loco de %otas do ]indo)sA pode abrir o arqui,o =este2t'tG sendo o seu conteRdo abso$utamente $eg+,e$.
Ca ,erdadeG 2 poss+,e$ gra,ar conteRdos de ,ari,eis e resu$tados de processamentos em arqui,os
uti$izandoIse a 4uno fprintf/0. Cestes casosG so uti$izados os c!digos de especi4icao de 4ormato da
4uno printf/0. Por e(emp$oG para se armazenar no arqui,o =este2t't uma tabe$a de ra+zes quadradas dos cem
primeiros inteiros positi,os basta se e(ecutar o seguinte programaF
kinc$ude Zstdio.6Y
kinc$ude Zmat6.6Y
main@A
a
int iK
4$oat rK
3IL' fPontBrqui,oK
PontBrqui,o X 4open@<9este.t(t<G <5t<AK
4or @i X 1K i ZX 1))K iWWA
a
r X sqrt@iAK
4print4@PontBrqui,oG <gd g4 ln<G iG rAK
b
4c$ose@PontBrqui,oAK
b
B 4uno printf/0 2G de 4atoG um caso particu$ar da 4uno fprintf/0 cuHo primeiro par.metro 2 o 4$u(o
pr2Ide4inido stdout. O 4$u(o stdoutG que 2 omitido em printf/0G aponta para um arqui,o que 4az re4er8ncia ao
dispositi,o padro de sa+daG em gera$ a te$a do monitor. Ou seHaG printf/0 <gra,a< a sa+da na te$aG enquanto
fprintf/0 gra,a a sa+da no arqui,o associado ao 4$u(o passado para e$a. Por e(emp$oG os comandos
printf/D*stou aprendendo a programar em CD0 e fprintf/stdout, D*stou aprendendo a programar em
CD0 e(ecutam a1es id8nticasF e(ibem na te$a a 4rase *stou aprendendo a programar em C.
:m outro 4$u(o pr2Ide4inido 2 stdprn que aponta para um arqui,o que gerencia a re$ao entre o
sistema e a impressora conectada ao computador. Por e(emp$oG o programa
kinc$ude Zstdio.6Y
main@A
a
int iK
4or @i X )K i Z 1)K iWWA
4print4@stdprnG <'stou aprendendo a programar em / ln<AK
b
imprimeG atra,2s da impressora conectada ao computadorG dez ,ezes a 4rase 'stou aprendendo a programar
em /G uma ,ez em cada $in6a.
:m terceiro 4$u(o pr2Ide4inido 2 stdin que aponta para um arqui,o que administra a re$ao do sistema
com o dispositi,o de entrada padroG em gera$ o tec$ado. Isto e(p$ica a c6amada de fflush/stdin0 comentada
no cap+tu$o .
E3i)indo um ar+uivo te3to
B bib$ioteca da $inguagem / disp1e de uma 4uno capaz de <$er< uma $in6a de um arqui,o te(toG
armazenandoIa num ponteiro de caracteres. 9rataIse da 4uno de prot!tipo
c6ar f4gets@c6ar fsG int nG 3IL' fpAK
que $8 uma quantidade ' de caracteres do arqui,o associado a p e os armazena em sG como uma string. B
quantidade de caracteres ' 2 in4erior ou igua$ a nG sendo in4erior quando uma marca de 4im de $in6a 2
atingidaG ou seHaG quando o caractere indicado por ln 2 encontrado. ]uando o 4im de arqui,o 2 a$canadoG a
4uno retorna C:LL.
/om fgets/0 2 poss+,e$ e(ibir o conteRdo de um arqui,o te(to com a seguinte 4unoF
kinc$ude Zstdio.6Y
,oid '(ibeBrqui,o9e(to@c6ar fsA
a
3IL' fpK
c6ar fLin6aG f3imK
p X 4open@sG <rt<AK
3im X 4gets@Lin6aG *)G pAK
56i$e @3im PX C:LLA
a
print4@<gs<G Lin6aAK
3im X 4gets@Lin6aG *)G pAK
b
b
-e este arqui,o adicionado da 4uno
main@A
a
c6ar fComeBrqK
puts@<?igite o nome do arqui,o<AK
scan4@<gs<G ComeBrqAK
'(ibeBrqui,o9e(to@ComeBrqAK
b
4or gra,ado com o nome *'ib=e't2cG sua e(ecuo para a entrada e'ibte't2c e(ibe o seu pr!prio conteRdo.
Utili(ando um ar+uivo te3to !omo entrada de dados
U poss+,e$ uti$izar um arqui,o te(to para obter a entrada de um programa. Imaginemos que o arqui,o
te(to card2t't conti,esse o cardpio da $anc6onete re4erida num e(emp$o do cap+tu$o 4. Ou seHaG supon6amos
que o conteRdo do arqui,o card2t't 4osse o seguinteF
1)1 #e4rigerante 1.2)
1)2 -uco 1.))
1)3 -andu+c6e 2.)
1)4 -a$gado 1.))
1) 9orta 2.))
O programa abai(o $8 este arqui,o e armazena num ,etor de estruturas permitindo o gerenciamento
dos pedidos dos c$ientes.
kinc$ude Zmat6.6Y
kinc$ude Zconio.6Y
kinc$ude Zstdio.6Y
kinc$ude Zstring.6Y
t`pede4 struct
a
int /odK
c6ar ProdS3)TK
4$oat PrecoK
b9ItemK
t`pede4 struct
a
int /odK
int ]uantK
b9PedidoK
9Item /ardapioS1))TK
9Pedido PedidoS1))TK
Nf3uno para LsepararM os componentes do cardpiofN
,oid ProcessaItem@c6ar fsG int h/odigoG c6ar fProdutoG 4$oat hPrA
a
c6ar aS1)TK
int c X str$en@sAK
/odigo X atoi@sAK
strncp`@ProdutoG s W 4G cI%AK
strncp`@aG s W c I G 4AK
Pr X ato4@aAK
b
Nf3uncao para $er o cardpio do arqui,o te(tofN
int Ler/ardapio@c6ar fsA
a
3IL' fpK
int i X )K
c6ar fItemG f3im?eLin6aK
p X 4open@sG <rt<AK
3im?eLin6a X 4gets@ItemG *)G pAK
56i$e @3im?eLin6a PX C:LLA
a
ProcessaItem@ItemG /ardapioSiT./odG /ardapioSiT.ProdG /ardapioSiT.PrecoAK
iWWK
3im?eLin6a X 4gets@ItemG *)G pAK
b
return iK
b
Nf3uno para e(ibir o cardpiofN
,oid '(ibe/ardapio@9Item ,S1))TG int tA
a
int iK
print4@</O? '-P'/I3I/B/BO P#'/Oln<AK
4or @i X )K i Z tK iWWA
print4@<gd gI2)s g.24ln<G ,SiT./odG ,SiT.ProdG ,SiT.PrecoAK
b
Nf 3uncao para e(ibir pedidofN
,oid '(ibePedidos@int nA
a
int iG IndK
print4@</O? '-P'/I3I/B/BO ]:BC9 P#'/Oln<AK
4or@iX)K iZnK iWWA
a
Ind X PedidoSiT./od I 1)1K
print4@<g3d gI3)s gd #m g.24ln<GPedidoSiT./odG /ardapioSIndT.ProdG PedidoSiT.]uantG
/ardapioSIndT.PrecofPedidoSiT.]uantAK
b
b
,oid main@A
a
int iG CumItensK
4$oat 9ota$K
c$rscr@AK
CumItens X Ler/ardapio@<card.t(t<AK
'(ibe/ardapio@/ardapioG CumItensAK
9ota$ X )K
i X )K
puts@<?igite o codigo do produto deseHado @) para encerrarAF<AK
scan4@<gd<GhPedidoSiT./odAK
56i$e@PedidoSiT./od PX )A
a
i4@ @PedidoSiT./od Y 1))A hh@PedidoSiT./od Z 1)"A A
a
puts@<?igite a quantidadeF<AK
scan4@<gd<GhPedidoSiT.]uantAK
9ota$ X 9ota$ W PedidoSiT.]uant f /ardapioSPedidoSiT./od I 1)1T.PrecoK
iWWK
b
e$se
a
puts@<'rroP O c!digo in4ormado no est cadastradoP<AK
puts@L?igite uma tec$a para continuarMAK
getc6@AK
b
puts@<?igite o codigo do produto deseHado @) para encerrarAF<AK
scan4@<gd<GhPedidoSiT./odAK
b
puts@<ln9ota$ dos pedidosF<AK
'(ibePedidos@iAK
print4@<ln0a$or tota$ dos pedidosF #m g.24<G 9ota$AK
getc6@AK
b
6&1 E3er!5!ios propostos
$& 'scre,a uma 4uno main/0 queG atra,2s de um menu de op1esG uti$ize as 4un1es estudadas neste
cap+tu$o e queG portantoG seHa capaz de
aA criar e gra,ar dados num arqui,o de registrosK
bA e(ibir o conteRdo de um arqui,oK
cA a$terar dados de um registro de um arqui,oK
dA inc$uir no,os registros em um arqui,oK
eA e(c$uir um registro de um arqui,o.
*& 'scre,a uma 4uno que reRna dois arqui,os de registros de mesma estrutura em um terceiro
arqui,o.
-& 'scre,a um programa queG dado um arqui,o cuHos registros possuem os campos %ome @do tipo
,etor de stringsA e Salario @do tipo floatAG gere um arqui,o dos registros cuHo campo Salario 2 maior que
.)))G)).
.& 'scre,a uma 4uno que inc$ua um registro dado num arqui,o de registros ordenado por um campo
?at de modo que o arqui,o se manten6a ordenadoG sem uti$izar um arqui,o au(i$iar.
/& 'scre,a um programa queG dados dois arqui,os ordenados por um campo ?atG gere um terceiro
arqui,o tamb2m ordenado.
1& 'scre,a um programa que dados dois arqui,os cuHos registros t8m os campos char Cpf[MQ\ e char
%ome[POT gere um arqui,o contendo os registros que pertencem aos dois arqui,os.
2& 'scre,a uma 4uno que troque as posi1es de dois registros de um arqui,o.
4& 'scre,a uma 4uno que ordene um arqui,oG cuHos registros t8m os campos char Cpf[MQ\ e char
%ome[PO\G em re$ao ao campo Cpf.
6& 'scre,a uma 4uno que e(c$ua os comentrios de um programa da $inguagem /.
$9& Para uma pesquisa re$ati,a aos 6bitos de estudo dos a$unos do /urso de /i8ncia da /omputao
da :ni,ersidade 3edera$ de B$agoasG 4oi idea$izado um sistema baseado numa estrutura =4ados, com os
campos char ComeS4)TK char -e(oK int Cum=orasKG onde %ome e Se'o t8m 4ina$idades !b,ias @-e(o recebe
3 ou >A e %um<oras recebe o nRmero de 6oras dirias de estudo do pesquisado.
(A 'scre,a uma 4uno que armazene os dados co$etados @quantidade de a$unos pesquisados
no con6ecido a prioriA num ,etor de estruturas.
`A 'scre,a uma 4uno que retorne os nomes dosNas a$unosNas que dedicam mais 6oras dirias ao
estudo.
$$& Imagine que o arqui,o te(to %otas2t't cont2m as notas 4inais dos a$unos da discip$ina Programao
1do /urso de /i8ncia da /omputao da :3BL como abai(o
oise$e Dac6en %.%
Ju$iana #aes %.*
Bna Pau$a Brd!sia %.)
#odrigo -entouro .
. . .
no qua$ a co$una dos nomes est a$in6ada esquerdaG as notas t8m sempre uma casa decima$G podendo ter
ocorrido nota 1).)G e no 6 espaos em branco ap!s cada nota. 'scre,a uma 4uno que receba o nome do
arqui,o e retorne as m2dias das notas.
')servao
Propostas de solu:es dos e3er!5!ios propostos podem ser soli!itadas atrav8s de mensagem
eletr;ni!a para jaime<!!en&ufal&)r !om assunto 0E"P'"=A" LI0' C, ane3ando o formul#rio
a)ai3o devidamente preen!>ido&
?ome Categoria
$
Instituio
*
Curso
*
Cidade@Estado
$
CategoriaA do!ente, estudante, autodidata
*
"e do!ente ou estudante
$9 ?o:es )#si!as de alo!ao din7mi!a de mem,ria
$9&$ ' +ue 8 alo!ao din7mi!a
Bt2 agoraG os programas uti$iza,am a mem!ria do computador estaticamenteF todas as posi1es de
mem!ria eram reser,adas para as ,ari,eis no in+cio da e(ecuo do programa ou da 4uno eG mesmo que
no esti,essem sendo mais uti$izadasG continua,am reser,adas para as mesmas ,ari,eis at2 a conc$uso da
e(ecuo do programa ou da 4uno. :m ,etor g$oba$ do tipo float com dez mi$ componentesG por e(emp$oG
LocuparM quarenta mi$ b`tes de mem!ria durante toda a e(ecuo do programa. Catura$menteG isto podeG em
grandes programasG sobrecarregar ouG at2 mesmoG esgotar a mem!ria dispon+,e$. Co primeiro casoG 6 uma
degradao na e4ici8ncia do programaK no segundo caso a e(ecuo do programa pode ser in,iabi$izada.
Os compi$adores / permitem a aloca#!o din"mica da mem!ria de ta$ modo que posi1es de mem!ria
seHam reser,adas para ,ari,eis no instante em que seHam necessrias e seHam $iberadas @as posi1es de
mem!riaA para o sistema nos instantes em que no esteHam sendo uti$izadas.
B a$ocao din.mica de mem!ria pode ser 4eita atra,2s das 4un1es malloc/0G calloc/0 e realloc/0 cuHos
prot!tipos se encontram no arqui,o alloc2h e so os seguintes
,oid fma$$oc@sizeet 9amAK
,oid fca$$oc@sizeet CumItensG sizeet 9amAK
,oid frea$$oc@,oid fD$ocoG sizeet 9amAK
B+G si.e^t 2 um tipo de dado pr2Ide4inidoG de4inido tamb2m no arqui,o alloc2hG =am 2 o nRmero de
b`tes que se pretende a$ocar dinamicamenteG %umItens 2 a quantidade de itens de =am b`tes que se pretende
a$ocar e 6loco 2 um ponteiro que cont2m o endereo da ,ari,e$ cuHa mem!ria se pretende e(pandir em =am
b`tes.
B 4uno malloc/0 retorna um ponteiro para um b$oco de =am b`tes at2 ento dispon+,e$G a 4uno
calloc/0 retorna um ponteiro para um espao de mem!ria at2 ento dispon+,e$ capaz de armazenar %umItens
obHetosG cada um de$es com =am b`tes e a 4uno realloc/0 retorna um ponteiro para um b$oco de mem!ria
com quantidade de b`tes igua$ soma a$g2brica da quantidade de b`tes apontada por 6loco e =amG podendo
=am ser negati,o. /aso a quantidade de b`tes pretendida no esteHa dispon+,e$G as 4un1es acima retornam
%X++.
/omo os ponteiros retornados so ambos do tipo voidG e$es de,em ser mo$dados para poderem receber
endereos de qua$quer tipo de ,ari,e$. Por e(emp$oG o programa
kinc$ude Zstdio.6Y
kinc$ude Za$$oc.6Y
main@A
a
int f,G tK
, X @int fAma$$oc@*)AK
i4 @, XX C:LLA
print4@<>emoria nao disponi,e$<AK
e$se
a
4or @t X )K t ZX 4)K t X t W 1A
,StT X tftK
4or @t X )K t ZX 4)K t X t W 1A
print4@<gd <G ,StTAK
4ree@,AK
b
b
armazena os quadrados dos quarenta primeiros nRmeros inteiros num ,etor criado dinamicamente. B 4uno
free/0 $ibera para o sistema a quantidade de mem!ria a$ocada para o seu argumento por uma das 4un1es
malloc/0G calloc/0 ou realloc/0.
Catura$menteG o $eitor pode estar pensando que o programa acima no teria muita ,antagem em
re$ao ao programa abai(oG onde o ,etor , 2 criado estaticamenteG
kinc$ude Zstdio.6Y
main@A
a
int ,S4)TG tK
4or @t X )K , ZX 4)K t X t W 1A
,StT X t f tK
4or @t X )K , ZX 4)K t X t W 1A
print4@<gd <G ,StTA
b
?e 4atoG os dois programas durante suas e(ecu1es uti$izam oitenta b`tes de mem!ria. =a,er
di4erena se estes programas 4izerem parte de um programa maior. Ceste casoG o primeiro uti$iza oitenta
b`tes apenas at2 a e(ecuo do comando free/0G enquanto que o segundo uti$iza os oitenta b`tes durante toda
e(ecuo do programa.
Catura$menteG tamb2mG o $eitor pode estar se perguntando qua$ a ,antagem do primeiro dos programas
acima em re$ao ao programa
kinc$ude Zstdio.6Y
main@A
a
int f,G tK
4or @t X )K , ZX 4)K t X t W 1A
,StT X t f tK
4or @t X )K , ZX 4)K t X t W 1A
print4@<gd <G ,StTA
b
no qua$ o <taman6o< de v no 4oi 4i(ado e portanto no 6 <desperd+cio< de mem!ria. O que ocorre 2 que no
primeiro se no 6ou,er mem!ria dispon+,e$G o ,etor v no 2 <criado<G cabendo ao programador aHustar o
programa para esta 6ip!tese.
$9&* Arma(enando dinami!amente um polin;mio
B 4uno realloc/0 aumenta a e4ici8ncia de uti$izao de mem!ria pe$o 4ato de que a quantidade de
mem!ria a$ocada para um ,etor pode crescer medida da necessidade. Para e(emp$i4icarG imagine a 4uno
abai(o que <$8 um po$in;mio< p@(A. /omo se sabeG um po$in;mio p@(A X a
)
(
n
W a
1
(
nI1
W ... W a
nI1
( W a
n
2
identi4icado pe$o seu grau e pe$os ,a$ores de seus coe4icientes. -e se pretende que o grau no seHa dado de
entradaG a questo 2 a mesma que ocorre quando se traba$6a com uma re$ao de nRmerosF no se sabe a
quantidade de$es eG portantoG no se pode precisar o taman6o do ,etor necessrio. :ma so$uo 2 uti$izar a
4uno malloc/0 para inicia$izar um ponteiro eG medida que os coe4icientes so digitadosG uti$izar a 4uno
realloc/0 para e(pandir a mem!ria necessria.
kinc$ude Zstdio.6Y
kinc$ude Za$$oc.6Y
kinc$ude Zstring.6Y
kinc$ude Zstd$ib.6Y
int LePo$inomio@int fpA
a
c6ar f/oe4K
int iK
print4@<?igite os coe4icientes @O4imO para encerrarAln<AK
i X 1K
do
a
p X @int fArea$$oc@pG 2fiAK
gets@/oe4AK
i4 @strcmp@/oe4G <4im<A PX )A
a
pSi I 1T X ato4@/oe4AK
i X i W 1K
b
b
56i$e @strcmp@/oe4G <4im<A PX )AK
4ree@pAK
return @i I 1AK
b
B <inicia$izao de p< de,e ocorrer antes da c6amada da 4uno. Por e(emp$oG na 4uno main/0
atra,2s do ponteiro dec$arado nesta 4uno e que ser passado para a 4uno +eolinomio/0.
main@A
a
int fPo$iK
int orauK
Po$i X @int fAma$$oc@2AK
orau X LePo$inomio@Po$iAK
. . .
b
Obser,e que optamos por dar entrada nos coe4icientes como strings. 'sta opo 4oi 4eita para que
pud2ssemos usar <4im< como flagG H que a uti$izao de qua$quer nRmero com esta 4ina$idade 4ica
comp$icada H que qua$quer nRmero pode ser um coe4iciente de um po$in;mio.

$9&- Listas
Para mais um e(emp$o de a$ocao din.micaG apresentaremos um tipo de dado c6amado lista
simplesmente encadeada. 'ste tipo de dado pode ser de4inido como uma sequ8ncia de e$ementos $igados
atra,2s de ponteiros com um nRmero m(imo de e$ementos no 4i(ado a priori. :sua$menteG cada e$emento
da $ista 2 uma estruturaG com um campo contendo um ponteiro e os demais campos contendo os dados que o
programa ,ai manipu$ar. BssociaIse um ponteiro ao primeiro e$emento e o campo do tipo ponteiro do R$timo
e$emento da $ista tem ,a$or C:LL. O ponteiro que aponta para o primeiro e$emento da $ista indica o seu
in+cio e o ,a$or do ponteiro da R$tima estrutura da $ista ser C:LL indicar o seu 4ina$.
Para as 4un1es que ,amos apresentar @criao de uma $ista de inteirosG e(ibio e remoo de um
e$emento desta $istaA necessitamos de4inir a seguinte estruturaF
struct 9'$emento
a
int 0a$orK
struct 9'$emento fpK
bK
Obser,e que na de4inio de uma estrutura 2 poss+,e$ se de4inir um campo de tipo id8ntico ao da
estrutura. 'ste campo de4inir um ponteiro que aponta para o e$emento seguinte da $ista e o campo 5alor
armazenar o inteiro.
Cecessitamos tamb2m de duas ,ari,eis g$obaisF
struct 9'$emento fInicioG fPro(K
a ,ari,e$ Inicio para apontar para o inicio da $ista e ro' para apontar para o pr!(imo e$emento. U
necessrio obser,ar que o ponteiro Inicio aponta para o R$timo e$emento que 4oi inserido na $istaG enquanto
que o campo fp do primeiro e$emento da $ista 2 igua$ a %X++.
Para criar a $ista 4azemos Inicio receber %X++ eG dentro de uma estrutura de repetioG a$ocamos
mem!ria para o ponteiro ro'G damos entrada em ro'25alor e 4azemos o campo p de ro' receber Inicio e
Inicio receber ro' para que este ponteiro aponte sempre para o R$timo e$emento a dar entrada. 9emos a
seguinte 4unoF
,oid /riaLista@A
a
Inicio X C:LLK
print4@<?igite os numeros @I1 para encerrarAln<AK
do
a
Pro( X @struct 9'$emento fAma$$oc@AK
scan4@<gd<Gh@fPro(A.0a$orAK
i4 @@fPro(A.0a$or PX I1A
a
@fPro(A.p X InicioK
Inicio X Pro(K
b
b
56i$e @@fPro(A.0a$or PX I1AK
b
Para e(ibir a $ista @ou rea$izar ne$a qua$quer processamentoAG basta percorr8I$a desde seu in+cio
@ro' T InicioA at2 o seu 4ina$ @/Wro'02p T %X++A.
,oid '(ibeLista@A
a
Pro( X InicioK
56i$e @Pro( PX C:LLA
a
print4@<gd <G @fPro(A.0a$orAK
Pro( X @fPro(A.pK
b
print4@<ln<AK
b
Para de$etar um e$emento da $ista 2 necessrio queG quando e$e 4or $oca$izadoG se armazene o ponteiro
do e$emento anterior a e$e e o ponteiro que aponta para e$e. -e o e$emento a ser de$etado 4or o primeiroG basta
4azer Inicio apontar para o segundo e$ementoK se o e$emento a ser e(c$u+do 4or outro e$ementoG basta 4azer o
ponteiro do e$emento anterior para o e$emento seguinte e de,o$,er ao sistema a posio de mem!ria ocupada
pe$o e$emento a ser e(c$u+do.
,oid ?e$eta@int nA
a
struct 9'$emento fBntK
Pro( X InicioK
Bnt X InicioK
56i$e @@Pro( PX C:LLA hh @@fPro(A.0a$or PX nAA
a
Bnt X Pro(K
Pro( X @fPro(A.pK
b
i4 @Pro( PX C:LLA
a
i4 @@Bnt XX InicioA hh @Pro( XX InicioAA
Inicio X @fPro(A.pK
e$se
@fBntA.p X @fPro(A.pK
4ree@Pro(AK
b
e$se
print4@<'$emento nao esta $ista ln<AK
b
$9&. E3er!5!ios propostos
$& 'scre,a uma 4uno que ca$cu$e a m2dia de uma re$ao de nRmeros armazenada numa
$ista criada pe$a 4uno Cria+ista/0 acima.
*& 'scre,a uma 4uno que insira um e$emento numa $ista ordenada de modo que a $ista
permanea ordenada.
')servao
Propostas de solu:es dos e3er!5!ios propostos podem ser soli!itadas atrav8s de mensagem
eletr;ni!a para jaime<!!en&ufal&)r !om assunto 0E"P'"=A" LI0' C, ane3ando o formul#rio
a)ai3o devidamente preen!>ido&
?ome Categoria
$
Instituio
*
Curso
*
Cidade@Estado
$
CategoriaA do!ente, estudante, autodidata
*
"e do!ente ou estudante
Ri)liografia
?iH7straG '. u.G A 4iscipline of rogramiming. PrenticeI=a$$. Ce5 Jerse`G 1%&.
B$meidaG '$iana -. de et a$.. A21AP` Xm Ambiente de Apoio ao Aprendi.ado de
rograma#!o. Bnais do /ongresso da -ociedade Drasi$eira de /omputaoG 2))2G
3$orian!po$is.
',aristoG J. e /respoG -G Aprendendo a rogramar rogramando numa +inguagem Algortmica
*'ecutvel /I+A0. Doo7 '(pressG #io de JaneiroG 2))).
',aristoG J.G Aprendendo a rogramar rogramando em +inguagem C. Doo7 '(pressG #io de
JaneiroG 2))1.
',aristoG J.G PerdigoG '.G Introdu#!o aa blgebra Abstrata. 'ditora da :ni,ersidade 3edera$ de
B$agoas @'?:3BLA. B$agoasG 2))2.
',aristoG J.G rogramando com ascal. -egunda 'dioG Doo7 '(pressG #io de JaneiroG 2))4.
tnut6G ?. '.G =he Art of Computer rogrammingG ,o$ume 2G Seminumerical Algorithms BddisonI
ues$e` Pub$is6ing /ompan`. :-BG 1%**.
to5a$to5s7iG 9. h Lucc6esiG /.G Conceitos Sundamentais e =eoria da Computa#!o. Bnais do II
u'I. >inas oeraisG 1%%4
CortonG P.G Introdu#!o Y Informtica. >a7ron Doo7s. -p Pau$oG 1%%".
#ange$G J. L.G 9s rogramas de &radua#!o em +inguagens de rograma#!o. Bnais do IIu'I. >inas
oeraisG 1%%4.
-z5arc4iterG J. L. h >ar7enzonG *struturas de 4ados e seus Algoritmos. L9/ 'ditora. #io de
JaneiroG 1%%4.
uirt6G C.G Algorithms Z 4ata Structures. PrenticeI=a$$. Ce5IJerse`G 1%*".
Sndi!e remissivo
B
B$goritmo de 'uc$ides..................................... "1
B$ocao din.mica da mem!ria....................132
Bmp$itude........................................................ %"
Bpontadores..................................................... &2
Brgumentos......................................................"
Brqui,o binrio.............................................. 11&
Brqui,o de registros.......................................11&
Bti,ao de uma 4uno.................................. "
D
Dinar` digit........................................................ 4
Dit.......................................................................4
Dubb$e-ort..................................................... 1)2
Dusca................................................................%%
D`te....................................................................
/
/adeia de caracteres.......................................1)4
/ampos.......................................................... 113
/aractere nu$o................................................ 1)4
/entra$ processing unit...................................... 4
/6ar..................................................................1*
/6a,e............................................................. 11&
/!digo B-/II....................................................
/!digos de con,erso...................................... 23
/!digos especiais.............................................2&
/omando de atribuio.................................... 2*
/omando de se$eo........................................ 3"
/omando do 56i$e........................................... "
/omando 4or.................................................... )
/omando i4...................................................... 3"
/omando i4 e$se............................................... 3&
/omando s5itc6.............................................. 44
/omando 56i$e................................................ 3
/omentrios..................................................... 41
/ompi$adores................................................... 13
/omponentes de um ,etor............................... *4
/ondio de escape..........................................&"
/onstante......................................................... 1*
/onsu$ta........................................................... %%
?
?ecomposio em 4atores primos.............. "4G %&
?es,io m2dio................................................... *&
?es,io padro.................................................. %"
?iagona$ principa$............................................%3
?+gito ,eri4icador...........................................11)
?i,isor pr!prio.................................................2
?oub$e..............................................................1*
'
'ndentao....................................................... 3*
'ndereo de uma ,ari,e$................................ &2
'strutura......................................................... 113
'strutura de deciso......................................... 3"
'strutura de se$eo......................................... 3"
'(presso de recorr8ncia................................. &"
'(press1es $!gicas........................................... 2)
3
3atoria$............................................................. &
3IL'............................................................... 11&
3$oat................................................................. 1*
3$u(o.............................................................. 11*
3uno ato4.................................................... 1)&
3uno atoi.....................................................1)&
3uno ato$.....................................................1)&
3uno ca$$oc................................................. 132
3uno 4c$ose................................................. 11%
3uno 4eo4.................................................... 12)
3uno 4getpos............................................... 121
3uno 4open..................................................11&
3uno 4read.................................................. 11%
3uno 4ree.................................................... 133
3uno 4see7.................................................. 123
3uno 4setpos............................................... 122
3uno 4te$$.................................................... 121
3uno 45rite................................................. 11*
3uno main....................................................."&
3uno ma$$oc................................................ 132
3uno print4.................................................... 23
3uno rea$$oc................................................ 132
3uno scan4.................................................... 22
3uno strcat.................................................. 1)"
3uno strcmp................................................ 1)"
3uno strcp`................................................. 1)"
3uno str$en.................................................. 1)
3uno str$5r................................................. 1)"
3uno strncp`............................................... 1)"
3uno strstr...................................................1)&
3uno strupr................................................. 1)"
o
oets................................................................ 1)
=
=ard5are..........................................................1
I
Identi4icador..................................................... 1&
Insert-or......................................................... 1)3
Int..................................................................... 1*
Interpretadores................................................. 13
L
Laos................................................................ )
Linguagem de a$to n+,e$.................................. 13
Linguagem de mquina......................................4
Long................................................................. 1*
>
>atriz identidade de ordem n.......................... %3
>atriz quadrada............................................... %3
>(imo di,isor comum................................... "1
>embros........................................................ 113
>em!ria............................................................. 4
>+nimo mR$tip$o comum................................. "2
>odu$arizao de um programa...................... "&
>!du$o............................................................. 1%
>u$tip$icidade.................................................. "4
C
Corma de um ,etor.......................................... %"
Cotao cient+4ica............................................ 1%
C:LL............................................................... &3
CRmero primo.................................................. 4
O
Operador condiciona$ ternrio......................... 3*
Operador de endereo................................ 22G &2
Operadores $!gicos.......................................... 2)
Operadores re$acionais.....................................2)
P
Par.metros....................................................... "
Passagem de par.metro por ,a$or.................... "*
Pesquisa........................................................... %%
Pesquisa binria............................................. 1))
Pesquisa sequencia$..........................................%%
Pi$6a de mem!ria............................................. &"
Ponteiro de arqui,o........................................ 11&
Ponteiros.......................................................... &2
Produto esca$ar.................................................%"
Programa 4onte.................................................13
Programa obHeto............................................... 13
Prot!tipo de uma 4uno.................................. "
#
#ecursi,idade...................................................&
#egistro.......................................................... 11&
#eso$uo de prob$emas.................................... "
#eturn..............................................................."
#e5ind........................................................... 124
-
-''te/:#................................................... 123
-''te'C?................................................... 123
-''te-'9.................................................... 123
-e$ect-ort....................................................... 1)1
-em.nticade um comando............................... 14
-equ8ncia de 3ibbonaci................................... "4
-2rie 6arm;nica............................................... "4
-inta(e de um comando................................... 14
-istema binrio de numerao...........................
-istema operaciona$......................................... 14
-izeo4............................................................... *4
-o4t5are........................................................... 1
-o$uo iterati,a.............................................. &&
-tatic................................................................ *)
-tdou.............................................................. 12"
-tdprn............................................................. 12&
-tring..............................................................1)4
9
9ipo de dado.................................................... 1&
9orre de =an!i................................................. &*
9rao................................................................ %3
9`pede4.......................................................... 114
:
:nidade de entrada............................................ 4
:nidade de processamento centra......................4
:nidade de sa+da................................................ 4
0
0ari,eis automticas...................................... *)
0ari,eis din.micas......................................... *)
0ari,eis estticas............................................*)
0ari,eis $ocais.......................................... "G *)
0ari,eis simp$es............................................. 1&
0ari,e$ g$oba$.................................................*)
0etores............................................................. *4
0oid................................................................. "&

You might also like