Sie sind auf Seite 1von 173

Algoritmos e Lgica de Programao

Cincia da Computao Sistemas de Informao 2013

Profa. Dra. Elisamara de Oliveira

Da autora para voc, aluno!


Esta apostila se refere disciplina Algoritmos e Lgica de Programao, geralmente ministrada no 1 semestre dos cursos superiores da rea de Computao e Engenharia. O objetivo desta disciplina capacitar voc, caro aluno, a fazer os primeiros programas de computador utilizando uma linguagem de programao. Escrever programas de computador uma tarefa muito interessante, instigante e desafiadora! Vamos comear entendendo o que um algoritmo, que um roteiro com instrues sequenciais para se resolver um problema ou se realizar alguma tarefa. como uma receita de bolo que indica os ingredientes e as instrues para se fazer o bolo passo a passo. Usando esta analogia, os ingredientes seriam os dados, os passos seriam as instrues do programa e o forno para assar o bolo seria o computador! O universo dos computadores muito simples, muito limitado, mas muito poderoso: tudo se baseia na base 2, que possui apenas 2 algarismos: 0 e 1. Este dois dgitos binrios, ou bits, formam a linguagem de mquina, que a nica linguagem que o computador digital entende. Mas ns vamos aprender a escrever as instrues dos nossos programas numa linguagem de programao chamada C, que mais prxima da nossa linguagem de comunicao. Ns nos comunicamos em Portugus, certo? Ento vamos comear a escrever nossos primeiros algoritmos em PortuC, uma pseudo-linguagem, e depois traduzi-los para um programa em linguagem C. Isso ainda no resolve nosso problema: para que o computador possa executar nosso programa em C, ele precisa ser traduzido para linguagem de mquina! Mas isso ser feito facilmente pelo compilador C, um programa que faz exatamente isso: traduz programas em C para instrues binrias (linguagem de mquina). Como voc pode ver, ser um belo desafio! Ento, caro aluno, afie seu raciocnio lgico e prepare-se para entrar num mundo em que a lgica ser o carro-chefe! No tema nada, pois tudo ser ensinado de forma simples e didtica... mais algumas pginas frente e voc j estar programando seu computador!

Profa. Dra. Elisamara de Oliveira

Sumrio
Da autora para voc, aluno!...................................................................................................... 2 Captulo 1 ................................................................................................................................... 5 Algoritmos .................................................................................................................................. 5 1.1. O que um algoritmo? ...................................................................................................... 5 1.2. Conceitos Bsicos da Programao de Computadores ................................................. 8 1.3. Etapas da Programao de Computadores ................................................................... 11 1.4. Expresso de Algoritmos ................................................................................................. 12 1.4.1. Expresso de Algoritmos atravs de Diagramas ................................................12 1.4.2. Expresso de Algoritmos atravs de Linguagem de Programao ....................13 1.4.3. Expresso de Algoritmos atravs de Pseudo-linguagem ...................................16 1.5. Os algoritmos sero expressos em pseudo-linguagem ............................................... 17 Captulo 2 ................................................................................................................................. 24 Pseudo-linguagem de Programao: PortuC ..................................................................... 24 2.1. Identificadores ................................................................................................................... 24 2.2. Tipos Bsicos e Declarao de Variveis ...................................................................... 25 2.3. Comando de Atribuio .................................................................................................... 26 2.4. Operadores Aritmticos.................................................................................................... 27 2.5. Operadores Lgicos ......................................................................................................... 28 2.6. Operadores Relacionais................................................................................................... 32 2.7. Comando Condicional ...................................................................................................... 33 2.8. Comando de Repetio ................................................................................................... 35 2.9. Comandos de Entrada e Sada ....................................................................................... 38 2.10. Separador de comandos ................................................................................................ 41 2.11. Comentrios .................................................................................................................... 42 2.12. Bloco de Programa ......................................................................................................... 42 Captulo 3 ................................................................................................................................. 47 Construo de Algoritmos em PortuC: Praticando os comandos e fazendo clculos ... 47 3.1. Declarao de variveis, comandos leia e imprima ................................................. 47 3.2. Comando condicional se ............................................................................................... 48 3.3. Bloco de Programa ........................................................................................................... 49 3.4. Operaes Bsicas com Nmeros: soma, subtrao, multiplicao, diviso, raiz quadrada, porcentagem, potncia, diviso inteira ................................................................ 52 3.5. Operaes com Operadores Lgicos e Relacionais ..................................................... 56 Captulo 4 ................................................................................................................................. 60 Metodologia para Construo de Algoritmos ....................................................................... 60 4.1. Os 10 passos da metodologia ........................................................................................ 60 4.2. Soluo de exerccios utilizando a metodologia ........................................................... 62

4 Captulo 5 ................................................................................................................................. 76 A Linguagem de Programao C ........................................................................................... 76 5.1. Tipos Bsicos e Declarao de Variveis em C ............................................................ 76 5.2. Operadores de Atribuio, Aritmticos, Relacionais e Lgicos (Binrios) em C ........ 77 5.3. Comando Condicional em C (if) ...................................................................................... 80 5.4. Comando de Seleo Mltipla em C (switch) ................................................................ 82 5.5. Comando de Repetio em C (while) ............................................................................. 85 5.6. Comando de Repetio em C (for) ................................................................................. 87 5.7. Comandos de Leitura e Escrita em C ............................................................................. 91 5.8. Comentrios em C ............................................................................................................ 93 5.9. Bloco de Programa em C ................................................................................................. 94 5.10. Funes teis em C ....................................................................................................... 96 5.10.1. Funes da biblioteca string.h: ..................................................................................... 96 5.10.2. Funes da biblioteca ctype.h: ............................................................................... 96 5.10.3. Funes da biblioteca conio.h ................................................................................ 97 5.10.4. Funes da biblioteca math.h .................................................................................... 97 5.10.5. Funes da biblioteca stdlib.h ............................................................................... 98 5.11. Traduo de PortuC para a Linguagem C ................................................................. 99 Captulo 6 ............................................................................................................................... 106 Usando Comandos de Repetio em C ............................................................................... 106 6.1. Comando de repetio entrada indeterminada de dados (uso de flags) .............. 106 6.2. Comando de repetio entrada de dados determinada .......................................... 109 6.3. Exemplo dos Minutos Telefnicos ................................................................................ 114 6.4. Exemplo do Preo Final de Automveis....................................................................... 117 6.5. Exemplo da Eleio ........................................................................................................ 120 6.6. Exemplo da Srie Numrica .......................................................................................... 124 Outros Programas em C ....................................................................................................... 132 1 aula Prtica em Laboratrio ............................................................................................. 137 Estudo Dirigido ...................................................................................................................... 137 Respostas das Listas de Exerccios .................................................................................... 140 Da autora para o aluno-programador! ................................................................................. 172 Bibliografia ............................................................................................................................. 173

Captulo 1 Algoritmos
Em nosso dia-a-dia executamos mecanicamente uma srie de aes que so seguidas sequencialmente e que provocam o acontecimento de algo. Por exemplo, temos um trajeto frequente ao sairmos diariamente de casa em direo ao nosso trabalho ou nossa universidade que, sempre que seguido, nos leva ao nosso destino. Isso um algoritmo. Em outras palavras, um algoritmo descreve eventos com durao finita, que envolvem um conjunto de objetos cujas caractersticas podem ser alteradas, atravs de aes que ocorrem sequencialmente.

1.1. O que um algoritmo?


Vamos, juntos, entender o que so algoritmos, utilizando, inicialmente alguns conceitos j definidos na literatura tcnica da rea: "Programar construir algoritmos"

"Programa = Algoritmo + Estruturas de Dados"

"No processo de construo de programas a formulao do algoritmo e a definio das estruturas de dados esto intimamente ligadas"

Alm destas importantes definies, acrescentemos que num algoritmo podem-se observar os seguintes aspectos: - Ao: evento que ocorre num perodo de tempo finito

- Estado: propriedades de um objeto numa dada situao - Processo: sequncia temporal de aes - Padro de comportamento: toda vez que seguido, um evento ocorre

6 Exemplo de um algoritmo

Algoritmo para fazer " batatas fritas para o jantar " "Traga a cesta com batatas da despensa" ; "Traga a panela do armrio"; Coloque leo na panela; Se "a roupa clara ento "coloque o avental";

Enquanto

"n de batatas insuficiente para o nmero de pessoas"

faa

"descasque as batatas"; Pique as batatas; Esquente o leo da panela; "Frite as batatas na panela"; Escorra o excesso de leo das batatas fritas; "Coloque as batatas fritas numa vasilha com papel absorvente". Apesar de muito simples, algumas observaes importantes podem ser notadas neste algoritmo: O tempo verbal est na forma imperativa (faa, traga, frite, etc); H um sequenciamento das aes, que esto separadas por um ponto-e-vrgula ;; O avental no usado toda vez: existe um motivo para coloc-lo, ou seja, h uma condio para que o avental seja colocado; O nmero de batatas descascadas varia; a ao de descascar uma batata repetese at que a condio de parada (ser suficiente para alimentar as pessoas que iro jantar) seja alcanada; A ordem das aes importante: primeiro descasca-se a batata, pica-se a batata, para depois frit-la... Exemplos de algoritmos conhecidos: Qual o algoritmo que voc descreve para vir estudar? Qual o algoritmo para se fazer uma feijoada? Qual o algoritmo para se trocar uma lmpada?

7 Apesar de receitas culinrias e trajetos rotineiramente percorridos encaixarem-se perfeitamente no conceito inicial de algoritmo, no nosso curso estamos interessados num tipo de algoritmo especial, que seja capaz de ser executado por um computador. Para tanto, necessrio que identifiquemos problemas do mundo real que possam ser traduzidos em aes primitivas finitas e dos quais se possa extrair um padro de

comportamento.
Exerccio 1: Por falar em padro de comportamento...tente deduzir qual o padro de comportamento utilizado para gerar as sequncias: 1, 5, 9, 13, 17, 21, 25 ... 1, 1, 2, 3, 5, 8, 13, 21, 34 ...

Os dois exemplos do exerccio 1 so problemas do mundo real que, por serem finitos (ou para os quais se possa determinar uma condio de parada), e por possurem um padro de comportamento, podem ser resolvidos atravs de um programa de computador. No entanto, antes de se chegar ao programa de computador, o 1 passo fazer um algoritmo que seja capaz de solucionar o problema em questo.... Com base nos exemplos apresentados at aqui, estamos prontos para definirmos o que um algoritmo: Um algoritmo a descrio de um padro de comportamento, expresso em termos de um repertrio bem definido e finito de aes primitivas que podem ser executadas

Analise a definio e veja como coerente com o que apresentamos, no mesmo? Alm disso, importante observarmos que num algoritmo distinguem-se claramente dois aspectos: - Aspecto esttico: que corresponde ao texto - Aspecto dinmico: que corresponde sua execuo (a partir de valores iniciais) O curso de Algoritmos e Lgica de Programao , na realidade, um curso de Programao de Computadores para alunos que iniciam cursos superiores na rea de Engenharia e Informtica. Sei que voc est curioso para conhecer um algoritmo, mas... para comear a construir seus algoritmos e fazer seus primeiros programas de computador, necessrio que voc domine uma srie de conceitos bsicos, que so apresentados a seguir, a comear pelo prprio computador!

1.2. Conceitos Bsicos da Programao de Computadores


Computador: uma mquina capaz de seguir uma espcie de algoritmo chamado programa que est escrito em linguagem de mquina. Linguagem de mquina: internamente o computador executa uma srie de instrues que ficam armazenadas em sua memria principal em cdigo binrio, ou seja, em linguagem de mquina (zeros (0) e uns (1) que so os dgitos binrios ou bits). Linguagem de alto nvel: para escrever os Fonte: programas de computador, os programadores http://blog.123inkcartridges.ca/2011/05/d utilizam linguagens que esto mais prximas da iscount-50-at-getway-touchscreenlinguagem humana, que so chamadas de desktop/ linguagens de alto nvel ou simplesmente linguagens de programao. Exemplos de linguagens de programao (alto nvel) so C, C++, C#, Pascal, Delphi, Java, Basic, VisualBasic, Fortran, Cobol, dentre muitas outras. Linguagem de montagem ou Assembly: h programas de computador que precisam interferir diretamente no hardware da mquina para permitir a execuo de funes especficas como as oferecidas por sistemas operacionais, por exemplo. Neste caso, os programadores utilizam as linguagens de montagem ou linguagens assembly, que esto muito prximas da linguagem de mquina e mais distantes das linguagens de programao, sendo por isso chamadas de linguagem de baixo nvel. A figura 1 mostra a relao entre as linguagens discutidas anteriormente.

Linguagens de Alto Nvel

Linguagem de Mquina

Linguagens Humanas

Linguagem Assembly Figura 1 Relao entre linguagens de baixo e de alto nvel

9 Numa ponta da figura 1 est a linguagem de mquina e no outro extremo esto as linguagens humanas. Quanto mais prxima da linguagem de mquina, mais de baixo nvel a linguagem; em contrapartida, quanto mais prxima das linguagens humanas, mais alto nvel. As linguagens de programao fazem uma espcie de ponte entre a linguagem binria ou linguagem que o computador entende e a linguagem que ns humanos utilizamos. Linguagem de Programao: Uma linguagem de programao uma linguagem utilizada por uma pessoa para expressar um processo atravs do qual o computador possa resolver um problema [SEBESTA, 2000]. Pessoas que possuem uma compreenso limitada da linguagem natural tendem a ser mais limitados para expressar seus pensamentos, especialmente em termos de capacidade de abstrao. Programadores que tiveram pouca educao formal em disciplinas de Computao tendem a continuar a usar a mesma linguagem de programao, mesmo que esta esteja em desuso. A aprendizagem contnua fundamental. necessrio que os programadores conheam os fundamentos das linguagens de programao para que possam ler, entender e aprender com os manuais e livros tcnicos das novas linguagens e os novos paradigmas que venham a surgir. Compilador: permite que os programadores utilizem linguagens de alto nvel para escrever os programas de computador, pois se encarrega de traduzi-los para linguagem de mquina. O compilador um programa que traduz uma determinada linguagem de programao para linguagem de mquina. Desta forma, existem diversos compiladores especficos para cada uma das linguagens de programao e especficos para cada sistema operacional, conforme ilustra a figura 2.
Programa escrito em linguagem de alto nvel

Compilador para o Sistema Operacional X

Compilador para o Sistema Operacional Y

Compilador para o Sistema Operacional Z

Programa em Linguagem de Mquina para o computador X

Programa em Linguagem de Mquina para o computador Y

Programa em Linguagem de Mquina para o computador Z

Figura 2 Os compiladores so especficos para cada linguagem e para cada sistema operacional

10 Conforme ilustra a figura 2, um compilador C para o sistema operacional Windows (compilador X) diferente de um compilador C para o sistema operacional Linux (compilador Y), que tambm diferente de um compilador C para o sistema operacional Mac OS (compilador Z), por exemplo, embora a linguagem de programao (C) seja a mesma (linguagem de alto nvel). O compilador de linguagem de montagem ou linguagem assembly chamado de assembler. Caro aluno, dadas estas explicaes bsicas, como unir todas estas informaes para comearmos a programar? A figura 3 vai nos ajudar, mostrando o ciclo completo da elaborao do algoritmo execuo de um programa de computador. Cada um dos componentes deste ciclo explicado a seguir.

algoritmo

editor

cdigo fonte

compilador

cdigo objeto

arquivos de biblioteca

linker
cdigo executvel Figura 3 Do algoritmo execuo de um programa de computador Algoritmo: estrutura do programa; instrues que descrevem a lgica do programa Editor de texto: permite que o cdigo fonte do programa seja editado em um arquivo-fonte. Alguns compiladores tm editores com ambiente de programao integrados, como o caso do compilador Dev C++. Cdigo fonte: conjunto de comandos escritos na linguagem de programao escolhida (que neste curso ser a linguagem C). O cdigo fonte fica armazenado no arquivo-fonte em formato ASCii, ou seja, em texto. (O arquivo-fonte possui a extenso relativa linguagem de programao usada, por exemplo, .pas (Pascal), .c (C), .cpp (C++), .cs (C#), .java (Java)). Compilador: l o cdigo fonte do programa e cria um outro arquivo com o mesmo programa escrito em linguagem de mquina. Cdigo objeto: arquivo resultante da compilao do cdigo fonte. Contm informaes sobre alocao de memria, os smbolos do programa (como nomes de variveis e de funes) e tambm informaes sobre debug. (O arquivo-objeto possui a extenso .obj para a maioria das linguagens de programao). Arquivos de biblioteca: contm funes j compiladas que podem ser utilizadas no programa.

11 Linker: programa auxiliar do compilador que cria o programa executvel a partir de arquivos-objeto e dos arquivos de biblioteca. Cdigo executvel: programa que pode ser executado no computador (o arquivoexecutvel possui a extenso .exe). Resumindo todo este processo, caro aluno, vamos precisar passar por 5 etapas: primeiro obter um problema a ser resolvido, depois escrever um algoritmo em pseudolinguagem para solucionar este problema, depois traduzir o algoritmo para a linguagem de programao C e finalmente, editar este programa e usar um compilador C para testarmos seu funcionamento!

1.3. Etapas da Programao de Computadores


Como acabamos de dizer, para conseguirmos construir programas de computador, necessrio cumprir 5 etapas bsicas da programao. As 5 etapas da programao de computadores so:

[1] Identificao de um problema do mundo real [2] Confeco do algoritmo [3] Teste do algoritmo [4] Confeco do programa de computador [5] Execuo do programa no computador
Para realizarmos este ciclo de etapas com sucesso, quer dizer, para conseguirmos fazer programas de computador com qualidade e confiveis, muito importante a utilizao de tcnicas programao como a programao estruturada. A programao

estruturada uma metodologia de projeto e desenvolvimento, que pretende:


- facilitar a escrita; - facilitar o entendimento; - permitir a verificao; - facilitar a alterao e a manuteno dos programas de computador O principal objetivo da metodologia de programao estruturada reduzir a complexidade dos problemas. Esta metodologia, quando utilizada, induz o programador a produzir programas: - confiveis - de fcil manutenibilidade - flexveis - documentados - legveis Sendo assim, caro aluno, vamos aprender a programar da melhor maneira possvel: utilizando as regras da programao estruturada!

12

1.4. Expresso de Algoritmos


Os algoritmos podem ser expressos atravs de diagramas, atravs de pseudolinguagens ou atravs da prpria linguagem de programao. Vamos examinar cada uma destas trs opes e, no final deste captulo, vamos optar por uma delas para que possamos comear a fazer nossos primeiros algoritmos! 1.4.1. Expresso de Algoritmos atravs de Diagramas A utilizao de diagramas para a expresso de algoritmos foi bastante utilizada at a dcada de 1980. Diagramas de Chapin e fluxogramas foram os principais mtodos utilizados, ento. Nos mtodos baseados em diagramas, uma grande variedade de formas geomtricas como quadrados, retngulos, hexgonos, pentgonos, etc., so utilizadas para representar as instrues de leitura e impresso de dados, assim como os comandos condicionais, de repetio, etc. Alm disso, uma srie de regras para a disposio dessas formas e/ou setas para representar o sequenciamento das instrues fazem parte desses mtodos. Apesar de terem sido utilizados largamente pelas primeiras geraes de programadores, estes mtodos apresentam uma srie de inconvenincias como: O programador tem que memorizar todas as formas geomtricas e conhecer as regras de inter-relacionamento entre elas; O programador perde um tempo considervel para fazer e refazer desenhos, tendo que possuir diversas rguas com os smbolos dos diagramas; Para algoritmos muito grandes, os desenhos comeam a ocupar muitas pginas, tornando impraticvel a visualizao de toda a soluo; A memorizao de regras de expresso desvia a ateno do programador que no tem apenas de se concentrar na lgica do problema, como seria desejvel, mas tem as preocupaes adicionais de elaborar desenhos e consultar regras e regras... Alm de todos os inconvenientes citados, que de longe esgotam os seus problemas, os mtodos baseados em diagramas se distanciam muito do alvo da programao que a expresso da lgica algortmica na prpria linguagem de programao! Alm disso, esses mtodos no so nem um pouco intuitivos... veja a figura 4 e tente descobrir o que o programa faz... sem muito esforo, se for possvel:

Figura 4 Algoritmo expresso atravs de um diagrama de Chapin

13 A figura 5 mostra um exemplo de um algoritmo expresso atravs de um fluxograma. Observe a existncia de diferentes formas geomtricas para as diferentes instrues e o uso de setas para representar o fluxo dos dados. Voc seria capaz de dizer o que este algoritmo faz? Quais as variveis que ele utiliza e de que tipo bsico elas so? (Dica: este algoritmo faz a mesma coisa que o expresso pelo diagrama de Chapin da figura 4).

Figura 5 Algoritmo expresso atravs de um Fluxograma

1.4.2. Expresso de Algoritmos atravs de Linguagem de Programao Expressar um algoritmo atravs de uma linguagem de programao o objetivo, a meta do programador, com certeza. Mas, isso feito quando o programador j adquiriu bastante experincia de programao, quer dizer, quando o programador j consegue programar diretamente da linguagem de programao. Os programadores iniciantes podem ter grandes dificuldades para aprenderem a programar se forem direto s instrues da linguagem de programao...

14 Uma linguagem de programao permite, alm da expresso do raciocnio algortmico, a sua execuo no computador (por causa do compilador, conforme j aprendemos). Embora as linguagens de programao sejam chamadas de linguagens de alto nvel, devido sua proximidade com a linguagem humana, suas instrues vm em ingls... O ingls uma das diversas linguagens humanas, claro, mas pode oferecer um certo desconforto aos estudantes, principalmente aos que falam portugus, como o nosso caso... Existem diversas linguagens de programao. Cada uma pode ser mais adequada resoluo de problemas especficos, e recebem alguns rtulos por isso, como linguagens para aplicaes cientficas, linguagens para desenvolvimento de software bsico, linguagens para utilizao intensiva de recursos grficos, para manipulao de bancos de dados, etc, etc, e... linguagens para o ensino de programao! Veja a figura 6. um cdigo escrito em Pascal.
PROGRAM MenorValor; { Este programa seleciona o menor nmero em uma sequncia de inteiros} VAR BEGIN WRITE(Fornea um nmero inteiro: ); READLN(Valor); Menor := Valor; WHILE Valor <> -1 DO BEGIN IF Valor < Menor THEN Menor := Valor; WRITE(Fornea um nmero inteiro (flag=-1): ); READLN(Valor); END; {while} WRITELN(O menor valor lido foi: , Menor); END. Valor, Menor: INTEGER;

nmeros

Figura 6 Algoritmo expresso na Linguagem de Programao Pascal A figura 6 mostra um algoritmo expresso na linguagem de programao Pascal, ou seja, j um programa de computador. Observe a estrutura do programa: comea com PROGRAM, depois tem a seo VAR na qual as variveis so declaradas e depois vm as instrues contidas entre o BEGIN (incio) e o END. (fim.). Voc seria capaz de dizer o que este algoritmo faz? Quais as variveis que ele utiliza e de que tipo bsico elas so? (Dica: este programa faz a mesma coisa que o expresso pelo diagrama de Chapin e pelo fluxograma mostrados nas figuras 4 e 5). Agora observe o exemplo de um programa escrito na linguagem de programao C.

15

/* Este programa seleciona o menor nmero em uma sequncia de nmeros inteiros */ #include <stdio.h> int valor, menor;

void main (void) { printf (\n Fornea um nmero inteiro: ); scanf (%i, &valor); menor = valor; while (valor != -1) { if (valor < menor) menor = valor; printf(\nFornea um nmero inteiro (1 para terminar): scanf (%i, &valor); } printf (O menor valor lido foi: %i , menor); } Figura 7 Algoritmo expresso na Linguagem de Programao C

);

A figura 7 mostra um algoritmo expresso na linguagem de programao C, ou seja, tambm um programa de computador. Observe a estrutura do programa: comea com um comentrio, depois tem a incluso de uma biblioteca de funes, depois a declarao das variveis e em seguida vem a seo main na qual as instrues do programa esto contidas entre o { (incio) e o } (fim). Voc seria capaz de dizer o que este algoritmo faz? Quais as variveis que ele utiliza e de que tipo bsico elas so? (Dica: este programa faz a mesma coisa que o expresso pelo diagrama de Chapin, pelo fluxograma e pelo programa Pascal mostrados nas figuras 4, 5 e 6). O programa traz um comentrio dizendo explicitamente o que ele faz. Portanto, garanto que voc conseguiu responder primeira pergunta. Com relao s variveis que o programa utiliza e seu tipo bsico, observe a declarao int valor, menor; no programa. H duas variveis ali declaradas: valor e menor... o tipo bsico int ... um pouquinho de imaginao e int = inteiro! Que tal voc comparar o cdigo C com o cdigo Pascal? Semelhanas? Qual dos dois lhe pareceu mais fcil de entender? Bem, se sua resposta foi o cdigo Pascal, digo-lhe que o Pascal tem o "rtulo" de linguagem mais adequada ao ensino de programao... Se sua resposta foi o cdigo C, saiba que uma linguagem que foi criada para ser utilizada por programadores experientes... Mas... se voc teve dificuldade de entender ambos os cdigos, no se preocupe! O curso est apenas comeando e h muito o que se aprender de lgica de programao! Garanto que no final do curso este programa vai parecer muito, muito fcil para voc!

16

1.4.3. Expresso de Algoritmos atravs de Pseudo-linguagem Uma pseudo-linguagem uma notao para expresso de algoritmos para ser utilizada nas 3 primeiras etapas da programao definidas na seo 1.3, quais sejam, identificao de um problema do mundo real, confeco e teste do algoritmo. apresentada na forma de portugus estruturado. Embora seja uma pseudo-linguagem, possui estrutura, sintaxe e semntica semelhantes s de uma linguagem de programao. A principal diferena entre a pseudo-linguagem e a linguagem de programao que a primeira no possui um compilador. Isso significa que possvel expressar o raciocnio algortmico utilizando-se uma pseudo-linguagem, mas o programa no pode ser executado no computador. So muitas as vantagens de se utilizar uma pseudo-linguagem para escrever algoritmos: uma linguagem independente de mquina; o programador pensa somente no problema a ser resolvido sem se preocupar com possveis restries do compilador ou do hardware (computador); O programador tem que conhecer a sintaxe, a semntica e a estrutura da pseudo-linguagem, mas tem total liberdade para criar novos comandos ou usar instrues em alto nvel (ou em forma de frases): por um lado ele vai se acostumando com a rigidez da sintaxe das linguagens de programao, mas por outro lado, tem a liberdade de expressar seu raciocnio sem esbarrar em limitaes de contexto; Uma vez estando pronto o algoritmo na pseudo-linguagem, a sua implementao no computador (etapas 4 e 5 da programao: confeco e execuo do programa) fica muito facilitada, pois toda a lgica j foi desenvolvida e testada e somente uma traduo para a linguagem de programao-alvo se faz necessria. Veja o exemplo de um algoritmo escrito na pseudo-linguagem PortuC, apresentado na figura 8. A figura 8 mostra um algoritmo expresso na pseudo-linguagem PortuC. Observe a estrutura do algoritmo: comea com um comentrio dizendo o que o algoritmo faz, tem a declarao das variveis e depois vem a seo principal ( ) em que so apresentadas as instrues contidas entre o { (incio) e } (fim) do algoritmo. Voc seria capaz de dizer o que este algoritmo faz? Quais as variveis que ele utiliza e de que tipo bsico elas so? (Dica: este algoritmo faz a mesma coisa que o expresso pelo diagrama de Chapin, pelo fluxograma, pela linguagem Pascal e pela linguagem C mostrados nas figuras 4, 5, 6 e 7). Este algoritmo em PortuC corresponde ao programa em C mostrado na figura 7. Observe a grande semelhana entre eles. Essa semelhana proposital, com certeza. O PortuC quase que a traduo de um programa C para o portugus. As vantagens de se utilizar o PortuC so muitas. Pense sobre elas, pois o PortuC ser nosso maior aliado no aprendizado de algoritmos!

17

/* Este programa seleciona o menor nmero em uma sequncia de nmeros inteiros */ int valor, menor;

principal( ) { imprima (Fornea um nmero inteiro: ); leia (%i, &valor); menor = valor; enquanto (valor != -1) { se (valor < menor) menor = valor; imprima (Fornea um nmero inteiro(1 para terminar): leia (%i, &valor); } imprima(O menor valor lido foi: %i , menor); } Figura 8 Algoritmo expresso na pseudo-linguagem de PortuC

);

Um exerccio interessante para voc fazer agora, seria visitar os exemplos deste algoritmo escritos no diagrama de Chapin e no fluxograma e compar-los com o PortuC... Diga-me qual deles mais fcil de entender? Qual dessas formas de expresso de algoritmos voc escolheria?

1.5. Os algoritmos sero expressos em pseudo-linguagem


Em funo de tudo o que foi dito e aps conhecermos as 3 formas de expresso de algoritmos, usaremos pseudo-linguagem para escrevermos nossos primeiros algoritmos! As justificativas dessa nossa escolha so muitas e foram j fundamentadas. A pseudolinguagem PortuC utiliza o portugus, numa forma estruturada, e tem estrutura, sintaxe e semntica muito semelhantes s da linguagem de programao C. Apesar do Pascal ter se consagrado como uma linguagem adequada para o ensino da programao aos estudantes que a iniciam, ou seja, como primeira linguagem de programao, a linguagem C, antes restrita comunidade cientfica, ganhou uma popularidade inquestionvel na dcada de 1990, que se estende aos dias atuais, pois a base de novas linguagens como o Java, o C# e at o Android.

18 Em funo disto, a linguagem C passou a ser alvo do interesse dos estudantes. A resistncia, que j existiu, em utiliz-la como primeira linguagem de programao pelos professores, se deveu, em parte, ao fato de seus criadores, Dennis Ritchie e Brian Kernighan, terem afirmado que C retm a filosofia bsica de que os programadores sabem o que esto fazendo1. Bem, se considerarmos que programadores iniciantes no tm condies de saber com segurana o que esto fazendo, exatamente pelo fato de serem inexperientes, a adoo da linguagem seria realmente questionvel. No entanto, as linguagens de programao evoluram bastante e as mais utilizadas hoje, como o Java e o C#, tm como base a linguagem C. Alm disso, a adoo de um mtodo adequado e coerente para o ensino da programao de computadores pode atuar como um facilitador do processo de aprendizagem, permitindo que uma linguagem mais complexa, como o C, possa ser ensinado sem oferecer obstculos aprendizagem. Assim, a adoo do PortuC, nossa pseudo-linguagem, e da metodologia de ensino proposta pela professora, viabiliza a adoo da linguagem de programao C como primeira linguagem. Isso vai ao encontro das expectativas dos estudantes e coloca o ensino da programao na direo da atual tendncia da programao de computadores que vem utilizando, cada vez mais, o C como base dos novos e modernos paradigmas de programao. O PortuC, alm de oferecer o conforto de utilizar nossa lngua-ptria, o que o torna muito familiar ao programador, no requer a memorizao das abominveis formas geomtricas e setas e mais setas dos diagramas... Fique tranquilo, meu estudante, mais duas lies e voc j estar fazendo seus primeiros programas de computador!

Kernighan, B. , Ritchie, D. C- A Linguagem de Programao Padro ANSI, So Paulo: Campus, 1989.

19

Lista de Exerccios 1.1


1.1.1) 1. Tambm houve 21 de Abril de 1984 no Brasil?? 2. Quantos aniversrios teve uma pessoa que viveu 50 anos? 3. Alguns meses tem 31 dias, quantos tm 28? 4. Quantos noves (9) existem entre 0 e 100? 5. correto que um homem se case com a irm de sua viva? 6. Divida 30 por 1/2 e some 10. Qual o resultado? 7. Se h 3 mas e pega em 2, quantas tem? 8. Um mdico receita trs comprimidos e diz para tomar um a cada meia hora, quantos minutos duram os comprimidos? 9. Um pastor tem 17 ovelhas. Todas morrem, menos 9. Quantas ficam? 10. Quantos animais de cada espcie Moiss colocou na arca? 11. Quantos selos de sessenta centavos h numa dzia?

1.1.2) 01. Meu pai tem 42 anos de idade. Meu cachorro tem 8. Se fosse um ser humano, a idade de meu cachorro seria 56 anos. Quantos anos teria meu pai se ele fosse um cachorro? a. 5 b. 6 c. 7 d. 8 e. 9 02. Um senhor, olhando para um retrato, diz: O pai deste homem o pai de meu filho. Ele est olhando para: a. seu prprio retrato b. retrato de seu pai c. retrato de seu filho d. retrato de seu av e. retrato de seu neto 03. No segundo domingo do ms de maio, comemora-se o dia das mes. Este dia, poder cair: a. de 7 a 14 de maio b. de 8 a 15 de maio c. de 8 a 14 de maio d. de 6 a 15 de maio e. de 7 a 13 de maio

