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

Programação em C/ C++

Formador: Rogélio Rodrigues


Histórico da Linguagem C

 Criada por Denis Ritchie, na década de 1970, para


ser usada no Sistema Operativo Unix
C  C++
 C++ é uma extensão da linguagem C
O sistema Unix é escrito em C e C++

2
C comparado a outras linguagens

 Devemos entender Nível Alto como sendo a capacidade da


linguagem em compreender instruções escritas em
“dialetos” próximos do inglês (Ada e Pascal, por exemplo) e
Nível Baixo para aquelas linguagens que se aproximam do
assembly, que é a linguagem própria da máquina, compostas
por instruções binárias e outras incompreensíveis para o ser
humano não treinado para este propósito.
 Infelizmente, quanto mais clara uma linguagem for para o
humano (simplicidade >) mais obscura o será para a
máquina (velocidade <).
C comparado a outras linguagens

Nível Baixo Nível Médio Nível Alto

Clareza
Velocidade

Assembler C Basic Pascal


COBOL
Aplicações escritas em C

 Sistema Operativo: UNIX


 Excel
 Bases de Dados: Access
 Aplicações Gráficas: Efeitos Especiais de filmes
como Star Trek e Star Wars.
Estrutura básica de um programa C

diretivas para o pré-processador


declaração de variáveis globais
main ()
{
declaração de variáveis locais da função main
comandos da função main
}
Palavras reservadas

 São palavras que têm um significado especial para a linguagem.

auto, break, case, if, for, while, begin, end,


continue, return, const,....


C entende tais palavras apenas em letras
minúsculas, ou seja, palavras reservadas
obrigatoriamente devem estar em letras minúsculas.
Bibliotecas

 Conjunto de funções para realizar tarefas


específicas.
 Biblioteca padrão C - ANSI - funções básicas.
 As primeiras linhas do programa indicam as
bibliotecas utilizadas

#include “minha_biblioteca.h” ou
#include <minha_biblioteca.h>
Bibliotecas
 Diretiva #include permite incluir uma
biblioteca
 Bibliotecas contêm funções pré-definidas,
utilizadas nos programas
 Exemplos

#include <stdio.h> Funções de entrada e saída


#include <stdlib.h> Funções padrão
#include <math.h> Funções matemáticas
#include <system.h> Funções do sistema
#include <string.h> Funções de texto

9
O ambiente Dev-C++

O Dev-C++ é um ambiente de desenvolvimento de


programas em C e C++ com editor, compilador,
bibliotecas e debugger
 Pode ser feito o download através do link:
http://www.bloodshed.net/devcpp.html
 Vamos criar apenas programas para consola, na
linguagem C
Usando o Dev-C++

 Inicieo Dev-C++ pelo ícone ou pelo menu


 Crie um novo arquivo, com o comando
File(Arquivo), New(Novo) Source File(Arquivo
Fonte)
 Edite o programa da página seguinte

11
Usando o Dev-C++

/* Primeiro Programa em C */
#include <stdio.h>
#include <stdlib.h>

int main()
{
printf(“Meu primeiro programa em C\n”);

}
Estrutura de um programa C
/* Primeiro Programa em C */ comentários
#include <stdio.h> /*biblioteca de E/S */

int main() /*função principal – inicio do programa*/


{ /*marca início da função*/
printf(“Meu primeiro programa em C\n”); /*função
para escrever na tela*/
system(“pause”);
/*comando para segurar mensagem em tela*/

} /*marca fim da função*/


Usando o Dev-C++

 Salve o programa com o nome exemplo.c. Para isso,


selecione o menu Arquivo, Salvar como.
 Compile o programa com o comando Executar, Compilar
ou com a tecla Ctrl-F9
 Se houver algum erro de sintaxe, aparece uma ou mais
mensagens no rodapé da janela. Neste caso, corrija o
programa e repita.
 Se não houver erros, execute o programa com o
comando Executar, Executar ou com a tecla Ctrl-F10
Compilando e Executando


Para compilar: (verifica a sintaxe)
Executar / compilar ou

Para executar: (exibir tela para usuário)
Executar / Executar ou

Para compilar e executar: (simultaneamente)
Executar/Compilar & Executar ou
Dicas

 Termine todas as linhas com ;


 Guarde sempre o programa antes de compilar
 Compile sempre o programa antes de executar
 Quando ocorrer um erro de compilação, dê um duplo clique
sobre a mensagem de erro para destacar o comando errado
no programa
 Verifiquetambém a linha anterior, que pode ser a
responsável pelo erro, especialmente se faltar o ;
 Use comentários, iniciados por //
Template

#include <stdio.h>
main()
{
printf ("Alo mundo!");
system("PAUSE");
}
Variáveis

 Variável:“objeto” que pode assumir diversos valores;


 espaço de memória de um certo tipo de dado
associado a um nome para referenciar seu conteúdo
Main ( )
{
int idade;
idade = 30;
  printf (“ A idade é : %d”, idade);
}
Nomes de Variáveis

 quantos caracteres quiser até o limite (32);


 comece com letras ou sublinhado:
Seguidos de letras, números ou sublinhados

C é sensível ao caso:
peso <> Peso <> pEso

 nãopodemos definir um identificador com o


mesmo nome que uma palavra chave
auto static extern int long if while do ......
Declaração de Variáveis

 Instrução para reservar uma quantidade de memória para um certo tipo de


dado, indicando o nome pelo qual a área será referenciada

>> tipo nome-da-variável; ou


>> tipo nome1, nome2,...,nomen;
EX: char nome;
int idade, num;
Tipos Básicos de Dados

 determinar um conjunto de valores e as possíveis


operações realizadas sobre os mesmos ;
 informa a quantidade de memória (bytes);

tipo bytes

char 1
int 2
float 4
double 8
Tipos Básicos de Dados

 char: Guarda um caracter


 int: Guarda um número inteiro
 float: Guarda um número real com certa precisão
 double: Guarda um número real com precisão maior que
float
tipo bytes

char 1
int 2
float 4
double 8
Programa Exemplo – Tipos de Dados e
Variáveis
#include <stdio.h>
main( )
{
int soma=10;
float money=2.21;
char letra= ´A´;
double pi=2.01E6;

printf (“valor de soma = %d\n”, soma);


printf (“Valor de Money = %f\n”, money);
printf(“Valor de Letra = %c\n”, letra);
printf(“Valor de Pi = %e\n”, pi);

}
Programando – Exercício 1

 Faça um programa para ler e escrever na tela o


seu nome e a sua idade.
#include <stdio.h>
main( )
{
int idade;
char nome[30];
printf (“Digite o seu nome:\n”);
scanf(“%s”, nome);
printf (“Digite a sua idade:\n”);
scanf (“%d”, &idade);
printf(“A idade do(a) %s é %d”,nome, idade);
}
Declarações
 Declaram as variáveis e seus tipos
 Os nomes das variáveis devem conter apenas letras, dígitos e o
símbolo _
 Até 32 caracteres
 Os principais tipos são: int, float, double e char
 Exemplos
int n;
int quantidade_valores;
float x, y, somaValores;
char sexo;
char nome[40];

Java diferencia letras maiúsculas de minúsculas!


int n, N;
n é diferente de N!
Real: n1, n2, n3, media #include <stdio.h>
main()
{
double n1, n2, n3, media;

system("PAUSE");
}
Comando de atribuição

 Atribui o valor da direita à variável da esquerda


O valor pode ser uma constante, uma variável ou uma
expressão
 Exemplos
x = 4; --> lemos x recebe 4
y = x + 2;
y = y + 4;
valor = 2.5;
sexo = 'F'
Entrada e Saída

 Função scanf
