Vous êtes sur la page 1sur 48

a.l.g.o.r.i.t.m.o.

l gica ap licad a - Pro f . Tacla


p g ( 1/48)
arq.: 262181617.doc

Sumrio
1. INTRODUO.................................................................................................................................................................4
2. VARIVEIS....................................................................................................................................................................5
2.1. A Memria RAM....................................................................................................................................................5
2.2. Nomeando Variveis.............................................................................................................................................6
2.3. Sintaxe do Comando de Declarao de Variveis................................................................................................6
2.4. Atribuio de Valores a Variveis.........................................................................................................................6
2.5. Sintaxe da Atribuio de Valores a Variveis.......................................................................................................7
3. ENTRADA E SADA DE DADOS..............................................................................................................................8
3.1. Sada de Dados.....................................................................................................................................................8
3.2. Entrada de Dados.................................................................................................................................................8
4. OPERADORES ARITMTICOS........................................................................................................................................10
5. COMANDOS DE SELEO............................................................................................................................................12
5.1. Seleo Simples...................................................................................................................................................12
5.2. Seleo Mltipla.................................................................................................................................................13
6. COMANDOS DE REPETIO OU LAO.........................................................................................................................16
6.1. Enquanto/While...................................................................................................................................................16
6.2. Execute ... Enquanto/Do ... While.......................................................................................................................19
6.3. Para/for...............................................................................................................................................................20
7. MATRIZ DE VARIVEIS / ARRAY.................................................................................................................................22
7.1. Declarao de uma Varivel Matricial...............................................................................................................22
7.2. Aplicao.............................................................................................................................................................23
8. ESTRUTURAS DE DADOS HETEROGNEAS..................................................................................................................27
9. FUNES.....................................................................................................................................................................28
9.1. Aplicao: Converso de temperatura...............................................................................................................28
9.2. Criao de funes..............................................................................................................................................31
9.3. Aplicao: Jogo da Velha....................................................................................................................................33
9.4. Escopo de Variveis............................................................................................................................................40
9.5. Funes Recursivas.............................................................................................................................................41
10. MTRICAS DE QUALIDADE DE PROGRAMAS.............................................................................................................42
11. COMPILADOR BORLAND C++ 3.1.............................................................................................................................43
11.1. Instrues para Editar/Compilar/Executar um Programa...............................................................................43
12. REFERNCIAS BIBLIOGRFICAS................................................................................................................................44

Lista de Exemplos
Exemplo 1: declarao e atribuio de valores a variveis..................................................................................................5
Exemplo 2: utilizao do comando escreva.........................................................................................................................8
Exemplo 3: utilizao do comando leia................................................................................................................................8
Exemplo 4: utilizao de operadores aritmticos...............................................................................................................10
Exemplo 5: utilizao do SE..............................................................................................................................................12
Exemplo 6: utilizao do comando MultiplasOpcoes........................................................................................................14
Exemplo 7: utilizao do comando Enquanto....................................................................................................................16
Exemplo 8: utilizao do comando Execute ... Enquanto..................................................................................................19
Exemplo 9: utilizao do comando "para".........................................................................................................................20
Exemplo 10: utilizao de variveis matriciais do tipo real...............................................................................................23
Exemplo 11: utilizao de variveis matriciais do tipo caracter........................................................................................23
Exemplo 12: rescrevendo o exerccio 4 da seo 6.1.........................................................................................................23
Exemplo 13: rescrevendo o exemplo anterior....................................................................................................................25
Exemplo 14: Celsius para Farenheit e vice-versa...............................................................................................................28

Lista de Figuras
Figura 1: representao da RAM como um vetor de bytes..................................................................................................5
Figura 2: representao da RAM aps a atribuio do valor 10 a varivel i........................................................................6
Figura 3: representao esquemtica de um vetor de inteiros na memria........................................................................22
Figura 4: representao esquemtica de um vetor de reais na memria............................................................................22
Figura 5: representao esquemtica de um varivel matricial bidimensional tipo caracter na memria.........................22
Figura 6: Representao esquemtica da matriz de preos de produtos............................................................................24
Figura 7: Representao esquemtica da matriz de nomes de produtos............................................................................26
Figura 8: Funo TransformarParaFarenheit (Caixa Preta)................................................................................................29
Figura 9: Funo TransformarParaCelsius (Caixa Preta)...................................................................................................29
l gica ap licad a - Pro f . Tacla
p g ( 2/48)
arq.: 262181617.doc

Figura 10: Diagrama de Funes para o problema da converso de temperaturas............................................................29

Lista de Tabelas
Tabela 1: tipos de dados x tamanho e domnio.....................................................................................................................5
Tabela 2: Operadores aritmticos.......................................................................................................................................10
Tabela 3: Operadores relacionais........................................................................................................................................12
Tabela 4: Operadores lgicos.............................................................................................................................................12

l gica ap licad a - Pro f . Tacla


p g ( 3/48)
arq.: 262181617.doc

1.1. Introduo
Definio: Um algoritmo um conjunto de passos que pode ser executado
mecanicamente em uma quantidade finita de tempo e que resolve algum
problema.
Normalmente, algoritmos so especificados atravs de uma pseudolinguagem, ou seja, uma linguagem com alguma liberdade de sintaxe e
parecida com a linguagem corrente (portugus). Como desejamos
executar nossos algoritmos no computador, adotaremos uma linguagem
com sintaxe rgida. Estudaremos os elementos que constituem a
linguagem que ser utilizada na construo de algoritmos. So eles:
variveis
comandos de entrada e sada
operadores aritmticos
comandos de seleo
comandos de repetio/lao
matrizes de variveis
estruturas de dados hetergeneas
funes

l gica ap licad a - Pro f . Tacla


p g ( 4/48)
arq.: 262181617.doc

1.2. Variveis
Na programao, assim como na lgica de predicados, uma varivel pode
assumir qualquer valor do seu conjunto domnio. As linguagens de
programao contm alguns conjuntos domnio predefinidos os quais
denominamos de tipos de dados nativos. Exemplificando:
Exemplo 1: declarao e atribuio de valores a variveis.
1. inteiro
2. i = 10;

i;

Linha 1:
declarao ou criao de uma varivel do tipo inteiro (um
tipo nativo da linguagem) chamada i. Portanto, i pode
"teoricamente" assumir qualquer valor do domnio Z.
Linha 2: a varivel i assume ou recebe o valor 10 (comando de atribuio)
Quando uma varivel declarada uma quantidade de memria lhe
reservada. A quantidade de memria alocada depende do tipo do dado
utilizado. Na linguagem que utilizaremos, um inteiro ocupar 2 bytes.
Portanto, poderemos representar inteiros no intervalo [-32.768, 32.767].
Num computador, existe limitao para os valores mximo e mnimo de
uma varivel dependente da quantidade de bytes reservado para o tipo da
varivel. A tabela seguinte mostra os tipos de dados que faremos uso com
os respectivos tamanhos:
tamanho
(bytes)

Tipo

caract
er
inteir
o
real
lgico

domnio

caracteres (a, b, ..., 1, 2, ..., *,


& , $, #, ...)
subconjunto de Z

4
1

subconjunto de R
V ou F

Tabela 1: tipos de dados x tamanho e domnio


1.2.1.
A Memria RAM
A memria RAM armazena os cdigos executveis dos programas e os
dados a eles associados (valores das variveis, constantes e outros
necessrios ao funcionamento do programa). De forma esquemtica
podemos representar a memria como um vetor de bytes (fig. 1).
1 byte
endereo fsico

0
1
2
..
.
n

<conted
o>

...
l gica ap licad a - Pro f . Tacla
p g ( 5/48)
arq.: 262181617.doc

Figura 1: representao da RAM como um vetor de bytes


Retomando o Exemplo 1, a grosso modo, pediu-se ao compilador para
reservar 2 bytes (o tamanho de um dado do tipo inteiro) na memria e
identificar estes 2 bytes pelo nome i. Supondo que o compilador reserve a
partir do endereo fsico (posio) 3 os 2 bytes necessrios para a varivel
i teramos a seguinte situao aps o comando de atribuio i = 10.
1 byte
0

endereo fsico

1
2
3
4
..
.
n

<conted
o>

0000
0000
0000
1010
...

10 em
binrio

Figura 2: representao da RAM aps a atribuio do valor 10 a varivel i.


Assim, cada vez que referenciamos a varivel i no algoritmo na verdade
estamos fazendo referncia ao contedo das posies 3 e 4 da memria
RAM.
1.2.2.
Nomeando Variveis
REGRA 1: D nomes significativos. Para identificar, por exemplo, uma
varivel que receber a mdia aritmtica de notas de provas utilize o
nome media (sem acento) ao invs de z, x ou k.
Padres para Nomear Variveis
1) primeira letra identifica o tipo de dado: i, c, r , l (minscula)
2) demais palavras iniciam por letra maiscula (alguns programadores
preferem separar com "_")
Exemplos:
rMediaFinal, cNomeAluno, iCodigo, r_media_final, c_nome_aluno
1.2.3.
Sintaxe do Comando de Declarao de Variveis
<decl> ::= <tipo_dado><lista_vars>;
<lista_vars> ::= <var>,<lista_vars> | <var>
<var> ::= <letra><lista_caracteres> | <letra>
<lista_caracteres> ::= < caracter_no_esp ><lista_caracteres>|<
caracter_no_esp >
<caracter_no_esp>::=<num>|<letra>|-|_
<num>::=0|1|...|9
<letra> ::= a|...| z| A|...|Z
l gica ap licad a - Pro f . Tacla
p g ( 6/48)
arq.: 262181617.doc

<tipo_dado> ::= inteiro |real | logico |caracter


Exemplos:
real rAux;
logico lSexoMasc;
inteiro iCont, iSeq;
1.2.4.
Atribuio de Valores a Variveis
Uma varivel pode receber um valor na sua declarao ou em qualquer
parte do algoritmo.
Na declarao:
inteiro i = 10;

No algoritmo:
inteiro i;
...
i = 10;

1.2.5.
Sintaxe da Atribuio de Valores a Variveis
<atrib> ::= <var> = <expr>;
<expr> ::= <cte> | <expr_aritm>;
...
Obs.: no sero detalhadas as categorias sintticas <expr_aritm>
(expresso aritmtica) e <cte> (constantes).