20
04. Certa bactria se multiplica to rapidamente que seu nmero dobra a cada minuto. Num caco de vidro ela se multiplica de tal maneira que, em 60 minutos enche a metade do mesmo. Em quanto tempo estar cheio totalmente? a. 61 min b. 90min c. 120min d. 180 min e. 240 min 05. Em uma jarra cabem um litro mais meia jarra. A capacidade da jarra : a. 1 litro b. 1,5 litros c. 2 litros d. 2,5 litros e. 3 litros 06. Numa rvore pousam pssaros. Se pousarem 2 pssaros em cada galho, fica um galho sem pssaros. Se pousar um pssaro em cada galho, fica um pssaro sem galho. O nmero de pssaros : a. 2 b. 3 c. 4 d. 5 e. 6 07. Sabendo-se que seis raposas, em seis minutos, pegam seis galinhas, pergunta-se: quantas raposas em cem minutos pegaro cem galinhas ? a. 100 b. 36 c. 18 d. 6 e. 1 08. Uma pessoa que gosta somente das pessoas que no gostam de si mesmas: a. gosta de si mesma b. no gosta de si mesma c. gosta de algum d. no gosta de ningum e. no existe 09. Em uma urna existem 38 bolas que se diferenciam apenas pela cor: 15 vermelhas, 15 amarelas e 8 azuis. Uma pessoa com os olhos vendados retira uma bola de cada vez da caixa. Qual o nmero mnimo de bolas que deve ser retirado para que ela tenha certeza que saram duas bolas da mesma cor? a. 16 b. 9 c. 8 d. 4 e. 3

21
10. Dispem-se de alguns livros de Fsica do autor A, outros do autor B e outros do autor C. Da mesma forma, temos alguns livros de Qumica do mesmo autor A, outros de B e outros de C. Todos os livros devem ser colocados em duas caixas com o seguinte critrio: na primeira caixa deve-se colocar todos os livros que satisfaam a seguinte condio: "se for do autor A, ento no pode ser de Fsica". Na segunda caixa, os livros que no satisfaam a essa proposio. A primeira caixa deve conter exatamente: a. todos os livros de Fsica ou de Qumica dos autores B e C mais todos os livros de Qumica do autor A. b. todos os livros de Qumica do autor A mais todos os livros de Fsica dos autores B e C. c. todos os livros de Fsica dos autores B e C. d. todos os livros de Fsica do autor A. e. todos os livros de Qumica dos autores A, B e C. 11. Escreva o nmero seguinte nessa seqncia 0, 1, 1, 2, 3, 5, 8, a. 9 b. 10 c. 11 d. 12 e. 13 12. Guilherme, lvaro e Man acabaram de terminar um lanche. Um dos trs rapazes comeu um lanche de presunto, outro um lanche de peru, e o terceiro, um lanche de frango. Apenas uma das afirmaes abaixo verdadeira: Guilherme comeu o lanche de peru Guilherme no comeu o lanche de frango lvaro no comeu o lanche de frango lvaro no comeu o lanche de presunto Ento, Guilherme, lvaro e Man comeram respectivamente, os lanches de: a. presunto, frango, peru b. presunto, peru, frango c. peru, frango, presunto d. peru, presunto, frango e. frango, presunto, peru

13. Escreva o nmero seguinte nessa seqncia 0, 1 , 1 , 2, 4, 7, 13, 24, a. 44 b. 45 c. 46 d. 47 e. 48 14. Um missionrio foi capturado por canibais em uma floresta. Os canibais ento fizeram-lhe a seguinte proposta: - Se fizer uma declarao verdadeira, ser cozido com batatas. - Se fizer uma declarao falsa, ser assado na churrasqueira. Como o missionrio usar a lgica, podemos concluir que: a. ser cozido b. ser assado c. no poder ser cozido nem assado d. ser cozido e assado ao mesmo tempo e. Dir: " ruim, hein?"

22
15. O algarismo das unidades do nmero N =1 x 3 x 5 x 7 x 9 x ...... x 999 a. 1 b. 3 c. 5 d. 7 e. 9 16. Continuando a seqncia de letras F, N, G, M, H . . ..., ..., temos, respectivamente: a. O, P. b. I, O. c. E, P. d. L, I. e. D, L. 17. Continuando a sequncia 4, 10, 28, 82, ..., temos: a. 236 b. 244 c. 246 d. 254 e. 256 18. Em uma avenida reta, a padaria fica entre o posto de gasolina e a banca de jornal, e o posto de gasolina fica entre a banca de jornal e a sapataria. Logo: a. a sapataria fica entre a banca de jornal e a padaria. b. a banca de jornal fica entre o posto de gasolina e a padaria. c. o posto de gasolina fica entre a padaria e a banca de jornal. d. a padaria fica entre a sapataria e o posto de gasolina. e. o posto de gasolina fica entre a sapataria e a padaria. 19. Um tcnico de futebol, animado com as vitrias obtidas pela sua equipe nos ltimos quatro jogos, decide apostar que essa equipe tambm vencer o prximo jogo. Indique a Informao adicional que tornaria menos provvel a vitria esperada. a. Sua equipe venceu os ltimos seis jogos, em vez de apenas quatro. b. Choveu nos ltimos quatro jogos e h previso de que no chover no prximo jogo. c. Cada um dos ltimos quatro jogos foi ganho por uma diferena de mais de um gol. d.O artilheiro de sua equipe recuperou-se do estiramento muscular. e. Dois dos ltimos quatro jogos foram realizados em seu campo e os outros dois, em campo adversrio. 20. Todos os que conhecem Joo e Maria admiram Maria. Alguns que conhecem Maria no a admiram. Logo: a. todos os que conhecem Maria a admiram. b. ningum admira Maria. c. alguns que conhecem Maria no conhecem Joo. d. quem conhece Joo admira Maria. e. s quem conhece Joo e Maria conhece Maria.

23 Resposta do Exerccio 1

Exerccio 1: Qual o padro de comportamento utilizado para gerar as sequncias? 1, 5, 9, 13, 17, 21, 25 ...

A srie de nmeros comea com 1 (primeiro termo) Para se gerar qualquer um dos outros termos da srie, basta somar 4 ao nmero imediatamente anterior. Esta uma srie infinita. Seu fim deve ser determinado por uma condio do tipo gerar os 10 primeiros termos da srie ou gerar todos os termos da srie menores que 100

1, 1, 2, 3, 5, 8, 13, 21, 34 ...

A srie de nmeros comea com 1 (primeiro termo). O segundo termo tambm 1. Para se gerar qualquer um dos outros termos da srie, basta somar os dois termos imediatamente anteriores
Exemplos: 1 (primeiro termo) + 1 (segundo termo) =2 (terceiro termo) 1 (segundo termo) + 2 (terceiro termo) = 3 (quarto termo) 2 (terceiro termo) + 3 (quarto termo) = 5 (quinto termo)

Esta uma srie infinita, conhecida como srie de Fibonacci. Seu fim deve ser determinado por uma condio do tipo gerar os 10 primeiros termos da srie ou gerar todos os termos da srie menores que 100

24

Captulo 2 Pseudo-linguagem de Programao: PortuC


Caro aluno, suponha que voc ganhou de presente uma viagem para os Estados Unidos. O que voc deveria fazer antes de ir para l? Estudar ingls! J que os americanos falam esta lngua, claro. Ento, neste nosso curso, voc est ganhando a chance nica de aprender a programar...ento este captulo o convida a aprender PortuC, que a lngua que os algoritmos (que so as bases dos programas de computador) falam! O PortuC , basicamente, uma traduo da linguagem C para Portugus. Assim, aprendendo bem o PortuC, voc j estar se preparando para aprender a prpria linguagem C, de forma simples e fcil!

2.1. Identificadores
Todo programa de computador manipula dados que so armazenados em variveis. Uma varivel precisa ter um nome que a identifique de forma nica no programa: o identificador. Um identificador em PortuC formado por caracteres alfanumricos. O primeiro caracter tem que ser uma letra; os outros caracteres podem ser: letras: A-Z, a-z dgitos: 0-9 sublinhado: _ No pode haver dois identificadores iguais. Letras minsculas e letras maisculas so diferentes Os identificadores no podem ser acentuados. No pode haver espao em branco num identificador. O caracter no pode ser usado num identificador. Um identificador no pode ter o mesmo nome das palavras reservadas do PortuC (como principal, se, seno, inteiro, real...).

25 Exemplos de identificadores vlidos: NOME, raiz1, letra4, Total_dos_Salarios, Nome_de_Familia Exemplos de identificadores invlidos: 4pontos (comea com nmero) CUSTO FINAL (tem espao em branco) PreoTotal (caracter no pode ser usado) Pessoa+Alta (caracter + no pode ser usado) Preco-caro (caracter - no permitido) Total_dos_salrios (palavra acentuada) inteiro (palavra reservada do PortuC)

2.2. Tipos Bsicos e Declarao de Variveis


Os dados manipulados por um programa so armazenados em variveis. As variveis precisam ter um nome (identificador), um tipo associado e precisam ser declaradas antes que possam ser utilizadas. H trs tipos bsicos que podem ser associados s variveis: inteiro real caracter Para se declarar uma varivel escreve-se o nome de seu tipo, salta-se um espao em branco, em seguida escreve-se o nome do seu identificador e ; para finalizar a declarao. Se mais de uma varivel for do mesmo tipo bsico, elas podem ser declaradas juntas, apenas separadas por vrgulas ,. Toda varivel precisa ser declarada antes de ser utilizada. No pode haver duas variveis com mesmo nome, mesmo que tenham tipos bsicos diferentes, a menos que algum caracter maisculo ou minsculo as diferencie.

Exemplos de declarao de variveis vlidos: caracter NOME[20], letra; inteiro soma; real raiz1, Total_dos_Salarios; caracter Nome_de_familia[30]; Exemplos de declarao de variveis INVLIDOS: caracter NOME[20]; letra4; (o separador de identificadores deve ser a vrgula) inteiro: SOMA; (no pode haver o sinal de dois-pontos aps o nome do tipo) raiz1, Total_dos_Salarios real; (o tipo bsico deve vir antes dos identificadores) carater Nome_de_Familia[30]; (o nome do tipo bsico est errado) real SOMA; (a varivel SOMA j foi declarada: um identificador no pode ser duplicado)

26

2.3. Comando de Atribuio


O contedo das variveis do programa pode ser determinado atravs de dois tipos de comandos: comando de atribuio e comandos de leitura. O comando de atribuio permite que um determinado valor seja armazenado numa varivel. O smbolo do comando de atribuio = No se deve atribuir a uma varivel um valor que NO seja compatvel com o tipo bsico desta varivel, ou seja, nmeros inteiros devem ser atribudos a variveis do tipo inteiro; nmeros reais devem ser atribudos a variveis do tipo real; frases e letras devem ser atribudas a variveis do tipo caracter. Caso no haja compatibilidade de entre o dado e o tipo da varivel, podem acontecer efeitos indesejados. Ento, muito cuidado, pois neste tipo de atribuio ocorre a CONVERSO AUTOMTICA DE TIPOS e o que chega na varivel de destino pode ser um desastre! Toda varivel deve ter um valor a ela atribudo antes de ser usada no programa Em variveis reais, S EXISTE PONTO DECIMAL; no se pode usar vrgula decimal.

Exemplos de atribuies vlidas: letra = L; soma = 0; Total_dos_Salarios = 1275.50; NOME = Luiza; Exemplos de atribuies INVLIDAS: NOME = Maria; (a cadeia de caracteres tem que estar entre ) NOME = Maria; (o smbolo que delimita a cadeia de caracteres no pode ser apstrofo, devem-se usar aspas) Total_dos_Salarios = 1275.50; (o valor a ser atribudo a uma varivel numrica no pode estar entre apstrofos nem entre aspas) Total_dos_Salarios = 1275,50; (no existe vrgula decimal, o certo usar ponto . decimal) soma = 10.0; (numa varivel do tipo inteiro (como o caso da varivel soma) no pode haver parte decimal; este caso est sujeito converso automtica) soma := 0; (o smbolo do comando de atribuio = e no :=)

27

2.4. Operadores Aritmticos


Os operadores aritmticos permitem que expresses da Matemtica sejam atribudas s variveis. Os operadores aritmticos implementam as operaes bsicas (adio, subtrao, diviso e multiplicao) e algumas operaes mais avanadas da Matemtica (como logaritmo, raiz quadrada, seno, cosseno, etc...). A varivel que vai receber o resultado de uma operao aritmtica tem que ser de um tipo numrico compatvel, capaz de armazenar o valor resultante, seno poder ocorrer uma converso automtica com resultados muitas vezes indesejados ou mesmo imprevisveis. Os operadores aritmticos bsicos so: + (adio) (subtrao)

* (multiplicao) / -(diviso real)

++ (adiciona 1) (subtrai 1) Alguns operadores aritmticos mais avanados so: % (resto da diviso inteira) / (quociente da diviso inteira) sqrt( ) (raiz quadrada) abs( ) (valor absoluto)

Exemplos de expresses aritmticas vlidas: resto = 10 % 3; quociente = 10 / 3; salario = ((totaldehoras*32.50)+102.00) - descontoinss; valoremdolares = salario / 1.85; impostoderenda = salario * (0.20); nome = nome + da silva; contador = contador +1; ++contador; --contador; raiz = sqrt(numero);

28 Exemplos de expresses aritmticas INVLIDAS: resto = 10.0 % 3; (o operador % s pode envolver nmeros inteiros) valoremdolares = salario / 1,85; (no existe vrgula decimal, o separador sempre o ponto . decimal) salario = totaldehoras *+ 32.50; (os operadores * e + so didicos, envolvem sempre dois operadores, portanto no podem ser utilizados juntos) nome = nome * 3; (em variveis do tipo caracter s pode ser feita adio ou subtrao de caracteres) contador = *1; (o operador * didico, tem que envolver dois operandos)

2.5. Operadores Lgicos


Os operadores lgicos permitem que os trs principais operadores da lgebra de Boole possam ser utilizados num programa: E, OU e NO. O estado dos operandos e o resultado de uma operao lgica sempre FALSO (avaliado como zero) ou VERDADEIRO (avaliado como diferente de zero). Os operadores lgicos so: e ou ! (conjuno) (disjuno) (negao)

O operador binrio e envolve sempre dois operandos e o resultado VERDADEIRO somente quando ambos os operandos so VERDADEIROS, ou seja, basta que um operando seja FALSO para que o resultado seja FALSO. O operador binrio ou envolve sempre dois operandos e o resultado FALSO somente quando ambos os operandos so FALSOS, ou seja, basta que um operando seja VERDADEIRO para que o resultado seja VERDADEIRO. O operador unrio ! muda o estado do operando de FALSO para VERDADEIRO ou de VERDADEIRO para FALSO.

Caro aluno, aqui cabe uma explicao um pouco mais detalhada para melhorar o entendimento dos operadores lgicos E, OU e ! (no):

29 Uma varivel lgica aquela que pode assumir apenas os valores VERDADEIRO ou FALSO. Na prtica, as variveis lgicas so utilizadas para descrever o funcionamento de um sistema, como um circuito formado por uma bateria e uma lmpada:

A representao dos nveis lgicos (1=verdadeiro e 0=falso) pode ser melhor entendida atravs de chaves que representam um circuito. Se a chave est fechada (valor 1 ou valor VERDADEIRO), a corrente pode passar, o pode permitir que a lmpada se acenda. Se a chave est aberta (valor 0 ou valor FALSO), a corrente no pode passar, o que pode impedir que a lmpada se acenda.

30 Uma funo E resulta em 1=VERDADEIRO se, e somente se, todas as variveis lgicas de entrada tiverem valor 1=VERDADEIRO. Em outras palavras: a lmpada do circuito s acende se ambas as chaves estiverem fechadas, o que caracteriza um circuito com chaves em sequncia como o mostrado abaixo. (Na funo E somente se ambas as entradas forem verdadeiras, a expresso avaliada como verdadeira).

Uma funo OU resulta em 1=VERDADEIRO se pelo menos uma das variveis lgicas de entrada tiverem valor 1=VERDADEIRO. Em outras palavras: a lmpada acende se uma das chaves estiver fechada ou quando as duas estiverem fechadas (forem verdadeiras), o que caracteriza um circuito com chaves em paralelo como o mostrado abaixo. (Na funo OU basta que uma entrada seja verdadeira para a expresso ser avaliada como verdadeira).

31

Uma funo ! (no) uma operao de inverso. Ela converte o estado ou valor de uma varivel lgica em seu inverso lgico: de VERDADEIRO para FALSO e de FALSO para VERDADEIRO. No caso do circuito funciona assim: se a chave est aberta, ela se fecha e acende a luz, e, se est fechada, ela se abre e apaga a luz.

Exemplos de expresses lgicas vlidas: se (altura > 1.80 e idade < 21 e escolaridade >= 2) se (idade >= 13 e idade <=20) se ((media >= 7.0 e faltas <= 18) ou foiDispensado == 1) se !( numero % 2 == 0) Exemplos de expresses lgicas INVLIDAS: se (altura > 1.80 e ou idade < 21) (os operadores e e ou so binrios, envolvem sempre 2 operandos, portanto no podem ser utilizados juntos) se (idade >=13 e <= 20) (a varivel idade deveria ser repetida para se obter o resultado lgico da comparao)

32

2.6. Operadores Relacionais


Os operadores relacionais permitem a comparao entre contedos de variveis ou de valores, e resultam sempre num resultado FALSO (avaliado como zero) ou VERDADEIRO (avaliado como diferente de zero). Os operadores relacionais so: > >= < <= == (maior que) (maior ou igual a) (menor que) (menor ou igual a) (igual a)

!= (diferente de)

Importante: o sinal = corresponde ao comando de atribuio e o sinal == que significa comparao!


Exemplos de expresses relacionais vlidas: se (resposta == S) se (resposta == S ou resposta == s) se (resposta != S e resposta != s) se (sexo == F e altura <= 1.50) Exemplos de expresses relacionais INVLIDAS: se (resposta ! = S) (o smbolo do operador diferente est errado: no pode haver espao em branco entre o ! e o =) se (altura < = 1.50) (o smbolo do operador menor que est errado: operador no pode haver espao em branco entre o < e o =) se (resposta = S) (o problema aqui o uso do smbolo = que do comando de atribuio e no == que a igualdade... na verdade o comando no est errado, mas est sendo feita uma atribuio e no uma comparao. Portanto, muito cuidado!)

33

2.7. Comando Condicional


O comando condicional permite que se tomem 2 caminhos diferentes e mutuamente exclusivos a partir da avaliao de uma condio. Se a condio avaliada como verdadeira um caminho seguido, se avaliada como falsa outro caminho escolhido, nunca ambos! A associao do comando condicional com fatos rotineiros imediata: Se estiver chovendo eu vou de carro, seno eu vou de bicicleta, neste exemplo, a pessoa avalia a condio do tempo antes de decidir se sair de carro ou de bicicleta e no h possibilidade dela sair com ambos os meios de transporte!

A sintaxe do comando condicional : se (<condio>) { <bloco de comandos 1> } seno { <bloco de comandos 2> } A semntica (como funciona) do comando condicional : 1. A <condio> avaliada como VERDADEIRA (valor diferente de zero) ou FALSA (valor igual a zero); 2. Se a <condio> for VERDADEIRA, o <bloco de comandos 1> executado e o comando condicional finalizado; 3. Se a <condio> for FALSA, o <bloco de comandos 2> executado e o comando condicional finalizado. seno clusula do comando se, ou seja, no comando, apenas faz parte do comando se. A clusula seno pode no existir num comando se. Neste caso, (quando no existe a clusula seno), quando a <condio> avaliada como FALSA, nenhum comando executado e o comando se finalizado. Os delimitadores de incio { e de fim } so obrigatrios quando existe mais de um comando no <bloco de comandos 1> ou mais de um comando no <bloco de comandos 2>. Quando existir apenas um comando, os delimitadores ficam opcionais.

34 Exemplos de comandos condicionais VLIDOS: se (media >= 7.0) aprovado = 1; se (media >= 7.0) { aprovado = 1; } se (media >= 7.0) { aprovado = 1; ++contadoraprovados; } se (media >= 7.0) aprovado = 1; seno aprovado = 0; se (media >= 7.0) { aprovado = 1; ++contadoraprovados; } seno aprovado = 0; se (media >= 7.0 e faltas <= 9) { aprovado = 1; ++contadoraprovados; } seno { aprovado = 0; ++contadorreprovados; } Exemplos de comandos condicionais INVLIDOS: se media >= 7.0 aprovado = 1;

(faltou colocar parnteses na condio)

