Académique Documents
Professionnel Documents
Culture Documents
2014
Editorial
Comit Editorial
Fernando Fukuda
Simone Markenson
Jeferson Ferreira Fagundes
Autor do Original
Mairum Ceoldo Andrade
Algoritmos
Su
ri o
Captulo 1: Fundamentos de
Lgica e Algoritmos ......................................... 7
Objetivos de sua aprendizagem ................................. 7
Voc se lembra?................................................................ 7
1.1 Definio de algoritmo.................................................... 8
1.2 Soluo de problemas ......................................................... 10
1.3 Etapas para construo de um algoritmo ................................. 11
1.4 Representao de algoritmos ........................................................ 13
1.5 Construo de um algoritmo ............................................................ 21
1.6 Lgica, lgica de programao e programa ......................................... 23
Reflexo ......................................................................................................... 24
Leituras recomendadas ...................................................................................... 25
Referncias ........................................................................................................... 25
No prximo captulo .............................................................................................. 26
Captulo 2: Estrutura Sequencial.......................................................................... 27
Objetivos da sua aprendizagem.................................................................................. 27
Voc se lembra? ........................................................................................................... 27
2.1 Caractersticas da estrutura sequencial .................................................................. 29
2.2 Comandos de incio e fim ....................................................................................... 29
2.3 Variveis ................................................................................................................. 31
2.4 Comando de entrada de dados LEIA.................................................................... 35
2.5 Comando de sada de dados IMPRIMA ............................................................. 39
2.6 Operadores aritmticos e lgicos .......................................................................... 42
Atividades.................................................................................................................... 48
Reflexo..................................................................................................................... 49
Leituras recomendadas............................................................................................ 49
Referncias .......................................................................................................... 49
No prximo captulo ........................................................................................ 50
Captulo 3: Estruturas de Deciso ........................................................... 51
Objetivos da sua aprendizagem................................................................ 51
Voc se lembra? .................................................................................... 51
3.1 Caractersticas de estrutura de deciso ..................................... 52
3.2 Comando condicional simples .............................................. 54
3.3 Comando condicional composto ...................................... 57
Ap
res
ent
Prezados(as) alunos(as)
Na disciplina de Algoritmos vamos estudar os conceitos bsicos e aprender a estruturar o pensamento para o desenvolvimento
e implementao de softwares ou programas. Esta
disciplina a base para o aprendizado de qualquer
programador, pois introduz a lgica de programao,
suas estruturas e seus principais conceitos.
No deixe de tirar todas as dvidas. Aprenda e pratique com
afinco tudo o que envolve essa disciplina, pois o que aprender
o acompanhar durante toda sua vida como desenvolvedor de
software.
Na unidade 1, vamos estudar os conceitos e fundamentos da lgica
e dos algoritmos, bem como algumas formas estruturadas para resoluo de problemas.
Na unidade 2, vamos estudar a organizao e a estrutura bsica de um
algoritmo, aprender como escrever nossos primeiros programas e entender os comandos indispensveis em qualquer programa interativo.
Na unidade 3, aprenderemos os comandos ou estruturas condicionais,
que nos permitiro criar desvios dentro de nossos programas, possibilitando a implementao de uma infinidade de problemas.
Na unidade 4, vamos aprender as estruturas de repetio, as quais nos
auxiliaro a construir programas mais longos sem a necessidade de
escrever um volume exagerado de cdigo, por meio da repetio e do
controle de determinado bloco.
Na unidade 5, finalizaremos nossa programao com o estudo das
matrizes unidimensionais ou bidimensionais, as quais nos permitiro tratar um volume de dados maior e de forma mais organizada.
Ao final da unidade, voc ser capaz de resolver praticamente qualquer problema utilizando as linguagens algortmicas
ou de programao estudadas. Porm, no esquea, sero
necessrias dedicao e ateno para entender este novo
mundo.
Bons estudos!
Fundamentos de
Lgica e Algoritmos
Cap
t u
lo
Voc se lembra?
Algoritmos
Alguns conceitos e nomes podem parecer muito complexos ou filosficos, quando vistos por sua definio formal ou pelas palavras de um
matemtico. Porm, muitas vezes, estes complexos conceitos esto presentes em nosso dia a dia, sem que ao menos percebamos.
Desde o Ensino Fundamental aprendemos, vrios algoritmos matemticos. Um exemplo de que todos devem se lembrar o algoritmo utilizado para calcular o MDC (mximo divisor comum), tambm conhecido
como Algoritmo de Euclides.
O Algoritmo de Euclides composto de um conjunto de instrues
que devem ser executadas sucessivamente para encontrar de forma eficiente o mximo divisor comum entre dois nmeros diferentes de zero.
Caso no se lembre deste algoritmo, segue abaixo a descrio desse
algoritmo:
DF. Mede ainda todo o segmento DC pelo que mede tambm o resduo CF, ou seja, o maior mede o menor, o que impossvel.
Portanto, nenhum nmero maior que CF pode medir os nmeros
AB e CD. Ento, CF a maior medida comum de AB e CD, o que
era o que se queria demonstrar. Euclides. Elementos VII.2
http://pt.wikipedia.org/wiki/Algoritmo_de_Euclides
Divisor
Quociente
Resto
Passo 1
32
Passo 2
EAD-14-Algoritmos UniSEB
Algoritmos
10
1. Entender
2. Planejar
3. Executar
4. Verificar
Basicamente, na etapa Entender, como o prprio nome j sugere,
devemos obter uma melhor compreenso do problema, identificando
quais so as questes e variveis existentes e verificando se existem informaes suficientes para entend-lo, e buscar uma soluo.
A etapa seguinte, Planejar, consiste em estudar a melhor forma
de resolver problema. basicamente identificar o melhor mtodo a ser
aplicado; geralmente o mtodo da diviso em problemas menores auxilia neste processo. Algumas tcnicas comuns a ser utilizadas nesta etapa
so: adivinhao, lista ordenada, eliminao de possibilidades, simetria
e semelhana com outros casos, causa e efeito, anlise sistmica, estruturao de uma
Conexo:
equao, desenhos, busca por padres
Para praticar o mtodo de
soluo de problemas, acesse os
etc.
endereos a seguir:
A terceira etapa consiste em
Torre de hanoi: <http://www.ufrgs.br/
psicoeduc/hanoi/>
executar o plano realizado na etapa
Teste
de
Einstein:
<http://rachacuca.com.
anterior e efetivamente solucionar o
br/teste-de-einstein/ >
problema.
Na quarta e ltima etapa, devemos
verificar a soluo encontrada. Para isso,
necessrio validar todas as entradas possveis
apresentadas no problema e identificar possveis
pontos de falhas.
EAD-14-Algoritmos UniSEB
11
Algoritmos
Entender
Interpretao
do enunciado
do problema e
das questes
envolvidas.
Planejar
Escolha da
linguagem e
estruturao
da soluo
Executar
Construo
do algoritmo
Vericar
Execuo
em um
interpretador
ou compilador
12
Interpretadores so programas que validam e executam diretamente os cdigos na linguagem apresentada e apresentam o resultado
em tela de sada. Os compiladores possuem um processo um pouco
mais complexo. Eles convertem os cdigos apresentados em linguagem
de mquina, gerando um programa executvel. Aps a gerao deste
programa, temos de execut-lo para verificar seu funcionamento. A diferena bsica para o usurio final que , se usarmos interpretadores,
iremos sempre precisar deles para executar ou realizar a soluo; j nos
compiladores, aps criado o programa executvel, no precisaremos
mais deles, pois utilizaremos os programas gerados, independentemente
de onde ou como foram desenvolvidos.
Como explicado anteriormente, um algoritmo pode ser escrito utilizando diferentes linguagens. Vamos conhecer melhor trs tipos diferentes,
a Linguagem Natural, a Linguagem Grfica e as Pseudolinguagens.
No decorrer do curso, usaremos sempre os diferentes tipos de linguagens para compreender a melhor forma de estruturar e apresentar o
algoritmo.
EAD-14-Algoritmos UniSEB
13
Algoritmos
Modo de preparo:
1. Bata as claras em neve.
2. Reserve.
3. Bata bem as gemas com a margarina e o acar.
4. Acrescente o leite e farinha aos poucos sem parar de bater.
5. Por ltimo, agregue as claras em neve e o fermento.
6. Coloque em forma grande de furo central untada e enfarinhada.
7. Preaquea o forno a 180 C por 10 minutos.
8. Asse por 40 minutos.
14
SUPERCAVIE | DREAMSTIME.COM
EAD-14-Algoritmos UniSEB
Para evitar tais problemas, utilizaremos uma padronizao de linguagem grfica conhecida como Fluxograma.
O fluxograma um diagrama padronizado utilizado para representaes esquemticas. Ele possui diversos elementos grficos e baseado na
norma ISO 5807, que os padroniza, facilitando seu aprendizado e compreenso. Esse fluxograma composto basicamente de figuras geomtricas
que representam as possveis diferentes etapas de um processo, conectadas por setas que indicam a sequncia das etapas e suas transies.
15
Algoritmos
H tarefas?
Escovar os dentes
No
Sim
Fazer tarefas
Fazer refeio
Vericar
programao do
Preparar roupas
e lanches para o
Assistir TV
Ir ao shopping
Ir ao clube
Dormir
Fazer refeio
Ir piscina
Fim
Ir ao cinema
Fazer reifeio
Praticar
16
EAD-14-Algoritmos UniSEB
1.4.3 Pseudolinguagem
17
Algoritmos
18
EAD-14-Algoritmos UniSEB
Conexo:
Para saber mais sobre o ILA
e baixar o interpretador, acesse:
<http://professor.unisinos.br/wp/crespo/
ila/>.
19
Algoritmos
O UAL, ou Unesa Algorithmic Language, um interpretador animado que, atravs da execuo e visualizao das etapas de um algoritmo,
auxilia no aprendizado do aluno iniciante (SPALLANZANI; MEDEIROS & FILHO). Basicamente um interpretador como os anteriores, que
utiliza uma linguagem adaptada das linguagens Pascal e C, porm com
termos e vocbulos em portugus. Foi desenvolvido como Projeto Final
do curso de Informtica da Universidade Estcio de S. O ambiente de
desenvolvimento para Windows apresentado na Figura 5.
No decorrer da disciplina, aprenderemos a semntica e sintaxe da linguagem UAL aplicada criao dos algoritmos. Veremos que ela bem simples
e didtica, permitindo o aprendizado
de uma forma estruturada e a compreenso simples e visual da ferramenta.
20
Conexo:
Para conhecer mais e baixar
o interpretador, acesse: <http://geocities.ws/ual_language/ual.html>.
EAD-14-Algoritmos UniSEB
21
Algoritmos
22
EAD-14-Algoritmos UniSEB
Lgica
Como vimos anteriormente, a lgica um ramo da filosofia que estuda e cuida das regras de estruturao do pensamento, do uso do raciocnio no estudo e na soluo de problemas. Ela apresenta formas e tcnicas
para estruturao e argumentao utilizadas na soluo de problemas.
Ela pode ser desenvolvida por meio do estudo dos mtodos formais
e estruturados e principalmente atravs da prtica e do desenvolvimento
do raciocnio.
Lgica de programao
A lgica de programao a aplicao dos conceitos e prticas
da lgica na utilizao das linguagens de programao para o desenvol23
Algoritmos
Reflexo
24
Leituras recomendadas
Referncias
EAD-14-Algoritmos UniSEB
ASCENCIO, A. F. G.; CAMPOS, E.e A. V. Fundamentos da programao de computadores: Algoritmos, Pascal, C/C++ e Java. 2. ed.
So Paulo: Pearson Education, 2008.
CRESPO, Srgio. Linguagem ILA. Disponvel em: <http://professor.
unisinos.br/wp/crespo/ila/> . Acesso em: 26 abr. 2014.
FORBELLONE, A.L. V; EBERSPACHER, H. Lgica de programao. 3. ed. So Paulo: Makron Books, 2005.
25
Algoritmos
No prximo captulo
26
Estrutura Sequencial
Cap
t u
lo
Definir varireis.
Conhecer e listar os tipos de dados.
Construir algoritmos de forma sequencial, utilizando comandos de
atribuio, entrada e sada, e operadores aritmticos.
Conhecer os utilizar operadores aritmticos.
Identificar os operadores relacionais e lgicos.
Voc se lembra?
28
processamento
sada
EAD-14-Algoritmo UniSEB
Algoritmos
do por voc. Este nome deve ser composto por uma palavra apenas, sem
uso de espaos. Para delimitar e indicar o fim do programa, utilizamos a
palavra reservada fimprog, com a qual o computador sabe que o programa
est encerrado, o que dispara o processo de remoo do programa e dos
dados associados a ele da memria. Abaixo so representados a estrutura
e um exemplo.
Linguagem UAL
Exemplo
prog <nomeDoPrograma>
...
fimprog
30
Nas definies e apresentaes de estruturas, sempre que utilizamos um contedo entre os sinais de maior e menor (< >) como em <nomeDoPrograma> estamos indicando que algo que deve ser definido
por voc, programador, de acordo com seu programa ou aplicao. Neste caso, como pode ser visto no exemplo, no momento de programao
deve ser substitudo pelo nome do seu programa, que no caso do exemplo primeiro.
No C++, o incio do programa indicado pelas palavras reservadas
int main() { e o final pela palavra reservada }. Em C++, as chaves ( { } )
so utilizadas para delimitar um conjunto de cdigos ou os cdigos inseridos dentro de um comando. As palavras reservadas int main () indicam o
incio da funo ou conjunto de cdigos principais, que sero executados
no incio do programa. Esta estrutura indica a criao de uma funo, porm isso no o foco de nossa disciplina e essa estruturao ser estudada
em uma prxima disciplina de programao. Portanto no se preocupe em
entend-la agora. Veja a seguir a estrutura e um exemplo.
Linguagem C++
Exemplo
#include <iostream>
using namespace std;
int main()
{
...
}
Perceba que h, tanto na definio quanto no exemplo, as duas linhas iniciais no tratam do incio do programa, mas, sim, de definies da
linguagem, que o pacote de funes predefinidas da linguagem chamado
iostream ser utilizado e que o namespace padro std ser utilizado.
No necessrio entender agora o que o pacote de funes de funes
predefinidas ou o namespace, mas ambos so necessrios para o funcionamento do programa.
No fluxograma, necessrio utilizar os smbolos de incio e fim
que so representados por retngulos com os cantos arredondados com
os termos incio e fim, em cada um, indicando visualmente os pontos do
desenho esquemtico, conforme ilustrado a seguir.
EAD-14-Algoritmo UniSEB
Fluxograma
Exemplo
Incio
Incio
..
.
123
Fim
Fim
2.3 Variveis
O principal objetivo dos algoritmos computacionais a manipulao de dados para gerar informaes, as quais podem ser especificadas
31
Algoritmos
pelo usurio ou geradas ao longo da execuo do algoritmo. Para a manipulao de informaes nos algoritmos, necessria a utilizao de um
recurso denominado variveis.
Em um programa, quando queremos manipular ou processar um
dado por meio de um conjunto de transformaes ou associaes sobre
ele, precisamos que este dado seja armazenado temporariamente na memria. Uma varivel nada mais que um espao na memria do computador onde podemos guardar um dado temporariamente e alter-lo de acordo com nossa necessidade. Para o computador, o ideal que trabalhemos
indicando o endereo de memria onde os dados esto, mas, para facilitar
nossa vida, as linguagens de programao abstraem esta complexidade
por meio da criao da varivel.
De acordo com o tipo de informao que queremos armazenar ou
manipular, necessrio especificar o tipo que ser a varivel. Este conceito conhecido como tipo de dados. Um tipo de dados determina quais
tipos de operaes, quais tipos de valores podem ser manipulados pelas
variveis e para o computador, este tipo de dados informa como ele deve
guardar isso na memria.
Uma varivel um elemento sinttico do algoritmo que tem como
funcionalidade armazenar um determinado valor. O valor associado
varivel depende do tipo de informao que se deseja manipular, assim
diversos tipos de valores podem ser atribudos s variveis.
32
Descrio
UAL
C++
Inteiro
Nmeros inteiros
int
int
Real
Nmeros fracionrios ou de
ponto flutuante
real
float
Caractere
string
char (apenas um
caractere)
Lgico
logico
bool
Conexo:
Quer saber mais detalhes
sobre variveis e tipos de dados?
EAD-14-Algoritmo UniSEB
Acesse:<http://www.metropoledigital.
ufrn.br/aulas/disciplinas/mat_aplicada/
aula_07.html>.
33
Algoritmos
Para que possamos utilizar uma varivel, um algoritmo ou programa, precisamos primeiro declar-la. Para o computador, esta uma etapa
muito importante, pois neste momento que o computador reserva o
espao de memria necessrio para a varivel, o espao e o local que no
ser alterado enquanto a varivel existir.
Para que possamos declarar uma varivel, primeiro precisamos definir que tipo de dado ela ir armazenar, pois, quando se define um tipo de
varivel, informamos ao computador o quanto de memria ser necessrio separar e que tipos de operaes podero ser realizadas com o dado
que ser armazenado.
Na maioria das linguagens, as variveis precisam ser declaradas antes de serem usadas.
Para se declarar uma varivel, usamos a seguinte sintaxe:
tipo <nomeDaVarivel>
UAL
C++
Inteiro
Real
Caractere
Logico
34
Aps declarar uma varivel, podemos utiliz-la da forma que desejarmos. Geralmente, a primeira ao relacionada a uma varivel a
atribuio de valores, a qual feita atravs de um comando de atribuio
que diz ao computador para copiar um valor para o espao de memria
daquela varivel. A seguir, veja o comando de atribuio das linguagens.
Linguagem UAL
Linguagem C++
<varivel> = <valor>
No UAL, a atribuio feita pelo smbolo menor seguido de menos <- e em C++ pelo smbolo =. Para atribuir importante saber o tipo
da varivel, pois s possvel atribuir valores de tipos compatveis com
o tipo da varivel, ou seja, para uma varivel do tipo inteiro, possvel
apenas atribuir valores inteiros; se tentarmos atribuir valores fracionados
ou literais teremos um erro de programao. Seguem alguns exemplos de
atribuio de valores.
Linguagem UAL
Linguagem C++
varInteiro = 213;
varReal = 2.5;
varCaractere = E;
varLogico = false;
EAD-14-Algoritmo UniSEB
Algoritmos
sentao de uma informao na tela, utilizado um comando de sada especfico denominado escreva.
Iniciamos, assim, o uso de funes ou comandos predefinidos, como
o comando leia, que trata-se de uma palavra reservada da linguagem, que
j possui uma ao predeterminada associada, que no caso a leitura de
dados do dispositivo de entrada padro.
Vejamos abaixo como utilizar esses comandos nas diferentes linguagens.
COMANDO LEIA
Linguagem UAL
Linguagem C++
Sintaxe
leia <nomeDaVariavel>;
Descrio
leia v1;
leia v2;
leia v3;
Exemplos
Fluxograma:
36
Se voc tiver mais de um dado para ser digitado, poder usar a vrgula para separar os nomes das varveis.
variavel
v1, v2, v3
Antes de continuarmos e estudarmos os comandos de sada de dados, vamos reforar alguns conceitos. No incio desta aula, vimos as trs
etapas principais de um software: Entrada, Processamento e Sada. Com o
que aprendemos, j possvel estruturarmos um pouco melhor os conceitos associados a essas etapas.
Voc se lembra do algoritmo de clculo de juros que construmos ao
final da Unidade 1? Caso no se lembre, volte e releia. Vamos agora identificar os componentes que j aprendemos para resolver aquele problema.
Dados de entrada
quantidade: 2
tipos: real, real
Dados intermedirios
quantidade: 2
tipos: real, real
Procedimento
1 obter conta, juros
2 valorJuros <- conta * juros
3 novoValor <- valor + valorJuros
4 exibir novo Valor
EAD-14-Algoritmo UniSEB
Lingaugem UAL
37
Algoritmos
Fluxograma
Incio
conta, juros
valorJuros <- conta* juros
novoValor <- conta +
valorJuros
novoValor
Fim
38
3 Para que o programa interprete como um valor do tipo real, necessrio informar o valor explicitando que a varivel real, mesmo que a
parte fracionria seja zero; dessa forma, deve-se entrar com o valor 100.0,
conforme Figura 10 a seguir.
EAD-14-Algoritmo UniSEB
Algoritmos
COMANDO ESCREVA
Linguagem UAL
Linguagem C++
Sintaxe
imprima <contedo>;
Descrio
imprima v1;
Exemplos
O smbolo anterior representa o comando que joga o contedo indicado na tela do usurio, considerando sempre a tela do usurio como o
dispositivo de sada padro.
Dentro do smbolo, vir o nome da varivel, contedo ou expresso,
que ser mostrada. Se voc tiver mais de um dado para ser mostrado, poder usar a vrgula para separar os nomes das variveis, ou contedos.
v1, v2
40
Varivel, v1
J que conhecemos melhor o comando de escrita, que tal melhorarmos um pouco o programa UAL para clculo dos juros? Vamos exibir
algumas mensagens que facilitam o uso do programa. Veja a Figura 11 a
seguir com o novo cdigo e o resultado.
EAD-14-Algoritmo UniSEB
Devemos concordar que a soluo ficou bem melhor e mais elegante. Perceba que no ltimo comando de escrita utilizamos um smbolo
diferente \n. Este smbolo realiza a quebra de linha ou insere uma linha
na impresso. Compare a ltima linha do resultado com o anterior. No anterior, quando no tnhamos o \n, o texto do programa UAL Press any key to continue... est
Conexo:
na mesma linha logo aps o valor calcuPara conhecer mais smbolado; j neste exemplo o texto est uma
los, consulte a tabela ASCII:
linha abaixo, desta forma conseguimos
<http://en.wikipedia.org/wiki/ASCII>
estruturar melhor a apresentao.
Alm desses outros smbolos, podem
ser utilizados para formatar melhor a
sada estes smbolos esto presentes na
tabela ASCII, voc pode consult-la para
identificar novas possibilidades e test-los.
41
Algoritmos
Os computadores podem ser encarados como grandes mquinas capazes de realizar uma quantidade imensa de operaes por segundo. Na evoluo histrica da computao, os primeiros algoritmos foram criados com o
intuito de solucionar complexas expresses em poucos segundos. As expresses so formadas essencialmente por operadores, operandos e parnteses.
De acordo com o tipo de operador utilizado, podemos criar expresses denominadas aritmticas, relacionais ou lgicas, conforme estudaremos a seguir.
As expresses aritmticas utilizam os operadores aritmticos da matemtica tradicional para criar expresses capazes de resolver os mais variados tipos de funes. Neste grupo, os principais operadores utilizados so:
Operador
Linguagem UAL
Linguagem C++
Soma
Subtrao
Multiplicao
Diviso
Resto da diviso
A Figura 12 apresenta a codificao de um algoritmo que utiliza expresses aritmticas para resolver um polinmio.
Linguagem UAL
42
Linguagem C++
EAD-14-Algoritmo UniSEB
Operador
Linguagem UAL
Linguagem C++
maior
>
>
menor
<
<
menor ou igual
<=
<=
maior ou igual
>=
>=
igual
==
==
diferente
<>
!=
43
Algoritmos
A Figura 14 demonstra a construo de um algoritmo computacional que utiliza expresses relacionais. Note, no algoritmo, que todos os
operadores relacionais so expresses por meio de smbolos.
Linguagem C++
44
Linguagem UAL
Linguagem C++
negao (NOT)
conjuno (E)
&&
&&
disjuno (OU)
||
||
<no existe>
disjuno-exclusiva (XOR)
EAD-14-Algoritmo UniSEB
Linguagem C++
Algoritmos
Conexo:
Para um estudo aprofundado
a respeito de tabelas verdade,
voc poder consultar as seguintes
referncias:
<http://pt.wikipedia.org/wiki/Tabela_verdade>
Os operadores lgicos so muito importantes para a construo de programas, principalmente para a elaborao de expresses relacionais compostas. Para complementar seu estudo, voc poder utilizar
as seguintes referncias:
<http://pt.wikipedia.org/wiki/ Operadores_l%C3%B3gicos>
<http://wwwusers.rdc.puc-rio.br/ rmano/oplog.html>
46
Com isso, conclumos o estudo a respeito dos operadores e das expresses aritmticas, relacionais e lgicas. Aproveite este momento para
construir algoritmos a partir das atividades propostas.
Para demonstrar a utilizao dos comandos e a estrutura estudadas
anteriormente, vamos construir uma calculadora simples de quatro operaes. Este programa de utilizar da estrutura de um programa, obtendo
as entradas necessrias, realizao do processamento dos dados e sada.
O incio e o fim do programa devem estar corretamente definidos. O processamento deve ser executado utilizando as operaes aritmticas.
Nesta calculadora, o usurio fornecer dois valores numricos para
serem realizados os clculos de soma, subtrao, multiplicao e diviso.
Para a leitura dos valores, ser utilizado o comando leia e para a apresentao dos resultados ser necessrio o comando escreva. Vamos identificar
os componentes que j aprendemos para resolver aquele problema. A Figura 18 apresenta o algoritmo codificado para soluo do problema.
Dados de entrada
quantidade: 2
tipos: real, real
Dados intermedirios
quantidade: 4
tipos: real, real, real, real
PROCEDIMENTO
1 obter valor1, valor2
2 soma <- valor1 + valor2
3 sub <- valor1 - valor2
4 mult <- valor1 * valor2
5 div <- valor1 / valor2
6 exibir soma, sub, mult, div
EAD-14-Algoritmo UniSEB
Linguagem UAL
Linguagem C++
Algoritmos
Atividades
01. Construir um algoritmo capaz de calcular o consumo mdio de combustvel de um veculo. Para isso, o usurio dever informar como entrada os
quilmetros percorridos pelo veculo e o total de litros usados para abastec-lo.
48
Reflexo
Leituras recomendadas
Uma forma fcil e estruturada para que voc teste seus algoritmos
e verifique seu funcionamento a utilizao do teste de mesa. Para
aprender como realiz-lo, acesse: <http://gomeshp.plughosting.com.
br/ed/testemesa.htm>.
Referncias
ASCENCIO, A. F. G.; CAMPOS, E.e A. V. Fundamentos da programao de computadores: Algoritmos, Pascal, C/C++ e Java. 2. ed.
So Paulo: Pearson Education, 2008.
FORBELLONE, A.L. V; EBERSPACHER, H. Lgica de programao. 3. ed. So Paulo: Makron Books, 2005.
PUGA, S.; RISSETTI, G. Lgica de programao e estrutura de
dados: com aplicaes em Java. 1. ed. So Paulo: Pearson Education,
2003.
EAD-14-Algoritmo UniSEB
49
Algoritmos
No prximo captulo
50
Estruturas de Deciso
Cap
t u
lo
Voc se lembra?
Algoritmos
52
Condicional simples
Condicional composta
Condicional aninhada
Condicional mltipla
O aprendizado do comando condicional ou de deciso nos possibilita vislumbrar o grau de complexidade das tarefas que os algoritmos
podero executar a partir de agora. No se assuste com o tamanho dos
programas nesta unidade. assim mesmo, eles vo crescendo e ganhando
complexidade conforme aprendemos novos comandos e funes.
Condicional simples: a forma mais simples de deciso; os comandos do bloco condicional sero executados somente se a condio de teste
do comando condicional for verdadeira.
Condicional composta: nesta forma, existem dois blocos de comando, um que ser executado caso a condio de teste do comando condicional seja verdadeira, e outro que ser executado caso o resultado do teste
seja falso.
Condicional aninhada: aps a execuo do teste, ser executado um
bloco de comandos se o resultado do teste for verdadeiro, podendo ter um
outro teste (aninhado); caso no seja, um outro teste (encadeado) ser feito at que todas as possibilidades de respostas sejam contempladas.
Condicional mltipla: permite a verificao de mltiplas possibilidades para uma mesma varivel executando diferentes blocos de cdigo,
de acordo com seu valor. Permite especificar quantos valores sejam necessrios para uma varivel.
Teste
O teste uma expresso relacional que compara valores dos seus
operandos.
Neste momento, muito importante termos de forma clara o que o
teste. uma expresso que utiliza os operadores relacionais e lgicos vistos
na unidade anterior para realizar uma comparao ou avaliao de uma expresso, resultando sempre em valor lgico. Veja alguns exemplos:
Operaes ou testes
Significado
Matemtica
Exemplo - UAL
Maior
>
2*8>4
Menor
<
2<9
Igual
3 == 7 4
Maior ou igual
9 >= 5
Menor ou igual
4 <= 10
Diferente
8 <> 5
Conjuno (e)
Disjuno (ou)
n<100 || n>200
Negao (no)
!p
Caso no lembre como funciona a conjuno, a disjuno e a negao, segue a tabela verdade com as respetivas sadas para cada possvel
combinao de entradas.
Tabela verdade
E
OU
EAD-14-Algoritmos UniSEB
No
53
Algoritmos
EXEMPLO
se (<teste>)
{
<bloco de comandos>
}
se (nota >= 6)
{
imprima Aprovado;
}
Linguagem C++
EXEMPLO
if (<teste>)
{
<bloco de comandos>
}
if (nota >= 6)
{
cout << Aprovado;
}
FLUXOGRAMA
EXEMPLO
Teste
54
Nota > = 6
..
.
Aprovado
A melhor forma de aprender e entender o uso das estruturas de programao praticando. Vamos a um exemplo completo, apresentado na
Figura 20. O programa recebe um nmero inteiro como entrada e verifica
se positivo ou negativo.
Linguagem UAL
Linguagem C++
EAD-14-Algoritmos UniSEB
55
Algoritmos
A Figura 23 a seguir apresenta a codificao um algoritmo computacional capaz de verificar se um nmero informado pelo usurio par ou
mpar. Para isso, ser utilizado no algoritmo o operador aritmtico %, que
necessrio para determinar o resto de uma diviso inteira. Um nmero definido como par quando a diviso deste nmero por 2 resultar em resto zero,
caso contrrio este nmero mpar. Devemos nos atentar ao fato de estar
utilizando mais de uma expresso dentro do teste. De acordo com a precedncia dos operadores a operao mdulo ser executada primeiramente
seguida pela operao de comparao. Lembre-se de que, se quisermos
alterar a ordem de precedncia, precisaremos delimitar as operaes com
parnteses, porm isso no necessrio para este exemplo.
Linguagem UAL
56
Linguagem C++
Figura 23 Algoritmo com comando condicional simples que verifica se um nmero par
ou mpar.
EAD-14-Algoritmos UniSEB
Algoritmos
Linguagem UAL
EXEMPLO
se (<teste>)
{
<bloco de comandos>
}
seno
{
<bloco de comandos>
}
se (nota >= 6)
{
imprima Aprovado;
}
seno
{
imprima Reprovado;
}
Linguagem C++
EXEMPLO
if (<teste>)
{
<bloco de comandos>
}
else
{
<bloco de comandos>
}
if (nota >= 6)
{
cout << Aprovado;
}
else
{
cout << Reprovado;
}
FLUXOGRAMA
EXEMPLO
Teste
..
.
58
Nota >= 6
..
.
V
Aprovado
Reprovado
Veja na Figura 26 o exemplo de como podemos codificar o algoritmo anterior de verificao se um nmero par ou mpar utilizando o
comando condicional composto.
Linguagem UAL
Linguagem C++
EAD-14-Algoritmos UniSEB
59
Algoritmos
Linguagem C++
60
Neste exemplo, utilizamos uma entrada literal, e, neste caso, precisamos de alguns cuidados adicionais. Atravs da mensagem inicial, informamos ao usurio quais so opes de valores de entrada, delimitando assim as possibilidades, apesar de ainda haver possibilidade de variaes de
entrada. Mesmo tendo delimitado que a entrada deve ser S para sim e N
para no, o usurio pode digitar os caracteres minsculos ou maisculos,
sendo assim precisamos tratar estes dois casos em nosso programa. Perceba que, para isso, utilizamos uma composio de condio dentro do teste
do comando condicional. No caso especfico, utilizamos o operador relacional OU, que verifica se um caso ou outro verdadeiro sendo um dos
EAD-14-Algoritmos UniSEB
61
Algoritmos
Linguagem UAL
EXEMPLO
se (<teste>)
{
<bloco de comandos>
}
seno
{
se (<teste>)
{
<bloco de comandos>
}
seno
{
<bloco de comandos>
}
}
se (nota >= 6)
{
imprima Aprovado;
}
se (nota >= 4)
{
imprima imprima Recuperao;
}
seno
{
imprima Reprovado;
}
}
Linguagem C++
EXEMPLO
if (<teste>)
{
<bloco de comandos>
}
else
{
if (<teste>)
{
<bloco de comandos>
}
else
{
<bloco de comandos>
}
}
if (nota >= 6)
{
cout << Aprovado;
}
else
{
if (nota >= 4)
{
cout << Recuperao;
}
else
{
cout << Reprovado;
}
}
FLUXOGRAMA
EXEMPLO
Teste
Nota >= 6
Teste
62
F
..
.
..
.
V
F
Nota >= 4
..
.
F
Reprovado
Aprovado
V
Recuperao
Para demonstrar a codificao de uma estrutura condicional aninhada, vamos elaborar um algoritmo que tem como objetivo ordenar um
conjunto de trs elementos numricos do tipo inteiro informados pelo usurio. Isto posto, o usurio especificar por meio do teclado trs valores e o
algoritmo ser capaz de exibi-los em ordem crescente. Para a codificao
do exemplo, foi utilizada uma estrutura condicional aninhada, em que
possvel identificar a utilizao de estruturas condicionais encadeadas. A
Figura 32 demonstra sua codificao.
EAD-14-Algoritmos UniSEB
Linguagem UAL
63
Algoritmos
Linguagem C++
64
Fluxograma
Incio
a, b, c
F
b, a, c
c<a
a<b
a<b
c, b, a
b, c, a
a, b, c
c<b
c<a
c, a, b
a, c, b
Fim
EAD-14-Algoritmos UniSEB
Para facilitar a visualizao e o entendimento dos comandos condicionais aninhados, adicionamos o fluxograma para visualizao grfica.
Sempre que tiver dificuldades no entendimento de um cdigo, utilize
recursos grficos, como o fluxograma ou o teste de mesa, para facilitar a
compreenso. O resultado da execuo do algoritmo pode ser visualizado
na Figura 33.
65
Algoritmos
Linguagem UAL
66
Figura 34 Algoritmo com comando condicional aninhada que realiza login de um usurio.
EAD-14-Algoritmos UniSEB
Um problema frequente que ocorre quando temos uma nica varivel podendo assumir diversos valores diferentes, em que, para cada valor, teremos uma ao associada. Para resolver este problema de imediato,
67
Algoritmos
68
fcil perceber que no momento da escrita no muito usual realizar o controle de quantos se ... seno se sero utilizados e principalmente
dos abre e fecha chaves. O que pode levar facilmente a erros simples, porm difceis de serem detectados.
A estrutura condicional mltipla utilizada para estruturar de forma
melhor e mais eficiente problemas como o apresentado anteriormente. Ela
permite especificar no algoritmo que, dentre as condies possveis, apenas uma condio poder ser executada. Este tipo de estrutura permite a
elaborao de condicionais mutuamente exclusivas, ou seja, uma estrutura
que seleciona e executa apenas uma condio por vez.
A codificao pode ser realizada utilizando a instruo se ... seno
se, ou, ainda, uma estrutura especfica denominada escolha. Para o uso da
estrutura escolha, precisamos estar atentos a exigncias, como as listadas
a seguir
Linguagem C++
escolha (<variavel>)
switch (<variavel>)
{
case <valor1>: <comandos>
break;
pare;
break;
pare;
break;
pare;
break;
senao : <comandos>
}
EAD-14-Algoritmos UniSEB
default : <comandos>
69
Algoritmos
FLUXOGRAMA
valor == v1
Comandos 1
F
valor == v2
Comandos 2
F
valor == v3
Comandos 3
F
valor == vn
Comandos n
Comandos 1
70
EAD-14-Algoritmos UniSEB
Linguagem C++
Figura 39 Algoritmo C++ utilizando estrutura escolha que imprime o nome do ms a partir
no nmero.
71
Algoritmos
O resultado da execuo do algoritmo pode ser visualizado na Figura 40. A Figura 41 apresenta o resultado do algoritmo com um valor no
tratado nas opes, o que culmina na execuo da opo seno.
Linguagem C++
72
Atividades
02. Entrar com 3 nmeros para as variveis v1, v2, v3. Trocar os contedos das variveis de tal maneira que a varivel v1 fique com o maior nmero, a varivel v2 fique com o nmero do meio e a v3 com o menor nmero.
Exibi-los de forma decrescente.
EAD-14-Algoritmos UniSEB
73
Algoritmos
Automveis
Caminhes
abril
maio
junho
julho
agosto
5e6
setembro
1e2
outubro
3, 4 e 5
novembro
6, 7 e 8
dezembro
9e0
Reflexo
Leituras recomendadas
74
Referncias
ASCENCIO, A. F. G.; CAMPOS, E.e A. V. Fundamentos da programao de computadores: Algoritmos, Pascal, C/C++ e Java. 2. ed.
So Paulo: Pearson Education, 2008.
ASCENCIO, A. F. G.; EDILENE, A. V. de. Fundamentos da programao de computadores: Algoritmos, Pascal e C/C++. So Paulo:
Prentice Hall, 2002.
FORBELLONE, A.L. V; EBERSPACHER, H. Lgica de programao. 3. ed. So Paulo: Makron Books, 2005.
PUGA, S.; RISSETTI, G. Lgica de programao e estrutura de
dados: com aplicaes em Java. 1. ed. So Paulo: Pearson Education,
2003.
SPALLANZANI, Adriana Sayuri; MEDEIROS, Andra Teixeira de;
FILHO, Juarez Muylaert. Linguagem UAL. Disponvel em: <http://
geocities.ws/ual_language/ual.html>. Acesso em: 25 abr. 2014.
No prximo captulo
EAD-14-Algoritmos UniSEB
Veremos a seguir as estruturas que nos permitem economizar esforo, evitando repetio de cdigo para execues cclicas, o que facilitar
muito o desenvolvimento de algoritmos e programas mais longos, em razo da utilizao de uma quantidade menor de cdigos.
75
Algoritmos
Minhas anotaes:
76
Estruturas de Repetio
Cap
t u
lo
Voc se lembra?
Estudamos no Captulo 2 os operadores lgicos e de comparao e os utilizamos amplamente na Unidade 3 para realizar os controles condicionais
de desvio. muito importante que o uso e a aplicao destes operadores
estejam bem entendidos por voc, pois nesta unidade sero novamente
utilizados como controle para as estruturas de repetio. Caso ainda
tenha dvidas ou dificuldade em sua aplicao, retorne e reforce os
estudos para que eles no dificultem seu entendimento das estruturas de repetio.
Algoritmos
78
EAD-14-Algoritmos UniSEB
Algoritmos
80
Linguagem C++
for(<valor inicial>; <expresso de teste>;<incremento>){
bloco de comandos
}
<valor inicial>
nomeDaVarivel = valorInicial;
deve ser uma varivel enumervel, um inteiro (int)
atribudo um valor inicial, pode ser uma constante, uma varivel ou uma expresso.
Exemplos: i=0; i=strtam(nome); i=x+1;
<expresso de teste>
nomeDaVarivel <, >, <=, >=, == valor;
Estrutura relacional ou condio que ser utilizada como termo final do lao
O valor poder ser constante, varivel ou expresso
Exemplos: i >= 10; i>strtam(nome); i <= x+10;
<incremento>
nomeDaVarivel <- nomeDaVarivel operador valor
um comando de atribuio que incrementa a varivel no lao
o operador pode ser qualquer operador aritmtico ou expresso
Exemplos: i =i+1; i=i+2; i++; i--;
O comando < ; ; > pode ser utilizado sem parmetro algum para criar um loop ou for
infinito, porm os ; so obrigatrios
EAD-14-Algoritmos UniSEB
81
Algoritmos
FLUXOGRAMA
EXEMPLO
Incio
Repetio
com contador
Count < 1, 3, 1
V
Digite nmero > 0
V
Bloco de
comandos
NUM
Num * 2
Fim
82
Linguagem UAL
Linguagem C++
Repetir 30 vezes
Contar de 10 at 1
decrementando de 1
Contar de 10 at 1
decrementando de 2
Contar de 0 at 100
de 10 em 10
A listagem cdigo 9 demonstra a utilizao da estrutura de repetio para. Neste exemplo, a estrutura de repetio empregada na leitura
de um conjunto de 10 valores numricos do tipo real que so informados
pelo usurio. Alm disso, uma varivel especial denominada acumulador
realiza a soma dos valores que tm entrada pelo teclado e, ao final, apresenta a soma total destes valores. Um detalhe importante a respeito de
acumuladores est relacionado necessidade de inicializao da varivel
acumuladora. Para evitar inconsistncias na soma dos valores, fundamental que a varivel acumuladores seja iniciada com o valor zero.
Linguagem UAL
prog exemplo
int cont;
real valor, acumulador;
acumulador <- 0.0;
para(cont<-1; cont<=10; cont++)
{
imprima \nValor , cont, : ;
leia valor;
acumulador <- acumulador + valor;
}
imprima \nSoma dos valores: , acumulador;
fimprog
Linguagem C++
#include <iostream>
using namespace std;
int main()
{
int cont;
float valor, acumulador;
acumulador = 0;
for(cont=1; cont<=10; cont++)
{
cout << \nNumero: << cont;
cin >> valor;
acumulador = acumulador + valor;
}
cout <<\nSoma dos valores: << acumulador;
}
EAD-14-Algoritmos UniSEB
Algoritmos
Linguagem UAL
Linguagem C++
prog exemplo
int cont;
para(cont<-10; cont>1; cont--)
{
se (cont % 2 == 0)
{
imprima \n, cont;
}
}
fimprog
#include <iostream>
using namespace std;
int main()
{
int cont;
for(cont=10; cont>1; cont--)
{
if( (cont%2) == 0)
cout<<\n <<cont;
}
}
84
EAD-14-Algoritmos UniSEB
Algoritmos
Linguagem C++
while ( <condio> )
{
bloco de comandos
}
<condio>
varivel operador valor;
Estrutura relacional ou condio que ser utilizada como validao para execuo
do bloco de comandos.
Pode ser uma nica expresso simples ou um conjunto de expresses relacionais
e lgicas, como as utilizadas nos comandos condicionais, vistas anteriormente.
Exemplos: i >= 10; i>strtam(nome); i <= x+10;
86
FLUXOGRAMA
EXEMPLO
Incio
Digite nmero > 0
NUM
Test
V
Bloco de
comandos
F
Num > 0?
V
Num * 2
Fim
EAD-14-Algoritmos UniSEB
87
Algoritmos
Linguagem UAL
Linguagem C++
prog exemplo
int cont;
cont <- 1;
enquanto(cont<=10)
{
se (contador % 2 = 0)
{
imprima \n, contador;
}
cont <- cont + 1;
}
fimprog
#include <iostream>
using namespace std;
int main()
{
int cont = 1;
while(cont <= 10)
{
if( (cont%2) == 0)
cout<<\n <<cont;
cont++;
}
}
88
Como apresentado anteriormente, a aplicao mais comum e indicada da estrutura enquanto se d em problemas computacionais em que
no se sabe previamente o nmero de vezes que o lao dever ser repetido. Nestes casos, uma expresso condicional determina se o lao ser ou
no executado novamente. A listagem cdigo 11 demonstra a codificao
de uma estrutura de repetio enquanto com um lao controlado por uma
expresso condicional. O lao ser executado enquanto o valor informado
pelo usurio for diferente de zero. Alm disso, o algoritmo realiza a contagem do total de nmeros positivos e do total de nmeros negativos que
foram informados.
Linguagem UAL
Linguagem C++
prog exemplo
int numero, pos, neg;
numero <- 1;
pos <- 0;
neg <- 0;
enquanto(numero <> 0)
{
imprima \n Escreva o nmero: ;
leia numero;
se (numero > 0)
{
pos<- pos +1;
} seno
{
se (numero < 0)
{
neg<- neg +1;
}
}
}
imprima \nTotal de nmeros positivo:
, pos;
imprima \nTotal de nmeros negativos, neg;
fimprog
#include <iostream>
using namespace std;
int main()
{
int numero = 1;
int pos, nerg;
pos = neg = 0;
while(cont != 0)
{
cout<<\nEscreva o nmero;
cin>>numero;
if( (numero > 0)
pos++;
else
{
if( (numero < 0)
neg++;
}
}
cout<<\nTotal de nmeros positos:
<<pos;
cout<<\nTotal de nmeros negativos:
<<neg;
}
EAD-14-Algoritmos UniSEB
Algoritmos
90
Enquanto
Para
EAD-14-Algoritmos UniSEB
Algoritmos
Linguagem C++
do
{
bloco de comandos
}
while( <condio> );
<condio>
varivel operador valor;
Estrutura relacional ou condio que ser utilizada como validao para execuo
do bloco de comandos novamente.
Pode ser uma nica expresso simples ou um conjunto de expresses relacionais
e lgicas, como as utilizadas nos comandos condicionais, vistas anteriormente.
Exemplos: i >= 10; i>strtam(nome); i <= x+10;
Atente-se para o ; aps o comando while, ele obrigatrio.
92
FLUXOGRAMA
EXEMPLO
Incio
Digite nmero > 0
Bloco de
comandos
NUM
Num * 2
Test
F
Num > 0?
F
Fim
EAD-14-Algoritmos UniSEB
93
Algoritmos
Linguagem UAL
94
prog exemplo
int total;
real nota, soma, maior, menor, media;
string resposta;
soma <- 0.0;
total <- 0;
faca
{
total <- total +1;
imprima \nNota , total, : ;
leia nota;
soma <- soma + nota;
se (total == 1)
{
maior <- nota;
menor <- nota;
} senao
{
se (nota > maior)
{
maior <- nota;
}
se (nota < menor)
{
menor <- nota;
}
}
imprima Deseja continuar [s] ou [n]? ;
leia resposta;
}
enquanto(resposta==s
||
resposta==S)
media <- soma / total;
escreva \nMdia das notas: , media;
escreva \nMaior nota..........: , maior;
escreva \nMenor nota.........: , menor;
fimprog
Linguagem C++
#include <iostream>
using namespace std;
int main()
{
int total;
float nota, soma, maior, menor, media;
char resposta;
soma = 0;
total = 0;
do{
total++;
cout<<\nNota <<total<<: ;
cin>>nota;
if( (total == 1)
{
maior = nota;
menor = nota;
} else
{
if (nota > maior)
maior = nota;
if (nota < menor)
menor = nota;
}
cout\nDeseja continuar [s] ou [n]? ;
cin>>resposta;
} while(resposta==n || resposta==N);
media = soma / total;
cout << \nMdia das notas: << media;
cout << \nMaior nota..........: << maior;
cout << \nMenor nota.........: << menor;
}
Conexo:
Voc pode utilizar as sugestes
de endereos apresentados abaixo para complementar seus estudos a
respeito de estruturas de repetio: <http://
algoritmizando.com/desenvolvimento/aprendaa-programar-11-algo-ritmos-estruturas-derepeticao-3/>
<http://algoritmizando.com/desenvolvimento/
aprenda-a-programar-10-algo-ritmos/>
<http://www.ufpa.br/sampaio/curso_de_icc/icc/aula%2011/
repita_ate.htm>
EAD-14-Algoritmos UniSEB
Acredito que neste momento voc deva estar se perguntando: quando devo usar cada uma das estruturas? normal que haja preferncia por
uma ou outra estrutura de repetio, porm existem algumas indicaes
ou melhores aplicaes, conforme segue.
Estrutura ideal quando o nmero de repeties for conhecido durante a elaborao do algoritmo ou quando o usurio puder fornec-lo
durante a execuo.
95
Algoritmos
Na linguagem C++, essa estrutura recebe o nome de for e, diferentemente de outras linguagens, simula com facilidade as estruturas do enquanto e do faca... enquanto como veremos mais adiante.
Estrutura que testa no incio e usada quando o nmero de repeties for desconhecido.
Simula com facilidade a estrutura do faca...enquanto e a estrutura
do para (desde que criemos uma varivel que ter seu valor incrementado/
decrementado dentro da estrutura de repetio).
Na linguagem C++, essa estrutura recebe o nome de while.
Sua lgica : repete enquanto a condio for verdadeira. Como ela
testa antes de executar o bloco, pode ser que nem execute o bloco se a
condio de incio for falsa.
96
Reflexo
Atividades
02. Construa um algoritmo que permita entrar com vrios nmeros enquanto forem diferentes de 999999999. Exibir, ao final, a quantidade de
nmeros digitados, a mdia de todos os nmeros e o percentual de nmeros negativos.
EAD-14-Algoritmos UniSEB
97
Algoritmos
Leituras recomendadas
Referncias
ASCENCIO, A. F. G.; CAMPOS, E.e A. V. Fundamentos da programao de computadores: Algoritmos, Pascal, C/C++ e Java. 2. ed.
So Paulo: Pearson Education, 2008.
98
FORBELLONE, A.L. V; EBERSPACHER, H. Lgica de programao. 3. ed. So Paulo: Makron Books, 2005.
No prximo captulo
EAD-14-Algoritmos UniSEB
Vimos neste e no decorrer dos captulos todos os comandos e estruturas bsicas de algoritmos e das linguagens de programao em geral
e j conseguimos resolver praticamente qualquer problema. No prximo
captulo veremos algumas estruturas de dados que nos permitiro realizar
computao de um volume maior de dados tratando de problemas mais
complexos, com menor quantidade de cdigo.
99
Algoritmos
Minhas anotaes:
100
Estrutura de Dados
Homogneas
Un
ida
de
Voc se lembra?
EAD-14-Algoritmos UniSEB
103
Algoritmos
Podemos notar que entre os dados temos diferentes tipos; alguns so literais, como: nome, endereo, sexo, enquanto outros no numerais: idade,
telefone, cpf e rg. Para representar uma pessoa, agrupando seus dados,
utilizamos uma estrutura heterognea, como a proposta abaixo:
estrutura {
literal nome;
inteiro idade;
literal sexo;
literal endereo;
inteiro telefone;
inteiro cpf;
inteiro rg;
} Pessoa;
Este tipo de estrutura muito importante para representar elementos
complexos e heterogneos do mundo real. Novamente, no se preocupe
com a sintaxe de estrutura; mais adiante, no curso, voc aprender outras
estruturas para representar elementos heterogneos. Apenas a ttulo de
curiosidade, na linguagem C elas so definidas utilizando-se o comando
struct.
O tipo String, muito utilizado em todas as linguagens para armazenar e manipular contedos literais, na verdade uma estrutura homognea
do tipo char ou um vetor de caracteres. A representao literal de uma
string sempre feita por um conjunto de caracteres da tabela ASCII, apresentados entre aspas duplas.
104
Nome
M
\0
Um vetor de tamanho 6, ou seja de 6 posies, iniciado na posio zero e terminado na posio 5 pelo smbolo \0. Logo, sempre que
quisermos guardar uma palavra ou frase, precisamos de uma varivel do
tamanho dos dados mais um. Geralmente, essa complexidade transparente e fica encapsulada no tipo String. Caso opte por trabalhar com a variao nativa ou bsica do tipo, que o vetor de caracteres, preciso ter o
cuidado na manipulao e definio dos tamanhos, bem como realizar os
tratamentos necessrios.
Veremos a seguir como funcionam os vetores; assim, poderemos
tambm entender melhor o funcionamento do tipo String.
ai,j
m linhas
Matriz m por n
n colunas
a1,1
a1,2
a2,1
a2,2
EAD-14-Algoritmos UniSEB
Algoritmos
Voltando ao nosso exemplo da String, vamos considerar que o endereo base seja 1200 e encontrar o endereo da letra r.
Nome
M
\0
106
Ou seja, a posio da letra r na memria 1208. Assim, considerando o primeiro elemento, essa a forma mais simples para o computador calcular e encontrar a posio dos demais elementos de um vetor.
Linguagem C++
tipo nomeDoVetor[tamanahoDoVetor];
tipo nomeDoVetor[tamanahoDoVetor];
Exemplos:
Linguagem UAL
Linguagem C++
Int notas[10];
char sexo[50];
float salario[100];
char nome[30];
Vendo os exemplos, podemos notar que o tamanho do vetor sempre definido no momento de sua declarao, entre colchetes, e no se altera durante toda a sua existncia. O tamanho deve ser sempre um nmero
inteiro.
EAD-14-Algoritmos UniSEB
Aps declarar um vetor, temos que popular este vetor, ou seja, incluir os dados desejados. Podemos fazer a inicializao juntamente da
declarao ou posteriormente a qualquer momento.
Para inicializar um ver com um determinado valor, ou seja, declar-lo e em sequncia j inserir um conjunto de dados, utilizamos os comandos a seguir:
107
Algoritmos
Linguagem UAL
tipo nomeDoVetor[tamanahoDoVetor] = { dado1, dado2, ..., dadotamanhoDoVetor }
Linguagem C++
tipo nomeDoVetor[tamanahoDoVetor] = { dado1, dado2, ..., dadotamanhoDoVetor }
Exemplos:
Linguagem UAL
Linguagem C++
108
Linguagem UAL
Linguagem C++
nomeDoVetor[posio] = valor;
nomeDoVetor[posio] = valor;
Exemplos:
Linguagem UAL
Linguagem C++
notas[2] = 20;
sexo[0] = F;
nome[2] = ;
EAD-14-Algoritmos UniSEB
Para atribuir um valor a uma posio de um vetor, indicamos a posio desejada entre colchetes na frente do nome da varivel seguido pela
atribuio do valor desejado. Temos sempre de lembrar que os vetores
comeam na posio zero, portanto, se queremos atribuir um valor na
posio n, devemos utilizar o ndice n-1. Se queremos trocar o valor da
quinta posio do vetor, devemos utilizar o ndice 4.
Imagine agora que voc no tenha os valores na hora da inicializao, mas precisar popular posteriormente com valores informados pelo
usurio, como voc realizaria esta tarefa? Para um vetor de 8 posies,
usaria 8 comandos de leitura, conforme o exemplo a seguir?
109
Algoritmos
Linguagem UAL
Linguagem C++
int vetor[8];
imprima \nDigite 1o elemento: ;
leia vetor[0];
imprima \nDigite 2o elemento: ;
leia vetor[1];
imprima \nDigite 3o elemento: ;
leia vetor[2];
imprima \nDigite 4o elemento: ;
leia vetor[3];
imprima \nDigite 5o elemento: ;
leia vetor[4];
imprima \nDigite 6o elemento: ;
leia vetor[5];
imprima \nDigite 7o elemento: ;
leia vetor[6];
imprima \nDigite 8o elemento: ;
leia vetor[7];
Int vetor[8]
cout<<\nDigite 1o elemento: ;
cin>>vetor[0];
cout<<\nDigite 2o elemento: ;
cin>>vetor[1];
cout<<\nDigite 3o elemento: ;
cin>>vetor[2];
cout<<\nDigite 4o elemento: ;
cin>>vetor[3];
cout<<\nDigite 5o elemento: ;
cin>>vetor[4];
cout<<\nDigite 6o elemento: ;
cin>>vetor[5];
cout<<\nDigite 7o elemento: ;
cin>>vetor[6];
cout<<\nDigite 8o elemento: ;
cin>>vetor[7];
Esta a forma mais simples e direta de resolver este problema, porm, se tivssemos que entrar com um vetor de 100 posies e com um de
1000 posies, teramos de repetir 1000 vezes as duas linhas de cdigo?
Voc se lembra das estruturas de repetio que aprendemos anteriormente? Elas no seriam teis neste caso? Vamos ver como poderamos us-las.
Primeiramente temos de perceber que h algumas informaes que
no se repetem, como a posio que estamos lendo. Para isso, devemos
quebrar a mensagem mostrada.
Linguagem UAL
Linguagem C++
110
Linguagem UAL
Linguagem C++
leia vetor[n];
cin>>vetor[n];
Linguagem C++
{
imprima \nDigite , n+1, o elemento: ;
leia vetor[n];
cin>>vetor[n];
}
Memria principal
n
nmeros
10
Digite 1o elemento: 10
16
Digite 2o elemento: 16
21
Digite 3o elemento: 21
24
Digite 4o elemento: 24
27
Digite 5o elemento: 27
30
Digite 6o elemento: 30
31
Digite 7o elemento: 31
32
Digite 8o elemento: 32
EAD-14-Algoritmos UniSEB
Agora que j sabemos como ler um vetor de qualquer tamanho, vamos estruturar um cdigo genrico, o qual podemos utilizar sempre que
precisarmos, pois serve de base para qualquer vetor.
Linguagem UAL
Linguagem C++
leia nomeDoVetor[n];
cin>>nomeDoVetor[n];
}
111
Algoritmos
Outra forma de se inserir dados em um vetor por meio da atribuio. O processo exatamente o mesmo do anterior, porm, no lugar do
comando de leitura da fonte de entrada do computador, atribumos um
valor diretamente com o comando de atribuio. Podemos fazer isso para
um nico valor, ou utilizando uma estrutura de repetio, conforme segue.
Linguagem UAL
Linguagem C++
112
Linguagem UAL
Linguagem C++
/* IMPRESSO COMO COLUNA */
imprima \nTtulo\n;
para (n<-0; n<tamanho;n++)
{
imprima \n, nomeDoVetor[n];
}
EAD-14-Algoritmos UniSEB
Algoritmos
Vetor Notas 1
A1
A2
A3
A4
A4
A6
.....
A60
A3
A4
A4
A6
.....
A60
A3
A4
A4
A6
.....
A60
A3
A4
A4
A6
.....
A60
A3
A4
A4
A6
.....
A60
Vetor Notas 2
A1
A2
Vetor Notas 3
A1
A2
Vetor Notas 4
A1
A2
Vetor Faltas
A1
A2
uma opo possvel e vivel, porm temos 5 vetores independentes, sem qualquer relao, os quais temos de manipul-los, gerenci-los e
control-los de forma independente, tomando sempre o cuidado para que
nunca invertamos um ndice e causar a mistura das notas de alunos diferentes ou cadastramos uma informao em local indevido.
Se fssemos controlar essas informaes, provavelmente a soluo
mais lgica seria montar uma tabela com esses dados. Provavelmente, no
utilizaramos uma lista para cada avaliao separadamente. Ento, por que
no fazemos da mesma forma em um sistema computacional?
114
Aluno1
Aluno2
Aulno3
Aluno4
Aluno60
Nota 1
V1
V2
V3
V4
.....
V60
Nota 2
V1
V2
V3
V4
.....
V60
Nota 3
V1
V2
V3
V4
.....
V60
Nota 4
V1
V2
V3
V4
.....
V60
Faltas
V1
V2
V3
V4
.....
V60
Jan.
Fev.
Mar.
Abr.
Maio
Jun.
...
gua
Luz
Aluguel
Transporte
Supermercado
Restaurante
A declarao e manipulao de matrizes bidimensionais bem semelhante a de vetores. Porm, agora temos que tratar duas dimenses, por
isso, ao invs de utilizarmos um par de colchetes, usamos dois pares, um
para cada dimenso da matriz. Apesar de no ser foco de nosso estudo
neste momento, na linguagem C++ possvel declarar matrizes multidimensionais, ou seja, com mais de duas dimenses. Neste caso, necessrio usar um par de colchetes para cada dimenso.
Veja o padro para a declarao de matrizes bidimensionais.
Linguagem C++
tipo nomeDaMatriz[tamanahoD1] [tamanahoD2] ;
Exemplos:
Linguagem C++
/* declara uma matriz para guardar 3 informaes diferentes de 300 pacientes */
float pacientes[300] [3];
EAD-14-Algoritmos UniSEB
115
Algoritmos
Nota 2
Nota 3
Nota 4
Aluno1
Aluno2
Aluno3
Aluno4
Aluno5
Aluno6
Aluno7
Aluno8
Nota 1
Proibida a reproduo UniSEB
Nota 2
116
Nota 3
Nota 4
Aluno 8
Aluno 7
Aluno 6
Aluno 5
Aluno 4
Aluno 3
Aluno 2
Aluno 1
linha 1
linha 2
coluna 0
coluna 1
coluna 0
coluna 1
coluna 0
coluna 1
O armazenamento ou incluso de dados em uma matriz bidimensional feito de forma semelhante utilizada nos vetores. Podemos realizar
a inicializao em sua declarao ou fazer uma atribuio das informaes desejadas.
Linguagem C++
tipo nomeDaMatriz[tamanahoD1] [tamanahoD2] = { dado1, dado2, ..., dadotamanhoD1xD2};
Exemplos:
Linguagem C++
/* Inicializa uma matriz de 3 linhas e 4 colunas */
int matrx [3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
EAD-14-Algoritmos UniSEB
117
Algoritmos
Nos exemplos apresentados, podemos notar algumas caractersticas e peculiaridades da inicializao de matrizes bidimensionais. Como
j dito, a estrutura muito semelhante de vetores, porm precisamos
ter em mente que estamos trabalhando com duas dimenses, e o nome
da varivel deve ser seguido de dois pares de colchetes, como vimos
anteriormente. Os dados que queremos popular so apresentados entre
chaves de forma sequencial. No precisamos nos preocupar com a diviso entre linhas, a linguagem se incumbir de gerenciar isso; precisamos apenas fornecer a quantidade correta de dados. Podemos ver pelo
primeiro exemplo que, para inicializar uma matriz bidimensional de trs
linhas e quatro colunas, basta informar 12 valores entre chaves, divididos por vrgulas. O C++ ir distribuir de forma sequencial os dados
nas linhas e nas colunas, sendo assim, os quatro primeiros valores sero
colocados na primeira linha, os quatro seguintes na segunda e os quatro
ltimos na terceira linha.
No segundo exemplo, podemos notar que, para inicializar uma matriz bidimensional com 3 nomes, basta indicarmos o tamanho desejado e
informarmos os nomes entre chaves, separados por vrgulas. Novamente
o C++ ir distribuir os nomes, alocando um em cada linha, de forma
sequencial. No terceiro e ltimo exemplos, podemos ver que, quando
estamos inicializando uma matriz bidimensional, no precisamos obrigatoriamente informar os dois ndices, podemos informar somente o nmero
de colunas; sendo assim, o C++ ir criar quantas linhas forem necessrias
para guardar os dados. Fique atento, pois isso pode ocorrer apenas no momento da inicializao. Em todos os acessos s matrizes, ser necessrio
informar os dois ndices, de linha e coluna.
Aps a declarao ou inicializao para atribuirmos um valor a uma
matriz bidimensional, basta informar os ndices de linha e coluna desejados e o valor a ser atribudo, de forma semelhante ao feito com os vetores.
Segue a estrutura e alguns exemplos.
Linguagem C++
Proibida a reproduo UniSEB
118
Exemplos:
Linguagem C++
/* atribuir o valor 13 primeira posio da primeira linha */
matrx [0][0] = 13;
/* Atribuir o caracter P a primeira posio da linha terceira linha */
char str_vect [2][0] = P;
/* Atribuir o valor 11 a segunda coluna da segunda linha */
int matrx [1][1] = 11;
EAD-14-Algoritmos UniSEB
119
Algoritmos
char.
Linguagem C++
for(int L = 0; L<tamanhoLinha; L++)
{
cout<<\nLinha nmero <<L+1 <<: ;
cin.getLina(nomeMatriz[L], tamanhoDeclardoNaColuna);
}
120
Atividades
02. Faa um programa que leia matrculas e duas notas de 5 alunos. Calcule e armazene a mdia aritmtica. Exiba a mdia e a situao final: AP
(aprovado) ou RP (reprovado). A mdia 6,0.
EAD-14-Algoritmos UniSEB
121
Algoritmos
Reflexo
Leituras recomendadas
Referncias
ASCENCIO, A. F. G.; CAMPOS, E.e A. V. Fundamentos da programao de computadores: Algoritmos, Pascal, C/C++ e Java. 2. ed.
So Paulo: Pearson Education, 2008.
FORBELLONE, A.L. V; EBERSPACHER, H. Lgica de programao. 3. ed. So Paulo: Makron Books, 2005.
122
Bibliografia complementar
DASGUPTA, Sanjoy; PAPADIMITRIOU, Christos; VAZIRANI,
Umesh. Algoritmos. 1. ed. So Paulo: McGraw-Hill Brasil, 2009.
FEOFILOFF, Paulo. Algoritmos em linguagem C. 1. ed. Rio de Janeiro: Campus, 2008.
MANZANO, Jos Augusto N. G.; OLIVEIRA, Jayr Figueiredo. Algoritmos: lgica para desenvolvimento de programao de computadores. 22. ed. So Paulo: rica, 2009.
EAD-14-Algoritmos UniSEB
123
Algoritmos
Minhas anotaes:
124
EAD-14-Algoritmos UniSEB
Minhas anotaes:
125
Algoritmos
Minhas anotaes:
126
EAD-14-Algoritmos UniSEB
Minhas anotaes:
127
Algoritmos
Minhas anotaes:
128