Estruturas Auto-Referenciadas e Ficheiros
Transcrição
Estruturas Auto-Referenciadas e Ficheiros
Estruturas Auto-Referenciadas • As estruturas auto-referenciadas permitem criar estruturas de dados dinâmicas, utilizando ponteiros: – Listas (simplesmente e duplamente ligadas) – Árvores – Tabelas de dispersão • Estruturas em que um campo da estrutura é um apontador para outra estrutura do mesmo tipo struct point { double x; double y; struct point *origin; }; 1 IAED, 2009/2010 Exemplo: Pilha Dinâmica de Inteiros v.2 top top 6 4 2 top 6 top 4 2 NULL 2 IAED, 2009/2010 Exemplo: Pilha Dinâmica de Inteiros v.2 #include <stdio.h> #include <stdlib.h> struct item { int value; struct item *next; }; static struct item *top; void init() { top = NULL; } 3 IAED, 2009/2010 Exemplo: Pilha Dinâmica de Inteiros v.2 void push(int value) { struct item *new; new = (struct item *) malloc(sizeof(struct item)); new->value = value; new->next = top; 6 new top top = new; } top 4 2 NULL 4 IAED, 2009/2010 Exemplo: Pilha Dinâmica de Inteiros v.2 int is_empty() { return top == NULL; } 5 IAED, 2009/2010 Exemplo: Pilha Dinâmica de Inteiros v.2 int pop() { int value; struct item *old; if (!is_empty()) { value = top->value; old = top; top = top->next; free(old); return value; } else return -1; } 6 old top old 6 top 4 2 NULL IAED, 2009/2010 Exemplo: Pilha Dinâmica de Inteiros v.2 Problema: • Na versão 1, a expressão top-base denota o número de elementos na Pilha. • Como obter o número de elementos da Pilha nesta versão 2? Solução: • Necessário percorrer toda a Pilha!! 7 IAED, 2009/2010 Instrução typedef • O typedef permite associar um nome a um tipo de dados já existente typedef int Inteiro; int main() { Inteiro i; ... } • Formato typedef <tipo> <nome>; 8 IAED, 2009/2010 Instrução typedef • É usual utilizar typedef na manipulação de estruturas auto-referenciadas struct item { int value; struct item *next; }; typedef struct item int_item; typedef struct item *int_item_ptr; 9 IAED, 2009/2010 Bibliotecas do C K&R: Capitulo 7 IAED, 2009/2010 Bibliotecas do C • Funções para input/output – – – – – – Input/Ouput standard Output formatado Listas de argumentos variáveis Input formatado Acesso a ficheiros Input/Output de linhas • Funções para strings • Funções para teste e conversão de caracteres • Funções matemáticas 11 IAED, 2009/2010 Input/Output Standard • int getchar(void) Retorna o próximo caracter do input de defeito (input standard), ou EOF caso o fim do ficheiro tenha sido detectado. • int putchar(int c) Coloca o caracter c no output de defeito (output standard). A função retorna o caracter escrito, ou EOF caso um erro tenha sido detectado. • #include <stdio.h> Declara a utilização de funções da biblioteca de input/output. 12 IAED, 2009/2010 Input/Output Formatado • int printf(char *format, arg1, ..., argN) Escreve arg1, ..., argN, de acordo com formato format – Cada argumento é escrito de acordo com uma especificação de conversão, iniciada pelo caracter % e terminada por um caracter: – Caracteres válidos: d, i, o, x, X, u, c, s, f, e, E, g, G, p, % – Ajustamento à esquerda: – Short/long: h/l – Formatação: <w>.<p> – Largura mínima do argumento a escrever: <w> – Precisão a utilizar: <p>, caracteres para strings, casas decimais para reais, número mínimo de dígitos em inteiros 13 IAED, 2009/2010 Input/Output Formatado :%s: :%10s: :%.10s: :%-10s: :%.15s: :%-15s: :%15.10s: :%-15.10s: 14 :hello, world: :hello, world: :hello, wor: :hello, world: :hello, world: :hello, world : : hello, wor: :hello, wor : IAED, 2009/2010 Input/Output Formatado • int scanf(char *format, arg1, ..., argN) Lê caracteres do input, interpreta os caracteres de acordo com a especificação format, e coloca os resultados em arg1, ..., argN – Argumentos são obrigatoriamente ponteiros – Cada argumento é interpretado de acordo com uma especificação de conversão, iniciada pelo caracter % e terminada por um caracter: • • • • 15 Caracteres válidos: d, i, o, x, u, c, s, e, f, g, % Podem ser precedidos por h indicam um short: d, i, o, x, u Podem ser precedidos por l para indicar um long: d, i, o, x, u Podem ser precedidos por l para indicar um double: e, f, g IAED, 2009/2010 Input/Output Formatado • Exemplo: data 2009/04/01 pode ser lida com int y, m, d; scanf("%d/%d/%d", &y, &m, &d); • int sscanf(char *str, char *format, arg1, ..., argN) – Equivale a scanf, mas lê argumentos de uma string str • int sprintf(char *str, char *format, arg1, ..., argN) 16 IAED, 2009/2010 Acesso a Ficheiros • #include <stdio.h> • FILE * Stream pointer • FILE *fopen(char *name, char *mode) Abre ficheiro, de acordo com modo mode e retorna ponteiro para acesso a ficheiro – mode: "r", "w", "a" • int fclose(FILE *fp) Fecho de ficheiro – retorna 0 se ok ou EOF se erro 17 IAED, 2009/2010 Acesso a Ficheiros • int fgetc(FILE *fp) • int fputc(int c, FILE *fp) Leitura/Escrita de caracteres • int fscanf(FILE *fp, char *fmt, ...) • int fprintf(FILE *fp, char *fmt, ...) Leitura/Escrita formatada 18 IAED, 2009/2010 Acesso a Ficheiros • Ponteiros para acesso a ficheiros por omissão: – Input por omissão: stdin – Output por omissão: stdout – Mensagens de erro por omissão: stderr • Macros comuns – #define getchar() getc(stdin) – #define putchar(c) putc((c),stdout) • int ungetc(int c, FILE *fp) Devolve caracter a ficheiro. Retorna EOF em caso de erro, ou então c. Apenas um caracter pode ser devolvido, entre leituras de outros caracteres. 19 IAED, 2009/2010 Acesso a Ficheiros • int ferror(FILE *fp) Detecta erro na stream apontada por fp – devolve 0 se não há erro e um código de erro caso contrário • int feof(FILE *fp) Detecta o fim de ficheiro – devolve um valor diferente de 0 no fim do ficheiro – devolve 0 caso contrário 20 IAED, 2009/2010 Acesso a Ficheiros #include <stdio.h> void filecopy(FILE *ifp, FILE *ofp) { int c; while ((c = getc(ifp)) != EOF) putc(c, ofp); } 21 IAED, 2009/2010 Acesso a Ficheiros main(int argc, char *argv[]) { FILE *fp; if (argc == 1) filecopy(stdin, stdout); else while(--argc > 0) if ((fp = fopen(*++argv, "r")) == NULL) { fprintf(stderr, "cat: can’t open %s\n", *argv); return 1; } else { filecopy(fp, stdout); fclose(fp); } return 0; } 22 IAED, 2009/2010 Input/Output de Linhas • #include <stdio.h> • char *fgets(char *line, int maxline, FILE *fp) Lê linha (incluindo \n) do ficheiro fp. Em caso de EOF ou erro retorna NULL; caso contrário retorna linha • int fputs(char *line, FILE *fp) Escreve linha para o ficheiro fp. Linha não necessita ser terminada por \n. Retorna 0, ou EOF em caso de erro • gets(), para stdin, e puts(), para stdout 23 IAED, 2009/2010 Funções para Strings • #include <string.h> • • • • • • • • • 24 strcat(s, t) strncat(s, t, b) strcmp(s, t) strncmp(s, t, n) strcpy(s, t) strncpy(s, t, n) strlen(s) strchr(s, c) strrchr(s, c) IAED, 2009/2010 Teste e Conversão de Caracteres • #include <ctype.h> • • • • • • • • 25 isalpha(c) isupper(c) islower(c) isdigit(c) isalnum(c) isspace(c) toupper(c) tolower(c) IAED, 2009/2010 Funções Matemáticas • #include <math.h> – É necessário ligar com a biblioteca matemática, -lm • • • • • • • • • 26 sin(x) cos(x) atan2(y,x) exp(x) log(x) log10(x) pow(x,y) sqrt(x) fabs(x) IAED, 2009/2010
Documentos relacionados
D Enunciado
ponteiro vet, para um vetor de ponteiros para Familiar, o inteiro n, indicando o número de elementos desse vetor, e duas cadeias de caracteres nome1 e nome2, indicando dois familiares. A função dev...
Leia maisTutorial para iniciantes: software ENVI-met versão 3.1
- Output Directory -> C:\ENVImet31\output\ (criada automaticamente pelo ENVI-met) - Start Simulation at Day -> data que será inicializado o modelo - Start Simulation at Time -> horário que será ini...
Leia maispara imprimir
A estrutura ASL contém grande parte dos dados relativos ao problema. A inclusão do ficheiro de cabeçalho (header file) getstub.h inclui também o ficheiro asl.h. O ficheiro asl.h fornece também uma ...
Leia mais