13213256 do a programar program an do na linguagem c

Upload: dorivaldo-maino

Post on 07-Jul-2015

148 views

Category:

Documents


0 download

TRANSCRIPT

Jaime Evaristo Aprendendo a Programar Programando na Linguagem C Para Iniciantes Terceira Edio Revisada/Ampliada Edio Digital (cpias autorizadas)

Aprendendo a Programar Programando na Linguagem C Jaime Evaristo Professor Adjunto Instituto de Computao Universidade Federal de Ala goas

Aos meus netos Mateus, Vitor e Lucas

Sumrio 1 Introduo Programao................................................................ ................................................. 4 1.1 Organizao bsica de um compu tador........................................................................... .......... 4 1.2 Linguagem de mquina............................................. .................................................................4 1.3 Programas de computadores................................................................ ...................................... 5 1.4 Lgica de programao.................... ................................................................................ ..........6 1.5 Resoluo de problemas.............................................. .............................................................. 6 1.6 Processador de um algoritmo................................................................ .....................................9 1.7 Exemplos de algoritmos matemticos..... ................................................................................ 10 1.8 Linguagens de alto nvel.................................................. ........................................................ 13 1.9 Sintaxe e semntic a de uma instruo.................................................................. ................... 14 1.10 Sistemas de computao.................................. ...................................................................... 14 1.11 E xerccios propostos............................................................... ............................................... 15 2. Introduo Linguagem C........ ................................................................................ ..................... 17 2.1 Variveis simples.................................... ................................................................................ . 17 2.2 Constantes............................................................. ................................................................... 18 2.3 Expre sses aritmticas................................................................... .......................................... 19 2.4 Relaes.......................... ................................................................................ ......................... 20 2.5 Expresses lgicas................................. ................................................................................ .. 20 2.6 Estrutura de um programa em C......................................... ..................................................... 21 2.7 Entrada dos dados d e entrada....................................................................... ............................21 2.8 Sada de dados................................. ................................................................................ ........ 23 2.9 Comando de atribuio............................................... ............................................................. 28 2.10 Exemplos P arte I.......................................................................... .......................................... 30 2.11 Funes de biblioteca............ ................................................................................ .................33 2.12 Exerccios propostos..................................... ......................................................................... 34 3 E struturas de seleo................................................................ ....................................................... 36 3.1 O que uma estrutu ra de seleo....................................................................... ......................36 3.2 O comando if....................................... ................................................................................ .... 36 3.3 O comando if else................................................... ................................................................. 37 3.4 O opera dor condicional ternrio.......................................................... .................................... 38 3.5 Exemplos Parte II................... ................................................................................ ..................38 3.6 O comando switch....................................... ............................................................................ 44 3.7 Exemplos Parte III.......................................................... ......................................................... 45 3.8 Exerccios propos tos............................................................................. ................................... 47 4. Estruturas de repetio................... ................................................................................

................ 49 4.1 Para que servem as estruturas de repetio.................. ............................................................49 4.2 O comando for ................................................................................ ......................................... 50 4.3 O comando while................ ................................................................................ ..................... 52 4.4 O comando do while................................. ............................................................................... 56 4.5 O comando break em estruturas de repetio................................... ....................................... 57 4.6 Exemplos Parte IV................ ................................................................................ ................... 58 4.7 Exerccios propostos................................... ............................................................................. 63 5. Funes e ponteiros............................................................. ........................................................... 65 5.1 O que so funes.. ................................................................................ .................................. 65 5.2 Para que servem funes................... ................................................................................ .......67 5.3 Passagem de parmetros.............................................. ............................................................ 68 5.4 Ponteiros... ................................................................................ ............................................... 72

5.5 Passagem de parmetros por referncia no Turbo C 2.01........................... ............................ 73 5.6 Uma urna eletrnica........................... ................................................................................ ......73 5.7 Recursividade...................................................... .....................................................................75 5.8 Usan do funes de outros arquivos....................................................... .................................. 79 5.9 "Tipos" de variveis.................... ................................................................................ .............80 5.10 Uma aplicao Histria da Matemtica............................... ............................................... 82 5.11 Exerccios propostos...... ................................................................................ ........................ 83 6 Vetores........................................... ................................................................................ ..................84 6.1 O que so vetores........................................ ............................................................................. 84 6.2 Declarao de um vetor unidimensional.......................................... ........................................84 6.3 Vetores e ponteiros.............. ................................................................................ .................... 85 6.4 Lendo e escrevendo um vetor......................... ......................................................................... 85 6.5 Exemplos Parte IV.............................................................. ..................................................... 86 6.6 Vetores multidimens ionais.......................................................................... ............................ 90 6.7 Exemplos Parte V............................ ................................................................................ ........ 92 6.8 Uma aplicao esportiva............................................. ............................................................. 94 6.9 Exerccios pr opostos......................................................................... ....................................... 95 7 Pesquisa e ordenao................... ................................................................................ .................... 99 7.1 Introduo.............................................. ................................................................................ .. 99 7.2 Pesquisa sequencial................................................... ...............................................................99 7.3 Pesquisa b inria............................................................................ ........................................... 99 7.4 Ordenao........................ ................................................................................ ...................... 101 7.5 Exerccios propostos............................... ............................................................................... 103 8. Cadeias de caracteres (strings).......................................... ........................................................... 104 8.1 Introduo...... ................................................................................ ........................................ 104 8.2 Funes de biblioteca para manipulao de cadeias de caracteres........................................ 105 8.3 Exemplo s Parte VI...................................................................... ........................................... 107 8.4 Exerccios propostos.......... ................................................................................ .................... 111 9 Estruturas e Arquivos................................ ................................................................................ .... 113 9.1 O que so estruturas................................................. .............................................................. 113 9.2 Exemplos Parte VII....................................................................... .........................................114 9.3 O que so arquivos............... ................................................................................ ..................116 9.4 Arquivos de registros (Arquivos binrios)............... ..............................................................117 9.5 Arquivo te xto............................................................................. ............................................ 126 9.6 Exerccios propostos......... ................................................................................ ..................... 130 10 Noes bsicas de alocao dinmica de memria ...............

.................................................. 132 10.1 O que alocao dinmica... ................................................................................ ............... 132 10.2 Armazenando dinamicamente um polinmio................... ................................................... 133 10.3 Listas............. ................................................................................ ....................................... 134 10.4 Exerccios propostos............. ................................................................................ ............... 136 Bibliografia................................................ ................................................................................ .......137 ndice remissivo....................................................... .........................................................................138

1 Introduo Programao 1.1 Organizao bsica de um computador Um computador constitudo de quatro unidades bsicas: unidade de entrada, unidade de sada, unidade de processamento central e memria. Como indica sua denominao, uma uni dade de entrada um dispositivo que permite que o usurio interaja com o computador , fornecendo-lhe dados e informaes que sero processadas, sendo o teclado o seu exem plo mais trivial. Uma unidade de sada, por seu turno, serve para que sejam fornec idos ao usurio do computador os resultados do processamento realizado. O monitor de vdeo e uma impressora so exemplos de unidades de sada. A unidade central de proc essamento responsvel por todo o processamento requerido, sendo muito conhecida po r cpu, acrossemia de central processing unit. J a memria armazena dados e informaes que sero utilizados no processamento, armazenamento temporrio, pois quando o compu tador desligado tudo que est nela armazenado deixa de s-lo (dizemos que toda a memr ia "apagada").

1.2 Linguagem de mquina Linguagens de comunicao Evidentemente, h a necessidade de que as unidades que compem um computador se comu niquem umas com as outra. Por exemplo, um dado fornecido pelo teclado deve ser a rmazenado na memria; para a cpu realizar uma operao aritmtica, ela vai buscar valores que esto armazenados na memria, e assim por diante. Para que haja comunicao entre as unidades do computador necessrio que se estabelea uma linguagem. Os seres humanos se comunicam basicamente atravs de duas linguagens: a linguagem escrita e a fala . Uma comunicao atravs de uma linguagem escrita constituda de pargrafos, os quais co tm perodos, que contm frases, que so constitudas de palavras, sendo cada uma das pala vras formadas por letras e esta sequncia termina a. Assim, uma letra um ente indiv isvel da linguagem escrita e, em funo disto, chamada smbolo bsico desta linguagem. E te exemplo foi apresentado para que se justifique a afirmao de que toda linguagem requer a existncia de smbolos bsicos, como - e para mais um exemplo - os fonemas pa ra a linguagem falada.

A linguagem de comunicao entre as unidades Como a comunicao entre as unidades do computador teria que ser obtida atravs de fenm enos fsicos, os cientistas que conceberam os computadores atuais estabeleceram do is smbolos bsicos para a linguagem. Esta quantidade de smbolos foi escolhida pelo f ato de que atravs de fenmenos fsicos muito fcil obter dois estados distintos e no co fundveis, como passar corrente eltrica/no passar corrente eltrica, estar magnetizado /no estar magnetizado, etc., podendo cada um destes estados ser um dos smbolos. As sim a linguagem utilizada para comunicao interna num computador, chamada linguagem de mquina, possui apenas dois smbolos. Cada um destes smbolos denominado bit (bina ry digit) e eles so representados por 0 (zero) e 1 (um). Esta forma de representa r os bit's justifica a sua denominao: binary digit, que significa dgito binrio (alm d isto, bit em ingls significa fragmento). Portanto, as palavras da linguagem de mqu ina so sequncias de bits, ou seja, sequncias de dgitos zero e um.

