Você está na página 1de 90

Algoritmos e Programação

Notas de aula
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Prof. José Leonardo Ferreira


UFVJM 2019/2
Sumário
Algoritmos
Elementos de programação estruturada
Modularização, funções e procedimentos
Refinamentos sucessivos
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Manipulação de arquivos
Recursividade, ordenação e busca
Ferramentas de programação aplicadas à
engenharia
2
Algoritmos
Programação: consiste no mapeamento de
um problema no mundo real a ser resolvido
num modelo computacional.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

3
Algoritmos
Mas para que esse mapeamento seja executado,
costuma-se usar a representação prévia do
problema por meio de um algoritmo.
Algoritmo: sequência enumerada e bem
especificada de operações (instruções) para se
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

resolver uma determinada tarefa ou um


determinado problema.

4
Algoritmos
Exemplos de algoritmo (usando linguagem
natural como representação):
Receita de bolo Tomando um banho
1. Misture os ingredientes 1. Entrar no banheiro e tirar
2. Unte a forma com manteiga a roupa
3. Despeje a mistura na forma 2. Abrir a torneira do
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

4. Se houver coco ralado chuveiro


então despeje sobre a mistura 3. Entrar na água
5. Leve a forma ao forno 4. Ensaboar-se
6. Enquanto não corar 5. Sair da água
deixe a forma no forno 6. Fechar a torneira
7. Retire do forno 7. Enxugar-se
8. Deixe esfriar 8. Vestir-se

5
Algoritmos
Exemplos de algoritmo (usando linguagem
natural como representação):

Troca de um pneu furado Cálculo da média de um


1. Afrouxar ligeiramente as aluno
porcas 1. Obter suas 2 notas de
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

2. Suspender o carro provas


3. Retirar as porcas e o pneu 2. Calcular a média aritmética
4. Colocar o pneu reserva 3. Se a média for maior que 7,
5. Apertar as porcas o aluno foi aprovado,
6. Abaixar o carro senão ele foi reprovado
7. Dar o aperto final nas porcas

6
Algoritmos
Exemplos de algoritmo (solução de jogos)
◦ Cubo mágico
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

◦ Missionários e canibais
https://www.jogos360.com.br/missionarios_e_canibais.html

7
Algoritmos
Importância do algoritmo em programação:
necessidade de se especificar uma sequência de
passos lógicos, para que o computador possa
executar uma tarefa qualquer.
=> Com um algoritmo, podemos conceber uma
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

solução para um dado problema, independente


de uma linguagem de programação específica.

8
Algoritmos
Todo algoritmo deve apresentar algumas
características básicas:
◦ Não dar margem à dupla interpretação (não ser
ambíguo).
◦ Ter capacidade de receber dados de entrada e poder
gerar informações de saída de acordo com
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

especificações da aplicação.
◦ Ser efetivo, ou seja, todas as etapas especificadas no
algoritmo devem ser alcançáveis em um tempo finito
e com desempenho que satisfaça às necessidades da
aplicação.
◦ Ter fim.
9
Algoritmos
No caso do uso da da linguagem natural para
descrição de algoritmos, ela não é usual pois
muitas vezes dá oportunidade a más
interpretações, ambiguidades e imprecisões.
Na prática, outras representações da descrição
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

do algoritmo são comumente usadas tais como


o fluxograma convencional, o pseudo-
código (português estruturado ou portugol) e
o diagrama de Chapin.

10
Algoritmos
Fluxograma
convencional:
representação
gráfica que utiliza
formas geométricas
padronizadas ligadas
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

por setas de fluxo.

11
Algoritmos
Fluxograma convencional
Algumas formas geométricas e significado
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

12
Algoritmos
Pseudo-código: linguagem intermediária entre a
linguagem natural e a linguagem de programação.

# Algoritmo Média

# Início
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Leia NOTA1, NOTA2


MÉDIA ← (NOTA1+NOTA2)/2
Se MEDIA >= 7:
Escreva “Aprovado”
Senão:
Escreva “Reprovado”
# Fim

13
Algoritmos
Diagrama de Chapin: representação das
ações do algoritmo em retângulos, com início e
fim e estrutras básicas de controle.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

14
Algoritmos
Um algortimo quando implementado em
um computador é constituído pelo menos
por três partes, sendo elas:
1. Entrada de dados
2. Processamento de dados
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

3. Saída de dados

15
Algoritmos
Na Entrada: fornecimento dos dados ou
informações necessárias à execução do
algoritmo.
Pelo Processamento: são avaliadas
todas as expressões algébricas, relacionais
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

e lógicas, assim como todas as estruturas


de controle existentes no algoritmo.

16
Algoritmos
Na Saída: todos os resultados do
processamento (ou parte deles) são
disponibilizados (enviados) para um ou
mais dispositivos de saída, seja o monitor,
impressora, ou a própria memória do
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

computador.