se (media >= 7.0) { aprovado = 1; ++contadoraprovados; (faltou colocar o delimitador de fim { no final do comando )

35

se (media >= 7.0) aprovado = 1 seno aprovado = 0; (faltou ; depois do comando aprovado = 1)

se (media >= 7.0) { aprovado = 1; ++contadoraprovados; } seno aprovado = 0 (novamente faltou ; aps o comando aprovado = 0) se (media >= 7.0 e faltas <= 9) { aprovado = 1; ++contadoraprovados; } seno aprovado = 0; ++contadorreprovados; } (faltou o delimitador { aps o seno) se (media >= 7.0) aprovado = 1; ++contadoraprovados; seno aprovado = 0 (faltaram os delimitadores { } aps a condio do comando se caso verdadeiro (antes do seno))

2.8. Comando de Repetio


O comando de repetio permite que um comando ou um bloco de comandos seja executado diversas vezes. O nmero de vezes determinado por uma condio que constantemente avaliada. Enquanto a condio for avaliada como verdadeira (ou diferente de zero), o comando ou bloco de comandos executado repetidamente; quando a condio fica falsa, o comando de repetio para.

36 A associao do comando de repetio com fatos rotineiros possvel: Enquanto o nmero da casa for menor que o procurado, continue subindo a rua e verificando se a casa procurada, neste exemplo, a pessoa avalia a condio que a verificao do nmero desejado entre diversas casas de uma rua, por exemplo; essa avaliao continua at que a casa procurada seja encontrada ou que se encontre uma casa cujo nmero seja superior ao procurado, supondo que a numerao esteja em ordem crescente. A sintaxe do comando de repetio : enquanto (condio) { <bloco de comandos> } A semntica (como funciona) do comando de repetio : 1. A condio avaliada como VERDADEIRA (diferente de zero) ou FALSA (igual a zero); 2. Se a condio for VERDADEIRA, o <bloco de comandos> executado e, ao se chegar ao delimitador de fim } ou final do comando, automaticamente se retorna avaliao da condio; 3. Se a condio for FALSA, o comando de repetio finalizado. Dentre os comandos do <bloco de comandos> ESSENCIAL que exista um comando que altere a <condio> que constantemente avaliada, pois, caso contrrio, o comando enquanto NUNCA TERMINAR! Os delimitadores { e } so obrigatrios quando existe mais de um comando no <bloco de comandos>. Quando existir apenas um comando, os delimitadores ficam opcionais e o ; funcionar como delimitador de fim, indicando o final do comando enquanto.

Exemplos de comandos de repetio vlidos: enquanto (contador < 3) ++contador; numero = 1; enquanto (numero <= 50) { se (numero % 2 == 0) ++contapar; seno ++contaimpar; ++numero; }

37 Exemplos de comandos de repetio INVLIDOS: enquanto contador <= 10 ++contador; (faltaram parnteses na condio) numero = 1; enquanto (numero <= 50) { se (numero % 2 == 0) ++contapar; seno ++contaimpar; ++numero; (faltou colocar o delimitador fim } aps o ltimo comando... ) numero = 1; enquanto (numero <= 50) se (numero % 2 == 0) ++contapar; seno ++contaimpar; ++numero; ( como no existem os delimitadores de incio e fim { }, somente o comando se faz parte do comando enquanto e, como o comando se no altera a varivel numero, o comando enquanto nunca vai parar!) numero = 1; enquanto (numero <= 50); { se (numero % 2 == 0) ++contapar; seno ++contaimpar; ++numero; } ( como foi colocado ; aps a condio, o comando enquanto foi finalizado, a varivel numero no ser alterada e o comando enquanto nunca vai parar!)

38

2.9. Comandos de Entrada e Sada


O comando de entrada permite que o usurio possa fornecer valores ao programa, atravs do teclado, que sero armazenados nas variveis. O comando de sada permite que informaes e valores de variveis possam ser enviados ao usurio pela tela do monitor. dessa forma que se consegue estabelecer um dilogo com o usurio. Se o programa deseja saber o nome do usurio, por exemplo, usa-se o comando de sada para fazer a pergunta Qual o seu nome? e usa-se o comando de entrada para obter a resposta e armazen-la numa varivel. A sintaxe do comando de entrada : leia(%letra, [&] varivel); em que: %letra representa os especificadores de formato e depende do tipo associado varivel: %d ou %i para variveis do tipo inteiro (integer) %f para variveis do tipo real (float) %c para variveis do tipo caracter (nico) (character) %s para variveis do tipo caracter (cadeia ou string) O smbolo & deve ser utilizado apenas para os tipos numricos, ou seja, para variveis declaradas como inteiro ou real. A semntica (como funciona) do comando de entrada : 1. A varivel tem que ter sido previamente declarada; 2. O usurio vai se utilizar do teclado para fornecer o dado e, depois que ele teclar <ENTER>, tudo o que ele tiver digitado ser armazenado na varivel automaticamente. Recomenda-se utilizar o comando leia para ler uma s <varivel> de cada vez.

39 A tabela abaixo mostra um exemplo de declarao de variveis de tipos bsicos e a forma correta de leitura. Declarao inteiro numero; real valor; caracter ch; Leitura leia(%i, &numero); leia(%f, &valor); leia(%c, ch); Exemplos de contedos numero = -5; numero = 2002; valor = -5.867; valor = 2002.50; ch = 5; ch = s; ch = #; nome = Maria; nome = fim;

caracter nome[20];

leia(%s, nome);

Observe na tabela a diferena entre a declarao, leitura e atribuio de valores a um caracter nico (%c) e a uma cadeia de caracteres (%s). Um nico caracter vem entre apstrofos e uma cadeia de caracteres entre aspas !
A sintaxe do comando de sada : imprima( frase e %letra [, lista de variveis] );

Entre podem ser escritas frases formadas por palavras intercaladas pelos especificadores de formato %s, %c, %i, %d ou %f descritos no comando leia. Para cada especificador utilizado, a varivel do tipo correspondente deve constar da lista de variveis. A lista de variveis opcional; deve existir somente quando um especificador de formato colocado na frase entre aspas e, neste caso, deve haver uma vrgula separando a frase da lista de variveis e vrgulas separando as variveis da lista. A semntica (como funciona) do comando de sada : 1. Pode ser impressa qualquer frase e qualquer varivel dentro de um comando imprima, desde que a frase esteja entre aspas e as variveis estejam devidadmente listadas aps a vrgula que separa a frase da lista de variveis; 2. A frase entre aspas copiada integralmente para a tela e os especificadores de formato so substitudos pelas variveis da lista de variveis; 3. Quando existe uma varivel, o seu contedo copiado para a tela; 4. A ordem em que as palavras da frase e as variveis aparecem no comando imprima mantida quando impressa na tela.

40 Exemplos de comandos de entrada e sada vlidos: imprima (Qual o seu nome? ); leia(%s,nome); imprima (Qual a sua idade? ); leia (%i,&idade); imprima (Qual a sua altura? ); leia (%f,&altura);

imprima (Qual o seu sexo? (F/M) ); leia (%c,sexo); imprima (O seu nome : %s e voc tem %i anos ,nome, idade); imprima (Voc foi aprovado no curso com mdia= %f, Media); Exemplos de comandos de entrada e sada INVLIDOS: imprima (Qual o seu nome? ); (faltaram aspas aps a interrogao para delimitar a frase a ser impressa) imprima (Qual a sua idade? ); leia (%i,idade); (faltou o & antes do identificador idade, pois o tipo numrico: %i) imprima (A sua idade %i idade); (faltou uma vrgula entre a frase entre aspas e a varivel idade)

imprima (Voc foi aprovado no curso com mdia= , media); (faltou o especificador de formato da varivel Media (%f) aps o = na frase entre aspas) imprima (Qual o seu nome? ); leia (%s,&nome); (no pode haver & na leituras de variveis do tipo caracter (%c e %s) )

41

Explicao passo-a-passo do comando de impresso: imprima (frase varivel1 varivel2 varivel3);


entre a frase e a varivel e entre as variveis deve haver uma vrgula separando-as

imprima (frase , varivel1, varivel2, varivel3);


a frase deve vir entre

imprima (frase , varivel1, varivel2, varivel3);


dentro da frase deve vir um formato para cada varivel, compatvel com o seu tipo bsico

imprima (frase %s %i %f ,varivel1,varivel2,varivel3);


Exemplo:
imprima (Vc se chama %s, tem %i anos e %f m de altura , nome, idade, altura);

2.10. Separador de comandos


Todos os comandos do PortuC so separados por ponto-e-vrgula. O separador de comandos : ; Exemplos de erro na separao de comandos: se (resposta != s); { <comandos> } (o ; depois da condio finaliza o comando se) enquanto (contador < 5) ; { <comandos> } (o ; depois da condio do comando enquanto coloca o programa em loop infinito!)

42

2.11. Comentrios
Os comentrios no pertencem s instrues do algoritmos, mas so teis para que o programador explique o que est sendo feito. Os comentrios podem vir delimitados entre /* */ Ou podem ser comentrios de linha //

Exemplos de comentrios: /* Este trecho calcula a media de notas */ desc = preco*0.15; // calcula desconto de 15%

2.12. Bloco de Programa


Bloco de programa o nome que se d estrutura de um programa escrito numa determinada linguagem. O bloco de programa em PortuC pode ser visto abaixo.

O Bloco de Programa em PortuC tem a forma: /* comentrios */ <declarao de variveis>; principal() { <bloco de comandos>; } desejvel que todo algoritmo escrito em PortuC deva comear com um comentrio dizendo o que o programa faz, embora comentrios sejam opcionais. Em seguida devem ser declaradas todas as variveis que sero utilizadas no <bloco de comandos>. Aps a declarao das variveis deve-se escrever a palavra principal( ), que delimita a seo em que os comandos podem ser utilizados. O <bloco de comandos> pode conter todos os comandos vlidos em PortuC, separados por ; e estes devem estar contidos entre os delimitadores { e }. Nenhum comando pode ser usado fora desta seo. importante notar que letras maisculas e minsculas alteram os identificadores e as palavras reservadas do PortuC.

43 Exemplos de programas escritos em PortuC vlidos: /* sexo.c: le o nome e o sexo de uma pessoa e imprime uma frase dizendo se masculino, feminino ou invalido */ caracter nome[20], sexo; principal ( ) { imprima (Qual eh o seu nome? ); leia(%s,nome); imprima (Qual eh o seu sexo? (f/m) ); leia (%c,sexo); se (sexo == f ou sexo == F) imprima (%s voce eh do sexo feminino. ,nome); seno se (sexo == m ou sexo == M) imprima (%s voce eh do sexo masculino. ,nome); seno imprima (Voce digitou um sexo invalido ); imprima(Fim do programa.); }

/* nota.c: le a nota de um aluno e verifica se ele foi aprovado ou reprovado */ real nota; principal() { imprima (Digite sua nota final: ); leia(%f,&nota); se (nota >= 6.0) imprima (Voce foi aprovado! ); seno imprima (Voce foi reprovado... ); imprima( Fim do programa.); }

44 /* idade.c: le o ano atual e o ano de nascimento de uma pessoa e imprime uma frase dizendo qual eh a idade da pessoa */ inteiro anoatual, anonasc, idade; principal() { imprima (Qual eh o ano atual? ); leia(%i,&anoatual); imprima (Qual eh o seu ano de nascimento? ); leia (%i,&anonasc); idade = anoatual anonasc; imprima (Voce fez ou fara %i anos , idade); imprima(Fim do programa.); }

/* parimpar.c: le um numero e verifica se ele eh par ou impar */ inteiro n; principal() { imprima (Digite um numero inteiro: ); leia(%i,&n); se (n % 2 == 0) imprima (O numero %i eh par , n); seno imprima (O numero %i eh impar , n); imprima( Fim do programa.); }

45 Exemplos de programas INVLIDOS: caracter sexo, caracter[20];

principal ( ) { imprima (Qual eh o seu nome? ); leia(%s,caracter); imprima (Qual eh o seu sexo? (F/M) ); leia (%c,sexo); se (sexo == F) imprima (%s voce eh do sexo feminino. ,caracter); seno imprima (%s voc eh do sexo masculino. ,caracter); } (A varivel caracter tem o mesmo nome da palavra reservada caracter) real nota; { imprima (Digite sua nota final: ); leia(%f,&nota); se (nota >= 6.0) imprima (Voce foi aprovado! ); seno imprima (Voce foi reprovado... ); imprima(Fim do programa.); } (Faltou a palavra principal( ) para dar incio seo de comandos)

46 real nota; nota = 7.5; principal() { imprima (Digite sua nota final: ); leia(%f,&nota); se (nota >= 6.0) imprima (Voce foi aprovado! ); seno imprima (Voce foi reprovado... ); imprima( Fim do programa.); } (H um comando de atribuio nota=7.5; na seo de declarao de variveis: no pode!) inteiro anoatual, anonasc, idade; principal() imprima (Qual eh o ano atual? ); leia(%i,&anoatual); imprima (Qual eh o seu ano de nascimento? ); leia (%i,&anonasc); idade = anoatual anonasc; imprima (Voce fez ou fara %i anos , idade); imprima(Fim do programa.); } (Faltou o delimitador { para iniciar a seo de comandos do programa)

47

Captulo 3 Construo de Algoritmos em PortuC: Praticando os comandos e fazendo clculos


3.1. Declarao de variveis, comandos leia e imprima
1) Escreva um comando que leia um nmero inteiro. leia (%i,&numero);

2) Escreva comandos para pedir e ler um nmero inteiro. imprima(Forneca um numero inteiro: ); leia (%i,&numero); 3) Escreva comandos para pedir, ler e imprimir um nmero inteiro. imprima(Forneca um numero inteiro: ); leia (%i,&numero); imprima(O numero lido foi: %i, numero); 4) Repita o exerccio 3 para um nmero real. imprima(Digite a sua altura: ); leia (%f,&altura); imprima(A altura digitada foi: %.2f , altura);

Explicao adicional: ao invs de usar %f para apresentar a altura, usamos %.2f O que isso significa? Que ns queremos apresentar a altura com apenas 2 dgitos na parte decimal! Afinal, a forma tradicional de se apresentar uma altura com 2 dgitos apenas, como 1.75, 1.62, 1.88, etc, no mesmo?

48

5) Declare as variveis utilizadas nos exerccios de 1 a 4. inteiro real numero; altura;

6) Escreva comandos para pedir, ler e imprimir o nome e a idade de uma pessoa. imprima(Qual eh o seu nome? ); leia(%s,nome); imprima(Qual eh a sua idade? ); leia (%i,&idade); imprima(Nome lido: %s e idade lida: %i ,nome,idade);

3.2. Comando condicional se


7) Escreva um comando para verificar se a idade lida no exerccio 6 corresponde a um adulto (maior que 17 anos). Se for verdadeiro, imprimir uma frase dizendo que um adulto. se (idade > 17) imprima(Voce eh um adulto(a) );

8) Escreva um comando para verificar se a idade lida no exerccio 6 corresponde a uma criana (menor que 13 anos). Se for, imprima uma frase dizendo que uma criana. se (idade < 13) imprima(Voce eh uma crianca );

9) Escreva um comando para verificar se a idade lida no exerccio 6 corresponde a um adolescente (entre 13 e 17 anos). Se for imprima uma frase... se (idade >= 13 e idade <= 17) imprima(Voce eh um adolescente );

49 10) Escreva um nico comando capaz de classificar uma pessoa pela faixa etria e ainda verificar se a idade vlida. se (idade >= 0 e idade <= 12) imprima(Faixa etaria: criana ); seno se (idade >=13 e idade <= 17) imprima (Faixa etaria: adolescente); seno se (idade >= 18 e idade <=120) imprima (Faixa etaria: adulto(a)); seno imprima (Idade invalida );

3.3. Bloco de Programa


11) Transforme o exerccio 6 num algoritmo, ou seja, construa o Bloco de Programa em PortuC. /* nomeidade.c: programa que l o nome e a idade de uma pessoa */ caracter nome[20]; inteiro idade;

principal() { imprima(Qual eh o seu nome? ); leia(%s,nome); imprima(Qual eh a sua idade? ); leia(%i,&idade); imprima(Nome lido: %s e idade lida: %i ,nome,idade); imprima(Fim do programa ); }

50 12) Escreva um algoritmo que leia o nome e a idade de uma pessoa e imprima uma frase dizendo se a pessoa uma criana, um adolescente, um adulto ou se a idade invlida. /* fxetaria.c: programa que define a faixa etaria de uma pessoa */ caracter inteiro nome[20]; idade;

principal() { imprima(Qual eh o seu nome? ); leia(%s,nome); imprima(Qual eh a sua idade? ); leia (%i,&idade); imprima(Nome lido: %s e idade lida: %i ,nome,idade); se (idade >= 0 e idade <= 12) imprima(Faixa etaria: crianca ); seno se (idade >=13 e idade <= 17) imprima (Faixa etaria: adolescente); seno se (idade >= 18 e idade <=120) imprima (Faixa etaria: adulto(a)); seno imprima (Idade invalida ); imprima(Fim do programa ); }

51

Lista de exerccios n 3.1


Com os 12 exerccios anteriores, voc deve ter j uma boa base... Agora hora de voc praticar um pouco sozinho! A minha forte recomendao que voc faa os exerccios sozinho, consultando os exemplos anteriores para ajud-lo... Somente depois da sua tentativa que voc deve conferir as respostas... Boa sorte!

3.1.1) Escreva um algoritmo que leia e imprima o nome e as duas notas de um aluno.

3.1.2) Escreva um comando que calcule a mdia das duas notas lidas no exerccio 3.1.1. 3.1.3) Escreva um comando que verifique se a mdia calculada no exerccio 3.1.2 maior ou igual a 7.0; se for, imprima uma frase dizendo que o aluno foi aprovado, caso contrrio, imprima uma frase dizendo que foi reprovado. 3.1.4) Escreva um algoritmo que leia o nome e as duas notas de um aluno, calcule a mdia das notas e imprima uma frase dizendo se ele foi aprovado (mdia maior ou igual a 7.0) ou reprovado.

52

3.4. Operaes Bsicas com Nmeros: soma, subtrao, multiplicao, diviso, raiz quadrada, porcentagem, potncia, diviso inteira
13) Escreva um comando para somar dois nmeros n1 e n2. soma = n1 + n2;

Observe que soma a varivel na qual o resultado da adio de n1 com n2 ser armazenado. So usados apenas o comando de atribuio = e o operador +. 14) Escreva comandos para subtrair e multiplicar dois nmeros n1 e n2. subtracao = n1 - n2; multiplicacao = n1 * n2; O raciocnio para subtrair e multiplicar dois nmeros o mesmo usado na adio.... 15) Escreva um comando para dividir dois nmeros n1 por 22. Antes de dividir um nmero n1 (numerador) por um nmero n2 (denominador) necessrio que verifiquemos primeiro se o denominador diferente de zero, pois no existe diviso por zero! O comando divisao = n1 / n2; vlido do ponto de vista sinttico, mas em programao temos que pensar nos erros que porventura possam ocorrer quando da execuo dos comandos...

se (n2 != 0) { divisao = n1/n2; imprima(%i dividido por %i = %f,n1,n2,divisao); } seno imprima(Divisao por zero nao existe! ); Para evitarmos a diviso eventual por zero, usa mos o comando se. Somente se n2 for diferente de zero que a diviso ser calculada; caso contrrio uma mensagem impressa para comunicar ao usurio o motivo pelo qual o clculo no foi efetuado. O resultado da diviso um nmero real. 16) Escreva um comando para calcular o quadrado de um nmero inteiro n1 e tambm n1 elevado a 3. quadrado = n1*n1; cubo = n1*n1*n1;

53 Com certeza muito mais fcil do que voc pensava, no ? So pequenos truques da programao... Mas se quisermos calcular n1 elevado a 1000 ou n1 elevado a um nmero qualquer, teremos que escrever um pequeno trecho de algoritmo. Depois eu mostro como fazer... 17) Escreva um comando para calcular a raiz quadrada de um nmero n1. se (n1 > 0) { raiz = sqrt(n1); imprima(Raiz quadrada de %i = %f,n1,raiz); } seno imprima(Nao existe raiz de numero negativo! );

Novamente, para evitarmos um erro tentando calcular a raiz de um nmero negativo, usamos o comando se. Observe que sqrt( ) um operador aritmtico cuja sintaxe diferente dos outros vistos nos exerccios anteriores. Este tipo de operador na verdade uma funo que recebe n1 como parmetro e devolve a sua raiz quadrada calculada. Existem muitas outras funes e elas sero apresentadas na medida em que se fizer necessria a sua utilizao. 18) Escreva comandos para fornecer o quociente e o resto da diviso inteira de n1 por n2. No caso diviso inteira de n1 (numerador) por um nmero n2 (denominador) se da (n2 != 0) tambm necessrio que denominador seja diferente de zero. { quociente = o n1 / n2; resto = n1 % n2;
imprima(divisao inteira de %i por %i tem quociente = %i e resto = %i ,n1,n2,quociente, resto);

} seno imprima(Divisao por zero nao existe! ); Neste caso importante voc notar que ambos os nmeros n1 e n2 tm que ser inteiros para que os operadores / (quociente da diviso) e % (resto da diviso inteira) possam ser utilizados! Como voc pode notar, no existe um operador especfico para o quociente da diviso inteira; usa-se o / (que da diviso real), mas como n1 e n2 so inteiros, haver uma converso automtica de tipos, com o truncamento da parte fracionria do resultado, o que nos fornece o quociente da diviso inteira. Isso um trunfo do PortuC: nunca se esquea disso! Se n1 for 7 e n2 for 3, por exemplo, quais seriam os valores de quociente e resto? (7 dividido por 3 d 2(quociente) e sobra 1 (resto), no ?)

54

Explicao adicional: Qual a diferena entre diviso real e diviso inteira? 7 / 2 = 3.5 7 -6 1 2 3 3.5 este o resultado da diviso real 7 / 2 = 3 (quociente da diviso inteira) 7 % 2 = 1 (resto da diviso inteira)

19) Escreva um comando para calcular 10% de um valor. E outro para acrescentar os 10% ao valor original. porc = valor * 0.10; valorfinal = valor * 1.10; // ou valorfinal = valor + porc;

Em primeiro lugar, vamos esclarecer que NO EXISTE O OPERADOR porcentagem: na verdade, % o resto da diviso inteira... Portanto, o clculo da porcentagem tem que ser feito pela operao equivalente: 10% = 10/100 = 0.10. A varivel porc deve ser do tipo real. No recomendo o uso de 10/100, pois 10/100 pode ser zero, com a converso automtica de tipos....ento use sempre 0.10 no clculo de 10%, 0.15 para 15%, 0.06 para 6%, etc. 20) Suponha que um produto custe um determinado preo, mas, se pago vista, o cliente ganha 5% de desconto. Escreva comandos para calcular o valor do desconto e o valor final do produto. desconto = preco * 0.05; precofinal = preco desconto;

21) Escreva comandos para separar os dgitos de um nmero inteiro menor que 100 em dezena e unidade. Vamos entender primeiro o que se quer: dado um nmero menor que 100, por exemplo, 29, deseja-se obter o dgito 2 (dezena) separado do dgito 9 (unidade); no caso de um nmero de um s dgito, por exemplo, 3, o resultado seria 0(dezena) e 3(unidade). Bem, este um problema muito comum na programao e muito fcil de ser resolvido tambm! Basta usar os operadores / e % com nmeros inteiros.

55 dezena = n1 / 10; unidade = n1 % 10;

Vamos fazer um pequeno teste: 29 dividido por 10 d 2 e sobram 9, certo? 2 a dezena de 29 e coincide com o quociente da diviso inteira; 9 a unidade de 29 e coincide com o resto da diviso inteira por 10! No caso de n1 ser igual a 3, ficaria assim: 3 dividido por 10 d 0 e sobram 3. Neste caso, 0 a dezena (/) e 3 a unidade (%). Um bom teste aqui seria voc responder: como poderamos separar os 3 dgitos de nmeros entre 100 e 999? Se no conseguir resolver, esta uma boa pergunta para o frum!!

22) Suponha que numa certa universidade os alunos tm um nmero de 5 dgitos que os identificam. Desses 5 dgitos, os 2 primeiros indicam o ano em que o aluno entrou na universidade. Escreva comandos para separar os 2 primeiros dgitos de um nmero inteiro de 5 dgitos que representa a identificao do aluno. Vamos entender o que se quer: dado um nmero de 5 dgitos, por exemplo, 99211, se deseja obter os 2 primeiros dgitos, no caso, 99 (que indicaria que o aluno entrou em 1999 na universidade). Mas, e se o aluno em entrou em 2000 ou 2009? O resultado teria que ser ano de entrada = 0. Vamos fazer, agora, os testes. Vejamos: n1 00211. 00211 dividido por 1000 d ZERO (que o quociente) e sobram 211. Pode parecer estranho, mas pense: quando se divide um nmero por 1000, o menor resto zero e o maior resto pode ser 999... Como queremos apenas o quociente da diviso inteira, o resultado ser anoentrada = 0 (que, no caso, representaria 2000). Funciona! Outro teste: n1 igual a 10231. 10231 dividido por 1000 d 10 e sobram 231, certo? 10 o quociente, o que resulta em anoentrada= 10 (que seria 2010)! Funciona mesmo! Faa outros testes e verifique que d certo... e como o clculo simples, no? anoentrada = n1 / 1000;

56

3.5. Operaes com Operadores Lgicos e Relacionais


23) Escreva um comando para verificar se um nmero positivo, negativo ou zero. se (n1 > 0) imprima(%i eh positivo. , n1); seno se (n1 < 0) imprima(%i eh negativo. , n1); seno imprima (Numero eh zero);

24) Escreva um comando para verificar se um nmero par ou mpar. Um nmero par aquele que dividido por 2 o resto zero: 0, 2, 4, 6, 8, 10.... e um nmero mpar aquele que dividido por 2 o resto diferente de zero: 1, 3, 5, 7, 9... se (n1 % 2 == 0) imprima(%i eh par. , n1); seno imprima(%i eh impar. , n1);

25) Escreva um comando para verificar se um nmero maior que 100. se (n1 > 100) imprima(%i eh maior que 100,n1); seno imprima(%i eh menor ou igual a 100 ,n1);

26) Escreva um comando para verificar se um nmero est entre 0 e 10. se (n1 >= 0 e n1 <= 10) imprima(%i esta entre 0 e 10,n1); seno imprima(%i nao esta entre 0 e 10,n1);

Para se verificar se um nmero est entre dois limites so necessrias duas comparaes: uma para o limite inferior e outra para o limite superior, e essas comparaes tm que estar ligadas pelo conectivo lgico e, quer dizer, somente quando as duas comparaes forem verdadeiras, o nmero est dentro dos limites. No como na Matemtica que usamos uma expresso do tipo 10 n1 100!

57

27) Suponha que um certo clube esportivo quer selecionar atletas para o time de basquete. As exigncias so: ter 1.85m de altura ou mais, ter menos de 21 anos e ter, pelo menos, o primeiro grau completo. Escreva um comando para verificar se um candidato pode ser ou no aprovado para o time de basquete. O grau de instruo definido como: 0= sem instruo, 1=primeiro grau, 2=segundo grau, 3=superior. se (altura >= 1.85 e idade < 21 e instrucao >= 1) imprima(Candidato aprovado para o basquete.); seno imprima(Candidato reprovado para o basquete.);

Observe que ao se fazer a comparao da altura no se faz referncia unidade de medida metros, quer dizer, estaria errada uma comparao do tipo altura >= 1.85m. O mesmo acontece com a idade, em que os anos foram (e devem) ser omitidos. 28) Suponha que o clube esportivo deseje, agora, formar um time masculino (sexo == m) e outro feminino (sexo == f) e tenha mudado um pouco seus critrios. As exigncias passaram a ser: ter 1.85m de altura ou mais para os homens e 1.75 ou mais para as mulheres e ter menos de 21 anos. Escreva um comando para verificar se um candidato ou candidata pode ser ou no aprovado (a) para o time de basquete. se (((sexo == m e altura>=1.85) ou (sexo == f e altura>=1.75)) e idade < 21) imprima(Candidato/a aprovado/a para o basquete.); seno imprima(Candidato/a reprovado/a para o basquete.);

Observe que surgiu o conectivo ou ligando as comparaes de altura para os sexos diferentes, que continuaram a ser ligados pelo conectivo e na comparao de idade! Pense porqu assim...

58

Lista de Exerccios n 3.2


3.2.1) Considere o trecho de algoritmo em PortuC: se (B1) C1; seno se (B2) se (B3) C2; seno { C3; C4; } C5; Em PortuC no existe uma varivel do tipo lgico a qual se possa atribuir um valor verdadeiro ou falso. No entanto, o PortuC considera o valor 0 (zero) como sendo falso e qualquer outro valor diferente de zero como sendo verdadeiro. Nos exerccios que se seguem, considere que os valores de B1, B2 e B3 representam valores verdadeiros (diferentes de zero) ou falsos (iguais a zero) e responda pergunta Quais comandos sero executados: a) b) c) d) Se B1= Verdadeiro B2 =Verdadeiro e B3=Falso? Se B1=Falso B2= Verdadeiro e B3= Falso? Se B1=Falso B2=Verdadeiro e B3=Verdadeiro? Quais os valores de B1, B2 e B3 para que somente o comando C5 executado?

seja

3.2.2) Dado um conjunto de respostas sim ou no de vrias pessoas e seu sexo (F=feminino, M=masculino), escreva comandos em PortuC para: a) verificar se mulher e respondeu sim b) verificar se homem e respondeu no c) verificar se mulher ou homem e respondeu no 3.2.3) Observe o algoritmo abaixo. Qual o valor de L aps a execuo desse algoritmo? inteiro A, B, C; real X, Y; inteiro L; principal() { A = 0; /* falso */ B = 1; /* verdadeiro */ C = 0; /* falso */ X = 1.5; Y = 3.2; se (C ou (X+Y>5) ou no(A e B)) L = 0; seno L = 1; }

59 3.2.4) Escreva os trechos de algoritmo em PortuC que ajudem o IBGE a fazer o senso populacional de uma certa cidade. Sabendo-se que os seguintes dados foram pedidos aos cidados: SEXO (H= homem, M= mulher) e RENDA (nmero de salrios mnimos s.m.), os trechos de algoritmo devem fornecer: a) o total de homens b) o total de mulheres c) o total de pessoas da classe C (at 4 s.m.), da classe B (at 20 s.m.) e da classe A (acima de 20 s.m.)

3.2.5) Fornecidos os dados das candidatas a modelo: ALTURA, PESO e IDADE, escreva um trecho de algoritmo para verificar se os dados se enquadram nos seguintes limites: ALTURA: de 1.70 a 1.85 m PESO: de 48.0 a 60.0 Kg IDADE: de 17 a 21 anos Se os dados da candidata corresponderem aos limites acima, deve ser impressa uma frase dizendo que ela foi aprovada, caso contrrio, que no foi aprovada. 3.2.6) Modifique o exerccio anterior para que uma frase seja impressa aps a verificao de cada quesito dizendo se a candidata foi aprovada ou no em cada um deles e uma frase final dizendo se foi aprovada ou no como modelo.

60

Captulo 4 Metodologia para Construo de Algoritmos


Neste captulo, caro aluno, voc aprender uma metodologia que facilitar o processo de desenvolvimento de solues algortmicas para os problemas que sero propostos para voc resolver. A metodologia composta de uma sequncia de passos, cujo principal objetivo ajud-lo a resolver problemas dividindo-os por partes, diminuindo, assim, a sua complexidade. Como ficar bem claro logo adiante, resolvendo cada parte do problema por vez, consegue-se chegar a solues completas e complexas a partir de solues simples que j foram, muitas vezes, encontradas para diversos outros problemas semelhantes. Voc conhecer os passos da metodologia e vrios exemplos prticos sero fornecidos de maneira a familiariz-lo com o mtodo. importante ressaltar que a metodologia um processo dinmico. Voc pode estar num passo mais adiante e identificar uma varivel auxiliar e voltar aos passos anteriores e alter-los, por exemplo. Portanto, no se detenha aos detalhes, pelo contrrio, sinta-se livre para criar suas solues. O mtodo pretende ajud-lo e no engess-lo! Vamos em frente!

4.1. Os 10 passos da metodologia

Passo 1: Ler e entender o problema importante ler e reler, pelo menos 3 vezes, o problema at que ele seja completamente compreendido. No adianta querer buscar a soluo de um problema que no esteja suficientemente esclarecido! Passo 2: Listar todos os dados de entrada do problema Um dado de entrada aquele que ser fornecido pelo usurio, ou seja, o dado que ser lido pelo programa. Passo 3: Listar todos os dados de sada do problema Um dado de sada algo que ser produzido ou calculado pelo programa; tudo aquilo que deve ser apenas impresso no deve ser considerado um dado de sada.

61