O cdigo ASCII Para que haja a possibilidade da comunicao do homem com o computador, necessrio que as palavras da linguagem escrita sejam traduzidas para a linguagem de mquina e v ice-versa. Para que isto seja possvel, necessrio que se estabelea qual a sequncia de bit's que corresponde a cada caractere usado na linguagem escrita. Ou seja, nec essrio que se estabelea uma codificao em sequncia de bit's para cada um dos caractere s. Uma codificao muito utilizada o cdigo ASCII (American Standard Code for Informat ion Interchange ou Cdigo Padro Americano para Intercmbio de Informaes), estabelecido pelo ANSI (American National Standards Institute). Nesta codificao, cada caractere representado por uma sequncia de oito bits (normalmente, um conjunto de oito bit 's chamado byte). S para exemplificar (ser visto ao longo do livro que, em geral, no h necessidade de que se conhea os cdigos dos caracteres), apresentamos a tabela a baixo com os cdigos ASCII de alguns caracteres. Tabela 1 Cdigos ASCII de alguns caracteres Caractere Espao em branco ! " ... 0 1 ... A B ... Z ... a ... Cdigo ASCII 00100000 00100001 00100010 ... 00110000 00110001 ... 01000001 0100001 0 ... 01011010 ... 01100001 . ..

Observe a necessidade de se haver codificado o espao em branco (este "caractere" utilizado para separar nossas palavras) e de se haver codificado diferentemente as letras maiusculas e minsculas, para que se possa consider-las como coisas disti ntas. Levando em conta que cada sequncia de zeros e uns pode ser vista como a rep resentao de um nmero inteiro no sistema binrio de numerao [Evaristo, J 2002], podemos at para facilitar a sua manipulao, associar a cada cdigo ASCII o inteiro correspond ente, obtendo assim o que se costuma chamar de cdigo ASCII decimal. Por exemplo, como 1000001 a representao do nmero (decimal) 65 no sistema binrio de numerao, dize que o cdigo ASCII decimal de A 65. 1.3 Programas de computadores Para que um computador tenha alguma utilidade, ele deve executar um programa que tenha uma finalidade especfica. Games so programas que tm como objetivo propiciar entretenimento aos seus usurios. Processadores de texto so programas que permitem que textos sejam digitados, impressos e armazenados para futuras modificaes ou imp resses. Planilhas eletrnicas so programas que oferecem recursos para manipulao de tab elas de valores numricos. Navegadores permitem acessos a pginas da internet, a red e mundial de computadores. Estes programas destinam-se a usurios finais, aquelas pessoas que vo utilizar o computador com um determinado objetivo especfico, usando para tal um programa que ela aprendeu a usar, no tendo nenhuma preocupao relativa ao funcionamento interno do sistema computador/programa. Por exemplo, um usurio d e um processador de texto deve aprender o que fazer para que o processador desta que em negrito alguma parte do texto ou localize uma palavra, no havendo necessid ade de saber como o programa realiza estas aes. Na verdade, para que um processado r de texto propicie ao usurio a possibilidade de que textos sejam digitados, corr igidos, gravados, inseridos em outros textos e de que palavras sejam localizadas dentro de um

texto, necessria a execuo de muitas instrues com objetivos bem mais especficos e re itos. Um programa de computador , na realidade, um conjunto de instrues que podem s er executadas pelo computador, de tal forma que a execuo de subconjuntos destas in strues permitem a realizao de aes mais genricas. muito grande o nmero de instru ramas citados acima, chegando casa dos milhares. Rigorosamente falando, um progr ama dos acima citados so conjunto de programas menores, cada um deles com objetiv os mais restritos, e que podem ser executados de forma integrada. comum se utili zar a palavra inglesa software para designar um conjunto de programas com objeti vos mais restritos que, sendo executados de forma integrada, propiciam a execuo de aes bem mais genricas. A parte da Cincia da Computao que trata do desenvolvimento de softwares denominada Engenharia de Software. Naturalmente, o estudo da Engenhari a de Software deve ser precedido da aprendizagem do desenvolvimento de programas menores, ao que comumente denominada de Programao de Computadores.

1.4 Lgica de programao Sendo um conjunto de instrues cujas execues redundam na realizao da tarefa para a qua foi desenvolvido, o desenvolvimento de um programa requer a utilizao de um raciocn io mpar em relao aos raciocnios utilizados na soluo de problemas de outros campos do aber. Por exemplo (e de forma simplificada) ao se tentar resolver um problema de Mecnica Newtoniana deve-se procurar capturar da especificao da questo as grandezas fsicas envolvidas e aplicar as frmulas que relacionam estas grandezas. Para se des envolver um programa que resolva um determinado problema necessrio que encontremo s uma sequncia de instrues que cujas execues resultem na soluo da questo. comum s zar a termo algoritmo para indicar uma sequncia de instrues que resolvem um dado pr oblema, ficando, neste caso, o termo programa para indicar um algoritmo que pode ser executado num computador. A Lgica de Programao pode ser entendida como o conju nto de raciocnios utilizados para o desenvolvimento de algoritmos (e, portanto, d e programas). Por exemplo, imagine a seguinte questo: um senhor, infelizmente bas tante gordo, est numa das margens de um rio com uma raposa, uma dzia de galinhas e um saco de milho. O senhor pretende atravessar o rio com suas cargas, num barco a remo que s comporta o senhor e uma das cargas. Evidentemente, o senhor no pode deixar em uma das margens, sozinhos, a raposa e a galinha, nem a galinha e o mil ho. A questo escrever um algoritmo que oriente o senhor a realizar o seu intento. Naturalmente, na primeira viagem, ele no pode levar a raposa (neste caso, as gal inhas comeriam o milho), nem o milho (caso em que a raposa devoraria as galinhas ). Logo, na primeira viagem ele deve levar as galinhas. Como ele estar presente n a chegada, na segunda viagem ele pode levar a raposa ou o milho. Mas, e a volta para apanhar terceira carga? A soluo ele voltar com as galinhas e, a, atravessar o milho, j que no h problema em que a raposa e o milho fiquem juntos. Escrevendo as i nstrues na sequncia em que elas devem ser executadas, teremos o seguinte algoritmo. 1. Atravesse as galinhas. 2. Retorne sozinho. 3. Atravesse a raposa. 4. Retorne com as galinhas. 5. Atravesse o milho. 6. Retorne sozinho. 7. Atravesse as gali nhas. 1.5 Resoluo de problemas Uma pergunta que o leitor pode estar se fazendo : como vou "descobrir" que a prim eira instruo deve ser a travessia das galinhas? Algumas tarefas para as quais se p retende escrever um algoritmo podem ser vistas como um problema

a ser resolvido. O exemplo anterior um exemplo claro de uma tarefa com esta cara cterstica. Existem algumas tcnicas que podem ser utilizadas para a resoluo de proble mas. No exemplo anterior, para se definir qual seria a primeira instruo, como exis tem apenas trs possibilidades, verifica-se o que aconteceria ao se escolher deter minada instruo. Foi o que, de passagem, foi feito acima: se o homem atravessasse p rimeiro o milho, a raposa devoraria as galinhas; se o homem atravessasse primeir o a raposa, as galinhas comeriam o milho. Neste caso, podemos dizer que foi util izada a tcnica da exausto: como o nmero de alternativas era pequeno, analisamos tod as elas, uma a uma. Esta tcnica pode ser utilizada tambm na soluo do seguinte proble ma: dispe-se de trs esferas idnticas na forma, sendo duas delas de mesmo peso e a t erceira de peso maior. A questo descobrir qual a esfera de peso diferente, realiz ando-se apenas uma pesagem numa balana de dois pratos. Para isto chamemos de A e B as esferas de mesmo peso e de C a de maior peso. Se optarmos por colocar duas esferas num dos pratos e a outra esfera no outro, temos as seguintes possibilida des: a) (A+B, C). b) (A+C, B). c) (B+C, A). No primeiro caso, pode acontecer qua lquer coisa: a balana pode ficar equilibrada, se Peso(C) = Peso(A+B); ficar incli nada para o lado esquerdo, se Peso(C) > Peso(A+B) ou ficar inclinada para o lado direito se Peso(C) < Peso(A+B). Observe que nada pode distinguir a esfera C. No s dois ltimos casos, a balana se inclinar para a esquerda, mas, outra vez, nada dis tingue a esfera C. Por exausto, resta ento escolhermos duas esferas e colocarmos c ada uma delas num dos pratos da balana. Agora os casos possveis so: a) (A, B). b) ( A, C). c) (B, C). No primeiro caso, a balana ficar equilibrada, o que indica que a mais pesada aquela no escolhida; nos outros dois casos, a balana se inclinar para a direita, indicando que a esfera mais pesada aquela que ocupa o prato respectiv o. Temos ento o seguinte algoritmo: 1. Escolha duas esferas. 2. Coloque cada uma das esferas escolhidas num dos pratos da balana. 3. Se a balana ficar equilibrada, fornea como resposta a esfera no escolhida; caso contrrio, fornea como resposta a e sfera do prato que est num nvel mais baixo. Uma outra tcnica de resoluo de problemas consiste em se tentar resolver casos particulares da questo ou resolver a questo p ara dados menores do que os dados que foram fixados. Para exemplificar, consider emos a seguinte questo: como obter exatamente 4 litros de gua dispondo de dois rec ipientes com capacidades de 3 litros e 5 litros1? Como 4 = 3 + 1 ou 4 = 5 1 cons eguiremos resolver a questo se conseguirmos obter 1 litro. Mas isto fcil, pois 1 = 3 + 3 5! Temos ento o seguinte algoritmo: 1. Encha o recipiente de 3 litros. 2. Transfira o contedo do recipiente de 3 litros para o recipiente de 5 litros. 3. E ncha o recipiente de 3 litros. 4. Com o contedo do recipiente de 3 litros, comple te o recipiente de 5 litros. 5. Esvazie o recipiente de 5 litros. 6. Transfira o contedo do recipiente de trs litros para o recipiente de 5 litros. 7. Encha o rec ipiente de 3 litros. 8. Transfira o contedo do recipiente de 3 litros para o reci piente de 5 litros. Para compreender o algoritmo, sejam A e B os recipientes de 3 litros e de 5 litros, respectivamente, e indiquemos por (X, n) o fato de o rec ipiente X conter n litros de gua. No incio temos (A, 0) e (B, 0) e, aps a execuo de c ada instruo, teremos: 1. (A, 3), (B, 0). 2. (A, 0), (B, 3). 3. (A, 3), (B, 3). 4. (A, 1), (B, 5). 1 A soluo desta questo foi necessria num filme da srie Duro de Matar para o protagonist a desativar uma bomba.