scanf ("formatos", &var1, &var2,...)
%d inteiro
Exemplos: %f float
int i, j;
%lf double
float x; %c char
char c; %s palavra
char* nome;
scanf("%d", &i);
scanf("%d %f", &j, &x);
scanf("%c", &c);
scanf("%s", nome);
Real: n1, n2, n3, media #include <stdio.h>
main()
{
double n1, n2, n3, media;
n1, n2, n3
ler n1 scanf
scanf("%lf
("%lf",&n1);
%lf %lf",&n1, &n2, &n3);
ler n2 scanf ("%lf",&n2);
ler n3 scanf ("%lf",&n3);

system("PAUSE");
}
Operadores Matemáticos

Operador Exemplo Comentário


+ x + y Soma x e y

- x – y Subtrai y de x

* x * y Multiplica x e y

/ x / y Divide x por y

% x % y Resto da divisão de x por y

++ x++ Incrementa em 1 o valor de x

-- x-- Decrementa em 1 o valor de x


Real: n1, n2, n3, media #include <stdio.h>
main()
{
double n1, n2, n3, media;
ler n1
n1, n2, n3 scanf
scanf("%lf
("%lf",&n1);
%lf %lf",&n1, &n2, &n3);
ler n2
media=(n1+n2+n3)/3 scanf ("%lf",&n2);
media=(n1+n2+n3)/3;
ler n3 scanf ("%lf",&n3);

system("PAUSE");
}
Entrada e Saída

 Função printf
printf ("formatos", var1, var2,...)
%d inteiro
Exemplos: %f float
int i, j;
%lf double
float x; %c char
char c; %s palavra
char* nome;
printf("%d", i);
printf("%d, %f", j, x);
printf("%c", c);
printf("%s", nome);
Real: n1, n2, n3, media #include <stdio.h>
main()
{
double n1, n2, n3, media;
ler n1
n1, n2, n3 scanf
scanf("%lf
("%lf",&n1);
%lf %lf",&n1, &n2, &n3);
ler n2
media=(n1+n2+n3)/3 scanf ("%lf",&n2);
media=(n1+n2+n3)/3;
ler n3 scanf ("%lf",&n3);
exibir media printf (“%lf”,media);

system("PAUSE");
}

Mãos à Obra!
#include <stdio.h> #include <stdio.h>
main() main()
{ {
double n1, n2, n3, double n1, n2, n3, media;
scanf ("%lfmedia;
%lf %lf", printf(“Digite 3 notas: ”);
&n1, &n2, &n3); scanf ("%lf %lf %lf",&n1, &n2,
&n3);
media=(n1+n2+n3)/3;
media=(n1+n2+n3)/3;
printf (“A média é %0.2lf”,media);
printf (“%lf”,media);
system("PAUSE");
system("PAUSE"); }
}
Exercício

Tendo como dados de entrada a altura e o sexo de uma


pessoa, construa um programa que calcule seu peso
ideal, utilizando a seguinte fórmula:
 peso ideal = (72.7*h) - 58
Operadores de Atribuição

Operador Exemplo Comentário


= x = y Atribui o valor de y a x

+= x += y Equivale a x = x + y

-= x -= y Equivale a x = x – y

*= x *= y Equivale a x = x * y

/= x /= y Equivale a x = x / y

%= x %= y Equivale a x = x % y
Operadores Lógicos

Operador Exemplo Comentário


== X == ‘m’ Igual a
!= X != 0 Diferente de
|| X == ‘m’||x==‘M’ Ou lógico
&& X && y E lógico
!X Não lógico
&x Referência
Funções Matemáticas
Função Exemplo Comentário
ceil ceil(x) Arredonda o número real para cima; ceil(3.2) é 4
cos cos(x) Cosseno de x (x em radianos)
exp exp(x) e elevado à potencia x
fabs fabs(x) Valor absoluto de x
floor floor(x) Arredonda o número deal para baixo; floor(3.2) é 3
log log(x) Logaritmo natural de x
log10 log10(x) Logaritmo decimal de x
pow pow(x, y) Calcula x elevado à potência y
sin sin(x) Seno de x
sqrt sqrt(x) Raiz quadrada de x
tan tan(x) Tangente de x

#include <math.h>
Exercício
Construa um algoritmo que tendo como entrada dois pontos quaisquer do plano P(x1,y1) e
Q(x2,y2), imprima a distância entre eles.
A fórmula da distância é:

Construa um algoritmo que calcule a quantidade de latas de tinta necessárias e o custo para
pintar tanques cilíndricos de combustível, onde são fornecidos a altura e o raio desse cilindro.
Sabendo que:
- a lata de tinta custa 20,00 euros
- cada lata contém 5 litros
- cada litro de tinta pinta 3 metros quadrados.
Sabendo que:
Área do cilindro=3,14*raio2 + 2*3,14*raio*altura
e que raio e altura são dados de entrada.
Operadores Relacionais
Operador Exemplo Comentário
== x == y O conteúdo de x é igual ao de y

!= x != y O conteúdo de x é diferente do de y

<= x <= y O conteúdo de x é menor ou igual ao de y

>= x >= y O conteúdo de x é maior ou igual ao de y

< x < y O conteúdo de x é menor que o de y

> x > y O conteúdo de x é maior que o de y

As expressões relacionais em C retornam um número:


• 1 se verdadeiro
• 0 se falso.
Operadores - Observação

 Em C o resultado da comparação será ZERO se


resultar em FALSO e DIFERENTE DE ZERO no caso
de obtermos VERDADEIRO num teste qualquer.
Operadores - Exemplo

#include <stdio.h>
main ( ) Saída: Verd.=1 Falso = 0
{
int verdadeiro, falso;
 
verdadeiro = (15 < 20);
falso = (15 == 20);
printf(“Verd.= %d,Falso= %d”,
verdadeiro, falso);
}
Comparações e Testes

 Observemos antes de mais nada que ++x é diferente de x++!

Se
x = 10; porém Se
x = 10;
y = ++x;
y = x++;
/* x=x+1; y=x; */
/* y=x; x=x+1 */
então então
x = 11 e x = 11 e
y = 11 y = 10
Programa Exemplo – Pré/Pós Incremento

#include<stdio.h>
main()
{
int cont = 0, loop;
loop=++cont;
printf(“Loop=%d, Cont=%d\n”, loop, cont);

loop=cont++;
printf(“Loop=%d, Cont=%d\n”, loop, cont);

Quais são as saídas deste programa ?


Comparações e Testes

Se
x = 1;
y = 2;
printf(“%d == %d e’ %d\n”, x, y, x==y )

Qual seria a saída deste comando?


resultaria em 1 == 2 0
(pois a expressão é falsa)
Comparações e Testes

if (10 > 4 && !(10 < 9) || 3 <= 4)

Como seria avaliado esta instrução?


resultaria em Verdadeiro, pois dez é maior
que quatro E dez não é menor que nove
OU três é menor ou igual a quatro
Operador Sizeof

 Este operador retorna o tamanho da variável


ou tipo que está em seu operando.

 Por exemplo “sizeof(char)” resultaria em 1.


Operadores Lógicos
 && (E lógico): retorna verdadeiro se ambos os
operandos são verdadeiros e falso nos demais casos.
Exemplo: if( a>2 && b<3).

 || (OU lógico): retorna verdadeiro se um ou ambos os


operandos são verdadeiros e falso se ambos são falsos.
Exemplo: if( a>1 || b<2).

 ! (NÃO lógico): usada com apenas um operando.


Retorna verdadeiro se o operando é falso e vice-versa.
Exemplo: if( !var ).
Operadores Lógicos
Tabela E Tabela OU Tabela
NÃO
VeVV V ou V  V Não V  F

VeFF V ou F  V Não V  F

FeVF F ou V  V

FeFF F ou F  F
Estruturas de Decisão

 Permitir testes para decidir ações alternativas:


 if
 if - else
 switch
 (?:) Operador Condicional
Comando if-else

O comando if só executa a instrução caso a


condição de teste seja verdadeira, nada
fazendo se a expressão for falsa.

O comando else executará uma instrução ou


um conjunto de instruções se a expressão for
falsa.
Estrutura condicional simples
if (a<menor)
menor=a;
 Comando if

if (condição) {
if (a<menor) {
menor=a;
comando1; printf (“%d”, menor);
comando2; }
comando3;
}
em pseudo-código:
se (a<menor) entao menor=a;
Estrutura condicional composta
Executa o comando se a condição for
qualquer coisa diferente de zero!
 Comando if...else
if (condição)
comando;
else
if (peso= =peso_ideal)
comando; printf (“Voçê está em forma!”);
else
if (condição) { printf (“Necessário fazer dieta!”);
comando1;
comando2;
} else { em pseudo-código:
comando3; se (peso= =peso_ideal)
comando4; entao exibir “Voçê está em forma!”
} senao exibir “Necessário fazer dieta!”
Exemplo 1: Programa Adulto, Jovem ou Velho.

#include <stdio.h>
main()
{
int i;
printf(“Digite sua idade: “);
scanf(“%d”,&i);
if (i > 70)
printf(“Esta Velho!”);
else
if (i > 21)
printf(“Adulto”);
else
printf(“Jovem”);
}
Exercício

Dados os 3 valores A, B, C, verificar se eles podem ser os


comprimentos dos lados de um triângulo e, se forem, verificar se
compõem um triângulo equilátero, isósceles ou escaleno.
Informar se não compuseram nenhum triângulo.
 Triângulo: figura geométrica de 3 lados, onde cada um é menor do que a
soma dos outros dois.
 Triângulo equilátero: Triângulo com 3 lados iguais.
 Triângulo isósceles: Triângulo com 2 lados iguais.
 Triângulo escaleno: Triângulo com todos os lados diferentes.
Exercício

Faça um programa que leia um número inteiro e mostre uma


mensagem indicando se este número é par ou ímpar, e se é
positivo ou negativo.
Estrutura de repetição

Comando for

for (var=valor inicial; condição; incremento)


comando;

for (var=valor inicial; condição; incremento)


{ Exemplo:
comando1; for (cont=3; cont<=11; cont++)
printf (“%d”,cont);
comando2
comando3; Pseudo-código:
} Para CONT = 3 até 11
repetir
Mostrar CONT
Exercícios
Sendo h= 1 + ½ + 1/3 + ¼ + ... + 1/N, prepare um algoritmo para
calcular o número h, sendo o número N fornecido pelo utilizador.

Elabore um algoritmo que calcule N! (fatorial de N), sendo que o


valor inteiro de N é fornecido pelo utilizador. Sabendo que:
 N! = 1 x 2 x 3 x ... x (N-1) x N;
 0! = 1, por definição.

Faca um programa que apresente na tela a tabela de conversão de


graus Celsius para Fahrenheit, de -100 C a 100 C. Use um
incremento de 10 C.
 OBS: Farenheit = (9/5)*(Celsius) + 32
Exercícios

Calcular e listar todos os múltiplos positivos do número 7 menores ou iguais a 100.

Pergunta: quantas vezes executa a fórmula?

i 7 j 7
(2 * j  1) * i

i 0 j 0 2* j  5
Estrutura de repetição
 Comando while
Exemplo:
while (condição) while (N != 0) {
comando; scanf ("%d",&N);
if (N > MAIOR) MAIOR = N;
}
while (condição) {
Pseudo-código:
comando1; MAIOR = 0
N=1
comando2 Enquanto (N <> 0) repetir
comando3; Ler N
Se (N > MAIOR) então MAIOR = N
} Mostrar MAIOR
Exercício
Uma pessoa x tem 1,50 metros e cresce 2 centímetros por
ano, enquanto a pessoa y tem 1,10 metros e cresce tem 3
centímetros por ano. Construa um programa que calcule e
imprima quantos anos serão necessários para que a pessoa y
seja maior que pessoa x.

Escreva um programa que pergunte ao utilizador quantos alunos tem


na sala dele. Em seguida, através de um ciclo while, pede ao
utilizador para que entre com as notas de todos os alunos da sala,
um a um. Por fim, o programa deve mostrar a média aritmética da
turma.
Exercício
Escreva um programa em C que solicita 10 números ao utilizador,
através de um ciclo while, e ao final mostre qual destes números é
o maior.

Escreva um programa que pergunta um número ao utilizador, e


mostra a tabuada completa (de 1 até 10).

Escreva um programa em C que recebe inteiro e mostra os números


pares e ímpares (separados, em duas colunas), de 1 até esse inteiro.
Exercício
Elaborar um programa que efetue a leitura de valores positivos
inteiros até que um valor negativo seja informado. Ao final devem
ser apresentados o maior e menor valores informados pelo utilizador

Receber um número e verificar se ele é triangular. (UM NÚMERO É


TRIANGULAR QUANDO É RESULTADO DO PRODUTO DE 3 NÚMEROS
CONSECUTIVOS. EXEMPLO: 24 = 2 * 3 * 4) #

Escrever um programa que leia, valores inteiros, até ser lido o valor
99. Quando isso acontecer o programa deverá escrever a soma e a
média dos valores lidos.
Estrutura de repetição
Exemplo:
 Comando do...while
cont=0;
do { do {
cont = cont + 1;
comando printf("%d\n",cont);
} while (condição); } while (cont < 10);

do { Em pseudo-código:
CONTADOR = 0
comando1; Repetir
CONTADOR = CONTADOR + 1
comando2 exibir CONTADOR
enquanto CONTADOR < 10
comando3;
} while (condição);
Exercício

Faça um programa que leia números digitados pelo


utilizador até ele digitar -1 (utilizando um ciclo while).
No final, calcule a média dos números fornecidos.

Perguntar ao usuário quantos números deseja somar. Em


seguida, ler estes N números e apresentar o valor da
soma. (Fazer 3 versões deste programa: usando FOR,
usando WHILE e usando DO...WHILE).
Vetores (array)
 Trata-se de automatizar a declaração de um grande número de dados de um mesmo tipo
simples. As variáveis assim declaradas se acessam através de um índice de tipo int.

 Declaração:
 int v[100];
 primeira posição =0;
 última posição=99;
 Atribuição:
 v [9] = 87;

 Acessar um valor:
 a = v[9];
 int v[10];

0
V[5]=10;
1
2 printf (“%d”,V[5]);
3
4
5 10
6
7
8
9
Quando usar?
 Calcular a média da nota de 5 alunos e verificar quantos conseguiram nota
acima da média:
#include <stdio.h>
inteiro: cont, soma; main()
{
real: media, num int contA=0;
para cont=1 até 5 repetir double media, n1, n2, n3, n4, n5;
scanf ("%lf %lf %lf %lf %lf",
receber num &n1, &n2, &n3, &n4, &n5);
media = (n1+ n2 + n3 + n4 + n5)/5;
soma = soma + num if (n1>media) contA=contA+1;
if (n2>media) contA=contA+1;
media = soma/cont if (n3>media) contA=contA+1;
if (n4>media) contA=contA+1;
Como verificar se a nota de if (n5>media) contA=contA+1;
cada aluno é maior que a printf ("%lf %d", media, contA);
média?? system("pause");
}
#include <stdio.h>
#include <stdio.h> main()
main()
{
{
int i, contA=0;
int contA=0;
double soma=0, media;
double media, n1, n2, n3, n4, n5;
double v[5];
scanf ("%lf %lf %lf %lf %lf",
&n1, &n2, &n3, &n4, &n5);
for (i=0;i<5;i++) {
media = (n1+ n2 + n3 + n4 + n5)/5;
scanf ("%lf", &v[i]);
if (n1>media) contA=contA+1;
soma = soma + v[i];
if (n2>media) contA=contA+1;
if (n3>media) contA=contA+1; }

if (n4>media) contA=contA+1; media = soma/i;

if (n5>media) contA=contA+1; for (i=0;i<5;i++) {

printf ("%lf %d", media, contA); if (v[i]>media) contA=contA+1;

system("pause"); }
} printf ("%lf %d\n", media, contA);
system("PAUSE");
}
Exercícios
Dada duas sequências de 5 números, calcule a soma de cada
número com o seu correspondente;
Ler 5 números, armazenando-os no vetor X[5]. Calcular a soma
destes 5 números e mostrá-la na tela;
Ler 5 números, armazenando-os no vetor X[5]. Copiar este vetor,
de trás para frente (na ordem inversa de leitura), em um segundo
vetor Y[5]. Mostrar o vetor Y;
Gerar um vetor com 10 números da seguinte forma: cada número
guardado no vetor será o valor da sua própria posição no vetor(seu
índice) menos 2 (ou seja, Xi = i-2). Mostrar na tela este vetor.
Strings

 Não existe um tipo String em C.


 Strings em C são uma array do tipo char que termina com ‘\0’.
 Para literais String, o próprio compilador coloca ‘\0’.

#include <stdio.h>
main(){
char re[] = "lagarto";
printf ("%s", re);
system("pause");
}
Para ler uma String

 Comando gets

#include <stdio.h>
main(){
char re [80];
printf ("Digite o seu nome: ");
gets(re);
printf ("Oi %s\n", re);
system("pause");
}
Para comparar duas strings
 strcmp (s1, s2); strcmp retorna 0 se as duas strings são iguais.
 Precisa do #include <string.h>
Pode utilizar scanf no lugar do gets, só que o
#include <stdio.h>
scanf não lê espaços em branco.
#include <string.h> Se o usuário digitar:
main( ){ >“Alexandre Costa e Silva”
char re[80]; o scanf vai pegar apenas “Alexandre”.
printf ("Digite a senha: "); O gets pega tudo.
scanf ("%s", &re);
if (strcmp(re,"laranja")==0) {
printf ("Senha correta\n");
}
else {
printf ("Senha invalida\n");
}
system("pause");
}
Para saber o tamanho de uma string
 int size = strlen(str);
 Retorna um valor inteiro com o número de caracteres da String.
 Precisa do #include <string.h>

#include <stdio.h>
#include <string.h>
main(){
char re[80];
printf ("Digite a palavra: ");
scanf ("%s", &re);
int size=strlen(re);
printf ("Esta palavra tem %d caracteres.\n", size);
system("pause");
}
Para copiar o conteúdo de uma string para outra
 strcpy(para, de);
 Precisa do #include <string.h>

#include <stdio.h>
#include <string.h>
main()
{
char str[80];
strcpy (str, "Alo");
printf ("%s", str);
system("pause");
}
Exercícios
Escreva um programa que leia duas strings e as coloque na
tela. Imprima também a segunda letra de cada string.
Escreva um programa que leia uma string, conte quantos
caracteres desta string são iguais a 'a' e substitua os que forem
iguais a 'a' por 'b'. O programa deve imprimir o número de
caracteres modificados e a string modificada.
Faça um programa que verifique se uma palavra é simétrica. Por
exemplo: “arara” é uma palavra simétrica. Podemos lê-la
normalmente ou de trás para a frente e sempre obteremos a
mesma palavra.
Exercícios
Receber um nome e imprimir as 4 primeiras letras do nome
Receber um nome e imprimir as letras na posição impar
Ler nome, sexo e idade. Se sexo for feminino e idade menor que 25,
imprimir o nome da pessoa e a palavra ACEITA. Caso contrario
imprimir NAO ACEITA.
Digite um nome , calcule e mostre quantas letras tem
Receber do teclado um nome e imprimir tantas vezes quantos forem
os seus caracteres
Exercícios
Entrar com um nome e imprimir o nome somente se a primeira letra
do nome for “a” (maiúscula ou minúscula).
Solicitar no teclado uma frase com no máximo 40 letras. Se o
tamanho for maior que 40, dar uma mensagem de entrada inválida
e solicitar novamente, se passar, imprimir a frase na vertical com
um tempo em cada letra.
Escrever um programa que receba um nome que conte o número de
vogais existentes nele. O programa deverá imprimir o numero
total de caracteres do nome, quantas vogais e a respetiva
percentagem das vogais em relação ao total de caracteres.
Exercícios
Digitar um nome e solicitar que seja mostrado em maiúsculo na tela.
Solicitar dois nomes e escrevê-los, mostrar a posição de cada letra.
Solicitar um nome e mostrar o primeiro, o último, o quarto, do
primeiro ao terceiro, do primeiro ao ultimo caracter digitado e as
suas posições. Mostrar quantas letras tem o nome e escrevê-lo de
trás para a frente.
Funções
 São estruturas que permitem ao programador
separar o código do seu programa em blocos.
 Uma função tem a seguinte forma :

tipo_de_retorno Nome_da_funcao (parâmetros)


{
/*corpo da função */
}
Funções que não retornam valor :
#include <stdio.h>
void ehPar (int x){
if (x % 2) {
printf ("O numero nao eh par!\n");
}
else {
printf ("O numero eh par!\n");
}
}
int main(){
char re[80];
ehPar (3);
system("pause");
return (0);
}
Funções que retornam valor
#include <stdio.h>
int ehPar (int x){
int z = 0;
/* o operador % retorna o resultado da divisão por 2 */
if (x % 2) return 1;
}
int main(){
char re[80];
int i = ehPar (3);
if (i!=0){
printf ("O numero eh par!");
}
system("pause");
return (0);
}
Exercícios

Construa um programa que tenha uma função que verifica se


um número inteiro, passado como parâmetro, e exiba na
tela se o número é negativo ou positivo.

Elabore um programa que tenha uma função que retorne o


reverso de um número inteiro. Por exemplo, 932-> 239.

Criar uma função que retorna o seguinte: A função recebe 3


valores float e retornar o quadrado do 1º + a soma dos outros dois.
Vai retornar o tipo inteiro.
Exercício

Construa um programa que possua uma função que dado um número de


conta corrente com cinco dígitos, retorne o seu dígito verificador, o
qual é calculado da seguinte maneira:
Exemplo: número da conta: 25678
Somar número da conta com seu inverso: 25678+87652=113330
Multiplicar cada dígito pela sua ordem posicional e somar este
resultado: 1 1 3 3 3 0
1 1 3 3 3 0
0 1 2 3 4 5
1 1 6 9 12 0 = 29
 Agrupa um conjunto de comandos e associa a
ela um nome.

Funções  O uso deste nome é uma chamada da função


 O regresso ao programa que chamou a função é
chamada de retorno
Funções

 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) {
}
Funções

 Para quê usar funções?


 Evita escrita repetida de código (uma certa sequência de comandos deve ser
repetida em vários lugares de um programa).
 Economiza o tempo gasto com o trabalho de copiar estas seqüências;
 Evitar a necessidade de mudar em múltiplos lugares caso deseje alterar o seu
funcionamento;

 Dividir grandes tarefas em tarefas menores:


 Facilita o gestão de grandes sistemas;
 Aumenta a confiabilidade dos mesmos.
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 que retornam valores
 Funções que não retornam valores
Exemplo: void function (int x)
Funções
Funções – DICAS!!

 void como tipo-do-valor-a-devolver significa que a função não tem valor de


retorno

 Omitindo tipo-do-valor-a-devolver significa que o valor de retorno é int (mas


não se aconselha...)

 Não definir uma função dentro de outra função-


Funções

 lista-parametros: lista com a definição dos parâmetros separados por vírgula


 int maximo(int primeiro, int segundo, int terceiro);

 void como lista-parametros significa ausência de parâmetros

 Erro comum: float x, y equivalente a float x, int y


Funções – Considerações gerais

 Uma função não deve ocupar mais do que uma página...


 O cabeçalho de uma função deve caber numa linha
 Uma função com uma longa lista de parâmetros deve estar associada a muitas
tarefas...
Solução: Dividir a função em funções mais simples
Funções

 Saída de uma função:


 } ou return;
 } sem valor de retorno

 return expressão;
 } com valor de retorno
