Вы находитесь на странице: 1из 76

Algoritmos e estrutura de dados

Aula 1: Revisão de Programação Computacional.

Universidade Federal do Triângulo Mineiro

Professor Me. Rooney R. A. Coelho

21 de Agosto de 2017

Roteiro da Apresentação

1
1

Vetores e matrizes - arrays Arrays com uma dimensão - Vetor Arrays com múltiplas dimensões - Matriz

2
2

Funções Passagem de valores por referência Arrays e funções

3
3

Ponteiros Aritmética de Ponteiros Ponteiro para ponteiro Ponteiro para função

Próximo Tópico

1
1

Vetores e matrizes - arrays Arrays com uma dimensão - Vetor Arrays com múltiplas dimensões - Matriz

2
2

Funções Passagem de valores por referência Arrays e funções

3
3

Ponteiros Aritmética de Ponteiros Ponteiro para ponteiro Ponteiro para função

Arrays com uma dimensão - Vetor

O que é?

Conjunto de variáveis de um mesmo tipo agrupado sequencialmente na memória e acessado por um índice.

Arrays com uma dimensão - Vetor

O que é?

Conjunto de variáveis de um mesmo tipo agrupado sequencialmente na memória e acessado por um índice.

Conjunto de variáveis de um mesmo tipo;

Arrays com uma dimensão - Vetor

O que é?

Conjunto de variáveis de um mesmo tipo agrupado sequencialmente na memória e acessado por um índice.

Conjunto de variáveis de um mesmo tipo;

Todas associadas ao mesmo nome e igualmente acessíveis por um índice.

Arrays com uma dimensão - Vetor

O que é?

Conjunto de variáveis de um mesmo tipo agrupado sequencialmente na memória e acessado por um índice.

Conjunto de variáveis de um mesmo tipo;

Todas associadas ao mesmo nome e igualmente acessíveis por um índice.

tipo nome[tamanho];

Arrays com uma dimensão - Vetor

#include <stdio.h> int main(){ int notas[100]; int i; for (i=0; i<100; i++){ printf("Digite a nota do aluno %d: ",i); scanf("%d",&notas[i]);

}

return 0;

}

Arrays com uma dimensão - Vetor

Todas as notas dos alunos estão agora armazenadas na mesma estrutura de inteiros e são acessadas pelo índice.

notas[0] = 81; notas[1] = 55;

notas[99] = 72;

Arrays com uma dimensão - Vetor

Todas as notas dos alunos estão agora armazenadas na mesma estrutura de inteiros e são acessadas pelo índice.

notas[0] = 81; notas[1] = 55;

notas[99] = 72;

O uso de arrays permite usar comandos de repetição.

Arrays com uma dimensão - Vetor

Todas as notas dos alunos estão agora armazenadas na mesma estrutura de inteiros e são acessadas pelo índice.

notas[0] = 81; notas[1] = 55;

notas[99] = 72;

O uso de arrays permite usar comandos de repetição.

Um array é um agrupamento de dados do mesmo tipo, adjacentes na memória.

Arrays com uma dimensão - Vetor

Nome: indica onde esses dados começam na memória.

Arrays com uma dimensão - Vetor

Nome: indica onde esses dados começam na memória.

Índice: quantas posições se deve pular para acessar determinada posição.

Arrays com uma dimensão - Vetor

Nome: indica onde esses dados começam na memória.

Índice: quantas posições se deve pular para acessar determinada posição.

posições se deve pular para acessar determinada posição. Figura : Relação entre o array e a

Figura : Relação entre o array e a memória.

Arrays com uma dimensão - Vetor

Cuidado!

É função do programador garantir que os limites do array estejam sendo respeitados.

Arrays com uma dimensão - Vetor

Cuidado!

É função do programador garantir que os limites do array estejam sendo respeitados.

Cuidado!

Não se pode fazer atribuição de arrays inteiros, apenas de suas posições individualmente!

Arrays com uma dimensão - Vetor

Cuidado!

É função do programador garantir que os limites do array estejam sendo respeitados.

Cuidado!

