Estrutura de Dados. Prof. Gustavo Willam Pereira. Créditos: Profa. Juliana Pinheiro Campos



Documentos relacionados
Linguagem C. TGSI Lógica de Programação / Linguagem C Prof. Marcos Roberto

Resumo da Introdução de Prática de Programação com C. A Linguagem C

Convertendo Algoritmos para a Linguagem C

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação

Algoritmos e Programação

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

Estrutura de Dados Básica

O COMPUTADOR. Introdução à Computação

Conceitos básicos da linguagem C

INTRODUÇÃO À LINGUAGEM C++

Variáveis e Comandos de Atribuição

Introdução a Computação

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

Programação: Tipos, Variáveis e Expressões

Programação: Estruturas de seleção

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

5 Apresentando a linguagem C

INF 1005 Programação I

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

Curso de Linguagem C

3. INTRODUÇÃO À LINGUAGEM C 3.1. CONCEITOS BÁSICOS. Lógica de Programação

LINGUAGEM C. Estrutura básica de um programa

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

Linguagem de Programação I

Algoritmos e Programação Estruturada

Algoritmo e Técnica de Programação - Linguagem C

cast poderia ser usado também para transformar um real (float) em inteiro. A sintaxe C (float)i pode ser substituída em C++ por float(i).

1 Funções básicas de implementação de arquivos

CONCEITOS BÁSICOS PARA A CONSTRUÇÃO DE ALGORITMOS PARA COMPUTADORES. Isac Aguiar isacaguiar.com.br isacaguiar@gmail.com

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

Programando em C++ Histórico da Linguagem C

P r o g r a m a ç ã o d e C o m p u t a d o r e s 1 o S e m P r o f. A n d r é A m a r a n t e L u i z L A B 5 tag %2d while printf PE1:

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

9 Comandos condicionais

IFTO LÓGICA DE PROGRAMAÇÃO AULA 05

Algoritmos e Estruturas de Dados I 01/2013. Estruturas Condicionais e de Repetição (parte 2) Pedro O.S. Vaz de Melo

Java Como Programar, 8/E

Introdução à Programação

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

7. Estrutura de Decisão

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Programação Estruturada I

compreender a importância de cada estrutura de controle disponível na Linguagem C;

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

E/S CPU. Memória (Instruções e dados) 2 PARADIGMA IMPERATIVO. Instruções e dados. Resultados das operações. Unidade lógica e aritmética

AULA 2: INTRODUÇÃO A LINGUAGEM DE C. Curso: Ciência da Computação Profª.: Luciana Balieiro Cosme

A declaração de uma variável vel define o seu tipo. O tipo do dado define como ele será: Armazenado na memória. Manipulado pela ULA.

Introdução a Linguagem C

José Romildo Malaquias

INF 1007 Programação II

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

Estrutura Condicional em Java

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Componentes da linguagem C++

LTP-IV. Prof. Dr. Silvio do Lago Pereira. Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Representação de Algoritmos - Linguagens de Programação

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

Algoritmos e Estruturas de Dados I. Universidade Federal de São João del-rei Pedro Mitsuo Shiroma Sala 119 Bloco 3

LÓGICA DE PROGRAMAÇÃO. Vitor Valerio de Souza Campos

Regras Métodos Identificadores Variáveis Constantes Tipos de dados Comandos de atribuição Operadores aritméticos, relacionais e lógicos

Introdução a C Tipos de Dados Variáveis Operadores

Computação II Orientação a Objetos

Plano de Aula. if(condição) { bloco de comandos; } else { bloco de comandos2; }

Tipo de Dados em Linguagem C

Curso Prático de C++

Introdução à Linguagem C

Linguagens de Programação

ALGORITMOS MEMÓRIA, VARIÁVEIS E CONSTANTES, OPERADORES Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Algoritmos e Técnicas de

Algoritmos e Programação. Curso de Engenharia de Produção Prof. Ms. Rogério Cardoso rogerio.cardoso@aedu.com professor@rogeriocardoso.com.