Funções

 Função simples:
void sai_do_programa()
{
printf(“Digite qualquer tecla para sair do programa.\n”);
system(“pause”);
exit(0);
}
Chamada: sai_do_programa();
Funções
 Função com parâmetro:
void imprime_quadrado(int n)
{
printf(“O quadrado de %d é %d.\n”,n, n*n);
}

Chamada: imprime_quadrado(5);

Saída: O quadrado de 5 é 25
Funções
 Função com parâmetro e retorno:
int quadrado(int n)
{
int q;
q = n * n;
return(q);
}
Chamada: printf(“O quadrado de %d é %d.\n”, 5, quadrado(5) );

Saída: O quadrado de 5 é 25
Funções
 Função com parâmetro e retorno:

int quadrado(int n)
{
int q;
q = n * n;
return(q);
}
Chamada:
int i;
for(i=1;i<5;i++)
printf(“O quadrado de %d eh %d.\n”, 5, quadrado(5) );

Saída: O quadrado de 1 é 1
O quadrado de 2 é 4
O quadrado de 3 é 9
O quadrado de 4 é 16
Funções
 Função com diversos parâmetros e retorno:
int potencia(int n, int p)
{
int i,resultado=1;
for(i=1;i<=p;i++)
resultado = resultado * n;
return(resultado);
}
Chamada: printf(“%d elevado a %d vale %d.\n”,2,4,potencia(2,4));
Saída: 2 elevado a 4 vale 16
Funções
 Função com diversos parâmetros e retorno:
