ESTRUTURA DE DADOS
AVANÇADA
Ponteiros
Vetores e Matrizes
Prof. Mário Dantas
REVISÃO SOBRE FUNÇÕES


“Um programa deve ser pensando em termos de
funções” Celes (2004);
Estrutura de uma Função:
tipo_retornado nome_da_função (lista de
parâmentros...)
{
corpo da função
}
REVISÃO SOBRE FUNÇÕES


tipo_retornado: especifica o tipo de valor que a
instrução return da função devolve;
lista de parâmetros: é uma lista de tipo de valor e
nomes de variáveis separados por virgula;
Forma geral :
f(tipo nomevar1, tipo nomevar1, ..., tipo
nomevarN)
Exemplo:
int calcFatorial(int numero)

int calcula(int num1, int num2, char op)
REVISÃO SOBRE FUNÇÕES


Argumentos de Funções: são os valores
passados na chamada da função;
Exemplo:
numFatorial = calcFatorial(numero);
calcula(num1, num2, operacao);
printf(“Sua idade é: %d ano(s)”, idade);
printf(“Sua idade é: %d ano(s)”, 20);
REVISÃO SOBRE FUNÇÕES

Protótipo de Funções:

Forma geral:
tipo_retornado nome_da_função (lista de parâmentros...)
Exemplo:
int calcFatorial(int numero);
int calcFatorial(int);
int calcula(int num1, int num2, char op);
int calcula(int, int, char);
REVISÃO SOBRE FUNÇÕES
Função que Calcula Fatorial:
#include <stdio.h>
void fatorial(void);//prototipo
int main(void)
{
fatorial();
return 0;
}
REVISÃO SOBRE FUNÇÕES
void fatorial (void)//implementação
{
int i;
int f = 1;
int n;
printf("Informe um Numero: ");
scanf("%d", &n);
for (i = 1; i <=n; i++)
f*=i;
printf("Fatorial = %d\n", f);
fflush(stdin);
getchar();
}
REVISÃO SOBRE FUNÇÕES
#include <stdio.h>
int fatorial (int n) {
if (n <= 1)
return 1;
else
return n * fatorial(n-1);
}
int main(void) {
int n, f;
printf("Informe um Numero: ");
scanf("%d", &n);
f = fatorial(n);
printf("Fatorial = %d\n", f);
fflush(stdin);
getchar();
return 0;
}
PONTEIROS


São variáveis que apontam para outras variáveis;
Exemplo:
/*programa que ilustra a utilização de ponteiros*/
#include <stdio.h>
int main (void)
{
int a;
int *p;
p = &a;// se esquecer dará ERRO
*p = 2;
printf(" %d", a);
fflush(stdin);
getchar();
return 0;
}
PONTEIROS

PROGRAMA QUE SOMA DOIS NÚMEROS
#include <stdio.h>
int soma(int a, int b){
int c;
c = a + b;
return c;
}
int main(void){
int s;
s = soma(3,5)
printf("Soma = %d\n", s);
fflush(stdin);
getchar();
return 0;
}
PONTEIROS

PROGRAMA QUE SOMA E MULTIPLICA DOIS
NÚMEROS
#include <stdio.h>
void somaProduto(int a, int b, int c, int d){
c = a + b;
d = a * b;
}
int main(void){
int s, p;
somaProduto(3,5, s, p);
printf("Soma = %d Produto = %d\n", s, p);
fflush(stdin);
getchar();
return 0;
}
PONTEIROS
 Variáveis
do tipo ponteiro
Para cada tipo existente, há um tipo
ponteiro
capaz
de
armazenar
endereços de memória em que existem
valores do tipo correspondentes;
 Portanto, a princípio, existe ponteiros
para char, int, float e double;

PONTEIROS
 Variáveis

do tipo ponteiro
A declaração variáveis para os tipos
char, int, float e double é feita como
segue:
char *c;
int *a;
float *b;
double *d;
PONTEIROS
 Variáveis

do tipo ponteiro
A atribuição de valores para ponteiros é feita
como segue:
char var1 = ‘g’;
int var2 = 125;
float var3 = 3.14;
double var4 = 6544.6854;
c = &var1;
a = &var2;
b = &var3;
d = &var4;
PONTEIROS
 Variáveis

do tipo ponteiro
O conteúdo de um ponteiro pode ser
acessado como segue:
int numero;
int var2 = 125;
int *a;
a = &var2;
numero = *a;
printf(“Conteúdo: %d – Endereço: %d”, *a,
a);
PONTEIROS

PROGRAMA QUE SOMA E MULTIPLICA DOIS NÚMEROS
#include <stdio.h>
void somaProduto(int a, int b, int *c, int *d){
*c = a + b;
*d = a * b;
}
int main(void){
int s, p;
somaProduto(3,5, &s, &p);
printf("Soma = %d Produto = %d\n", s, p);
fflush(stdin);
getchar();
return 0;
}
PONTEIROS
 EXERCÍCIOS:
Programa que troca o valor de dois números;
 Fazer uma função que:

receba 3 números como parâmetros: A, B e C;
 ordene de tal forma que, ao final da função, A
contenha o menor número e C o maior;
 Fazer um programa que receba 3 números do
usuário, chame a função e mostre os números
ordenados.


Escreva uma função CALCULA que:
receba como parâmetros duas variáveis inteiras, X e
Y;
 retorne em X a soma de X e Y;

VETORES





Conceito: “é uma coleção de variáveis do mesmo
tipo que é referenciada por um nome comum”;
Em C todos os vetores consistem em posições
contínuas de memória;
Podem ter uma ou várias dimensões;
Um elemento específico de um vetor pode ser
acessado por meio de um índice;
O vetor mais comum em C é a string, que nada
mais é que um conjunto de caracteres terminado
por um nulo ou ‘/0’;
VETORES

