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

Ps-Graduao em Cincias da Computao

Anlise de Algoritmos e Estrutura de Dados

UFABC
Universidade Federal do ABC

Aula 01

Prof. Andr G. R. Balan


andre.balan@ufabc.edu.br
Introduo linguagem C/C++
C uma linguagem de programao
estruturada desenvolvida nos laboratrios
BELL entre 1969 e 1972, por Dennis Ritch

C a linguagem preferida no meio cientfico e


acadmico:
Nmero relativamente pequeno de palavras reservadas
Liberdade para trabalhar com a memria (ponteiros)
Base de outras linguagens importantes :
Java , C++, C#
2
Introduo linguagem C/C++
No incio da dcada de 1980, o ANSI (American
National Standards Institute) iniciou o processo de
padronizao da linguagem C: Deu-se origem
ao ANSI C

Objetivo principal do ANSI C:


Promover a portabilidade entre compiladores e SOs

3
Introduo linguagem C/C++
Enquanto isso, entre 1979 e 1983, o
dinamarqus Bjarne Stroustrup (AT&T),
desenvolvia a linguagem C++, a partir da
linguagem C.

Objetivo: agregar o conceito de


programao orientao objetos

Padronizada pela ISO (International


Organization for Standardization) em
1997.
4
Linguagem C
Todo programa C inicia sua execuo chamando a
funo main(), sendo obrigatria a sua presena no
programa principal

Para incluir bibliotecas de funes, utilizado uma


instruo especial:

#include <stdio.h>

5
Hello World em C
arquivo HelloWorld.c

#include <stdio.h> // Funes de entrada e sada

void sayhello(); // Cabealho de uma funo

int main(void) {
sayhello();
return(0);
}

void sayhello() { // Implementao da funo


printf(Hello World!\n);
}

6
Compilao
Cdigo Objeto Pr-compilado
Cdigo fonte das bibliotecas includas
#include <stdio.h>

0101001010
0101001001
int main(void) {
printf(Hello World!\n);
return(0); 0101010011
}

Cdigo Objeto
Pr-Processador
0101001010 Linker
0101001001
0101010011

Compilador Cdigo Executvel

0101001010
0101001001
0101010011 7
Arquivos .h e .c

Arquivos com extenso .h armazenam o


cabealho (header) das funes

Arquivos com extenso .c armazenam a


implementao das funes

Porque?

8
Arquivos .h e .c

Porque?
Separar
O qu a biblioteca faz
Como a biblioteca faz

O qu a biblioteca faz constitui a interface (API) para o


programador arquivo .h

Como a biblioteca faz constitui a implementao (o


programador que usa a biblioteca no precisar saber
da implementao dela)
9
Compiladores mais conhecidos
gcc
Compilador padro do sistema Linux.
Software Livre
No inclui IDE (Integrated Developement Environment)

Cygwin/MingW
Pacotes para Windows que traz todo o conjunto do
gcc
Software livre

10
Compiladores mais conhecidos
Borland Turbo C
IDE Simples, parecido com o Turbo PASCAL
A Borland passou a distribuir gratuitamente

Borland Builder
IDE voltada para a criao de objetos janelados
VCL Visual Component Library

Visual C++
Compilador da Microsoft...

11
IDEs
CodeBlocks (Mingw)

Dev C++ (MingW)

QT-Creator (MingW)

NetBeans (pode utilizar tanto o cygwin como


o MingW)

12
Tipos de dados nativos/primitivos
definidos pelo ANSI C
Tipo Tamanho em Bytes Faixa Mnima
char 1 -127 a 127
unsigned char 1 0 a 255
signed char 1 -127 a 127
int 4 -2.147.483.648 a 2.147.483.647
unsigned int 4 0 a 4.294.967.295
signed int 4 -2.147.483.648 a 2.147.483.647
short int 2 -32.768 a 32.767
unsigned short int 2 0 a 65.535
signed short int 2 -32.768 a 32.767
long int 4 -2.147.483.648 a 2.147.483.647
signed long int 4 -2.147.483.648 a 2.147.483.647
unsigned long int 4 0 a 4.294.967.295
float 4 7 digitos de preciso
double 8 15 digitos de preciso
long double 10 19 digitos de preciso