Elementos de programação em C

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano

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

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

JSP - ORIENTADO A OBJETOS

ITENS FUNDAMENTAIS. Profª Angélica da Silva Nunes

LINGUAGEM C UMA INTRODUÇÃO

Universidade Federal de Rondônia Técnicas de Desenvolvimento de Programas Lista 4

15 a Aula Subprogramação /Subalgoritmos Função e Procedimento

Programação Básica em Arduino Aula 2

Introdução à Linguagem C

Conceitos Básicos de C

VIII. VARIÁVEIS. Tabela I ARQUITETURA DA MEMÓRIA. 0x0000 0x34 0x0001 0xB0 0x0002 0x23. 0xFFFF 0x00

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

LINGUAGEM C UMA INTRODUÇÃO

Linguagens de Programação

Estruturas de Repetição

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Algoritmos Estruturas Seqüenciais. José Gustavo de Souza Paiva

Testando e Comparando Valores

Linguagem de Programação C

Algumas notas sobre PASCAL

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

Conceitos de Linguagens de Programação

Laboratório de Programação I

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

Transcrição:

Estrutura de Dados Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

ESTRUTURAS DE DADOS Ementa Introdução à Linguagem C. Recursividade. Alocação dinâmica de memória. Conceito de tipos abstratos de dados. Listas Pilhas Filas Árvores. Implementação de tipos abstratos de dados.

CONCEITOS BÁSICOS Estruturas de dados: Forma particular de armazenamento e organização dos dados em um computador de modo que possam ser recuperados e usados posteriormente de forma eficiente. Alguns tipos de estruturas são adequadas a diferentes tipos de aplicação, destinando-se a tarefas específicas.

CONCEITOS BÁSICOS Estruturas de dados e algoritmos: Algoritmo: É um conjunto determinado de instruções (ações) que quando seguidas desempenham uma tarefa particular. As estruturas de dados estão altamente relacionadas aos algoritmos que as manipulam: Algoritmos e estruturas de dados devem ser consideradas como unidades distintas e complementares. A escolha de um algoritmo a ser utilizado depende da representação e da estrutura dos dados.

CONCEITOS BÁSICOS Estruturas de dados estáticas e dinâmicas: Estáticas: A alocação de memória para essas estruturas é realizada antes que o programa entre em execução. Não oferece suporte adequado para inserção e remoção de elementos dinamicamente. Homogêneas: vetores e matrizes Heterogêneas: tipos estruturados (registros) Dinâmicas: A alocação de memória para essas estruturas é realizada durante a execução do programa, conforme a necessidade. Listas, filas, pilhas, árvores, etc.

ESTRUTURAS DE DADOS Linguagem C C é uma linguagem de programação compilada, estruturada e de alto nível. É uma das linguagens de programação mais populares. Oferece acesso a endereços de variáveis

A história de C C nasceu na década de 70. Seu inventor, Dennis Ritchie, implementou-o pela primeira vez usando um DEC PDP-11 rodando o sistema operacional UNIX. C é derivado de uma outra linguagem: o B, criado por Ken Thompson. B, por sua vez, veio da linguagem BCPL, inventada por Martin Richards. 7

A história de C Dados históricos: 1969 - Desenvolvimento do UNIX (num PDP 7 em linguagem Assembly); 1969 - Desenvolvimento da linguagem BCPL, próxima do Assembly; 1970 - Desenvolvimento da linguagem B, sucessora da anterior (o B é a 1ª letra de BCPL); 1971 - Primeiro desenvolvimento da linguagem C, sucessora da anterior (o C é a 2ª letra de BCPL); 1973 - O sistema operativo UNIX é reescrito em linguagem C; 1978 - Primeira edição do livro The C Programming Language, Kernighan & Ritchie; 1983-1988 - Definição do ANSI C; 8

História das Linguagens de Programação

A linguagem C: CONCEITOS BÁSICOS Linguagem convencional Devemos reservar uma área na memória para armazenar cada dado. Um programa em C é constituído de diversas funções pequenas, independentes entre si. Função principal (main) automaticamente executada após o programa ser carregado. Tempo de vida e visibilidade das variáveis: Variáveis locais; Variáveis globais;

