Buscar

Revisão de C

Prévia do material em texto

Algoritmos e Estruturas de 
Dados IIRevisão C
*Apresentação baseada nos slides do Prof. 
Ítalo Cunha.
Adriano Veloso
adrianov@dcc.ufmg.br
A linguagem C
 Criada em 1969
 Alto/médio nível
 Operações à nível de bit
 7 (0111) << 1 = 14 (1110)
 Fortemente tipada
 Grande poder de expressão
 “With great power comes great 
responsibilities!”
Algoritmos e Estruturas de Dados II - Revisão C 2
A linguagem C
 Eficiência
 Construções similares a instruções de 
máquina
 Acesso direto à memória
 Portabilidade
 Utilizada nos mais diversos 
dispositivos
 Poucos requisitos para execução
 Biblioteca padrão limitada
Algoritmos e Estruturas de Dados II - Revisão C 3
A linguagem C
 Existem várias referências online
 http://www.cplusplus.com/
 Apostilas
 Utilize o Google!
Algoritmos e Estruturas de Dados II - Revisão C 4
Compilação e ligação
Algoritmos e Estruturas de Dados II - Revisão C
#ifndef UTILS_H
#define UTILS_H
int multiplicar(int a, int b);
#endif
#include “utils.h”
int multiplicar(int a, int b)
{ 
 return a*b; 
}
utils.h utils.c
COMPILADO
R
utils.o
5
Compilação e ligação
Algoritmos e Estruturas de Dados II - Revisão C
#ifndef UTILS_H
#define UTILS_H
int multiplicar(int a, int b);
#endif
#include “utils.h”
int main(void)
{ 
 ...
}
utils.h principal.c
COMPILADO
R
utils.o principal.o
6
Compilação e ligação
Algoritmos e Estruturas de Dados II - Revisão C
LIGADOR
utils.o
principal.
o
principal.ex
e
7
Detecção de erros na 
compilação
Algoritmos e Estruturas de Dados II - Revisão C
 Verificar todos os avisos do 
compilador
 O erro pode ser proveniente de outro 
problema no código
gcc –Wall –c teste.c 
Linha de comando Code::Blocks
8
Estrutura de um módulo
 Cabeçalhos
 Declarações globais
 Declarações de funções
Algoritmos e Estruturas de Dados II - Revisão C
#include <stdio.h>
char *mensagem = “Hello world!\n”;
int main(void)
{
 printf("%s", mensagem);
 return 0;
}
9
Identificadores e palavras 
reservadas
Algoritmos e Estruturas de Dados II - Revisão C
 Identificam variáveis e funções
 Letras, números e underlines
 Não podem começar com número
 Palavras reservadas
auto 
double 
int 
struct 
break 
else 
long 
switch 
case 
enum 
Register
typedef 
char 
extern 
return 
union 
const 
float 
short 
unsigned 
continue 
for 
signed 
void 
default 
goto 
sizeof 
volatile 
do 
if 
static 
while 
inline 
restrict 
10
Tipos básicos
Algoritmos e Estruturas de Dados II - Revisão C
 Inteiros
 char, short, int, long, long long
 Ponto flutuante
 float, double, long double
 void
 Arranjos
 Estruturas
 Ponteiros
11
Operadores básicos
Algoritmos e Estruturas de Dados II - Revisão C
 Atribuição
 x = y
 Atribuição compostos
 x += y (x = x + y), x <<= y (x = x << y)
 Comparação
 x > y, x >= y, x < y, x <= y, x == y, x!= y
 Aritméticos
 x + y, x - y, x * y, x / y, x % y, -x
12
Operadores básicos
Algoritmos e Estruturas de Dados II - Revisão C
 Lógicos
 !x, x && y, x || y
 Binários
 x & y, x | y, x ^ y, ~x, x << y, x >> y
 Incremento e decremento
 x++, ++x, y--, --y
 Endereçamento de memória
 &x, *x, x[y], x.campo, x->campo
