conceitos e exercícios de programação

Upload: roberto-passos

Post on 04-Apr-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/31/2019 Conceitos e exerccios de Programao

    1/221

    Conceitos eExerccios deProgramaoUtilizando Linguagem C

    Jos Coelho2010

    Este texto destina-se a todos quanto se queiram iniciar na programao, desde as mais modestas s mais

    elevadas ambies. O mtodo de aprendizagem consiste em explicar um conjunto de conceitos, suportados em

    exemplos simples, aps o qual o leitor ter ao seu dispor um leque de exerccios desde simples a mais avanados,

    que lhe permitam interiorizar os conceitos com base na sua experincia de programao.

  • 7/31/2019 Conceitos e exerccios de Programao

    2/221

    PREFCIOO presente texto destina-se a todos quantos queiram iniciar-se na programao. A linguagem deprogramao adoptada a linguagem C, mas este texto no se centra na linguagem de programaomas sim nos conceitos, sendo a linguagem de programao apenas uma ferramenta para o ensinoda programao.

    Este texto tem origem num conjunto de explicaes fornecidas no mbito da Unidade Curricular(UC) de Programao da Universidade Aberta, de forma a responder s dificuldades sentidas pelosestudantes. As explicaes foram organizadas em conceitos essenciais, que so introduzidos comuma necessidade que os conceitos introduzidos anteriormente no satisfazem, e constitudos poruma explicao do conceito, seguida de um ou mais exemplos. Os exemplos so to simples quantopossvel, de forma a ser clara a aplicao do conceito. A compreenso completa dos exemplos passapor analisar a execuo passo a passo de forma a remover qualquer dvida que o leitor tenha sobrea forma como executado o exemplo que exemplifica o conceito em causa, e desta forma facilmenteinteriorizar os conceitos essenciais. Cada conceito termina com um conjunto de erros comuns maisdirectamente ligados ao conceito, e respectivos exemplos, para que ao serem compreendidos nosejam cometidos. No anexo est a lista completa de erros comuns.

    A estes conceitos juntou-se o pacote de actividades formativas a realizar na UC, aqui chamados deexerccios, de nvel de dificuldade desde o mais simples (exerccios verdes), ao mais desafiante(exerccios vermelhos), passando pela dificuldade mdia (exerccios azuis). Foi tido o maiorcuidado na escolha dos exerccios, de forma a pedir apenas exerccios no abstractos, que possamser reutilizados, e inspirados em matrias mais avanadas a abordar em outras UCs, para assimtirar o maior partido possvel do trabalho do leitor. Aos enunciados dos exerccios foi dada a maiorateno, tendo sido j utilizados e revistos com o decorrer da UC, para que o leitor no sinta que aprincipal dificuldade compreender o enunciado do exerccio mas sim na sua realizao. No anexoencontram-se mais dicas sobre os exerccios, uma forma de verificar se o exerccio est correctosem ver uma resoluo, e as resolues dos exerccios para comparao, aps resolv-los.

    Os conceitos foram organizados primeiramente em pginas isoladas, e posteriormente ordenadaspor ordem de importncia, o mais importante primeiro. Os conceitos passaram a captulos nestetexto, que esto agrupados em trs partes, a que correspondem os mdulos na UC, e em que sopontos apropriados para uma paragem mais longa no estudo, ou para a realizao de actividades deavaliao. Os exerccios esto associados s partes, e no aos captulos.

    A metodologia de estudo proposta assenta no princpio que programar aprende-se programando,pelo que no se apresentam captulos com muitos exerccios resolvidos, mas apenas os conceitosessenciais para que o leitor possa resolver por si os exerccios e adquirir a experincia deprogramao que apenas sua e intransmissvel. Se o leitor tiver aspiraes modestas e disponhade pouco tempo, deve no final de cada parte fazer apenas os exerccios verdes. Caso no consiga

    realizar algum exerccio, deve reler os captulos anteriores. Aconselha-se a planear um estudoregular, cada sesso de estudo com 1 a 2 horas, e uma periodicidade entre 1 dia a 1 semana. Nodeve ler mais que um captulo na mesma sesso de estudo, e deve fazer os exerccios em sessesdistintas da leitura dos captulos. Caso o leitor tenha aspiraes mais elevadas e disponha de maistempo, deve fazer tudo o que atrs se aconselhou, mais a realizao dos exerccios azuis evermelhos.

    Se o leitor tiver oportunidade de estudar em grupo, aconselha-se a que aplique em estudo isolado ametodologia atrs referida, e partilhe ideias e exerccios aps os resolver, comentando as opes

  • 7/31/2019 Conceitos e exerccios de Programao

    3/221

    tomadas. O estudo deve estar sincronizado para poder haver alguma vantagem na troca de ideiasaps a leitura de cada captulo e anlise dos exerccios realizados. No deve no entanto cair no errode aguardar pela resoluo dos exerccios, ou pelas explicaes do colega sobre uma parte do texto.Ningum pode aprender por outra pessoa. Deve tirar partido de haver outras pessoas a estudar omesmo assunto, e no prescindir de aprender.

    A escolha da linguagem de programao C deve-se a essencialmente dois motivos. Primeiro trata-sede uma linguagem estruturada imperativa, que se considera ideal para aprender a programar.Numa linguagem orientada por objectos tem que se de utilizar muitas caixas pretas, e dificilmentese consegue explicar alguns conceitos que apenas fazem sentido em programas de maior dimenso,algo que no deve ser prioridade de quem se inicia na programao. As linguagens funcionais edeclarativas, atendendo a que pertencem a paradigmas computacionais alternativos, emborapossveis na iniciao programao, no se consideram apropriadas uma vez que os ganhosseriam muito limitados devido s suas fracas utilizaes reais. Segundo, a linguagem C umalinguagem de alto nvel, bastante antiga, amplamente divulgada e em utilizao, implementada edisponvel em praticamente todas as plataformas. Com a sua simplicidade permite compiladoresque tirem o melhor partido da mquina, resultando normalmente em binrios mais eficientes que

    em outras linguagens. Todos os conceitos aqui introduzidos sero teis no s em outraslinguagens estruturadas, como na programao orientada por objectos.

  • 7/31/2019 Conceitos e exerccios de Programao

    4/221

  • 7/31/2019 Conceitos e exerccios de Programao

    5/221

    18. Exerccios: Dicas, Respostas e Resolues ............................................................................................ 176

  • 7/31/2019 Conceitos e exerccios de Programao

    6/221

    PAR TE I V AR I V E I S E E S TR UTUR AS

    D E CON TR OLONa Parte I so introduzidos os primeiros conceitos de programao, existentes em todas aslinguagens de programao modernas. A leitura atenta e pausada essencial para a compreensodestes conceitos que embora aparentemente simples, a sua no compreenso tem consequnciasem todo o resto do texto, mas que poder detectar de imediato no final da Parte I ao no conseguirresolver alguns dos exerccios propostos. Aps a realizao desta parte, fica com as bases paraprogramar em qualquer linguagem de programao simples, para implementao de pequenasfuncionalidades, como Javascript para adicionar dinamismo a uma pgina Web, VBA paraprogramar macros no Microsoft Excel, ou Linguagem R para realizar clculos estatsticos.

  • 7/31/2019 Conceitos e exerccios de Programao

    7/221

    1. Primeiro Programa 7

    1.PRIMEIRO PROGRAMAUm programa uma sequncia de instrues, dirigidas a um computador, para que este executeuma determinada funo pretendida.

    A actividade de programar consiste na elaborao dessa sequncia de instrues numadeterminada linguagem de programao, que satisfaz o que pretendido.

    A linguagem de programao tem que seguir uma sintaxe rgida, de forma a poder ser convertidaem instrues que o computador possa compreender, mas por outro lado deve ser facilmenteescrita e lida por uma pessoa.

    H diferentes linguagens de programao, utilizaremos a linguagem C, no entanto no ser asintaxe da linguagem o mais relevante a aprender, mas sim competncias que so independentes dalinguagem.

    A linguagem C uma linguagem imperativa, cada instruo uma ordem para o computador.

    Existem outros paradigmas de programao, mas fora do mbito deste texto.

    Manda a tradio que o primeiro programa a desenvolver numa linguagem, seja o ol mundo. Noa vamos quebrar, este o programa mais curto possvel, apenas escreve um texto e termina.

    1#include23int main()4 {5 printf("Ola Mundo!");6 }

    Programa 1-1 Ol Mundo

    O programa acima est escrito em linguagem C, e pode ser executado pelo computador. No entanto

    o computador no entende directamente a linguagem C, apenas ficheiros executveis (noWindows com extenso exe). No entanto, atravs de um programa chamado de Compilador,podemos converter o cdigo C acima num executvel. Esse executvel contm j instrues emcdigo mquina, cujo computador pode executar.

    Vamos ver em que consiste o cdigo acima:

    Existe numerao das linhas e cores, que so apenas para nossa convenincia. Anumerao das linhas no faz parte do ficheiro C, e as cores so colocadas pelo editor. Umprograma em C um ficheiro de texto plano, com a extenso .c e pode ser editado numeditor de texto plano como o Notepad, sem qualquer cor ou numerao das linhas.

    Linha 1: comea por um # (cardinal), pelo que esta linha uma instruo no para ocomputador mas sim para o compilador. Essas instrues chamam-se de comandos de pr-processamento, dado que so executadas antes do processamento.

    O comando #include#include#include#include instrui o compilador a incluir o ficheiro indicado de seguida. Esseficheiro uma biblioteca standard do C (existe em todos os compiladores de C), stdio.h, econsiste na declarao de funes de entrada e sada. Estas funes podem ser utilizadas deseguida no programa, sendo utilizada neste caso a funo printf.

    Linha 2: esta linha no tem nada. Podem existir quantas linhas em branco o programadorquiser, o compilador no ficar atrapalhado, nem far nada com elas, mas tal pode ser til

  • 7/31/2019 Conceitos e exerccios de Programao

    8/221

    8 Parte I Variveis e Estruturas de Controlo

    para espaar os comandos e tornar mais legvel o programa. O mesmo vlido para osespaos ou tabs numa linha de cdigo, como por exemplo os espaos da linha 5 queantecedem o printf.

    Linha 3: comea a implementao da funo main. O programa comea sempre na funomain. Para j, vamos deixar por explicar o int, e os parnteses vazios. Realar que as

    instrues que dizem respeito funomain

    , e portanto ao que o programa tem de fazer,esto limitadas por duas chavetas a abrir na linha 4 e a fechar na linha 6. Todas asinstrues entre estas chavetas, pertencem funomain.

    Linha 5: nesta linha est a nica instruo. Existe uma chamada funo printf, esabemos que uma funo porque aps o seu nome tem uns parnteses a abrir. Dentro dosparnteses colocam-se os argumentos a passar funo. Neste caso colocamos o texto quequeremos imprimir: "Ola mundo!". O texto coloca-se entre aspas, para no se confundir cominstrues.

    Se no o fez j, crie e execute o programa acima. Veja as instrues para instalar um compilador noanexo Compilador e Editor de C.

    tudo. Acabou de dar o primeiro passo no mundo da programao, editou e compilou o primeiroprograma. Houve conceitos referidos aqui que no compreende agora completamente: biblioteca;funo; argumentos. Para j no lhes d muito importncia.

  • 7/31/2019 Conceitos e exerccios de Programao

    9/221

    2. Variveis 9

    2.VARIVEISUma varivel num programa uma entidade que tem um valor a cada instante, podendo esse valorao longo do programa ser utilizado e/ou alterado.

    nas variveis que se guarda a informao necessria para realizar a funo pretendida peloprograma. Podem existir quantas variveis forem necessrias, mas cada uma utiliza memria docomputador.

    O programa seguinte tem por objectivo trocar o valor de duas variveis:

    1#include23int main()4 {5 /* declarao de trs variveis inteiras */6 int x=3;7 int y=7;8 int aux;

    910 /* trocar o valor de x com y */11 aux=x;12 x=y;13 y=aux;1415 /* mostrar os valores em x e em y */16 printf("x: %d, y: %d",x,y);17 }

    Programa 2-1 Troca o valor de duas variveis

    Comentrios:

    Este programa tem uma estrutura inicial idntica ao Programa 1-1, nomeadamente naslinhas 1 a 4, e linha 17.

    A linha 5, 10 e 15 tm comentrios ao cdigo. Os comentrios so todo o texto entre /* e*/, sendo ignorados pelo compilador. O objectivo que seja possvel ao programadorcolocar texto explicativo de partes mais complexas do programa, no para que o compiladoro melhor entenda, mas para que um outro programador que leia o cdigo, ou o prprioprogramador mais tarde, compreenda mais facilmente o cdigo. Os comentrios ficam a corverde, dado que o editor identifica que o contedo dessas linhas ser ignorado pelocompilador1.

    Nas linhas 6 a 8, esto declaradas as variveisx, y e aux. As variveis x e y so no scriadas, como tambm inicializadas. Ao ficarem com um valor inicial, podem desde j serutilizadas. Na linguagem C, todas as variveis utilizadas tm de ser declaradas no incio dafuno2.

    Nas linhas 11 a 13, esto comandos que so atribuies. Numa atribuio, coloca-seuma varivel do lado esquerdo da igualdade, e uma expresso do lado direito. Nestecaso, todas as atribuies tm expresses com uma s varivel.

    1 A linguagem C++ tem os comentrios at ao final da linha, aps duas barras: //. A maior parte doscompiladores de C tambm permite este tipo de comentrios.2 A linguagem C++ bem como a generalidade dos compiladores de C permitem a declarao fora do incio dasfunes, mas pelos motivos referidos no erro Declarao de variveis fora do incio das funes, do anexoErros Comuns esta restrio ser mantida.

  • 7/31/2019 Conceitos e exerccios de Programao

    10/221

    10 Parte I Variveis e Estruturas de Controlo

    Na linha 16, mostrado o valor das variveis. Notar que a funo printf tem 3 argumentosseparados por vrgulas. O primeiro uma string, em que comea com aspas e acaba nasaspas seguintes, o segundo uma expresso com a varivel x, seguido de uma expressocom a varivel y. Na string existem dois %d. Em cada %do printf em vez de mostrar noecr %d coloca o valor da varivel seguinte na sua lista de argumentos. No primeiro %d vai

    colocarx

    , e no segundo%d

    vai colocar oy

    . Notar que cada instruo acaba com um ponto e vrgula, sendo esta uma caracterstica do C.Execuo do programa:

    C:\>trocatrocatrocatrocax: 7, y: 3

    Os valores esto correctamente trocados, mas vamos vercom mais detalhe qual o valor das variveis a cadamomento, na execuo passo-a-passo, direita.

    A execuo passo-a-passo tem em cada linha da tabela um

    passo. Em cada passo indicada a linha de cdigocorrespondente, e a respectiva instruo por vezesencurtada como no passo 7. A coluna resultado mostra oresultado da instruo, excepto se tratar de uma declarao, em que uma ou mais variveis ocupama coluna seguinte disponvel, ou uma atribuio, em que a respectiva varivel fica com o valoratribudo. Para poder-se escrever a linha de um determinado passo, suficiente a informao dalinha do passo anterior.

    A pergunta "Qual o valor de x?" no tem muito sentido, a no ser que se identifique o instante. Nopasso 3 ou no final do programa? Uma varivel tem um valor at que lhe seja atribudo outro.

    Vamos agora resolver o mesmo problema, troca dos valores de duas variveis, mas sem utilizar

    uma varivel auxiliar:

    1#include23int main()4 {5 /* declarao de duas variveis inteiras */6 int x=3, y=7;78 /* trocar o valor de x com y */9 x=x+y;

    10 y=x-y;11 x=x-y;1213 /* mostrar os valores em x e em y */14 printf("x: %d, y: %d",x,y);15 }

    Programa 2-2 Troca o valor de duas variveis sem varivel auxiliar

    A diferena para o exemplo anterior que no sedeclarou uma varivel aux, e declarou-se ambas asvariveis x e y num s comando. As atribuiesutilizam agora expresses com duas variveis,incluindo a prpria varivel que est a ser atribuda.

  • 7/31/2019 Conceitos e exerccios de Programao

    11/221

    2. Variveis 11

    Embora este programa parea confuso, o certo que tem a mesma funcionalidade que o anteriorcomo se comprova de seguida, vendo a execuo passo-a-passo. No passo 2, o valor de x utilizadona expresso o que existia antes do passo 2, o valor 3, passando a ser o valor 10 aps a execuodo passo 2. No h qualquer problema em colocar a varivel x de um lado e do outro de umaatribuio. A varivel x esquerda, significa que ficar com o resultado da expresso, e a varivel x direita, significa que se deve utilizar o valor da varivel x antes desta instruo.

    Os tipos de dados utilizados podem no ser apenas variveis inteiras. Os tipos elementares dalinguagem C so os seguintes:

    charcharcharchar - um carcter, ou um inteiro muito pequeno (guarda apenas 256 valores distintos) shortshortshortshort - inteiro pequeno (pouco utilizado) intintintint - tipo standard para inteiros longlonglonglong - inteiro longo floatfloatfloatfloat - nmero real (pode ter casas decimais) doubledoubledoubledouble - nmero real com preciso dupla (igual ao floatmas com mais preciso)

    Pode-se nos tipos inteiros (char a long), anteceder com as palavras unsigned ou signed, paraindicar que o nmero inteiro tem ou no sinal. Se omitir, considerado que tm sinal. Pode-setambm considerar o tipo long longlong longlong longlong long para um inteiro muito longo3, ou o long doublelong doublelong doublelong double, mas essestipos nem sempre esto implementados.

    Quais os valores mximos/mnimos que podemos atribuir s variveis de cada tipo? Isso dependedo espao reservado para cada tipo de varivel, que por sua vez depende tanto do compilador,como do computador em que o programa for compilado e executado. Para saber quanto espao necessrio para guardar cada varivel, pode-se utilizar o operador sizeofsizeofsizeofsizeof. O resultadode sizeof(int) retorna o nmero de bytes que uma varivel do tipo inteiro ocupa na memria.

    1#include2

    3int main()4 {5 printf("sizeof(int): %d",sizeof(int));6 }

    Programa 2-3 Imprime o nmero de bytes que um inteiro ocupa

    Execuo do programa:

    C:\>sizeofintsizeofintsizeofintsizeofintsizeof(int): 4

    Execute este programa para ver quantos bytes ocupa um inteiro no seu compilador e computador.Para que os resultados sejam idnticos na resoluo dos exerccios, importante que todos utilizeminteiros do mesmo tamanho. Se o resultado no for no seu caso 4, experimente o sizeof(short)

    ou sizeof(long), e utilize o tipo que tiver tamanho 4 para todas as variveis inteiras nosexerccios das actividades formativas.

    As variveis do tipo char e float/double, no utilizam a mesma string de formatao no printfda que os inteiros. Para os inteiros, utiliza-se o %d na string do primeiro argumento, mas esse

    3 O tipo long long no faz parte da norma inicial da linguagem C, actualmente a generalidade doscompiladores implementa-o com um inteiro de 64 bits. A string de formatao varia: %I64d; %lld. Para umasoluo mais portvel, ver inttypes.h e utilizar PRId64.

  • 7/31/2019 Conceitos e exerccios de Programao

    12/221

    12 Parte I Variveis e Estruturas de Controlo

    cdigo significa que se pretende colocar l um valor inteiro. Se pretendermos colocar um carcterou um valor real, tem que se utilizar o %c%c%c%c (carcter) ou %f%f%f%f (float), ou ainda %g%g%g%g (para mostrar o realna notao cientfica). Note-se no entanto que o carcter tanto pode ser considerado como umcarcter ou como com um inteiro pequeno.

    1#include

    23int main()4 {5 char c='a';6 float x=12354234.2346;7 double y=12354234.2346;89 /* mostrar valores */

    10 printf("c: %c (%d), x: %f, y: %g", c, c, x, y);11 }

    Programa 2-4 Imprime diferentes tipos de variveis

    Comentrios:

    O carcter cccc atribudo com a letra "aaaa". Os caracteres so delimitados entre plicas, emvez de aspas, para no se confundirem com outros identificadores.

    O printf tem ordem para:o No %c ir buscar a primeira varivel e colocar um carcter (a varivel c)o No %d ir buscar a segunda varivel (c novamente), e colocar o seu valor numricoo No %f ir buscar a terceira varivel (x), e coloca o nmero real com parte decimalo No %g ir buscar a quarta varivel (y), e coloca o nmero real em notao cientfica

    Execuo do programa:

    C:\>charfloatcharfloatcharfloatcharfloatc: a (97), x: 12354234.000000, y: 1.23542e+007

    Note que o valor numrico da letra 'a' o 97. Existe uma correspondncia entre as letras e os

    nmeros pequenos, mas esta questo ser tratada mais frente.

    O valor de x no o que est no programa. Isto acontece porque o tipo float tem uma preciso nomuito grande (ocupa 4 bytes). O tipo double tem uma preciso maior, mas em qualquer caso nose pode contar com a preciso infinita do valor l colocado. Uma varivel real fica sempre com ovalor mais prximo que a representao interna do nmero permite, e no com o valor exacto.

    A funo scanfscanfscanfscanf a funo inversa ao printf, e serve para introduzir valores em variveis,valores introduzidos pelo utilizador, em vez de os mostrar como no printf.

    1#include23int main()

    4 {5 char c;6 int x;7 double d;89 printf("Introduza um caracter: ");

    10 scanf("%c", &c);11 printf("Introduza um inteiro: ");12 scanf("%d", &x);13 printf("Introduza um real: ");14 scanf("%lf", &d);15

  • 7/31/2019 Conceitos e exerccios de Programao

    13/221

    2. Variveis 13

    16 printf("Valores introduzidos: %c %d %f",c,x,d);17 }

    Programa 2-5 Pede valores de variveis de diferentes tipos que depois imprime

    No cdigo acima pode-se ver parecenas do scanf com o printf, mas h um &&&& antes de cadavarivel. Porqu? Esta questo apenas pode ser respondida completamente na Parte III, por agora

    explica-se apenas que se destina a poder fazer uma atribuio e no uma leitura s variveis.Notar que foi utilizado para ler o valor para double, %lf, e no %f, dado que o real um double, eno um float. Pela mesma razo que deve utilizar inteiros de 4 bytes, deve utilizar para osnmeros reais o tipo double.

    Execuo do programa:

    C:\>scanfscanfscanfscanfIntroduza um caracter: ccccIntroduza um inteiro: 123123123123Introduza um real: 142323.2435142323.2435142323.2435142323.2435Valores introduzidos: c 123 142323.243500

    Na execuo do programa o texto introduzido pelo utilizador vem a bold e itlico. Como o

    programa mostra o contedo das variveis que leu na ltima linha, est verificado que as variveisforam lidas correctamente.

    Consegue agora criar variveis dos tipos bsicos na linguagem C, ler e mostrar os valores dasvariveis, efectuar atribuies e se necessrio fazer uma execuo detalhada e ver o valor dasvariveis em cada instante.

    No anexo est listado um conjunto de erros comuns para o ajudar a melhorar a qualidade do seucdigo. No entanto, muitos dos erros s os compreender aps o estudo da matriacorrespondente, e outros apenas quando lhe for apontado no seu cdigo uma ocorrncia do erro.No final de cada captulo so introduzidos os erros comuns, que esto mais directamenterelacionados com o captulo. Neste captulo temos quatro erros:

    o Declaraes ou atribuies a variveis nunca utilizadaso Forma:Por vezes declaram-se variveis, ou fazem-se atribuies a variveis, um

    pouco para ver se o programa passa a funcionar. No entanto, aps muito corte ecostura, por vezes ficam atribuies a variveis que na verdade nunca so utilizadas,embora tal no afecte o bom funcionamento do programa.

    o Problema: Se h uma varivel declarada que no utilizada, essa varivel pode serremovida e o cdigo fica igual. Se h uma atribuio a uma varivel que depois no utilizada em nenhuma expresso, ento a atribuio desnecessria. Ter variveis,expresses, atribuies a mais, uma situao indesejvel, dado que compromete aleitura do cdigo que realmente funciona.

    o Resoluo:Verificar se h variveis declaradas que no so utilizadas, e apag-las.Para cada atribuio, seguir o fluxo do cdigo at uma possvel utilizao. Se noexistir, apagar a atribuio, reinicializando o processo de verificao. No final ocdigo real poder ser muito mais reduzido, do que o gerado em situaes de stressem modo de tentativa/erro.

    Uma atribuio, uma leitura

  • 7/31/2019 Conceitos e exerccios de Programao

    14/221

    14 Parte I Variveis e Estruturas de Controlo

    o Forma:Uma varivel atribuda com um valor, para depois utiliz-lo na instruoseguinte, no sendo mais necessrio o valor da varivel. Por exemplo, para reunir osvalores necessrios chamada de uma funo.

    o Problema:Esta situao pode indicar a existncia de uma varivel desnecessria, equantas mais variveis desnecessrias o cdigo tiver, mais complexo fica, para nofalar que ocupam memria desnecessariamente. apenas justificvel no caso de aexpresso ser muito complexa, de forma a clarificar o cdigo.

    o Resoluo: Ao fazer a atribuio do valor varivel, utiliza uma expresso. Essavarivel depois utilizada de seguida tambm uma s vez, pelo que mais valecolocar a prpria expresso no local onde a varivel utilizada.

    Variveis desnecessriaso Forma:Ao criar uma varivel por cada necessidade de registo de valores, pode

    acontecer haver variveis sempre com o mesmo valor, mas tal no impede que oprograma funcione correctamente.

    o Problema: Ter muitas variveis com a mesma funo tem o mesmo problema queuma atribuio, uma leitura. Fica o cdigo mais complexo e difcil de ler semqualquer ganho. Pode acontecer que este problema se reflicta no apenas por ter

    duas variveis sempre com os mesmos valores, mas terem valores com uma relaosimples (o simtrico, por exemplo).

    o Resoluo: Deve identificar as variveis com atribuies e utilizaes perto uma daoutra, eventualmente os nomes, e verificar se pode a cada momento utilizar o valorde uma varivel em vez da outra. Por vezes no simples a identificao/remoodestas situaes quando h muitas variveis. prefervel aplicar primeiramente aremoo de declaraes/atribuies desnecessrias, e aplicar a resoluo do errouma atribuio, uma leitura, antes deste erro.

    Comentrios explicam a linguagem Co Forma:De forma a explicar tudo o que se passa no programa, e no ser penalizado,

    por vezes desce-se to baixo que se explica inclusive linguagem C.

    o Problema:Esta situao um claro excesso de comentrios, que prejudica alegibilidade. Quem l cdigo C sabe escrever cdigo C, pelo que qualquer comentriodo tipo atribuir o valor X varivel Y, desrespeitoso para quem l, fazendoapenas perder tempo. Ao comentar instrues da linguagem e deixar de foracomentrios mais relevantes, pode indicar que o cdigo foi reformulado por quemna verdade no sabe o que este realmente faz.

    o Resoluo:Escreva como se estivesse a escrever a si prprio, supondo que no selembrava de nada daqui a uns 6 meses.

    No Programa 2-4 podemos ver uma ocorrncia do erro uma atribuio, uma leitura, dado quetodas as variveis so atribudas na declarao e utilizadas uma s vez. Neste caso pretende-semostrar a string de formatao para os diversos tipos, mas poder-se-ia igualmente ter colocado osprprios valores no printf. O mesmo programa tem ainda uma ocorrncia do erro comentriosexplicam a linguagem C, e este erro ser cometido ao longo dos programas apresentados nestetexto, dado que o cdigo se destina a quem est a aprender, mas num programa C no faz sentidocolocar um comentrio mostrar valores antes do printf.

    No h ocorrncias dos outros dois erros nos programas deste captulo, e a sua exemplificao seriaforada. A melhor fonte de exemplos tem de ser o seu cdigo, aps resolver os exerccios, procureidentificar ocorrncias desses erros.

  • 7/31/2019 Conceitos e exerccios de Programao

    15/221

    2. Variveis 15

    O conceito de varivel, aparentemente simples, no no entanto to facilmente interiorizado comopossa pensar. Saber no primeiro exerccio que seja necessria uma varivel auxiliar no declaradano enunciado, se consegue ou no identificar a varivel e seu modo de utilizao, ou se por outrolado considera o enunciado complexo e confuso.

    Se for o segundo caso, antes de passar para o exerccio seguinte, imperativo que olhe para a

    soluo que acabar por obter, com a sua mxima ateno. A experincia levar a que identifiqueimediatamente as variveis que necessita para resolver cada problema, sendo esta uma dasprincipais caractersticas de um programador experiente.

  • 7/31/2019 Conceitos e exerccios de Programao

    16/221

    16 Parte I Variveis e Estruturas de Controlo

    3.CONDICINAISAs instrues dadas nos programas at aqui so sequenciais, isto , existindo 4 instrues estas vosendo executadas sem sequncia, numa determinada ordem fixa. No entanto, o que fazer se

    pretendermos ter um programa que tenha mais que uma execuo alternativa? Por exemplo,estamos interessados em determinar se um determinado nmero inteiro introduzido peloutilizador, par ou mpar. Como h duas possibilidades para apresentar ao utilizador, tem de existirduas instrues alternativas, uma para o caso do nmero ser par, e outra para o caso de ser mpar.Para alm disso, temos de saber determinar se o nmero par ou mpar.

    A linguagem C permite que um determinado cdigo seja executado dependente do valor de umaexpresso lgica. Se a expresso for verdadeira, executa uma instruo, caso contrrio executa aoutra instruo.

    1#include23int main()

    4 {5 int numero;6 printf("Indique um numero: ");7 scanf("%d",&numero);8 if(numero%2==0)9 printf("par");

    10 else11 printf("impar");12 }

    Programa 3-1 Determina se um nmero par ou impar

    Comentrios:

    Linha 8: a instruo ifififif tem entre parnteses uma expresso lgica. Essa expresso utiliza ooperador lgico == (no confundir com a atribuio), e do lado esquerdo utiliza o operador

    % (resto da diviso). Se o resto da diviso do nmero por 2 for zero, ento a expresso lgica verdadeira e executa a instruo da linha 9

    Linha 10: existe uma instruo elseelseelseelse. Essa instruo est associada ao if, mas o if pode serutilizado sem o else. Se existir indica uma instruo a executar no caso da expresso lgicaser falsa

    Execuo do programa:

    C:\>paridadeparidadeparidadeparidadeIndique um numero: 234234234234parC:\>paridadeparidadeparidadeparidadeIndique um numero: 23232323

    impar

    O resultado foi o pretendido, vejamos agoraa execuo passo-a-passo. Nesta execuo onmero introduzido foi o "234", levando aque o condicional fosse verdadeiro e que nopasso 5 a linha 9 fosse executada.

  • 7/31/2019 Conceitos e exerccios de Programao

    17/221

    3. Condicionais 17

    Na segunda execuo, o valor introduzido foi23, levando a que o condicional fosse falso eque a linha 11 fosse executada no passo 5,em vez da linha 9.

    Podem ser utilizados os operadores lgicos

    normais em expresses lgicas, e os parnteses curvos que forem necessrios:

    A e B so expresses lgicas:o A||B A ou Bo A&&B A e Bo ! A no A

    A e B expresses numricas:o A==B A igual a Bo A!= B A diferente de Bo A>B A maior que Bo A>=B A maior ou igual a Bo A

  • 7/31/2019 Conceitos e exerccios de Programao

    18/221

    18 Parte I Variveis e Estruturas de Controlo

    1#include23int main()4 {5 int ano;6 printf("Indique ano: ");7 scanf("%d", &ano);8

    9 /* teste de ano bissexto */10 if(ano%4==0 && ano%100!=0 || ano%400==0)11 printf("Bissexto");12 else13 printf("Normal");14 }

    Programa 3-2 Determina se um ano normal ou bissexto

    Notar que no foram colocados parnteses para a conjuno. No necessrio dado que temsempre prioridade relativamente disjuno.

    Execuo do programa:

    C:\>bissextobissextobissextobissextoIndique ano: 2345234523452345

    NormalC:\>bissextobissextobissextobissextoIndique ano: 2344234423442344Bissexto

    Na execuo passo-a-passo pode-sever que na expresso lgica do passo4, o segundo argumento do operador&& (AND) no foi avaliado porque oprimeiro argumento j era falso.

    Desta vez o segundo argumento dooperador || (OR) no foi avaliadoporque o primeiro argumento j eraverdadeiro.

    Pode acontecer que seja necessriomais que uma instruo dentro do if, ou que sejam necessrias vrias instrues if encadeadas. o caso do programa seguinte, em que est implementado um algoritmo para determinar o nmerode dias do ms, dado o nmero do ano e ms.

  • 7/31/2019 Conceitos e exerccios de Programao

    19/221

    3. Condicionais 19

    1#include23int main()4 {5 int ano, mes, dias;6 printf("Indique ano: ");7 scanf("%d", &ano);8 printf("Indique mes: ");

    9 scanf("%d", &mes);1011 if(mes==2)12 {13 /* teste de ano bissexto */14 if(ano%400==0 || ano%4==0 && ano%100!=0)15 printf("29");16 else17 printf("28");18 } elseif(mes==1 || mes==3 || mes==5 || mes==7 ||19 mes==8 || mes==10 || mes==12)20 {21 printf("31");22 } else23 {24 printf("30");25 }

    26 }Programa 3-3 Determina o nmero de dias de um ms/ano

    Comentrios:

    O primeiro if testa se o ms 2 (Fevereiro). Neste caso tem que se testar se o ano ou nobissexto de forma a retornar 29 ou 28. Utilizamos o cdigo do exerccio anterior, mas tevede ser colocado dentro do if. Para no haver confuses com o else a que pertence este if,colocou-se o if num bloco (dentro de chavetas).

    Um bloco de cdigo pode ser colocado em qualquer lado em que se coloca um scomando, como o caso do if. Assim possvel executar quantas instrues se quiserutilizando o mesmo condicional.

    Aps se saber que o ms no 2, tem que se testar se um ms de 31 dias, ou se um msde 30 dias. Tem de portanto existir outro if logo a seguir ao else. Embora seja um ifdistinto, est em sequncia do primeiro if e na verdade permite que o programa siga um detrs caminhos possveis (Fevereiro / ms 31 / ms 30), e no apenas 2 como aconteceria seutilizar apenas um s if.

    A expresso lgica para determinar que o ms tem 31 dias longa, pelo que muda de linha.No h problema com isso, mas neste caso foi uma m opo, podendo-se ter testado se oms tinha 30 dias, que so menos meses (4, 6, 9 e 11).

    Execuo do programa:

    C:\>diasdomesdiasdomesdiasdomesdiasdomes

    Indique ano: 2344234423442344Indique mes: 222229C:\>diasdomesdiasdomesdiasdomesdiasdomesIndique ano: 2342234223422342Indique mes: 444430

    Esta execuo tem doiscondicionais encadeados, o passo 7

  • 7/31/2019 Conceitos e exerccios de Programao

    20/221

    20 Parte I Variveis e Estruturas de Controlo

    est um segundo condicional que apenas executado porque no passo 6 o primeiro condicionalretornou verdadeiro. Notar que h uma varivel dias que afinal no necessria. Neste caso nemsequer atribuda, pelo que pode ser apagada do cdigo.

    Na segunda execuo o resultadono passo 6 falso, pelo que a

    execuo segue no passo 7 para umoutro condicional sobre orespectivo else, no confundindo oelse do condicional interior, dadoque est dentro de um bloco decdigo.

    No se pode deixar de referir que as expresses lgicas em C so valores inteiros, ou se quiser, uminteiro o tipo de dados utilizado nas expresses lgicas, em que o valor zero significa o falso, e ovalor no zero significa o verdadeiro. Com este conhecimento pode-se em vez do teste utilizado noprimeiro exemplo:

    8 if(numero%2==0)9 printf("par");

    10 else11 printf("impar");

    Fazer simplesmente:

    8 if(numero%2)9 printf("impar");

    10 else11 printf("par");

    No entanto no se aconselha a fazer utilizao abusiva deste conhecimento, dado que torna maispesada a leitura do cdigo. Cada expresso lgica deve ter pelo menos um operador lgico, deforma a facilitar a leitura do cdigo e identificar a expresso como uma expresso lgica, e no

    confundir com uma expresso numrica, embora em C qualquer expresso numrica umaexpresso lgica.

    Os erros comuns mais directamente associados a este captulo so:

    Indentao4 varivelo Forma: Como a indentao ao gosto do programador, cada qual coloca a

    indentao como lhe d mais jeito ao escrever.o Problema: A leitura fica prejudicada se a indentao no for constante. Por um lado

    no fcil identificar se h ou no algum erro do programador em abrir/fecharchavetas, dado que a indentao pode ser sua opo e no esquecimento deabrir/fechar chavetas. Por outro lado, no possvel a visualizao rpida das

    instrues num determinado nvel, dado que o nvel varivel, sendo necessriopara compreender algo, de analisar o cdigo por completo. Com o cdigo indentado,pode-se ver o correcto funcionamento de um ciclo externo, por exemplo, sem ligarao cdigo interno do ciclo, e assim sucessivamente.

    4 A indentao de uma instruo consiste em anteced-la de um nmero de espaos constante (so utilizados4 espaos neste texto), por cada bloco em que a instruo est inserida

  • 7/31/2019 Conceitos e exerccios de Programao

    21/221

    3. Condicionais 21

    o Resoluo: Indente o cdigo com 2 a 8 espaos, mas com o mesmo valor ao longo detodo o cdigo. Se utilizar tabs, deve indicar o nmero de espaos equivalente, nocabealho do cdigo fonte, caso contrrio considera-se que o cdigo est malindentado. Se pretender subir a indentao com a abertura de uma chaveta, podefaz-lo mas tem de utilizar sempre chavetas, caso contrrio ficam instrues queesto no mesmo nvel mas no cdigo ficam e indentaoes distintas. Qualquer queseja as opes, no pode existir instrues no mesmo alinhamento que pertenam anveis distintos (ou vice-versa). A posio das chavetas indiferente, mas tem que seapresentar um estilo coerente ao longo do cdigo.

    Duas instrues na mesma linhao Forma: Quando as instrues so pequenas e esto relacionadas, mais simples

    coloc-las todas na mesma linha. Como uma questo de estilo, no afecta ofuncionamento.

    o Problema: Se h instrues relacionadas, estas devem ser colocadas na mesmafuno, se tal se justificar. Colocar duas ou mais instrues na mesma linha vaiprejudicar a legibilidade e no s. O compilador quando encontra algum problemarefere a linha do cdigo, e existindo mais que uma instruo nessa linha, a

    informao menos precisa. Deixa de ser possvel tambm seguir um nvel deindentao para passar por todas as instrues nesse nvel, tem que se fazer umaleitura atenta por todo o cdigo do bloco

    o Resoluo: Em todas as linhas com mais que uma instruo, colocar uma instruopor linha

    Linhas de cdigo nunca executadaso Forma: Por vezes em situaes de stress tentam-se vrias alternativas, e fica algum

    cdigo que na verdade nunca tem hiptese de ser executado, mas que tambm noatrapalha.

    o Problema: Se h cdigo a mais, este deve ser removido sobre pena de perda delegibilidade e manuteno. Esta situao ampliada quando h cdigo de diversas

    provenincias, em que ao integr-lo ningum se atreve a reeditar cdigo quefunciona, para seleccionar a parte do cdigo que deve ser integrado.

    o Resoluo: Identificar as zonas de cdigo que de certeza que no so executadas demodo algum, e apag-las. Tanto pode ser feito por inspeco ao cdigo como atravsde testes, submetendo o cdigo a diversos casos de teste, desde que previamente setenha colocado informao de debug em cada bloco de cdigo. Os blocos de cdigoem que no tiver sido produzida nenhuma informao de debug, so provavelmenteos blocos de cdigo que nunca so executados.

  • 7/31/2019 Conceitos e exerccios de Programao

    22/221

    22 Parte I Variveis e Estruturas de Controlo

    1#include23int main()4 {5 int ano, mes, dias;6 printf("Indique ano: "); scanf("%d", &ano);7 printf("Indique mes: "); scanf("%d", &mes);8

    9 if(mes==2)10 if(ano%400==0 || ano%4==0 && ano%100!=0)11 printf("29");12 else13 printf("28");14 elseif(mes==1 || mes==3 || mes==5 || mes==7 ||15 mes==8 || mes==10 || mes==12)16 printf("31");17 elseif(mes!=2)18 printf("30");19 else20 printf("erro");21 }

    O cdigo acima uma rplica do Programa 3-3 com a mesma funcionalidade, no entanto contendoos 3 erros indicados. A indentao na linha 5 a 4 espaos, mas na linha 10 quando o condicionalest debaixo do condicional na linha 9, no sobe a indentao. O leitor nessa situao no sabe se oque aconteceu foi um esquecimento da instruo para o primeiro condicional, ou se o que pretendido realmente um condicional sobre o outro. Os outros dois erros, o printf e o scanfesto na mesma linha, e a linha 20 nunca tem hiptese de ser executada, j que o condicional dalinha 17 sempre verdadeiro, uma vez que complementar do condicional no mesmo nvel na linha9.

    Os condicionais um conceito relativamente simples de interiorizar, muito provavelmente no terdificuldade em identificar a necessidade de execues alternativas. No entanto, na escrita do cdigo muito frequente cometer erros nas expresses lgicas, e ao ler pensa que a expresso tem umefeito quando na realidade tem outro. A utilizao de expresses simples, e bons nomes nasvariveis, o aconselhado para que o cdigo tenha uma boa leitura, e consequentemente tenha

    menos erros.

  • 7/31/2019 Conceitos e exerccios de Programao

    23/221

    4. Ciclos 23

    4.CICLOSUm programa serve para executar um conjunto de instrues. No entanto, com o que aprendemosat agora, cada linha de cdigo executada quanto muito uma vez. Isto limita muito a utilidade de

    programas.Consideremos que se pretende calcular a soma dos primeiros 4 quadrados, no conhecendonenhuma expresso matemtica para obter o valor directamente. O programa seguinte resolveria oproblema:

    1#include23int main()4 {5 int soma=0;6 soma=soma+1*1;7 soma=soma+2*2;8 soma=soma+3*3;9 soma=soma+4*4;

    10 printf("Soma dos primeiros 4 quadrados: %d", soma);11 }

    Programa 4-1 Soma dos primeiros 4 quadrados naturais

    Execuo do programa:

    C:\>somaquadradossomaquadradossomaquadradossomaquadradosSoma dos primeiros 4 quadrados: 30

    Execuo passo-a-passo no apresentanovidades.

    Problemas com este programa:

    o Se pretender obter a soma dosprimeiros 9 quadrados, temos de refazer o programa. sempre mais interessante ter umprograma que pode ser utilizado numa maior gama de situaes, que um programa queserve apenas para uma situao especfica.

    o O cdigo repetido pode at ser facilmente copivel, mas se for necessrio alterar algumpormenor, essa alterao tem de ser reproduzida em todas as cpias realizadas.

    o A varivel soma repetida antes e depois da atribuio. A repetio da mesma entidade oubloco de cdigo "pesa" no s ao editar e corrigir algum ponto, como tambm na leitura.

    o O tamanho do programa cresce se pretender um clculo com um valor maior.Vale a pena ter um programa assim? claro que sim, fazer as contas mo que no. No entanto seno existisse alternativa, um computador teria uma utilidade pouco mais do que se obtm com umacalculadora. A soluo passa por utilizar um ciclo, em que no C o mais simples o ciclo whilewhilewhilewhile. muito parecido com o condicional if, mas ao contrrio do if o cdigo repetido enquanto aexpresso lgica for verdadeira.

  • 7/31/2019 Conceitos e exerccios de Programao

    24/221

    24 Parte I Variveis e Estruturas de Controlo

    1#include23int main()4 {5 int soma=0, i=1;6 while(i

  • 7/31/2019 Conceitos e exerccios de Programao

    25/221

    4. Ciclos 25

    Pretende-se saber o nmero associado aos caracteres de 'a' a 'z'.

    1#include23int main()4 {5 char c='a';6 while(c

  • 7/31/2019 Conceitos e exerccios de Programao

    26/221

    26 Parte I Variveis e Estruturas de Controlo

    1#include23int main()4 {5 int A,B,K,contagem;6 printf("Indique K: ");7 scanf("%d",&K);8 contagem=0;

    9 A=1;10 while(A

  • 7/31/2019 Conceitos e exerccios de Programao

    27/221

    4. Ciclos 27

    como os condicionais, mas quando necessrio um ciclo dentro do outro, oumesmo ainda um terceiro ciclo, acompreenso do cdigo baixa dado que necessrio em cada ciclo considerar osciclos sobre o qual est a correr. Cadaciclo tem uma expresso lgica, que por sis pode ser complexa tal como noscondicionais, mas como tem uma variveliteradora para fazer variar a expressolgica, leva a que deva ser dada a mximaateno nos ciclos.

    Erros comuns mais directamenteassociados a este captulo:

    o Utilizao do gotoo

    Forma: Numa dadainstruo, sabe-se acondio pretendida paravoltar para cima ou saltarpara baixo. suficientecolocar um label no localdesejado, e colocar o goto dentro do condicional. Este tipo de instruo pode sermotivado pelo uso de fluxogramas

    o Problema: Perde-se nada mais nada menos que a estrutura das instrues. Autilizao ou no desta instruo, que define se a linguagem estruturada, ou noestruturada (por exemplo o Assembly). Se de uma linha de cdigo se poder saltarpara qualquer outra linha de cdigo, ao analisar/escrever cada linha de cdigo, temque se considerar no apenas as linhas que a antecedem dentro do bloco actual,como todas as linhas de cdigo, dado que de qualquer parte do programa podehaver um salto para esse local. Para compreender 1 linha de cdigo, necessrioconsiderar todas as instrues no programa. A complexidade do programa nestasituao cresce de forma quadrtica com o nmero de linhas.

    o Resoluo: Utilizar as estruturas de ciclos disponveis, bem como condicionais, efunes5. Se o salto para trs dentro da mesma funo certamente um ciclo o que pretendido, mas se para a frente, provavelmente um condicional. Se um saltopara uma zona muito distante, ento provavelmente uma funo que falta. No casode utilizar fluxogramas, deve considerar primeiro utilizar o seu tempo de arranquevendo execues passo-a-passo de forma a compreender o que realmente um

    programa, sem segredos, e resolver exerccioso Instrues parecidas seguidas

    o Forma: Quando necessrio uma instruo que parecida com a anterior, bastaseleccion-la e fazer uso de uma das principais vantagens dos documentos digitais:copy/paste

    5 O conceito de funo introduzido no captulo seguinte

  • 7/31/2019 Conceitos e exerccios de Programao

    28/221

  • 7/31/2019 Conceitos e exerccios de Programao

    29/221

    1) Exerccios 29

    1)ExercciosNotas gerais a ter em ateno em todos os exerccios:

    Escreva sem acentos; Utilize para as variveis inteiras, o tipo int, confirmando que tem 4 bytes no exerccio

    olamundosizeof.c, caso contrrio utilize o tipo equivalente; Utilize para as variveis reais a preciso dupla, o tipo double; Durante o desenvolvimento do programa, imprima resultados parciais, de forma a garantir

    o que o programa faz, eventualmente comentando esse cdigo na verso final; O separador decimal da linguagem C o ponto final, pelo que ser utilizado nos resultados

    dos exerccios (12.435 correcto, 12,435 incorrecto), mas na introduo dos dados eimpresso dos resultados, poder variar conforme as configuraes no computador;

    Se no consegue resolver um exerccio, pense numa varivel auxiliar que lhe d jeito; Existem dicas adicionais sobre alguns exerccios no anexo Exerccios: Dicas, Respostas e

    Resolues, bem como forma de validar a resposta de um exerccio sem ver uma resoluo,e resolues dos exerccios para comparar aps resolv-los.

    olamundosizeof.c

    Faa um programa que coloque Ol Mundo! em bom portugus (com acentos), e que indique

    o tamanho em bytes (operador sizeof) dos seguintes tipos de dados: char; short; int; long;long long; float; double; long double.

    Notas: Se os caracteres no lhe aparecerem bem na linha de comando, antes de executar o

    programa execute o comando C:\>chcp 1252

    Execuo de exemplo:

    C:\>chcpchcpchcpchcp 1252125212521252Active code page: 1252C:\>olamundosizeofolamundosizeofolamundosizeofolamundosizeof

    Ol Mundo!sizeof(char): xxxxxxxxsizeof(short): xxxxxxxx

    sizeof(int): xxxxxxxxsizeof(long): xxxxxxxxsizeof(long long): xxxxxxxxsizeof(float): xxxxxxxxsizeof(double): xxxxxxxxsizeof(long double): xxxxxxxx

    Pergunta: qual a soma dos tamanhos dos tipos pedidos compilado no tcc?

  • 7/31/2019 Conceitos e exerccios de Programao

    30/221

    30 Parte I Variveis e Estruturas de Controlo

    soma.c

    Somar os primeiros N nmeros inteiros, sendo N definido pelo utilizador:

    =

    N

    ii

    1

    Notas:

    Escreva sem acentos neste e nos restantes exerccios, para que o cdigo funcione semprecorrectamente mesmo sem mudar o cdigo de pgina para 1252.

    Durante o desenvolvimento do programa, imprima resultados parciais, de forma a garantiro que o programa faz, eventualmente comentando esse cdigo na verso final, dado queesse texto poder fazer sentido apenas para o programador e no para o utilizador.

    Execuo de exemplo:

    C:\>somaCalculo da soma dos primeiros N numeros.Indique N:10101010

    adicionar 1, parcial 1adicionar 2, parcial 3adicionar 3, parcial 6adicionar 4, parcial 10adicionar 5, parcial 15adicionar 6, parcial 21adicionar 7, parcial 28adicionar 8, parcial 36adicionar 9, parcial 45adicionar 10, parcial 55

    Total: 55

    Pergunta: qual a soma dos primeiros 21090 nmeros inteiros?

    hms.c

    Faa um programa que leia as horas, minutos e segundos, e calcule o nmero de segundos que

    passaram desde o incio do dia.

    Notas:

    No faa verificao da validade dos parmetros de entradaExecuo de exemplo:

    C:\>hmshmshmshmsCalculo do numero de segundos desde o inicio do dia.Hora: 2222Minuto: 15151515Segundos: 30303030Numero de segundos desde o inicio do dia: 8130

  • 7/31/2019 Conceitos e exerccios de Programao

    31/221

    1) Exerccios 31

    Pergunta: qual a resposta no caso de se colocar a 25 hora, o minuto 100 e o segundo 200?

    produto.c

    Multiplicar os primeiros N nmeros inteiros positivos (factorial de N), sendo N definido pelo

    utilizador:

    =

    =N

    i

    iN1

    !

    Execuo de exemplo:

    C:\>produtoprodutoprodutoprodutoCalculo do produto dos primeiros N numeros.Indique N:5555Factorial(1)=1Factorial(2)=2Factorial(3)=6Factorial(4)=24Factorial(5)=120

    Resultado: 120

    Pergunta: qual o factorial de 12?

    arranjos.c

    Calculo dos arranjos de N, R a R: multiplicar os nmeros de N-R+1 at N:

    ( ) ( ) +==

    =

    N

    RNi iRN

    N

    RNA 1!

    !

    ,

    Notas:

    Ateno que R tem de ser menor que N Os arranjos de 3 elementos {A, B, C}, 2 a 2, so os seguintes 6: (A,B); (A,C); (B,A); (B,C);

    (C,A); (C,B).

    Execuo de exemplo:

    C:\>arranjosarranjosarranjosarranjosCalculo dos arranjos de N, R a R:

    Indique N:5555Indique R:3333i=3; arranjos=3i=4; arranjos=12i=5; arranjos=60

    Resultado: 60

    Pergunta: qual o resultado retornado dos arranjos de 20, 8 a 8?

  • 7/31/2019 Conceitos e exerccios de Programao

    32/221

    32 Parte I Variveis e Estruturas de Controlo

    somadigitos.c

    Calcule a soma dos quadrados dos dgitos de um nmero introduzido pelo utilizador.

    Notas:

    Pode obter o valor do dgito mais baixo, calculando o resto da diviso por 10. Mostre o resultado parcial, neste e nos restantes exerccios.

    Execuo de exemplo:

    C:\>somadigitossomadigitossomadigitossomadigitosCalculo da soma do quadrado dos digitos de um numero:Numero: 1234123412341234n=1234; soma=16n=123; soma=25n=12; soma=29n=1; soma=30

    Resultado: 30

    Pergunta: se o utilizador introduzir o nmero 856734789, qual o resultado do programa?

    fibonacci.c

    Calcular o valor da funo fibonacci6, para um dado argumento N. Para N=1 ou 2, deve

    retornar N, caso contrrio retorna a soma dos dois valores anteriores:

    ( )( ) ( )

    >+

    =

    2,21

    2,

    nnFnF

    nnnF

    Notas:

    Utilize duas variveis auxiliares.Execuo de exemplo:

    C:\>fibonaccifibonaccifibonaccifibonacciCalculo do valor da funcao Fibonacci:Indique N:6666Fib(3)=3Fib(4)=5Fib(5)=8Fib(6)=13

    Resultado: 13

    Pergunta: qual o valor do programa para N=40?

    6 definio da funo Fibonacci no padro

  • 7/31/2019 Conceitos e exerccios de Programao

    33/221

    1) Exerccios 33

    combinacoes.c

    Calcule as combinaes de N, R a R. A frmula idntica dos arranjos, multiplicar de N-R+1

    at N, mas tem de se dividir pelo factorial de R:

    ( )( ) =+=

    =

    =R

    i

    N

    RNi

    iiRRN

    NRNC

    11!!

    !,

    Notas:

    Se efectuar as multiplicaes e s dividir no final, rapidamente ultrapassa o limite dointeiro. Se multiplicar e depois dividir em cada passo, consegue obter valores correctos parauma maior gama de nmeros.

    As combinaes de 3 elementos {A, B, C}, 2 a 2, so as seguintes 3: {A,B}; {A,C}; {B,C}. Notarque relativamente aos arranjos, neste caso a ordem no interessa.

    Execuo de exemplo:

    C:\>combinacoescombinacoescombinacoescombinacoesCalculo das combinacoes de N, R a R:Indique N:5555Indique R:33331*3=3/1=33*4=12/2=66*5=30/3=10

    Resultado: 10

    Pergunta: qual o nmero de combinaes de 26, 13 a 13?

    euler.c

    Calcular o nmero de Euler e , atravs da utilizao da srie de Taylor para xe quando 1=x

    (soma do inverso dos factoriais):

    =

    =K

    n ne

    0 !

    1

    Notas:

    Considere o factorial de zero como sendo 1 Utilize a preciso dupla para valores reais, neste e em outros exerccios Na funo printf pode imprimir um nmero real em notao cientfica, e especificando a

    preciso a 16 dgitos utilizando a string de formatao: %.16g

  • 7/31/2019 Conceitos e exerccios de Programao

    34/221

    34 Parte I Variveis e Estruturas de Controlo

    Execuo de exemplo:

    C:\>eulereulereulereuler0: 11: 2............19: 2.7183

    20: 2.7183Resultado: 2.71828182845xxxxxxxxxxxxxxxx

    Pergunta: qual o valor com preciso 16, em notao cientfica, da execuo da frmula acima comK=20?

    trocos.c

    Faa um programa que receba um montante em euros (com cntimos), e que determina o

    menor nmero de moedas de cada tipo necessrio para perfazer esse montante. Pode utilizarmoedas de euros de todos os valores disponveis (2, 1, ...).

    Notas:

    Deve efectuar os arredondamentos para a unidade mais prxima, no caso de o utilizadorintroduzir um valor com preciso abaixo do cntimo.

    Execuo de exemplo:

    C:\>trocostrocostrocostrocosIntroduza um montante em euros, podendo ter centimos: 1.791.791.791.791 euro: 150 centimos: 120 centimos: 15 centimos: 1

    2 centimos: 2

    Pergunta: para devolver 19.99 euros, quantas moedas so retornadas?

    primo.c

    Faa um programa que verifica se um determinado nmero N um nmero primo. Um

    nmero primo se divisvel apenas por ele prprio e pela unidade. Se no for primo deveidentificar o menor nmero pelo qual divisvel.

    Notas:

    suficiente testar at raiz quadrada de N (pode utilizar a funo sqrt da bibliotecamath.h)

    Em vez de calcular a raiz quadrada de N, pode calcular o quadrado do divisor.

  • 7/31/2019 Conceitos e exerccios de Programao

    35/221

    1) Exerccios 35

    Execuo de exemplo:

    C:\>primoprimoprimoprimoFuncao que verifica se um numero N e' primo:Indique N:999999992Numero divisvel por 3

    C:\>primoprimoprimoprimoFuncao que verifica se um numero N e' primo:Indique N:979797972 3 4 5 6 7 8 9Numero primo!

    Pergunta: Some os nmeros retornados dos seguintes nmeros (no caso dos nmeros primos nosome nada): 241134319; 241234319; 13212311.

    triplasoma.c

    Dado um inteiro positivo N, escrever todas as decomposies distintas possveis como somade trs inteiros positivos (considerar iguais as triplas com os mesmos valores mas por outraordem). Calcular tambm o nmero de somas distintas.

    Notas:

    Assumir que os nmeros mais altos aparecem sempre primeiro.Execuo de exemplo:

    C:\>triplasomatriplasomatriplasomatriplasomaEscreva um numero para decompor em somas de tres parcelas.Numero:77775+1+14+2+13+3+13+2+2

    Numero de somas: 4

    Pergunta: quantas somas existem para N=1000?

    pi.c

    Calcular o valor de com base na frmula de Ramanujan:

    ( ) ( )( )=

    +=K

    kkk

    kk0

    44396!

    263901103!49801

    221

    Notas:

    Utilize preciso dupla Pode utilizar a funo sqrt para calcular a raiz quadrada, da biblioteca math.h

  • 7/31/2019 Conceitos e exerccios de Programao

    36/221

    36 Parte I Variveis e Estruturas de Controlo

    Execuo de exemplo:

    C:\>pipipipi

    Valor de PI (xxxx iteracoes): 3.14159265xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    Pergunta: qual o valor de com preciso 17 em notao cientfica, para K=2?

    formularesolvente.c

    Faa um programa que pea os coeficientes de um polinmio do segundo grau, e retorna as

    razes reais, caso existam. Adicionalmente o programa deve retornar todos os conjuntos decoeficientes inteiros, que tm apenas razes inteiras reais. Os coeficientes esto entre -K e K notendo nenhum coeficiente nulo (K introduzido pelo utilizador e um inteiro pequeno). Relembra-se a frmula resolvente:

    a

    acbbxcbxax 2

    40

    22

    ==++

    Notas:

    Para calcular a raiz quadrada, utilize a funo sqrt, disponvel na biblioteca math.h Faa trs ciclos um dentro do outro, um ciclo por cada um dos coeficientes, e varie a varivel

    iteradora entre -K e K.

    Execuo de exemplo:

    C:\>formularesolventeformularesolventeformularesolventeformularesolventeEquacao do segundo grau a*x^2+b*x+c=0.

    Indique a b c: 2 4 22 4 22 4 22 4 2Delta: 0.000000A equacao tem uma raiz unica, x=-1.000000

    Calculo de coeficientes entre -K e K inteiros nao nulos, com razesinteiras.Introduza K:2222

    Coeficientes de -2 a 2 inteiros nao nulos, com razes inteiras:[-1 -2 -1] [-1 -1 2] [-1 1 2] [-1 2 -1] [1 -2 1] [1 -1 -2] [1 1 -2] [1

    2 1]Total: 8

    Pergunta: quantas equaes do segundo grau existem, com coeficientes entre -10 e 10 inteiros nonulos, e com razes inteiras?

  • 7/31/2019 Conceitos e exerccios de Programao

    37/221

  • 7/31/2019 Conceitos e exerccios de Programao

    38/221

  • 7/31/2019 Conceitos e exerccios de Programao

    39/221

    PAR TE I I FUN E S , V E CTOR E S ER E CUR S O

    Apenas com a Parte I possvel fazer programas, mas no h nenhuma ferramenta de controlo decomplexidade. O cdigo medida que cresce requer cada vez mais ateno para o escrever emanter. Na Parte II vamos dar uma ferramenta da programao que permite controlar acomplexidade de um programa: a abstraco funcional. O bom uso desta ferramenta leva a que anossa ateno apenas tenha de estar a cada momento centrada num reduzido conjunto de linhas decdigo, e mesmo assim garante que toda a funcionalidade do programa satisfeita. Desta forma possvel escrever programas de qualquer dimenso. Sero apresentados tambm os vectores, deforma a poder lidar com grande volume de variveis, bem como alternativas mais elegantes paraciclos e condicionais. Aps a realizao da Parte II, ficar com bases slidas para escreverprogramas de qualquer dimenso, sem grandes limitaes.

  • 7/31/2019 Conceitos e exerccios de Programao

    40/221

    40 Parte II Funes, Vectores e Recurso

    5.FUNESO termo "funo" em portugus muito lato, aplicvel a diversas entidades na linguagem C sejaminstrues sejam variveis. Tudo tem uma funo, caso contrrio no estaria na linguagem. As

    atribuies tm a funo de atribuir o valor de uma expresso a uma varivel, os condicionais tm afuno de executar uma instruo mediante o resultado de uma expresso lgica, os ciclos tm afuno de executar um conjunto de instrues enquanto uma expresso lgica se mantiververdadeira, e as variveis tm a funo de manter um valor de forma a este ser utilizado emexpresses, ou ser trocado por outro atravs de uma atribuio.

    Na linguagem C o termo funo tem no entanto um sentido muito concreto, e deve o seu nomeprecisamente devido importncia que tem.

    Uma funo um bloco de cdigo que pode ser chamado de qualquer parte do programa ,quantas vezes se quiser. Por chamar, significa que se tem uma instruo a ordenar o computador aexecutar o bloco de cdigo correspondente funo identificada, e s depois continuar com a

    execuo das restantes linhas de cdigo.Vamos clarificar este ponto com o seguinte exemplo, ainda sem utilizar funes. Pretende-se umprograma que oferece um menu ao utilizador de 3 opes, e uma opo de sada do programa.

    1#include23int main()4 {5 int opcao;6 /* mostrar as opes do menu */7 printf("\nMenu:\n1 - opcao A\n2 - opcao B\n3 - opcao C\n0 - sair");8 printf("\nOpcao: ");9 scanf("%d",&opcao);

    1011 while(opo>0)12 {13 /* ver qual a opo */14 if(opcao==1)15 printf("Opcao escolhida A");16 elseif(opcao==2)17 printf("Opcao escolhida B");18 elseif(opcao==3)19 printf("Opcao escolhida C");20 else21 printf("Opcao invalida");2223 /* mostrar as opes do menu */24 printf("\nMenu:\n1 - opcao A\n2 - opcao B\n3 - opcao C\n0 - sair");25 printf("\nOpcao: ");26 scanf("%d",&opcao);27 }28 printf("Fim do programa.");29 }

    Programa 5-1 Escolha de opes num menu

    Este programa utiliza apenas conceitos j introduzidos. Nada de novo.

  • 7/31/2019 Conceitos e exerccios de Programao

    41/221

    5. Funes 41

    Execuo do programa:

    C:\>menumenumenumenu

    Menu:1 - opcao A2 - opcao B

    3 - opcao C0 - sairOpcao: 2222Opcao escolhida BMenu:1 - opcao A2 - opcao B3 - opcao C0 - sairOpcao: 5555Opcao invalidaMenu:1 - opcao A2 - opcao B3 - opcao C0 - sairOpcao: 0000Fim do programa.

    O programa funcionou de acordo com o esperado. No entanto o cdigo correspondente ao menuest repetido tanto no incio do programa, como no ciclo. Isto porque para entrar no ciclo necessrio que o menu j tenha sido mostrado, e o utilizador j tenha introduzido uma opo.

    O cdigo repetido no teve grande trabalho a ser escrito, foi apenas uma operao de Copy/Paste.Se fosse necessrio em mais partes do programa, fazia-se mais cpias desse cdigo. Esta operaoto vulgar em aplicaes informticas, no entanto proibida em programao. Porqu?

    Para fazer uma alterao numa parte do cdigo duplicada, tem que se conhecer as partespara a qual o cdigo foi copiado para reproduzir a alterao nessas partes;

    Se o cdigo duplicado sofrer pequenas alteraes no aplicveis ao cdigo original, torna-secomplicado manter ambos os cdigos, dado que algumas das futuras correces no seroaplicveis a ambos os cdigos;

    O custo de leitura poder ser at maior que o custo de escrita, o que dificulta a manutenodo cdigo;

    Um bloco de cdigo pode funcionar bem numa zona, mas aps ser copiado para outra zona,devido s instrues precedentes ou sucessoras, pode no ter o funcionamento esperado.

    Qual a soluo? Fazer uma funo, ou seja, um bloco de cdigo com as instrues correspondenteao menu, e chamar essa funo nos dois locais onde o menu necessrio.

  • 7/31/2019 Conceitos e exerccios de Programao

    42/221

    42 Parte II Funes, Vectores e Recurso

    1#include23int Menu()4 {5 int opcao;6 /* mostrar as opes do menu */7 printf("\nMenu:\n1 - opcao A\n2 - opcao B\n3 - opcao C\n0 - sair");8 printf("nOpcao: ");

    9 scanf("%d",&opcao);10 /* retornar a opo seleccionada */11 return opcao;12 }1314int main()15 {16 int opcao;1718 opcao=Menu();1920 while(opcao>0)21 {22 /* ver qual a opo */23 if(opcao==1)24 printf("Opcao escolhida A");25 elseif(opcao==2)

    26 printf("Opcao escolhida B");27 elseif(opcao==3)28 printf("Opcao escolhida C");29 else30 printf("Opcao invalida");3132 opcao=Menu();33 }34 printf("Fim do programa.");35 }

    Programa 5-2 Escolha de opes num menu, utilizando uma funo

    Dentro da funo main, chama-se a funo Menu(), e atribui-se o valor retornado varivel opo que j era utilizada para esta funo. Este procedimento repetido nos dois locaisonde necessrio o menu. Os parntesis curvos aps Menu, significam que o identificador uma

    funo.

    O cdigo correspondente funo est definido em cima, e idntico ao formato da funo main,mas com o nome Menu. Este nome foi dado de forma a ficar o mais perto possvel relativamente funcionalidade que implementa. Dentro da funo Menu no existe a varivel opo, que estdeclarada na funo main, pelo que necessrio declarar tambm aqui a varivel opo para apoder utilizar. So variveis distintas, embora tenham o mesmo nome, uma est na funo main eoutra na funo Menu. A funo Menu na ltima instruo return opcao; retorna o valor davarivel opcao, sendo esse valor utilizado no local onde a funo foi chamada.

    Na execuo passo-a-passo, a chamada funo Menu leva a uma criao de uma varivel, que onome da funo chamada, sendo as variveis criadas dentro da funo direita, sendo destrudas

    quando a funo retorna. Verifique que no passo 6 a varivel opcao da funo Menu ficou com ovalor atribudo, mas apenas no passo 8 que este valor passou para a varivel opcao dafuno main.

  • 7/31/2019 Conceitos e exerccios de Programao

    43/221

    5. Funes 43

    A execuo de ambos os programas igual, masos problemas apontados j no esto presentesno segundo programa:

    Para fazer uma alterao, basta editar ocdigo da funo e a alterao fica vlida

    para todos os locais em que a funo utilizada;

    Se for necessrio utilizar a funo Menucom ligeiras diferenas, pode-se utilizarargumentos e mantm-se o cdigo num slocal.

    O custo de leitura mais baixo, j que noh linhas repetidas;

    O cdigo da funo Menu funcionaindependentemente do local onde chamado, j que apenas depende das

    instrues que esto na funo. Se fossecopiado, necessitava de estar declaradauma varivel opcaodo tipo int, que noestivesse a ser utilizada para outros fins.

    A principal vantagem das funes no noentanto evitar os problemas acima descritosinerentes ao Copy/Paste, mas sim possibilitar a abstraco funcional. No h nenhuma outraferramenta na informtica, mais poderosa que a abstraco funcional.

    O termo "abstraco" em portugus significa que nos podemos abstrair de parte do problema. Umproblema dividido fica mais simples, num caso extremo fica-se com problemas muito pequenosque so facilmente implementados. precisamente esse caso extremo que se pretende, uma vezque no s a capacidade do programador limitada, como quanto mais simples um programaestiver escrito, mais facilmente lido e menos erros ter.

    Na programao aplica-se a abstraco s funes, comeando pela funo main, que deveimplementar o problema completo. Esta pode ir sendo desagregada em funes mais simples, at seobter dimenses de funes razoveis, facilmente implementveis e de leitura simples.

    Ao implementar uma funo s interessa saber o que a funo tem de fazer. O resto do cdigono tem qualquer relevncia, podemos abstrair-nos dele, nem sequer nos interessa saber onde afuno ser chamada.

    Ao utilizar uma funo s interessa saber o que a funo faz. Como a funo est implementadano tem qualquer relevncia, podemos abstrair-nos disso, nem sequer interessa saber se a funoutiliza condicionais ou ciclos, se tem muitas ou poucas linhas de cdigo.

    Desta forma, mesmo um programador muito limitado poder implementar um problema muitocomplexo, aparentemente fora do alcance de alguns. Na verdade, por vezes aconteceque um programador sem restries, ao fazer as opes na escolha das funes a utilizaradaptadas para a sua maior capacidade de programao, arrisca-se a ficar com funes com grande

  • 7/31/2019 Conceitos e exerccios de Programao

    44/221

    44 Parte II Funes, Vectores e Recurso

    nmero de variveis, condicionais e ciclos, levando muito mais tempo a implementar e testar eficando o cdigo de menor qualidade que o programador mais limitado. Este, ao no conseguirimplementar funes acima da sua capacidade, procura sempre dividir o problema at que estetenha uma dimenso apropriada, pelo que encontrar sempre uma tarefa facilitada.

    Vamos voltar ao programa que calcula se um ano ou no bissexto, mas utilizando funes (ver

    Programa 3-2).

    1#include23int Bissexto(int ano)4 {5 return ano%400==0 || ano%4==0 && ano%100!=0;6 }78int main()9 {

    10 int ano;11 printf("Indique ano: ");12 scanf("%d", &ano);1314 /* teste de ano bissexto */

    15 if(Bissexto(ano))16 printf("Bissexto");17 else18 printf("Normal");19 }

    Programa 5-3 Determina se um ano normal o u bissexto utilizando funes

    Este programa manteve o funcionamento igual ao original, mas foi feita uma funo BissextoBissextoBissextoBissexto paraobter o resultado da expresso lgica que indica se um ano ou no bissexto. Esta funo recebe noentanto um argumento, a varivel ano. A funo poderia ela prpria pedir o valor do ano, e nessecaso no necessitava do argumento, mas assim no poderia ser utilizada numa parte do cdigoonde no tivesse interesse pedir o ano. Com o argumento o cdigo funciona de acordo com o valorrecebido, podendo ser utilizado em maior nmero de situaes.

    Os argumentos de umafuno so colocados entreos parnteses, tanto nadeclarao como nautilizao. Se houver maisque um argumento, estestm de ser separados porvrgulas, tal como j temos vindo a fazer no printf e no scanf. Na funo Bissexto tem umavarivel local ano, uma vez que os argumentos de uma funo so tambm variveis locais funo.

    Na execuo passo-a-passo

    pode-se ver no passo 5 adeclarao e atribuio doparmetro da funo. Osparmetros das funes tmde ser declaradas comoqualquer outra varivellocal.

  • 7/31/2019 Conceitos e exerccios de Programao

    45/221

    5. Funes 45

    Neste caso pode-se considerar que no houve grande vantagem em fazer a funo Bissexto, noentanto, atendendo a que h outro projecto dos dias do ms que necessita desta funo, essavantagem realmente existe, dado que desta forma possvel passar a funo de um projecto para ooutro sem qualquer alterao da funo, nem ser necessrio rever a implementao do cdigo dafuno.

    1#include23int Bissexto(int ano)4 {5 return ano%400==0 || ano%4==0 && ano%100!=0;6 }78int DiasDoMes(int mes, int ano)9 {

    10 if(mes==2)11 {12 /* teste de ano bissexto */13 if(Bissexto(ano))14 return 29;15 else16 return 28;17 } elseif(mes==1 || mes==3 || mes==5 || mes==7 ||18 mes==8 || mes==10 || mes==12)19 {20 return 31;21 } else22 {23 return 30;24 }25 }2627int main()28 {29 int ano, mes, dias;30 printf("Indique ano: ");31 scanf("%d", &ano);32 printf("Indique mes: ");33 scanf("%d", &mes);3435 printf("%d",DiasDoMes(ano,mes));36 }

    Programa 5-4 Determina o nmero de dias de um ms/ano utilizando funes

    Este programa tem a mesma funcionalidade que o Programa 3-3.

    Execues passo-a-passo:

  • 7/31/2019 Conceitos e exerccios de Programao

    46/221

    46 Parte II Funes, Vectores e Recurso

    Comecemos pela funo main. Esta funo ficou muito curta quando comparado com o cdigooriginal, dado que o calculo do dia do ms feito numa funo que retorna o nmero de dias. Afuno main apenas tem de ler os argumentos e chamar a funo respectiva. Para chamar afuno DiasDoMes no interessa sequer saber que esta utiliza a funo Bissexto.

    A funo DiasDoMestem os testes que estavam na funo main do cdigo original, mas em vez do

    condicional mais complexo do ano bissexto, tem uma chamada funo Bissexto. Esta funo temdois parmetros, ao contrrio da funo Bissexto. Desta forma move-se complexidade doproblema para outra funo, tornado a leitura mais simples de cada parte do cdigo.

    A funo Bissextofoi copiada do outro programa, portanto reutilizada. Quanto mais genrica for afuno maior o seu potencial para ser til tanto em vrias zonas do cdigo, como em outrosprogramas. Ao copiar cdigo de um programa para outro pode-se utilizar o cdigo copiado comalguma garantia, dado que j foi testado e utilizado em outro programa, e provvel que contenhapoucos erros.

    Erros comuns mais directamente associados a este captulo:

    Funes com parmetros no nomeo Forma: Para distinguir uma constante importante na funo, basta colocar o valor

    do parmetro no nome da funo, por exemplo funcao12, para a funo que retorneo resto da diviso por 12. Desta forma evita-se utilizar um argumento

    o Problema: Se distingue uma constante importante no nome da funo, ento devecolocar a constante como argumento da funo, ficando a funo a funcionar paraqualquer constante. Caso no o faa, corre o risco de ao lado de funcao12, sernecessrio a funcao4, funcao10, etc., ficando com instrues parecidas. No poupasequer na escrita dado que coloca no nome da funo a constante que utiliza nafuno

    o Resoluo: Se tem casos destes no seu cdigo, deve fazer uma troca simples:substituir todas as constantes dependentes de 12 pelo argumento, ou umaexpresso dependente do argumento.

    Instrues parecidas no seguidaso Forma: Quando necessrio uma ou mais instrues que so parecidas com outras

    que j escritas noutra parte do cdigo, basta seleccionar e fazer uso de uma dasprincipais vantagens dos documentos digitais: copy/paste

    o Problema: O copy/paste vai dificultar a leitura, e tambm a escrita tem de ser commuito cuidado, para poder editar as diferenas. Se esta situao ocorrer, uma

  • 7/31/2019 Conceitos e exerccios de Programao

    47/221

    5. Funes 47

    indicao clara que necessria uma funo com as instrues que so parecidas edevem ser reutilizadas. Nos argumentos da funo deve ir informao suficientepara que a funo possa implementar as diferenas

    o Resoluo: Se aconteceu no seu cdigo, deve estudar quais as diferentesalternativas para utilizao de funes que tem, de forma a garantir que no lheescapam hipteses antes de optar

    Funes especficaso Forma: Para uma situao necessria uma funo concreta, pelo que essa funo

    que definida, utilizando as constantes necessrias dentro dessa funoo Problema: Se as funes so muito especficas, no podem ser reutilizadas, tanto no

    mesmo programa, como em outros programas. Quanto mais genrica a funo,maior o seu grau de reutilizao, sendo mais simples de manter e detectar algumproblema

    o Resoluo: Reveja todas as constantes que tem numa funo especfica, e passe asconstantes que sejam passveis de serem mudadas para argumentos da funo, deforma a aumentar as possibilidades da funo ser til sem alteraes em outrassituaes

    Declaraes de variveis fora do incio das funeso Forma: As variveis devem ser declaradas o mais perto possvel do local onde so

    utilizadas, e como alguns compiladores de C permitem a declarao fora do inciodas funes, h que aproveitar

    o Problema: verdadeira a frase, mas no para quem se inicie na programao, nempara a linguagem C. A generalidade dos compiladores de C permite declarao dasvariveis em qualquer parte do cdigo, mas nem todos, pelo que perdecompatibilidade. Mais relevante a m influncia que tal situao ter, facilitando aexistncia de funes grandes. Com as variveis declaradas em cada bloco, no irsofrer os efeitos de funes grandes to intensamente, o que o pode levar a nosentir a necessidade de criar funes

    o Resoluo: Todas as declaraes fora do incio das funes passam para o incio dasfunes. Reveja os nomes das variveis se necessrio

    O Programa 5-1 tem um exemplo de um erro de instrues parecidas no seguidas, de forma amotivar a utilizao de funes. Um exemplo de funes com parmetros no nome no Programa5-4 existir uma funo DiasDoMes2010, que recebe um ms e retorna o nmero de dias desse msem 2010. Esta verso tambm um exemplo de uma funo especfica, dado que contm umaconstante que poderia estar num argumento, mas a situao da constante ir para o nome da funo de maior gravidade. A existncia de uma constante interna a uma funo, justifica-se se o seuvalor raramente fizer sentido ser distinto do utilizado na implementao.

    Estes exemplos so muito curtos, mas num conceito to importante quanto este, tem que se dar

    tempo para que entre devagar e seja compreendido parte da sua potencialidade. Com a experinciaficar claro quais as funes que deve criar, de forma a obter cdigo de qualidade, modular,reutilizvel, e de simples leitura. Por agora, duas caractersticas de uma boa funo:

    Uma funo, uma operao (no juntar alhos com bugalhos); Se no tem uma funcionalidade ou nome claro, ento no uma funo.

  • 7/31/2019 Conceitos e exerccios de Programao

    48/221

    48 Parte II Funes, Vectores e Recurso

    Reveja cdigo que tenha feito no mdulo anterior, e faa uma verso modular de cada um,utilizando funes.

    Da boa diviso do problema em funes resultar o menor trabalho necessrio para implement-lo,enquanto uma m diviso resulta no a inviabilizao da implementao, mas sim um aumento detrabalho necessrio. Quanto mais trabalho, provavelmente menor qualidade ter o cdigo.

  • 7/31/2019 Conceitos e exerccios de Programao

    49/221

    6. Mais Ciclos e Condicionais 49

    6.MAIS CICLOS E CONDICIONAISEste captulo comea em "mais", porque na verdade no introduz novos conceitos, mas simapresenta alternativas que a linguagem C oferece para aplicar esses conceitos: ciclos e condicionais.

    A primeira situao refere-se constatao que a maior parte dos ciclos tem uma variveliteradora, que controla o teste de paragem do ciclo. Essa varivel iteradora tem de ser inicializadaantes do ciclo, e incrementada no final do ciclo, de forma a ficar com o valor vlido quando aexpresso lgica avaliada. Exemplo disso o primeiro programa no captulo Ciclos.

    1#include23int main()4 {5 int soma=0, i=1;6 while(i

  • 7/31/2019 Conceitos e exerccios de Programao

    50/221

    50 Parte II Funes, Vectores e Recurso

    seguida a avaliao. Para no haver confusoentre a zona do ciclo for que est a serexecutada num dado passo, as zonas noexecutadas so substitudas por um cardinal(#).

    Tm que existir sempre trs parmetros nociclofor, mesmo que um campo seja vazio,tem que se colocar o ponto e vrgula. Se houverlugar a mais que uma instruo deinicializao, estas devem estar separadas poruma vrgula, acontecendo o mesmo para ainstruo de actualizao. Por exemplo, pode-se querer inicializar o valor da varivel somano ciclo.

    1#include23int main()4 {5 int soma, i;

    67 for(i=1, soma=0; i

  • 7/31/2019 Conceitos e exerccios de Programao

    51/221

    6. Mais Ciclos e Condicionais 51

    Mostra-se a execuo passo-a-passo dosprimeiros 20 passos. Esta execuo,quando comparada com a versoutilizandowhile, pode-se verificar queno h diferena excepto na troca doforpelowhile.

    Para que no exista qualquer dvida, o ciclo for genrico:

    for(inicializao; expresso lgica; actualizao)for(inicializao; expresso lgica; actualizao)for(inicializao; expresso lgica; actualizao)for(inicializao; expresso lgica; actualizao)instruo;instruo;instruo;instruo;

    equivalente ao ciclo while genrico:

    ininininicializao;icializao;icializao;icializao;while(expresso lgica)while(expresso lgica)while(expresso lgica)while(expresso lgica){{{{

    instruo;instruo;instruo;instruo;actualizao;actualizao;actualizao;actualizao;

    }}}}

    Se a expresso lgica for falsa logo no primeiro ciclo, as instrues do ciclo nunca so executadas,quer se utilize o ciclo for ou o ciclo while. Pode-se sempre alterar a expresso lgica para que seja

    verdadeira no primeiro ciclo, mas complicando a expresso, pelo que a linguagem C tem uma outraforma de executar ciclos, o dodododo----whilewhilewhilewhile:

    dodododo{{{{

    instruo;instruo;instruo;instruo;} while(expresso lgic} while(expresso lgic} while(expresso lgic} while(expresso lgica);a);a);a);

    Exemplifica-se o ciclo do-while com o exerccio do menu emFunes, que pode ser reescrito daseguinte forma:

  • 7/31/2019 Conceitos e exerccios de Programao

    52/221

    52 Parte II Funes, Vectores e Recurso

    1#include23int Menu()4 {5 int opcao;6 /* mostrar as opes do menu */7 printf("\nMenu:\n1 - opcao A\n2 - opcao B\n3 - opcao C\n0 - sair");8 printf("\nOpcao: ");

    9 scanf("%d",&opcao);10 /* retornar a opo seleccionada */11 return opcao;12 }1314int main()15 {16 int opcao;17 do18 {19 opcao=Menu();20 /* ver qual a opo */21 if(opcao==1)22 printf("Opcao escolhida A");23 elseif(opcao==2)24 printf("Opcao escolhida B");25 elseif(opcao==3)

    26 printf("Opcao escolhida C");27 elseif(opcao!=0)28 printf("Opcao invalida");29 } while(opcao>0);30 printf("Fim do programa.");31 }

    Programa 6-5 Verso com ciclos do-while do Programa 5-2

    Mostra-se a execuo passo-a-passo dosprimeiros 20 passos. Este programa tem o mesmofuncionamento que o original, mas com autilizao do ciclo do-while possvel chamarapenas uma s vez a funo Menu. Com estasoluo pode-se ponderar a necessidade de umafuno para o menu, uma vez que a funo chamada apenas uma s vez, e tem uma dimensoreduzida.

  • 7/31/2019 Conceitos e exerccios de Programao

    53/221

    6. Mais Ciclos e Condicionais 53

    1#include23int main()4 {5 int opcao;6 do7 {8 /* mostrar as opes do menu */

    9 printf("\nMenu:\n1 - opcao A\n2 - opcao B\n3 - opcao C\n0 - sair");10 printf("nOpcao: ");11 scanf("%d",&opcao);12 /* ver qual a opo */13 if(opcao==1)14 printf("Opcao escolhida A");15 elseif(opcao==2)16 printf("Opcao escolhida B");17 elseif(opcao==3)18 printf("Opcao escolhida C");19 elseif(opcao!=0)20 printf("Opcao invalida");21 } while(opo>0);22 printf("Fim do programa.");23 }

    Programa 6-6 Verso removendo a funo Menu do Programa 6-5

    Os ciclos while e do-while devem ser utilizados nos ciclosmenos ortodoxos quando no h uma varivel iteradoraclara, ou a expresso lgica muito complexa, de forma a noter numa s linha do ciclo for muito longa. Nos ciclosnormais, a opo pelo ciclo for resulta quase sempre emganho de legibilidade.

    Os condicionais tm tambm uma alternativa cadeia if-else utilizada no programa acima. Em situaes em que asexpresses lgicas na cadeia if-else so comparaes comvalores concretos, como o caso do exemplo do menu, pode-

    se utilizar o switchswitchswitchswitch, que recebe uma varivel e lista-se todosos casos.

  • 7/31/2019 Conceitos e exerccios de Programao

    54/221

    54 Parte II Funes, Vectores e Recurso

    1#include23int main()4 {5 int opcao;6 do7 {8 /* mostrar as opes do menu */

    9 printf("\nMenu:\n1 - opcao A\n2 - opcao B\n3 - opcao C\n0 - sair");10 printf("\nOpcao: ");11 scanf("%d",&opcao);12 /* ver qual a opo */13 switch(opo)14 {15 case 1:16 printf("Opcao escolhida A");17 break;18 case 2:19 printf("Opcao escolhida B");20 break;21 case 3:22 printf("Opcao escolhida C");23 break;24 case 0:25 break;

    26 default:27 printf("Opcao invalida");28 }29 } while(opcao>0);30 printf("Fim do programa.");31 }

    Programa 6-7 Verso com switch do Programa 6-6

    O switch tem de ter o valor de uma expresso numricacomo base, e no uma expresso lgica, sendo colocada aexecuo na linha de cdigo que tiver o caso que ocorreu(case valor:). Se o valor no existir em nenhum doscasos listados, a execuo passa para a linha onde estiver"default:" se existir. Com estas regras, poderia haverproblema em utilizar o switch no fosse a existncia doscomandos break; que saem nesse instante do comandoswitch. Se no fosse assim, no caso da opo 1 ser escolhida,o programa passaria para a linha do caso 1, e de seguidaseguiria normalmente para o caso 2, 3 e a opo invlida, sporque esto nas linhas de cdigo aps a opo 1. Colocandoum break; aps o fim do cdigo que trata cada opo,resolve-se o problema.

    Pode-se ver na execuo passo-a-passo que nos passos 5, 13e 20, o switch passou imediatamente para a linha que trata

    o caso pretendido, em vez de executar vrios condicionais.Num outro exemplo podemos ver uma implementao alternativa da funo DiasDoMes, extradado Programa 5-4:

  • 7/31/2019 Conceitos e exerccios de Programao

    55/221

    6. Mais Ciclos e Condicionais 55

    1int DiasDoMes(int mes, int ano)2 {3 switch(mes)4 {5 case 2:6 /* teste de ano bissexto */7 if(Bissexto(ano))8 return 29;

    9 else10 return 28;11 /* meses de dias 31 */12 case 1:13 case 3:14 case 5:15 case 7:16 case 8:17 case 10:18 case 12:19 return 31;20 default:21 return 30;22 }23 }

    Programa 6-8 Funo DiasDoMes com switch do Programa 5-4

    Neste caso pretende-se identificar todos os casos de meses de 31, pelo que basta colocar osdiferentes casos em cada linha, e retornar o valor correcto apenas aps a linha que identifica oltimo ms de 31 dias. Como aqui utilizam-se comandos return, que saem imediatamente dafuno, no h necessidade de utilizar a instruo break; no switch.

    O comando breakbreakbreakbreak;;;; pode ser utilizado tambm em ciclos, para sair do ciclo actual. Existe ainda ocomando continuecontinuecontinuecontinue;;;; utilizvel dentro de ciclos, que permite saltar para a prxima iterao do ciclo.Estes comandos no se devem no entanto utilizar com frequncia, dado que dessa forma asexpresses lgicas, inicializaes e actualizaes associados ao ciclo, no controlam completamenteo ciclo, sendo auxiliadas por eventuais condicionais dentro do ciclo, sobre a qual os comandosbreak; e continue; esto. Sendo de evitar a utilizao destes comandos, no ser dado nenhum

    exemplo em que tais comandos sejam teis.Erros comuns mais directamente associados a este captulo:

    Ciclos contendo apenas uma varivel lgica no teste de paragemo Forma: Esta estratgia consiste em utilizar nos ciclos (normalmente while), uma

    varivel no teste de paragem, atribuindo o valor verdadeiro e dentro do ciclo,quando for necessrio sair dele, fazer uma atribuio varivel a falso

    o Problema: O real teste de paragem fica diludo nas instrues que alteram estavarivel, bem como condicionais que utilizem o break, e ter algo em vez de numlocal em vrios, torna sempre mais complicada a leitura e manuteno de cdigo.Esta situao ocorre porque falhou na identificao do real teste de paragem. pior

    se necessitar de acompanhar esta varivel com uma outra varivel que altera devalor em cada ciclo (uma varivel iteradora)

    o Resoluo: Se optar com frequncia para esta situao, deve rever o seu cdigoprocurando alternativas

    Um exemplo simples deste erro a seguinte verso do Programa 4-2:

  • 7/31/2019 Conceitos e exerccios de Programao

    56/221

    56 Parte II Funes, Vectores e Recurso

    1#include23int main()4 {5 int soma=0, i=1, continua=1;6 while(continua)7 {8 soma+=i*i;

    9 i++;10 if(i>4)11 continua=0;12 }13 printf("Soma dos primeiros 4 quadrados: %d", soma);14 }

    A varivel lgica continua pode ser actualizada em qualquer parte do ciclo, sendo a verdadeiracondio de paragem distribuda pelos condicionais associados sua alterao. Este exemplo topequeno que no d para dividir a condio de paragem, apenas desloc-la do ciclo while para ofinal do ciclo, mas mesmo assim pode-se verificar a degradao da clareza do cdigo. Uma outraverso a evitar teria sido em vez da varivel continua utilizar-se a constante 1 de forma a obter-seum ciclo infinito, utilizando-se a instruo break; em vez de continua=0;para sair do ciclo.

    Todos os ciclos tm a mesma complexidade, pode-se trocar um ciclo por outro, no entanto com ociclo for o cdigo fica normalmente melhor arrumado. A utilizao do switch normalmente nomelhora a leitura do cdigo, mas sempre uma opo em relao ao if. Agora que conhece todas asalternativas, faa uma reviso aos exerccios que fez e refaa os ciclos e condicionais de forma amelhorar a simplicidade e leitura do seu cdigo.

  • 7/31/2019 Conceitos e exerccios de Programao

    57/221

    7. Vectores 57

    7.VECTORESNos programas tratados at este momento, foram utilizadas variveis de diferentes tipos, masnunca se abordou conjuntos de variveis.

    Suponhamos que estamos interessados em registar um valor por cada dia da semana. A naturezados valores no relevante, tanto pode ser o nmero de emails enviados, como o nmero de cafstomados, o que interessa que se pretende guardar um valor por cada dia da semana, e no finalobter a soma e a mdia dos valores introduzidos.

    Com o que sabemos, o seguinte programa resolveria o problema:

    1#include23int main()4 {5 int segunda, terca, quarta, quinta, sexta, sabado, domingo;6 int total;7

    8 /* introduo de valores */9 printf("Segunda: ");

    10 scanf("%d",&segunda);11 printf("Terca: ");12 scanf("%d",&terca);13 printf("Quarta: ");14 scanf("%d",&quarta);15 printf("Quinta: ");16 scanf("%d",&quinta);17 printf("Sexta: ");18 scanf("%d",&sexta);19 printf("Sabado: ");20 scanf("%d",&sabado);21 printf("Domingo: ");22 scanf("%d",&domingo);2324 /* calculos */

    25 total=segunda+terca+quarta+quinta+sexta+sabado+domingo;26 printf("Soma: %d\n",total);27 printf("Media: %f\n",total/7.0);28 }

    Programa 7-1 Calculo do total e mdia de um indicador por cada dia da semana

    Execuo do programa:

    C:C:C:C:\\\\>semana>semana>semana>semanaSegunda: 2222Terca: 3333Quarta: 1111Quinta: 2222Sexta: 3333Sabado: 4444

    Domingo: 1111Soma: 16Media:2.285714

    Se necessitamos de umvalor por cada dia dasemana, temos de criaruma varivel por cada diada semana. Neste caso a

  • 7/31/2019 Conceitos e exerccios de Programao

    58/221

    58 Parte II Funes, Vectores e Recurso

    operao pedida muito simples, a variveltotalpode ir sendo actualizada medida que seintroduz os valores, podendo-se evitar ter criado uma varivel por cada dia. Mas apenas umexemplo que pretende ser o mais simples possvel. Se quiser calcular a varincia, tem-se de fazeroutra passagem pelos valores da semana aps obter a mdia, sendo nesse caso essencial que osvalores fiquem em memria.

    Como temos variveis distintas, no podemos fazer um ciclo para fazer a operao de soma, porexemplo. Evidentemente q