5. (A, 1), (B, 0). 6. (A, 0), (B, 1). 7. (A, 3), (B, 1). 8. (A, 0), (B, 4). Outr as questes que podem ser levantadas so: h outras solues? Existe alguma soluo que rea e a mesma tarefa com uma quantidade menor de instrues? Para responder a estas ques tes talvez seja interessante lembrar que 4 = 5 1. Significa que, se conseguirmos tirar 1 litro do recipiente de 5 litros quando ele estiver cheio, resolveremos a questo. Para conseguir isto, basta que o recipiente de 3 litros contenha 2 litro s. E para se obter 2 litros? A basta ver que 2 = 5 3. Podemos ento resolver a ques to com o seguinte algoritmo, constitudo de apenas seis instrues: 1. Encha o recipien te de 5 litros. 2. Com o contedo do recipiente de 5 litros, encha o de 3 litros. 3. Esvazie o recipiente de 3 litros. 4. Transfira o contedo do recipiente de 5 li tros para o recipiente de 3 litros. 5. Encha o recipiente de 5 litros. 6. Com o contedo do recipiente de 5 litros, complete o recipiente de 3 litros. Aps a execuo d e cada uma das instrues teremos: 1. (A, 0), (B, 5). 2. (A, 3), (B, 2). 3. (A, 0), (B, 2). 4. (A, 2), (B, 0). 5. (A, 2), (B, 5). 6. (A, 3), (B, 4). Uma outra tcnica bastante utilizada se tentar raciocinar a partir de uma soluo conhecida de uma ou tra questo. Para compreender isto considere as duas seguintes questes: imagine uma relao de n nmeros, os quais podem ser referenciados por ai com i = 1, 2, ..., n e queiramos som-los com a restrio de que s sabemos efetuar somas de duas parcelas. Par a resolver esta questo, podemos pensar em casos particulares: se n = 2, basta som ar os dois nmeros; se n = 3, basta somar os dois primeiros e somar esta soma com o terceiro. Naturalmente este raciocnio pode ser reproduzido para n > 3. A questo que a soma dos dois primeiros deve estar "guardada" para que se possa som-la com o terceiro, obtendo-se a soma dos trs primeiros; esta soma deve ser "guardada" pa ra que seja somada com o quarto e assim sucessivamente. Para isto podemos estabe lecer uma referncia soma "atual", a qual ser alterada quando a soma com o elemento seguinte for efetuada. At para somar os dois primeiros, pode-se pensar em somar "a soma do primeiro" com o segundo. Temos ento o seguinte algoritmo: 1. Faa i = 1. 2. Faa Soma = a1. 3. Repita n 1 vezes as instrues 3.1 e 3.2. 3.1. Substitua i por i + 1. 3.2. Substitua Soma por Soma + ai. Por exemplo: se n = 5 e a1 = 8, a2 = 4 , a3 = 9, a4 = 13 e a5 = 7, a execuo do algoritmo resultaria nas seguintes aes: 1. i = 1. 2. Soma = 8. 3.1.1. i = 2. 3.2.1. Soma = 8 + 4 = 12 3.1.2. i = 3. 3.2.2. S oma = 12 + 9 = 21. 3.1.3. i = 4. 3.2.3. Soma = 21 + 13 = 34. 3.1.4. i = 5. 3.2.4 . Soma = 34 + 7 = 41. Naturalmente, na execuo acima estamos indicando por 3.1.x e 3.2.x a execuo de ordem x das

instrues 3.1 e 3.2. Como veremos ao longo do livro, este algoritmo bastante utiliz ado em programao, sendo mais comum at o primeiro termo da relao ser "somado" dentro d a repetio. Neste caso, para que o primeiro seja somado, necessrio que Soma seja ini cializado com 0 (zero), ficando assim o algoritmo: 1. Faa i = 0. 2. Faa Soma = 0. 3. Repita n vezes as instrues 3.1 e 3.2. 3.1. Substitua i por i + 1. 3.2. Substitu a Soma por Soma + ai. Conhecendo este algoritmo, fcil ento resolver a questo de se calcular o produto de n nmeros nas mesmas condies, e a vemos como utilizar uma soluo onhecida para resolver um problema. Deve-se inicializar uma referncia Produto com 1 e, numa repetio, multiplicar os nmeros como foi feito no caso da soma: 1. Faa i = 0. 2. Faa Produto = 1. 3. Repita n vezes as instrues 3.1 e 3.2. 3.1. Substitua i p or i + 1. 3.2. Substitua Produto por Produto x ai. 1.6 Processador de um algoritmo Obviamente, um algoritmo deve ser executado por algum agente. Este agente pode s er uma pessoa munida de certos equipamentos e utenslios ou por mquinas projetadas para executar automaticamente algumas instrues bsicas. O algoritmo para a travessia do senhor gordo com as galinhas, sua raposa e seu saco de milho seria executado pelo tal senhor, que estava para tal munido do barco e de remos. O algoritmo pa ra obteno de quatro litros de gua a partir de recipientes de contedos cinco litros e trs litros poderia ser executado por uma pessoa que dispusesse dos dois recipien tes e de gua em abundncia. Neste ltimo caso, quem sabe, a pessoa poderia ser substi tuda por um rob. O agente que executa um algoritmo chamado processador e evidente que para que o algoritmo seja executado necessrio que o processador seja capaz de executar cada uma das suas instrues. Se o senhor gordo no souber remar ele no ser ca paz de atravessar o rio. Uma pessoa que no seja capaz de esvaziar um recipiente q ue pese cinco quilos no ser capaz de executar o algoritmo dos quatro litros de gua. Alguns autores de livros com objetivos idnticos a este - facilitar a aprendizage m da programao de computadores - iniciam seus textos discorrendo exclusivamente so bre resoluo de problemas, encarando o processador como uma "caixa preta" que receb e as instrues formuladas pelo algoritmo e fornece a soluo do problema, no levando em conta o processador quando da formulao do tal algoritmo. Entendemos que esta no a m elhor abordagem, visto que o conhecimento do que o processador pode executar pod e ser definidor na elaborao do algoritmo. Por exemplo: imagine que queiramos elabo rar um algoritmo para extrair o algarismo da casa das unidades de um inteiro dad o (apresentaremos posteriormente uma questo bastante prtica cuja soluo depende deste algoritmo). Evidentemente, o algoritmo para resolver esta grande questo depende do processador que vai execut-lo. Se o processador for um ser humano que saiba o qu e nmero inteiro, algarismo e casa das unidades, o algoritmo teria uma nica instruo: 1. Fornea o algarismo das unidades do inteiro dado. Porm, se o processador for um ser humano que saiba o que nmero inteiro e algarismo, mas no saiba o que casa das unidades, o algoritmo no poderia ser mais esse. Neste caso, para resolver a questo , o processador deveria conhecer mais alguma coisa, como, por exemplo, ter a noo d e "mais direita", ficando o algoritmo agora como: 1. Fornea o algarismo "mais dir eita" do nmero dado. E se o processador uma mquina e no sabe o que algarismo, casa das unidades, "mais direita", etc.? Nesta hiptese, quem est elaborando o algoritmo deveria conhecer que instrues o processador capaz de executar para poder escrever o seu algoritmo. Por exemplo, se a mquina capaz de determinar o resto de uma div iso inteira, o algoritmo poderia ser:

1. Chame de n o inteiro dado; 2. Calcule o resto da diviso de n por 10; 3. Fornea este resto como o algarismo pedido. Algumas das questes anteriores so importantes para se desenvolver o raciocnio, mas no este tipo de questo que se pretende discuti r ao longo deste livro. Estamos interessados em algoritmos para: 1. Resolver pro blemas matemticos, como algoritmos para determinar a mdia aritmtica de vrios nmeros d ados, determinar as razes de uma equao do segundo grau, encontrar o mximo divisor co mum de dois nmeros dados, totalizar as colunas de uma tabela, etc. 2. Resolver qu estes genricas, como algoritmos para colocar em ordem alfabtica uma relao de nomes de pessoas, atualizar o saldo de uma conta bancria na qual se fez um depsito, corrig ir provas de um teste de mltipla escolha, cadastrar um novo usurio de uma locadora , etc.. Na linguagem coloquial, o algoritmo para o clculo da mdia pode ser escrito de forma muito simples: 1. Determine a quantidade de nmeros; 2. Some os nmeros da dos; 3. Divida esta soma pela quantidade de nmeros. Qualquer pessoa que saiba con tar, somar e dividir nmeros capaz de executar este algoritmo dispondo apenas de lp is e papel. A questo que se pe : e se a relao contiver 13.426 nmeros? A tal pessoa az de executar, porm, quanto tempo levar para faz-lo? Um outro aspecto a ser observ ado que nem sempre a linguagem coloquial eficiente para se escreverem as instrues. Nessa linguagem o algoritmo para determinao das razes de uma equao do segundo grau t eria uma instruo difcil de escrever e difcil de compreender como: n. Subtraia do qua drado do segundo coeficiente o produto do nmero quatro pelo produto dos dois outr os coeficientes. Isto pode ser parcialmente resolvido utilizando-se uma linguage m prxima da linguagem matemtica que j foi utilizada em exemplos da seo anterior. No c aso da equao do segundo grau teramos o seguinte algoritmo, que nos ensinado nas ltim as sries do ensino fundamental: 1. Chame de a, b e c os coeficientes da equao. 2. C alcule d = b - 4ac. 3. Se d < 0 fornea como resposta a mensagem: A equao no possui ra es reais. 4. Se d 0 4.1 Calcule x1 = (-b + raiz(d))/2a e x2 = (-b - raiz(d))/2a. 4.2 Fornea x1 e x2 como razes da equao. De maneira mais ou menos evidente, raiz(d) est representando a raiz quadrada de d e a execuo deste algoritmo requer que o proc essador seja capaz de determinar valores de expresses aritmticas, calcular razes qu adradas, efetuar comparaes e que conhea a linguagem matemtica. Algoritmos para probl emas genricos so mais complicados e as linguagens utilizadas anteriormente no so ade quadas (para o caso da ordenao de uma relao de nomes, foram desenvolvidos vrios algor itmos e teremos oportunidade de discutir alguns deles ao longo deste livro).

1.7 Exemplos de algoritmos matemticos Para uma primeira discusso em termos de aprendizagem de desenvolvimento de algori tmos e utilizando a linguagem usada no exemplo da equao do segundo grau, apresenta mos a seguir alguns exemplos de algoritmos que objetivam a soluo de questes da mate mtica. Para eles supomos que o processador seja capaz de efetuar somas, subtraes e divises decimais, de realizar comparaes, de repetir a execuo de um conjunto de instru um nmero determinado de vezes ou enquanto uma condio seja atendida. 1. No exemplo do algoritmo para obteno do algarismo da casa das unidades de um inteiro dado supo mos que o processador seria capaz de calcular o resto de uma diviso inteira. Obse rvando que no est suposto que o nosso processador seja capaz de determinar restos de divises inteiras, vamos discutir um

algoritmo para a determinao do quociente e do resto da diviso de dois inteiros posi tivos dados. Por exemplo: se o dividendo for 30 e o divisor for 7, o algoritmo d eve fornecer os valores 4 para o quociente e 2 para o resto. Fomos ensinados que , para determinar o quociente, deveramos, por tentativa, encontrar o nmero que mul tiplicado pelo divisor resultasse no maior nmero menor que o dividendo. No exempl o numrico citado, poderamos tentar o 5 e teramos 5x7 = 35 que maior que 30; tentaram os o 3 obtendo 3x7 = 21 que talvez seja pequeno demais em relao ao 30; a tentaramos o 4 obtendo 4x7 = 28, encontrando ento o quociente 4. Um algoritmo para soluciona r esta questo poderia ser: 1. Chame de D1 e D2 o dividendo e o divisor dados. 2. Faa I = 1. 3. repita 3.1 at IxD2 > D1. 3.1. Substitua I por I + 1. 4. Calcule Q = I 1. 5. Calcule R = D1 - QxD2. 6. Fornea R para o resto e Q para o quociente pedi dos. No exemplo numrico proposto, teramos a seguinte tabela com os valores obtidos durante a execuo do algoritmo: D1 30 D2 7 I 1 2 3 4 5 QxI 7 14 21 28 35 4 2 Q R

