Baixe o app para aproveitar ainda mais
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
Compartilhar