Física Computacional 3 mem. estática e dinâmica

Documentos relacionados
Curso C: Ponteiros e Arrays

Aula 8- Standard Template Library. Arthur Ribacki Gabriel Portal Leonardo Chatain Luiz Fernando Scheidegger Rosália Schneider

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

Programação 2009/2010 MEEC - MEAer Laboratório 5 Semana de 26 de outubro de 2009

Conteúdo programático

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Algoritmos e Técnicas de

UNIVERSIDADE DO VALE DO RIO DOS SINOS - UNISINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS - CENTRO 06. Funções, variáveis, parâmetros formais

Aula 1. // exemplo1.cpp /* Incluímos a biblioteca C++ padrão de entrada e saída */ #include <iostream>

Programação de Computadores I. Linguagem C Função

Introdução a POO. Introdução a Linguagem C++ e POO

Alocação dinâmica de memória

Conversão de Tipos e Arrays

Programação de Computadores I. Ponteiros

Princípios de programação em Linguagem C++

Aplicação dos conceitos de programação orientada a objeto em linguagens de alto nível

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Esta apresentação ensinará os conceitos de Orientação a Objetos com C++, do mais básico para o mais avançado. É suposto que o aluno já tenha

Linguagens de Programação

Orientação a Objetos

PROGRAMAÇÃO DE COMPUTADORES

Java na Prática. Célio Silva Aula 3

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Guia de Consulta Rápida C++ STL. Joel Saade. Novatec Editora

TUTORIAL MATLAB Victor Breder 2016

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

Componentes da linguagem C++

Programando em C++ Histórico da Linguagem C

Comandos de Eletropneumática Exercícios Comentados para Elaboração, Montagem e Ensaios

Lógica de Programação. Profas. Simone Campos Camargo e Janete Ferreira Biazotto

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Fundamentos de Programação. Diagrama de blocos

Fundamentos de Programação

Método de ordenação - objetivos:

Universidade Federal de Goiás Campus Catalão Departamento de Matemática

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

Introdução à Programação de Computadores Parte I

DE JAVA AO C++ Prof. Cesar Augusto Tacla

INFORMÁTICA APLICADA AULA 02 LINGUAGEM DE PROGRAMAÇÃO C++

Tópicos Avançados em Banco de Dados Dependências sobre regime e controle de objetos em Banco de Dados. Prof. Hugo Souza

Aula 3/4: Vetores/Matrizes e Ponteiros

Keeper of Knowledge. Capítulo 1 Conceitos Básicos do Java

Inteligência Artificial

Algoritmos e Programação Estruturada

JSP - ORIENTADO A OBJETOS

UNIVERSIDADE DO TOCANTINS TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS PRÁTICA EM PROGRAMAÇÃO DE SISTEMAS

INTRODUÇÃO À PROGRAMAÇÃO II VARIÁVEIS COMPOSTAS HOMOGÊNEAS UNIDIMENSIONAIS

Programação em Paralelo. N. Cardoso & P. Bicudo. Física Computacional - MEFT 2010/2011

BC1424 Algoritmos e Estruturas de Dados I Aula 02: Ponteiros, estruturas e alocação de memória

Curso de Linguagem C

Linguagem de Programação III

1. Fazer um programa em C que pergunta um valor em metros e imprime o correspondente em decímetros, centímetros e milímetros.

Programação WEB. Prof. André Gustavo Duarte de Almeida www3.ifrn.edu.br/~andrealmeida. Aula II jquery UI

INF 1005 Programação I

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Componentes básicos de Bijutaria em Arame Parte 2

Técnicas de Programação: ESTRUTURAS, UNIÕES E TIPOS DEE UFPB

Programação Orientada a Objetos C++

Introdução ao. Script. Baltazar Tavares (Psycho Mantys)

Estruturas de Dados. Alguns dados não costumam ser tão simples assim... Podem ser compostos por vários dados distintos

