Vous êtes sur la page 1sur 425
pt PSS ats 3 Algoritmos e Programacao de Computadores ey Tar lle mea el Gilberto Shigueo Nakamiti Pile Me Mia lelaler male (-l elie) Ce Francisco Bianchi Le de) : ial com direi © 2012, Elsevier Editora Lida. ‘Todos os direitos reservados e protegidos pela lai n® 9.610, de 19/02/1998, Nenhuma parte deste livro, sem autarizagéo prévia por escrito da editora, podera ser re- produtida ou transmitida sejam quais forem os meios empregades: eletrEnicos, mecéinicos, folograticos, gravagao ov quaisquer outros. Copidesque: Ana Paula Martini Editoragéo Eletrénica: DTPhosnix Editorial ii ia Fon oe Conhacimento sem Frontsiras Rus Sate de Satarbra, 11] = 162 andar 20050.006 ~ Centro ~ Rio de Janeiro ~ RI - Brasil Elsevier Editora Lida. f —— =. Servica de Mendimento co Cliente (0800-0265340 soc@elsevier.com.br 978-85-252-5032-9 (recurse sletrénico) N Nota: Muito zolo e técnica foram empregedes na edigée desta obra. No enlanto, pedem ocorrer ‘erros de digitagéo, impress ov divida concsitual. Em qualquer das hipéteses, colicitamos a ‘comunicagéo ao nosso Servigo de Aiendimento ao Cliente, para que possames esclorecer ou ‘encaminhar a quesiéo. Nem a aditora nem © autor assumem qualquer respensabilidace por aventuais danas ov perdas @ pessoas ou bens, criginades do uso desia publicacéo. CIP Brasil. Catologacio-na-fonte. Sindicato Nacional dos Editores de Livros, Rd A385 Algoritmos © programasae de computadores [recurso elatrSnice] / Dilermando Piva... fet cl.|. — Rio de Janeiro: Elsevier, 2017. recurso digital Formato: Flash Requisitos da sistema: Adobe Flash Player Moda de acesso: World Wide Web ISBN 978-85-352-5032-9 (recurso eletrénico) 1. Agoriimos. 2. Estruturas de dados (Computaséc), 3, Programagdo (Computadores). |. Piva Jinior, Dilermando. DD: 005.1 11-6942 CDU: 004.42 Sumario Capitulo 1 A légica e os algoritmos 1 Capitulo 2 O raciocinio e as formas de resolucao de problemas 33 Capitulo 3 Expressées matematicas e logicas e seus operadores 57 Capitulo 4 Tipo de dados 83 Capitulo 5 Estrutura sequencial 103 Capitulo 6 Estrutura condicional simples e composta 151 Capitulo 7 Estrutura condicional — aninhadas, selecdo de casos e outras formas 173 Capitulo 8 Estrutura de repeticao 199 Algoritmos € programaco de computadores ELSEVIER Capitulo 9 Vetor 227 Capitulo 10 Matriz 273 Capitulo 11 Modularizagao de algoritmos ~ Procedimento e Fungo 323 Capitulo 12 String ou cadeia de caracteres 389 Capitulo 13, Registros 433 Capitulo 14 Ponteiros 453 Capitulo 15 Arquivos 469 Capitulo 16 Aplicacdes e estudo de caso 485 Glossario 499 OBJETIVOS DO CAPITULO A ldgica € os algoritmos 6 eicmto maior a diteuldiadle tanto midioromeritecemsuperdte: ©9 H, W. BeecHEr E sempre assim, quanto mais dificil e complicado um problema, maior € a satisfacdo que sentimos quando finalmente resolvemos. Nunca desista de seus sonhos! een ee et ee aC ee ca te ORO eee aCe Cee Cee eee es Deen ae eee ee eee ee ees footnote ts [ol Algoritmos € programaco de computadores ELSEVIER Para comecar ‘Maasiecee!l! Onde ests 0 algoritmo para fazer ‘esse refogedo?” Voce ja deve ter passado por varias situacées dificeis, resolvendo problemas cotidianos. Sem diivida, nem todo mundo chama a sequéncia de passos ou a receita da mamie de algoritmo, mas, no fundo, é isso que uma receita é: uma sequéncia de passos que resolve um determinado problema (como fazer determinado prato). Estamos constantemente tomando decisdes, calculando, resolvendo problemas. Para tudo isso, mesmo que inconscientemente, obedecemos a certa sequéncia de passos, ou a uma certa racionalidade. Também se fala de légica! Seguimos uma certa légica! £ muito frequente ouvirmos que, para desenvolver algoritmos, temos que ter um bom “raciocinio légico” A logica esta enraizada em nossas vidas. Voltando a sequéncia de passos. Fazemos 0 que o dito popular nos indi- ca: “pense antes de fazer!” ou entao aquilo que nossa mae nos falou algumas vezes: “quando a cabeca nao pensa, 0 corpo padece!”. ‘Ao longo do tempo, o termo algoritmo passou a designar essas se- quéncias, mais ou menos aplicadas ou especificas. No principio designa- vaa forma de resolver problemas matematicos, depois principios ¢ teorias matematicas, migrando finalmente para a érea computacional, depois da invengao e consolidagao dos computadores. Para programarmos um computador, devemos conhecer e entender 0 que sao algoritmos, e como utilizd-los para determinar a sequéncia de pas- seven | Aldgica eos algoritmos = 3 sos necessarios para resolvermos determinados problemas ou, em outras palavras, encontrarmos a solucdo, ou a melhor solu¢ao, para a implementa- ¢4o em uma linguagem de programagao. Papo técnico Linguagem de Programacao € uma linguagem artificial desenvolvida para expressar sequencias de acées que podem ser executadas por uma maquina, em particular um computador. Linguagens de programacio podem ser usadas para criar programas que controlam 0 comportamento de uma maquina e/ou para expressar algoritmos com precisao. Existem muitas linguagens de programacao. Assembly, C, Pascal, java, Visual Basic so alguns exemplos de linguagem de programacao. Depois de conhecer um pouco da histéria dos algoritmos, conhecer um pouco de ldgica e sua aplicagaio no desenvolvimento de algoritmos, vamos verificar como eles devem ser escritos para que possamios utilizé-los para construir programas utilizando linguagens computacionais Vamos lA! Esse € 86 0 inicio, mas é fundamental para a construgdo do pensamento algoritmico, habilidade fundamental para construir progra- mas computacionais. Conhecendo a teoria para programar Hoje, mesmo que nao muito comum, as pessoas utilizam a palavra “Algo- ritmo” com muita naturalidade, mas para a grande maioria sua exata defi- nicio ainda é um mistério, Vamos tentar, ao longo deste capitulo, mostrar as diversas fases pelas quais passou a definigao da palavra “algoritmo”, qual a relago com a légica e como devem ser construidas as solucées algoritmicas para a implementa- cdo em linguagens comerciais de computadores. E assim surgiu o termo Algoritmo... Os algoritmos tém uma longa histéria, ea utilizagao da palavra “algoritmo” pode ser vista desde o século IX. Foi nesta época que o cientista, astrénomo e matematico persa Abdullah Muhammad Bin Musa al-Khwarizmi usou 4 __ Algoritmos € programacao de computadores ELSEVIER pela primeira vez o termo “algoritmo”, Além dessa criacao, muitos 0 cha- mam de “o Pai da Algebra”. Foino século XII que Adelardo de Bath introduziu o termo “algoritmo’, le- vando em conta a traducao de um dos livros de al-Khwarizmi, no qual o ter- mo foi traduzido para o latim como “Algorithm”. Tal palavra originalmente se referia apenas as regras da realizagao de aritmética utilizando algarismos indoarabicos. O uso da palavra permitiu sua evolucao, incluindo assim, todos 08 procedimentos definidos para resolver problemas ou realizar tarefas. Na histéria dos estudos matematicos, o trabalho dos antigos ge6metros gregos, do matematico persa Al-Khwarizmi, dos matematicos chineses e ocidentais culminaram na nogao de Leibniz do “calculus ratiocinator’, uma Algebra da légica. Muito sao os trabalhos relacionados a algoritmos ao longo da historia Um dos mais conhecidos algoritmos ¢ conhecido como “Algoritmo Eucli- diano” Euclides criou um algoritmo que serve para calcular 0 maximo di- visor comum (mdc). Ele pode ser resumido em: idir um ntimero a por b, o resto ér + Substituir a por b + Substituir b por r + Continuar a divisao de a por b até que um nao possa ser mais divi- dido. Neste caso, a é 0 mde. Exemplo: mde (480, 130) Temos: a bx 480 = 130 x 3 +90 (o resto é 90) 130 = 90x 1 +40 (r= 40) 90= 40x 2 + 10 (r= 10) 40= 10x4 +0(r=0) 10= 0 mdc (480, 130) = 10 Muitos outros algoritmos foram criados: 0 algoritmo de Arquimedes, que dé uma aproximagao do nimero Pi. Eratéstenes definiu um algoritmo para recuperar niimeros primos. Averréis (1126-1198) estava usando mé- todos algoritmicos para os seus célculos. As evidéncias histricas indicam que a primeira formalizacao de algo- ritmos computacionais ocorreu em 1936 nos trabalhos de Alan Turing e | Aldgicaeosalgoritmos = 5 seven Papo técnico Maquina de Turing ¢ uma maquina de estado finito com a habilidade de ler suas entradas mais de uma vez e também de apagar ou substituir os valores de suas entradas. Possui uma meméria auxiliarilimitada, o que permite superar as deficiéncias das maquinas de estado finito. Uma possivel definicdo: uma maquina de Turing consiste de uma maquina de estado finito, dividida em células, cada uma delas contendo no maximo um simbolo de um alfabeto disponivel. Em um dado momento, apenas algumas células contém algum valor. A unidade de estado, que {é a cada momento © contetido das células que estao em uma fita, pode, no momento seguinte e de acordo com o valor lido no momento anterior, parar ou fazer uma dentre trés opcoes: + Imprimir um simbolo do alfabeto; + Passar ao estado seguinte; + Mover para a célula da direita (D) ou esquerda (E). Alonzo Church. Esse algoritmo € conhecido como “Maquina de Turing’, o qual formou a base da ciéncia da computagao. Mas afinal, o que é um Algoritmo? De forma bastante simples, um algoritmo pode ser definido como “um con- junto de instrugdes para resolver um problema”. Segundo o dicionario Houaiss, a definigao de algoritmo 1. Em aritmética: “sisterna de numeragdo decimal assimilado dos drabes”. 2, Em matemitica: “sequéncia finita de regras, raciocinios ou operagoes que, aplicada a um mimero finito de dados, permite solucionar classes semelhantes de problemas (p.ex.: algoritmo para a extragao de uma raiz citbica)”. 2.1 “processo de calculo; encadeamento das agées necessdrias ao cum- primento de uma tarefa; processo efetivo, que produz uma solugdo para um problema num nitmero finito de etapas. Ex.: 0 a. que per- mite obter o seno de x com uma certa precisdo”. 3. Em gramitica generativa, matemitica: “mecanismo que utiliza repre- sentacées andlogas para resolver problemas ou atingir um fim, noutros campos do raciocinio e da logica. Ex.: pode-se considerar a gramatica como um a., na construgdo das fras 6 _ Algoritmos € programacao de computadores, ELSEVIER 4, Em informatica: ‘conjunto das regras e procedimentos légicos perfeita- mente definidos que levam 4 solugo de um problema em um niimero finito de etapas”. Knuth (1968, 1973), uma das pessoas mais respeitadas na area de algo- ritmos computacionais, indicou uma lista de cinco propriedades que si amplamente aceitas como requisitos para um algoritmo: + Finitude: “Um algoritmo deve sempre terminar apés um numero fi- nito de etapas”. + Definigdo: “Cada passo de um algoritmo deve ser definido com pre- cisdo; as agdes a serem executadas deverao ser especificadas rigoro- samente e sem ambiguidades para cada caso”. + Entrada: “Valores que so dados ao algoritmo antes que ele inicie. Estas entradas sdo tomadas a partir de conjuntos de objetos especificados”. + Saida: “..os valores resultantes das acées do algoritmo relacionadas com as entradas especificadas” + Eficdcia: “..todas as operacdes a serem realizadas no algoritmo de- vem ser suficientemente basicas que podem, em principio, ser fei- tas com precisio e em um periodo de tempo finito por um homem usando papel ¢ lapis”. Knuth admite que, embora sua descricao de um algoritmo possa ser intui- tivamente clara, falta-lhe rigor formal, uma vez que nao é exatamente claro 0 que “definidos com precisao’, “especificadas rigorosamente e sem ambiguida- des’, “suficientemente basicas’, e assim por diante, significam exatamente. Note que umalgoritmo nao ¢ especificamentea solucao do problema, pois, se assim fosse, cada problema sé teria um tinico algoritmo. Portanto, um algoritmo é um caminho ou os passos que se deve seguir para se chegar & solucio de um problema. essa forma, existe muitos caminhos que levam a uma solugio satisfatéria. Minsky (1967), um dos cientistas mais respeitados na Area de inteligén- cia artificial, afirma que um algoritmo é um procedimento eficaz. O termo também é usado por Knuth. Aqui esta a definigao de Minsky de procedi- mento efetivo: “Um conjunto de regras que nos diz, de momento a momento, precisamente como se comportar’, Existem muitas e muitas outras definicdes para o termo algoritmo. Al- gumas mais complexas ¢ outras mais superficiais ¢ aplicadas. seven | Alégica eos algoritmos = 7 O importante ¢ entender que um algoritmo é uma sequéncia logica de passos, com comeco, meio e fim. Cada passo desse algoritmo deve ser ex- presso de forma clara, utilizando, muitas vezes, um formalismo especifico, justamente para que nao deixe qualquer duvida, ou seja, nao haja ambi- guidade na sua interpretacao. Essa sequéncia de passos tem um objetivo especifico, que geralmente é a resolugao de um problema. Para tanto, esse algoritmo pode receber dados de entrada, muitas vezes chamados de varid- veis, ¢ como visa a resolucao de um problema, essa resposta do algoritmo visando a solucio do problema gera dados de saida, Ci.” Se Calmal Se ainda nao esta vendo uma relacdo com os algoritmos computacionais, certamente depois da definicéo de légica e dos passos de construcao voce tera mais subsidios para a correta compreensao. Se necessario, pesquise outras fontes e tedricos! O esquema a seguir ilustra essa sequéncia de atividades de forma mais abstrata, representando também o principio de funcionamento dos siste- mas computacionais: entrada — processamento ~ saida. Entrada ou Dados |—> Algoritmos ou Processamento-—P{ _Saida ou Informagio Comparar, calcular, classificar, cordenar, selecionar etc. No resumo da definigao de algoritmo, foi usada a expressao: “sequéncia logica de pasos”. Os passos, as etapas, as agdes que devem ser realizadas ou executadas, devem seguir uma sequéncia Iégica! Mas o que é légica, afinal? De forma bem simples, légica pode ser definida como “uma forma coe- rente de encadear ages, seguindo uma determinada convengao ou regra’. Logica é uma parte da filosofia que estuda os fundamentos, as estruturas © as expressdes humanas do conhecimento. E atribuida a Aristételes (séc. & —_ Algoritmos € programacao de computadores, ELSEVIER IV a.C.) a sua criagao. Por isso, ele é considerado o pai da ldgica. O objetivo de Aristételes era estudar o pensamento humano ¢ distinguir interferéncias e argumentos certos e errados. Segundo 0 dicionario Houaiss, a definicao de logica é: Em filosofia: “parte da filosofia que trata das formas do pensamento em geral (deducdo, inducao, hipstese, inferéncia etc.) e das opera- g6es intelectuais que visam a determinacao do que é verdadeiro ou nao” 2. Uma derivacao por extensao de sentido: “maneira rigorosa de racioci- nar’ ou “forma por que costuma raciocinar uma pessoa ou um grupo de pessoas ligadas por um fato de ordem social, psiquica, geografica etc.” ou “maneira por que necessariamente se encadeiam os acontecimen- tos, as coisas ou os elementos de natureza efetiva’ 3. “coeréncia, fundamento”. 4. Uma derivacao por extensao de sentido: “encadeamento coerente de alguma coisa que obedece a certas convencées ou regras” 5. Em informatica: “organizacéo e planejamento das instrugdes, asser- tivas etc. em um algoritmo, a fim de viabilizar a implantacao de um programa’: Na tiltima defini¢ao de légica, vemos a relagio de légica com o mundo computacional. As instrugées seguem assim uma sequéncia que obedecem uma determinada ordem, possuem um estado inicial, sao realizadas em um. periodo de tempo finito, e nesse periodo sao produzidos resultados espera- dos e bem definidos. Assim, tais instrugdes e ordem sao escritos na forma de um Algoritmo que utilizam o conceito da Légica Formal para fazer com. que o computador produza uma série sequencial de entrada, processamen- toe saida. ‘A Légica Formal, que também é conhecida como Légica Simbé' foca a estrutura do raciocinio, trabalhando assim com a relac¢do entre con- ceitos, ¢ fornece um meio de compor provas de declaracées. Na Légica Formal, os conceitos so rigorosamente definidos, e as ora- Ges sao transformadas em notacées simbdlicas precisas, compactas € nio ambiguas. Lembra-se da definicao de algoritmo de Knuth? Se nao lembra, volte ¢ leia novamente, ‘Tomando como convencao, a definicao de proposigdes geralmente ¢ fei- ta utilizando as letras minusculas p, q e r, em fonte itlica. Um exemplo poderia ser: pil+2=3 |. Aldgica eos algoritmos = 9 seven A declaracao anterior define que p representa 1 + 2 = 3 e que isso é ver- dadeiro. Duas ou mais proposigées podem ser combinadas por meio dos cha- mados operadores légicos bindrios, formando conjungées, disjuncdes ou condicionais. Essas proposigées combinadas sio chamadas proposigdes compostas. Por exemplo: pii+i xm 244 qi per Neste caso, e é uma conjuncao. As duas proposicées (p e r), como so verdadeiras, produzem uma proposigao q, também verdadeira. Mais a frente, no capitulo 3, retornaremos a essa definigao da légica for- mal ou ldgica simbélica para definirmos mais detalhadamente os operado- res logico-matematicos. Como vocé pode ter percebido, a légica formal ou simbélica fornece os principios para formalizagao do processo de construgao dos algoritmos. Mas como podemos utilizar todas essas definigdes para construir algo- ritmos apropriadamente? Voltando ao inicio do capitulo, na ilustracdo em que a jovem cozinhei- ra pergunta sobre o algoritmo ou receita para fazer um determinado pra- to, vocé conseguiria pensar em uma sequéncia de passos para fazer um sanduiche simples, de presunto, queijo ¢ alface? Certamente voce devera utilizar algum tipo de pao. Que tal pao de forma? Cio” ie Se Comece pensando da forma mais simples. Depois coloque o que pensou em uma cordem que todos possam entender e fazer o sanduiche! Existem muitas formas de expressar esse algoritmo ou receita de sandui- che, Uma possivel solugao poderia ser a seguinte: Pegue duas fatias de pao e coloque-as separadamente sobre © prato. Coloque duas fatias de queijo sobre uma das fatias de pao. 10 Algoritmos € programaco de computadores ELSEVIER Coloque uma fatia de presunto sobre as fatias de queijo. Coloque duas folhas de alface sobre a fatia de presunto. Acrescente uma pitada de sal e um fio de azeite. Coloque a fatia de p&o vazia sobre as alfaces. Seu sanduiche esta pronto! Conceito Esse tipo de algoritmo € conhecido como “algoritmo nao computacional’, pois do teriamos como implementé-lo em um computador de forma real. Para melhor entender: as entradas sio fatia de pao, queijo, presunto etc, A saida, o sanduiche pronto. Nao seria possivel que as entradas fossem inseridas no computador para que © algoritmo funcionasse e montasse o sanduiche. Pelo menos nos computadores que conhecemos atualmente. Notem que essa é uma das possiveis solucées para o problema. Existem outras formas de resolver e de informar as etapas. Mas note que cada uma das. etapas é dependente das etapas que foram realizadas anteriormente. Primeiro devo pegar o pio para depois colocar 0 queijo sobre a fatia de pao. E isso que chamamos de organizagao ou sequéncia légica. Além dessa relagao de dependéncia, uma coisa se encaixa logicamente ou racionalmen- te na outra. Por exemplo: nao tem ldgica alguma acrescentar uma pitada de sal € 0 fio de azeite no prato para depois colocar 0 queijo e sobre ele as duas fatias de pio, e por fim o presunto e a alface. O sanduiche iria ficar bem esquisito e dificil de ser segurado, nao é mesmo? No momento pratico existem mais alguns exemplos de algoritmos do nosso cotidiano, Tente resolvé-los, As respostas estao no site do livro. Agora vamos partir para problemas que exigem um pouco mais de raciocinio légico-matematico. Algoritmos que envolvem a resolugéo de problemas matematicos ou que requeiram conhecimentos de conceitos matemiaticos para serem resolvidos. Note que aqui s6 iremos apresentar dois exemplos de algoritmos matematicos. Esse tema sera visto com mais profundidade no Capitulo 2, que trata especificamente das metodologias de resolucao de problemas. Usando os conceitos observados de Légica Formal ou Simbélica, descar- tando a utilizagao dos identificadores das preposicdes p, q er, mas manten- |. Aldgica os algoritmos I seven doa necessidade de cada linha identificar uma preposicao, vamos construir uma sequéncia de passos para somar dois niimeros inteiros. Observe que quando vamos somar dois nimeros, primeiro precisamos receber ou saber quais nimeros devemos somar. Depois que somamos os nimeros € preciso que o resultado se torne visivel para quem for utilizar 0 algoritmo que soma os dois numeros. Dizemos que os ntimeros que serao somados sao as ENTRADAS e o resultado da soma é a SAIDA do algoritmo. Como faremos a soma de dois ntimeros, e que para cada caso esses mi- meros podem variar, vamos utilizar um conceito matemitico de varidvel. Mais a frente vamos identificar com mais preciso o que é uma varidvel em um algoritmo ou em uma linguagem comercial de programacao. Nesse momento, vamos utilizar uma varidvel como sendo uma letra, escrita em letra mimiiscula, que identificaré um possivel valor. De forma textual, teremos que dar entrada em dois valores (xe y), soma- los, € o resultado dessa soma ser colocado em uma terceira variavel (s). O valor contido nessa varidvel (s) sera mostrado como saida, De forma bem simplificada, 0 algoritmo para somar dois ntimeros po- deria ser expresso da seguinte forma: aur x arr © Essa forma resolve o problema parcialmente, pois ele realmente soma dois niimeros inteiros; entretanto, quando atribuimos um valor especifico para x (5) ¢ outro para y (4), deixamos de ter valores varidveis ¢ temos agora valores constantes. Assim, para ilustrar como esse algoritmo poderia ser melhorado, vamos utilizar duas instrugGes (comandos) que indicam que um valor deve ser in- serido em uma dada varidvel (instrugao LEIA) ou o valor contido em uma determinada variavel deve ser mostrado (instrugao ESCREVA). 12 —_Algoritmos € programacao de computadores, ELSEVIER Nao se preacupe com as instrugdes LEIA e ESCREVA. Elas serao amplamente explicitadas nos capitulos seguintes. Apenas observe que LEIA(X) indicaré que um valor ser colocado em X (sera armazenado em X) e que 0 comando ESCREVA(X) fara com que o valor contido na varidvel X seja exibido. Assim, 0 nosso algoritmo que soma dois ntimeros ficaria da seguinte forma: LEIA (X) LEIA(Y) So kay ESCREVA (S) Conceito Esse tipo de algoritmo € conhecide como ‘algoritmo computacional’, pois ele € passivel de implementacao real em um computador. Agora vamos trabalhar com mais um problema. Vamos descrever um algoritmo que recebe dois ntimeros inteiros ¢ re- torna como saida o maior deles. De forma textual, teremos que dar entrada em dois valores (x e y) e de- pois compara-los, Se x for maior que y, devemos mostrar x, caso contrario, devemos mostrar y. De forma bem simplificada, 0 algoritmo para encontrar 0 maior de dois ntimeros poderia ser expresso da seguinte forma: LEIA (X) LEIA(Y) SE (X > Y) ENTAO ESCREVA (X) SENAO ESCREVA(Y) a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book a You have elther reached a page that is unavailable for viewing or reached your viewing lil far this book

Vous aimerez peut-être aussi