Não se pode fazer atribuição de arrays inteiros, apenas de suas posições individualmente!

Boa prática

Para atribuir o conteúdo de um array a outro array, o correto é copiar seus valores elemento por elemento para o outro array.

Próximo Tópico

1
1

Vetores e matrizes - arrays Arrays com uma dimensão - Vetor Arrays com múltiplas dimensões - Matriz

2
2

Funções Passagem de valores por referência Arrays e funções

3
3

Ponteiros Aritmética de Ponteiros Ponteiro para ponteiro Ponteiro para função

Arrays com múltiplas dimensões

Há casos em que uma estrutura com mais de uma dimensão é mais útil.

Arrays com múltiplas dimensões

Há casos em que uma estrutura com mais de uma dimensão é mais útil.

Exemplo: ando os dados são organizados em uma estrutura de linhas e colunas, como uma tabela.

Arrays com múltiplas dimensões

Há casos em que uma estrutura com mais de uma dimensão é mais útil.

Exemplo: ando os dados são organizados em uma estrutura de linhas e colunas, como uma tabela.

Para isso, usamos um array com duas dimensões, ou seja, uma “matriz”.

Arrays com múltiplas dimensões

Há casos em que uma estrutura com mais de uma dimensão é mais útil.

Exemplo: ando os dados são organizados em uma estrutura de linhas e colunas, como uma tabela.

Para isso, usamos um array com duas dimensões, ou seja, uma “matriz”.

tipo nome[linhas][colunas];

Arrays com múltiplas dimensões

#include <stdio.h> int main(){ int mat[100][50]; int i,j; for (i = 0; i < 100; i++){ for (j = 0; j < 50; j++){ printf("Digite mat[%d][%d]: ",i,j); scanf("%d",&mat[i][j]);

}

}

return 0;

}

Funções

O que é?

Sequência de comandos que recebe um nome e pode ser chamada de qualquer parte do programa, quantas vezes forem necessárias, durante a sua execução.

Duas são as principais razões para o uso de funções:

Funções

O que é?

Sequência de comandos que recebe um nome e pode ser chamada de qualquer parte do programa, quantas vezes forem necessárias, durante a sua execução.

Duas são as principais razões para o uso de funções:

Estruturação dos programas.

Funções

O que é?

Sequência de comandos que recebe um nome e pode ser chamada de qualquer parte do programa, quantas vezes forem necessárias, durante a sua execução.

Duas são as principais razões para o uso de funções:

Estruturação dos programas.

Reutilização de código.

Funções

tipoRetornado nomeDaFunção( lista de parâmetros ){ sequência de declarações e comandos;

}

Funções

#include <stdio.h> int Square (int a){ return (a*a);

}

int main(){ int n1,n2; printf("Entre com um numero: "); scanf("%d", &n1); n2 = Square(n1); printf("O seu quadrado vale: %d\n", n2); return 0;

}

Funções

#include <stdio.h> //protótipo da função int Square (int a);

int main(){ int n1,n2; printf("Entre com um numero: "); scanf("%d", &n1); n2 = Square(n1); printf("O seu quadrado vale: %d\n", n2); return 0;

}

int Square (int a){ return (a*a);

}

Funções

1
1

O código do programa é executado até encontrar uma chamada de função.

Funções

O código do programa é executado até encontrar uma chamada de função.Funções O programa é então interrompido temporariamente e o fluxo do programa passa para a função

O programa é então interrompido temporariamente e o fluxo do programa passa para a função chamada.é executado até encontrar uma chamada de função. Professor Me. Rooney R. A. Coelho (UFTM) Aula

Funções

1
1

O código do programa é executado até encontrar uma chamada de função.

2
2

O programa é então interrompido temporariamente e o fluxo do programa passa para a função chamada.

3
3

Os valores da chamada da função são copiados para os parâmetros no código da função.

Funções

1
1

O código do programa é executado até encontrar uma chamada de função.

2
2

O programa é então interrompido temporariamente e o fluxo do programa passa para a função chamada.

3
3

