Buscar

Apostila 1 Algoritmo e Linguagem de Programação

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 79 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 79 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 79 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

DIM0320 - Algoritmo e programac¸a˜o de
computadores
material
de
apoio
Suma´rio
1 Introduc¸a˜o 7
1.1 Definic¸o˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Programac¸a˜o Estruturada . . . . . . . . . . . . . . . . . . . . 7
1.3 Formas de representac¸a˜o de algoritmos . . . . . . . . . . . . . 7
1.3.1 Descric¸a˜o narrativa . . . . . . . . . . . . . . . . . . . . 7
1.3.2 Fluxograma . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3.3 Pseudo-co´digo . . . . . . . . . . . . . . . . . . . . . . 9
2 Tipos de dados 11
2.1 Dados nume´ricos . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Dados literais . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3 Dados lo´gicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4 Armazenamento de Dados na Memo´ria . . . . . . . . . . . . . 12
2.4.1 Dados do tipo inteiro . . . . . . . . . . . . . . . . . . . 12
2.4.2 Dados do tipo real . . . . . . . . . . . . . . . . . . . . 12
2.4.3 Dados do tipo lo´gico . . . . . . . . . . . . . . . . . . . 13
2.4.4 Dados do tipo literal . . . . . . . . . . . . . . . . . . . 13
3 Varia´veis e expresso˜es 15
3.1 Varia´veis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2 Expresso˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2.1 Expresso˜es aritme´ticas . . . . . . . . . . . . . . . . . . 16
3.2.2 Expresso˜es lo´gicas . . . . . . . . . . . . . . . . . . . . 17
3.2.3 Expresso˜es literais . . . . . . . . . . . . . . . . . . . . 17
3.3 Avaliac¸a˜o de expresso˜es . . . . . . . . . . . . . . . . . . . . . 17
3.4 Exerc´ıcios propostos . . . . . . . . . . . . . . . . . . . . . . . 18
4 Instruc¸o˜es primitivas 19
4.1 Dispositivo de entrada . . . . . . . . . . . . . . . . . . . . . . 19
4.2 Dispositivo de sa´ıda . . . . . . . . . . . . . . . . . . . . . . . 19
4.3 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.4 Semaˆntica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.5 Instruc¸a˜o de Atribuic¸a˜o . . . . . . . . . . . . . . . . . . . . . 19
4.6 Instruc¸a˜o de Entrada de Dados . . . . . . . . . . . . . . . . . 20
4.7 Instruc¸a˜o de Sa´ıda de Dados . . . . . . . . . . . . . . . . . . . 20
4.8 Regras ba´sicas (interface com o usua´rio: fase de execuc¸a˜o) . . 21
4.9 Exemplos de algoritmos . . . . . . . . . . . . . . . . . . . . . 21
4.10 Rastreamento de um algoritmo . . . . . . . . . . . . . . . . . 23
4.11 Exerc´ıcios propostos . . . . . . . . . . . . . . . . . . . . . . . 24
2
5 Controle de fluxo de execuc¸a˜o 25
5.1 Estrutura de decisa˜o . . . . . . . . . . . . . . . . . . . . . . . 25
5.1.1 Estrutura de decisa˜o do tipo SE . . . . . . . . . . . . 25
5.1.1.1 SE’s aninhados ou encaixados . . . . . . . . . . . . . 27
5.1.2 Estrutura de decisa˜o do tipo ESCOLHA . . . . . . . . 30
5.2 Estrutura de repetic¸a˜o . . . . . . . . . . . . . . . . . . . . . . 32
5.2.1 Estrutura de repetic¸a˜o do tipo PARA-FAC¸A . . . . . 32
5.2.2 Estrutura de repetic¸a˜o do tipo ENQUANTO-FAC¸A . 33
5.2.3 Estrutura de repetic¸a˜o do tipo REPITA-ATE´ . . . . . 34
5.3 Exerc´ıcios propostos . . . . . . . . . . . . . . . . . . . . . . . 36
6 Exemplos de algoritmos 37
7 Estrutura de dados homogeˆneos 40
7.1 Introduc¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
7.2 Varia´veis compostas homogeˆneas . . . . . . . . . . . . . . . . 40
7.3 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
7.3.1 Declarac¸a˜o de vetores . . . . . . . . . . . . . . . . . . 41
7.3.2 Operac¸o˜es com vetores . . . . . . . . . . . . . . . . . . 41
7.3.2.1 Atribuic¸a˜o de vetores . . . . . . . . . . . . . . . . . 42
7.3.2.2 Leitura de vetores . . . . . . . . . . . . . . . . . . . 42
7.3.2.3 Escrita de vetores . . . . . . . . . . . . . . . . . . . 43
7.3.3 Exemplos de algoritmos com vetores . . . . . . . . . . 44
7.3.4 Exerc´ıcios propostos . . . . . . . . . . . . . . . . . . . 49
7.4 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
7.4.1 Declarac¸a˜o de matrizes . . . . . . . . . . . . . . . . . . 50
7.4.2 Operac¸o˜es com matrizes . . . . . . . . . . . . . . . . . 51
7.4.2.1 Atribuic¸a˜o de matrizes . . . . . . . . . . . . . . . . 51
7.4.2.2 Leitura de matrizes . . . . . . . . . . . . . . . . . . 52
7.4.2.3 Escrita de matrizes . . . . . . . . . . . . . . . . . . 52
7.4.3 Exemplos de algoritmos com matrizes . . . . . . . . . 53
7.4.4 Exerc´ıcios propostos . . . . . . . . . . . . . . . . . . . 56
7.5 Cadeias e subcadeias de caracteres . . . . . . . . . . . . . . . 57
7.5.1 Declarac¸a˜o de cadeia de caracteres . . . . . . . . . . . 58
7.5.2 Subcadeia de caracteres . . . . . . . . . . . . . . . . . 58
7.5.3 Exemplos de algoritmos com cadeias e subcadeias de
caracteres . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.5.4 Exerc´ıcios propostos . . . . . . . . . . . . . . . . . . . 61
8 Subalgoritmos 62
8.1 Introduc¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
8.2 Elementos de um subalgoritmo . . . . . . . . . . . . . . . . . 62
8.3 Func¸o˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8.3.1 Instruc¸a˜o “Retorne” . . . . . . . . . . . . . . . . . . . 63
3
8.3.2 Chamada de uma func¸a˜o . . . . . . . . . . . . . . . . 64
8.3.3 Exemplos de algoritmos com func¸o˜es . . . . . . . . . . 64
8.3.4 Exerc´ıcios propostos de func¸o˜es . . . . . . . . . . . . . 67
8.4 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.4.1 Chamada de um procedimento . . . . . . . . . . . . . 68
8.4.2 Mecanismos de passagem de paraˆmetros . . . . . . . . 68
8.4.3 Exemplos de algoritmos com procedimentos . . . . . . 69
8.4.4 Exerc´ıcios propostos de subalgoritmos . . . . . . . . . 72
9 Estrutura de dados heterogeˆneos 73
9.1 Introduc¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
9.2 Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
9.2.1 Criac¸a˜o de registros . . . . . . . . . . . . . . . . . . . 73
9.2.2 Declarac¸a˜o de varia´veis do tipo registro . . . . . . . . 74
9.2.3 Referenciando membros de um registro . . . . . . . . . 75
9.2.4 Registros dentro de registros . . . . . . . . . . . . . . 75
9.2.5 Vetores de registros . . . . . . . . . . . . . . . . . . . 77
9.2.6 Exerc´ıcios propostos . . . . . . . . . . . . . . . . . . . 79
4
Lista de Figuras
1 In´ıcio ou fim do fluxograma. . . . . . . . . . . . . . . . . . . . 8
2 Entrada de dados. . . . . . . . . . . . . . . . . . . . . . . . . 8
3 Ca´lculo de expresso˜es. . . . . . . . . . . . . . . . . . . . . . . 8
4 Sa´ıda de resultados. . . . . . . . . . . . . . . . . . . . . . . . 8
5 Tomada de decisa˜o. . . . . . . . . . . . . . . . . . . . . . . . . 8
6 Fluxo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
7 Algoritmo “me´dia aritme´tica”. . . . . . . . . . . . . . . . . . 9
8 Representac¸a˜o de uma memo´ria de computador. . . . . . . . 11
9 Fluxograma do comando SE em sua forma expandida. . . . . 26
10 Fluxograma do comando SE em sua forma compacta. . . . . 26
11 Fluxograma do comando SE aninhado. . . . . . . . . . . . . . 28
12 Fluxograma do comando ESCOLHA. . . . . . . . . . . . . . . 31
13 Fluxograma dos lac¸os PARA-FAC¸A e ENQUANTO-FAC¸A. . 33
14 Fluxograma do lac¸o REPITA-ATE´. . . . . . . . . . . . . . . . 35
15 Uma ficha cadastral. . . . . . . . . . . . . . . . . . . . . . . . 75
5
Lista de Tabelas
1 Unidades computacionais. . . . . . . . . . . . . . . . . . . . . 11
2 Tabela ASCII com alguns caracteres. . . . . . . . . . . . . . . 13
3 Operadores aritme´ticos. . . . . . . . . . . . . . . . . . . . . . 16
4 Operadores lo´gicos. . . . . . . . . . . . . . . . . . . . . . . . . 17
5 Operadores relacionais. . . . . . . . . . . . . . . . . . . . . . . 17
6
1 Introduc¸a˜o
1.1 Definic¸o˜es
Algoritmo e´ uma sequ¨eˆncia ordenada e finita de operac¸o˜esbem definidas
e eficazes que, quando executadas sobre dados convenientes, produz uma
soluc¸a˜o ou a indicac¸a˜o de que a soluc¸a˜o na˜o poˆde ser obtida.
Um programa computacional consiste na traduc¸a˜o de um algoritmo em
uma forma “intelig´ıvel” para o computador.
1.2 Programac¸a˜o Estruturada
Programac¸a˜o estruturada e´ a te´cnica de construir e formular algorit-
mos de uma forma sistema´tica. Consiste numa metodologia de projeto de
programas visando facilitar a escrita, a leitura, a verificac¸a˜o apriori, a manu-
tenc¸a˜o e a modificac¸a˜o de programas. Os algoritmos estruturados utilizam
em sua sintaxe um nu´mero muito limitado de instruc¸o˜es e estruturas ba´sicas
(sequeˆncia, selec¸a˜o e repetic¸a˜o), que correspondem a formas de racioc´ınio
intuitivamente o´bvias.
1.3 Formas de representac¸a˜o de algoritmos
1.3.1 Descric¸a˜o narrativa
Esta forma de representac¸a˜o de algoritmos utiliza a linguagem natural
para descrever o comportamento na resoluc¸a˜o de uma determinada ativi-
dade.
Ela possui a inconvenieˆncia da ma´ interpretac¸a˜o, originando ambigu¨ida-
des e impreciso˜es.
Exemplo: Algoritmo para a troca de uma laˆmpada queimada.
- acionar o interruptor;
- se a la^mpada n~ao acender, ent~ao:
- pegar uma escada;
- posicionar a escada embaixo da la^mpada;
- buscar uma la^mpada nova;
- subir na escada;
- retirar a la^mpada queimada;
- colocar a la^mpada nova;
- acionar o interruptor;
- enquanto a la^mpada n~ao acender, fac¸a:
- retirar a la^mpada queimada;
- colocar uma la^mpada nova;
- acionar o interruptor;
7
1.3.2 Fluxograma
Esta forma de representac¸a˜o de algoritmos utiliza formas geome´tricas
distintas que produzem ac¸o˜es espec´ıficas.
Principais figuras:
Figura 1: In´ıcio ou fim do fluxograma.
Figura 2: Entrada de dados.
Figura 3: Ca´lculo de expresso˜es.
Figura 4: Sa´ıda de resultados.
Figura 5: Tomada de decisa˜o.
Figura 6: Fluxo.
8
Exemplo: Algoritmo para o ca´lculo da me´dia aritme´tica de dois valores
com um determinado teste.
Figura 7: Algoritmo “me´dia aritme´tica”.
1.3.3 Pseudo-co´digo
Esta forma de representac¸a˜o de algoritmos utiliza uma linguagem pro´-
pria, aproximando-se mais das linguagens de alto n´ıvel, chamada tambe´m
de “pseudo-linguagem”.
Uma linguagem natural (portugueˆs, ingleˆs, espanhol, etc.) apresenta o
inconveniente da ambigu¨idade de alguns termos, apesar de muitos recursos
de comunicac¸a˜o.
Uma linguagem de programac¸a˜o apresenta os inconvenientes das poucas
instruc¸o˜es existentes (poucos recursos de comunicac¸a˜o) apesar da grande
precisa˜o nos comandos.
O pseudo-co´digo na˜o tem os inconvenientes da ambigu¨idade de uma lin-
guagem natural, nem os rigores de uma linguagem de programac¸a˜o de alto
n´ıvel. E´ um portugueˆs estruturado em “frases” (comandos) correspondentes
as estruturas ba´sicas de programac¸a˜o.
9
Forma geral:
Algoritmo <nome_do_algoritmo>
<declarac¸~ao_de_varia´veis>
Inı´cio
<instruc¸~oes>
Fim
Exemplo: Algoritmo do exemplo anterior.
Algoritmo Me´dia_do_aluno
Real: m1,m2,media
Inı´cio
Escreva("Digite as duas notas:")
Leia(m1,m2)
media <- (m1+m2)/2
Se(me´dia >= 5)ent~ao
Escreva("APROVADO")
Sen~ao
Escreva("REPROVADO")
Fim_se
Fim
E´ esse tipo de representac¸a˜o de algoritmo que sera´ adotado no presente
curso.
10
2 Tipos de dados
Qualquer trabalho realizado por um computador e´ baseado na mani-
pulac¸a˜o das informac¸o˜es contidas em sua memo´ria. A grosso modo, estas
informac¸o˜es podem ser classificadas em dois tipos:
• as instruc¸o˜es: leituras, atribuic¸o˜es, operac¸o˜es, etc.;
• os dados propriamente ditos: valores a serem processados.
A memo´ria e´ um conjunto de ce´lulas identificadas univocamente por um
nu´mero chamado enderec¸o.
Figura 8: Representac¸a˜o de uma memo´ria de computador.
1 ce´lula = 1 byte = 8 bits.
1 bit possui 2 estados: 0 e 1 (d´ıgitos bina´rios).
1 byte possui 28 = 256 estados poss´ıveis.
1 Kilobyte (Kb) = 1024 bytes
1 Megabyte (Mb) = 1024 Kilobytes
1 Gigabyte (Gb) = 1024 Megabytes
Tabela 1: Unidades computacionais.
Os dados podem ser nume´ricos, literais e lo´gicos. Sa˜o os chamados tipos
ba´sicos. Os dados nume´ricos dividem-se em nu´meros inteiros e nu´meros
reais.
2.1 Dados nume´ricos
Os nu´meros inteiros e os nu´meros reais sa˜o armazenados de formas dife-
rentes nos computadores.
Nu´meros inteiros: representados sem parte fraciona´ria e sem ponto (cha-
mado tambe´m de nu´mero de ponto fixo).
Exemplo: 86, 0, -19, 23456
11
Nu´meros reais: representados com parte fraciona´ria e com ponto (chama-
do tambe´m de nu´mero de ponto flutuante).
Exemplo: 85.3, -9.453, 10.0, 6., 0.00
2.2 Dados literais
Sa˜o sequeˆncias de caracteres contendo letras, d´ıgitos e/ou s´ımbolos es-
peciais. Sa˜o chamados, tambe´m, “alfanume´ricos”, “cadeia de caracteres” ou
“strings”.
Sera˜o representados nos algoritmos entre aspas.
O comprimento de um dado literal e´ a quantidade de caracteres que ele
tem.
Exemplo:
"UFRN" – comprimento 4
" " – comprimento 1
"" – comprimento 0
"18/04/99" – comprimento 8
2.3 Dados lo´gicos
Usados para representar dois u´nicos valores lo´gicos poss´ıveis: verdadeiro
e falso. Eles sa˜o representados nos algoritmos como:
.V. (verdadeiro)
.F. (falso)
2.4 Armazenamento de Dados na Memo´ria
2.4.1 Dados do tipo inteiro
Ocupa a memo´ria com um nu´mero de bytes de acordo com a chamada
“palavra do computador”. Num computador de 32 bits ele ocupa 4 bytes.
Nu´mero inteiro: 4 bytes (-2.147.483.648 a 2.147.483.647)
2.4.2 Dados do tipo real
Ocupa a memo´ria com 4 bytes, sendo chamado tambe´m de precisa˜o
simples. A precisa˜o dupla ocupa o dobro da precisa˜o simples.
12
Nu´mero real: 4 bytes (3.4E-38 a 3.4E+38)
Precisa˜o dupla: 8 bytes (1.7E-308 a 1.7E+308)
.V. ou .F.
2.4.3 Dados do tipo lo´gico
Ocupa 1 byte na memo´ria.
2.4.4 Dados do tipo literal
Nesse tipo de dado, ha´ a alocac¸a˜o de espac¸o cont´ıguo de memo´ria igual
ao comprimento do literal, destinando um byte para cada caractere da in-
formac¸a˜o.
Cada caractere e´ associado a um co´digo nume´rico variando de 0 a 255.
Dentre as diversas tabelas propostas para a representac¸a˜o de caracte-
res, a de maior aceitac¸a˜o foi a Tabela ASCII (American Standard Code for
Information Interchange).
co´digo caractere co´digo caractere co´digo caractere
48 0 76 L 103 g
49 1 77 M 104 h
50 2 78 N 105 i
51 3 79 O 106 j
52 4 80 P 107 k
53 5 81 Q 108 l
54 6 82 R 109 m
55 7 83 S 110 n
56 8 84 T 111 o
57 9 85 U 112 p
65 A 86 V 113 q
66 B 87 W 114 r
67 C 88 X 115 s
68 D 89 Y 116 t
69 E 90 Z 117 u
70 F 97 a 118 v
71 G 98 b 119 w
72 H 99 c 120 x
73 I 100 d 121 y
74 J 101 e 122 z
75 K 102 f – –
Tabela 2: Tabela ASCII com alguns caracteres.
13
Exemplo: "casa".
Enderec¸o Informac¸a˜o
1000 c (99)
1001 a (97)
1002 s (115)
1003 a (97)
14
3 Varia´veis e expresso˜es
3.1 Varia´veis
Varia´vel e´ uma entidade destinada a guardar dados. Ela possui treˆs
atributos: nome, tipo e informac¸a˜o.
O nome de uma varia´vel tem a func¸a˜o de diferencia´-la das demais. Ado-
taremos as seguintes regras para o nome:
• deve necessariamente comec¸ar com uma letra;
• na˜o deve conter nenhum s´ımbolo especial, exceto o caractere sublinha
(_).
Exemplos: A2, max, hora_aula, LADO1, nome_do_aluno.
O tipo de uma varia´vel e´ o tipo de dado que ela pode armazenar, e a
informac¸a˜o e´ o valor que ela armazena naquele momento.
Todas as varia´veis utilizadas em um algoritmo devem ser definidas (de-
claradas) antes de serem utilizadas.
Uma declarac¸a˜o de varia´veis e´ uma instruc¸a˜o para reservar uma quan-
tidade de memo´ria apropriada para armazenar o tipo especificado e indicar
que o seu conteu´do sera´ refenciado pelo nome dado.
Utilizaremos a seguinte sintaxe para declarac¸a˜o das varia´veis nosnossos
algoritmos:
<tipo> : <lista_de_varia´veis>
Numa mesma linha podera˜o ser definidas uma ou mais varia´veis do
mesmo tipo. Deve-se separa´-las por v´ırgulas. Varia´veis de tipos diferen-
tes em linhas diferentes.
Exemplo:
Inteiro: ano, mes, idade
Real: sala´rio, troco
Lo´gico: opc¸~ao, sinalizador
Literal[30]: nome, profiss~ao
Nesta u´ltima declarac¸a˜o, o valor 30, entre colchetes, indica o nu´mero
ma´ximo de caracteres que cada varia´vel (“nome” ou “profissa˜o”) pode ar-
mazenar.
15
3.2 Expresso˜es
Expressa˜o e´ uma combinac¸a˜o de varia´veis, constantes e operadores que,
uma vez avaliada, resulta num valor.
Operadores sa˜o elementos funcionais que atuam sobre operandos e pro-
duzem um determinado resultado.
Os operadores se classificam quanto ao nu´mero de operandos em:
• bina´rios (dois operandos);
• una´rios (um operando).
E quanto ao tipo de dados dos operandos em:
• aritme´ticos;
• lo´gicos;
• literais.
Temos ainda os operadores relacionais, que e´ um caso especial, pois
permitem comparar pares de operandos de tipos de dados iguais (apenas
nume´ricos ou literais), resultando sempre um valor do tipo lo´gico.
3.2.1 Expresso˜es aritme´ticas
O resultado da avaliac¸a˜o e´ do tipo nume´rico (inteiro ou real).
Operador Tipo Operac¸a˜o Prioridade
+ bina´rio adic¸a˜o 4
- bina´rio subtrac¸a˜o 4
* bina´rio multiplicac¸a˜o 3
/ bina´rio divisa˜o em geral 3
\ ou div bina´rio divisa˜o de inteiros 3
** ou ˆ bina´rio exponenciac¸a˜o 2
+ una´rio manutenc¸a˜o de sinal 1
- una´rio inversa˜o de sinal 1
Tabela 3: Operadores aritme´ticos.
Se todos os operandos da expressa˜o sa˜o inteiros, o resultado e´ inteiro.
Se todos os operandos da expressa˜o sa˜o reais, o resultado e´ real.
Se os operandos sa˜o mistos (inteiros e reais), o resultado da expressa˜o e´
real.
16
3.2.2 Expresso˜es lo´gicas
O resultado da avaliac¸a˜o e´ do tipo lo´gico (.V. ou .F.).
Operador Tipo Operac¸a˜o Prioridade
.OU. bina´rio disjunc¸a˜o 3
.E. bina´rio conjunc¸a˜o 2
.NA˜O. una´rio negac¸a˜o 1
Tabela 4: Operadores lo´gicos.
Operador Comparac¸a˜o
= igual
<> diferente
< menor
<= menor ou igual
> maior
>= maior ou igual
Tabela 5: Operadores relacionais.
Os operadores relacionais sa˜o usados quando se deseja efetuar com-
parac¸o˜es entre expresso˜es de mesmo tipo (apenas expresso˜es nume´ricas ou
literais, na˜o expreso˜es lo´gicas), e o resultado e´ sempre um valor lo´gico.
3.2.3 Expresso˜es literais
Na˜o ha´ padronizac¸a˜o para seus operadores. Vamos considerar apenas o
operador de concatenac¸a˜o (+) .
Exemplo: "sonha" + "dor" resulta "sonhador".
3.3 Avaliac¸a˜o de expresso˜es
Regras:
• Observar a prioridade dos operadores (os de maior prio-
ridade devem ser avaliados primeiro). Se houver empate,
considera-se a expressa˜o da esquerda para a direita.
• Os pareˆnteses alteram a prioridade, forc¸ando a avaliac¸a˜o da
subexpressa˜o em seu interior.
• Entre os quatro grupos de operadores existentes a ordem
de avaliac¸a˜o e´:
– aritme´ticos;
17
– literais;
– relacionais;
– lo´gicos.
3.4 Exerc´ıcios propostos
Escrever as expresso˜es matema´ticas, utilizando os operadores aritme´ticos
dados (como devem ser escritos nos algoritmos).
1. 5x3 + 7x2 − 3x− 1
2. x0 + v0t− gt
2
2
3.
√
p(p− a)(p− b)(p− c)
4. 3
√
(5x2 + 4x3)2
5.
√
(x2 − x1)2 + (y2 − y1)2
6.
−b+√b2 − 4ac
2a
7.
4pir3
3
8.
3a+ 2b
x− a− 1
1 +
a+ b
2x
9. (xx+2y + yy+2x)x+y
18
4 Instruc¸o˜es primitivas
Sa˜o os componentes ba´sicos que efetuam tarefas essenciais para a opera-
c¸a˜o dos computadores, como entrada e sa´ıda de dados e a movimentac¸a˜o
dos mesmos na memo´ria.
4.1 Dispositivo de entrada
E´ o meio pelo qual as informac¸o˜es sa˜o transferidas pelo usua´rio ou pelos
n´ıveis secunda´rios de memo´ria ao computador. Exemplos: teclado, fitas,
discos magne´ticos, mouse, scanner.
4.2 Dispositivo de sa´ıda
E´ o meio pelo qual as informac¸o˜es (geralmente os resultados da exe-
cuc¸a˜o de um programa) sa˜o transferidas pelo computador ao usua´rio ou aos
n´ıveis secunda´rios de memo´ria. Exemplos: v´ıdeo, impressora, fitas, discos
magne´ticos.
4.3 Sintaxe
E´ a forma como os comandos devem ser escritos, a fim de que possam
ser entendidos pelo tradutor de programas.
4.4 Semaˆntica
E´ o significado, ou seja, o conjunto de ac¸o˜es que sera˜o exercidas pelo
computador durante a execuc¸a˜o do referido comando.
4.5 Instruc¸a˜o de Atribuic¸a˜o
E´ a principal maneira de se armazenar uma informac¸a˜o numa varia´vel.
Sintaxe :
<nome_da_varia´vel> <- <express~ao>
• avaliac¸a˜o da expressa˜o;
• armazenamento do valor resultante na posic¸a˜o de memo´ria correspon-
dente a` varia´vel que aparece a` esquerda do comando.
Importante :
Deve haver compatibilidade entre o tipo de dado resultante da avaliac¸a˜o
da expressa˜o e o tipo de dado da varia´vel (a na˜o ser, propositadamente, com
tipos nume´ricos).
19
Exemplos:
area <- base * altura
delta <- b ** 2 - 4.0 * a * c
contador <- contador + 1
nome <- "Caetano Veloso"
musica <- "Dias de Luta" + " e Flores em Voce^"
w <- .V.
p <- x > y .E. y > z
q <- (a > = 0 .E. a <= 10) .OU. (a >= 100 .E. a <= 1000)
4.6 Instruc¸a˜o de Entrada de Dados
Sintaxe :
Leia(<lista_de_varia´veis>)
Os dados sa˜o fornecidos ao computador por meio de um dispositivo de
entrada e armazenados nas posic¸o˜es de memo´ria das varia´veis cujos nomes
aparecem na lista.
Exemplo:
Leia(x)
Leia(a, b, c)
4.7 Instruc¸a˜o de Sa´ıda de Dados
Sintaxe :
Escreva(<lista_de_express~oes>)
Os argumentos sa˜o enviados para o dispositivo de sa´ıda. No caso de uma
lista de varia´veis, o conjunto de cada uma delas e´ pesquisado na posic¸a˜o
de memo´ria correspondente a varia´vel. No caso de argumento constante
(nu´mero, literal ou lo´gico) este e´ enviado diretamente ao referido dispositivo.
E no caso de expresso˜es, apo´s sua avaliac¸a˜o, segue como uma constante.
Exemplos:
Escreva ("Programa elaborado pelo aluno Thiago.")
Escreva ("Digite um nu´mero inteiro positivo:")
20
Escreva ("Lados do tria^ngulo: ", L1 , L2 , L3 )
Escreva ("Area do circulo = ", pi*r**2)
Escreva ("Area = ", x*y, "Perimetro = ", 2*(x + y))
4.8 Regras ba´sicas (interface com o usua´rio: fase de exe-
cuc¸a˜o)
• Toda vez que um programa estiver esperando que o usua´rio fornec¸a a
ele um determinado dado (operac¸a˜o de leitura), ele deve antes enviar
uma mensagem dizendo o que o usua´rio deve digitar, por meio de um
instruc¸a˜o de sa´ıda.
• Antes de enviar qualquer resultado ao usua´rio, um programa deve
escrever uma mensagem explicando o significado do mesmo.
4.9 Exemplos de algoritmos
1. Dado o prec¸o unita´rio e a quantidade de um produto, imprimir o valor
total da compra.
Algoritmo Total
Real: preco_unitario, preco_total
Inteiro: quantidade
Inı´cio
Escreva("Programa que calcula o preco de uma
certa quantidade de um produto.")
Escreva("Digite o preco unita´rio e a
quantidade: ")
Leia(preco_unitario, quantidade)
preco_total <- preco_unitario * quantidade
Escreva("Preco total = ", preco_total)
Fim
2. Calcular a a´rea e o per´ımetro de um retaˆngulo, sendo dados as medidas
dos lados.
Algoritmo Reta^ngulo
Real: L1, L2, area, perimetro
Inı´cio
Escreva("Digite as medidas dos lados do
retangulo: ")
Leia(L1, L2)
area <- L1 * L2
perimetro <- 2 * (L1 + L2)
Escreva("O valor da area e´ : ", area)
21
Escreva("O valor do perimetro e´ : ", perimetro)
Fim
3. Calcular o valor da func¸a˜o f(x) =
(3x− 1)
5
nos extremos do intervalo
[a, b] (dados os valores de a e b), e em mais dois valores do seu inte-
rior, de modo que os quatros valores do intervalo estejam igualmente
espac¸ados.
Algoritmo Valor_de_uma_func¸~ao
Real: a, b, h, y1, y2, y3, y4
Inı´cio
Escreva("Entre com dois nu´meros distintosna ordem crescente: ")
Leia(a, b)
h <- (b - a) / 3.
y1 <- ( 3. * a - 1. ) / 5.
y2 <- ( 3. * ( a + h ) - 1. ) / 5.
y3 <- ( 3. * ( b - h ) - 1. ) / 5.
y4 <- ( 3. * b - 1. ) / 5.
Escreva(" x = ", a, " y = ", y1)
Escreva(" x = ", a + h, " y = ", y2)
Escreva(" x = ", b - h, " y = ", y3)
Escreva(" x = ", b, " y = ", y4)
Fim
4. Algoritmo para dizer a soma de cinco nu´meros com, no ma´ximo, 4
d´ıgitos, antes mesmo das cinco parcelas serem digitadas.
Algoritmo Advinha
Inteiro: x
Inı´cio
Escreva("Digite um nu´mero com 4 algarismos: ")
Leia(x)
Escreva("O resultado da nossa conta sera´: ",
19998 + x)
Escreva("Digite o segundo nu´mero com 4
dı´gitos: ")
Leia(x)
Escreva("O meu nu´mero <terceiro> e´ : ",
9999 - x)
Escreva("Digite o quarto nu´mero com 4
dı´gitos: ")
Leia(x)
22
Escreva("Finalmente o quinto nu´mero e´ : ",
9999 - x)
Fim
4.10 Rastreamento de um algoritmo
O rastreamento de um algoritmo consiste na execuc¸a˜o manual, com da-
dos representativos para registrar os valores tomados pelas varia´veis em cada
passo do algoritmo.
Para facilitar o acompanhamento, colocamos todos os dados numa tabela
de varia´veis. Devemos fazer tantos testes quantos forem necessa´rios para nos
convencermos de que o algoritmo esta´ perfeito.
Exemplo de um rastreamento do algoritmo do exemplo 4 acima:
x
3452
1538
5172
Sa´ıda:
Digite um nu´mero com 4 algarismos: 3452
O resultado da nossa conta sera´: 23450
Digite o segundo nu´mero com 4 dı´gitos: 1538
O meu nu´mero <terceiro> e´: 8461
Digite o quarto nu´mero com 4 dı´gitos: 5172
Finalmente o quinto nu´mero e´: 4827
Exemplo de um rastreamento do algoritmo do exemplo 3 acima:
a b h y1 y2 y3 y4
4.0 8.5 1.5 2.2 3.1 4.0 4.9
Sa´ıda:
Entre com dois nu´meros distintos na ordem crescente: 4.0
8.5
x = 4.0 y = 2.2
x = 5.5 y = 3.1
x = 7.0 y = 4.0
x = 8.5 y = 4.9
23
4.11 Exerc´ıcios propostos
Fac¸a algoritmos para resolver os problemas abaixo.
1. Encontrar o consumo me´dio de um ve´ıculo, conhecidos a
distaˆncia total e o volume de combust´ıvel consumido para
percorrer tal distaˆncia.
2. Calcular a me´dia parcial de um aluno da UFRN, dadas as
suas treˆs primeiras notas.
3. Calcular o valor da func¸a˜o f(x, y) = 3x2 + 2y2− xy em um
ponto qualquer do plano cartesiano.
4. Leia uma temperatura em graus Cent´ıgrados e imprima a
equivalente em graus Fahrenheit (F =
9C + 160
5
).
5. Leia uma quantidade de chuva dada em polegadas e im-
prima a equivalente em mil´ımetros (1 polegada = 25,4 mi-
l´ımetros).
24
5 Controle de fluxo de execuc¸a˜o
Controle de fluxo de execuc¸a˜o e´ a sequeˆncia em que as instruc¸o˜es (ou
comandos) sa˜o executadas num algoritmo.
Cada instruc¸a˜o e´ executada somente apo´s o te´rmino da instruc¸a˜o anterior
(estrutura sequ¨eˆncial).
Um conjunto de instruc¸o˜es (ou comandos simples) e´ chamado de bloco
de instruc¸o˜es (ou comando composto).
5.1 Estrutura de decisa˜o
O fluxo de instruc¸a˜o a ser seguido e´ escolhido em func¸a˜o do resultado da
avaliac¸a˜o de uma ou mais condic¸o˜es.
Classificac¸a˜o quanto ao nu´mero de condic¸o˜es:
• uma condic¸a˜o (decisa˜o simples): estrutura do SE;
• va´rias condic¸o˜es (decisa˜o mu´ltipla): estrutura do ESCOLHA.
5.1.1 Estrutura de decisa˜o do tipo SE
Sintaxe:
Se(<condic¸~ao>)ent~ao
<bloco_de_instruc¸~oes_1>
sen~ao
<bloco_de_instruc¸~oes_2>
Fim_se
ou
Se(<condic¸~ao>)ent~ao
<bloco_de_instruc¸~oes>
Fim_se
A condic¸a˜o e´ avaliada. Se o resultado for verdadeiro enta˜o o bloco de
instruc¸~oes 1 e´ executado e o fluxo do algoritmo prossegue com o pri-
meiro comando apo´s o Fim_se. Se o resultado for falso, enta˜o o bloco de
instruc¸~oes 2 e´ executado e, ao te´rmino do mesmo, o fluxo de execuc¸a˜o
prossegue com o primeiro comando apo´s o Fim_se. Ha´ casos em que sen~ao
bloco de instruc¸~oes 2 e´ omitido. Dessa forma, quando a condic¸a˜o e´ falsa,
o fluxo de execuc¸a˜o prossegue normalmente para a primeira instruc¸a˜o apo´s
o Fim_se, como se o comando Se na˜o existisse.
25
Figura 9: Fluxograma do comando SE em sua forma expandida.
Figura 10: Fluxograma do comando SE em sua forma compacta.
Nas figuras 9 e 10 sa˜o mostrados os fluxogramas das duas formas de
utilizac¸a˜o do comando SE.
Exemplos:
1. Determinar se uma pessoa e´ maior ou menor de idade.
Algoritmo Maioridade
Inteiro: idade
Inı´cio
Escreva("Digite a idade (maior do que zero): ")
Leia(idade)
26
Se(idade > 0)ent~ao
Se(idade >= 18)ent~ao
Escreva("Maior de idade.")
sen~ao
Escreva("Menor de idade.")
Fim_se
Sen~ao
Escreva("Idade incorreta.")
Fim_se
Fim
2. Calcular o quociente e o resto de uma divisa˜o inteira.
Algoritmo Divis~ao
Inteiro: x, y, quo, res
Inı´cio
Escreva("Digite dois nu´meros inteiros: ")
Leia(x,y)
Se(y <> 0)ent~ao
quo <- x \ y
res <- x - quo * y
Escreva("Quociente = ", quo ,"Resto = ", res)
sen~ao
Escreva("N~ao existe divis~ao por zero.")
Fim_se
Fim
5.1.1.1 SE’s aninhados ou encaixados
Sintaxe:
Se(<condic¸~ao1>)ent~ao
<bloco_de_instruc¸~oes_1>
sen~ao
Se(<condic¸~ao2>)ent~ao
<bloco_de_instruc¸~oes_2>
sen~ao
Se(<condic¸~ao3>)ent~ao
<bloco_de_instruc¸~oes_3>
sen~ao
.
.
.
Fim_se
Fim_se
27
A figura 11 mostra o fluxograma do comando SE’s aninhados.
Figura 11: Fluxograma do comando SE aninhado.
28
Exemplo:
å Dados treˆs nu´meros, determinar o maior e o menor entre eles.
Algoritmo Max_min
Real: a, b, c, max, min
Inı´cio
Escreva("Digite tres numeros: ")
Leia(a, b, c)
Se(a < b)ent~ao
Se(b < c)ent~ao
min <- a
max <- c
sen~ao
max <- b
Se(a < c)ent~ao
min <- a
sen~ao
min <- c
Fim_se
Fim_se
sen~ao
Se(b > c)ent~ao
min <- c
max <- a
sen~ao
min <- b
Se(a > c)ent~ao
max <- a
sen~ao
max <- c
Fim_se
Fim_se
Fim_se
Escreva("Maior numero = ", max)
Escreva("Menor numero = ", min)
Fim
29
5.1.2 Estrutura de decisa˜o do tipo ESCOLHA
Sintaxe:
Escolha(<express~ao>)
Caso(<condic¸~ao1>)fac¸a
<bloco_de_instruc¸~oes_1>
Caso(<condic¸~ao2>)fac¸a
<bloco_de_instruc¸~oes_2>
.
.
.
Caso(<condic¸~aoN>)fac¸a
<bloco_de_instruc¸~oes_N>
sen~ao
<bloco_alternativo>
Fim_escolha
O comando ESCOLHA, corresponde ao comando SE mas de uma forma
mais compacta nas operac¸o˜es de selec¸a˜o. O valor assumido pela expressa˜o e´
comparado ao valor de cada condic¸a˜o de cada caso. Quando a comparac¸a˜o e´
avaliada como verdadeira, o bloco de instruc¸o˜es referente ao caso e´ executado
e o fluxo de execuc¸a˜o passa para o primeiro comando apo´s o Fim_escolha.
Caso em nenhuma das comparac¸o˜es resulte em verdadeiro, um bloco alter-
nativo de instruc¸o˜es e´ executado e o fluxo de execuc¸a˜o do algoritmo segue
adiante.
O comando ESCOLHA na˜o aceita valores do tipo real e nem cadeias de
caracteres (na expressa˜o e nas condic¸o˜es dos casos), somente valores inteiros
e caracteres (um apenas em cada situac¸a˜o).
A figura 12 mostra o fluxograma do comando ESCOLHA.
Exemplo:
å Programa que simula uma calculadora com as quatro operac¸o˜es
aritme´ticas.
Algoritmo Calculadora
Real: num1, num2
Literal[2]: op
Inicio
Escreva("Digite um numero, o operador e outro
numero:")
Leia(num1,op,num2)
Escolha(op)
Caso(op="+")fac¸a
30
Escreva(num1,op,num2," = ",num1 + num2)
Caso(op="-")fac¸a
Escreva(num1,op,num2," = ",num1 - num2)
Caso(op="*")fac¸a
Escreva(num1,op,num2," = ",num1 * num2)
Caso(op="/")fac¸a
Se(num2 <> 0)ent~ao
Escreva(num1,op,num2," = ",num1 / num2)
Sen~ao
Escreva("N~ao existe divis~ao por zero.")
Fim_se
Sen~ao
Escreva("Operador desconhecido.")
Fim_escolha
Fim
Figura 12: Fluxograma do comando ESCOLHA.
31
5.2 Estrutura de repetic¸a˜o
Uma estrutura de repetic¸a˜o tem por objetivo repetir um trecho de pro-
grama um certo nu´mero de vezes. E´ tambe´m chamada de lac¸o. Os lac¸os
podem ser contados ou condicionais.Os lac¸os contados possuem um nu´mero
de repetic¸o˜es conhecido. E´ a estrutura de repetic¸a˜o do tipo PARA-FAC¸A.
Os lac¸os condicionais possuem um nu´mero indeterminado de repetic¸o˜es, de-
pendendo de uma condic¸a˜o. Com a condic¸a˜o no in´ıcio do trecho, temos
a estrutura de repetic¸a˜o do tipo ENQUANTO-FAC¸A. Com a condic¸a˜o no
final do trecho, temos a estrutura de repetic¸a˜o do tipo REPITA-ATE´.
5.2.1 Estrutura de repetic¸a˜o do tipo PARA-FAC¸A
Sintaxe:
Para <var> de <ini> ate´ <fim> passo <inc> fac¸a
<bloco_de_instruc¸~oes>
Fim_para
var e´ necessariamente uma varia´vel inteira (varia´vel de controle do lac¸o).
ini, fim e inc, sa˜o expresso˜es inteiras (constantes, varia´veis ou expresso˜es).
Costumamos omitir o passo <inc> quando inc e´ 1. var assume inicialmente
o valor de ini e testa se na˜o ultrapassou o valor de fim. Caso afirmativo
o trecho a ser repetido (bloco de instruc¸~oes) e´ executado e var e´ incre-
mentado do valor inc, e novamente e´ feito o teste. Caso o teste seja negativo
(em algum momento sera´) a repetic¸a˜o chega ao seu final e a sequeˆncia de
execuc¸a˜o prossegue.
Em vez de ocorrer a operac¸a˜o de incremento, pode ocorrer a operac¸a˜o
de decremento (dec), onde var e´ decrementado do valor dec.
O Fluxograma do lac¸o PARA-FAC¸A e´ mostrado na figura 13.
Exemplo:
å Ca´lculo do fatorial de um nu´mero inteiro na˜o-negativo.
Algoritmo Fatorial
Inteiro: num, k, fat
Inı´cio
Escreva("Digite um nu´mero:")
Leia(num)
Se(num >= 0)ent~ao
fat <- 1
Para k de 2 ate´ num fac¸a
fat <- fat*k
Fim_para
Escreva("Fatorial de",num," igual a ",fat)
32
Sen~ao
Escreva("N~ao existe fatorial de nu´mero negativo.")
Fim_se
Fim
Figura 13: Fluxograma dos lac¸os PARA-FAC¸A e ENQUANTO-FAC¸A.
5.2.2 Estrutura de repetic¸a˜o do tipo ENQUANTO-FAC¸A
Sintaxe
Enquanto(<express~ao_lo´gica>)fac¸a
<bloco_de_instruc¸~oes>
Fim_enquanto
Se o valor lo´gico da express~ao lo´gica e´ verdadeiro, enta˜o o trecho
(bloco de instruc¸~oes) sera´ executado, e novamente a express~ao lo´gica
e´ avaliada, e assim por diante. Quando o valor da express~ao lo´gica e´
falso, a execuc¸a˜o segue para a instruc¸a˜o apo´s Fim_enquanto. No trecho a
ser repetido, a express~ao lo´gica deve ser alterada para que na˜o tenhamos
um lac¸o infinito.
Na figura 13 e´ mostrado o fluxograma do lac¸o ENQUANTO-FAC¸A.
33
Exemplo:
å Ca´lculo do mdc entre dois nu´meros inteiros positivos.
Algoritmo MDC
Inteiro: a, b
Inı´cio
Escreva("Digite dois numeros inteiros positivos: ")
Leia(a,b)
Se(a>0 .E. b>0)ent~ao
Enquanto(a <> b)fac¸a
Se(a > b)ent~ao
a <- a - b
sen~ao
b <- b - a
Fim_se
Fim_enquanto
Escreva("mdc = ", a)
Sen~ao
Escreva("Dados incorretos.")
Fim_se
Fim
5.2.3 Estrutura de repetic¸a˜o do tipo REPITA-ATE´
Sintaxe:
Repita
<bloco_de_instruc¸~oes>
Ate´(<express~ao_lo´gica>)
Como o crite´rio de parada fica no final da estrutura, o trecho (bloco de
instruc¸~oes) a ser repetido e´ executado, sempre, pelo menos, uma vez. O
lac¸o chega ao seu final, quando o valor da express~ao lo´gica e´ verdadeiro,
o contra´rio do lac¸o ENQUANTO-FAC¸A.
O fluxograma do lac¸o REPITA-ATE´ e´ mostrado na figura 14.
Exemplo:
å Imprimir os divisores de um nu´mero inteiro positivo dado.
Algoritmo Divisores
Inteiro: num, dv
Inı´cio
Repita
Escreva("Digite um numero inteiro positivo: ")
Leia(num)
34
Ate´(num > 0)
Escreva("Divisores do nu´mero ", num)
dv <- 1
Repita
Se((num - num \ dv * dv) = 0)ent~ao
Escreva(dv)
Fim_se
dv <- dv + 1
Ate´(dv > num)
Fim
Figura 14: Fluxograma do lac¸o REPITA-ATE´.
35
5.3 Exerc´ıcios propostos
Fac¸a algoritmos para resolver os problemas abaixo.
1. Calcular a soma dos nu´meros pares entre 15 e 55.
2. Calcular a soma dos nu´meros ı´mpares compreendidos entre
dois outros nu´meros inteiros dados (na˜o inclui-los na soma).
3. Dado um nu´mero inteiro positivo maior que 1, dizer se ele
e´ primo ou na˜o.
4. Imprimir o maior, o menor e a me´dia aritme´tica de n nu´me-
ros quaisquer dados.
5. Imprimir os n primeiros nu´meros da sequ¨eˆncia de Fibonacci
(1 1 2 3 5 8 13 21 . . . ).
6. Calcular a soma de todos os mu´ltiplos de um certo nu´mero
inteiro dado compreendidos entre dois outros nu´meros in-
teiros tambe´m dados (na˜o inclui-los na soma).
36
6 Exemplos de algoritmos
1. A multa por excesso de velocidade e´ baseada em quanto voceˆ se ex-
cedeu ale´m do limite ma´ximo permitido. Supo˜e-se que a multa seja
computada da seguinte forma:
velocidade acima do limite (km/h) multa
1 a 10 R$ 10,00
11 a 20 R$ 20,00
21 a 30 R$ 30,00
31 a 40 R$ 40,00
41 ou mais R$ 50,00
Dados o limite de velocidade e a velocidade com que voceˆ vinha, qual
o valor de sua multa?
Algoritmo Velocidade
Inteiro: lim_vel, vel_mot, dif_vel, aux
Real: multa
Inicio
Escreva("Digite o limite ma´ximo permitido: ")
Leia(lim_vel)
Escreva("Digite a velocidade com que vinha o
motorista: ")
Leia(vel_mot)
Se(vel_mot > lim_vel)ent~ao
dif_vel <- vel_mot - lim_vel
aux <- (dif_vel - 1) / 10
Escolha(aux)
Caso(aux = 0)fac¸a
multa <- 10.00
Caso(aux = 1)fac¸a
multa <- 20.00
Caso(aux = 2)fac¸a
multa <- 30.00
Caso(aux = 3)fac¸a
multa <- 40.00
Sen~ao
multa <- 50.00
Fim_escolha
Escreva("Valor da multa = ", multa)
Sen~ao
Escreva("N~ao existe multa.")
Fim_se
Fim
37
2. Ca´lculo do ma´ximo divisor comum entre dois nu´meros dados.
Algoritmo MDC
Inteiro: a, b, r
Inı´cio
Escreva("Digite dois nu´meros inteiros: ")
Leia(a,b)
Se(a < 0)ent~ao
a <- -a
Fim_se
Se(b < 0)ent~ao
b <- -b
Fim_se
Enquanto(b <> 0)fac¸a
r <- a - a\b*b
a <- b
b <- r
Fim_enquanto
Escreva("MDC = ", a)
Fim
3. Imprime os divisores de um nu´mero inteiro dado.
Algoritmo Divisores
Inteiro: num, dv
Inı´cio
Repita
Escreva("Digite um nu´mero inteiro positivo: ")
Leia(num)
Ate´(num > 0)
Escreva("Divisores do nu´mero ", num)
Para dv de 1 ate´ num fac¸a
Se(num - num\dv*dv = 0)ent~ao
Escreva(dv)
Fim_se
Fim_para
Fim
4. Imprime o maior, o menor e a me´dia aritme´tica de n nu´meros dados.
Algoritmo Maior_menor
Real: x, maior, menor, me´dia
Inteiro: n, i
Inı´cio
Escreva("Digite a quantidade de nu´meros: ")
Leia(n)
Escreva("Digite o primeiro nu´mero : ")
Leia(x)
menor <- x
38
maior <- x
media <- x
Para i de 2 ate´ n fac¸a
Escreva("Digite mais um nu´mero: ")
Leia(x)
Se(x > maior)ent~ao
maior <- x
Sen~ao
Se(x < menor)ent~ao
menor <- x
Fim_se
Fim_se
media <- media + x
Fim_para
media <- media / n
Escreva("Maior nu´mero = ", maior)
Escreva("Menor nu´mero = ", menor)
Escreva("Media aritmetica = ", media)
Fim
5. Ca´lculo do fatorial de um nu´mero inteiro na˜o-negativo.
Algoritmo Fatorial
Inteiro: numero, fatorial, aux
Inı´cio
Escreva("Digite um nu´mero inteiro n~ao-negativo: ")
Leia(numero)
Se(numero >= 0)ent~ao
fatorial <- 1
aux <- 2
Enquanto(aux <= numero)fac¸a
fatorial <- fatorial * aux
aux <- aux + 1
Fim_enquanto
Escreva("Fatorial de ", numero, " = ", fatorial)
Sen~ao
Escreva("N~ao existe fatorial de nu´mero negativo!")
Fim_se
Fim
39
7 Estrutura de dados homogeˆneos
7.1 Introduc¸a˜o
Ate´ agora, vimos os quatro tipos ba´sicos de informac¸a˜o: Inteiro, Real,
Lo´gico e Literal. Mas eles na˜o sa˜o suficientes para representar toda e qual-
quer informac¸a˜o que possa surgir. Portanto, construiremos novos tipos a
partir dos tipos ba´sicos, a` medida que se fizerem necessa´rios. Esses novos
tipos teˆm um formato denominado estrutura de dados, que define como os
tipos ba´sicos esta˜o organizados.
Uma varia´vel simples e´ uma entidade criada para permitir o acesso a uma
posic¸a˜o de memo´ria onde se armazena uma informac¸a˜o de um determinado
tipo de dado pela simples refereˆncia a um nome simbo´lico.
Neste cap´ıtulo, veremos estrutura de dados homogeˆneos, como vetores,matrizes e cadeias de caracteres, que nos permitira´ referenciar um grupo de
varia´veis do mesmo tipo pelo mesmo nome simbo´lico.
7.2 Varia´veis compostas homogeˆneas
Quando uma determinada estrutura de dados e´ composta de varia´veis
com o mesmo tipo ba´sico, temos um conjunto homogeˆneo de dados.
Varia´veis compostas homogeˆneas, tambe´m chamadas de varia´veis indexa-
das, correspondem a um conjunto de varia´veis do mesmo tipo, referencia´veis
pelo mesmo nome e individualizadas entre si atrave´s de sua posic¸a˜o dentro
desse conjunto (os ı´ndices).
Uma varia´vel indexada pode ser definida contendo um ou mais ı´ndices.
Quando possui um u´nico ı´ndice a varia´vel e´ chamada de vetor e quando
possui dois ı´ndices e´ chamada de matriz. Com treˆs ou mais ı´ndices na˜o
recebe nome especial, tambe´m, na pra´tica, sua ocorreˆncia e´ pouco frequ¨ente.
Ao nu´mero de ı´ndices necessa´rios a` localizac¸a˜o de um componente dentro
da varia´vel indexada da´-se o nome de dimensa˜o.
7.3 Vetores
As varia´veis indexadas que possui apenas um ı´ndice sa˜o chamadas de
vetores ou varia´veis compostas unidimensionais.
Notac¸a˜o:
<nome_varia´vel>[<ı´ndice>]
x[i]: varia´vel indexada.
i: ı´ndice (expressa˜o inteira positiva).
40
Exemplos:
1. A[3]: representa o terceiro elemento do vetor A.
2. Nome[p]: representa o p-e´simo elemento do vetor Nome.
3. x[2*i + 3*j - 4*k]: a avaliac¸a˜o da expressa˜o entre colchetes, que
devera´ ser um nu´mero inteiro positivo, dara´ a posic¸a˜o do elemento no
vetor x.
7.3.1 Declarac¸a˜o de vetores
Como qualquer varia´vel simples, para usarmos vetores precisamos antes
declara´-lo.
Sintaxe:
<tipo> : <nome>[<limite>]
Onde <tipo> podera´ ser qualquer dos tipos va´lidos, <nome> e´ qualquer
nome de uma varia´vel simples representativa do conjunto e <limite> e´ um
nu´mero inteiro positivo que limita o valor ma´ximo para o ı´ndice da varia´vel
indexada, ou seja, nu´mero ma´ximo de elementos do vetor.
Exemplos:
1.
Real: vetor1[10], vetor2[20]
2.
Inteiro: pares[30], impares[50]
3.
Lo´gico: opcoes[20]
4.
Literal[30]: nomes[10], datas[20], cidades[30]
7.3.2 Operac¸o˜es com vetores
Na˜o e´ poss´ıvel operar diretamente com conjuntos, como um todo, mas
apenas com cada um de seus componentes, um por vez. O acesso individual
a cada componente de um conjunto e´ realizado pela especificac¸a˜o de sua
posic¸a˜o, no mesmo, por meio de um ou mais ı´ndices. Por exemplo, para
somar dois vetores e´ necessa´rio somar cada um dos seus componentes, dois
a dois.
Na˜o se deve confundir o nu´mero entre colchetes na declarac¸a˜o de varia´-
veis indexadas com o nu´mero entre colchetes no processamento de alguma
operac¸a˜o. No primeiro caso, o nu´mero representa o limite superior para os
ı´ndices, enquanto que no segundo caso, o nu´mero representa a posic¸a˜o do
elemento no conjunto (o ı´ndice).
41
7.3.2.1 Atribuic¸a˜o de vetores
Cada vez que se processa uma varia´vel indexada, qualquer que seja a
operac¸a˜o, o ı´ndice deve ser um valor conhecido.
A sintaxe da atribuic¸a˜o para varia´veis indexadas e´ a mesma, sendo que
a varia´vel, ale´m do nome, deve conter o(s) ı´ndice(s) do componente do
conjunto, onde devera´ ser armazenado o valor da expressa˜o. A expressa˜o
tambe´m podera´ conter varia´veis indexadas.
Exemplos:
1.
x[1] <- 0
2.
y[10] <- 2*x**3+1
3.
num[3] <- 3*num[1] + 5*num[2]
4.
fibo[n] <- fibo[n-2] + fibo[n-1]
5.
Para i de 1 ate´ 10 fac¸a
p[i] <- 3*i-1
Fim_para
6.
Para u de 1 ate´ n fac¸a
Se (u - u\2*2 = 0) ent~ao
x[u] <- 0
sen~ao
x[u] <- 1
Fim_se
Fim_para
7.3.2.2 Leitura de vetores
A leitura de um conjunto e´ feita passo a passo, um componente por vez,
usando a mesma sintaxe da instruc¸a˜o primitiva de entrada de dados, ou
seja, a instruc¸a˜o Leia(<lista_de_varia´veis>), sendo que, mais uma vez,
explicitando a posic¸a˜o do componente lido. E´ bastante frequ¨ente o uso de
estruturas de repetic¸a˜o na leitura de varia´veis indexadas.
Exemplos:
1.
Leia(x[1], x[2], x[3], x[4], x[5])
42
2.
Para i de 1 ate´ 100 fac¸a
Leia(x[i])
Fim_para
3.
Para k de 1 ate´ n fac¸a
Repita
Escreva("Digite um nu´mero positivo:")
Leia(num[k])
Ate´(num[k] > 0)
Fim_para
4. Para i de 1 ate´ n fac¸a
Repita
Escreva("Digite um nu´mero positivo:")
Leia(p)
Ate´(p > 0)
x[i] <- p
Fim_para
7.3.2.3 Escrita de vetores
A escrita de um conjunto obedece a` mesma sintaxe da instruc¸a˜o primitiva
de sa´ıda, ou seja, a instruc¸a˜o Escreva(<lista_de_express~oes>). E de
forma ana´loga ao item anterior, utilizamos as estruturas de repetic¸a˜o para
escrever todos os elementos de um conjunto.
Exemplos:
1.
Para i de 1 ate´ p fac¸a
Escreva(x[i])
Fim_para
2.
Escreva("Vetor Soluc¸~ao: ")
Para j de 1 ate´ n fac¸a
Escreva("x[",j,"]=", x[j])
Fim_para
3.
Escreva ("i X[i] Y[i] Z[i]")
Para i de 1 ate´ n fac¸a
Escreva(i, x[i], y[i], z[i])
Fim_para
43
7.3.3 Exemplos de algoritmos com vetores
1. Imprimir a soma de n nu´meros dados.
Algoritmo Soma
Real: x[100], soma
Inteiro: n, i
Inı´cio
Repita
Escreva("Quantos nu´meros? ")
Leia(n)
Ate´(n > 0 .E. n <= 100)
Escreva("Digite os ", n , " nu´meros: ")
Para i de 1 ate´ n fac¸a
Leia(x[i])
Fim_para
soma <- 0
Para i de 1 ate´ n fac¸a
soma <- soma + x[i]
Fim_para
Escreva("Soma = ", soma)
Fim
2. Imprimir os n primeiros termos da sequ¨eˆncia de Fibonacci (1 1 2 3 5
8 13 21 . . . ):
Algoritmo Fibonacci
Inteiro: f[100], n, i
Inı´cio
Repita
Escreva("Quantos termos?")
Leia(n)
Ate´(n>0 .E. n <=100)
f[1] <- 1
f[2] <- 1
Para i de 3 ate´ n fac¸a
f[i] <- f[i-2] + f[i-1]
Fim_para
Escreva("Seque^ncia de Fibonacci: ")
Para i de 1 ate´ n fac¸a
Escreva(f[i])
Fim_para
Fim
3. Dados dois vetores com n componentes cada, calcular o produto escalar
entre eles.
Algoritmo Produto_escalar
Real: x[10], y[10], pesc
44
Inteiro: n, i
Inı´cio
Repita
Escreva("Quantos componentes tem cada vetor? ")
Leia(n)
Ate´(n>0 .E. n<=10)
Escreva("Digite os nu´meros do primeiro vetor: ")
Para i de 1 ate´ n fac¸a
Leia(x[i])
Fim_para
Escreva("Digite os nu´meros do segundo vetor: ")
pesc <- 0
Para i de 1 ate´ n fac¸a
Leia(y[i])
pesc <- pesc + x[i]*y[i]
Fim_para
Escreva("Produto Escalar = ", pesc)
Fim
4. Dados n nu´meros inteiros positivos, imprimi-los, separadamente, como
pares e ı´mpares.
Algoritmo Par_ı´mpar
Inteiro: x[30], par[30], impar[30], n, k, p, i
Inı´cio
Repita
Escreva("Quantos nu´meros?")
Leia(n)
Ate´(n>0 .E. n<=30)
Escreva("Digite os", n, " nu´meros inteiros
positivos:")
p <- 0
i <- 0
Para k de 1 ate´ n fac¸a
Repita
Leia(x[k])
Ate´(x[k] > 0)
Se(x[k] - x[k]\2*2 = 0)ent~ao
p <- p + 1
par[p] <- x[k]
sen~ao
i <- i + 1
impar[i] <- x[k]
Fim_se
Fim_para
Escreva("Nu´meros pares: ")
Para k de 1 ate´ p fac¸a
Escreva(par[k])
Fim_para
45
Escreva("Nu´meros ı´mpares: ")
Para k de 1 ate´ i fac¸a
Escreva(ı´mpar[k])
Fim_para
Fim
5. Calcular e imprimir o conjunto intersec¸a˜o entre dois conjuntos nume´-
ricos quaisquer dados.
Algoritmo Intersec¸~ao
Real: a[20], b[20], c[20]
Inteiro: m, n, i, j, k
Inı´cio
Repita
Escreva("Quantos nu´meros tem o primeiro conjunto? ")
Leia(m)
Ate´(m>0 .E. m<=20)
Escreva("Digite os nu´meros do primeiro conjunto:")
Para i de 1 ate´ m fac¸a
Leia(a[i])
Fim_para
Repita
Escreva("Quantos nu´meros tem o segundo conjunto? ")
Leia(n)
Ate´(n>0.E.n<=20)
Escreva("Digite os nu´meros do segundo conjunto:")
Para i de 1 ate´ n fac¸a
Leia(b[i])
Fim_para
k <- 0
Para i de 1 ate´ m fac¸a
Para j de 1 ate´ n fac¸a
Se(a[i] = b[j])ent~ao
k <- k + 1
c[k] <- a[i]
Fim_se
Fim_para
Fim_para
Se(k=0)ent~ao
Escreva("Intersec¸~ao Vazia.")
Sen~ao
Escreva("Conjunto Intersec¸~ao:")
Para i de 1 ate´ k fac¸a
Escreva(c[i])
Fim_para
Fim_se
Fim
6. Dado um nu´meroverificar se o mesmo se encontra num vetor com n
46
elementos. Utilizar pesquisa sequ¨eˆncial1.
Algoritmo Pesquisa_sequencial
Real: x[100], num
Inteiro: n, i
Lo´gico: achou
Inı´cio
Repita
Escreva("Quantos nu´meros?")
Leia(n)
Ate´(n>0 .E. n<=100)
Escreva("Digite todos os nu´meros:")
Para i de 1 ate´ n fac¸a
Leia(x[i])
Fim_para
Escreva("Digite o nu´mero que procura: ")
Leia(num)
achou <- .F.
i <- 1
Enquanto(i <= n .E. .N~ao. achou)fac¸a
Se(x[i] = num)ent~ao
achou <- .V.
sen~ao
i <- i+1
Fim_se
Fim_enquanto
Se(achou)ent~ao
Escreva("Nu´mero encontrado. ")
Sen~ao
Escreva("Nu´mero n~ao encontrado.")
Fim_se
Fim
7. Dado um nu´mero verificar se o mesmo se encontra num vetor com n
elementos. Utilizar pesquisa bina´ria2.
Algoritmo Pesquisa_bina´ria
Real: x[100], num
Inteiro: n, i, meio, alto, baixo
Lo´gico: achou
Inı´cio
Repita
Escreva("Quantos nu´meros?")
Leia(n)
Ate´(n>0 .E. n<=100)
1Pesquisa sequ¨encial ou linear e´ o me´todo para se encontrar um elemento particular
num conjunto na˜o classificado.
2Pesquisa bina´ria e´ semelhante a` pesquisa sequ¨encial quanto ao objetivo, sendo que os
elementos do vetor esta˜o previamente classificados segundo algum crite´rio.
47
Escreva("Digite todos os nu´meros:")
Para i de 1 ate´ n fac¸a
Leia(x[i])
Fim_para
Escreva("Digite o nu´mero que procura: ")
Leia(num)
alto <- n
baixo <-1
achou <- .F.
Enquanto(baixo<=alto .E. .N~ao. achou)fac¸a
meio <- (baixo + alto)\2
Se(num < x[meio])ent~ao
alto <- meio - 1
sen~ao
Se(num > x[meio])ent~ao
baixo <- meio + 1
sen~ao
achou <- .V.
Fim_se
Fim_se
Fim_enquanto
Se(achou)ent~ao
Escreva("Nu´mero encontrado.")
Sen~ao
Escreva("Nu´mero n~ao encontrado.")
Fim_se
Fim
8. Colocar na ordem crescente n nu´meros quaisquer dados.
Algoritmo Ordem_crescente
Real: x[100], aux
Inteiro: n, i, j
Inı´cio
Repita
Escreva("Quantos nu´meros?")
Leia(n)
Ate´(n>0 .E. n<=100)
Escreva("Digite os nu´meros: ")
Para i de 1 ate´ n fac¸a
Leia(x[i])
Fim_para
Para j de n ate´ 2 passo -1 fac¸a
Para i de 1 ate´ (j-1) fac¸a
Se(x[i] > x[i+1])ent~ao
aux <- x[i]
x[i] <- x[i+1]
x[i+1] <- aux
Fim_se
48
Fim_para
Fim_para
Escreva("Vetor ordenado: ")
Para i de 1 ate´ n fac¸a
Escreva(x[i])
Fim_para
Fim
7.3.4 Exerc´ıcios propostos
1. Dados dois vetores com n componentes cada um, calcular e
imprimir a soma deles.
2. Calcular o cosseno do aˆngulo formado por dois vetores da-
dos, com o mesmo nu´mero de coordenadas, atrave´s da fo´r-
mula:
Cosseno =
A.B
|A||B|
Onde A.B e´ o produto escalar entre os vetores A e B, e |A|
e´ o mo´dulo do vetor A, dado por |A| = √A.A.
3. Calcular a me´dia aritme´tica de n nu´meros reais dados.
4. Calcular o n-e´simo termo da sequ¨eˆncia de Fibonacci.
5. Leia n nu´meros maiores que 1, e imprima-os, separada-
mente, como primos e na˜o-primos.
6. Dado um vetor A com n nu´meros reais, obter um outro
vetor B, tambe´m com n nu´meros, da seguinte forma:
B[1] = 2*A[1]
B[2] = 3*A[1] + 2*A[2]
B[3] = 4*A[1] + 3*A[2] + 2*A[3]
.
.
. (...e assim por diante)
7. Calcular o Desvio padra˜o (D.P.) de uma amostra x de n
nu´meros quaisquer dados.
D.P. =
√√√√√√
n∑
i=1
(x[i]−M)2
n− 1
Onde M e´ a me´dia dos n nu´meros dados.
8. Leia um conjunto com n nu´meros e informe se existe algum
elemento repetido no conjunto.
9. Leia n nu´meros quaisquer e imprima-os sem repetic¸o˜es.
10. Dado um nu´mero inteiro positivo, do sistema decimal, ob-
tenha o seu valor correspondente no sistema bina´rio.
49
7.4 Matrizes
Os vetores, ou varia´veis compostas unidimensionais, teˆm como principal
caracter´ıstica a necessidade de apenas um ı´ndice para enderec¸amento. Uma
estrutura que precise de mais de um ı´ndice, como no caso de matrizes, sera´
denominada estrutura composta multidimensional.
As varia´veis compostas multidimensionais, mais utilizadas sa˜o as bidi-
mensionais, ou matrizes, devido a` sua relac¸a˜o direta com muitas aplicac¸o˜es.
A aplicac¸a˜o com as demais varia´veis indexadas, isto e´, com treˆs ı´ndices,
quatro ı´ndices, etc., se faz por analogia a esta.
Notac¸a˜o:
<nome_varia´vel>[<ı´ndice1>,<ı´ndice2>, ... , <ı´ndiceN>]
x[i,j,k]: varia´vel indexada de dimensa˜o treˆs.
i, j, k: ı´ndices (valores inteiros positivos).
Exemplos:
1. x[2,3]: elemento de uma matriz (varia´vel indexada bidimensional) da
segunda linha e terceira coluna (posic¸a˜o na matriz).
2. mat[i+1,j-1]: os ı´ndices podem ser expresso˜es desde que sejam in-
teiras.
7.4.1 Declarac¸a˜o de matrizes
Veremos, de agora em diante, apenas matrizes (dois ı´ndices) como vari-
a´veis compostas multidimensionais.
Sintaxe:
<tipo>: <nome>[<limite1>,<limite2>]
Exemplos:
1.
Real: mat1[10,10]
2.
Inteiro: x[15,15], y[20,20], z[10,10]
3.
Lo´gico: achou[5,5]
4.
Literal[20]: nomes[15,15]
50
7.4.2 Operac¸o˜es com matrizes
Percebemos que uma estrutura bidimensional e´ um conjunto de estru-
turas unidimensionais, ou seja, uma matriz e´ um conjunto de vetores. Por-
tanto, para operarmos com matrizes, geralmente, lanc¸amos ma˜o de duas
estruturas de repetic¸a˜o (para vetores utilizamos uma).
7.4.2.1 Atribuic¸a˜o de matrizes
A atribuic¸a˜o e´ uma das formas de qualquer varia´vel armazenar algum va-
lor. Como na˜o operamos diretamente com a matriz, somente seus elementos
armazenam valores numa atribuic¸a˜o.
Exemplos:
1.
mat[3,4] <- 3.75
2.
Para i de 1 ate´ 10 fac¸a
Para j de 1 ate´ 10 fac¸a
Se(i = j)ent~ao
x[i,j] <- 1
sen~ao
x[i,j] <- 0
Fim_se
Fim_para
Fim_para
3.
Para i de 1 ate´ m fac¸a
Para j de 1 ate´ n fac¸a
Se(i > j)ent~ao
a[i,j] <- 2*i + 3*j
sen~ao
Se(i = j)ent~ao
a[i,j] <- i**2
sen~ao
a[i,j] <- 5*i**3 - 2*j**2
Fim_se
Fim_se
Fim_para
Fim_para
51
7.4.2.2 Leitura de matrizes
De forma ana´loga a leitura de vetores, utilizamos dois lac¸os para a leitura
de matrizes.
Exemplos:
1.
Para i de 1 ate´ m fac¸a
Para j de 1 ate´ n fac¸a
Leia(mat[i,j])
Fim_para
Fim_para
2.
Escreva("Digite nu´meros positivos:")
Para a de 1 ate´ p fac¸a
Para b de 1 ate´ p fac¸a
Repita
Escreva("Atenc¸~ao! Positivo.")
Leia(x)
Ate´(x > 0)
matriz[a,b] <- x
Fim_para
Fim_para
7.4.2.3 Escrita de matrizes
De forma semelhante a leitura fazemos a escrita de matrizes.
Exemplos:
1.
Para i de 1 ate´ m fac¸a
Para j de 1 ate´ n fac¸a
Escreva(matriz[i,j])
Fim_para
Fim_para
2.
Para i de 1 ate´ m fac¸a
Para j de 1 ate´ n fac¸a
Escreva("x[",i,",",j,"] = ",x[i,j])
Fim_para
Fim_para
52
7.4.3 Exemplos de algoritmos com matrizes
1. Imprimir a matriz identidade de ordem n.
Algoritmo Matriz_identidade
Inteiro: ident[20,20], n, i, j
Inı´cio
Repita
Escreva("Digite a ordem da matriz <=20:")
Leia(n)
Ate´(n>0 .E. n<=20)
Para i de 1 ate´ n fac¸a
Para j de 1 ate´ n fac¸a
Se(i = j)ent~ao
ident[i,j] <- 1
sen~ao
ident[i,j] <- 0
Fim_se
Fim_para
Fim_para
Para i de 1 ate´ n fac¸a
Para j de 1 ate´ n fac¸a
Escreva(ident[i,j])
Fim_para
Fim_para
Fim
2. Dada uma matriz quadrada de ordem n > 3, calcular:
(a) a soma dos elementos da primeira linha;
(b) a soma dos elementos da terceira coluna;
(c) a soma dos elementos da diagonal principal;
(d) a soma dos elementos da diagonal secunda´ria;
(e) a soma de todos os elementos da matriz.
Algoritmo Ca´lculos_matriciais
Real: mat[15,15], sa, sb, sc, sd, se
Inteiro: n, i, j
Inı´cio
Repita
Escreva("Digite a ordem da matriz >3:")
Leia(n)
Ate´(n>3 .E. n<=15)
Escreva("Digite os elementos da matriz por linha:")
Para i de 1 ate´ n fac¸a
Para j de 1 ate´ n fac¸a
Leia(mat[i,j])
Fim_para
53
Fim_para
sa <- 0
sb <- 0
sc <- 0
sd <- 0
se <- 0
Para i de 1 ate´ n fac¸a
sa <- sa + mat[1,i]
sb <- sb + mat[i,3]
sc <- sc + mat[i,i]
sd <- sd + mat[i,n - i + 1]
Para j de 1 ate´n fac¸a
se <- se + mat[i,j]
Fim_para
Fim_para
Escreva("sa=",sa," sb=",sb," sc=",sc," sd=",sd,
" se=", se)
Fim
3. Dada uma matriz quadrada de ordem n, calcular e imprimir a soma
dessa matriz com a sua transposta.
Algoritmo Soma_transposta
Real: x[10,10], y[10,10]
Inteiro: n, i, j
Inı´cio
Repita
Escreva("Digite a ordem da matriz <=10: ")
Leia (n)
Ate´(n>0 .E. n<=10)
Escreva("Digite os nu´meros da matriz:")
Para i de 1 ate´ n fac¸a
Para j de 1 ate´ n fac¸a
Leia(x[i,j])
Fim_para
Fim_para
Para i de 1 ate´ n fac¸a
Para j de 1 ate´ n fac¸a
y[i,j] <- x[i,j] + x[j,i]
Fim_para
Fim_para
Escreva("Matriz resultante:")
Para i de 1 ate´ n fac¸a
Para j de 1 ate´ n fac¸a
Escreva(y[i,j])
Fim_para
Fim_para
Fim
54
4. Dada uma matriz A qualquer de nu´meros inteiros positivos, gerar uma
matriz B tal que: B[i,j] = 0, se A[i,j] e´ par e B[i,j] = 1, se
A[i,j] e´ ı´mpar.
Algoritmo Matriz_B
Inteiro: A[10,10], B[10,10], m, n, i, j
Inı´cio
Repita
Escreva("Digite o nu´mero de linhas e o nu´mero
de colunas <=10: ")
Leia(m,n)
Ate´(m>0 .E. m<=10 .E. n>0 .E. n<=10)
Escreva("Digite os nu´meros da matriz de inteiros
positivos: ")
Para i de 1 ate´ m fac¸a
Para j de 1 ate´ n fac¸a
Repita
Leia(A[i,j])
Ate´(A[i,j] > 0)
Se(A[i,j] - A[i,j]\2*2 = 0)ent~ao
B[i,j] <- 0
sen~ao
B[i,j] <- 1
Fim_se
Fim_para
Fim_para
Escreva("Matriz pedida:")
Para i de 1 ate´ m fac¸a
Para j de 1 ate´ n fac¸a
Escreva(B[i,j])
Fim_para
Fim_para
Fim
5. Obtenha o produto entre duas matrizes conformes3.
Algoritmo Produto_matricial
Real: a[10,10], b[10,10], c[10,10]
Inteiro: m, n, p, i, j, k
Inı´cio
Repita
Escreva("Digite o nu´mero de linhas e o nu´mero de
colunas da primeira matriz, e tambe´m o
nu´mero de colunas da segunda matriz: ")
Leia(m, n, p)
3Obs.: Dadas duas matrizes de tipos poss´ıveis de se efetuar o produto entre elas, por
exemplo a matriz A do tipo m por n, e a matriz B do tipo n por p, enta˜o obteremos uma
outra matriz C do tipo m por p.
55
Ate´(m>0 .E. m<=10 .E. n>0 .E. n<=10 .E. p>0 .E. p<=10)
Escreva("Digite os nu´meros da primeira matriz: ")
Para i de 1 ate´ m fac¸a
Para j de 1 ate´ n fac¸a
Leia(a[i,j])
Fim_para
Fim_para
Escreva("Digite os nu´meros da segunda matriz: ")
Para i de 1 ate´ n fac¸a
Para j de 1 ate´ p fac¸a
Leia(b[i,j])
Fim_para
Fim_para
Para i de 1 ate´ m fac¸a
Para k de 1 ate´ p fac¸a
c[i,k] <- 0
Para j de 1 ate´ n fac¸a
c[i,k] <- c[i,k] + a[i,j]*b[j,k]
Fim_para
Fim_para
Fim_para
Escreva("Matriz Produto: ")
Para i de 1 ate´ m fac¸a
Para j de 1 ate´ p fac¸a
Escreva(c[i,j])
Fim_para
Fim_para
Fim
7.4.4 Exerc´ıcios propostos
1. Gerar e imprimir uma matriz com m linhas e n colunas onde
seus elementos sa˜o da forma:
A[i, j] =

2i+ 7j − 2 se i < j
3i2 − 1 se i = j
4i3 − 5j2 + 1 se i > j.
2. Calcular a soma dos elementos de uma matriz nume´rica
quadrada qualquer dada, que esta˜o acima da diagonal prin-
cipal.
3. Obtenha e imprima um vetor que seja a soma dos elementos
de cada coluna de uma matriz nume´rica qualquer dada.
4. Verificar se uma matriz quadrada dada e´ ou na˜o sime´trica.
56
5. Gerar e imprimir a matriz quadrada de ordem n abaixo.
1 n− 1 n− 2 · · · 1
2 1 n− 2 · · · 1
3 3 1 · · · 1
...
...
...
. . .
...
n n n · · · 1

6. A matriz abaixo, quadrada 4x4, foi obtida de acordo com
uma determinada definic¸a˜o para seus elementos. Fac¸a um
algoritmo que leia um nu´mero inteiro positivo n e imprima
essa matriz com n linhas e n colunas.
3 4 5 6
5 5 6 7
7 8 7 8
9 10 11 9

7.5 Cadeias e subcadeias de caracteres
A maior parte dos processamentos efetuados atualmente exige a mani-
pulac¸a˜o de cadeias de caracteres alfanume´ricos. Uma cadeia de caracteres
e´ uma sequeˆncia de letras, algarismos ou s´ımbolos (sinais de pontuac¸a˜o,
pareˆnteses, etc.). Cada caractere e´ uma informac¸a˜o e a cadeia de caracteres
e´ um conjunto de informac¸o˜es.
A relac¸a˜o de ordem entre as cadeias depende da relac¸a˜o de ordem vigente
para os caracteres e esta depende da linguagem de programac¸a˜o utilizada
na codificac¸a˜o do algoritmo.
Conforme ja´ vimos na apresentac¸a˜o do tipo de dados literal, esta or-
dem esta´ estabelecida pela ordem dos caracteres no sistema de codificac¸a˜o
utilizado ASCII.
A representac¸a˜o de uma cadeia de caracteres como um dado de proces-
samento e´ feita atrave´s da sequ¨eˆncia de seus caracteres entre aspas duplas.
Por exemplo: "JANEIRO", "abcdefg", "Rio Grande do Norte",
"etc.".
As varia´veis do tipo literal armazenam cadeias de caracteres.
Lembramos que o u´nico operador literal, que nos permite operar ca-
deias de caracteres, e´ o operador de concatenac¸a˜o + ("abc" + "de" resulta
"abcde").
Exemplo:
mes <- "FEVEREIRO"
nome <- "Ana Maria Duarte"
endereco <- "Rua Afonso Pena, 625. Tirol"
57
7.5.1 Declarac¸a˜o de cadeia de caracteres
A declarac¸a˜o de varia´veis do tipo literal, e´ feita como se fosse um vetor
onde seus elementos sa˜o caracteres, sendo que o nu´mero que indicaria o
limite ma´ximo de elementos do vetor na˜o fica junto a` varia´vel, e sim, ao
lado do tipo, mas o objetivo continua sendo reservar espac¸o na memo´ria
para armazenamento de constantes. No momento da declarac¸a˜o o espac¸o
reservado fica cheio de caracteres vazios ("") e, durante o processamento,
a medida que a varia´vel vai recebendo caracteres, os vazios va˜o sumindo,
mas o programador deve providenciar para que tenhamos pelo menos um
caractere vazio em qualquer momento do processamento, pois isso o ajudara´
a saber quantos caracteres podera˜o ser acessados, ou seja, ele devera´ declarar
n caracteres e utilizar, no ma´ximo, n-1, sendo n uma constante inteira maior
que 1.
Sintaxe:
Literal[<limite>]: <lista_varia´veis>
Exemplos:
1. Literal[41]: nome, endereco
nome e endereco podem armazenar ate´ 40 caracteres.
2. Literal[21]: nomes[50], cidades[50]
nomes e cidades sa˜o conjuntos (vetores) com, no ma´ximo,
50 cadeias de caracteres, contendo, no ma´ximo, 20 caracte-
res cada cadeia.
Como em um vetor, todos os caracteres de uma cadeia sa˜o armazenados
em unidades consecutivas de armazenamento de caracteres (1 byte para cada
caractere). O nu´mero de caracteres (ou de unidades de armazenamento) de
uma cadeia e´ o comprimento da cadeia, e a cada caractere corresponde um
nu´mero (posic¸a˜o) dentro da cadeia (como o ı´ndice nos vetores).
7.5.2 Subcadeia de caracteres
Uma subcadeia de caracteres e´ uma sequ¨eˆncia de um ou mais caracteres
consecutivos dentro de uma cadeia. Por exemplo, "JANE" e´ uma subcadeia
de "JANEIRO", mas "JAIRO" na˜o e´.
O recurso da subcadeia propicia a manipulac¸a˜o (o processamento) de
partes de uma determinada cadeia de caracteres.
Notac¸a˜o da subcadeia:
<nome_cadeia>[<inı´cio_cadeia>:<fim_cadeia>]
58
<nome_cadeia> e´ um nome qualquer de uma varia´vel declarada do
tipo literal.
<inı´cio_cadeia> e´ um nu´mero inteiro positivo que indica a posic¸a˜o
dentro da cadeia onde a subcadeia inicia.
<fim_cadeia> e´ um nu´mero inteiro positivo que indica a posic¸a˜o den-
tro da cadeia onde a subcadeia termina.
Exemplos: x[3:6], nome[4:10], me^s[3:3]
Exemplo: Seja a cadeia vogal "AEIOU". Enta˜o:
a subcadeia vogal[3:4] corresponde a "IO"
a subcadeia vogal[1:5] corresponde a "AEIOU"
a subcadeia vogal[2:2] corresponde a "E"
7.5.3 Exemplos de algoritmos com cadeias e subcadeias de ca-
racteres
1. Diga como sera´ a sa´ıda do algoritmo abaixo.
Algoritmo Cadeia_caracteres
Literal[11]: cadeia
Inı´cio
cadeia[1:3] <- "ABC"
cadeia[4:7] <- "DEFG"
cadeia[6:10] <- "HIJKL"
Escreva(cadeia)
Fim
Sa´ıda: ABCDEHIJKL
2. Diga como sera´ a sa´ıda do algoritmo abaixo.
Algoritmo Branco
Literal[52]: branco, z
Inteiro: n
Inı´cio
Para n de 1 ate´ 50 fac¸a
branco[n:n] <- " "
z <- branco[1:n]+ "Z"
Escreva(z)
Fim_para
Fim
Sa´ıda:
59
Z
Z
Z
Z
.
.
.
3. Calcular o comprimento de uma cadeia de caracteres dada.
Algoritmo Comprimento
Literal[81]: nome
Inteiro: n
Inı´cio
Escreva("Digite a cadeia: ")
Leia(nome)
n <- 0
Enquanto(nome[n+1:n+1] <> "")fac¸a
n <- n + 1
Fim_enquanto
Escreva("Comprimento = ", n)
Fim
4. Converter uma letra minu´scula em letra maiu´scula.
Algoritmo Maiu´sculo
Literal[27]: alfa, ALFA
Literal[2]: letra
Inteiro: i
Inı´cio
Repita
Escreva("Digite uma letra minu´scula: ")
Leia(letra)
Ate´(letra>="a" .E. letra<="z")
alfa <- "abcdefghijklmnopqrstuvwxyz"
ALFA <- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
i <- 1
Enquanto(letra <> alfa[i:i])fac¸a
i <- i + 1
Fim_enquanto
letra <- ALFA[i:i]
Escreva(letra)
Fim
60
7.5.4 Exerc´ıcios propostos
1. Converta uma letra maiu´scula em letra minu´scula.
2. Fac¸a um algoritmo para converter uma cadeia de caracteres
de letras maiu´sculas em letras minu´sculas.
3. Dado o nome completo de uma pessoa imprimir apenas o
primeiro nome.
4. Dado o nome completo de uma pessoa imprimir apenas as
iniciais seguidas cada uma de ponto e espac¸o.
5. Dada uma cadeia de caracteres, inserir um caractere dado
numa posic¸a˜o da cadeia tambe´m dada e imprimir a nova
cadeia.
6. Dada uma cadeia de caracteres, eliminar o caractere de uma
posic¸a˜o dada nessa cadeia e imprimir a nova cadeia.
7. Dado um texto com, no ma´ximo, 80 caracteres, diga quan-
tas consoantes existem no texto.
8. Dado um texto com, no ma´ximo, 80 caracteres, diga quan-
tas vogais existem no texto.
9. Calcular o custo de um telegrama, onde os 30 primeiros
caracteres custam 9 centavos cada, os demais, a partir da´ı,
custam 6 centavos cada e os espac¸os em branco na˜o sa˜o
cobrados.
10. Dado um nu´mero inteiro positivo do sistema bina´rio, con-
verteˆ-lo no nu´mero correspondente do sistema decimal.
61
8 Subalgoritmos
8.1 Introduc¸a˜o
Sempre e´ poss´ıvel dividir problemas grandes e complicados em proble-
mas menores e de soluc¸a˜o mais simples. A decomposic¸a˜o de um problema
e´ fator determinante para a reduc¸a˜o da complexidade. A complexidade e´
sinoˆnimo de variedade, ou seja, a quantidade de situac¸o˜es diferentes que um
problema pode apresentar. Assim, quando decompomos um problema em
subproblemas, estamos invariavelmente dividindo tambe´m a complexidade
e, por consequ¨eˆncia, simplificando a resoluc¸a˜o. Outra grande vantagem da
decomposic¸a˜o e´ que permite focalizar a atenc¸a˜o em um problema pequeno
de cada vez, o que ao final produzira´ uma melhor compreensa˜o do todo.
Cada um desses pequenos problemas sera´ solucionado atrave´s de subalgorit-
mos. Nesse caso, o algoritmo completo e´ dividido num algoritmo principal
e diversos subalgoritmos (tantos quantos forem necessa´rios ou convenien-
tes). O algoritmo principal e´ aquele por onde comec¸a a execuc¸a˜o, e chama,
eventualmente, os demais subalgoritmos.
Subalgoritmo e´ um algoritmo que, geralmente, resolve um pequeno pro-
blema, e que esta´ subordinado a um outro algoritmo. Esta subordinac¸a˜o
deve-se ao fato de que o subalgoritmo so´ sera´ acionado se solicitado pelo
algoritmo principal. E´ poss´ıvel que um subalgoritmo chame outro subalgo-
ritmo.
Em resumo, os subalgoritmos sa˜o importantes:
• na subdivisa˜o de algoritmos complexos, facilitando o seu entendimen-
to;
• na estruturac¸a˜o de algoritmos, facilitando, principalmente, a detecc¸a˜o
de erros e a documentac¸a˜o de sistemas;
• na modularizac¸a˜o de sistemas, que facilita a manutenc¸a˜o de softwares
e reutilizac¸a˜o de subalgoritmos ja´ implementados.
8.2 Elementos de um subalgoritmo
A definic¸a˜o de um subalgoritmo consta de:
• cabec¸alho, onde esta˜o definidos o nome e o tipo do subalgoritmo, bem
como os seus paraˆmetros e suas varia´veis locais;
• corpo do subalgoritmo, onde se encontram as instruc¸o˜es, que sera˜o
executadas cada vez que ele e´ chamado.
O nome de um subalgoritmo e´ um nome simbo´lico pelo qual ele e´ cha-
mado por outro algoritmo.
62
As varia´veis locais sa˜o aquelas definidas dentro do pro´prio subalgoritmo
e so´ podem ser utilizadas pelo mesmo.
Os paraˆmetros sa˜o canais por onde os dados sa˜o transferidos pelo algo-
ritmo chamador a um subalgoritmo, e vice-versa. Para ser executado, a`s
vezes, um subalgoritmo precisa receber dados do algoritmo que o chamou,
e ao terminar sua tarefa, precisa fornecer os resultados ao mesmo. Esta
comunicac¸a˜o bidirecional e´ chamada de passagem de paraˆmetros.
O tipo de um subalgoritmo e´ definido em func¸a˜o do nu´mero de valores
que o subalgoritmo retorna ao algoritmo que o chamou.
Os subalgoritmos podem ser de dois tipos:
• as func¸o˜es, que retornam um, e somente um valor ao algoritmo cha-
mador;
• os procedimentos, que retornam va´rios valores, ou nenhum, ao algo-
ritmo chamador.
8.3 Func¸o˜es
O conceito de func¸o˜es e´ origina´rio da ide´ia de func¸a˜o matema´tica, onde
um valor e´ calculado a partir de outro(s) valor(es) fornecido(s) a` func¸a˜o.
Forma geral de uma func¸a˜o (sintaxe):
Func¸~ao <nome>(<para^metros>)
<declarac¸~ao_de_varia´veis>
Inı´cio
<bloco_de_instruc¸~oes>
Fim
8.3.1 Instruc¸a˜o “Retorne”
A instruc¸a˜o Retorne e´ um comando simples usado apenas nas func¸o˜es e
tem o efeito de parar a execuc¸a˜o da func¸a˜o e enviar um valor para o algoritmo
principal ou para outro subalgoritmo que o tenha chamado. Toda func¸a˜o
deve ter em seu corpo de instruc¸o˜es, pelo menos, uma instruc¸a˜o Retorne.
Sintaxe:
Retorne(<express~ao>)
Exemplos:
Retorne(1)
Retorne(.V.)
Retorne(area)
63
Retorne(pi*r*r)
Retorne(nome1)
Retorne(3.*x**2 + 4.*x - 1.5)
Exemplo de uma func¸a˜o:
Func¸~ao quad(w)
Real: w, z
Inı´cio
z <- w*w
Retorne(z)
Fim
8.3.2 Chamada de uma func¸a˜o
A chamada de uma func¸a˜o por parte do algoritmo principal ou por ou-
tro subalgoritmo e´ feita pelo simples aparecimento de seu nome, seguido
pelos respectivos paraˆmetros entre pareˆnteses, dentro de uma expressa˜o. Os
paraˆmetros utilizados no algoritmo principal, no ato da chamada da func¸a˜o
(chamados paraˆmetros reais) devem manter uma correspondeˆncia (nu´mero,
ordem e tipo) com os paraˆmetros definidos na func¸a˜o (chamados paraˆmetros
formais).
A func¸a˜o e´ executada, e ao seu te´rmino, o trecho do comando que a
chamou e´ substitu´ıdo pelo valor retornado pela mesma dentro da expressa˜o
em que se encontra, e a avaliac¸a˜o desta prossegue normalmente.
Exemplo de um algoritmo principal utilizando a func¸a˜o do exemplo an-
terior:
Algoritmo Quadrado
Real: x, y
Inı´cio
Escreva("Digite um nu´mero: ")
Leia(x)
y <- quad(x)
Escreva(" y = " , y)
Fim
8.3.3 Exemplos de algoritmos com func¸o˜es
1. Fac¸a uma func¸a˜o para calcular o fatorial de um nu´mero inteiro. Uti-
lize esta func¸a˜o num algoritmo principal para calcular o nu´mero de
combinac¸o˜es de m elementos tomados p a p, sendo m e p dados.
Func¸~ao fatorial(x)
Inteiro: x, f, i
64
Inı´cio
f <- 1
Para i de 2 ate´ x fac¸a
f <- f*i
Fim_para
Retorne(f)
Fim
Algoritmo Combinac¸~ao
Inteiro: m, p, comb
Inı´cio
Escreva("Digite dois nu´meros para obter as
combinac¸~oes: ")
Repita
Escreva("valores n~ao-negativos: ")
Leia(m, p)
Ate´(m >= 0 .E. p >= 0 .E. m >= p)
comb <- fatorial(m)/( fatorial(m-p)*fatorial(p))
Escreva("Nu´mero de combinac¸~oes = ", comb)
Fim
2. Fac¸a uma func¸a˜o para determinar se um nu´mero inteiro e´ par ou na˜o.
Utilize esta func¸a˜o para calcular dois somato´rios: um com os nu´meros
pares e outro com os nu´meros ı´mpares, dentre n nu´meros inteiros po-
sitivos dados.
Func¸~ao par(p)
Inteiro: p
Inı´cio
Se(p\2*2 = p)ent~ao
Retorne(.V.)
sen~ao
Retorne(.F.)
Fim_se
Fim
Algoritmo Soma_par_impar
Inteiro: n, x, i, sp, si
Inı´cio
Repita
Escreva("Quantos nu´meros? ")
Leia (n)
Ate´(n>0)sp <- 0
si <- 0
Escreva("Digite os nu´meros: ")
Para i de 1 ate´ n fac¸a
Repita
Escreva("positivos.")
65
Leia(x)
Ate´(x>0)
Se(par(x))ent~ao
sp <- sp + x
sen~ao
si <- si + x
Fim_se
Fim_para
Escreva("Soma dos pares = ", sp)
Escreva("Soma dos ı´mpares = ", si)
Fim
3. Fac¸a uma func¸a˜o para calcular o produto escalar entre dois vetores de
mesmas dimenso˜es e a utilize para calcular o cosseno do aˆngulo entre
dois vetores dados.
Func¸~ao prodesc(x, y, n)
Real: x[20], y[20], pe
Inteiro: n, i
Inı´cio
pe <- 0
Para i de 1 ate´ n fac¸a
pe <- pe + x[i]*y[i]
Fim_para
Retorne(pe)
Fim
Algoritmo Cosseno
Real: a[20], b[20], cos, pab, ma, mb
Inteiro: n, i
Inı´cio
Repita
Escreva("Digite a dimens~ao do vetor: ")
Leia(n)
Ate´(n>0 .E. n<=20)
Escreva("Digite os nu´meros do prim. Vetor:")
Para i de 1 ate´ n fac¸a
Leia(a[i])
Fim_para
Escreva("Digite os nu´meros do seg. vetor:")
Para i de 1 ate´ n fac¸a
Leia(b[i])
Fim_para
pab <- prodesc (a, b, n)
ma <- prodesc (a, a, n)**0.5
mb <- prodesc (b, b, n)**0.5
cos <- pab/(ma*mb)
Escreva("Cosseno do a^ngulo entre a e b = ", cos)
Fim
66
8.3.4 Exerc´ıcios propostos de func¸o˜es
1. Fac¸a uma func¸a˜o para calcular o mmc entre dois nu´meros inteiros.
2. Fac¸a uma func¸a˜o para informar se um nu´mero inteiro e´ primo ou na˜o.
Fac¸a um algoritmo principal para imprimir um determinado nu´mero
par dado, diferente de dois, como a soma de dois nu´meros primos (isto
e´ sempre poss´ıvel). Por exemplo: 28 = 23 + 5 ou 28 = 17 + 11.
3. Fac¸a uma func¸a˜o para calcular o valor absoluto de um nu´mero.
4. Fac¸a uma func¸a˜o para calcular o mo´dulo de um vetor com n nu´meros.
5. Fac¸a uma func¸a˜o para verificar se um vetor possui elementos repetidos.
6. Fac¸a uma func¸a˜o para verificar se um caractere pertence a uma cadeia
de caracteres.
7. Fac¸a uma func¸a˜o para converter uma letra minu´scula em uma letra
maiu´scula.
8.4 Procedimentos
Um procedimento e´ um subalgoritmo que retorna va´rios valores, ou ne-
nhum, ao programa principal, ou a outro subalgoritmo que o chame. Estes
valores sa˜o sempre retornados por meio dos paraˆmetros, e nunca explicita-
mente como no caso das func¸o˜es que usa a instruc¸a˜o Retorne.
Forma geral de um procedimento (sintaxe):
Procedimento <nome>(<para^metros>)
<declarac¸~ao_de_varia´veis>
Inı´cio
<bloco_de_instruc¸~oes>
Fim
Exemplo de um procedimento:
Procedimento Retangulo(lado1, lado2, perim, area)
Real: lado1, lado2, perim, area
Inı´cio
perim <- 2*(lado1 + lado2)
area <- lado1 * lado2
Fim
67
8.4.1 Chamada de um procedimento
A chamada de um procedimento so´ e´ feita em comandos isolados dentro
do algoritmo principal ou outro subalgoritmo, como os comandos simples,
tipo as instruc¸o˜es Leia, Escreva, Retorne, etc., e nunca no meio de expresso˜es
ou em atribuic¸o˜es como no caso de func¸o˜es.
Exemplo de um algoritmo principal com o procedimento anterior:
Algoritmo Area_perimetro
Real: x,y,p,a
Inı´cio
Escreva("Digite dois nu´meros: ")
Leia(x,y)
Retangulo(x,y,p,a)
Escreva("Perı´metro = ", p, "Area = ", a)
Fim
8.4.2 Mecanismos de passagem de paraˆmetros
Dados sa˜o passados pelo algoritmo principal (ou outro subalgoritmo) ao
subalgoritmo, ou retornados por este ao primeiro, por meio de paraˆmetros.
Paraˆmetros formais sa˜o os nomes simbo´licos (varia´veis) introduzidos no
cabec¸alho dos subalgoritmos, utilizados na definic¸a˜o dos paraˆmetros do
mesmo. Dentro do subalgoritmo trabalha-se com estes nomes da mesma
forma como se trabalha com varia´veis locais.
Paraˆmetros reais sa˜o aqueles que substituem os paraˆmetros formais quan-
do da chamada de um subalgoritmo. Os paraˆmetros formais sa˜o u´teis so-
mente na definic¸a˜o do subalgoritmo. Os paraˆmetros reais podem ser dife-
rentes a cada chamada de um subalgoritmo.
Nos procedimentos os paraˆmetros sa˜o divididos em paraˆmetros de en-
trada e paraˆmetros de sa´ıda, ja´ que os valores a serem retornados pelo pro-
cedimento (paraˆmetros de sa´ıda) sa˜o transferidos atrave´s dos paraˆmetros,
enquanto que os dados passados pelo algoritmo principal para o procedi-
mento (paraˆmetros de entrada) sa˜o tambe´m atrave´s de paraˆmetros.
Os paraˆmetros reais substituem os paraˆmetros formais no ato da cha-
mada de um subalgoritmo. Esta substituic¸a˜o e´ denominada passagem de
paraˆmetros e pode se dar por dois mecanismos: passagem por valor (ou por
co´pia) ou passagem por refereˆncia.
Na passagem de paraˆmetros por valor o paraˆmetro real e´ calculado e
uma co´pia de seu valor e´ fornecida ao paraˆmetro formal, no ato da chamada
do subalgoritmo. As modificac¸o˜es feitas no paraˆmetro formal na˜o afetam o
paraˆmetro real, durante a execuc¸a˜o do subalgoritmo, pois trabalha-se ape-
nas com uma co´pia do mesmo. Os paraˆmetros formais possuem locais de
memo´ria exclusivos para que possam armazenar os valores dos paraˆmetros
reais.
68
Na passagem de paraˆmetros por refereˆncia na˜o e´ feita uma reserva de
espac¸o de memo´ria para os paraˆmetros formais. Quando um subalgoritmo
com paraˆmetros passados por refereˆncia e´ chamado, o espac¸o de memo´ria
ocupado pelos paraˆmetros reais e´ compartilhado pelos paraˆmetros formais
correspondentes. Assim, as eventuais modificac¸o˜es feitas nos paraˆmetros
formais tambe´m afetam os paraˆmetros reais correspondentes.
Como norma, vamos adotar que, quando a passagem de paraˆmetros for
feita com varia´veis simples, cujos valores na˜o sa˜o modificados, a passagem
sera´ por valor, e quando for feita com varia´veis simples, cujos valores sa˜o
modificados, e com varia´veis indexadas, a passagem de paraˆmetros sera´ por
refereˆncia. Isto quer dizer que se for do nosso interesse manter intactos
vetores ou matrizes apo´s a chamada de subalgoritmos, que os utilizaram e
os modificaram como paraˆmetros formais no ato da chamada dos mesmos,
enta˜o devemos antes disso guardar co´pias dos seus valores.
8.4.3 Exemplos de algoritmos com procedimentos
1. Fac¸a um procedimento que soma duas matrizes nume´ricas. Fac¸a um
outro procedimento que obte´m a transposta de uma matriz. Fac¸a um
algoritmo principal para somar uma matriz quadrada dada com a sua
transposta utilizando os procedimentos.
Procedimento Soma_matriz(a, b, m, n, soma)
Real: a[10,10], b[10,10], soma[10,10]
Inteiro: m, n, i, j
Inı´cio
Para i de 1 ate´ m fac¸a
Para j de 1 ate´ n fac¸a
soma[i,j] <- a[i,j] + b[i,j]
Fim_para
Fim_para
Fim
Procedimento Transposta(x, p, q, y)
Real: x[10,10], y[10,10]
Inteiro: p, q, i, j
Inı´cio
Para i de 1 ate´ q fac¸a
Para j de 1 ate´ p fac¸a
y[i,j] <- x[j,i]
Fim_para
Fim_para
Fim
Algoritmo Matriz_quadrada
Real: mat[10,10], t[10,10], s[10,10]
Inteiro: n, i, j
69
Inı´cio
Repita
Escreva("Digite a ordem da matriz quadrada <= 10:")
Leia(n)
Ate´(n>0 .E. n<=10)
Escreva("Digite os nu´meros da matriz: ")
Para i de 1 ate´ n fac¸a
Para j de 1 ate´ n fac¸a
Leia(mat[i,j])
Fim_para
Fim_para
Transposta(mat,n,n,t)
Soma_matriz(mat,t,n,n,s)
Escreva("Matriz resultante: ")
Para i de 1 ate´ n fac¸a
Para j de 1 ate´ n fac¸a
Escreva(s[i,j])
Fim_para
Fim_para
Fim
2. Fac¸a um procedimento para calcular o somato´rio de n nu´meros. E
utilize este procedimento para calcular o desvio padra˜o de n nu´meros
dados. (Essa questa˜o tambe´m pode ser feita com func¸a˜o)
Procedimento Soma_vetor (v, n, som)
Real: v[30], som
Inteiro: n, i
Inı´cio
som <-0.0
Para i de 1 ate´ n fac¸a
som <- som + v[i]
Fim_para
Fim
Algoritmo Desvio_padr~ao
Real: x[30], desvio, y[30], s, m
Inteiro: n, i
Inı´cio
Repita
Escreva("Quantos nu´meros?")
Leia(n)
Ate´(n>0 .E. n<=30)
Escreva("Digite os nu´meros: ")
Para i de 1 ate´ n fac¸a
Leia(x[i])
Fim_para
Soma_vetor(x, n, s)
m <- s/n
70
Para i de 1 ate´ n fac¸a
y[i] <- (x[i] - m)**2
Fim_para
Soma_vetor(y, n, s)
desvio <-

Outros materiais

Materiais relacionados

Perguntas relacionadas

Materiais recentes

Perguntas Recentes