Índice. Capítulo 1 - Introdução

Tamanho: px
Começar a partir da página:

Download "Índice. Capítulo 1 - Introdução"

Transcrição

1 Índice i Índice Capítulo 1 - Introdução 1. Estruturas na linguagem C A necessidade de utilizar Estruturas Definição de estrutura Como aceder aos campos de uma estrutura Iniciar uma Estrutura Atribuição de estruturas Ponteiros/apontadores em C Variáveis estáticas e variáveis dinâmicas Ponteiros Ponteiros para estruturas Diagramas Notação na linguagem C Ponteiro para um tipo de dados Criar e destruir variáveis dinâmicas Ponteiros NULL Apontador e apontado Restrições ao uso de variáveis ponteiro... 8 Índice

2 ii Índice 3. Memória dinâmica Memória estática Memória dinâmica A função sizeof e o operador cast A função calloc A função malloc A função realloc A função free Exemplo Algoritmos recursivos Objetivo Estratégia (para a construção de soluções recursivas) Exercícios Estruturas de Dados Definição Estruturas Abstratas de Dados Índice

3 Estruturas na linguagem C 1 Capítulo 1 Introdução 1. Estruturas na linguagem C 1.1. A necessidade de utilizar Estruturas A estrutura é o conceito mais poderoso nas estruturas de dados e na linguagem C. Quando se pretende organizar um conjunto de dados do mesmo tipo, utiliza-se um array. No entanto, quando os dados não são do mesmo tipo e se pretende organizar os dados numa cadeia de elementos, isso torna-se mais complexo e muito ineficiente. Por exemplo, num Stand de automóveis usados, cada automóvel tem associado um conjunto de informação, tal como: modelo, nome do fabricante, ano de fabrico, nome e telefone do proprietário. Neste caso, pode-se organizar cada um destes tipos de informação utilizando um array, o que torna o problema difícil, ineficiente e complexo de tratar. Em resumo, há a necessidade de utilizar mais conveniente, elegante, eficiente e coletivamente, os dados de diferentes tipos como um grupo. Isto é o objetivo que se pretende atingir com o mecanismo da estrutura. As estruturas são muito úteis, não só porque contém diferentes tipos de dados, mas também porque podem formar muitas estruturas de dados complexas, tais como listas ligadas, árvores, gráficos e bases de dados Definição de estrutura Na linguagem C, uma estrutura é um conjunto de variáveis referenciadas por um nome, fornecendo uma maneira conveniente de se ter informações relacionadas e agrupadas. Uma definição de estrutura forma um modelo que pode ser utilizado para criar variáveis de estruturas. As variáveis que constituem a estrutura designam-se por campos (ou elementos) da estrutura.

