Aula 01 - IC

Propaganda
Aula 01 – Informações e Introdução
MC102 – Algoritmos e Programação de Computadores - Turmas GHIJ
Lucas Wanner – IC/Unicamp
[email protected]
www.lucaswanner.com/102
Equipe de Ensino
• Instrutor: Lucas Wanner
• Professor no Instituto de Computação
• Escritório: IC1 #79
• Horário de atendimento: sextas 11:00, ou agendado por email
• Email: [email protected]
• Incluir [MC102] na linha de assunto
• Web: www.lucaswanner.com
• Coordenadora: Professora Christiane N. Campos
• Email: [email protected]
2
Equipe de Ensino: Monitores
• Javier Alvaro Vargas Muñoz (PED)
• Email: [email protected]
• Roberto Hidalgo Castro (PED)
• Email: [email protected]
• Thierry Pinheiro Moreira (PED)
• Email: [email protected]
• Waldir Rodrigues de Almeida (PED)
• Email: [email protected]
• Victor Andrietta Razoli Silva (PAD)
• Email: [email protected]
3
Sobre o curso
• MC102 é um curso sobre:
• Algoritmos
• Programação de computadores
• Programa
•
•
•
•
•
•
•
•
Organização Básica de um Ambiente Computacional •
Variáveis, Constantes e Atribuições
•
Entrada e Saída de Dados
•
Expressões Aritméticas, Lógicas e Relacionais
•
Comandos Condicionais
•
Comandos de Repetição
•
Vetores e Strings
•
Matrizes
•
Funções
Escopo de Variáveis
Ponteiros e Alocação Dinâmica
Algoritmos de Ordenação
Algoritmos de Busca
Tipos Enumerados e Registros
Arquivos Textos e Binários
Recursão
4
Páginas do curso
• Turmas GHIJ
• Slides de aula
• Planilha de notas
• www.lucaswanner.com/102
• MC102 Coordenada
• Slides complementares
• Listas de Exercício
• Materiais de estudo adicional
• Informação sobre plantão de atendimento
• www.ic.unicamp.br/~mc102
• Sistema Susy
• Submissões de laboratório
• https://susy.ic.unicamp.br:9999/mc102ghij
5
Calendário
• Aulas Teóricas
• Terças e Quintas, 10:00-12:00
• Sala CB XX
• Sala definitiva será anunciada em breve
• Fique atento a emails anunciando mudanças em locais de aula
• Aulas de Laboratório
• Turma G: Quinta 14:00-16:00, Sala SI03
• Turma H: Quinta 14:00-16:00, Sala SI05
• Turma I: Quarta16:00-18:00, Sala SI04
• Turma J: Quarta16:00-18:00, Sala SI10
• Atendimento
• Diariamente: 12:00-14:00 e 18:00-19:00
6
Avaliação
• Componentes
• Duas provas teóricas
• P1 com peso 2
• P2 com peso 3
• M tarefas de laboratório
• Peso 1, 2, ou 3
• Nota zero ou dez
• Datas Importantes
• Prova 1: 27/Abril
• Prova 2: 22/Junho
• Exame: 11/Julho
• Importante: não haverá reposição de provas ou laboratórios
7
• Qualquer
implicará
0.0 (zero)
na disciplina
para todos os envolvidos.
ntativa
de fraude tentativa
implicaráde
emfraude
nota 0.0
(zero) em
na nota
disciplina
para todos
os envolvidos.
Avaliação
Exercı́cios.
página
geralde
doexercı́cios
curso, há disponibilizadas
listas de exercı́cios
disponibilizadas
como trabalho
Na página
geral do Na
curso,
há listas
como
trabalho extra-classe.
Estesextra-classe. E
serão
cobrados
não entrarão
no cômputo
da avaliação
do aluno.
exercı́cios
ãoexercı́cios
cobradosnão
e não
entrarão
no ecômputo
da avaliação
do aluno.
Os exercı́cios
não Os
terão
seus não terão
gabaritos
Se um em
aluno
tiver
dúvida em
seussua
exercı́cios,
oupode
na sua
pode (e deve) ut
bilizados.
Sedisponibilizados.
um
aluno ponderada
tiver dúvida
seus
exercı́cios,
ou na
resolução,
(e resolução,
deve) utilizar
• ML:
média
dos
laboratórios
os horários
desolucioná-la.
atendimento para solucioná-la.
ndimento
para
• MP: média ponderada das provas
Avaliação.
A média
Mserá
, antes
do exame,
será calculada
da seguinte maneira:
média
, antes
do
exame,
calculada
da seguinte
maneira:
•M
M:
média
da
disciplina
8
M=
8
0,
>
<
M=
0,
se M = 0 e ML = 0;
>
se
< MP = 0 e ML = 0; P
>
: 3MP ML , caso contrário.
3MP ML
, casoMcontrário.
P + 2ML
MP + 2ML
Note a importância de manter um bom desempenho tanto nas provas quanto nos laboratórios. Caso o a
ância de
um bom
desempenho
tanto
nas provas
quanto M
nosno
laboratórios. [2.5,
Caso o aluno
E:manter
nota
exame,
por
alunos
com média
tenha• média
2.5no
M
< 5.0, feito
ele poderá
fazer o exame
final. Seja
E a intervalo
nota obtida pelo5)
aluno no exame. A
 M < 5.0, ele poderá fazer o exame final. Seja E a nota obtida pelo aluno no exame. A nota