ESTRUTURAS DE DADOS Ambiente de Desenvolvimento Integrado Dev C++: Ambiente gratuito para programação em C e C++. http://www.bloodshed.net/devcpp.html Microsoft Visual C++ Express Edition http://www.microsoft.com/visualstudio/en-us/products/2010- editions/visual-cpp-express

CONCEITOS BÁSICOS Linguagem C x Linguagem Pascal: Comando Pascal C Comentários { comentario} /* comentario */ Identificadores Não é case sensitive É case sensitive Definição de tipos type typedef Declaração de inteiros integer int Declaração de caracter char char Boolean Boolean tratado como true ou false Não há tratado como 0 ou 1 Real real Float ou double Tipos enumerados type a = (vermelho, verde, azul) enum a {vermelho, verde, azul};

CONCEITOS BÁSICOS Linguagem C x Linguagem Pascal: Comando Pascal C Vetores Strings Limites definidos pelo programador. Ex: var a = array[1..10] of integer; Tipo pré-definido tratado internamente como array. Começa da posição 0 e vai até n 1 (sendo n o tamanho do vetor). Ex: int a[10]; O tipo string não é definido. Deve-se criar um vetor de char. Registros record struct Atribuição := =

CONCEITOS BÁSICOS Linguagem C x Linguagem Pascal: Operadores Pascal C Aritméticos +, -, *, /, div, mod +, -, *, /, %, ++, -- Relacionais >, <, >=, <=, =, <> >, <, >=, <=, ==,!= Lógicos and, or &&, Atribuições especiais Não há +=, -=, *=, /=, %=

CONCEITOS BÁSICOS Linguagem C x Linguagem Pascal: Estruturas de controle Pascal if cond then stmt else stmt while cond do stmt repeat stmt until cond for id := expr to expr do stmt case expr of expr : stmt;... expr : stmt; else: stmt; end C if (cond) stmt else stmt while (cond) stmt do stmt while (cond) for (expr; cond; expr) stmt switch (expr) { case expr : stmt;... case expr : stmt; default: stmt }

CONCEITOS BÁSICOS Linguagem C x Linguagem Pascal: Exemplo de programa que imprime Olá Mundo! Pascal Program ola; Begin writeln( Olá mundo! ); end. C #include <stdio.h> int main() { printf( Olá mundo! ); }

CONCEITOS BÁSICOS Declaração e inicialização de variáveis: int a, b; float c; c = 5.3; int a = 10; Valores constantes: a = b + 13 a = b + 12.5; // sem sufixo, é real do tipo double a = b + 12.5f; // real do tipo float exige sufixo f ou F Variáveis com valores indefinidos: int a, b, c; a = 2; c = a + b; ERRO: b tem lixo!!!

CONCEITOS BÁSICOS Operadores: Aritméticos: adição (+), subtração (-), multiplicação (*), divisão (/), módulo (%); Atribuição: simples (=),compostos (+=, -=, *=, /=, %=); De incremento e decremento: incremento (++), decremento (--); Relacionais: menor que (<), maior que(>), menor ou igual que (<=), maior ou igual que (>=), igual (==), diferente (!=). Lógicos: e/and (&&), ou/or ( ), negação/not (!)

CONCEITOS BÁSICOS Exemplos de utilização de operadores: Quais serão os valores armazenados nas variáveis a, b, c? int a; double b, c; a = 3.5; b = a / 2.0; c = 1/3 + b; Resposta: a = 3, b = 1.5, c = 1.5.

CONCEITOS BÁSICOS Exemplos de utilização de operadores: x%2; a = 5; // operador % se aplica somente a operandos inteiros // o valor resultante é o valor atribuído y = x = 5; x *= y + 1; // var op= expr var = var op (expr) x = n++; x = ++n; // incrementa em uma unidade o valor de n int c = 23, d = c + 4; a = (c < 20) (d > c); // armazena o valor 1 em a b = (c < 20) && (d > c); // armazena o valor 0 em b