l gica ap licad a - Pro f . Tacla


p g ( 7/48)
arq.: 262181617.doc

1.3. ENTRADA e SADA DE DADOS


Normalmente, um algoritmo depender de informaes externas que
devero de algum modo ser inseridas no computador. Por exemplo, um
programa que emite extrato bancrio precisa que o usurio fornea o
nmero da agncia, a conta corrente e a senha. Estes dados podem ser via
carto magntico ou teclado. Outros meios de entrada de dados num
computador so: disquete, disco rgido, scanner e mouse.
Uma vez que os dados de entrada tenha sido processados mostram-se ou
gravam-se os resultados num dispositivo de sada: impressora, monitor de
vdeo, discos e etc. Os programas de extrato bancrio imprimem o saldo
da conta-corrente e os lanamentos efetuados.
Nesta seo, so apresentados os comandos que permitem fazer entrada
de dados pelo teclado e sada via monitor de vdeo.
1.3.1.
Sada de Dados
Sintaxe:
<sada>::=escreva "<texto>"; | escreva <expr>;
<texto>::=<caracter><lista_caracteres>|<caracter>
<caracter>::=<letra>|<num>|<caracter_esp>
<caracter_esp>::=~|!|@|#|...
<num>::=0|1|...|9
<letra> ::= a|...| z |A|...|Z
Semntica:
Escreve o texto ou o resultado de uma expresso aritmtica no monitor de
vdeo.
Exemplo 2: utilizao do comando escreva.
1.
2.
3.
4.
5.
6.
7.
8.

// Programa: saida.cpp
linha de comentrio
// Autor :
linha de comentrio
#include "tradutor.h"
traduz comandos de portugus para c++
programa
sempre segue o include acima
inicio
incio da parte principal do programa
inteiro iNrAluno;
escreva "Digite o numero do aluno";
fim
fim da parte principal do programa.

1.3.2.
Entrada de Dados
Sintaxe:
<ent>::=leia <var>;
<var>::= j definido em 2.3
Semntica:
Obtm informao do teclado e coloca o valor digitado na posio de
memria identificada pela varivel <var>.
Exemplo 3: utilizao do comando leia.
l gica ap licad a - Pro f . Tacla
p g ( 8/48)
arq.: 262181617.doc

1.
2.
3.
4.
5.
6.
7.
8.
9.

// Programa: entrada.cpp
linha de comentrio
// Autor
:
linha de comentrio
#include "tradutor.h"
traduz comandos de portugus para c++
programa
sempre segue o include acima
inicio
incio da parte principal do programa
inteiro iNrAluno;
escreva "Digite o numero do aluno";
leia iNrAluno;
fim
fim da parte principal do programa.

Exerccio:
Altere o algoritmo acima para mostrar o valor digitado aps a seguinte
mensagem:
"Voce digitou o nmero:

"

Obs.: utilize os caracteres \n num texto para fazer o cursor mudar de linha
(retorno de carro e mudana de linha).

l gica ap licad a - Pro f . Tacla


p g ( 9/48)
arq.: 262181617.doc

1.4. Operadores Aritmticos


Os operadores mais utilizados so mostrados na tabela seguinte:
Oper
ador
+
Adio
Subtrao
*
Multiplicao
/
Diviso
%
Mdulo (Resto da
diviso)
Tabela 2: Operadores aritmticos.
Exemplo 4: utilizao de operadores aritmticos.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.

// Programa: media.cpp
// Autor :
#include "tradutor.h"
programa
inicio
real rNota1, rNota2;
escreva "\nDigite a primeira nota:";
leia rNota1;
escreva "\nDigite a Segunda nota:";
leia rNota2;
escreva "\nMedia calculada: ";
escreva (rNota1 + rNota2) / 2;
fim

Exerccios:
1. Faa um algoritmo que transforme uma velocidade fornecida em m/s
pelo usurio para Km/h. Para tal, multiplique o valor em m/s por 3,6.
1.
2.
3.
4.
5.
6.
7.
8.
9.

#include "tradutor.h"
programa
inicio
real rVelMS;
escreva "Digite velocidade em m/s: ";
leia rVelMS;
escreva "\nVelocidade m KM/H: ";
escreva rVelMS * 3.6;
fim

2. Faa um algoritmo para calcular a nota semestral de um aluno. A nota


semestral obtida pela mdia aritmtica entre a nota de 2 bimestres.
Cada nota de bimestre composta por 2 notas de provas. Faa um
desenho esquemtico da memria RAM (vide fig. 1 e 2) com as
variveis que voc criou. Mostre, neste desenho, o contedo (o valor)
de cada varivel aps a execuo do programa.
1.
2.
3.
4.
5.
6.
7.

#include "tradutor.h"
programa
inicio
real rNota1, rNota2, rBim1, rBim2;
escreva "Bimestre 1\n";
escreva "==========\n";
escreva "Nota 1: ";
lgica aplicada - Prof. Tacla
p g ( 10/48)
arq.: 262181617.doc

8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.

leia rNota1;
escreva "\nNota 2: ";
leia rNota2;
rBim1 = (rNota1 + rNota2) / 2;
escreva "\nNota primeiro bimestre: ";
escreva rBim1;
escreva "\n\nBimestre 2\n";
escreva "===========\n";
escreva "Nota 1: ";
leia rNota1;
escreva "\nNota 2: ";
leia rNota2;
rBim2 = (rNota1 + rNota2) / 2;
escreva "\nNota segundo bimestre: ";
escreva rBim2;
escreva "\n\nNota semestral:
escreva (rBim1 + rBim2) / 2;
fim

Desenho esquemtico da memria aps a seguinte rodada:


Bimestre 1
==========
Nota 1: 8.5
Nota 2: 7.5
Nota primeiro bimestre: 8

(8.5 foi digitado pelo usurio)


(7.5 foi digitado pelo usurio)
(calculado pelo programa)

Bimestre 2
===========
Nota 1: 8
Nota 2: 6
Nota segundo bimestre: 7

(8 foi digitado pelo usurio)


(7 foi digitado pelo usurio)
(calculado pelo programa)

Nota semestral: 7.57

(calculado pelo programa)

endereo fsico

1 byte
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

rNota1

rNota2

rBim1

rBim2

l gica ap licad a - Pro f . Tacla


p g ( 11/48)
arq.: 262181617.doc

1.5. Comandos de Seleo


A linguagem que estamos estudando comporta os seguintes comandos de
seleo: Seleo simples (SE ou IF) e o de Seleo Mltipla (CASE).
1.5.1.

Seleo Simples

O comando de seleo simples (SE) permite que um bloco de comandos


seja ou no executado dependendo do resultado de um teste. O teste pode
ser uma comparao entre duas variveis, uma varivel e uma constante,
uma expresso aritmtica e uma constante e etc. Logicamente, para
fazermos testes, tambm chamados de expresses condicionais, precisamos
de operadores relacionais e operadores lgicos. A tabela abaixo mostra
aqueles que utilizaremos:
Operador
Relacion
al
>
<
<=
>=
==
!=

Maior
Menor
Menor ou igual
Maior ou igual
Igual
Diferente

importante: no confunda o
smbolo de atribuio "=" com o
relacional "==".

Tabela 3: Operadores relacionais.


Operador
Lgico
e
Conjuno
ou
Disjuno
!
Negao
Tabela 4: Operadores lgicos.
Sintaxe:
<se>::= <se_simples> | <se_completo>
<se_simples> ::= se (<expr_cond>) entao inicio <bloco_cmdos> fim
<se_completo>::=se (<expr_cond>) entao inicio <bloco_cmdos> fim
senao inicio <bloco_cmdos> fim
<expr_cond> ::= /* no ser detalhada */
<bloco_cmdos>::=<cmdo> | <cmdo> <bloco_cmdos>
<cmdo> ::= <sada> | <ent> | <atrib> | <se> | ...
Note que o comando <se_completo> est separado em duas linhas
somente para facilitar a leitura. Normalmente, ele vai seguir uma identao
diferente. Observe tambm que um <cmdo> pode ser qualquer um
lgica aplicada - Prof. Tacla
p g ( 12/48)
arq.: 262181617.doc

daqueles que j estudamos, o prprio SE (se aninhados) e outros que


veremos adiante.
Semntica:
Quando a expresso condicional verdadeira, o bloco de comandos que
segue a palavra "ento" executada, caso contrrio, executado o bloco
que segue a palavra seno.
Exemplo 5: utilizao do SE.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

// Programa: trafego.cpp
// Autor
:
// O programa verifica se dois avies esto na mesma pista.
// Caso estejam, emite mensagem de alerta.
//
#include "tradutor.h"
programa
inicio
inteiro iNrPista1, iNrPista2;
escreva "Informe a pista para o voo 1\n";
leia iNrPista2;
escreva "Informe a pista para o voo 2\n";
leia iNrPista2;
se ( iNrPista1 == iNrPista2) entao
inicio
escreva "ALERTA: possivel colisao\n";
fim
fim