Passo 4: Listar todas as variveis auxiliares do programa Uma varivel auxiliar identificada como aquela que necessria para o clculo de alguma varivel de sada e no varivel de entrada. Por exemplo, num problema em que vrios nmeros sero lidos e sua mdia deva ser calculada, o nmero uma varivel de entrada e a mdia uma varivel de sada, mas como para calcular a mdia necessrio somar os nmeros e dividir a soma pela quantidade de nmeros lidos, a soma e a quantidade de nmeros so variveis auxiliares do programa. Assim, para se identificar as variveis auxiliares, basta analisar cada uma das sadas e verificar se, dadas as estradas, h necessidade de mais alguma varivel para facilitar o seu clculo. Passo 5: Declarar todas as variveis do programa Cada dado de entrada, cada dado de sada e cada varivel auxiliar gera uma varivel. As variveis do programa devero ser uma para cada dado de entrada, uma para cada dado de sada e uma para cada varivel auxiliar. extremamente importante que o programador escolha nomes de variveis significativos, que possam exprimir a funo da varivel. Por exemplo, uma varivel que receber a idade de uma pessoa, no deveria se chamar x, nem mesmo i seria bom, o ideal seria idade. Passo 6: Inicializar as variveis do programa H um conjunto de pequenas regras que podem nos ajudar a encontrar os valores iniciais de cada varivel do programa, apesar de que nem todas as variveis precisam ter valores iniciais: Toda varivel de entrada inicializada com o comando leia Todo contador e todo somador deve ser inicializado com 0 ( zero) Todo produtrio deve ser inicializado com 1 (um) Passo 7: Escrever o cdigo para calcular cada uma das sadas do programa Os principais problemas a serem solucionados, na maior parte das vezes, resumem-se no clculo das sadas do programa. Portanto, neste passo, cada uma das sadas deve ser analisada individualmente e sua soluo encontrada separadamente. Passo 8: Imprimir os resultados do programa Aqui s devem ser impressos os resultados pedidos na especificao do problema. Passo 9: Montar o algoritmo unindo os resultados dos passos 5 a 8 Os passos 5 a 8 tm a soluo do problema. A montagem do algoritmo/programa pode seguir um esquema bsico, mas vai depender muito da lgica de cada problema. Portanto, o esquema abaixo serve apenas de uma orientao para o aluno. Cada problema deve, no entanto, ser analisado logicamente para chegar ao seu algoritmo.

62

/* Nome do Programa e o que ele faz */ <passo 5 declarar todas as variveis do programa> principal() { <passo 6 inicializar as variveis do programa > <passo 7 calcular cada uma das sadas do programa> <passo 8 imprimir os resultados do programa> imprima(Fim do programa); }

Passo 10: Fazer o teste de mesa do programa a partir de diferentes valores iniciais O teste de mesa consiste na execuo de todas as instrues do programa a partir de conjuntos de valores iniciais. Os valores iniciais devem ser escolhidos de maneira que as condies de contorno do problema sejam verificadas. Por exemplo, num p rograma que trabalhe com flags, deve ser testada a condio em que o valor do flag seja fornecido como dado inicial; num programa que s leia nmeros positivos, devem ser fornecidos nmeros negativos e zero; dentre outras situaes possveis.

4.2. Soluo de exerccios utilizando a metodologia


A estratgia que utilizaremos nesta seo propor uma lista de exerccios e resolver alguns deles, usando a metodologia, deixando outros para que voc, utilizando solues semelhantes, resolva-os sozinho, ok? Ento vamos l!

Lista de Exerccios 4.1


4.1.1. Escreva um algoritmo em PortuC para calcular e imprimir a rea e o permetro de uma sala retangular, sendo que os comprimentos das paredes (comprimento e largura) so fornecidos pelo usurio. 4.1.2. Escreva um algoritmo em PortuC para calcular e imprimir a rea de uma esfera. O raio da esfera ser fornecido pelo usurio. Obs: A = 3.14*R 2 4.1.3. Escreva um algoritmo em PortuC que calcule e imprima o valor em Reais correspondente aos dlares que um turista possui no cofre do hotel. O programa deve solicitar os seguintes dados: quantidade de dlares guardados no cofre e cotao do dlar naquele dia. 4.1.4. Escreva um algoritmo em PortuC que leia um nmero e informe se ele par ou mpar.

63
4.1.5. Escreva um algoritmo em PortuC que leia 2 nmeros e diga qual deles o maior. 4.1.6. Escreva um algoritmo em PortuC que calcule e imprima a quantidade de tijolos iguais necessrios para construir uma determinada parede. So dados de entrada do programa: dimenses do tijolo (comprimento e largura) e dimenses da parede a ser construda (comprimento e largura). 4.1.7. Escreva um algoritmo em PortuC que calcule a rea A de um tringulo pela frmula de Hero, lendo os valores de entrada s, que o semipermetro e a, b e c, que so os lados do tringulo:

4.1.8. Escreva um algoritmo em PortuC para calcular o valor do desconto, sendo que o preo do produto fornecido pelo usurio e o desconto de 5%. Apresentar o preo do produto, o valor do desconto e o preo final com o desconto. 4.1.9. Escreva um algoritmo em PortuC para calcular e imprimir qual foi a porcentagem de desconto dada em um determinado produto, sabendo-se o preo original do produto e o preo que foi cobrado por ele depois do desconto sero fornecidos pelo usurio. 4.1.10. Escreva um algoritmo em PortuC que receba dois valores inteiros nas variveis A e B. O programa deve trocar os valores entre as variveis (ou seja, ao trmino do programa a varivel A deve ter o valor inicial de B e vice-versa). Apresentar as duas variveis no final. 4.1.11. Escreva um algoritmo em PortuC para calcular e imprimir o valor a ser pago pelo perodo de estacionamento do automvel. O usurio entra com os seguintes dados: hora e minuto de entrada, hora e minuto de sada. Sabe-se que este estacionamento cobra R$ 10,00 por hora ou frao. 4.1.12. Escreva um algoritmo em PortuC que leia o valor de uma conta de luz e, caso o valor seja maior que R$ 50,00 apresente a mensagem: Voc est gastando muito. Caso contrrio exiba a mensagem: Seu gasto foi normal, parabns. 4.1.13. Escreva um algoritmo em PortuC que receba a leitura do termmetro. Caso a temperatura esteja abaixo de 100C, apresentar a mensagem de que a temperatura est muito baixa. Caso a temperatura esteja entre 100C e 200C, apresentar a mensagem de que a temperatura est baixa. Caso a temperatura esteja acima de 200C e inferior a 500C, apresentar a mensagem de que a temperatura est normal. Caso contrrio, apresentar a mensagem de que a temperatura est muito alta. 4.1.14. Escreva um algoritmo em PortuC que leia o valor do salrio atual e calcule e imprima o valor do novo salrio de um funcionrio. Considere que o funcionrio dever receber um reajuste de 15% caso seu salrio seja menor que R$500.00. Se o salrio for maior ou igual a 500, mas menor ou igual a R$1000.00, o reajuste deve ser de 10%. Caso o salrio seja maior que R$1000.00, o reajuste deve ser de 5%. 4.1.15. Escreva um algoritmo em PortuC que determine quanto ser gasto para encher um cilindro de gs, sabendo-se que o preo do gs oxignio de R$ 250.00, o preo do gs hlio de R$ 350.00 e o preo do gs nitrognio de R$ 300.00. O usurio fornecer os seguintes dados: Tipo de gs (as opes como tipo de gs so a letra O oxignio ou a letra H hlio ou a letra N-nitrognio; rejeitar valores invlidos) e Capacidade do cilindro em metros cbicos.

64 Ento, caro aluno, vamos s solues passo a passo utilizando nossa metodologia!

Exerccio 4.1.1) Escreva um algoritmo em PortuC para calcular e imprimir a rea e o permetro de uma sala retangular, sendo que os comprimentos das paredes (comprimento e largura) so fornecidos pelo usurio. Passo 1: ler e entender Passo 2: variveis de entrada - comprimento - largura Passo 3: variveis de sada - rea da sala - permetro da sala Passo 4: variveis auxiliares - no tem Passo 5: declarar todas as variveis real compr, larg, area, perimetro; Passo 6: inicializar as variveis imprima (Digite o comprimento da sala: ); leia(%f, &compr); imprima (Digite a largura da sala: ); leia(%f, &larg); Passo 7: calcular as sadas area = compr * larg; perimetro = (2*compr) + (2*larg); Passo 8: imprimir os resultados imprima(A sala tem %f de area e %f de perimetro , area, perimetro);

65 Passo 9: montar o algoritmo /*Exerc411.c: Le o comprimento e a largura de uma sala e calcula sua area e perimetro*/ real compr, larg, area, perimetro; principal () { imprima (Digite o comprimento da sala: ); leia(%f, &compr); imprima (Digite a largura da sala: ); leia(%f, &larg); area = compr * larg; perimetro = (2*compr) + (2*larg); imprima(A sala tem %f de area e %f de perimetro , area, perimetro); imprima(Fim do programa); }

Passo 10: testes de mesa compr 2.5 larg 5.0 area 12.5 10.0 compr 0 larg -1.0 area 0 -2.0 A sala tem 0 de area e -2.0 de perimetro perimetro A sala tem 12.5 de area e 10.0 de perimetro Sada Tela perimetro Sada Tela

Nestes 2 testes de mesa, podemos observar um comportamento esperado para dados vlidos e um comportamento estranho para dados no esperados... O certo seria fazer uma consistncia dos dados, j que no faz sentido se ter valores negativos nem o valor zero para o comprimento e largura das paredes de uma sala... Mas isso no importante agora... o importante, caro aluno, voc conseguir encontrar a soluo sem se preocupar com usurios, digamos, pouco honestos....

66 Exerccio 4.1.3) Escreva um algoritmo em PortuC que calcule e imprima o valor em Reais correspondente aos Dlares que um turista possui no cofre do hotel. O programa deve solicitar os seguintes dados: quantidade de dlares guardados no cofre e cotao do dlar naquele dia. Passo 1: ler e entender Passo 2: variveis de entrada - valor em dlares - cotao do dlar Passo 3: variveis de sada - valor em reais Passo 4: variveis auxiliares - no tem Passo 5: declarar todas as variveis real dolares, reais, cotacao; Passo 6: inicializar as variveis imprima (Digite o valor em dolares a ser convertido para reais: ); leia(%f, &dolares); imprima (Digite a cotacao do dolar: ); leia(%f, &cotacao); Passo 7: calcular as sadas reais = dolares*cotacao; Passo 8: imprimir os resultados imprima(O valor %f em dolares corresponde a R$ %f, dolares, reais);

67 Passo 9: montar o algoritmo /*Exerc413.c: Le o valor em dolares e a cotacao do dolar e calcula o valor convertido para reais*/ real dolares, reais, cotacao; principal () { imprima (Digite o valor em dolares a ser convertido para reais: ); leia(%f, &dolares); imprima (Digite a cotacao do dolar: ); leia(%f, &cotacao); reais = dolares*cotacao; imprima(O valor %f em dolares corresponde a R$ %f, dolares, reais); imprima(Fim do programa); }

Passo 10: testes de mesa dolares 1000.00 cotacao 1.75 reais 1750.00 O valor 1000.00 em dlares corresponde a R$ 1750.00 dolares 1000.00 cotacao 1.66 reais 1660.00 O valor 1000.00 em dlares corresponde a R$ 1660.00 Sada Tela Sada Tela

68 Exerccio 4.1.8) Escreva um algoritmo em PortuC para calcular o valor do desconto, sendo que o preo do produto fornecido pelo usurio e o desconto de 5%. Apresentar o preo do produto, o valor do desconto e o preo final com o desconto.

Passo 1: ler e entender Passo 2: variveis de entrada - preo do produto Passo 3: variveis de sada - desconto - preo final com desconto Passo 4: variveis auxiliares - no tem Passo 5: declarar todas as variveis real precoini, desconto, precofinal; Passo 6: inicializar as variveis imprima (Digite o valor do produto ); leia(%f, &precoini); Passo 7: calcular as sadas desconto = precoini * 0.05; precofinal = precoini desconto; Passo 8: imprimir os resultados imprima(Preo inicial do produto R$ %f , precoini); imprima(Valor do desconto R$ %f , desconto); imprima(Preo final do produto com desconto R$ %f , precofinal);

69 Passo 9: montar o algoritmo /*Exerc419.c: Le o valor de um produto, concede desconto de 5% e apresenta o preo com desconto e o desconto */ real precoini, desconto, precofinal; principal () { imprima (Digite o valor do produto ); leia(%f, &precoini); desconto = precoini * 0.05; precofinal = precoini desconto; imprima(Preco inicial do produto R$ %f , precoini); imprima(Valor do desconto R$ %f , desconto); imprima(Preco final do produto com desconto R$ %f , precofinal); imprima(Fim do programa); }

Passo 10: testes de mesa

precoini 300.00

desconto precofinal Sada Tela 15.00 285.00 Preco inicial do produto R$ 300.00 Valor do desconto R$ 15.00 Preco final do produto com desconto R$ 285.00

precoini 1000.00

desconto precofinal Sada Tela 50.00 950.00 Preco inicial do produto R$ 1000.00 Valor do desconto R$ 50.00 Preco final do produto com desconto R$ 950.00

70 Exerccio 4.1.10) Escreva um algoritmo em PortuC que receba dois valores inteiros nas variveis A e B. O programa deve trocar os valores entre as variveis (ou seja, ao trmino do programa a varivel A deve ter o valor inicial de B e vice-versa). Apresentar as duas variveis no final. Passo 1: ler e entender Passo 2: variveis de entrada -A -B Passo 3: variveis de sada - no tem Passo 4: variveis auxiliares - Varivel para guardar o valor de A Passo 5: declarar todas as variveis inteiro A, B, auxA; Passo 6: inicializar as variveis imprima (Digite o valor do primeiro numero inteiro ); leia(%i, &A); imprima (Digite o valor do segundo numero inteiro ); leia(%i, &B); Passo 7 e Passo 8: calcular as sadas e imprimir os resultados imprima (Valores antes da troca A=%i B=%i , A, B); auxA = A; // valor de A eh salvo na variavel auxA A = B; // valor de B eh copiado para A B = auxA; // valor de A eh copiado para B imprima (Valores depois da troca A=%i B=%i , A, B);

71 Passo 9: montar o algoritmo /*Exerc4111.c: Le dois inteiros A e B e troca seus valores */ inteiro A, B, auxA; principal () { imprima (Digite o valor do primeiro numero inteiro ); leia(%i, &A); imprima (Digite o valor do segundo numero inteiro ); leia(%i, &B); imprima (Valores antes da troca A=%i B=%i , A, B); auxA = A; // valor de A eh salvo na variavel auxA A = B; // valor de B eh copiado para A B = auxA; // valor de A eh copiado para B imprima (Valores depois da troca A=%i B=%i , A, B); imprima(Fim do programa); }

Passo 10: testes de mesa A 3 15 3 Valores depois da troca A=15 B=3 B 15 auxA 3 Sada Tela Valores antes da troca A=3 B=15

A -4 4

B 4

auxA 4

Sada Tela Valores antes da troca A=-4 B=4

-4 Valores depois da troca A=4 B=-4

72 Exerccio 4.1.13) Escreva um algoritmo em PortuC que receba a leitura do termmetro. Caso a temperatura esteja abaixo de 100C, apresentar a mensagem de que a temperatura est muito baixa. Caso a temperatura esteja entre 100C e 200C, apresentar a mensagem de que a temperatura est baixa. Caso a temperatura esteja acima de 200C e inferior a 500C, apresentar a mensagem de que a temperatura est normal. Caso contrrio, apresentar a mensagem de que a temperatura est muito alta. Passo 1: ler e entender Passo 2: variveis de entrada - temperatura (leitura do termmetro) Passo 3: variveis de sada - no tem Passo 4: variveis auxiliares - no tem Passo 5: declarar todas as variveis inteiro temp; Passo 6: inicializar as variveis imprima (Digite o valor da temperatura lida no termometro); leia(%i, &temp); Passo 7 e Passo 8: calcular as sadas e imprimir os resultados se (temp < 100) imprima (Temperatura muito baixa ); seno se (temp >=100 e temp <= 200) imprima (Temperatura baixa ); seno se (temp > 200 e temp < 500) imprima (Temperatura normal ); seno imprima (Temperatura muito alta );

73 Passo 9: montar o algoritmo /*Exerc4114.c: Le a temperatura e imprime mensagem de acordo com o valor */ inteiro temp; principal () { imprima (Digite o valor da temperatura lida no termometro); leia(%i, &temp); se (temp < 100) imprima (Temperatura muito baixa ); seno se (temp >=100 e temp <= 200) imprima (Temperatura baixa ); seno se (temp > 200 e temp < 500) imprima (Temperatura normal ); seno imprima (Temperatura muito alta ); imprima(Fim do programa); }

Passo 10: testes de mesa temp -200 Sada Tela Temperatura muito baixa temp 200 Sada Tela Temperatura baixa temp 500 Sada Tela Temperatura muito alta temp 300 Sada Tela Temperatura normal

74 Exerccio 4.1.15) Escreva um algoritmo em PortuC que determine quanto ser gasto para encher um cilindro de gs, sabendo-se que o preo do gs oxignio de R$ 250.00, o preo do gs hlio de R$ 350.00 e o preo do gs nitrognio de R$ 300.00. O usurio fornecer os seguintes dados: Tipo de gs (as opes como tipo de gs so O oxignio ou H hlio ou N-nitrognio; rejeitar valores invlidos) e capacidade do cilindro em m3. Passo 1: ler e entender Passo 2: variveis de entrada - tipo do gs - capacidade do cilindro Passo 3: variveis de sada - valor gasto para encher o cilindro Passo 4: variveis auxiliares - no tem Passo 5: declarar todas as variveis
char tipo; inteiro cilindro; real preco;

Passo 6: inicializar as variveis


imprima(Digite o tipo de gas O=oxigenio H=helio N=nitrogenio); leia(%c, tipo); imprima (Digite a capacidade do cilindro de gas: ); leia(%i, &cilindro);

Passo 7 e Passo 8: calcular as sadas e imprimir os resultados


se (tipo == O ou tipo == o) { preco = cilindro * 250.00; imprima (Voce gastara R$ %.2f para encher o cilindro de oxigenio , preco); } seno se (tipo == H ou tipo == h) { preco = cilindro * 350.00; imprima (Voce gastara R$ %.2f para encher o cilindro de helio, preco); } seno se (tipo == N ou tipo == n) { preco = cilindro * 300.00; imprima (Voce gastara R$ %.2f para enc her o cilindro de nitrogenio, preco); } seno imprima(Tipo de gas invalido);

75 Passo 9: montar o algoritmo


/*Exerc4116.c: Le o tipo de gas, a capacidade do cilindro e calcula o valor a ser pago para encher o cilindro*/ char tipo; inteiro cilindro; real preco; principal () { imprima(Digite o tipo de gas O=oxigenio H=helio N=nitrogenio); leia(%c, tipo); imprima (Digite a capacidade do cilindro de gas: ); leia(%i, &cilindro); se (tipo == O ou tipo == o) { preco = cilindro * 250.00; imprima (Voce gastara R$ %.2f para encher o cilindro de oxigenio , preco); } seno se (tipo == H ou tipo == h) { preco = cilindro * 350.00; imprima (Voce gastara R$ %.2f para encher o cilindro de helio, preco); } seno se (tipo == N ou tipo == n) { preco = cilindro * 300.00; imprima (Voce gastara R$ %.2f para encher o cilindro de nitrogenio, preco); } seno imprima(Tipo de gas invalido); imprima(Fim do programa); }

Passo 10: testes de mesa tipo n cilindro preco 5 1500.00 Sada Tela Voce gastara R$1500.00 para encher o cilindro de nitrogenio Sada Tela Voce gastara R$2800.00 para encher o cilindro de gas helio

tipo h

cilindro preco 8 2800.00

tipo y

tanque 70

preco

Sada Tela Tipo de gas invalido

76

Captulo 5 A Linguagem de Programao C


Neste captulo, voc, caro aluno, poder comear a traduzir seus primeiros algoritmos para a linguagem de programao C. Isso o capacitar a realizar as primeiras aulas prticas em laboratrio. Recomenda-se que voc prepare em seu computador um ambiente adequado programao em C e comece a trabalhar sozinho fazendo os programas da lista 4.1 como atividades extra-classe. O interessante em se utilizar o PortuC como pseudo-linguagem, que ele segue quase totalmente as mesmas regras da linguagem C. Assim, comear a programar em C ser muito fcil, voc ver!

5.1. Tipos Bsicos e Declarao de Variveis em C


Um identificador em C formado por caracteres alfanumricos. O primeiro caracter tem que ser _ ou uma letra; os outros caracteres podem ser: letras: A-Z, a-z dgitos: 0-9 sublinhado: _ No pode haver dois identificadores iguais. Letras minsculas e letras maisculas so diferentes Os identificadores no podem ser acentuados. No pode haver espao em branco num identificador. O caracter no pode ser usado num identificador. Um identificador no pode ter o mesmo nome das palavras reservadas do C (como main, if, else, int, char...). Na linguagem C h 5 tipos bsicos (int, float, double, char e void) e cinco modificadores de tipos (long, short, signed e unsigned), o que amplia muito os tipos de variveis, mas neste curso usaremos apenas 3 tipos bsicos: int float char O tipo de dados double (%Lf) corresponde ao float, mas com maior capacidade de armazenamento O tipo de dados long int (%ld) corresponde ao int, mas com maior capacidade de armazenamento Para se declarar uma varivel escreve-se o nome de seu tipo, salta-se um espao em branco, em seguida o nome do seu identificador e ; para finalizar a declarao. Se mais de uma varivel for do mesmo tipo bsico, elas podem ser declaradas juntas, apenas separadas por vrgulas ,. Pode-se inicializar uma varivel na sua declarao, atribuindo-se a ela um valor inicial compatvel com seu tipo. Toda varivel precisa ser declarada antes de ser utilizada. No pode haver duas variveis com mesmo nome, mesmo que tenham tipos bsicos diferentes, a menos que algum caracter maisculo ou minsculo as diferencie.

77 Exemplo de declarao de variveis vlido: char nome[20], letra, zero=0; float soma=0; int n1, n2; float raiz1, Total_dos_Salarios; char nome_de_familia[30]=Menezes; int idade, cont=0;

5.2. Operadores de Atribuio, Aritmticos, Relacionais e Lgicos (Binrios) em C


O operador de atribuio : = H os operadores de atribuio compostos += -= *= /= Os operadores aritmticos bsicos so: + (adio) - (subtrao) * (multiplicao) / (quociente da diviso real) ++ ( adiciona 1) -- (subtrai 1) Alguns operadores aritmticos mais avanados so: % (resto da diviso inteira) / (quociente da diviso inteira) sqrt( ) (raiz quadrada) abs( ) (valor absoluto) Os operadores relacionais so: > (maior que) >= (maior ou igual a) < (menor que) <= (menor ou igual a) == (igual a) != (diferente de) Os operadores lgicos so: && (operador e - conjuno) || (operador ou - disjuno) ! (operador no - negao)

78 Funcionamento dos operadores lgicos em C Operador Lgico && (e) || (ou) ! (no)

Ao

avalia como 1 (verdadeiro) se ambas expresses forem verdadeiras, caso contrrio, avalia como 0 (falso) avalia como 1 (verdadeiro) se pelo menos uma expresso for verdadeira, caso contrrio, avalia como 0 (falso) avalia como 1 (verdadeiro) se a expresso for falsa e 0 (falso) se a expresso for verdadeira, ou seja, troca verdadeiro por falso e vice-versa

Expresses conectadas por operadores lgicos so avaliadas da esquerda para a direita e a avaliao para to logo a veracidade ou falsidade do resultado for reconhecida Na linguagem C, em qualquer expresso que se espere um valor lgico, o resultado ser: falso se o valor for 0 verdadeiro para qualquer outro valor (1 ou qualquer nmero positivo ou negativo ou qualquer expresso vlida da linguagem)

Exemplos: (5 > 2) && (3 != 2) (3 >= 2) || (4 == 2) (3 <= 2) || (4==2) ! (4==2) ! (4>3)

/* avalia como 1 (verdadeiro) */ /* avalia como 1 (verdadeiro) */ /* avalia como 0 (falso) */ /* avalia como 1 (verdadeiro) */ /* avalia como 0 (falso) */

Exemplos de expresses lgicas e relacionais vlidas: if (altura > 1.80 && idade < 21 && escolaridade >= 2) if (idade >= 13 && idade <=20) if ((media >= 7.0 && faltas <= 18) || foidispensado == 1) if !(numero % 2 == 0) if (resposta == S) if (resposta == S || resposta == s) if (resposta != S && resposta != s) if (sexo == F && altura <= 1.50) if (cont=0 && soma !=0)
(muito cuidado com este tipo de expresso: cont=0 uma atribuio e no uma comparao, mas em C pode-se fazer atribuio num comando if!!)

79 Exemplos de expresses lgicas e relacionais INVLIDAS: if (altura > 1.80 && || idade < 21)
(os operadores && e || so binrios, envolvem sempre 2 operandos, portanto no podem ser utilizados juntos)

if (idade >=13 && <= 20)


(o operando idade deveria ser repetido para se obter o resultado lgico da comparao)

if (resposta ! if (altura <

S)

(o smbolo do operador diferente est errado: no pode haver espao em branco entre o ! e o =)

= 1.50)

(o smbolo do operador menor que est errado: no pode haver espao em branco entre o < e o =)

if resposta == S
(faltaram parnteses delimitando a expresso)