2. O algoritmo abaixo determina o menor divisor maior que 1 de um inteiro dado. A ideia verificar se d = 2 divisor e, no sendo, verificar se 3 ou 4 ou 5, etc, di visor. A procura por um divisor vai at que um divisor seja encontrado. Naturalmen te, utilizando o algoritmo anterior, o nosso processador agora sabe determinar o resto da diviso inteira de um inteiro x por outro inteiro y no nulo. Isto ser indi cado por Resto(x, y). Para encontrar um divisor de n basta encontrar um inteiro d tal que Resto(n, d) = 0. 1. Chame de N o inteiro dado. 2. Faa D = 2. 3. Repita 3.1 enquanto Resto(N, D) 0 3.1 Substitua D por D + 1 4. Fornea D para o divisor p rocurado. 3. Como se depreende facilmente da sua denominao, o mximo divisor comum ( mdc) de dois nmeros dados o maior nmero que os divide. Antes o mdc s era utilizado para simplificaes de fraes ordinrias; atualmente ele utilizado na determinao de ch pblicas para sistemas de criptografia RSA [Evaristo, J, 2002]. Por exemplo, mdc(6 4, 56) = 8. De maneira bvia, o algoritmo abaixo determina o mdc de dois nmeros dad os: 1. Chame de x e de y os nmeros. 2. Determine D(x), o conjunto dos divisores d e x. 3. Determine D(y), o conjunto dos divisores de y. 4. Determine I, a interseo de D(x) e D(y). 5. Determine M, o maior elemento do conjunto I. 6. Fornea M como o mdc procurado. O clculo de mdc(120, 84) com este algoritmo seria: 1. x = 120, y = 84. 2. D(120) = {1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 24, 30, 40, 60, 120}. 3 . D(84) = {1, 2, 3, 4, 6, 7, 12, 14, 21, 28, 42, 84}. 4. I = {1, 2, 3, 4, 6, 12} . 5. M = 12. Observe que o algoritmo anterior determina o menor divisor de um in teiro no determinando todos os

divisores, como necessrio neste exemplo. Observe tambm que estamos supondo que o n osso processador capaz de determinar a interseo de dois conjuntos. A matemtica forn ece uma outra forma de se calcular o mdc de dois inteiros: determina-se a decomp osio em fatores primos dos dois inteiros e o mdc o produto dos fatores primos comu ns as duas decomposies com as menores multiplicidades. Para o exemplo dado acima t eramos: 120 2 84 2 60 2 42 2 30 2 21 3 15 3 77 5 5 1 1 1 o que nos d 120 = 23x3x5 e 84 = 22x3x7 e, portanto, mdc(120, 84) = 22x3 = 12. Vale observar que escrever este algoritmo na linguagem informal que estamos utilizando bastante complicado. Na h dvida que o primeiro algoritmo para o clculo do mdc apresentado de compreenso bastante simples. Porm, comentaremos posteriormente que ele computacionalmente ba stante ineficiente no sentido de que sua execuo pode, dependendo dos valores de x e y, demandar um tempo acima do razovel. Por incrvel que possa parecer, o algoritm o mais eficiente para o clculo do mximo divisor comum de dois nmeros foi desenvolvi do pelo matemtico grego Euclides duzentos anos Antes de Cristo. O algoritmo de Eu clides nos apresentado nas sries intermedirias do ensino fundamental atravs de um e squema como o diagrama do exemplo abaixo, cujo objetivo determinar (de novo!) o mximo divisor comum de 120 e 84. 1 2 3 120 84 36 12 O esquema funciona da seguint e forma: divide-se 120 por 84 obtendo-se resto 36; a partir da, repetem-se divises at que o resto seja zero, sendo o dividendo da diviso atual o divisor da diviso an terior e o divisor da diviso atual o resto da diviso anterior. O ltimo divisor o mxi mo divisor procurado. Como se pode ver, estas instrues escritas desta forma no so na da compreensveis, o que faz com elas sejam transmitidas oralmente nas salas do en sino fundamental. No captulo 4 (quatro), teremos a oportunidade de discutir este algoritmo com detalhes e veremos que ele um algoritmo bastante interessante no d esenvolvimento da lgica de programao. 4. Discutiremos agora o algoritmo para o clcul o da mdia de uma relao contendo um nmero grande (digamos, 10 000) de nmeros dados. No caso da equao do segundo grau, eram trs os dados de entrada e, portanto, os chamam os de a, b, e c. Mas agora so 10 000 os dados de entrada! Uma soluo possvel receber os nmeros um a um, somando-os antes de receber o seguinte, conforme vimos na seo 1. 5. 1. Chame de A o primeiro nmero dado. 2. Faa S = A. 3. Repita 9 999 vezes as ins trues 3.1 e 3.2. 3.1 Chame de A o prximo nmero dado. 3.2 Substitua o valor de S por S + A. 4. Calcule M = S/10 000. 5. Fornea M para o valor da mdia. Por exemplo, se a relao de nmeros fosse {5, 3, 8, 11, ...} at a quarta execuo de 3.1 e 3.2 teramos a guinte tabela: A 5 3 8 11 S 5 8 16 27 M Est fcil perceber que aps 9.999 execuo das instrues 3.1 e 3.2 a varivel S conter todos os nmeros da relao, o que justifica a instruo 4. 5. Um outro exemplo que justi fica plenamente a necessidade do conhecimento do que o processador capaz de exec utar a determinao do maior nmero de uma relao de nmeros. Se o processador for um

aluno do ensino mdio e a relao contiver poucos nmeros, uma simples olhada na relao pe mitir se identificar o maior nmero. Mas, e se o processador for um aluno das class es iniciais do ensino fundamental? E se a relao contiver 10 000 nmeros? E se os nmer os estiverem escritos em forma de frao ordinria? Uma soluo possvel supor que o maio ero o primeiro da relao e comparar este suposto maior com os demais nmeros, alteran do-o quando for encontrado um nmero na relao maior do que aquele que at aquele momen to era o maior. 1. Chame de A o primeiro nmero dado. 2. Faa M = A. 3. Repita 9 999 vezes as instrues 3.1 e 3.2. 3.1 Chame de A o prximo nmero dado. 3.2 Se A > M subst itua o valor de M por A. 4. Fornea M para o valor do maior nmero. Para exemplifica r, suponha que a entrada fosse o conjunto {5, 3, 8, 11, 10...}. At a quinta execuo das instrues 3.1 e 3.2 teramos a seguinte tabela: A 5 3 8 11 10 M 5 8 11

1.8 Linguagens de alto nvel Computadores digitais foram concebidos para executarem instrues escritas em lingua gem de mquina. Isto significa que um computador capaz de executar um algoritmo es crito nesta linguagem. Um algoritmo escrito em linguagem de mquina normalmente ch amado de programa objeto. Nos primrdios da computao, os algoritmos que se pretendia m que fossem executados por um computador eram escritos em linguagem de mquina, o que tornava a tarefa de desenvolvimento de algoritmos muito trabalhosa, devido ao fato de que era necessrio que se conhecesse qual sequncia de bits correspondia instruo pretendida. Naturalmente, esta dificuldade acontecia pelo fato de que o se r humano no est habituado a uma linguagem com apenas dois smbolos bsicos. Um grande avano ocorreu na computao quando se conseguiu desenvolver programas que traduzissem instrues escritas originariamente numa linguagem dos seres humanos para a linguag em de mquina. O surgimento de programas para esta finalidade permitiu o desenvolv imento de algoritmos em linguagens que utilizam caracteres, palavras e expresses de um idioma, ou seja, uma linguagem cujos smbolos bsicos e cujas palavras esto no cotidiano do ser humano. Uma linguagem com esta caracterstica chamada linguagem d e alto nvel, onde alto nvel a no se refere qualidade e sim ao fato de que ela est ma s prxima da linguagem do ser humano do que da linguagem da mquina (quando alguma c oisa est mais prxima da mquina do que do ser humano dizemos que ela de baixo nvel). Como exemplos de linguagens de alto nvel temos Pascal, C, Delphi, Visual Basic, J ava e C++. Um algoritmo escrito numa linguagem de alto nvel chamado programa font e ou simplesmente programa Como foi dito acima, um programa fonte deve ser tradu zido para a linguagem de mquina. H dois tipos de programas que fazem isto: os inte rpretadores que traduzem os comandos para a linguagem de mquina um a um e os comp iladores que traduzem todo o programa para a linguagem de mquina. Um compilador a o receber como entrada um programa fonte fornece como sada um programa escrito em linguagem de mquina, chamado programa objeto. A compilao do programa, portanto, ge ra um programa que pode ento ser executado. comum nos referirmos execuo do programa fonte quando se est executando o programa objeto. J um interpretador traduz para a linguagem de mquina os comandos do programa um a um, executando-os em seguida. Assim a interpretao de um programa no gera um programa objeto.

1.9 Sintaxe e semntica de uma instruo O que sintaxe Dissemos que um programa escrito em linguagem de alto nvel traduzido para a lingu agem de mquina por um compilador ou cada instruo traduzida por um interpretador. na tural se admitir que, para que o compilador consiga traduzir uma instruo escrita c om caracteres de algum idioma para instrues escritas como sequncias de zeros e uns, necessrio que cada instruo seja escrita de acordo com regras preestabelecidas. Est as regras so chamadas sintaxe da instruo e quando no so obedecidas dizemos que existe erro de sintaxe. Se o programa fonte contm algum erro de sintaxe, o compilador no o traduz para a linguagem de mquina (isto , o compilador no compila o programa) e indica qual o tipo de erro cometido e a instruo onde este erro aconteceu. Se o pro grama fonte for interpretado, ele executado at a instruo que contm o erro, quando en to interrompida a sua execuo e o tal erro indicado.