4 2 Estruturas na linguagem C A forma geral de uma definição de estrutura é a seguinte: struct nome_estrutura { tipo_1 tipo_2... campo_1; campo_2; tipo_n campo_n; variáveis_estrutura; onde nome_estrutura e variáveis_estrutura podem ser omitidos, mas não ambos. Normalmente omite-se a declaração de variáveis_estrutura. Uma outra maneira de criar uma estrutura é definindo-a como um tipo (utilizando typedef), da seguinte forma: typedef struct { tipo_1 tipo_2... campo_1; campo_2; tipo_n campo_n; nome_tipo_estrutura; A partir de uma definição de tipo de estrutura, esta pode ser utilizada tal como os tipos habituais (int, float, char, ). A linguagem C permite definir explicitamente novos nomes aos tipos de dados, utilizando a palavra-chave typedef. A forma geral de um comando typedef é o seguinte: typedef tipo nome; onde tipo é qualquer tipo de dados permitido e nome é o novo nome para esse tipo Como aceder aos campos de uma estrutura O acesso a cada uma dos campos duma estrutura é feito através da combinação do nome duma variável do tipo estrutura e do campo que se pretende aceder, separados por um ponto (.). Isto é, variável_estrutura.campo Se um campo representa um elemento estruturado ( array ), então os elementos desse campo podem ser acedidos incluindo os índices na designação de campo. Por exemplo, se um campo representa um array de uma dimensão (vetor), um seu elemento pode ser acedido pela expressão variável_estrutura.campo[índice]

5 Estruturas na linguagem C 3 Se, por exemplo, um campo representa um array de duas dimensões (matriz), um seu elemento pode ser acedido pela expressão variável_estrutura.campo[linha][coluna] Identicamente, se um campo representa uma estrutura, um elemento dessa estrutura pode ser acedido pela expressão variável_estrutura.campo.subcampo onde subcampo refere-se a um campo dentro dessa estrutura. Se definir-se uma tabela unidimensional (vetor) cujos elementos sejam estruturas, a acesso a uma dessas estruturas é feito através da seguinte forma: tabela[índice] e o acesso a um determinado campo é feito da seguinte forma: tabela[índice].campo Nota: Os campos de uma estrutura podem ser utilizados da mesma forma que as variáveis normais. As características particulares que se aplicam a cada campo são determinadas pelo seu tipo Iniciar uma Estrutura Iniciar uma estrutura implica atribuir valores iniciais aos campos da estrutura. No entanto, deve ter-se presente os tipos e a ordem dos campos pela qual estão declarados na estrutura. Desta forma, os tipos e os valores terão que se assemelhar. Exemplo: typedef struct { int N; float X; Registo; Registo A = { 25, 2.7 ; Iniciará implicitamente A.N = 25 e A.X = Atribuição de estruturas A atribuição de estruturas é uma característica importante da linguagem C. É possível atribuir o valor de uma variável do tipo estrutura a uma outra variável do tipo estrutura, desde que ambas sejam do mesmo tipo de estrutura. Isto na realidade atribui os valores

6 4 Ponteiros/apontadores em C dos campos de uma variável do tipo estrutura aos correspondentes campos da outra variável do tipo estrutura. Exemplo: Registo A = { 25, 2.7, B = A; Produz o seguinte: B.N = 25 e B.X = Ponteiros/apontadores em C 2.1. Variáveis estáticas e variáveis dinâmicas Podem ser usadas duas variedades de variáveis durante a execução de um programa em linguagem C: variáveis estáticas e variáveis dinâmicas. As variáveis estáticas são declaradas durante a escrita do programa. O espaço para elas existe enquanto o programa em que são declaradas estiver a ser executado. As variáveis dinâmicas são criadas (e destruídas) durante a execução do programa. Como só existem enquanto o programa estiver a ser executado, não se lhes pode atribuir um nome durante a escrita do programa. A única forma de referenciar uma variável dinâmica é usar um ponteiro. Após ser criada, a variável dinâmica pode conter dados e possuir um tipo tal como qualquer outra variável. Pode-se então falar em criar uma variável dinâmica do tipo x e estabelecer um ponteiro que aponta para ela, ou em mover um ponteiro de uma variável dinâmica do tipo x para outra (do mesmo tipo) ou em devolver ao sistema o espaço ocupado por uma variável dinâmica. As variáveis estáticas não podem ser criadas ou destruídas durante a execução do programa e os ponteiros não podem ser usados para apontar para variáveis estáticas. As variáveis estáticas são referenciadas usando o seu nome Ponteiros Um ponteiro (pointer) também designado por link ou reference é uma variável que indica a localização de outra variável (normalmente uma estrutura contendo dados). Um ponteiro é uma variável cujo valor é um endereço de uma variável dinâmica de um determinado tipo. Um ponteiro contém uma referência para o endereço de uma célula de memória que contém um elemento.

7 Ponteiros/apontadores em C 5 Se for usado um ponteiro para localizar uma estrutura então não é preciso estar-se preocupado onde este está atualmente armazenado, pois usando o ponteiro, o sistema computacional pode localizar a estrutura quando for necessário Ponteiros para estruturas A linguagem C permite ponteiros para estruturas exatamente como o permite para outros tipos de variáveis. Tal como nos casos comuns, declara-se um ponteiro para uma estrutura colocando um asterisco (*) antes do nome da variável de estrutura e depois do nome desta, da seguinte forma: struct nome_estrutura *ponteiro; Para se aceder a um campo da variável apontada pelo apontador, faz-se o seguinte: (*ponteiro).campo ou ponteiro campo 2.4. Diagramas Os ponteiros são geralmente desenhados como setas e as estruturas como retângulos. r ABEL s RUI t NULL u ANA EMA v Figura 1 - Ponteiros para estruturas. No diagrama da Figura 1, r é um ponteiro para o registo ABEL e v é um ponteiro para o registo EMA. Como se pode observar o uso de ponteiros é muito flexível. Dois ponteiros podem referenciar o mesmo registo, como t e u, ou um ponteiro pode mesmo não referenciar registo algum. Esta última situação é representada pelo símbolo NULL como é mostrado para o ponteiro s. Deve-se ter muito cuidado na manipulação de

8 6 Ponteiros/apontadores em C ponteiros para não se perder nenhum registo. Na figura o registo RUI foi perdido, sem nenhum ponteiro a referenciá-lo, não havendo portanto nenhuma forma de o encontrar Notação na linguagem C Se Nodo denotar o tipo dos itens em que se está interessado, então pode-se declarar um tipo de ponteiro para objetos do tipo Nodo com a declaração seguinte: typedef Nodo *PNodo; o que significa que uma variável do tipo PNodo é um ponteiro para uma variável do tipo Nodo. O tipo Nodo que o ponteiro refere pode ser arbitrário mas, em muitas aplicações, é uma estrutura. Tal como para qualquer outro tipo de dados podem ser declaradas variáveis do tipo PNodo. Estas variáveis apontam para variáveis dinâmicas do tipo Nodo Ponteiro para um tipo de dados Cada ponteiro está limitado ao tipo de variável para a qual ele aponta. O mesmo ponteiro nunca pode ser usado para apontar para variáveis de tipos diferentes. As variáveis ponteiro de tipos diferentes não podem ser misturadas umas com as outras. A linguagem C permite atribuições entre duas variáveis ponteiro apenas do mesmo tipo, mas não entre de tipos diferentes. Por exemplo, para as seguintes declarações: Nodo *P, *Q; int *A, *B; as atribuições P = Q e A = B são corretas, mas a atribuição P = A não é correta Criar e destruir variáveis dinâmicas A criação e destruição de variáveis dinâmicas são feitas usando funções padrão. Se P for uma variável declarada como um ponteiro para o tipo Nodo (P é uma variável do tipo PNodo), então a função: new(p); cria uma nova variável dinâmica do tipo Nodo e atribui a sua localização ao ponteiro P (isto é, coloca em P o endereço dessa variável). De modo similar: free(p); devolve o espaço usado pela variável ao sistema. Alguns sistemas perdem o espaço e nunca mais o reutilizam, o que significa que existe um mau entendimento entre estas instruções e o Sistema Operativo.

9 Ponteiros/apontadores em C 7 NULL P = NULL ; P new(p) ; P P = ANA ; P ANA free(p) ; P??? ANA Figura 2 - Criar e destruir variáveis dinâmicas. Depois da função free(p) ser invocado, a variável ponteiro P fica indefinida, donde não pode ser usada (legalmente) até lhe ser atribuído um novo valor. Estas ações estão ilustradas na Figura Ponteiros NULL Em certas situações pretende-se que um ponteiro não referencie qualquer variável dinâmica. Esta situação pode ser estabelecida pela atribuição: P = NULL; Depois pode ser efetuado um teste ao seu estado: if (P!= NULL) A palavra NULL é uma palavra reservada na linguagem C, sendo usada como uma constante para os dados do tipo ponteiro. Note-se a distinção entre uma variável ponteiro cujo valor é indefinido e uma variável ponteiro cujo valor é NULL: a asserção P = NULL significa que P atualmente não aponta para nenhuma variável dinâmica. Se o valor de P é indefinido então P pode apontar para qualquer posição aleatória na memória. Tal como para todas as outras variáveis, quando começa a execução do programa, o valor das variáveis ponteiro é indefinido. Antes de P poder ser usado é necessária uma chamada a new(p) ou uma atribuição tal como P = Q ou P = NULL. Depois de uma chamada a free(p), o valor de P fica indefinido, donde deve-se fazer imediatamente P = NULL para se ter a certeza que P não é usado com um valor indefinido.

10 8 Ponteiros/apontadores em C 2.9. Apontador e apontado A notação *P denota a variável para a qual P aponta. Esta notação pode parecer um pouco confusa, mas a sua lógica torna-se clara se tiver em mente que * significa "aponta". Donde a declaração: Nodo *P; indica que P aponta para um elemento do tipo Nodo e *P é o elemento apontado por P Restrições ao uso de variáveis ponteiro O único uso de variáveis do tipo PNodo é para encontrar a localização de variáveis do tipo Nodo. As variáveis ponteiro podem participar em instruções de atribuição, podem ser testadas por igualdade e podem aparecer (como parâmetros) em chamadas de rotinas/subprogramas, mas não podem aparecer em qualquer outro lugar. Note que as restrições no uso de ponteiros não se aplicam às variáveis dinâmicas que eles referem. Se P é um ponteiro então *P não é normalmente um ponteiro (contudo é legal um ponteiro apontar para outro ponteiro), mas sim uma variável do tipo Nodo e portanto *P pode ser usado em qualquer utilização legítima para o tipo Nodo. P = ANA P ANA *P Q = RUI Q RUI *Q P ANA *P P = Q Q RUI *Q *P = *Q P RUI *P Q RUI *Q Figura 3 - Atribuições de variáveis ponteiro. No que respeita a instruções de atribuição é importante lembrar a diferença entre P = Q e *P = *Q. Embora ambas sejam corretas (desde que P e Q apontem para o mesmo tipo

11 Memória dinâmica 9 de dados) possuem significados diferentes. A primeira refere-se aos ponteiros e a segunda aos conteúdos apontados pelos ponteiros. A Figura 3 ilustra estas atribuições. A primeira instrução faz com que P aponte para o mesmo objeto que o ponteiro Q mas não altera o valor de nenhum dos objetos apontados. O objeto apontado por P é perdido (a não ser que haja alguma outra variável ponteiro que ainda o referencie). A segunda instrução, *P = *Q, copia o valor do objeto *Q para o objeto *P, donde os dois objetos ficam com o mesmo valor, com P e Q a apontarem para as duas cópias separadamente. Finalmente, as instruções de atribuição P = *Q e *P = Q envolvem tipos de dados diferentes, donde ambas são ilegais (exceto se tanto P como Q serem ponteiros para ponteiros do mesmo tipo). 3. Memória dinâmica 3.1. Memória estática As variáveis locais às funções são sucessivamente criadas e libertadas numa zona de memória do processo designada pilha (stack). Quando uma função é chamada, a zona da pilha cresce para criar local para as novas variáveis locais, quando uma função retorna a zona da pilha decresce na mesma proporção. A declaração de variáveis em funções leva a que sejam reservados vários endereços de memória na zona da pilha (variáveis locais), as quais são libertadas logo após o término função onde estão declaradas. Considere-se o seguinte exemplo: void LerVetor () { int V[3000], N; do { printf ( N =? ); scanf ( %d, &N); while ((N < 0) (N > 3000); for (i = 0; i < N, i++) { printf ( Insira um inteiro: ); scanf ( %d, &V[i]);

12 10 Memória dinâmica #include <stdio.h> Int main() { LerVetor(); return 1; A declaração de variáveis que consta na função LerVetor anterior (int V[3000], N;) leva a que seja reservada vários endereços de memória na zona da pilha. Para a variável N é escolhido um local (endereço) qualquer na pilha, enquanto os elementos do vetor V são reservados um conjunto (bloco) de 3000 endereços contíguos (zona preenchida na figura que se segue) e um endereço ao qual é atribuído o endereço do primeiro elemento de V, V[0]. Com a execução da instrução "do while" da função, suponha-se que é introduzido, por exemplo, o valor 2000 para a variável N; isto significa que dos 3000 elementos do vetor V reservados apenas 2000 serão usados (pois N serve como tamanho real do vetor V). Com a execução da instrução for da função irão ser atribuídos valores para os primeiros 2000 elementos do vetor V que, suponha-se serem os apresentados na figura seguinte. Desta forma, existe um conjunto de endereços aos quais não foram atribuídos valores, mas que se encontram reservados (desperdício de memória).

13 Memória dinâmica 11 Com a execução do programa principal (main), quando a função devolve o controlo para o programa todas as variáveis da função LerVetor são libertadas para o sistema operativo Memória dinâmica A linguagem C permite a criação dinâmica de memória à medida das necessidades do programa. A memória dinâmica é gerida numa zona especial da memória designada heap e é permanente, no sentido em que não depende da ativação/desativação de funções ou blocos de programa, podendo ser libertada pelo programa quando a sua utilização deixa de ser necessária. A memória dinâmica pode evitar, por exemplo, o sobredimensionamento de vetores, permitindo a sua criação à medida das reais necessidades do programa. Existem várias funções que são usadas para gerir a memória dinâmica: calloc, malloc, realloc e free. Na utilização de algumas destas funções são utilizados com muita frequência a função sizeof e o operador cast.

14 12 Memória dinâmica A função sizeof e o operador cast A função sizeof() devolve a dimensão do tipo especificado, geralmente em número de bytes; por exemplo, sizeof(int) = 2 significa que cada valor do tipo inteiro ocupa 2 bytes de memória. Algumas funções devolvem um apontador genérico (formalmente, do tipo void*). A sua conversão para o tipo desejado efetua-se por meio de um operador de cast. Note-se que a operação de cast pode ser realizada entre tipos incompatíveis (por exemplo, inteiro e apontador, inteiro e real), mas o resultado pode ser dependente do processador A função calloc A sintaxe da função calloc é a seguinte: void *calloc (size_t nmemb, size_t size); a qual - reserva um bloco de memória contígua com espaço suficiente para armazenar nmemb elementos de dimensão size cada; - devolve o endereço (apontador) para a primeira posição do bloco ou NULL quando não for possível alocar memória; - size_t é o tipo utilizado para especificar as dimensões numéricas em várias funções; - o tipo de retorno void * corresponde a um endereço genérico de memória (permite a utilização por todo o tipo de ponteiro); - todas as posições do bloco de memória são inicializadas com zero. Considere-se o seguinte exemplo: float *p; p = (float *) calloc (2000, sizeof (float)); o qual - reserva de memória para um bloco de 2000 reais; - a partir daqui, p pode ser tratado como um vetor de 2000 posições (para 2000 valores reais); - p é um ponteiro para o primeiro elemento do vetor; - sizeof() é um operador que devolve a dimensão (em geral, em bytes) do tipo ou variável indicado no argumento; - (float *) funciona como um operador de cast (obriga a devolver um ponteiro para um real/float).

15 Memória dinâmica 13 A figura seguinte ilustra o que se passa ao nível da memória com a execução do exemplo anterior. A variável p é local (guarda o endereço do primeiro elemento do vetor p), logo a memória reservada para si encontra-se na zona da pilha. A memória reservada para os elementos do vetor p (p[0], p[1],..., p[1999] ou *p, *(p+1),..., *(p+1999)) são reservados na zona do heap, pois são variáveis dinâmicas A função malloc A sintaxe da função malloc é a seguinte: void *malloc (size_t total_size); a qual - reserva um bloco de memória contígua de dimensão total_size expressa em bytes; - devolve o endereço (ponteiro) para a primeira posição do bloco ou NULL quando não for possível alocar memória; - size_t é o tipo utilizado para especificar as dimensões numéricas em várias funções; - o tipo de retorno void * corresponde a um endereço genérico de memória (permite a utilização por todo o tipo de ponteiro); - calloc(n,d) pode ser simplesmente substituído por malloc(n*d); - as posições do bloco não são inicializadas com qualquer valor.

16 14 Memória dinâmica A função realloc A sintaxe da função realloc é a seguinte: void *realloc (void *ptr, size_t total_new_size); na qual - ptr é o ponteiro para o bloco de memória reservado antes; - total_new_size é a dimensão total que se pretende agora para o mesmo bloco; - retorna um apontador para o bloco de memória redimensionado; - o segundo argumento (size_t total_new_size) tem um significado semelhante ao da função malloc (size_t total_size) A função free A sintaxe da função free é a seguinte: void *free (void *ptr); na qual - ptr é o ponteiro para o bloco de memória reservado antes, o qual foi devolvido por malloc, calloc ou realloc Exemplo Considere-se o seguinte exemplo: int *p, N; do { printf ( Insira a dimensão do vector: ); scanf ( %d, &N); while (N < 0); p = (int *) malloc (N * sizeof (int)); for (i = 0; i < N; i++) { printf ( Inserir um valor inteiro: ); scanf ( %d, &p[i]); p = (int *) realloc (p, (N+1000) * sizeof (int)); free (p); Considere-se a análise, e ilustração através de esquemas, do resultado da execução de cada subconjunto de instruções do bloco anterior, que se segue.

17 Memória dinâmica 15 int *p, N; do { printf ( Insira a dimensão do vetor: ); scanf ( %d, &N); while (N < 0); // por exemplo, N = 2000 p = (int *) malloc (N * sizeof (int));

18 16 Memória dinâmica for (i = 0; i < N; i++) { printf( Inserir um valor inteiro: ); scanf( %d, &p[i]); p = (int *) realloc (p, (N+1000) * sizeof (int)); 1º caso: a zona imediatamente a seguir ao último elemento de p está vazia e pode receber os 1000 elementos adicionais.

19 Memória dinâmica 17 2º caso: a zona imediatamente a seguir ao último elemento de p está ocupada e não pode receber os 1000 elementos adicionais. 2º caso (cont): como a zona imediatamente a seguir ao último elemento de p não pode receber os 1000 elementos adicionais, todo o vetor terá que ser realocado para uma zona que possa receber os 3000 elementos.

20 18 Memória dinâmica free (p); O bloco de memória reservado para todo o vetor p é libertado. Considere-se o mesmo exemplo nas versões com memória estática e memória dinâmica. #include <stdio.h> main () { int V[3000], N; do { printf ( N =? ); scanf ( %d, &N); while ((N < 0) (N > 3000); for (i = 0; i < N, i++) { printf ( Insira um inteiro: ); scanf ( %d, &V[i]); #include <stdio.h> #include <stdlib.h> int main () { int *V, N; do { printf ( N =? ); scanf ( %d, &N); while (N < 0); V = (int*) malloc (N*sizeof (int)); if (V == NULL) return 1; for (i = 0; i < N, i++) { printf ( Insira um inteiro: ); scanf ( %d, &V[i]); free (V);

21 Memória dinâmica 19 Quando se usa memória estática, é necessário reservar um grande bloco de memória, mesmo parte dela não ser necessária. Quando se usa memória dinâmica, a memória apenas é reservada quando é necessária e na quantidade exata.

22 20 Algoritmos recursivos 4. Algoritmos recursivos 4.1. Objetivo Obter uma solução para um problema através da solução de outro com idêntica natureza, mas de menor dimensão. A dimensão do problema é sucessivamente reduzida até se atingir um caso especial cuja solução seja imediata. Este caso especial denomina-se Caso Degenerado. Considere-se o seguinte exemplo: Procurar (palavra, dicionário) Se dicionário está na 1ª página Então Senão Localizar palavra Abrir próximo do meio Determinar a metade que interessa Se palavra está na 1ª metade Então Senão Procurar (palavra, 1ª metade) Procurar (palavra, 2ª metade) Na matemática, a função fatorial de um inteiro não negativo é usualmente definida pela fórmula seguinte: n! = n x (n 1) x... x 1 As reticências presentes nesta fórmula significam continuar na mesma forma. Para calcular o fatorial é necessária uma definição mais precisa, como a seguinte: 1 n! = n (n 1)! se se Exemplo: 4! = 4 * 3! n = 0 n > 0 = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1))) = 4 * (3 * (2 * 1)) = 4 * (3 * 2) = 4 * 6 = 24

23 Algoritmos recursivos 21 Estes cálculos ilustram a essência do modo como a recursão funciona. Um método geral para obter a resposta para um problema, é reduzir este a um ou mais problemas de natureza idêntica, mas de menor dimensão. O mesmo método é usado para estes subproblemas. A recursão continua até que a dimensão dos subproblemas seja reduzido um caso especial onde a solução seja obtida diretamente sem usar a recursão. Por outras palavras, qualquer processo recursivo consiste de duas partes: 1. Um caso degenerado, que é tratado sem recursão; 2. Um método geral que reduz o problema a um ou mais problemas menores, fazendo com que o processo avance até atingir o caso degenerado. Exemplo: Dado um inteiro positivo N, determinar o fatorial de N N! = N x (N 1)! long fatorial (int N) { if (N == 0) return 1; return N * fatorial(n-1); Como se pode ver a partir deste exemplo, a definição recursiva e a solução recursiva podem ser ambas concisas e elegantes, mas os detalhes computacionais podem requerer muitos cálculos parciais antes do processo estar concluído. É sempre importante validar as entradas. Mas deverá esse código ser incluído no corpo do subprograma, ou será melhor escrever um outro subprograma que valide as entradas e de seguida invocar o subprograma recursivo para fazer o trabalho útil? 4.2. Estratégia (para a construção de soluções recursivas) 1. Definir o problema em termos de outro do mesmo tipo com menor dimensão. 2. Determinar a instância do problema que serve como caso degenerado/particular. 3. Estabelecer o modo como cada chamada recursiva diminui a dimensão do problema, assegurando que o caso degenerado é sempre atingido.

24 22 Estruturas de Dados 4.3. Exercícios 1. Sucessão de Fibonacci: 1, 1, 2, 3. 5, 8, 13, 21, f(n) = f(n-1) + f(n-2), n 3. int fibonacci (int N) { if (N <= 2) return 1; return fibonacci(n-1) + fibonacci(n-2); 2. Determinar o máximo divisor comum entre dois números inteiros positivos. int mdc (int a, int b) { if (b == 0) return a; return mdc(b, a%b); 3. Pesquisar um elemento num vetor, utilizando o algoritmo da Pesquisa Binária. int PesquisaBinaria (int Elem, int inf, int sup, int V[]) { int k; if (sup < inf) return 0; k = (sup+inf-1)/2 + 1; if (Elem == V[k]) return k; if (Elem > V[k]) return PesquisaBinaria(Elem, k+1, sup, V); return PesquisaBinaria(Elem, inf, k-1, V); 5. Estruturas de Dados 5.1. Definição Uma estrutura de dados é uma coleção de tipos de dados, composta por tipos não estruturados básicos, tipos estruturados ou uma mistura de ambos os tipos, e um conjunto de operações definidas sobre os tipos de dados.

25 Estruturas de Dados 23 Por outras palavras, uma estrutura de dados é composta por 3 partes: 1. Um conjunto de operações; 2. Uma estrutura de armazenamento especificando as classes de dados relacionados e as coleções de variáveis; 3. Um conjunto de algoritmos, uma para cada operação. Cada algoritmo procura e modifica a estrutura de armazenamento para alcançar o resultado definido pela operação. Um conjunto de variáveis inteiras e o conjunto de operações aritméticas simples (adição, subtração, multiplicação, divisão, negação, valor absoluto, etc.) sobre elas é um exemplo de uma estrutura de dados básica. Existem 2 classes de estrutura de dados, que estão relacionadas com o tamanho do armazenamento exigido: 1. Estática (fixa): estrutura cujo tamanho e atribuição de memória associadas são fixadas aquando da compilação do programa; 2. Dinâmica: estrutura cujo tamanho aumenta ou diminuí consoante as necessidades durante a execução do programa, e em que a localização da memória a si associada poderá ser alterada Estruturas Abstratas de Dados Uma Estrutura Abstrata de Dados (EAD), muitas vezes também referida como tipo abstrato de dados (ADT - Abstract Data Type ), é um conjunto de operações sobre uma coleção de dados armazenados. A definição funcional de uma EAD é independente da estrutura de dados escolhida para a sua representação. Ou seja, as operações a implementar devem ser aplicadas a qualquer tipo de estrutura de dados. A utilização de EAD esconde os dados e dá ênfase às operações (ações) sobre os dados. A EAD esconde os dados como uma cápsula esconde o seu conteúdo. A EAD fornece ao utilizador interfaces através das funções que implementam as operações na EAD. A representação interna dos dados, o armazenamento e a implementação das operações sobre os dados são escondidos dos utilizadores, os quais acedem e manipulam os dados. Por exemplo, nós usamos a EAD das operações aritméticas de inteiros +,, *, etc. sem conhecer como o inteiro é representado internamente num sistema computacional. Exemplos de Estruturas Abstratas de Dados são: Listas, Pilhas, Filas e Árvores.

1/34 GESTÃO DINÂMICA DE MEMÓRIA

1/34 GESTÃO DINÂMICA DE MEMÓRIA 1/34 GESTÃO DINÂMICA DE MEMÓRIA Memória Estática 2/34 Memória Estática Exemplo #include main() { int V[300], N; do{ printf ( N =? ); scanf ( %d, &N); while ((N < 0) (N > 300); for (i = 0; i

Leia mais

Estrutura de Dados. Aula 07 Alocação Dinâmica

Estrutura de Dados. Aula 07 Alocação Dinâmica Estrutura de Dados Aula 07 Alocação Dinâmica 2 ALOCAÇÃO DINÂMICA Existem três modos de reservar espaço de memória para o armazenamento de informações: 1ª - através do uso de variáveis globais (e estáticas).

Leia mais

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica Universidade Federal de Uberlândia Faculdade de Computação Linguagem C: ponteiros e alocação dinâmica Prof. Renato Pimentel 1 Ponteiros 2 Prof. Renato Pimentel 1 Ponteiros: introdução Toda a informação

Leia mais

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011 Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores 14/03/2011 e 16/03/2011 Uso da memória Existem 3 maneiras de reservar o espaço da memória: Variáveis globais (estáticas) Espaço existe enquanto

Leia mais

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores Uso da memória Existem 3 maneiras de reservar o espaço da memória: Variáveis globais (estáticas) Espaço existe enquanto programa estiver executando

Leia mais

Princípios de Desenvolvimento de Algoritmos MAC122

Princípios de Desenvolvimento de Algoritmos MAC122 Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP Alocação Dinâmica de Memória Motivação: Nossos programas pré-fixavam o número de variáveis a serem utilizadas. No caso

Leia mais

Programação. Cap. 12 Gestão de Memória Dinâmica

Programação. Cap. 12 Gestão de Memória Dinâmica Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre Cap. 12 Gestão de Memória Dinâmica Sumário : Utilização de memória Alocação

Leia mais

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal Exercício Crie uma função que recebe o número de dias até um determinado evento e calcula e retorna o equivalente em meses, semanas e dias, sem usar vetor ou o conceito de vetor. Considerar que todos os

Leia mais

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ Ponteiros em C Adriano Joaquim de Oliveira Cruz 21 de julho de 2017 Instituto de Matemática Departamento de Ciência da Computação UFRJ 1 Resumo da Seção Introdução Declaração Incrementando e Decrementando

Leia mais

1/36 LISTAS. Programação II

1/36 LISTAS. Programação II 1/36 LISTAS Estrutura de Dados 2/36 Estrutura de Dados Definição - Uma Estrutura de Dados é: - uma coleção de tipos de dados, composta por tipos não estruturados básicos, tipos estruturados ou uma mistura

Leia mais

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta Algoritmos e Estruturas de Dados Prof. Marcelo Zorzan Profa. Melissa Zanatta Assuntos da Aula Alocação de Memória Alocação estática de memória Alocação dinâmica de memória Malloc, Calloc, Free, Realloc

Leia mais

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio Programação II Vetores e Alocação Dinâmica Bruno Feijó Dept. de Informática, PUC-Rio Vetores (arrays) Vetor: estrutura de dados definindo um conjunto enumerável Exemplo: v = vetor de inteiros com 10 elementos

Leia mais

A linguagem C permite dois tipos de alocação de memória: Alocação estática e alocação dinâmica.

A linguagem C permite dois tipos de alocação de memória: Alocação estática e alocação dinâmica. Alocação de Memória Todo programa precisa utilizar memória para ser executado. Quando um programa inicia sua execução, ele começa a solicitar memória ao sistema operacional, ou seja, faz a alocação de

Leia mais

Ponteiros & tabelas (cont.) K&R: Capítulo 5

Ponteiros & tabelas (cont.) K&R: Capítulo 5 Ponteiros & tabelas (cont.) K&R: Capítulo 5 Sinopse da aula de hoje Pointers in a nutshell & alocação dinâmica de memória Estruturas, funções e apontadores Estruturas auto-referenciadas Exemplo de aplicação:

Leia mais

DAS5102 Fundamentos da Estrutura da Informação

DAS5102 Fundamentos da Estrutura da Informação Ponteiros e Funções Funções ou sub-rotinas são parcelas de código que podem ser invocadas a partir do programa principal ou até mesmo por outras sub-rotinas. Elas têm como objetivo a execução de uma tarefa

Leia mais

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto Programação I Ponteiros e alocação dinâmica de memória Prof. Carlos Alberto carlos.batista@facape.br carlos36_batista@yahoo.com.br Ponteiros O ponteiro é um tipo de dado como int, char ou float; Variáveis

Leia mais

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

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica Introdução a Programação Ponteiros e Vetores, Alocação Dinâmica Tópicos da Aula Hoje aprenderemos que existe uma forte relação entre ponteiros e vetores Associação entre ponteiros e vetores Ponteiros constantes

Leia mais

Alocação Dinâmica. Introdução à Computação

Alocação Dinâmica. Introdução à Computação Alocação Dinâmica Introdução à Computação Alocação de memória Uso da memória: uso de variáveis globais (e está>cas): O espaço reservado para uma variável global existe enquanto o programa es>ver sendo

Leia mais

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA 787878787878787878787878787878787878787878787878787878 13. ALOCAÇÃO DINÂMICA DE MEMÓRIA Sempre é necessário declarar o número de elementos do array. Mas e se ele for desconhecido? E se ele variar? Pode

Leia mais

O que é um apontador em C (type pointer in C)?

O que é um apontador em C (type pointer in C)? O que é um apontador em C (type pointer in C)? Um apontador é uma variável que contém um endereço de outra variável. int x = 10;//variável inteira iniciada com o valor 10 int *px = &x;//variável apontadora

Leia mais

LINGUAGEM C: ALOCAÇÃO DINÂMICA

LINGUAGEM C: ALOCAÇÃO DINÂMICA LINGUAGEM C: ALOCAÇÃO DINÂMICA Prof. André Backes DEFINIÇÃO Sempre que escrevemos um programa, é preciso reservar espaço para as informações que serão processadas. Para isso utilizamos as variáveis Uma

Leia mais

1/27. Registos (Estruturas - struct)

1/27. Registos (Estruturas - struct) 1/27 Registos (Estruturas - struct) Taxonomia de tipos de dados 2/27 Taxonomia de tipos de dados Simples - Numéricos - int (inteiros) - float (reais) - char (carateres) - Apontadores - * - Enumerados -

Leia mais

Alocação Dinâmica em C

Alocação Dinâmica em C Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação Alocação Dinâmica em C Profa Rosana Braga Adaptado de material preparado pela profa Silvana Maria Affonso de Lara

Leia mais

SSC304 Introdução à Programação Para Engenharias. Alocação Dinâmica. GE4 Bio

SSC304 Introdução à Programação Para Engenharias. Alocação Dinâmica. GE4 Bio Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Sistemas de Computação Introdução à Para Engenharias GE4 Bio GE4Bio Grupo de Estudos em Sinais Biológicos Prof.Dr.

Leia mais

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Estruturas de Dados Revisão de Ponteiros Prof. Ricardo J. G. B. Campello Sumário Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Operações Ponteiros e Arranjos

Leia mais

Modulo 12: alocação dinâmica de memória

Modulo 12: alocação dinâmica de memória PROGRAMAÇÃO DE COMPUTADORES V - TCC- 00.323 Modulo 12: alocação dinâmica de memória Aura - Erick aconci@ic.uff.br, erickr@id.uff.br Roteiro porque e como utilizar a alocação dinâmica funções: malloc (

Leia mais

Módulo 5 Vetores e Alocação Dinâmica

Módulo 5 Vetores e Alocação Dinâmica Estruturas de Dados Módulo 5 Vetores e Alocação Dinâmica 1/9/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora

Leia mais

Programação Computacional Aula 16: Alocação Dinâmica de Memória

Programação Computacional Aula 16: Alocação Dinâmica de Memória Programação Computacional Aula 16: Alocação Dinâmica de Memória Profa. Madeleine Medrano madeleine@icte.uftm.edu.br Definição Sempre que escrevemos um programa, é preciso reservar espaço para as informações

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação ET42G Aula 21 Prof. Daniel Cavalcanti Jeronymo Conversão de tipos. Alocação dinâmica de memória. Recursão. Criação de bibliotecas, arquivos de cabeçalhos e variáveis globais.

Leia mais

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco PONTEIROS E LISTAS Kalinka Regina Lucas Jaquie Castelo Branco kalinka@icmc.usp.br ALOCAÇÃO DINÂMICA DE MEMÓRIA Pode-se assumir que as variáveis declaradas na cláusula variável do pseudo-código do algoritmo

Leia mais

Reinaldo Gomes Alocação Dinâmica

Reinaldo Gomes Alocação Dinâmica Algoritmos e Lógica de Programação Linguagem C Alocação Dinâmica i de Memória Reinaldo Gomes reinaldo@cefet-al.br Alocação Dinâmica Quando declaramos uma variável ou um arranjo, o compilador automaticamente

Leia mais

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio Programação II Vetores e Alocação Dinâmica Bruno Feijó Dept. de Informática, PUC-Rio Vetores (arrays) Vetor: estrutura de dados definindo um conjunto enumerável Exemplo: v = vetor de inteiros com 10 elementos

Leia mais

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória Ponteiros - Parte I Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória Ponteiros Um ponteiro é uma variável que contém um endereço de memória. Esse endereço é normalmente

Leia mais

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal Exercícios 1) Crie uma função que recebe os coeficientes de uma função do 2o. grau e retorna as raízes sem usar vetor. 2) Faça um programa que acha o maior e o menor inteiro dentro de um vetor de 10 inteiros,

Leia mais

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013 Ponteiros e Tabelas K&R: Capitulo 5 Ponteiros e Tabelas Ponteiros e endereços Ponteiros e argumentos de funções Ponteiros e tabelas Alocação dinâmica de memória Aritmética de ponteiros Tabelas de ponteiros

Leia mais

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013 Ponteiros e Tabelas K&R: Capitulo 5 Ponteiros e Tabelas Ponteiros e endereços Ponteiros e argumentos de funções Ponteiros e tabelas Alocação dinâmica de memória Aritmética de ponteiros Tabelas de ponteiros

Leia mais

10 a Aula - Operadores de Molde ( Casting ). Atribuição de Memória. Ponteiros. Enumerados. Mestrado em Engenharia Física Tecnológica

10 a Aula - Operadores de Molde ( Casting ). Atribuição de Memória. Ponteiros. Enumerados. Mestrado em Engenharia Física Tecnológica 10 a Aula - Operadores de Molde ( Casting ). Atribuição de Memória. Ponteiros. Enumerados. Programação Mestrado em Engenharia Física Tecnológica Samuel M. Eleutério sme@tecnico.ulisboa.pt Departamento

Leia mais

Ponteiros em C. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

Ponteiros em C. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1 Ponteiros em C Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1 Índice Introdução Operações sobre Ponteiros Exemplos Ponteiros e Funções Alocação Dinâmica em C UDESC - Rui J. Tramontin Jr.

Leia mais

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 11 Gestão de Memória Dinâmica

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 11 Gestão de Memória Dinâmica Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre T. 11 Gestão de Memória Dinâmica 1 Sumário : Utilização de memória Alocação Estática de Memória Alocação Dinâmica de Memória

Leia mais

Alocação Estática e Dinâmica. Prof. M.Sc. Mariella Berger

Alocação Estática e Dinâmica. Prof. M.Sc. Mariella Berger Alocação Estática e Dinâmica Prof. M.Sc. Mariella Berger http://www.inf.ufes.br/~mberger mberger@inf.ufes.br mariellaberger@gmail.com Alocação Estática Estratégia de alocação de memória na qual toda a

Leia mais

Ponteiros. Introdução

Ponteiros. Introdução Ponteiros Introdução Conceito Um PONTEIRO ou APONTADOR é uma variável usada para armazenar um endereço de memória. Normalmente, o endereço armazenado em um PONTEIRO é a posição de uma outra variável na

Leia mais

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra CES-11 Algoritmos e Estruturas de Dados Carlos Alberto Alonso Sanches Juliana de Melo Bezerra CES-11 Revisão Tipos escalares primitivos Tipos constituídos de uma linguagem Ponteiros Alocação estática versus

Leia mais

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões. 1 Estruturas da linguagem C 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões. Identificadores Os identificadores seguem a duas regras: 1. Devem ser começados por letras

Leia mais

Aula 17: Ponteiros e Alocação Dinâmica em C

Aula 17: Ponteiros e Alocação Dinâmica em C Aula 17: Ponteiros e Alocação Dinâmica em C Fernanda Passos Universidade Federal Fluminense Programação de Computadores IV Fernanda Passos (UFF) Ponteiros e Alocação Dinâmica Programação de Computadores

Leia mais

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Linguagem C. Ponteiros. Alex Vidigal Bastos. Linguagem C Ponteiros Alex Vidigal Bastos alexvbh@gmail.com Ponteiros Ponteiros são variáveis que contém endereços. Estas variáveis apontam para algum determinado endereço da memória. Em geral, o ponteiro

Leia mais

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista Ponteiros SCC0202 - Algoritmos e Estruturas de Dados I Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista http://www.icmc.usp.br/~paulovic paulovic@icmc.usp.br Instituto de Ciências

Leia mais

1 Exercícios com ponteiros

1 Exercícios com ponteiros Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Oitava Aula Prática - 29 de outubro de 2010 O objetivo desta aula prática é exercitar ponteiros e funções. 1 Exercícios com ponteiros

Leia mais

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1 Estruturas de Dados Módulo 4 Funções 9/8/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004)

Leia mais

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Métodos Computacionais. Vetores e Matrizes Dinâmicas Métodos Computacionais Vetores e Matrizes Dinâmicas Vetores Um programa para o cálculo da média Média m n i= = 1 n x i Variância v n i= = 1 ( x i n m) 2 A forma mais simples de estruturar um conjunto de

Leia mais

1 Exercícios com ponteiros

1 Exercícios com ponteiros Computação para Informática Funções e Ponteiros1 EXERCÍCIOS COM PONTEIROS Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Funções e ponteiros O objetivo desta aula prática

Leia mais

Ponteiros. Introdução e Alocação Dinâmica

Ponteiros. Introdução e Alocação Dinâmica Ponteiros Introdução e Alocação Dinâmica Conceito Um PONTEIRO ou APONTADOR é uma variável usada para armazenar um endereço de memória. Normalmente, o endereço armazenado em um PONTEIRO é a posição de uma

Leia mais

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados Métodos Computacionais Operadores, Expressões Aritméticas e Entrada/Saída de Dados Tópicos da Aula Hoje aprenderemos a escrever um programa em C que pode realizar cálculos Conceito de expressão Tipos de

Leia mais

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Sistemas de Computação Introdução à Para Engenharias s GE4 Bio GE4Bio Grupo de Estudos em Sinais Biológicos Prof.Dr.

Leia mais

Tipos Abstratos de Dados. Estrutura de Dados

Tipos Abstratos de Dados. Estrutura de Dados Tipos Abstratos de Dados Tipo Abstrato de Dados ou TAD Idéia principal: desvincular o tipo de dado (valores e operações) de sua implementação: O que o tipo faz e não como ele faz! Vantagens da desvinculação:

Leia mais

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas Tipos Básicos Quantos valores distintos podemos representar com o tipo char? Estruturas de Dados Aula 2: Estruturas Estáticas 03/03/2010 Operadores de Incremento e Decremento ++ e -- Incrementa ou decrementa

Leia mais

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char? Estruturas de Dados Aula 2: Estruturas Estáticas Tipos Básicos Quantos valores distintos podemos representar com o tipo char? 1 Operadores de Incremento e Decremento ++ e -- Incrementa ou decrementa o

Leia mais

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011 Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011 Tipos Básicos Quantos valores distintos podemos representar com o tipo char? Operadores de Incremento e Decremento ++ e -- Incrementa ou decrementa

Leia mais

Programação: Vetores

Programação: Vetores Programação de Computadores I Aula 09 Programação: Vetores José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/62 Motivação Problema Faça um programa que leia

Leia mais

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR) Alocação de Memória Linguagem de Programação Estruturada 1 Alocação dinâmica e ponteiros Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR) Sumario Introdução Alocação Estática

Leia mais

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

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica Introdução a Programação Ponteiros e Strings, Alocação Dinâmica Tópicos da Aula Hoje aprenderemos a relação entre ponteiros e strings Ponteiros para strings X Vetores de Caracteres Vetores de ponteiros

Leia mais

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1 INF1007: Programação 2 2 Alocação Dinâmica 17/02/2014 (c) Dept. Informática - PUC-Rio 1 Tópicos Alocação dinâmica Vetores locais e funções 17/02/2014 (c) Dept. Informática - PUC-Rio 2 Alocação Dinâmica

Leia mais

Estrutura de dados 1. Ponteiros

Estrutura de dados 1. Ponteiros Estrutura de dados 1 Ponteiros Ponteiros Um ponteiro é um endereço de memória O valor de um ponteiro indica onde uma variável está armazenada Um ponteiro proporciona um modo de acesso a uma variável sem

Leia mais

Linguagem C Apontadores. Endereços e apontadores Passagem de parâmetros para funções Apontadores e vectores Memória dinâmica

Linguagem C Apontadores. Endereços e apontadores Passagem de parâmetros para funções Apontadores e vectores Memória dinâmica Linguagem C Apontadores Endereços e apontadores Passagem de parâmetros para funções Apontadores e vectores Memória dinâmica Endereços de Memória Podemos considerar a memória como um vector M, em que cada

Leia mais

Alocação dinâmica de Memória

Alocação dinâmica de Memória Alocação dinâmica de Memória Vetores e Arrays A variável vetor é uma variável que armazena outras variáveis, no caso tem que ser do mesmo tipo. Exemplo Criar um cont Declarar um vet com o tamanho Laço

Leia mais

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro pauloac@ita.br Sala 110 Prédio da Computação www.comp.ita.br/~pauloac IECE - ITA Revisão CES-11 Tipos escalares primitivos Tipos constituídos

Leia mais

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos REVISÃO DE C Vanessa Braganholo Estruturas de Dados e Seus Algoritmos REVISÃO DE C Ponteiros Alocação dinâmica de memória Recursão INSTITUTO DE COMPUTAÇÃO - UFF 2 PONTEIROS PONTEIROS C permite o armazenamento

Leia mais

Plano de Aula Segunda-feira Tarde 13/10/2014 Objetivo: Introduzir o conceito de alocação dinâmica na memória e registros / structs.

Plano de Aula Segunda-feira Tarde 13/10/2014 Objetivo: Introduzir o conceito de alocação dinâmica na memória e registros / structs. Instituto Federal de Santa Catarina - Câmpus Chapecó Ensino Médio Integrado em Informática - Módulo IV Unidade Curricular: Programação Estruturada Professora: Lara Popov Zambiasi Bazzi Oberderfer Plano

Leia mais

Alocação Dinâmica de Memória

Alocação Dinâmica de Memória Alocação Dinâmica de Memória Elerson R. S. Santos elerson@dcc.ufmg.br Algoritmos e Estruturas de DCC UFMG Variáveis Uma variável representa um nome simbólico para uma posição de memória. Cada posição de

Leia mais

Algoritmos e Estruturas de dados

Algoritmos e Estruturas de dados Algoritmos e Estruturas de dados Listas Encadeadas Prof. Dr. Fábio Rodrigues de la Rocha (Listas Encadeadas) 1 / 21 Definição: Anteriormente estudamos listas encadeadas que foram implementadas como vetores

Leia mais

Ponteiros e Tabelas. K&R: Capítulo 5

Ponteiros e Tabelas. K&R: Capítulo 5 Ponteiros e Tabelas K&R: Capítulo 5 Ponteiros e Tabelas Ponteiros e endereços Ponteiros e argumentos de funções Ponteiros e tabelas Alocação dinâmica de memória Aritmética de ponteiros Tabelas de ponteiros

Leia mais

Métodos Computacionais

Métodos Computacionais Métodos Computacionais Objetivos da Disciplina e Introdução a Linguagem C Construções Básicas Objetivos da Disciplina Objetivo Geral Discutir técnicas de programação e estruturação de dados para o desenvolvimento

Leia mais

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02 Programação 1 Atribuição, operadores aritméticos, entrada de dados Técnico em Eletrônica Semestre 5 02 Armazenando na memória tipo de variável #include #include main() { int ano; Declaração

Leia mais

Programação de Computadores II. Cap. 5 Alocação Dinâmica

Programação de Computadores II. Cap. 5 Alocação Dinâmica Programação de Computadores II Cap. 5 Alocação Dinâmica Livro: Waldemar Celes, Renato Cerqueira, José Lucas Rangel. Introdução a Estruturas de Dados, Editora Campus (2004) Slides adaptados dos originais

Leia mais

Introdução à Computação

Introdução à Computação Introdução à Computação Linguagem C Professor: André de Carvalho Aula de hoje Introdução Tipos compostos Tipo enumeração Conclusão Tipos compostos A Linguagem C permite criar tipos de dados definíveis

Leia mais

Estruturas Dinâmicas - Ponteiros

Estruturas Dinâmicas - Ponteiros SSC0800 - ICC1 Teórica Introdução à Ciência da Computação I Estruturas Dinâmicas - Ponteiros Prof. Claudio Fabiano Motta Toledo: claudio@icmc.usp.br Sumário Ponteiros Ponteiros e Vetores Funções para alocação

Leia mais

Ponteiros. Baseado nos slides do Prof. Mauro.

Ponteiros. Baseado nos slides do Prof. Mauro. Baseado nos slides do Prof. Mauro. A memória do computador é uma sequência de bytes, na qual endereçamos cada um sequencialmente. Como vimos, uma variável é uma região da memória que reservamos para armazenar

Leia mais

3. Linguagem de Programação C

3. Linguagem de Programação C Introdução à Computação I IBM1006 3. Linguagem de Programação C Prof. Renato Tinós Departamento de Computação e Matemática (FFCLRP/USP) 1 Principais Tópicos 3.6. Ponteiros 3.6.1. Introdução 3.6.2. Uso

Leia mais

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. LINGUAGEM C: FUNÇÕES Prof. André Backes FUNÇÃO Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. printf(): função que escreve na tela scanf(): função que lê o teclado

Leia mais

Introdução a Programação de Jogos

Introdução a Programação de Jogos Introdução a Programação de Jogos Aula 03 Introdução a Linguagem C Edirlei Soares de Lima Estrutura de um Programa C Inclusão de bibliotecas auxiliares: #include Definição

Leia mais

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Estruturas de Dados. Profa. Juliana Pinheiro Campos Estruturas de Dados Profa. Juliana Pinheiro Campos Vetores Forma mais simples de estruturar um conjunto de dados. Exemplo: int p[10]; // vetor de inteiros com 10 elementos Reserva de um espaço de memória

Leia mais

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros Métodos Computacionais Funções, Escopo de Variáveis e Ponteiros Tópicos da Aula Hoje vamos detalhar funções em C Escrevendo funções Comando return Passagem de argumentos por valor Execução de uma função

Leia mais

ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI) Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2017/2018

ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI) Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2017/2018 ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI) Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2017/2018 Apontadores O que é um apontador? Variável que contém

Leia mais

Ponteiros. prof. Fabrício Olivetti de França

Ponteiros. prof. Fabrício Olivetti de França Ponteiros prof. Fabrício Olivetti de França Anteriormente em prog. estrut. Vimos que as variáveis representando arrays em C armazenam apenas um apontador para o endereço de memória contendo os valores

Leia mais

Laboratório de Programação II

Laboratório de Programação II Laboratório de Programação II Aula 08 Prof. Diemesleno Souza Carvalho diemesleno@iftm.edu.br http://www.diemesleno.com.br Na aula passada vimos... Na aula passada vimos... 07 Entradas e saídas padronizadas;

Leia mais

Métodos Computacionais. Tipos Estruturados

Métodos Computacionais. Tipos Estruturados Métodos Computacionais Tipos Estruturados Tipos Estruturados C oferece tipos primitivos que servem para representar valores simples Reais (float, double), inteiros (int), caracter (char) C oferece também

Leia mais

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados Introdução à Programação Operadores, Expressões Aritméticas e Entrada/Saída de Dados Programa em C #include int main main ( ) { Palavras Reservadas } float celsius ; float farenheit ; celsius

Leia mais

Linguagem de Programação C. Ponteiros

Linguagem de Programação C. Ponteiros Cristiano Lehrer Conceitos Básicos (1/3) char ch; RAM 100 101 102... 5000 5001 5002... ch ch = 'A'; RAM ch A 100 101 102... 5000 5001 5002... char *; RAM ch A 100 101 102... 5000 5001 5002... = &ch; ch

Leia mais

Ponteiro. Ponteiro. Objetivo. Compreender a definição e dominar a implementação de ponteiros em C.

Ponteiro. Ponteiro. Objetivo. Compreender a definição e dominar a implementação de ponteiros em C. Ponteiro Definição de variável apontadora Aritmética de ponteiros Ponteiros e vetores Funções e passagem por referência Structs e ponteiros Alocação dinâmica de memória Objetivo Ponteiro Ponteiro Compreender

Leia mais

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

#include <stdio.h> Void main() { printf( Cheguei!\n); } INTRODUÇÃO A LINGUAGEM C #include Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C ANTES DO C ERA A LINGUAGEM B B foi essencialmente uma simplificação da linguagem BCPL. B só tinha um tipo de dado, que

Leia mais

Lista Encadeada (Linked List)

Lista Encadeada (Linked List) Lista Encadeada (Linked List) As listas ou listas encadeadas são a estrutura de dados mais simples concebível excetuando-se naturalmente os arrays. Listas encadeadas nada mais são que uma seqüência de

Leia mais

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. LINGUAGEM C: FUNÇÕES Prof. André Backes FUNÇÃO Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. printf(): função que escreve na tela scanf(): função que lê o teclado

Leia mais

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE Algoritmos ANSI C - Gerenciamento de Memória Copyright 2014 IFRN Agenda Introdução Alocação dinâmica Funções malloc free calloc realloc

Leia mais

Curso de Programação C em Ambientes Linux Aula 05

Curso de Programação C em Ambientes Linux Aula 05 Curso de Programação C em Ambientes Linux Aula 05 Centro de Engenharias da Mobilidade - UFSC Professores Gian Berkenbrock e Giovani Gracioli http://www.lisha.ufsc.br/c+language+course+resources Conteúdo

Leia mais

Programação Estruturada

Programação Estruturada Programação Estruturada Recursão Professores Emílio Francesquini e Carla Negri Lintzmayer 2018.Q3 Centro de Matemática, Computação e Cognição Universidade Federal do ABC Recursão Recursão 1 Recursão 2

Leia mais

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo Introdução à Ciência da Computação I Alocação Dinâmica Prof. Claudio Fabiano Motta Toledo Sumário Funções para alocação de memória Ponteiros para ponteiros 8/12/16 2 Funções para alocação de memória malloc(),

Leia mais

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes? Introdução à Ciência da Computação Ponteiros em C Prof. Ricardo J. G. B. Campello Sumário Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Operações Ponteiros

Leia mais

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

A sintaxe para se declarar uma variável do tipo ponteiro é dada por: Pense duas vezes e faça uma vez. Provérbio Chinês. PONTEIROS Um ponteiro nada mais é que uma variável capaz de armazenar um número hexadecimal que corresponde a um endereço de memória de outra variável.

Leia mais