13
Declarao de variveis
Exemplos:
int n1;
int n2 = 10;
int n3, n4, n5;

No h uma regio exclusiva do programa


para declaraes, mas as variveis devem ser
declaradas antes de ser usadas.

14
Declarao de variveis
Escopo de variveis. Exemplo:
int a1;

void f1() {
a1 = 10; // OK!
while(int x ==10) {
int a4 = 20;
}
a4 = 3; // Fora do escopo!
x = 10; // Fora do escopo!
}

void f2() {
int a3;
a1 = 10; // OK!

}
15
Sada de dados
Comando printf (stdio.h)
Exemplos

int n1, n2;


n1 = 2; n2 = 5;
printf(Os nmeros digitados foram %d e %d, n1, n2);

String de formatao

16
Sada de dados
Comando printf (stdio.h)

Especificadores %d inteiro
%o inteiro em formato octal
%x
inteiro em formato hexadecimal
%X
%u unsigned int
%ld long int
%f float
%c char
%e
float em formato exponencial
%E
%s string
%p endereo de um ponteiro

17
Entrada de dados
Comando scanf (stdio.h)
Exemplo

float raio;
printf("Digite o raio: ");
scanf("%f", &raio);
printf(O raio digitado : %f, raio );

Para a funo scanf necessrio passar o endereo da


varivel que receber o valor lido, por exemplo &raio

Isto caracteriza uma passagem por referncia em C

18
Exemplo 2
#include <stdio.h>

int main(void) {
double pi = 3.141592;
double raio, area, perimetro;

// Pede ao usurio para inserir o raio


printf("Digite o raio: ");
scanf("%lf", &raio);

// Clculos
area = pi * (raio * raio);

// Imprimir resultados
printf("\n");
printf("Raio: %lf \n", raio);
printf("rea: %lf \n", area);
return 0;
}
19
Exemplo 3 - Funces
#include <stdio.h>

double quadrado(double x); // declarao/cabealho da funo

int main(void){
double a, q;
scanf(%lf, &a);
q = quadrado(a);
printf(\n %f, a);
return(0);
}

// Implementao da funo
double quadrado (double x) {
return(x*x); // A funo retorna um valor double
}

20
Exerccios
Treinar estes pequenos exemplos utilizando o
CodeBlocks para o Windows

Compilar os mesmos exemplos em Linux, utilizado


o gcc.

Exemplo: gcc -o myprog teste.cpp

Ser gerado o executvel myprog

Para executar: ./myprog

21
Operadores aritmticos

Exemplos: 10 % 3 = 1;
a++; mesmo que a = a + 1
() Parnteses
- menos unrio; Um erro muito comum em C:
++ incremento;
float a;
-- decremento.
a = 4/5; // a ir receber zero!!
* multiplicao;
/ diviso;
// Pelo menos um operando deve ser float
mdulo - resto da diviso
% a = 4 / 5.0; // ou
inteira;
+ soma; a = 4.0 / 5; // ou

- subtrao; a = (float)4 / 5; // Isto um CAST

22
Operadores aritmticos

Notao reduzida. Exemplos:


() Parnteses
a += b; // mesmo que a = a+b;
- menos unrio;
a -=b;
++ incremento;
-- decremento. a *=b;
* multiplicao;
Ordem dos operadores de incremento.
/ diviso;
Exemplo
mdulo - resto da diviso
%
inteira;
a = 10;
x = a++ // x recebe 10
+ soma;
- subtrao; a = 10;
x = ++a // x recebe 11
23
Operadores relacionais e lgicos

Relacionais > maior que


<= menor ou igual
< menor que
<= menor ou igual
== igual a
!= diferente de

Lgicos || OR
&& AND
! NOT

24
Operadores lgicos bitwise
Realizam a operao bit a bit
& AND
| OR
^ XOR
~ NOT
>> desloca direita
<< desloca esquerda

Exemplo:

4 em binrio = 00000100
2 em binrio = 00000010
4 | 2 = 6
4 & 2 = 0
4 << 1 = 8 25
Comandos de controle
O comando de controle mais comum o if:
if (valor booleano) comando;
else comando;