O que semntica Naturalmente, cada instruo tem uma finalidade especfica. Ou seja, a execuo de um inst ruo resulta na realizao de alguma ao, digamos parcial, e a sequncia das aes parc redunda na realizao da tarefa para a qual o programa foi escrito. A ao resultante da execuo de uma instruo chamada semntica da instruo. Infelizmente, um programa pode nter erros de sintaxe (e, portanto, pode ser executado), mas a sua execuo no fornec er como sada o resultado esperado para alguma entrada. Neste caso, dizemos que o programa contm erros de lgica que, ao contrrio dos erros de sintaxe que so detectado s pelo compilador ou pelo interpretador, so, s vezes, de difcil deteco. No nosso ente ndimento, para aprender a programar numa determinada linguagem necessrio que se a prenda as instrues daquela linguagem (para que se conhea o que o processador capaz de fazer), a sintaxe de cada um destes instrues e as suas semnticas. Aliado a isto, deve-se ter um bom desenvolvimento de lgica programao para que se escolha as instr ues necessrias e a sequncia segundo a qual estas instrues devem ser escritas, para qu o programa, ao ser executado, execute a tarefa pretendida. Felizmente ou infeli zmente, para cada tarefa que se pretende no existe apenas uma sequncia de instrues q ue a realize. Ou seja, dado um problema no existe apenas um programa que o resolv a. Devemos procurar o melhor programa, entendendo-se como melhor programa um pro grama que tenha boa legibilidade, cuja execuo demande o menor tempo possvel e que n ecessite, para sua execuo, a utilizao mnima da memria. Existe um conjunto de instru e comum a todas as linguagens de alto nvel e cujas semnticas permitem executar a m aioria das tarefas. A aprendizagem das semnticas destas instrues e das suas sintaxe s em alguma linguagem de programao (aliado ao desenvolvimento da lgica de programao) permite que se aprenda com facilidade outra linguagem do mesmo paradigma. 1.10 Sistemas de computao Como foi dito anteriormente, a cpu de um computador capaz de executar instrues (es critas em linguagem de mquina, permitam a repetio). Ou seja, um computador capaz de executar programas e s para isto que ele serve. Se um computador no estiver execu tando um programa ele para nada est servindo. Como foram concebidos os computador es atuais, um programa para ser executado deve estar armazenado na sua memria. O armazenamento dos programas (e todo o gerenciamento das interaes entre as diversas unidades do computador) feito por um programa chamado sistema operacional. Um d os primeiros sistemas operacionais para gerenciamento de microcomputadores foi o DOS (Disk Operating System). Quando um computador ligado, de imediato o sistema operacional armazenado na memria e s a partir da o computador est apto a executar o utros programas. Estes programas podem ser um game, que

transforma o "computador" num poderoso veculo de entretenimento; podem ser um pro cessador de texto, que transforma o "computador" num poderoso veculo de edio de tex tos; podem ser uma planilha eletrnica, que transforma o "computador" num poderoso veculo para manipulao de tabelas numricas, podem ser programas para gerenciar, por exemplo, o dia a dia comercial de uma farmcia e podem ser ambientes que permitam o desenvolvimento de games ou de programas para gerenciar o dia a dia comercial de uma farmcia. Talvez com exceo de um game, os programas citados acima so, na verda de, conjuntos de programas que podem ser executados de forma integrada. Um conju nto de programas que podem ser executados de forma integrada chamado software. P or seu turno, as unidades do computador, associadas a outros equipamentos chamad os perifricos, como uma impressora, constituem o hardware. O que nos til um conjun to software + hardware. Um conjunto deste tipo chamado de um sistema de computao. De agora em diante, os nossos processadores sero sistemas de computao. Isto , querem os escrever programas que sejam executado por um sistema de computao. Como foi dit o acima, o desenvolvimento de um programa que gerencie o dia a dia comercial de uma farmcia requer um compilador (ou um interpretador) que o traduza para a lingu agem de mquina. Antigamente, as empresas que desenvolviam compiladores desenvolvi am apenas estes programas, de tal sorte que o programador necessitava utilizar u m processador de texto parte para edio do programa fonte. Atualmente, os compilado res so integrados num sistema de computao que contm, entre outros: 1. Processador de texto, para a digitao dos programas fontes; 2. Depurador, que pe rmite que o programa seja executado comando a comando, o que facilita a descoberta de erros de lgica; 3. Help, que descreve as sintaxes e as semnticas de todas as instrues da linguagem; 4. Linker, que permite que um programa utilize out ros programas. Rigorosamente falando, um sistema constitudo de um compilador e os softwares listados acima deveria ser chamado de ambiente de programao; mais comum , entretanto, cham-lo, simplesmente, de compilador. Os ambientes de programao que u tilizamos para desenvolver os programas deste livro foram o compilador Turbo C, verso 2.01, e Turbo C++, verso 3.0, ambos desenvolvidos pela Borland International , Inc., o primeiro em 1988 e o segundo em 1992. Como se pode ver, so sistemas des envolvidos h bastante tempo (as coisas em computao andam muito mais rpido), j estando disponveis gratuitamente na internet. Estaremos, portanto, utilizando um compila dor puro C e um compilador C++, que up grade da linguagem C para a programao orienta da a objeto, paradigma que no est no escopo deste livro.

1.11 Exerccios propostos 1. Trs ndios, conduzindo trs brancos, precisam atravessar um rio dispondo para tal de um barco cuja capacidade de apenas duas pessoas. Por questes de segurana, os ndi os no querem ficar em minoria, em nenhum momento e em nenhuma das margens. Escrev a um algoritmo que oriente os ndios para realizarem a travessia nas condies fixadas . (Cabe observar que, usualmente, este exerccio enunciado envolvendo trs jesutas e trs canibais. A alterao feita uma modesta contribuio para o resgate da verdadeira hi tria dos ndios). 2. O jogo conhecido como Torre de Hani consiste de trs torres chama das origem, destino e auxiliar e um conjunto de n discos de dimetros diferentes, colocados na torre origem na ordem decrescente dos seus dimetros. O objetivo do j ogo , movendo um nico disco de cada vez e no podendo colocar um disco sobre outro d e dimetro menor, transportar todos os discos para torre destino, podendo usar a t orre auxiliar como passagem intermediria dos discos. Escreva algoritmos para este jogo nos casos n = 2 e n = 3. 3. Imagine que se disponha de trs esferas numerada s 1, 2 e 3 iguais na forma, duas delas com pesos iguais e diferentes do peso da outra. Escreva um algoritmo que, com duas pesagens numa balana de dois pratos, de termine a esfera de peso diferente e a relao entre seu peso e o peso das esferas d e pesos iguais. 4. A mdia geomtrica de n nmeros positivos a raiz n-sima do produto d estes nmeros. Supondo que o processador capaz de calcular razes n-simas, escreva um algoritmo para determinar a mdia geomtrica de n nmeros dados. 5. Sabendo que o dia 01/01/1900 foi uma segunda-feira, escreva um algoritmo que determine o dia da s emana correspondente a uma data, posterior a 01/01/1900, dada. Por exemplo, se a data dada for 23/01/1900, o algoritmo deve fornecer como resposta tera-feira.

6. O show de uma banda de rock, que ser realizado na margem de um rio, deve comear exatamente s 21 h. Atrasados, s 20 h 43 min, os quatro integrantes da banda esto n a outra margem do rio e necessitam, para chegar ao palco, atravessar uma ponte. H somente uma lanterna e s podem passar uma ou duas pessoas juntas pela ponte, e s empre com a lanterna. Cada integrante possui um tempo diferente para atravessar a ponte: o vocal leva 10 minutos, o guitarrista 5 minutos, o baixista 2 minutos e o baterista 1 minuto. Evidentemente, quando dois atravessam juntos, o tempo ne cessrio o do mais lento. Escreva um algoritmo que permita que a banda atravesse a ponte de modo que o show comece na hora marcada. 7. Resolva a questo 3 para o ca so de oito esferas, com trs pesagens. 8. Escreva um algoritmo para determinar o r esto de uma diviso inteira utilizando uma mquina de calcular que efetue apenas as quatro operaes: adio, subtrao, multiplicao e diviso. Observao Propostas de solu s propostos podem ser solicitadas atravs de mensagem eletrnica para [email protected] l.br com assunto RESPOSTAS LIVRO C, anexando o formulrio abaixo devidamente preen chido. Nome 1 2 Categoria1 Instituio2 Curso2 Cidade/Estado Categoria: docente, estudante, autodidata Se docente ou estudante

2. Introduo Linguagem C 2.1 Variveis simples O que uma varivel No captulo 1 foi dito que uma das unidades bsicas de um computador a memria, cuja f inalidade armazenar dados e informaes que sero manipulados pela unidade central de processamento. Naquele captulo tambm foi dito que os programas para serem executad os devem estar armazenados na memria. Ou seja, a memria armazena programas que sero executados e dados que estes programas vo manipular. Naturalmente, os dados que o programa vai manipular podem ser dados de entrada ou dados gerados pela execuo d o programa. Para que possa armazenar dados e informaes, a memria dividida em partes , chamadas posies de memria. O sistema operacional que gerencia o sistema de comput ao pode acessar cada uma destas posies para armazenar tais dados. Para que o acesso s posies de memria seja possvel, a cada uma delas est associada uma sequncia de bits, amada endereo da posio de memria. Como uma sequncia de bit s corresponde a um nmero i teiro escrito no sistema binrio, cada endereo pode ser visto como um inteiro escri to no sistema decimal. Assim temos posies de memria de endereo 1209 ou 2114, por exe mplo. Uma varivel simples (ou simplesmente varivel) uma posio de memria cujo conted ode ser modificado durante a execuo de um programa. A referncia a uma varivel no pro grama feita atravs do seu identificador; os valores que podem ser nela armazenado s dependem do seu tipo de dado. O identificador O identificador uma sequncia de letras, dgitos e caractere para sublinhamento esco lhida pelo programador e (como foi dito acima) ser utilizado no programa para se fazer referncia quela varivel (o primeiro caractere do identificador no pode ser um dgito). Como um programa deve ser legvel por outros programadores (e pelo prprio pr ogramador), uma boa prtica se escolher um identificador de uma varivel que tenha a lguma relao com a sua finalidade. Se uma varivel deve armazenar uma soma, um identi ficador muito bom para ela ser Soma. Se uma varivel vai receber nmeros, ela poderia ser identificada por Num ou por Numero. Os compiladores da linguagem C fazem di stino entre letras maiusculas e minsculas e, portanto, Numero e numero so dois ident ificadores diferentes. Manteremos, de um modo geral, a seguinte conveno ao longo d o texto: quando um identificador possuir mais de um caractere, inici-lo-emos por letra maiuscula e quando o identificador tiver um nico caractere, utilizaremos le tra minscula. Como veremos ao longo do livro, a linguagem C fixa alguns identific adores para a sintaxe de suas instrues. Estes identificadores no podem ser utilizad os nos programas, sendo conhecidos por palavras reservadas. Algumas das palavras reservadas em C so: Tabela 2 Palavras reservadas da linguagem C auto break case char const continue default do double else enum extern float for goto if int long register return short Signed sizeof static struct switch typedef union unsigned void volatile while

O tipo de dado O tipo de dado associado a uma varivel o conjunto dos valores que podem ser nela armazenados. A linguagem C dispe dos tipos de dados discriminados na tabela a seg uir. Tabela 3 Tipos de dados da Linguagem C Denominao char int long ou long int float double void Nmero de Bytes 1 2 4 4 8 0 Conjunto de valores caracteres codificados no cdigo ASCII nmeros inteiros de 32768 a 32767 nmeros inteiros de 65536 a 65535 nmeros reais de 3,4x1038 a 3,4x10-38 e 3,4x1 0-38 a 3,4x1038 nmeros reais de 1,7x10308 a -1,7x10-308 e 1,7x10-308 a 1,7x10308 c onjunto vazio