Exemplos de expresses aritmticas vlidas: resto = 10 % 3; quociente = 10 / 3; salario = ((totaldehoras*32.50)+102.00) - descontoinss; valoremdolares = salario / 2.55; impostoderenda = salario * 0.20; ok = (achou=1) && (resposta=s); strcat (nome,"da silva); // concatenao de strings contador = contador +1; ++contador; contador += 2; // equivale a contador = contador + 2; --valor; valor -= 5; // equivale a valor = valor 5; Soma += Valor; // equivale a Soma = Soma + Valor; x1 = -b + sqrt(teta) / (2*A); // sqrt() est na biblioteca <math.h> Exemplos de expresses aritmticas INVLIDAS: resto = 10.0 % 3;
(o operador % s pode envolver nmeros inteiros)

salario = totaldehoras *+ 32.50;


(os operadores * e + so didicos, envolvem sempre dois operadores, portanto no podem ser utilizados juntos)

valoremdolares = salario / 2,55;


(no existe vrgula decimal, o separador sempre o ponto .)

Nome = Nome + da Silva;


(em variveis do tipo string a manipulao feita atravs de funes que esto na biblioteca <string.h>)

80

5.3. Comando Condicional em C (if)


A sintaxe do comando condicional : if (condio) { <bloco de comandos 1> } else { <bloco de comandos 2> } A semntica (como funciona) do comando condicional if : 1. A <condio> avaliada como VERDADEIRA (valor diferente de zero) ou FALSA (valor igual a zero); 2. Se a <condio> for VERDADEIRA, o <bloco de comandos 1> executado e o comando condicional finalizado; 3. Se a <condio> for FALSA, o <bloco de comandos 2> executado e o comando condicional finalizado. else clusula do comando if, ou seja, no comando, apenas faz parte do comando if. A clusula else pode no existir num comando if. Neste caso (no existe a clusula else), quando a <condio> avaliada como FALSA, nenhum comando executado e o comando if finalizado. Os delimitadores de { e } so obrigatrios quando existe mais de um comando no <bloco de comandos 1> ou mais de um comando no <bloco de comandos 2>. Quando existir apenas um comando, os delimitadores ficam opcionais.

Exemplos de comandos condicionais VLIDOS: if (media >= 7.0) aprovado = 1; if (media >= 7.0) { aprovado = 1; } if (media >= 7.0) { aprovado = 1; ++contadoraprovados; } if (media >= 7.0) { aprovado = 1; ++contadoraprovados; } else aprovado = 0;

81

if (media >= 7.0) aprovado = 1; else aprovado = 0; if (media >= 7.0 && faltas <= 9) { aprovado = 1; ++contadoraprovados; } else { aprovado = 0; ++contadorreprovados; } if (numero % 2 == 0) ++contapar; else ++contaimpar; if (numero > 0) printf(\nNumero positivo); else if (numero < 0) printf(\nNumero negativo); else printf(\nNumero zero);

Exemplos de comandos condicionais INVLIDOS: if media >= 7.0 aprovado = 1; (faltou colocar parnteses na condio) if (media >= 7.0) { aprovado = 1; ++contadoraprovados; (faltou colocar o delimitador de fim { no final do comando ) if (media >= 7.0) aprovado = 1 else aprovado = 0; (faltou ; depois do comando aprovado = 1)

82

if media >= 7.0 aprovado = 1; ++contadoraprovados; else { aprovado = 0; ++contadorreprovados; } (faltou colocar parnteses na condio e delimitadores de incio e fim { } antes do else ) if (numero % 2 == 0); ++contapar; else ++contaimpar; (no pode-se colocar ; depois da condio do comando if, pois o ; finaliza o comando)

5.4. Comando de Seleo Mltipla em C (switch)


Comando de seleo mltipla que testa sucessivamente o valor de uma expresso contra uma lista de valores do tipo inteiro ou de caracteres. Quando o valor coincide, os comandos associados quele valor so executados. A sintaxe do comando de seleo mltipla switch : switch (expresso) { case valor1: <comandos_1>; break; case valor2: <comandos_2>; break; ... case valorn: <comandos_n>; break; default: comandos_default; } expresso deve resultar num valor inteiro do tipo long, int ou char. Compara-se este resultado com o valor1 at valorn. - Se for encontrada alguma equivalncia, o programa passa a executar os comandos a partir deste ponto, at encontrar uma instruo break. - Se nenhuma equivalncia for encontrada os comandos relativos a default so executados. - Caso no haja a opo default, nenhum comando executado. - Caso a instruo break no seja encontrada, todos os comandos vo sendo executados at se chegar ao final do comando switch.

83 Exemplos de comandos de seleo mltipla vlidos:


switch (sexo) { case f: case F: printf(\nVoce eh do sexo feminino); break; case m: case M: printf(\nVoce eh do sexo masculino); break; default: printf(\nValor de sexo invalido.); }

letra = toupper(letra); // toupper transforma o caracter para maisculo switch (letra) { case A: case E: case I: case O: case U: printf(\n Voce digitou uma vogal); break; default: printf(\n Voce digitou algo diferente de uma vogal); }

printf(\nDigite o numero do dia da semana (1-7): ); scanf(%i,&dia); switch(dia) { case 1: printf("\n1-Domingo - Sunday"); break; case 2: printf("\n2-Segunda-feira - Monday"); break; case 3: printf("\n3-Terca-feira - Tuesday"); break; case 4: printf("\n4-Quarta-feira - Wednesday"); break; case 5: printf("\n5-Quinta-feira - Thursday"); break; case 6: printf("\n6-Sexta-feira - Friday"); break; case 7: printf("\n7-Sabado - Saturday"); break; default: printf("\nDia da semana invalido."); }// switch

84
switch (voto) { case 1: printf(\n ++cont1; break; case 2: printf(\n ++cont2; break; case 3: printf(\n ++cont3; break; default: printf(\n }

Voce votou no candidato 1);

Voce votou no candidato 2);

Voce votou no candidato 3);

Voto invalido);

switch (opcao) { case 1: printf(\n break; case 2: printf(\n break; case 3: printf(\n break; default: printf(\n }

Voce escolheu a opcao 1); Voce escolheu a opcao 2); Voce escolheu a opcao 3);

Opcao invalida);

Exemplos de comandos de seleo mltipla INVLIDOS ou ERRADOS:


printf(\nQual eh a temperatura do seu corpo? ); scanf(%f,&temp); switch (temp) { case 36.0: case 36.5: printf(\nVoce no tem febre. Temperatura normal.); break; case 37.0: case 37.5: printf(\nVoce esta levemente febril.); break; default: if (temp > 37.5) printf(\nVoce esta febril. Procure um medico); else printf(\nEsta temperatura esta fora dos valores normais); }

(O comando switch no aceita valores do tipo real!!! Este comando totalmente invlido.)

85
switch (sexo) { case f: case F: printf(\nVoce eh do sexo feminino); case m: case M: printf(\nVoce eh do sexo masculino); default: printf(\nSexo invalido.); }

(falta o comando break dentro dos cases, ento todos os printf sero executados)

5.5. Comando de Repetio em C (while)


A sintaxe do comando de repetio while : while (condio) { <bloco de comandos> } A semntica (como funciona) do comando de repetio while : 1. A condio avaliada como VERDADEIRA (diferente de zero) ou FALSA (igual a zero); 2. Se a condio for VERDADEIRA, o <bloco de comandos> executado e, ao se chegar ao delimitador de fim } ou final do comando, automaticamente se retorna avaliao da condio; 4. Se a condio for FALSA, o comando de repetio finalizado. Dentre os comandos do <bloco de comandos> ESSENCIAL que exista um comando que altere a <condio> que constantemente avaliada, pois, caso contrrio, o comando enquanto NUNCA TERMINAR! Caso haja um comando break; dentro do comando while, este finaliza imediatamente o comado while quando for executado. Os delimitadores { e } so obrigatrios quando existe mais de um comando no <bloco de comandos>. Quando existir apenas um comando, os delimitadores ficam opcionais e o ; funcionar como delimitador de fim, indicando o final do comando while.

Exemplos de comandos de repetio vlidos: contador=0; while (contador < 3) ++contador;

86 numero = 1; while (numero <= 100) { if (numero % 2 == 0) ++contapar; else ++contaimpar; numero += 3; } numero = 1; while (1) { if (numero % 2 == 0) ++contapar; else ++contaimpar; numero += 3; if (numero >= 100) break; }

Exemplos de comandos de repetio INVLIDOS ou errados: while contador <= 10 ++contador; (faltaram parnteses na condio) numero =1; while (numero <= 100) if (numero % 2 == 0) ++contapar; else ++contaimpar; numero += 3; ( como no existem os delimitadores de incio e fim { } do comando, somente o comando if faz parte do comando while e como o comando if no altera a varivel numero que controla a condio, o comando while nunca vai parar!) numero = 1; while (numero <= 10); { numero += 3; } ( como foi colocado ; aps a condio, o comando while foi finalizado, a varivel numero no ser alterada e o comando while nunca vai parar!)

87 numero = 1; while (1) numero += 3; if numero >= 10 break; (como no foram colocados { } delimitando os comandos dentro do while, que foi colocado em loop infinito de propsito, o comando break no ser executado e o comando while nunca vai parar mesmo!)

5.6. Comando de Repetio em C (for)


O comando de repetio for permite que um comando ou um bloco de comandos seja executado um nmero determinado de vezes . um comando de repetio, como os comandos while (j apresentado) e do while (que no apresentaremos nesta apostila). A diferena entre eles, que o comando for utiliza um mecanismo de contagem automtica, dentro de um intervalo definido pelo usurio. muito til para se controlar a leitura e a impresso de vetores e matrizes (estruturas que sero estudadas no futuro).

A sintaxe do comando de repetio for : for (inicial; condio; incremento ou decremento) { <bloco de comandos> } As expresses inicial e incremento ou decremento so, em geral, atribuies varivel de controle e condio uma expresso relacional que envolve a mesma varivel de controle. A semntica do comando for : 1. A expresso inicial avaliada, consistindo geralmente na inicializao de uma varivel de controle. 2. Em seguida, avaliada condio: 2.1. Se a condio for verdadeira, o <bloco de comandos> executado e, ao se chegar ao delimitador } ou final do comando for, automaticamente se incrementa ou se decrementa a varivel de controle e se retorna avaliao da condio; 2.2. Quando a condio ficar falsa, ou seja, o incremento/decremento fazer a varivel de controle chegar no limite da condio, o comando de repetio finalizado.

Os delimitadores { e } so obrigatrios quando existe mais de um comando no <bloco


de comandos>. Quando existir apenas um comando, os delimitadores ficam opcionais e o ; funcionar como delimitador de fim, indicando o final do comando for.

88 Informaes importantes sobre o comando for e exemplos de utilizao: for (i=3; i<=5; i++) printf(O valor de i eh: %i\n, i); Neste caso, i a varivel de controle, inicial corresponde a i=3; condio corresponde a i<=5; e incremento corresponde a se somar 1 varivel de controle i++. Pode-se omitir a expresso inicial, se esta j tiver sido avaliada anteriormente no programa, porm o ponto e vrgula deve permanecer. i=3; for ( ; i<=5; i++) printf(O valor de i eh: %d\n, i); A expresso inicial pode ser qualquer expresso vlida em C. i=3; for (printf(comecou) ; i<=5 ; i++) printf(O valor de i : %d\n, i); Pode-se, tambm, omitir a expresso incremento ou decremento, e avali-la no corpo da instruo for. i=3; for ( ;i <= 5; ) { printf(O valor de i e: %d\n, i); i++; } Note que quando o corpo da instruo for consistir de mais de um comando, necessrio que estes sejam colocados entre os delimitadores { }. A expresso condio pode ser constituda de expresses conectadas por operadores lgicos. for(i=0; (i<10 && aux!=0); i++) { printf(\n %d, aux); --aux; }

89 achou= i= 0; for( ; (i<10 && achou==0); i++) { printf(\n Digite um inteiro: ); scanf(%i, &aux); achou = (aux == -1); }

Usando vrgulas, pode-se criar expresses constitudas de duas sub-expresses, de forma a se realizar duas tarefas. As sub-expresses sero avaliadas da esquerda para a direita e toda a expresso ser avaliada como o valor da expresso da direita. for(i=0, j=10; i<10; i++, j--) printf(\n%d, %d, i, j);

A instruo for pode ser aninhada, ou seja, executada dentro de outra instruo for. for(linha=0; linha<10; linha++) { for(coluna=0; coluna<10; coluna++) printf(\n%d, matriz[linha][coluna]); } Podem-se omitir as trs expresses: inicial, condio e incremento: for( ; ; ) tendo-se ento um loop infinito, que pode, no entanto, ser interrompido dentro do corpo da instruo for por um comando break. i=10; for( ; ; ) { if (i==0) break; --i; } Exemplos de comandos for vlidos: for (i=10; i>0; i--) printf(\nContador decrescente= %i,i);

90 i= soma = 0; for ( ; i < 10; i++) { printf(\nDigite o valor da nota do aluno %i= ,i); scanf(%f,&nota); soma = soma + nota; } for (j=1; j<=1000; j++) { if (j % 2 == 0) printf(\n %i eh par ,j); else printf(\n %i eh impar ,j); } for (j=1; j<=1000; j++) { printf(\nDigite um numero negativo: ); scanf(%i,&n); if (n>=0) break; else printf(\nValor absoluto de %i = %i, n, abs(n)); }

Exemplos de comandos for INVLIDOS: (i=10; i<0; i--) printf(\nContador decrescente= %i,i); (o comando for no ser executado nenhuma vez, pois o valor inicial menor que o valor final e i-- indica contagem decrescente) for (i=10; i>0; i--); printf(\nContador decrescente= %i,i); for

(o comando for no vai fazer nada, pois tem um ; indevido i-- ); que faz com que o for finalize printf ser executado uma nica vez ) for (j=1; j<=1000; j--) { if (j % 2 == 0) printf(\n %i eh par ,j); else printf(\n %i eh impar ,j); } (o comando for no vai parar nunca, pois a condio nunca vai ser falsa; o certo seria usar j++ e no j--)

91

5.7. Comandos de Leitura e Escrita em C


Na linguagem C h diversos comandos de leitura e cada um deles mais adequado aos diferentes tipos bsicos. Para a leitura de nmeros o comando deve ser scanf Para a leitura de caracter nico, o melhor comando o getche() Para a leitura de strings (cadeia de caracteres) o melhor comando gets() A sintaxe dos comandos de entrada : scanf(%letra, & varivel); em que %letra representa os especificadores de formato e depende do tipo associado varivel: %d ou %i para variveis do tipo int e %f para variveis do tipo float varivel = getche(); gets(varivel); para variveis do tipo char (nico) para variveis do tipo char (string)

A tabela abaixo mostra um exemplo de declarao de variveis de tipos bsicos, a forma correta de leitura e as bibliotecas do C a serem includas. Declarao
int numero; float valor; char c;

Leitura
scanf(%i, &numero); scanf(%f, &valor); c=getche();

Exemplos de contedos
numero = -5; numero = 2002; valor = -5.867; valor = 2002.50; c = 5; c = s; c = #; Atribuio somente atravs de funo: strcpy(nome, Ana);

Biblioteca a ser includa


stdio.h stdio.h conio.h

char nome[20];

gets(nome);

conio.h string.h

92 A sintaxe dos comandos de sada : printf(\n frase puts(\n frase); No comando printf, entre podem ser escritas somente frases ou frases formadas por palavras intercaladas pelos especificadores de formato %s, %c, %i, %d ou %f descritos nos comandos de leitura. Caso haja especificadores, para cada especificador utilizado, a varivel do tipo correspondente deve constar da <lista de variveis>. A lista de variveis opcional; deve existir somente quando um especificador de formato colocado na frase entre aspas e, neste caso, deve haver uma vrgula separando a frase da lista de variveis e vrgulas separando as variveis da lista. Os nmeros do tipo float podem ser impressos com formato, no comando printf, para evitar a forma cientfica, ou seja, para serem impressos em forma estendida. A parte fracionria truncada caso haja mais casas fracionrias do que a delimitada pelo formato, mas a parte inteira nunca truncada. Exemplos: %.2f (2 casas na parte fracionria), %3.0f (no mnimo 3 casas na parte inteira, mas no ocorre truncamento nunca, e nenhuma casa na parte fracionria). \n um cdigo de barra invertida que salta uma linha na tela. Pode ser usado em qualquer %letra , <lista de variveis>);

Explicao do comando de eimpresso: posio dentro passo-a-passo das aspas em ambos os comandos, puts printf, e opcional.
O comando puts salta uma linha aps a impresso da frase, mesmo sem \n e no printf (frase varivel1 varivel2 varivel3); imprime variveis. entre a frase e a varivel e entre as variveis deve haver uma vrgula separando-as printf (frase , varivel1, varivel2, varivel3); a frase deve vir entre printf (\nfrase , varivel1, varivel2, varivel3); dentro da frase deve vir um formato para cada varivel, compatvel com o seu tipo bsico printf (\nfrase %s %i %f ,varivel1,varivel2,varivel3); Exemplo: printf (\nVc se chama %s, tem %i anos e %.2f metros de altura , nome, idade, altura);

93 Exemplos de comandos de entrada e sada vlidos: puts (\nQual eh o seu nome? ); gets(nome); printf (\nQual eh a sua idade? ); scanf (%i,&idade); puts (\nQual eh a sua altura? ); scanf (%f,&altura); puts (\nQual eh o seu sexo? (F/M) ); sexo=getche(); printf (\n%s, voce tem %i anos e\n %.2m de altura\n, nome, idade, altura);

printf (\nVoc foi aprovado no curso com media= %2.1f, media);

5.8. Comentrios em C
Os comentrios no pertencem s instrues do programa C, mas so teis para que o programador explique o que est sendo feito. Os comentrios podem vir delimitados entre /* */ Ou podem ser comentrios de linha //

Exemplos de comentrios: /* Este trecho calcula a media de notas */ desc = preco*0.15; // calcula desconto de 15%

94

5.9. Bloco de Programa em C


O Bloco de Programa em C tem a forma: /* comentrios */ <incluso de bibliotecas> <declarao de variveis> void main() { <bloco de comandos> } Apesar de opcional, todo programa C deve comear com o nome do arquivo .c em um comentrio dizendo o que o programa faz. Em seguida devem ser includas as bibliotecas .h que sero utilizadas no programa, atravs da diretiva #include < > Em seguida devem ser declaradas todas as variveis que sero utilizadas no <bloco de comandos>. Aps a declarao das variveis deve-se escrever a palavra main( ), ou int main() ou void main() que delimita a seo em que os comandos podem ser utilizados. O <bloco de comandos> pode conter todos os comandos vlidos em C, separados por ; e estes devem estar contidos entre os delimitadores { e }. Nenhum comando pode ser usado fora desta seo, a no ser o comando de atribuio para inicializar variveis na sua declarao. importante notar que letras maisculas e minsculas alteram os identificadores e as palavras reservadas do C. Alguns compiladores C no aceitam void main( ), mas int main() ou apenas main(). Nestes casos, necessrio colocar-se o comando return 0; antes de finalizar o programa.

95 Exemplo de programas escrito em C vlidos:


/* nomesexo.c: le o nome e o sexo de uma pessoa e imprime uma frase dizendo se masculino ou feminino */ #include <stdio.h> #include <conio.h> char nome[20], sexo; int main () { puts (Qual eh o seu nome? ); gets(nome); printf (\nQual eh o seu sexo? (F/M) ); sexo=getche(); if (sexo == F || sexo == f) printf (\n%s, voce eh do sexo feminino. ,nome); else printf (\n%s, voce eh do sexo masculino. ,nome); puts(\n Fim do programa); getch(); // para a tela return 0; } /* switch.c - avalia o conhecimento do usurio */ #include <stdio.h> #include <conio.h> int opcao; int main() { printf(\nTeste de avaliacao de conhecimento\n); printf(\nPergunta: Em que ano o Brasil foi descoberto?); printf(\n 1- Em 100 AC por Pitagoras); printf(\n 2- Em 1492 por Cristovao Colombo); printf(\n 3- Em 1500 por Pero Vaz de Caminha); printf(\n 4- Em 1500 por Pedro Alvares Cabral); printf(\n Qual a sua escolha? ); scanf(%d,&opcao); switch(opcao) { case 1: printf(\nVoce precisa ler mais sobre a historia grega !); break; case 2: printf(\nEle chegou nos paises vizinhos...); break; case 3: printf(\n Naturalmente voce eh um f da carta do descobrimento!); break; case 4: printf(\n Resposta certissima !); break; default: printf(\nVoce nao escolheu nenhuma das alternativas validas.); } printf(\n Fim do programa ); getch(); return 0; }

96

5.10. Funes teis em C


Caro aluno, a linguagem C fornece uma srie de funes teis que pertencem a diferentes bibliotecas. Segue uma pequena lista das principais funes que voc poder usar quando se fizer necessrio. 5.10.1. Funes da biblioteca string.h: strcat (destino, fonte); anexa o string <fonte> ao string <destino> strcpy (destino, fonte); copia o string <fonte> para o string <destino> strcmp (string1,string2); compara o <string1> com o <string 2> pela ordem alfabtica (conforme tabela ASCii), resultando em: menor que 0: <string1> menor que <string2> igual a 0: <string1> igual a <string2> maior que 0: <string1> maior que <string2> strchr(string, caracter); verifica se o <caracter> se encontra na <string> e retorna a posio da primeira ocorrncia do <caracter> no <string>; se o <caracter> no for encontrado, retorna NULL tamanho = strlen(string); retorna o <tamanho> de uma <string> em nmero de caracteres. strrev(string); retorna a <string> invertida, ou seja, os caracteres em ordem contrria. strupr(string); retorna a <string> convertida para letras maisculas. strlwr(string); retorna a <string> convertida para letras minsculas. 5.10.2. Funes da biblioteca ctype.h: letra=toupper(letra); converte uma <letra> para maisculo. letra=tolower(letra); converte uma <letra> para minsculo.

97 5.10.3. Funes da biblioteca conio.h clrscr(); limpa a tela textcolor(cor); muda a cor da letra textbackground(cor); muda a cor do fundo gotoxy(coluna, linha); posiciona o cursor nas coordenadas especificadas 5.10.4. Funes da biblioteca math.h Trigonomtricas sin() Retorna o valor do seno. Recebe como argumento o valor dos graus em double. cos() Retorna o valor do cosseno. Recebe como argumento o valor dos graus em double. tan() Retorna o valor da tangente. Recebe como argumento o valor dos graus em double. Logartmicas log() Retorna o valor do logaritmo na base 2. Exige um argumento do tipo double. log10() Retorna o valor do logaritmo na base 10. Exige um argumento do tipo double. Potenciao pow() Retorna o valor da base elevada ao expoente. Recebe dois argumentos do tipo double, o primeiro a base e o segundo o expoente. Por exemplo: se quisermos saber o resultado da operao 210, faramos pow (2, 10). sqrt() Retorna o valor da raiz quadrada. Recebe como argumento um double do qual ele deve extrair a raiz.

98 Arredondamento ceil() Retorna o primeiro float sem casas decimais acima. Recebe um float como argumento. Exemplo: ceil (45.98561) resultaria em 46. floor() Retorna o primeiro float sem casas decimais abaixo. Recebe um float como argumento. Exemplo: floor (45.98561) resultaria em 45. 5.10.5. Funes da biblioteca stdlib.h break; x= atoi(str); atol(); atof(); strtol(); finaliza um comando de repetio (no switch finaliza um case) recebe o string str e retorna um inteiro em x, caso o string seja um nmero

converte um string para long int converte um string para double converte um long int para string

A funo system est na biblioteca <stdlib.h> system(cls); Limpa a tela system(pause); Faz uma pausa ou para a tela system("color 0B"); Cor de fundo preta e letras azuis brilhantes system ("color /? |more"); Mostra todas as cores e seu cdigo system("calc"); Chama a calculadora system("notepad"); Chama o bloco de notas system("dir"); Mostra os arquivos do diretrio corrente system ("ipconfig"); Mostra a configurao do ip

99

5.11. Traduo de PortuC para a Linguagem C


Como voc viu, caro aluno, aprender PortuC ajuda bastante a aprender C! Use a tabela abaixo para ajud-lo na traduo de comandos do PortuC para C! Comandos/Tipos Funo principal Retorno de funo Atribuio Tipos bsicos PortuC principal ( ) C int main() return = int long int float char %i ou %d %f %c %s %ld if else switch getche() gets scanf printf puts while && || !

= inteiro inteiro longo real caracter inteiro real caracter nico string inteiro longo se seno escolha leia leia leia imprima imprima enquanto e ou no

Formatos

Condicional Seleo Mltipla Leitura de caracteres Leitura de strings Leitura de nmeros Escrita Escrita sem variveis Repetio Operadores lgicos

100 Caro aluno, voc deve implementar todos os programas em C usando o compilador de sua preferncia. No final da apostila eu indico um compilador que fcil de ser encontrado na internet, gratuito e fcil de usar (o compilador Dev C++).
/* sexo.c: le o nome e o sexo de uma pessoa e imprime uma frase dizendo se masculino, feminino ou invalido */ caracter nome[20], sexo; principal ( ) { imprima (Qual eh o seu nome? ); leia(%s,nome); imprima (Qual eh o seu sexo? (f/m) ); leia (%c,sexo); se (sexo == f ou sexo == F) imprima (%s voce eh do sexo feminino. ,nome); seno se (sexo == m ou sexo == M) imprima (%s voce eh do sexo masculino. ,nome); seno imprima (Voce digitou um sexo invalido ); imprima(Fim do programa.); }

/* sexo.c: le o nome e o sexo de uma pessoa e imprime uma frase dizendo se masculino, feminino ou invalido */

#include <stdio.h> #include <conio.h> char nome[20], sexo; int main() { puts (Qual eh o seu nome? ); gets(nome); puts (\nQual eh o seu sexo? (f/m) ); sexo = getche(); if (sexo == f || sexo == F) printf (\n%s voce eh do sexo feminino. ,nome); else if (sexo == m || sexo == M) printf (\n%s voce eh do sexo masculino. ,nome); else printf (\nVoce digitou um sexo invalido ); puts(\nFim do programa.); getch(); return 0; }

101
/* idade.c: le o ano atual e o ano de nascimento de uma pessoa e imprime uma frase dizendo qual eh a idade da pessoa */ inteiro anoatual, anonasc, idade; principal() { imprima (Qual eh o ano atual? ); leia(%i,&anoatual); imprima (Qual eh o seu ano de nascimento? ); leia (%i,&anonasc); idade = anoatual anonasc; imprima (Voce fez ou fara %i anos , idade); imprima(Fim do programa.); }

/* idade.c: le o ano atual e o ano de nascimento de uma pessoa e imprime uma frase dizendo qual eh a idade da pessoa */ #include <stdio.h> #include <conio.h> int anoatual, anonasc, idade; main() { printf (\nQual eh o ano atual? ); scanf(%i,&anoatual); printf (\nQual eh o seu ano de nascimento? ); scanf (%i,&anonasc); idade = anoatual anonasc; printf (\nVoce fez ou fara puts(\nFim do programa.); getch(); return 0; }

%i anos , idade);

102
/* parimpar.c: le um numero e verifica se ele eh par ou impar */ inteiro n; principal() { imprima (\nDigite um numero inteiro: ); leia (%i,&n); se (n % 2 == 0) imprima (O numero %i eh par , n); seno imprima (O numero %i eh impar , n); imprima( Fim do programa.); }

/* parimpar.c: le um numero e verifica se ele eh par ou impar */ #include <stdio.h> #include <conio.h> int n; int main() { printf (\nDigite um numero inteiro: ); scanf(%i,&n); if (n % 2 == 0) printf (\nO numero %i eh par , n); else printf (\nO numero %i eh impar , n); puts(\nFim do programa.); getch(); return 0; }

103
/* nota.c: le a nota de um aluno e verifica se ele foi aprovado ou reprovado */ real nota; principal() { imprima (Digite sua nota final: ); scanf(%f,&nota); se (nota >= 6.0) imprima (Voce foi aprovado! ); seno imprima (Voce foi reprovado... ); imprima( Fim do programa.); }

/* nota.c: le a nota de um aluno e verifica se ele foi aprovado ou reprovado */ #include <stdio.h> #include <conio.h> float nota; void main() { printf (\nDigite sua nota final: ); scanf(%f,&nota); if (nota >= 6.0) printf (\nVoce foi aprovado! ); else printf (\nVoce foi reprovado... ); printf(\n Fim do programa.); getch(); }

104

Lista de Exerccios 5.1


5.1.1. Traduzir o algoritmo em PortuC para C:
/* Eleicoes.c: este programa computa os votos de uma eleio e divulga os nmeros obtidos e o candidato vencedor.*/ inteiro voto, vencedor, brancos, nulos, eleitores, cont1, cont2, cont3;

principal() { imprima (digite o seu voto (1,2,3 ou 0(branco) -1 finaliza): ); leia (%i,&voto); brancos=nulos=eleitores=cont1=cont2=cont3=0; enquanto (voto != -1) { ++eleitores; se (voto == 1) ++cont1; seno se (voto == 2) ++cont2; seno se (voto == 3) ++cont3; seno se (voto == 0) ++brancos; seno ++nulos; imprima (digite o seu voto (1,2,3 ou 0(branco) 1 finaliza): ); leia (%i,&voto); } se ((cont1 > cont2) e (cont1 > cont3)) vencedor = 1; seno se ((cont2 > cont1) e (cont2 > cont3)) vencedor = 2; seno vencedor = 3; imprima imprima imprima imprima } (o candidato vencedor foi: %i , vencedor); (numero de votos em branco: %i , brancos); (numero de votos nulos: %i ,nulos); (numero de eleitores: %i ,eleitores);

5.1.2. Crie uma nova verso do programa em C do exerccio 5.1.1 utilizando o comando switch no lugar do ninho de comandos if. 5.1.3. Faa um programa em C que calcule e imprima o valor em Reais correspondente aos dlares que um turista possui no cofre do hotel. O programa deve solicitar os seguintes dados: quantidade de dlares guardados no cofre e cotao do dlar naquele dia. 5.1.4. Faa um programa em C para calcular e imprimir o valor a ser pago pelo perodo de estacionamento do automvel. O usurio entra com os seguintes dados: hora e minuto de entrada, hora e minuto de sada. Sabe-se que este estacionamento cobra R$ 10.00 por hora ou frao.

105 5.1.5. Faa um programa em C que leia o valor do salrio atual e calcule e imprima o valor do novo salrio de um funcionrio. Considere que o funcionrio dever receber um reajuste de 15% caso seu salrio seja menor que R$500.00. Se o salrio for maior ou igual a 500, mas menor ou igual a R$1000.00, o reajuste deve ser de 10%. Caso o salrio seja maior que R$1000.00, o reajuste deve ser de 5%. 5.1.6. Faa um programa em C que tendo como dados de entrada o preo de um produto e seu cdigo de origem, apresente o preo e a sua procedncia, de acordo com a tabela abaixo: Cdigo de Origem 1 2 3 4 5 Procedncia Sul Sudeste Centro-Oeste Norte Nordeste

106

Captulo 6 Usando Comandos de Repetio em C


6.1. Comando de repetio entrada indeterminada de dados (uso de flags)
Aqui voc vai aprender a usar o comando repetitivo e a resolver problemas que envolvam flags. Flag vem do ingls e significa sinal ou bandeira. Um flag em programao representa um valor que usado para indicar o final da entrada de dados. Como j foi dito antes, um algoritmo usado para resolver problemas finitos. Se algum pede que faamos um programa para ler uma quantidade indeterminada de nmeros... aparentemente no poderamos escrever um algoritmo para resolv-lo. Mas se um flag informado, a soluo se torna possvel: faa um programa para ler uma quantidade indeterminada de dados, sabendo-se que o ltimo valor ser 1.... Veja bem: a quantidade de nmeros continua indeterminada, isso , no sabemos se sero 5, 20, 2 ou 2000 nmeros, mas sabemos que o ltimo 1! Assim, -1 o flag e os nmeros sero lidos at que seja fornecido o 1, quando o programa ir parar de ler os nmeros... Vamos ver isso na prtica!

1) Escreva comandos para ler e imprimir vrios nmeros inteiros. O ltimo nmero 0 (flag=0). printf(\nDigite um numero inteiro: ); scanf(%i,&n); while (n != 0) { printf(\nNumero lido: %i , n); printf(\nDigite outro numero inteiro (0 para terminar): ); scanf(%i,&n); }

importante que voc observe a lgica de um trecho de algoritmo que trabalha com flag. Antes de o nmero n ser processado, necessrio verificar se ele o flag ou no. Por isso feita uma leitura ANTES do incio do comando de repetio while. No entanto, necessrio que o nmero n seja lido novamente dentro do comando while para que a condio que determina a finalizao do comando seja modificada (seno o comando while nunca para) e tambm para que a leitura indeterminada de dados prossiga; essa nova leitura feita no FINAL do comando while!

