Você está na página 1de 8

Ponteiros.
Stênio Rocha Silva
02 de Setembro de 2009


Material elaborado para o desenvolvimento de atividades assistidas pelo Computador, na dis-
ciplina Algoritmos e Programação, na Faculdade Assis Gurgacz.
1 Objetivo
Desenvolver a familiaridade com os elementos básicos da Linguagem C através da
reprodução e implementação de códigos de forma orientada.

2 Ponteiros.
1. Ponteiro é um conceito em C que deve ser entendido como um tipo de dado,
de forma semelhante a int, char, float e double, que ao invés de guardar
um valor, aponta para um enderêço. Quando for necessário acessar uma in-
formação aponta-se para o enderêço onde a mesma esteja. A declaração de
um ponteiro é feita da forma contida no código abaixo. Observe que há ne-
cessidade de inicializar o ponteiro, o que diferentemente dos demais tipos não
significa atribuir um valor e sim apontar para um enderêço válido. Verifique
o código.

#include <stdio.h>
void main(void) {
int *num;//Ponteiro para inteiro.
float *soma;//Ponteiro para um ponto flutuante.
char *nome;//Ponteiro para um caracter.
*num=10;
printf("%d",*num);
}

2. Considere que em uma variável, num, exista uma informação a ser acessada.
Inicialize um ponteiro conforme este código abaixo e compare o resultado com
o do código anterior.

#include <stdio.h>
void main(void) {
int num=100;
int *p;
p=&num;
printf("Endereço:%d",p);
printf("Valor:%d",*p);
}

3. O uso de ponteiros em funções se dá na passagem de parâmetros e parâmetros


de saı́da. Verifique o exemplo de parâmetros de saı́da com ponteiros. Use
arquivos separados.

2
#include <stdio.h>
void main(void) {
int x,y,resultado;
printf("Digite um numero:");
scanf("%d",&x);
printf("Digite um numero:");
scanf("%d",&y);
soma(x,y,&resultado);
printf("Soma=%d",resultado);
}
int soma(int a, int b, int *valor) {
*valor=a+b;
}
\\Protótipo
int soma(int, int, int *);

4. É possı́vel fazer operações com ponteiros. Faz-se necessário entender o que o


resultado quer dizer já que se trata de enderêços. Observe o código abaixo e
procure entender o resultado.

#include <stdio.h>
void main(void) {
int *p,ip;
char *nome,cnome;
p=&ip;
nome=&cnome;
printf("Enderecos: %d %d\n",p,nome);
p++;
nome++;
printf("Enderecos: %d %d",p,nome);
}

5. Observe atentamente o código abaixo que estabelece uma correspondência


entre vetores ou matrizes e ponteiros quando do uso em funções. Utilize vários
arquivos. Procure explicar o resultado integralmente.

#include <stdio.h>
#define TAM 5
void main(void) {
int mat[TAM]={1,2,3,4,5};
printf("Tamanho da Matriz: [%d]",sizeof(mat));
imprime(mat);
}

3
void imprime(int *vet) {
int i;
for(i=0;i<5;i++){
printf("\nO conteudo da Matriz na posicao %d=%d",i,*vet);
printf("\nO endereco=%d",vet);
vet++;
}
}
//Protótipo
void imprime(int *);

6. Observe esta combinação entre ponteiros e strings. Implemente e questione os


resultados. Modifique o tamanho da cadeia de caracteres do código e verifique
a confirmação de suas conclusões.

#include <stdio.h>
void main(void) {
char nome[30]="Teste de Programacao";
char *p;
p=&nome;
printf("\ntamanho de cadeia=%d",sizeof(nome));
printf("\nEndereco da 1 posicao=%d\n",p);
while(*p!=NULL){
putchar(*p);
p++;
}
putchar(’\n’);
printf("\nEndereco da ultima posicao=%d",p);
}

7. A função principal pode especialmente conter argumentos que serão forne-


cidos ao ser acionado o programa. O código abaixo permitirá verificar esta
propriedade. O programa compilado deve ser acionado pelo console através
do comando nome do arquivo argumento1 argumento2 argumento3
etc.

#include <stdio.h>
void main(int argc, char *argv[]) {
int i;
printf("Argumentos Digitados:");
for(i=0;i<argc;i++) {
printf("Argumentos %d %s\n",i+1,argv[i]);
}
}

4
8. Elabore um programa que receba pela linha de comando uma senha. Caso a
senha seja incorreta o programa é finalizado.

#include <stdio.h>
void main(void) {
Implemente agora!
}

9. Elabore um programa que receba o nome de um aluno pela linha de comando


