Escolar Documentos
Profissional Documentos
Cultura Documentos
Livro Programacao C
Livro Programacao C
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
*
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
_
,
_
,
_
,
.
*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
_
,