107 No pretendo aqui dar uma receita de bolo para voc seg uir, mas apenas chamar a sua ateno para a lgica deste tipo de problema que poder ser utilizada, com certeza, em muitos outros problemas que envolvam o uso de flags... 2) Escreva comandos para ler e imprimir vrios nmeros inteiros e contar a quantidade de nmeros lidos. O ltimo nmero 0 (flag=0). Imprima, tambm, a quantidade de nmeros. printf(\nTecle um numero inteiro: ); scanf(%i,&n); cont = 0; while (n != 0) { printf(\n Numero lido: %i , n); ++cont; printf(\nTecle outro numero inteiro (0 para terminar): ); scanf (%i,&n); } printf(\nA quantidade de numeros lidos foi: %i ,cont);

importante que voc observe a lgica para se contar a quantidade de nmeros fornecidos. Quando o flag utilizado, sabe-se que a entrada de dados indeterminada. Quando se deseja saber quantos valores vlidos foram fornecidos necessrio usar um contador (neste algoritmo o cont). O contador tem que ser inicializado com zero. Cada vez que uma repetio realizada (ou seja, cada vez que o comando while executado), soma-se mais 1 ao contador. A impresso do contedo do contador s pode ser feita aps o final do comando while, quando temos a certeza de que a entrada de dados foi finalizada (ou seja, o flag foi fornecido). 3) Escreva comandos para ler e somar vrios nmeros inteiros. O ltimo nmero -1 (flag= -1). soma = 0; printf(\nTecle um numero inteiro: ); scanf(%i,&n); while (n != -1) { soma = soma + n; printf(\nTecle outro numero inteiro (flag= -1): ); scanf(%i,&n); } printf(\nA soma dos numeros= %i , soma);

108

4) Escreva comandos para ler e imprimir a idade e o nome de vrias pessoas (ltima idade=0).

printf(\nQual eh sua idade? ); scanf(%i,&idade);


while (idade != 0) { printf(\nQual eh seu nome? ); gets(nome); fflush (stdin); printf(\n %s sua idade=%i anos ,nome,idade);

printf(\nQual eh sua idade? (0 para terminar): ); scanf(%i,&idade);


} Temos, neste exemplo, um caso em que h mais de uma varivel a ser lida e apenas uma dessas variveis vai funcionar como flag. Neste caso, a lgica tem que ser um pouco alterada: a varivel que ser utilizada como flag deve ser lida ANTES do comeo do comando while e sua leitura deve ser repetida DENTRO do comando imediatamente ANTES DO FINAL do comando while (observe os comandos em destaque); todas as outras variveis devem ser lidas apenas uma vez, DENTRO do comando while, bem no seu incio! Caro aluno, a linguagem C apresenta um problema quando usamos o comando gets() dentro de um comando de repetio: necessrio limpar o teclado para dar certo! Isso feito atravs do comando fflush (stdin); 5) Escreva comandos para ler e imprimir a idade, o nome e a altura vrias pessoas (ltima idade=0). Crie uma forma alternativa. while (1) { printf(\nQual eh sua idade? (0 para terminar): ); scanf(%i,&idade); if (idade==0) break; printf(\nQual eh seu nome? ); gets(nome); fflush (stdin); printf(\nQual eh sua altura? ); scanf(%f,&altura); printf(\n%s sua idade=%i anos e sua altura=%.2f m, nome,idade, altura); }

109

Observe que, neste exemplo, o comando while no para nunca, pois a condio sempre 1, ou seja, sempre verdadeira. Para finalizar o comando while, foi utilizado o comando break. Ou seja, quando o usurio digitar 0 para a idade, o comando while finalizado pelo break. Isso pode ser feito, sim, sem problemas!

6.2. Comando de repetio entrada de dados determinada


Voc vai continuar usando um comando repetitivo, mas para resolver problemas que envolvam contadores. Ao contrrio do que vimos na seo 6.1, em que entradas indeterminadas de dados foram tratadas, aqui estudaremos os problemas cuja entrada de dados DETERMINADA. Se algum pede que faamos um programa para ler um conjunto de 10 nmeros... seria necessrio que contssemos de 1 at 10 e, a cada contagem, lssemos um dos nmeros do conjunto para que, no final, todos os 10 valores tivessem sido lidos. Este tipo de problema requer o uso de contadores para facilitar a contagem dos dados de entrada. Existe um comando especfico para fazer esta contagem, que o comando for, embora tambm possamos usar o comando while. Vamos ver isso na prtica! 6) Escreva comandos para ler e imprimir o nome de 5 pessoas. cont = 0; while (cont < 5) { printf(\nQual eh seu nome? ); gets(nome); fflush (stdin); printf(\nSeu nome : %s ,nome); ++cont; } Novamente importante que voc observe a lgica de um trecho de programa que trabalha com entrada determinada de dados. Antes de o nome ser lido necessrio zerar o contador cont. Da utiliza-se o comando while cuja condio exatamente o contador ser menor do que o nmero de dados a serem lidos ( cont < 5, neste caso). DENTRO do comando while feita, uma nica vez, a leitura do nome, o nome impresso e somente no FINAL do comando while e o contador incrementado de 1.

110 No entanto, este mesmo trecho pode ser escrito com um comando mais adequado, que o comando for! Vejamos: for (cont=0; cont < 5; cont++) { printf(\nQual eh seu nome? ); gets(nome); printf(\nSeu nome : %s ,nome); fflush (stdin); } Percebeu como mais fcil? O comando for comea do zero e vai somando 1 varivel de controle cont at que cont fique igual a 5! DENTRO do comando for feita, uma nica vez, a leitura do nome e o nome impresso. 7) Escreva comandos para ler e imprimir o nome, a idade e a altura de 10 pessoas. for (cont=0; cont < 10; cont++) { printf(\nQual eh seu nome? ); gets(nome); fflush (stdin); printf(\nQual eh a sua idade? ); scanf(%i,&idade); printf(\nQual eh a sua altura? ); scanf(%f,&altura); printf(\n%s, voc tem %i anos e %1.2f de altura., nome,idade,altura); } Observe que quando h mais de uma varivel a ser lida, todas elas devem ser lidas apenas uma vez DENTRO do comando for. A contagem fica como antes... Fcil, no ? 8) Escreva comandos para pedir ao usurio o nmero de dados que ele deseja fornecer (N) e leia e imprima o nome e a quantidade que ele forneceu.

printf(\nQuantos dados voc deseja fornecer? ); scanf(%i,&n);


for (cont=0; cont < n; cont++ ) { printf(\nQual eh seu nome? ); gets(nome); fflush (stdin); printf(\nSeu nome eh: %s ,nome); } printf(\nForam fornecidos %i dados,n);

111

Note que a nica mudana na soluo deste tipo de problema a leitura da quantidade de dados ANTES do comando for e a mudana na condio de finalizao para (cont < n)... 9) Reescreva o trecho 8) usando while (1). cont = 0; printf(\nQuantos dados voc deseja fornecer? ); scanf(%i,&n); while (1) { printf(\nQual eh seu nome? ); gets(nome); fflush (stdin); printf(\nSeu nome eh: %s ,nome); ++cont; if (cont==n) break; } printf(\nForam fornecidos %i dados,n); 10) Reescreva o trecho 9) usando for ( ; ; ). cont = 0; printf(\nQuantos dados voc deseja fornecer? ); scanf(%i,&n); for ( ; { ; ) printf(\nQual eh seu nome? ); gets(nome); fflush (stdin); printf(\nSeu nome eh: %s ,nome); ++cont; if (cont==n) break; } printf(\nForam fornecidos %i dados,n);

112

Lista de exerccios n 6.1


Vamos praticar um pouco mais, agora. A minha forte recomendao, novamente, que voc faa os exerccios sozinho, consultando os exemplos dados para ajud-lo... Somente depois da sua tentativa que voc deve conferir as respostas... Boa sorte! 6.1.1. Escreva um programa em C que leia e imprima o nome e as duas notas de vrios alunos. O ltimo aluno ter o nome=FIM. 6.1.2. Escreva um programa em C que leia 10 nmeros e calcule e imprima a sua soma. 6.1.3. Escreva um programa em C que calcule e imprima N nmeros pares, comeando do zero. Pergunte ao usurio quantos nmeros ele deseja (ou seja, pea-lhe para fornecer o valor de N). 6.1.4. Quais os resultados produzidos pelo programa? #include <stdio.h> int X, Y; int main() { Y = 0; X = -1; while (Y != 4) { X = X * -1; ++Y; if (X > 0) /* X positivo? */ printf(\n%i,Y); else printf(\n%i,-Y); } return 0; } Para que seja possvel voc acompanhar a execuo do programa em C, vamos criar uma tabela para fazermos o chamado teste de mesa de um programa em C. A tabela deve ter uma coluna para cada varivel e uma coluna especial para a impresso dos resultados. O programa em C deve ser seguido comando a comando e os valores das variveis devem ir sendo alterados de acordo com as instrues. X Y Resultados

113

6.1.5. Faa o teste de mesa do programa abaixo e construa a tabela com os valores das variveis e os resultados do programa. #include <stdio.h> int numero, cont; main() { numero = 2; for (cont=0; cont < 5; cont++) { printf(%i,numero); printf(%i\n,-numero); numero = numero + 2; } return 0; } numero cont Resultado

114

6.3. Exemplo dos Minutos Telefnicos


A empresa TELEFUN est interessada em saber qual foi o maior nmero de minutos gastos no ms dentre os assinantes e quantos assinantes atingiram esse valor. Faa um programa que leia os valores dos minutos (o ltimo valor ser 1) e imprima os resultados desejados pela empresa. Passo 1 (Ler e entender o problema) Uma certa cia. telefnica quer saber qual foi o maior nmero de minutos gastos num certo ms e quantos assinantes empataram atingindo este valor mximo. Por exemplo, se o conjunto de minutos fornecido: 200, 150, 300, 200, 300, -1 O resultado seria: 300 foi o maior nmero de minutos e 2 assinantes atingiram o valor mximo. Passo 2 (Dados de entrada) 1) Valor dos minutos Passo 3 (Dados de sada) 1) Maior nmero de minutos 2) Quantos assinantes atingiram o maior nmero de minutos Passo 4 (Variveis auxiliares) - No h variveis auxiliares a serem geradas (Para se chegar a esta concluso, o raciocnio foi o seguinte: para o clculo do maior nmero de minutos necessrio apenas comparar o valor dos minutos (dado de entrada) com o maior valor de minutos (dado de sada), ou seja, no precisa de varivel auxiliar; para saber a quantidade de assinantes, somente o contador necessrio...) Passo 5 (Declarar as variveis) int minutos, maiorminutos, quantos; (Uma varivel para cada entrada, sada e cada auxiliar: total de 3 variveis. Todas do tipo int.) Passo 6 (Inicializar as variveis) printf(\nDigite o numero de minutos: ); scanf (%i,& minutos); (varivel de entrada do tipo int: inicializada com scanf)

115 maiorminutos = 0; (quando se deseja selecionar o maior valor, uma estratgia possvel considerar o primeiro valor lido como sendo o maior ou ento como sendo zero e depois fazer a comparao dos outros valores com este...) (contador: inicializado com zero. Poderia ser inicializado na declarao tambm.) Passo 7 (clculo das sadas) quantos = 0; H apenas 2 variveis de sada, ento dois trechos a serem construdos. Para se selecionar o maior nmero de minutos necessrio compar-lo com o valor dos minutos que sero lidos. O comando a ser utilizado o if. if (minutos > maiorminutos) { maiorminutos = minutos; quantos = 1; } No caso dessa comparao ser verdadeira, o maior valor dos minutos deve ser mudado: maiorminutos = minutos. Mas, ao se alterar o valor do maiorminutos, o contador de assinantes que o atingiram deve ser retornado para 1, pois este seria o primeiro assinante que o utilizou: quantos = 1. Resta, agora, contar a quantidade de assinantes que atingiram o valor mximo de minutos. Isso deve ser feito atravs de outra comparao. Cada vez que o valor do maior nmero de minutos for encontrado novamente, deve-se somar 1 ao contador: if (minutos == maiorminutos) ++quantos; No entanto, estes 2 trechos devem ser unidos num nico comando if, pois no se deve somar +1 ao contador quantos quando ocorre a troca do valor de maiorminutos, seno o contador ficaria sempre com um 1 a mais. Para manter os dois trechos separados, o contador quantos teria que ser inicializado com zero. Faa alguns testes voc mesmo para entender melhor esta explicao. if (minutos > maiorminutos) { maiorminutos = minutos; quantos = 1; } else if (minutos == maiorminutos) ++quantos;

116 Passo 8 (Impresso dos resultados) if (maiorminutos !=0) { printf(\nO maior numero de minutos foi: %i , maiorminutos); printf(\nAssinantes que atingiram o maior nro de minutos: %i, quantos); } else printf (\nNenhum valor valido foi fornecido);

Passo 9 (Montagem do programa)


/* telefun.c: este programa l um conjunto de valores de minutos, seleciona o maior deles e conta quantos assinantes atingiram este valor */ #include <stdio.h> #include <conio.h> int minutos, maiorminutos=0, quantos=0;

int main() { printf(\nTelefun: quem fala mais ao telefone???\n); while (1) { printf(\nDigite o numero de minutos (-1 finaliza): ); scanf(%i,&minutos); if (minutos = -1) break; if (minutos > maiorminutos) { maiorminutos = minutos; quantos = 1; } else if (minutos == maiorminutos) ++quantos; } if (maiorminutos !=0) { printf(\nO maior numero de minutos foi: %i , maiorminutos); printf(\nAssinantes que atingiram o maior nro de minutos: %i, quantos); } else printf (\nNenhum valor valido foi fornecido); printf(\nFim do programa); getch(); return 0; }

117 Passo 10 (Fazer o teste de mesa do algoritmo) Suponha os seguintes valores de entrada: 100, 50, 100, 150, 150, 10, 150 , -1
minutos 100 50 100 150 150 10 150 -1 maiorminutos 0 100 quantos 0 1 2 1 2 3 O maior nmero de minutos foi: 150 Nmero de assinantes que atingiram o maior nmero de minutos: 3 Resultados

150

Suponha o seguinte valor de entrada: -1


minutos -1 maiorminutos 0 quantos 0 Resultados Nenhum valor valido foi fornecido

6.4. Exemplo do Preo Final de Automveis


O preo final de um automvel novo calculado da seguinte forma: ao preo de fbrica so acrescidos 35% de IPI e sobre o preo j com o IPI acrescido 5% correspondente ao ICMS. Faa um programa que leia o nome de vrios modelos de automveis (flag=FIM) e o seu preo de fbrica e calcule e imprima o seu preo final. Passo 1 (Ler e entender o problema) Suponhamos a seguinte entrada de dados: BMW 70000.00 GOL 20000.00 FIM O preo final do BMW seria assim calculado: IPI 70000.00 x 0.35 = 24500.00 PRIPI 70000.00 + 24500.00=94500.00 FINAL PRIPI x 1.05 = 99225.00 O preo final do GOL seria assim calculado: IPI 20000.00 x 1.35 = PRIPI 20000.00 + 7000.00=27000.00 FINAL PRIPI x 1.05 = 28350.00

118 Passo 2 (Dados de entrada) 1) Nome do modelo do automvel 2) Preo de fbrica do automvel Passo 3 (Dados de sada) 1) Preo final do automvel Passo 4 (Variveis auxiliares) 1) Valor do IPI 2) Preo do automvel com o IPI (Para se chegar a esta concluso, o raciocnio foi o seguinte: dado o preo de fbrica, primeiro calcula-se o preo com o IPI numa varivel auxiliar; depois feito o clculo do preo do carro com o valor do IPI, gerando duas variveis auxiliares) Passo 5 (Declarar as variveis) char nome[20]; float prFabrica, IPI, prIPI, prFinal;

(Uma varivel para cada entrada, uma para cada sada, uma para cada auxiliar: total de 5 variveis) Passo 6 (Inicializar as variveis) printf(\nForneca o nome do modelo do automovel: ); gets (nome); printf(\nForneca o preco de fabrica do automovel: ); scanf (%f,&prFabrica); (variveis de entrada: inicializadas com comandos de leitura) (as outras variveis no precisam de valores iniciais, pois o IPI, o preo com o IPI e o preo final sero calculados diretamente) Passo 7 (Escrever o cdigo para calcular as sadas) H apenas uma varivel de sada, ento um trecho de algoritmo a ser construdo. Para se chegar ao preo final, no entanto, primeiro necessrio calcular o preo com o IPI. IPI = prFabrica * 0.35; prIPI = prFabrica + IPI; prFinal = prIPI * 1.05;

119 Aqui so apresentadas 2 formas diferentes de se fazer o clculo de porcentagem. No caso do IPI, isso foi feito em 2 passos: primeiro calcula-se o IPI e depois soma-se este valor ao preo de fbrica para se obter o preo com IPI. No caso do ICMS, foi feito um nico clculo multiplicando-se o preo com IPI por 1.05. Neste caso, o valor 1 na parte inteira faz com que seja somado ao preo com IPI o valor do ICMS! Passo 8 (Impresso dos resultados) printf(\nIPI= R$%.2f ICMS= R$%.2f,IPI,prIPI*0.05); printf (\nO preco final do automovel %s= R$ %.2f , nome, prFinal); Passo 9 (Montagem do algoritmo)
/* zerokm.C: este programa le o nome e o preco de fabrica de varios automoveis e calcula seu preo final. */ #include #include #include #include <stdio.h> <conio.h> <string.h> <stdlib.h>

char nome[20]; float prFabrica, IPI, prIPI, prFinal; int main() { printf(\nOlha o tanto de imposto que pagamos nos carros!!!); while (1) { printf(\nForneca o nome do modelo do automvel (FIM para terminar): ); gets (nome); if (strcmp(nome,FIM)==0) break; printf(\nForneca o preco de fabrica do automovel: ); scanf (%f,&prFabrica); IPI = prFabrica * 0.35; prIPI = PrFabrica + IPI; prFinal = prIPI * 1.05; printf(\nIPI= R$%.2f ICMS= R$%.2f,IPI,prIPI*0.05); printf (\nPreco final do automovel %s= R$ %.2f ,nome, prFinal); fflush(stdin); //limpa o teclado para evitar erros na leitura de strings } puts (\nFim do programa); getch(); return 0; }

120 Passo 10 (Fazer o teste de mesa do programa) Suponha os seguintes valores de entrada: FOX 30000.00 SCOOTER 10000.00 MILLE 12000.00 CIVIC 50000.00 FIM nome
FOX SCOOTER

prFabrica
30000.00 10000.00

IPI
10500.00 3500.00

prIPI

prFinal

Resultados

MILLE CIVIC FIM

12000.00 50000.00

4200.00 17500.00

40500.00 42525.00 IPI= R$ 10500.00 ICMS=2025.00 Preco final do automovel FOX= R$42525.00 13500.00 14175.00 IPI= R$ 3500.00 ICMS=675.00 Preco final do automovel SCOOTER= R$14175.00 16200.00 17010.00 IPI= R$ 4200.00 ICMS=810.00 Preco final do automovel MILLE= R$17010.00 67500.00 70875.00 IPI= R$ 17500.00 ICMS=3375.00 Preco final do automovel CIVIC= R$70875.00 Fim do programa

6.5. Exemplo da Eleio


Existem 3 candidatos a uma vaga no senado. Durante a eleio, os votos so computados eletronicamente atravs do seguinte cdigo: 1, 2, 3 votos para os candidatos 1, 2 e 3 0 voto em branco 0,1,2,3 voto nulo -1 fim dos votos Fazer um programa que compute os votos da eleio, fornea o nmero do candidato vencedor, a quantidade de votos nulos e brancos e a quantidade de eleitores que participaram da eleio. Suponha que no haver empates.

121 Passo 1 (Ler e entender o problema) Vamos simular a eleio e computar seus resultados. Esses foram os votos: 0,2,3,2,3,1,1,1,3,2,0,1,1,0,3,5,1,9,3,-1. Votos do candidato 1: 6, votos do candidato 2: 3, votos do candidato 3: 5, votos em branco: 3, votos nulos: 2, total de eleitores: 19. Resultados: Candidato vencedor: 1 Quantidade de votos brancos: 3 Quantidade de votos nulos: 2 Total de eleitores: 19 Passo 2 (Dados de entrada) 1) Votos Passo 3 (Dados de sada) 1) Candidato vencedor 2) Votos brancos 3) Votos nulos 4) Total de eleitores Passo 4 (Variveis auxiliares) 1) Contador de votos para o candidato 1 2) Contador de votos para o candidato 2 3) Contador de votos para o candidato 3 Passo 5 (Declarar as variveis) int int int voto; vencedor, brancos, nulos, eleitores; cont1, cont2, cont3;

Passo 6 (Inicializar as variveis) printf(\nDigite o seu voto (1,2,3 ou 0(branco)): ); scanf (%i,&voto); (varivel de entrada: inicializada com scanf) brancos=nulos=eleitores=cont1=cont2=cont3=0; (contadores: inicializados com zero. Em C possvel inicializar vrias variveis com o mesmo valor num nico comando de atribuio mltipla! )

122 Passo 7 (Escrever o cdigo para calcular as sadas) Para se saber quem foi o candidato vencedor, necessrio, primeiro, computar os votos: ++eleitores; if (voto == 1) ++cont1; else if (voto == 2) ++cont2; else if (voto == 3) ++cont3; else if (voto == 0) ++brancos; else ++nulos;

Existe uma outra maneira muito mais prtica de se realizar esta comparao. Basta usar o comando de seleo mltipla switch. Veja como fica a soluo. ++eleitores; switch (voto) { case 0: ++brancos; break; case 1: ++cont1; break; case 2: ++cont2; break; case 3: ++cont3; break; default: ++nulos; }

Note que os dois trechos de cdigo fazem exatamente a mesma coisa, mas de formas diferentes. Escolha a que achar mais fcil. Ao se computar os votos, as sadas 2, 3 e 4 foram obtidas, resta, agora obter o candidato vencedor. if ((cont1 > cont2) && (cont1 > cont3)) vencedor = 1; else if ((cont2 > cont1) && (cont2 > cont3)) vencedor = 2; else vencedor = 3;

123 Passo 8 (Impresso dos resultados) printf(\nO candidato vencedor foi: %i , vencedor); printf(\nNumero de votos em branco: %i ,brancos); printf(\nNumero de votos nulos: %i ,nulos); printf(\nNumero de eleitores: %i ,eleitores);

Passo 9 (Montagem do programa)


/* Eleicoes.c: computa os votos de uma eleio e divulga os nmeros obtidos e o candidato vencedor.*/ #include <stdio.h> #include <conio.h> int voto, vencedor, brancos, nulos, eleitores, cont1, cont2, cont3;

int main () { printf(\nEleicoes Ficha Limpa por um Brasil melhor!\n); brancos=nulos=eleitores=cont1=cont2=cont3= 0; while (1) { printf (\nDigite o seu voto (1,2,3 ou 0(branco) -1 finaliza): ); scanf (%i,&voto); if (voto==-1) break; ++eleitores; switch (voto) { case 0: ++brancos; break; case 1: ++cont1; break; case 2: ++cont2; break; case 3: ++cont3; break; default: ++nulos; } } if ((cont1 > cont2) && (cont1 > cont3)) vencedor = 1; else if ((cont2 > cont1) && (cont2 > cont3)) vencedor = 2; else vencedor = 3; printf printf printf printf (\nO candidato vencedor foi: %d , vencedor); (\nNumero de votos em branco: %d , brancos); (\nNumero de votos nulos: %d ,nulos); (\nNumero de eleitores: %d ,eleitores);

puts(\nFim do programa); getch(); return 0; }

124 Passo 10 (Fazer o teste de mesa do algoritmo) Suponha os seguintes valores de entrada: 1,2,2,0,2,1,3, -1 voto cont1 cont2 cont3 brancos 1 2 2 0 2 1 3 -1 0 1 0 1 2 1 3 2 1 0 0 nulos eleitores vencedor 0 0 1 2 3 4 5 6 7 2
O candidato vencedor foi: 2 Numero de votos em branco: 1 Numero de votos nulos: 0 Numero de eleitores: 7 Fim do programa

Resultados

6.6. Exemplo da Srie Numrica


Escreva um programa que leia N e calcule e imprima o valor de S dado por:

Passo 1 (Ler e entender o problema) Vamos simular um determinado valor inicial de N = 5. A srie S resultante seria:

Passo 2 (Dados de entrada) 1) Valor de N Passo 3 (Dados de sada) 1) Valor de S Passo 4 (Variveis auxiliares) 1) Contador de termos 2) Numerador 3) Denominador

125

Passo 5 (Declarar as variveis) int N, cont, num, den; float termo, S;

Passo 6 (Inicializar as variveis) printf(\nDigite a quantidade de termos da serie: ); scanf (%i,&N); (varivel de entrada: inicializada com scanf) S=cont=0; (contadores e somadores: inicializados com zero. m C possvel inicializar vrias variveis com o mesmo valor num nico comando de atribuio mltipla! ) num = 1; den = N; (o primeiro numerador comea com 1 e o primeiro denominador comea com N)

Passo 7 (Escrever o cdigo para calcular as sadas) Para se calcular a sada necessrio gerar os N termos da srie. Cada termo formado pelo numerador dividido pelo denominador. O prximo numerador ganha 1 (soma 1) e o prximo denominador perde 1 (subtrai 1). Observe na soluo a converso para float do resultado de num/den (o resultado seria inteiro pois envolve operandos inteiros). for (cont=0; cont < N; cont++) { termo = (float) num / den; printf("\n %i / %i ", num, den); S = S + termo; ++num; --den; } Passo 8 (Impresso dos resultados) printf ("\n\nO valor da serie S= %.5f \n", S);

126 Passo 9 (Montagem do programa) /* .......................................... serieS.c: Gera a serie S assim formada: S = 1/N + 2/N-1 + ... + N/1 .............................................*/ #include <stdio.h> #include <conio.h> int float N, cont, num, den; termo, S;

int main( ) { printf("Gera a serie S \n"); printf("\nForneca o numero de termos da serie: "); scanf("%d",&N); num den for { = 1; = N; (cont=0; cont < N; cont++) termo = (float) num / den; printf("\n %i / %i ", num, den); S = S + termo; ++num; --den;

} printf ("\n\nO valor da serie S= %.5f \n", S); getch(); return 0; }

Passo 10 (Fazer o teste de mesa do algoritmo) Suponha o seguinte valor de entrada: 4 N 4 cont num 0 1 2 3 1 2 3 4 den 4 3 2 1 1/4 2/3 3/2 4/1 0 + 1/4 0 + 1/4 + 2/3 0 + 1/4 + 2/3 + 3/2 0 + 1/4 + 2/3 + 3/2 + 4/1 1/4 2/3 3/2 4/1 O valor da serie S= 6.41667 termo S

Resultados

127

Lista de Exerccios 6.2


6.2.1. Fazer um programa que leia vrios valores de ngulos (flag=-1) e verifique a qual quadrante pertence este ngulo. 900

20 1800 30

10 40

00 3600

2700 6.2.2. Fazer um programa que leia vrios pares de nmeros N1 e N2 (Flag=N1=0) e calcule e imprima: a) N1 * N2 b) N1 / N2 c) N1 - N2 d) N1 + N2 e) 10% de N1 f) 25% de N2 g) raiz quadrada de N1 h) raiz quadrada de N2 i) a unidade de N1 j) a dezena de N2 k) o resto da diviso inteira de N1 por N2 l) N1 elevado a 3 m) N2 elevado a 2 n) N1 elevado a N2 6.2.3. Fazer um programa para realizar uma pesquisa de opinio sobre um tema de sua escolha. Devem ser lidas a resposta 1-A favor 2- Contra ou 0-Finaliza e o sexo (1=feminino, 2=masculino) dos participantes e calcular e imprimir: a) o nmero de mulheres e o percentual b) o nmero de homens e o percentual c) nmero de votos a favor e percentual d) nmero de votos contra e percentual 6.2.4. Fazer um programa para ler vrios pares de nmeros inteiros e calcular sua soma, subtrao, multiplicao e diviso. Usar n1=0 como flag. 6.2.5. Fazer um programa que leia o NOME, a ALTURA, o PESO e a IDADE de vrios candidatas a modelo (flag=NOME=fim) e verifique se elas podem ser aprovadas ou no para serem modelos: 1.70 <= ALTURA <= 1.85 50 <= PESO <= 60 18 <= IDADE <= 21 6.2.6. Fazer um programa que leia o nmero de termos desejados e gere as sequncias numricas (uma de cada vez, mas ambas no mesmo programa): 2, 4, 8, 16, 32, 64 .... 1, -1, 2, -2, 3, -3, 4, -4....

128

6.2.7. O preo final de um automvel calculado pelo preo de fbrica mais o valor do IPI = 40% sobre o preo de fbrica, mais a porcentagem da concessionria= 10% sobre o preo j com o IPI. Faa um programa que leia o NOME de vrios modelos de automveis (flag=NOME=jegue) e o preo de fbrica e calcule e imprima o seu preo final. 6.2.8. Faa um programa em C para calcular o valor a ser pago pelo perodo de estacionamento de vrios automveis. O usurio entra com os seguintes dados: hora e minuto de entrada, hora e minuto de sada. Sabe-se que este estacionamento cobra hora cheia, ou seja, se passar um minuto ele cobra a hora inteira. Utilize um flag para finalizar a entrada de dados. O valor cobrado pelo estacionamento : o R$ 4,00 para 1 hora de estacionamento o R$ 6,00 para 2 horas de estacionamento o R$ 1,00 por hora adicional (acima de 2 horas) 6.2.9. Faa um programa que leia o cdigo de um livro (* finaliza) e apresente a categoria do livro, conforme a tabela abaixo: Cdigo do Livro Categoria A Fico B C D E Romance Documentrio Audiolivro Tcnico