A utilizao void ser melhor explicada no captulo 5, quando estudarmos funes. Uma obser ao importante que os tipos float e double, rigorosamente falando, no armazenam nmero s reais e sim nmeros de um sistema de ponto flutuante, que no contm todos os reais entre dois nmeros reais dados. O estudo de sistemas de ponto flutuante foge ao es copo deste livro e feito, normalmente, em disciplinas do tipo Organizao e Arquitet ura de Computadores e Clculo Numrico. Vale lembrar que, de um modo geral, um byte contm oito bit s e cabe ressaltar que, em algumas situaes, importante se conhecer a quantidade necessria de bytes para uma varivel de um determinado tipo.

Declarao de variveis Para que o sistema de computao possa reservar as posies de memria que sero utilizadas pelo programa, associar identificadores aos endereos destas posies de memria e defin ir a quantidade de bytes de cada posio de acordo com o tipo de dado pretendido, um programa escrito em C deve conter a declarao de variveis, feita atravs da seguinte sintaxe: Tipo de dado Lista de identificadores; Por exemplo, um programa para de terminar a mdia de uma relao de nmeros dados pode ter a seguinte declarao: int Quant; float Num, Soma, Media; A ideia que Quant seja utilizada para armazenar a quanti dade de nmeros; Num para armazenar os nmeros (um de cada vez); Soma para armazenar a soma dos nmeros; e Media para armazenar a mdia procurada. Nas sees 2.7 e 2.9 vere mos as instrues em C para o armazenamento em variveis de dados de entrada e de dado s gerados pela execuo do algoritmo. Um valor armazenado em uma varivel comumente re ferido como sendo o contedo da varivel ou o valor da varivel. Tambm comum se referir ao identificador da varivel como sendo a prpria varivel.

2.2 Constantes Como uma varivel, uma constante tambm uma posio de memria qual devem ser associado m identificador e um tipo de dado. O que caracteriza uma constante (e da sua deno minao, emprestada da matemtica) o fato de que o contedo de uma constante no pode ser modificado durante a execuo do programa. Este contedo fixado quando da declarao da c nstante o que deve ser feito de acordo com a seguinte sintaxe: const Tipo de Dad o Identificador = Valor;

Por exemplo, um programa para processar clculos qumicos poderia ter uma declarao do tipo const float NumAvogadro = 6.023E+23; onde a expresso 6.023E+23 a forma que os com piladores C utilizam para representar os valores do tipo float na notao cientfica, ou seja 6.023E+23 = 6.023 x 1023. Um programa para clculos de reas de figuras plan as, permetros de polgonos inscritos em circunferncias, etc., poderia ter uma declar ao do tipo const float Pi = 3.1416; Esta declarao desnecessria quando o sistema util zado o Turbo C++ 3.0, pois esse sistema disponibiliza uma constante pr-definida, identificada por M_PI, que pode ser utilizada em qualquer parte do programa e cu jo valor uma aproximao do nmero irracional .

2.3 Ex resses aritmticas Como era de se es erar, os com iladores da linguagem C so ca azes de avaliar ex r esses aritmticas que envolvam as o eraes binrias de multi licao, diviso, soma e sub a o erao unria de troca de sinal. Para isto so usados os seguintes o eradores aritmti cos binrios: Tabela 4 O eradores aritmticos O erador + * / O erao adio subtrao multi licao diviso

e o o erador aritmtico unrio (-) ara a troca de sinal. Esses o eradores atuam com o erandos do ti o int ou do ti o float. Se um dos o erandos for do ti o float o resultado da o erao ser do ti o float; se os dois o erandos forem do ti o int o re sultado tambm do ti o int. No caso do o erador de diviso /, se os dois o erandos f orem do ti o int o resultado da o erao do ti o int e igual ao quociente da diviso d o rimeiro o erando elo segundo. Por exem lo, o resultado de 30/4 7. Se quiserm os a diviso decimal teremos de escrever 30.0 / 7.0 ou 30.0 / 7 ou 30 / 7.0. Ou se ja cada uma destas divises igual a 7.5 e este valor, tal como ele , ode ser armaz enado numa varivel do ti o float. O que acontece que no armazenamento de um valor do ti o float numa varivel do ti o int a arte decimal do valor des rezada, s sen do armazenada a arte inteira do nmero. Uma ex resso que envolva diversas o eraes av aliada de acordo com as regras de rioridade da matemtica: em rimeiro lugar real izada a o erao troca de sinal, em seguida so realizadas as multi licaes e divises e, inalmente, as somas e subtraes. Por exem lo, a ex resso 8 + 2*-3 avaliada como 8 + (-6) = 2. Naturalmente, a rioridade ode ser alterada com a utilizao de arnteses: a ex resso (8 + 2)*-3 resulta em 10*(-3) = -30. Embora, o sistema no exija, vamos sem re utilizar arnteses ara se arar o o erador unrio ara troca de sinal de al gum o erador binrio. Assim, 8 + 2*-3 ser indicada or 8 + 2*(-3). Uma ex resso no a rentesada contendo o eradores de mesma rioridade avaliada da esquerda ara dire ita. Por exem lo, 10/2*3 igual a (10/2)*3 = 5*3 = 15. O erandos odem ser contedo s de variveis. Neste caso, o o erando indicado elo identificador da varivel ( ara isto que serve o identificador, ara se fazer referncia aos valores que na varive l esto armazenados). Alm dos o eradores aritmticos usuais, os com iladores C dis on ibilizam o o erador mdulo, indicado or %, que calcula o resto da diviso do rimei ro o erando elo segundo. Por exem lo, 30 % 4 = 2 e 5 % 7 = 5. Este o erador atu a a enas em o erandos do ti o int, resultando um valor deste mesmo ti o. Por exe m lo, se S uma varivel do ti o float, a ex resso S % 5 gerar um erro de com ilao. Um ex resso do ti o 30.0 % 7 tambm gerar erro de com ilao, elo fato de que um dos o er andos no inteiro. Este erro indicado elo sistema ela mensagem Illegal use of fl oating oint in function ... (Uso ilegal de ti o float na funo ...), onde as reticn cias esto substituindo o identificador da funo, como ser discutido osteriormente.

2.4 Relaes Os ambientes que im lementam a linguagem C efetuam com araes entre valores numricos , realizadas no sentido usual da matemtica. Essas com araes so chamadas relaes e so idas atravs dos o eradores relacionais > (maior do que), >= (maior do que ou igua l a), < (menor do que), 5 resulta no val or 0 (zero), enquanto que 7 3) (5 < 3) tem valor 0 (zero), ois ! (5 > 3) uma relao falsa e 5 < 3 tambm . Considerando que os o eradores lgicos tm rioridade mais baixa que os o er adores relacionais, os arnteses nas ex resses acima so desnecessrios; orm entendemo s que a colocao deles facilita a leitura da ex resso. Os sistemas C 2.01 e C++ 3.0 tambm dis onibilizam os o eradores lgicos & e cujas a licaes so idnticas s a lica && e , res ectivamente. A diferena entre & e &&, or exem lo, a seguinte: se em (R1) && (R2) o valor de R1 for 0 (zero) o valor R2 no mais avaliado, enquanto qu e em (R1) & (R2) o valor de R2 avaliado, inde endentemente do valor de R1.

2.6 Estrutura de um rograma em C Estamos tentando a render a escrever rogramas na linguagem C. J vimos que se o rograma necessitar mani ular variveis, estas devem ser declaradas. Veremos no ca t ulo 5 que um rograma ode conter funes. Na verdade, veremos que um rograma em C um conjunto de funes definidas elo rogramador, funes que utilizaro outras funes de idas elo rogramador e algumas funes oferecidas elo sistema (as funes oferecidas elo sistema so chamadas funes de biblioteca ou funes r-definidas). Veremos no citado ca tulo que uma funo deve ser definida com a seguinte estrutura. Ti o de Dado Ident ificador da funo(Lista de armetros) { Declarao de variveis Sequncia de instrues } significado de Lista de armetros ser ex licado no ca tulo j referido e a Sequncia d e instrues contm comandos, ativaes de funes r-definidas e ativaes de funes def surio no r rio rograma ou em outros rogramas. Todo rograma em C deve conter um a funo identificada or main (cuja traduo rinci al), com lista de armetros vazia e ti o de dado no obrigatrio. Esta ser sem re a rimeira funo do rograma a ser executa da. Desta forma, o menor rograma em C main() { } Este rograma ode ser executa do, mas nada realiza, devido ao fato de que ele no contm nenhuma instruo. Observe qu e todo o cor o da funo deve estar dis osto entre chaves. As chaves so utilizadas em outros ontos de um rograma e so chamadas delimitadores. Os delimitadores, o id entificador main e os arnteses, dis ostos ao lado do identificador main, so os nic os elementos obrigatrios de um rograma. Como os com iladores C ignoram es aos em branco, caracteres de tabulao e caracteres de mudana de linha, no existe um estilo o brigatrio de se editar rogramas em C. Por exem lo, o rograma acima oderia ser escrito de uma das seguintes maneiras. main ( ) { } ou main(){} ou main( ){} Evi dentemente, um rogramador em C deve rocurar escrever seus rogramas num estilo que oferea uma boa legibilidade, o que vai facilitar a sua com reenso or outra essoa e a descoberta de ossveis erros de lgica. 2.7 Entrada dos dados de entrada A funo scanf() A maioria dos rogramas mani ula dados que so fornecidos elo usurio durante a exe cuo do

rograma. Estes dados constituem a entrada do rograma e, naturalmente, devem se r armazenados em variveis. Por exem lo, um rograma ara determinao das razes de uma equao do segundo grau deve receber como entrada os valores dos trs coeficientes da equao: so estes valores que identificam a equao. De um modo geral, os com iladores C ermitem a rece o de dados de entrada (e o consequente armazenamento em variveis) atravs da funo de biblioteca scanf() que ossui a seguinte sintaxe: scanf(Ex resso d e controle, Lista de variveis); A, Ex resso de controle deve ser escrita entre as a s e contm os cdigos de converso que indicam como o sistema deve armazenar os dados digitados no teclado e caracteres que o usurio deve digitar se arando a digitao des tes dados. Na Lista de variveis as variveis so se aradas or vrgulas e cada uma dela s deve ser recedida do o erador de endereo &. Este o erador indica o endereo da osio de memria definida ara a varivel identificada na lista de variveis. Quando da e xecuo desta funo, a janela de edio substituda ela janela do usurio e o sistema f ardando que o usurio digite um nmero de valores igual ao nmero de variveis da lista de variveis ( medida que so digitados, os valores a arecem na tela do usurio). A con cluso da entrada dos dados feita com a digitao da tecla e quando isto feito , o sistema armazena os dados digitados na varivel res ectiva (no sentido da orde m da colocao da varivel na lista e da digitao do valor), de acordo com o cdigo de con erso. Por exem lo, #include main() { int Anos scanf("%d", &Anos) } um rograma em C que armazena um valor inteiro digitado no teclado na varivel Anos (o u seja, ara nada serve, ois o inteiro armazenado naquela osio de memria esvanece q uando a execuo do rograma encerrada). Quando se vai dar entrada em mais de um dad o atravs de uma mesma ativao da funo scanf(), ode-se fixar caracteres que devero ser digitados quando da entrada dos dados. Por exem lo, se retendemos dar entrada n uma data, odemos ter o seguinte trecho de rograma: #include main() { int Dia, Mes, Ano; scanf("%d/%d/%d", &Dia, &Mes, &Ano); ... } e a data retendi da deve ser digitada no formato dd/mm/aaaa, devendo o usurio digitar as barras en tre as digitaes do dia e do ms e deste e do ano. A concluso se d com a digitao da te , como se estivesse digitando um nico dado. A digitao das barras necessria elo fato de que elas esto se arando os cdigos de formatao na ex resso de controle. Se a s a digitao do valor da varivel Dia for acionada a tecla , a execuo da fun cerrada e os valores de Mes e Ano no odem ser digitados. Se no h nenhum caractere se arando os cdigos de formatao, a digitao dos dados ode ser intercalada ela digita da tecla ou da . o caso, or exem lo, do trecho de rogr ama main() { int i; char c; scanf("%c %d", &c, &i); ... }