Exemplo
if ((x>10) && (y>20)) comando2 ;
else comando2;

Atribuies condicionais:
x = 10;
y = x>9 ? 100 : 200;

26
Comandos de controle - switch
char ch();
printf(1. Inserir Registro);
printf(2. Remover Registro);
printf(3. Busca);

ph = getchar();

switch(ch) {
case 1:
insere_registro();
break;
case 2:
remove_registro();
break;
case 3:
busca_registro();
break;
default:
printf(opo invlida)
break;
} 27
Comandos de controle
Lao for Exemplos

for (int x=1; x<=100; x++) printf(%d, x);

for (int x=0; x!=100; x+=2) printf(%d, x);

for (int x=0, y = 1; x<=10; ++x, y*=x)


printf(O Fatorial de %d %d\n, x, y);

28
Comandos de controle
Lao while Exemplo

while (ch != A) ch = getchar();

29
Comandos de controle
Lao do...while
Diferentemente do lao while, o do...while testa a
condio somente no final, garantindo que os
comandos sejam executados pelo menos uma vez

Exemplo

do {
scanf(%d, &num);
} while (num > 100);

30
Vetores e
matrizes

31
Vetores, matrizes e strings

Exemplo de um vetor de inteiros


int vet[10];

Lembre-se: o primeiro item do vetor


sempre de ndice zero!

int i
for (i=0; i<10; i++) vet[i] = i*2;

32
Vetores, matrizes e strings
Lembre-se sempre de verificar corretamente
os limites do vetor!

int vet[10];
int i;
for (i=0; i<20; i++) vet[i] = i*2;

Isso ir gerar um erro de execuo


Qual a diferena de erro de execuo e erro de compilao?

33
Vetores, matrizes e strings
Passando vetores como parmetro para funes?
Exemplo

void fteste(int x[]){


.
.
.
}

O que acontece quando um vetor passado por


parmetro?

34
Vetores, matrizes e strings
O que acontece quando um vetor passado por
parmetro?

No aloca-se memria novamente para um vetor


passado por parmetro para uma funo.

A funo ir acessar a mesma memria criada


para o vetor que foi passado como parmetro

Passa-se apenas uma referncia para o vetor

35
Vetores, matrizes e strings
Uma matriz bidimensional

int mat[10][20];

int i, j;

for(i=0; i<10; i++)


for (j=0; j<20; j++) {
scanf (%d, &mat[i][j]);
printf(%d, mat[i][j]);
}

36
Vetores, matrizes e strings
Strings, em C, so sempre vetores do tipo char:

// Iniciar a string assim pode


char str1[15] = Hello World;

str1 = Teste; // Assim NO pode!!

strcpy(str1, Teste);

37
Vetores, matrizes e strings
Funces para trabalhar com string em C?
#include <string.h>

strcpy(s1, s2); // copia s1 em s2

strcat(s1, s2); concatena s2 no final de s2

strlen(s1); retorna o tamanho de s1

strcmp(s1, s2); retorna 0 se s1 e s2 so iguais,


negativo se s1<s2, e positivo se s1>s2

s1 = gets(); l um string digitada pelo usurio

38
Vetores, matrizes e strings

String em C++ muito mais fcil e intuitivo!!

39
Vetores, matrizes e strings
Exerccio
Escreva uma funo que receba como parmetro 3
matrizes 4x4, A, B e C , que resulte em C = A*B

Cabealho
void multiply44(double A[4][4], double B[4][4], double
C[4][4])

Escreva um programa que leia as duas matrizes A e B e


imprima o produto A*B, utilizando a funo de
multiplicao

40
Ponteiros
Um ponteiro uma varivel que contm um
endereo de memria

Esse endereo normalmente a posio de


uma outra varivel na memria

Se uma varivel tem o endereo de outra,


ento diz-se que a primeira aponta para a
segunda

41
Ponteiros

42
Ponteiros

uma varivel que armazena um endereo de memria!

Por que ponteiros so


importantes?

Alocao dinmica de
memria

43
Ponteiros

Declarao de um ponteiro:
char *p;

p Operador de endereo: &


char x;
p = &x; // P recebe o endereo da varivel x

x
Operador de referncia: *
// o que est no endereo p recebe 10
*p = 10;