int potencia(int n, int p)
{
int i,resultado=1;
for(i=1;i<=p;i++)
resultado = resultado * n;
return(resultado);
}
Chamada:
int i;
for(i=1;i<5;i++)
printf(“%d elevado a %d vale %d.\n”,2,i,potencia(2,i));

Saída: 2 elevado a 1 vale 1


2 elevado a 2 vale 4
2 elevado a 3 vale 8
2 elevado a 4 vale 16
Revisão de Funções
 Posicionamento das funções no programa C:
– Sempre antes da função main()
– Caso queira colocar as funções após a função main(), é preciso colocar um “protótipo”
da função antes da função main()!!!!
– (Mas o que é um protótipo de função?.....)
– …é a descrição da função!
– Ex: função “sai_do_programa”
void sai_do_programa()
{
printf(“Digite qualquer tecla para sair do programa.\n”);
system(“pause”);
exit(0);
}
– Protótipo da função “sai_do_programa”: void sai_do_programa()
Revisão de Funções
 Posicionamento das funções na linguagem de programação C:
Ex2: função “quadrado”
int quadrado(int n)
{
int q;
q = n * n;
return(q);
}

– Protótipo da função “quadrado”:

int quadrado(int n);


Funções
#include <stdio.h>
int maximo(int, int, int);
int main(void)
{
int a, b, c;
printf("Indicar 3 inteiros: ");
scanf("%d%d%d", &a, &b, &c);
printf("O maximo de %d, %d, e %d e': %d\n", a, b, c, maximo(a, b, c));
return 0;
}
int maximo(int x, int y, int z)
{
int max = x;
if (y > max)
max = y;
if (z > max)
max = z;
return max;
}
Funções – Protótipos da função

 O protótipo pode escrever-se:


 int maximo(int, int, int); ou também
 int maximo(int primeiro, int segundo, int terceiro);
 Não esquecer o ; no final do protótipo...