e verifique se o mesmo consta de uma lista de nomes.

#include <stdio.h>
void main(void) {
Implemente agora!
}

10. Elabore um programa que receba três números pelo console, como argumen-
tos de main(), e apresente como resultado o maior entre eles. A biblioteca
stdlib.h possui uma função que transforma cadeia de caracteres em inteiros,
atoi(). Observe que o código abaixo serve para uma quantidade de números
qualquer.

#include <stdio.h>
#include <stdlib.h>
void main(int argc, char *argv[]) {//argv[] eh uma cadeia caracter
int i, maior=0;//maior eh uma variável int
for(i=0;i<argc;i++) {
if(atoi(argv[i])>maior) {//Há necessidade de converter string em int
maior=atoi(argv[i]);
}
printf("O maior eh=%d",maior);
}

11. Elabore o programa de reconhecimento de números pares da mesma forma


encontrada para a atividade anterior.

#include<stdio.h>
#include <stdlib.h>
void main(void) {
Implemente agora!
}

12. Faça o mesmo para o cálculo das raizes de uma equação do segundo grau.

5
#include <stdio.h>
#include <stdlib.h.h>
void main(void) {
Implemente agora!
}

13. Números aleatórios são importantes quando necessita-se fazer escolha não ten-
denciosas. O C possui uma função para a geração de números aleatórios os
randômicos, rand(). Para a geração desses números há necessidade da uti-
lização de uma outra função, srand(), que evita a repetibilidade dos números.
Experimente o código abaixo. Há necessidade da utilização das bibliotecas
stdlib.h e time.h.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main(void) {
srand(time(NULL));
int num;
num=rand();
printf("O numero aleatorio =%d",num);
}

14. O código acima pode ser modificado para gerar vários números aleatórios.
Confira se há repetição.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main(void) {
srand(time(NULL));
int num[10],i;
for(i=0;i<10;i++){
num[i]=rand();
}
for(i=0;i<10;i++){
printf("O numero aleatorio =%d\n",num[i]);
}
}

15. Segue abaixo um código para embaralhamento de cartas de um baralho. Es-


tude o código atentamente. Questione o fato de ter sido usado um ponteiro
para um vetor ao invés de um vetor na definição dos naipes e faces das car-
tas. Observe o uso dos números aleatórios. Houve compreensão desta forma
de uso? Estude o uso do operador ?.

6
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main(void) {
char *naipe[5]={"Copas","Ouros","Paus","Espadas"};
char *face[14]={"As","Dois","Tres","Quatro","Cinco","Seis","Sete",
"Oito","Nove","Dez","Valete","Dama","Rei"};
int baralho[4][13]={0}, linha,coluna,carta;
srand(time(NULL));
for(carta=1;carta<=52;carta++){
linha=rand()%4;
coluna=rand()%13;
while(baralho[linha][coluna]!=0){
linha=rand()%4;
coluna=rand()%13;
}
baralho[linha][coluna]=carta;
}
for(carta=1;carta<=52;carta++){
for(linha=0;linha<4;linha++){
for(coluna=0;coluna<13;coluna++){
if(baralho[linha][coluna]==carta){
printf("%6s de %-7s%c",face[coluna],naipe[linha],carta%2==0?’\n’:’\t’);
}
}
}
}
}

3 Recomendações
Elabore todos os códigos, mesmo os mais simples. É a simplicidade e não a
complexidade que impulsiona o aprendizado.
Elabore, e entregue no inı́cio da próxima aula, 18/09/2009 (2310) e 22/09/2009
(2311), em uma folha de papel sulfite branca, formato A4, um programa
que receba o nome de um aluno, completo, e uma disciplina, pelo
console e como parâmetros da função principal, e retorne se o mesmo
foi aprovado. Elabore o programa com duas disciplinas e cinco alu-
nos, apenas. Se o nome do aluno não foi encontrado o programa
deve informar a inexistência do mesmo e encerrar.
Programas literalmente copiados da internet não serão validados. Programas
que apresentem variáveis e formatações iguais as contidas em outros trabalhos,

7
serão todos desconsiderados, independente de avaliação da real autoria dos
mesmos. Programas entregues fora do prazo e fora do que esta acima espe-
cificado, não serão recebidos. Bom trabalho. Em caso de dúvidas contactar
stenio@fag.edu.br.

Referências
[1] Algoritmos e Programação.Curso de Linguagem C da UFMG.

[2] Herbert Schildt. C Completo e Total.

[3] Marcos Laureano.Programando em C. Brasport. 2005.

Você também pode gostar