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

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 mais

Tutorial para iniciantes: software ENVI-met versão 3.1

Tutorial 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 mais

para imprimir

para 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