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