Programação. MEAer. Bertinho Andrade da Costa. Instituto Superior Técnico. Introdução ao Pré-Processador. 2011/2012 1º Semestre

Assessoria Técnica de Tecnologia da Informação - ATTI. Projeto de Informatização da. Secretaria Municipal de Saúde do. Município de São Paulo

Vectores em C++ Classe vector: Introdução

Programação por Objectos. Java

DICIONÁRIOS. template<class K,class T> class Par { public: K chave; T valor; Par():chave(),valor()

Algoritmos APRENDENDO A PROGRAMAR COM C#

Olimpíadas de Informática

Introdução à Programação com Classes em C++

Introdução à orientação a objetos

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

Programação em C++: Introdução

Objetivo do Portal da Gestão Escolar

2. Constantes e Variáveis

C++ e Orientação a Objetos

Aula 11: Desvios e Laços

Árvores Parte 1. Aleardo Manacero Jr. DCCE/UNESP Grupo de Sistemas Paralelos e Distribuídos

Programação com Posix Threads

Programação Orientada por Objectos - C++ jvo

Programação em Paralelo. N. Cardoso & P. Bicudo. Física Computacional - MEFT 2010/2011

INF1005: Programação I. Algoritmos e Pseudocódigo

Apostila de Introdução à Linguagem C

,QVWDODomR. Dê um duplo clique para abrir o Meu Computador. Dê um duplo clique para abrir o Painel de Controle. Para Adicionar ou Remover programas

COMO ELABORAR UM CURRÍCULO

Aula 10: Escalonamento da CPU

Introdução a Funções

Capítulo 2: Introdução à Linguagem C

Programação por Objectos. Java

Unidade IV: Ponteiros, Referências e Arrays

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

M3D4 - Certificados Digitais Aula 2 Certificado Digital e suas aplicações

ALGORITMO I VARIÁVEIS INDEXADAS

Graphing Basic no Excel 2007

Algoritmos e Estruturas de Dados I. Variáveis Indexadas. Pedro O.S. Vaz de Melo

Transcrição:

Física Computacional 3 mem. estática e dinâmica 1. Revisão de arrays 2. Revisão de ponteiros e ponteiros para ponteiros 3. Ponteiros para funções 4. Préprocessador: headers 5. Mais à frente: estruturas e classes 6. Mais à frente: Standard Template Library e vectors bicudo@tecnico.ulisboa.pt 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 1

Variáveis estáticas: As variáveis estáticas são dimensionadas dentro do próprio código. A vantagem que têm é a sintaxe que é muito simples, permitindo criar arrays (no sentido matemático podem ser vetores linha ou coluna, ou matrizes com linhas e colunas, ou tensores, por exemplo; int a[1000]; // vetor num espaço a 1000 dimensões float mat[3][3]; // caso se trate de um array de tipo matriz 3x3 double r[100][20][30]; // array tensorial No entanto possuem duas desvantagens, possuem a desvantagem de ocuparem memória fixa que não poderá ser reaproveitada. Os vetores apenas se podem apagar quando o bloco ou função onde foram definidos é terminado. Isto é feito de forma automática pelo compilador. Outra desvantagem é termos de definir exatamente o número de elementos no código, ou seja o compilador necessita de conhecer o número de elementos, estes não podem apenas à posteriori ser definidos pelo utilizador do ficheiro executável. Por exemplo, const unsigned short ni=3; const unsigned short nj=3; float m[ni][nj]; // deve ser precedido da determinação de ni e nj Revisão de vectores 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 2

Existem vários tipos de inicialização, que podem ser realizados de forma completa numa única instrução, ou de forma incompleta, int a[3] = {3,10,2}; //forma completai int a[] = {3,10,2}; //forma incompleta, são assumidos 3 elementos, a[3]. A partir do momento que o array está inicializado, os valores podem ser acedidos de várias formas, incluindo uma sintaxe parecida com a da inicialização, usando a notação [i]: std:: cout<< a[2]; // dá o valor do elemento 2 de a, ou seja retorna 2 A única forma de imprimirmos o array completo é com um loop, for(int i=0; i <ni ; ++i) std::cout<<i<<" "<<a[i]<<"\n"; Podemos alterar os valores do array usando a mesma sintaxe, a[2]=7;// muda o valor do 3º elemento de 2 para 7 Recomendamos o estudo do código exemplo disponibilizado na página da cadeira, matrixwitharrays.cpp Revisão de vectores 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 3

Um ponteiro dá-nos o endereço em memória de uma variável int a = 4; int *p = &a; // equivale a escrevermos 2 comandos int *p; p=&a; O operador & (inverso de *) dá-nos o endereço de uma variável O valor apontado por um ponteiro pode ser acedido através do operador unário *, conhecido pelo operador de dereferencing int b = *p; *p = 5; //escreve, como * é o inverso de &, ficamos com a=5; Ponteiro nulo : 0, NULL ou (em C++11) nullptr Não podemos desreferenciar ponteiros nulos: int *p = nullptr; // podemos fazer mas não aponta para nada int c = *p; //programa pode crashar Tem o valor booleano false Revisão de ponteiros 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 4

Em C, usa-se ponteiros para passar variáveis por referência void setzeroponteiro(int * p) { *p = 0; } Em C++ é possível utilizar referências (não confundir com o inverso de *) void setzeroref(int & a) { a = 0; } // aqui é usada no argumento Podemos também definir referências dentro de funções int main() { int a = 5; setzeroref(a); //quando se aplica a função não se usa a sintaxe &a std::cout << a << std::endl; // imprime 0 int &b = a; //& significa que b fica para sempre associado a a b = 7; std:: cout << a << std::endl; // imprime 7, b é o alias (avatar) do a // nota por defeito o main retorna 0 } Estude também : referenciasdiferentevalores.cpp, referenciaparaponteiro.cpp Referências (símbolo usado ~ infeliz) 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 5

Podemos usar a memória de forma dinâmica. O que tem duas vantagens face a memória estática: O compilador não precisa de saber a quantidade de memória a usar Podemos apagar as variáveis quando já não são necessárias. No entanto, tem também algumas desvantagens, como veremos Em C a alocação dinâmica de memória é feita através da função malloc int *p = (int*) malloc( 10 * sizeof(int) ); A memória deverá ser libertada usando a função free free(p); Memória dinâmica 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 6

Em C++ a alocação de memória é feita utilizando o operador new int *p = new int;// usa-se com *p=5 ou *p=a; A memória é libertada através do operador delete delete p; Para alocar arrays de objetos utiliza-se um ponteiro, mas com a sintaxe int ni; // que pode ser inicializado na execução int *row = new int[ni]; //aloca array de ni inteiros Para libertar a memória: delete[] row; Nota: Os operadores new e new[] contrariamente ao malloc, não só alocam memória como também chamam os construtores do objetos alocados (a rever nas classes). O delete e o delete[] chamam os destrutores correspodentes. Memória dinâmica 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 7

Para trabalharmos com matrizes, utilizamos um ponteiro para ponteiro, ou seja ponteiros para vectores: int ni, nj ; float ** mat= new float*[ni]; for(int i = 0; i < ni; ++i) mat[i] = new float[nj]; Podemos anteriormente atribuir as dimensões da matriz apenas durante a execução, std::cin>> ni >> nj; A sintaxe para a leitura e escrita é idêntica à dos arrays for(int i=0; i <ni; ++i) for(int j=0; j <nj; ++j) std::cin>>mat[i][j]; Recomendamos o estudo do código exemplo disponibilizado na página da cadeira, matrixwithpointers.cpp Memória dinâmica 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 8

Não esquecer: Memória alocada com malloc tem de ser libertada com free Memória alocada com new tem de ser libertada com delete Memória alocada com new[] tem de ser libertada com delete[] Libertar a memória quando esta deixar de ser necessária Nunca libertar memória que não foi alocada dinamicamente: double vec[4];... delete[] vec; //ERRO CRASSO!!! Não retornar ponteiros para variáveis locais Memória dinâmica Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso

Os ponteiros também podem apontar para funções com a sintaxe, float (*f) (int x, int y) //ponteiro f para uma função que retorna um float, recebendo dois int // o * é para termos um ponteiro, ou seja uma variável-função dinâmica // ou seja desconhecida durante a compilação // os () são para dizer que temos um ponteiro para uma função Notamos que sem () teríamos uma função que retornaria um ponteiro para float, assim a sintaxe float *f(int x, int y) estaria errada. O ponteiro f para função é utilizado normalmente, seja no main ou noutra função, sem nenhuma sintaxe específica, como seria usada uma função normal. Ponteiros para funções 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 10

Exemplo: #include <iostream> void printfunc( float (*f)(float), float x ) { std::cout << f(x) << std::endl; } float id(float x) { return x; } float quad(float x) { return x*x; } int main() { float (*f)(float) = &id; printfunc(f, 4); //imprime 4 printfunc(&quad, 4); //imprime 16 } Recomendamos o estudo do código exemplo diponibilizado na página da cadeira, functionoffunctionwithpointers.zip É importante ainda aprofundar estes conceitos, por exemplo no tutorial de c++ disponível na internet, http://www.cplusplus.com/doc/tutorial/ Ponteiros para funções 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 11

Para trabalharmos com ponteiros, ponteiros para funções, e com funcções úteis para o trabalho 3 como o gerador de números aleatórios rand, é necessário no préprocessador do código main incluir a biblioteca #include <cstdlib> E ainda, caso os códigos respeitantes a funções estejam em ficheiros.cpp separados do ficheiro.cpp onde se inclui a função main, é conveniente criar un ficheiro header para o pré-processador, por exemplo #include "myheader.h" que contenha os protótipos, // myheader.h, header for a main using functions: integral, function float integral(float (* function)(float), float xmin, float xmax, int npoints); float function(float x); e inclui-lo nos ficheiros a linkar, o que e automatico em Code::Blocks. mas com o comando de linha em linux ou MacOS g++, deve ser escrito por extenso, g++ -o mycode.exe mycode.cpp integral.cpp fucntion.cpp myheader.h Pré-processador: biblioteca, header 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 12

Para se evitar os eventuais problemas decorrentes da utilização da alocação dinâmica de memória em C++ pode-se usar os contentores da STL standard template library Entre estes contam-se: std::vector : Semelhante aos vetores mas mais seguro de usar std::string : O mesmo para strings std::list : double linked list Estes contentores são classes genéricas falaremos disto mais tarde A STL fornece também algoritmos e iteradores para lidar com estes contentores Standard Template Library 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 13

Para usar a classe std::vector: #include <vector> Usando ponteiros diretamente, teríamos: int* a = new int[10]; Com o std::vector, fazemos: std::vector<int> a(10); Podemos aceder normalmente aos elementos de a: b = a[10] a[10] = b; Dimensão do vetor dada por size() : size_t dim = a.size(); O vetor pode ser redimensionado dinamicamente: a.resize(20); //aumenta a dimensão de a para 20 std::vector 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 14

Adicionar elementos usando push_back(); std::vector<int> a; //ficamos com um vetor de dimensão 0 a.push_back(4); //a fica com um elemento 4 Não é necessário desalocar explicitamente a memória quando o scope de a acaba, o construtor é chamado e a memória é libertada Para strings, usamos o std::string std::string a = abc ; //cria string com valor abc std::string b = abc ; Operador == usado para comparar o conteúdo de duas strings std::cout << (a == b) << std::endl; //o resultado é verdadeiro Operador + usado para concatenar duas strings std::string c = a + b; //c fica com o valor abcabc std::vector e std::string 28-09-17 Física Computacional - MEFT 2009/10 P. Bicudo, P. Martins & M. Cardoso 15