Os valores da chamada da função são copiados para os parâmetros no código da função.

4
4

Os comandos da função são executados.

Funções

1
1

O código do programa é executado até encontrar uma chamada de função.

2
2

O programa é então interrompido temporariamente e o fluxo do programa passa para a função chamada.

3
3

Os valores da chamada da função são copiados para os parâmetros no código da função.

4
4

Os comandos da função são executados.

5
5

ando a função termina (seus comandos acabaram ou o comando return foi encontrado), o programa volta ao ponto em que foi interrompido para continuar sua execução normal.

Funções

Cuidado!

int x, y é errado! int x, int y é correto!

Funções

Cuidado!

int x, y é errado! int x, int y é correto!

Cuidado!

O

valor retornado por uma função não pode ser um array, a linguagem

C

não suporta a atribuição de um array para outro.

Funções

Cuidado!

int x, y é errado! int x, int y é correto!

Cuidado!

O

valor retornado por uma função não pode ser um array, a linguagem

C

não suporta a atribuição de um array para outro.

Boa prática

Uma função é construída com o intuito de realizar uma tarefa específica e bem definida.

Próximo Tópico

1
1

Vetores e matrizes - arrays Arrays com uma dimensão - Vetor Arrays com múltiplas dimensões - Matriz

2
2

Funções Passagem de valores por referência Arrays e funções

3
3

Ponteiros Aritmética de Ponteiros Ponteiro para ponteiro Ponteiro para função

Passagem de valores por referência

void soma_mais_um( int n ){ n = n + 1;

}

Passagem de valores por referência

void soma_mais_um( int n ){ n = n + 1;

}

void soma_mais_um( int *n ){ *n = *n + 1;

}

soma_mais_um( &x ); // Na chamada da função

Próximo Tópico

1
1

Vetores e matrizes - arrays Arrays com uma dimensão - Vetor Arrays com múltiplas dimensões - Matriz

2
2

Funções Passagem de valores por referência Arrays e funções

3
3

Ponteiros Aritmética de Ponteiros Ponteiro para ponteiro Ponteiro para função

Arrays e funções

void imprime (int *m, int n); void imprime (int m[], int n); void imprime (int m[5], int n); // Desnecessária

Arrays e funções

void imprime (int *m, int n); void imprime (int m[], int n); void imprime (int m[5], int n); // Desnecessária

void imprime (int *m, int n){ int i; for (i=0; i<n;i++) printf("%d \n", m[i]); // não precisa usar *m

}

int main(){ int v[] = {1,2,3,4,5};

imprime(v,5);

//não precisa usar &v

return 0;

}

Curiosidade

void imprime2(int *A, int m, int n){ // perde a notação de matriz int i,j; for( i=0; i<m; i++ ){ for( j=0; j<n; j++ ){ printf("%d\t", A[n*i+j]);// A[n*i+j] =

A[i][j]

}

printf("\n"); // \n: quebra de linha

}

}

imprime2( A, m , n ); // Chamada da função

Ponteiros

O que é?

Ponteiros são um tipo especial de variáveis que permitem armazenar endereços de memória em vez de dados numéricos ou caracteres.

Ponteiros

O que é?

Ponteiros são um tipo especial de variáveis que permitem armazenar endereços de memória em vez de dados numéricos ou caracteres.

Duas são as principais razões para o uso de funções:

As variáveis o computador associa o endereço do espaço que ele reservou na memória para guardá-la.

Ponteiros

O que é?

Ponteiros são um tipo especial de variáveis que permitem armazenar endereços de memória em vez de dados numéricos ou caracteres.

Duas são as principais razões para o uso de funções:

As variáveis o computador associa o endereço do espaço que ele reservou na memória para guardá-la.

Ao computador não interessa o nome das variáveis, mas sim seus endereços.

Ponteiros

tipoDoPonteiro *nomeDoPonteiro

Ponteiros

tipoDoPonteiro *nomeDoPonteiro

(*) informa ao compilador que aquela variável não vai guardar um valor, mas um endereço de memória para aquele tipo especificado.

Ponteiros

