Você está na página 1de 127
‘TREINAMMENT LINGUAGEM CURSO COMPLETO SUL VICTORINE VIVIANE oO S58588 SEEEESCECEEEEEL EE SESE OES pSESETIEEE SINOPSE .... pREPACIO. LL INTRODUGAO Compares Como Cee Programa vital ‘Artanis deem Programa en © Forma Geral das Fegies © ‘Pungo msi ropes de Programa ‘APenste pnt) Ingrid Cada Cassar Conetates Vari Datei de Vast ‘Tipe Verve ‘Vebuvea Bote iat ‘Tanbo de Compor natimpsto < XIL_Trenamenooinguagen © ws Sumdrio_ xm. ‘ compet ter agate 2 Fat. 0 Comant n InpindsGrcer e > to Ree 2 {nine Gace rte : 2 Ende 3 bars a 4. COMANDOSDE DECISOES ...- 6-2. se sees 2-18 2.OPERADORES ..... - Comendeit oe : n (Progam Prag do tra, = ‘AP sant 28 fewrpin iano Carpe to Comando i Be © Oped de nda) es Seaben anh Ts 3 Coo dn Fornaio Pnso 3 ‘pemenande os pie 5 ¢ sa Puage ce eed 2 Ocomandsteue st ‘Foote 2 Cantar Gro Ticro de abiee ie ‘Pooper 3 Sesntate ina 5 fates crn a imine hee a ‘Operator de Aug: = 33 Operadores Lévcoe ue Spent) & Promise 0 @ freee ati & aaa, Sonate Mats °C comune teat nde it a pets denen (+1) Darsta (==). 3 lets 4 es i cee “a erred de i Rev 2 Oper Art de Arie a Birds we Oper toms “ 5. FUNGORS + 106 § estece s wt a eS ange Barr den Proara wf "te @ Ete Braces 3 Gumands Feet = TACOS 08 DinEzeenlo Sor Ota te a Pagina Un Var on Gl eae to 8 ‘comsndorsare ‘Stealer 3 Rares Hitt re = Unnow Us dessin) Intra Cop sh aie 3 Ui de son er ihe % ‘Puan Dado pr une Chanda otaerte a Puan Vari come Avestan ora Gal doings wie ot Fosand Vr agen igen laa & Uiinisarar ont Foo oleae angen ode oie % Faogn do To i sComandos break continue 70 angie dopo wid es oe ere a nce a cece i goer : ee 2 Se ee esti es 2 ie ee ery panies = E peers “ ‘Varidvels Bettis Extornes 1 Eimepreaees = Se 3 cee cic 4 appt 3 Beate 00002 : ‘Considerasbes Sobre Conflito de Nomes de Varidreis 187 ae . . . a Bis ceeeeens 2 bocead 7 ‘Doclarugio da Matrix 187 ees a oes ca og eee a coma mamee s dicen ee imo s perane i pe 2 Roe peoeciese icc : co ii eit x eae o eee ac 2 Ene cd Se es Reece eee Roe ens = pendrin . eae “ “Matrizes como Argumientos de Fungtes 08 seer a sen = ‘AsTeclas ASCH... 158 dea - reas = sti rs paneer A Scien 2 i 1 ‘Una Tela ~ Cig Esendito 180 ike de ns Disesin como Argues an ar * u Bree, alone & ane 5 aoeene 2 aes a a * re on Sone Ee pee zl Saeco ea es z ees a ee = me : Sp) Conti dn Corvor AurvesloToduie os occ 108 ee a seeped * = a _EU1_Trenanena om ngage Intend Sigs 20 DutasPsges de Manjula oda | = Aung len | m1 ‘Pungo reat) ma A Pug treme 23 Una Mar de ngs 25 ‘AR rpy0 «Apap Cancer a (frogs gue inpine Cari de Nota 2s Enos BI INDICE ANALITICO ... . - 237 al SINOPSE capfruto 1 Arent wna pegens deg sbr snmladoreseeterpretadce aa Insndaeingn nnfeea gl Seo poonnn Gates nd) caPiruto 2 ‘Teta de pradore atten redaoay, fng eanf) pra lure de captruto 3 a on ec aa ome emai dite caPiruLo 4 Nese spl mene at roars de dat que permite prasear ‘texas puncte as aarti oparaores go cAPETULO 5 ‘No upto a aprantr a rir sme ira fogene mip se sngmeion ‘Sin motos ce tio 6 anges foes recurs e fares pra fprsio de mee cotros So prsutar at duets Go Prone Co SESS ie psues demand 829939808989 9999999999299989999999909 PESSSSSSSSSSSESEEESESES SESE EU SESS SESSETS 5V_Trinamento em suse captruro 6 so ane ela wna tet MEPS en cant igus nes Feseconeeno don Spt pis pare Apnea um sora aad or to wr, atin adie so sarctnue Vase eaapun nlica monn son oma mater ‘a media osomputaiar econo sc os ps aur fu Impleci de see ‘Sgramer Ss spesntadaeas npn de ltca Cana tnipulog de ces de PREFACIO Este live foi plancjedo para um curso completo do programagio ‘em linguagem CO estudante dove ter conhecimentos bésicas de sistema ‘peracional nos equipamentos da familia IBM-PC, XT, AT e PS/2 0 objetivo principal 6 0 de apresentar a linguagern C de mancira simples ¢ clara e ‘mostrar como C pode ser usala para a criagio de ‘rogramte aérios. Os exomplea apresentadoe nao estao relacionados @ Benhum sssunto espeiico e podam sor faciimonto adaptados a qualquer frea de aplicagho, © live aprosonta uma organtzagio diética dos temas sbordados fe pode ser adatado em cursos dp cammputasto de escolas Wenices ou {uvereidades, Ao alunointeressado dada a poalbildade de eiar mvs ‘programas e nde dexenvolver novas deias a partir das aproventadss. cortamente possivel aprender C como primeira linguagom de programagio, Entretento sua sintaxe nao é téo fill como a de uma Tnguagei como BASIC programadores inicantesppedem sentir alguna aifeutdade, s exemplos deste livro foram processados uilizando se o com- plludoe TURBO C verato 2.0 da Borland para computadores IBMPC e. ‘sistema operacional MS-DOS versio 3.3, mas podem ser processados em ‘qualquer compilador compativel com 0 MS-DOS ou UNIX. CAPITULO 1 INTRODUGAO 7 ( { ‘ ‘ c c ‘ r c ‘ « t ‘ ‘ ‘ e e e = Compiladores Interpretadores 1 Estrutura Basica de um Programa C As Fungdes main()e printf() = Constantes = Tipos de Variaveis Nomes de Variaveis Palavras-Chaves Caracteres Graficos MDRERELELELLLLELLEUULELELERELEOEES 2 Trine em guage © INTRODUGAO A linguagem © fi primelramente eriada por Dennis M. Ritchie © Ken Thompion no laboratério Bell om 1072, bascada na linguagem B de ‘Thompson que era uma evolugso da antiga linguagem BCPL, B foi nome: acorn aptimeira letrade BCPL.e Ccom ssogunda. A proxima linguagers pprogresiva da iia de C provavelmente se chamardP. [A dafinigio da C este contida no livro The C Programming Lan: guage, ecrto por Brian W, Kernighan e Dennis M. Ritchie (Cuma linguager vtoross como ferramente na programagio de ‘qualquer tipo do sistema (sistemas operacionas,planilhas eletrinicas ‘rocestadores de texto, orensiadores de banco da dados, processdores| krifiens,slatomes de transmiesio de dads, para solug de problemas de fngenbaria ou fisiea ete). Como exemple, osatemna eperacional UNIX Alesenvalvido om C. ‘A linguagem de programagso C tomow se rapidamento um das ‘mais importantes o populares, pnipalmente por ser multo podeross, portatl pola padronizagto dos compiladares exstentes eflexvel, C foi desenhada para que o usuério possa plangjar programas ‘steuturados © modulares. O restltado @ um programa mas level & ‘ocumentado. Os programas em Ctondom a sor bastante compactos e de ‘execugho répida © @ amiga do programadr, sufsientemente estruturada para ‘encorajar bons habites de programas, Programas em © poder ser ‘lesenvolvides em partes separada por pessoas distintas e depois unios jnum produto final, o que significa que bibliotecss de fungtes podem ser ‘riadas on tsadas sm realmente conhecer o cbdigo de cada urna delas, Exstem muitasoutrasvctudes do C que voe#conhecori no longo do seu aprondizado. COMPILADORES E INTERPRETADORES, ‘Amancira do so comuntcar com um computador chama se progr sma oa tinea linguagem que o computador entende chama ee linguagen do méquina Portanto todos os programas que £0 comiunicam com 8 ‘maquina devem estar em linguagers de maquina, {A forma como 0s programes so traduzidos para linguagem de ‘mdquina easifea-os em dias eatogoins: ‘= ovtenpnetapos (CoMitanos 0s programas que fazer estas traugSes sho chamados inter: pretadores © compiladores, INTERPRETADORES ‘Um interpretador I a primeiea instrugto do programs fz wma onsistincia da sun sintaxe e se nia houver erro converte-a para lit ‘uagom de maquina para fnalmonte exocutéla Segue, entao, para a ‘résima instrugdo, repetindoo proceso até que a tim instruchoseja ‘execu ou consisténela sponte algum ert, © interpretador precisa estar presente todas as vezes que vamos ‘executaronosto programa trabalho de checagem dasintaxeetradisho ‘dover sor repetido. Se ums parte do programa necesatar ser exeeuta uitas vezes, o procosso 6 flto o mesmo nimoro de voros. COMPILADORES, ‘Um compiler 10 primeira instrusto do programs, faz urna consatinein de sua sintase e 80 nia howver erro converte-# para lin- ‘guagem de méquina ¢, em ver de exccutéls, sogue para a proxima strug ropotindo o process até qua iltima instragao saa atingida ou sconsistnein apontealgum erro, ‘Sento houver eros, ocomplsdor geraum programa em disco com 0 suflxo .OBJ com as instrustes J traduaida, Este programa nfo pode 4 Treinaent em guage C sor executado até que sejam agrogadas ele rotinas em linguagoin do ‘miquine que Ihe permitirdo asua exocugto, Esto trabalho 6 feito por umn ‘rograma chamado ‘linkeditor” que além de untar as rotinas necessirias ‘0 programa OBJ, cra um produto final em deco com osufxo EXE. quo pode ser exccutado detamente do slatema operacional. Com isto a velocidad do execugto do programa chogn a sor 15 a 20 vezes mais ripida do que quando o programa 6 interpreta. ‘Alm da velosidade, outras vantagens podem ser mencionads 1» 6 domecesséiaa presenga do interpretador ou do compilador para exeeutaro programa jécompilad linkeditado; 1» programas .EXE nto podem car alteradoa, 0 quo protege © cfigofonte, ‘pesar do um compilador ter muita vantagens sobre wm inter pretador, gums consideragtes devem ser felts 0s interpretadores permitem que ae produzam programas com ralor feeldade na fase de aprendizado, pole podem ser cvtados¢ ex Catados imodintamente, enquanta um Sompilador requer multo mat ‘tempe para que um programa possa ser executado. Um compisdor nso eriara um programa em linguagem de mqui- naantesquoeateestejaabeolutamentelivrede eros e durante oprocesso ddeprendizado de una linguagem a quantidada de eros gorudos 6 ola ‘vamence geande,o que faz com que um interpretadar seje muito mals conveniont, ‘BRISTBSN, NO MERCADO, CONPILADORES F INTHRPTETADOTUS DA LIN: ‘ouxcrat COMO CRIAR UM PROGRAMA EXECUTAVEL, 1 Datilografa sou programa com o auxiio de um processador de textos no mod nda documento, Gravar o programa em disco ‘deo a ele umn nome eom o sufxo .C. O programa gerado & ‘chamedo do fonte, —— ea ate ‘= Campilr fonte soguindo as instrugéos do set compllador, 0 {que eriaré um programa com o sufizo .OBJ em disco, 0 pro- rama gerado ¢ chamado de objeto. 1» Linkeditaro objeto soguinde as inetrugoes do seu linkeditr © (que criaré um programa com o suflzo “EXE em disco. O pro. arama gerado é chamado de exeeutdvel. A ESTRUTURA BASICA DE UM PROGRAMA EM C ‘Um programa C eonsisto em uma' ou vrs ungies": Os nomes programa ¢fungto eo confundem om C. FORMA GERAL DAS FUNGOES C ‘Vamos comesar pelo menor programa possivel em C, rain) f ) ate programa compte-se de uma nice fungto chemada main, saln() ——_primeien fungto a ser executads (nein © corpe da fungao ) termina a fingto Osparénteses apéaonome indieam que esta 6uma angio. O nore do uma fungto Cpode ser qualquer urn com excegH demain resetvado para afungio que niin a exeeugo do programa, ‘Toda ungso C deve ser iniiada por uma chavo de abertura,(,¢ cencorrada por uma chavo de fechamento, Onomo da fungto,osparéntoses eas chaves soos inicoselemnen- ‘os obrigatrios de ia fungao, eaeeeseeeeeeeeeceeerrrrretrerraeesen~ PSSST ESSSSCE EEUU EES UES LE UES Se eeseEs Deters em inguogen © ‘Voed pode clocarespagos, caractoros do tabulagioe pula in ‘avontade em seuprograma poise compilador ignora oetesearactrea. Fin Chto hé um estilo obrgatério, Osexemplosa seguir mostram como estilo de progsamagto pode ‘ausar problemas de legibiidade aos programas C. [nw 00 min kc lata Pe ( vo t ; ‘Todes estes exempls sto de programas que no fazem nad, sj, programas varios, AFUNCAO main) {A fungi main( deve exist em algum lugur do seu programa &| ‘marca 0 poato de ineio da exaeugio do programa. Se um programa for fconstitufda de uma dnies funeao asta seed main) INSTRUQOES DE PROGRAMA ‘Vamos adicionar uma intrugio om ness programa, rain() Print (*priseiro programa"); ) ‘Todas as instrugées devom estar dentro das chaves que inisiam € torminam a fungtoe sto executadas na ordem em que as eserevemos. Asinstrugbes Cio sompre encerradas por um ponto-e-virgula() O ponto-e-virgula 6 parte da instrugio abo um simples separader Fata instrugdo ¢ uma chamada dfungto print{Q, os parentoses ‘nos certificam disso e o ponto-o-virgula indica que esta 6 umn instruc, Como om C no existe um estilo obrigatrio, vamos reoserever 0. programa anterior deforma que a sia execugio seri exatamente como 2 So anterior sain()(print#(*primeire prograna);) A FUNGAO printf A fungao printf) ¢ uma das fungbes de B/S (entrada esa) que Didem ser usadas em C. Ela nio faz parte da definigae de C mes todo os Sistemas tom wna Versio de printf implamentada. 0s parénteses indicam que estamos, realmente, procedende com ‘uma fungia Nointeriordospardnteses esto asinformagioe passers) programa main() a fungio printf, isto € primeleo program” Fata ‘nformagio 6 chamada de argumenta de print), Quando o programa encontra est lina, passa o controle pars & fungto printfQ que imprime ns tela do seu computador rimeleo programa «, quando encerra a execugto desta, o controle ¢ transferido novarnonte para. programa. Sintaxe rintexpr do controle ata de argumenton) J &rinaant om ngage © rtrd Osteo exemplo: Asafa srd saint) Yen ert maihoes emits i be printf(*Este e/ 0 mmero dots: Xa,2); Aqui, ldo do cig de frmatagt, a expresao de controle de ) printf eon um conto de carscers etre tm. ete programa impriiréna tela do seu computador: 0 tn 6 um ofdio expect que informa a print) que orestante tntretanto,eclocamos des: "Este eo numero: Sed” que esta eaquetla¢ ‘valor 2 8 dreita, Kates dois argumentos ste separados por uma virgula. ‘Aexpresato de controle pode canter caractores que sero exbids natela cidigos de formstagto que indicam oformatoem que osangumen: ‘tos devem ser impresios. No nosso exemplo 0 eidgo de formaiagao “ed salictam prin impr o segundo srjmento em formato decimal, pprin€f() 6 uma fungio da biblioteca padro de C e pode reoeber uum nomero varidvel de argumentos, Isto €, a endola do caractores do tontrole e mais tantos argumentos quantas oxpocfeaghos de formato a ‘adlola de controle contiver. (Cada argumento deve sor soparado por uma virguls IMPRIMINDO CADEIA DE CARACTERES _Além do cig do formatagto decimal (Sd), printf) acitavirios ‘outros. Opréxim exemplo mostra o uso do cédig Ss para imprimir ume ‘adele do caracteres. saint) c printf(*is esta a sd miThoes de withas\ndo sol*,Verus*,67): ‘da impresso deve ser feito em nova linha. Acombinagiode caractares \n representa, na verdade un dnicocaractereem C,chamadode nova-liaa Em outras palavras, este earactere desempenha a mesma fungio quo a ‘eecutada quando prossianamos tala enter] do tolado. Por que, ent, ‘ho usar tela [enter]? Porque, quando pressionamoe a tecla emer ‘editor do toxins quo estamos ueando para editar nose programa dels nha atual onde estamos rabalhand e passa para outra linha, deixando linha anterior inseabeda,ea fungSo printf) go otomard>paraaimpressio. 0s caracteres que nfo podem ser obtidos diretamente do teclado para dentro do programa (como a mudanga de linha) slo esrits em C, ‘ume acombinagdodosial | (arrainvertida) com outros caracteres, Por ‘exempl, \m representa a mudanea de linha. ‘Vamos agora escever um programa com mais de wma instrugi: rain) C rintt(A tetra se *.'3)s 1 Preemie." ita) Asaida seré: ‘Aletraj promanc-se ota, ‘76 um caractere "jota"é uma cadsia de caractores, Note que 6 delimitado por aspas ciples enquanto que "ota" 6 ts00 Digtealgumcaractor a A fungi geteh() 180 caractare do tclado e nto permite que seje Iimpresso na tale Como getche(), esa fungua nfo eclta angumentos © devolve o earactere ldo para afungio que a cham, programa soguinte chamasafunciogeteh( © atribuo caractere {que ela devolve & varlavel ch para depots imprimir 9 earstore © 0 ed Sueessor na tabola ASCII com printf). main) char eh printf("Digite algun caractere eget); Drintf("\n’A tecla que voce pressioney e” 2e"ych)s Print(*e a sua sucessora ASCIT e” 4c."ychsl}3 A biblioteca padro prove outrasfungtes para @leitura ooscrita de umn caractere por vez AFUNCAO getchar) A fangéo getehax() até definida no arquivo sidio., que acon ppanha seu complador, Oblém o préximo earactore da entrada eala vox {tue € chamada, #6 terminando a Teitura quando @ prossionada a tecla enter], © retorna o caraclere como seu valor. A fungao getehart) nio soci argumentos. sto 6 és = getenar()s ‘8 varigvel © contém 0 préximo caractere de ontrada. Caco encontre & inceago do fim de arquivo getehar() vetorna-1 AFUNGAO putehar() Afungsoputehar()¢ ocomplementodegetchar() também ests Aefinida noarquivostdia’, Afingéo putehar( aceita um argumentocujo ‘valor erdimpreaso, Oscomandos a seguir mostrar como ler caractore ‘de entrada, atribuir seu valor a vargvel e e imprimir 0 contetdo da ‘varidvel ena sada parti. © = getenar(): putchar(e}s ‘Umargumento de uma fungio pode seroutrafungso, Por axemplo, sslinbas anteriores podem ser escritas om: putehar(aetchar()): OPERADORES ARITMETICOS C6 uns linguagom vies em operadores, em torno do 40. Alguns ‘io mals usados que outros, como € 0 caso dos operadores aritmeéteos que ‘exectutam operagbes artmétias, C oferece 6 operadores aritmétics binéros (operam sobre dois ‘operandos) e umn operaoraritmético undrio (opera sobre um operand). ‘Sho eles Binérios 2 Atribuigto + Soma Subtragso + Multiplicaguo 1 Divi % —Wédulo (devolve o resto da divisiointeira) Unério Benoa undria OPERADOR DE ATRIBUICKO: [Em Go sinal de jgul nfo tom « Interpretagio dada em mato initia, Representa aatribuigio da expreseioa dreta sonome davariavel enquerda Por exempla: ‘teibul o valor 2000 & varigvel mum. A agte 6 exccutada da drcita para # ‘eaquarda deste operador. Observe que: 6 uma jgualdade valida em matomatiea mas que nao tem sentido em C pols nfo podemoe atribuir im valor a uma constant SSSSSSSSSSSSSSSSSSSSSSSS SS SS Sseses Prenat em tngagem C CCacitavérias atribuigbos numa mesma instrugto: Iarunjaccnouras-abacaton= 60; ‘OPERADORES: + -/* Estes operadores represontam as operagGesaritméticasbisicas de smn, subtragio,dvisto ¢ multipliagio. ‘Asequir eat um programa quo usa virio operadores artméticos ‘converte temporatura Fahrenhelt em seus correspondents graus Cel sing) c {nt Lem,ctesps printf("Digite onperatura en graus Fahrenheit: ~ cant ("1d Aftenp) 5 temp ftenp-32) 75/95 Printt("Tenperatura en graus Celsius e” 2 ? Fic um exemplo: Sighs Comperaturs em gras Foire ‘Temperatura er grus Clas oO. CoRemp Digit temperatura cm grausFareahlts 70 ‘Temperatura em praus Coats ¢ 21. ‘Vomosanalisar a instrussc: ctemp=(Ftenp-32) * 5/95 [Note quo colocamos partnteses em ftemp-22, Se voeé lemabra um ‘poucode algebra, arazio estar clara Nés queremos que 82 sojasubtraido ‘Se ftemp antes de mullipliearmos pr 5 dividirmos por 9. Aaultiplicagao ‘ea divisdo eo feltas antes da some ou subtrasio. Operon 35 0 programa a seguir usa um algritmo interessante para adv Dhar a soma do 5 ntmeros. O usuério digita um mimero qualquer © 0 computador informs o resultado da soma dos 6 imeroe dos quis © primeiro 0 usuario jéfornocou, O usudrio dita 0 segundo nimero © © omputador mostra o terooir, O trhério digta o quarto nimero e © ‘computador mostra oquint. Bisa aint) ‘ int xr printt("Digite um munero de ate 4 algarisaos\ Scant Ca" 8x): ra 18998 4 33, Print("0 resultado da nossa conta sera: sa\n"s Printf(*Digite © eegunds nanero (e algartsn2s)¥ Seanf ad"): Drintf("O mou numero e+ $4\n*,9899-x);, Print f("Uigitee quarto numero’ (8 algarssmos) \n")+ Seanf(*ad" x): Drintf("0 meu numero a9" 9999-2); Bis um exemplo de sua execugto: Digite o segundo muinero (4 gars) O mes numero 0: 8265 Digteo quarto numero (4 algnsmos) Pe ‘OPERADOR MENOS UNARIO: ~ © oporador menos unério éusado somonto para indlear a troca do sina algdbrco do valor. Pode também ser ponsado como o operador que mulipliea seu operando por 1. Por exemplar 28mg em Haguagen © Operatives 37 Considere os operadores abaixo que no s30 comuns ef otras misma | tinguagens Depoisdestas duas instrugds,oconteido de mum! ser 8. ++ increments de 1 sou operando erementade I sev operando { 0 operador de ineremento (++) inerementa de um set oporando OPERADOR MODULO: % ato oporalor trabalha de dois modas. O primeiro modo & chamado | préixado oo operaor aparece antes do nome da varivel, segundo 69 (peter madlosxita aemente operands nero Rema o ‘moo ps-fixado em que 0 oporader aparece seyuindeo nome da varivel ode dvisio do intero 8 sua eoquerda pelo inteire @ sua diets setae eee Em ambos o8 casos, a varvel 6 incrementada, Porém quando Por exemplo, 1745 tem o valor 2 pois quando dvidimes 17 por 5 ++4n 6 usado numa instrugio, n 6 inerementada antes de seu valor teremos resto 2 usado,o quando m4 + estiver numa instrugéo, n 6 inerementada depois E também possivelinluir expresses envolvendo operadores ait: Sa son valor sex wea, métios (e outros operadores) diretamente em printt0, Exemplos Na werdade, uma expressso completa pode ser usad em quase ‘Se as soguintes inhas de programa forem exseutadas: {todos os ligares ond uma varivel pode er usada. Como exemple, vamos ‘modificar oprograma anterior usando ua expresso em printf) so inves Sa varivel Print sat ne x,0)5 saint) { ssa srt Ant erp: Drint{(Digite temperature em graus Fobresests *)s Scant (he bfeetp) ca ashen nga atv Na primira linha stibuimeso valor 6 a ma segunda ina 9 jdiaaamnaemeamenron eectrtcee valor dem €atribuldo x ¢ depois m 6 inerementada de I, tomando ae valor 6 ‘Agora vamos ver umn outro exemple: OPERADORES DE INCREMENTO (++) E DECREMENTO (—) Se comparar um programa Coom um programa similar escrito em cutra linguagem, voot percberd, imediatamente, quo 0 programa C é menor. Umma das raates para que isto seja posfvel & quo C tem vérios operadores que podem comprimir comands de programas. 38_Trinomento eo ngage [Na primeira linha atrbutmeso valor 6 an, na segunda linha n& {nerementada da im ¢ dopols seu valor € atribulde ax ‘Vamos analsar as duns expresses sopuintes Cherrat a PRIMIEIRO sé tipi por Sear DEPOIS oraaad bade FINALAIENTE e ¢incementas Se eae ee _PRIMEIRO sé incenentdn do DEPOIS 9 tmliplato yor FINALMENTIEo fra tudo Quando um destes operadores aparece sozinhe numa instru, no far diferenga o uso do modo pré-fxado on pos-fixad, Outros exemplos: main() ‘ Ant nus-0; un); De fato,num++ 6 exatamente igual a centretanto nums + 6 uma dedlaragto bem mais compacta retires 9 main() c int munads Drintf(*a e” un belo manero\n", nun); Drintf(*%d o” un belo nanero\n?,ssnun) 5 TIneEred am bete nara a saida sori ‘nt mun0; printf(*td e" un belo munero\n" nn) Drintf(*d e” un belo munera\n" une PIM” obtener ans caida ser 9.6 um belo numero sin elo mere sing) { nt manos printf ('d ef un belo mamers\n! rims Drintf("Ed e” un Beto nunaro\n"y -mut); Drintf(*2d e* un belo runero\n*,nin); teamed ingsgen PRECEDENCIA ‘Operadores de incromento e decremento tém precodénca malor que a dos aritmeticos Isto 6, 6 oquivalonte a Operadoree de incremento- deerementor6podem ser wadoscam varlaveis¢ nfo com expresses ou constantes, Portanto, BRRADO hes; 5441 [Nao confunda a precodéncia destes dois operadores com a order de avaliagao, Analise estas instrugdes: bas pear brs)?s ‘Substituindo os valores, teremos: neQe5e3=793=21 ‘Somente depois da expressto ver avaliada, b é incrementada para 6.A precedéncia informa que ++ estéafotande a vardvel be qual valor do b soréusado para avaliar a exprestio, ¢ a definigin do oporador de ineremento determina quando e valor de b sera mudado. rintf() ENGANANDO Voc, ‘Voct podo sor itudido ao tentar imprimir wna most tailed ‘isla vetes tisando 0 operador de Incremento ou decrement, Por xorg Printh(*ed td 4a\n"soyn41 nee); Tato parece razovel evocé pode pensar que a impressto ser 565 De fato, em virios sistemas eta inhasfunconaro de aco ‘mas no em tai. . problema é quando printf) toma oa valores serem imprestos ta pode avalin dtimo argutnentaprimelto,oisto provocariaa teguinte Impressso: ave porceria ova Ames tain 6 entrada em exproasics de atibulgso om ‘mesma vartvel mpaveendo mais de uma ee A moscna de anh Improve ‘Testes elaborados com o compllador TURBO © versio 20 da Borland apresentaram os seguintes resultados neie(Eetdoteet)s PrintF("\n m= $44,0); nee PES USERS SESE RA REESE, sain() c tnt 13 Mitienetray Prine Ass ) n-15 main) i nt 4-3: printe(e\n n= a" ) n= saint) t Ane 5035 int me rintf(*\n n= ) ho rain) t sot 35 printf ("a 36 24 3a ielytetela tates ose Operdons 43 OPERADORES ARITMETICOS DE ATRIBUIGAO ste [== Cada um destes operadores é usado com tim nome de vastavet & sua esquerda © uma expressio A sua dirella. A operagin consiste emt atribuir um novo valer & vavldvel que deponderd to operader e da ex reaisoadireita, Se x ¢ uina yariével, exp uma expressio © op um operador svitmétion (4,4. / 00, eno cauivale a == (2 op (omy oquivalo.e ‘oquivalow ‘quivale a Asexprossbes eom estes operadores sao mais compactase normal mente prodhizem um ebdigo de maquina mais efcient, Beamale rain() c int totaleos int cont=10; printt(*TotaT-na\n", total) {otalescont, Drintf("Total-ta\", total) totale print("Totalata\w", total) {Treat en inguezen C ead sort t ‘Total-o (Osimbolo = pote se combinad com outros operadarescomo os \bgieos ou 0s operadores ita bit dos quasfalaromos no sogundovalumme OPERADORES RELACIONAIS ‘Operadores relecionsis sto usaa para fazer comparagses, So oles: ‘enor ou igual Tyualdade Alerente Noprésiine capitulo flaromos obra comands de dace lags, Estas eonstragéee requorom que o programa paryunte sobre relugbes entre variaves, Operadores reladonas 00 voesbulrio quo progrania ‘tn para fazer eet perguntes Em C nto existe um tipo de varivel chamada “boolean, isto 6 «que assuma urn Valor Verdadetzo bu falsa.O valor zero (0) ¢ eonsiderado {also e qualquer valor diferente do 06 cansiderado verdueiroe repre sentado pelo inteiro um (1) Portanto, em C, qualquer valor & 0 ver Adina on fats (© programa asoguir mostraexpresscestooleanss como argue toda fungo printf) aint) Sint verdad, Fale05 verdad 15 < 20)5, false = (152220)5 printf ("Verdadeiror x4, falson wan" verdad, fals0); ) ‘A said serés Vordederos 1 feo Note que o opera relainal gual a 6 ropresentato pr das sini de igual, Um ere comm 60 de uss Gnic dial dig cone ‘perio eaciona cmon oars que ee aren ae ‘tu?Naverdae cone tedaemprescio Ciomumracveriaioneie 4 ‘stone Sumenedoprrata caiman tole ieneavenaiey rain () Ant vetoes . « Printe(*\sA velocidade e* igual a S52%¢" veloce-S5); veloc = 855 Drintf(*\nA velocidade e* igual a S52%d",veToe=-55); ) Sada: A velctdede «gal 5520 ‘A velotdade gual a 2 PRECEDENCIA Os operadores aritmétics tém maior procedéncia que a dos re- lacionais. Iso significa que serko avalos antes, rain) Printf (*A resposta eu", SOCCER EEEEELE LEU EERE EERE EERE REESE Treinen inguagr a salda sore mato () t print (°A resposta ef £4" 14244); Asda ser Aresposta 1 COMENTARIOS ‘Comentérioe podem ser closados em qualquer lugar de set pro gama. Mostraromos @ programa que caleuls a idade com os devidos comentarios fs Adade.c */ (programa para caleular a sua {dade am diss */ m0) ‘oat anos dias: ‘PPéeclara variaveist/ printf(*Oigite sua 1dade en anos: *) Seanf("2¢* anos) jas = anon365:, Je {dade en anos*/ frealeua idade en diae*/ /* tnpressae do resultado */ printf(*Sua Idade em dias e* 8f.\8"4I25)5, ‘Comentérios comogam com discaractores,chamatos stinbolosde comentarios, barraasterica (/*) tarminam por asteiscobarra (*/). {Como C ignora espagee, cx comentarios podem sor esritos ex vitae linha Nao sto pormitides os simbolos do /* ou */ no interior de um comentario. ston enerovendo um somentari egal”) REVISAO| 1. A fungio scanft) 6 usada para ler informagdes do toclado. Os seus ‘argumentes consistem em uma expresso do controle, contend ai 2 Dvev 14. Qual serdo valor dek? 1-3 k=} 15. A procodénsia das operadores detormina qual 60 operador: 4) mais importante; 2) usado primeiro; ©) mais adequeds; @) quecpert om ndmeras melores 16, 0 comentirio seguinte&correto? ff Este @ um comentario ‘7 que se eatende em (( Yiias inhas 2 Trinament en inguogon © 417, Modifique o programa dade para que imprima aidade em minutos 0 inves de em dias, 18. Escrova um programa que solicite 3 ndmeros em ponto Nutuante ¢ ‘imprima a media aeitmetic, i CAPITULO 3 LAGOS = O Lago for = O Lago while = O Lago dowhile = 0s Comandos break E continue = OComando goto 4 Prinanent em tingagen ¢ [Em C oristom 3 estruturas prinepais de lagoe: 0 lag for, 0 Lago while © o lage o-while. OLAGO for © ago for angloba 3 exprestdes numa dai, e 6 ti prineipal mente quando queremes repetir alge um mimero fix de vezes. 0 exemplo seguinte imprim ago for na sua forma mais simples ‘0s nomoros de 09 uiieando uns Pissrre!) 4 taprin nuaros do 0.3847 ata foe cot Fortean contac prinefeantsaty cantart) conta} } Come ea teremnas: © programa executa 10 voues @ instrugao printf). A foncio printf()imprime # frase 'enta=" soguida do valor contido na varivel ona, FORMA GERAL DO LAGO for: ‘osicinnagiotentsonsoente) AESTRUTURA DO LACO for Os paréateses seguindo a pelavra-chave for contém tr expres ‘es separadas por pontos-e-virgulan ‘expresso como um todo ¢ chamada de "expressbo do lao” 6 Aiviida em: expresso de iniializago’, "expresso do tsto"e "expresso ‘de increments Aste expressbos podem ser compostas por usiaquerinstragios vilidas em C. Em sua forma mals simples, a inicalieagao 6 uma insteagio de atribuigho (conta=0) e é sempre exzeuteda uma tnica ver antes do Iago sor iniiado (Oeste umnainstrusao de condigSo que controls olago conta 10), ata expresato ¢avaliada como verdadeira ou flan toda vez que a lago or ‘niiado ou reiniiado, Se verdadala (diferente deere), oeatpo do lago & fexeeutado, Quando a expressio tornaiee faa (ual a 200), 0 1ago ‘erminado © 0 controle passa para instrugdo seule a igo, ‘A oxpreasio de incremento define a maneira como a vaiavel de ‘eotrote do lag ser alcerada cada vee que olago ¢ repetido (conta +) Esta instrugdo ¢ exoeutada, toda ver, imediataments apés a execugao do corpo do apo. PonTo-z.vIRGULA smicaliagao | ales Tor{contan0; conta < 10 } conta 4) print(*eontaste\r"jconta); nao oda Poxto-e VRGULA ‘coRPO DO LAG au B_Trenamanto om ingugen C [HUMIACO or NAO COLoqUE FoNTO.E-VINGULA ENTTRE Os PARENTESES {QUE ENVOLVEM A EXPRESSAO DO LAO EO CORPO DOLACO.. ‘Vamos modifcar 0 programa lacofo-e para que imprima 08 n smeros de 9.0, [> lacofart.e */ ‘7 Saprine nmeros de 9 3.0 */ ‘main() q Int conta; for contaed;contar0;conta--) printf(*contasta\ conta); ) Como sada toremos: Agora de0 a9 de 3 em /* acofor2.c */ (+ npeine nimeres de 9 2 0 de 3 en 3*/ sxin() ( Ant conta: for(conta-O;contaclD;contat=3) 5 Prime eontana cots Como sald teremos: conta contase FLEXIBILIDADE DO LAGO for ‘Nos exemplos anteriores usnmos formals simples para a tr6 cexpressies do lago for. Isto 6, » primeira expressio para incalzar a ‘vaidvol conta, asogunda para exprescar um limite para conta ea tereira parainerementar ou decromentar conta, Bntretantoolasnto sto restetas ‘apenas a estas formas. C permite muitas outras possbilidades que mos: {aremos nos préximas exomplos. 1, Qualquer uma das exprossées de um lago for pode contor vivins cparadas por virgulas Avirgula 6na verdade um cperador flea “aga isto ist™. Um par de expresstes separadas por virgula 6 avaiado da esquerda pare a dreta. /* Yacofors.ct/ (7+ smprine os nuneros de 0 2 98 en increnento de 2 */ ain) ¢ nt ays for( x= 0, y= 0; xy € 100 5 x ontlay = ye) priate(ad *x09)3 ) 2. Podomos usar araetores em verde interes maint) c char chy For(che'a!schee'2"schvs) printf(°O valor ASCII de Ke e! 84.\0",chych)s SSSSSSESSSEEEEE EEE EEEE EL ELEE EEE LES (8_Trehnameno om tinge Este programa imprimiré aa letras minGaculas do alfabeto 0 sous rospoetives codigos decimais da tabela ASC. 8. Podomos usar chamadas «funjées am qualquer uma das exprosobos ao lage: main) c char hs For (chegetch()scht="X' schageten()) printf (ose" yen): 2 Este programa solicta a entrada de um texto, Ld cavaciore a caractore¢ imprime o earactre seguint a partir do céigo ASC. 4. Qualquerumadastrés partes de um lago for pode seromitida, ombors 0s pontose-vingulas davan. pormancer. Se a expressio do jnica: lizegto ou ade incremento forem omtidas elas sere simplesments desconsidoradas. Se a condigho de toste nio esta preseate € cous ‘lerada permancntemente verdadeira mat) har ch for(:(ehegetch())!="3"3) print Re" che); ) maint) for (1) printf("Laco infinito\n*): 15. 0 corpo do lago pode sor vazio, entretanto © ponto-e-virgula per mato() c char e: orl: e-geteh())1=/8”sprintf(°Re*yes2)) ) sin) c char cs For(coDsec=1005e+4) > INSTRUGOES MOLTIPLAS NO CORPO DE UM LAGO for Osexomplos anteriores usam someate wma instrugto no eorpo do lago for. Dias ot mals instrugdes poem see colocadaa se estiverem entre haves Ymlacaford.ct/ (sinprie 68 rineros de 0.2.9 6 totals */ mi nt conta, total: forleonta-e, total-oscortaelOscontats) ( Rotalracontas printf(ccontastd, totalatd\e*,conta, tote): ) ) ‘Acalda do programa sors ‘conta totale (© Drinbmento om linguagen © ‘WOCE DEVE UaAit CHAVES SH 0 CORPO DO LAGO CONTIVER MAIS DE Senora eeeeescs Se er eee oe ones Bre ae canal meee mes Sera eine Se eee ‘LAGOS for ANINHADOS Quando um logo est dentro de outro lo, dizemos que o Ia intone onshods Pic mont ee wolstuss rouse Ok ‘programa que imprime tabuada, Jr tabuada.c */ Pr gera tabuada de 1a 9 */ main() t int Ay5pks printf(\n") 4) { printf (\n For(iedghes Drintf(*TABUADA 00 334, printe(*\ne) For(i=lste3st04) ( sri) stds printt(P\a"); {A safda deste programa cabo numa tela ¢ yoo veré a seguinte ‘impressse: taba ‘TARUADADO2 TARUADADOS TARUADADO4 TARUADADOS 2 ane baie 4 ale aren Sxesie Geereeroces ( logo for mais externa (oda varvel k) éexecutado das vere ‘A prmoiea para imprimir primero bloco de tabuadas (do 2 a 5) © a Segunda para imprimir o segundo blocs (de 6 8). © segundo lao for limprime of Utulos. Os dolsTagot mals interns imprimem a tabuada propriamente dita, Ostroexemplode gos aninhadoséo programa invtela.csepuinte fs snvtelae */ (* prenche una parte do tela com caracteres graftcos*/ fain() (2 Trinamendo miner. Sala do programa: Note que \xDB'6 um caractere e um eazactere pode fazer parte da expresati de controle de peintf0. Agora que jé aprendemos @ trabalhar com 0 lage for vamos screver um programa mais elaborado que imprimnira um cared de natal O programa usa todas os ennceitosvstos até exteponto vale pena vos tenterentendélo, (ft natalie */ (+ imprine cartao de natal na tela */ faint) C char sess Sn 1903 rintt(+\nsinal interno diresto: sdsgetche()s SOCSCSCSCSCSSCSCSSSSSSSSSSeseseyyeyesesseseeys printt(*\nsinal tnterno esquerdo: ");-se-getche(): rintt(e\a\nes For($a0sie4s 439) For(kelkeBike4) Tor (Jedi Seo40-(2440k) 354) print printt("/")s For(JelsJe(2*4sk)s3e+) printf For( els c(24is8) Ses) printf printfa): > for to051<23 168) ( Tor (d-03 33%. printer] INP se) adhe printr("\n" for(i=0;e38:ts4) printt(™ ")s print (*FELEZ NATAL) for(i-0;se3lsie4) printt(™ Drint(*E UM PRGSPERO”19901\n") 5 etch) ee oes tos 8 as da tote torn ne (gat) ento oligo termina eo ontrcle do ass ASE ees tj fs lp ra a a A, ponto-e-virgula, vérias instrugies entre chaves ou ainda nenhuma ins- pe {Eas tatends opto vigula Es gr! wel wae pte se. pee (areal fel epee oecbaee seer ee ey, iniciatizacan ea wivtettestey ¢ pss Hee EE eT WEEE [Scceeceeaa>>>>>>\, 2 Peseta Coneer eree aren ere eeets Lh uz Nara. BUM POSPERO 19001 OLAGO while ‘Asegunda struturade lag vida om C 60250 while. A primeira ‘ist esta estrutura prece simples comparada a do lago for ela wiliza os ‘mesmos elementos, mas eles sto distribuldos de mancia diferente no programa, FORMA GERAL DO LAGO whil wlltexpreno da ests) Tstrugaor Sea expressio de teste for verdadeira (diferente de zero), po do lago while 6 exacutaco uma vee e a exprossio de teste 6 aval ovamente, Bat ciclo de teste o oxecugio érepetida at quo a caprossto usando um lao while a inve do lao for original. Jo Vacout.e*/ ‘inprine 65 muneros de 0 a 9 2 totais */ rain) t ‘nt contasos /* iniefalfza a var. conta */ int totaleo; /* inictaliza a var. total 4/ whle(contacto) ( /* executa Taco ate’ conta ser 10 #/ ‘totalscontay /* mesno que total=totalaconta */ print#(*contankd, totaleta\a"contat+,cotal): 5 ) A exeengo do programa éexatamenteamesma do latfer.c im situagses em quo 0 miimero de intorages 6 conhosdo do nemo, como ne progr faserh.co ago while menos apeoprada Neate cao olago fora cuca mnaiatra, SSSSSSSSSSSSSSESSSSSSSSSSSSSssesssy 8 Prinamant en nguogen © Quandoo Iago while mais apropriade?Olagowhile éapropriad om situagies em que-o logo pode ser terminado Inesperadamente por fondigies desanvolvidas dentro do lag. Como exemple, consdere 0 se- inte programa: f* contchar.e */ (* conta caracteres de una frase */ aig) C ‘nt conteos, printt(*Digite una frases\nt)s wiite(getehe()="\e") printf(*\n0 nunero de caracteres e* Sd Bis uma exocugio simples: Digits uma race aguas oe ive nescemeie aprender vires (numero decarscterene' #1 Este programa soicita.avoos que digte uma frase. Cada caraetere Aigitado é acumulado na variavel cont até que vob tcle , © enti é impress o total de caraeteres da frase. (0'CAGO whije # AIS APROPRIADO QUE O TACO for QUANDO A CON DIGAO DE THRMINO DO LAGO OCORKER INESPERADAMENTE. LAGOS while ANINHADOS, Lagos eninhdos permitem gerar programas interessantes, Por cxemplo, considee o soguinte programa que testa sua eapacidade do adivinhagéo. fi adivic */ ‘7 testa'a Sua capactdade de adivinhar una letra */ sain() ‘ char chle's' int tentativas? while(ehlae’s*) ( he rand(}826 #245 tentattvascl; printf(°\nigite una Tetra de /a/ a '2!:\0") WhsTe({engsten()) ch} ( printi(*ae ” incorrete, Texte novamente.\n\p*): Fentat vaste Drintt(*\ate ©" correto*.c)s Drintf(-\ivace acertou em XE tentativast tentativas) Brintf(*\nduer jogar novanente 2 (5/n): *) ehleseteche(): iguma exeeugo simples: ‘te nerrln Toole sovamete, (Goce oon movannte® abn © aspecto mais importante no programa adiv.c 6a expresso wee atch 40 oh) ‘34 sabomos que a fungio getch() reiorna um valor, agora este valor 6 atibuldo 8 variével eaactere eo, finalmente, comparado com 0 Conteddo da varivel eb. Note que colocamos partntess extras envolvendo a expresso de stribuigo (gota), Eaes paraiso reimente news, Poe ‘eprecodénsia do = 6 maior que a de ‘sto signifiea que na falls do (Menino linguagon pparintates,o testo relacional t= sera feito antes da atribuigio ou « ‘expresso seria equivalento a while(ctgethtac)) ‘© teria um valor verdadeiro ou falso (0 o 1). ‘Na instrugio| head 928 fo usada a funeorand( de biblioteca C que devolve um inteley aletério entre 0 ¢ 82767. Hsta fungio seré desenvolvida mais adiante neste liveo Acxpresiio rand) % 26 resulta o resto da divisto do rand) por 26, ito 6 um némero entre 0.625. Acste némero 6 samado ocarater para gerarletras.entro'a'e'2. 0 fatorial de um nimero inteiro N60 produto de todos os ntiros entre Le. Por exomplo, 5 fatril 6 Ix2xd4xb ou 120.0 fataral do 0.6 1 por dfinigto. 0 programa seguintecalelaofatoral do um nme, Jt fator.e */ JP encontra 0 fatorial de un nunero */ rain() t nt ma Teng resposta; white) rintt(*\n Dighte o numero: Scant (d°, bau) espostart vne(oun > 3) resposta * rum prince fatorial e's sld\n", resposta)s is uma axeeugtr 0 lago white mais externo 6 um lagoinfinito, Yost devers pres- sionar as tecss [Ctrl]{Break} para sir OLAGO do-while O attimo igo om C6 olago do-white que cria um cielo repetido ‘até quo expresso detest sta fala (ero). Fat aga bastante sina ‘Iago while, ‘A diferonga entre os dois lagos 6 quo no lago da-while o teste de ‘condigto ¢ avaliado depois do ago ser exeeuta, Assim, olago do-while ‘6 sompre executado pela menos uma ver. Forma geal: aot Instr: > wattacenpomee de one PONTO--ViROULA AQUI Enbors as chives nto sjam nocossrias quando apenas una Instraso ese presente no corpo dole deal 2 goriente ‘das pr abtntar opie Vamos escrver © programa adivinha.e baseado no programa ‘dive esrito ateriormente, agora om um Iago do-whle, Jt acvinhave */ 4% testa'a sua capacidade de adivinhar una letra */ fain) “ char ches int tentativass to ( eereceaccecee | che rand()326 42's tentativasel; printf("\nbigite uma Tetra do ’a! a °2":\n"); Wite((engeteh(}) ch) ( Ipriatf(rne e? Sneorreto, Tente novanente.\p\n*,c) fentativasess > Drintf("\nte o” correto'.c): Drintf("\nvoce acertou en #0 tontativas",tentatvas): Drintf(*\nQuer Jogar novarante ? (5/8): *)5 5 oetanchetie's QUANDO USAR do-while Bxiste una estimativa que aponta a ago do-while necesarios| somente ex 58 doe laos, Viriasra20esinflue na consderagio de lagos ‘que avaliam a expressio de teate antes de serem executados como supe ‘ina dla lg, ter aexrede ota antes do percorrero lago ajuda olitor a interpetar facimente o sentido do bloco fo instrugoes, Outra ruzto 6 a poscildade ds execusao do lago mesino ‘quo 0 testo soja faleo do inicio 0S COMANDOS break E continue (0 comando break pode ser usado no corpo de qualquer estratura de ago C, Cais a safda imedista do lao o controle passa para o préximo fstigio do programa. Se o comando break etiver em estruturas de lagos aninhados, afetars somente olag que o contém eos laos interns a este. Come exemplo, vamos tomar o programa fatore que us um ago lnfinito,einserir uma instrugao break. Pn fatorlic */ / encontra 0 fatortal de un unico numero */ Tong resposta; wnt) ¢ printt(*\» Digite © ausero: Sant", kun) rosposta- shile(aun > 1) ayes Tatortal e's Bld\n", resposta) ) ) ima interago do lago e pul 0 cédigo que eotiver sbaixo. Nos lagoo while ¢ do-while umm comando continue fr com quo ocontrole do programa va diretamente pao teste fontdiclonal e depois continue o proceeso do ago. No caso do lego for, 0 fomputador primelro exscuta 0 ineremento da Iago e, depois, o testa onudicinal, ¢ Finalmente faz com que o lag continue (© comando continue deve ser evita, pols pode causar diet: ddados do litre e confutie go se mantero program 0 COMANDO gato 0 comando goto esté disponivel em C para fornecer alguma compatblidade com as inguagens como BASIC 6 FORTRAN. Os ere- ‘ores da linguagem C, Kernighan e Ritchie, desprovam o su uso pois ‘ne existe nonhuma situagao om qu elo sejaabeclutamente necossirio fem C. Assim, este ivr no fardo sou uso em nonhum programa. A linguagem C-tem as trés estruturas de lags vistas anterior mento que pormitem ocontrole de estruturas do programs, eos eamandos 78 renimentoom ingucgon C ‘break ¢ continue que aumentam estas possiblidades asim o uso de foto torna-se demecessirie, ‘A instrugto goto tem duas partes: a palavra goto e umn nome. 0 nome sogue as convongbes do nomes de variavis C. Por exemple: soto parte, Para que ost instrugio opere, deve haver um rétulo em outra perte do programa. Um rotulo ¢ um nome seguida por dos pont. Plot dos Resultados\n" A principio vod? nunca presisard usar goto em seus programmes. Masse voce tive um programa cm BASIC ou em FORTRAN gle deve ser cconvertido para a inguagora Crapidamente, ocomando goto ir judo. ‘A instrugio goto causa a desvo do controle do programs para 8 Instrugio seguinte ao rotulo com g nome indiead, Os dls pentas #20 usados para separar 6 nome da instrugt, REVISAO 1, A possibilidade de repetir ages 6 uma das razes polasquais usames © computador. Os lags for, while © do-while sto as estruturas bferecidas por C para cumpeirem esta taefa. 2. Ooporador virgula permite que sam ine sais de uma expresezo no lap for. 8. Uma construgto egrupada por chaves 6 tratada como uma tics Instrugto. 4. Ocorpo de um ago ou while pod nunca ser exceutado. Entretantoo corpo de um Iago do-while ¢ sempre executado pelo menos uma ver. '5. Lagos podem se cloeados:no corp de outros ages & vontade om C. ‘6. Os operadores relacionlstém precedéneia maior que a do operador 4e atribuigdo, Portanto, expresstes relacioals contendo atribuigo ‘over ter perénteses. iadas 0 incrementadas (exgetehoo t= 0 7. A fungto rand) rotora um inte 8. Num lago while a expresso de teste ¢ avaliada antes do corpo ser executado. 9. Numlago do-while a expresso de testo 6 avalada depois do corpo do lage cor exccutado, 10, Um ago do-while 6 sempre encerrado por ponto--vigula. 11.0 comando brea caus a sida media do lgo que ocontém, 12, O comande continue forza apréxima interac do ago que ocontém. Noslagos while e do-while controle passa paraa exprestiode teste ‘enolago foro controle passa para a expressio de incremento, sleaténo, 13, 0 comando goto causa o desvio do controle para ainstrugtosegwinte ‘so roto indica. EXERCICIOS 1. Qual safda produzida pela exeeugio do lag soguinte? Ant 35 for( 4-36 5 200 5 a/=2) printf(*sd",a); 2. Qua asatda produrida pela exeeugto do programe seguinte? int) Ant 15 fFor(printf(*Inictalizacao\n"), 1-04 printf ("Teste #-34",1), icbs Brintf("Increnento\n*), 404) "FORA OD LACO 1 \n*)s eereeeeeeeeegegeeereacececerceces: SOS SSS SSPE EUEC ESE UE Eee eee Ee ‘names omlngwagon © [screva um programa usando um lag for quelimprima oscaracteres dda tabela ASCII do ebdigas 82 a 255 decimal. O programa deve {imprimir coda enractre, seu ego dcimal seu eid hexadecimal Baereva um programa usando um ago for que imprima uma linha ne tola com oearactere gréfico de oigo DB hexa, Aexpresaio de incilizagéo de tum Iago for 6 executada tm Sinica vez ants do Tago sr inciado Verdadeiro 1 Faso: Os dota bosoe veguintes produsem © mesmo resultado @)— for(ia0 5 $4105 $48) for(je0 : J) x tatrial ecrova um programa que ealeule © namero de combinaytes de n ‘objetos tomados r de cada vez. Os valores m ev devern ser solicitades ao ususie, xCr CAPITULO 4 COMANDOS DE DECISOES © Comando if O Comando ifelse Operadores Légicos I ees 0 Comando etse-if 0 Comando switeh 0 Operador Condicional Ternério Conandos de dactes 77 ‘Toda linguagem para computador precisa ofereser um minim de tuts formas bésicas de controle: 4. Bxecutar ume série de instrugtes. 2, Repoti uma soqhtneia de instrugGea até que uma certacondigao saa encontrada, 8._ Pratiar testes para docidir entre agbos alternatives, ‘A primeira e «sound formas voodj6 conhece, A dltima forma serd explorada neste capitulo, (Coferece 4prinipaisostruturas do decisio: if, else, switch ¢ operader eondicional © COMANDO if O comando finstralo computador a tomar uma decisto simples, Forma gers: ‘Mexpresso de teste) “neo Por exemple: fs bestific 47 (/* wostra'e so do comando $f 4/ nain() c char ch ch» getete(); F(eh m9") printf("\tWoce prossionou a tecta p.4 ‘Se voce digitar 'p programa imprimir "Voce pressionou a tec bb Se voctapertar qualquer outratecla o programa ao faréabsoluta- ‘mente nada SUSCECELECEUEUE EEE Ee EEUU EE EEEECEEs (7 Mrinameno em inguagen © (0 modo de operagio de um comando f 6 bastante similar a0 do ago while. Em ambos os caso obloo de instrugies no éexecutado 8 expresso detest fr falss,Entretanto,olago while pode executar bloco do instrugtes varias veces, enquanta que tm comanvo ite execua urna linea ve, sea expresso do testo for vordadeira, (© PROGRAMA QUE CONTA PALAVRAS DA ENTRADA, ‘No capitulo anterior, osrovemos o programa cnfshare que conta 9 ntimero de caracteres numa frase. O programa a seguir ¢ligiramente ‘ais complexoe contard ndo somentecaracteres mas também o nimero de palaveas da frase, fs contpat.c */ / conta caracteres @ palavras de una frase */ aint) t int caracteres = 0; nt patavras = 0; char ch print (*0igite una frase:\n*); white((hegetche()) te "\r") | /* 1e caractere @ */ caracteres 443. /* termina 0 Taco con . 0 corpo do lago 6 composto por duas instrugdes: ain cromenta.o contador do caractores a cada loitura ea segunda verifen 20 9 faractore é um espago branco e, so fo, 0 programa entende que una palaera fo datilografada e inerementa 0 contador de palavras. Como o Lluimoearactore dgitado nto ¢ um espago om branco, indleand términd ‘de ume palara,o contador do palavras irécontar um némeroa menos do ‘nimero do palavrasdigtadas na salda do lag. Assim printf) imprine palavras+ INSTRUGOES MOLTIPLAS NO CORPO DO COMANDO if Comonas outras estruturasjé vistas, caso vivias instrughos jam nocossriaa no corpo da comando Ifelas davon estar entre chaves, Como ‘exemple, reescreveremos 0 programa lesife aerescentando outras ins ‘trupbes ao eopo do comando if fr testifa.e */ (7 wostra 6 uso de multiplas tnstrucoes no corpo de un 1f%/ ain) if(getchet) == 'p') Brintf("\rloce presstonou a tecta p.")5, Dprintf("\rPresstone qualquer tecla para terminar.*); sgetehel + (Come 0 corpo do comand if 6 compasto por trés inetructes, elas dover estar entre chavs, Bm e/2inclulzas a Fungo getehet) na expresso de teste do ‘if, Bata instrug fez. uma chamada n getche() ¢ compara caractere ‘tornado com a letra po, so forem igual a exprossao toda assume um ‘lor vordadeiro, © obloce de instrugbes éexzcutato. 20_Trinameto gag ‘COMANDOS if ANINBADOS. ‘Um comando if pode estar dentro de outro comand if, Dizemos ‘entgo que o if interna eat aninhado, Eis urn exempler /* winhostfic */ (/ nostea if antohacos */ min() char ch Printf(*Digtte une letra de /a? a /2"s")5 ‘chegetche() in(en seta") Vetch '2") Print (*\avoce digitou certo 11 ye Este programa somontoimprimird a fase "Voce digit certo ‘so voc digits uma letra mine IMPLEMENTANDO UM ALGORITMO. Depaxei, um dia, com um ostranho método de encontrar © qua- rad de um ndimero posivo.O algoritm 6 0 segunte: 0 quadrado de um nimero positio mé ‘gual soma doe primeirosndmarestmpares, Por exomplo, 9 quadrad de 3 & 14345 vodese Sa1+3454749411 Este algoritmo pede sor tradurido na soguinte férmula mate- ‘tien que faclmente ¢ demonstrada por indo fits, oman dedi 81 ae 0 programa a seguir mostra como implementar este algoritme. fr quade.c */ ff Suplenentacso de un algoritn */ sain) ¢ Ant ny fy somaz printf (*Digite o numero ser elevado ao quadrado\n')s Sant (a ] printf ("0 guadrado de 4",n): teed) Tor(t=1,sonae0;ro0;sonat-t,n~ printf(*e! d*,soma): Bis uma exocupio: Cogunde dia Squndeadode 864 © COMANDO if-else [Nos exomplos anteriores o comando if exccutard uma nia ins trusdo x um grupo de instrugoce, #0 a exprocsio de teste for vordadira Néo fard nada soa expresso de teste fr falsa, (Ocomando else, quando associa of, exocutaré uma instrugio| ou um grupo de instrugées entre chaves, se'a expressfo de testa do comando if for flea. SSSSSSSSSSSSSSSSSSSSSSSeesssssssse $2 Treinamento om nguage ©. Forma gera: stexprento de teste) imirugto is Intenso Rooserovoremos este para que imprima ums mensagem caso 8 expreasto de teste do if ea fale [s testelse.c */ (7 wostea 0 conando {f-else */ aint) char eh; ch = gatehe(); intch Drintr(avoce prossioneu a tecla p.*); on Printf("aVace nao presstanou 2 tecTa p. \RACTERES GRAFICOS F IM TABULEIRO DE XADREZ. 0s caracteres grificos do IBM-PC podem ser usados para fazer ‘esenhos realmente atraentes, O programa soguinte imprime um tabu lei do xadror na tola. A ectrutura de eontrole da impresabo 6 eita por dois lages for, sendo um para controlar as linha eo outro para controlst 'seahunas. O corpo do lag interno 6 composto por um coma que reconhece quand imprimir um quadado chelo @ quand imprimir tim quadrado brane, Bisa listagem: ft vadeez.c */ ‘7 esonha un tabuTeiro de xadrex na tela */ nain() int x95 forlsotsy Gnortne una Hoh diagonal na tela */ main() int xs fortyeliycttsyes) ( /* passo de descida */ 94 Trtnameno om ingenge Comandeededuiter 65 for(uel;xc2tsxes) /* passo de Yargura */ If diagtac + ifta= 9). /* estamos na diagonal? */ 7 Snprine 2 Vinhas dlaponais na tela #/ Printt("\x08"); /#sin,desonha ret.escuret/ a ose vata Drintt("\x60);/#nao,desenka ret claro */ printe("\nt)s /* nova Tiana nt ys , fortyetiyc24iyea)( (* passo de descida */ or(aeisxctdixse) /* passo da Targura */ Acstruturade controle deste programa ¢a mesmada do programa drone, COMANDOS if-else ANINHADOS f perfeitamente posstvel aninhar sonstrugses if-else; veja sop saguinte! Hfbeeny) /* diagonal 1? #/ grimeCVDID: 7 cor escura */ Sflaenet-y) /* diagonal 27 +/ Drintt("\308");/* cor eseura */ ove Brintf("\xB0")s /* cor clara */ printe(*\ir); /* nova Tinka */ segeeseeeeeeageccerccaececcnoreece nen ee eee eS eee er Tee ee (8 Trenament om linguagen C ste programa 6 similar ao anterior, exceto no fato de imprimir 0) ela b) z= by Quando ser exccutaa instrugso x=; ? Quand m for menor 0 ‘gual a zero ou quaoio b for menor ou igual a n? Em outras palavras 0 estéassocado ao primeiro ou sogundo if? (O else é sempre associat ao mais vacente if em else, Ento, ‘for igual n-6 nada sora exceutado ose n for igus ¢ 26 a for menor do ‘que b winstrusao x= byeerdexccutada, Casondosojaistoc que vor’ quer, tse caves: 40> 0) ( feo 8) pele OPERADORES LOGICOS Coforece 3 operadores chamados Hens: BR logioo I agico OU 1) logic do negasio estos operadores! undrio &&¢ || siobindros, Os operadores gens sto geralmentespicadae a expreates relaionsis. comands deduces Se expl e exp! sto dus expresses simples, enti: ‘exp && exp2 6 vardadeira se as duas exp! ¢ exp2 forem vor adeies. exp! || exp? | 6 verdadoira 20 uma das duas exp! ou exp? for Yerdadeira ou as duas exp! e exp2 forem verd- ‘eiras, expt {verdadeira se exp for flea evicewersa. Alguns exemplos: 1a x&hY DEAE xc=85ty ar28) (0 que voot nto pode fazer: x8 /* erro-um operando"/ xly__ [erro este 6 um operador bita-it*/ Xi ly [erro espagoextra*/ Ex.” Prereo. esto ondorego dex*/ xBy [Perro este 6um operador bita-bit'/ Xisy [Perro esto 60 operadornio igual */ Podemos simplificaro programa diag2.c com o emprego de ope ‘rador logic, Oporadares logis #80 um poderoso melo de condenser & ‘arourconstrugbes if-else, Mostraremos usodoperadorogicoOU (\ |) eesorovende o programa diag2e. Jo diags.c */ J \morine 2 1inhas dtagonats na tela */ saint) i int ays for(y-tsye2Aiyer)( /* passe de descids */ |82_Trinme em ingeagen © for (wel sxct4sxts) /* passo da largura */ Hfbecny || x-2tey) /* diagonal? */ | RrIReTC an": /* eae escura +f printt("\xB0*); /* cor clara */ printe(*\n")::/* nova nha */ 0 programa vai gerara mesma sida que o diag2.c mas com wma ‘escrita mais elegante, Eis um exemplo que faz uso do operador F (8) P+ contdig.e */ ‘ conta earacteres © dightor on una fraze */ rain) ( ‘a8 numehar=0; ‘nt nundigt ted; printf(*oigite una frase:\n")s MnsteC(eegeteheQ)) != '\r') { runcharses Hf(e 210! a c <'9') ‘nundigitees Drintf(*\n0 numero de caracteres e! Ad° nunchar); Srintf(\n0 numera de digitos e* 4d" nundigi®); is uma exccugho: Cecontaig Digi tame frase: {arene fariam nota Onumerode digas? ste programa 6 uma modifcasto dos programas conchare © contapols Chae caracere ie una aso digs de O89 que Haeremh pure da fa Operator unio de nega! ein um valor diferente de ou verdadeco wo operand for um aor tro ou fio so operand for diferente de. ‘Veja mais alguns exemplos: tee) 6 verdadeiro quando x for maior ou igual a5. S€(tompatavra) so invés de geeerrercerncoeaeecerececeorerecrrrecrrces TRSCTTTELELELELULELEELELEUULE LE LEE EES (90 Prinamento om tinguagr C PRECEDENCIA 0 operador!é0 de maior precedénela, a mesma que ado operadar menos undo. Atabela seguint mostra as proedincia dos oporaores: Operadores “Tipos z iene “untriog; no lagico © mencs aritmdiico “19 sritmeticns oo sritmeticns relacionais relacionais Iogico E 1égeo OU aritmeticas de atribuigéo, O COMANDO else-if ‘Vamos, agora, ver um exemplo um pouen mais complex, Escre- vveromos 0 programa cale.c com os comands if ¢ else azinhados para, depos, reoscrewélo com else-if. Este programa simula uma ealeuladora, simples com 4 oporapton ealee J eMesadir com 4 operacos rain() t float num runes char 0p white(1) 1 /* sempre verdadeiro */ printt{(Digtte un numero, operador, numero\n"); sant (Caf Attn pst) itfope=te rintf(* = SF*snunt-nu): ) mt = Xf nual nung); ase ‘flop=='/') print" = 3¢"rsl fn); printe("\n\n") Fis uma execupto: Digho um numero, eperador, numero ees Digite won namora, operader numero Agora com else-it fs ealetic */ (7 ealevisdora com 4 operacoas */ fain). feat numt runes char op vinile(1) ( /* sempre verdadeiro */ print(-Digite un nunero, operader, nunero\n" Seanf ("oF Re "Anum Bap, nina); Sf runt rina) ” = 3°, nun -monz); “xf runt nine) 1 “Asmat me); 92 Trtimento engage A construgto else-if 6 uma mancira reformstada de ninhos tele. © COMANDO break ASSOCIADO AO if Mostraromos a escapada break de um comando if dentro de um Jago while com um jogo de adiviahagées, Neste jog, o usuério pensa un niiero entre 1 088 ¢o programa adivinharé qual 6 1 ounadivic #7 (programa adivinha nunero que o usuario pensou */ rain) ‘oat adiv, iners char chs printf (-Pense un nunero entre 1 ¢ 99, e\n"): Driatf("eu adivinhares qual e’. Digives\n"); Drintf(o\n %«" para igual, \9") Drintf(* “>” para mator que\n") Driatf(” "2! para menor gue.\n")s increadives0; wlteC ter > 1) ( printf("\n 5, <= 4 K0FP\n" adie): finer /= 25 AM{(chegetche())=='= ‘break else If {che=!>") div 4 Inc ale Bai = iners ) printf(*\s0 nunero e? &.0f.\n",adty): Princ f(*\ncono SOU ESPERTO 11111 7): “Spare menos que ar Sevenenr Seana Senet COMO SOU ESPEN 0 comando break 6 freqdentemente wsado quando ccorre ume condi repenting onde & neceasirio deixar olgo antes da expresso do Jago se tornar fale. 0 COMANDO switch CConstrugies ites faciitam a esrta de programe que dovam ‘ccolher uma entre duasaltorativas. Algumes vere, entrotanto 0 pro- ‘rama necosstaesclher uma ontre varias alterntivas [Embora construgbes else-if possam exccutar testes de vérios rails, elas nio so do maneira nenkura elogante.O eédigo pode far Afi de er soguido v confundir até mesmo seu autor nun momento futuro, Para estes cates C oferece a construgo rwitch, 0 comando switch ¢ similar ao else-if mas tem maior fle axbildade e formato limpo e claro. Forma geral: SSSSSSSCSSSCSSCSSsSssessesesssessessssssss' _Prinamnto a linguagn C Instracoes; /opeional"/ ke ‘opelonal Tnstracoos; pein") , (© nosso primairy exemple caleula odia da somana a partir deuma ‘data, 0 ano deve ser maior ou igual a 1600, pois neeta data Rouve uma ‘edefinigd do calendério, dtasen.c #/ Jp eahal's da soon a party de ame date */ uo int OMA, 15 Yona int Fd; ‘ol ( printf("\nbigite a data ra forms dd/m/aasa: cant. /Ad" 80,88 28) J wefte(Heaso0 | HL |] #12 || oe |] 035 Foasbess (el) ay Fron/tets 4 Pers suite FDL ) vhite(getche() 1-27) mands dette 96 Observe a exoougio do programa. ‘igen data na forma ddmevaaan 111975 ‘lr ‘Digeadatana forma ddmnvasnn: 12001970, Sepandateiea Disses daeana forma dameaann: 071978, 0 comando switeh avalia a expreasio entre parénteses, apis a palavea iteh,e compara seu valor com o rtlos das cada. ‘A expresso entre paréntasas deve sor de valor intiro ou ea- core (Cada caro dove ror rotulado por uma eanstante do tipo intro ou caractere ou por uma exprossio constante, Voeé nao poderé usar ua ‘varldvelenem uma expreseolgica para rtul, Estaconstante deve ser {erminads por dais pentose nao par pontoe-vrgula, PPoie haver uma ou mais instrugies seguindo cada ease, Estas {natragies nfo necsstam esta entre chaves. (0 cxrpo de um switch deve estar envelto por ehaves, ‘Seumeaso for igual avalor da expresso, a execusiocomega nek ‘Senonhuam caso for satisfeltoeexistirum caso deft a exocucéo comecard rele, send o programa processaré as instrughes sequins 80 bloco nite. Um default 6 opeional ‘Osrtulo dos casos devem ser todos diferentes, (0 comando break cata tr sada imediata do switeh, Se nto ‘existirum eomandobreak segundo os instrugiesde um caso, programa ‘oie executando todas es inatrugies doa easas abso eescreveremos 0 programa ecicZc fazendo uso do comando ‘siteh fr catea.c */ > calcuiadora con & operacoes */ aia) |Meat m tnguagom © ‘ float nu nunes char 0p5 whsle(l) (/* sempre verdadeiro */ printt(-Digite un nunero, operador, munero\n Sean (°XF Se 6°, thu dop, knun2): soiten(op) ( printf(" = 9°, numtanun2); bresk frintf(* = f°, uml -runz) break rintf(* © f° num 4nun2); break: case 72 rintf(* = 8", numl/nur2); Breaks efaut Printf(*Operator descorhecido" ) print f(™\n\n" (0 programa eaiode mostrar casos stn break fr ealetie */ (7 caleviadora con 4 operacoes */ ming) ‘oat aun runes chat opt vinile(1) ( /* sempre verdadetro */ Print f(*Digite un ninero, eperador, nunero\n"); seant (xf te af" Nosta verso © usuério pode digtaro sinal tiplcagto 77 ou para dvi, 0 OPERADOR CONDICIONAL TERNARIO Comindosdclies 67 unt op, Anum) soulteh(op) ( Drintf(* = f° munt*nuna); Breaks case" cate AV Printt(* = &°,munl/nun2); break: cerns Print (*Operador desconhec do"): ) Brintt(\v\n")s ) ‘ue para mul ‘Terminaremos este capitulo com uma breve discusso sobre 0 ‘operedor C que possui uma construgho um poun estranha, chamada operador condctona, Ele nos d4 uma maneira compacta do expresear ura simples inetrugio ieee. Este operador consste em dois operadores separando aexprossto tora em trs diferent expresises¢ 6 0 Unico operador ternétio er C. SSSSCECCEC ECCT U ES VU EVE UUET EEE COS (8 rsnament em Unguagom © Comandos de diss 29 Forma goral: 8. Oporsdores logos goralmente so aplcados a expresedes relacionals ‘amo operandos condigho? express, : expresso 2 A condigio consiste em uma expresao ligicaavaiada como ver- dladeiea ou fal A condigio 6 avalinda o 40 verdadeira (na0 2270) a expresso condicional toda assume o valor da expres 1, se fu a expressao fsscume o valor da expressto 2 Eis alguns exemplos ax = (runt > sum) ? mand mune Esta expressto 6 equialente &construgio Helse soguinte, mas bem mais compact 6 (out > muna) nie = monly oe ax = nun Outro exemple ahs = (oun <0) 7 -nan : nun; Exprosas com o oporadar ondicional ni sio necesirias, visto ‘qu00comando else pode substitulas 840, entretanta, mais compactas ¢¢geram um edge de maquina menor. REVISAO 1. As principals estraturas do decisto C sto if, Helse, switch © 0 operador condicional, 2. O-comando if ofereco wm meio de ecolha entre executar ou nfo um bloc de instrugbes. O comando if-else oferece um melo de executar ‘um ou outro bloeo de instrusbes, A. Hxprosobes légion ao avaladas de enquorda para a direitae a av Tagao termina Togo que & conhockla a veracidade ow flsidade da oxproesio toda 5. O comando switch oferece um melo do oscolhor uma entre muites ‘opgées. A expreseta do comando switch dave tor‘um valor inteizo ou char constanta, As expresstes de cada caco davemn ter um valor inteiro ‘ou char constant e dover ser todas diferentes 4G. Num comando switeh o controle do programa pula para o cao em que ‘expresso for jgualdexpressia do switeh ou, se no houver nenhim ‘azo igual, parao default. Um caso daft &opeions 7. Ocomando brenk provoca uma sida imediata da construgho switch 8. 0 oporador enndicional opera aobre tet exprosides, A primeira & salladae, se Yordadoira, a expressio toda assume ovalor da segunda ‘presto; caso contratio, assume o valor da tercoira oxpressio, BxERC{cIOs, 1, Noma simp construgio if som else, 0 quo acontece £0 a condigio seule a If for float 4) 0 controle prosura plo tltime else no programs. ©) Nada ©) O controlo pana pare ainstrugto coguinte ao I. @) O corpo do comando If exccutado, 2. O programa soguinte 6 coreto? rain() ‘figetche() = /a") then rintf("\nfoce tecTou 3.*)5 0 Trenamanto em inggen C 8. O programa seyuinte 6 correta? ain) c ‘nt a,b, area: scant a 2,20); ifaend ase sreaeath print f(*\na ) 4.*,area): 4. O programa soguinte 6 correla? main) fot a; seanf ("td 14", 4a, 8b); sea te) >) 5. Aprincipaldiferenga ne mode de operagio de umn comando ie de wm je Iago w a » 8 sxpressto eandsional seguida ao comando 6 avalada if rentemente, © corpo do lage while 6 sempre exeeutado, ¢ 0 eoxpo de un ‘comando ifsomente€ 2a condgio Tor verdadelra «© corpo do lago while pode sor exoeutado virias voze ‘corpo de um comando if somente wns; Cand de dacisen_101 a expreseio condiional 6 avaliada antes do'eotpo do 1ago ‘hile ser exeeutado, mas depois do corpo do wm commando i. 6. Ainstrugio else nama construsio if-else 6 exocutada quand: 2) expresso do condigto seguida no if for fal 2) expresso de condigio seguida ao if for verdadeira; ©) expresso do condo seguida ao else for falsa; expresso de condigo soguida ao else for verdadera 7. O programa Cabaixo 6 correto? rain) f{geteh()ee’a) printe(te! a") ;else printf (nao e” 8. Verdadeiro ow False: o compilador intorprota elseif do modo di forente do else, 8, A instrugio soguinte « um particular elso:if numa malha else ‘executada quando: 4) .expressto condicional que sogue o elseif for verdadeira e {ods as condiqbes anteriores forcrn verdadeias; 2) expresso condicinal que soguo o elseif for verdadeira e tors as condigdesantorioresforem falsas; ©) cexpresato condicional que segue o else-if for fala e todas ‘5 candigdes anteriores forem verdadeiras @ acxpressio condicional que segue o elseif for fala e todas ‘scondigdes anteriores forem falas, 10. Nom programa, o comando else faré par com qual i cima’? 4@) O thimo ifeom mesmos requisitos quo o else, 4) O hime ifsem else, ©) O time ifn envalto por chaves, ‘& O.iltime if no envolto por chaves gem else, tee eK 102 Pringmeto on lnguager C 14, Indiquoo valor de cada uma das soguintes expresses: int int, float 23.3, a) icita an ) xi yen20ry a) i B tert P) 18k) 8K Bb ills-38&0 D i2j8& ook migi || 225k. nize? 0 i=2|}ae4 UL p) xn 50 &&x!210|| i>) 12, Eacrova expresses equivalentes sem user 0 operador do nogagio @) Mies B) le 1 15.A vantagem de uma construgio switch sobro um elseif a condigao default pode sor usada em switch; 2) switch fornece ums leitura mas fill de se entender; ©) diveraosinstrugses diferentes podem ser exeautadat em cata caso de um switeh; 4) diversas contigs diferentespadem usar uma eseatha act terotteda nim ewltah 16. A soguinteeatrutura switch 6 coreta? sutten(num) ( rintF(*Numaro e" 1°); case 2; Drint®(*Numero @! 2°) foley Drintf(*0 numero e’ eiferente de 1 e 2°); ? 17. Verdadeiro ou Fats: 0 comando break deve ser usado segundo as instrugbes do cada ease num switeh, 104, Treinamanto om ngage © 18, A soguinte estrutura switch @correta? sutten(temp) ¢ cease tamp < 62: printf(*Esta verdadeiranente frio! case temp < 60: printf ("Que tenpo apradavell"); Break: default: Drintf("Certanente esta quente!*); ) 19, A tarefa do operador eondicional @) selecionar o maior entre dois valores; 2) selecionar o mais igual entre dois valores: ) aelecionar um de dis valor alternativamente; {@ selecionar um de dois valorasdepondendo da cdg. 20, So nam 6-42, qual 60 valor da expressio condcional? (um ¢ 0)?0: nummum; 21.0 valor da seguinte exprassio 6 obscure. Use paréntosss para dab, aaxcy?xcatareiy 75 km/h, > 05, kmh, > 55 kan/b, > 45 km/h, < 45 km/h. Use comands if-else ‘sninhados, 24, Modiique o programa sadreze para que imprima cada quadrado do tableiro com 2 linhes de altura e 6 colunas de largura ao inves de 1 Tina de altura e 2 colunas de lngura, Cumondeededeinte 105 25. Modifiqueo programa ciag2e para que imprimna 4 lina: as primeie as duas como slo impressas em diog2. teresa, uma linka vertical passando pelo contro do retAngulo (onde as das primeiras ‘0 corlam);e @ quarta, uma linha horizontal passendo pelo mesino {quia Use a coir elseif em mala Nios peradoes 26. Modifique o programa do exertcio anterce para que trabalhe com oporedresligicos eliminandoo elseif xn malha, 21, Recreva um programa que eneontre o menor inter» positive m que aceite as segues condigses: 18 = xinteirose resto 2 Yintelos e recto 3 VT =Zinteiroso resto 4 eeneeerteneeaenaaaeeeecnraceececenannnns —— a EEE CAPITULO 5 FUNGOES se Pungbes ¢ Estrutura de um Programa ‘= Pungbes que Retornam um Valor # O.Comando return x Fungées ndo Inteiras f= Argumentos e Chamada por Valor Pungdes Recursivas Classes de Armazenamento ‘auto, extern, static, register = Uma Fungo que Gera Nimeros Aleatérios ‘© Consideragdes Sobre Conflitos de Nomes de Varidveis 0 Pré-provessador C ADiretiva #define ‘Macros ‘ADiretiva #include Outras Diretivas ‘wundef #if #ifdef wifndef #else #endif Ponies_107 FUNQOES E ESTRUTURA DE UM PROGRAMA, Fungies dividem grandes tarefias de computagio em taretas me. ores, epernitem ts pessoas traballarom sobre. que outas ji fizerat, ‘4g vee de partir do nada. Funes apropriadss podem frequentemente ‘sounder detalles de operago de partes de programa que nao necessitam Conhecd-as, esclarecendo 0 todo fciitando mudangas, Voce jf usou a funglo printf) om conhecer detalhes da sua programacio (O que é uma fungio ? Uma fungto 6 uma unidade de eiligo de progiama stitéaoma descnhada para eure uma tarofa particular, ies eficienteso Ficus do usar; programas fem virias pequonins fangbes a0 haves de Peas da maior tomanhe, Provavelmente a principal razao da oxistoncia de fungbes pe ‘ir que oprogramadortenha de eserever o mesmo cédigo repetidas vers, Suponha jue vootteuha, em au programa, um perdgrafo onde eo caeula fe qundrado de um jadiante, no programa, vob precsar dia mesma instruc ‘isla novamente. Erm ver diato voce podevia sltar para uma socio, do ebdigo, que calcula o quadrado e volta hhovamente a mesma posigio, Trabalhando assim, una simples ses do ‘idign poe sr usuda repetias voros no mesmo programa. FUNGOES SIMPLES O uso de una fungte pode ser eomparado 8 forma de slugurmosa imaode-obra dle lguém para executar um trabalho espestfeo. Awimas ‘eros a ineragto éom semelhante pesioa é bem simples; outras vezes, tnais complex. Vamos comogar com um eas simplos: nosso exemplo era tim fungio que imprima 20 carseteresslidos numa linha. Asai ests ‘lisiagem completa que consiste na fungie main) ens funcho linha), fs molétext.c */ (> Ghvalve te texto por una moteura */ aint) t 108 Trenamant es tinguogen © inna Drint(*\D8 UM PROERANA EC \xD8\n"] VinhaQs Po Vinal) */ ‘P+ desenha ona Vinha solida na tela, 20 carscteres / Tohal) i Ant 45 for (Hots Sos rintt(*\e" print ("a"): ) Asada sore: ESTRUTURA DAS FUNGOES EM C ‘Como wood pode ver, a eatrutura de uma fungio © & bastante somolhante 8 da fungho main). A nica diferenga € que maln0) porsui special, Como vimos no Capttulo 1, a fungio main() ¢ 8 fa ser chamada quando 9 programa 6 exccatao. [No exemplo anterior, a fungio maint) foi coloeada no comego da listagem, Poderiamos eolocar a fungto Inbal) primo o o programs trabalaria exatamente da mesma forma. "Todas as fungées em C comegam com um nom seguido de pa inteses {que envolvsou nto uitalistade argumentee) e,apéeisto,chaves “que envolvem o corp de fungi 09 (CHAMANDO FUNGOES Do mesmo. modo quo chamamos uma fungio de biblioteca C (printf), getehed), ete) shemamos noseas prépriss fungbes como Tinhad. Os parontéces que soguom © nome sio nocossrioa para que 0 compilador posta diferencia achamada ama fungdode uma varavel que ‘oot esqueceu de declarar. ‘Visto que a chamada a uma funglo constitu! uma instrugto do programa, dove sr encsrrada por ponto-evirgul, Anka Entretanto, na definigo de uma fungio, o ponto-e-viegula nio pode ser usado VARIAVEIS LOCAIS. ha) chara that) ¢ printf. As varivels queso declaradas dentro de uma fungio sto cham das varioeisloaie eno conhecidas somente dentre do seu proprio bles. Um bleco omoga quando o computador encontra uma chave de abertura (()e termina quando o computador encontra uma chave de feehament 0 Cada fungio pode chamar outrasfungies A fungio a fingao printf) oa fungio main() charna I ‘Um dos aspectos mais importantes que voc deve entender sabro ss variveis lorain 6 que elas existom apenas durante a execugao do bloco ‘locédigo onde esto doclaradas; sto é, uma varavel local 6 eriada quando ‘se entra em seu blocoe destrufda na caida, ‘A varivl jcriada na fungéo Tinka) ¢ conhecida somente em linhad);¢ invistval&funedo main), Se adiionarmosainstrugioabaixo A fungto maln() (sem deelarar a varavel print SOOO OEEEEERREAEREAARR RARER eee ee ee ee ee eee O_Prinaneno em tingusgem C teremos um erro de compllago, pos main() nfo conheee nada sobre osta variave. Povlemos declarar uma outra varével jem main(); ela ser uma -varigvol completamente diferente eseréconheida em main) endo em Tinhad. ‘Uma variéve loel 6 conhocida em C somo varivel"automética’ pols 6automaticamenteeriada quando afungio échamada edestruida na ‘aida, UM EXEMPLO SONORO ste exerplousaréo caractore especial \x7 chamado BELL. na tabela ASCH Beto earastere provoca unt beep sanore no altoZalunte do 71 boepteste */ (> testa a funcao dotsbeep */ faia() otsbeep(): printi("O.gite ue earactore: ")s gotcha) aisbesp(); ) 7 dotsboopt) +f (7 toca o auto-falante duas eres 4/ ‘ossbeep() ‘ Ant ky printf(*\a7") For (kel sKeS000;4++) print(Ner"): Pgtes 101 FUNQOES QUE RETORNAM UM VALOR, Diseuiremos, agora, uma eapéei lgeiramente mai complicada de Fungo: a quo retorna um valor. Voc j4 usou uma fungio deste tipo, igetche() qua dovalv, a fngao que cham, o valor do primeiro earactere Dresslonado no teclado © préximo programa cria uma fungio quo 18 um careetore do teclade o, se for maltscule, converte-o em mindsculo, Po enue */ 7 testa 2 funcao minasculet) */ main) char es printf(‘Digite ‘2° © depois "b's Sheninuceuto()s witeh(on) ( rintF(*\wvoce pressionou ‘a breaks ease 'b’ rintf(*\ntoce presstoncu °b*."}; breaks ofault: srintf(*\nvoce escolheu alge desconkocieo,*) ) ) 1° winuscutot) */ ‘7 retorna un earactere */ ‘> converte para minusculo se for aatusculo */ iniseula() ‘ear hs chagetche(s 7 Ye un caractere */ 112 ringed on Hg © $f(ch D/A! aM ch eZ!) /* 50 matuseulo chee fata (P+ comerte para minuscuto */ return(ch) (7+ devolve valor do earactere */ ? (© COMANDO return Nos programas moldtet.c e beeplest.c mostramos fangs qu retornam ao programa que charnou quando eneontramn a cbave() ) qu termina a fungto, Ni ba necessidade de una instrugto return, ‘Ocomando return caus atribuigao de qualquer expresso otro pardnteses & fungto contend o return, Entie quando mindseulot) & ‘hamada por main ela adquireovalor do carecterolideeconvertido em rmindeculo. Avarivol eh é local mingscuto(), as ovalor de eh ¢ mandado para main() pelo comando return, Bste valor pode, enti, ser atribuito ‘uma variavel, como no nosso exempl, 08 fazer parto do alguna expressao, 0 comando return tem dols uses importantes, Prmoleo, vos! pode usar returnd pars devalver am valor © retornar, Imedistamente, ‘ara. préxim insteugh do digo de chamada Sogunde, vocé pout, fem os partes, pars enusar dina saa imediata da fungae na qual elo ‘0 encontra; isto 6, return fai com quo a execugio do programa volte ‘para ciligo de chamada asim que o computador encontrar este coman fo, o que ocore, em geal, antes di lime instrugio da funeto. Voce pole colocar mals de umn comando return em suas fungoes Como exemplo vamos reesereer a fungio mingseulo() eolocando dais ‘comandos return, /* winasoulo() */ ‘ retarna un caractere */ ‘7 converte para minuseuto se for miuscuto */ sinuscule() char hs gies 113 chogetche() 77 Ve un caractere */ f(ch >= WR ch co raturn(ch + 'a'-/A°); oe eturn(ch) 2!) f* se aatuscute 2 */ (7 evolve convert ao */ 7 devolve sem converters/ HORAS E MINUTOS Este 6 um outro exemplo do fungi que retorna um valor. O programa chama a fungéo minutes() que solieita & hora e minutos x0 ‘oso ealeula « dferenca ene dis tempos Pr winutsve */ [> esteuta a diforenca entee dois texpos #/ aint) c int inst, minses printt('Digtte a prineire hora (hera:min): "}s Binsleninutos(): Drlnt(Dighte a segunda hora (horasmn): bins2enintos()3 Drintf("A diferenca e” %4 winutos." wins2-nins}); ) P+ minutos() */ (solicits horacninutos */ (> retorna hora en minutos */ ininutos() c fnt tora, si seanf ("1d thora, amin); retura(hora"6d + ain): , 114 Trine on tnguager © UM NOVO USO DE seanf Se voedprestou atengo deve ter notado algo novp no aygumento| ‘to seanfl). Os dais pont entre ns espoelficagies de formato Se Sd id ora Amnon ‘Quando um caracere esta presente na expressto de controle de seanf0 ele deve sor dita polo usuirio na posigao ond se encontra Asim, vooe devora dgitar dots pontos entre 0s dois nimeraa. Se wood pressionar qualquer outra toca, anf) terminard imediatamente sn txoeugio com esperar que o outro angumento (minutos) veja digitado LIMITACOES DE return © comand return() pode retornar somente um dnico valor & fungio quo cham, PASSANDO DADOS PARA A FUNGAO CHAMADA ‘Omecanismo wsado paca tranamitirinformesSespara uma funsio 6 chamaco argumento. Voe® jt usou argumentos nas fangées petal) seat. ‘Vamos construc uma fungio que rotor o valor absoluto do urn ‘uimero, O valor abgoluto de um németo & ¢ proprio namero quando o sinaléjgnorado, Por exampla, valor abeolutode 6 € 5 0 valor aol do-Bétamberns, /t testabs.c */ (teste funcao abs() * int) ( print ) 1 ta" abs(0),abs(-3),abs(20)) Penson Us fr abs) */ 7" retorna 0 valor absolute de un numero */ abs) int x: return((x <0) > sx): /* Verbra 0 operator temario? */ Adefinio da noaea fungo omegs com das linha sn iat ‘A primeira linha informa ao compilador que sbs() requer um fangument, ¢ esto argumento soré chamado x A sogunda lisa é uma ‘elarapio que informa ao eompilador que x6 do tipo int. Observe que !angumentos so declarados antes da chave que marea o inicio do corpo da fungio, Hstas duaslinhas podem ser condeasadas em uma: sbatnt =) ‘A vavvel x 6 na vordade uma nova varivel ¢ & chamada de aanzumento Yormal” fancionanda exatamente como uma vrisve local da Fungo; ito ¢, 6 eriada quando a funcéo inicia sua execusdo e destruda quando a fungi retorns, 0 primo exemple chama virins eres fungéo bar() que recehe tum argumento e desenhia uma barra horizontal do tamanho do valor do frgumento rocco, fr bargratsc */ (7 desenta un eratico de barras */ po printf(*Lutza\t") Bar(2): prines(*cheis\t)s Bar(at) printf (*Regina\t") Bar 34s 116 Prints inguagon 6 printf(“Cindy\t") 5, Bar(ea printf("Harota\e")5 bartl5)}: ) J bari) */ 7 fancao grafico de barras horizontal */ bar(pontos) nt pontoss c (* declaracao do argurento formal */ J trace dupe */ A sald sod: Lutz Chris = Regina Cindy rota PASSANDO VARIAVEIS COMO ARGUMENTOS [Nos xcmplosnterioresn6s passamos constantes como argumnen- tos para as fungées bar()e abs(). Podemos, etrotante passa varia a fungio que cama, como mostra uma vatiante do programa barsraf: Pt bargraflic */ (7 dasenha um grafico de barras */ fain) ‘ {nt enpontos; wine Pumps 17 printf(*(0 para terminar) Pontos = Seanf(°td" enpontas); ‘#(lenpontes) breaks ese ‘bar enpentos); ) ) fr bar) + ‘P fareao erafice de borras horizontal */ bar(pontos) int pontos: /* declaraczo de argunento formal */ « nt 3 for( Jal: Secpontosisey) printe(*\xi0); 7 traco duplo */ printfl'\n): > (0 para terminar) pontos ~ 10 PASSANDO VARIOS ARGUMENTOS So mais de uum argumento 6 necessério, podem ser passados na lista de angumentos soparados por virgulas. Podemes passar quantos ‘angumentos desejarmos para una fonglo, A souir ests um exemplo de tim programa que passa dois argumentos para a fungio retangO), cio proplnito ¢ detenhar retAngulos de virios tamanhos na tola, Os dois Ergumentos sto a largura e altara do retAngulo; onde cada reténgulo representa um comodo de uma casa. [n desconos.c */ 7 esta'a funcao retangt) */ 118_Treinamento om tnguogon C sain() c printf(*\nSala\n"); retang(22,12);, Dprintf(*\icorinnaye") retang(16,16); print ("\nBanhetro\a" retang(,8);, printF("\ntuarto\e"}; retang( 12,22); a) /* retangt) */ ( desemna retangute */ votang(Iargura, altura) tnt Targura,alturas i Ant 34k largura /=25 altura /=dy for( Jets) ¢= atturas $44) ( printr(AQt for(kel;k c= Varguras ke) Drintf(*\s08")5, printe(™\a") ) ) Bato programe imprime o nomedo cmodo e desenhaoretéigulo ‘orrospondente ds suas dimensbes, — a USANDO MAIS DE UMA FUNCAO ‘Voot pode sar quantas fungoee vor’ quiser num programa, © ‘qualquer fungi pode chamar qualquer outra Em C no & permitido dfinir uma fangte dentro do outea tas 1 fungies so vivo por todas as outras, 0 programa moldtestcimprime um texto, envelto por uma mol: dura nocanto equerdo da tla, Vatos eaerover una funcao que imprime ‘espagos para centalizar a sua eld J polstexi.c */ J central sza am texto com woldura */ aint) 2592208(30}; Tiskat): espace=(30)5 Drintt("\x0B UM PROGRANA EHC \xDE\n" espacos(30)5 Virmat)s > stat) */ {deat Ga Via sida na tla, 20 caracteres +7 feb « printf\n")s 1H0_Trinamento em inguagen C + espacos() 4/ 7 inprinn espacos */ fepacos) int ss for(i-0; 0 printf A slda srk O préximoprogramacaleulao quadrado dedoisinteirs fornevidos pelo usuario. Afunio main0) chama tr ings A primeira ror 9 esullado ja calla, A sogundsaealela 6 quadrado dos arguments © teresiraretoraa a soma do dois meres, J multsfunce */ ‘7 testa funcoes soma, Sqr e samasar */ rain() c nt nun uns print (*Bteite dots eros: Seanf(" "nual Anan); PrIntf("R soma dos quadrados e* $4", samasqr(nent une); 2% sonasar() */ /* retorna a sina dos quadrades de dois argumentes */ seoasge( 3h) int Jaki ‘ return(soma(sor(3),s9r(k)))¢ fh sa 4/ { retorna o quaéraéo do argunento */ ser(2) ant 2: ‘ return(at2); ft soma) */ (7 retorna & sone de dots argumentos */ som(xay) inea t return(xsy): FUNCOES NAO INTEIRAS © tipo de ums fungfo & determinado pelo tipo de valor que ela retoma endo poo tip de seus argumentos, ‘Até agora vemos trabalhado somenta com FungSes inteiras. Uma angio 6 dita do tio intoira quando retoraa um inte ‘Se uma fungéo for do tipo nfo inteira ela deve cbrigatoriamente sor declarada. So ved omitir a declaragio de wma Tuneéo, assume por ofault quo a Runcto 6 int; sto 6, a fungdo retorna un int. Ume fungi (queretornaum char oun retora nada pd ser consierada como intoira. ‘Vamos enalisar fungées que retornam tm valor diferente de int, por exemple, um tipe float. [No programa seguinte a funpio main) solicita ao urustio que ‘ornegn oral de uma esfora,echame a fungso area) que calcula a rea a ectora na forma de ponte Mutuante, fp estera.c */ [P ealenla'a area da esters") @ 122_Tyinameno em guage sxint) fhowt area(s /* declaracas de Foneso */ printt(Ofeite o rate da esfera: cant "strato rintt("A brea da esfor ) 4.20 area(rate))s + area) */ (= retorna & area da esfera */ Float area(r) /* oeFinicao ¢a funcao */ Feat rs ( Toturn( 4 # 3.14189 + 7 * r); /* retorna Float */ , Note que a nia diferenga entre # declaragso de uma fungno e a eheca se teclanun e” par ou Inpar 4/ barinpar() c ‘extern tecTanum; ‘f{tectanun 2) Drintf("taclanun a” fnpar.\n}i ene Drintf("tecanun @! par.\n)s 190_Pelnameno om ngage neost vot) */ Foe Se aclu ot nagat v0 97 rnegat vol) ¢ extern teclanum; e{tectanan < 0) Drintf("teclanun e” negativa.\n}s ase Dprintf{"teclanun e* positive.\n}s Uma variaveldefinida fora de qualquer fungi dita externa, A polavra extern indica que w fant usar uma varivel externa. Este tipo ‘ie declaraga, entretanto, nfo obrigatria soa defnigo orignal corre rho mosmo arquivo fonte. ‘Aprox vorsio de extern & completamente corets fx extern.c */ Je teste uso de variaveis extern */ Ant teclanun; /* variavel externa */ main) printf("0igite teclanun: Seanf('a"kteclanun); parimar() negative(): ) fe parinpar() */ ‘hace se teclanun 0° par ou separ */ fariapar() ‘e(tectanum & 2) Drintf("teclanun e” inpar.\n)s aise ‘rintf(*teclanun e” par.\n): anger 131 (> negative) */ ( checa se tecTanum a nagativo 4/ hegative0) c ‘f(tectanan < 0) Drintt("teclanun e” nagativo.\n)s alse rintf(*tectanun e” positivo.\n)s ‘Vaviaves externas retém sous valores durante toda aexecusto do rograma, mantendo sua posigi de memriaalocada, portanto so dever. Sor isadas ge vos! tver um 6time mative para isto. O uso de arguments ‘Sofungooe 6 umn métod prforivel para pases iformagoes para a fungio (CLASSE DE ARMAZENAMENTO ~ static ‘Vativisstatie de ui ldo oe assemelham as automiticas, pols ‘so conheldas eomento a8 fungies que as declaram ede outro lade se fscemelham fs externas pois mantem seus valores mesmo quando & fongio termina Declaragies static tim dos wi importantes eats. © mais clementar é parmitir a varivels locals roterem seus valores mesmo apc 6 tdemino da exeeughe do bloeo endo sio declaradas fr astaticne */ ‘> mostra a uso de variavets static */ main() ¢ sa) sonal): sama) ) 7 soma) */ (= usa variavel static 97 ‘enal) ( 152 Trinament em lingaage © static int 0 printe("t = d\n", 544); d A sald sends ‘Observe que Indo ¢iniialzada a cada chamada de somal). VARIAVEIS ESTATICAS EXTERNAS. (© segundo e msispoderoso uso dostatle¢ssoolado adeclaragbes ‘externas, Junto a construgbes extemas,pormite um mecanismo de pi ‘vacidade’ muito importante programagéo modula, A diterenca entre varévois externas o oxtarnas estiens 6 que varidveis externas pom sar ude por qualquer fangto abaino do suas oclaragées, enquanto que varidvois externas estates somente Poder ser usadas polasfungtes do mosme arquivefonte e abaixo de suas de laragoes, Como exemplo deste mecanismo de privacidade, escroveremos uns fungGes que goram nfinerosaestitiog UMA FUNCAO QUE GERA NUMEROS ALEATORIOS ‘oct jf usou uma fungo de biblioteca C que gera nimeros ale trios, rand. Agora vemoscriaranoss propria fungio rand), vistoque elano 6 implomentada om todos os complladares, A primeira verstoeriardnimeros "pseu aleatérios' O cequeme omega com um nimero chamado "semento" que 6 vando para produit lum novo némero que se tornard anova mente, Anova semente 6 usade pra produzir uma nova sementee asim por dante. Com este eaquemie Papier 129 ‘afungto de némero sleatrie deve se lemabrar da semento wsala na iltima ‘chamadae para st varlaves do clase statie se adapta perfeitamente, ( método ¢ bareado om congruéncn linear que no explicaremoe aqui fe randt) */ ‘% gera muneros psoud-aleatarios */ 7 versio 1 */ rand) ‘ static int sesentent; senentes(sonento*25173+138¢5)268536; /* formula magica */ retura(senenta)s > Avarivolesttica somentecomega com ovalor Ie este 6alterado pela formula magica a cada chamada a esia Tungio, O rected 6 um ‘nfmoro no intervalo de 827684 32767. ( programa seguinte cham esta fungio cinco vezes PP testrand.c */ (7 chan rant) rain) for (calzcce DrintF("38\9",rand()) 3 ‘Ao exceutar este programa vood tara coguinte sald Agora vamos executar novamente 0 programa © 0 resultado sori: 20514 0581 Observe que saida 6 exatamente « mesma nos uss execugios do programa, Dal 9 nomo “pacudo-aleatérie™ problema & que = cla texoeugana vardvel semente comoca com o valor I, Para resolvélo vamos lotroduzir uma segunda fungto que chamaremos de sement0, que re comple #semente ueada exceurao /+ arquivo fonte senent() © rand() */ Statle fet senentents Pera) ‘ gera numaros pseud-aleaterios */ (s versa0 2 */ rand) c sents (senente*25173+13849)268836: /* formula magica */ eturn(semente) ) J sonent() */ 2 reconpce a senente */ fenent(n) Unsigned tnt ns ( sonenteen; retura(senente) ) 0 programe seguinte testa estes FungSos, fr testrand.e */ (hans rand() */ (* versz0 2 */ fain) Pgies 108 int Senante; printf (*Digite' a sua semante:\n")s Scant ("aay bsonante)s Sent (semente) for(endjecesices) Brint"%A\ rand); ‘Analise agora dus execugbes da verso doi: Digive a sua somente ‘Anossafungo do goragio do némeros aleatérins produz némeros ‘de 82168 89767, mas vood pode fazer vos ajustes em suas chamadas ‘Aqui vio lguns exemplos Gerando nimeres do tipo float 1, Dividindo o nimeroaleat6rio por 82768 resultaré um nimero xdo tipo float tal que-1 <= <1 2, Adicionsil 1 resultaré x tal que 0 <=x < 2 8, Divino por? taremoe 0 <= x <1 136_Trencnento om Hnguagom © 4. Multiplicando por 6 teremos 0 <= x < 6, 5. Adicionando 1 teremos 1 <= x <7. 2B assim por diante. Gerando nimeros intelros: 1. Tomando oresto da divsio do nimeresleatério sm snal por 101 resultario nameros de 08 100. 2, ‘Tomandoo resto da divisdo do némeroaleatério sem sinal por 11 enultardo ndmoros de 0a 10 E assim por diante. 0 sltimo uso de static 6 para especiticar a classo do armaze- nnamento de fungées, Funges state ado conhecidas somente dentro do arquivo-fonte em quo foram declaradas, ao contrario das outras fungbes ‘que podem ser acessadas por outros arquivos compilads juntos, (CLASSE DE ARMAZENAMENTO ~ register ‘A classe de armazenamento register indiea que varidvel as sociada deve ser guardada fisicamente numa meméria de aceeso muito ‘mais chamadaregistrador. Um regstrador da maquina um expaco de 18 bits (no IBB-PC) onde pedemos armazonar um intoa um char. Em Dutras palavras, varidvels da classe register sho semelhantes ds auto ‘mateas mas so aplicam apenas as varlsveis do tipo inte char. Cada méquina oferece um certo nimero de rogistradores que podem sor manusoades polos usuérios. Por exerplo, o computador IBM. PC oferece somente dois registradores, portanto s6 podemos ter dias variveis em repstredores ao mesmo tetapo. Mas sto ho nos impede do Aeclarar quantas vardveis register quisermos. So 0s registradores es- tiverem oeupadoso cothputadorsimplesmente ignora a plavra register as nossas decaragios. No segundo volume deste Livro entraromes em ‘ais detalhos sobre rogistradores asicamonto vardveis rogister sio usadas para aumontar a ele cidade do processamente Assim, oprogramador deve escalher as varidveis ‘que sto mais freqdentemente acessadas e decaré-las como da classe unges_152 register. orto candiata esto rtament tows variveis de lagoso tmgumentos de fungies Bis um exomplo quo mostra a diferonga na velocdade entre varios de memria «em regstradores, /* nostra variavets register */ ein) int 4.45 (/% guardadas na neooria */ register int mn; /* guardadas ew registradares */ Tog ts t= tine(a)s Tor(J=03Jeel000; 4) for({=0;1<+1000; 144) printet Tena dos Tacos nso register: Xid\n",time(0)-t)s t= tine(o) or(@=dsmcel000;0¥+) For(ta0;nc1000;n64) Printf("Tenpo dos lacos repister: *\n",tina(0)-t)s Esto programa use a rotina thme() presente wa bibloteca do ccompilador Turbo C da Borland. CONSIDERAGOES SOBRE CONFLITO DE NOMES DE. \VEIS Sompre que duas varivelstiverem omosmonome mas diferentes cendoroges de meméria ela nfo so as mearnas varidves, Elst exemple: aint) int (7 PRIMEDRR VARIAVEL */ 18_Teinaneto a inguger C printf(*n main() - endereco de tetu\n",t8); funel( i) Drintf(*hn wain() ~ valor de f= Raye", 1)5 ) funet (4) int ts (7 SEUHOA VARTAVEL */ ‘ t402) srintf(*En fanel{) ~ endereco do satan", 88); Printt(En funel() - valor d\n" 135 ) ste conceito oe estend « blocs dentro de uma mesma fungi Por exemple: sing) ‘ fot 8 (7 PRINEIRA VARIAVEL */ endereco de i-te\n"&i)s printf(*En main() lor de i= 2a\8"s4}5 Brintf(*Ea main() AFCta5) ( Hat is. /* SEOMOR VARIAVEL */ Printf ("No bloco = endereo de ieta\n®, 84); Brintf{vko bleco = valor de f= ¥2\n"y 4}; » Printf("Fora do blaca - valor de i= d\n"): ‘As duasvariveis i no so a8 mesmase voc’ reconhece ist, pois ‘elas tem endoreos do meméria diferentes ‘A sogunda verve 16 conhocidasomente dentro das chaves do ‘comands if Uma ver oxeeutadoo blo de comando If, ela 6 desta, Ponges_139 ‘Uma varivel local 6imitad ao bloco em que ola foi deciarada. Se Aloasvaridveisparttham omesmonome, aque fl declarada nobloco at tom proeedéncia sobre a quo esté deelarada num bloco diferente. 0 que acontece quando declaremos uma variével loal com o emo nome donna varlivel extarna? O préximo exemple mostra esta situagio. int 1655, saint) c int 4: ‘10; Brint(*\ném main() 86", 1) Fane] Qs ) funel) { rintf(*\ntm funcl() ‘ta §)5 ) sta duns variv ‘mosificandoo programa pa so diferentes © vocd pode verificar isto qu imprima seus enderegos ‘A variével delarada crm main() tem precedéncia sobre a externa ‘no bloeo onde fol decarada, 0 PRE-PROCESSADOR C 0 pré-processador C 6 um programa que examina o programa- fonte em Ce execute sertas modifiagies ele, bases em instrugoes chamadasdiretives. 0 pré-processador faz parte do compilador e pode ser cons rado ume inguagem dentro da linguagem C. Ele 6 exoeutado automa 142_Srinanent om ngage tieatonte santos da compilagto, Diretivas do pré-processador seria Instrugs desta linguager. ‘Asinetrugios desta linguagem sto exeeutadas antes do programa ser compilado etm a arefa de altorar os programas fontes, na suaforma, ‘etexto. e Instrugdes para o pré-processador dovom fazor parto do texto «que eriamos, mas ao farto parte do programa que ecmpllames, pois so ‘etiradas do texto pelo complladar antes da eompilagio. Para entendermos como funciona a8 diretivas do pré-proces- ‘sador, vamos primoirorevsar como funciona o complador. Quando voe oserevo uma linha de programa ae vost est soicitando ao compilador transformar esto cédigo para ins {rugoos em ingvagem de maquina que podem ser exacutades pelo ‘chip tnleroprocessadr do computador, Consequentemente, a maior parte da sua Tstagem consste em {nstrghes para o mieroprovessidor. Diretivas do pré-processador so Insteugbes par ocompiador propeiamente dito, Mais precisamente, elas ‘param diretamenta no compilador antes do provaseo de compilasao sar ‘nici; por ico onoma pre proceseador, Linhas norma de programa to insteugies pars o microproces odor; itetivas do pre-processader sho inatrghes pera ocampllador. ‘Todas as deetvas do présprocessador ao iniciadas om o sen bolo) As droves podem sr colocadas em qualquer partado progeamna, sas 6 enctume sarem eolocadas no inci do programa, antes de mainO, ‘ow antos do comege de uma fungeo particule. ADIRETIVA #define Adiretiva #éefine pode sor veada para defnirconstantes si bless com nomes aprepriasos. Coma exempla vamos modifiit » pr (amaesjera.cpara quea constanto 3.14189 sejadefinida com oneme PI. rungs 16, Uh esfera.c 4/ 7 calcula a area 6a esfera +/ (define PY 3.18159 main() (i Float area()s float rates Drint(*Digite 0 rato de esters: *) seanf XP Bato}: rintf(*A area de esfera e” 4.2F*,area(raio)); /* declaracao da fancaa */ ) ft are) (f retorna a area da esfera */ float area(r) /* definieao da funcaa */ feat Fs ) MAKRON returm( @* PL ays retorna float */ Quando o compitador encontra #define, ele substitu eada oso roncia de PI no progeama por 8.14189. ting PLa4ise A frase & esquerda (PD, que seré procuraa,¢ chemo “iden {iftcador’. A frase & direita (8.14159), que seré substituds, & chamada "vert’: Lin ou mais espagos eeparam o dentificader do texto. or convengto, oentiicador (nate aso PI) 6 escrito om letras raises Note que 6 podemos ecrever um comand destes por inh. Observe também quo noo ha ponto--vigula ape quar di ‘retiva do pré-processador. reesepea 152 renamed om ingage POR QUE USAR #define? ‘Talver vood so peryunte o que ganhamos substituindo PI por 8.14159 em nos prograna? Suponhames que voot tenia um programs fem que a constante 8.14159 aparega muitas vezes. Suponba, ainda, que ‘agora voee qucira ume precisto taior e quolra trocar $:14159 por 3.141592. Voot deverd ir passo a paso através do programa e trocar eda ‘corrénela que encontrar da constante. Entrotanto 50 voobtver definido 5.14160 como condo PI na divotiva #define, voct davera somente face Adiretiva #define pode sor usada nfo s para defini eonstantes, come mostra o exemploseguinte: Huet ine ERR printF(*\RERRO.\n") ain() c int 45 printf" ue nunero de 0-2 100: tf(ted [1 45100) RRO [Neste easo ERRO sor4 substitu pela fase: ent RIRa\a) antes da compilagio. MACROS. A dicetiva #define tem a hablidade de usar argumentos. Uma lirotiva #define com argumentos chamada macro e€ bastante some- Thante a uma fungio. Bis alguns exemploe que Mustram somo macros «80 efinidas e usades. Fungier_ 143 + macropre */ /* nostra macro, usando instrucao printf() */ dete PRN(n) printf(*R.2A\0"y0) sing) c rm2e1.0/3.03, PRN(ran) ane) ‘Quando voet user a dirtiva #define nunca dove havereaposoen braneo no identifcador. Por exerplo, instrugto (rate PRN (a plat 220"0) nto trabalhard corretamente, porque o espazo entra PR e (n) ¢ inter pretado como of do identicador Para defnir um texto “muito grande” davemos deimitar linha anteriorcom uma ara invert \oprstgu com a fico om otra ‘Toda ocoretncia de PRN(n) em seu programa é substituida por print((%.2f\n'sn) O n na definigto da maero & subattuide pelo nome ‘sado na chamada a macro om seu programa, portato PR(numl) ser substituido por printf(%.2f\n"ynuml). Assim, m age realmente come ‘um argumento. ‘Macros aumentam a clara do cig, pois permitem a uiizagio de nomes sugestivos para exprossins MACROS E FUNGOES: Vamos moilifiaro programa esfera.c para que use uma maero 80 jinvés da fungio area() 144 Teint nguagan 6 Ph estfera.e */ (7 ealeuta'a ares da esfora */ [1 define constante */ faetine PI 3.18189. 7° define sacro #7 HaeFine ARER(x) (4 PL * x * x) sain c laat rates printr("Digite o rato da esfera: Scant °4f"sarato); PrintF("A arcu da esfora e! %.2f*,AREA(rat0))s USO DE PARENTESES EM MACROS (0 20 liberal de parénteses em mecres pole provocar fracassoe considerdvel, Suponha que seu programma contém as seulntesTinhas: doting SOM(E,y) ay fans 10 somes.ans Qual 6 0 valor que serd atribulde a ans quando rodarmos © programa? ‘Veod dove estar ponsando que ser slcionado« 4, produzindo 1¢ este resultado, quando multiplieado por 10 produziré 70. ERRADO! (© compiladr subetituss SOMA(S.) por 8:44 ans = 107 364 0 resultado sora 3A Pinger 185 ‘A solugto 6 colocar parémteses envelvendo otaxta todo? HaFing SNACK Y) (x49) Colocando o texto entre parénteses,entretanto, voe# ni ih iona todos os problemas. Considare oexemplo abalxo: #4eFine PRODUTO(x.y) (x49) ans’ = pROOUTO(243,4)3 ‘Depois do compiladorofetuar a substitugio, « expresso fcr ans = (28)5 ‘coresultado nio saréo dessa. Asolugio é envalver cada argumonto por parbntosos tae ine PRODTTOLY) ((x)4(9)) ‘PORSEGURANGA, COLOQUE PARENTRSES ENVOLVENDO OTEXTO TODO DE QUALQUEN DIRETIVA fUefine QUE USE ARCUMENTOS, BES COMO ENVOLVENDO CADA ARGUMENTO. ‘VANTAGENS E DESVANTAGENS DO USO DE MACROS VERSUS FUNGOES, ‘Vavias fungies de biblioteca C rio atualmente implamentadas ‘como macroa. Para ver estas macros, examine 9 programa chipe que fompanha o seu compilador. Certamente, estas fungbes poderiam estar jimplomentadas na bibliotece pad de fongoes em vex de macros Qual & a ciferenca entre fungbes do biblioteca macros? ‘Como macros so simples subatituiges dentro dos programas, 9 ‘seu cédige aparecerd em cada ponto do programa onde forem usedas. ‘Assim, a excougio do programa seré mais répida que a chamaca a una fingto toda ver que se fzer necessdrio. Em eontrapartida o codigo do 146_remament om nga © programa seré sumentado, pols oobigo de macro ser duplicade cada vor (gu0.a macro for chumnada. ‘Uma outra vantagem do uso de macros € a no nocssidad de expocifica o tipo do argument Por exemple taf ine sort) ()*(H) ain) tnt 25 Float $3.85, printf(*Sona dos quatrados: %A\0",sarti)4sar{J)}s > Amacro sqr) pode ser ussla com qualquer tipe de dade, Nonosso cexamplo chamames 8 macro com um inte oom wn Noa Se uima fungto fesse escrita para caleular © quadrado de wm _ndinero, tipo do sou argumento deveria er delarado, Por exciplo: double sar(x) ‘oubte xt retura(ets) calculart o quadeado de una variével double, Se desoarmos ealeular 0 (quatrado do um outro tipo de variével,precisurfamos eserever uma nova fingho, Uma macro € a sols eficlcnte quando diferentes tipas de dads podem ser usudos. -Baconselhivel sempre que posvel, para cada macre terme wna {fungto equivalente numa biblioteca ¢fazor a eseaha corta conforme © tamanho eo némbro de chemades em sou programa ADIRETIVA #include A divetiva #include causa a inclusto de-wm progeam-fonte om Aquiestéum exemplo de sua uilidads:suponhaque vost escrovew ‘ria formulas matemtins para ealeulardreas de diversas gure, oot poder colocar estas fimulis em macros em wm programa ‘separado. No instante om que voed predisar roeserev6-as para aullzaea0 em seu programa use adivetiva #inelude, tdofine PI 3.18159 HdoFsne AREA CIRCULO(ra‘o) (PI*raiotrato) fotine AREA RETANG( base, al Lura) (basetatara) Hdotine AREA TALANG(base altura) (base*altura/2) SdoFine AREALELIPSE(ratotratod) (PIératol*rato2) ‘oFine AREACTHAPEZ (ett, Tadol,1ado2) (1t#(Tadol+10462)/2) Grave o programa acima como areas Quando voe® for eserever seu programa simplesmente incu Dois exemplos de macrosque avimos eestao definidosno arquivo stdioh sto getehar() e putehar(), derivadas de duas eutras f-ngoes, sete()e puted. fdefino gotehard gettin) {define ptcharte patech stdout) ‘A capacidade de #define e #include vai além da reprecontacio simboliea de constantes e incusho de arquivos. Voeé pode até eriar uma outca inguagem de programasio usando #define e #include, No mo- onto analiseo programa a seguir. 148_Trensnnto om ngage ‘include "pascal. program begin Write *Tsto e* Tnguagen © 2"): end Hum, sto parece familiar, um pequeno programa em Pascal. O segredo esth no arquivo pascal. a Segui. doFine progran matn() fefine begin ( define write (x) print (x) fetine end) OUTRAS DIRETIVAS undef, #if, #ifdef, #itndef, #else © #endif Balas dirotivas s8o goralmente usadas em grandes programas. las permitem suapender deinigbes anteriores e produci arquvos que podem ser compilados de mais de um modo. A diretiva #undef suspende mais recente dofinigio de seu texto! doting GRANDE 3 define eHORHE 5 funder GRANDE (7 cancels definicas do GRN0E 4/ ‘ietine ENORHE 10 J ENOINE rede mide cana 10 #/" undef EXORNE ‘> ENOWNE volta a 5 undef CSORKE > cancala definicas do ENORNE FORGANDO 0 COMPILADOR A USAR UMA FUNCAO, Suponhamos que vocéquolea usar a fun getehar() em ver de sua correrpondonto macro. Como frgarocompilador aabandonar amacro Fangs 19 ‘eusne a fungdo ? Certamenteexistem vévios meiose 0 mals dbvio 6 na Inetuiro programa sta h pela dretiva #include, io incur sidia.h nto 6a solugdo mais elegante paraoprobloms pols ved podo querer usar outrasinformagdes deste arquivo. Uma soligio tothor 6 suspendera dfingio da macro com a diretiva Wunder. ‘Aa quteas dretivas mencionsdas permitem eumpllagdes cond ional ster cones Hnelude "ceres.h* ‘det ine 188-10 else ‘netude *cores}.h ‘define TAB 20, endif A clcetiva Wife avalia 22 CORES jf fol definite, Se positiv, cexoeuia todas ab instrugdes soguintes até eneontrar #else ou Fendt ‘quando entao pula para a préxima Instrusao apts © endif. Se nto, ‘exocuta asinstragées sguintes a else. ‘Un dos uss d mais portatil mnpilagio endicional” 6 para tornar © bio #4 syseetta Hnctude ibn, fendi REVISAO| 1. "Toda angio Ctem a mesma estrutura da fungto main() eofereco um meio de decompor repetidamente um problema em problemise 2. Um programa grande deve ser eserito como uma colegho da fungies ‘onde caia uma no ocupa mais de wna pagina do comprimento © ‘exccuta uma poquena tarfa do programa todo 159_Prinmds em ngugen C 2, 0 comando return provoss o térming imodiato da exceugio de uns fungio e pode retorer,& Fungo que chara, no méximo um valor. 4. Ume fungto 6 dita recursva se, dentro dela, est presente uma Instrugdo de chamada a ela propria, 15, Todasas variéveie fungtes tim doisatributos um tipoeumacasse de armazenamento, 0 tipo do wma fungio ¢ deterninado pelo tpo do, ‘aloe qu ela rotorna oaseurnio tipo int por dealt, 6. As classes de armarenamento em C so: auto, extern, static © register. Toda fungi C 6 da clase extern, ato 6, 6 conhoeida por todas as tras, 11. Exiatom 3 lugares, num programa C, onde vood pode declarar va: iavels: fara de qualquer ung eeraoconbeldas par todasas fungbes definidas depois delas), logo aps a abertara da chave, indcando 0 Inicio do um bloco (sera eonhecidas somente dentro deste hoc) ¢ antes da aberturs da chave que Inia una fungae (declarages dos fargumentoe da fungi), 8. Sempre que duas varlveistiverem 0 mesmo nome, mas diferentes enderogos de meméra, elas nto sto as mesma varivels, 9. 0 pré-processador C6 umm programa contide no compilador que alters programa fonta antes da smnpilago, 10, Linas normals de programs to instrugtes pars o microprocessor diretivas do pré-processador sto instrugbes para ocompilador. 1 -Adietiva define define constante simbalins ou macroa. A detiva ‘#inelude incu um programsfonte no seu programe 12.As dlretivas #undef, #if, #ifdef, #ifndet, #else o #endif sao sgeralmente usadas em grandes programas Exercicios 1, Quai das soguintes razdes ato validas para. o uso de fungbes? 1) Usam menos meméria do que ae repetirmes mesmo eign vérie vero, Buntes_161 2) Rodam mais pido ©) Formac flo de ecapaar gun computa em ‘uma cana prota, que pode sor asada preozpag uo ‘8 seus detalhes internos. meee 2) Manttn varidvls proteus das outras partes do programs, 2. Verdadeir ou Pals: Ua fungbo pode nda ser Gil mesmo se voes ‘lo enviar nada a en ela nas the evaver qualquer Informs. 4. A instruplo abaizo 6 uma charade coreta & fungto abst) que ‘ocesa de un arguments? Por gue? nseabyum) 4. Verdadeir ou Fela Para etorons de uma fungto, vot deve usar 9 comando return 5 Verdair ou Fla: Voot pate retarnarquantos dads desjar, de ‘uma fan, ao programa que chama, eae ocomando return 6. A funpto abana 6 crete? Por qui? sos(van): int mum, ston 6) return(nun)s ) 1. A fang abino 6 correta? Por que? ach) i int proxieo: procura(proxinot4); ‘mprina()s 152_ Treinen o guager 18 te programa écorreto? Por qué? saint) oat scant ME 8% busty) 5 Primaries ‘loat mu (a,b) Feat 2,65, ce return(at®)s 9. Verdadero ou Falso: Pungbos podem ser definidas dentro de outras Anges, conforme as necessidades do programa. 10, Verdadeiro ow Fale: As variveisbabitualmente waa em fungSes Clio acossives a todas a outrasfangSen 11, Quais das seguintes raztes so vidas para o uso de argumentos em fungoes? ‘) Para indicar&fungto onde loelizar ola mestna na mer6ria, ) ‘Transmitiinformapbes&fungto para que clapossa operas ©) Para rotornar informagies provenicntos da fungo ao pro sama que cham, Para espeifca o tipo da fungto, 12 Qual ds soguintasitens podem ser passados para una Fungi como srgumentos? 1) constants; 2) -variéveiscontendo algum valor; ©) diretivas do pré-processador, )_expressdes que depos de avaliadas assumom algum valor, ©) fungoes que retoenam algum valor 18. Oprograma soguinto 6 coreta? 1 rafn() sine tresea tipo( tres); typo(aum) Feat nun; print e(rse* nun) 14, Umma varivel externa 6 definida mura decaragic: @) somente em main() 2») na primera Fungo que a use ©) em qualquer fungéo que a use; fora de qualquer tung, 15, Una variévl externa pol sor referenciada numa instrusio @) somento em maint); 2) naprimeira fungto que a us; ©) emqualquerfunglo que a use; 1 forade qualquer fugto, 16, O que 6 dirtiva do pré-procossadr? 1) Uma monsagom do compilador para o programa, 4) Uma monsagem do compilador para oVinkeitor. ©) Uma mensager do programa para ocompilador, @ Uma mensagem do programa parao microproceseador. 17. Adiretiva #define causaa__de uma frase por out, 18, Esta € uma forma correta de instrugto #define? ‘define OH POR POLEGADA 2,54 154_Trinamento om inguoges © 19, Nesta diretiva #dofine, qusl 60 "dentiicedoe”e qual 60"toxto™? Hofine OP 2.71828 20.0 queé macro? @) Uma drotiva #define que funcions como uma Fungo, 2) Uma dicetiva #define que admite argumentos, ©) Umadiretiva #define que retorna um valor. ‘@) Umadirotiva #define que simula seanf0. ‘21, Uma varivelndo sré usnda para conter wm valor que nunca muda porque: @) 0 programa rodaré mais devngar: ) 0 programa sort mais difell de entender, ©) bo 6 pormitide semelhant tipo de use 4) valor armazenado pode sor aliorado. 22.0 edigoabsixo 6 corrto para caleularo custo de um pacote postal? "Tal custo igual a uma taxa fxa vozos a soma da altura, laggura © comprimento do pacote ‘eFine Som (att, 147g, com) sTtstargeconp Custortaxa * SOMB(a,1.€)5 28. A diretiva #inelude causa do um programa em outro. 24, Execute o programa exferae para ealeular a érea do glabo tarrstre sabendo que seu rao ¢4000 mlhas. 25, Hacrovn um programa que solicit dois némeros e imprima o maior doles. Use uma fungio que faga a comparagao dos dois ndameros © retomme o maior deles. Este fang deve ter somente uma instrugio, 26, Hscrova um programa que troque o valor do duas varivois externas, ‘As varivels dover so forneeidas pelo usutrio,impressas na tla, ‘rocadase impressas na tela novamente, Use uma fongio para a toca 27, Hscreva uma macro que retomne o cubo de seu argumente, gies 185 28, Bscreva uma macro que toca o sins sonoro do computador. 29, Escrova uma fungio que recobe um earactore como argumentoe, S| for uma lotra mindscula,retorna-a em malsculo, caso contrario retorna o proprio caratere £80, Hsereva una macro corespondente a fungto do exerecio anterior. ‘1, Hscreva uma macro que retome I seo seu argumento 6 um némero ‘mpar¢0 se for par, 2, Hscrova umaimacro quoretorue I eeosou argument forum enraetore ‘entre '0" 9" O sen for 88, Ksereva uma funglo recursive, pot(,), que acsite dois argumentos nteios positives e retorna i elevaio & poténcia J, Por exomplo ott2,8)=8, Use a soguinte dfinigto: potts.3) = # * potts.s-1) ‘84, Um niimoro primo 6 qualquer intico positivo que é diviivel apenas por si proprio o por 1. Eeerova uma fungho que rocebe um inter positivo c, se este ndmero for primo, retoraa 1, eas0 cota, re: torna0 85. famosa conjetura de Goldbach diz que todo intero par maior que 2 {a soma do dois ntmeros primos, Testes extonsivos foram feitos sem contuo sor encontrada um contra-exomplo. Ezcreva un programa Imostrando que airmasio 6 verdadeira para todo némero par entre 700 € 1100. 0 programa deve imprimir eada nimero e 0s seus cor: responontes primes. Use afungto do exoreicio anterior ep CAPITULO 6 TECLADO E CURSOR Teclado do IBM-PC As Teclas ASCH ‘As Teclas Bspeciais 0 Cédigo Bstendido Controle do Cursor eo Programa ANSI.SYS Controle da Tela com ANSILSYS Os Atribuios de Caracteres Redefinigéo das Teslas de Fungdo com ANSISYS Redirecionamento ‘Tecate ecursor_152 A LINGUAGEM CE 0 IBM-PC [Neste capitulo mudaremes 0 nosso enfoque sobre a lingungem C pera estudarmos a intoracio do C eam o computador IBM-PC: Isto nto ‘lgnifien que ji cobrimos tudo sobre C Lovantaremos outros sspectos sobro a linguagem em ontroe capitulos. ‘Voct agora conhece bastante a respeito de C para poder explorar ‘lgumas earaceristicas do IBB-PC, a fim de, realmente, desenvolver programas em C, bom elaborados, ‘Cobriromos dois grandes pico: Primeir: 0 cbdigo ASCH estonido do IBM-PC que permite ao Programador identifier as telas de fang6es, teins de controle de cursor aa tela com ecmbinagieseapeciais. ‘Segundo: 0 programa de controle de tecado etola ANSLSYS que permite ao programador controler posigio do ourgor na tela varias ‘otras operates. Quase todos os programas de aplicagt, como pracessadores do texto, goroncindores de banco do dadas e até jogos, precisa destas capacidades para produsie uma interagio de nivel mais sfisticado com 9 ‘so, ‘Mostraremos também como o rediraconamento pode ser usado para que os programes tenham a hablidade de lero gravar arguivos, 0 material asr visto extenderé aia capacidade de eserever pro rams interessant eporosos © TECLADO 0 toclado do PC ¢ formado pelo controlador de teciado 8048, exja Drineipaltarefsé vgir as tecls elnformar a rotinasinternas do [3M-PC ‘sempre que uma delas for presionade ou seta. Se alguna toca for ressionda por mais de meio sagunde o 8048 comega arepetir acto por 158_Trenamento om tnguagr ‘um doterminado perfodo, O modelo AT usa um controlador diferente, © 1012, que exeoutaoseoncislmente we mosmasfungios da BOS. (© 8048 postu ands um “buffer” que pode armazenar até vinte saractores até quo sojam lidos. (0 "ulfer" do teciado & ume érea tem- potiria onde i srmazontos 8 caratares prossionadas até que pro rama oe lela (0 tec do PC, om conjunto com as suas rtinas iaternea, naa di ‘um modo da tranemitirmoe & memérlapratieamente todos 0s earacteres de ebdigos ASCIL. O Gneo ebdigo ASCIT que nao pode sor teansmitido Siretamente 600, pos ola éreservado para indica caracteres nao ASC, AS TECLAS ASCII 0 tecladogera letras, namerase earocteres de pontungio através ‘digo ASC do 1-255 decimal. Cala um destescaractores 6 onviado ‘como un byte polasrotinas internas para a momdia, Entretanto existe ‘um grande nimerode telas e combinagbes de teclas que nto so repre Sontadas por este I byte, Como exemplo, a elas de bungho, Fla PIG, © ‘scombinagio de Vela para controle do eursoe AS TECLAS BSPECIAIS (© TBM proporciona una segunda colocao de 256 toes e com binapto de tecas através do uso do cidigoesteniido. ste ciigo consste em 2 bytes, o primero senlo sempre 0 ¢ 0 segundo um nrimeco indicando um tela particular ou cambinagéo de tetas, (Quando uma tela, que nfo pertence wo conjunte normal do earac- teres, FL por exerplo,€pressionads, cla primeiro mana um zero para o "puller’ do teclado e depoisten obdignespecfco. Assim, quando uma toda ‘bo ASCH 6 pressions, 2caractoros sto mands. (0 programa quo espera lor caractores do eéigns ostendide deve ‘otflear seo primeirocarartre lid tom valor 0, oentao reconhocer que présimo caractero 6 um cédigo extend com un plotamente diferente da da etigo normal toxpretagio com: 2 C6DIGO ErENDIDO DO TROLARO URN GARACTERES, © aRDNERNO ‘SEMPRE TERA | a ‘Como nenhnm caractere ¢ropresentado por no eonjunto normal {do caractores do IBM, nio hé eonfusto. E, quando este caractore 6 re tobi, ele sempre indie que oearactereroguinte prtone 0 igo cestondl CCotigo normal urn byte letra a 4 ‘Cig estonddo dola byes tela do fungao 1 } EXPLORANDO 0 CODIGO ESTENDIDO, Bis um programa que permite explorur 0 obdigo estendide do toclado, Basicamente este programa imprimo o cdi da qualqust tala pressionad: tanto o céligo de ura caractero normal de um byte com oe ‘bdigos dos dois bytes de caractere estendido. /* testecla.e */ 7 Wmprine codigo das tectas */ main) char teclal,tecta2: vihflo( (tecTatagetch())1="%") Ht(teclal=-0) ( toelaz-geteh()s printf(*%3d 234\n" teclal,teclae); else Drintf("x3d\n"yteclal); {10 Arenanent om ingucgen po Para Ter @ ofdigo do teclado usames a fungéo geteh() que 6 ‘equivalente A fingdo getched, salvo que oearactere nao éimpresso na tela compara este caraetere com 0 ¢, se fr 0, oprogramareconhece que se trata Go ciigo estondido; entio 18 a sgunda parto do eign usando etch) ‘hovamente, e imprime o valor numérico das duas parte, Soo primeiro caractere no for 0, 0 programa deduz que é um caractee normal © {mprime seu eédige docimal ASCIL Aqui estd uma simples execugso do programa: 0 O primi céigo mostrado aqui oda tela FI, o segundo da tecla ‘eo teoeiro da seta exquerds ‘A tabela seguinte mostra eign estendido que pode ser obtido pressionando-e uma dae teclas, A tabela apresenta o segundo byte do {idigo; primero byte 6 sempre 0 ‘Varios outros ofdigos podem ser aceseados usando-ecombinagbes de tetas com ALT, CTRL ou SHIFT e sto mostrados em otra tabla UMA TECLA - CODIGO ESTENDIDO ‘SEGUNDO BYTE Cassia "TEGIA QUE GERAD CODIGO ‘ested tearie 161 [SEGUNDO BYTE Wacinah) ___TECLAQUEGERA OCODIGD EBs istian a niga ARROW 2 END. a DOWN anaow a Pen S Ba DUAS TECLAS - CODIGO ESTENDIDO ‘SEGUNDO BYTE @DECHAAL "FECIAS QUE GERANO COMIGD—— a STAR eas ATQWRRT LOR seas AusbEGuaRt was anrxcraNat As SavE FARO ad SEER AMO" ie ‘Gt se age ena presto) i (cra Lar anno ie (CERL lca ARROW i eHLEND is SER 13 Grn Hote tas REPi2aAsaraa0.- ie Cmte INTERPRETANDO CODIGO ESTENDIDO ‘Una maneira comam de escrever fungies C que imprimem © éngo estendlido 6 user 0 comando switeh, como sera mostra no pro rama seguinte: P* coesten.c */ (Pesta codigo estendieo */ ain() ‘ Ant tect tectag; viniTe((teelalageteh())1="%') if{tectal=o0) ( teclazogeteh(}; switeh(tecta2) ¢ cease 69: printf (*Tecla de funcao 1\n")sbreaks fase 60: printf (*Tecla de funcao 2\n") break; tease 75: printf (*Seta esquerda\n"):break; TH: printf(seta direlta\n") break; Gafault: printt(-Algun autro codigo estendido\n"); ) Derse Dprintf{*Codigo normal: $34-te\n",teclal,teclal): CO programa wsa wan comando site para an imprimir 0 ebigo das teclas. nar, interpretare CONTROLE DO CURSOR E ANSLSYS Quando o MS-DOS ink rotinas intornas do IBM-PC varias eoiss cobre 0 computaidor ¢ 08 dis positives aol ligudos como impresoras, dispastivos de diseos, vidoo ete. ‘Algumas rotinas interns sto acresridas ao sistema operacional logo na sua inilalizagao, entretantoexatem alguns dspositivoschamadas “drivers” que no esto inclufdos nas rotins internas dos equipamentes.e so fornoeidos em arquivos soparados junto com o disco de MS-DOS. Para que o DOS possa incorporar estes arquvos ele procura sa ‘especifleagao hum arquivo-texto chamnalo CONFIG.SYS, ‘A farfia IBM-PC e outros vrios computadores compativeis com 6 sistema MS-DOS oferecem um dispositive quo eontrola a poeigho do odefinigio das tolas do teed. Bate ‘num arquivo soparado, junto ao disco do sou sistoms, © & chamado ANSLSYS, ANSI signifca Ameriean National Standards Institute eo arquivo ANSLSYS utiliza e6igo padronizado,elaborade e aprovado polo ANSI. to arquivo ¢ um exernplo de “instalable devise driver’ st 6 uma secpo de cbigo, eserita para controlar os dispositives de entrada ¢ sulla, que pode ser adcionada ao sistema operaconal depois dest tor ico Insta, ( river’ ANSLSYS interpta toda asaidanatolao a entrada do tecladoe, so algum eédigo intereeptado for uma seqhacln especial de caruceres que identificum um eomando para o driver, elo 6 passado para ‘sua parte de processamente de eomande, Tudo o que mio for comand & simplesmeante passado para a rotina regular de video que oimprime ce ‘maeica habitual 08 comandos para o driver ANSLSYS sto identificados por una soqdacia especial da caractores sempre comojadas por um caractere “estape" ou 1B hexa seguide por um colehote eequerdo ou SB hexa INSTALANDO ANSISYS. Para usar as faiidadesoforecidas polo driver ANSI.SYS cle dove tala no stoma operactonal. Para lato deve oxitir no disco do iniilizagio do sistema um arquivo chamado CONFIG.SYS que diz 00 DOS quando ha uma interface do dispasitivo a sor enrregada, Muitos programas fazem voo® erar um arquiva CONFIGSYS ot oferecem um. Se voc Liver um, aerescente a linha DEVICE = ANSISYS Sento tiver, eve um socoPy con: cOUFIG. SYS DEVICE = asL.S¥S ectrls 2 center> 164_Trelnaneto om igugers © ‘Alm dost arquivo, driver ANSLSYS também deve estar pre- ssente no diso deinicaizagio, ‘Agora, quando voo? inatalar eeu sistema o arquivo ANSLSYS ‘start incorporado ae DOS que ocupara uma mernteia areiida de msl ‘ou menos 1800 byte ‘CONTROL DA TELA COM ANSISYS, O driver ANSLSYS fornece um grupo de comandos de controle do ‘tla queineloem mover o cursor, imparatel, definiresatributas devileo (cor, reverso, intensificad, pccante ete), aterar 0 modo texto para ‘malicoovico versa Hi comandos para guardar a pasigha atl do corr, ‘de modo que ele possa ser deslocado para imprimalralguma informasto © ‘pos rtarnar & posigho original ‘CONTROLE DO CURSOR COM ANSI.SYS (0 controle do cursor 6 obtido através de “seqatncias escape’ to caractore 1B huxa (eraciee escape) seul pelo colehete esquerd « acrorcido do ume Tetra ot conjunto de letras, conforme a tbl seguinte: CODIGOS DE CONTROLE DE CURSOR ~ ANSLSYS SS Geet eee ee ae Uke ates a footer PARA CONTIMUAR) POs C(24, 31) prin (*OTsPaRC os_c(24,58);arints(*POWTOS: om; atuatiza(aunicao,tisparos,pontos); ‘hiTe(nunicao) {| Vinka diet): f% inprine Vinha direita */ fn alvo()s (f inprine alvo */ pasin(3): PP posteao inital +/ wbiTe(getch()e0) { —/* usuarfo Joga ate atirar switeh(geten() case SOBE: J=Cj-2) 7 22sJ-1:breaks ase DESCE® J=(j>2i) ? IeJedsbreaks ) osin(s)s Aisparostes muntca ispara(t fs sioula disparo */ ingest acertou #/ bun) pontosres tunicaoe((pontosts)=r0) 7 wunicact2emunicaos v0(8)s 2almuticao,disparos,pontes) 2s)iprintt(te FL tual tza(n,4,p) nt ma, ‘ REVS PISC roscttenen)inrint(: 3lea} ova ) posin(s) c et; FOS" C(4,78) primer ("ane"); ow 1 inka sir() c int fendeasteanie) | (78) 174 Trengmento em ngage © aiv0() G int erand()8215 POS. C(1,1) sprint (*\x0e" POS_C(142s1)sprint("\DE") return()} ) stsparatay fmt ds ) POS.C(3, i}sprinté(*\a00")s POS-C(3,(}aprintf(" "5 easitse) ( POS.C(J,4) sprint (® BUUUMIN 112" POs_€(H. sprint e(™ vs ) ) apagalvold) int ds POS C(Js1) sprintf" *) P0S_c(302, i) sprint" ) Passo: Limpa a tel Melado eewrsor 178 0 programa fornece uma interagn co 0 usuario que ser des rita om virios pastas: presenta explicapies sobre seu uso ‘até que um tecla sja pressionada. Pasto2: Imprime a tala inicial. A fungio atualiza() & chamada para Imprimir @ munigao disponivel, o nimero de disparos efe- ‘munigdo for O-um sinal Passo Eo inicio do programa propriamente dit, composto por um lago while que controla a munigéo. Este lago inicia sua fexecugio imprimindo uma linka na eoluna 78 através da fungio linha dir eo alvo que é composto por dois caracteres e € improsso pela fungio alveO numa linha Sleatria ena coluna 1 Passo: 0 programa entra no lago while aninhado que aguarda 0 uusudrio jogar e atualiza a porigio do cursar pela fungto posind, Passo & 0 usuirio jd jogou. Inrementa disparos e decrementa mu nigfo e simula um disparo através da fungao dispara(). Se 0 alvo fl acoriado, a fungao bum) ¢ chamada e a varid pontos¢ inerementada.A’cada vez quo 6 usuario faz mais 5 ppontos, a munigio 6 eroscida do 2.0 alvo 6 apaggado pela fungéo apagalvo) ¢ a links de dados é atualizeda pola chamada a fungéo atualiza0, REDEFINICAO DE TECLAS USANDO ANSLSYS, ‘Vamos vltara nossa atengfopara ume outrahabilidade fornia arquivo ANSI.SYS:atribuirdiferentestextos paraas teclasdefungio. Atribuiglo de textos ds tecas de fungho eapacita-Ihe configurar teciado conforme suas necessidades mais rotineiras, Por exemplo, © screveu varios programas em C, pode querer listar © nome de scus na tela com o sequinte comando: carte 118_Trinamento em guage Bate oxtopode ser tibudoauma ola de fungin Asi, 3 voxd precear dale vévan eves, doverdsomentepressona a tea de fng8o Eprogramada sem ter de velgto. A vantagem dso ser bem mcior yr or teton mars, oma type \wor\ 94 acre dat ‘Aqut caté um programa que redefine a toda de fungio que vost coeolher com otexto "tir" ogre. */ (re Reebut un tate a ecla de funcao escothica */ main() ( Ant teetas printf(-Digite o numero da tecTa de funeae: *) Seanf("4d" Atecla) prints \xiBl0:%3 s\"s1apt,tecla,"dir *.04 ‘Sem divide, a parte mais dif deste program 6a sequéncia de escape nama insteugio printf. ‘odio cecape wna: 1B Prine byte do lag ete da tela ta enne Ponto rig opundo be Oo citign ested de tela etingto —Fontoeingia Toutes eoratbuldo deve ectar entre aspas Pontoestepula Cargo Ratarn olsen He \uasloséesreiersi3e He, "8 ‘comodo em printf) Tendo esiior 177 (Como aspas nfo podem ser usadas num texto em C, elas devern sor ropresentadas por (\) ‘Visto que queremes usar uma variével para reprecentaro odio a toca de fungto, ela dave ser tecla 58, (0 uso de ANSY.SYS nfo 6 a manelra mais rpida de movimentar 0 cursor, ¢ requer que o arquivo ANSY.SYS estejaprosonte nameméria, Existom manelras mais répidas ¢ conwonientos de se obter as ‘apacidades oferecdas por ANSY.SYS; entretanto, s80 um pouco mels Aifcois do sorem programades. No Volume Ml dostelivzo estudaremoa ome fez Jo, REDIRECIONAMENTO Os sistemas operecionals PCDOS, MS-DOS, UNIX ¢ outros, ‘quando entram em operacéo, inicalizam dois dspostivasacopladosao ou ‘lero: o teclade, tido como entrada padrto, eo video, tide como safda pedro Por default’, um programa om Cord seus dadosdigtados através o toclado o suas sls improssas em video. ‘Voot pode informar 0 DOS que altere entrada ou sida padrto para qualquer dispositive acoplado ao sou mere. Pate proceso ¢chamado "redireclonements” Por exerplo: voce pode formar ao DOS que 0 set programa pegard os dados de entrada de um anguvo em disco a inves do teclado, a das maneiras de fazer um programa trabalhar com arquivos em diseo, Uma 60 uso explicte de fungies quo abrem, fecham, let ot {gravam em arquivos, Outra é« de usar redirocionamento em progres ‘dosonhades para trabalhar com teclado ¢ tela. Orediocionarnento nals limitado em varios aspectes, mas muito mais simples de usat ‘Bm outraspalavras, 0 DOS assume certos periférico do entrada salda, Oredirecionamento permite trocar os parifrics assumes. {1 Trainee lingua _AistPRESaAO PODE SER REDIRECIONADA PARA UBTARQUIVO AO INVES ‘ARTA H A ESTRADA DE UM PROGRAMA PODE SER IEDINECIONADA, DR USTANQUIVO AO INVES DO THCLADO, IMPRESSAO REDIRECIONADA Considers o programa sepuint: ff espetho.c */ Jr Geos a entrade 9a tela */ maint) 1 char chs a ‘eheteh(); printt("sctychs Pabiteten te D5 } ‘Quando executamos este programs, a fungdo printf?) causa 2 {impress em tela dos earacteresdatilografados no teclado até que a tecla "ea pressonada. ‘Vamos ver 0 que oorre quando chamamos programa pele DOS ‘usando redirecionamento: © simbelo > € um operador de redirecionamento, Fle causa @ criagio de um nove erquiva em dice charuado arrt que conteré a sua ‘Strada de dados. Quando vocschama o programa e datilgrafaalguma Goa, mada aparece na lola, A sua entreda fol guardada mum arquivo chamado arg st Para vero arquivo criado, digit oseguinte comand: ‘cotypearatat Ocperadar (>), conecta um programa exceutvel com um arquive- texto, Ele nto pode ser usado para conectar um arquivoteto eom outro ‘98 um programa com outro. O nome do programa executavel deve estar ‘Neaquerda do eperador, eo nome do aryuivo-tosto adieita, ‘Acentrada nfo paderé ser redirecionada para mais do um arquivo ‘usando este operador (0 DOS prodofine alguns nomes para o¢ perféricos. Um deles & PRN para simpressora. A saida pode sr redirecionada para aimpressora tusando o seu nome, Por exemple: Coespetho > PRN ‘Tudo que voot datilografar sor impresso na impressors toda ver «quo voes proesionar Return} ‘Tome o programa de Capitulo 2 que imprime uma érvore de natal digit oseguinte comande: (C>ARVNATAL > PRN ‘woot ver san devore sendo impresse pea impressora. INDICANDO FIM DE ARQUIVO. [Née usamos o earactore X para terminar@ entrada no progr pena e através do eomando TYPE pademos notar quo esto euractore fttard presente no arquivo. Como nto queremos este caructere impreaso no nosso arquivo, ‘vans modifica 0 programa o colocar 0 caractore ‘\X1A" qua pode set ‘obtido pressionando-se [Ctl] indica fim do arquivo Jf transter.e */ ‘+ acoa a entrada */ (7+ para Ser usado con redirecionananto */ saint) c char ch: a 10 Trenameht em tingvagen chegetch(): printf(rsecn): ) watla(ch t= yaa’) ) ‘0 GARAGTERE"\WIA' REPRESENTA FIM DE ARQUIVO, ENTRADA DE DADOS REDIRECIONADA Podemos redireioner a entrada de dados do vedlado para que @ programe alia de um arquivo, Digiteo sguinte commando: Cotrmnsfor < arate Osimbolo < 6 segundo operador de reirecionsmento. Because aleitura ds datos do arquivo arg pelo programa ansfr.O programa transfer nto sabe que a entrada vem de urn arquivo em ver do Laat; cle smplesmente 1é da entrada padrao indicada polo DOS, quo agora & o arquivo arg. (0S DOTS CAMINHOS DE. UMA VEZ (0s redirecionamentos da entrada ¢ da saida podem ser usados unto, Para mostrar este process vamos eacrever dois programes, um ‘para codiicar uma mensagem e outro pare decodifici-l P cote.c 4/ + coditica um arquivo */ (7+ para usar com reairectonanento */ ‘define CIRLZ"\x saint) t char chi ecladoecrr 181 vie (Cehegotch()) Le CTRLz2) patch( chet) puteh(CTRL2); Bxocute o programa ransferc egoroo arquivo arq!tetcontendo ‘8 oun mansagem, tanto redireionamenta ‘Agora, com o arquive arg. txt om disen digit c>type nat par oii vamosreiecionr aera praargl. a easaidapara (C>code < agit antint Para ver o arquivo coifcndo digit: Cotypeamast Vamos agora ezrever um programa para decoicar um arquivo codificado por eode.e. % e /* decode.c */ 7+ decodifica arquivo codif. por code.c */ (7 para ser usedo con redirectonanento */ Haeting CORE “Van matn() ‘ char ch; vine ({ehegeteh()) = CTRL_2) puten(che1); puten(CTRL_2)s ) Disite: C>docoda< aes > anit 12 frnament om inguagan C Outros operadores DOS podem ser encontrados no manual do eu sistoma operaciona. REVISAO 0 conjunto normal de caracteres 6 formuado pela tabela ASCH que consist em 256 cbdigos de I byte cada um, 2, 0 obdigo estendido do IBM oferece uma segunda eolegto de 258 faracteres que consistem om bytes cada wn, onde oprimeiresampew terdo valor ASCIT zero, 8. O arquivo ANSLSYS 6 fornordo junto ao sou sistema operacional pode te incorporado ao DOS atravea de arquivo-texta CONFIG SYS, 4. ANSLSYS 6 um exemplo de dispositivoinstalével quo, quando aeres- tide ao DOS, permite © controle da posigao do cursor, da tela e do teeta, 5, Apalaven ANSI significa American National Standards Institute © 0 ‘arquivo ANSISYS utiliza o eddigo padronizado claborado © aprovado palo ANSI 6. 0 redinocionamanto é um mode alterar os dispositive tdos como “afaultpelo DOS, 42. A impressto do um programa pode ser redirecionada para outro dispositive que nto atela,e a entrada de dados pol sr redireionada ‘le outro dispositive que naa o teclado, EXERCICIOS A, A finalidade do digo estondi do tendo & 4) ler eneacterea de lingua estrangiras, 1) er earactoros datilografados com a combinagao de uma tecla ‘normal com (Alt) ow (tel, ©) ler tecas de fangioe toclas de controle de cursor; 1) ler caracteres gréficns ‘ecadoecueor 189 (Quantosebsdigosestondidosexstem (ineluindo'os que nto sto wsados)? Quuntos bytes so usados para roprosentar wm cédigo estenddo do ‘clade? Verdadeiro ou Faso: os e6digos estondidos do teclado representam, somenteteclastnicas como FI. Qual dos soguintes codigos representa a tela F1? aa » 178 ©) \xDB @ 058 ANSISYS &: um raroarquivo infectado; 1) um arquivo instalvel para controlar os dispositives de en ‘ada esaida; ©) um arquivo que permite a utilizagto do cédigo eatendide do ‘welado a eapucidades de movimentagso do cursor, &) wa arquivo que sompee procura pelo DOS quando Inia sua exceugto CONFIGSYS & ) wm arquivo que sempre procura pelo DOS quando iniis sua exccusio; {um arquivo que contém instrugdes para modifiear 0 DOS; ©) um arquivo que pode pedir ao DOS para que instale ANSISYS; @ nonhuma das anteriores, Deserovn de que um sistema necasita antes que ANSLSYS poses sor sede. "Tova a soqdtnelas de escapes de ANSLSYS comegui por: at ot ©) \x1B xB 164 Trinameteolnguagen Ine. 10. A sogntncia de exapes que limpa a 11. Verdadsiro ou Fals: O cursor pode ser movido para qualquer loea- Tizago da tela sommente oe inerempentarmos wna ink ou uma cluna 14. Verdadeiro ou Folso: Usando seqnénelas de escapes de ANSISYS, ‘qualquer frase pode cor atibusda a qualquer tcla do Fungo. 17, Rodlresonamento 6 ‘@) enviar asada do programa para algum lugar sem sera tla; 3) obterum programa dealgum lugar som ser de arquivos. EXP: (0) obter a entrada de um programa de algum lugar som ser do teclado; )_substitur a entrada ou saida padrao por outro periférieo 18, Desereva.o qua acontecert apse esta intrugto: Coprogt «tte > me 19, Escreva um programa que solcta ao usuério adigitagdo do uma fas, ‘ecoando-ana (ea Seo usuario prossionara seta eequerda,o programa ‘deve apagar um earactere a esquerda do curser, assim toda a fi pode ser spageda um earactere por ver, 20, Fscreva um programa que Ie um piograma-fonte em Cusando redire- ‘onamento,e determina se 0 programa esta com aa chaves bala tcsadas, isto eo tom o mesmo namero de chaves direita w esquerd, Coenaves< page TERI chow ke 21, Eserevn um programa que copia um programa-fonte em Cem outro arquivo em dies, tocando toda ocorténcia de letras mainiseulas pot ‘matdsculas. Use rediresionamento, 22 Hacreva um programa que copia um programa-fonte em C em outro arquivo om disco, trocando todo caractere de tabulag pelos espasos ‘corrocpondentoe. Use rediroelonamente fe CAPITULO 7 MATRIZES E STRINGS = Mairizes Checando Limites © Mais de uma Dimensao 1» Mairizes como Argumento de Pungées = Chamada por Valor e por Referéneia 1 A Ordenagéo Botha Strings As Fungées para Manipulagao de Strings -gels() puts) strlen() streat() strempt) sirepy() 188_Trinamono om inguogen C MATRIZES ‘Uma matris 6 um tipa de dado usado yarn representar uma cor quantidade de variveis de Vales homogéncos. Imagine osoguinte problema: cleular a média das notas da prova do mas de juno de 8 alunos, Voctpoderla declarar: Int noiatnotaota2iotanotats os valores separadamente: 0 programa devers I printf(*Dioite a nota do aluno 0: Scant ("xa bnota0); Dprint#(*DIeite a nota do slurp 1: *)s Scant ("2a bnotal) Printf(-Digite a note do aturo 4 Scant ("a 8n0tad) Imagine agora so voed pretondesse encontrar a média aritmética ‘das notas do uma else de 60 alunos ou da escola toda com 2000 alunos? ‘Soria wna tarts bastante volumosal E evidente que predisamos do wma mancira convenionte para roferenciar tas colopos de dados similares, Matri 6 0 tipo do dado oferecido por C para este propésita, Umamatriséuma srie de variveis do mesmo tip referenciadas por um Gnieo nome, ondo cada varivel ¢ diferonciada através do um ‘numero chamado ‘eubscrta ou "indie", Colehetes so usados para contr subserto ‘A declaragion Int nota loca moméria para armazenar 5 interes ¢ anuncia que notas é uma Imatris de § membros ot elamente" Meonsesearings 187 Vamos esrever um programa que slicons 6 nosso problema ‘usando uma matriz. a /* natas.e */ (7 nédia das notas de S alunos + rain() i nt notes(515 nt {,20n8) for(i-ovtebi444).( Drintf(*DIgite 2 nota do aluno Xe: *, 4); Scant ("a Se0tas( 1} for( dstcS:t+4) sonarsonainotas(i}s printf(*Media das notas: ¥4.*,son/5)s is um exemplo da exeeugto do programs: Digitew nota do steno 75, Digits a nota do alone 1 36 igiten note do lume 2:60 alu 4 ‘Media dae nota, (0 programa apresenta vir construgbes asso a paseo yas quesnalisaremos DECLARAGAO DA MATRIZ Em, asmatries precisa sr declradas, como quaisqueroutras variweis, para que ocompilador eanhagaotipo de matri eraserve espeg0 do memériasufiiente para wrmazenila. Os elementos da matrz sao guardados numa soqOacia continua do meméris, isto 6, umn soguide ao outro. fn) © que-diforenca a decarasio de uma matriz. da declaragio de ‘qualquer outra vardvel 6 a parte que segue o nome, isto 6, os pares de olehotes ({ @ que envelvem umm nimoro intoir, que indi ao com- piladoro amano da matez, Ine nota Apslavia int decors quo todo elemento da marie 6 do tipo int, notas 6 @ nome dado & matsize (5) indica que n nossa matria teré 8 ‘lementos do ipo "int: Por definigho umamatrie&composta por elemen- ‘toa do uum nico tie, [REFERENCIANDO UM ELEMENTO DA MATRIZ, ‘Uma vee decierada « matriz,procsamos de um modo de refe- renciar seus elementos individualmento. Ito 6 feito através do nomero entre colehetes sguind o nome da matriz. Observe que este nimero tem vm sigifcado diferente quando referencia um elemento da mates ena dedlaragte da maiz, onde indica eeu tamanho. ‘Quando roferencamos umm elemento da matri orto mimoroerpe- cifiea a posto de elemento na matrz. (0s elementos da matrit slo sempre mumerados por indices in iados por 0 (ze. 0 clomentereferenciado pelo nimero 2 ota ‘no 60 segundo elemento da matrs ¢ sim o terceir, pois a numerayio ‘omega em 0, Assim atin elemento da matriz poss wm indice, uma ‘unidade menor que o tamanbe da mati Em noteoprogramautiisamos uma varivlintcia,j,como indice dda matrie Esta posbilidede torna se matrzos verdadetramonte itis, ota Maria esings_ 169 ARMAZENANDO DADOS NA MATRIZ ‘Asoo do cbdgo que cede dados na matria € For 505185 444)( printf(‘Digite a nota do aluno £0:".4)s, Scant ("a Aratas(11)s ) © lago for causa um proceso do solictaga0 a0 usudrio e leitura das notas, repetid 6 veres. [Najnstrugio seanf() ni wsamos.o operador(&) junto ao elemen- ‘to da matris (Amotesti) pois notasli] 6 ume variéval como qualquer ‘outra (numa, como exemplo). LENDO DADOS DA MATRIZ. Vamos analisar a rege do codigo que 6 os dados fé srmarenados nog elementos da matria for(ie0315st44) ona ~ sont + notas[]: printf("Medta das notas: %d.",sona/5); O lao for aaviona 08 valores contides noe clementas da matrie ‘em uma variivel chamada soma. Quando todas as notasforem adico- ‘nadas,o rasultado 6 entho dividio polo ndmero de elomentes (8), para encontrar ami, USANDO OUTROS TIPOS DE VARIAVEIS Agora que voo? est fumiliarizado com o fato de uma mata sor composta por Uma série de elementos de um dado tipo, podemos enta0 ‘escolior qualquer tipo de dat para a nossa matrz. 189_Trinamento em guage © , ‘Suponhamos que voe queira que as notas dos sus alunos quem, ‘no intervalo de 0-210 e que nfo seja desprerada a parte fraciondri. A Solugdo vara usar una mala do tipo float, pe frotas.c */ 1 sadta dus notas de § alunos */ yin) float notast8)5 leat som; fat ts for(tn0stess1se) ( Printf("Dlgite a nota do aTuno 24: *,1)5 Seanf(4F" d00ta51)5 foma-0.05, for(t=03ie5s1+4) ‘sonacsonaénatas(i]3 printf(Nedia das notes: 20", s0n2/5.0);, (© programe noras.copora da mosma forma que oias.c execto no fato de poder aceltar nimoros com ponto decimal e calcula a média com precisto maior is um exempla da execusio do programa: Dalia dav nota 20, Observe que a declarago da mates nota eda variivel soma como onto futuante acarrete a ultraglo do formato espesficado em seant() printf0. Em programaslo sempre deverostentarotimizar um programe ‘pai do seu desenvolvimento ini. 0 que faremas com fnotas. Marine esings_ 191 Presteatencio as modficagbes: ft Aeotastic (media éa¢ notas de § alunos */ sated) c flout notas(5], sonas int 45 for(1+0, sonas0.0;1¢5;sonaronotast iv41)( printf("Digite a nota do aluno 24: °,4); seanf(*RF* notast I}: ) rinte (‘Media das notas: &.2F°,s0ma/5.0); sta verso 6 bem mais compacta que a anterior, eo mas impor. ‘ante 6a climinagin de un ago For, o que tornaréo programa mais rapido, LENDO UM NUMERO DESCONHECIDO DE. ELEMENTOS Como farfamos se nto conhecessemos de antemto quantosItens entra im na matriz? 0 programa seguinte aceita até 40 notas e pode ser facilmente ‘moiificado para aceitar qualquer nimero de notes 7 motasz.c */ ‘7 nedta de um nusero arbitrario de notas */ {efine LIN 40 rain() float notas{LIH),som-0.0; 180 Treinen em inguagon C rintf(*Digite 2 nota do aluno 2: SeanF("3F* Brotas(]) ‘e(notasti}>0) ‘Somarenotas[t]: 3 whiTe(notasti¢}20): Bhi printf (Media das notas: ¥.2F*,s0ma/(1-1)); ‘A soguir eat umm exemple da exoeugio do programa: Digite a nota doslano 071.8 ota do lune 16033 Matis dae notaa 40. 0 lago for foi substitudo pelo lago do-while, Hate lag ropeto a soliitagso da nota a0 uséro, armazenando-a na matric notasT, até que ‘ja fomecido um valor menor ou gual a zero (0), Obviamiente este no & ‘um programa para alunos nao aplicados ‘Quando o timo tom for dita vrigvet Ltr alcangado urn valor acima do valor total de itens, Isto verdadelr, pais ¢eontaioo zero ‘uo niimere negative eo usiri farnec para fnalizr a entrada Portanto, para encontrar « nimoro do itens vides davemes ‘subtrair Ido valor eontido em ‘Uma outra modieagso neste programa foi 0 uso da dirtiva ‘#define para declarar LIM como um constante de valor $0 ‘raesine LIMAD 'Nés samos LIM na decarugio da marie, O ueo de constantes, efinidas pela diretiva #define, para dimensionat metres éeomum em ‘C pois, eo com o passar do tompo qusermos aurmontar ou diminulr este valor, preciearos eomente trocar 0 40 da drctiva #define polo mimero ‘Geeejado e a toca refltia em qualquer Tugar do programa onde LIM ‘parece, (CHECANDO LIMITES [Née dimensionamos a matriz notas{] em 40 6 esto nimero por- mite a entrada do até dO notas. Suponha, agora, que o usuério decida entrar 60 notas. Como cexpulsr os dados excedentes? Alinguagom Cro reaizaverficacto de limites em matrizes; por {sto, nada impede que voob véalém do fim da uma matriz. So voc ‘transpuser 0 fm da mairiz durante uma operegio de tribuito, entio ateibuird valores a outrs dados ou até mesmo a uma parte do ego do programa Isto acarretard resultados imprevsiveisenenhumamensagem de ‘erro do compilada avisard o que est ocorrendo ‘G NAO AVIEA VOCE QUANDO O LIMITE DE DIMIENSIONAMENTO DE UMA MATIZ FOLEXCEDIDO. Como programador voot tem a responsabilidade de providencar 1 verifcagi dos limites, spre que necessrio. Assim a solu & no permitir quo o usuéri dgite dados, para elementos da matriz,acima do Fimite, Para isto modifearsmaso lags do-while como segue! @¢ SFs>-LIN9¢ printf ("Butfer Totado.\9"); fe break; /* sai do Taco do-vhi d print(*Dighte a nota do aluno 84: Scant (fF, Bn0tas{1D)5 ‘f{rotastt120) forar=notas( Ss ) wt a(natas[144120)5 104 Trenamento tn tinguagn ‘Agora so 1 atingir 40, qué um acima do fim do buffer do 39, smensagem buffer lotadosordimpressa eo comands break fark com que 4 exocugtosaia do Iago do-while e passe para a segunda parte do pro: fama. INICIALIZANDO MATRIZES Muitas linguayens de progeamagdo permitem que vardvel (in lindo matrizes)sejam incializadas em tempo de eompilago 0/08 ern tempo de execupioe a linguagem Cro 6 uma excogo.Inicalizagdes em ‘tempo de compilagao aumentam o tempo do compllagao mas nao pons: Tizam © programa em tempo de execupho, Inialagbes em tempo cle fexecuzio tm um efvito oposta isto é a eampilagio 6 mais répida, a ‘execugdo 6 minis lento 0 tamankso do programa 6 mmentad. Em C iniclalizagio do uma mate 6 feta em tempo do com: pilagio. As classes varivelsparaestofim sioaclasseexterne classe static -MATRIZES DAS CLASSES EXTERN OU STATIC PODEAISER INICIALIZADAS, [MATIIZES DA CLASSE AUTO NAO PODEM SEI INICLALIZADAS, Lembre-e do que a inicalzagto de uma varivel 6 feta na ins- trupto de sua dociaragio e 6 uma manera de especificarmos valores {nical prefixades, 0 programa seguinte exompliica x iniialiaagto de wre matri, oot forneee oproga.mcontavoseolocalcula,emeruzadoenoves, quantas notas de 50 centavos, 25 contaves, 10 cntaves, §contavas © 1 contava ‘equivalem a quantidade fernecida fn troco.c */ (7 prograns que produz troco */ define LIK S ‘nt tabELIN]=(60,25,10,5,1); Marion edtrings 195, rain() C int 4, valor, quants rintt(*Digite'o valor en centavos: *): Sant (ha, BvaT0F) 5 for(d-04d

Você também pode gostar