Exerccios:
1. Altere o exemplo acima para que emita mensagem "Voo 1 e 2 liberados"
caso as pistas fornecidas sejam diferentes.
2. Altere o programa media.cpp para apresentar as seguintes mensagens:
"Reprovado" quando a mdia for menor que 4;
"Exame" quando a mdia estiver no intervalo [4, 7[
"Aprovado" caso nenhuma das situaes anteriores.
3. Faa uma pequena calculadora da seguinte forma. Pea ao usurio um
nmero real, em seguida a operao desejada e, finalmente, o segundo
nmero. Resolva a operao pedida (se existir) e apresente o resultado.
Veja abaixo a sada desejada:
Calculadora
===========
Digite o primeiro operando:10.5
Digite a operao: *
Digite o segundo operando: 2
Resultado: 21

(10.5 foi digitado pelo usurio)


(* foi digitado pelo usurio)
(2 foi digitado pelo usurio)
(calculado pelo programa)

4. Elabore o seguinte jogo. Pea dois nmeros inteiros de 0 a 5. Estes dois


primeiros nmeros so como se fossem os nmeros sorteados. Depois,
pea ao apostador 2 palpites (2 nmeros inteiros). Se ele acertou os 2
nmeros mostre uma mensagem indicando que ele venceu. Se ele
acertou somente um dos nmeros ento apresente uma mensagem
mostrando qual nmero ele acertou e, caso no acerte nenhum deles,
apresente "Voc perdeu".

lgica aplicada - Prof. Tacla


p g ( 13/48)
arq.: 262181617.doc

1.5.2.
Seleo Mltipla
Sintaxe:
<sel_multi>::= MultiplasOpcoes( <expr_aritm> )
inicio
<lista_de_casos>
fim
<lista_de_casos> ::= <caso><lista_de_casos> |
<caso><lista_de_casos><caso_contrario> | <caso> |
<caso> ::= caso <cte>: <bloco_cmdos> saia; |
caso <cte>: <bloco_cmdos>
<caso_ contrario > ::= casoContrario <bloco_cmdos>
Semntica:
O comando MultiplasOpcoes permite executar um bloco de comandos
associado a um <caso> em funo do resultado da <expr_aritm>. Assim,
se o resultado da <expr_aritm> coincidir com o valor <cte> associado do
<caso> ento o <bloco_cmdos> respectivo executado. Os exemplos
seguintes elucidam a explicao.
Exemplo 6: utilizao do comando MultiplasOpcoes.
Este exemplo resolve o exerccio 3 da calculadora (item 5.1, seleo
simples).
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.

// Programa: calc.cpp
// Autor
:
// O programa realiza operaes aritmticas entre dois operandos.
//
#include "tradutor.h"
programa
inicio
real rOper1, rOper2;
caracter cOperacao;
escreva "Digite o primeiro operando: "
leia rOper1;
escreva "\nDigite a operao: ";
leia cOperacao;
escreva "\nDigite o segundo operando: "
leia rOper2;
escreva "\nResultado: ";

multiplasOpcoes ( cOperacao )
inicio
caso '+':
escreva rOper1 + rOper2;
saia;
caso '-':
escreva rOper1 - rOper2;
saia;
caso '*':
escreva rOper1 * rOper2;
saia;
caso '/':
escreva rOper1 + rOper2;
saia;
casoContrario:
escreva "Operacao invalida";
fim
lgica aplicada - Prof. Tacla
p g ( 14/48)
arq.: 262181617.doc

37.

fim

Exerccios:
1. Leia do teclado nmeros inteiros de 1 a 7. Mostre o nome do dia da
semana correspondente por extenso.
2. Leia ms e ano do teclado e mostre o nmero de dias correspondente ao
ms lido.
3. Apresente o menu abaixo. Se o usurio escolher Aplicaes Financeiras,
apresente a mensagem "No h aplicaes financeiras", se escolher
Saldo apresente a mensagem "Saldo de conta corrente ou poupana?" e
caso seja Extrato, apresente a mensagem "Extrato de conta corrente ou
poupana?"
Banco Tabajara
===============
1. Saldo
2. Extrato
3. Aplicaes Financeiras

4. Altere o exerccio anterior. Se o usurio selecionar a opo Saldo ou


Extrato apresente o seguinte menu:
a) Poupana
b) Conta Corrente

Se o usurio escolher Poupana, apresente a mensagem "Imprimindo


saldo da poupana" ou "Imprimindo extrato da poupana" dependendo
da primeira opo escolhida. Adote procedimento idntico para extrato.
Se o usurio escolher Aplicaes Financeiras, apresente a mensagem
"No h aplicaes financeiras".

lgica aplicada - Prof. Tacla


p g ( 15/48)
arq.: 262181617.doc

1.6. Comandos de Repetio ou Lao


Os comandos de repetio permitem que um bloco de comandos seja
executado uma ou mais vezes. Existem, basicamente, trs comandos
bsicos pertencentes a este grupo:
1. Enquanto ou while: repete uma bloco de comandos enquanto uma
determinada condio for verdadeira.
2. Execute ... Enquanto ou do ... while: executa pelo menos uma vez um
bloco de comandos e, depois, enquanto uma determinada condio for
verdadeira.
3. Para ou for: repete um bloco de comandos x vezes, onde x uma
quantidade determinada.
1.6.1.
Enquanto/While
Sintaxe:
<enquanto>::= enquanto( <expr_cond > )
inicio
<bloco_cmdos>
fim
|
enquanto( <expr_cond > )
<cmdo>
<expr_cond> ::= /* no ser detalhada */
<bloco_cmdos>::=<cmdo> | <cmdo> <bloco_cmdos>
<cmdo> ::= <sada> | <ent> | <atrib> | <se> | <sel_multi> |
<enquanto>
Semntica:
O <bloco_cmdos> ou o <cmdo> executado enquanto a <expr_cond> for
verdadeira. Quando ela torna-se falsa a execuo do programa passa ao
comando seguinte.
Exemplo 7: utilizao do comando Enquanto.
Queremos converter velocidades de m/s para Km/h at que o usurio
decida parar. Esta deciso ser tomada quando o programa apresentar a
mensagem "Deseja continuar [s/n] ?". Se escolher 's' continuamos a
execuo do programa, caso contrrio, a interrompemos.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

#include "tradutor.h"
programa
inicio
real rVelMS;
caracter cOpcao = 's'; // no esquea de inicializar a varivel.
escreva "Conversor m/s -> Km/h\n";
escreva "Deseja prosseguir [s/n]?";
leia cOpcao;
enquanto (cOpcao == 's')
inicio
escreva "Digite velocidade em m/s: ";
leia rVelMS;
lgica aplicada - Prof. Tacla
p g ( 16/48)
arq.: 262181617.doc

13.
14.
15.
16.
17.
18.
19.

escreva "\nVelocidade m KM/H: ";


escreva rVelMS * 3.6;
escreva "Deseja continuar [s/n]?";
leia cOpcao;
fim
fim

Exerccios:
1. Faa um algoritmo que leia temperaturas at que o usurio decida em
contrrio. Voc identificar esta deciso quando ele digitar 999 para
uma temperatura. Calcule e mostre: a menor temperatura digitada, a
maior temperatura e a temperatura mdia.
2. Escreva um algoritmo para encontrar o n-simo termo de uma
Progresso Aritmtica (PA). Ler a1 (o primeiro termo), r (a razo) e n ( o
nmero de termos). O n-simo termo calculado pela frmula an = a1 +
r * (n - 1). Consistncias: no permitir que o usurio introduza para a1
valores superiores a 200 e inferiores a 0. Enquanto os valores estiverem
fora desta faixa apresente a mensagem "Primeiro termo deve estar no
intervalo [0, 200] e pea novamente por a1.
3. Faa um algoritmo para automatizar a caixa de uma pizzaria. A pizzaria
oferece as seguintes opes para os clientes:
Produto
Napolitana
Lombinho
Portuguesa
Coca
Guaran

Mdio(a)
R$5,00
R$5,50
R$5,50
R$0,80
R$0,70

Grande
R$6,00
R$6,50
R$6,00
R$1,20
R$1,25

Cada cliente que chega atendido por um caixa. Ele pode escolher
diversos produtos em diferentes quantidades. No final da compra, o
caixa apresenta o valor total da mesma. Consistncias: as quantidades
digitadas para cada produto devem ser maiores que zero e inferiores a
100. Caso seja fornecido um valor fora deste intervalo, apresente a
mensagem "Redigite a quantidade" e repita a leitura.
4. Altere o algoritmo acima para totalizar as vendas do caixa de um dia.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

//--------------------------------------------------------------------------// Autor: Tacla


// Data : 30 julho 1999
// Exerccio Pizzaria
//--------------------------------------------------------------------------#include "tradutor.h"
programa
inicio
real
inteiro

rTotCaixa=0, rTotCliente=0;
iOpcao, iTam, iQtd, iContCliente=0;

execute
inicio
limpaJanela;
escreva "\nProduto
\tMedio \tGrande";
escreva "\n===========================================";
escreva "\n0. Napolitana\tR$5,00\tR$6,50";
lgica aplicada - Prof. Tacla
p g ( 17/48)
arq.: 262181617.doc

19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.

escreva
escreva
escreva
escreva
escreva
escreva
escreva
escreva
escreva
escreva
escreva
escreva

"\n-------------------------------------------";
"\n1. Lombinho \tR$5,50\tR$6,50";
"\n-------------------------------------------";
"\n2. Portuguesa\tR$5,50\tR$6,00";
"\n-------------------------------------------";
"\n3. Coca
\tR$0,80\tR$1,20";
"\n-------------------------------------------";
"\n4. Guarana
\tR$0,70\tR$1,25";
"\n-------------------------------------------";
"\n-1. Fechar a conta do cliente";
"\n-2. Fechar o caixa";
"\n-------------------------------------------";

escreva "\nOpcao: ";


leia iOpcao;
se ( iOpcao >= 0 )
inicio
escreva "\nTamanho 0-Medio 1-Grande: ";
leia iTam;
enquanto ( iTam < 0 || iTam > 1 )
inicio
escreva "\nRedigite o tamanho: ";
leia iTam;
fim
escreva "\nQuantidade: ";
leia iQtd;
enquanto ( iQtd < 0 || iQtd > 100 )
inicio
escreva "\nRedigite a quantidade: ";
leia iQtd;
fim
fim
multiplasOpcoes (iOpcao)
inicio
caso 0:
se (iTam == 0)
// Napolitana media
rTotCliente = rTotCliente + 5.00 * iQtd;
senao
// Napolitana grande
rTotCliente = rTotCliente + 6.00 * iQtd;
saia;
caso 1:
se (iTam == 0)
// Lombinho media
rTotCliente = rTotCliente + 5.50 * iQtd;
senao
// Lombinho grande
rTotCliente = rTotCliente + 6.50 * iQtd;
saia;
caso 2:
se (iTam == 0)
// Portuguesa media
rTotCliente = rTotCliente + 5.50 * iQtd;
senao
// Portuguesa grande
rTotCliente = rTotCliente + 6.00 * iQtd;
saia;
caso 3:
se (iTam == 0)
// Coca media
rTotCliente = rTotCliente + 0.80 * iQtd;
senao
// Coca grande
rTotCliente = rTotCliente + 1.20 * iQtd;
saia;
caso 4:
se (iTam == 0) // Guarana media
rTotCliente = rTotCliente + 0.70 * iQtd;
senao
lgica aplicada - Prof. Tacla
p g ( 18/48)
arq.: 262181617.doc

88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.