13
Outros operadores
Algoritmos e Estruturas de Dados II - Revisão C
 Conversão
 (int) x, (double) x
 Condicional
 x ? y : z
 Tamanho
 sizeof(x), sizeof(double)
14
Arranjos (vetores)
 Sequência de elementos de um 
único tipo
 Tamanho fixo
 Sem checagem de limites
 Opcional: inicialização durante a declaração
Algoritmos e Estruturas de Dados II - Revisão C
int primos[7]; 
int primos[7] = {2, 3, 5, 7, 11, 13, 17}; 
15
Matrizes
 Arranjos de duas dimensões
 Alocação linear na memória
 Conversão dos índices para posição do 
elemento
Algoritmos e Estruturas de Dados II - Revisão C
double identidade[4][4] = {{1, 0, 0, 0}, {0, 1, 0, 0}, 
 {0, 0, 1, 0}, {0, 0, 0, 1}};
16
Arranjos e Matrizes
 Arranjo dos números primos 
 Matriz identidade
 identidade[x][y] = valor em (x * <nº de 
colunas> + y)
Algoritmos e Estruturas de Dados II - Revisão C
2 3 5 7 11 13 17
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
identidade[2][2] = posição 10 = 1
17
 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Strings em C
 Representam um texto
 Arranjo de caracteres
 Termina com o caractere nulo: ‘\0’
 Strings inicializados na declaração
 Tamanho definido automaticamente
 char string[] = “hello world!”
Algoritmos e Estruturas de Dados II - Revisão C 18
Strings em C
 Um string em um arranjo de 80 
posições
 char string[80] = “hello world!”
Algoritmos e Estruturas de Dados II - Revisão C
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 79
h e l l o w o r l d ! \0 ? ? ... ... ?
19
Manipulação de strings
 Copiar um string: strcpy, strncpy
 O “n” representa o tamanho do parâmetro 
arranjo
 Evita erros se o string não couber no arranjo
 Concatenar strings: strcat, strncat
 Comparar strings: strcmp, strncmp
 O operador “==” compara a posição, não o 
conteúdo!
 Tamanho de um string: strlen
 Duplicar um string: strdup
Algoritmos e Estruturas de Dados II - Revisão C 20
Conversão de strings
 String para inteiro
 int atoi(const char *string) 
 long atol(const char *string) 
 long long atoll(const char *string) 
 String para ponto flutuante
 double atof(const char *string) 
Algoritmos e Estruturas de Dados II - Revisão C 21
Estruturas
 Utilizadas na implementação de 
TADs
 Encapsulamento da implementação
 Abstração de um modelo
 Transparente para o usuário
 Linguagem C: structs e typedef
Algoritmos e Estruturas de Dados II - Revisão C 22
Estruturas
 Modelo: conjunto de dados 
relacionados
 Campos armazenados em 
sequência
 Possível inclusão de espaçamento pelo 
compilador
Algoritmos e Estruturas de Dados II - Revisão C
struct cliente{ 
 char nome[48]; 
 long long cpf; 
 long telefone; 
 struct endereco
 residencial; 
 ... 
}; 
struct cliente cl; 
cl.cpf = 65423423123; 
sprintf(cl.residencial.rua, “Rua ABC”); 
cl.residencial.numero = 1325; 
23
Ponteiros
 Referência para um objeto na 
memória
 Utilidade
 Manipulação de dados (swap)
 Passagem de parâmetro por referência
Algoritmos e Estruturas de Dados II - Revisão C
int i = 10; 
int *ponteiro = &i; 
int **ppp = &ponteiro; 
Variável Posição Valor
i 0x80 10
ponteiro 0x84 0x80
ppp 0x88 0x84
24
Ponteiros
 Operadores
 & (referência), * (deferência)
 O endereço de uma variável 
funciona como um ponteiro para 
aquela variável
 Acessar o valor da variável 