Operadores Operadores Combinados x = x op y; x op= y; Expressão Normal a = a + b; a = a - b; a = a * b; a = a / b; a = a % b; Expressão Simplificada a+=b; a-=b; a*=b; a/=b; a%=b;

CONCEITOS BÁSICOS Operador sizeof Retorna o número de bytes de um determinado tipo. Exemplo: int x = sizeof(int); printf("número de bytes ocupado pelo inteiro tipo inteiro é: %i \n", x);... sizeof(int) retorna 2 ou 4 dependendo do inteiro natural da máquina

CONCEITOS BÁSICOS Conversão de tipos Operador cast: operador de molde de tipo Exemplo int a; a = (int) 3.5; printf("a = %i", a); O valor impresso de a é 3 porque o valor 3.5 foi convertido para inteiro

Operador de Modelagem Exemplo de operador de modelagem /* Exemplo utilizando moldagem (cast) */ #include <stdio.h> void main(void) { int dividendo=10, divisor=3; float quociente=0.0; quociente = (float)dividendo / divisor; printf("%d/%d = %.2f\n", dividendo, divisor, quociente); getchar(); }

CONCEITOS BÁSICOS Entradas e saídas básicas As operações de entrada e saída em C são feitas com o uso de funções. Para utilizar essas funções é necessário incluir o protótipo das funções no código. Para isso, devese incluir a biblioteca: #include <stdio.h>

CONCEITOS BÁSICOS Entradas e saídas básicas Função printf: Possibilita a saída de valores em um formato específico. printf(formato, lista de constantes/variáveis/expressões); Deve existir um especificador de formato correspondente (Ex: %c, %d, %f, %s, ) Ex: printf( Inteiro: %d, real: %f, 5, 3.4); Função scanf: Permite capturar valores fornecidos via teclado pelo usuário do programa e armazená-los em variáveis. scanf(formato, lista de endereços das variáveis ); Ex: int n; scanf( %d, &n);

OUTROS COMANDOS DE ENTRADA A tabela a seguir exibe outras funções que podem ser utilizadas para entrada de dados, ou seja funções de leitura: Função getchar ( ) getche(),getch() gets ( ) puts ( ) Operação lê um caractere; espera por <enter> lê um caractere ; não espera por <enter> lê uma string via teclado Imprime uma string na tela 27

scanf e printf Tabela contendo códigos de formatação para printf e scanf: Código printf scanf %d imprime um inteiro decimal lê um inteiro decimal %f ponto decimal flutuante lê um numero com ponto flutuante %s string de caracteres lê uma string de caracteres %c um único caractere lê um único caractere %p imprime um ponteiro lê um ponteiro %% imprime % na tela 28

Linguagem C CONCEITOS BÁSICOS Exemplo de programa que lê e Mostra Idade #include <sdtio.h> #include <conio.h> void main() { clrscr(); int idade; char nome[30]; printf( Digite sua Idade: ); scanf( %d,&idade); printf( Seu Nome: ); scanf( %s,nome); /* Strings não utilizar & na leitura */ printf( %s sua idade e %d anos. \n, nome, idade); } C

O tamanho e precisão do campo O tamanho do campo indica quantas posições da saída serão utilizados para exibir o valor correspondente à um especificador de formato. O tamanho do campo é determinado colocando-se um número entre o % e o caracter indicador do formato. Por exemplo, %5d indica que o valor a ser impresso vai ocupa 5 posições na tela. Por padrão, as posições em excesso são preenchidas com brancos e o valor é alinhado à direita do campo. 30

O tamanho e precisão do campo Se o tamanho do campo for precedido por um símbolo - (menos), então o valor será alinhado à esquerda do campo. Se o tamanho do campo for precedido com o símbolo 0 (zero), então as posições excedentes são preenchidas com zeros. Sempre que o tamanho do campo for insuficiente para exibir o valor solicitado, este tamanho é ignorado. Desta forma um valor nunca é truncado. 31