rTotCliente = rTotCliente + 1.25 * iQtd;


saia;
caso -1:
escreva "\n\n========================";
escreva "\nPreco a pagar: R$ ";
escreva rTotCliente;
escreva "\n========================";
escreva "\ntecle [enter]";
getch( );
rTotCaixa = rTotCaixa + rTotCliente;
iContCliente = iContCliente + 1;
rTotCliente = 0;
saia;
caso -2:
se ( rTotCliente > 0 )
inicio
escreva "\n\n*** Feche primeiramente a conta do cliente ***";
iOpcao = 0;
fim
senao
inicio
escreva "\n\n========================";
escreva "\nTotal do movimento: R$ ";
escreva rTotCaixa;
escreva "\n Total de clientes: ";
escreva iContCliente;
escreva "\n Gasto por cliente: R$ ";
se ( iContCliente > 0 )
escreva rTotCaixa / iContCliente;
escreva "\n========================";
fim
escreva "\ntecle [enter]";
getch( );
saia;
fim
fim
enquanto ( iOpcao != -2 );
fim
//---------------------------------------------------------------------------

1.6.2.
Execute ... Enquanto/Do ... While
Sintaxe:
<exec_equanto>::= execute
inicio
<bloco_cmdos>
fim
enquanto( <expr_cond > );

execute
<cmdo>
enquanto( <expr_cond > ) ;
<expr_cond> ::= /* no ser detalhada */
<bloco_cmdos>::=<cmdo> | <cmdo> <bloco_cmdos>
<cmdo> ::= <sada> | <ent> | <atrib> | <se> | <sel_multi> |
<enquanto> |
lgica aplicada - Prof. Tacla
p g ( 19/48)
arq.: 262181617.doc

Semntica:
O <bloco_cmdos> ou o <cmdo> executado uma vez. Depois, executado
enquanto a <expr_cond> for verdadeira. Quando ela torna-se falsa a
execuo do programa passa ao comando seguinte.
Exemplo 8: utilizao do comando Execute ... Enquanto.
Refazendo o exemplo anterior temos:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

#include "tradutor.h"
programa
inicio
real rVelMS;
caracter cOpcao; // note que no precisamos inicializar a varivel.
execute
inicio
escreva "Digite velocidade em m/s: ";
leia rVelMS;
escreva "\nVelocidade m KM/H: ";
escreva rVelMS * 3.6;
escreva "Deseja continuar [s/n]?";
leia cOpcao;
fim
enquanto (cOpcao == 's');
fim

Exerccios:
1. Faa uma algoritmo que converta temperaturas de graus Celsius para
Farenheit e vice-versa de acordo com a escolha do usurio. A frmula
para converso C = 5/9 * (F - 32), Onde F o valor em Farenheit e C
ser o valor em graus Celsius. O algoritmo deve ser executado pelo
menos uma vez, ou seja, depois que o programa for chamado o usurio
ter que fazer uma converso. Depois da primeira converso, perguntar
ao usurio se deseja prosseguir.
1.6.3.
Para/for
Sintaxe:
<para>::= para(<atrib>; <expr_cond >; <expr_aritm>)
inicio
<bloco_cmdos>
fim
|
para(<atrib>; <expr_cond >; <expr_aritm>)
<cmdo>
<atrib> ::= /* vide 1.2.4 */
<expr_cond> ::= /* no ser detalhada */
<bloco_cmdos>::=<cmdo> | <cmdo> <bloco_cmdos>
<cmdo> ::= <sada> | <ent> | <atrib> | <se> | <sel_multi> |
<enquanto> | ...
lgica aplicada - Prof. Tacla
p g ( 20/48)
arq.: 262181617.doc

Semntica:
1. O comando inicia com a execuo da atribuio <atrib>.
2. Se a <expr_cond> for verdadeira executa-se <bloco_cmdos> ou o
<cmdo>. Caso contrrio, o comando finalizado.
3. Depois, executa-se a expresso <expr_aritm> e volta-se ao passo 2.
Exemplo 9: utilizao do comando "para".
O programa abaixo imprime nmeros de 0 a 5.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

#include "tradutor.h"
programa
inicio
inteiro iContador;
para (iContador = 0; iContador < 6; iContador = iContador + 1)
inicio
escreva "\nLinha numero ";
escreva iContador;
fim
fim

Exerccios:
1. Faa um contador que apresente todos os inteiros compreendidos entre
um valor inicial e um final fornecidos pelo usurio. Consistncias: o
valor final deve ser maior que o inicial.
2. Faa um contador regressivo para o qual o usurio fornece um nmero
inicial e o programa apresenta todos os nmeros pares inferiores ao
nmero inicial. Consistncias: o nmero inicial deve ser maior ou igual a
2.
3. Pea ao usurio um valor inicial <vi>, um valor final <vf> e um outro
nmero, denominado <n>. Assegure que o <vf> maior que <vi> e que
<n> menor que <vf> - <vi>. Apresente todos os nmeros
compreendidos entre o valor inicial. A cada <n> mensagens imprima a
mensagem "--- Mais ? ---" e utilize a funo getch( ) para que o programa
s prossiga aps o usurio teclar algo.
4. Faa um contador que apresente todos os inteiros compreendidos entre
um valor inicial e um final fornecidos pelo usurio. Consistncias: o
valor final deve ser maior que o inicial. Pea ao usurio um nmero
<n> para um subcontador. Para cada valor apresentado, o programa
deve fazer uma subcontagem de <n> valores. Exemplo:
Contador
========
Fornea o valor inicial: 5
Fornea o valor final : 7
Fornea o valor de subcontagem: 3
Contagem
========
5
5.1
5.2
5.3
6
6.1
6.2
6.3

// 5 foi digitado pelo usurio


// 7 foi digitado pelo usurio
// 3 foi digitado pelo usurio
// sada produzida pelo programa

lgica aplicada - Prof. Tacla


p g ( 21/48)
arq.: 262181617.doc

7
7.1
7.2
7.3

lgica aplicada - Prof. Tacla


p g ( 22/48)
arq.: 262181617.doc

1.7. Matriz de Variveis / Array


Uma matriz um conjunto de variveis de mesmo tipo e mesmo nome. Para
diferenciar os elementos deste conjunto utilizamos ndices. A quantidade
de dimenses de uma matriz varia de acordo com a natureza do problema,
porm, as mais empregadas so as unidimensionais e as bidimensionais. As
unidimensionais tambm so denominadas de vetores.
1.7.1.

Declarao de uma Varivel Matricial

Exemplos:
a) inteiro iCodigo[3];
Declarao de uma varivel matricial com 3 elementos do tipo inteiro.

endereo fsico

1 byte

70
71
iCodigo[0]

72
73

iCodigo[1]

74
75

iCodigo[2]

Figura 3: representao esquemtica de um vetor de inteiros na memria.


b) real rNota[2];
Declarao de uma varivel matricial com 2 elementos do tipo real.

endereo fsico

1 byte

70
71
72
73
74
75
76
77

rNota [0]

rNota [1]
Figura 4: representao esquemtica
de um vetor de reais na memria.

c) caracter cLetra[2][3]
Declarao de uma varivel matricial com 5 linhas e 3 colunas.
endereo fsico

1 byte
70
71
72
73
74
75

cLetra[0][0]
cLetra[0][1]
cLetra[0][2]
cLetra[1][0]
cLetra[1][1]
cLetra[1][2]

Figura 5: representao esquemtica de um varivel matricial


bidimensional tipo caracter na memria.
*** Importante ***: note que os ndices iniciam sempre a partir do zero.
Portanto, se for usar uma matriz 3 x 2, os ndices das linhas devem estar no
lgica aplicada - Prof. Tacla
p g ( 23/48)
arq.: 262181617.doc

intervalo [0, 2] e os das colunas, no intervalo [0, 1]. Se estes limites forem
ultrapassados, o programa arruinar as variveis vizinhas ou at mesmo o
cdigo executvel.
1.7.2.
Aplicao
Seguem alguns exemplos de aplicao de variveis matriciais.
Exemplo 10: utilizao de variveis matriciais do tipo real.
Imagine que queremos calcular a mdia de vrios alunos. A mdia
resultado da mdia aritmtica entre 4 notas de provas e trabalhos.
Poderamos utilizar uma varivel matricial para armazenar estas notas ao
invs de criarmos 4 variveis reais com diferentes nomes:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

// Programa: media.cpp
// Autor
:
#include "tradutor.h"
programa
inicio
real rNota[4];
para (i=0; i < 4; i=i+1)
inicio
escreva "\nDigite a nota ";
escreva i;
escreva ": ";
leia rNota[i];
fim
escreva "\nMedia calculada: ";
escreva (rNota[0] + rNota[1] + rNota[3] + rNota[4]) / 4;
fim

Exemplo 11: utilizao de variveis matriciais do tipo caracter.


O programa abaixo imprime um jogo da velha.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.

// Programa: velha.cpp
// Autor
:
#include "tradutor.h"
programa
inicio
caracter cPosicao[3][3] = {'X', 'O', 'O',
' ', 'X', 'O',
' ', ' ', 'X'};
inteiro
i, j;
para (i=0; i < 3; i=i+1)
inicio
para (j=0; j < 3; j=j+1)
inicio
escreva " ";
escreva cPosicao[i][j];
escreva " |";
fim
escreva "\n---+---+---+\n"
fim
fim

Exemplo 12: rescrevendo o exerccio 4 da seo 1.6.1.


Note naquela soluo, existe um certo grau de dificuldade para modificar
o preo de um produto. Primeiramente, deve-se mudar o preo no menu e,
depois, procur-lo no comando multiplasOpcoes e, finalmente, alter-lo.
grande a probabilidade de errarmos ao fazermos uma alterao deste tipo.
lgica aplicada - Prof. Tacla
p g ( 24/48)
arq.: 262181617.doc

A soluo apresentada neste exemplo resolve parcialmente o problema


centralizando os preos dos produtos numa matriz 5 x 2. Cada linha da
matriz destinada a um produto, a coluna 0, para o preo do produto
tamanho mdio e a coluna 1 para o grande. A figura seguinte representa
esquematicamente esta matriz, denominada de rPrecoProduto. Para saber
o preo do pizza de Portuguesa Grande basta acessar o elemento
rPrecoProduto[2][1].
Napolita
na
Lombinh
o
Portugue
sa
Coca
Guaran

