Buscar

Revisao Ponteiros, vetores, Funções

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 94 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 94 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 94 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

1Introdução à Computação II – IBM1012
Introdução à Computação II
IBM1012
1. Revisão de Vetores, Ponteiros, 
Funções e Estruturas em C
Departamento de Computação e Matemática 
FFCLRP-USP
2Introdução à Computação II – IBM1012
Principais Tópicos
1.1. Revisão de Vetores em C
1.1.1. Strings
1.1.2. Matrizes
1.2. Revisão de Ponteiros em C
1.3. Revisão de Funções em C
1.4. Revisão de Estruturas em C
1.5. Alocação Dinâmica de Vetores
3Introdução à Computação II – IBM1012
1.1. Vetores
• Tipos de dados atômicos em C
� char
• 8 bits (1 byte)
� int
• 16 ou 32 bits (2 ou 4 bytes)
� short int
• 16 bits (2 bytes) 
� long int 
• 32 bits (4 bytes)
� float 
• 32 bits (4 bytes)
� double 
• 64 bits (8 bytes)
� long double 
• 80 bits (10 bytes)
4Introdução à Computação II – IBM1012
1.1. Vetores
• Definição: coleção de valores de dados
individuais com as seguintes características:
� Contém tipos de dados homogêneos
• Ex.: vetor de inteiros só pode ter elementos do tipo inteiro
� Contém dados que podem ser ordenados
5Introdução à Computação II – IBM1012
1.1. Vetores
• Pode-se pensar em um vetor como uma
seqüência de dados atômicos
� Os dados atômicos em um vetor são chamados de
elementos
• Vetor possui duas propriedades fundamentais
� Tipo de elemento
� Tamanho do vetor
6Introdução à Computação II – IBM1012
1.1. Vetores
• Declaração
� tipo nome[tamanho]
• Ex.: int vetor[10];
� Tamanho do vetor pode ser especificado como uma 
constante
• Facilita mudança do tamanho
• Ex.: #define NElementos 10
int vetor[NElementos];
7Introdução à Computação II – IBM1012
1.1. Vetores
• Nome
� É aconselhável que o nome do vetor indique que
tipo de valor está sendo armazenado
• Ex. #define NJuizes 5
double notas[NJuizes];
notas
0 1 2 3 4
8Introdução à Computação II – IBM1012
1.1. Vetores
• Indexação
� Cada elemento de um vetor é identificado por um 
índice
� Em C, o primeiro elemento tem índice igual a 
0 e o último tem índice igual ao número de 
elementos – 1
• Ex. vetor de 4 elementos possui os índices 0, 1, 2, 3
9Introdução à Computação II – IBM1012
1.1. Vetores
• Para se referir a um elemento específico de
um vetor, devem ser fornecidos:
� Nome do vetor
� Índice correspondente à posição do elemento dentro do
vetor
• Ex.: A nota do segundo juiz é dada por notas[1]
10Introdução à Computação II – IBM1012
1.1. Vetores
• Expressão com seleção
� Funciona como uma simples variável
• Ex.: nota[2] = 9.4;
� É importante distinguir entre índice de um
elemento e valor de um elemento
nota
0 1 2 3 4
9.4
Índice = 2
Valor = 9.4
11Introdução à Computação II – IBM1012
1.1. Vetores
• Expressão com seleção
� É possível mudar os valores em um vetor, mas 
nunca o seu tamanho
� Valor do índice não precisa ser uma constante
• Pode ser qualquer expressão cujo resultado é um tipo 
escalar (Ex.: int, short, long)
...
for (i = 0; i < NJuizes; i++){
notas[i] = 0.0;
}
...
12Introdução à Computação II – IBM1012
1.1. Vetores
• Tamanho do vetor
� Deve ser constante
� Muitas vezes não se sabe quantos elementos o vetor 
vai conter
• Estratégias
– Declarar tamanho como o número máximo de elementos 
possível (tamanho alocado)
» Declarar um inteiro para indicar número de elementos 
utilizados (tamanho efetivo)
– Alocação dinâmica
13Introdução à Computação II – IBM1012
1.1. Vetores
• Inicialização de vetores
� Valores iniciais podem ser atribuídos a uma variável do 
tipo vetor quando da sua declaração
• Ex.: int digitos[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
• Neste caso, o tamanho do vetor pode ser omitido
– Ex.: int digitos[ ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
Obs.: A Linguagem C não checa se você 
passou dos limites de um vetor
14Introdução à Computação II – IBM1012
1.1. Vetores
/* Programa: Vetores*/
# include <stdio.h>
main(){
int val[100];
int i;
for (i = 0; i < 100; ++i){
val[i] = i;
}
}
Exemplo 1.1.1. Vetores
15Introdução à Computação II – IBM1012
1.1.1. Strings
• Strings são representados internamente como 
vetores de caracteres
� Caracteres são armazenados em bytes consecutivos
� Final de string é representado por ‘\0’
• Ex.: Compilador C reserva 6 bytes para o string “Hello”
• Declaração: char hello = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’}; 
ou char str[6] = “Hello”;
H e ol l \0
16Introdução à Computação II – IBM1012
1.1.1. Strings
• Como strings são vetores, elementos 
individuais podem ser selecionados e 
manipulados
...
int i, n_espacos;
n_espacos = 0;
for (i = 0; str[i] != ‘\0’; i++){
if (str[i] == ‘ ’) n_espacos++;
}
...
17Introdução à Computação II – IBM1012
1.1.1. Strings
• Bibliotecas de operações sobre strings
� Exporta operações que permitem a manipulação de 
strings
� Interface ANSI string.h para manipular strings
• Biblioteca padrão da linguagem C
• Fornece um conjunto de operações avançadas
• Permite trabalhar com o string inteiro utilizando uma 
simples chamada de função
18Introdução à Computação II – IBM1012
1.1.1. Strings
• Funções mais comuns de string.h :
Nome Função
strcpy (s1, s2) Copia s2 em s1
strcat (s1, s2) Concatena s2 ao final de s1
strlen (s1) Retorna o tamanho de s1
strcmp (s1, s2) Retorna 0 se s1 ==s2; menor que 
0 se s1<s2; maior que 0 se s1>s2
strchr (s1, ch) Retorna um ponteiro para a 
primeira ocorrência de ch em s1
strstr (s1, s2) Retorna um ponteiro para a 
primeira ocorrência de s2 em s1
19Introdução à Computação II – IBM1012
1.1.2. Matrizes
• São vetores multi-dimensionais
� Quando os elementos de um vetores são 
vetores 
� Ex.: double mat [3][3];
mat[0][0] mat[0][1] mat[0][2]
mat[1][0] mat[1][1] mat[1][2]
mat[2][0] mat[2][1] mat[2][2]
20Introdução à Computação II – IBM1012
1.1.2. Matrizes
mat [0] [0]
mat [0] [1]
mat [0] [2]
mat [1] [0]
mat [1] [1]
mat [1] [2]
mat [2] [0]
mat [2] [1]
mat [2] [2]
mat [0]
mat [1]
mat [2]
{
{
{
Internamente, C
representa mat como um
vetor de três elementos
Cada elemento é um 
vetor de três valores 
ponto-flutuantes
Na memória, estes nove
valores formam uma 
lista unidimensional
21Introdução à Computação II – IBM1012
1.1.2. Matrizes
• Inicialização
� Como os vetores, podem ser inicializadas na
declaração
• Para enfatizar a estrutura geral, valores de cada vetor interno
são inicializados entre chaves
double ident [3][3] = {
{1.0, 0.0, 0.0 }, 
{0.0, 1.0, 0.0 }, 
{0.0, 0.0, 1.0 }
};
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
22Introdução à Computação II – IBM1012
1.1.2. Matrizes
/* Programa: Matrizes */
#include <stdio.h>
main() {
int t, i, num[3][4];
for(t=0; t<3; ++t) {
for(i=0; i<4; ++i) {
num[t][i] = (t*4)+i+1;
}
}
}
Exemplo 1.1.2. Matrizes
23Introdução à Computação II – IBM1012
1.2. Ponteiros
• Apontadores
• Variável que contém um endereço de
memória
� Este endereço é geralmente a posição de uma outra 
variável na memória
� Quando uma variável contém o endereço de uma 
outra, diz-se que a primeira variável aponta para a 
segunda
24Introdução à Computação II – IBM1012
1.2. Ponteiros
10241000
1008
1016
1024
1032
1040
1048
1056
Endereço
Memória
Valor de uma variável do 
tipo ponteiro
25Introdução à Computação II – IBM1012
1.2. Ponteiros
• Por que usar?
� Permitem que as funções possam modificar seus
argumentos de chamada
� São usados para suportar rotinas de alocação de
memória
• permitem que novos vetores sejam alocados durante a
execução do programa
� Podem substituir as matrizes proporcionando
aumento da eficiência26Introdução à Computação II – IBM1012
1.2. Ponteiros
• Por outro lado, ponteiros são perigosos
� Podem causar o travamento do sistema quando
• Não-inicializados
• São utilizados incorretamente (descuidados)
� Podem causar bugs nos programas quando
• São utilizados incorretamente
27Introdução à Computação II – IBM1012
1.2. Ponteiros
• Variáveis ponteiros devem ser declaradas 
como tal
� tipo-base *nome-da-variavel
� O tipo base do ponteiro define que tipo de variáveis o 
ponteiro pode apontar
• Tecnicamente, qualquer tipo de ponteiro pode apontar para 
qualquer lugar na memória
• Aritmética de ponteiros é feita pelo tipo base, assim é 
importante declarar o ponteiro corretamente
28Introdução à Computação II – IBM1012
1.2. Ponteiros
• Operadores de ponteiros
� Operador unário & fornece o endereço na memória de 
seu operando (variável ou constante)
• Ex.: m = &val;
• & pode ser lido como “endereço de”
� Operador unário * é o complemento de &
• Devolve o valor da variável armazenada no endereço que o 
segue
• Ex.: x = *val;
• * pode ser lido como “no endereço”
29Introdução à Computação II – IBM1012
/* Programa: ponteiro 1*/
#include <stdio.h>
main( ){
int x, y;
int *p1;
x = 100;
p1 = &x; / * pega o endereço de x! */
y = *p1; / * pega o valor de x! */
printf("%d", y); /* escreve o valor de x! */
}
1.2. Ponteiros
Exemplo 1.2.1. Ponteiros
30Introdução à Computação II – IBM1012
/* Programa: ponteiro 2*/
#include <stdio.h>
void main(void){
int x;
int *p1, *p2;
p1 = &x;
p2 = p1;
printf("%p", p2); /* escreve o valor 
hexadecimal do endereco de x! */
}
Exemplo 1.2.2. Ponteiros
1.2. Ponteiros
31Introdução à Computação II – IBM1012
/*Este programa não produz o resultado desejado*/
void main(){
float x, y;
int *p;
p = &x;
y = *p;
printf("%f ", y);
}
1.2. Ponteiros
Exemplo 1.2.3. Ponteiros
32Introdução à Computação II – IBM1012
1.2. Ponteiros
• Relacionamento entre ponteiros e vetores
� Em C, o nome de um vetor tem como valor o 
endereço do primeiro elemento deste vetor
• Ex.: int lista[5]; /* lista é idêntico a &lista[0] */
• Nome de um vetor equivale a um ponteiro para o primeiro 
elemento do vetor 
• Nome de um vetor pode ser atribuído a uma variável do tipo 
ponteiro
– Usado quando um vetor é passado de uma função para outra
33Introdução à Computação II – IBM1012
1.2. Ponteiros
• Diferença entre ponteiros e vetores ocorre 
na alocação de memória durante a 
declaração
� Ex.: int vet[5];
• Reserva 5 posições consecutivas, cada uma capaz de 
armazenar um valor do tipo inteiro
� Ex.: int *p;
• Reserva apenas uma palavra
• Suficiente para armazenar um endereço de memória
34Introdução à Computação II – IBM1012
1.2. Ponteiros
• Como usar um ponteiro como um vetor:
� Atribuir ao ponteiro o endereço base do vetor
• Ex. p = vet; /*p e vetor se tornam “sinônimos” */
� Ponteiro pode ser inicializado para uma nova memória 
que ainda não foi utilizada
• Permite a criação de novos vetores durante execução do 
programa (alocação dinâmica)
35Introdução à Computação II – IBM1012
1.2. Ponteiros
• Aritmética de ponteiros
� Em C, operadores + e - podem ser aplicados a 
ponteiros
� Se p é um ponteiro para o elemento inicial de um 
vetor vet e k é um inteiro, então:
• (p+k) é definido como &vet[k]
• (p+k) corresponde ao elemento k de p
– Em C, pode-se usar p[k] ao invés de (p+k)
• *(p + k) é o valor armazenado no endereço (p + k)
– *(p + 4) = vet[4]
36Introdução à Computação II – IBM1012
...
int *p, val[10];
p = val;
p[5] = 20; /* atribui usando indice */
*(p + 5) = 20 /* atribui usando aritmética de ponteiros */
...
Ambas as 
operações 
atribuem o 
valor 20 
ao sexto 
elemento de 
val
Exemplo 1.2.4. Ponteiros
1.2. Ponteiros
37Introdução à Computação II – IBM1012
1.2. Ponteiros
• Funcionamento do tipo vetor
� Ex.: double lista [3];
• Reserva espaço para três variáveis do 
tipo double (tipo double ocupa 8 bytes)
� Cada elemento de um vetor é um 
valor
• O vetor lista tem um endereço 
• Endereço pode ser definido com o 
operador &
1000
1008
1016
lista [0]
lista [1]
lista [2]
38Introdução à Computação II – IBM1012
1.2. Ponteiros
Sejam as declarações:
� double lista [3];
� double *p;
1000
1008
1016
lista [0]
lista [1]
lista [2]
1024
p
39Introdução à Computação II – IBM1012
1.2. Ponteiros
• Sejam as atribuições:
� lista [0] = 1.0;
� lista [1] = 1.7;
� lista [2] = 1.3;
� p = &lista [0];
1000
1008
1016
lista [0]
lista [1]
lista [2]
1024
p
1.0
1.7
1.3
1000
40Introdução à Computação II – IBM1012
1.2. Ponteiros
• Seja a operação:
� p = p + 2;
• p passa a apontar para o 
elemento que aparece dois 
elementos depois de &lista [0];
• Para cada unidade adicionada a 
p, seu valor numérico interno é 
acrescido de 8
• Aritmética leva em conta o 
tamanho do tipo base
1000
1008
1016
lista [0]
lista [1]
lista [2]
1024
p
1.0
1.7
1.3
1016
41Introdução à Computação II – IBM1012
1.2. Ponteiros
• Aritmética de ponteiros
� Operações /, * e % não podem ser usadas com 
operandos do tipo ponteiro
� Ponteiros não podem ser somados
� Ponteiros podem ser subtraídos
• A operação de subtração ocorre de forma semelhante à 
subtração de inteiros 
• Operação retorna o número de elementos entre os dois 
ponteiros
42Introdução à Computação II – IBM1012
• Ponteiros podem ser decrementados e 
incrementados
� Ex.: *p++;
� De-referencia o apontador e retorna como valor o objeto 
para o qual ele aponta
� Efeito colateral: incrementa o valor de p
• Se o valor anterior era um elemento de um vetor, p passa a 
apontar para o próximo elemento do vetor
1.2. Ponteiros
43Introdução à Computação II – IBM1012
• Um ponteiro pode indicar para outro ponteiro
� O primeiro ponteiro contém o endereço do segundo 
ponteiro, que aponta para uma variável com o valor 
desejado
� Declaração
tipo **nome;
� Pode ser usado em matrizes
1.2. Ponteiros
44Introdução à Computação II – IBM1012
/* Programa: ponteiro para ponteiro */
#include <stdio.h>
void main(void){
int x, *p, **q;
x = 10;
p = &x;
q = &p;
printf("%d", **q); /* imprime o valor de x */
}
1.2. Ponteiros
Exemplo 1.2.5. Ponteiros para ponteiros
45Introdução à Computação II – IBM1012
• Função ou Procedimento ou Sub-Rotina
� Agrupa um conjunto de comandos e associa a ele 
um nome
• O uso deste nome é uma chamada da função
� Após sua execução, programa volta ao ponto do 
programa situado imediatamente após a chamada
• A volta ao programa que chamou a função é chamada 
de retorno
1.3. Funções
46Introdução à Computação II – IBM1012
• A chamada de uma função pode passar
informações (argumentos) para o
processamento da função
• Argumentos = lista de expressões
– Lista pode ser vazia
– Lista aparece entre parênteses após o nome da
função
�Ex. int Soma(int x, int y) {
1.3. Funções
47Introdução à Computação II – IBM1012
• Retornando resultados de funções
� No seu retorno, uma função pode retornar resultados 
ao programa que a chamou
• return (resultados);
• O valor da variável local resultados é passado de volta como 
o valor da função
• Valores de qualquer tipo podem ser retornados
– Funções predicado: funções que retornam valores 
– Procedimentos: funções que não retornam valores
» Exemplo: void function (int x)
1.3. Funções
48Introdução à Computação II – IBM1012
• Comando return
� Encerra a execução da função (procedimento)
• Função: valor da expressão retorna como o valor da 
função
� Procedimentos e Funções
• Em procedimentos– return;
• Em funções
– return (expressão);
– Expressão não precisa estar entre parênteses
1.3. Funções
49Introdução à Computação II – IBM1012
• Definições e protótipos de funções
� Funções são definidas de acordo com a 
seguinte sintaxe:
tipo nome (lista de parâmetros)
{
corpo de função
}
1.3. Funções
50Introdução à Computação II – IBM1012
• Definições e protótipos de funções
� Tipo de resultado
• Quando a função é um procedimento (ou seja, não 
retorna nenhum valor), usa-se a palavra chave void
• Procedimento não retorna valor
� Lista de parâmetros
• Funcionam como variáveis locais com valores iniciais
• Quando função não recebe parâmetros, a lista de 
parâmetros é substituída pela palavra void
1.3. Funções
51Introdução à Computação II – IBM1012
• Funcionamento de uma chamada:
� Cada expressão na lista de argumentos é avaliada
� O valor da expressão é convertido, se necessário, 
para o tipo de parâmetro formal
• Este tipo é atribuído ao parâmetro formal 
correspondente no início do corpo da função
� O corpo da função é executado
1.3. Funções
52Introdução à Computação II – IBM1012
• Funcionamento de uma chamada:
� Se um comando return é executado, o controle é
passado de volta para o trecho que chamou a função
• Se um comando return inclui uma expressão, o valor da 
expressão é convertido, se necessário, pelo tipo do valor que a 
função retorna
– O valor então é retornado para o trecho que chamou a função
– Se um comando return não inclui uma expressão nenhum valor é 
retornado ao trecho que chamou a função
1.3. Funções
53Introdução à Computação II – IBM1012
• Funcionamento de uma chamada:
� Se não existir um comando return, o controle é 
passado de volta para o trecho que chamou a função 
após o corpo da função ser executado
1.3. Funções
54Introdução à Computação II – IBM1012
• Passagem de informações
� Ocorre através da declaração de argumentos dentro da 
declaração 
• Declaração de argumentos informa o número e tipo dos 
argumentos
• Conjunto de argumentos forma uma lista de declarações de 
variáveis separadas por vírgulas
– Ex.: double bolsa, double notas, int idade
1.3. Funções
55Introdução à Computação II – IBM1012
• Passagem de informações por valor
� Significa que uma nova variável será criada dentro 
da função e receberá o valor da variável passada 
como parâmetro
� As novas variáveis só existem dentro da função
• Caso não seja especificado, não poderá mais ser utilizada 
depois que a função foi finalizada
� Alterações nos valores das novas variáveis não 
alteram os valores da variável passada como 
parâmetro
� O mesmo vale quando usamos o return, só que 
agora no sentido inverso
1.3. Funções
56Introdução à Computação II – IBM1012
...
float media (float prova_1, float prova_2, float trabalho) {
float final;
if (trabalho > 5){
final = 0.2*trabalho + 0.8*(prova_1+prova_2)/2 ;
} 
else{
final = 0.1*trabalho + 0.9*(prova_1+prova_2)/2 ;
}
return final;
}
void main(void) {
...
for (i=0;i<nro_alunos-1;i++) {
media_aluno[i]=media(p1[i],p2[i],t [i]);
}
...
}
1.3. Funções
57Introdução à Computação II – IBM1012
• Passagem de informações por referência
� Permite que uma variável passada como 
referência possa ser manipulada dentro da função
� Utilização de ponteiros
� Em C, vetores inteiros podem ser passados como 
parâmetro
• Tamanho do vetor não precisa ser informado na 
declaração da função
– Geralmente, passa-se junto uma variável com o tamanho 
do vetor
1.3. Funções
58Introdução à Computação II – IBM1012
1.3. Funções
...
void norm(float *x , float *y) {
float N;
N = 10.0;
*x = *x / N;
*y = *y / N
}
void main(void) {
float a, b, m;
...
norm( &a , &b );
printf(“Valores = %f , %f”, a, b);
...
}
59Introdução à Computação II – IBM1012
• Se uma função recebe um vetor de uma
dimensão, o parâmetro formal pode ser
declarado como ponteiro ou vetor
� Exemplos (todos têm o mesmo efeito):
func (int *x){
.
.
.
}
func (int x[10]){
.
.
.
}
func (int x[]){
.
.
.
}
1.3. Funções
60Introdução à Computação II – IBM1012
• Uma declaração do tipo 
func (int val[32]){
� Teria o mesmo funcionamento
� Compilador gera código instruindo func() a 
receber um ponteiro
• Não cria um vetor com 32 elementos
1.3. Funções
61Introdução à Computação II – IBM1012
...
sum = Soma (v, vn);
....
int Soma (int vetor[], int n) {
int i, soma;
soma = 0;
for (i = 0; i < n; i++){
soma += vetor[i];
}
return (soma);
}
...
int Soma (int *vetor, int n) {
sum = Soma (v, vn);
1.3. Funções
62Introdução à Computação II – IBM1012
• Protótipos
� Antes de usar uma função em C, é aconselhável 
declará-la especificando seu protótipo 
• Tem a mesma forma que a função, só que substitui o corpo 
por um (;)
• Nomes das variáveis de um parâmetro são opcionais
– Fornecê-los ajuda a leitura do programa
1.3. Funções
63Introdução à Computação II – IBM1012
• Mecanismo do processo de chamada de 
função
1. Valor dos argumentos é calculado pelo programa que está 
chamando a função
2. Sistema cria nova espaço para todas as variáveis locais da 
função (estrutura de pilha)
3. Valor de cada argumento é copiado na variável parâmetro 
correspondente na ordem em que aparecem
3.1 Realiza conversões de tipo necessárias
1.3. Funções
64Introdução à Computação II – IBM1012
• Mecanismo do processo de chamada de função
4. Comandos do corpo da função são executados até: 
4.1 Encontrar comando return 
4.2 Não existirem mais comandos para serem executados
5. O valor da expressão return, se ele existe, é avaliado e 
retornado como valor da função
6. Pilha criada é liberada
7. Programa que chamou continua sua execução
1.3. Funções
65Introdução à Computação II – IBM1012
• Projeto top-down
� Procedimentos e funções permitem dividir um 
programa em pedaços menores 
• Facilita sua leitura 
� É chamado de processo de decomposição
• Estratégia de programação fundamental
• Encontrar a decomposição certa não é fácil
– Requer experiência
1.3. Funções
66Introdução à Computação II – IBM1012
• Projeto top-down
� Melhor estratégia para escrever programas é começar 
com o programa principal
• Pensar no programa como um todo
• Identificar as principais partes da tarefa completa
– Maiores pedaços são candidatos a funções
– Mesmos estas funções podem ser decompostas em funções 
menores
– Continuar até cada pedaço ser simples o suficiente para ser 
resolvido por si só
1.3. Funções
67Introdução à Computação II – IBM1012
Exercício 1.3..1. Escrever um programa C, 
utilizando funções, que
a) Leia três conjuntos de 5 números reais digitados 
pelo usuário;
b) Imprima a média e o desvio padrão de cada um 
dos três conjuntos ;
c) Imprima a média e o desvio padrão das médias 
calculadas no item b).
1.3. Funções
68Introdução à Computação II – IBM1012
Exercício 1.3.2. Escrever um programa C, 
utilizando funções, que
a) Leia 10 números inteiros digitados pelo usuário;
b) Imprima o máximo e o mínimo valor digitado.
1.3. Funções
69Introdução à Computação II – IBM1012
1.4. Estruturas
• Estrutura
� Coleção de variáveis referenciada sobre um mesmo
nome
� Meio conveniente de manter informações relacionadas
juntas
� Conhecida também como Registro (Pascal) ou
Variável Composta Heterogênea
� Permite criar novos tipos de dados
70Introdução à Computação II – IBM1012
• Declaração
� Forma uma fonte que pode ser usada para criar 
variáveis de estruturas
struct nome_da_estrutura {
tipo nome_da elemento_1;
tipo nome_da elemento_2;
...
};
1.4. Estruturas71Introdução à Computação II – IBM1012
• O compilador define um novo tipo de dado
a partir da definição da estrutura
• As variáveis da estrutura são conhecidas
como elementos da estrutura ou membros
da estrutura
� Os elementos da estrutura são logicamente
relacionados entre si
1.4. Estruturas
72Introdução à Computação II – IBM1012
• Para utilização da estrutura definida, variáveis
do tipo de dado definido devem ser criadas
• Isto declarará a variável estrutura
nome_da_variável_estrutura do tipo
nome_da_estrutura
struct nome_da_estrutura nome_da_variavel_estrutura;
1.4. Estruturas
73Introdução à Computação II – IBM1012
• O compilador irá alocar automaticamente memória
suficiente para acomodar todas as variáveis que
compreendem a estrutura
� Exemplo 1.4.1. Estruturas
...
struct endereco {
char nome[40];
char rua[50];
char cidade[20];
char estado[2];
unsigned long int cep;
};
...
main( ){ 
struct endereco cliente;
...
nome 40 bytes
rua 50 bytes
cidade 20 bytes
estado 2 bytes
cep 4 bytes
cliente
116 bytes
1.4. Estruturas
74Introdução à Computação II – IBM1012
• As variáveis podem ser declaradas logo
depois da estrutura
struct nome_da_estrutura {
tipo nome_do_elemento_1;
tipo nome_do_elemento_2;
...
} nome_das_variaveis_estrutura;
1.4. Estruturas
75Introdução à Computação II – IBM1012
• Referência
� As variáveis de uma estrutura são selecionadas
através do operador ponto
nome_da_estrutura.nome_do_elemento;
1.4. Estruturas
76Introdução à Computação II – IBM1012
...
struct endereco {
char nome[40];
char rua[50];
char cidade[20];
char estado[2];
unsigned long int cep;
};
...
main( ){ 
struct endereco cliente;
...
strcpy(cliente.cidade, "Sao Paulo");
cliente.cep = 14500000;
...
Exemplo 1.4.2. Estruturas
1.4. Estruturas
77Introdução à Computação II – IBM1012
Exemplo 1.4.3. Estruturas
...
struct endereco {
char nome[40];
char rua[50];
char cidade[20];
char estado[2];
unsigned long int cep;
};
...
main( ){ 
struct endereco cliente;
...
gets(cliente.cidade);
printf(“Cidade: %s \n”,cliente.cidade);
...
1.4. Estruturas
78Introdução à Computação II – IBM1012
• Vetores e matrizes podem ser declarados
como sendo do tipo de uma estrutura
� Exemplo 1.4.4. :
nome_da_estrutura nome_da_variavel_estrutura[tamanho];
...
struct endereco {
...;
};
...
main( ){ 
struct endereco cliente[25];
...
gets(cliente[i].nome);
...
1.4. Estruturas
79Introdução à Computação II – IBM1012
• Ponteiros para estruturas
� Da mesma maneira que para qualquer outro tipo de 
variável, C permite ponteiros para estruturas
� Declaração:
� Quando ponteiro é utilizado para referenciar uma 
variável do tipo estrutura, o operador seta (->) deve 
ser utilizado para referenciar um de seus membros
struct nome_da_estrutura *nome_da_variavel_estrutura;
1.4. Estruturas
80Introdução à Computação II – IBM1012
• Ponteiros para estruturas
� Exemplo:
...
struct saldo {
float valor;
char nome[100];
};
...
main( ){ 
struct saldo *p, cliente;
...
p = &cliente;
p->valor = 1200.0;
...
1.4. Estruturas
81Introdução à Computação II – IBM1012
• Typedef
� Permite definir novos nomes de tipos de dados 
� Forma geral
� Exemplos:
1.4. Estruturas
typedef tipo nome;
...
typedef float flutuante;
...
main ( ) {
flutuante a;
...
}
...
typedef struct cliente_tipo {
...
} cliente;
...
main ( ) {
cliente clist[N];
...
}
82Introdução à Computação II – IBM1012
Exercícios
Exercício 1.4.1. Escreva um programa em C em
que
1. o usuário possa entrar com o tamanho de um vetor e
com seus elementos
2. tenha uma função que imprima os valores e os índices
do maior elemento do vetor
3. tenha uma função que imprima os valores e os índices
do menor elemento do vetor
4. utiliza ponteiros para passar o vetor para as funções
83Introdução à Computação II – IBM1012
Exercício 1.4.2. Escreva um programa em C
em que o usuário possa entrar com os
elementos de um vetor e que ordene de
forma crescente os seus elementos. Imprima
o novo vetor.
Exercícios
84Introdução à Computação II – IBM1012
Exercícios
Exercício 1.4.3. Escrever um programa C que
1. Possua uma estrutura chamada aluno com os seguintes 
elementos
i. Nome (string)
ii. Numero USP (long int)
iii. Nota da primeira prova (float)
iv. Nota da segunda prova (float)
v. Média Final (float)
2. Tenha um menu que permita realizar as seguintes operações
i. Entrar com dados dos aluno 
ii. Mostrar dados do aluno 
iii. Sair
Observações: 
– procurar dados do aluno através de seu número USP
– calcular a Média Final como a média aritmética entre as duas 
provas
– entrar com os dados de três alunos
85Introdução à Computação II – IBM1012
Exercícios
/*******************************
Programa:Estrutura
Ex. 1.3 
********************************/
#include<stdio.h>
struct aluno_st {
char nome[40];
float prova_1;
float prova_2;
float media;
long int nro_usp;
} ;
main() { 
int i, indice_aluno;
long int nro_usp_procurado;
int opcao=0;
struct aluno_st aluno[3];
while (opcao!=3) {
// Menu
printf("\nMenu\n");
printf("(1) Entrar com dados do aluno\n");
printf("(2) Mostrar dados do aluno\n");
printf("(3) Sair\n");
printf("Entre com a opcao: ");
scanf("%d",&opcao);
printf("\n");
86Introdução à Computação II – IBM1012
Exercícios
// Entrada de Dados
if (opcao==1) {
printf("\n Entrada de Dados\n");
for (i=0;i<3;i++) {
printf("Aluno %d \n",i);
printf("Entre com o nome do aluno: ");
gets(aluno[i].nome);
// para zerar o carro
gets(aluno[i].nome);
printf("Entre com o numero USP do aluno: ");
scanf("%d",&aluno[i].nro_usp);
printf("Entre com nota da primeira prova: ");
scanf("%f",&aluno[i].prova_1);
printf("Entre com nota da segunda prova: ");
scanf("%f",&aluno[i].prova_2);
aluno[i].media = 0.5*aluno[i].prova_1+0.5*aluno[i].prova_2;
}
}
87Introdução à Computação II – IBM1012
Exercícios
else if (opcao==2) {
printf("\n Mostrar Dados\n");
indice_aluno = -1;
printf("Entre com o numero USP do aluno: ");
scanf("%d",&nro_usp_procurado);
for (i=0;i<3;i++) {
if (nro_usp_procurado==aluno[i].nro_usp) {
indice_aluno = i;
}
}
if (indice_aluno>-1) {
printf("Aluno: %s \n ",aluno[indice_aluno].nome);
printf("Nro. Usp: %d \n ",aluno[indice_aluno].nro_usp);
printf("Nota 1: %f \n ",aluno[indice_aluno].prova_1);
printf("Nota 2: %f \n ",aluno[indice_aluno].prova_2);
printf("Media: %f \n ",aluno[indice_aluno].media);
}
else{
printf("Aluno nao encontrado \n");
}
}
}
printf("FIM! \n");
}
88Introdução à Computação II – IBM1012
1.5. Alocação Dinâmica
• Permite a criação dinâmica de variáveis e 
vetores durante a execução do programa
• Se alocação dinâmica não é utilizada, o 
programador deve saber de antemão a 
quantidade de espaço necessária para 
cada variável ou vetor
• Em C, 
� Variáveis globais são armazenadas em área de 
armazenamento de tamanho fixo
� Variáveis locais são armazenadas em uma pilha
89Introdução à Computação II – IBM1012
• Utilização da memória em C
1.5. Alocação Dinâmica
Programa
Variáveis Globais
Pilha
Espaço para 
Alocação Dinâmica
Baixa
Alta
90Introdução à Computação II – IBM1012
• Em C, podem ser usadas
� malloc( )
• Aloca memória
void *malloc(unsigned numero_bytes)
– Como o ponteiro é do tipo void, pode ser atribuído 
qualquer tipo de dado
� free( )
• Desaloca memória
1.5. Alocação Dinâmica
91Introdução à Computação II – IBM1012
1.2. Ponteiros
...
#include <stdlib>
...
// Alocacao dinamica de vetor de inteiros
int *aloc_vetor(int linhas){
int *vetor;
vetor = (int *)malloc(linhas*sizeof(int));if (!vetor) {
printf("Erro de alocacao de vetor de inteiros!\n");
exit(1);
}
return vetor;
}
...
void main(void){
int tam, *v;
...
v = aloc_vetor(tam);
...
free(v); // desalocacao
...
92Introdução à Computação II – IBM1012
...
#include <stdlib>
...
// Alocacao dinamica de matriz de floats
float **aloc_matriz(int linhas , int colunas){
int i;
float **Matriz;
Matriz = (float **)malloc(linhas*sizeof(float));
for (i=0;i<linhas;i++) {
Matriz[i] = (float *)malloc(colunas*sizeof(float));
}
if (!Matriz) {
printf("Erro de alocacao da matriz ( %d x %d )!", linhas, colunas);
exit(1);
}
return Matriz;
}
...
// continuacao no proximo slide
93Introdução à Computação II – IBM1012
// continuacao
...
// Desalocacao dinamica de matriz de floats
void desaloc_matriz(float **Matriz , int linhas)
{
int i;
for(i=0;i<linhas;i++) {
free(Matriz[i]);
}
}
void main(void){
int lin, col;
float **M;
...
M = aloc_matriz(lin, col);
...
desaloc_matrizf(M , lin);
...
94Introdução à Computação II – IBM1012
Comentários Finais
• Agradecimentos
� Material elaborado pelo Prof. Renáto Tinós
(FFCLRP/USP)
� Parte do material desta apresentação foi obtida
através de slides da disciplina de Introdução à
Computação ministrada pelo Prof. André C. P. L.
F. de Carvalho (ICMC/USP)

Outros materiais