17
Elementos de programação
estruturada
Tipos de dados
Para que seja possível armazenar e manipular
(processar) dados no computador é necessário
representá-los internamente de alguma forma.
Os dados em um computador devem ser
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

armazenados de acordo:
◦ com o tipo de informação que se deseja representar;
◦ com o tipo de operação que será realizada com eles.

18
Elementos de programação
estruturada
Tipos de dados mais comuns:
◦ Inteiro: são os números pertencentes ao
conjunto dos números inteiros, isto é, sem
parte fracionária. Exemplos:
1, -340, 6, 0 e -10
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

◦ Real: são os números pertencentes ao


conjunto dos números reais, também
chamados pontos flutuantes (“float”).
Exemplos:
2.5, -3.141, 28.3333333, -100.5 e 5.0
19
Elementos de programação
estruturada
Tipos de dados mais comuns:
◦ String ou cadeia de caracteres (também
conhecidos como literais, alfanuméricos ou
char): são os valores pertencentes ao
conjunto de todos os caracteres numéricos
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

(0...9), alfabéticos (a...z, A...Z) e especiais (! @


# $ % & *). Podem ser delimitados por aspas
simples (‘) ou duplas (“) – mas não se pode
utilizar a mistura das duas. Exemplos:
‘Bom dia!...’, “100%”, ‘Estudante’, e “Olá, tudo bem?”

20
Elementos de programação
estruturada
Tipos de dados mais comuns:
◦ Lógico ou booleano: utilizado para
representar informações que só podem
assumir dois valores, ou o valor verdadeiro
(True), ou o valor falso (False). Exemplos:
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

2 é maior do que 1 (2>1): True


4 é igual a 6 (4==6): False
5 é menor ou igual a 2 (5<=2): False
‘fechado’ é igual a ‘aberto’ (‘fechado’==‘aberto’):
False
7 é diferente de 3 (7!=3): True
21
Elementos de programação
estruturada
Variáveis
Para acesso individual de informações
armazenadas na memória dos computadores,
deve-se saber, em princípio:
◦ Qual o tipo de dado desta informação
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

◦ Qual a posição inicial do conjunto de bytes


correspondente na memória
Esta sistemática de acesso a informações na
memória é bastante ilegível e difícil de se
trabalhar.
22
Elementos de programação
estruturada
Para contornar esta situação criou-se o
conceito de variável: entidade destinada a
guardar uma informação durante a execução do
algoritmo pelo computador.
Como o próprio nome diz, a váriavel pode ter
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

seu valor alterado durante a execução do


programa.
Um dado é uma constante quando seu valor
não se altera ao longo do tempo em que o
algoritmo é executado, ou seja, permanece o
mesmo desde o início até o final da execução.
23
Elementos de programação
estruturada
No caso do Python, não é necessário definir
uma constante, como ocorre com outras
linguagens de programação. Basta associar a
constante a uma váriavel que não tem seu valor
alterado durante a execução do programa.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Basicamente, uma variável possui três atributos:


◦ um nome (identificador);
◦ o tipo de dado associado; e
◦ a informação por ela guardada.

24
Elementos de programação
estruturada
Para que as variáveis sejam identificadas e
manipuladas no computador, é necessário que
elas estejam associados a um nome ou
identificador.
O conteúdo deste identificador será o dado em
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

si e o seu nome será usado para acessar o dado


e realizar operações com o mesmo.

25
Elementos de programação
estruturada
Existem algumas regras básicas para definir o
nome dos identificadores:
◦ O primeiro caractere deve ser uma letra.
◦ Os caracteres seguintes podem ser apenas letras,
dígitos ou o caractere de sublinhado ou underline
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

(“_”).
◦ Palavras reservadas (ou palavras-chave) – contém um
significado especial para a linguagem de programação
e, dessa forma, não podem ser usadas como nomes
de identificadores. Em Python, tem-se como exemplo
de palavras reservadas: int, if, else, for, while, etc.

26
Elementos de programação
estruturada
Em algumas linguagens de programação, as
variáveis utilizadas são definidas (declaradas) no
início do algoritmo.
No caso da linguagem Python, que é utilizada
nesse curso, não existe a necessidade dessa
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

declaração ser feita no início do programa.


Basta atribuirmos uma informação a uma
variável, ou utilizarmos o comando input.

27
Elementos de programação
estruturada
No caso da atribuição, basta atribuirmos a
informação (do tipo inteiro, string, etc.) à
variável pelo caractere “=”.
Nesse caso, a variável assume automaticamente
o tipo da informação a ela atribuído.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Exemplos:
◦ x=12, onde x será uma variável do tipo inteiro (int)
◦ y=8.0, onde y será uma variável do tipo real (float)
◦ z=‘A bicicleta’, onde z será uma variável do tipo
cadeia de caracteres (string)

28
Elementos de programação
estruturada
No caso do comando input, a variável sempre
assume o tipo string ou cadeia de caracteres.
Exemplos:
◦ A entrada verde pelo comando cor=input() gera a
variável cor do tipo cadeia de caracteres: cor=‘verde’
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

◦ A entrada 123 pelo comando y=input() gera uma a


variável y do tipo cadeia de caracteres (y=‘123’)
No caso da entrada ser constituída somente de
algarismos, pode-se mudar o tipo de uma
variável por meio da associação do tipo
requerido à essa variável.
29
Elementos de programação
estruturada
Para isso, empregam-se as funções int e float
quando se quer números inteiros e reais,
respectivamente.
Exemplos:
◦ Para transformar y=‘123’ em um número inteiro, usa-
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

se int: y=int(y). Ou, alternativamente, pode-se usar a


linha de comando y=int(input()) anteriormente à
entrada 123. Dessa forma, ter-se-á y=123
◦ Para transformar y=‘123’ em um número real, usa-se
float: y=float(y). Ou, alternativamente, pode-se usar a
linha de comando y=float(input()) anteriormente à
entrada 123. Dessa forma, ter-se-á y=123.0
30
Elementos de programação
estruturada
Variáveis do tipo inteiro e real podem,
igualmente, ter seu tipo convertido em string.
Para isso, utiliza-se a função str.
Exemplos:
◦ para a variável do tipo inteiro x=123, pelo comando
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

y=str(x) é gerada uma variável y do tipo string


(y=‘123’)
◦ Para a variável do tipo real x=123.0, pelo comando
y=str(x) é gerada uma variável y do tipo string
(y=‘123.0’)

31
Elementos de programação
estruturada
Váriaves compostas homogêneas
Correspondem a variáves que armazenam um
conjunto de elementos do mesmo tipo.
Unidimensionais: necessitam apenas de um
índice para invidualizar um elemento do
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

conjunto. No Python, os vetores são


implementados usando-se as listas e tuplas.
Multidimensionais: que necessitam de mais de
um índice para individualizar os elementos.
Exemplo: matrizes.
32
Elementos de programação
estruturada
Exemplo de vetores
nota
60 70 90 55 91 86 tipo inteiro
[0] [1] [2] [3] [4] [5]
>>>nota [4]=91
peso
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

76.5 46.9 84.1 75.0 98.2 58.8 110.0 33.1 tipo real
[0] [1] [2] [3] [4] [5] [6] [7]
>>>peso [0]=76.5
nome
‘R’ ‘O’ ‘S’ ‘A’ tipo string
[0] [1] [2] [3]
>>>nome [3]=‘A’
33
Elementos de programação
estruturada
Exemplo de matriz
DISTÂNCIA ENTRE CIDADES
(km) – dist
CIDADE A D E
A 0.0 344.6 100.0 [0]
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

B 835.0 74.7 29.9 [1] Tipo real


C 23.0 88.2 45.6 [2]
[0] [1] [2]

>>>dist [0][1]=344.6
>>>dist [1][1]=74.7
>>>dist [2][0]=23.0

34
Elementos de programação
estruturada
Vetores e matrizes são análogos a vetores
e matrizes usados em matemática:
Exemplo em Python (tipo inteiro):
x=[1, 2, 3, 4]
x = ( x0 , x1 ,...xn )
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Exemplo em Python (tipo string):


x=[‘b’, ‘o’, ‘l’, ‘a’]

 x00 x01  Exemplo em Python (tipo int):


A=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
A= 
 x10 x11  Exemplo em Python (tipo float):
A=[[23.4, 21.2, 15.5], [4.4, 10.5, 6.6], [0.2, -0.8, 9.2]]

35
Elementos de programação
estruturada
Registros
Registros: estruturas de dados que permitem
armazenar em uma única variável diversas
dados de diferentes tipos. Em Python, podem
ser implementados usando-se, também, as listas
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

e tuplas.
Correspondem a conjuntos de posições de
memória conhecidos por um mesmo nome e
individualizados por identificadores associados a
cada conjunto de posições.
36
Elementos de programação
estruturada
Registros: exemplo
ficha
Identificador do componente Tipo de dado
Nome String
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Idade Inteiro
Salário Real
Estado civil String

ficha
‘Rosa’ 12 1230.00 ‘Solteira’ tipos misturados
[0] [1] [2] [3] (string, inteiro e real)
>>>ficha [0]=‘Rosa’
37
Elementos de programação
estruturada
Ponteiros
Ponteiro (ou apontador): tipo de dado
(variável especial) capaz de armazenar um
endereço de memória associado a uma
determinada variável.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Desde que um ponteiro contém o endereço de


uma variável, é possível acessar a variável
indiretamente por meio do ponteiro.

38
Elementos de programação
estruturada
Estruturas de controle
Em um processo geral de execução de um
algoritmo implementado em uma linguagem de
programação, sua execução começa na primeira
linha e vai avançando sequencialmente, linha
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

após linha, até chegar no final.


Entretanto, frequentemente surge a necessidade
de se colocar instruções dentro de um
programa que só serão executadas caso alguma
condição específica aconteça.
39
Elementos de programação
estruturada
Estruturas de controle
Em outros casos, há a necessidade de o
programa repetir o processamento de um
conjunto de operações para grandes
quantidades de dados.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Os três casos acima constituem as 3 estruturas


básicas de controle, nas quais se baseiam os
algoritmos: sequência, seleção e repetição.

40
Estruturas de controle
Sequência, seleção (decisão) e repetição
(iteração)
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

41
Estruturas de controle
Sequência: consiste na estrutura de controle em
que os comandos são executados sequencialmente,
ou seja, na ordem em que aparecem escritos no
texto do programa.
Por exemplo, as linhas:
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

x=10
y=x*2
print(y)
são executadas na ordem em que
aparecem no trecho de código
acima.
42
Estruturas de controle
Seleção: estrutura de controle em que um certo
comando ou grupo de comandos é executado
apenas se uma certa condição for verdadeira.
Por exemplo, pelo código:
x=int(input())
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

if x<=10:
print(“Olá!”)
a mensagem “Olá” só será
impressa (uma única vez)
se o valor de x for menor ou
igual a 10.
43
Estruturas de controle
Seleção: em Python, é executada utilizando-se os
comandos if, elif e else. O comando if pode
aparecer sozinho, mas os comandos elif e else
sempre devem vir acompanhados
do comando if.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

◦ if: testa uma determinada condição;


◦ elif: testa uma condição diferente
daquela testada pelo if;
◦ else: testa o caso “excludente”, ou
seja, a condição que “exclui” aquelas
testadas pelo if e pelo elif.
44
Estruturas de controle
Repetição: é a estrutura de controle em que a
execução de um comando é repetida enquanto uma
certa condição for verdadeira.
Por exemplo:
x=int(input())
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

while x<=10:
print(“Olá!”)
x=x+1
a impressão da mensagem
“Olá” será repetida enquanto o
valor de x for menor ou igual a 10.
45
Estruturas de controle
Repetição: em Python, é executada utilizando-se
os comandos while e for.
No caso do comando for, o número de repetições
ocorre um determinado número
de vezes.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Por exemplo, pelo trecho de


código abaixo, a mensagem “olá”
será impressa 10 vezes:
for i in range(10):
print(“Olá!”)

46
Modularização, funções e
procedimentos
Modularização
Modularização: divisão de um algoritmo em
algoritmos menores ou subalgoritmos, facilitando a
implemetação e manutenção do mesmo.
Dessa forma: um problema maior pode ser
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

subdivido em problemas menores, cujas soluções


envolvem em si a solução geral.
A justaposição destes subalgoritmos soluciona o
problema original do algoritmo mais complexo.

47
Modularização, funções e
procedimentos
O algoritmo principal é aquele por onde a
execução do algoritmo sempre se inicia.
No algoritmo principal é onde são chamados os
demais subalgoritmos.
No pseudo-código de um algoritmo, o corpo do
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

algoritmo principal é sempre o último trecho,


colocado após as definições dos subalgoritmos.

48
Modularização, funções e
procedimentos
Exemplo:

# Algoritmo Modular
<comandos do subalgoritmos>
# Inicio do programa principal
<corpo do algoritmo principal>
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

# Fim do programa principal

49
Modularização, funções e
procedimentos
Ordem de execução no algoritmo principal
1. Quando se encontra um comando de chamada de um
subalgoritmo durante a execução do algoritmo principal,
a execução deste é interrompida.
2. A seguir, passa-se à execução dos comandos do corpo
do subalgoritmo.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

3. Ao seu término, retoma-se a execução do algoritmo


principal no ponto onde foi interrompida e prossegue-
se pela instrução imediatamente seguinte.
Ainda existe a possibilidade de que um
subalgoritmo chame outro através do mesmo
mecanismo.
50
Modularização, funções e
procedimentos
Tipos de subalgoritmo
O tipo de um subalgoritmo é definido em função
do número de valores que o subalgoritmo retorna
ao algoritmo que o chamou.
Segundo esta classificação, os subalgoritmos podem
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

ser de dois tipos:


◦ Funções
◦ Procedimentos

51
Modularização, funções e
procedimentos
Funções
Retornam um, e somente um, valor ao
algoritmo chamador.
O conceito de função é originário da ideia de
função matemática (por exemplo, raiz quadrada,
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

seno, cosseno, etc.), onde um valor é calculado a


partir de outro(s) fornecido(s) à função.

52
Modularização, funções e
procedimentos
Procedimentos
Retornam nenhum ou mais valores ao
algoritmo chamador.
Estes valores são sempre retornados por meio
dos parâmetros ou de variáveis globais, mas
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

nunca explicitamente, como no caso de funções.


Pelo contrário, a chamada de procedimentos só
é feita em comandos isolados dentro de um
algoritmo, como as instruções de leitura e
escrita de dados.
53
Modularização, funções e
procedimentos
Em Python:
◦ Funções e procedimentos são muito similares, sendo
a única diferença entre eles o fato de que uma função
deve retornar algum valor, enquanto um
procedimento pode alterar o valor de uma, ou
algumas, das variáveis passadas, editar um banco de
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

dados, uma imagem, um arquivo, imprimir uma


mensagem, etc.
◦ Uma função ou um procedimento é tratada pelo
interpretador da mesma forma, sendo a diferença
puramente conceitual, com uma função terminada por
um comando return.
54
Modularização, funções e
procedimentos
Sua sintaxe é apresentada abaixo:
def nome_função([arg_1 [= valor_1[, arg_2 [= valor_2, ...]]]]):
[global] <variáveis>
<comandos>
[return valor]
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

A palavra reservada global é necessária quando


se deseja que valores das variáveis locais sejam
repassadas para as variáveis globais, ou seja,
transcende o escopo do procedimento/função.

55
Modularização, funções e
procedimentos
Exemplo de # Algoritmo ler e escrever vetor
função para
Função LER_VETOR():
ler e escrever #Inicio
vetor: Para i de 1 até 50:
Leia vet[i]
#Fim
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Função ESC_VETOR():
#Inicio
Para i de 1 até 50:
Escreva vet[i]
#Fim
#Inicio do programa principal
LER_VETOR()
ESC_VETOR()
#Fim do programa principal

56
Refinamentos sucessivos
Algoritmo completo: todos os seus comandos
são do entendimento do seu executor.
Quando um comando não for do entendimento
do executor, ele terá que ser desdobrado em
novos comandos, que constituirão um
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

refinamento do comando inicial.


– E assim sucessivamente, até que os
comandos (e subcomandos) sejam entendidos
pelo destinatário.

57
Refinamentos sucessivos
Como pequeno exemplo de refinamento, e
retomando o algoritmo para calcular a média de
um aluno:
1. Obter suas 2 notas de provas Refinando...
2. Calcular a média aritmética
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

3. Se a média for maior que 7,


o aluno foi aprovado,
senão ele foi reprovado 1. Obter suas 2 notas de provas
2. Soma as duas notas
3. Divide o resultado por 2
3. Se a média for maior que 7,
o aluno foi aprovado,
senão ele foi reprovado

58
Refinamentos sucessivos
O uso do método de refinamentos sucessivos é
vantajoso:
=> Estimula à modularização de sistemas,
proporcionando a criação de programas
simples e fáceis de entender, portanto, de
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

manutenção mais barata.

59
Manipulação de arquivos
Arquivos: estruturas de dados que podem ser
manipuladas fora do ambiente do programa.
Ambiente do programa: memória principal,
onde nem sempre é possível ou conveniente
manter certas estruturas de dados.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Um arquivo que é armazenado em um


dispositivo de memória secundária, como
discos, pendrives, etc., pode ser lido ou escrito
por um programa através de um tipo de
apontador chamado “apontador de arquivo”.
60
Manipulação de arquivos
Alguns exemplos úteis de manipulação de
arquivos em Python:
## Programa para criar arquivo e escrever nele
vamosdigitar=open('D:\exemplo.txt','w') # Cria o arquivo
‘exemplo.txt’ na pasta raiz (D:\); 'w' – modo escrita
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

vamosdigitar.write('\tTabela de conversão dólar/real\n')

vamosdigitar.write('\n')

for i in range(1,11):
vamosdigitar.write('\t%i dólares valem %f reais\n' %(i,i*3.77))
#Cotação do dolar a 3.77 reais

vamosdigitar.close()
61
Manipulação de arquivos
O comando open permite abrir um arquivo. Os
modos de abertura de um arquivo são:
◦ ‘r’ – abrir o arquivo somente para ler (‘r’ do inglês
read, ler);
◦ ‘a’ – abrir o arquivo somente para escrever após o
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

que já existia no arquivo aberto (‘a’ do inglês append,


acrescentar);
◦ ‘w’ – abrir o arquivo somente para escrever. O que
que já existia no arquivo, um novo conteúdo será
escrito no arquivo abero (‘w’ do inglês write,
escrever).

62
Manipulação de arquivos
Alguns exemplos úteis de manipulação de
arquivos em Python:
## Programa para ler arquivo e escrever seu conteúdo 1

vamosler=open('D:\Documents\Python Scripts\Outros\exemplo.txt','r')
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

a=vamosler.readline() # Lê o conteúdo da primeira linha do arquivo


b=vamosler.readline() # Lê o conteúdo da segunda linha do arquivo

print(a,b) # Imprime o conteúdo das variáveis a e b. A formatação


presente no arquivo ‘txt’ é preservada

63
Manipulação de arquivos
Alguns exemplos úteis de manipulação de
arquivos em Python:
## Programa para ler arquivo e escrever seu conteúdo 2

vamoslerdenovo=open('F:\Python Scripts\Outros\exemplo.txt','r')
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

w=vamoslerdenovo.readlines()
print ('Variável w:', w)

tamvet=len(w)
for i in range(tamvet):
print(w[i])

vamoslerdenovo.close()

64
Manipulação de arquivos
Métodos para ler o conteúdo do arquivo
recém-aberto:
◦ ‘readline’ – lê o conteúdo do arquivo linha por linha.
◦ ‘readlines’ – lê o todo conteúdo do arquivo, e
armazena cada linha em diferentes posições de uma
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

uma lista (vetor), onde também aparecem os


caracteres especiais (por exemplo, ‘\n’ e ‘\t’)
correspondentes à formatação do arquivo lido.

65
Manipulação de arquivos
Métodos para ler o conteúdo do arquivo
recém-aberto:
◦ ‘read’ – lê o todo conteúdo do arquivo, e armazena
cada linha em um único string (cadeia de caracteres).
Dentro do string, cada linha é separada pelos
caracteres especiais (por exemplo, ‘\n’ e ‘\t’)
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

correspondentes à formatação do arquivo lido.


A exemplo de arquivos do tipo ‘.txt’, há outros
formatos de arquivo que podem ser
manipulados em ambiente Python como ‘.bat’
(MS-DOS) e o ‘.scr’ (AutoCAD).
66
Recursividade, ordenação e
busca
Recursividade
É a propriedade pela qual uma função pode
chamar a si própria, direta ou indiretamente.
Quando uma função chama a si própria
recursivamente, cada ativação recebe um
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

conjunto novo de todas as variáves locais,


independente do conjunto anterior.
O código recursivo é mais compacto, e
frequentemente mais fácil de escrever e
entender.
67
Recursividade, ordenação e
busca
Exemplo clássico de algoritmo recursivo: o
cálculo fatorial.

0! = 1
1! = 1 = 0!*1
2! = 1*2 = 2 = 1!*2
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

3! = 1*2*3 = 6 = 2!*3
...
N! = 1*2*... *(N-1)*N = (N-1)!*N

68
Recursividade, ordenação e
busca
Exemplo de pseudo-códigos para calcular o
fatorial de n (n!) pelos métodos convencional
(FAT_CONV( )) e recursivo (FAT_REC( )) :

FAT_CONV (n): FAT_REC (n):


JOSÉ LEONARDO FERREIRA / BCT / UFVJM

fat ← 1 se n = 0 :
cont ← 1 retorne 1
enquanto cont ≤ n: senão:
fat ← fat ∗ cont retorne n ∗ FAT_REC(n-1)
cont ← cont + 1
retorne fat

69
Recursividade, ordenação e
busca
Desvantagens da recursividade:
◦ Funções recursivas são geralmente mais lentas.
◦ Ocupam mais memória do que as funções iterativas
equivalentes, uma vez que são feitas muitas chamadas
consecutivas a funções.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

◦ Um erro de implementação pode levar a uma


recursividade sem fim (loop infinito).

70
Recursividade, ordenação e
busca
Ordenação
Operação que permite colocar os elementos de
um vetor em ordem crescente.
Ordena-se o vetor permutando, ou seja,
trocando posições de seus elementos.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

A operação de ordenação pode ser realizada


tanto para números quanto para strings (cadeia
de caracteres).

71
Recursividade, ordenação e
busca
Alguns exemplos de algoritmos de ordenação:
◦ Ordenação por seleção
◦ Ordenação por bolhas
◦ Ordenação por inserção
◦ Ordenação rápida
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

72
Recursividade, ordenação e
busca
Ordenação por seleção
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

73
Recursividade, ordenação e
busca
Ordenação por bolhas
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

74
Recursividade, ordenação e
busca
Busca
Verifica se um elemento com determinado valor
se encontra dentro de um vetor.
O fato de o vetor estar ordenado ajuda
bastante, e reduz o tempo de busca.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

75
Recursividade, ordenação e
busca
O algoritmo de busca percorre o vetor até que
uma das condições abaixo aconteça:
◦ Encontrar o fim do vetor (ou seja, a posição n) sem
ter encontrado x.
◦ Encontrar x em uma posição qualquer do vetor
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

(V[i]=x, para algum i).


◦ Encontrar um elemento V[i] > x, o que significa que
x não pode mais ser encontrado no vetor, uma vez
que x < V[i] (vetor ordernado)

76
Recursividade, ordenação e
busca
Pode ser:
◦ Sequencial
◦ Binária
Exemplo de busca sequencial (pseudo-código):
BUSCA(x, V[0..n-1]) :
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

i ← 0;
enquanto i ≤ n-1 e V[i] ≠ x:
i←i+1
se i > n-1:
escreva NÃO ACHOU
senão:
escreva ACHOU

77
Ferramentas de programação
aplicadas à engenharia
Alguns exemplos:
Matlab
Octave
Scilab
C++
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Mathematica
Etc.

78
Apêndice A – operadores em
Python
Operadores aritméticos básicos em Python
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

79
Apêndice A – operadores em
Python
Precedência de operadores aritméticos em
Python
Operador Descrição
() Parênteses
** Exponenciação
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

*, /, //, % Multiplicação, divisão,


divisão inteira, módulo
+, - Soma e subtração

80
Apêndice A – operadores em
Python
Operadores relacionais em Python
Operador Descrição
== Igual a
> Maior que
< Menor que
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

>= Maior ou igual a


<= Menor ou igual a
!= Diferente de

81
Apêndice A – operadores em
Python
Operadores lógicos em Python: são usados para
representar situações lógicas que não podem ser
representadas por operadores aritméticos:
◦ OR (disjunção) – resulta em valor verdadeiro (TRUE)
quando alguma das condições (operandos) da expressão
lógica for verdadeira;
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

◦ AND (conjunção) – resulta em valor verdadeiro (TRUE)


quanto todas as condições (operandos) da expressão
lógica for verdadeira;
◦ NOT (negação) – inverte o resultado de uma expressão
ou condição lógica (operando) de verdadeira (TRUE) para
falsa (FALSE), ou vice-versa.

82
Apêndice B – algumas funções em
Python de bibliotecas importadas
import os – importa biblioteca com funções do sistema operacional em
uso. Exemplo de uso: os.system(‘cls’) e os.system(‘clear’) para limpar
a tela do terminal no windows e linux, respectivamente.
import math – importa biblioteca com funções matemáticas tais como
sqrt (raiz quadrada) e o número pi (π). Exemplo de uso: math.pi retorna
o número π;; math.sqrt (4) retorna a raiz quadrada de 4.
import random – importa biblioteca com funções de geração de
números, tais como randint para números aleatórios. Exemplo de uso:
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

random.randint (1,6) gera um número aleatório entre 1 e 6.


from os import system – importa apenas a função system da
biblioteca os. Neste caso, system pode ser usada diretamente sem os:
system(‘cls’)
from math import sqrt – como acima, importa apenas a função sqrt de
math. Neste caso, também pode ser usada diretamente sem math.
from random import randint – como acima, randint pode ser usada
neste caso diretamente, sem random.
83
Apêndice C – algumas funções
embutidas úteis em Python
count – conta o número de ocorrências de um determinado caractere
(no string) ou número de ocorrências de um determinado elemento em
uma lista. Exemplo de uso: para o string nome=‘acaiaca’,
nome.count(‘a’) contabiliza 4 ocorrências para a letra ‘a’.
index – identifica o índice da primeira ocorrência de um determinado
caractere em um string ou da primeira ocorrência de um determinado
elemento em uma lista. Por exemplo: para o string nome=‘acaiaca’,
nome.index(‘a’) identifica o índice 0 para a primeira ocorrência da letra
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

‘a’; e nome.index(‘i’) identifica o índice 3 para a primeira (e única, no


caso) ocorrência da letra ‘i’. Para o vetor vet=[1,2,3], vet.index(3)
identifica como 2 o índice do elemento 3.
find – funciona como o index, mas só pode ser usado para identificar a
primeira ocorrência de um determinado caractere em um string.
split – separa uma cadeia de caracteres nos espacamentos, e os elementos
gerados (palavras) são colocados dentro de uma lista (vetor), cada posição
correspondendo a cada palavra. Caso o caracter for indicado, por exemplo:
nome=‘acaiaca’, nome.split(‘i’) retorna a lista [‘aca’,‘aca’].
84
Apêndice C – algumas funções
embutidas úteis em Python
splitlines – separa uma cadeia de caracteres nos finais de linha, e os
elementos gerados (linhas) são colocados dentro de uma lista (vetor), cada
posição correspondendo a cada linha.
startswith – verifica se uma cadeia de caracteres começa com um
determinado caracter, indicado entre paratêntes. Por exemplo: para o
string nome=‘acaiaca’, nome. startswith(‘a’) retorna True; e para o
mesmo string, nome. startswith(‘e’) retorna False.
upper – transforma todas as letras minúsculas de uma cadeia de
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

caracteres em maiúsculas. Por exemplo, para o string nome=‘acaiaca’,


nome.upper() retorna ‘ACAIACA’.
lower – transforma todas as letras maiúsculas de uma cadeia de caracteres
em minúsculas. Por exemplo, para o string nome=‘ACAIACA’,
nome.lower() retorna ‘acaiaca’.
sort – ordena os elementos de uma lista. Por exemplo: para vetor de
números inteiros vet=[3,-2, 14, 4, -10, 0, 5, 8, -7], vet.sort() retorna o
vetor vet ordenado: vet=[-10, -7, -2, 0, 3, 4, 5, 8, 14].
85
Apêndice C – algumas funções
embutidas úteis em Python
len – retorna o tamanho de uma lista ou de uma cadeia de caracteres. Por
exemplo: se vet=[1,2,3,4], len(vet) retorna 4; se nome=‘acaiaca’,
len(nome) retorna 7.
replace – substitui uma determinada palavra de uma cadeia de caracteres
por outra. Por exemplo: para o string frase= ‘dia bonito’, frase.replace
(‘bonito’, ‘belo’) retorna ‘dia belo’.
title – faz com que a primeira letra de cada palavra da cadeia de
caracteres se torne maiúscula.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

capitalize – faz com que a apenas a primeira letra da primeira palavra da


cadeia de caracteres se torne maiúscula.
append – adiciona elementos a uma lista. Por exemplo: para a lista
vet=[1,2,3], vet.append(4) retorna vet=[1,2,3,4].
del – apaga um determinado elemento de um vetor. Por exemplo: para a
lista vet=[1,2,3], del (vet[1]) retorna vet=[1,3].

86
Apêndice C – algumas funções
embutidas úteis em Python
insert – insere um elemento em uma determinada posição (índice),
deslocando elementos com índices maiores para a direita. Por exemplo:
para a lista vet=[1,2,4,5], vet.insert(2,3) retorna vet=[1,2,3,4,5].
remove – procura pela primeira ocorrência de um dado elemento, que é
então removido da lista. Caso o elemento não esteja presente na lista,
uma mensagem de erro é mostrada indicando que o elemento não existe
na lista.
join – junta os elementos de uma lista em uma cadeia de caracteres. Por
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

exemplo: para a lista vet=[‘Dia’, ‘ ’, ‘bonito’], ‘’.join(vet) retorna ‘Dia


bonito’.
range(limite) – cria uma lista de números inteiros cujo primeiro valor é o
zero e o último valor é igual a uma unidade anterior ao valor definido pela
variável limite (limite-1). Por exemplo, range(10) cria uma lista cujo
primeiro valor é o número 0 e o último valor é o número 9.

87
Apêndice C – algumas funções
embutidas úteis em Python
range(valor_inicial, limite) – cria uma lista de números inteiros cujo
primeiro valor é aquele definido pela variável valor_inicial e o último valor é
igual a uma unidade anterior ao valor definido pela variável limite (limite-1).
Por exemplo, range(1, 10) cria uma lista cujo primeiro valor é o número 1
e o último valor é o número 9.
range(valor_inicial, limite, intervalo) – cria uma lista de números inteiros
cujo primeiro valor é aquele definido pela variável valor_inicial e o valor
máximo será inferior àquele definido pela variável limite, sendo que cada
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

número da lista está espaçado um do outro de acordo com o intervalo


definido pela variável intervalo.
list – cria uma lista de caracteres a partir de um string, por exemplo:
list(‘Dia’) retorna [‘D’, ‘i’, ‘a’]; a lista também pode ser criada a partir de
uma tupla: list((1,2,3)) retorna [1, 2, 3]; ou usando o comando range:
list(range(6)) retorna [0, 1, 2, 3, 4, 5].

88
Apêndice C – algumas funções
embutidas úteis em Python
isdigit – verifica se os caracteres de uma cadeia de caracteres são dígitos
(números inteiros). Se todos os caracteres corresponderem a números
inteiros, essa função retorna True. Caso contrário, retorna False.
abs – retorna o valor absoluto de um número. Por exemplo: abs(-40.25)
retorna 40.25; abs(3-10) retorna 7; e abs(5) retorna 5.
sum – soma os elementos de uma lista ou tupla.
pow – realiza a operação de exponenciação. Por exemplo: pow(2,4)
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

retorna 16; pow(2,-1) retorna 0.5; e pow(25,0.5) retorna 5.

89
Referências

Ascencio, A.F.G. e Campos, E.A.V. (2012). Fundamentos da


Programação de Computadores Algoritmos, Pascal, C/C++
(padrão ANSI) e JAVA. 3ª. edição. São Paulo: Pearson Education do
Brasil.
Borges, L.E. (2010). Python para Desenvolvedores. 2ª. edição. São Paulo:
Edição do Autor.
Cormen, T.H. et al. (2002). Algoritmos: Teoria e prática. 3ª. edição. Rio
de Janeiro: Elsevier.
JOSÉ LEONARDO FERREIRA / BCT / UFVJM

Franco, J.L. (2016). Introdução à programação com Python –


Módulo A. São Carlos: Instituto Federal Santa Catarina – IFSC (Apostila).
Labaki, J. (2011). Introdução a Python – Módulo A. Ilha Solteira:
Universidade Estadual Paulista – UNESP (Apostila).
Programming Notes for Professionals books (2018). Python notes for
professionals. Disponível em: <https://goalkicker.com>. Acesso em 17 de
julho de 2018.

90

Você também pode gostar