apontada
Algoritmos e Estruturas de Dados II - Revisão C
Referência e deferência
int x = 10; 
int y; 
int *p = &x; 
y = *p + 1; // y = x + 1 = 11 
*p = 20; // x = 20 
25
Ponteiros nulos
 NULL
 Útil para representar ponteiros não 
inicializados ou condições de erro
 Nenhum ponteiro válido possui esse 
valor!
 Esse valor não pode ser acessado
 Falha de segmentação
Algoritmos e Estruturas de Dados II - Revisão C 26
Ponteiros nulos
Algoritmos e Estruturas de Dados II - Revisão C
int *p; 
// p tem um valor aleatório,
// não sabemos para onde
// ele aponta.
p = NULL; 
fatores(p); 
int *fatores(int *p) 
{ 
 if (!p) { return NULL; } 
 // calcula fatores primos 
 ... 
} 
27
Ponteiros para void
 Não existe um objeto do tipo void
 Valor utilizado com um coringa
 Pode apontar para qualquer tipo de 
objeto
Algoritmos e Estruturas de Dados II - Revisão C
int i= 10; 
int *int_ptr; 
void *void_ptr; 
double *double_ptr; 
int_ptr = &i; 
void_ptr = int_ptr; // OK 
double_ptr = int_ptr; // !OK 
double_ptr = void_ptr; // OK 
Variável Posiçã
o
Valor
i 0x80 10
int_ptr 0x84 0x80
void_ptr 0x88 0x80
double_ptr 0x8c 0x80
28
Ponteiros para estruturas
Algoritmos e Estruturas de Dados II - Revisão C
 Declaração e inicialização normal 
 Acesso aos campos
struct data { int dia; int mes; int ano; }; 
struct data d1; 
struct data *ptr = &d1;
int i = 0;
(*ptr).dia = 8; 
(*ptr).mes = 3; 
(*ptr).ano = 2012; 
ptr->dia = 8; 
ptr->mes = 3; 
ptr->ano = 2012; 
Variável Posição Valor
d1.dia 0x80 8
d1.mes 0x84 3
d1.ano 0x88 2012
ptr 0x8c 0x80
i 0x90 0
29
Funções
Algoritmos e Estruturas de Dados II - Revisão C
 Declaração
 Tipo de retorno, nome, parâmetros
 Em cabeçalhos .h para funções 
externas
 Em arquivos .c para funções internas 
(auxiliares)
double pow(double x, double y) 
{
 ... 
} 
30
Funções
 Passagem de parâmetros por valor
 Modificações do valor de um 
parâmetro não afetam o valor da 
variável original (fora)
Algoritmos e Estruturas de Dados II - Revisão C
Parâmetros
int incrementa(int x) 
{ 
 x = x+1; 
 return x; 
} 
int main(void) 
{ 
 int x = 1; 
 int y = incrementa(x); 
 printf(“%d %d\n”, x, y); 
 ... 
}
31
Funções
 Diversas utilidades
 Passagem de parâmetro por 
referência
Algoritmos e Estruturas de Dados II - Revisão C
Ponteiros como parâmetros
void ordena(void *dados, int nelem)
{
 ...
}
32
Entrada/Saída
Algoritmos e Estruturas de Dados II - Revisão C
 Rotinas de entrada e saída não 
fazem parte das operações básicas 
da linguagem
 Disponíveis em bibliotecas padrão 
que acompanham os compiladores
 Padronizadas
 Em C, estão definidas no cabeçalho 
stdio.h
33
Entrada/Saída
 Principal função de saída
 int printf(char *fmt, v1, v2, ...)
 fmt especifica como os valores 
devem ser impressos na saída
 Existem vários caracteres de 
controle
 Retorna o número de conversões 
impressas
 Útil para checagem de erros
Algoritmos e Estruturas de Dados II - Revisão C
Terminal
34
Entrada/Saída
 String formatadora:
 %[opções][largura][.precisão]
[tamanho]conversão
 A única parte obrigatória é a 
