Sunteți pe pagina 1din 35
Operadores = Operador de atribuigao = Operadores aritméticos + — * / % = 0 operador de enderecos (8) + A fungao scanf() 0 qualificador const = Conversées de tipos e o operador de molde ou cast + As fungdes de biblioteca getche() e getch() + As fungOes de biblioteca-padrao getchar() e putchar() = Operadores de incremento + + — — e de decremento = printf()enganando voce = Operadores aritméticos de atribuigao: += —: = Operadores relacionais: = Operadores légicos: && |! = Operador condicional ternario: " Operadores: avaliacdo légica ou numérica 36 * Treinamento em linguagem C 1 0 orcraoon Enos unAnto: — © operador menos undrio é usado somente para indicar a troca do sinal algébrico do valor associado. Pode também ser pensado como 0 operador que multiplica seu ope- rando por ~ I. Por exemplo: x= 8; Depois destas duas instrugdes, 0 contelido de x serf & Nao existe em Co operador + unério, portanto escrever “x = +8" est errado. WO orerapor ve eNDeREGOS (&) A linguagem C oferece um operador que opera sobre o nome de uma varidvel € resulta o seu enderego, O operador de enderegos € referido pelo simbolo &. ‘A meméria de seu computador € dividida em bytes, que so numerados de 0 até 6 limite de meméria de sua maquina, Estes niimeros sto chamados de “enderegos” de bytes. Um endereco € a referéncia que 0 computador usa para localizar variaveis, ‘Toda variével ocupa uma certa localizagdo na meméria, ¢ o seu enderego é 0 do primeiro byte ocupado por ela, Se vocé declarou uma varidvel inteira, nomeou-a m € atribuiu a ela o valor 2, quando n for referida obteremos 2. Entretanto, se vocé usar &n, ‘ resultado seri o enderego do primeiro byte (byte menos significative) ocupado por m. ‘0 programa seguinte imprime o valor e 0 endereyo de n: #include include int maint) int n n=2; printf("vato system( "PAUSE": return 0 . endereco=Sp\n".n,&n): -Enderegos de meméria so impressos em hexadecimal (base 16) ¢0 formato usado € %p. A saida deste programa varia conforme a maquina ¢ a memoria do equipamento. ‘Veja um exemplo: Valor=2, endereco=0012FED4 FA runcio scanf() ‘A fngdo seanf{) é outra fungiio de 1/0 (entrada e saida) presente na biblioteca-pa- rio, fomnecida com os compiladores C. Ela € o complemento de printf() e nos permite Capitulo 2 Operadores * 37 ler dados formatados da entrada padrio (teclado). As definigdes necessérias 20-us0 de seanf() esto no arquivo stdio.h, ‘Sua sintaxe é similar a de printf0, isto é, uma expresso de controle seguida por ‘uma lista de argumentos separados por virgulas. A principal diferenga esta na lista de argumentos. Os argumentos de seanf() devem ser enderegos de varidveis. ‘StnTaxe scanf("expressao de controle", lista de argumentos) ‘Acexpressao de controle pode conter cédigos de formatagao precedidos por um si- nal de %, ou ainda pelo caractere * colocado apis a % e antes do cédigo de formatagao. O caractere * avisa & fungdo que deve ser lido um valor do tipo indicado pela especi cago, mas niio deve ser atribuido a nenhuma varidvel (ndlo deve ter pardmetros na lista de argumentos para estas especificacdes). A lista de argumentos deve consistir dos enderegos das variaveis. P Céo1cos ve rormaracko DA FuNcho scanf() [A proxima tabela mostra os cédigos para impresstio formatada com scanf(). Cédigos de formatacao eee Se te Caractere simples. | Intciro decimal com sina [ ini decal a gu | Notagiio cientifca | af | Ponto futuante em decimal Sa | aatinaiaee f+ a liste nas Schule! Fist cilateeten pee eS | ae bei Inteiro decimal longo. | Ponto Autuante longo (double). feiss oe 38 * Treinamento em linguagem C ‘Veja um exemplo: J* Calcula a sua idade em dias */ finclude include int main() t float anos.dias: printf(*Digite a sua {dade em ano: scanf("8F",&anos); dias = anos*365; printf("A sua idade em dias ¢ %.0f.\n".dias): system( "PAUSE" ): return 0; A-execugdo do programa é a seguinte: 4 Digite sua idade em ano: A sua idade em dias é 1460 ‘Visto que usamos varidveis do tipo float, podemos entrar com fragdes decimais: Digite sua {dade em ano: A sua {dade em dias 6 4563 AP Mouneuas exreaoas com scanf() t Podemos ler varios valores com uma jiniea chamada a seanf(. 12.5 #* Mostra 0 uso de scanf() com varias entradas */ #* Calcula a média de 4 notes */ Hinclude finclude int main) { Float pl. p2. p3. paz double media: printf("\nDigite as notas das 4 provas: *) scanfC*RFEfZF31",&p1, &p2. kp. kpd): media = (pl + p2 + p3 + pdy/4 printf("\nMEDIA: %.2f\n" media system( "PAUSE") ; return 0; , Eisa saida: Digite as notas das 4 provas: 5.5 7.5 3.0 6.0 MEDIA: 5.50 1B Orerapores DE INCREMENTO -+ + — — E DE DECREMENTO _ (© operador de ineremento (++) opera sobre o nome de uma varidvel¢ adiciona } ‘0 valor da varidvel operando. © operador de incremento pode ser usado de duas mane tas: prefivado, quando aparece antes do nome da variavel, e pés:frado, quando aparece em seguida ao nome da variivel. A instruga0 + Adiciona 1a x */ € equivalente a sex: (* Adictona 1a x * que é equivalente a xat; /* Adictona La x */ Adiferenga entré as operagiies executadas pelo operador prefiado eo ps-feado apare- cecem instrugdes que fazem mas do que sincrementar a varidvel operando, Por exemplo: n=5 x= +n printe("\nNad X=Bd", 05 Assaida sera X=6 © operador de incremento prefixado inerementa a variével operando antes de exe” ceutar # instrugao em que ele aparece. Desta forma, n teré seu valor inerementado de | antes de ser atribuido a x. Observe agora 0 préximo exemplo: nas printeC*\nti=ad 46 * Treinamento em linguagem C A saida serd N=6 X=5 © operador de incremento pés-fixado incrementa a variével operando logo apés a execugiio da instrugo em que ele aparece, Assim, n é atribuido a x e, depois, seu valor € inerementado de 1. ‘Quando o operador de incremento aparece sozinho numa instrugo, como em no faz diferenga 0 uso prefixado ou pos-fixado. Asintaxe e 0 modo de uso do operador de decremento (— —) prefixado e pés-fixado €idéntica a do operador de incremento, exceto porque a varidvel ¢ decrementada de I. * Decrementa 1 de x */ 6 equivalente a — =x; /* Decrementa 1 de x * que é equivalente a 1 Precevéncta Em C, 0s operadores undrios (operam sobre um tinico operando) tém precedén« sobre os operadores bindrios. Isso significa que operadores de incremento e de decre- mento tém precedéncia sobre os operadores aritméticos. Por exemplo: € equivalente a xe at (HH); "Nao confunda precedéncia com modo de operagao do operador de increment. 1Na instrugdo anterior, 0 resultado da operagaio de multiplicagao de a por b seré atribuido axe, depois, b serd incrementada, ‘A precedéncia informa que a operagio pés-fixada ++ seré executada antes da mul tiplicagio, A maneira de operar & incrementar a varidvel operando apés a execugao da instrugao. Na expresso 2 varidvel b inerementada e depois multiplicada por a; por fim, o resultado ¢ atribuido a x. WB As runcoes ve erauioteca getche() « getch() Fim algumas situagdes, a fangdo seanfQ) no atende perfeitamente, pois & preciso pressiona a teola [ENTER] toda vez que desejarterminar a leitura. biblioteca de fun- foes C oferece duas fungBes que lem um caractere no instante em que & digitado, sem {sperar pela tecla [ENTER] Capitulo 2 Operadores * 45 /* Mostra a funcao getchar() e putchar() */ #include include int maing) i char chy printf(*\nPressione uma tecla * ch = getchar(Q); — /* Aguarda uma tecla no teclado */ printf("\nA tecla sucessora ASCII € putchar(ch+1); putchar("\n"); system( "PAUSE return 0 Capitulo 2 Operadores = 45, J* Mostra a fungéo getchar() © putcharc) */ Hinclude #include int main() t char ch: printf(*\nPressione uma tecla *): ch = getchar(}; — /* Aguarda uma tecla no teclado */ printf("\nd tecla sucessora ASCII € "); putchar(ch+1); putchar("\n") system(" PAUSE"): return 0; Capitulo 2 Operadores + 49 BF Ortranones arrmuéricos oe arripuigAo: + = — = *= /= % sses operadores combinam as operagbesartmetieas com a operagdo de aribui- cao, oferecendo uma manera crt clara de esoita de cota expresses de asibuito ‘O operando da esquerda € sempre o nome de uma varidvel, ¢ 0 da direita, uma expressio qualquer. A operagio consiste em atribuir um novo valor & varidvel que dependeré do ‘operador e da expressao a direita. ‘Como regra geral, se x € uma varidvel, exp uma expresso € op um operaclor arit- imético, entdo: Eee. ‘Veja um exemplo: }* Medias.c - Mostra operadores aritméticos de atribuicao */ J Calcula a média aritmética de 4 notes */ #include int main) i Float nota . media = 0.0: printe(*\nDigite @ primeira nota: seanf("af", anota) media += nota: printf(*\nDigite a segunda not scanf"st", anota nedia += nota: printf("\nDigite @ tercetra nota scanf("#f", ¬a): media += nota printf(*\nDigite @ quarta nota: "); scanf("3t", nota) media += nota media f= 4.05 printf(*\nMEDIA: %.2f\n", mediad: system( "PAUSE ): return 0: 50 * Treinamento em linguagem ¢ Eis uma execugdo do programa: Digite a primeira note: 8.7 Digite a segunda nota: 3.6 Digite a terceira nota: § Digite a quarta nota: 7.54 MEDIA: 6.21 WF Orerapores RELACIONAIS: > >= < <= = Os operadores relacionais fazem comparagdes. Sio eles: > maior >= maior ou igual < menor <= menor ou igual igual diferente Nos préximos capitulos, falaremos a respeito de lagos ¢ comandos de decistio, Essas cons- trugies requerem que o programa pergunte sobre relagdes entre variveis ou expresses. Ope- ‘adores relacionais representam o vocabulirio que o programa usa para fazer essas perguntas. Em C, ndo existe um tipo de variavel chamado de “booleana”, isto é, que assuma um valor verdadeiro ou falso. O valor zero (0) € falso; qualquer valor diferente de zero é verdadeiro, Quando 0 computador deve responder se uma expresstio é verdadeira ou falsa, res- ponde com o valor um (1) para verdadeiro e com o valor zero (0) para falso. * Mostra operadores relacioneis */ include Winclude int maing int Verdadeiro, Falso: Verdadeiro = (15 < 20 Falso (5 == 20); printf("Verdadeiro d\n", Verdadefro): printf(*Falso d\n", Falso) system( *PAUSE™) return 0: ) Asaida ser Verdadeiro 1 False 0 Capitulo 2 Operadores * 51 Note que o operador relacional de comparagaio de igualdade é representado por dois sinais de igual (==), Um erro comum é usar umn tinico sinal de igual (=) como opera dor relacional. O compilador nao avisard que isso é um erro, pois toda expressiio tem um valor que, dependendo do contexto, pode ser avaliado como verdadeiro ou falso. Esse no é um erro de programa, e sim um erro de légica do programador. Operadores relacionais avaliam seus operandos como quantidades numéricas, ¢ 0 resultado da operago ¢ 0 valor l6gico 1 para verdadeiro e 0 para falso. © Precenéncia Os operadores relacionais tém precedéncia menor que a dos operadores aritméti- os. Isso significa que os operadores aritméticos so avaliados antes dos relacionais, Mostra a precedéncia dos operadores relactonais + #include #inclyde int main() i printt(*0 valor da expressao 4 + 1< 3 6 Sd\n", 44103) Print#("O valor da expressao 2¢ 1+ 36 %d\n", 2¢1 system( "PAUSE" ) return 0 A ssaida seri Q valor da expressio 4+1< 360 O valor da expresso 2<1+3€1 Vit reost && |}! Operadores Iogicos também fazem comparagdes. A diferenga entre comparagdes logicas ¢ relacionais esta na forma como os operadores avaliam seus operandos. Ope- tandos de operadores légicos so avaliados como légicos (0 ou 1), e no como quanti- dades numéricas. C oferece trés operadores ldgicos. $30 eles: && Logica E I logico OU 1 Wgico NAO Desses operadores, ! & unério ¢ 0s outros dois slo binarios. Os operadores légicos Sto geralmente aplicados a expressées relacionais | 52 * Treinamento em linguagem ¢ Se Bl ¢ E2 sio duas expressées, entio: & eq | Result | (verdadeiro) somente se El e E2 forem verda- BY S86 F2 ira. Em qualquer outa stuaplo, esl (ls). Resulta 0 (falso) somente se E1 e E2 forem falsas, Em _ualquer outa situagao, resulta | (verindcro). | Resulta 1 (verdadeiro) somente se EI for falsa, Resulta 0 l | {falso) somente se E1 for verdadeira * Verdageiro se dia for 7 © més for 6 */ * Verdadelra se op for § ou s */ * Verdadeiro se masculino for 0 */ * Lt-se “ndo-verdadefro* ou 0. */ WF Orcravor conDIcIONAL TERNARIO: ?: operador condicional possui uma construgdo um pouco estranha. Eo tinico opera dor C que opera sobre trés expresses. Sua sintaxe geral possui a seguinte construcao’ expl 2 exp2 : exp3 A expl ¢ avaliada primeiro. Se o seu valor for diferente de zero (verdadeira), a exp2 seri avaliada e © seu resultado seré o valor da expresso condicional como um todo. Se a ‘expl for zero, a exp3 send avaliada e seré o valor da expressio condicional como um todo. Na expresso max = (a > b) Pa: br varidvel que contém 0 maior valor numérico entre a eb seré atribuida a ma Outro exemplo: abs = (x >0) 2x: —x; /* Abs € 0 valor absolute de x */ A instrugao printfcrts, (x82)? *Impar" : *Part): imprime “Impar” se x for um nimero impar, caso contririo, imprimira “Par”. MP Teves ve mrecenéncia vos orenaDoRes BAsicos. Capitulo 2 Operadores = 53 A tabela seguinte apresenta as precedéncias dos operadores ja discutidos. Os que esto no mesmo bloco tém a mesma precedéncia e so executados primeiro que os ope- radores que aparecem antes na expresso. Sia een ++ Menos unirio Incremento prefixado ou pos-fixado Decremento prefixado ou pés- Légico NAO | Multiplicapio aritmética Divisto aritmética Module aritmético | Mais aritmético Menos aritmético Menor relacional Menor ou igual relacional Maior relacional Maiorou igual relacional Jeval relacional Diferente relacional OU ligico Condicional | Atribuigdo. Aritmético de atribuigdo (vezes) Aritmético de atribuigdo (divide) ‘Aritmético de atribuigdo (médulo) Atitmético de atribuigdo (soma) |__Aritmético de atribuigao (menos) 54 * Treinamento em linguagem C a OPERADORES: AVALIACAO LOGICA OU NUMERICA : ‘Todo operador opera sobre um ou mais operandos e a operagio por ele executa- a produz um resultado, Os operandos sfo avaliados como quantidades numéricas ou ‘como l6gicas, dependendo do operador. Da mesma maneira, o resultado de uma opera- ¢40 pode ser um valor numérico ou um valor l6gico. ‘O modo de avaliagio dos operandos e o resultado produzido pelos operadores arit- éticos, relacionais ¢ légicos esto resumnidos na tabela a seguir: Cac cr Aitméticos | Numéricas | Numérieo Relacionais | Numéricos Ligico Logicos Légicos Léaico Revisio 41, 0 operador de atribuicao tem uma in- terpretacao diferente da matematica Representa a atribuicdo da expresso 8 sua direita a varidvel a sua esquerda. 2. 0s operadores aritméticos executam ope rages de soma, subtracso, maitiplcacao, divisio e modulo. 3. A fungao seanf() € usada para ler in- formagées do teclado. 0s seus argu- rmentos consistem em uma expressd0 de controle, contendo cédigos de for ‘matacao iniciados pelo caractere %, © tantos argumentos quantos forem os cédigos de formataggo na expresséo de controle. 4. 0s argumentos de scanf() devem ser enderecos, isto é, o nome da variével precedido do operador de endereco &. 0 operador unario de endereco resulta no endereco da variavel operando. 5. Os operadores Csao numerosos e podem trazer alguma confuséo. Por exemplo, © simbolo % executa coisas diferentes ‘em contextos diferentes. 6, 0 qualifcador const @ utilizado para ddeclarar valores constantes. O operador de molde modifica o tipo de ‘uma expressdo para um tipo desejado. 1B. Em Cndo existe o operador aitmético » + unério, 9. As fungbes de bibliotece getche() e getch() retormam um caractere pres: sionado no teclado e necessitam do arquivo conio.h. 410. A funcdo getchar() € bufferizada © processa os caracteres digitatos so- mente se pressfonada a tecla [ENTER]. E necessario 0 arquivo stdio.h 7. 11, A fungdo putchar() imprime um ca- ractere na tela. 12, 0s operadores de incremento (++) € de decremento (~~) incrementam ou ddecrementam a variavel operand de 1. Lacos * 0 laco for " Visibilidade de variaveis de bloco = 0 laco while * A fungao rand() 0 laco do-while 62 * Treinamento em inguagem C Lagos stio comandos usados sempre que uma ou mais instrugdes tiverem de ser repetidas enquanto uma certa condigao estiver sendo satisfeita. Em C existem trés co- mandos de lagos: for while do-while WB 0 .aco for ial © laga for & geralmente usado quando queremos repetir algo por um mimero fixo de vezes. Isso significa que utilizamos um lago for quando sabemos de antemao o nit- mero de vezes a repetit. ‘© exemplo seguinte imprime uma linha com vinte asteriscos (*) utilizando um lago for na sua forma.mais simples. * For “ * wostra um uso simp) Hinclude #include int main() i int it for(ieD : 4 < 203 itt) /* Imprime 20* * printecrnes , “*°) printf(*\nr) system(* PAUSE"); return 0; Assaida ser © suntaxe 00 taco for A sintaxe consiste na palavra-chave for seguida de parénteses que contém trés ex- pressdes separadas por ponto-e-virgulas. Chamaremos a primeira dessas expressoes de inicializacao, a segunda de reste e a terceira de incremento. Qualquer uma delas pode conter qualquer instrugdo vélida em C. [Em sua forma mais simples, a inicializagdo é uma instrugo de atribuigao (1 6 sempre executada tuma tinica vez, antes que o lago seja iniciado. (0 teste é uma condigao avaliada como verdadeira ou falsa, ¢ controla o lago (1< 20), Essa expresso ¢ avaliada toda vez que o lago € iniciado ou reinicindo, Se verdadcita (di- ferente de zero), a instrugio do corpo do laco ¢ executada (printf(“7c","*");). Quando 0 ye se toma falso (igual a zer0), 0 lago 6 encerrado e o controle passa para a instrugio guinte ao Lago. (0 incremento geralmente define a maneira pela qual a varidvel de controle ser al- cada vez que o lago for repetido (i++). Essa expressaio sempre é executada logo a execugdo do corpo do lago. Ponto-e-virgula Inicalizagio Teste Incremento bet tecdoet 2} 0: i < 20; i++) printf('e", "x"); oe Corpo do taco Néo hi ponto-e-virgula aqui No nosso exemplo, o lago for ¢ executado 20 vezes. Na primeira vez, a iniciali- -assegura que i vale zero. Na dltima vez, i vale 19; a informago é dada no teste )), Em seguida, i passa a valer 20 eo lago termina. O corpo do lago nao é executado ndo i vale 20. ‘Veja outro exempto: P Tabuadas.c */ {* Imprine a tabuada do 6 */ include finclude fat main() 1 Sint i: fort 110; 144) printf("\ngadx6 = 24d" , i .1*6): printf(*\n"); system( "PAUSE") return 0; KK KKK OD Fuecsnzoave 00 aco for Nos exemplos anteriores, utilizamos 0 lago for na sua forma mais simples. Isto é, ‘primeira expressao para inicializar a varivel, a segunda para expressar um limite ¢ a terceira para incrementar ou decrementar a varidvel. Entretanto, as expresses nio estio restritas a essas formas. Exemplos de outras possibilidades sdo mostrados a seguir. MP 0 oreravor vincua Qualquer uma das expressdes de um lago for pode conter virias instrugdes sepa- radas por virgulas. A virgula, nesse caso, & um operador C que significa “faga isso depois isso”. Um par de expressdes separadas por virgula é avaliado da esquerda para a direita /* Mostra o uso do operadar virgula no laco for */ 7* Imprime as nmeros de 0 a 98 de 2 em 2 */ Hinclude #include int main tl int 1.4: For(ind. G45) 6100: i++, JH printf(td "1 #4): printf(*\nt system(*PAUSE"): return 0: BP Usanvo carncrenes A variavel do lago pode ser do tipo char. Veja um exemplo: J Mostra 0 uso de uma variavel da tipo char para controle do Taga */ * Imprime as letras mindsculas e seus correspondentes valores * em decimal na tabela ASCII */ finclude finclude int maing t char ¢ farcet: tats ch <= '2": chet) printf(*\n0 valor ASCII de %c € %d", ch , ch): printfer\n")s system( "PAUSE return 0: F 0 1a¢0 while ae O segundo comando de lago em C ¢ 0 while (que significa enquanto). A primeira vista, o lago while parece simples se comparado ao lago for; ele utiliza os mesmos ele- ‘mentos, mas estes sao distribufdos de maneira diferente no programa. Utilizamos o lago while quando o lago pode ser terminado inesperadamente, por condigdes desenvolvidas dentro do corpo do lago. ‘Veja 0 exemplo: * Contachar.c */ * Conta caracteres de uma frase * #include #include Hinclude /* Para getche() */ int maint) ( int cont=0; /* dor * unile(getche() != ‘\r") /* Enquanto nao Center] */ cont++; /* Corpo do laco */ Capitulo 3. Lagos = 73 f* Fora do lago */ printf(*\nd ndmera de caracteres @ %d\n* . cont): system("PAUSE"); return 0; ’ programa aguarda a digitagdo de uma frase. Cada caractere digitado é contado iulado na varidvel cont até que a tecla [ENTER] seja pressionada, O programa ime o total de caracteres da frase. ‘O laco while termina quando a tecla [ENTER] é pressionada. Nesse caso, nfo co- eemos de antemio o niimero de iteragdes que serio executadas, Em situagdes seme- es, 0 lago while € mais apropriado que o lago for. ‘Sinraxe po taco while © comando while consiste na palavra-chave while seguida de uma expresstio de enire parénteses, Se a expressiio de teste for verdadeira, o corpo do lago é executa- uma vez.e a expresso de teste é avaliada novamente. Esse ciclo de teste e execugo tio até que a expressio de teste se torne falsa (igual a zero), ento o lago termina e 0 do programa passa para a linha seguinte ao lago, strugdo terminada por ponto-e-virgula, instrugdes entre chaves ou ainda nenhuma instrugo, mantendo o ponto-e-virgula. Tnicielizacao ; Te (Teste) Increnento: exemplo, tomemos 0 programa fordemo.c para reescrevé-lo usando um lago Jugar do lago for original. Wniedeno.c */ Nostra un uso simples do laco while no lugar de um laco for */ ielude nt 7=0: /* Inicializacan */ Welt < 20) /* Teste */ printfrgc™ , '47); tts 74 * Treinamento em linguagem C ) printfc*\n") system("PAUSE*): return 0; , Em situagdes em que o niimero de iteragdes é conhecido, como no programa fordemo.c, 0 lago for é a escolha mais natural. BD Licos while aninanos i ‘Uma das instrugdes de um bloco de cédigo que compe 0 corpo de um lago while pode ser outro lago while, Considere o seguinte programa que testa a sua capacidade de adivinhagao. (+ Adivinha.c */ J* Testa a sua capactdade de adivinher uma letra */ include include /* Para system() @ rand() */ include /* Para getch() */ int main) 1 char ch="s'; /* 5 de sim */ char resp: /* Respasta do usuario */ char secreto: int tentativas: white(cha="s*) © secreto = rand() % 26 + ‘a’ tentativas = 1: printf("\n\nDigite una letra entre ‘a" @ wht Tet (resp=getch(?)! ( secreto) printf("%c é incorreto. Tente novamente\n",resp); tentativast+: ' printf(*3e € CORRETO!!\n", resp): printf(*Voc® acertou em %d tentattvas\n". tentativas): printf(*\nduer Jogar novanente? (s/n): ch=getche(): ) printf(*\naté Jogo © boa sorte! \n* systen(*PAUSE return 03 Eis uma execugio: Digite uma Tetra entre ‘a' e ‘z* 0.6 incorreto. Tente novamente Capitulo 3 Lacas = 75 é incorreto. Tente novamente € incorreto. Tente novamente € incorreto. Tente navamente ‘ incorreto. Tente novamente incorreto. Tente novanente 4 € correrar! Voc acertou em 7 tentativas Quer jogar novamente? (s/n Até logo e boa sorte! IB A runcio rand() Na instru -Secreto = rand() % 26 + ‘a"; o programa anterior, utilizamos uma nova fungio de biblioteca C, a fungio rand), que necesita da inclusdo do arquivo stdlib.h. Essa fungo retorna um numero inteiro aleatério (sorteado), A expressiio rand() % 26 resulta 0 resto da divisio do valor de rand() por 26. 0 resultado é um mimero entre 0 e 25. A este nimero & somado o caractere a para gerar uma letra minéiscula aleat6ria 1B 0 1ac0 do-while O tereeiro ¢ titimo comando de lago em C é o Lago do-while. Esse lago ¢ bastante similar a0 lago while. Be 6 utilizado em situagdes em que & necessério executar 0 corpo 4o Iago uma primeira vez e, depois, avaliar a expresso de teste e criar um ciclo repetido. ID Stnraxe 00 taco do-while do i instrugaa: inst rucdo. F white (teste); <———_f rgula aqui © comando do-while consiste na palavra-chave do seguida de um bloco de uma ou ‘mais instrugdes entre chaves e terminada pela palavra-chave while seguida de uma expres- sto de teste entre parénteses terminada por ponto-e-virgula. Primeiramente, o bloco de c6digo ¢ executado; em seguida, a expresso de teste entre parénteses ¢ avaliada; se verdadeira, o corpo do lago é mais uma vez executado © a expressio de teste é avaliada novamente, Esse ciclo de execugao do bloco ¢ teste ¢ 76 * Treinamento em linguagem C repetido até que a expressio de teste se tome falsa (igual a zero), quando o lago termina © 0 controle do programa passa para a linha seguinte ao lago. ‘Um bom exemplo do uso de um lago do-while ¢ 0 programa adivinha.e, escrito ante- riormente. Nesse programa, queremos que o ususrio jogue uma primeira vez para, depois, petguntarmos se ele deseja jogar novamente. Assim, queremos que o corpo do lago seja executado para depois, entZo, estar a resposta do usuirio. Observe a modificagao. * Adivinha.c */ /* Testa 2 sua copacidade de adivinhar uma letra */ * Agora com a aco do-while */ #include #include /* Para system() e rand() */ #include /* Para getch() */ int main¢) 1 char resp: /* Re: char secreto; int tentativass esta do usuério */ do /*Inicio do 1 “ secreto = rand() % 26 + tentativas = 1; printf(*\n\nDigite uma letra entre ‘a’ e \n") while(Cresp=getch(})!= secreto) 1 printf("&e @ incorreto. Tente novamente\n",resp); tentativas++ , print f(*se € CORRETO!I\n", resp): printf(*Vocé acertou em $d tentativas\n™, tentativas): printf(*\nduer Jogar novamente? (s/n): *}; whi }e(getchet ) 35 printF(*\n&té logo @ boa sorte!\n*); system( "PAUSE" ); return Q: Nessa versio, ndio é mais necesséria a variavel eh. Quanvo usae do-while Existe uma estimativa que aponta os lagos do-while necessirios somente em 5% dos lagos. Virias razdes influem na consideragdo de lagos que avaliam a expresso de teste antes de serem executados como superiores. Uma delas é a legibilidade, isto, lee a ex Pressio de teste antes de percortero lago ajuda oleitor a interpretar facilmente o sentido do bloco de instrugdes. Outra razao ¢ a possibilidade da execusio do lago mesmo que 0 teste seja falso de inicio, Capitulo 3 Lagos * 77 Comandos de decisao = 0 comando if + Implementando um algoritmo = 0 comando if-else = Construcoes else-if * Qs comandos break e continue = 0 comando continue = 0 comando goto = 0 comando switch 84 * Treinamento em linguagem C ‘Uma das tarefas fundamentais de qualquer programa ¢ decidir o que deve ser exe- ceutado a seguir. Os comandos de decisto permitem determinar qual € a agio a ser to- mada com base no resultado de uma express2o condicional. Iso significa que podemos Selecionar entre agées alternativas, dependendo de critérios desenvolvidos no decorrer da execuso do programa. A linguagem C oferece trés comandos de decisto: it if-else sswiteh B® 0 comanoo if (© comando if instrui o computador a tomar uma decisto simples. + sfdemo.c 4/ #inelude Hinclude int main() int anos: printf(*uantos anos voc@ tem? \n"): scanf("Ed", anos): 4#(anos < 30) /* Toma uma deciso caso anos < 30 * printf(*Vace # muito Jovem!\n"): system” PAUSE"): return 0; 1 Se voce digitar um niimero menor que 30, 0 programa imprimiré: “Voce € muito jovem!”. Caso voc’ digite um nimero maior ou igual a 30, 0 programa nao fari abso- Tutamente nada, I suwraxe v0 couanoo if (© comando consiste na palavra-chave if seguida de uma expresstio de teste entre parénteses. Se a expresstio de teste for verdadeira, a instruglo sera executada; do con- ‘tario, nada serd feito. (© corpo de um if pode conter uma tnica instrugio terminada por ponto-e-virgula, ‘ou varias instrugdes entre chaves. if (Expresso de teste) instrugao: nstrugao: BB O comanvo if-else ‘O comando if-else 6a expansao de um simples if. O comando if permite que executemos, algo somente se asta expresso de teste for verdadeira, caso conttitio nada ¢ executedo. Suponhamos que voc queira executar alguma coisa se a expresso de teste for verdadeira e outra coisa se a expressdo de teste for falsa. Neste caso, vocé deve usar 0 comando if-else. B® sina Ifelse consiste no comando if acompankado de uma instrugdo ov de um bloco de instrugdes, seguido da palavra-chave else, também acompanhada de uma instruga0 ou de um bloco de instrugdes. ‘Uma tinica instrugao nao necessita de chaves: -else ‘00 COMANDO F (Expresso de teste) Instrugao: else instrugdo: Vrias instrugBes necessitam estar entre chaves: £ (Expressio de teste) Instrugao: instrugao: instrugao; instruggo; ) © compo de um else pode ter uma tnica instrugao terminada por ponto-e-virgula, ou varias instrugdes entre chaves. IB Os comanoos break & continue Qs comandos break ¢ continue sio instrugdes que devem pertencer ao corpo de ‘um lago for, while ou do-while e nao podem ser utilizados em outras partes de um pro- rama. O comando break tem um segundo uso que serd analisado, ainda neste capitulo, Junto a0 comando switeh, © comando break causa a saida imediata de um lago; aps isso, o controle passa para a préxima instrugdo, Sea instrugdo break pertencer a um conjunto de lagos aninha- dos, afetard somente 0 lago ao qual pertence e os lagos intemnos a ele ‘Tomemos 0 programa caleuladora.c. Esse programa tem uma falha: no acaba ‘nunea. vamos modificé-lo para que termine quando 0 usuario digitar 0 valor zero para a variével nl (* caleuladora.c */ /* Simula uma catculadora de 4 op) /* Mostra 0 uso de break */ include Hinclude acbes */ int main() const int TRUE while(TRUE) /* Sempre verdadeiro * i float ni.n2; char op printf(*\nDigite numero operador numero: *); scanf("SF&cBF", &nl, Bop, &n2): if(nl == 0.0) breaks/*Termina se Zero digitad if(op +) printf("\ntf", nl + 2) else if(op =) print#("\n ml = 12): 98 * Treinamento em linguagem C else if(op == “#") printr(\ntf", nl * m2); else if(op == */") printfcr\nar else printf(*\nQperador desconhecido. 1 printf(*\n"); system("PAUSE™); return 0: ) proximo exemplo simula um jogo de adivinhagdo. Nesse jogo, 0 usuario pensa em um nimero entre 1 e 99 e o programa adivinhard qual & /* numadiy.c J* Adivinha o numero que 0 usurta pensou */ J* Mostra o uso de break */ Hinclude Hinclude include —/* Para getchel) */ int mating) i Float incr=50.0, adiv=50.0; printf(*Pense em um nimero entre 1 € 99, responda\n"); printt(* =, > ou ¢ para igual, maior ou menor\n while Ciner > 1) t char ch: printh(*\n=, > ou < a 80? *.Cintvadivd: If((ch=getche(}== "=") break: else {f(ch == >") adiv += finer; else adiv ~= incr; , printf(*\nd ndmero € 2d", (intdadivd; Printf(*\nCONO SOU ESPERTOLI!!\n"): system "PAUSE™); return 0: i 0 comanvo continue 0 comando continue forga a préxima iteragdo do lago e pula © cédigo que estiver abaixo. Nos lagos while e do-while, um comando continue faz com que o controle do Capitulo 4 Comandos de deciséo = 99 avalie imediatamente a expresso de teste e depois continue 0 processo do lago for, & executada a expressao de incremento ¢, em seguida, o teste. lo seguinte imprime apenas os caracteres digitados no teclado que sio tes de digitos. Kendicites.c */ EElimina impressdo de digitos */ Wostra o uso de continue */ Anclude clude ude J Para getchet) */ 7) /* Termina quando digitado x */ if(ch >= ‘0° BA ch <= 9") /* E digito? ¥/ continue: /* Execute o teste novamente */ printfi"te", ch); system(PAUS “return 0; indo goto esta disponivel em C para fornecer alguma compatibilidade com gens de programagiio, mas sua utilizagao é desaconselhada. comando causa o desvio do controle do programa para a instrugdo seguinte lp com o nome indicado, lembrando que um rétulo € um nome seguido de dois- s(t). Veia um exemplo: ‘goto erro; se = nix: ‘goto e o rétulo correspondente devem estar no corpo da mesma fungao. cipio, vor’ munca precisaré usar goto em seus programas. Mas, se tiver um 100 * Treinamento em linguagem C programa em outra linguagem que deva ser traduzido para C rapidamente, comando ‘goto poder ajudé-lo. BO comanvo switch O comando switch permite selecionar uma entre virias agdes alternativas. Embora ‘construgdes if-else possam executar testes para escolha de uma entre varias altemativas, muitas vezes sto deselegantes. O comando switeh tem um formato limpo e claro. 5) Sinraxe 00 comanoo switch © comando switeh consiste na palavra-chave switch seguida do nome de uma va- riével ou de um valor numérico constante entre parénteses. O corpo do comando é com- posto de varios casos que devem ser rotulados com uma constante e, opcionalmente, tum caso default. A expressdio entre parénteses apés a palavra-chave switeh determina para qual caso seri desviado 0 controle do programa. O compo de cada caso & composto por qualquer nimero de instrugdes. Geralmente, a tltima instrugo é break, o que causa a saida imediata de todo o corpo do switeh. Na falta do comando break, todas as instrugdes, a partir do caso escolhido até o t= ino do comando, serio executadas, mesmo sendo pertencentes aos casos seguintes (© comando break tem somente dois usos em C: em lagos ou no comtando switch, switch (varfavel ou constante) « Sem ponto-e-virgula ( case constantel:< Dots pontos instrugao: instrugao: break: case constante2 instrucao instrugao: break: case constante3 instrugao: instrugao: break: default instrugao: instrugdo: Vocé niio poders usar uma varidvel ou uma expressio Igica como rétulo de um caso dentro de um switeh. O corpo de cada caso podera ser vazio (nenhuma instrugao) ‘ou conter uma ou mais instrugdes, que néo necessitam estar entre chaves corpo de um switeh deve estar entre chaves.

S-ar putea să vă placă și