O tamanho e precisão do campo Para valores em ponto-flutuante, pode-se definir o número de casas decimais a serem impressas, colocando-se o um ponto (.) e outro número depois do tamanho do campo. Por exemplo, o formato %10.2f, exibe o valor em pontoflutuante com duas casas decimais, dentro de um campo de tamanho 10. Se esta mesma lógica for utilizada com strings (formato %s), o valor antes do ponto continua indicando a tamanho do campo, porém a segunda parte limitará o número máximo de caracteres da string a serem impressos. 32

CONCEITOS BÁSICOS Controle de fluxo: C provê as construções fundamentais de controle de fluxo necessárias para programas bem estruturados. Tomadas de decisão: if (expr){ } bloco de comandos 1 OU Operador condicional: if(expr) {... } else { condicao? expressao1 : expressao2; bloco de comandos 1 bloco de comandos 2... } ou

Controle de fluxo: CONCEITOS BÁSICOS Construções com laços: while (expr) { bloco de comandos } for (expr_inicial; expr_booleana; expr_de_incremento) ou { bloco de comandos }

Controle de fluxo: CONCEITOS BÁSICOS Construções com laços: do { bloco de comandos } while (expr_booleana); ou OBS: O bloco de comandos será executado pelo menos uma vez.

Controle de fluxo: CONCEITOS BÁSICOS Interrupções com break: Quando utilizado dentro de um laço, interrompe e termina a execução do mesmo. Interrupções com continue: Quando utilizado dentro de um laço, interrompe a execução e passa para a próxima iteração. ou

Controle de fluxo: Seleção: CONCEITOS BÁSICOS switch(expr){ case op1: break; case op2: break; default: break; } Inteiro ou uma constante caractere Se break for omitido, a execução do caso continua com os comandos do caso seguinte. ou Executado quando expr for diferente de todos os casos enumerados.

CONCEITOS BÁSICOS Exercícios: 1) Implemente um programa que faz a conversão de um valor de temperatura na escala Celsius para a Fahrenheit formula: F = C 1,8 + 32. 2) Faça um programa para calcular o Índice de Massa Corporal (IMC) e, com base no resultado, informar a categoria à qual o indivíduo pertence, de acordo com a tabela mostrada abaixo. O IMC é definido como a relação entre o peso e a altura ao quadrado. A altura deve ser dada em metros e o peso em kg. O IMC é calculado de acordo com a fórmula dada a seguir e as categorias são definidas pelos limites abaixo:

CONCEITOS BÁSICOS Exercícios: 3) Escreva um programa que faça uma contagem regressiva usando while a partir do número digitado pelo usuário. O programa deve fazer isso enquanto o valor digitado for positivo.

CONCEITOS BÁSICOS Exercícios: 4) Escreva um algoritmo em C que determine o conceito da nota do estudante de acordo com seu valor Nota maior ou igual a 90 => A Nota no intervalo de 80 a 89 => B Nota no intervalo de 70 a 79 => C Nota no intervalo de 60 a 69 => D Para as demais notas R

CONCEITOS BÁSICOS Funções Funções é o mecanismo adequado para codificar tarefas específicas. Vantagens: Facilita a codificação: codificar diversas funções pequenas é mais fácil que codificar uma única maior. Funções específicas podem ser facilmente reutilizadas em outros códigos. Tipo geral { } tipo_retornado nome_da_função (lista de parâmetros...) corpo da função

Funções CONCEITOS BÁSICOS { } tipo_retornado nome_da_função (lista de parâmetros...) corpo da função tipo_retornado = void indica o não retorno de um valor tipo_retornado = int, char, float, retorna um valor do tipo definido tipo_retornado = int*, char*, retorna um ponteiro para int, char, OBS: Funções retornam um único valor!

Funções CONCEITOS BÁSICOS tipo_retornado nome_da_função (lista de parâmetros...) { corpo da função } nome_da_função: identificador da função no programa. lista de parâmetros: declarações de variáveis que serão usadas na função. corpo da função: instruções que serão executadas quando a função for chamada.