Formal geral para declarar um vetor:


tipo nome_variavel [tamanho];
Exemplos:
int x [20];
 char nome [50];
 float notas [60];
 double precos [10];

VETORES

Atribuição de valores:
int vetor[5] = {2, 4, 35, 50, 23};
x [2] = 54;
for (i=0; i < tamanho; i++){
scanf(“%d”, &vetor[i]);

Acesso ao conteúdo:
y = x [2];
for (i=0; i < tamanho; i++){
printf(“%d, ”, vetor[i]);
VETORES
#include <stdio.h>
int main(void){
int i, n;
float v, media = 0;
printf("Informe o numero de elementos:");
scanf("%d", &n);
for(i=0; i < n; i++){
printf("Informe o valor %d:", i+1);
scanf("%f", &v);
media = media + v;
}
media = media / n;
printf("Valor da media = %0.2f", media);
}
VETORES
Complicando um pouco...
 Faça um programa que calcule a média das notas
de 10 alunos e mostre a nota, a média e a
diferença entres elas.

VETORES
#include <stdio.h>
int main(void){
int i;
float media, notas[10];
for(i=0; i < 10; i++){
printf("Informe o valor %d:", i+1);
scanf("%f", &notas[i]);
}
media = 0;
for(i=0; i < 10; i++)
media = media + notas[i];
media = media / 10;
for(i=0; i < 10; i++)
printf("nota = %0.2f media = %0.2f, diferenca = %0.2f
\n", notas[i], media, (notas[i] - media));
}
EXERCÍCIOS

Faça um programa que:

leia 7 valores inteiros e os armazene em um vetor.
Listar o vetor com as referidas posições de
armazenamento de cada valor.

ofereça uma pesquisa onde dado um valor inteiro
qualquer de entrada retornar a posição deste valor
dentro do vetor, e caso este valor não esteja presente
no vetor retornar –1.
#include <stdio.h>
int main(void){
int i;
int num, vetor[7];
for(i=0; i < 7; i++){
printf("Informe o valor %d: ", i);
scanf("%d", &vetor[i]);
}
printf("Informe o valor a se pesquisado: ");
scanf("%d", &num);
for(i=0; i < 7; i++)
printf("valor = %d posicao = %d \n", vetor[i], i);
for(i=0; i < 7; i++)
if(num==vetor[i])
break;
if (i == 7)
i = -1;
printf("posicao do valor pesquisado = %d \n", i);
}
EXERCÍCIOS
Faça um programa que dado o vetor [2; 4; 35; 50;
23; 17; 9; 12; 27; 5]:
 coloque os valores em ordem crescente dentro do
vetor;
 mostre o maior valor;

#include <stdio.h>
int main(void){
int i, j;
int maior, vetor[10] = {2, 4, 35, 50, 23, 17, 9, 12, 27,
5};
for(i=0; i < 10; i++)
for(j=0; j < 10; j++){
if(vetor[j] > vetor[i]){
maior = vetor[j];
vetor[j] = vetor[i];
vetor [i]=maior;
}
}
maior = 0;
for(i=0; i < 10; i++)
if (vetor[i] > maior)
maior = vetor[i];
for(i=0; i < 10; i++)
printf("%d ", vetor[i]);
printf("\nMaior valor: %d ", maior);
}
EXERCÍCIOS

Deseja-se publicar o número de acertos de cada
aluno em uma prova em forma de testes. A prova
consta de 30 questões, cada uma com cinco
alternativas identificadas por A, B, C, D e E.
Para isso são dados:



o cartão gabarito;
o número de alunos da turma;
o cartão de respostas para cada aluno, contendo o seu
número e suas respostas.
#include <stdio.h>
int main() {
int n, i, aluno, pontos;
char gabarito[5], resp[5];
printf("Digite o numero de alunos: ");
scanf("%d", &n);
printf("Digite o gabarito da prova: ");
for (i = 0; i < 5; i++)
scanf(" %c", &gabarito[i]); /* atencao para o espaco em branco */
for (aluno = 1; aluno <= n; aluno++) {
pontos = 0;
printf("Digite as respostas do aluno %d: ", aluno);
for (i = 0; i < 5; i++) {
scanf(" %c", &resp[i]);
/* atencao para o espaco em branco */
if (resp[i] == gabarito[i])
pontos = pontos + 1;
}
printf("O aluno %d fez %d pontos\n", aluno, pontos);
}
}
EXERCÍCIOS

Dados dois vetores x e y, ambos com n elementos,
determinar o produto escalar desses vetores.
#include <stdio.h>
#define MAX 10
int main() {
int i, n;
float prod, x[MAX], y[MAX];
printf("Digite o tamanho dos vetores: ");
scanf("%d", &n);
printf("Digite os componentes do vetor x: ");
for (i = 0; i < n; i++)
scanf("%f", &x[i]);
printf("Digite os componentes do vetor y: ");
for (i = 0; i < n; i++)
scanf("%f", &y[i]);
prod = 0;
for (i = 0; i < n; i++)
prod = prod + x[i] * y[i];
printf("Produto escalar desses vetores: %f\n", prod);
}
REFERÊNCIAS

Livros:
Capítulos 4, 5, 6 do Livro “C Completo e Total”;
 Capítulos 4 e 5 do Livro “Introdução a Estrutura
de Dados”;


Sites

<http://www.ime.usp.br/~macmulti/exercicios/vetores/
#nota1> acessado em 18 fev 2010
Blog: http://mariodantas.wordpress.com/
Download

Vetores e Matrizes - Mario Dantas Blog