Buscar

Parte 2 _ Ponteiros

Prévia do material em texto

Prof. Edson J. R. Justino
Prof. Claudio Carvilhe
Parte 2
Pontifícia Universidade Católica do Paraná - PUCPR
Ponteiro
� Em C, podemos armazenar em uma variável o 
endereço de uma outra variável. Para isso, 
devemos declarar esta variável como um 
apontador ou ponteiro.
� Na maneira abaixo, declaramos que pc é um 
apontador para uma variável do tipo char. 
Ex.: char *pc;
Ponteiros
� Em C, existe uma maneira 
para referenciar diretamente 
os endereços das variáveis, 
através do operador &.
Ex.:
void main( ){
int x,
*px;
.
.
x = 203;
.
.
px = &x;
}
.
.
.
.
.
.
Memória
px 0100
0101
0001
0102
0103
0104
n
x
0102
203
Exemplo
/*****************************************
Exemplo do Uso de ponteiros
*****************************************/
#include <stdio.h> 
void main( )
{
int x = 10, y, *px;
px = &x;
y = *px + 1;
printf("conteudo de y = %d / endereco de y = %d\n",y,&y);
printf("conteudo de x = %d / endereco de x = %d\n",x,&x);
printf("px = %d\n",px);
system("PAUSE");
}
Ponteiros e Funções
#include <stdio.h>
#include <stdlib.h>
int pos_neg (int);
int main(int argc, char *argv[])
{
int valor, sinal;
puts("Entre com um valor inteiro positivo ou
negativo");
scanf("%d", &valor); fflush(stdin);
sinal = pos_neg(valor);
if (sinal != 0)
puts(" O valor e positivo\n");
else
puts(" O valor e negativo\n");
system("PAUSE");
return 0;
}
// funçao testa sinal
int pos_neg (int val){
if (val < 0)
return 0;
else
return 1;
}
Ponteiros e Funções
// função testa sinal
int pos_neg (int *val){
if (*val < 0)
return 0;
else
return 1;
}
#include <stdio.h>
#include <stdlib.h>
int pos_neg (int*);
int main(int argc, char *argv[])
{
int valor, sinal;
puts("Entre com um valor inteiro positivo ou 
negativo");
scanf("%d", &valor); fflush(stdin);
sinal = pos_neg(&valor);
if (sinal != 0)
puts(" O valor e positivo\n");
else
puts(" O valor e negativo\n");
system("PAUSE");
return 0;
}
Ponteiros e Funções
#include <stdlib.h>
int soma_intervalo (int, int);
int main(int argc, char *argv[])
{
int valor_1, valor_2, resultado;
puts("entre com o primeiro valor");
scanf("%d", &valor_1); fflush(stdin);
puts("entre com o segundo valor");
scanf("%d", &valor_2); fflush(stdin);
// chamada da fubnção
resultado = soma_intervalo( valor_1, valor_2);
printf("A soma dos elementos do intervalo e: 
%d\n", resultado);
system("PAUSE");
return 0;
}
// soma valores do intervalo
int soma_intervalo (int val_1, int val_2){
int i, soma = 0;
if (val_1 >= val_2)
return soma;
else{ 
for (i = val_1+1; i< val_2; i++)
soma += i;
return soma;
}
}
Ponteiros e Funções
#include <stdlib.h>
int soma_intervalo (int *, int *);
int main(int argc, char *argv[])
{
int valor_1, valor_2, resultado;
puts("entre com o primeiro valor");
scanf("%d", &valor_1); fflush(stdin);
puts("entre com o segundo valor");
scanf("%d", &valor_2); fflush(stdin);
// chamada da fubnção
resultado = soma_intervalo( &valor_1, &valor_2);
printf("A soma dos elementos do intervalo e: 
%d\n", resultado);
system("PAUSE");
return 0;
}
// soma valores do intervalo
int soma_intervalo (int *val_1, int *val_2){
int i, soma = 0;
if (*val_1 >= *val_2)
return soma;
else{ 
for (i = (*val_1)+1; i< (*val_2); i++)
soma += i;
return soma;
}
}
Ponteiros e Funções
#include <stdio.h>
#include <stdlib.h>
int soma_intervalo(int, int, int);
int main(int argc, char *argv[]){
int valor_1, valor_2, valor_3, result;
puts("Entre com o primeiro valor");
scanf("%d", &valor_1); fflush(stdin);
puts("Entre com o segundo valor");
scanf("%d", &valor_2); fflush(stdin);
puts("Entre com o terceiro valor");
scanf("%d", &valor_3); fflush(stdin);
// chamada da função
result = soma_intervalo(valor_1, valor_2, valor_3);
printf(" A soma do intervalo e: %d\n", result);
system("PAUSE");
return 0;
}
// Soma valor do intervalo
int soma_intervalo(int a, int b, int c){
int i, soma = 0;
if (b >= c)
return soma;
else{ 
for (i = b; i<= c; i++){
if ((i%a) == 0)
soma += i;
} 
return soma;
}
}
Ponteiros e Funções
#include <stdio.h>
#include <stdlib.h>
int soma_intervalo(int *, int *, int *);
int main(int argc, char *argv[]){
int valor_1, valor_2, valor_3, result;
puts("Entre com o primeiro valor");
scanf("%d", &valor_1); fflush(stdin);
puts("Entre com o segundo valor");
scanf("%d", &valor_2); fflush(stdin);
puts("Entre com o terceiro valor");
scanf("%d", &valor_3); fflush(stdin);
// chamada da função
result = soma_intervalo(&valor_1, &valor_2, &valor_3);
printf(" A soma do intervalo e: %d\n", result);
system("PAUSE");
return 0;
}
// Soma valor do intervalo
int soma_intervalo(int *a, int *b, int *c){
int i, soma = 0;
if (*b >= *c)
return soma;
else{ 
for (i = *b; i<= *c; i++){
if ((i% *a) == 0)
soma += i;
} 
return soma;
}
}
Ponteiros e Funções
#include <stdio.h>
#include <stdlib.h>
int calc_segundos(int, int, int);
int main(int argc, char *argv[]){
int h, m, s, m_segundos;
puts("Entre com a hora");
scanf("%d", &h); fflush(stdin);
puts("Entre com o minuto");
scanf("%d", &m); fflush(stdin);
puts("Entre com o segundo");
scanf("%d", &s); fflush(stdin);
// chamada da função
m_segundos = calc_segundos(h, m, s);
printf(" O total de segundos e: %d\n", m_segundos);
system("PAUSE");
return 0;
}
// converte em segundos
int calc_segundos(int hora, int min, int seg){
int soma = 0;
//Converte hora em minutos
soma = hora*60;
//Converte minutos em segundos
soma = soma*60 + min*60;
//Calcula total de segundos
soma = soma + seg;
return soma;
}
Ponteiros e Funções
#include <stdio.h>
#include <stdlib.h>
int calc_segundos(int *, int *, int *);
int main(int argc, char *argv[]){
int h, m, s, m_segundos;
puts("Entre com a hora");
scanf("%d", &h); fflush(stdin);
puts("Entre com o minuto");
scanf("%d", &m); fflush(stdin);
puts("Entre com o segundo");
scanf("%d", &s); fflush(stdin);
// chamada da função
m_segundos = calc_segundos(&h, &m, &s);
printf(" O total de segundos e: %d\n", m_segundos);
system("PAUSE");
return 0;
}
// converte em segundos
int calc_segundos(int *hora, int *min, int *seg){
int soma = 0;
//Converte hora em minutos
soma = *hora*60;
//Converte minutos em segundos
soma = soma*60 + *min*60;
//Calcula total de segundos
soma = soma + *seg;
return soma;
}
Ponteiros e Funções
#include <stdio.h>
#include <stdlib.h>
void calcula_hora (int);
int main(int argc, char *argv[])
{
int segundos;
puts(" Entre com o valor em segundos");
scanf("%d", &segundos); fflush(stdin);
calcula_hora(segundos);
system("PAUSE");
return 0;
}
// função que converte segundos
// em horas:minutos:segundos
void calcula_hora (int seg){
int h, m, s, r;
h = seg / 3600;
r = seg % 3600;
m = r / 60;
s = r % 60;
printf("%d:%d:%d\n",h,m,s);
}
Ponteiros e Funções
#include <stdio.h>
#include <stdlib.h>
void calcula_hora (int *, int *, int *, int *);
int main(int argc, char *argv[])
{
int hora, min, seg;
int segundos;
puts(" Entre com o valor em segundos");
scanf("%d", &segundos); fflush(stdin);
calcula_hora(&segundos, &hora, &min, &seg);
printf("%d:%d:%d\n",hora,min,seg);
system("PAUSE");
return 0;
}
// função que converte segundos
// em horas:minutos:segundos
void calcula_hora (int *seg, int *h, int *m, int *s){
int r;
*h = *seg / 3600;
r = *seg % 3600;
*m = r / 60;
*s = r % 60;
}
Ponteiros e Funções
#include <stdio.h>
#include <stdlib.h>
int verifica (int);
int main(int argc, char *argv[])
{
int valor, resultado;
puts(" Entre com valor inteiro de quatro digitos");
scanf("%d", &valor);fflush(stdin);
resultado = verifica(valor);
if (resultado == 1)
puts("A regra vale!\n");
else
puts(" A regra nao vale!\n");
system("PAUSE");
return 0;
}
// função determina regra
int verifica (int numero){
int primeiro, segundo, 
soma, quadrado;
//separa as duas parte do número
primeiro = numero / 100;
segundo = numero % 100;
// determina característica
soma = primeiro + segundo;
quadrado = soma*soma;
if (quadrado == numero)
return 1;
else
return 0;
}
Ponteiros e Funções
#include <stdio.h>
#include <stdlib.h>
int verifica (int *);
int main(int argc, char *argv[])
{
int valor, resultado;
puts(" Entre com valor inteiro de quatro digitos");
scanf("%d", &valor); fflush(stdin);
resultado = verifica(&valor);
if (resultado == 1)
puts("A regra vale!\n");
else
puts(" A regra nao vale!\n");
system("PAUSE");
return 0;
}
// função determina regra
int verifica (int *numero){
int primeiro, segundo, 
soma, quadrado;
//separa as duas parte do número
primeiro = *numero / 100;
segundo = *numero % 100;
// determina característica
soma = primeiro + segundo;
quadrado = soma*soma;
if (quadrado == *numero)
return 1;
else
return 0;
}
Ponteiros e Vetores
� Ponteiros também podem ser usados 
para a manipulação de vetores de 
qualquer tipo dos dados básicos (char, 
int, float, ...)
� Exemplo
char vetor[100];
char *p_vetor;
p_vetor = vetor; ou p_vetor = &vetor[0];
Ponteiros e Vetores
#include <stdio.h>
#include <stdlib.h>
// Funções para manipulação de vetores
int ler_vetor(int *);
void imprime_vetor(int *);
#define MAX 10
int main(int argc, char *argv[]){
int vetor[MAX], erro=1;
erro = ler_vetor(vetor);
if (erro != 0)
puts("Erro na leitura do vetor\n");
else 
imprime_vetor(&vetor[0]);
system("PAUSE");
return 0;
}
// Função para leitura do vetor de inteiros
int ler_vetor(int *vet){
int i;
puts(" Entre com os valores do vetor\n");
for (i=0; i< MAX; i++){
printf("Vetor[%d]= ", i);
scanf("%d",(vet+i));
} 
return 0;
} 
// Função para imprimir o vetor de inteiros
void imprime_vetor (int *vet){
int i;
printf(" Vetor= ");
for (i=0; i< MAX; i++)
printf("%d, ",*(vet+i));
printf("\n");
} 
Ponteiros e Vetores
#include <stdio.h>
#include <stdlib.h>
// Funções para manipulação de vetores
int ler_vetor(int *);
void imprime_vetor(int *);
#define MAX 10
int main(int argc, char *argv[]){
int vetor[MAX], erro=1;
erro = ler_vetor(vetor);
if (erro != 0)
puts("Erro na leitura do vetor\n");
else 
imprime_vetor(&vetor[0]);
system("PAUSE");
return 0;
}
// Função para leitura do vetor de inteiros
int ler_vetor(int *vet){
int i;
puts(" Entre com os valores do vetor\n");
for (i=0; i< MAX; i++){
printf("Vetor[%d]= ", i);
scanf("%d",&vet[i]);
} 
return 0;
} 
// Função para imprimir o vetor de inteiros
void imprime_vetor (int *vet){
int i;
printf(" Vetor= ");
for (i=0; i< MAX; i++)
printf("%d, ",vet[i]);
printf("\n");
} 
Ponteiros e Vetores
� Exercícios
� Modifique o programa anterior e inclua uma 
função que some os componentes do vetor 
que sejam pares. Ao final, imprima além do 
vetor, o somatório desses componentes.
Ponteiros e Matrizes
� Ponteiros também podem ser usados 
para a manipulação de matrizes de 
qualquer dimensão e de qualquer tipo 
dos dados básicos (char, int, float, ...)
� Exemplo
char matriz[100][50];
char *p_matriz;
p_matriz = matriz; ou p_vetor = &matriz[0];
Ponteiros e Matrizes
#include <stdio.h>
#include <stdlib.h>
// Funções para manipulação de matrizes
int ler_matriz(float *);
void imprime_matriz(float *);
#define LINHA 2
#define COLUNA 2
int main(int argc, char *argv[]){
float matriz[LINHA][COLUNA];
int erro=1;
erro = ler_matriz(matriz);
if (erro != 0)
puts("Erro na leitura da matriz\n");
else
imprime_matriz(&matriz[0][0]);
system("PAUSE");
return 0;
}
// Função para leitura do vetor de inteiros
int ler_matriz(float *mat){
int i,j;
puts(" Entre com os valores da matriz\n");
for (i=0; i<LINHA; i++)
for (j=0; j<COLUNA; j++){
printf("Matriz[%d][%d]= ", i,j);
scanf("%f",mat+(i*COLUNA+j));
} 
return 0;
} 
// Função para imprimir o vetor de inteiros
void imprime_matriz(float *mat){
int i, j;
printf(" Matriz \n");
for (i=0; i<LINHA; i++){
for (j=0;j<COLUNA; j++)
printf("%.1f ", *(mat+(i*COLUNA+j)));
printf("\n"); 
} 
}
Ponteiros e Matrizes
� Exercícios
� Elabore um programa em C que efetua a alocação 
dinâmica de matrizes, com base na escolha do 
usuário (o usuário deve informar o número de 
LINHAS E COLUNAS). A partir disto, seu programa 
deve obter DUAS MATRIZES, informadas pelo 
usuário. E exibir como resultado:
○ SOMA ENTRE AS MATRIZES;
○ SUBTRAÇÃO ENTRE AS MATRIZES;
○ MULTIPLICAÇÃO ENTRE A MATRIZ E UM 
ESCALAR;
○ CÁLCULO DA DIAGONAL DAS MATRIZES (em 
separado).

Outros materiais