CONCEITOS BÁSICOS Exemplos de funções void imprimemensagem() { printf( Ola Mundo! ); } float calculamedia(float a, float b) { float media = 0; media = (a + b)/2; return media; }

CONCEITOS BÁSICOS Funções C exige que se coloque o protótipo da função antes de ela ser chamada. Protótipo: consiste na repetição da linha de sua definição seguida do caractere ;. Não há necessidade de indicar o nome dos parâmetros, só os tipos. A transferência de dados entre funções é feita com o uso de parâmetros e do valor de retorno da função chamada.

CONCEITOS BÁSICOS Chamada à função (tipo geral) identificador(listadeargumentos); ATENÇÃO: tipo_retornado definido!

ESTRUTURAS DE DADOS Chamada à função (exemplos) imprimemensagem(); float a = 10.5; float b = 13.5; float c; c = calculamedia(a,b); printf("media = %f", calculamedia(10.5, 13.5));

ESTRUTURAS DE DADOS Passagem de parâmetros por valor Exemplo: int main(){ float a = 10.5; float b = 3.5; float m = calculamedia(a,b);... } float calculamedia(float c, float d){ float media = 0; media = (c + d)/2; return media; } c = a d = b c a b m d média Escopo: função main Escopo: função média 10.5 3.5 7 10.5 3.5 7 E0 E4 Retorna média calculada E250 E254

ESTRUTURAS DE DADOS Exemplo: Cálculo do fatorial #include <stdio.h> int fat(int n){ int f = 1, i; for(i = n; n!=0; n-- ) f*=n; return f; } int main(void) { int n = 5; int r; r = fat(n); printf("fatorial de %d = %d \n", n, r); system("pause"); return 0; } No final da função fat, o parâmetro n tem valor igual a zero. No entanto, a saída do programa será: Fatorial de 5 = 120. O valor da variável n não mudou no programa principal porque o valor de n passado é atribuído ao parâmetro da função chamada.

ESTRUTURAS DE DADOS Passagem de parâmetros por valor Uma função pode retornar um tipo de valor para a função que chama. Muitas vezes, é necessário transferir mais do que um valor para a função que chama, e isso não pode ser feito com o retorno explícito de valores. Ex: função que calcula a soma e o produto de dois números.

ESTRUTURAS DE DADOS Ponteiros Ponteiros são variáveis que armazenam valores de endereços de memória. Declaração de variável do tipo ponteiro : tipo *nome; tipo: tipo do valor armazenado no endereço de memória nome: identificador do ponteiro Ex: int a; int *p; Variável de nome a que pode armazenar valores inteiros. Automaticamente, reserva-se um espaço na memória suficiente para armazenar valores inteiros. Variável de nome p que pode armazenar endereços de memória em que existe um valor inteiro armazenado.

Ponteiros ESTRUTURAS DE DADOS Operador unário * (conteúdo de) Acessa o conteúdo do endereço de memória armazenado pela variável ponteiro. Operador unário & (endereço de) Resulta no endereço da posição da memória reservada para a variável.

ESTRUTURAS DE DADOS Ponteiros Exemplos int a; // variável simples int *p; // ponteiro para inteiro Pilha de execução p - 108 a - 104

Ponteiros Exemplos ESTRUTURAS DE DADOS int a; // variável simples int *p; // ponteiro para inteiro a = 5; p = &a; *p = 6; Pilha de execução Dizemos que p aponta para a, por isso o nome ponteiro. p 104-108 a 6-5 104

ESTRUTURAS DE DADOS Ponteiros Exemplos Outra representação: Podemos desenhar setas, sinalizando que uma variável do tipo ponteiro aponta para uma determinada área de memória, em vez de criar valores fictícios para os endereços de memória. p a Pilha de execução 6