6.2.10. Fazer um programa que leia vrios pares de coordenadas X e Y (flag=X=1000) e verifique a qual quadrante pertence este ponto (X,Y). A seta indica o sentido positivo dos eixos. Y

20 3
0

10 X 4
0

6.2.11. Fazer um programa para calcular e imprimir o valor de H, dado pela seguinte srie: H= 1 - 2 + 4 - 8 + 16 225 196 169 144 121 .... + 16.384 1

6.2.12. Fazer um programa para calcular a mdia de um conjunto de nmeros inteiros (flag = -1).

129

6.2.13. Fazer um programa para calcular as razes de uma equao do 2 grau. Os valores dos coeficientes A, B e C sero fornecidos pelo usurio. Vc deve perguntar se o usurio deseja fornecer outros dados at que ele responda N (no). 6.2.14. Fazer um programa para gerar todos os nmeros potncia de 2 menores que 1000000 e todos os nmeros mpares menores que 100. Dica: utilize o tipo bsico long int. 6.2.15. Fazer um programa para calcular o valor aproximado de , utilizando-se os N primeiros termos (N dever ser lido) da srie: = 4 - 4 + 4 - 4 + 4 .... 3 5 7 9 6.2.16. Fazer um programa para ler uma sequncia de nmeros inteiros de 5 dgitos (flag = -1), calcular o seu dgito verificador (DV) e imprimir o nmero lido e seu DV separado por um hfen. O DV calculado somando-se os 5 dgitos do nmero, dividindo esta soma por 11 e obtendo o resto desta diviso inteira. Quando o DV for 10, deve-se imprimir X. Exemplo: Nmero lido: 12819 DV = 1 + 2 + 8 + 1 + 9 = 21 11 -11 1 10 Nmero impresso: 12819 - X 6.2.17. Nmeros palndromos so aqueles que tm o mesmo valor se lidos da esquerda para a direita ou da direita para a esquerda, como: 44, 232, 1001, 838, etc. Fazer um programa que leia vrios nmeros inteiros de 4 dgitos (flag= -1) e imprima o nmero lido e uma frase dizendo se ele palndromo ou no. 6.2.18. Fazer um programa para calcular o imposto de renda (IR) de um grupo de contribuintes, sabendo que: a) Devero ser lidos o CPF e a renda anual de cada contribuinte (ltimo contribuinte tem o CPF = 0); b) O IR dever ser calculado de acordo com a tabela: Renda Anual Alquota para clculo do IR at 5000,00 isento de 5000,01 at 50000,00 10 % acima de 50000,01 15 % c) Dever ser impressa uma frase com o CPF do contribuinte, sua renda anual e o valor do IR.

130

6.2.19. Fazer um programa que leia vrios conjuntos de dados com: o NOME de um produto, seu preo de CUSTO, seu preo de VENDA e a QUANTIDADE vendida do produto (ltimo conjunto lido tem NOME do produto=fim) e calcule o lucro obtido com o produto. No final o programa deve imprimir o NOME do produto que deu mais lucro. 6.2.20. Fazer um programa que leia vrios nmeros que representam um determinado nmero de ms do ano (flag=-1), escreva o nome do ms por extenso e o nmero de dias. Se o ms no existir, imprimir uma frase de erro. 6.2.21. Um certo produto custa R$ 100,00 e concedido um desconto de 10% se a compra for acima de 10 unidades, 15% se for acima de 40 unidades e 25% se for acima de 100 unidades. Faa um programa que leia a quantidade desejada por vrios clientes (flag=quantidade=0) e calcule e imprima o preo sem desconto, o valor do desconto (se no houver desconto, imprima 0) e o valor a ser pago com o desconto. 6.2.22. Faa um programa que leia a distncia em quilmetros percorrida por vrios carros (flag=0), a quantidade de combustvel consumida e calcule e imprima o consumo mdio de combustvel. (Consumo= distncia/combustvel) 6.2.23. Faa um programa que leia vrias temperaturas em graus Fahreinheit (flag=1000) e calcule e imprima a temperatura em graus Celsius. (Celsius = (Fahreinheit-32) * (5/9)) 6.2.24. Faa um programa que leia vrios pares de valores N1 e N2 (flag=N1=0), imprima uma frase dizendo se eles so iguais, qual o maior e qual o menor e aps terminar a leitura de todos os nmeros, selecione e imprima o maior e o menor de todos. 6.2.25. Fazer um programa que leia vrios nmeros inteiros (flag=0) e verifique se o nmero primo ou no. Um nmero primo s divisvel por 1 e por ele mesmo. (Sugesto: tente dividir o nmero por 2, 3, 4, 5...at o valor do nmero; se alguma diviso resultar em zero, ele no primo...). 6.2.26. Faa um programa que leia o cdigo de um determinado produto (0 finaliza) e mostre a sua classificao, utilizando a seguinte tabela: Cdigo do Produto (CP) 1 2, 3 ou 4 5 ou 6 7 8 ou 9 Qualquer outro cdigo Classificao Alimento no perecvel Alimento perecvel Vesturio Higiene Pessoal Limpeza e Utenslios Domsticos Invlido

131 6.2.27. Faa um programa que apresente o menu de livros venda numa livraria: Cdigo do Livro 1 2 3 0 Ttulo Informtica para Concursos Java como Programar Use a cabea: C# finaliza Preo 87,00 219,00 99,00

Para cada opo vlida de livro (rejeitar escolhas invlidas), oferecer as formas de pagamento. Cdigo da forma de pagamento 1 2 Condio de pagamento vista com 10% de desconto Em 2 vezes, preo normal de etiqueta sem juros

Imprimir todos os valores de acordo com a escolha do usurio. Rejeitar formas de pagamento invlidas.

132

Outros Programas em C
/*CoresnoDevC.c: mostra como usar cores de texto e de fundo no DevC++ */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { system ("cls"); // limpa a tela system ("color 0B"); // cor de fundo preta e letras azuis brilhantes printf ("\n\n\t\t\tTESTE: AZUL"); getch(); system ("cls"); // limpa a tela system ("color 4C"); // cor de fundo vermelha e letras vermelhas brilhantes printf ("\n\n\t\t\tTESTE: VERMELHO"); getch(); system ("cls"); // limpa a tela system ("color 5D"); // cor de fundo roxa e letras lilases brilhantes printf ("\n\n\t\t\tTESTE: LILAS"); getch(); system ("cls"); // limpa a tela system ("color 0E"); // cor de fundo preta e letras amarelas brilhantes printf ("\n\n\t\t\tTESTE: AMARELO"); getch(); system ("cls"); // limpa a tela system ("color 1B"); // cor de fundo azul e letras azuis claras printf ("\n\n\n"); system ("color /? |more"); getch(); }

133 //for.c - ilustra o uso do comando for e de #define #include <stdio.h> #include <conio.h> #define MAXINT 100 #define MAXLONG 1000000 #define clrscr(); system("cls"); int num, contnum; long int numlong, quadrado; int main() { clrscr(); printf("\n Sequencia de numeros impares menores que %i", MAXINT); printf("\n =============================================\n\n"); for (num=1; num<=MAXINT; num=num+2) { printf("%i\t",num); } getch(); clrscr(); printf("\n Sequencia de numeros pares menores que %i",MAXINT); printf("\n ===========================================\n\n"); contnum=1; num=0; for (; num<=MAXINT; num+=2) { printf("%i\t",num); if (contnum==20) { getch(); contnum=0; } ++contnum; }

134 clrscr(); printf("\n Sequencia de numeros multiplos de 3 menores que %i",MAXINT); printf("\n ====================================================\n\n"); contnum=1; num=3; for ( ; ; ) { printf("%i\t",num); num=num+3; if (num > MAXINT) break; } getch(); clrscr(); printf("\n Sequencia de numeros potencia de 2 menores que %ld",MAXLONG); printf("\n ======================================================\n\n"); for (numlong=2; numlong<=MAXLONG; numlong=numlong*2) { printf("%ld\t",numlong); } getch(); clrscr(); printf("\n Sequencia de quadrados perfeitos menores que %ld",MAXLONG); printf("\n ====================================================\n\n"); quadrado=1; for (numlong=1; quadrado<=MAXLONG; numlong++) { quadrado=numlong*numlong; printf("%ld\t",quadrado); } getch(); printf ("\n\n\n\n Fim do programa"); getch(); return 0; }

135 /*Multiplos3.c: gera multiplos de 3 menores que 500 */ #include <stdio.h> #include <conio.h> int num, contnum; int main() { printf("\n Sequencia de numeros multiplos de 3 menores que 500"); printf("\n ========================================\n\n"); contnum=0; num=3; while (num<500) { printf("%i\t",num); num = num + 3; if (contnum==20) { getch(); contnum=0; } ++contnum; } printf ("\n\n\n\n Fim do programa"); getch(); return 0; }

/*Compara.c: mostra como se apresenta um menu e se comparam strings e numeros */ #include <stdlib.h> #include <conio.h> #include <stdio.h> #include <string.h> char str1[20], str2[20]; int num1, num2, opcao; int main() { while ( 1 ) { printf("\n 1- Compara strings "); printf("\n 2- Compara numeros "); printf("\n 0- Finaliza "); printf("\n\n Escolha sua opcao: "); scanf ("%i", &opcao);

136 if (opcao == 0) { printf ("\n Bye, bye! Pressione ENTER..."); getch(); break; } switch (opcao) { case 1: printf ("\n Forneca o primeiro nome: "); gets(str1); printf ("\n Forneca o segundo nome: "); gets(str2); if (strcmp(str1,str2) > 0) printf ("\n %s vem depois de %s ", str1, str2); else if (strcmp(str1,str2) < 0) printf ("\n %s vem antes de %s ", str1, str2); else printf ("\n Os nomes so iguais."); getch(); break; case 2: printf ("\n Forneca um numero inteiro: "); scanf("%d", &num1); printf ("\n Forneca outro numero inteiro: "); scanf("%d", &num2); if (num1>num2) printf ("\n %d eh maior que %d ", num1, num2); else if (num2>num1) printf ("\n %d eh maior que %d ", num2, num1); else printf ("\n Os numeros sao iguais! "); getch(); break; default: printf ("\n Opao de menu invalida. "); getch(); } // fim do switch } // fim do while (1) return 0; } // fim do main()

137

1 aula Prtica em Laboratrio Estudo Dirigido


1) No caso desta universidade, existe somente um diretrio permitido para execuo de programas, por isso necessrio armazenar seus programas nele. Em sua casa, voc poder usar o diretrio que quiser. Entre no Windows Explorer ou na pasta Computador do desktop e escolha o diretrio E:\EXECUTAVEIS LIBERADOS 2) Em sua casa, faa o download gratuito do compilador Dev-C++ para que voc possa comear a escrever seus programas. 3) No sistema Windows, localize o compilador Dev-C++ e execute o programa. <Iniciar> <Programas> <Programao> <Dev-C++> 4) No DevC++, crie um novo arquivo <Arquivo> <Novo> <Arquivo Fonte> 5) Edite o seguinte programa no editor.
//nota.c: le a nota de um aluno e verifica se foi aprovado ou reprovado #include <stdio.h> #include <conio.h> float nota; char nome[20]; int main() { printf (\nQual eh seu nome? ); gets(nome); printf (\nDigite sua nota final: ); scanf(%f,&nota); if (nota >= 6.0) printf (\n%s, voce foi aprovado! ,nome); else printf (\n%s, voce foi reprovado... ,nome); printf(\n\nFim do programa.); getch(); return 0; }

138 6) A qualquer momento que desejar, salve o seu arquivo. Clique em <Arquivo> <Salvar Como>. V para o diretrio E:\EXECUTAVEIS LIBERADOS\seunome e salve seu arquivo como nota.c e v salvando seu programa enquanto edita. 7) Compile e execute seu programa. Conserte os erros que o compilador apontar antes de executar. Clique em <Executar> <Compilar&Executar> Execute o programa vrias vezes para diferentes valores. 8) Edite o programa C abaixo, salve-o, compile-o e execute-o seguindo os passos ensinados no programa anterior. Para abrir um arquivo novo: <Arquivo> <Novo><Arquivo Fonte>. Salve seu arquivo como idade.c.
/* idade.c: le o ano atual e o ano de nascimento de uma pessoa e imprime uma frase dizendo qual eh a idade da pessoa */ #include <stdio.h> #include <conio.h> int anoatual, anonasc, idade; char nome[20]; int main() { printf (\nQual eh o seu nome? ); gets(nome); printf (\nQual eh o ano atual? ); scanf(%i,&anoatual); printf (\nQual eh o seu ano de nascimento? ); scanf (%i,&anonasc); idade = anoatual anonasc; printf (\n%s, voce fez ou fara puts(\nFim do programa.); getch(); return 0; }

%i anos , nome, idade);

139 9) Edite o programa C abaixo, salve-o, compile-o e execute-o seguindo os passos ensinados no programa anterior. Para abrir um arquivo novo: <Arquivo> <Novo><Arquivo Fonte>. Salve seu arquivo como parimpar.c.
#include <stdio.h> #include <conio.h> int n; int main() { printf (\nDigite um numero inteiro: ); scanf(%i,&n); if (n % 2 == 0) printf (\nO numero %i eh par , n); else printf (\nO numero %i eh impar , n); puts(\nFim do programa.); getch(); return 0; }

10) Edite o programa C abaixo, salve-o, compile-o e execute-o seguindo os passos ensinados no programa anterior. Para abrir um arquivo novo: <Arquivo> <Novo><Arquivo Fonte>. Salve seu arquivo como menor.c.
/* menor.c: Este programa seleciona o menor numero em uma sequencia de numeros inteiros */ #include <stdio.h> #include <conio.h> int valor, menor;

int main () { printf (\nPrograma para selecionar o menor numero digitado\n); printf (\nDigite um numero inteiro: ); scanf (%i, &valor); menor = valor; while (valor != -1) { if (valor < menor) menor = valor; printf(\nOutro numero inteiro (digite 1 para terminar): ); scanf (%i, &valor); } printf (\nO menor valor lido foi: %i , menor); printf(\n\nFim do programa); getch(); return 0; }

140

Respostas das Listas de Exerccios


Respostas da Lista de Exerccios 1.1
1.1.1)
Exerccio para avaliar o seu nvel de inteligncia. H 3 perguntas, voc tem que respond-las instantaneamente. Responda imediatamente, est bem? Pergunta 1: Est participando de uma corrida. Ultrapassa o segundo. Em que posio termina? Resposta1: Se vc respondeu que chega em primeiro, est absolutamente enganado. Se vc ultrapassou o segundo e tomou o seu lugar, portanto chega na segunda posio. Por favor, na segunda pergunta, nao demore tanto para responder.... Pergunta 2: Se ultrapassa o ltimo, em que posio chega...? Resposta 2: Se vc respondeu que chega em penltimo, no tem mais uma vez razo. Pensa um pouco... como pode ultrapassar o ltimo? Se vc est atrs dele, ele no o ltimo. A pergunta impossvel. Vamos fazer uma ltima tentativa. Por favor, no use papel, caneta ou calculadora para resolver a esta pergunta! E lembre que tem que responder na sua mente e de maneira rpida. Mas para ser rpido! Pergunta 3: Pensa no nmero 1000. Soma-lhe 40. Acrescenta outros 1000. Soma 30. Mais 1000. Agora 20. Agora soma outros 1000. Agora 10. Qual o total? Resposta 3 Deu 5000? A resposta correta 4100.

1.1.2)
1. Tambm houve 21 de Abril de 1984 no Brasil?? Sim, claro veio depois do dia 20 !! 2. Quantos aniversrios teve uma pessoa que viveu 50 anos? 50. 3. Alguns meses tem 31 dias, quantos tm 28? 12, todos tm 28 !!

141

4. Quantos noves (9) existem entre 0 e 100? 20 !! 5. correto que um homem se case com a irm de sua viva? No, porque est morto !! 6. Divida 30 por 1/2 e some 10. Qual o resultado? 70, (30 dividido por 1/2 igual a 60 !! 7. Se h 3 mas e pega em 2, quantas tem? 2, foi as que tirou duas, lembra-se? 8. Um mdico receita trs comprimidos e diz para tomar um a cada meia hora, quantos minutos duram os comprimidos? 60 - Inicia quando toma o primeiro, 30 minutos depois toma o segundo, logo, 30 minutos mais tarde toma o terceiro... 9. Um pastor tem 17 ovelhas. Todas morrem, menos 9. Quantas ficam? 9 10. Quantos animais de cada espcie Moiss colocou na arca? Moiss no tinha arca, era No !! 11. Quantos selos de sessenta centavos h numa dzia? H doze selos numa dzia!

1.1.3)
01. Meu pai tem 42 anos de idade. Meu cachorro tem 8. Se fosse um ser humano, a idade de meu cachorro seria 56 anos. Quantos anos teria meu pai se ele fosse um cachorro? a. 5 b. 6 c. 7 d. 8 e. 9 02. Um senhor, olhando para um retrato, diz: O pai deste homem o pai de meu filho. Ele est olhando para: a. seu prprio retrato b. retrato de seu pai c. retrato de seu filho d. retrato de seu av e. retrato de seu neto 03. No segundo domingo do ms de maio, comemora-se o dia das mes. Este dia, poder cair: a. de 7 a 14 de maio b. de 8 a 15 de maio c. de 8 a 14 de maio d. de 6 a 15 de maio e. de 7 a 13 de maio

142
04. Certa bactria se multiplica to rapidamente que seu nmero dobra a cada minuto. Num caco de vidro ela se multiplica de tal maneira que, em 60 minutos enche a metade do mesmo. Em quanto tempo estar cheio totalmente? a. 61 min b. 90min c. 120min d. 180 min e. 240 min 05. Em uma jarra cabem um litro mais meia jarra. A capacidade da jarra : a. 1 litro b. 1,5 litros c. 2 litros d. 2,5 litros e. 3 litros 06. Numa rvore pousam pssaros. Se pousarem 2 pssaros em cada galho, fica um galho sem pssaros. Se pousar um pssaro em cada galho, fica um pssaro sem galho. O nmero de pssaros : a. 2 b. 3 c. 4 d. 5 e. 6 07. Sabendo-se que seis raposas, em seis minutos, pegam seis galinhas, pergunta-se: quantas raposas em cem minutos pegaro cem galinhas ? a. 100 b. 36 c. 18 d. 6 e. 1 08. Uma pessoa que gosta somente das pessoas que no gostam de si mesmas: a. gosta de si mesma b. no gosta de si mesma c. gosta de algum d. no gosta de ningum e. no existe 9. Em uma urna existem 38 bolas que se diferenciam apenas pela cor: 15 vermelhas, 15 amarelas e 8 azuis. Uma pessoa com os olhos vendados retira uma bola de cada vez da caixa. Qual o nmero mnimo de bolas que deve ser retirado para que ela tenha certeza que saram duas bolas da mesma cor? a. 16 b. 9 c. 8 d. 4 e. 3

143
10. Dispem-se de alguns livros de Fsica do autor A, outros do autor B e outros do autor C. Da mesma forma, temos alguns livros de Qumica do mesmo autor A, outros de B e outros de C. Todos os livros devem ser colocados em duas caixas com o seguinte critrio: na primeira caixa deve-se colocar todos os livros que satisfaam a seguinte condio: "se for do autor A, ento no pode ser de Fsica". Na segunda caixa, os livros que no satisfaam a essa proposio. A primeira caixa deve conter exatamente: a. todos os livros de Fsica ou de Qumica dos autores B e C mais todos os livros de Qumica do autor A. b. todos os livros de Qumica do autor A mais todos os livros de Fsica dos autores B e C. c. todos os livros de Fsica dos autores B e C. d. todos os livros de Fsica do autor A. e. todos os livros de Qumica dos autores A, B e C. 11. Escreva o nmero seguinte nessa sequncia 0, 1, 1, 2, 3, 5, 8, a. 9 b. 10 c. 11 d. 12 e. 13 12. Guilherme, lvaro e Man acabaram de terminar um lanche. Um dos trs rapazes comeu um lanche de presunto, outro um lanche de peru, e o terceiro, um lanche de frango. Apenas uma das afirmaes abaixo verdadeira: Guilherme comeu o lanche de peru Guilherme no comeu o lanche de frango lvaro no comeu o lanche de frango lvaro no comeu o lanche de presunto Ento, Guilherme, lvaro e Man comeram respectivamente, os lanches de: a. presunto, frango, peru b. presunto, peru, frango c. peru, frango, presunto d. peru, presunto, frango e. frango, presunto, peru 13. Escreva o nmero seguinte nessa seqncia 0, 1 , 1 , 2, 4, 7, 13, 24, a. 44 b. 45 c. 46 d. 47 e. 48 14. Um missionrio foi capturado por canibais em uma floresta. Os canibais ento fizeram-lhe a seguinte proposta: - Se fizer uma declarao verdadeira, ser cozido com batatas. - Se fizer uma declarao falsa, ser assado na churrasqueira. Como o missionrio usar a lgica, podemos concluir que: a. ser cozido b. ser assado c. no poder ser cozido nem assado basta dizer Serei assado na churrasqueira d. ser cozido e assado ao mesmo tempo e. Dir: " ruim, hein?"

144
15. O algarismo das unidades do nmero N =1 x 3 x 5 x 7 x 9 x ...... x 999 a. 1 b. 3 c. 5 5 multiplicado por mpar d 5 no final d. 7 e. 9 16. Continuando a seqncia de letras F, N, G, M, H . . ..., ..., temos, respectivamente: a. O, P. b. I, O. c. E, P. d. L, I. e. D, L. 17. Continuando a seqncia 4, 10, 28, 82, ..., temos: a. 236 b. 244 //4 para 10 = 6 x 3 = 18; 10 para 28 = 18 x 3 = 54... c. 246 d. 254 e. 256 18. Em uma avenida reta, a padaria fica entre o posto de gasolina e a banca de jornal, e o posto de gasolina fica entre a banca de jornal e a sapataria. Logo: a. a sapataria fica entre a banca de jornal e a padaria. b. a banca de jornal fica entre o posto de gasolina e a padaria. c. o posto de gasolina fica entre a padaria e a banca de jornal. d. a padaria fica entre a sapataria e o posto de gasolina. e. o posto de gasolina fica entre a sapataria e a padaria. 19. Um tcnico de futebol, animado com as vitrias obtidas pela sua equipe nos ltimos quatro jogos, decide apostar que essa equipe tambm vencer o prximo jogo. Indique a Informao adicional que tornaria menos provvel a vitria esperada. a. Sua equipe venceu os ltimos seis jogos, em vez de apenas quatro. b. Choveu nos ltimos quatro jogos e h previso de que no chover no prximo jogo. c. Cada um dos ltimos quatro jogos foi ganho por uma diferena de mais de um gol. d. O artilheiro de sua equipe recuperou-se do estiramento muscular. e. Dois dos ltimos quatro jogos foram realizados em seu campo e os outros dois, em campo adversrio. 20. Todos os que conhecem Joo e Maria admiram Maria. Alguns que conhecem Maria no a admiram. Logo: a. todos os que conhecem Maria a admiram. b. ningum admira Maria. c. alguns que conhecem Maria no conhecem Joo. d. quem conhece Joo admira Maria. e. s quem conhece Joo e Maria conhece Maria.

145

Respostas da Lista de Exerccios n 3.1


3.1.1) O exerccio pede que voc escreva um algoritmo que leia e imprima o nome e as duas notas de um aluno. Para a soluo deste problema, so necessrias apenas 3 variveis: uma para o nome do aluno, uma para a nota da prova 1 e outra para a nota da prova 2. O nome uma cadeia de caracteres e as notas so do tipo real, pois o aluno pode tirar uma nota 7.5, por exemplo. Veja a soluo completa, analise e reflita. Caso haja dvidas, participe dos chats e dos fruns com seu professor!
/* notas.c: programa que le e imprime 2 notas */ caracter real nome[20]; nota1, nota2;

principal() { imprima (Qual eh o seu nome? leia (%s,nome);

);

imprima (Digite a primeira nota do aluno: ); leia (%f,&nota1); imprima (Digite a segunda nota do aluno: leia(%f,&nota2); );

imprima (%s, sua 1a nota foi: %1.2f e a sua 2a nota foi: %1.2f , nome,nota1,nota2); imprima (Fim do programa); }

3.1.2) Voc deve escrever apenas o comando que calcule a mdia das duas notas lidas no exerccio anterior. Isso simples: basta somar as duas notas e dividir a soma por 2. Observe os parnteses envolvendo a soma das duas notas!
media = (nota1 + nota2) / 2;

146 3.1.3) Voc deve escrever um comando que verifique se a mdia calculada no exerccio anterior maior ou igual a 7. Para isto, voc deve usar o comando condicional se. Caso a media seja superior ou igual a 7, vamos imprimir uma frase dizendo que o aluno foi aprovado, caso contrrio, imprimimos uma frase dizendo que foi reprovado. Veja a soluo:
se (media >= 7.0) imprima (Voce foi aprovado! ); seno imprima (Voce foi reprovado...);

3.1.4) Aqui voc deve acrescentar ao algoritmo inicial os comandos para clculo da mdia e critrios de aprovao! Desta maneira a soluo fica completa. Voc ter escrito um algoritmo que l o nome e as duas notas de um aluno, calcula a mdia das notas e imprime uma frase dizendo se ele foi aprovado (mdia maior ou igual a 7.0) ou reprovado.
/* media.c: programa que calcula a media de 2 notas e verifica a aprovacao do aluno */ caracter real nome[20]; nota1, nota2, media; );

principal() { imprima (Qual eh o seu nome? leia (%s,nome);

imprima (Digite a primeira nota do aluno: ); leia (%f,&nota1); imprima (Digite a segunda nota do aluno: leia(%f,&nota2); media = (nota1 + nota2) / 2; se (media >= 7.0) imprima (%s voce foi aprovado! ,nome); seno imprima (%s voce foi reprovado..., nome); imprima(Fim do programa ); } );

147

Respostas da Lista de Exerccios 3.2


3.2.1) Vamos repetir o trecho de comandos se aninhados e depois resolver cada uma das situaes propostas. Observe neste trecho que temos apenas 2 comandos: um comando se que possui outros comandos se dentro dele e o comando C5. Ou seja, o comando C5 est fora do ninho de comandos se, por isso, ser sempre executado, independentemente dos valores de B1, B2 e B3! se (B1) C1; seno se (B2) se (B3) C2; seno { C3; C4; }

comando se

C5;

comando C5

a) Se B1 verdadeiro o comando C1 do primeiro se ser executado e o ninho de comandos se ser finalizado (lembre -se que o seno no poder ser executado, pois a condio se B1 foi avaliada como verdadeira!). Finalizado o ninho de comandos se, o prximo comando a ser executado o C5. Resposta: C1 e C5 b) Se B1 falso o seno do primeiro se ser executado e a condio do segundo comando se ser avaliada. Como B2 verdadeiro, o segundo se ser executado e a condio do terceiro comando se ser avaliada. Como B3 falso, o seno do terceiro se ser executado, ou seja, os comandos C3 e C4 sero executados e o ninho de comandos se ser finalizado. Finalizado o ninho de comandos se, o prximo comando a ser executado o C5. Resposta: C3, C4 e C5 c) Se B1 falso o seno do primeiro se ser executado e a condio do segundo comando se ser avaliada. Como B2 verdadeiro, o segundo se ser executado e a condio do terceiro comando se ser avaliada. Como B3 verda deiro, o comando C2 do terceiro se ser executado e o ninho de comandos se ser finalizado. Finalizado o ninho de comandos se, o prximo comando a ser executado o C5. Resposta: C2 e C5

148 d) Se B1 falso o seno do primeiro se ser executado e a condio do segundo comando se ser avaliada. Como B2 falso e no existe o seno do segundo se, o ninho de comandos se ser finalizado. Finalizado o ninho de comandos se, o nico comando a ser executado o C5! Resposta: B1 = Falso, B2= Falso e B3 no precisa ser definido... 3.2.2) Dado um conjunto de respostas sim ou no de vrias pessoas e seu sexo (F=feminino, M=masculino), voc deve escrever comandos em PortuC para verificar se: a) mulher e respondeu SIM
se ((sexo==F ou sexo==f) e resposta == sim) imprima (Voce eh mulher e respondeu sim);

b) homem e respondeu NO
se ((sexo==F ou sexo==f) e resposta == nao) imprima (Voce eh homem e respondeu nao);

c) se mulher ou homem e respondeu NO


se ((sexo==F ou sexo==f) e (sexo==F ou sexo==f) e resposta == nao) imprima (Voce eh homem ou mulher e respondeu nao);