0
5

1
6

5.50

6.50

5.50

3
4

0.80
0.70

1.20
1.25

Figura 6: Representao esquemtica da matriz de preos de produtos.


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.

//--------------------------------------------------------------------------// Autor: Tacla


// Data : 30 julho 1999
// Exerccio Pizzaria - pg. 16 em algoritmos.doc
// Reformulado para trabalhar com matriz de valores de produtos.
//--------------------------------------------------------------------------#include "tradutor.h"
programa
inicio
real rTotCaixa=0, rTotCliente=0;
real rPrecoProd[5][2] = { { 5.00, 6.50 },
{ 5.50, 6.50 },
{ 5.50, 6.00 },
{ 0.80, 1.20 },
{ 0.70, 1.25 } };
inteiro

iOpcao, iTam, iQtd, iContCliente=0;

execute
inicio
limpaJanela;
escreva "\nProduto
\tMedio \tGrande";
escreva "\n===========================================";
escreva "\n0. Napolitana\tR$5,00\tR$6,00";
escreva "\n-------------------------------------------";
escreva "\n1. Lombinho \tR$5,50\tR$6,50";
escreva "\n-------------------------------------------";
escreva "\n2. Portuguesa\tR$5,50\tR$6,00";
escreva "\n-------------------------------------------";
escreva "\n3. Coca
\tR$0,80\tR$1,20";
escreva "\n-------------------------------------------";
escreva "\n4. Guarana
\tR$0,70\tR$1,25";
escreva "\n-------------------------------------------";
escreva "\n-1. Fechar a conta do cliente";
escreva "\n-2. Fechar o caixa";
escreva "\n-------------------------------------------";
escreva "\nOpcao: ";
leia iOpcao;
se ( iOpcao >= 0 && iOpcao < 5)
inicio
escreva "\nTamanho 0-Medio 1-Grande: ";
leia iTam;
lgica aplicada - Prof. Tacla
p g ( 25/48)
arq.: 262181617.doc

45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.

enquanto ( iTam < 0 || iTam > 1 )


inicio
escreva "\nRedigite o tamanho: ";
leia iTam;
fim
escreva "\nQuantidade: ";
leia iQtd;
enquanto ( iQtd < 0 || iQtd > 100 )
inicio
escreva "\nRedigite a quantidade: ";
leia iQtd;
fim
rTotCliente = rTotCliente + rPrecoProd[iOpcao][iTam] * iQtd;
fim
senao
se ( iOpcao < 0 )
inicio
multiplasOpcoes (iOpcao)
inicio
caso -1:
escreva "\n\n========================";
escreva "\nPreco a pagar: R$ ";
escreva rTotCliente;
escreva "\n========================";
escreva "\ntecle [enter]";
getch( );
rTotCaixa = rTotCaixa + rTotCliente;
iContCliente = iContCliente + 1;
rTotCliente = 0;
saia;
caso -2:
se ( rTotCliente > 0 )
inicio
escreva "\n\n*** Feche primeiramente a conta do cliente
***";

82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.

iOpcao = 0;
fim
senao
inicio
escreva "\n\n========================";
escreva "\nTotal do movimento: R$ ";
escreva rTotCaixa;
escreva "\n Total de clientes: ";
escreva iContCliente;
escreva "\n Gasto por cliente: R$ ";
se ( iContCliente > 0 )
escreva rTotCaixa / iContCliente;
escreva "\n========================";
fim
escreva "\ntecle [enter]";
getch( );
saia;
fim
fim
fim
enquanto ( iOpcao != -2 );
fim
//---------------------------------------------------------------------------

Exemplo 13: rescrevendo o exemplo anterior.


lgica aplicada - Prof. Tacla
p g ( 26/48)
arq.: 262181617.doc

Na soluo anterior, permanece o problema da alterao do menu. Para


resolv-lo vamos modificar a maneira de imprimi-lo e criaremos uma
matriz para armazenar os nomes dos produtos. A figura seguinte
apresenta a matriz denominada cNomeProd de maneira esquemtica.
Note que preciso reservar uma coluna para cada caracter, tomando por
base a palavra mais longa que ser armazenada. Alm disso, deve-se
somar um quantidade de colunas pois a linguagem C utiliza a ltima
posio para colocar o caracter \0 que o delimitador de strings. Note no
exemplo abaixo que para escrever uma string basta fornecer o nome da
matriz seguido do primeiro ndice. Por exemplo, escrevendo-se escreva
cNomeProd[3] obteremos como sada Coca.
0
1
2
3
4

10

N
L
P
C
G

a
o
o
o
u

p
m
r
c
a

o
b
t
a
r

l
i
u

i
n
g

t
h
u

a
o
e

\0

\0

\0

\0

\0

Figura 7: Representao esquemtica da matriz de nomes de produtos.


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.

//--------------------------------------------------------------------------// Autor: Tacla


// Data : 30 julho 1999
// Exerccio Pizzaria - pg. 16 em algoritmos.doc
// Reformulado para trabalhar com matriz de valores e nomes de produtos.
//--------------------------------------------------------------------------#include "tradutor.h"
programa
inicio
real rTotCaixa=0, rTotCliente=0;
real rPrecoProd[5][2] = { { 5.00, 6.50 },
{ 5.50, 6.50 },
{ 5.50, 6.00 },
{ 0.80, 1.20 },
{ 0.70, 1.25 } };
caracter