conversão
Algoritmos e Estruturas de Dados II - Revisão C
Terminal
printf(“X = %d”, x); 
printf(“Area: %f”, PI*r*r); 
printf(“Nome: %s”, aluno.nome); 
Conversão
c char
d int
u unsigned int
x int, hexadecimal
f float
e float, científico
g float, científico
p ponteiro
s string
35
Entrada/Saída
 Caractere de escape: \
 Operadores especiais
 Retorno de carro: \r
 Nova linha: \n
 Tabulação: \t
Algoritmos e Estruturas de Dados II - Revisão C
Terminal
36
Entrada/Saída
 Principal função de entrada
 int scanf(char *fmt, *v1, *v2, ...)
 Utilizado para leitura de dados do 
terminal
 Mesmos códigos de conversão
 Mesmas sequências de escape
 Ponteiro para a variável que será 
inicializada
Algoritmos e Estruturas de Dados II - Revisão C
Terminal
37
Entrada/Saída
Algoritmos e Estruturas de Dados II - Revisão C
Terminal
int main(void) 
{ 
 int nlados = 0; 
 float lado = 0; 
 scanf(“%f %d”, &lado, &nlados); 
 float perimetro = lado*nlados; 
 printf(“%f\n”, perimetro);
}
38
Entrada/Saída
 Abrir
 FILE *fopen(char *nome, char *modo) 
 Modo:
 “r” leitura, “w” escrita, e “rw” ambos
Se o arquivo já existir, “a” para adicionar
 Sempre verificar se o retorno é nulo
 Fechar
 int fclose(FILE *arquivo)
Algoritmos e Estruturas de Dados II - Revisão C
Arquivos
39
Entrada/Saída
Algoritmos e Estruturas de Dados II - Revisão C
Arquivos
#include <stdio.h>
#include <stdlib.h>
int main(void) 
{ 
 FILE *arquivo = fopen(“teste.txt”, “w”); 
 if(!arquivo)
 { 
 perror(NULL); 
 exit(EXIT_FAILURE); 
 } 
 fprintf(arquivo, “hello arquivo!”); 
 fclose(arquivo); 
}
40
Entrada/Saída
 Cuidado ao terminar de ler um 
arquivo
 int feof(FILE *arquivo)
 Retorna falso se ainda não chegou ao 
final
 Só retorna verdadeiro depois ao tentar 
ler após o arquivo ter sido totalmente 
percorrido
Algoritmos e Estruturas de Dados II - Revisão C
Arquivos
41
Entrada/Saída
 int main(int argc, char *argv[]) { ... } 
 argv é um arranjo de strings, cada 
posição representa um parâmetro 
informado
 argc é o número de parâmetros em 
argc
 argv[0] é sempre o nome do 
executável
Algoritmos e Estruturas de Dados II - Revisão C
Parâmetros
42
Boas práticas
Algoritmos e Estruturas de Dados II - Revisão C
 Pequeno esforço, grande impacto
 Um código bem escrito
 Ajuda na organização das ideias
 Permite um fácil entendimento
Seu próprio
De outras pessoas que vão utilizá-lo
 Facilita a depuração de problemas
43
Boas práticas
Algoritmos e Estruturas de Dados II - Revisão C
 Código bem escrito em AEDS2
 Ajuda a entender a intenção do aluno
 Facilita na correção dos trabalhos
 Também é avaliado!
44
Boas práticas
 Realça a estrutura lógica do código
 Geralmente indenta-se com 
tabulação (tab)
 8 espaços
 Configurável na maioria dos editores
Algoritmos e Estruturas de Dados II - Revisão C
Indentação
45
Boas práticas
Algoritmos e Estruturas de Dados II - Revisão C
Indentação
static char *concat(char *s1, char *s2) { 
while (x == y) { 
something(); 
something_else(); 
} 
final_thing(); 
} 
static char *concat(char *s1, char *s2) 
{ 
while(x == y) 
{ 
something(); 
something_else(); 
} 
final_thing(); 
} 
46
Boas práticas
 Facilitam a compreensão do código
 Evitar comentários triviais
 Mais importantes em partes 