As comparaes com F, M, sim e nao, s vo funcionar se o usurio, claro, escrever as respostas exatamente dessa forma. Se o programador quiser que o programa aceite outros tipos de grafia envolvendo letras maisculas e minsculas, isso deve ser includo no cdigo.

3.2.3) Qual o valor de L aps a execuo desse algoritmo?


inteiro A, B, C; real X, Y; inteiro L; principal() { A = 0; /* falso */ B = 1; /* verdadeiro */ C = 0; /* falso */ X = 1.5; Y = 3.2; se (C ou (X+Y>5) ou no(A e B)) L = 0; seno L = 1; }

149 Aps a inicializao das variveis, a condio do comando se deve ser avaliada. Como esta no uma condio simples, vamos analis-la por partes, lembrando que 0 avaliado como Falso e qualquer outro valor avaliado como Verdadeiro. C Falso (X+Y > 5) (1.5 + 3.2 = 4.7 ... 4.7 > 5 ?) como 4.7 no maior que 5, o resultado Falso no (A e B) (no (Falso e Verdadeiro) que no(Falso)) que Verdadeiro O resultado da expresso fica assim: Falso ou Falso ou Verdadeiro que Verdadeiro! Como a condio do comando se foi avaliada como verdadeira, o comando L=0 ser executado e o algoritmo ser finalizado! Resposta: L=0 3.2.4) Voc deve escrever os trechos de algoritmo em PortuC que ajudem o IBGE a fazer o senso populacional de uma certa cidade, sabendo-se que os seguintes dados foram pedidos aos cidados: SEXO ( H= homem, M= mulher) e RENDA (nmero de salrios mnimos - s.m.). Vamos soluo dos trechos de algoritmo: a) o total de homens
se (sexo == H ou sexo == h) ++contHomens;

b) o total de mulheres
se (sexo == M ou sexo == m) ++contMulheres;

c) o total de pessoas da classe C (at 4 s.m.), da classe B (at 20 s.m.) e da cl. A (acima de 20 s.m.)
se (renda <= 4) ++contClasseC; seno se (renda <= 20) ++contClasseB; seno ++contClasseA;

O trecho da letra c) pode ser escrito em 3 comandos se separados. Voc deve escolher aquele que voc considera mais fcil de entender para usar, ok? Ficaria assim: se (renda<= 4) ++contClasseC; se (renda > 4 e renda <= 20) ++contClasseB; se (Renda > 20) ++contClasseA;

150 Ateno! Todos os contadores utilizados nos trechos de algoritmo devem ser previamente inicializados com 0 (zero).

3.2.5) Fornecidos os dados das candidatas a modelo, voc deve escrever um trecho de algoritmo para verificar se os dados se enquadram nos seguintes limites: ALTURA: de 1.70 a 1.85 m, PESO: de 48.0 a 60.0 Kg e IDADE: de 17 a 21 anos. Se os dados da candidata corresponderem aos limites acima, deve ser impressa uma frase dizendo que ela foi aprovada, caso contrrio, que no foi aprovada. muito simples, basta checar cada um dos quesitos num nico comando se, unindo -os pelo operador lgico e. O uso do e indica que, somente se todos os quesitos forem verdadeiros, a candidata ser aprovada.
se ( (altura >= 1.70 e altura <= 1.85) e (peso >= 48 e peso <= 60) e (idade >=17 e idade <= 21) ) imprima(Candidata aprovada); seno imprima(Candidata reprovada);

3.2.6) Voc deve modificar o exerccio anterior para que uma frase seja impressa aps a
verificao de cada quesito dizendo se a candidata foi aprovada ou no em cada um deles e uma frase final dizendo se foi aprovada ou no como modelo. Observe a estratgia que eu utilizei para saber se a candidata foi reprovada em algum quesito: eu usei uma varivel inteira que funciona como uma varivel lgica aprovada. Essa varivel foi inicializada com verdadeiro (1) e somente no caso de algum quesito ser reprovado, ou seja, no caso de algum seno ser executado, essa varivel passaria a ter o valor falso (0), indicando a reprovao da candidata. Mas existem outras solues, claro. Uma delas foi criada por um aluno que usou um contador: cada vez que um quesito era aprovado, ele somava 1 ao contador; no final se o contador fosse igual a 3 a candidata estaria aprovada, caso contrrio, teria sido reprovada.
aprovada = 1; se (altura >= 1.70 e altura <= 1.85) imprima (quesito altura aprovado!); seno { imprima (reprovada no quesito altura); aprovada = 0; } se (peso >=48 e peso <=60) imprima(quesito peso aprovado!) seno { imprima(reprovada no quesito peso.); aprovada = 0; } se (idade >=17 e idade <= 21) imprima(quesito idade aprovado!) seno { imprima(reprovada no quesito idade); aprovada = 0; } se (aprovada) imprima(Candidata aprovada); seno imprima(Candidata reprovada);

151

Respostas da Lista de Exerccios 5.1


5.1.1.
/* Eleicoes.c: este programa computa os votos de uma eleio e divulga os numeros obtidos e o candidato vencedor.*/ #include <stdio.h> #include <conio.h> int voto, vencedor, brancos, nulos, eleitores, cont1, cont2, cont3; int main() { printf(\nDigite o seu voto (1,2,3 ou 0(branco) -1 finaliza): ); scanf (%i,&voto); brancos=nulos=eleitores=cont1=cont2=cont3=0; while (voto != -1) { ++eleitores; if (voto == 1) ++cont1; else if (voto == 2) ++cont2; else if (voto == 3) ++cont3; else if (voto == 0) ++brancos; else ++nulos; printf(\n Digite o seu voto (1,2,3 ou 0(branco) 1 finaliza): ); scanf (%i,&voto); } if ((cont1 > cont2) && (cont1 > cont3)) vencedor = 1; else if ((cont2 > cont1) && (cont2 > cont3)) vencedor = 2; else vencedor = 3; printf(\n O candidato vencedor foi: %i , vencedor); printf(\n Numero de votos em branco: %i , brancos); printf(\n Numero de votos nulos: %i ,nulos); printf(\n Numero de eleitores: %i ,eleitores); printf(\nFim do programa); getch(); return 0; }

152 5.1.2.
/* Eleicoes2.c: computa os votos de uma eleio e divulga os numeros obtidos e o candidato vencedor usando o comando switch.*/ #include <stdio.h> #include <conio.h> int voto, vencedor, brancos, nulos, eleitores, cont1, cont2, cont3;

int main () { brancos=nulos=eleitores=cont1=cont2=cont3= 0; while (1) { printf (\nDigite o seu voto (1,2,3 ou 0(branco) -1 finaliza): ); scanf (%d,&voto); if (voto==-1) break; ++eleitores; switch (voto) { case 0: ++brancos; break; case 1: ++cont1; break; case 2: ++cont2; break; case 3: ++cont3; break; default: ++nulos; } } if ((cont1 > cont2) && (cont1 > cont3)) vencedor = 1; else if ((cont2 > cont1) && (cont2 > cont3)) vencedor = 2; else vencedor = 3; printf printf printf printf (\nO candidato vencedor foi: %d , vencedor); (\nNumero de votos em branco: %d , brancos); (\nNumero de votos nulos: %d ,nulos); (\nNumero de eleitores: %d ,eleitores);

puts(\nFim do programa); getch(); return 0; }

153 5.1.3. Este exerccio j foi resolvido passo a passo em PortuC na lista 4.1.3!
/*exerc513.c: le valor em dolares e converte para reais*/ #include <stdio.h> #include <conio.h> float dolares, reais, cotacao; int main() { printf("\nPrograma para converter dolares em reais\n"); printf("\nQual eh a cotacao do dolar? "); scanf("%f",&cotacao); printf("\nQuantos dolares devem ser convertidos para reais? "); scanf("%f",&dolares); reais = dolares*cotacao; printf("\n%.2f USD convertidos para reais = R$ %.2f ",dolares,reais); printf("\n\nFim do programa"); getch(); return 0; }

154 5.1.4. Aqui a estratgia a seguinte: hora de entrada, de sada, minuto de entrada e de sada so 4 variveis inteiras diferentes. Se a hora de sada menor que a hora de entrada, h um erro! Caso contrrio, temos que verificar se o minuto de sada maior que o minuto de entrada...se for o usurio paga mais 1 hora pela frao...
/*exerc514.c: calcula o valor a ser pago num estacionamento*/ #include <stdio.h> #include <conio.h> int horaent, minent, horasai, minsai, tempo; float valoraserpago; int main() { printf("\nPrograma para calcular o valor a ser pago num estacionamento\n"); printf("\nValor do estacionamento: 10.00 por hora ou fracao\n\n"); printf("\nQual eh a hora de entrada? "); scanf("%i",&horaent); printf("\nQual eh o minuto de entrada? "); scanf("%i",&minent); printf("\nQual eh a hora de saida? "); scanf("%i",&horasai); printf("\nQual eh o minuto de saida? "); scanf("%i",&minsai); if (horasai >= horaent) { tempo = (horasai - horaent); if (minsai > minent) ++tempo; // fracao de minutos implica na cobranca de mais 1 hora valoraserpago = tempo * 10.00; printf("\nTotal a ser pago por %i hora(s) de estacionamento R$ %.2f", tempo,valoraserpago); } else printf("\nErro nos valores de hora de entrada e saida."); printf("\n\nFim do programa"); getch(); return 0; }

155 5.1.5. A estratgia ler o salrio do funcionrio e verificar se vlido. Se for, calculamos o aumento do salrio de acordo com as faixas informadas. Depois somamos o aumento no salrio original e calculamos o novo salrio, dando a boa notcia ao trabalhador!
/*exerc515.c: calcula o novo valor do salario de um funcionario*/ #include <stdio.h> #include <conio.h> float salario, aumento, novosalario; int main() { printf("\nPrograma para calcular o valor do novo salario reajustado de um funcionario\n");

printf("\nQual eh o valor de seu salario atual? "); scanf("%f",&salario); if (salario > 0) { if (salario < 500.00) aumento = salario * 0.15; else if (salario >=500.00 && salario <= 1000.00) aumento = salario * 0.10; else aumento = salario * 0.05; novosalario = salario + aumento; printf("\nVoce teve um reajuste de %.2f e seu novo salrio eh R$ %.2f", aumento,novosalario); } else printf("\nErro no valor do salario. Nao existe salario igual a zero ou negativo.");

printf("\n\nFim do programa"); getch(); return 0; }

156 5.1.6. Este problema um caso tpico de uso do comando switch para verificar em qual caso um certo valor se enquadra!
/*exerc516.c: apresenta a regiao de procedencia de um produto*/ #include <stdio.h> #include <conio.h> float preco; int codigo; int main() { printf("\nPrograma para apresentar a regiao de origem de um produto\n");

printf("\nQual eh o preco do produto? "); scanf("%f",&preco); printf("\nQual eh o codigo da regiao de origem do produto? (1 a 5): "); scanf("%i",&codigo); switch (codigo) { case 1: printf("\nPreco do produto = R$ %.2f - Regiao de origem = SUL", preco); break; case 2: printf("\nPreco do produto = R$ %.2f - Regiao de origem = SUDESTE", preco); break; case 3: printf("\nPreco do produto = R$ %.2f - Regiao de origem = CENTRO-OESTE", preco); break; case 4: printf("\nPreco do produto = R$ %.2f - Regiao de origem = NORTE", preco); break; case 5: printf("\nPreco do produto = R$ %.2f - Regiao de origem = NORDESTE", preco); break; default: printf("\nCodigo da regiao invalido\n"); } printf("\n\nFim do programa"); getch(); return 0; }

157

Respostas de alguns exerccios da Lista 6.1


6.1.1. Voc deve escrever um programa que leia e imprima o nome e as duas notas de vrios alunos. O ltimo aluno ter o nome=FIM. O nico fator um pouco chato na soluo deste problema simples a leitura de strings em C, que deve ser feita usando-se funes da biblioteca <string.h>.
/* notas.c: programa que le e imprime 2 notas de vrios alunos */ #include #include #include #include <stdio.h> <conio.h> <string.h> <stdlib.h>

char nome[15]; float nota1, nota2; int main() { while (1) { printf(\nQual o seu nome? FIM finaliza ); gets(nome); if (strcmp(nome,FIM) == 0) break; printf(\nDigite a primeira nota do aluno: ); scanf(%f,&nota1); printf(\nDigite a segunda nota do aluno: ); scanf(%f,&nota2); printf(\n%s, sua 1a nota foi: %1.2f e a sua 2a nota foi: %1.2f, nome,nota1,nota2); fflush(stdin); //para no dar problema na leitura de strings } puts(\nFim do programa); getch(); return 0; }

158 6.1.2. Voc deve escrever um programa que leia 10 nmeros e calcule e imprima a sua soma. A estratgia usar o comando for, pois j sabemos que sero lidos 10 nmeros. importante aplicarmos a regra bsica da programao: TODO SOMADOR E TODO CONTADOR DEVE SER INICIALIZADO COM ZERO! Alm disso, importante notar que a impresso da soma dos nmeros feita FORA do comando for. Isso porque preciso terminar a leitura dos dados para que a soma final tenha sido calculada e possa ser impressa. /* soma10.c: Programa que le e soma 10 numeros */ #include <stdio.h> #include <conio.h> int numero, soma, cont; int main() { cont=soma=0; for ( ; cont < 10; cont++) { printf(\nDigite um numero inteiro: scanf(%i,&numero); soma = soma + numero; } );

printf(\nA soma dos 10 numeros eh: %i,soma); puts(\nFim do programa); getch(); return 0; }

159 6.1.3. Voc deve escrever um programa que calcule e imprima N nmeros pares, comeando do zero. Voc deve perguntar ao usurio quantos nmeros ele deseja gerar (ou seja, pea-lhe para fornecer o valor de N). Neste caso vamos tambm usar o comando for, pois sabemos que o usurio quer gerar N nmeros pares! /* Pares.c: programa que gera e imprime N numeros pares */ #include <stdio.h> #include <conio.h> int n, numeropar, cont; int main() { printf(\nQuantos nmeros pares devem ser impressos? ); scanf(%i,&n); numeropar = 0; for (cont=0; cont < n; cont++) { printf(\n%i,numeropar); numeropar = numeropar + 2; } puts(\nFim do programa); getch(); return 0; }

Note como os nmeros pares so gerados: inicializa-se a varivel numeropar com zero e depois vai adicionando-se 2 a ela. Dessa forma so gerados 0, 2, 4, 6 ... Fcil, no ?

160 6.1.4. X -1 1 -1 1 -1 Y 0 1 2 3 4 Resultados 1 -2 3 -4

Este exemplo, apesar de simples, mostra claramente como se fazer um teste de mesa. Na primeira linha da coluna mostram-se apenas os valores iniciais das variveis X e Y. Na segunda linha, a condio do comando while foi avaliada como verdadeira (0 != 4=Verdadeiro) e os comandos delimitados por {e } do while foram executados: em X foi colocado o resultado de * -1 (-1*-1=1), Y foi acrescido de 1 (0+1=1) e a condio do comando if foi avaliada como verdadeira, implicando na impresso do valor de Y (1), o que foi mostrado na coluna Resultado. As outras linhas correspondem execuo do lao do comando while. 6.1.5. numero 2 4 6 8 10 12 cont 0 1 2 3 4 5 Resultado 2 -2 4 -4 6 -6 8 -8 10 10

A cada lao do comando for so impressos 2 nmeros numa mesma linha: positivo e negativo. O nmero comea de 2 e vai sendo incrementado de 2. cont comea com zero e vai at 5.

161

Respostas de alguns exerccios da Lista 6.2


Caro aluno, aqui voc encontrar respostas de uma parte dos exerccios da lista 6.2. Voc deve tentar fazer sozinho primeiro, antes de olhar a resposta. Os outros exerccios voc j tem condies de resolver sem ajuda. Mas, caso restem dvidas, use os chats e fruns para solicitar a ajuda de seu professor! Boa sorte! 6.2.1) /*exerc621.c: le o angulo e informa o quadrante*/ #include <stdio.h> #include<conio.h> int angulo; int quadrante; int main() { printf("\nPrograma para apresentar a qual quadrante um angulo pertence\n"); while (1) { printf("\nDigite o valor do angulo (0 a 360) -1 finaliza: "); scanf("%i",&angulo); if (angulo== -1) break; if (angulo >= 0 && angulo < 90) printf("\nO angulo %i pertence ao quadrante 1\n", angulo); else if (angulo >= 90 && angulo < 180) printf("\nO angulo %i pertence ao quadrante 2\n", angulo); else if (angulo >= 180 && angulo < 270) printf("\nO angulo %i pertence ao quadrante 3\n", angulo); else if (angulo >= 270 && angulo <= 360) printf("\nO angulo %i pertence ao quadrante 4\n", angulo); else printf("\nValor de angulo invalido.\n "); } printf("\n\nFim do programa"); getch(); return 0; }

162 6.2.3.
/*exerc623.c: realiza uma pesquisa de opinio, computando votos em numero e em percentual */ #include<conio.h> #include<stdio.h> #include<stdlib.h> int opcao, sexo, afavor=0, contra=0, homens=0,mulheres=0, total; float porcent; int main() { while (1) { system("cls"); // limpa a tela printf ("\nReferendo sobre a internacionalizacao da Amazonia. Qual eh sua opiniao?"); printf ("\n1 - A favor"); printf ("\n2 - Contra"); printf ("\n0 - Finaliza"); printf ("\nDigite a opcao desejada: "); scanf ("%i",&opcao); if (opcao == 0) break; while (1) { printf("\nInforme o seu sexo 1=masculino 2=feminino: "); scanf("%i", &sexo); if (sexo == 1) { ++homens; break; } else if (sexo == 2) { ++mulheres; break; } else printf("\nSexo invalido. Por favor, digite 1 ou 2.\n"); } switch (opcao) { case 1: printf("\nObrigada, voto computado!"); ++afavor; break; case 2: printf("\nObrigada, voto computado!"); ++contra; break;

default: printf("\nOpcao invalida."); } getch(); } // while 1

163

total = mulheres + homens; printf("\nResultados da pesquisa\n"); printf("----------------------"); printf("\n\n%i votante(s) do sexo masculino.", homens); if (total > 0) { porcent = (float) homens/total; printf("\n%.1f %% dos votantes sao homens",porcent*100); } printf("\n\n%i votante(s) do sexo feminino.", mulheres); if (total > 0) { porcent = (float) mulheres/total; printf("\n%.1f %% dos votantes sao mulheres",porcent*100); } total = afavor + contra; printf("\n\n%i votante(s) a favor.", afavor); if (total > 0) { porcent = (float) afavor/total; printf("\n%.1f %% dos votantes sao a favor",porcent*100); } printf("\n\n%i votante(s) contra.", contra); if (total > 0) { porcent = (float) contra/total; printf("\n%.1f %% dos votantes sao contra",porcent*100); } getch(); printf("\n\n\nFim do programa"); getch(); return 0; }

164 6.2.4. /*exerc624.c: le n1,n2 e realiza as 4 operacoes*/ #include<stdio.h> #include<conio.h> int n1,n2,soma,subtr,mult; float divisao; int main() { while (1) { printf("\nDigite um numero inteiro ou -1 para finalizar: "); scanf("%i",&n1); if (n1 == -1) break; printf("\nDigte outro numero inteiro "); scanf("%i",&n2); soma=n1+n2; printf("\na soma de %i+%i=%i",n1,n2,soma); subtr=n1-n2; printf("\na subtracao de %i-%i",n1,n2,subtr); mult=n1*n2; printf("\na multiplicacao de %i+%i=%i",n1,n2,mult); if (n2!=0) { divisao=n1/n2; printf("\na divisao de %i/%i=.3f",n1,n2,divisao); } else { }

printf("\nnao existe divisao por zero");

} printf("\n\nfim do programa"); getch(); return 0; }

165 6.2.6. /*exerc626.c: gera sequencias numericas*/ #include <stdio.h> #include<conio.h> int n, cont, termo; int main() { printf("\nPrograma para gerar sequencias numericas\n"); printf("\nDigite o numero de termos da sequencia de potencias de 2: "); scanf("%i",&n); termo = 2; for (cont=0; cont<n; cont++) { printf(" %i ",termo); termo = termo*2; } printf("\n\n"); printf("\nDigite o numero de termos da sequencia de positivos e negativos: "); scanf("%i",&n); cont = 1; termo = 1; while (cont<=n) { printf(" %i ",termo); termo = termo*-1; ++cont; if (cont % 2 == 1) // cont eh impar? ++ termo; } printf("\n\n"); printf("\n\nFim do programa"); getch(); return 0; }

166 6.2.12. /* exerc6212.c: Este programa le varios numeros inteiros e calcula sua media */

#include <stdio.h> #include<conio.h> int Soma=0, Valor, Cont=0; float Media; int main( ) { printf("\nPrograma que le varios numeros inteiros e calcula sua media\n\n"); while (1) { printf("Forneca um valor inteiro (flag= -1): "); scanf("%d",&Valor); Soma = Soma + Valor; ++Cont; } if (Cont > 0) { Media = Soma/Cont; printf("\nValor da Media dos: %i nmeros = %.2f \n",Cont, Media); } else printf(\nNenhum valor foi fornecido); printf("\nFim do programa... "); getch(); /* para a tela */ return 0; }

167 6.2.13. /*exerc6213.c: calcula as razes de uma equao do 2o grau*/ #include <stdio.h> #include <conio.h> #include <math.h> float a, b, c; // coeficientes da equacao float delta, raiz1, raiz2; char resp; int main() { printf(\nCalcula as raizes de equacoes do 2o grau\n); for ( ; ; ) { printf(\nDigite o coeficiente a: ); scanf(%f, &a); printf(\nDigite o coeficiente b: ); scanf(%f, &b); printf(\nDigite o coeficiente c: ); scanf(%f, &c); if ( a == 0) printf(\nNao eh equacao do 2o grau, pois o coeficiente a eh zero); else { delta = b*b (4*a*c); if (delta >= 0) { raiz1 = - b + sqrt(delta) / (2*a); raiz2 = - b - sqrt(delta) / (2*a); printf(\nRaiz 1 = %.2f Raiz2=%.2f, raiz1, raiz2); } else printf(\nNao existem raizes reais); } printf(\nVoce deseja fornecer novos dados? S/N ); resp = getche(); if (resp==n || resp==N) break; } printf ("\n\n\n\n Fim do programa"); getch(); return 0; }

168 6.2.14. /*exerc6214.c: mostra nmeros potencia de 2 menores que 1000000 usando long int e gera numeros impares menores que 100 */ #include <stdio.h> #include <conio.h> long int numlong; int num;

int main() { printf("\n Sequencia de numeros potencia de 2 menores que 1000000"); printf("\n ===========================================n\n"); numlong=2; while (numlong<1000000) { printf("%ld\t",numlong); // \t corresponde a tabulacao numlong = numlong * 2; } printf("\n Sequencia de numeros impares menores que 100"); printf("\n ===================================\n\n"); num=1; while (num<100) { printf("%i\t",num); num = num + 2; if (num%10==1) getch(); }

printf ("\n\n\n\n Fim do programa"); getch(); return 0; }

169 6.2.15. /*exerc6215.c: aproxima o numero Pi atraves de uma serie */ #include <stdio.h> #include <conio.h> double pi, termo; float num, den; long int n, cont=0;

int main() { printf("\n Aproxima o valor de Pi por uma serie numerica"); printf("\n =================================n\n"); pi=0; printf(\nDigite o numero de termos da serie: ); scanf(%ld,&n); num = 4; den = 1; for (cont=0; cont < n; cont++) { termo = num/den; if (cont % 2 == 0) // se o contador de termos for par, adiciona o termo pi = pi + termo; else pi = pi termo; den = den + 2; } printf("\nO valor de Pi aproximado pela serie com %ld termos = %lf", n, pi)); printf ("\n\n\n\n Fim do programa"); getch(); return 0; }

170 6.2.16) /*exerc6216.c: le numeros e calcula o digito verificador*/ #include <stdio.h> #include<conio.h> long int n; int d1,d2,d3,d4,d5,dv; int main() { printf("\nPrograma para ler numeros e calcular o digito verificador\n"); while (1) { printf("\nDigite um numero inteiro de 5 digitos (-1 finaliza): "); scanf("%ld",&n); if (n == -1) break; if (n >= 10000 && n<=99999) // verifica se o numero tem 5 dgitos { d1 = n / 10000; d2 = (n % 10000) / 1000; d3 = (n % 1000) / 100; d4 = (n % 100) / 10; d5 = n % 10; printf("\nd1= %i d2=%i d3=%i d4=%i d5=%i",d1,d2,d3,d4,d5); dv = (d1 + d2 + d3 + d4 + d5) % 11; if (dv == 10) printf("\n\n%ld - x ", n); else printf("\n\n%ld - %i",n, dv); printf("\n\n"); } else printf("\nEste numero nao tem 5 digitos.\n"); } printf("\n\nFim do programa"); getch(); return 0; }

171 6.2.26) /*exerc6226.c: le o codigo do produto e apresenta sua classificacao*/ #include <stdio.h> #include<conio.h> int codigo; int main() { printf("\nPrograma para apresentar a classificacao de produtos\n"); while (1) { printf("\nQual eh o codigo do produto? (1 a 9 ou 0 para finalizar): "); scanf("%i",&codigo); if (codigo == 0) break; switch (codigo) { case 1: printf("\nClassificacao do produto %i = ALIMENTO NAO PERECIVEL", codigo); break; case 2: case 3: case 4: printf("\nClassificacao do produto %i = ALIMENTO PERECIVEL", codigo); break; case 5: case 6: printf("\nClassificacao do produto %i = VESTUARIO", codigo); break; case 7: printf("\nClassificacao do produto %i = HIGIENE PESSOAL", codigo); break; case 8: case 9: printf("\nClassificacao do produto %i = LIMPEZA E UTENS. DOMESTICOS", codigo); break; default: printf("\nCodigo do produto invalido\n"); } printf("\n"); } // while 1 printf("\n\nFim do programa"); getch(); return 0; }

172

Da autora para o aluno-programador!


E chegamos ao final deste curso bsico de Algoritmos e Linguagem de Programao C! Espero que voc, aluno, j esteja conseguindo fazer seus primeiros programas de computador nesta linguagem to moderna, avanada e instigante, que a linguagem C. Assim, posso cham-lo, agora de aluno-programador! De acordo com nossa metodologia, voc aprendeu a escrever os primeiros algoritmos utilizando o PortuC, uma pseudo-linguagem que o ajudou a quebrar a primeira barreira da linguagem C que so seus comandos escritos em ingls. Rapidamente passamos traduo destes algoritmos para a linguagem alvo e em seguida j pudemos ir para o computador fazer nossos primeiros testes. Espero que voc no pare por aqui, caro aluno. H muitos problemas do mundo real que esperam por solues automatizadas... o desafio grande, mas sua capacidade de aprendizado e de superao maior ainda! Como falamos no captulo inicial, a linguagem C inspirou e foi a base de plataformas e linguagens de programao modernas e atuais como o Java e o C#. Assim, voc j tem a base para encarar desafios maiores e se tornar um grande desenvolvedor. A gente se encontra, ento, no mundo profissional da nossa rea, trocando informaes, aprendendo juntos e trabalhando bastante, pois o mercado profissional amplo e vasto e conta conosco!

Abraos, Profa Elisamara de Oliveira, Dra elisaoli@uol.com.br

173

Bibliografia
SCHILDT, H. C Completo e Total. So Paulo: Makron Books, 1997. MIZRAHI, V.V. Treinamento em linguagem C. mdulo 1. 2 ed. So Paulo: Makron Books, 2006. MIZRAHI, V.V. Treinamento em linguagem C. mdulo 2. 2 ed. So Paulo: Makron Books, 2006. KERNIGHAN, B. W., RITCHIE, D. M. C- A Linguagem de Programao Padro ANSI . Rio de Janeiro: Campus, 1989. TENEMBAUM, A.M. Estruturas de dados usando C. So Paulo: Pearson, 1995. ASCENCIO, Ana Fernanda Gomes; VENERUCHI, Edilene Aparecida. Fundamentos da Programao de Computadores. So Paulo: Prentice Hall, 2007. CALVERT, C. Programando Aplicaes em Windows com C e C++. Rio de Janeiro: Berkeley, 2004. GOTTFRIED, B. S. Programando em C. So Paulo: Makron Books, 2003. AITKEN, P., JONES, B. C - Guia do Programador. Rio de Janeiro: Berkeley Brasil, 1994. FORBELLONE, A. L.; BERSPACHER, H. Lgica de programao. 3.ed. So Paulo: Prentice Hall, 2005. LOPES, A.; GARCIA, G. Introduo a programao: 500 algoritmos resolvidos . Rio de Janeiro: Campus, 2002. SEBESTA, R. W. Conceitos de linguagens de programao . 4 ed. Porto Alegre: Bookman, 2000. MANZANO, Jos A.M.G.; Oliveira, J.F. Algoritmos: lgica para desenvolvimento de programas de computador. 22 ed. So Paulo: rica, 2009.

Das könnte Ihnen auch gefallen