Ponteiros int main(){ } int a, b, *p; a = 2; *p = 3; b = a + (*p); printf( %d, b); return 0; ESTRUTURAS DE DADOS Erro: Variável p não inicializada! Só podemos preencher o conteúdo de um ponteiro se ele tiver sido devidamente inicializado (apontar para um espaço de memória para o qual já se prevê o armazenamento de valores do tipo em questão).

ESTRUTURAS DE DADOS #include <stdio.h> int main() { int a; // a é um inteiro int *aptr; // aptr é um apontador p/ um inteiro a = 7; aptr = &a; // aptr aponta para o endereço de a printf("o endereço de a : %p \n", &a ); printf("o endereço de a : %p \n", aptr ); printf("o endereço de aptr : %p \n", &aptr); } printf("o valor de a : %d \n", a) ; printf("o valor de a : %d \n", *aptr) ; system("pause"); return 0;

ESTRUTURAS DE DADOS Passagem de parâmetros por referência É quando é passado o endereço de uma variável como parâmetro. Se vai passar o endereço de uma variável, deve existir uma variável do tipo ponteiro para recebê-la. Ex: 5) Função para calcular a soma e o produto de dois números. Toda vez que desejarmos alterar um valor de uma variável da função que chama dentro da função chamada, devemos passar o endereço da variável.

ESTRUTURAS DE DADOS Passagem de parâmetros por referência Exercício: 6) Implemente uma função para trocar os valores entre duas variáveis dadas. Para que os valores das variáveis da função principal sejam alterados dentro da função auxiliar que faz a troca, precisamos passar para a função os endereços das variáveis.

A relação entre ponteiros e arrays Em C++ arrays e ponteiros estão intimamente relacionados e podem ser usados de maneira quase intercambiável. Um nome de array pode ser encarado como um ponteiro constante. Os ponteiros podem ser usados para fazer qualquer operação envolvendo indexação de arrays. Ex: int b[ 5 ]; int *bptr; bptr = b; ou bptr = &b[ 0 ]; // bptr aponta para b[ 0 ]

Expressões com ponteiros e aritmética de ponteiros Ponteiros são operandos válidos em expressões aritméticas Porém nem todos os operadores usados nestas expressões são válidos com variáveis do tipo ponteiro Um conjunto limitado de operações pode ser executado com ponteiros Um ponteiro pode ser incrementado (++) Um ponteiro pode ser decrementado (--) Um inteiro pode ser somando a um ponteiro (+ ou +=) Um inteiro pode ser subtraído de um ponteiro (- ou - =) Um ponteiro pode ser subtraído de outro

Expressões com ponteiros e aritmética de ponteiros Variável ponteiro vptr podendo ser inicializada como vptr = v; ou vptr = &v [0]; Na aritmética convencional teríamos : 3000 + 2 = 3002 Na aritmética de ponteiros teremos vptr = vptr + 2; //aqui o ponteiro é incrementado pelo tamanho do objeto inteiro al qual o ponteiro se refere. O número de bytes depende do tipo de dado do objeto O resultado de vptr = vptr + 2; // produziria 3008 (3000 + 2 * 4)

Expressões com ponteiros e aritmética de ponteiros Se um ponteiro esta sendo incrementado ou decrementado por um, podem ser usados os operadores de incremento (++) e decremento (- -); Ex: ++vptr ou vptr++ // incrementa o ponteiro para apontar para // a próxima posição do array. Ex: --vptr ou vptr-- // decrementa o ponteiro para apontar para o // elemento precedente do array. Variáveis ponteiros que apontam para o mesmo array podem ser subtraídas umas das outras. Ex: vptr aponta para a posição 3000 e v2ptr aponta para a posição 3008, o comando X = v2ptr vptr; //atribuiria a x o número de elementos de array de //vptr até v2ptr, neste caso 2.