onde as digitaes do caractere que se retende armazenar na varivel c e do inteiro a ser armazenado em i devem ser se aradas elo acionamento da tecla ou da . necessrio notar que a digitao de um valor de um ti o diferente do ti o da varivel no rovoca erro de execuo, mas, evidentemente, ode rovocar erro d e lgica do rograma. Por exem lo, se na execuo do comando scanf("%c %d", &c, &i); d igitarmos w5.9, o caractere w armazenado na varivel c e o inteiro 5 armazenado na varivel i. Portanto, se o dado de entrada fosse realmente 5.9, o r esultado do rocessamento oderia ser fornecido com erros. Se o dado de entrada oderia ser 5.9, a varivel ara seu armazenamento deveria ter sido definida com f loat.

Os cdigos de converso e a instruo #include Os cdigos de converso de acordo com o ti o de dado da varivel onde os valores digit ados sero armazenados so a resentados na tabela a seguir. Tabela 7 Cdigos de converso da funo scanf() Cdigo %c %d ou %i %o %x %ld %e %f %s Elemento armazenado um nico caractere um inteiro do sistema decimal um inteiro do sistema octal um inteiro do sistema hexadecimal um valor do ti o long um nmero n a notao cientfica um nmero em onto flutuante uma cadeia de caracteres

A instruo #include que recede a funo main() necessria elos seguintes fat s. Como dissemos acima, ara se definir uma funo necessrio fixar o ti o de dado que ela retorna, o identificador da funo e a lista de armetros, com seus identificado res e seus ti os de dados; este conjunto de elementos chamado rotti o da funo. Par a que a funo main() ative uma outra funo (seja uma funo definida elo usurio ou uma de biblioteca), o seu rotti o deve ser definido antes ou no interior da funo main( ). Os rotti os das funes do sistema encontram-se reunidos, de acordo com objetivos semelhantes, em arquivos chamados arquivos de cabealhos (header files) (o cabealh o de uma funo inclui o seu rotti o, as variveis declaradas dentro da funo e outras d claraes e definies que no so instrues ro riamente ditas). A instruo #include x)"); scanf("%d %d", &x, &y); a = y - 1; rintf("Digite o inte iro k \n"); scanf("%d", &k); NumMulti los = (a - a % k - x + x % k)/k; rintf("O nmero de multi los de %d com reendidos entre %d e %d e' %d \n", k, x, y, NumMult i los); } 6. O rograma a seguir, alm de ser muito interessante no sentido do des envolvimento da lgica de rogramao, ser utilizado (a sequncia de comandos da funo ma )) em outros rogramas. Seu objetivo ermutar os contedos de duas variveis. Ou sej a, su onhamos que, atravs de comandos de entrada o rograma armazenou nas variveis x e y os valores 7 e 18 e retendamos que o rograma faa com que o contedo de x asse a ser 18 e o de y asse a ser igual a 7. rimeira vista, bastaria a sequncia de comandos x = y; y = x; Ocorre que, quando o segundo comando fosse executado, o rimeiro j teria sido e o contedo de x no seria mais o original. No nosso exem l o, teramos a seguinte situao x 17 8 y 8 8 e a ermuta no teria sido feita, alm do fat o de que o contedo original de x teria sido erdido. Uma alternativa considerar u ma varivel auxiliar que "guarde" o contedo de x antes que este seja substitudo elo contedo de y. Teramos assim o seguinte rograma. /* Programa que ermuta os conted os de duas variveis */ #include main() { float x, y, Aux; rintf("Digit e os dois numeros "); scanf("%f %f", &x, &y); rintf("Entrada x = %0.1f, y = %0. 1f \n", x, y); Aux = x;

x = y; y = Aux; rintf("Saida x = %0.2f, y = %0.2f \n", x, y); } Cabe observar q ue a ermuta dos contedos ode ser obtida sem a utilizao da varivel Aux. Isto deixad o ara que o leitor descubra a soluo, sendo a resentado como exerccio ro osto.

2.11 Funes de biblioteca Como dissemos na seo 2.5, os com iladores C oferecem diversas funes com objetivos rd eterminados e que odem ser executadas durante a execuo de um rograma. Para isto a execuo da funo deve ser solicitada no rograma como uma instruo, como o erando de u a ex resso ou como argumento de outra funo (a solicitao da execuo de uma funo no chamada de ativao ou chamada da funo). Para que o rogramador ossa colocar no seu rograma uma instruo que ative uma funo necessrio que ele conhea o identificador da no, quantos e de que ti o so os argumentos com que elas devem ser ativadas e o ti o de valor que ela retorna ao rograma quando termina sua execuo (como j foi dito, e ste conjunto constitui o rotti o da funo). A definio de uma funo r-definida se fa avs da seguinte sintaxe.

Identificador da funo(Lista de argumentos) sendo que a lista de argumentos ode ser vazia. A tabela a seguir a resenta algu mas das funes rdefinidas dos com iladores C, indicando o ti o dos seus argumentos e comentando o seu valor de retorno. Tabela 12 Algumas funes de biblioteca

Identificador Argumentos O que retorna fabs(x) double Valor absoluto do argument o x acos(x) double Arco cujo valor do co-seno o argumento x asin(x) double Arco cujo valor do seno o argumento x atan(x) double Arco cujo valor da tangente o ar gumento x cos(x) double Co-seno do argumento x log(x) double Logaritmo natural d o argumento x log10(x) double Logaritmo decimal do argumento x ow(x, y) double, double Argumento x elevado ao argumento y ow10(x) int 10 elevado ao argumento x random(x) int Um nmero aleatrio entre 0 e x - 1 sin(x) double Seno do argumento x sqrt(x) double Raiz quadrada do argumento x tan(x) doubl Tangente do argumento x tolower(x) char Converte o caractere x ara minsculo tou er(x) char Converte o caractere x ara maiusculo O rotti o da funo random() se encontra no arquivo stdl ib.h e os rotti os das funes tolower() e tou er() esto no arquivo cty e.h. Os rott i os das outras funes esto no arquivo math.h que, como seu nome indica, contm os ro tti os das funes matemticas. Para que a funo random() seja ativada necessrio que s ivao seja recedida ela ativao da funo randomize() que ativa o gerador de nmero ale o. Por exem lo, o rograma abaixo exibir um nmero aleatrio entre 0 e 99. /* rogram a que exibe, aleatoriamente, um nmero entre 0 e 99 */ #include #include main() { int x; randomize(); x = random(100);

rintf("%d \n", x); } O exem lo a seguir, alm de retender motivar o rximo ca tulo , ressalta uma observao j feita anteriormente: um rogramador s ca az de escrever um rograma que resolva um determinado roblema se ele souber resolver o tal robl ema "na mo", ou seja, com a utilizao a enas de l is e a el. Trata-se de um rograma que calcule a rea de um tringulo, dados os com rimentos dos seus lados. Naturalme nte, s ca az de escrever este rograma aquele que conhecer a frmula abaixo, que d a rea do tringulo cujos lados tm com rimentos a, b e c:

S= onde

p= a+ b+ c 2 o semipermetro do tringulo. Com isto, temos o seguinte programa. /*Programa que de termina a rea de um tringulo de lados de comprimentos dados*/ #include # include main() { float x, y, z, Area, SemiPer; printf("Digite os compri mentos dos lados do triangulo"); scanf("%f %f %f", &x, &y, &z); SemiPer = (x + y + z)/2; Area = sqrt(SemiPer * (SemiPer x) * (SemiPer y) * (SemiPer z)); p rintf("A area do triangulo de lados %f , %f e %f e' igual a %f \n", x, y, z, Are a); } Se este programa for executado com entrada 3, 4 e 5 temos SemiPer = 6 e S= 6 . (6 3) . (6 4) . (6 5) = 36 e, como era de se esperar, a rea do tringulo cujos lados tm comprimento 3, 4 e 5 un idades de comprimento igual a 6 unidades de rea. Agora, se este programa fosse ex ecutado para entrada 1, 2 e 5 teramos SemiPer = 4, S= 4 . (4 1) . ( 4 2 ) . ( 4 5 ) = 24 S= 4 . (4 1) . (4 2) . (4 5) = 24 e ocorreria erro de execuo pois o sistema (como era de se esperar) no calcula raiz quadrada de nmero negativo. O que acontece que nem sempre trs nmeros podem ser comprimentos dos lados de um tringulo (a matemtica prova que i sto s acontece se cada um deles for menor do que a soma dos outros dois). Assim, o comando que calcula a Area s deveria ser executado se os valores digitados para x, y, e z pudessem ser comprimentos dos lados de um tringulo. 2.12 Exerccios propostos 1. Avalie cada uma das expresses abaixo. a) ( ( 9) + sqrt(( 9)*( 9) 4*3*6))/(2* 3). b) ((pow(3, 2) == 9) && (acos(0) == 0)) (4 % 8 == 3). 2. Escreva rograma s ara a) Converter uma tem eratura dada em graus Fahrenheit ara graus Celsius. b) Gerar o invertido de um nmero com trs algarismos (exem lo: o invertido de 498 894). c) Somar duas fraes ordinrias, fornecendo o resultado em forma de frao. d) Dete rminar o maior mlti lo de um inteiro dado menor do que ou igual a um outro inteir o dado

. (

a ) . ( p b) . ( p c )

