Professora ANITA LOPES FUNDAMENTOS DA LINGUAGEM C++ 1 A linguagem C++ 1.1
Inro!u"#o
A linguagem C++ foi desenvolvida nos Laboratórios Laboratórios da BELL. Ela é baseada na linguagem C, mas acrescenta características de uma linguagem orientada a objetos. Nosso estudo não far men!ão men!ão a orienta!ão a objetos. ++ A linguagem C é "Case #ensitive", isto é, mai$sculas mai$sculas e min$sculas min$sculas fa%em diferen!a. 1.$ 1.$
Esr Esruuura ura !e uum m %ro %rogr gram amaa em em C++
&m 'rograma em C++ é constituído de( cabe!al)os *ue contém defini!+es de 'ré'rocessamento tais como os ar*uivos de cabe!al)o, as defini!+es de constantes simbólicas, uso de namesa'ces,declara!ão de variveis globais, declara!ão de rotinas, etc. um bloco da fun!ão 'rinci'al e outros blocos de fun!+es. comentrios. - defini!+es de 'ré'rocessamento/ 0 - declara!ão de variveis globais/ 0 in main&' ( Bloco de comandos ) ti'o de retorno da fun!ão/ nome*!a*fun"#o1 nome*!a*fun"#o1 /& 'ar1metros/' 'ar1metros/' / ( Bloco de comandos da fun!ão2 ) ... ti'o de retorno da fun!ão/ nome*!a*fun"#on nome*!a*fun"#on /& 'ar1metros/' 'ar1metros/ ' / ( Bloco de comandos da fun!ão3 ) E4em'lo de um 'rograma em C ++ in,lu!e -iosream usingnamesa%,e s!/ in main&' ( ,ou--0nP2IMEI2O P2OG2AMA EM C++0/ ) E4'licando( •
• •
1
Professora ANITA LOPES
in,lu!e -iosream instrui o com'ilador a usar a biblioteca 'adrão de entrada e saída using namesa%,e s!/ uso do names'ace 'adrão s! in main&' main é o nome da fun!ão f un!ão 'rinci'al5 ( inicia a fun!ão ,ou im'rime na tela a msg a'ós alimentar lin)a ) finali%a a fun!ão 1.$.1 Con3uno !e ,ara,eres
&m 'rograma fonte em C ++ é um te4to não formatado formatado escrito em um editor de te4tos usando um o conjunto 'adrão de caracteres A#C66. Cara,eres 45li!os6 As letras min$sculas e mai$sculas não acentuadas 7s algarismos de 8 9 :;<=>?@DFGH-0IJK.,(/ 7bserva!ão( ual*uer ual*uer outro caracter é valido 'ara as strings. 1.$. 1.$.$$ Come Comen5 n5rio rioss 7s comentrios em C ++ 'odem a'arecer em *ual*uer lugar do 'rograma e tMm como objetivo fa%er um esclarecimento sobre uma lin)a ou trec)o do 'rograma. 7s coment comentrios rios de bloco bloco terão um 78 antes 78 antes e um 87 de'ois, 87 de'ois, ou 77 *uando se deseja comentar uma lin)a. E9em%lo6 78 'rogramar 78 'rogramar em C:: e) facil 87 77 so uma lin)a 1.$.: Direi4as !e Com%ila"#o Na linguagem C ::, alguns alguns comand comandos os são 'roces 'rocessad sados os durant durantee a com'il com'ila!ã a!ão. o. Estes Estes comandos são c)amados de diretivas de com'ila!ão e e são eles *ue informam *uais bibliotecas e constantes simbólicas deverão ser ane4adas *uando for gerado o 'rograma e4ecutvel. A diretiva in,lu!e diretiva in,lu!e di% ao com'ilador 'ara incluir na com'ila!ão do 'rograma outros ar*uivos. eralmente estes ar*uivos contem bibliotecas de fun!+es ou rotinas do usurio. As biblioteca bibliotecass agru'am agru'am fun!+es de acordo acordo com as finalidades finalidades.. #e não fi%éssemos fi%éssemos uso delas, nossos 'rogramas seriam muito e4tensos e teríamos 'roblemas na linOedi!ão. #inta4es( 2
Professora ANITA LOPES include nomeIdaIbiblioteca / include K...nomeIdaIbiblioteca P onde nomeIdaIbiblioteca é é o nome da biblioteca *ue se deseja incluir. Estando entre os sinais e / significa *ue est no diretório 'adrão e ficando entre K, significa *ue 'recisamos fornecer o camin)o onde se encontra a biblioteca. E4em'los de bibliotecas( ;I;LIOTECA ,<%e.= Con4ere %ara mai>s,ula ou %ara min>s,ula uma lera ou%%erletraF ou%%erletraF olo?erletraF olo?erletraF ;I;LIOTECA ma=.= Cal,ula o 4alor a@soluo real ! fa@sdouble fa@sdouble d F Fun"es rigonomBri,as !o ngulo ar,o em ra!ianos sindouble sindouble arco F ,osdouble ,osdouble arco F andouble andouble arco F asindouble asindouble arco F a,osdouble a,osdouble arco F aandouble aandouble arco F Fun"es !e arre!on!ameno %ara ineiro ,eildouble ,eildouble num F E4. ceilQ.3F >/ R.8 arredonda 'ra cima floordouble floordouble num F E4. floorQ.3F >/ Q.8 arredonda 'ara bai4o Fun"es logarmi,as6 log&' B logarimo naural &@ase e ' ' log1&' B logarimo !e,imal &@ase 1' logdouble logdouble num F log1double log1double num F Fun"es6 %on,ia e raiH ua!ra!a %o?double %o?double base, double e4' F5F5 Sotenciacao( 'oTQ.3,U.VF >/ Q.3 U.V srdouble srdouble num F5F5 Wai% *uadrada( s*rt9.8F > /Q.8. ;I;LIOTECA s!li@.= Cal,ula o 4alor a@soluo !o ineiro i e !o real ! res%e,i4amene a@sint a@sint
;I;LIOTECA sring.= 3
Professora ANITA LOPES Con,aena !uas srings sr,astr2, str3F5 Co%ia o ,one>!o !e uma 4ari54el em oura 4ari54el sr,%<str2, str3F <; não é 'ermitido( str2 >str35;< Forne,e o n>mero !e ,ara,eres !e uma sring srlenstr2F Com%ara !uas srings devolve n$mero menor *ue 8 se str2 vier antes de str3 sr,m%str2, str3F devolve n$mero maior *ue 8 se str2 vier de'ois de str3 devolve 8 se str2 for igual X str3
$. Sa!a 7 objeto ,ou 'ermite *ue enviemos dados
,ou--J KJ/ ,ou--variavel--en!l/
&sando( using s!66,ou/
,ou--J KJ/ ,ou--variavel--en!l/
Não usando names'ace
s!66,ou--J KJ/ s!66,ou--variavel--en!l/
Conrole7Cara,er nulo nullF cam'ain)a bellF retrocesso bacOs'aceF tabulacao )ori%ontal nova lin)a neT lineF tabulacao vertical alimentacao de fol)a form feedF retorno de carro carriage returnF as'as "F a'ostrofo YF interrogacao F barra invertida =F
Sen,ia !e es,a%e a @ n 4 f r 0
4
Professora ANITA LOPES include iostream/ using names'ace std5 int mainF G cout"A'rendendo a usar 0cout0n" 5 77 o caracter 0 im'rime as'as na tela cout"7 o'erador de insercao se'ara os elementos *ue se desja colocar na telan"5 cout"7 caracter de controle n e*uivale a endl, alimenta lin)a"endl5 cout"&sando t =tim'rimese na 'ro4ima %ona=n"5 77 o caracter im'rime a'ostrofo na tela e o carcater im'rime na teal sZstem"'ause"F5 H
:. Consanes e 4ari54eis :.1 Consanes 7 C:: 'ossui *uatro ti'os bsicos de constantes( ineiras, de %ono fluuane, ,ara,eres e srings. Constantes inteiras e de 'onto flutuante re'resentam n$meros de um modo geral. :.1.1 Consanes ineiras As constantes inteiras na linguagem C :: 'odem ser escritas no formato !e,imal base 28F, =e9a!e,imal base 2VF ou o,al base [F. E4em'los( \ecimal( 23 7ctal ( 8QQ em decimal vale 3]. 7 %ero antes do n$mero caracteri%a a constante octalF ^e4adecimal( 84ff em decimal vale 3UU. 7 %ero e o 4 antes do n$mero caracteri%am a constante )e4adecimalF :.1.$ Consanes !e %ono fluuane #ão n$meros reais com um 'onto decimal e o'cionalmenteF um e4'oente. E4em'los6 5
Professora ANITA LOPES 2.[]V R]V.VU 2.3Qe9 2.e3 28.Ve2[ .[UQE:V] :.1.: Consanes ,ara,eres &ma constante caracter é uma letra ou símbolo colocado entre %li,as. E4em'lo6 _A_ _N_ _6_ _`_ _A_ As constantes caracter são arma%enadas como n$meros inteiros. Estes n$meros corres'ondem aos valores de cada caracter dentro do código A#C66. :.1. Consanes srings &ma constante string consiste de um conjunto de caracteres do código A#C66 'adrão ou estendido, colocados entre as%as !u%las. E4em'lo6 P&ALP PatemticaP PASWEN\EN\7 A SW7WAAW E C:: P Na linguagem, C :: uma string é um vetor de caracteres terminado com um caracter nulo. 7 caracter nulo é um caracter com valor inteiro igual a %ero código A#C66 igual a 8F. 7 terminador nulo também 'ode ser escrito usando a conven!ão de barra invertida do C como sendo Y=8Y. ,=ar nome*!a*sringQaman=oR/
Como 'recisamos reservar uma 'osi!ão 'ara o terminador, sem're iremos declarar o taman)o necessrio mais um. amos su'or *ue declaremos uma varivel de nome 'alavra de 22 'osi!+es c)ar 'alavra-2205 F e arma%enemos a 'alavra SW7WAA# nela.
bom ressaltar *ue a linguagem C :: não iniciali%a as variveis e toda célula não usada tMm valor indeterminado. N#o se esue"a !e ini,ialiHar as 4ari54eis !e seus %rogramas %ois ,oisas in,r4eis %o!em a,one,er As strings são consideradas vetores de caracteres matri% lin)aF. Como na atemtica, 'ara se acessar um determinado caracter de uma string, basta "inde4armos". 6
Professora ANITA LOPES str-20 > YoY str-30 > YaY No e4em'lo acima, 'ercebemos *ue o 'rimeiro caracter se encontra na 'osi!ão 8 em algumas linguagens, seria a 'osi!ão 2F. \esta forma, se inde4armos com 2, na verdade estaremos nos referindo ao segundo caracter da string5 se inde4armos com 3, na verdade estaremos nos referindo ao terceiro caracter da string e assim sucessivamente. :.1. Consanes Sim@li,as A atemtica define 'i como tendo o valor Q,2R2U93VU. uitas ve%es 'recisaremos definir algumas constantes em nossos 'rogramas. :.1..1 Consanes !efini!as %elo %rograma!or 7 'rogramador 'ode definir constantes simbólicas em *ual*uer 'rograma. #inta4e6
define nome / valor / 7nde !efine é uma diretiva de com'ila!ão *ue di% ao com'ilador 'ara trocar as ocorrMncias do te4to nome 'or valor . 7bserve *ue não ) 5 no final da instru!ão 'ois tratase de um comando 'ara o com'ilador e não 'ara o 'rocessador. A instru!ão define deve ser escrita antes da instru!ão de declara!ão da rotina 'rinci'al. 7 uso da diretiva !efine não se restringe a'enas 'ara declarar constante !efine %i :.11V$W F mas também 'odemos usla 'ara definir ma,ro insru"es !efine ,on4&9' &98%i71X' ou !efine ua!ra!o&9' &989' F. :.$ Yari54eis A varivel é um lugarendere!oF na memória 'rinci'al *ue arma%ena um dado e tem um nome associado 'ara facilitar a 'rograma!ão . Em C::, as variveis 'odem ser declaradas no inicio do 'rograma, mas 'oderemos também declarar dentro de algumas estruturas, diferentemente de outras linguagens. Estas variveis 'odem ser de vrios ti'os( in inteiroF, floa real de sim'les 'recisãoF , ,=ar caracter $nicoF, !ou@le real de du'la 'recisãoF. A classe Sring ser vista em outro momneto.
7
Professora ANITA LOPES Ti%o ,=ar in floa !ou@le
Taman=o 2 bZte R bZtes R bZtes [ bZtes
Iner4alo
Uso 23[ a 23] n$mero muito 'e*ueno e caracter A#C66 32R]R[QVR[ a 32R]R[QVR] contador, controle de la!o Q.ReQ[ a Q.ReQ[ real 'recisão de VdígitosF 2.]eQ8[ a 2.]eQ8[ científico 'recisão de 28 dígitosF
uando se define um ti'o de varivel, informamos ao com'utador *uanto de memória ser necessria 'ara arma%enar este dado e *ue ti'os de o'era!+es 'oderão ser reali%adas com este dado. Sara se declarar uma varivel, usamos a seguinte sinta4e( ti'o/ nomeIdaIvarivel 5 7 nome de uma varivel deve obedecer algumas regras( 2. 7 'rimeiro caracter 'ode ser uma letra mai$scula ou min$sculaF ou o caracter sublin)a. Aconsel)ase a não usar o caracter sublin)a no inicio 'ara não confundir com algumas fun!+es. 3. 7s demais caracteres, letras algarismos ou o caracter sublin)a. E4em'los( in a/ floa 'eso/ ,=ar se4o/ in idade2, idade3/ :.$.1 Pala4ras reser4a!as E4istem certos nomes *ue não 'oderão ser usados como identificadores. #ão c)amadas as 'alavras reservadas e são de uso restrito da linguagem C::. :.$.$ Ti%os mo!ifi,a!os Além dos ti'os de dados mencionados, e4istem os modificadores( long, s)ort, signed e unsigned. `i'icamente o modificador long aumenta o n$mero de bZtes usados 'ara o registro do n$mero. 7 modificador unsigned, usado somente em inteiros, 'ermite *ue um @i usado 'ara guardar o sinal do n$mero seja usado 'ara guardar o valor do n$mero. Ti%o Taman=o &@<es' Iner4alo unsigned c)ar 2 8 a 3UU unsigned int 3 8 a VU UQU unsigned long int R 8 a R 39R 9V] 39U long int intF R 3 2R] R[Q VR[ a 3 2R] R[Q VR] s)ort int 3 Q3]V[ a Q3]V] long double 28 Q.ReR9Q3 a 2.2eR9Q3 7bserva!ão( Alguns outros ti'os são 'ossíveis em 6#7 C98 :.$.: Con4ers#o !e i%o &Casing ' 8
Professora ANITA LOPES Algumas ve%es *ueremos, momentaneamente, modificar o ti'o de dado re'resentado 'or uma varivel, isto é, *ueremos *ue o dado seja a'resentado em um ti'o diferente do *ual a varivel foi inicialmente declarada. Sor e4em'lo( ao fa%ermos uma divisão entre dois inteiros, a linguagem C:: trunca a 'arte fracionria e 'odemos desejar *ue isto não aconte!a. Este 'rocedimento é c)amado de ,on4ers#o !e i%o ou casting . #inta4e( &i%o ' varivel onde ti'o é o nome do ti'o ao *ual *ueremos converter o dado arma%enado em varivel. E4em'lo( #include
using namespace std; int main() { cout<<"\nNumero 7 DIVIDIDO por " ; cout<<"\n\nsem con!ersao "<<7<<"\tcom con!ersao "<< ($loat)7<<"\n\n"; s%stem("pause");
}
:.$. Yari54el %oneiro Nós j sabemos *ue uma varivel é um endere!o na S *ue arma%ena um dado. bom dei4ar claro *ue não é um $nico endere!o, 'ois, de'endendo do ti'o, 'oderemos estar alocando 2, 3, R, [ ou mais 'osi!+es 'ara cada varivel como vimos na $ltima tabela. &ma varivel 'onteiro arma%ena o endere!o de outra varivel. ais adiante estudaremos este ti'o de varivel uma ve% *ue se não trabal)armos bem com este ti'o de varivel, não conseguiremos 'rogramar bem na linguagem C ::.
. Ari@ui"#o Consiste em atribuir um valor a uma varivel. Em C ::, o comando de atribui!ão tem a seguinte sinta4e( nomeIdaIvarivel / Z conte$do/ 5 E4em'los( a Z 23 / 'eso Z VU.3/ se4o Zf/ idade2 Z 32/ idade3 Z QR/ 7bserva!ão 2( Em C::, é 'ossível declarar e iniciali%ar uma varivel( in a Z 23/ 7bserva!ão 3( Em C::, é 'ossível iniciali%ar vrias variveis( 4 Zt Zs Z 8/ 9
Professora ANITA LOPES Na atribui!ão m$lti'la as o'era!+es ocorrem da !ireia 'ara a esuer!a, isto é, inicialmente o valor 8 é atribuído a s, de'ois o valor de s é atribuído a t e, 'or $ltimo, o valor de t é atribuído a 4. .1 Ari@ui"#o m>li%la. A linguagem C:: 'ermite *ue se atribua um valor a muitas variveis. em uma $nica instru!ão. #inta4e6 varI2 > -varI3 > ... 0 > valor5 E4em'lo( a > b > 85
. Enra!a !e !a!os s,anf .1 ,in
,innomedavarivel/ ,innomedavarivel2 nomedavarivel3/ 7 objeto ,in 'ermite *ue o usurio digite dados através do dis'ositivo 'adrão de entrada( teclado. 7 o'erador é c)amado de e4tra!ão. #include using namespace std; int main() { int idade; $loat altura; cout<<"\nDigite idade " ; cin>>idade; cout<<"\nDigite altura " ; cin>>altura; cout<<"\n\n\nIdade "<
}
#include using namespace std; int main() 10
Professora ANITA LOPES {
-
c'ar seo; c'ar nome*+; cout<<"\nDigite nome " ; cin>>nome; cout<<"\nDigite seo(m$) " ; cin>>seo; s%stem("pause"); s%stem("cls"); cout<<"\nNome; "<
7 objeto cin *uando lM um vetor de c)arstringF termina a leitura no 'rimeiro es'a!o, dei4ando WENA`7 no buffer. uando um outro cin 'ara ler o se4o é e4ecutado, o teclado não é liberado e a letra W é Ka'an)adaP e arma%enada na varivel se4o. Sor estas ra%+es, 'recisamos con)ecer outros métodos. .$ ,in.geline Este método 'ermite a leitura de um vetor de c)ar inclusive com es'a!os e não dei4ando nada no buffer. #inta4e( ,in.geline& nome do vetor de caracteres/ taman)o2/ '/ #include using namespace std; int main() { c'ar seo; c'ar nome*+; cout<<"\nDigite nome " ; cin.getline(nome/01); cout<<"\nDigite seo(m$) " ; cin>>seo; cout<<"\n\n\nNome "<
.: ,in.ge Este método 'ermite a leitura de um c)ar. 11
Professora ANITA LOPES #inta4es( ,in.ge&nome da varivel c)ar'/ ,in.ge&'/ A 'rimeira sinta4e serve 'ara ler uma varivel do ti'o c)ar, mas dei4a en*u*nto *ue o objeto ,in sem're libera o teclado 'ara o usurio digitar. #include using namespace std; int main() { c'ar seo2/seo0; cout<<"\nDigite seo(m$) " ; cin.get(seo2); cout<<"\nDigite seo(m$) " ; cin.get(seo0); cout<<"\n\n\n,eo "<
enter no buffer
#include using namespace std; int main() { c'ar seo2/seo0; cout<<"\nDigite seo(m$) " ; cin>>seo2; cout<<"\nDigite seo(m$) " ; cin>>seo0; cout<<"\n\n\n,eo "<
N#o se sur%reen!a se e,onrar alguns @ugs uan!o usar ,in ,in.ge&' ou ,in.geline&' em alguns ,om%ila!ores. N#o gosa !e usar
s
Ye3a o e9em%lo a@ai9o6
#include using namespace std; int main() { c'ar seo2/seo0; cout<<"\nDigite seo(m$) " ; cin>>seo2; cout<<"\nDigite seo(m$) " ; cin>>seo0; cout<<"\n\n\n,eo "<
12
Professora ANITA LOPES
W. O%era!ores ArimBi,os E4istem cinco o'eradores aritméticos em C ::. Cada o'erador aritmético est relacionado a uma o'era!ão aritmética elementar( adi!ão, subtra!ão, multi'lica!ão e divisão. E4iste ainda um o'erador \F c)amado o'erador de m!ulo cujo significado é o resto da divisão inteira. O%era!or + ] 8 7 \
O%era"#o adi!ão subtra!ão multi'lica!ão divisão módulo resto da divisão inteiraF
#inta4e6 o'erando2
o%era!or o'erando3
onde o'erador é um dos símbolos mostrados acima e o'erando é uma constante ou um identificador de varivel. E4em'los6 23 + U / 2] 23 8 U / V8 23 7 U / 3 uan!o se !i4i!e !ois ineiros o resula!o B um ineiro 23 \ U / 3 resto da divisão inteira 7bserva!ão( #e vocM 'recisar dividir dois n$meros inteiros e *uiser a res'osta em real, e4iste duas saídas( 2 Colo*ue um 'onto em um dos o'erandos caso, 'elo menos um, seja uma constante( 1$ 7 . . 3 Caso os dois o'erandos sejam variveis, fa!a( &floa' a7@ . Não e4iste em C::, como e4iste em outras linguagens, um o'erador es'ecífico 'ara a o'era!ão de 'otencia!ão a bF. E4iste, 'orém, uma fun!ão de biblioteca %o?&......'F *ue reali%a esta o'era!ão, ou vocM 'oder criar *uando a'render a usar as fun!+es log e e9%.. W.1 ^ieraruia !as o%era"es 13
Professora ANITA LOPES Caegoria 'arMnteses fun!ão incremental, lógico aritmético aritmético relacional relacional lógico lógico condicional atribui!ão W.$
O%era!ores F nomeF :: ; /> >> > @@ ?? ( > :> > ;> <> D>
Priori!a!e interno e4terno E \ E \ E \ E \ E \ E \ E \ E \ E \ E \ →
→
←
→
→
→
→
→
→
←
←
O%era!ores !e Ari@ui"#o ArimBi,a
uitas ve%es *ueremos alterar o valor de uma varivel reali%ando alguma o'era!ão aritmética com ela. A linguagem C :: a'resenta instru!+es otimi%adas com o uso de o'eradores ditos o'eradores de atribui!ão aritmética. 7s símbolos usado são +Z, ]Z, 8Z, 7Z , \ZF. #inta4es6 var +Z e4' 5 var > var : e4' 5 var ]Z e4' 5 var > var e4' 5 var 8Z e4' 5 var > var ; e4' 5 var 7Z e4' 5 var > var < e4' 5 var \Z e4' 5 var > var D e4' 5 onde var é o identificador da varivel
são e*uivalentes as seguintes(
e e4' é uma e4'ressão vlida. Estas instru!+es
14
Professora ANITA LOPES E4em'los( Ari@ui"#o ArimBi,a cont +Z 25 j ]Z i 5 num 8Z 2 : O5 divide 7Z U5 resto \Z 35
Insru"#o Eui4alene cont > cont : 25 j > j i 5 num > num ; 2 : OF5 divide > divide < U5 resto > resto D 35
7 o'erador de atribui!ão aritmética tem 'recedMncia menor *ue os outros o'eradores até a*ui discutidos. W.:
O%era!ores In,remenais
Em 'rograma!ão e4istem instru!+es muito comuns c)amadas de incremento e decremento. &ma instru!ão de incremento adiciona uma unidade ao conte$do de uma varivel. &ma instru!ão de decremento subtrai uma unidade do conte$do de uma varivel. E4istem, em C::, o'eradores es'ecíficos 'ara reali%ar as o'era!+es de incremento ::F e decremento F. Eles são genericamente c)amados de o'eradores incrementais. #inta4e6 Insru"#o Eui4alene ++ 4ar/ var > var : 25 4ar ++ / var > var : 2 ; ]] 4ar / var > var 2/ 4ar ]] / var > var 2/ onde var é o nome da varivel da *ual se *uer incrementar ou decrementar um unidade. 7bserve *ue e4iste duas sinta4es 'ossíveis 'ara os o'eradores( 'odese colocar o o'erador como %refi9o ou como sufi9o. Nos dois casos o valor da varivel ser incrementado ou decrementadoF de uma unidade. Sorém se o o'erador for colocado como %refi9o, o valor da varivel ser incrementado ou decrementadoF anes *ue a varivel seja usada em alguma outra o'era!ão. Caso o o'erador seja colocado como sufi9o, o valor da varivel ser incrementado ou decrementadoF !e%ois *ue a varivel for usada em alguma outra o'era!ão. #include using namespace std; int main() { int n/n2/n0/pre/su$; cout<<"\nnumero"; cin>>n; n24n; para nao perder o !alor de n n04n; para nao perder o !alor de n pre455n2; cout<<"\n\npre$io4 "<
} 15
Professora ANITA LOPES
W.
O%era!ores 2ela,ionais e Lgi,os
As e4'ress+es lógicas usadas nas estruturas de teste são formadas 'elos o'eradores relacionais e lógicos. W..1 O%era!ores rela,ionais 7'eradores relacionais verificam a rela!ão de magnitude e igualdade entre dois valores. #ão seis os o'eradores relacionais em C( O%era!or Z -Z ZZ Z
Signifi,a!o maior *ue menor *ue maior ou igual a menor ou igual a igual a diferente de
#inta4e6
e4'ressãoI2 o%era!or e4'ressãoI3 onde e4'ressãoI2 e e4'ressãoI3 são duas e4'ress+es numéricas *uais*uer, e o'erador
é um dos o'eradores relacionais.
Ao contrrio de outras linguagens, em C:: não e4istem ti'os lógicos, 'ortanto o resultado de uma e4'ressão lógica é um valor numérico( uma e4'ressão avaliada verdadeira recebe o valor 2, uma e4'ressão lógica avaliada falsa recebe o valor 8. 7s o'eradores relacionais de igualdade ZZ e ZF tem 'recedMncia menor *ue os de magnitude , -, Z e -ZF. Estes, 'or sua ve%, tem 'recedMncia menor *ue os o'eradores aritméticos.
16
Professora ANITA LOPES W..$ O%era!ores lgi,os #ão trMs os o'eradores lógicos de C( __, `` e . Estes o'eradores tMm os mesmos significados dos o'eradores lógicos Booleanos AN\, 7W e N7`. #inta4es6 e4'rI2 __ e4'rI3 e4'rI2 `` e4'rI3 e4'r
onde e4'rI2 , e4'rI3 e e4'r são e4'ress+es *uais*uer. 7bserve *ue os o'eradores lógicos atuam sobre e4'ress+es de *uais*uer valores. Sara estes o'eradores todo valor numérico diferente de 8 é considerado 2. O%era!or conjun!ão disjun!ão nega!ão
Maem5i,a e ou v n#o `
C __ ``
TA;ELA YE2DADE DO OPE2ADO2 __ #u'on)a duas 'erguntas feitas a *uatro 'essoas. #e a res'osta do candidato for negativa, dever falar , caso contrrio, falar 1. #u'on)a também *ue só ser c)amado 'ara entrevista o candidato *ue dominar as duas linguagens. Yo, ,on=e,e C++ Yo, ,on=e,e PASCAL SADA 1 1 1 1 1 Neste e4em'lo, somente o *uarto candidato seria c)amado 'ara a entrevista, 'ois o o'erador __ eF, só considera a e4'ressão como verdadeira se todas as e4'ress+es testadas forem verdadeiras. TA;ELA YE2DADE DO OPE2ADO2 `` #u'on)a duas 'erguntas feitas a *uatro 'essoas. #e a res'osta do candidato for negativa, dever falar , caso contrrio, falar 1. #u'on)a também *ue ser c)amado 'ara entrevista o candidato *ue dominar 'elo menos uma linguagem.
17
Professora ANITA LOPES Yo, ,on=e,e C++ Yo, ,on=e,e bAYA 1 1 1 1
SADA 1 1 1
Neste e4em'lo, somente o 'rimeiro candidato não seria c)amado 'ara a entrevista , 'ois o o'erador `` ouF, considera a e4'ressão como verdadeira se, 'elo menos uma e4'ressão testada for verdadeira. 7bserva!ão(7 7'erador __ tem 'recedMncia sobre o o'erador ``. Estes dois tMm 'recedMncia menor *ue os o'eradores relacionais. TA;ELA YE2DADE DO OPE2ADO2 #u'on)a uma 'ergunta feita a duas 'essoas. #e a res'osta do candidato for negativa, dever falar , caso contrrio, falar 1. Yo, N#o ,on=e,e C++ SADA 1 1 7bserva!ão( 7 o'erador tem a mesma 'recedMncia *ue os o'eradores incrementais.
c. Esruuras !e sele"#o ] if 7 s?i,= Nossos 'rogramas até agora seguiram um mesmo 'adrão( entravase com dados, estes eram 'rocessados e alguma informa!ão era mostrada na tela. Agindo desta forma, o com'utador mais 'arecia uma m*uina de calcular. 7 a'rendi%ado de novos conceitos como a da estrutura de sele!ão nos dar uma visão maior da com'le4idade de tarefas *ue ele 'oder e4ecutar. c.1
Esruura !e !e,is#o ] if...else
A estrutura if...else é uma estrutura de controle do C:: muito fcil de ser usada. A'ós o teste, o flu4o 'oder seguir dois camin)os, isto é, se o teste resultar em uma verdade, ser e4ecutado o comando ou bloco de comandos *ue se encontra a'ós o fec)a 'arMnteses do teste, caso contrrio, se e4istir, ser e4ecutado o comando ou bloco de comandos *ue se encontra a'ós o comando else.
18
Professora ANITA LOPES c.1.1 Esruura !e !e,is#o ,om um @lo,o #inta4e6 ifcondi!ão F (
onde(
bloco
)
condi!ão é uma e4'ressão lógica ou relacional. bloco é um conjunto de instru!+es, se'aradas 'or 'ontoevírgula.
( e ) só serão obrigatórias se tiver mais de uma a!ão 'ara ser e4ecutada. #e a condi!ão for 4er!a!eira, o e4ecutado.
bloco é
e4ecutado. Caso contrrio, o bloco não é
c.1.$ Esruura !e !e,is#o ,om !ois @lo,os #inta4e6 ifcondi!ão F (
bloco
bloco
) else (
)
onde(
condi!ão é uma e4'ressão lógica ou relacional. bloco 2 e bloco 3 são conjuntos de instru!+es.
#e a condi!ão for 4er!a!eira o e4ecutado.
bloco 2 é
e4ecutado. Caso contrrio, o
bloco 3 é
c.1.: De,is#o !e m>li%los @lo,os &if...else if...' uitas ve%es, nossos 'rogramas 'oderão envolver vrias condi!+es e4cludentes. Srogramas *ue envolvem fai4as salariais ou fai4as de idades são e4em'los clssicos do uso da instru!ão if ... else if ... . #inta4e( \ecisão de m$lti'los blocos( 19
Professora ANITA LOPES ifcondi!ão 2 F ( bloco 2
) ... else ifcondi!ão N F ( onde(condi!ão 2, lógicas ou relacionais. instru!+es.
bloco N
) else ( )
condi!ão 3, ... são e4'ress+es bloco 2 , bloco 3,... são conjuntos de
bloco S
#e a condi!ão 2 for 4er!a!eira o bloco 2 é e4ecutado. Caso contrario, as condi!+es serão avaliadas, sucessivamente até *ue seja verdadeira ou c)egue ao $ltimo else, onde o bloco S seria e4ecutado. 7bserve *ue a'enas um dos blocos é e4ecutado. c.$
Esruura s?i,=...,ase
A estrutura s?i,=...,ase também con)ecida como alternativa de m$lti'las escol)as, é uma estrutura *ue sim'lifica nossos 'rogramas no uso de decisão de m$lti'los blocos *uando a e4'ressão de controle a condi!ãoF envolver ti'os in ou ,=ar &de um caracter *ue também é considerada inteira'. 7 resultado desta e4'ressão é com'arado ao valor de cada um dos rótulos, e os comandos são e4ecutadas a 'artir desde rótulo. #inta4e( s?i,=&e4'ressão ' ( ,ase rótuloI2 6(
bloco25 @read/) ,ase rótuloI3 6( bloco35 @read/)
... ,ase rótuloIn 6( bloco n5 @read/)
-!efaul(G bloco d 5H ) 20
Professora ANITA LOPES onde(
e4'ressão é uma e4'ressão inteira ou c)ar de um caracter . rótuloI2,rótuloI3,...rótuloIn e rótuloId são constantes inteiras ou c)ar de um caracter . bloco 2, bloco 3, ..., bloco n e bloco d são conjuntos de instru!+es.
E9e,u"#o6 A e4'ressão é avaliada e o flu4o desviado 'ara o conjunto cujo rótulo é igual ao resultado da e4'ressão. 7 bloco abai4o do rótulo é e4ecutado. #e o valor da e4'ressão não for igual a nen)um rótulo, o bloco do defualt é e4ecutado. ocM não é obrigado a colocar o rótulo do default e 'or esta ra%ão ele se encontra entre os sinais de menor e maior. Por ue usar @read Normalmente, em outras linguagens de 'rograma!ão, a'ós a avalia!ão da e4'ressão e a e4ecu!ão do bloco corres'ondente, o flu4o do 'rograma 'assa 'ara a 'roY4ima instru!ão, ignorando todos os outros rótulos. Na linguagem C :: isto não acontece e 'oder tra%er sérias conse*Mncias em seus 'rogramas. 7 uso do @read for!ar a saída do comando sTitc) e a e4ecu!ão do 'ró4imo comando. E9isir5 alguma siua"#o ue n#o ser5 ne,ess5rio usar @read #im. Lembrese do e4ercício dos triMnios.
X. Esruuras !e re%ei"#o `rMs são as estruturas de re'eti!ão dis'oníveis na linguagem C ::( for, ?=ile e !o ... ?=ile. Em todas as estruturas estar 'resente 'elo menos uma e4'ressão 'ara controlar a re'eti!ão. X.1 Estrutura de re'eti!ão( for A estrutura do for é a mais sim'les estrutura de re'eti!ão e é usada 'ara re'etir um ou vrios comandos tantas ve%es *uanto desejarmos. a estrutura mais indicada *uando o n$mero de re'eti!+es for con)ecido embora, as outras duas estruturas também 'ossam ser usadas. 7 controle do n$mero de re'eti!+es, na maioria das ve%es, é feito 'or uma varivel c)amada de varivel contadora. A estrutura do for na linguagem C :: é um 'ouco diferente das demais linguagens, 'ois a condi!ão 'ode não se 'render somente a uma varivel contadora.
21
Professora ANITA LOPES #inta4es( for &iniciali%a!ão/ iniciali%a!ão/condi!ão/ condi!ão/incremento' incremento' declara!ão/ declara!ão/ for &iniciali%a!ão /condi!ão /incremento' incremento' ( bloco de comandos ) onde(
é uma e4'ressão de iniciali%a!ão da iniciali%a!ão é
varivel contadora e só é
e4ecutada uma ve%.. é uma e4'ressão lógica de controle de re'eti!ão. condi!ão é é uma e4'ressão de incremento da varivel contadora. incremento é é um conjunto de instru!+es a ser e4ecutado. bloco de comandos é
X.$ Estrutura de re'eti!ão( ?=ile re'eti!ão( ?=ile A estrutura ?=ile é uma uma estr estrut utur uraa "'od "'oder eros osa" a" da 'rog 'rogra rama ma!ã !ão. o. uit uitos os 'rogramadores fa%em uso somente desta estrutura. Ela testa 'rimeiro a condi!ão e 'oder nem e4ecutar o bloco caso a condi!ão seja falsa. Logo, a estrutura do T)ile re'ete en*uanto a condi!ão for verdadeira . im'ortante *ue a varivel 'resente na condi!ão ten)a ten)a seu valor alterado dentro da re'eti!ão, 'ois, caso contrrio, entrar em loo'. Normalmente, todos os autores mostram sim'lesmente a sinta4e da estrutura, mas es*uecem de informar como na 'rtica ela dever ser escrita. Abai4o, a'resentarei a sinta4e geral e a sinta4e usada na 'rtica( #inta4e ?=ile&condi!ão ' ( )
bloco de comandos
#inta4e na 'rtica atribui!ão ou leitura da varivel 'resente na condi!ão ?=ile&condi!ão ' ( bloco de comandos
) onde(
atribui!ão ou leitura leitura da varivel 'resente na condi!ão condi!ão
lógica ou numérica. numérica. condi!ão é uma e4'ressão lógica bloco de comandos é um conjunto de instru!+es.
22
Professora ANITA LOPES X.:
Estrutura de re'eti!ão( !o...?=ile
Esta estrutura estrutura é 'arecida 'arecida com T)ile. #ua diferen!a diferen!a é *ue o bloco é e4ecutado 'elo menos uma ve%, 'ois testa ao final . Esta estrutura re'ete en*uanto a condi!ão for verdadeira . #inta4e( !o ( bloco de comandos
) ?=ile&condi!ão '/ '/ onde(
é uma e4'ressão lógica ou numérica. condi!ão é bloco de comandos é um conjunto de instru!+es.
X. Coman!os asso,ia!os As estruturas de re'eti!ão 'odem, mas em sua se*Mncia normal.
não devem ,
sofrer !es4ios e inerru%"es
X..1 @read Assim como o foi usado 'ara interrom'er o comando sTitc), 'oder ser usado com *ual*uer um dos trMs comandos de re'eti!ão.
V Esruuras As estruturas em C :: 'odem ser )omogMneas )omogMneas e )eterogMneas. 6nicialmente, vamos abordar as )omogMneas, 'ois são mais familiares uma ve% *ue con)ecemos seu conceito da matemtica *uando estudamos matri%es. V.1 Esruuras =omogneas Em C::, o uso de matri%es é de fundamental im'ort1ncia e e4iste uma relacionamento estreito entre matri%es e 'onteiros *ue *ue estudaremos mais adiante. A gran grande de novid novidad adee *ue *ue estu estuda dare remo moss ser ser o uso uso de matri matri%e %ess com com estr estrut utur uras as )eterogMneas. As matri%es matri%es são tabelas tabelas na S e 'odem ter uma uma ou mais dimensão. dimensão. uando uando tem somente uma dimensão, também c)amamos de vetor.
23
Professora ANITA LOPES Na linguagem C ::, como j vimos, uma varivel ,=ar ,*ue ,=ar ,*ue 'recisa arma%enar mais de um caracter, fa% uso de matri%, 'ois 'odemos acessar cada um de seus caracteres em se'arado, usando o nome da varivel e sua 'osi!ão entre colc)etes. Sor *ue ser *ue na linguagem C :: a 'osi!ão do 'rimeiro caracter é 7 endere!o guardado é o do 'rimeiro caracter *ue c)amamos de @ase, @ase, logo *ual*uer outro caracter ser acessado 'elo endere!o base mais sua 'osi!ão. #e o endere!o é o da 'rimeira 'osi!ão, somente o 'oderia ser acrescido 'ara 'ermanecer na mesma 'osi!ão.
#e declararmos %al com %al com taman)o U, lembrese de *ue só 'odemos usar R 'osi!+es, 'ois uma reservada 'ara o finali%ador *ue *ue indica o fim do vetor. bom vocM j ir se acostumando com este conceito de a'ontamento, 'ois 'ara se 'rogramar bem em C, 'recisaremos dominar o conceito de %oneiros. %oneiros. V.1.1 De,laran!o uma mariH6 ti'o nome do conjunto Q ... R Q ...R ... / E4em'los( 78 declara uma matri% unidimensional de U elementos inteiros 87 in numQ numQ U R/ 78 declara uma matri% bidimensional com 288 lin)as e R colunas do ti'o float 87 floa notas Q 288 RQ 288 RQ R R/ 78 declara uma matri% bidimensional com 288 lin)as e Q8 colunas do ti'o c)ar 87 ,=ar nomes Q 288 RQ 288 RQ Q8 R/ Q8 R/ `oda matri% 'ara guardar nomes, na linguagem C ::, é bidimensional, 'ois o 'rimeiro índice indica a *uantidade de nomes e o segundo o n$mero de caracteres 2 *ue serão serão arma%enados em cada nome. V.1.$ ArmaHenameno 7 arma%enamento na matri% 'oder ser feito através de um comando de leitura ou de atribui!ão.
24
Professora ANITA LOPES V.1.$.1 Leiura 6um dimensao 6 ... $or(a4*;a>nomeVetora+; ... 6duas dimensoes 6 ... $or(84*;8>nomeatri=8+c+; ...
V.1.$.$ Ari@ui"#o Sodemos também iniciali%ar as matri%es através de atribui!+es( E4em'los( in vet-R0>GV,],[,9H/ floa nota-Q0>G[.U,V.3,9.[H/ ,=ar nome-230>"oão Wenato"/ ,=ar nomes-R0-Q80>G"7h7", "AW6A", "SE\W7","6L6SE"H/ in mat-0-Q0>G2,3,Q,R,U,V,],[,9H/ 78 na declara!ão using namespace std; int main() {int 8/c; int iasmeses+20]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30, 31,30,31,31,30,31,30,31}; cout<<"\n\n?ara anos nao 3issetos/ primeira lin'a e para 3issetos/ segunda lin'a\n\n"; $or(84*;8<0;855) { $or(c4*;c<20;c55) cout<
25
Professora ANITA LOPES
V.1.: Sa!a 6um dimensao @ &ABIC 9O8N&6 6um dimensao @ &ABIC 8INE&6 ... ... s%stem(cls:); s%stem(cls:); cout<<:\nAitulo\n:; cout<<:\nAitulo\n:; $or(a4*;ac) elementos a3aio da diagonal principal
V.1. MariHes somaLin=a e somaColuna 26
Professora ANITA LOPES
V.1..1 MariH somaLin=a uma matri% unidimensionalvetor ou matri% colunaF *ue ter tantas lin)as *uantas forem as lin)as da matri% original e cada elemento ser a soma de todos os elementos da lin)a corres'ondente na matri% original. Em outras 'alavras, cada elemento soma de todos os elementos das colunas de uma lin)a. V.1..1.1 Ini,ialiHan!o a mariH somaLin=a Como é uma matri% de acumuladores 'recisa ser iniciali%ada. for&LZ/ L-aman=oLin=a/ L++' somaLin=aQLRZ/ V.1..1.$ Geran!o a mariH somaLin=a for&LZ/L- aman=oLin=a/L++' for&CZ/C- aman=oColuna/C++' somaLin=aQLR+ZmaQLRQCR/ V.1..1.: Im%rimin!o a mariH somaLin=a soHin=a for&LZ/L- aman=oLin=a/L++' ,ou--somaLin=aQLR--JnJ/ ,ou--en!l/ V.1..1. Im%rimin!o a mariH somaLin=a ,om a mariH original s
Professora ANITA LOPES uma matri% unidimensionalvetor ou matri% lin)aF *ue ter tantas colunas *uantas forem as colunas da matri% original e cada elemento ser a soma de todos os elementos da coluna corres'ondente na matri% original. Em outras 'alavras, cada elemento é a soma de todos os elementos das lin)as de uma coluna. V.1..$.1 Ini,ialiHan!o a mariH somaColuna Como é uma matri% de acumuladores 'recisa ser iniciali%ada. for&,Z/ ,-aman=oColuna/ ,++' somaLin=aQ,RZ/ V.1..$.$ Geran!o a mariH somaColuna for&LZ/L- aman=oLin=a/L++' for&,Z/,- aman=oColuna/,++' somaColunaQ,R+ZmaQLRQ,R/ V.1..$.: Im%rimin!o a mariH somaColuna soHin=a for&,Z/L- aman=oColuna/,++' ,ou--somaColunaQ,R--JJ/ ,ou--en!l/ V.1..$. Im%rimin!o a mariH somaColuna ,om a mariH original s
V.1. O%era"es 28
Professora ANITA LOPES Em rela!ão Xs matri%es numéricas, 'odemos reali%ar todas as o'era!+es *ue j con)ecemos com matri%es( 'roduto escalar, soma, subtra!ão, multi'lica!ão 'or escalar, multi'lica!ão de matri%es, clculo do determinante, etc. V.1.W Or!ena"#o rios são os métodos de ordena!ão. Alguns são mais eficientes e mais com'licados e outros menos eficientes 'ara um grande conjunto de dados, 'orém mais sim'les. Sara *ue 'ossamos ordenar nomes, 'recisaremos con)ecer duas fun!+es *ue fa%em 'arte da biblioteca sring.=( Fun"#o sr,m% Esta fun!ão tem dois argumentos do ti'o vetor de ,=arou cadeia de caracteresF. 7s argumentos são com'arados e é devolvido um dos resultados( K sr,m%&arg1arg$'K se os dois argumentos forem iguais. n$mero se o 'rimeiro argumento vier na ordem alfabética de'ois do segundo. n$mero - se o 'rimeiro argumento vier na ordem alfabética antes do segundo. O@ser4a"#o6 ocM deve estar estran)ando a necessidade desta fun!ão, mas na linguagem C::, como j falamos a varivel vetor de ,=ar é um endere!o, e não tem sentido com'aramos endere!os. , 'ortanto, e9%ressamene %roi@i!o usar o%era!ores rela,ionais %ara ,om%arar ese i%o !e 4ari54el. Fun"#o sr,%< Esta fun!ão tem dois argumentos( o 'rimeiro é o destino e o segundo, a origem. Co'ia a origem no destino. sr,%<&arg1arg$'/ O@ser4a"#o6 , 'ortanto, e9%ressamene %roi@i!o usar ,oman!o !e ari@ui"#o ese i%o !e 4ari54el. 2( Or!ena"#o %or Inser"#o 7rdena a matri% somente *uando realmente for necessrio. for( L = 1 ; L < tamanho; L++) { tmp= nomeVetor[L]; for (c = L; c 0 !! tmp < nomeVetor[c"1]; c"") nomeVetor[c] = nomeVetor[c"1] ; nomeVetor[c] = tmp ; } 29
Professora ANITA LOPES 3( Or!ena"#o %or Sele"#o Locali%a *ual elemento deve ficar na 'osi!ão 8, na 'osi!ão 2, etc. for(L=0;L
Q( Or!ena"#o ;u@@le Sor Come!ando da base 'ara o to'o. for( L = 0 ; L < tamanho "1; L++) for (c = tamanho "1; c L; c"") #f(nomeVetor[c"1] nomeVetor[c]) {a%& = nomeVetor[c]; nomeVetor[c] = nomeVetor[c"1]; nomeVetor[c"1] = a%&; }
;u@@le Sor
$et[L]=a%&;
Come!ando do to'o 'ara base. for( L = 0 ; L < tamanho "1; L++) for (c = L+1; c < tamanho; c++) #f(nomeVetor [L] nomeVetor [c]) {a%& = nomeVetor[L]; nomeVetor[L] = nomeVetor[c]; nomeVetor[c] = a%&; }
Com%aran!o os rs mBo!os Inser"#o Sele"#o \uas ve%es mais com'ara!+es e o esmo n$nero de com'ara!+es e mesmo n$mero de movimentos. taman)o ve%es mais movimentos.
MBo!os !e or!ena"#o mais efi,ienes R( Or!ena"#o Merge Sor &ne metades de vetores em um vetor ordenado. tam = 1; ''#ntercaa %*$etore e tamanho 1 h#e (tam < tamanho ) { a1 = - = 0; h#e ((a1 + tam) < tamanho ) { a2 = a1 + tam; %1 = a2 " 1; %2 = (a2+tam"1 < tamanho) . a2+tam"1 / tamanho"1; for(# = a1, = a2; # <= %1 !! <= %2; -++) #f (nomeVetor[#] <= nomeVetor[]) a%&[-] = nomeVetor[#++]; ee a%&[-] = nomeVetor[++]; for( ; # <= %1; -++) a%&[-] = nomeVetor[#++]; for( ; <= %2; -++) a%&[-] = nomeVetor[++]; a1 = %2+1; } ''cop#a o retante e & em a%& for(# = a1; - < tamanho; #++) a%&[-++] = nomeVetor[#]; ''cop#a a%& em & for(# = 0; # < tamanho; #++) nomeVetor[#] = a%&[#]; 30
Professora ANITA LOPES tam = 2; }
U( Or!ena"#o ui,d Sor \ivide o vetor em duas 'artes( uma contem valores menores ou iguais a uma c)ave e a outra, valores maiores. $o# part#c#ona(#nt &[], #nt #n#c#o, #nt f#m, #nt p) { #nt a, temp, #, f; a = &[#n#c#o]; f = f#m; # = #n#c#o; h#e ( # < f ) { h#e ( &[#] <= a !! # < f#m ) #++; h#e ( &[f] a ) f""; #f ( # < f ) { temp = &[#]; &[#] = &[f]; &[f] = temp; } } &[#n#c#o] = &[f]; &[f] = a; p = f; } $o# %#c-ort(#nt &[], #nt #n#c#o, #nt f#m) { #nt ; #f (#n#c#o = f#m ) ret%rn; part#c#ona(&, #n#c#o,f#m,!); %#c-ort(&, #n#c#o,"1); %#c-ort(&,+1, f#m); }
V.1. Pesuisa V.1..1 Seen,ial Este método é o mais sim'les, 'ois come!a no 'rimeiro elemento só 'ara *uando encontra ou c)ega ao final. co%t<<4n5%a 666 a er proc%rao(a). ; c#nnome7roc%ra; acho%=0; for(L=0;L< !! acho%==0;L++) { #f(nmat==mat[L]) { acho%=1; po=L; } 31
Professora ANITA LOPES } #f(acho%==1) co%t<<4n666 achao(a) na po#cao/ <
V.1..$ ;in5ria Este método ser mais eficiente se o conjunto estiver ordenado . Baseiase em redu%ir o es'a!o a ser 'es*uisado. 2. 6nicialmente, a'ontase 'ara o centro da tabela. Como se fa% isto #u'on)a um vetor de [ elementos( centro > 8 : ]F <35 <; valor Q ;< 3. \e'ois, 'erguntamos se o elemento 'es*uisado é igual ao *ue est sendo a'ontado. #e não for, continuase com a 'es*uisa. Q. #e continuarmos com a 'es*uisa, verificamos se o elemento 'es*uisado é maiormenorF do o *ue est sendo a'ontado. R. #e for, calculamos o novo centro( #e não for(
centro > 'osi!ão do a'ontador :2 :]F <35 centro > 8 : 'osi!ão do a'ontador 2F <35
U. E assim, sucessivamente até ac)armos, ou não. #include #de$ine N L using namespace std; int main() { int 8/c/inicio/$im/meio/!etN+/au/procura; $or(84*;8>!et8+; 6OBDFN&6 $or(84*;8!etc+) {au4!et8+; !et8+4!etc+; !etc+4au; cout<<"\n\n\nVFAOB OBDFN&DO\n\n"; $or(84*;8
Professora ANITA LOPES '7:5> ?@>A>'
co%t<<4nB#C#te 666 a er proc%rao(a) o% 0 para term#nar/ ; c#nproc%ra; h#e(proc%raD=0) { #n#c#o=0;f#m=@"1; o { me#o=(#n#c#o+f#m)'2; #f($et[me#o]
-
V.$ Esruura =eerognea &sru,' &ma estruturasru,F é, na verdade, um conjunto de variveis *ue 'odem ter ti'os diferentes. #u'on)a *ue vocM deseje arma%enar nome, e duas notas de um aluno. #e vocM usar variveis sim'les, 'recisar declarar trMs variveis sim'les e, 'ara *ue fi*uem claras *ue e4iste uma rela!ão entre elas, 'recisamos nomelas de uma forma *ue nos fa!a entender *ue elas se relacionam. &sando sru, fica mais claro o relacionamento entre elas. #u'on)a também *ue vocM deseje arma%enar nome, e duas notas de trMs alunos. #e vocM usar matri%es, 'recisar declarar uma matri% 'ara guardar os nomes e uma matri% bidimensional 'ara guardar as notas'ode ser também duas matri%es unidmensionaisF. #e vocM usar uma matri% de sru,, ser necessria somente uma matri%. As variveis de um sru, são c)amadas de cam'os ou membros . Normalmente, costumamos associar um nome X estrutura 'ara *ue 'ossamos definir novos ti'os. V.$.1 De,laran!o um sru, sina9e 1 sru, ( ti'o da varivel 2 nome da varivel 2/ 33
Professora ANITA LOPES ti'o da varivel 3 nome da varivel 3/ ti'o da varivel n nome da varivel n/ )nome do struct2, nome do struct3/ sina9e $ sru, nome da estrutura ( ti'o da varivel 2 nome da varivel 2/ ti'o da varivel 3 nome da varivel 3/ ti'o da varivel n nome da varivel n/ )/ sru, nome da estrutura nome do struct2, nome do struct3/ <; ao fa%ermos esta declara!ão, di%emos *ue os dois structs são do ti'o nome da estrutura;< V.$.$ faHen!o refern,ia a um mem@ro um sru, nome do struct . nome do membro / struct sim'les E4em'los( ,indados.idade5 ,ou--JnJ--dados.idade5 nome do struct-'osi!ão0. nome do membro / matri% de struct E4em'los( ,incad-Q0.idade5 ,ou--JnJ--cad-Q0.idade5 E4em'lo 2( uardar nome e duas notas de um aluno e im'rimir a média e o nome. #include using namespace std; int main() { struct { c'ar nome*+; $loat nota2/nota0; -aluno; cout<<"\nNome "; cin.getline(aluno.nome/01); cout<<"\nNota 2 "; cin>>aluno.nota2; cout<<"\nNota 0 "; cin>>aluno.nota0; cout<<"\nedia "<<(aluno.nota25aluno.nota0)0; cout<<"\t"<
34
Professora ANITA LOPES
E4em'lo 3( uardar nome e duas notas de trMs alunos e im'rimir a média e o nome. #include using namespace std; int main() { int a; struct 9adastro { c'ar nome*+; $loat nota2/nota0; -aluno+; $or(a4*;a<;a55) { cout<<"\nNome ";cin.getline(alunoa+.nome/01); cout<<"\nNota 2 "; cin>>alunoa+.nota2; cout<<"\nNota 0 "; cin>>alunoa+.nota0; cin.get(); s%stem("cls"); cout<<"\n\nedia\tNome\n\n"; $or(a4*;a<;a55) { cout<<"\n"<<(alunoa+.nota25alunoa+.nota0)0<<"\t"; cout<
35
Professora ANITA LOPES O@ser4a"#o( Nos e4em'los abai4o, vocM ver uma das maiores vantagens de se usar uma mariH !e sru,, 'ois *uando 'recisarmos ordenar, não teremos *ue fa%er muitos trec)os de troca. A grande vantagem é *ue 'odemos trocar de lugar todo o sru,. 7bserve *ue foi criada uma estrutura de nome au9 'ara 'oder fa%er a troca. E4em'lo Q( a!a um 'rograma usando mariH !e esruuras 'ara arma%enar matricula, trMs nota e a média de U alunos. Calcule a médiaas duas maiores notasF. 7rdene 'ela matrícula e liste. #include using namespace std; int main() {int op/8/c/; struct reg {int mat; $loat a!2/a!0/a!/m; -alunoL+/au; $or(4*;>aluno+.mat; cout<<"\n&V2 "; cin>>aluno+.a!2; cout<<"\n&V0 "; cin>>aluno+.a!0; cout<<"\n&V "; cin>>aluno+.a!; 9alcula media $or(4*;alunoc+.mat) {au4aluno8+;aluno8+4 alunoc+; alunoc+4au;s%stem("cls"); cout<<"\nat\t&V2\t&V0\t&V\tedia\n"; $or(4*;
36
Professora ANITA LOPES
V.$.: De,laran!o ou !efinin!o A 'rinci'al diferen!a é *ue *uando se declara, não se aloca es'a!o na S e *uando se define, sim.
V.$. Em@uin!o a !efini"#o na !e,lara"#o eja e4em'lo abai4o( sru, Notas (floa n2,n3,media/) sru, ( ,=ar nome-Q05 sru, notas notasAluno/ )Auno5 O@ser4a"#o6 No 'rimeiro, estamos associando uma eti*uetanomeF ao sru,( Noas. Estamos definindo um novo ti'o de dado. No segundo, estamos declarando um sru, de nome Aluno *ue tem embutindo uma defini!ão na declara!ão. uando 'recisarmos nos referenciar X varivel n1, 'or e4em'lo( .... Aluno.notasAluno.n2
37
Professora ANITA LOPES 1 Fun"es 1.1 Con,eio un!ão é um trec)o de 'rograma com atribui!+es es'ecíficas, sim'lificando o entendimento do 'rograma, 'ro'orcionando ao 'rograma menores c)ances de erro e de com'le4idade. A linguagem C++ é formada de vrias fun!+es. 1.$ Yanagens As fun!+es através da 'assagem de 'ar1metros e através do seu nome 'ermitem *ue sejam retornados valores X rotina c)amadora e desta forma, esses valores 'oderão ser im'ressos, atribuídos a uma varivel ou 'odem servir em o'era!+es aritméticas entre outras. 7s 'rinci'ais objetivos de uma fun!ão são( \ividir e estruturar um algoritmo em 'artes logicamente coerentes/ acilidade em testar os trec)os em se'arados5 7 'rogramador 'oder criar sua 'ró'ria biblioteca de fun!+es, tornando sua 'rograma!ão mais eficiente uma ve% *ue 'oder fa%er uso de fun!+es 'or ele escritas em vrios outros 'rogramas com a vantagem de j terem sido testadas5 aior aumentar a legibilidade de um 'rograma5 Evitar *ue uma certa se*Mncia de comandos necessria em vrios locais de um 'rograma ten)a *ue ser escrita re'etidamente nestes locais, diminuindo também, o código fonte, 5 `udo isto justifica o uso de fun!+es em nossos 'rogramas • • •
• •
1.:. Fun"es PrB]!efini!as 7 conjunto de fun!+es 'rédefinidas é muito e4tenso e a*ui vamos estudar algumas fun!+es das bibliotecas( ,ma=, ,sring. uando estudamos uma fun!ão, temos vrios 'ar1metros a observar. eja, 'or e4em'lo a seguinte fun!ão 'rédefinida da biblioteca ,ma=( !ou@le sr&!ou@le 9' Este é o %roi%o !a fun"#o, isto é, informa!+es sobre o ti'o de retorno da fun!ão e ti'os dos 'ar1metros. Esta fun!ão retorna um valor !ou@le, seu nome é sr e o ti'o da varivel *ue recebe o valor 'assado é !ou@le. 38
Professora ANITA LOPES uando vocM criar suas fun!+es, elas 'recisarão ter uma declara!ão semel)ante a esta. As fun!+es 'oderão ser locali%adas antes da fun!ão 'rinci'al mainF ou de'ois. #e uma fun!ão for declarada antes , o %roi%o !a fun"#o n#o 'recisar ser declarado na fun!ão main, mas se declarada de'ois , o 'rotóti'o %re,isar5 ser declarado na fun!ão main. \eclara!ão de uma fun!ão( ti'o in floa ,=ar 4oi!
i!enifi,a!or Nome da fun!ão
&lisa !e %armeros' & ti'o2 nome2, ti'o3 nome3 '
E4em'los( in ua!ra!o&in l' ,=ar maius,ula&,=ar nQR ' 1.:.1 Fun"es NumBri,as Biblioteca( ,ma= #include #include #de$ine ?I .22L10PL using namespace std; int main() { $loat $; cout<<"\nQN9OF, NFBI9&,\n"; cout<<"\nDigite numero real "; cin>>$; cout<<"\nNumero "<<$; cout<<"\n&R,O8AO "<<$a3s($); cout<<"\n9FI8 "<
}
39
Professora ANITA LOPES
1.:.$ Fun"es Srings Biblioteca( ,sring7,,<%e #include #include #include using namespace std; int main() {c'ar c/s2*+/s0*+; cout<<"\nRIR8IOAF9& cct%pe\n"; cout<<"\n8etra "; cin>>c;cin.get(); c4toupper(c); cout<<"9on!ertida para maiuscula "<
Professora ANITA LOPES cout<<"\nDIQFBFNAF,"; else cout<<"\nIguais"; cout<<"\n";s%stem("pause");
}
1.. \iretiva !efine \efine um identificador e um conte$do *ue ir ser substituído toda ve% *ue o identificador a'arecer em um 'rograma. Esta diretiva 'ode ser associada a uma string ou a uma macro semel)ante a uma fun!ão. #e o taman)o da macro for 'e*uena, substitui com vantagens o uso de fun!+es. E4em'lo 2( #include #de$ine Tuadrado() (()6()) #de$ine pi (.22L10PL) #de$ine N? (0.72U0U2U0UP) #de$ine con!() (()6(pi)(2U*))
... E4em'lo 3( #include #de$ine &BF&(3/') (36')
E4em'lo Q( 41
Professora ANITA LOPES #include #de$ine EI?O(c2/c0) (sTrt(c26c25c06c0))
1. C=ama!a !a fun"#o Não devemos ficar 'reocu'ados como isso ir acontecer, 'ois j fi%emos uso de vrios fun!+es internasfun!+es do tradutorF e, da mesma forma, c)amaremos as fun!+es feitas 'or nós. uando uma fun!ão é c)amada, o flu4o de controle é desviado 'ara a fun!ão, no momento em *ue ela é ativada no algoritmo 'rinci'al. Ao terminar a e4ecu!ão dos comandos da fun!ão, o flu4o de controle retorna ao comando seguinte X*uele onde ela foi ativada, e4atamente como na figura abai4o( main&' (... ... - c)amada da fun!ão 2 ... ... )
fun,ao1& ...' ( ... reorna&...'/ main&' ) (... ...
fun,ao1& ...' ( ... reorna&...'/ )
- c)amada da fun!ão 2 ... ... )
1.W Esruura !e uma fun"#o &ma fun!ão é um bloco contendo início e fim sendo identificada 'or um nome , 'elo *ual ser referenciada em *ual*uer 'arte e em *ual*uer momento do 'rograma. A fun!ão serve 'ara e4ecutar tarefas menores como ler, calcular, determinar o maior
Professora ANITA LOPES uando a fun!ão não retornar nadanuloF usaremos o ti'o 4oi!, 'ois é sugerido 'elo comitM de 'adroni%a!ão AN#6 . Denro !a fun"#o %o!em ser !e,lara!as 4ari54eis ue ,=amamos !e 4ari54eis lo,ais %ois s s#o 4is4eis !enro !a fun"#o. #inta4e da fun!ão( -ti'o de fun!ão nomeIdaIfun!ão &declara!+es dos 'ar1metros' ( declara!ão das variveis locais ,oman!os ue formam o ,or%o !a fun,ao reurn& valor ' 5 <; ou reurn/ ou nada 87 ) <
>
<
>
( ti'o de dado *ue a fun!ão dar retorno. Sode ser int, float, c)ar ou void nome da fun!ão ( segue as mesmas regras de declara!ão de variveis ( nomes das variveis, seguem as mesmas regras de 'ar1metros declara!ão de variveis declara!+es dos 'ar1metros ( declara!+es de variveis da fun!ãoti'o e nomeF ( ( início da fun!ão variveis locais ( declara!+es de variveis *ue serão utili%adas dentro da fun!ão ti'o e nomeF cor'o da fun!ão ( se*Mncia de comandos reurn& .. ' ( o *ue vai ser retornado 'ara o algoritmo ou não e4iste ) ( fim da fun!ão ti'o de fun!ão
1.c. Lo,aliHa"#o !as fun"es Sodem ser colocadas antes ou de'ois da main. #e for de'ois da main, os 'rotóti'os 'recisam ser colocados na fun!ão 'rinci'almainF. main&' ( 'rotóti'o da funcao25 'rotóti'o da funcao35 'rotóti'o da funcaoQ5 ... ) fun,ao1&...' (... ) fun,ao$&...' 43
Professora ANITA LOPES (... ) fun,ao:&...' (... ) 1.X. Di4i!in!o o %rograma em fun"es Nós 'odemos modulari%ar nossos 'rogramas 'ara *ue 'ossamos dei4lo mais claro. #e as fun!+es mani'ulam as mesmas variveis, deveremos declarlas com variveis globais, isto é, fora de todas as fun!+es. 1.V Ti%os !e Fun"es 1.V.1 un!+es 4oi! não retornam nadaF Este ti'o de fun!ão não tem nen)um dado de retorno 'ara a fun!ão 'rinci'al. Ela e4ecuta o trec)o e retorna 'ara a fun!ão seguinte da sua c)amada. A fun!ão 'ode não ter 'ar1metros e ser do ti'o 4oi!, também. E4em'lo( #include using namespace std; int main() {!oid lin'a();6prototipo da $unHo(tipo de retorno/ nome e (argumentos) 6 cout<<"\nNF,&\n"; lin'a(); cout<<"\n&lgoritmos e Fstruturas de Dados\n"; lin'a(); cout<<"\n?olitecnico e ,I\n"; lin'a(); cout<<"\n?BOQ. &NIA& 8O?F,\n"; lin'a(); cout<<"\n"; s%stem("pause"); !oid lin'a() {int a; $or(a42;a<4L*;a55) cout<<"6"; -
1.V.$ un!+es ,om %assagem !e 4alor 44
Professora ANITA LOPES A linguagem C:: 'assa os valores 'ara fun!+es através de argumentos das c)amadas das fun!+es 'ara os 'ar1metros das fun!+es, na verdade variveis *ue receberão có'ias dos dados. \esta maneira, os dados de origem não são alterados . &ma boa dica( #u'on)a *ue vocM com'rou um livro e descobriu alguns erros. ocM corrige no seu livro, mas não altera o original *ue, en*uanto o autor não corrigir, os erros 'ermanecerão. E4em'lo 2( un!ão lin)a com n$mero variado de asteriscos #include using namespace std; int main() {!oid lin'a(int ); cout<<"\nNF,&\n"; lin'a(L); cout<<"\n&lgoritmos e Fstruturas de Dados\n"; lin'a(0); cout<<"\n?olitecnico e ,I\n"; lin'a(2P); cout<<"\n?BOQ. &NIA& 8O?F,\n"; lin'a(27); cout<<"\n"; s%stem("pause"); !oid lin'a(int ) {int a; $or(a42;a<4;a55) cout<<"6"; -
E4em'lo 3( un!ão lin)a com n$mero variado de *ual*uer caracter #include using namespace std; !oid lin'a(int /c'ar c) {int a; $or(a42;a<4;a55) cout<
Professora ANITA LOPES -
E4em'lo Q( fun!ão SA. $o# 7>(#nt &,#nt E,#nt F) {int c; $or(c42;c<4=;c55) {cout<< <<:\t:; 54%; }
E4em'lo R( un!ão WA6. foat A>G(foat ra,#nt #n) { return po(rad/2.*ind);}
1.V.$.1 un!+es re,ursi4as As fun!+es recursivas, embora mais elegantes *ue as fun!+es normais, são muito mais lentas e, muitas ve%es de difícil com'reensão. "uando uma fun!ão c)ama a si 'ró'ria, as novas variveis locais e os argumentos são alocados na 'il)a, e o código da fun!ão é e4ecutado com esses novos valores a 'artir do início. &ma c)amada recursiva não fa% uma nova có'ia da fun!ão. #omente os argumentos e as variveis são novos. uando cada c)amada recursiva retorna, as antigas variveis locais e os 'ar1metros são removidos da 'il)a e a e4ecu!ão recome!a no 'onto de c)amada da fun!ão dentro da fun!ão dentro da fun!ão. `endo em vista *ue o local 'ara os argumentos de fun!+es e 'ara as variveis locais é a 'il)a e *ue a cada nova c)amada é criado uma có'ia destas variveis na 'il)a, é 'ossível ocorrer overfloT da 'il)a stacO overfloTF e o 'rograma trancar." EWNAN\7 C#AW C7SAW#6 \E CA#`W7F E4em'lo 2( Conta algarismos de um n$mero. int conta&lgarismos(int a) {i$(a44*) return a; else return 25 conta&lgarismos (a2*); -
E4em'lo 3(. #oma algarismos de um n$mero. int soma&lgarismos(int a) { i$(a44*) return(a); i$(a>*) return(aY2*5soma&lgarismos(a2*));
-
E4em'lo Q(. ulti'lica dois n$meros. int mult(int m2/int m0) {int m; 46
Professora ANITA LOPES i$(m244*) return m2; else return m05mult(m2M2/m0);
-
E4em'lo R( #oma os 'ares em um intervalo de 2 até n2. int soma?ares(int n) { i$(n44*) return(n); else i$(nY044*) return n5soma?ares(nM2); else return soma?ares(nM2); -
E4em'lo U( SotMncia de 28. int pot2*(int pot) { i$(pot44*) return(2); i$(pot>*) return(2*6pot2*(potM2)); -
E4em'lo V( atorial de um n$mero. int $at(long int m2) { i$(m244*) return 2; else return m26$at(m2M2); -
1.V.: un!+es ,om %assagem %or refern,ia Sara mel)or com'reensão deste item, 'recisaremos estudar PONTEI2OS. Nós j trabal)amos com 'onteiros embora, claramente não ten)amos usado esta nomenclatura. Continuando o estudo de matri%es, tomamos con)ecimento *ue ao declaramos uma matri%, era feita uma aloca!ão na S 'ara todos os elementos da matri% de forma contígua, 'orém só era guardado o 'rimeiro endere!o do 'rimeiro elemento da matri% . #u'on)a a declara!ão( in 4eQR/ e a tabela criada durante a e4ecu!ão do 'rograma( Nome da matri% 4e
`i'o da matri% in
Endere!o W 47
Professora ANITA LOPES Não se lembrou ainda Então mais uma recordada( *uando fa%emos referMncia a um elemento da matri%, usamos o nome da matri% e, entre 'ares de colc)etes, a 'osi!ão do elemento dentro da matri%. `omemos como e4em'lo a declara!ão in 4eQR/ ( 4eQR 4eQ1R 4eQ$R 4eQ:R 4eQR li4o li4o li4o li4o li4o V8888
V8882
V8883
V888Q
V888R
V888U
V888V
V888]
V888[
V8889
V8828
V8822
V8823
V882Q
V882R
V882U
V882V V882]
V882[
V8829
Então 'odemos concluir *ue o índice é um deslocamento do endere!o bsico no e4em'lo, WF 'ara c)egarmos a outro elemento da matri%. #endo in uma varivel de taman)o de @<es, c)egamos a seguinte fórmula 'ara o deslocamento( n!i,e 8 + en!ere"o @5si,o E4em'lo( deslocando 'ara o terceiro elemento( 3;R:V8888>V888[ E4em'lo 2( un!ão maiuscula char ma#%c%a(char n[]) {int c; $or(c4*;c
E4em'lo 3( un!ão `roca char troca1(char &[], char E[]) { c'ar au*+; strcp%(au/); strcp%(/%); strcp%(%/au); }
E4em'lo Q( un!ão ordena vetor !oid ordena(int !+/int t) { int c/l/au; $or(c4*;c
48
Professora ANITA LOPES 11 PONTEI2OS 11.1 Consi!era"es etc.
A S consiste de mil)+es de 'osi!+es 'ara arma%enamento de dados, #7, 'rogramas,
7 taman)o da S de'ende da ca'acidade instalada em seu com'utador. Nós j vimos *ue, ao declaramos uma varivel, o "nome" dado é associado a uma 'osi!ão de memória endere!oF e *uanto cada ti'o de varivel ocu'a na S. A varivel do ti'o sru, ocu'a o somatório das variveis *ue a com'+e. 7 %oneiro é uma varivel *ue contem o endere!o de outra varivel. 7 uso de 'onteiros nos d uma grande fle4ibilidade em 'rograma!ão, 'ois determinadas rotinas em outras linguagens só 'odem ser feitas em assemblZ. Uma @oa !i,a %ara enen!er ,omo fun,iona a 4ari54el %oneiro6 4o, 4iu no 3ornal um an>n,io !e uma lo3a ue 4en!e noe@ood muio fa,ilia!o %ara alunos ue es#o ,ursan!o Engen=aria ou Inform5i,a. Ao ligar %ara a lo3a 4o, %e!e o en!ere"o e anoa na sua agen!a. Yo, 4ai aB lo3a&na linguagem C _lo3a' %ara 4erifi,ar as ,on!i"es !e %agameno e aB !ar uma 0%e,=in,=a!a0&na linguagem C 8lo3a' %orue uem sa@e 4o, ,om muia ,=ora!eira ,onsegue um @om !es,ono. A varivel %oneiro 'recisa ser declarada como *ual*uer outra varivel. Como se declaraB
ti'o 8nome da vrivel 'onteiro / 7 *ue significa ti'o 'ara uma varivel 'onteiroB
uando declaramos uma varivel 'onteiro, 'recisamos informar o ti'o de varivel *ue ser a'ontada 'elo 'onteiro. Luando usamos o o'erador _ antes de uma varivelB
uando 'recisarmos informar X varivel 'onteiro *ue ela arma%enar o endere!o de outra varivel. Neste momento, estaremos inciali%ando a varivel 'onteiro. Lem@re]se !e ue sem%re %re,isamos ini,ialiHar uma 4ari54el %oneiro. 11.$ Ari@ui"#o !e %oneiros E4em'lo( . in 4,8'4/ '4Z_4/ . 49
Professora ANITA LOPES Luando usamos o o'erador 8 antes da varivel 'onteiroB
uando desejarmos o conte$do do endere!o a'ontado 'ela varivel 'onteiro. #include using namespace std; int main() {int a/3; int 6pa/6p3; struct reg {int mat; $loat a!2/a!0/a!; -aluno; int n+; aluno.mat422; aluno.a!24U;aluno.a!041;aluno.a!42*; cout <<"\nFndereco do !etor n "<<n<
11. Poneiros e MariHes A rela!ão entre 'onteiros e matri%es é muita intensa como j falamos anteriormente e, 'or esta ra%ão, vamos reescrever um 'rograma j visto( LEIA COM ATENhO AS CONSIDE2AES A;AIjO E ANALISE O P2OG2AMA Consi!era"es6 1. %sZs/ 's foi associado ao endere!o do 'rimeiro elemento do vetor sWelembrando *ue ao usarmos o nome do vetor sem índice estamos na verdade fornecendo o endere!o do come!o do vetorF. $. %s+l como j foi dito, vocM 'ode somar ou subtrair inteiros. Neste caso, o conte$do da varivel l, ser o incremento do 'onteiro. 8& %s + l' o conte$do da varivel l ser somado ao endere!o bsico a'ontado 'or %s. A e4'ressão 8& %s + l' re'resenta o conte$do do endere!o. Como %s é um a'ontador 'ara in, o 'onteiro é incrementado de @<es, isto é, embora %s seja incrementado de 1, em verdade, cada 1, e*uivale a R. 50
Professora ANITA LOPES #include using namespace std; int main() {int sL+/l/6ps; ps4s; $or(l4*;l>(p+); s%stem("cls"); cout<<"\n\n\nVFAOB\n\n"; $or(l4*;l
LEIA COM ATENhO AS CONSIDE2AES A;AIjO Consi!era"es6 1. %Z_maQRQR/ ' foi associado ao endere!o do 'rimeiro elemento da 'rimeira lin)a da matri% ma. $. &%+$8l+,'F5 como cada ve% *ue o 'onteiro é incrementado ele desloca tantas 'osi!+es *uanto for o taman)o da varivel *ue ele a'onta, 'ara se c)egar ao endere!o de um elemento da matri%, usamos a seguinte fórmula( n>mero !e ,olunas !a mariH 8 n>mero !a lin=a !ese3a!a + n>mero !a ,oluna na lin=a
:. 8&%+$8l+,' o conte$do da varivel l multi'licado 'or $n$mero de colunas da matri%F, somado com ,n$mero da coluna desejada na lin)aF e somado ao endere!o bsico a'ontado 'or % A e4'ressão 8&%+$8l+,' re'resenta o conte$do do endere!o. #include using namespace std; int main() {int mat+0+/8/c/6p;
p=!mat[0][0]; $or(84*;8<;855) $or(c4*;c<0;c55) { cout<<"\ndigite elemento "<<852<<"/"<>(p+2L+c); s%stem("cls"); cout<<"\n\n\n&ABIC\n\n"; $or(84*;8<;855) { $or(c4*;c<0;c55) cout<<(p+2L+c)<<"\t"; cout<<"\n"; s%stem("pause"); -
51
Professora ANITA LOPES E4em'lo( 7bserve a solu!ão abai4o 'ara matri%es bidimensionais( #include main() {int mat+0+/l/c; $or(l4*;l<;l55) $or(c4*;c<0;c55) { print$("\ndigite elemento YdMYd "/ l52/c52); scan$("Yd"/(mat+)+c); print$("\n\n\n&ABIC\n\n"); $or(l4*;l<;l55) { $or(c4*;c<0;c55) print$("Yd\t"/((mat+)+c)); print$("\n"); print$("\n\n"); -
amos e4'licar mel)or a e4'ressão em negrito( 8&8&ma+l'+,', su'ondo L>2 e c>2( 1. 8&ma+1 ' +1' maQRQR li4o V8888
...
maQRQ1R li4o
V88Q
V888R
1 lin=a a
...
V88]
maQ1RQR li4o V888[
...
maQ1RQ1R li4o
V8822
V8823
$ lin=a a
...
V882U
maQ$RQR li4o V882V
...
maQ$RQ1R li4o
V8829
V8838
...
V883Q
: lin=a a
\eslocamento entre lin)as( aF ma k é um arraZ de Q 'or 3 e é convertida 'ara um endere!o 'ara a 2 a lin)a W. bF ma + 1 é um endere!o 'ara a 3 a lin)a, iniciando em WX e*uivale( W + $&,olunas' 8 1&!eslo,ameno' 8 &@<es'F. \eslocamento entre colunas de uma lin)a( cF ;&ma +1' é convertida 'ara um endere!o 'ara o 'rimeiro inteiro da 3 a lin)a come!a em WX e termina em W11F. dF ;&ma +1' + 1 é um endere!o 'ara o segundo inteiro da 3 a lin)a come!a em W1$ e termina em W1, 'ois WX + &@<es' é igual X W1$F. eF 8& ;&ma +1' + 1 ' é o segundo inteiro da 3 a lin)a. 7bserva!ão( A arimBi,a !e %oneiros&uso !o ; ' na maioria !a 4eHes B mais r5%i!a e efi,iene em se raan!o !e um a,esso seen,ial !o ue a in!e9a"#o !e mariHes %orBm n#o !e4emos a,=ar ue nun,a mais usaremos a in!e9a"#o %orue a arimBi,a !e %oneiros %o!e ser #o ,om%le9a e ,onfusa ues 4eHes B mais f5,il ,o!ifi,ar usan!o a in!e9a"#o %rin,i%almene se for usa!a ran!omi,amene. YIU COMO A MAT2I T2ATADA COMO PONTEI2O NA LINGUAGEM C ++
52
Professora ANITA LOPES 11. Poneiros %ara Esruuras uando se 'assa uma estrutura 'ara uma fun!ão, gerase uma sobrecarga da 'il)a im'licando em 'erda de tem'o na transferMncia de dados entre uma fun!ão c)amadora e fun!ão c)amada. `endo em vista isto, aconsel)ase a 'assar 'ara a fun!ão somente um 'onteiro como argumento, 'ois estaremos 'assando o endere!o da estrutura, tornando a c)amada e4tremamente r'ida .
E4iste duas formas de se acessar o elemento através do 'onteiro( 2. ...&8%r'.elemento 3. ...%r ]elemento <; mais recomendvel ;<
Sara se atribuir o endere!o de uma estrutura a um 'onteiro, usamos( %rZ _nome/ eja o e4em'lo 2 onde 'assamos 'ara uma fun!ão um 'onteiro de estrtura( #include #include #include using namespace std; struct 9&D&,ABO { c'ar nome*+; $loat nota; -; !oid imp(struct 9&D&,ABO 6m) { int c; $or(c4*;cnome);c55) mM>nomec+4toupper(mM>nomec+); int main() { struct 9&D&,ABO aluno/6p; c'ar c; cout<<"\nNome "; cin.getline(aluno.nome/01); cout<<"\nNota "; cin>>aluno.nota; p4aluno; imp(p); s%stem("cls"); cout<<"\nNOF "<nome; cout<<"\nNOA& "<nota<
Consi!era"es so@re FUNES 53
Professora ANITA LOPES 1. uando usamos fun!+es, nossos 'rogramas ficam menores, 'ois não temos *ue re'etir o código vrias ve%es. $. 7s 'rotóti'os de fun!ão servem 'ara declarar as fun!+es, isto é, indicar 'ara o com'ilador *ual o seu nome, ti'o de retorno e o n$mero e ti'os dos 'ar1metros :. As variveis declaradas em uma fun!ão s são acessíveis na fun!ão . un!+es 'odem ser c)amadas 'or outras fun!+es, mas n#o 'odem ser definidas dentro de outras fun!+es . &ma fun!ão *ue n#o retorna nada deve ser declarada como 4oi! W. 7s 'ar1metros recebidos 'or uma fun!ão com 'assagem 'or valor arma%enam có'ias das variveis usadas na c)amada da fun!ão c. uando desejarmos alterar os conte$dos das variveis *ue são 'assadas como 'ar1metros 'ara uma fun!ão, devemos declarlas como 'onteiros na fun!ão X. uando utili%amos um vetor como 'ar1metro 'ara uma fun!ão, estamos fornecendo o ender!o do 'rimeiro elemento do vetor V. Em um 'rograma C, as fun!+es de um 'rograma 'odem estar em vrios ar*uivo.c 1. ariveis globais são con)ecidas e 'odem ser alteradas 'or todas as fun!+es do 'rograma 11. A fun!ão scanf necessita receber como 'ar1metro o endere!o da varivel de entrada, 'or*ue ela 'recisa alterar esta varivel. Lembrese de usar o o'erador _ 'ara variveis numéricas e ,=ar de um caracter. A varivel 4eor !e ,=ar não 'recisa, 'ois j é um endere!oF 1$. As bibliotecas contMm o 'rotóti'o de algumas fun!+es da biblioteca do C 1:. un!+es n#o rodam mais r'ido 1. un!+es modulari%am o 'rograma e 'odem ser testadas em se'arado 2eorno !a fun"#o 1. &ma fun!ão 'ode ter vrios comando return $. ocM só 'ode retornar o conte$do de uma varivel através do comando return :. &ma fun!ão 'ode retornar um 'onteiro . 7 retorno da fun!ão main é feito 'ara o sistema o'eracional Consi!era"es so@re PONTEI2OS 1. A'ós a atribui!ão %aZ_aQ8R5 %a e a 'ossuem valores idMnticos, isto é, a'ontam 'ara o mesmo endere!o $. A atribui!ão %aZ_aQ8R5 'ode ser escrita como %aZa5 :. aQiR 'ode ser escrito como 8&a+i'
54
Professora ANITA LOPES Esruuras !e Da!os KEstruturas de dados são constru!+es de uma linguagem de 'rograma!ão *ue agregam um ou mais elementos de dados 'ara formar um ti'o de dado *ue arma%ena uma *uantidade maior de informa!+esP7liveira,W,taveira,, Botini,,388QF rias são as formas de se organi%ar dados( 'il)as, filas, listas, rvores, etc. 7 objetivo das estruturas de dados é tornar o algoritmo mais eficiente. Pilhas
1. Con,eios a E\ mais sim'les e 'or esta ra%ão é muito utili%ada. Estruturas de dados din1micas onde os elementos 'odem ser estruturas estticas ou din1micas. Não e4iste KburacosP. #ão con)ecidas como estruturas FILO k firs inD las ou o 'rimeiro elemento *ue entra é o $ltimo a sair. A sigla LIFO last in, first out tem o mesmo significado( $ltimo a entrar, 'rimeiro a sairF. A inser!ão é sem're no to'o da 'il)a e a remo!ão também. uito usadas 'elo #7( um e4em'lo é na c)amada de fun!+es onde o endere!o de retorno é em'il)ado.
Não confundir o termo =ea% da figura *ue é uma rea de arma%enagem alocada, como 'or e4em'lo( malloc com a E\ ^ea'rovreF uando se 'ensa em um 'il)a, fa%emos alusão a duas o'era!+es( S^em'il)aF e S7Sdesem'il)aF.
55
Professora ANITA LOPES
#e a 'il)a cresce descontrolada, 'ode acontecer um Kestouro de 'il)aPoverfloTF.
$. O%era"es realiHa!as ,om a Pil=a
criar uma estrutura de 'il)a5 inserir um elemento no to'o5 retirar o elemento do to'o5 verificar se a 'il)a est va%ia5 liberar a 'il)a.
:. Programa ue mani%ula uma PIL^A in,lu!e -iosream using names%a,e s!/ 78 4aria4eis glo@ais ue %o!em ser alera!as o!as as fun"es 87 in !eZ %il=aQ1R/
78 numero !e elemenos 3a inseri!os na %il=a 87
78 Insere 87 4oi! em%il=a&in 4alor' ( in 9/ if&!e ZZ 1' 78 se a %il=a esi4er ,=eia 87 ,ou--0nPIL^A C^EIA. O YALO2 DIGITADO NAO FOI INSE2IDO.0/ else ( for&9Z!e/9/9]]' %il=aQ9RZ%il=aQ9]1R/ %il=aQRZ4alor/ !e++/ ) )
56
Professora ANITA LOPES 78 2emo4e 87 in !esem%il=a&' ( in 9/ in 4alor/ if&!e ZZ ' ( ,ou--0nPIL^A YaHia0/ 4alorZ]VVV/ ) else ( 4alorZ%il=aQR/ for&9Z1/9-!e/9++' %il=aQ9]1RZ %il=aQ9R/ !e]]/ ) reurn 4alor/ )
78 se a %il=a esi4er 4aHia 87
78 guar!a 4alor remo4i!o 87
78 Mosra a %il=a 87 4oi! im%rime&' ( in i/ if&!eZZ' ,ou--0nPIL^A 4aHia0/ else ( ,ou--0nnElemenos !a PIL^Ann0/ for&iZ/i-!e/i++' ,ou--0n0--%il=aQiR/ ,ou--0nnuani!a!e !e elemenos !a %il=a6 0 -- !e--0 nn0/ ) ) 78 Lim%a a %il=a 87 4oi! lim%arPil=a&' ( ?=ile&!e Z ' !esem%il=a&'/ ,ou--0nPIL^A YaHia0/ ) in main&' ( in o% 4 4al/ 57
Professora ANITA LOPES
!o ( s
,ase $6 4Z!esem%il=a&'/ if&4 Z]VVV' @read/
,ase :6 im%rime&'/ @read/
,ase 6 lim%arPil=a&'/ @read/
,ou--0Desem%il=ou6 0--4--en!l//
!efaul6 ,ou--0nOPCAO INYALIDA0/
)
) ,ou--0nn0/s
58
Professora ANITA LOPES Filas 1. Con,eios uma estrutura de dados muito usada em com'uta!ão. A ila segue a regra c)amada( FIFO k firs inD firs ou o 'rimeiro elemento *ue entra é o 'rimeiro *ue saiF. A inser"#o de um elemento na ila acontece sem%re ao final . A remo"#o de um elemento da ila acontece sem%re no inE,io .
Não é difícil de fa%er uma analogia com estrutura da ila e as filas *ue enfrentamos no nosso diaadia( a fila do banco, a fila 'ara com'rar um ingresso no cinema, etc. #e 'ensarmos em termos de um #7 'ara gerenciar a im'ressão de vrios documentos também fica fcil entendermos a filosofia da estrutura da ila( o 'rimeiro documento a c)egar, é o 'rimeiro a ser im'resso. $. O%era"es realiHa!as ,om a Fila
criar uma estrutura de fila5 inserir um elemento no fim5 retirar o elemento do início5 verificar se a fila est va%ia5 liberar a fila.
:. Programa ue mani%ula uma FILA in,lu!e -iosream using names%a,e s!/ 78 4aria4eis glo@ais mani%ula!as %or o!as as fun,oes87 in !eZ filaQ1R/
78 numero !e elemenos 3a inseri!os na fila 87
78 Inserir 87 4oi! inserir& in 4alor' ( if &!e ZZ 1' 78 se a fila esi4er ,=eia 87 ,ou--0nFILA C^EIA. O YALO2 DIGITADO NAO FOI INSE2IDO.0/ 59
Professora ANITA LOPES
87 )
)
else ( filaQ!eRZ 4alor/ !e++/
78 2emo4er 87 4oi! remo4er&' ( in 9/ if &!e ZZ ' ,ou--0nFILA YaHia0/ else ( ,ou--0nYalor remo4i!o60--filaQR--en!l/ for&9Z1/9-!e/9++' filaQ9]1RZ filaQ9R/ !e]]/ ) )
78 insere elemeno na ulima %osi,ao 78 in,remena !e 87
78 se a fila esi4er 4aHia 87 78 mosra 4alor remo4i!o 87
78 Mosrar a Fila 87 4oi! lisar&' ( in 9/ if&!eZZ' ,ou--0nFILA 4aHia0/ else ( ,ou--0nnElemenos !a filann0/ for&9Z/9-!e/9++' ,ou-- filaQ9R--00/ ,ou--0nnuani!a!e !e elemenos !a fila6 0--!e--en!l/ ) ) 78 Lim%a a Fila 87 4oi! lim%arFila&' ( in 9/ ?=ile &!e Z ' ( for&9Z1/9-!e/9++' filaQ9]1RZ filaQ9R/ !e]]/ ) 60
Professora ANITA LOPES )
,ou--0nFILA YaHia0/
in main&' ( in o% 4al/ !o (s
) ,ou--0nn0/s
61