cNomeProd[5][11] = { "Napolitana",
"Lombinho ",
"Portuguesa",
"Coca
",
"Guarana
" };

inteiro

iOpcao, iTam, iQtd, iContCliente=0;

execute
inicio
clrscr( );
escreva "\n
Produto
Medio Grande";
escreva "\n================================";
para ( iOpcao = 0; iOpcao < 5; iOpcao = iOpcao + 1)
inicio
escreva "\n ";
escreva iOpcao;
escreva ". ";
escreva cNomeProd[iOpcao];
escreva "
R$";
escreva rPrecoProd[iOpcao][0];
escreva "\tR$";
escreva rPrecoProd[iOpcao][1];
escreva "\n--------------------------------";
fim
escreva "\n-1. Fechar a conta do cliente";
lgica aplicada - Prof. Tacla
p g ( 27/48)
arq.: 262181617.doc

44.
45.
46.

escreva "\n-2. Fechar o caixa";


escreva "\n--------------------------------";
..... o restante do programa idntico ao exemplo anterior ....

Exerccios:
1. Leia 5 nmeros inteiros do teclado, coloque-os num vetor e apresente-os
em ordem crescente.
2. Leia do teclado nmeros inteiros de 1 a 7. Mostre o nome do dia da
semana correspondente por extenso. Armazene os nomes dos dias numa
matriz de caracteres.
3. Faa um programa que permita duas pessoas jogarem velha.

lgica aplicada - Prof. Tacla


p g ( 28/48)
arq.: 262181617.doc

1.8. Estruturas de Dados Heterogneas


/* Registros , Structs */

lgica aplicada - Prof. Tacla


p g ( 29/48)
arq.: 262181617.doc

1.9. Funes
Quando temos um problema complexo para resolver geralmente utilizamos
a tcnica do dividir para conquistar, ou seja, dividimos o problema em
subproblemas e, se preciso for, decompomos os subproblemas em
problemas menores e assim por diante. Resolvendo cada um dos
subproblemas e fazendo-os trabalhar de forma coordenada, alcanamos a
soluo para todo o problema.
Um exemplo da vida real. Voc deseja fazer uma viagem para uma cidade
onde nunca esteve antes e onde no h conhecidos. O problema : como
chegar na cidade, l se instalar, visitar pontos interessantes e retornar.
Olhando o problema distncia vemos que os subproblemas a serem
resolvidos so:
1.
2.
3.
4.

Chegar na cidade (via area, trem, navio, carro ou nibus ?)


Arranjar um lugar para ficar
Conhecer os pontos interessantes
Voltar.

Decompondo os subproblemas poderamos chegar em:

1.

2.

3.

4.

Chegar na cidade (via area, trem, navio, carro ou nibus ?)


1.1. Definir data de sada
1.2. Verificar meio mais barato
1.3. Comprar passagem
Arranjar um lugar para ficar
2.1. Conversar com outras pessoas que j foram
2.2. Pesquisar em guias tursticos
2.3. Pesquisar na Internet
2.4. Escolher um local
2.5. Fazer reserva para uma semana
Conhecer os pontos interessantes
3.1. Conversar com outras pessoas que j foram
3.2. Pesquisar em guias tursticos
3.3. Pesquisar na Internet
3.4. Escolher pontos mais interessantes
Voltar
4.1. Definir data de sada
4.2. Verificar meio mais barato
4.3. Comprar passagem.

Empregamos tcnica similar para construir programas. Nas linguagens de


programao, cada subdiviso do problema pode ser implementada atravs
de uma funo. Uma funo um bloco de cdigo responsvel pela
realizao de uma tarefa especfica.
1.9.1.
Aplicao: Converso de temperatura
Exemplificamos a utilizao desta tcnica, denominada de desenvolvimento
top-down que significa do genrico para o detalhe ou refinamentos
sucessivos.
Exemplo 14: Celsius para Farenheit e vice-versa.
Faa uma algoritmo que converta temperaturas de graus Celsius para
Farenheit e vice-versa de acordo com a escolha do usurio. A frmula para
lgica aplicada - Prof. Tacla
p g ( 30/48)
arq.: 262181617.doc

converso C = 5/9 * (F - 32), Onde F o valor em Farenheit e C ser o


valor em graus Celsius. O algoritmo deve ser executado pelo menos uma
vez, ou seja, depois que o programa for chamado o usurio ter que fazer
uma converso. Depois da primeira converso, perguntar ao usurio se
deseja prosseguir.
Pseudo-cdigo (top-down)
programa
faa
pedir temperatura
pedir unidade (Celsius ou Farenheit)
Se unidade for Celsius
Transformar temperatura para Farenheit
seno
Transformar temperatura para Celsius
perguntar "prosseguir ?"
enquanto usurio desejar prosseguir
fim

Note que existem dois subproblemas em aberto: transformar de Celsius


para Farenheit e vice-versa. So duas tarefas que sero implementadas
como funes. Identificadas as funes, definimos as entradas e as sadas
da mesma, ou seja, os valores que so necessrios para que ela realize sua
tarefa (neste caso, a converso de temperaturas) e o valor retornado.
A funo Transformar para Farenheit. ter como entrada o valor de uma
temperatura em Celsius e retornar o valor correspondente em Farenheits.
Representaremos a funo como uma caixa preta, onde somente
interessam as entradas e as sadas. O modo como a funo realiza os
clculos no interessa neste momento.
Temperatura
Celsius (real)

Temperatura
Farenheit(real)

TransformarPara
Farenheit

Figura 8: Funo TransformarParaFarenheit (Caixa Preta)


Aplicando raciocnio similar ao da funoTransformar para Farenheit
obtemos a seguinte viso caixa-preta da funo TransformarParaCelsius.
Temperatura
Farenheit (real)

Temperatura
Celsius (real)

TransformarPara
Celsius

Figura 9: Funo TransformarParaCelsius (Caixa Preta)


Observe que nosso problema de converso de temperaturas foi subdividido
em dois menores: Celsius para Farenheit e Farenheit para Celsius. No
entanto, preciso que uma funo principal coordene a execuo destas
lgica aplicada - Prof. Tacla
p g ( 31/48)
arq.: 262181617.doc

funes ou tarefas. Em seguida, apresentado o diagrama das funes que


resolvem o problema da converso de temperaturas.
Principal

Temperatura
Celsius (real)

Temperatura
Farenheit (real)

Temperatura
Farenheit(real)

TransformarPara
Farenheit

Temperatura
Celsius (real)

TransformarPara
Celsius

Figura 10: Diagrama de Funes para o problema da converso de


temperaturas.
Observe que o diagrama anterior apenas fornece uma viso funcional do
programa, ou seja, que tarefas ele realiza para alcanar o objetivo
especificado. O diagrama no determina a ordem em que as funes so
chamadas.
Implementao
Uma vez que est claro o objetivo do programa e como atacaremos o
problema hora de implement-lo. Segue listagem do mesmo. Note como
as funes so construdas, chamadas e como os valores retornados pelas
mesmas so aproveitados pela funo principal. Observer que ao invs de
utilizarmos a palavra programa passaremos a utilizar principal para
identificar a funo principal do programa. A execuo do programa
sempre comea por esta funo.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.

//----------------------------------------------------------------------------// Programa: ConvTemp.cpp


//
Autor: Cesar Augusto Tacla
// Descrio: realiza a converso de graus Celsius para Farenheit e vice-versa.
//----------------------------------------------------------------------------#include "tradutor.h"
// Prottipo das Funes
real TransformarParaCelsius ( real );
real TransformarParaFarenheit ( real );
//----------------------------------------------------------------------------//
Funcao: TransformarParaCelsius
// Descricao: Dada uma temp. em Farenheit retorna o valor correspondente em
//
Celsius.
//----------------------------------------------------------------------------real TransformarParaCelsius ( real rTemp )
inicio
retorne
( 5.0 * ( rTemp - 32 ) ) / 9.0 ;
fim
//----------------------------------------------------------------------------//
Funcao: TransformarParaFarenheit
// Descricao: Dada uma temp. em Celsius retorna o valor correspondente em
//
Farenheit.
//----------------------------------------------------------------------------real TransformarParaFarenheit ( real rTemp )
inicio
retorne ( 9.0 * rTemp + 160.0 ) / 5.0 ;
lgica aplicada - Prof. Tacla
p g ( 32/48)
arq.: 262181617.doc

31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.

fim
//----------------------------------------------------------------------------//
Funcao: Principal
//----------------------------------------------------------------------------naoRetornaDado principal ( )
inicio
real rVlrTemp;
caracter cUnidade, cProsseguir;
execute
inicio
escreva "\nValor da temp.? ";
leia rVlrTemp;
escreva "\nUnidade [C/F] ? ";
leia cUnidade;
se ( cUnidade == 'c' ) entao
inicio
escreva "\nEm Farenheits: ";
escreva TransformarParaFarenheit( rVlrTemp );
fim
senao
inicio
escreva "\nEm Celsius: ";
escreva TransformarParaCelsius( rVlrTemp );
fim
escreva "\nProsseguir [s/n] ? ";
leia cProsseguir;
fim
enquanto ( cProsseguir == 's' );
fim

1.9.2.
Criao de funes
Para criar e utilizar corretamente funes, observar os seguintes pontos:
Prottipo
necessrio para que o compilador reconhea as funes que voc criou.
Aparece no incio do programa, antes da definio de qualquer funo. A
sintaxe a seguinte:
<prottipo>::= <tipo_dado_retorno> <NomeFuno>
(<lista_parmetros>);
< NomeFuno > ::= /* nome de at 32 caracteres que no inicie por
smbolos especiais (*, &, %, etc.), nem por nmeros e que no contenha
espaos */
<lista_parmetros> ::= | <parmetro> | <parmetro> ,
<lista_parmetros>
<parmetro> ::= <tipo_dado> <var> | <tipo_dado>
<tipo_dado_retorno >::= <tipo_dado> | naoRetornaDado
<tipo_dado> ::= inteiro |real | logico |caracter
Exemplos:
real TransformarParaFarenheit ( real );
logico MaiorQue (real, real);
logico MenorQue (inteiro iNum1, inteiro iNum2);
naoRetornaDado MostrarMenu( );
lgica aplicada - Prof. Tacla
p g ( 33/48)
arq.: 262181617.doc

Definio da funo
a funo em si. Realiza a transformao dos dados de entrada nos de
sada. A sintaxe a seguinte:
<funo> ::= <cabealho>
inicio
<bloco_cmdos>
fim
<cabealho>::= <tipo_dado_retorno> <NomeFuno>
(<lista_parmetros_ent>)
< NomeFuno > ::= /* nome de at 32 caracteres que no inicie por
smbolos especiais (*, &, %, etc.), nem por nmeros e que no contenha
espaos */
<lista_parmetros_ent> ::= | <parmetro_ent> | <parmetro_ent> ,
<lista_parmetros_ent>
<parmetro_ent> ::= <tipo_dado> <var>
<bloco_cmdos> ::= /* j definido anteriormente adicionado do comando
retorne */
<retorne> ::= retorne <expr_aritm>;
<expr_aritm> ::= /* j definido anteriormente */
<tipo_dado_retorno >::= <tipo_dado> | naoRetornaDado
<tipo_dado> ::= inteiro |real | logico |caracter
Note que a sintaxe do cabealho parecida com a do prottipo. Porm, no
cabealho no h ponto e vrgula no final e os parmetros de entrada
devem estar completamente definidos pelo tipo do dado e nome da varivel
(vide categoria sinttica <parmetro_ent>). importante que os tipos de
dados de retorno e dos parmetros de entrada declarados no prottipo
coincidam com os do cabealho, caso contrrio, ocorrer erro de
compilao. O comando retorne permite encerrar a funo e ao mesmo
tempo retornar o valor de sada que deve ser do mesmo tipo que o
<tipo_dado_retorno> declarado no cabealho e no prottipo da funo.
Exemplo:
Funo que compara dois inteiros e retorna verdadeiro caso o primeiro seja
menor que o segundo.
1.
2.
3.
4.
5.
6.
7.

logico MenorQue ( inteiro iNum1, iNum2 )


inicio
se ( iNum1 < iNum2 )
retorne verdadeiro;
senao
retorne falso;
fim

Funo que mostra um menu.


1.
2.
3.
4.
5.
6.

naoRetornaDado MostarMenu(
inicio
escreva "1. Extrato\n";
escreva "2. Saldo\n";
escreva "3. Sair\n";
fim

lgica aplicada - Prof. Tacla


p g ( 34/48)
arq.: 262181617.doc

Chamada de funo
Uma funo pode ser chamada de qualquer ponto do programa, inclusive
de outras funes ou a partir dela mesma. Faa com que os argumentos
passados na chamada coincidam com os parmetros de entrada da funo.
Se a funo espera receber um valor inteiro e voc passa um caracter
certamente ela no se comportar como desejado. Outro ponto importante
observar se est recebendo o valor retornado pela funo numa varivel
adequada, ou seja, uma varivel que tenha o mesmo tipo que o valor
retornado pela funo. importante ressaltar que quando utilizamos uma
varivel como argumento de uma funo estamos passando o contedo ou
o valor atual da mesma. Este tipo de chamada denominada chamada
com passagem por contedo.
Exemplos:
Para chamar a funo MenorQue definida anteriormente teramos vrias
possibilidades. Note em que todas elas foi respeitado o tipo de dado dos
parmetros de entrada e de sada.

result = MenorQue ( 5, 6); // result do tipo lgico


result = MenorQue ( iQtd, 10); // iQtd uma varivel do tipo inteiro
result = MenorQue ( iQtd, iNum[i] ); // iNum uma vetor de inteiros
se ( MenorQue ( iQtd, iNum[i] ) ) entao
...
// podemos utilizar o valor retornado diretamente num outro comando.

Para chamar a funo MenorQue definida anteriormente temos somente


uma possibilidade. Note que quando no h argumentos de entrada deve-se
abrir e fechar parnteses.
MostrarMenu( );

Exerccio:
1. Utilizando a tcnica top-down faa um pseudo-cdigo e o diagrama de
funes para resolver o seguinte problema: calcular a diferena em dias
entre duas datas fornecidas pelo usurio. O usurio poder fazer vrias
vezes este clculo sem sair do programa. O programa deve verificar se as
datas fornecidas so vlidas e se a primeira data menor que a segunda.
S ento ele calcular a diferena em dias entre as duas e apresentar o
resultado. Obs: no preciso detalhar o clculo de diferena em dias e nem
as verificaes de datas.
1.9.3.
Aplicao: Jogo da Velha
Apresenta-se nesta seo o pseudo-cdigo, diagrama de funes e a
implementao para um problema mais complexo: o jogo da velha. O
jogador 1 sempre jogar com o smbolo 'X' e o 2, com 'O'. Os jogadores
podem jogar sucessivamente sem sair do programa. A cada final de partida
apresenta-se o resultado do jogo e pergunta-se a um dos jogadores se
desejam prosseguir. O placar das partidas disputadas at o momento
mostrado no topo da tela e nunca desaparece.

Pseudo-cdigo
Nvel 1 (+ alto-nvel)
lgica aplicada - Prof. Tacla
p g ( 35/48)
arq.: 262181617.doc

fazer
limpar tabuleiro
mostrar tabuleiro
fazer
pedir jogada ao jogador 1
enquanto jogada for incorreta
pedir jogada ao jogador 1
mostrar tabuleiro
verificar resultado do jogo
se jogador 1 ganhou entao
adicionar 1 ao total de partidas ganhas por ele
mostrar vencedor
senao
se no houve empate
pedir jogada ao jogador 2
enquanto jogada for incorreta
pedir jogada ao jogador 2
mostrar tabuleiro
verificar resultado do jogo
se jogador 2 ganhou entao
adicionar 1 ao total de partidas ganhas por ele
mostrar vencedor
enquanto jogo no acabar
perguntar Prosseguir ?
enquanto usurio quiser prosseguir
Observe que os trechos em azul so similares variando apenas o jogador.
Trechos de cdigo repetidos so bons candidatos a funes. Porm, tomar
cuidado para no colocar numa mesma funo comandos que estejam
agrupados apenas pela posio no cdigo e no pela tarefa que
desempenham. Por exemplo, apesar de todo o trecho em azul estar
repetido, parece mais conveniente separ-lo em duas funes ou tarefas:
uma para ler e verificar a validade de uma jogada e outra para fazer o
procedimento em caso de vitria. Outras candidatas a funes so as
tarefas especificas, tais como, verificar resultado do jogo, verificar se
jogada foi correta, limpar tabuleiro e mostrar tabuleiro. Em seguida,
apresenta-se nova verso do pseudo-cdigo acima, considerando as funes
identificadas.
Nvel 1 (reescrito)
fazer
limpar tabuleiro
mostrar tabuleiro
fazer
Obter jogada vlida do jogador 1
mostrar tabuleiro
Verificar resultado do jogo
lgica aplicada - Prof. Tacla
p g ( 36/48)
arq.: 262181617.doc

Se jogo no acabou
Obter jogada vlida do jogador 2
mostrar tabuleiro
Verificar resultado do jogo
enquanto jogo no acabar
caso resultado do jogo
jogador 1 venceu:
fazer procedimento vitria
jogador 2 venceu:
fazer procedimento vitra
empate:
fazer procedimento de empate.
perguntar Prosseguir ?
enquanto usurio quiser prosseguir
Ao reescrever o pseudo-cdigo notamos que no caso de empate o resultado
no estava sendo mostrado, ento, inserimos um novo trecho de cdigo (em
azul) executado ao final de cada partida. Uma modificao ainda pode ser
feita: alternar as jogadas do jogador 1 e 2. Veja abaixo o pseudo-cdigo
reescrito.
Nvel 1 (reescrito 2)
fazer
limpar tabuleiro
mostrar tabuleiro
jogador da vez = 2
fazer
jogador da vez = ( jogador da vez % 2 ) + 1
Obter jogada vlida do jogador da vez
mostrar tabuleiro
Verificar resultado do jogo
enquanto jogo no acabar
caso resultado do jogo
jogador 1 venceu:
fazer procedimento vitria
jogador 2 venceu:
fazer procedimento vitra
empate:
fazer procedimento de empate.
perguntar Prosseguir ?
enquanto usurio quiser prosseguir
Agora o pseudo-cdigo est bem enxuto. Veja que neste nvel, temos uma
boa viso da soluo do problema sem entrarmos em detalhes do tipo: o
lgica aplicada - Prof. Tacla
p g ( 37/48)
arq.: 262181617.doc

que uma jogada vlida ou como o tabuleiro ser mostrado. Em seguida,


detalharemos as funes identificadas.
Nvel 2 (Detalhamento das funes)
limpar tabuleiro
entradas: nenhuma
sada: no retorna nada
pseudo-cdigo:
atribuir espaos s variveis que representam o tabuleiro
mostrar tabuleiro
entradas: <pontos jog1> inteiro, <pontos jog2> inteiro, <smbolo1>
caracter, <smbolo2> caracter
sada: no retorna nada
pseudo-cdigo:
mostrar smbolo do jogador 1 e do 2
mostrar placar
mostrar a matriz passada como parmetro
Verificar resultado do jogo
descrio: verifica se o jogador que utiliza o smbolo passado como
parmetro de entrada venceu ou se o jogo empatou.
entradas: <smbolo> tipo caracter.
sada: inteiro. Retornar 0 em caso de empate, 1, se o jogador que utiliza o
<smbolo> venceu e, 2, se o jogo no acabou.
pseudo-cdigo:
Para cada linha do <tabuleiro> fazer
contar quantas vezes o <smbolo> aparece
Se <smbolo> aparece 3 vezes ento
retornar 1 (jogador venceu)
Para cada coluna da matriz tabuleiro fazer
contar quantas vezes o <smbolo> aparece
contar clulas vazias.
Se <smbolo> aparece 3 vezes ento
retornar 1 (jogador venceu)
Contar quantas vezes o <smbolo> aparece na diagonal principal.
Se <smbolo> aparece 3 vezes ento
retornar 1 (jogador venceu)
Contar quantas vezes o <smbolo> aparece na diagonal secundria.
Se <smbolo> aparece 3 vezes ento
retornar 1 (jogador venceu)
Se nmero de clulas vazias for zero
retornar 0, ou seja, empate.
retornar 2, jogo ainda no decidido.
lgica aplicada - Prof. Tacla
p g ( 38/48)
arq.: 262181617.doc

Obter jogada vlida


entradas: <tabuleiro> matriz 3 x 3 do tipo caracter, <jogador da vez>
inteiro, <smbolo> caracter.
sada: no retorna nada
pseudo-cdigo:
execute
Obter linha vlida
Obter coluna vlida
enquanto ( tabuleiro[linha-1][coluna-1] != ' ' )
tabuleiro[linha-1][coluna-1] = <smbolo>

Nvel 3 (Detalhamento das funes)


Obter linha vlida
entradas: nada
sada: nmero da linha (inteiro)
pseudo-cdigo:
execute
pedir linha
equanto linha < 1 ou linha > 3
retornar nmero da linha
Obter coluna vlida
entradas: nada
sada: nmero da coluna (inteiro)
pseudo-cdigo:
execute
pedir coluna
equanto coluna < 1 ou coluna > 3
retornar nmero da coluna

Diagrama de Funes

principal
result (int)
ptos jog1 (int),
ptos jog2 (int)
simbolo jog1 (car),
smbolo jog2 (car)

MostrarTabuleiro

simbolo(car)
LimparTabuleiro

VerificarResultado

jogador(int)
simbolo(car)

ObterJogadaVlida
linha (int)

ObterLinhaVlida

coluna (int)

ObterColunaVlida

lgica aplicada - Prof. Tacla


p g ( 39/48)
arq.: 262181617.doc

Implementao
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.

//----------------------------------------------------------------------------// Programa: Velha.cpp


//
Autor: Cesar Augusto Tacla
// Descrio: permite duas pessoas jogarem velha.
//----------------------------------------------------------------------------#include "tradutor.h"
// Prottipo das
naoRetornaDado
inteiro
naoRetornaDado
inteiro
inteiro

Funes
MostrarTabuleiro( inteiro, inteiro );
VerificarResultado( );
ObterJogadaValida( inteiro, caracter );
ObterLinhaValida( );
ObterColunaValida( );

// Variveis Globais
caracter
tab[3][3];

// tabuleiro do jogo

//----------------------------------------------------------------------------//
Funcao: ObterLinhaValida
// Descricao: Pede ao usurio o nmero de uma linha. Quando fornece
//
um valor entre 1 e 3, retorna o numero da linha digitado.
//----------------------------------------------------------------------------inteiro ObterLinhaValida( )
inicio
inteiro lin;
execute
inicio
escreva " Linha ? ";
leia lin;
fim
enquanto ( lin < 1 ou lin > 3 );
retorne lin;
fim
//----------------------------------------------------------------------------//
Funcao: ObterColunaValida
// Descricao: Pede ao usurio o nmero de uma coluna. Quando fornece
//
um valor entre 1 e 3, retorna o numero da coluna digitado.
//----------------------------------------------------------------------------inteiro ObterColunaValida( )
inicio
inteiro col;
execute
inicio
escreva "Coluna ? ";
leia col;
fim
enquanto ( col < 1 ou col > 3 );
retorne col;
fim
//----------------------------------------------------------------------------//
Funcao: VerificarResultado
// Descricao: Verifica se o jogador que utiliza o simbolo <simbolo> ganhou.
//
Tambem verifica se o jogo terminou empatado ou se ainda no
//
acabou.
//
Retorna: 0 - empate
//
1 - jogador da vez ganhou
//
2 - jogo no encerrado
//----------------------------------------------------------------------------inteiro VerificarResultado( caracter simbolo )
inicio
lgica aplicada - Prof. Tacla
p g ( 40/48)
arq.: 262181617.doc

68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.

inteiro i, j,
cont,
cont_brancos = 0;
// conta as ocorrencias do <simbolo> em cada uma das linhas
para ( i = 0; i < 3; i = i + 1 )
inicio
cont = 0;
para ( j = 0; j < 3; j = j + 1 )
se ( tab[i][j] == simbolo )
cont = cont + 1;
se ( cont == 3 )
retorne 1; // venceu
fim
// conta as ocorrencias do <simbolo> em cada uma das colunas
para ( j = 0; j < 3; j = j + 1 )
inicio
cont = 0;
para ( i = 0; i < 3; i = i + 1 )
se ( tab[i][j] == simbolo )
cont = cont + 1;
senao
se ( tab[i][j] == ' ' )
cont_brancos = cont_brancos + 1;
se ( cont == 3 )
retorne 1; // venceu
fim
// verificar diagonal principal
cont = 0;
para ( i = 0; i < 3; i = i + 1 )
se ( tab[i][i] == simbolo )
cont = cont + 1;
se ( cont == 3 )
retorne 1; // venceu
// verificar diagonal secundria
se ( tab[0][2] == simbolo e tab[1][1] == simbolo e tab[2][0] == simbolo )
retorne 1; // venceu
// verificar se deu empate
se ( cont_brancos == 0 )
retorne 0;
retorne 2;
fim
//----------------------------------------------------------------------------//
Funcao: ObterJogadaValida
// Descricao: Pede ao usurio a linha e a coluna da sua jogada. A jogada
//
considerada vlida se a linha e a coluna esto no intervalo
//
[1, 3] e se no h marcao na linha e coluna escolhidas.
//----------------------------------------------------------------------------naoRetornaDado ObterJogadaValida( inteiro jogador, caracter simbolo)
inicio
inteiro lin, col;
execute
inicio
escreva "\n\nJogador ";
escreva jogador;
escreva "\n";
lin = ObterLinhaValida( );
col = ObterColunaValida( );
fim
lgica aplicada - Prof. Tacla
p g ( 41/48)
arq.: 262181617.doc

137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.

enquanto( tab[lin-1][col-1] != ' ' );


tab[lin-1][col-1] = simbolo;
fim

//----------------------------------------------------------------------------//
Funcao: LimparTabuleiro
// Descricao: Preenche o tabuleiro com espaos.
//----------------------------------------------------------------------------naoRetornaDado LimparTabuleiro( )
inicio
inteiro i, j;
para ( i = 0; i < 3; i = i + 1 )
para ( j = 0; j < 3; j = j + 1 )
tab[i][j] = ' ';
fim
//----------------------------------------------------------------------------//
Funcao: MostrarTabuleiro
// Descricao: Mostra o placar e o tabuleiro com marcao atual.
//----------------------------------------------------------------------------naoRetornaDado MostrarTabuleiro( inteiro ptos1, inteiro ptos2 )
inicio
inteiro i, j;
limpaJanela;
// mostra placar do jogo
escreva "Jogo da Velha\n";
escreva "-------------\n\n";
escreva "Jog1 ";
escreva ptos1;
escreva " X ";
escreva ptos2;
escreva " Jog2";
escreva "\n\n";
// mostra indices das colunas
escreva "
1
2
3\n";
// mostra tabuleiro
para ( i = 0; i < 3; i = i + 1 )
inicio
escreva i+1;
escreva " ";
para ( j = 0; j < 3; j = j + 1 )
inicio
escreva " ";
escreva tab[i][j];
escreva " ";
se ( j != 2 )
escreva "|";
fim
se ( i != 2 )
escreva "\n ---+---+---\n";
fim
retorne;
fim
//----------------------------------------------------------------------------//
Funcao: Principal
//----------------------------------------------------------------------------naoRetornaDado principal ( )
inicio
caracter cProsseguir,
// prosseguir: s ou n
lgica aplicada - Prof. Tacla
p g ( 42/48)
arq.: 262181617.doc

206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.

inteiro

simbolo[2];

// simbolos utilizados pelo jog1 e jog2

jogador,
iResultado,
ptos[2];

// jogador da vez
// resultado do jogo
// pontos dos jogadores 1 e 2

simbolo[0] = 'X';
simbolo[1] = 'O';
ptos[0] = 0;
ptos[1] = 0;

//
//
//
//

smbolo
smbolo
jogador
jogador

para o jogador 1
para o jogador 2
1 comea com zero pontos
2 comea com zero pontos

execute
inicio
LimparTabuleiro( );
MostrarTabuleiro( ptos[0], ptos[1] );
jogador = 2;
execute
inicio
jogador = ( jogador % 2 ) + 1;
ObterJogadaValida( jogador, simbolo[jogador-1] );
MostrarTabuleiro( ptos[0], ptos[1] );
iResultado = VerificarResultado( simbolo[jogador-1] );
fim
enquanto ( iResultado == 2 );
multiplasOpcoes( iResultado )
inicio
caso 0:
escreva "\n\n * EMPATE * \n";
saia;
caso 1:
escreva "\n\n *** JOGADOR ";
escreva jogador;
escreva " VENCEU ***\n";
ptos[jogador-1] = ptos[jogador-1] + 1;
fim
escreva "\nProsseguir [s/n] ? ";
leia cProsseguir;
fim
enquanto ( cProsseguir == 's' );
fim

1.9.4.
Escopo de Variveis
Nesta seo estudaremos as variveis em relao a sua visibilidade ou
escopo.
Observe no exemplo do jogo da velha a varivel tab que representa o
tabuleiro. Ela foi declarada no incio do programa, fora de qualquer funo.
Este tipo de varivel denominada varivel global, pois pode ser acessada
(ter o contedo modificado ou consultado) em qualquer funo do
programa. Ela alocada no incio do programa e somente cessa de existir
quando o mesmo encerrado. Recomenda-se utilizar o mnimo possvel
destas variveis pois dificultam a compreenso do programa e reduzem sua
modularidade. Variveis globais causam dificuldades na localizao de
erros pois, quando apresentam um valor inesperado, devemos percorrer
todas as linhas que a referenciam para encontrar o problema.

lgica aplicada - Prof. Tacla


p g ( 43/48)
arq.: 262181617.doc

As variveis que so declaradas dentro das funes so denominadas de


variveis locais. No jogo da velha, cProsseguir e jogador so exemplos de
variveis locais da funo principal e lin varivel local de
ObterLinhaVlida. Uma varivel local somente pode ser acessada na funo
onde foi declarada sendo invisvel para as demais funes. So criadas a
cada chamada da funo e cessam de existir assim que a funo
encerrada (o contedo no mantido entre diversas chamadas). As
variveis que aparecem nos cabealhos das funes tambm so variveis
locais.
1.9.5.
Funes Recursivas
Uma funo dita recursiva quando chama a si mesma. Um exemplo
clssico o fatorial. Para calcular o 5! fazemos 5*4! Para calcular o
fatorial de 4, fazemos 4*3! e assim por diante. Observe que para obter o
fatorial de 5, chamamos a prpria funo fatorial para calcular o valor de
4! que, por sua vez, chama a funo fatorial para calcular 3! e assim por
diante. Veja o exemplo abaixo.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.

//----------------------------------------------------------------------------// Programa: Fatorial.cpp


//
Autor: Cesar Augusto Tacla
// Descrio: calcula o fatorial de um nmero.
//----------------------------------------------------------------------------#include "tradutor.h"
// Prottipos das Funes
inteiro Fatorial( inteiro valor )
//----------------------------------------------------------------------------//
Funcao: Fatorial
// Descricao: retorna o fatorial de um nmero inteiro.
//----------------------------------------------------------------------------inteiro Fatorial( inteiro valor )
inicio
se ( valor > 1 )
retorne valor * Fatorial ( valor - 1 );
senao
retorne 1;
fim
//----------------------------------------------------------------------------//
Funcao: Principal
//----------------------------------------------------------------------------naoRetornaDado principal ( )
inicio
inteiro iVlr;
escreva "\nFATORIAL\n";
escreva "\nValor ? ";
leia iVlr;
escreva "\nFatorial = ";
escreva Fatorial( iVlr );
getch( );
fim

lgica aplicada - Prof. Tacla


p g ( 44/48)
arq.: 262181617.doc

1.10. Mtricas de Qualidade de Programas


Funcionalidade, Coeso, Acoplamento,

lgica aplicada - Prof. Tacla


p g ( 45/48)
arq.: 262181617.doc

1.11.
1.11.1.

Compilador Borland C++ 3.1


Instrues para Editar/Compilar/Executar um Programa

1. Configurao Inicial
1.1.
<dir_fonte>::= \\rle_server\publica\tacla\algo
1.2.
Crie um diretrio (denominado <seu_dir> a partir de agora) para
colocar seus exerccios. Por exemplo, voc pode criar um diretrio
chamado A:\algo
1.3.
Copie para <seu_dir> o arquivo tradutor.h que est no
<dir_fonte>.
1.4.
Execute o programa Borland C++.
1.5.
No menu Options Directories acrescente ;a:\algo no campo
Include Directories.
2. Edio de um novo programa
2.1.
File New para abrir uma janela limpa de edio.
2.2.
Digite o cdigo fonte.
2.3.
Salve no <seu_dir> preferencialmente com um nome de at 8
caracteres ,sem acentuao e sem smbolos especiais.
3. Abrindo um programa j digitado
3.1.
File Open
3.2.
Digite o nome do programa a ser carregado
4. Compilao de um programa
4.1.
Compile Make ou tecle F9 (compilao + linkedio)
4.2.
Veja as mensagens de erro de sintaxe (erros de compilao)
4.3.
Corrija cada um dos erros, clicando sobre a mensagem e alterando
a linha do programa com erro.
4.4.
Salve
4.5.
Repita o processo at que no existam mais erros.
5. Execuo de um programa
5.1.
Run Run ou tecle [CTRL] [F9]. Uma outra opo, abrir uma janela
DOS, posicionar no diretrio onde o arquivo .exe foi criado e digitar o
nome do programa. Se estiver rodando Borland C para Windows uma
janela ser aberta automaticamente para o programa. Caso esteja
trabalhando com a verso DOS, ele trabalhar com a tela cheia e ao
final da execuo retornar para o Borland C. Para visualizar os
resultados do programa pressione [ALT] [F5].
6. Execuo Passo a Passo (Debug)
6.1.
Para executar passo a passo use a tecla F8 (step over) e F7 (step
into)
6.2.
Para visualizar o valor de uma varivel use uma das opes
seguintes:
6.2.1. [ALT] [F4]
Inspect: mostra o valor da varivel naquele instante
6.2.2. [CTRL] [F4] Evaluate/Modify: mostra o valor da varivel e permite
modificar o contedo
lgica aplicada - Prof. Tacla
p g ( 46/48)
arq.: 262181617.doc

6.2.3. [CTRL] [F7]

Watch: mostrador de valores de variveis. (Add:


adiciona uma varivel ao mostrador; Delete: retira)

lgica aplicada - Prof. Tacla


p g ( 47/48)
arq.: 262181617.doc

1.12. Referncias Bibliogrficas


Este texto foi baseado nas seguintes bibliografias:
[1]
Sucheuski, M. Desenvolvedor Profissional - Algoritmos, editora
Lsias, 1996.
[2]Guimares, A. M.; Lages, N. A. C.; Algoritmos e Estruturas de Dados,
LTC, 1985.
[3] Achraf, O. Anotaes de Aula.

lgica aplicada - Prof. Tacla


p g ( 48/48)
arq.: 262181617.doc

Vous aimerez peut-être aussi