Avaliação • A classificação final traduz-se numa escala de 0 (zero) a 20 (vinte) valores, resultante da média ponderada das Componentes de Avaliação, com base nas seguintes percentagens: • Prática (40%) – Três trabalhos práticos + Discussão; – Grupos de 2/3 alunos; – Classificação mínima de 10 valores. • Téorica (60%) – 3/4 mini testes individuais, sem consulta (20%) • Cada um deles a efectuar na semana de entrega de cada trabalho ou na semana seguinte à entrega. • Classificação mínima de 8 na média dos 3 melhores. – Teste final, realizado nas datas de exame (40%) • Permitida 1 folha A4 para consulta • Classificação mínima de 10 valores. 01-10-2015 Programação I 1 Bibliografia The C Programming Language Brian W. Kernighan, Dennis M. Ritchie C Programming: A Modern Approach, 2nd Edition K. N King 01-10-2015 Fundamental da Programação em C Isabel Sampaio, Alberto Sampaio 2 Algoritmos • Informalmente, podemos dizer que algoritmo é uma sequência de instruções (acções) que especifica a forma de executar determinada tarefa. Muitas vezes a tarefa consiste na processamento de um conjunto de valores de entrada (o input), resultando na geração de um conjunto de valores de saída (o output). Input • Algoritmo Output Um exemplo simples é o da receita de um bolo: nesta caso o cozinheiro (o executor) executa a receita (algoritmo) transformando os ingredientes (input) , através de uma sequência bem definida de passos, no resultado final, o bolo (output). 01-10-2015 Programação I 3 Linguagens naturais versus Linguagens de Programação • A linguagem em que o algoritmo é expresso tem naturalmente que ser entendida pelo executor. No exemplo anterior a receita pode ser expressa em português ou noutra lingua que o cozinheiro (o executor) entenda. • O problema da descrição do algoritmo em linguagem natural é que, sendo uma linguagem sujeita a ambiguidades, não se presta à especificação de algoritmos que sejam executados por máquinas (computadores). • Nesse caso é preciso especificar o algoritmo nas chamadas linguagens de programação, que são linguagens formais onde, por desenho, quer a gramática quer a semântica (significado) das frases têm sempre uma única possibilidade de interpretação, ou seja, não contêm ambiguidades. • Um algoritmo expresso numa linguagem de programação designa-se por programa. Ao longo do semestre iremos desenvolver a escrita de programas em linguagem C. 01-10-2015 Programação I 4 Linguagens intermédias de descrição de algoritmos • Por vezes é util descrever um algoritmo numa linguagem mais precisa que a linguagem natural, mas menos exigente e mais sucinta que as linguagens de programação. Dessa forma contrói-se uma especificação rápida do algoritmo, legível por humanos e que facilmente pode ser convertida num programa. São exemplos de linguagens adequadas a este propósito os fluxogramas e o pseudo-código, apresentados a seguir. 01-10-2015 5 Especificação de algoritmos ( fluxogramas) • • Um fluxograma é uma representação gráfica de um algoritmo através de figuras que representam passos do algoritmo ligadas por setas que definem a ordem de execução. Exemplo de fluxograma (sensor de temperatura com alarme): Legenda representa o início do processo Início representa uma acção individual definir máximo ler temperatura temperatura > maximo representa uma decisão accionar alarme final do processo Fim 01-10-2015 Programação I 6 Especificação de algoritmos (pseudo-código) • Pseudo-código é uma representação textual de um algoritmo com uma estrutura baseada na indentação do texto. São usados os seguintes blocos de decisão: Instruções a executar se a condição for verdadeira se <condição> <instruções> senão <instruções> enquanto <condição> <instruções> repetir <instruções> até <condição> Exemplo para o sensor de temperatura com alarme Instruções a executar se a condição for falsa enquanto a condição for verdadeira executar Instruções inicio ler máximo de temperatura admissível repetir ler temperatura actual até temperatura actual > máximo accionar alarme fim Instruções a executar até a condição ser verdadeira Onde se refere instruções quer-se dizer acções simples ou outras decisões 01-10-2015 Programação I 7 Especificação de algoritmos – fluxogramas e pseudo-código Considere 3 lápis de dimensões distintas. Escreva um algoritmo para determinar o maior dos lápis, considerando a restrição de que apenas se sabe comparar dois lápis de cada vez. Sejam os lápis la (lápis azul), lv (lápis vermelho) e ll (lápis laranja). A seguir apresentam-se uma solução na forma de fluxograma e em pseudocódigo. fluxograma pseudo código Início V V la > ll mostrar lápis azul la > lv F F F lv > ll mostrar lápis laranja V mostrar lápis vermelho Fim 01-10-2015 Programação I se la > lv se la > ll mostrar lápis azul senão mostrar lápis laranja senão se lv > ll mostrar lápis verde. senão mostrar lápis laranja 8 Especificação de algoritmos – fluxogramas e pseudo-código • E se forem muitos lápis? ... ... 1 2 3 4 5 6 7 8 N Considerem-se os lápis arrumados de tal forma que é possivel identificar cada um pela sua posição i, de 1 a N, sendo N o número de lápis. Podemos escrever lapis(i) para indicar o lápis na posição i. No fluxograma e no pseudo-código i indica a posição corrente e pmaior a posição do lápis maior. Considera-se à partida o lápis maior como sendo o primeiro (na posição 1) Início i=2; pmaior 1 ii+1 i >N V mostrar lapis(pmaior) F lapis(i) > lapis(pmaior) F Início i2 pmaior 1 enquanto i <= N se lapis(i) > lapis(pmaior) pmaior i ii+1 mostrar lapis(pmaior) Fim V pmaior i Fim 01-10-2015 Programação I 9 Algoritmos funcionalmente equivalentes Alternativa 1 Início se la > lv se la > ll mostrar lápis azul senão mostrar lápis laranja senão se lv > ll mostrar lápis verde. senão mostrar lápis laranja fim Alternativa 2 Início se la > lv e la > ll mostrar lápis azul senão se lv > ll mostrar lápis verde senão mostrar lápis laranja fim Alternativa 3 Início maior la se lv > maior maior lv se ll > maior maior ll mostrar maior fim Qual o mais eficiente? 01-10-2015 Programação I 10 Arquitetura (muito) simplificada de um computador RAM CPU Programas em execução + dados GPU Registos Unidade Aritmética e lógica Unidade de Controlo BUS de Sistema Controlador IDE Controlador USB BUS USB BUS IDE Disco Magnético 01-10-2015 Pen USB Rato Disco externo CD Programação I 11 Código máquina • • • Na RAM o código dos programas (bem como os dados) está presente em binário (uns e zeros), no chamado código máquina O código máquina tem uma representação em texto, útil para humanos passando a designarse por código assembly ou simplesmente assembly. Exemplo de um hipotético código assembly para determinar o maior de dois números: Mov Mov Cmp JG Mov End: Mov • num1, R1 num2, R2 R1, R1 End R2, R1 R1, maior É necessário traduzir os programas escritos em linguagens de alto nível, como a linguagem C, para código máquina. Os programas que cumprem essa tarefa denominam-se compiladores. Programa em linguagem C 01-10-2015 Compilador de C Programação I Programa em código máquina (executável) 12