(exem lo: o maior mlti lo de 7 menor que 50 49). e) Determinar o ermetro de um o lgono regular inscrito numa circunferncia, dados o nmero de lados do olgono e o rai o da circunferncia. 3. Escreva um rograma que ermute o contedo de duas variveis s em utilizar uma varivel auxiliar (ver exem lo 5 da seo 2.9). 4. Uma loja vende seus rodutos no sistema entrada mais duas restaes, sendo a entrada maior do que ou i gual s duas restaes; estas devem ser iguais, inteiras e as maiores ossveis. Por ex em lo, se o valor da mercadoria for R$ 270,00, a entrada e as duas restaes so igua is a R$ 90,00; se o valor da mercadoria for R$ 302,75, a entrada de R$ 102,75 e as duas restaes so a iguais a R$ 100,00. Escreva um rograma que receba o valor da mercadoria e fornea o valor da entrada e das duas restaes, de acordo com as regra s acima. Observe que uma justificativa ara a adoo desta regra que ela facilita a confeco e o consequente agamento dos boletos das duas restaes. 5. Um intervalo de tem o ode ser dado em dias, horas, minutos, segundos ou sequncias "decrescentes" destas unidades (em dias e horas; em horas e minutos; em horas, minutos e segun dos), de acordo com o interesse de quem o est mani ulando. Escreva um rograma qu e converta um intervalo de tem o dado em segundos ara horas, minutos e segundos . Por exem lo, se o tem o dado for 3 850 segundos, o rograma deve fornecer 1 h 4 min 10 s. 6. Escreva um rograma que converta um intervalo de tem o dado em mi nutos ara horas, minutos e segundos. Por exem lo, se o tem o dado for 145.87 mi n, o rograma deve fornecer 2 h 25 min 52.2 s (vale lembrar que o onto o se ara dor da arte inteira). 7. Um rograma ara gerenciar os saques de um caixa eletrn ico deve ossuir algum mecanismo ara decidir o nmero de notas de cada valor que deve ser dis onibilizado ara o cliente que realizou o saque. Um ossvel critrio s eria o da "distribuio tima" no sentido de que as notas de menor valor dis onveis fos sem distribudas em nmero mnimo ossvel. Por exem lo, se a mquina s dis e de notas de 50, de R$ 10, de R$ 5 e de R4 1, ara uma quantia solicitada de R$ 87, o rogra ma deveria indicar uma nota de R$ 50, trs notas de R$ 10, uma nota de R$ 5 e duas notas de R$ 1. Escreva um rograma que receba o valor da quantia solicitada e r etorne a distribuio das notas de acordo com o critrio da distribuio tima. 8. De acord com a Matemtica Financeira, o clculo das restaes ara amortizao de um financiamento de valor F em n restaes e a uma taxa de juros i dada ela frmula P = F/ani, onde an = ((1 + i)n 1)/(i . (1 + i)n). Escreva um rograma que determine o valor das r estaes ara amortizao de um financiamento, dados o valor do financiamento, o nmero de restaes ara amortizao e a taxa de juros. Observao Pro ostas de solues dos exerc o ostos odem ser solicitadas atravs de mensagem eletrnica ara [email protected] com assunto RESPOSTAS LIVRO C, anexando o formulrio abaixo devidamente reenchid o. Nome 1 2 Categoria1 Instituio2 Curso2 Cidade/Estado Categoria: docente, estudante, autodidata Se docente ou estudante

3 Estruturas de seleo 3.1 O que uma estrutura de seleo O ltimo exem lo do ca tulo anterior a resentava um rograma ara calcular a rea de um tringulo, dados os com rimentos dos seus lados. Foi visto que o comando que ca lculava a rea solicitada s devia ser executado com a certeza anterior de que os va lores dados como entrada oderiam ser com rimentos dos lados de um tringulo. Ou s eja, o tal comando s deveria ser executado se x < y + z e y < x + z e z < x + y, condio que garante que os valores armazenados nas variveis x, y e z so com rimentos dos lados de um tringulo. Assim, em algumas situaes, alguns comandos s devem ser exe cutados se alguma condio for satisfeita. muito fcil encontrar situaes em que a execu e uma ou mais instrues deve estar condicionada ao fato de que uma condio seja satisf eita. Por exem lo, veremos algoritmos ara ordenar uma relao de nmeros que necessit am colocar em ordem crescente os contedos de duas variveis. bvio que ara ordenar e m ordem crescente os contedos de duas variveis x e y s necessrio se fazer alguma coi sa se o contedo de x for maior que o contedo de y, ou seja, se x > y. H situaes tambm em que h necessidade de que se faa uma escolha entre duas ou mais sequncias de inst rues qual a sequncia deve ser executada. Por exem lo, se retendemos verificar se u m nmero n ar odemos determinar o resto da diviso de n or 2. Se este resto for z ero, ento o nmero ar. Se este resto for 1, o nmero m ar. Vale lembrar que os algor tmos que o viver exige que executemos diuturnamente so ontuados de escolhas e de cises: se no chover, iremos ara a raia, se chover, iremos ara o sho ing; se es tiver fazendo frio, vista um casaco. A verificao de que uma condio satisfeita e, a artir da, uma determinada sequncia de comandos deve ser executada chamada de estru tura de seleo, estrutura de deciso ou comando de seleo.

3.2 O comando if O comando if uma estrutura de deciso que decide se uma sequncia de comandos ser ou no executada. Sua sintaxe if (Ex resso) { sequncia de comandos } sendo os delimitad ores o cionais se a sequncia de comandos contm um nico comando. A semntica deste com ando muito sim les: se o valor da Ex resso for diferente de zero, o sistema execu tar a sequncia de comandos; caso contrrio o sistema no executar a sequncia de comando e a instruo a s o comando if assa a ser executada. Por exem lo, se queremos um r ograma que determine o maior de dois nmeros dados, odemos su or que o rimeiro d eles o maior, armazenando-o numa varivel Maior e de ois, atravs de um comando if, verificar se o maior rocurado o segundo dos nmeros dados; neste caso o contedo da varivel Maior deve ser alterado. /*Programa ara determinar o maior de dois nmero s dados */ #include main() { float a, b, Maior; rintf("Digite os dois numeros"); scanf("%f %f", &a, &b); Maior = a;

if (b > a) Maior = b; rintf("O maior dos numeros %f , %f e' %f ", a, b, Maior); } Um outro exem lo de utilizao do comando if a arece num rograma que retenda or denar os contedos de variveis x e y. Para isto s h de necessidade de se realizar alg uma ao se o contedo de y for maior do que o contedo de x. Neste caso, o que deve ser feito a ermuta dos contedos de x e de y. Temos ento o seguinte rograma. /* Prog rama ara ordenar os contedos de duas variveis */ #include main() { floa t x, y, Aux; rintf("Digite os dois numeros"); scanf("%f %f", &x, &y); rintf("C onteudos originais de x e de y: %f , %f \n: ", x, y); if (y < x) { Aux = x; x = y; y = Aux; } rintf("Conteudos de x e de y ordenados: %f , %f: \n", x, y); } Ob serve que a sequncia de comandos Aux =x; x = y; y = Aux; realiza a ermuta dos co ntedos das variveis x e y, como discutido em exem lo do ca tulo anterior.

3.3 O comando if else O comando if else uma estrutura de deciso que decide entre duas sequncias de coman dos qual vai ser executada, sendo definido atravs da seguinte sintaxe: if (Ex res so) { Sequncia de comandos 1 } else { Sequncia de comandos 2 } A semntica deste coma ndo a seguinte: se o valor de Ex resso for diferente de zero, o sistema executar a sequncia de comandos 1; caso contrrio o sistema executar a sequncia de comandos 2. Por exem lo, se queremos um rograma que verifique a aridade de um nmero dado, oderamos verificar se o resto da diviso do nmero or dois igual a 0. Se isto for ve rdade, o nmero ar; se no for verdade, o nmero dado m ar. /* Programa ara verifica se um nmero e' ar */ #include main() {

int x, y; rintf("Digite o numero"); scanf("%d", &x); if (x % 2 == 0) rintf("%d e' ar \n", x); else rintf("%d e' im ar \n", x); } Mesmo considerando que os c om iladores da linguagem C no consideram es aos nem mudanas de linha, observe que e stamos rocurando escrever cada instruo em uma linha e a sequncia vinculada estrutu ra de deciso com uma tabulao diferente da tabulao em que esto ostos o if e o else. E ta forma de se editar um rograma, chamada indentao, deve ser raticada or todo rogramador ois ela facilita sobremaneira a legibilidade dos rogramas. Se o ro grama acima fosse digitado da forma seguinte /* Programa ara verificar se um nme ro ar*/ #include main(){ int x, y; rintf("Digite o numero"); scanf(" %d", &x); if (x % 2 == 0) rintf("%d e' ar \n", x); else rintf("%d e' im ar \n ", x); } ele seria executado da mesma forma, orm a sua legibilidade estaria rej udicada.

3.4 O o erador condicional ternrio Quando as duas o es de um comando if else contm a enas uma atribuio a uma mesma variv l, ode-se utilizar o o erador condicional ternrio que ossui a seguinte sintaxe: Varivel = Ex resso lgica ? Ex resso 1 : Ex resso 2; Na execuo deste comando a Ex re lgica avaliada e se for diferente de zero o valor da Ex resso 1 atribudo Varivel; so contrrio, o valor da Ex resso 2 atribudo. Por exem lo, se x, y e Maior so trs var eis do ti o float o armazenamento do maior dos contedos de x e de y na varivel Mai or oderia ser obtido com a seguinte atribuio: Maior = (x > y) ? x : y; Como um ou tro exem lo, ara se armazenar na varivel AbsNum o valor absoluto do contedo de um a varivel Num (sem utilizar a funo fabs()) bastaria o comando: AbsNum = (Num >= 0) ? Num : -Num;

3.5 Exem los Parte II 0. De um modo geral, as ligaes telefnicas so cobradas elas suas duraes. O sistema re istra os instantes em que a ligao foi iniciada e concluda e acionado um rograma qu e determina o intervalo de tem o decorrido entre aqueles dois instantes dados. O rograma abaixo recebe dois instantes dados em horas e minutos e determina o in tervalo de tem o (em horas e minutos) decorrido entre eles. /*Programa que deter mina o intervalo de tem o decorrido entre dois instantes*/ include mai n() { int h1, min1, h2, min2, h, min; uts("Digite o instante inicial (horas e m inutos)"); scanf("%d %d", &h1, &min1);

uts("Digite o instante final"); scanf("%d %d", &h2, &min2); h = h2 - h1; min = min2 - min1; if ((h < 0) ((h == 0) && (min < 0))) uts("\aDados invalidos! O segundo instante anterior ao rimeiro"); else { if (min < 0) { h = h - 1; min = min + 60; } rintf( "Entre os instantes %dh %dmin e %dh %dmin assaram-se %dh %d min", h1, min1, h2, min2, h, min); } } 1. No ltimo exem lo do ca tulo 2, a resenta mos um rograma que calculava a rea de um tringulo, dados os com rimentos dos seus lados. No final dele, mostramos que o mesmo no fornecia res ostas satisfatrias a ra todas as entradas e comentamos que o