complexas
 Comentário errado é pior que 
nenhum
 Revisar comentários quando o 
código mudar
Algoritmos e Estruturas de Dados II - Revisão C
Comentários
47
Boas práticas
 No início de cada módulo
 Descrever constantes e variáveis 
globais
 Funções
 Descrever os parâmetros e retorno
 Explicar o que a função faz, não como 
ela faz
Algoritmos e Estruturas de Dados II - Revisão C
Comentários
48
Boas práticas
 Escolher bons identificadores
 Funções: substantivos (o que retorna)
 Procedimentos: verbo (o que faz)
 Variável: nome significativo
 Nomes simples para variáveis 
auxiliares
Algoritmos e Estruturas de Dados II - Revisão C
Identificadores
double soma(double a, double b); 
void ordenarVetor(int *vetor); 
49
Boas práticas
 Underline
 int num_clientes; 
 struct list *lista_alunos; 
 CamelCase
 int numClientes; 
 struct lista *listaAlunos; 
Algoritmos e Estruturas de Dados II - Revisão C
Identificadores
50
Boas práticas
 Não utilizar números mágicos no 
código
 Difícil entendimento e manutenção
 Centralizar a declaração desses 
números
 Facilita a modificação caso 
necessário
 Utilizar #define para declarar 
constantes
 Nome com letras maiúsculasAlgoritmos e Estruturas de Dados II - Revisão C
Constantes
51
Boas práticas
Algoritmos e Estruturas de Dados II - Revisão C
Constantes
#define PI 3.141592
float areaCircunferencia(float raio)
{
 return PI*raio*raio;
}
int main(void) 
{ 
 float raio = 5.0f;
 float area = areaCircunferencia(raio);
 ... 
}
52
Boas práticas
 Particionar um programas em 
módulos
 O módulo geralmente é um par de 
arquivos
 modulo.c contém a implementação 
das funções
 modulo.h contém a declaração das 
funções e tipos de dados; importado 
por outros módulos
Algoritmos e Estruturas de Dados II - Revisão C
Modularização
53
Boas práticas Organizar os módulos de forma a 
permitir um melhor 
reaproveitamento
 Nomear de acordo com as 
funcionalidades
 Programador não precisa conhecer 
detalhes da implementação do 
módulo
Algoritmos e Estruturas de Dados II - Revisão C
Modularização
54
Boas práticas
 Nomes de variáveis sem 
significado
 Utilizar diversas variáveis globais
 Código sem comentários 
relevantes
 Código sem indentação
Algoritmos e Estruturas de Dados II - Revisão C
O que não fazer
55
Boas práticas
Algoritmos e Estruturas de Dados II - Revisão C
O que não fazer
#include <stdio.h>
float a, b, c; /* Declarando variáveis */
int funcao()
{
 int i;
 for (i = 0; i < 10; i++) {printf("%d\r\n", a);}
 return i;
}
void main()
{
 float essaariavelserautilizadaparaguardaramedia; 
 funcao();
 ...
}
56
	Slide 1
	Slide 2
	Slide 3
	Slide 4
	Slide 5
	Slide 6
	Slide 7
	Slide 8
	Slide 9
	Slide 10
	Slide 11
	Slide 12
	Slide 13
	Slide 14
	Slide 15
	Slide 16
	Slide 17
	Slide 18
	Slide 19
	Slide 20
	Slide 21
	Slide 22
	Slide 23
	Slide 24
	Slide 25
	Slide 26
	Slide 27
	Slide 28
	Slide 29
	Slide 30
	Slide 31
	Slide 32
	Slide 33
	Slide 34
	Slide 35
	Slide 36
	Slide 37
	Slide 38
	Slide 39
	Slide 40
	Slide 41
	Slide 42
	Slide 43
	Slide 44
	Slide 45
	Slide 46
	Slide 47
	Slide 48
	Slide 49
	Slide 50
	Slide 51
	Slide 52
	Slide 53
	Slide 54
	Slide 55
	Slide 56

Continue navegando