// y recebe o que est no endereo p


char y = *p;
44
Ponteiros
O endereo armazenado em um ponteiro pode ser
aumentado ou diminudo por operaes
aritmticas: aritmtica de ponteiros
Exemplo:
int *p = 0;
printf("%p\n", p);

p+=1; // incremento do ponteiro


printf("%p\n", p);

Qual o endereo armazenado em p agora?


45
Ponteiros
Resposta: 4

Incrementar um ponteiro de uma unidade,


significa faz-lo apontar para a prxima
poro de memria referente ao seu tipo!

Neste caso, para o prximo inteiro. Ou


seja, esta ir apontar 4 bytes frente.

46
Ponteiros
A aritmtica de ponteiros permite percorrer
vetores/matrizes de maneira bem eficiente
e elegante.

Exemplo:
int vet[n], i, *p;

p = vet; // Faz p apontar para o incio do vetor

for(i=0; i<n;i++)
*p++ = i;
47
Alocao de memria

Esttica vs. Dinmica

48
Alocao de memria esttica vs.
dinmica
Um programa, ao ser executado, vira um Processo

Um processo ocupa uma parte da memria do


computador . Essa parte dividida em 2 reas:

Instrues armazena o cdigo C compilado e montado em


linguagem de mquina

Pilha nela so armazenadas as variveis ao longo da


execuo do programa

49
Alocao de memria esttica vs.
dinmica

Instrues

Pilha

Processo
na memria
50
Alocao de memria esttica vs.
dinmica
Todo o restante de memria interna
do computado que no est sendo
Instrues ocupada por programas chamada
de HEAP

Pilha
HEAP

Se o processo quiser utilizar


esta memria, ele deve pedir ao
Processo SO!
na memria
51
Alocao de memria esttica vs.
dinmica
Alocao esttica: Quando o programa utiliza a sua
prpria rea de memria, a Pilha

Alocao dinmica: Quando o programa solicita ao


SO um pedao da HEAP

Qual a vantagem de uma e de outra?

52
Alocao de memria esttica vs.
Dinmica
A pilha tem um tamanho bem reduzido (ordem de kilobytes)

Porm, mais rpido alocar na pilha (no precisa pedir para


o SO)

A alocao dinmica de memria permite reservar grandes


espaos de memria e acess-los por meio de apontadores

Porm, mais custosa a alocao dinmica

Quando a quantidade de memria pequena, buscar sempre


utilizar a pilha

53
(Pilha)
Instrues
Porque se chama pilha?

char a;