tipoDoPonteiro *nomeDoPonteiro

(*) informa ao compilador que aquela variável não vai guardar um valor, mas um endereço de memória para aquele tipo especificado.

(&) operador de endereçamento, utilizado para a inicialização do ponteiro.

Aponta para um local inde nido.

Aponta para um local inde nido. Professor Me. Rooney R. A. Coelho (UFTM) Aula 1 21

Aponta para NULL

Aponta para NULL • A constante NULL está definida na biblioteca stdlib.h . • Posição de

A constante NULL está definida na biblioteca stdlib.h.

Posição de memória inexistente.

Aponta para count

Aponta para count Professor Me. Rooney R. A. Coelho (UFTM) Aula 1 21 de Agosto de

Ponteiros

#include <stdio.h> int main(){ //Declara uma variável int contendo o valor 10 int count = 10; //Declara um ponteiro para int int *p; //Atribui ao ponteiro o endereço da variável int p = &count; printf("Conteudo apontado por p: %d \n",*p); //Atribui um novo valor à posição de memória apontada por p *p = 12; printf("Conteudo apontado por p: %d \n",*p); printf("Conteudo de count: %d \n",count); return 0;

}

Ponteiros

Operador * vs. operador &

*

Declara um ponteiro: int *x;

*

Conteúdo para onde o ponteiro aponta: int y = *x;

&

Endereço onde uma variável está guardada na memória: &y

Ponteiros

Cuidado!

Em geral um ponteiro só pode receber o endereço de memória de uma variável do mesmo tipo do ponteiro. Porém, o compilador não acusará nenhum erro!

Ponteiros

Cuidado!

Em geral um ponteiro só pode receber o endereço de memória de uma variável do mesmo tipo do ponteiro. Porém, o compilador não acusará nenhum erro!

Boa prática

Ponteiros genéricos, do tipo void, devem ser sempre usados com typecast.

Ponteiros

Cuidado!

Em geral um ponteiro só pode receber o endereço de memória de uma variável do mesmo tipo do ponteiro. Porém, o compilador não acusará nenhum erro!

Boa prática

Ponteiros genéricos, do tipo void, devem ser sempre usados com typecast.

Cuidado!

Evite apontar para um tipo de dado diferente do tipo declarado para o ponteiro, evitando assim erros na interpretação do conteúdo da variável apontada.

Próximo Tópico

1
1

Vetores e matrizes - arrays Arrays com uma dimensão - Vetor Arrays com múltiplas dimensões - Matriz

2
2

Funções Passagem de valores por referência Arrays e funções

3
3

Ponteiros Aritmética de Ponteiros Ponteiro para ponteiro Ponteiro para função

Aritmética de Ponteiros

#include <stdio.h> int main(){ int *p = 0x5DC;

printf("p = Hexadecimal: %p Decimal: %d \n",p,p); //Incrementa p em uma posição

p++;

printf("p = Hexadecimal: %p Decimal: %d \n",p,p); //Incrementa p em 15 posições

p = p + 15;

printf("p = Hexadecimal: %p Decimal: %d \n",p,p); //Decrementa p em 2 posições

p =

printf("p = Hexadecimal: %p Decimal: %d \n",p,p); return 0;

p - 2;

}

Aritmética de Ponteiros

p

= Hexadecimal: 000005DC Decimal: 1500

p

= Hexadecimal: 000005E0 Decimal: 1504

p

= Hexadecimal: 0000061C Decimal: 1564

p

= Hexadecimal: 00000614 Decimal: 1556

Próximo Tópico

1
1

Vetores e matrizes - arrays Arrays com uma dimensão - Vetor Arrays com múltiplas dimensões - Matriz

2
2

Funções Passagem de valores por referência Arrays e funções

3
3

Ponteiros Aritmética de Ponteiros Ponteiro para ponteiro Ponteiro para função

Ponteiro para ponteiro

O que é?

Ponteiros também ocupam um espaço na memória do computador e possuem o endereço desse espaço de memória associado ao seu nome. É possível criar um ponteiro que aponte para o endereço de outro ponteiro.