final,• FF:
, será
calculada
como:
média
final
ulada como:
8
⇢
8
⇢
M +E
>
>
M
+
E
>
min
5.0,
, se 2.5  M < 5.0 e o aluno tenha realizado o exame;
<
>
, se 2.5  M
< min 5.0,
2 < 5.0 e o aluno tenha realizado o exame;
F 2=
=
>
>
>
:
>
M,
caso contrário.
:
M,
caso contrário.
O aluno estará aprovado, caso sua nota final F seja maior ou igual a 5.0; e estará reprovado, caso contrári
aprovado, caso sua nota final F seja maior ou igual a 5.0; e estará reprovado, caso contrário.
8
>
:
Avaliação: como ir bem neste curso
•
•
•
•
•
•
•
•
•
•
•
Fazer todos os laboratórios
Resolver e implementar as listas de exercício
Comparecer às aulas de laboratório e resolver os problemas
Assistir às aulas
Resolver e implementar as listas de exercício
Resolver e implementar as listas de exercício
Resolver e implementar as listas de exercício
Resolver e implementar as listas de exercício
Resolver e implementar as listas de exercício
Resolver e implementar as listas de exercício
Resolver e implementar as listas de exercício
9
Integridade Acadêmica
• Toda e qualquer violação de integridade acadêmica será punida até o limite
da autoridade do professor, incluindo nota zero na média final da disciplina,
sem prejuízo de outras sanções
• Exemplos
• Cola em prova
• Enviar ou mostrar trechos de código para um colega
• Copiar ou receber um laboratório (mesmo que apenas trechos)
• Nota zero na disciplina para todos os envolvidos
• O sistema de submissões detecta fraudes automaticamente
• Excelente precisão
• Todas as respostas, todos os alunos, todas as turmas
10
Bibliografia
• Não será seguido um livro texto
• Referências estão disponíveis no PDD
• Slides, laboratórios, e listas de exercício serão as referências principais
11
Dúvidas?
12
Introdução: Algoritmos
Um algoritmo é uma sequência finita de
instruções bem definidas e não ambíguas
para a resolução de um problema
13
Algoritmo
14
Algoritmos
• Receita metódica
• Passo inicial
• Passo final
• Sequência de passos: após executar cada instrução, estabelece
claramente qual é a próxima
• Entrada
• Duas fatias de pão, manteiga de amendoim
• Saída
• Sanduíche
• Objetos de apoio
• Faca, pai sem noção
• Exemplos de objetos de entrada, saída, e apoio em um computador?
15
Algoritmos
• Cada instrução é elementar e precisa
• Abrir a jarra de manteiga de amendoim é elementar e preciso
• Multiplicar dois números é elementar e preciso
• Imprimir um resultado é elementar e preciso
• Espalhar um pouco de manteiga não é preciso
• Prever o aumento do IBOVESPA no próximo mês não é elementar
16
Algoritmos
• Receita
• Texto finito com instruções
• Especificada de diversas formas, inclusive em português
• Independente de configuração de máquina e sistema operacional
• Ao executar:
• Partindo de entradas válidas, deve sempre terminar
• Partindo de entradas não-válidas, pode produzir lixo, ou mesmo não
terminar
• Parte difícil de garantir
17
Algoritmos
• Exemplo de algoritmo básico
• Como calcular a multiplicação de dois números inteiros positivos
quaisquer, usando apenas lápis, papel e uma tabuada?
• Relembrando: características de um algoritmo
1. Texto finito
2. Sequência de instruções elementares e precisas
3. Sequência metódica
• Entrada e saída
• Este passo, depois aquele passo
4. Deve produzir saída válida para entradas válidas
18
Multiplicação
23958233
×
5830
———————————————
00000000 (
71874699 (
191665864
(
+ 119791165
(
———————————————
139676498390 (
=
=
=
=
23,958,233
23,958,233
23,958,233
23,958,233
×
0)
×
30)
×
800)
× 5,000)
= 139,676,498,390
)
19
Corretude de algoritmos
• Como determinar se um algoritmo soluciona corretamente um problema?
• Provar um teorema (como em matemática) mostrando que o algoritmo é
correto.
• Dificuldades
• Precisão e rigor ao descrever a execução do algoritmo
• Especificação formal dos dados de entrada e saída
• Testar para todas as entradas
• Impossível para muitos problemas
• Neste curso: conjuntos de testes
• Passar em todos os testes não é prova de corretude!
20
Existem algoritmos para todos os problemas?
• Dado um problema P, sempre haverá um algoritmo que resolva P
corretamente?
• Premissa:
• P deve ser um problema prático, fácil de enunciar
• Exemplos:
• Ordenar um conjunto de números inteiros
• Calcular produto de matrizes
• Encontrar umx namoradx
• Requisito:
• Um algoritmo que resolva P deve funcionar corretamente em todas as
(infinitas) entradas de P:
• todos os conjuntos de inteiros quaisquer
• quaisquer duas matrizes de quaisquer dimensões compatíveis entre si
21
Existem algoritmos para todos os problemas?
• Para certos problemas, não existem algoritmos capazes de resolve-los
corretamente
• Independente de tecnologia
• Processadores com um milhão de cores
• 8TB de memória RAM
• Programador que tirou nota 10 em MC102
• Todos os datacenters do Google rodando até o final do universo
• Nota
• Existem soluções para todos os problemas de laboratório deste curso!
22
Problemas indecidíveis (insolúveis) : exemplo
• Dado um conjunto finito T de ladrilhos quadrados:
• Problema: podemos ladrilhar qualquer grade quadrada com ladrilhos de tipo
T, casando as cores das faces que se tocam?
• Resposta: SIM, ou NÃO
• Pode-se usar quantos ladrilhos quiser, de cada tipo
• Os ladrilhos não podem ser girados
23
Ladrilhos de Wang
SIM!
consegue para toda
região.
24
Ladrilhos de Wang
NÃO!
todas as outras
possibilidades
falham nessa
região do
plano.
• Nenhum computador jamais vai conseguir resolver esse problema
• Pode ser demonstrado matematicamente
25
Curiosidade: Puzzle Eternity II
• Ladrilhar 256 posições
• Peças podem ser giradas
• Prêmio de $2M
• Encerrado em 2011 sem
vencedores
• Complexidade
• 256! × 4256 configurações
• Aproximadamente 1.15 × 10661
• Uma configuração a cada ns
• 3.6 x 10644 anos
• Universo estará basicamente
vazio em 10100 anos
26
Complexidade de Algoritmos
• Mesmo que exista um algoritmo A para resolver um problema, não há
garantia que o algoritmo seja útil para qualquer versão (entrada) do problema
• Ao executar sobre a entrada E, o algoritmo A pode precisar de um tempo
muito longo (anos, séculos, milhões de séculos, ...)
• Ao executar sobre a entrada E, o algoritmo A pode precisar de um muita
memória (vários GBs, muitos milhões de GBs, ...)
• Podem existir algoritmos mais eficientes para resolver o problema
• Para alguns problemas, podem não existir um algoritmo mais eficiente
• Provável matematicamente
• Problema computável, mas intratável
27
Complexidade de Algoritmos
• Medidas de eficiência dependem do tamanho da entrada
• Exemplo, ordenar uma lista com 10, 100, ou 1000 números
• Notação Big O
• n: é o tamanho de uma entrada válida.
• O(n): quantos passos, no máximo, o algoritmo executa com entradas de
tamanho n.
• Tempos de execução, de pior caso:
• Polinomiais: resultam em algoritmos eficientes
• Exponenciais: resultam em algoritmos não eficientes
28
Complexidade de Algoritmos
• Tempo de execução, com um milhão de passos por segundo:
n
O(n)
10
20
50
100
200
n^2
0,1 ms
0,4ms
2,5ms
10ms
40s
n^5
0,1s
3,2s
5,2m
2,8h
3,7dias
2^n
1ms
1s
35,7anos
séculos
400 trilhões
séculos
45 dígitos
n^n
2,8s
3,3 trilhões
anos
séculos
70 dígitos
séculos
185 dígitos
séculos
445 dígitos
29
Problemas tratáveis e intratáveis
• Problemas tratáveis: têm algoritmos polinomiais
• Problemas intratáveis: não têm algoritmos polinomiais
• Para alguns problemas, não sabemos se são tratáveis ou intratáveis
• Questão aberta de Ciência da Computação
• Millenium prize ($1M)
• Exemplo: Problema do caixeiro viajante
30
Problema do Caixeiro Viajante
• Dado:
• mapa de cidades, com custo de viagem entre cada par de cidades;
• cidade de início, I, cidade de término, F;
• um valor K.
• Problema:
• existe rota, de I até F, visitando todas as cidades exatamente uma vez,
com custo no máximo K?
31
Problema do Caixeiro Viajante
• Entrada
O valor máximo do
percurso: 29
6
3
I
4
10
9
8
10
F
4
3
7
2
9
5
7
4
Existe um percurso?
SIM / NÃO
32
Problema do Caixeiro Viajante
6
6
3
I
3
4
10
9
8
I
10
4
F
3
7
2
10
3
F
9
5
2
7
4
K=29
4
3+6+10+4+2+3 = 28
SIM
33
Problema do Caixeiro Viajante
6
3
I
4
10
9
8
I
10
4
F
3
7
2
???
F
9
5
7
4
K=25
Com esse custo não é possível!
NÃO
34
Problema do Caixeiro Viajante
• Algoritmo para o problema do caixeiro viajante
• Partindo da posição I
• Tente todas as possibilidades que fiquem dentro do custo K
• Se achar um caminho até F, responda SIM
• Se não achar, responda NÃO
• Número de possibilidades é finito
• Algoritmo corretamente resolve o problema
• Número de possibilidades é muito grande
• Tempo de execução é exponencial no número de cidades
• Não sabemos se existe um algoritmo mais eficiente (polinomial)
35
Algoritmos e Programação de Computadores
• Este é um curso sobre resolução de problemas
• Quebrar problemas cada vez mais complexos em uma sequência de
passos elementares e precisos para execução por um computador
• Por que aprender a programar?
• Neste curso vocês aprenderão o básico para se criar programas.
• Exemplos de programas: Chrome, Pokemon Go, MatLab, Spotify.
• Eu não sou da computação! Por que programar?
• Porque é legal!
• Porque pode ser lucrativo!
36
Video
37
Por que aprender a programar?
• Eu sou das engenharias! Alguns exemplos:
• Como engenheiro você deverá ser capaz de automatizar algum processo.
• Você poderá criar programas para gerenciar e automatizar algum processo
que hoje é manual.
• Como engenheiro você deverá ser capaz de desenvolver novas ferramentas
ou protótipos.
• Para criar ferramentas/protótipos você deverá fazer simulações
computacionais para a realização de testes preliminares.
• Você poderá enxergar situações onde uma solução computacional pode
trazer benefício.
• Mesmo que você não implemente (programe) a solução você poderá
propô-la e será capaz de conversar com o pessoal de TI para
implementar a solução.
38
Por que aprender a programar?
• Eu sou das áreas científicas! Matemática, Física, Química etc. Exemplos:
• Como cientistas vocês devem propor uma hipótese e testá-la.
• Em vários casos onde os sistemas podem ser modelados
matematicamente, são criados programas que fazem a simulação do
sistema para verificação de uma hipótese.
• Você deverá resolver sistemas complexos de equações que não
necessariamente podem ser resolvidos por softwares padrões
• Vocês deverão implementar seus próprios resolvedores.
• Simulações.
• Muitos dos modelos propostos para explicar algum fenômeno são
simulados computacionalmente.
39
O que esperar deste curso
• Vocês aprenderão o básico para desenvolver programas.
• Utilizaremos a linguagem C (versão ANSI)
• Vocês NÃO vão aprender a usar programas neste curso (como office, etc).
• Vocês VÃO ter porém, uma boa noção de como criar programas como o
office, etc.
40
O que será necessário
• Você deverá ter acesso a um computador.
• Para criar um programa, utilizamos um editor de texto (para escrever o código
do programa) e um compilador.
• O compilador transforma o código em um programa executável.
• Se você usa Linux ou OS X, você poderá utilizar qualquer editor simples
como emacs, kyle, Atom, etc.
• Será preciso instalar o compilador gcc.
• Na maioria dos laboratórios existe o CodeBlocks.
• Você pode baixa-lo do site http://www.codeblocks.org/
• Este programa já tem integrado um editor, um compilador, um depurador,
além de outras utilidades.
41
O que é um computador?
• Computador: o que computa, calculador, calculista.
(dicionário Houaiss).
• Um computador é uma máquina que, a partir de uma
entrada, realiza um número muito grande de cálculos
matemáticos e lógicos, gerando uma saída.
42
Calculadoras vs. computadores
43
Hardware e dispositivos
• Normalmente chamamos de
Hardware todos os dispositivos
físicos que compõem um
computador.
• Temos por exemplo: CPU, Disco
Rígido, Memória, etc.
• Estes dispositivos seguem uma
organização básica como na
figura (Arq. de Von Neumann).
44
Hardware e dispositivos
• Todo o hardware opera com sinais digitais: sem energia e
com energia. Normalmente usamos valores 0 e 1 para
representar isto.
• Chamamos estes sinais de Bit Valores 0 ou 1.
• Chamamos de Byte um agrupamento de 8 bits.
• Todas as informações armazenadas no computador são
representadas por números 0s e 1s.
• Informações como letras, símbolos, imagens,
programas são todas vários 0s e 1s.
45
Software
• São os programas que executam tarefas utilizando o hardware de um
computador.
• São compostos por um conjunto de instruções que operam o hardware.
• Temos abaixo, por exemplo, três instruções para um computador de 32 bits.
Um software é composto por milhares de instruções deste tipo.
0100 0010 0011 0101 0101 0100 0011 0110
0100 1110 1100 1100 1001 0110 0110 1000
0000 0101 1111 1110 1101 0011 0000 1100
46
Organização de um ambiente computacional
• Um ambiente computacional é organizado como uma hierarquia de funções,
onde cada uma é responsável por uma tarefa específica.
Programas de Aplicação
Compiladores
Sistema Operacional
Hardware
47
Organização de um ambiente computacional
• Como usuários, interagimos com os programas de aplicação.
• Neste curso iremos descer nesta hierarquia, para construirmos novos
programas de aplicação.
• Para construir novos programas podemos escrever diretamente códigos
digitais que serão executados por um computador.
• Uma maneira mais simples é usar um compilador para uma linguagem de
programação específica.
Programas de Aplicação
Compiladores
Sistema Operacional
Hardware
48
Organização de um ambiente computacional
• Uma linguagem de programação é um conjunto de comandos que são mais
próximos da linguagem humana do que os sinais digitais.
• Neste curso estamos interessados no estudo da linguagem de programação C.
• Um compilador é um programa que lê um código de uma linguagem de
programação e o transforma em um programa executável.
Programas de Aplicação
Compiladores
Sistema Operacional
Hardware
49
Organização de um ambiente computacional
• Os programas possuem instruções que são executadas no hardware.
• O acesso ao hardware, como disco rígido, memória, processador, é controlado
por um software especial conhecido como sistema operacional.
• O sistema operacional é o responsável pelo controle do hardware, incluindo
segurança, gerenciamento de memória, dentre outros.
• Exemplos de sistema operacionais: Windows, OS X, Linux, Android, iOS.
Programas de Aplicação
Compiladores
Sistema Operacional
Hardware
50
De algoritmos a programas
• Neste curso vamos aprender a criar algoritmos simples.
• Usaremos a linguagem C para descrever os algoritmos.
• Após compilar os programas escritos em C, teremos um programa para
realizar a tarefa especificada.
51
Programação de hardware
• Os primórdios da programação: programação em código ou binário (0s e 1s).
52
Programação de hardware
• Uma melhoria: A Linguagem Assembly
• Cria-se uma linguagem de baixo nível (Linguagem Assembly) para representar
as instruções em código binário.
• Um programa, chamado montador ou assembler, faz a transformação em
código binário.
loop:
add c, a, b
add i, i, 1
bnq i, 10, loop
0100 0010 0011 0101 0101 0100 0011 0110
0110 0110 0111 0101 0101 0100 0011 0110
1111 0000 0111 0101 0101 0100 0011 0110
53
Programação de hardware
• Criação de linguagens de alto nível e compiladores.
• Mais distantes da máquina e mais próximas de linguagens naturais (inglês,
português, etc.).
• Mesmo mais compreensíveis, elas não são ambíguas.
• Um compilador as transforma em código executável.
• Exemplos de linguagens
• C
• Python
• Java
54
A linguagem C
• Primeiro programa em C
• Um programa em C é um arquivo texto, contendo declarações e operações
da linguagem.
• Isto é chamado de código fonte.
#include <stdio.h>
int main() {
printf("Hello, world!\n");
}
55
Como executar este programa
• Para executar um programa a partir do seu código fonte é necessário
compilá-lo, gerando código binário ou executável.
• Este pode ser executado como qualquer outro programa de aplicação.
• Em um terminal é comum executar o programa da seguinte forma
# gcc -pedantic -ansi -std=c99 -Werror hello.c -o hello
# ./hello
Hello, world!
56
Erros de compilação
• Caso o programa não esteja de acordo com as regras da linguagem, erros de
compilação ocorrerão.
• Ler e entender estes erros é muito importante.
#include <stdio.h>
int main() {
printf("Hello, world!\n");
# gcc -pedantic -ansi -std=c99 -Werror hello.c -o hello
hello.c:4:29: error: expected '}’
printf("Hello, world!\n");
^
hello.c:3:12: note: to match this '{’
int main() {
^1 error generated.
57
Erros de execução
• Acontecem quando o comportamento do programa diverge do esperado e
podem acontecer mesmo quando o programa compila corretamente.
#include <stdio.h>
int main() {
printf("Hello, world! $#%#@%\n");
}
# gcc -pedantic -ansi -std=c99 -Werror hello.c -o hello
# ./hello
Hello, world! $#%#@%
58
Depurador
• Ferramenta que executa um programa passo a passo.
• Ajuda a encontrar erros de execução (bugs).
• Exemplo: gdb
59
Resumo
• Algoritmos
• Texto finito
• Sequência de instruções elementares e precisas
• Entrada e saída
• Deve produzir saída válida para entradas válidas
• Classes de problemas
• Decidíveis e indecidíveis
• Tratáveis e intratáveis
• Computador: hardware e organização
• Programação e Linguagem C
• Na próxima aula: primeiros passos com programação em C
60
Referências
• Zanoni Dias, Slides MC102 2016-1
• Eduardo Xavier, Slides MC102
• Arnaldo Moura, Introdução a Algoritmos, 2009
61
Download