Funções

 Cada biblioteca standard tem um


ficheiro com os protótipos das funções
e a definição de tipos e constantes
utilizados pelas funções
Funções – Chamadas das funções

 Normalmente, chamadas por valor


São passadas cópias dos valores dos argumentos
Não há efeitos laterais…
Exemplo: quadrado( x );

Chamadas por referência em C


Quando os argumentos são arrays
Exemplo: preencheValores(valLidos, comprimento);
Funções - Exercícios

 Criar uma função que retorna o seguinte: A função


recebe 3 valores float e retornar o quadrado do 1º + a
soma dos outros dois (x*x)+y+z). Vai retornar o tipo
inteiro.
Funções - Exercícios
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
float calcula (float x, float y, float z)
{
return (pow(x,2)+(y+z));
}
main()
{
printf("Resultado: %3.2f\n", calcula(2,3,4));
printf("\n\n");
system("pause");
return(0);
}
Funções - Exercícios

 Criar uma função que receba um caractere como


parâmetro e retorne 1 (um) caso seja uma vogal e zero
caso não seja.
Funções - Exercícios
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int verificavogal (char M) {
if(M=='a' || M=='A' || M=='e' || M=='E’ || M=='i' || M=='I' || M=='o' || M=='O' || M=='u' || M=='U')
return(1);
else return(0); }
main() {
char x;
printf("Digite uma letra: ");
scanf("%c",&x);
if(verificavogal(x)==1)
printf("\nA letra [ %c ] eh uma vogal: ",x);
else printf("\nA letra [ %c ] eh uma constante: ",x);
return(0); }
Funções

 Escrever um programa que põe questões do seguinte tipo, em que os valores


numéricos são determinados aleatoriamente.
 Quantos são 3 vezes 8?
 Se a resposta for correcta responde: Resposta certa...
 se não, responde: Resposta errada...
 O diálogo integra 10 perguntas e, no final, o estudante é aconselhado a
estudar a tabuada se tiver errado 2 ou mais perguntas.

Como gerar números aleatórios?


Funções – Gerar números aleatórios
A funcão srand ...
Funções – Gerar números aleatórios
A funcão srand ...
 Uma forma de fornecer o argumento a srand

#include <stdio.h>
#include <stdlib.h>

#include <time.h>
...
srand(time(NULL))
time (NULL) fornece a data e hora do dia corrente, em segundos.
Funções – Enunciado do Exercício

 Função preencher Vetor, imprimir o Vetor, imprimir o quadrado,


imprimir o primeiro e o ultimo número
Funções – resolução do exercício
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int pergunta_resposta(void);
int main(void)
{
unsigned int i, erradas = 0;
srand(time(NULL));
for (i = 1; i <= 10; i++)
{
if (pergunta_resposta())
printf("Resposta certa...\n");
else
{
printf("Resposta errada...\n");
++erradas; } }
if (erradas >= 2)
printf("\n\nE' preciso estudar a tabuada.\n");
else printf("\n\nParabens. Tabuada bem estudada.\n"); return 0; }
Funções – resolução do exercício
int pergunta_resposta(void)
{
int resposta, n1, n2; n1 = rand() % 10;
n2 = rand() % 10;
printf("Quantos sao %d vezes %d? ", n1, n2);
scanf("%d", &resposta);
return resposta == n1 * n2;
}
Matrizes

 C suporta vetores multidimensionais. A forma mais simples de vetor


multidimensional é o vetor bidimensional, ou matriz(Ai,j).
 tabela de linhas e colunas
 armazenam vetores dentro de vetores

Por exemplo, para declarar um vetor bidimensional de inteiros denominado


“matriz” de tamanho 2x 4, ou seja, 2 linhas por 4 colunas, deve-se escrever o
seguinte código:
Matrizes

 Atenção: Muitas linguagens de programação usam vírgulas para


separar as dimensões do vetor multidimensional;

 C, em contraste, coloca cada dimensão no seu próprio conjunto de


parenteses retos
Matrizes
Matrizes
Matrizes
A leitura de um conjunto bidimensional é feita, como nos vetores unidimensionais, passo a passo,um
componente por vez, usando a mesma sintaxe das instruções primitivas de entrada(scanf) e
saída(printf)informandoo nome da matrizess posições da linhae da coluna como mostram os
exemplos a seguir:
#include"stdio.h"
#include"conio.h"
voidmain() {
constn = 3;
intmatriz[n][n], i, j;
Matrizes

system(“cls”);
Matrizes
 Como uma matriz possui dois índices, precisamos de duas estruturas de repetição para percorrer
todos os seus elementos.
Matrizes- Exercício Resolvido
 Leia uma matriz de 3x3 elementos inteiros e calcule a soma dos seus elementos
Matrizes- Exercício Resolvido
 Dado duas matrizes reais de dimensão 2x3, fazer um programa para calcular a soma delas
Matrizes- Produto de Matrizes
Matrizes

C permite a inicialização de vetores no momento da declaração, como é demonstrado nos


exemplos a seguir:
 Int vetor[10] = {17, 33, 21, 67, 81, 10, 45, 29, 79, 98};
isso significa que vetor[0] terá o valor 17 e vetor[9]terá o valor 98

 Int matriz[3][3] = {8, 3, 6, 7, 1, 4, 2, 5, 9};

Nos vetores bidimensionais os valores são inicializados por linha, no exemplo,


Matrizes- Exercícios

 Crie um algoritmo em C que peça ao utilizador para preencher uma matriz


3x3 com valores inteiros e depois exiba essa matriz.
 Leia os elementos de uma matriz 3x4 de números float. 
Matrizes-Exercícios
#include <stdio.h>
#int main(){
int matriz[DIM][DIM];
int linha, coluna;
escrever a Matriz
for(linha = 0 ; linha < DIM ; linha++)
for(coluna = 0 ; coluna < DIM ; coluna++) {
printf("Elemento [%d][%d]: ", linha+1, coluna+1);
scanf("%d", &matriz[linha][coluna]);}
// imprimir a matriz na tela
for(linha = 0 ; linha < DIM ; linha++) {
for(coluna = 0 ; coluna < DIM ; coluna++)
printf("%3d", matriz[linha][coluna]);
printf("\n"); //após cada linha ser impressa, um salto de linha
}
}
Matrizes-Exercícios
main()
{
float m[3][4];
int i, j;
for (i=0; i<3; i++)
for (j=0; j<4; j++)
scanf("%f", &m[i][j]);
for (i=0; i<3; i++)
{
for (j=0; j<4; j++)
printf("%10.2f", m[i][j]);
printf("\n");
}
}
Matrizes- Exercícios

 Leia uma matriz 3×2 e outra 2×3 de números inteiros. imprima o produto destas duas
matrizes.
 Escreva um algoritmo que leia um numero inteiro A e uma matriz V[2][2] de números. conte
quantos valores iguais a A estão na matriz. Crie, a seguir, uma matriz X contendo todos os
elementos de V diferentes de A. mostre os resultados.
 Escreva um algoritmo que lê uma matriz M[4][4] e calcula as somas: da linha 4 de M; da
coluna 2 de M; da diagonal principal; de todos os elementos da matriz M; Escrever as
somas e a matriz.
Matrizes-Exercícios
#include <stdio.h>
#include <stdlib.h>
int main(){
int matA[3][2], matB[2][3], matR[3][3]; //variaveis
int i = 0, j = 0;
for (i=0; i<3; i++) {
for (j=0; j<2; j++) {
printf(“Informe o valor para matriz A[%d][%d]: “, i, j); //solicitacao valor utilizador
scanf(“%d”, &matA[i][j]); //gravar dados}}
printf(“\n”);
for (i=0; i<2; i++) {
for (j=0; j<3; j++) {
printf(“Informe o valor para matriz B[%d][%d]: “, i, j); //solicitacao valor utilizador
scanf(“%d”, &matB[i][j]); } } //gravar dados
for (i=0; i<3; i++) { //percorrer
for (j=0; j<2; j++) { //percorrer
matR[i][j] = matA[i][j] * matB[j][i]; //formula
printf(“%d\t”, matR[i][j]); } }//resultado
return 0;}
Matrizes- Exercícios
 #include <stdio.h> //incluíndo bibliotecas
#include <stdlib.h>
 int main() { //inicializando main
 #define V mat; //declarando variável constante
 int a, i, j; //variáveis
int cont=0;
int mat[5][5];
 printf(“Informe valor de A: “); //solicitando dado ao usuário
scanf(“%d”, &a); //lendo dado
 for (i=0; i<5; i++) { //laço repetição i
for (j=0; j<5; j++) { //laço repetição j
printf(“informe valor de mat[%d][%d]: “, i, j); //solicitando dados ao utilizador
scanf(“%d”, &mat[i][j]); //lendo dados
}
}
for (i=0; i<5; i++) { //percorrendo dados “i” e “j”
for (j=0; j<5; j++) {
if (mat[i][j] == a) { //condição
cont++; //contador
}
}
}
printf(“São iguais a ‘A’: %d”, cont); //apresentando resultado(s)
 return 0;
}
Apontadores em C
Definições

Variáveis : endereçam uma posição de memória que


contém um determinado valor dependendo do seu tipo
(char, int, float, double, ...)

void main() {
long a=5;
char ch=‘x’;
}
Definições

Apontadores: são variáveis cujo conteúdo é um endereço de


memória.
Assim, um apontador endereça uma posição de memória que
contém valores que são na verdade endereços para outras
posições de memória.

void main() {
long a=5;
char ch=‘c’;
long *aPrt = &a;
}
Declaração de Apontadores

Para declararmos um apontador, basta utilizar o


operador *(asterisco) antes do nome da variável.
Exemplo:
int *p;

Apontadores devem ter o seu tipo declarado e


somente podem apontar para variáveis do mesmo
tipo.
Operadores para Apontadores

Para trabalharmos com apontadores, C disponibiliza os seguintes


operadores:
& - Fornece o endereço de memória onde está armazenado
uma variável. Lê-se “o endereço de”.

* - Valor armazenado na variável referenciada por um


ponteiro. Lê-se “o valor apontado por”.
Operadores para Apontadores

void main() {
long a=5;
char ch=‘x’;
long *aPrt = &a;
printf("%d\n",*aPrt);
printf("%p\n",aPrt);
printf("%p\n",&aPrt);
}

O que será impresso na consola?


5
0x0100
0x0105
Alguns exemplos... (1)

#include <stdio.h>
main ()
{
int num,valor;
int *p;
num=55;
p=&num; /* Usa o endereco de num */
valor=*p; /* Valor é igualado a num de uma maneira indireta */
printf ("%d\n",valor);
printf ("Endereco para onde o ponteiro aponta: %p\n",p);
printf ("Valor da variavel apontada: %d\n",*p);
}
Alguns exemplos... (2)

#include <stdio.h>
main ()
{
int num,*p;
num=55;
p=&num; /* Usa o endereco de num */
printf ("Valor inicial: %d\n",num);
*p=100; /* Muda o valor de num de uma maneira indireta */
printf ("\nValor final: %d\n",num);
}
Alguns exemplos... (3)

#include <iostream.h>
main ()
{
int num,*p1, *p2;
num=55;
p1=&num; /* Usa o endereco de num */
p2=p1; /*p2 passa a apontar para o mesmo endereço apontado por p1 */
printf("Conteudo de p1: %p\n", p1);
printf("Valor apontado por p1: %d\n", *p1);
printf("Conteudo de p2: %p\n", p2);
printf("Valor apontado por p2: %d\n", *p2);
}
Operadores para Apontadores

Incremento/Decremento:
Apontar para o próximo valor do
mesmo tipo para o qual o
ponteiro aponta:
long *aPtr, a=5;
aPtr=&a;
aPtr++;
Exercícios com Apontadores

Suponha que a, b e c são variáveis inteiras e veja uma maneira de fazer c = a+b usando apontadores

Escreva os valores das variáveis para cada instrução do programa abaixo. Qual a saída do programa?

int main()
{
int a,b,*p1, *p2;
a = 4;
b = 3;
p1 = &a;
p2 = p1;
*p2 = *p1 + 3;
b = b * (*p1);
(*p2)++;
p1 = &b;
printf("%d %d\n", *p1, *p2);
printf("%d %d\n", a, b);
}
Operadores para Ponteiros
Alguns exemplos... (4)

main ()
{
long num;
long *p;
num=55;
p=&num;
printf("Conteudo de p: %p\n",p);
printf("Valor apontado por p: %d\n",*p);
printf("Conteúdo de p incrementado: %p\n",++p);
printf("Valor apontado por p incrementado: %d\n",*p);
}
Alguns exemplos... (5)

main ()
{
long num;
long *p;
num=55;
p=&num;
printf("Conteudo de p: %p\n",p);
printf("Valor apontado por p: %d\n", *p);
printf("Conteúdo de p incrementado: %p\n", ++p);
printf(" Conteúdo de p: %p\n", p);
}
Apontadores e Vetores

Em C, o nome do vetor é um apontador para a primeira


posição do vetor

Int a[10];
Int *p;
p=a; /* válido. Equivalente a: p= &a[0] */
a=p; /* inválido*/
a++; /* inválido*/
Apontadores e Vetores

a[i] equivalente a *(a+1)


&a[i] equivalente a a+i
a[i] equivalente a p[i]
p[i] equivalente a *(p+1)
Alguns exemplos... (7)

main ()
{
int vet[4], i;
int *p;
p=vet;
for (int i=0; i<4; i++)
{
*p=0;
p++;
}

for (int i=0; i<4; i++)


printf(“%d “, vet[i]);
}
Alguns exemplos... (8)

main ()
{
float matrx [4][4];
float *p;
int count;
p=matrx[0];
for (count=0;count<16;count++)
{
*p=0.0;
p++;
}
}
Vetores como ponteiros

Importante: um ponteiro é uma variável, mas o nome de um


vetor não é uma variável
Isto significa, que não se consegue alterar o endereço que é
apontado pelo "nome do vetor“
Diz-se que um vetor é um apontador constante!
Condições inválidas:
int vet[10], *p;
vet++; //não se pode incrementar o nome do vetor
vet = p; //não se pode atribuir um novo valor ao nome de um vetor
Porque inicializar apontadores?

Observe o código:
main () /* Errado - Nao Execute */
{
int x,*p;
x=13;
*p=x; //posição de memória de p é indefinida!
}
A não inicialização de ponteiros pode fazer com que ele esteja alocando
um espaço de memória utilizado, por exemplo, pelo S.O.
Vetores de apontadores

 Um vetor de apontadores é uma estrutura que contém uma sequência de


endereços de memória

 Char *nome[5]; /* vetor de 5 apontadores para caractere */


Apontadores para apontadores

 Um apontador para apontador permite aceder indirectamente ao endereço de


uma variável do tipo apontador. A declaração de um apontador para
apontador usa uma sequência de dois asteriscos.

 int **p ; /* p é um apontador para apontador para inteiro*/


 int j;
 j= **p /* Atribui a ‘j’ um inteiro*/
Alocação dinâmica de memória

Durante a execução de um programa é possível


alocar uma certa quantidade de memória para
conter dados do programa
A função malloc (n) aloca dinamicamente n bytes e
devolve um apontador para o início da memória
alocada
A função free(p) liberta a região de memória
apontada por p. O tamanho liberado está implícito,
isto é, é igual ao que foi alocado anteriormente por
malloc.
Alocação dinâmica de memória

Os comandos abaixo alocam dinamicamente um inteiro e


depois o libertam:
#include <stdlib.h>
int *pi;
pi = (int *) malloc (sizeof(int));
...
free(pi);
A função malloc não tem um tipo específico. Assim, (int
*) converte o seu valor num apontador para inteiro.
Como não sabemos necessariamente o comprimento de
um inteiro (2 ou 4 bytes dependendo do compilador),
usamos como parâmetro a função sizeof(int).
Alocação dinâmica de vetores

#include <stdlib.h>
main() {
int *v, i, n, *p;
scanf(“%d”, &n); // le n
//aloca n elementos para v
v = (int *) malloc(n*sizeof(int));
// inicializa o vetor v com n elementos
for (i = 0; i < n; i++)
v[i] = 0;
p = v;
for (i = 0; i < n; i++) {
printf("%d ",*p);
++p;}
// liberta os n elementos de v
free(v);
}
Exercício
1. Rescreva o código abaixo utilizando notação de
apontadores dentro do ciclo for.
int x[5], i;
for (i= 0; i < 5; i++)
x[i]= i*10;

2. Escreva um programa que leia 5 inteiros e os


armazene num vetor. A partir disso, utilizando
apontadores para navegar no vetor, mostre na consola
o maior valor lido.
Exercício: Responda V ou F

 Seja a[] um vetor qualquer, independente de tipo e tamanho,


e pa um ponteiro para o mesmo tipo de a[].
 ( ) Qualquer expressão de vetor e índice é equivalente a uma
outra expressão escrita com um apontador e um deslocamento;
 ( ) Após a atribuição pa=&a[0]; pa e a possuem valores
idênticos;
 ( ) A atribuição pa=&a[0]; pode ser escrita como pa=a;
 ( ) Uma referencia a a[i] pode ser escrita como *(a+i)
Exercício: Responda V ou F (cont.)

 Seja a[] um vetor qualquer, independente de tipo e


tamanho, e pa um ponteiro para o mesmo tipo de a[].
 ( ) &a[i] e a+i são idênticos ( ) a+i e' o endereço do i-ésimo
elemento após a
 ( ) pa[i] e' idêntico a *(pa+i) ( ) pa=a e' uma operação valida
 ( ) pa++ e' uma operação valida
 ( ) a=pa e' uma operação valida
 ( ) a++ e' uma operação valida
Classificação dos Tipos de Dados
 Tipos de Dados Simples
 Tipos de Dados Inteiros: int, long e unsigned int
 Tipos de Dados Reais: float e double
 Tipos de Dados Caracteres: char
 Tipos de Dados Estruturados
 Cadeia de caracteres(string),
 Vetores (array)
 Registos (struct)e arquivos em disco.
 Apontadores (alocação dinâmica de memória)
 Classes e Objetos (Orientação a Objetos)
Apontadores em C
Apontadores-Definições

Variáveis : endereçam uma posição de memória que


contém um determinado valor dependendo do seu tipo
(char, int, float, double, ...)

void main() {
a=5;
char ch=‘x’;
}
Apontadores-Definições

Apontadores: são variáveis cujo conteúdo é um endereço de memória.

Assim, um apontador endereça uma posição de memória que contém valores


que são na verdade endereços para outras posições de memória.
Declaração de Apontadores

Para declararmos um apontador, basta utilizar o operador


*(asterisco) antes do nome da variável.
Exemplo:
int *p;

Apontadores devem ter o seu tipo declarado e somente


podem apontar para variáveis do mesmo tipo.
Operadores para Ponteiros

Para trabalharmos com ponteiros, C disponibiliza os seguintes operadores:


& - Fornece o endereço de memória onde está armazenado uma variável.
Lê-se “o endereço de”.

* - Valor armazenado na variável referenciada por um ponteiro. Lê-se “o


valor apontado por”.
Operadores para Ponteiros

void main() {
long a=5;
char ch=‘x’;
long *aPrt = &a;
printf("%d\n",*aPrt);
printf("%p\n",aPrt);
printf("%p\n",&aPrt);
}

 O que será impresso na tela?


 5
 0x0100
 0x0105
Alguns exemplos... (1)

#include <stdio.h>
main ()
{
int num,valor;
int *p;
num=55;
p=&num; /* Pega o endereco de num */
valor=*p; /* Valor é igualado a num de uma maneira indireta */
printf ("%d\n",valor);
printf ("Endereco para onde o ponteiro aponta: %p\n",p);
printf ("Valor da variavel apontada: %d\n",*p);
}
Alguns exemplos... (2)

#include <stdio.h>
main ()
{
int num,*p;
num=55;
p=&num; /* Pega o endereco de num */
printf ("Valor inicial: %d\n",num);
*p=100; /* Muda o valor de num de uma maneira indireta */
printf ("\nValor final: %d\n",num);
}
Alguns exemplos... (3)

#include <iostream.h>
main ()
{
int num,*p1, *p2;
num=55;
p1=&num; /* Pega o endereco de num */
p2=p1; /*p2 passa a apontar para o mesmo endereço apontado por p1 */
printf("Conteudo de p1: %p\n", p1);
printf("Valor apontado por p1: %d\n", *p1);
printf("Conteudo de p2: %p\n", p2);
printf("Valor apontado por p2: %d\n", *p2);
}
Operadores para Ponteiros

 Incremento/Decreme
nto:
Apontar para o
próximo valor do
mesmo tipo para o
qual o ponteiro
aponta:
long *aPtr, a=5;
aPtr=&a;
aPtr++;
Operadores para Ponteiros

 Qual será o valor


endereçado por aPtr++ ??
 Se aPtr é long,
como o long ocupa
4 bytes, aPtr irá
apontar para o
endereço
0x00000104
 Este é o principal
motivo que nos
obriga a definir
um tipo para um
ponteiro!!!
Operadores para Ponteiros
Alguns exemplos... (4)

#include <iostream.h>
main ()
{
long num;
long *p;
num=55;
p=&num;
printf("Conteudo de p: %p\n",p);
printf("Valor apontado por p: %d\n",*p);
printf("Conteúdo de p incrementado: %p\n",++p);
printf("Valor apontado por p incrementado: %d\n",*p);
}
Alguns exemplos... (5)

#include <iostream.h>
main ()
{
long num;
long *p;
num=55;
p=&num;
printf("Conteudo de p: %p\n",p);
printf("Valor apontado por p: %d\n", *p);
printf("Conteúdo de p incrementado: %p\n", ++p);
printf(" Conteúdo de p: %p\n", p);
}
Vetores como ponteiros

 O C compreende vetores como ponteiros


 Quando declaramos um vetor, o C aloca memória
para todas as posições necessárias conforme seu
tipo:
 int vet[10];
 O nome do vetor pode ser atribuído a um
ponteiro. Neste caso o ponteiro irá endereçar a
posição 0 do vetor:
 int *p; p=vet; ou
 int *p; p=&vet[0];
Alguns exemplos... (7)

main ()
{
int vet[4], i;
int *p;
p=vet;
for (int i=0; i<4; i++)
{
*p=0;
p++;
}

for (int i=0; i<4; i++)


printf(“%d “, vet[i]);
}
Alguns exemplos... (8)

main ()
{
float matrx [4][4];
float *p;
int count;
p=matrx[0];
for (count=0;count<16;count++)
{
*p=0.0;
p++;
}
}
Alguns exemplos... (9) - Strings

StrCpy (char *destino, char *origem)


{
while (*origem)
{
*destino=*origem;
origem++;
destino++;
}
*destino='\0';
}
main ()
{
char str1[100],str2[100],str3[100];
printf ("Entre com uma string: ");
gets (str1);
StrCpy (str2,str1);
StrCpy (str3,"Voce digitou a string ");
printf ("\n\n%s\n%s\n",str3,str2);
}
Vetores como ponteiros

 Importante: um ponteiro é uma variável, mas o


nome de um vetor não é uma variável
 Isto significa, que não se consegue alterar o
endereço que é apontado pelo "nome do vetor“
 Diz-se que um vetor é um ponteiro constante!
 Condições inválidas:
int vet[10], *p;
vet++; //não se pode incrementar o nome do vetor
vet = p; //não se pode atribuir um novo valor ao nome
//de um vetor
Exercícios com apontadores

Fazer um programa que receba do utilizador a quantidade N de


números a serem introduzidos. Em seguida, o programa deve alocar
dinamicamente um vetor de N inteiros, receber N números do
utilizador, armazenar no vetor e mostrar o maior valor, o menor valor
e a média dos N números.
Fazer um programa para alocar dinamicamente uma matriz de NxM
valores reais. Em seguida, leia os elementos dessa matriz, armazene-
os na matriz e calcule a média desses valores.
Alocação dinâmica de memória

Durante a execução de um programa é possível


alocar uma certa quantidade de memória para
conter dados do programa
A função malloc (n) aloca dinamicamente n bytes e
devolve um apontador para o início da memória
alocada.
A função free(p) liberta o espaço de memória
apontada por p. O tamanho libertado está implícito,
isto é, é igual ao que foi alocado anteriormente por
malloc.
Alocação dinâmica de memória

Os comandos abaixo alocam dinamicamente um inteiro e


depois o liberam:
#include <stdlib.h>
int *pi;
pi = (int *) malloc (sizeof(int));
...
free(pi);
A função malloc não tem um tipo específico. Assim, (int
*) converte o seu valor em apontador para inteiro.
Como não sabemos necessariamente o comprimento de
um inteiro (2 ou 4 bytes dependendo do compilador),
usamos como parâmetro a função sizeof(int).
Alocação dinâmica de vetores

#include <stdlib.h>
main() {
int *v, i, n, *p;
scanf(“%d”, &n); // le n
//aloca n elementos para v
v = (int *) malloc(n*sizeof(int));
// zera o vetor v com n elementos
for (i = 0; i < n; i++)
v[i] = 0;
p = v;
for (i = 0; i < n; i++) {
printf("%d ",*p);
++p;}
// libera os n elementos de v
free(v);
}
Exercício
1. Rescreva o código abaixo utilizando notação de
apontadores dentro do ciclo for.
int x[5], i;
for (i= 0; i < 5; i++)
x[i]= i*10;

2. Escreva um programa que leia 5 inteiros e os


armazene num vetor. A partir disso, utilizando
notação de apontadores para navegar no vetor,
mostre na consola o maior valor lido.
Exercício: Responda V ou F

 Seja a[] um vetor qualquer, independente de tipo e tamanho,


e pa um ponteiro para o mesmo tipo de a[].
 ( ) Qualquer expressão de vetor e índice é equivalente a uma
outra expressão escrita com um apontador e um deslocamento;
 ( ) Após a atribuição pa=&a[0]; pa e a possuem valores
idênticos;
 ( ) A atribuição pa=&a[0]; pode ser escrita como pa=a;
 ( ) Uma referencia a a[i] pode ser escrita como *(a+i)
Exercício: Responda V ou F (cont.)

 Seja a[] um vetor qualquer, independente de tipo e


tamanho, e pa um ponteiro para o mesmo tipo de a[].
 ( ) &a[i] e a+i são idênticos ( ) a+i e' o endereço do i-ésimo
elemento após a
 ( ) pa[i] e' idêntico a *(pa+i) ( ) pa=a e' uma operação valida
 ( ) pa++ e' uma operação valida
 ( ) a=pa e' uma operação valida
 ( ) a++ e' uma operação valida
Exercício

 Escreva um programa em linguagem C que solicita ao usuário um vetor de


notas (números reais) e imprime a média aritmética das notas.
 Importante: Não deve ocorrer desperdício de memória; e após ser utilizada a
memória deve ser devolvida.

Вам также может понравиться