Ponteiro para ponteiro

O que é?

Ponteiros também ocupam um espaço na memória do computador e possuem o endereço desse espaço de memória associado ao seu nome. É possível criar um ponteiro que aponte para o endereço de outro ponteiro.

Forma geral:

tipoDoPonteiro **nomeDoPonteiro;

Ponteiro para ponteiro

#include <stdio.h> int main(){ int x = 10; int *p = &x; int **p2 = &p; //Endereço em p2 printf("Endereco em p2: %p\n",p2); //Conteudo do endereço printf("Conteudo em *p2: %p\n",*p2); //Conteudo do endereço do endereço printf("Conteudo em **p2: %d\n",**p2); return 0;

}

Ponteiro para ponteiro

Ponteiro para ponteiro Figura : p2 aponta para o endereço de p1 , que aponta para

Figura : p2 aponta para o endereço de p1, que aponta para o endereço de um inteiro x.

Próximo Tópico

1
1

Vetores e matrizes - arrays Arrays com uma dimensão - Vetor Arrays com múltiplas dimensões - Matriz

2
2

Funções Passagem de valores por referência Arrays e funções

3
3

Ponteiros Aritmética de Ponteiros Ponteiro para ponteiro Ponteiro para função

Ponteiro para função

O que é?

Uma função também é um conjunto de instruções armazenadas na memória. Podemos acessar uma função por meio de um ponteiro que aponte para onde a função está na memória.

Ponteiro para função

O que é?

Uma função também é um conjunto de instruções armazenadas na memória. Podemos acessar uma função por meio de um ponteiro que aponte para onde a função está na memória.

Boa prática

construção de códigos genéricos.

Ponteiro para função

O que é?

Uma função também é um conjunto de instruções armazenadas na memória. Podemos acessar uma função por meio de um ponteiro que aponte para onde a função está na memória.

Boa prática

construção de códigos genéricos.

Ponteiros permitem fazer uma chamada indireta à função e passá-la como parâmetro para outras funções.

Ponteiro para função

O que é?

Uma função também é um conjunto de instruções armazenadas na memória. Podemos acessar uma função por meio de um ponteiro que aponte para onde a função está na memória.

Boa prática

construção de códigos genéricos.

Ponteiros permitem fazer uma chamada indireta à função e passá-la como parâmetro para outras funções.

Um ponteiro para funções só pode apontar para funções que possuam o mesmo protótipo.

Ponteiro para função

O que é?

Uma função também é um conjunto de instruções armazenadas na memória. Podemos acessar uma função por meio de um ponteiro que aponte para onde a função está na memória.

Boa prática

construção de códigos genéricos.

Ponteiros permitem fazer uma chamada indireta à função e passá-la como parâmetro para outras funções.

Um ponteiro para funções só pode apontar para funções que possuam o mesmo protótipo.

Modelo:

tipoRetornado (*nomeDoPonteiro)(listaDeTipos);

Ponteiro para função

#include <stdio.h> int soma(int a, int b){return a + b;} int subtracao(int a, int b){return a - b;} int produto(int a, int b){return a * b;} int divisao(int a, int b){return a / b;}

int main(){ int x,y; int (*p)(int,int); char ch; printf("Digite uma operação matematica (+,-,*,/):

}

"); ch = getchar(); printf("Digite 2 numeros: "); scanf("%d %d",&x,&y); switch(ch){ case ’+’: p = soma; break; case ’-’: p = subtracao; break; case ’*’: p = produto; break; case ’/’: p = divisao; break;

}

printf( "Resultado = %d\n",p(x,y) ); // <---

return 0;

#include <stdio.h> #include <math.h> // para a função pow double integral( double (*f)(double), double a, double b){ return (b-a)/6 * ( f(a) + 4*f( (a+b)/2 ) + f(b) );

}

double func(double x){

return pow(x,3);

}

int main(){

printf("O resultado da integral é: %f\n",

}

integral(func,0,1) return 0;

);

O resultado da integral é: 0.250000

Obrigado!