#include <stdio.h> void bubblesort( int *array, const int size ); void swap( int* element1ptr, int* element2ptr); int main() { const int arraysize = 10; int a[] = {2,6,4,8,10,12,89,68,45,37}; int i; } bubblesort( a, arraysize ); // sort the array printf("\ndata items in ascending order\n"); for ( i = 0; i < arraysize; i++ ) printf("%5d", a[i]); system("pause"); return 0; void bubblesort( int *array, const int size ) { int pass, j; for(pass = 0; pass < size - 1; pass++) for (j = 0; j < size - 1; j++ ) if ( array[ j ] > array[ j + 1 ] ) swap( &array[ j ], &array[ j + 1 ] ); } void swap(int* element1ptr, int* element2ptr) { int aux; aux = *element1ptr; *element1ptr = *element2ptr; *element2ptr = aux; }

Variáveis globais ESTRUTURAS DE DADOS Uma variável global é declarada fora do corpo das funções e é visível a todas as funções subseqüêntes. As variáveis globais não são armazenadas na pilha de execução e existem enquanto o programa estiver sendo executado. O uso de variáveis globais deve ser feito com critério, pois podemos criar um alto grau de interdependência entre as funções.

ESTRUTURAS DE DADOS Variáveis estáticas As variáveis estáticas são armazenadas na área de memória estática. As variáveis estáticas continuam existindo mesmo antes ou depois de a função ser executada. Porém, uma variável estática declarada dentro de uma função só é visível dentro dessa função. Uma utilização interessante é quando se necessita recuperar o valor de uma variável atribuída na última vez em que a função foi executada.

Variáveis estáticas ESTRUTURAS DE DADOS Ex: Função para imprimir números reais. Ela imprime um número por vez, separando-os por espaço em branco e coloca, no máximo, 5 números por linha. void imprime (float a) { static int n = 1; printf( %f, a); if((n%5) == 0) printf( \n ); } n++;

Variáveis estáticas ESTRUTURAS DE DADOS Variáveis globais também podem ser declaradas como estáticas. Nesse caso, não podem ser acessadas por funções definidas em outros arquivos. Funções também podem ser declaradas como estáticas, não podendo ser acessadas por funções definidas em outros arquivos.

Exercicios 1) Implemente uma função que retorne a soma dos n primeiros números naturais ímpares. Essa função deve obedecer ao protótipo: int soma_impares (int n); Ex: Para n = 2 soma = 1 + 3 = 4. Para n = 3 soma = 1 + 3 + 5 = 9, etc. 2) Implemente uma função que retorne uma aproximação do valor de pi de acordo com a fórmula de Leibniz: A função deve obedecer ao seguinte protótipo, em que n indica o número de termos que devem ser usados para avaliar o valor de pi: double pi(int n);

Exercicios 3) Escreva uma função potencia (base, expoente) que, quando chamada, retorna base^expoente. Por exemplo, potencia (3, 4) = 3 * 3 * 3 * 3. Assuma que expoente é um inteiro maior ou igual a 1. 4) Escreva um programa que lê 10 notas digitadas pelo usuário, armazena estas notas em um arranjo de tamanho 10. Imprime a soma, e a média das notas, a maior e a menor nota. Depois seu programa deve exibir as notas dos alunos em ordem crescente.

Exercicios 4 Para cada um dos seguintes itens, escreva um único comando para executar a tarefa indicada. Assuma que as variáveis de ponto flutuante number1 e number2, foram declaradas e que number1 foi inicializado com 7,3. Declare a variável fptr como um ponteiro para um objeto do tipo double. Atribua o endereço da variável number1 a variável ponteiro fptr Imprima o valor do objeto apontado por fptr Atribua o valor do objeto apontado por fptr a variável number2 Imprima o valor de number2 Imprima o endereço de number1 Imprima o endereço armazenado em fptr. O valor impresso é o mesmo que o endereço de number1 (sim/não)

Exercicios 5 - Escreva um programa completo em C, que declara um registro Aluno com os seguintes dados (Matricula, Nome, Curso). Implemente o construtor da classe para inicializar os dados. Implemente um método (função) para entrada de dados e um método para impressão de dados. No programa principal declare um vetor para armazenar 10 alunos, implemente um menu com as seguintes opções: 1 Cadastrar Aluno 2 Imprimir listagem de todos os alunos 3 Sair