Agenda
Engenharia de Software e Solução de Problemas
Engenheiros de software projetam e criam sistemas e aplicativos de computador para solucionar problemas do mundo real.
Os trabalhos em engenharia de software hoje requerem
excelentes habilidades de resolução de problemas.
O pensamento computacional é uma estratégia popular usada pelos engenheiros de software para solucionar problemas de maneira estruturada e sistemática, uma vez que envolve expressar problemas e suas soluções de uma maneira que um computador também possa executar.
Solução de Problemas
Fonte: asq.org
Solução de Problemas
Solução de Problemas
avaliar(retrospectiva)o plano.
Entender o problema:
Indicar quais figuras (a ou b) podem ser construídas com o conjunto de formas original (OSS)
Planejar caminhos desolução:
Verificar se cada formado OSS está contida nas formas das possíveis respostas
Verificar se cada formadas respostas está contida no conjunto do OSS
Implementar:
Solução 1: Comparar OSS com a, Comparar OSS com b. Resultado: A respostaé a. Solução 2: Comparar a com OSS, Comparar b com OSS. Resultado: A respostaé a.
Avaliar:
Avaliar ambas as soluções.
Pensamento Computacional
problemas menores e mais simples (dividir para
conquistar);
resolver problemas.
Pensamento Computacional
representações de dados apropriadas e design de algoritmos.
sistemáticos (verificação) antes de generalizar para outros problemas.
Pensamento Computacional
Pensamento Computacional
passos e voltas da Salsa
Pensamento Computacional
x2
x4
x2
Pensamento Computacional
Especificação do Problema:
Como reproduzir as sequências principais de
passos e voltas na salsa.
Representação Algorítmica:
Pensamento Computacional
a passo para solucionar problemas.
Fazer um bolo:
Pensamento Computacional
Pensamento Computacional
Algoritmos e Computação
Fluxograma
Pseudocódigo
Algoritmo
Algorithm to find the highest of 3 entered numbers
Step 0:
start
Step 1:
get numbers a, b, and c
Step 2:
if a is higher than b then go to step
3, else go to step 4
Step 3:
compare a and c and print highest then
go to step 5
Step 4:
compare b and c and print highest then go to step 5
Step 5:
end
Representação
informale narrativa de
um algoritmo. Mais
próxima de um “códigofake”.
Representação gráficade um algorítmo
Passos, regras e instruçõespara
resolver um problema.
Algoritmos e Computação
Pseudocódigo
Representação narrativa de um algoritmo.
Algoritmos e Computação
algoritmo a outros devido à sua natureza visual.
Fluxograma
Representação gráficade um algoritmo
Algoritmos e Computação
Flowchart
Representação Gráficade um algoritmo
Símbolos Comuns para Fluxograma
Algoritmos e Computação
Ok... Eu tenho uma solução (algoritmo) produzida usando o pensamento computacional, como eu uso isso com um computador?
Problema
Solucionar com Pensamento
Computacional
Algoritmo
?
Computador
Para aproveitar o que a computação torna possível, precisamos aprender como formular e
estruturar o que queremos que o computador faça.
—Steve Wolfram, cientista da computação, designer-chefe do Mathematica e Wolfram Alpha.
Algoritmos e Computação
computacional
Fonte: Digital Promise
Problema
Solução com pensamento
Algoritmo
Programação
Computador
App
Algoritmos e Computação
?
mecanizar qualquer atividade intelectual que possamos imaginar.
de informação (sequência de etapas).
Fonte: Introductionto Computing: Explorations in Language, Logic, and Machines
Algoritmos e Computação
de informação) em que cada etapa pode ser executada sem qualquer pensamento.
coisa que afete o mundo fora do computador, etc.
Computador
Entrada
Saída
Algoritmos e Computação
Algoritmos e Computação
Algoritmos e Computação
Stored
Program
Arquitetura de Von Neumann
(1945) EDVAC + UNIVAC
Fonte: https://www.computerscience.gcse.guru/theory/von-neumann-architecture
Algoritmos e Computação
source: carnegie
Algoritmos e Computação
Conforme mencionado anteriormente, um computador genérico tem uma arquitetura que permite processar entrada (digitada por dispositivos de entrada) e produzir saída (exibida em dispositivos de saída). A arquitetura inclui memória e CPU.
CPU
Entrada
Saída
Memoria
Algoritmos e Computação
CPU (Processador)
Memória
Unidade de
Controle
ULA
Registradores
Programa
Salvo
Dispositivos
de Entrada
Dispositivos
de Saída
Via de transferênciade dados
RAM
Externa
Algoritmos e Computação
temporário (registradores) para armazenar seus dados.
CPU (Processador)
UC
Unidade Lógico Aritmética
Ciclos de Clock
Registradores
armazenamento
ops
Algoritmos e Computação
CPU (Processador)
Unidade de Controle
Unidade Lógico Aritmética
Registradores
Ciclos de Clock
999
998
997
3
2
1
0
RAM |
123 |
|
… |
|
|
|
Endereço
Conteúdos
ops
armazenamento
Algoritmos e Computação
Memória |
instrução 1 |
instrução 2 |
… |
|
instrução n |
|
UC
Um Programa
1
Algoritmos e Computação
ULA
Memória
instrução 1
instrução 2
…
instrução n
1100 1000
LOAD_A 8
Exemplo de instrução em
binário
OP
Endereço de Memória
UC
Um programa
Orquestrados
ULA
Cada instrução define um códigode operação (OP) e um
endereço de memóriaou registro.
1
2
Algoritmos e Computação
Vamos supor que queremos somar dois números usando a CPU.
As instruções para este programa (programa de SOMA) serão carregadas da RAM
via UC.
endereço 8 (suponha que seja 10) no registro A da CPU.
Memória |
LOAD_A 8 |
LOAD_B 2 |
ADD B A |
STORE_A |
… |
10 |
2 |
Programa SOMA
1
Endereço
8
9
10
UC
Registradores
A = 10
2
Conteúdodo
endereço 8
3
Algoritmos e Computação
Então, a UC buscará a próxima instrução LOAD_B 9, que definirá o valor da
memória no endereço 9 (supondo que seja 2) no registrador B da CPU.
Memória |
LOAD_A 8 |
LOAD_B 2 |
ADD B A |
STORE_A |
… |
10 |
2 |
Programa
SOMA
4
Endereço
8
9
10
UC
Registradores
A = 10
5
conteúdodo
endereço 9
6
B = 2
Algoritmos e Computação
(cont.) Adicionar 2 números via CPU
Então, a UC irá buscar a próxima instrução ADD B A, isso irá adicionar o valor do registro A com o valor do registro B via a ULA e armazenar o valor de volta no registro A.
Memória |
LOAD_A 8 |
LOAD_B 2 |
ADD B A |
STORE_A 10 |
… |
10 |
2 |
Programa
SOMA
7
Endereço
8
9
10
UC
Registradores
A = 10
B = 2
ULA
8
ADD B A
9
A = 12
12
10
Algoritmos e Computação
(cont.) adicionar 2 números via CPU.
Memória |
LOAD_A 8 |
LOAD_B 2 |
ADD B A |
STORE_A |
… |
10 |
2 |
12 |
11
UC
Registradores
A = 12
B = 2
Endereço
8
9
10
12
13
Programa SOMA
Programação
doloroso para fazer manualmente!
manualmente???
Fonte: Digital Promise
Problema
Solução de Problemascom
Pensamento Computacional
Algorítmo
Computador
App
Programação
LOAD_A 8
LOAD_B 2
ADD B A
STORE_A
Programação
processadores de linguagem (tradutores) para programar um computador!
Em um exemplo anterior, as instruções eram instruções em
linguagem de máquina (representação binária do OP Code).
LOAD_A 8
LOAD_B 2
ADD B A STORE_A
Processador
de Linguagem
Programação
Existem várias formas de programar um computadorusando processadores de
linguagem!
máquina.
de máquina.
(também conhecido como compilação de fonte para fonte).
Programação
de máquina.
linguagem assembly específicas para o computador.
Assembler
Código Fonte (LinguagemAssembly)
Código de Máquina (Linguagem de Máquina)
Programação
humanos.
máquina.
Fonte: https://www.cs.mtsu.edu/~xyang/2170/computerLanguages.html
Programação
Interpretador
CódigoFonte (Linguagem de alto nível
/ Scripting)
Tradução para o código binário
Linha 1
Execução
Tradução para o códigobinário
Tradução para o
códigobinário
…
Linha 2
Linha n
Execução
Execução
Programação
Programação
código de máquina.
compreensível pelo computador.
Compiler
Código Fonte (Linguagem de Alto Nível)
Códigode Máquina (Linguagem de Máquina)
Programação
podemos executar o código binário quantas vezes quisermos.
Source code
| | |
file3.cpp | Compiler | |
| ||
| ||
file1.cpp
file2.cpp
file1.o file2.o file3.o
Linker
Libraries Resources
Program
Programação
dependente de um tipo específico de computador.
o hardware e conjunto de instruções (próximo ao hardware).
Java C++ Python
Linguagem de Alto-Nível Linguagem Assembly Linguagem de Máquina Hardware
Linguagem de Baixo-nível
Linguagem de Alto-nível
Programação
Linguagem de Baixo-Nível
Linguagem de Alto-Nível
Programação
Problema
Algoritmo
Computador
App
Programação
Linguagem de Alto Nível
Solução de Problemascom
Pensamento Computacional
Programação
Algoritmo
Computador
App
Programação
High-Level
Language
Linguagens de Programação
problema ou uma tarefa usando certa linguagem de programação.
Paradigmas de
Programação
Imperativo
Procedural
Orientado a
Objetos
Processamento
Paralelo
Declarativo
Lógico
Funcional
Processamento de Banco de Dados
Linguagens de Programação
antigo, baseado na arquitetura de Von Neumann.
repetição, sequência).
Linguagens de Programação
Linguagens de Programação
Linguagens de Programação
Blocos de Fluxo de Controle
Sequencia
Seleção
Repetição
declaração 1
declaração 2
declaraçãon
declaração 1
condição
declaração 2
…
false
true
condição
Declaração
true
false
Acredite ou não, é possível resolver quase tudo utilizando esses três blocos Eles
formamo núcleo da
programação imperativa.
Linguagens de Programação
S equência
Sequência
declaração 1
declaração 2
declaraçãon
…
program
{
print “Hello”;
print “World”;
}
Sequênciade
instruções
(ações, comandos)
Seleção
(Fluxo de Controle)
Linguagens de Programação
S eleção
> ”, max)
print(“O valor é
}
else {
program { | | Seleção (Condicional) |
int max | = | 10; |
int val | = | read(“Valor”); |
if (val | > | max) { |
print(“O valor é <= ”, max)
}
}
Seleção
(Condicional)
Seleção
declaração 1
condição
declaração 2
false
true
Linguagens de Programação
Repetição
program
{
int i = 0;
int n = read(“Enter n”); while (i < n) { print(i);
i = i + 1;
}
}
Bloco de Repetição
Repetition
condição
declaração
true
false
Linguagens de Programação
program
{
function getBonus(int x, int min) { int bonusA = 10;
int bonusB = 15; if (x > min) {
return (x * bonusA);
} else {
return (x * bonusB);
};
}
int minVal = 100;
int val = read(”Enter amount”);
int res = getBonus(val, minVal);
print “Your bonus is ”, res
}
programação (paradigmaimperativo)são:
contêminformações dediferentestiposdedados;
usuários(porexemplo,via console);
Uma linguagem de programação possuiuma sintaxe específica
paracodificar comela.
Linguagens de Programação
program
{
function getBonus(int x, int min) {
int bonusA = 10;
int bonusB = 15;
if (x > min) {
return (x * bonusA);
} else {
return (x * bonusB);
};
}
int minVal = 100;
int val = read(”Enter amount”);
int res = getBonus(val, minVal);
print “Your bonus is ”, res
}
Subrotinas
(função reusável)
* Operador
Variáveis
Saída
Vai mostrar no Console
Entrada
Vai ler do console
Variáveis
Fluxo de Controle
(Seleção)
Fluxo de Controle (Sequencia)
Linguagens de Programação
Como mencionamos, para esta disciplina, nos concentraremos no paradigma imperativo. As principais linguagens deste paradigma são a programação procedural e o paradigma orientado a objetos.
Linguagens de Programação
Programação Procedural
disponíveis/compartilhados.
Paradigma Orientado a Objetos
Linguagens de Programação
program
{
let breed = “yorkie”;
let name = “niki”;
function bark(string breed,
string name) {
print(breed + “ “ +
name + “says woof!”);
}
bark(breed, name);
}
Procedural
Orientado a Objetos
program
{
class Dog {
str breed,
str name,
bark: function() { print($this.breed + “ “ +
$this.name +
“says woof!”);
};
}
let yorkie = new Dog {
breed: “yorkie”,
name: “niki”
};
yorkie.bark();
}
Classe com atributos e métodos
Objeto
Função
Dados
Compartilhados
Método do Objeto
Linguagens de Programação
Analogia e Reflexão
Linguagens de Programação
Codificar | Programar |
Codificaçãosignificaa traduçãoda linguagem natural em comandos de máquinapormeio de uma linguagem de codificação intermediária. | Programaçãosignificao processo de desenvolvimento de uma soluçãode softwarecompletamentefuncional. |
Para codificar, um editorde texto seriasuficiente. | A programaçãorequerferramentas de análise, programasde modelagem, geradoresde códigoe estruturas de teste. |
Um programadorrequerum conhecimentobásico de uma linguagem de programação, sua sintaxe e palavras-chave. | Um programadordeveser um indivíduo habilidoso com experiênciasubstancial na criação de algoritmos, modelagem de problemas, processamentode dadose gerenciamentode projetos. |
Ele segueumaabordagem de tentativae erro e não precisade preparaçõesprévias. | A programaçãosegue uma abordagem metódicae requeratençãoaos detalhes. |
A codificaçãoresultaem uma soluçãosimples ou em uma pequenaparte de um projeto. | A programação resulta em uma aplicaçãopronta para uso completo. |
Linguagens de Programação