void main() {
a = 4;

int b = 6;

int c = soma(a, b);

54
(Pilha)
Instrues
Porque se chama pilha?
a
char a;

void main() {
a = 4;

int b = 6;

int c = soma(a, b);

55
(Pilha)
Instrues
Porque se chama pilha?
a 4
char a;

void main() {
a = 4;

int b = 6;

int c = soma(a, b);

56
(Pilha)
Instrues
Porque se chama pilha?
a 4
char a; b 6

void main() {
a = 4;

int b = 6;

int c = soma(a, b);

57
(Pilha)
Instrues
Porque se chama pilha?
a 4
char a; b 6

void main() { c
a = 4;

int b = 6;

int c = soma(a, b);

58
(Pilha)
Instrues
Porque se chama pilha?
a 4
char a; b 6

void main() { c
a = 4;
retorno
int b = 6;
4
int c = soma(a, b); a

} b 6

59
(Pilha)
Instrues
Porque se chama pilha?
a 4
char a; b 6

void main() { c
a = 4;
retorno 10
int b = 6;
4
int c = soma(a, b); a

} b 6

60
(Pilha)
Instrues
Porque se chama pilha?
a 4
char a; b 6

void main() { c
a = 4;
retorno 10
int b = 6;

int c = soma(a, b);

61
(Pilha)
Instrues
Porque se chama pilha?
a 4
char a; b 6

void main() { c 10
a = 4;

int b = 6;

int c = soma(a, b);

62
(Pilha)
Instrues
Porque se chama pilha?

char a;

void main() {
a = 4;

int b = 6;

int c = soma(a, b);

63
Alocao de memria esttica vs.
dinmica
Alocao esttica: ocorre normalmente para
variveis declaradas
Exemplo:
double x;

Alocao dinmica: ocorre quando o programa


chama funes de alocao dinmica

funo malloc () da <stdlib.h> em C

operador new em C++


64
Alocao de memria esttica vs.
dinmica
Importante:
Voc alocou memria na HEAP?
Agora voc tem uma grande responsabilidade:
Desalocar quando no for mais usar!
free () <stdlib.h> em C
delete em C++

O que acontece se voc no desalocar?


Pode ser que a mquina inteira fique sem memria
livre

65
Alocao dinmica de memria
:: Funo malloc()
Abreviatura de memory allocation

Aloca um bloco de bytes consecutivos na memria e


devolve o endereo desse bloco

Retorna um ponteiro do tipo void

Deve-se utilizar um cast (modelador) para


transformar o ponteiro devolvido para um ponteiro
do tipo desejado
66
Alocao dinmica de memria
:: Funo malloc()
Exemplo:
Alocando na heap um vetor de n elementos do tipo
inteiro

int *p;
p = (int*) malloc(n * sizeof(int));

67
Alocao dinmica de memria
:: Funo malloc()
A memria no infinita. Se a memria do
computador j estiver toda ocupada, a funo
malloc no consegue alocar mais espao e devolve
NULL

Usar um ponteiro nulo travar o seu programa na


maioria dos casos

68
Alocao dinmica de memria
:: Funo malloc()
Convm verificar essa possibilidade antes de
prosseguir

int *ptr = (int *) malloc (1000 * sizeof(int));


if (ptr == NULL) {
printf ("Sem memoria\n");
}
...

69
Alocao dinmica de memria
:: Funo malloc()
Como percorrer esse vetor utilizando aritmtica de
ponteiros?

int *ptr = (int *) malloc (1000 * sizeof(int));


if (ptr == NULL) {
for (i=0; i<1000; i++)
*p++ = 0;
}
...

70
Alocao dinmica de memria
:: Funo free()
Libera o uso de um bloco de memria, permitindo
que este espao seja reaproveitado

O mesmo endereo retornado por uma chamada da


funo malloc() deve ser passado para a funo
free()

A determinao do tamanho do bloco a ser liberado


feita automaticamente

71
Alocao dinmica de memria
:: Funo free()
Exemplo: liberando espao ocupado por um vetor
de 100 inteiros

int *p;
p = (int*) malloc(100 * sizeof(int));
free(p);

72
Alocao dinmica de matrizes

Ser que conseguimos alocar uma matriz de 10.000


x 10.000 nmeros na pilha?
Provavelmente no

Como alocar na HEAP?

73
Alocao dinmica de matrizes

Ser que conseguimos alocar uma matriz de 10.000


x 10.000 nmeros na pilha?
Provavelmente no

Como alocar na HEAP?


m

74
Alocao dinmica de matrizes

Cdigo: int **m;


m = (int **) malloc(10 * sizeof(* int));
for (int i=0; i<10; i++)
m[i] = (int *) malloc(5 * sizeof(int));

75
Praticando o uso de ponteiros

Como fica o cdigo da esquema abaixo

m p q int x;
2

s t

O que vem a ser um ponteiro rebelde?


Quais os problemas?
Como evitar?
76
Ponteiro para funo
#include <stdio.h>
#include <stdlib.h>

void func(int);

main(){ Declarao
void (*fp)(int);

fp = func; Atribuio

fp(2); chamada
exit(1);
}

void func(int arg){


printf("%d\n", arg);
}
77
Struct
Uma estrutura uma coleo de variveis. Exemplo:

typedef struct {
char* nome;
int idade;
unsigned char peso;
} TPessoa;

// Alocao esttica
TPessoa P1;

// Alocao dinmica
TPessoa *P2 = (TPessoa *) malloc(sizeof(TPessoa));

// Acessando dados de P1 (esttico)


P1.idade = 20;
// Acessando dados de P2 (ponteiro/dinmico)
P1->idade = 20;
78
Macros
O que vem a ser uma macro?
Exemplo:

#define PI 3.141593
#define PI2 PI*2
#define SQR(z) ((z) * (z))

79