Programação Mestrado em Matemática Financeira http://moodle.fc.ul.pt Luís Sequeira 03 de Janeiro de 2014 Bom dia! 2 Contactos......................................................... 3 Abstracção!....................................................... 4 Bibliografia........................................................ 5 Laboratório........................................................ 6 Vamos ao trabalho! 7 Programar... com classe(s)............................................. 8 Mãos na Massa!.................................................... 9 Os programas que (não) fazemos........................................ 10 Desde a fonte...................................................... 11 Desde a fonte... (cont.).............................................. 12 Hello, World!..................................................... 13 What s in a program................................................ 14 Comentários...................................................... 15 E aquelas linhas ao princípio?.......................................... 16 Torres de Hanoi 17 Hanoi!.......................................................... 18 Hanoi!!......................................................... 19 Hanoi!!!......................................................... 20 Hanoi a função.................................................. 21 Ainda Hanoi...................................................... 22 E pur... si muove!.................................................. 23 Classes, Classes! 26 Programar... com classe(s)............................................ 27 Programador-utilizador............................................... 28 TPC 1........................................................ 29 TPC 2........................................................ 30 1
Bom dia! 2 Contactos Docente: Luís Fernando Sequeira lfsequeira@fc.ul.pt 217500288 Página da cadeira: alojada no serviço moodle da FCUL: http://moodle.fc.ul.pt Acesso: com credenciais FCUL (fcnnnnn@alunos.fc.ul.pt) como guest Prog 3 Abstracção!... the only mental tool by which a very finite piece of reasoning can cover a myriad cases is called abstraction Edsjer W. Dijsktra Prog 4 Bibliografia Página da cadeira Apontamentos das aulas disponíveis em PDF Programas usados nas aulas (são para compilar e experimentar em casa!) Links instalação de software; bibliografia online TPCs Pedro Guerreiro, Programação com Classes em C++, 2 a Edição, FCA, 2003 C++ tutorial http://www.cplusplus.com/doc/tutorial/ The internet at large! Prog 5 2
Laboratório Aulas práticas:... não temos (EXCEPÇÃO: Hoje) Exercícios: são para fazer na máquina, em casa Dúvidas: pessoalmente ou por mail Não esperem uma semana Não digam só deu erro Tentem perceber a mensagem de erro Sempre que possível, enviem o vosso código Prog 6 Vamos ao trabalho! 7 Programar... com classe(s) Usaremos a linguagem C++ Criada por Bjarne Stroustrup Disponível em qualquer plataforma Utilizada por milhares de programadores Estende a linguagem C com conceitos de programação orientada por objectos objectos e classes Mãos na Massa! Aprende-se a programar... Programando! Exercícios e exemplos são para correr na máquina Software necessário gratuito indicado na página da cadeira Prog 8 Prog 9 3
Os programas que (não) fazemos Os programas que faremos Não têm uma interface gráfica Têm interacção simples Input teclado Output ecrã Ficheiros Portáveis o mesmo programa corre em qualquer plataforma (apenas recompilar) Podem ser combinados com outros (e.g. resultados importados para criar um gráfico em Excel) Desde a fonte... O C ++ é uma linguagem compilada. Prog 10 Programa (código) fonte o programa, tal como o escrevemos (e.g. hello.cpp) Programa objecto o resultado da tradução do programa fonte pelo compilador (e. g. hello.o) Programa executável resultado da ligação do programa objecto com outros objectos e libraries. Prog 11 Desde a fonte... (cont.) Programa fonte hello.cpp Compilador Programa objecto hello.o Mais objectos libraries linker Programa executável hello[.exe] g++ -c hello.cpp g++ -o hello hello.o... Prog 12 4
Como compilar Os programas em C++ que nós fazemos podem ser compilados usando uma interface gráfica ou uma interface de linha de comandos. Numa interface de linha de comandos, a compilação e ligação dos programas é geralmente feita com variantes do mesmo comando (normalmente, g++): Compilamos com g++ -c hello.cpp Ligamos com g++ -o hello hello.o Executamos com hello Num ambiente gráfico, como o Dev-C++, os comandos para compilar, ligar e executar os programas estão disponíveis através de botões, como visto na aula. Ambiente de programação integrado Prog note 1 of slide 12 Os programas podem ser escritos em qualquer editor de texto ASCII, mas é de toda a conveniência a utilização de um editor vocacionado para a programação. Melhor ainda é utilizar um ambiente de desenvolvimento integrado que inclui não só um editor de texto mas as ferramentas necessárias para compilar e executar os programas. Nesta cadeira, sugere-se a utilização de um tal ambiente Dev-C++ que é fornecido como software gratuito e que os alunos devem descarregar da internet e instalar nos seus próprios computadores. Hello, World! Como não podia deixar de ser... // o meu primeiro programa em C++ #include<iostream> #include<cstdlib> using namespace std; Prog note 2 of slide 12 int main() { } cout << "Hello, World!" << endl; system("pause"); Vamos lá ver isto em acção!!! Prog 13 5
Compilar e executar em Dev-C++ Figura 1: O botão de compilação está assinalado Figura 2: O botão de execução está assinalado Prog note 1 of slide 13 6
Compilar programas mais complexos Os programas desta primeira aula são pequenos, mas a maior parte dos programas interessantes são bastante maiores e, por várias razões que começaremos a ver na próxima aula, compõe-se geralmente de vários ficheiros diferentes. Para produzir os programas executáveis nestes casos, é necessário compilar as várias peças. Para tornar este processo automático, recorreremos ao conceito de projecto. Um projecto é um conjunto de ficheiros relacionados, os quais são necessários para construir um programa. Num ambiente de linha de comandos, cada projecto tem um ficheiro Makefile que descreve os ficheiros envolvidos, as suas interdependências e os comandos necessários para construir o executável. Num ambiente gráfico como o Dev-C++, este processo é muito facilitado, como veremos. What s in a program Um programa em C++ é constituído por uma ou mais funções. Todo o programa inclui uma (e uma só) função chamada main. A execução do programa começa no início da função main. A primeira instrução do programa hello é cout << "Hello, World!" << endl; Prog note 2 of slide 13 que tem como efeito escrever no ecrã a cadeia de caracteres Hello, World! e mudar de linha. A instrução system("pause"); evita que o programa termine imediatamente (*). * Prog 14 Estritamente falando, a instrução system("pause"); não faz parte da lógica do nosso programa. Quando um programa é executado a partir do ambiente do Dev-C++, assim que o programa termina regressamos à janela de edição e a janela de execução do programa desaparece. O efeito da instrução system("pause"); é parar o programa (escrevendo no ecrã uma mensagem explicativa), dando-nos oportunidade de ver o seu output, antes que a janela se feche. Se retirarmos esta instrução, o programa termina tão rapidamente que não chegamos a ver que ele, de facto, escreveu Hello, World. (Nota: em versões mais recentes, esta instrução já não é necessária) Prog note 1 of slide 14 7
Comentários Comentários anotações ou observações que se destinam ao leitor humano. são ignorados pelo compilador de uma linha: // comentário vai até ao fim da linha mais extensos: /* este comentário prolonga-se até aparecer o símbolo que indica o seu fim */ Prog 15 E aquelas linhas ao princípio? O programa hello.cpp começa com #include <iostream> #include <cstdlib> using namespace std; #include é uma directiva para o pré-processador para incluir o conteúdo de um ficheiro em iostream estão definidos os objectos necessários para o input e output (sem isso não poderíamos escrever no ecrã) A linha using namespace std; poderia ser omitida, mas então teríamos, e.g., de escrever std::cout << "Hello, World!"; (sobre este assunto, ver http://www.cplusplus.com/doc/tutorial/namespaces.html) Prog 16 8
Torres de Hanoi 17 Hanoi! No jogo das torres de Hanoi, pretende-se mover todos os discos do primeiro poste para o terceiro, respeitando as seguintes regras: Só se move um disco de cada vez Não se pode sobrepor um disco maior a um disco menor Hanoi!! #include <iostream> using namespace std; int main() { int n; Prog 18 } cout << "Programa Torres de Hanoi!!!" << endl; cout << " Quantos discos (1-10)? "; cin >> n; Hanoi(n,1,3); Repare-se na instrução cin >> n, que serve para aceitar um valor do teclado e guardá-lo na variável n. Temos aqui o primeiro exemplo de ABSTRACÇÃO (procedimental). O processo de resolução do problema está abstraído pela função Hanoi. Não importa como ela é programada, mas o que ela faz! Prog 19 9
ABSTRACÇÃO, ABSTRACÇÃO!!! A abstracção é ESSENCIAL em programação. Aqui estamos perante o primeiro exemplo disso. O nosso programa estará correcto, desde que a função Hanoi faça aquilo que esperamos dela, mas NÃO NOS IMPORTA como é que ela o faz. No nosso ponto de vista actual, apenas nos interessa o quê: a função deve descrever os movimentos necessários para resolver as torres de Hanoi com n discos. Claro que, para termos um programa completo e a funcionar correctamente, teremos de ter uma função Hanoi. Mas é responsabilidade de quem programar a função decidir como o faz. É perfeitamente possível até uma tal função ser programada por uma pessoa diferente da que fez o resto do programa. Hanoi!!! Prog note 1 of slide 19 Para programarmos esta função, temos de delinear uma estratégia de resolução do jogo. Como não se pode pôr um disco maior sobre um disco menor, só se pode deslocar o disco n quando A pilha 3 está vazia Os outros discos estão todos na pilha 2 Assim, a estratégia é: Mover n-1 discos da pilha 1 para a pilha 2 Mover o disco n da pilha 1 para a pilha 3 Mover n-1 discos da pilha 2 para a pilha 3 Hanoi a função Prog 20 void Hanoi( int n, int from, int to) { if (n==0) return ; else { Hanoi(n 1,from,6 from to ); Move(n,from, to ); Hanoi(n 1,6 from to, to ); } } A função Hanoi é recursiva: ela invoca-se a si mesma. Prog 21 10
Ainda Hanoi Analisemos em pormenor o que faz a função Hanoi: A instrução if testa se o número de discos é igual a zero e, se assim for, a função termina a sua execução (return). Caso contrário:! a instrução Hanoi(n-1,from,6-from-to) executa a movimentação de n-1 discos para a pilha auxiliar; executa-se o movimento do disco n (Move(n,from,to);); movem-se os n-1 discos da pilha auxiliar para a pilha final (Hanoi(n-1,6-from-to,to);). Prog 22 Repare que a comparação de igualdade é feita com o sinal ==. Não confundir com o operador de atribuição, =. E pur... si muove! Prog note 1 of slide 22 A função Move é responsável pela movimentação dos discos. Neste caso, apenas queremos registar quais os movimentos, pelo que a função tem este aspecto: void Move(int n, int from, int to) { cout << from << > << to << endl ; }! Prog 23 A mesma estratégia podia ser aqui usada para efectuar o mesmo movimento numa interface gráfica, deslocando visualmente os discos no ecrã; apenas mudaria o código da função Move. Prog note 1 of slide 23 O que se segue... 24 Mas afinal isto também se fazia em C! Pois é... mas já a seguir começaremos a ver onde o C++ vai (muito) mais além... vamos trabalhar com CLASSES. Prog 25 11
C vs C++ Essencialmente, tudo o que fizemos até agora foi C (embora a forma de escrever no ecrã em C seja diferente da que aqui usámos). Aprendemos alguns conceitos básicos e alguma notação. Com a função Hanoi, usámos um importante tipo de ABSTRACÇÃO a abstracção procedimental e atrevemo-nos a usar a recursividade a função Hanoi invoca-se sucessivamente a si mesma, com parâmetros mais simples. Na segunda parte da aula, começaremos a abordar outro tipo mais abrangente de abstracção. A noção de classe permite abstrair ao mesmo tempo dados e operações. Vai ser a programação com classes que nos vai ocupar durante todo o curso. Prog note 1 of slide 25 Classes, Classes! 26 Programar... com classe(s) Uma classe Contém em si mesma dados Atributos e funções que operam sobre os dados Métodos É um tipo de dados podemos declarar variáveis da classe Tem membros privados e membros públicos Pode herdar atributos de outras classes A declaração é separada da implementação * * Prog 27 Aqui emerge mais um aspecto importante de ABSTRACÇÃO. Para usar correctamente uma classe não é necessário conhecer a forma como ela está programada (a sua implementação), mas apenas quais os métodos que a própria classe disponibiliza para sermos UTILIZADORES de classes fornecidas por outros, precisamos apenas de conhecer a sua declaração. Prog note 1 of slide 27 12
Programador-utilizador A ABSTRACÇÃO permite-nos trabalhar com classes sem saber como elas foram programadas. Só precisamos de saber o que elas fazem, e não como. Exemplo Vamos usar uma classe (Rational) que foi disponibizada na internet. Sabendo que com objectos do tipo Rational é possível ler (e.g., cin >> r; ) escrever (e.g., cout << s; ) comparar (e.g., a<=b, (menor ou igual), a==b (igual), a!=b (diferente)) fazer operações aritméticas (e.g., a+b, a*(b-c)) podemos escrever um programa como teste-rational.cpp (*) e muitos outros, sem precisar de saber COMO foi implementada a classe Rational. Isto é mais uma ocorrência da ABSTRACÇÃO. (**) Prog 28 (*) O programa teste-rational.cpp está disponível, tal como os ficheiros da classe Rational, na página da cadeira, na secção Programas e Código. O mesmo acontecerá, daqui para a frente, com todos os programas que formos fazendo nas aulas, sem necessidade de qualquer chamada de atenção para esse facto. (**) Prog note 1 of slide 28 Note-se que precisamos de saber quais as capacidades de que a classe dispõe, embora não precisamos de saber como ela as faz. É em parte por esse motivo que, como veremos em pormenor na próxima aula, uma classe é sempre escrita em dois ficheiros distintos (no nosso caso, eles são Rational.h e Rational.cpp). Precisamos de os ter a ambos, mas a informação que nos interessa quando estamos a usar a classe, como é o caso i.e., a de quais as funcionalidades da classe está no ficheiro.h. O ficheiro.cpp contém a implementação da classe o como. Prog note 2 of slide 28 TPC 1 Fazer o download do software (os links estão na página da cadeira...) e instalá-lo. Copiar, compilar e executar os programas que fizemos na aula de hoje. TPC 2 Página da cadeira, na secção TPC, Aula 1. Prog 29 Prog 30 13