Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra...

29
Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra [email protected] 2006/200 7 Breve Introdução à Linguagem C

Transcript of Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra...

Page 1: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

Sistemas Operativos

Paulo MarquesDepartamento de Eng. InformáticaUniversidade de [email protected]

2006

/200

7

Breve Introdução àLinguagem C

Page 2: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

2

Bibliografia

C How to Program, 5th Editionby Deitel & Associates Prentice Hall, August 2006 ISBN 0132404168

The C Programming Language, 2nd Editionby Kernighan & RitchiePrentice Hall, March 1988 ISBN 0131103628

Page 3: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

3

Cálculo de uma Raíz Quadrada

Qual o algoritmo para calcular a raiz quadrada de um número x?

x 49y0 20

n y0 201 11.2252 7.7951283 7.0405534 7.0001175 76 77 7

)(21

nnn y

xyy

“Mét

odo

Bab

ilóni

co”

Page 4: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

4

Programa de Cálculo da Raíz Quadrada

Page 5: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

5

Compilar e Executar

$ gcc –Wall raiz.c –o raiz$ ./raiz

Page 6: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

6

Notas

#include <stdio.h> Inclui a biblioteca “stdio” (Standard IO)

#define ERRO_MAXIMO 0.0001 Definição de uma constante

Inexistência de classes As funções (métodos) existem directamente no ficheiro

Controlo de fluxo de execução / tipos Semelhante ao Java

main() / printf() main() Função principal do programa e seu ponto de

entrada printf() Permite escrever dados para o ecrã

Page 7: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

7

Tipos de Dados Básicos

O tamanho de cada tipo de dados varia de plataforma para plataforma. sizeof(datatype) Retorna o tamanho, em bytes do tipo

de dados

Page 8: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

8

Controlo de Fluxo de Execução

Page 9: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

9

Tabelas

double pessoas[10]; Cria uma tabela de 10 elementos do tipo double na stack Acesso como em Java (pessoas[i]) O tamanho é pré-definido e fixo!

double matrix[3][3];

0 1 2 3 4 5 6 7 8 9pessoas

matrix [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] [2][0] [2][1] [2][2]

Page 10: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

10

Pequeno exemplo com tabelas simples

Page 11: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

11

Notas

As tabelas quando são declaradas têm de indicar o tamanho dos dados que vão conter! Para ultrapassar esta limitação tem de se utilizar ponteiros

(mais sobre isso daqui a pouco…)

scanf(“%d”, &variavel_int) Lê do teclado um inteiro scanf(“%lf”, &variavel_double) Lê do teclado um

double O & representa o endereço da variável destino. Isto é, um

ponteiro(mais sobre isso daqui a pouco…)

media = 0.0; desvio_padrao = 0.0;

Inicialização EXPLÍCITA de variáveis!!! O C não inicializa as variáveis automaticamente.

Page 12: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

12

Strings

char nome[6] = “JORGE”;

A tabela tem de conter 6 elementos: Cinco para os caracteres: ‘J’, ‘O’, ‘R’, ‘G’, ‘E’ Um para o terminador da string: ‘\0’

char nome[] = “JORGE”; char nome[] = { ‘J’, ‘O’, ‘R’, ‘G’, ‘E’, ‘\0’ }; char* nome = “JORGE”;

Funções úteis: #include <string.h> strcpy(), strncpy(), strcmp(), strncmp(), strcat(), strncat(),

strstr(), strchr(), sprintf()

Page 13: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

13

Ponteiros (1)

Um ponteiro representa um endereço de memória, permitindo aceder a outras variáveis ou buffers explicitamente reservados

int* ptr; ptr é um ponteiro para uma variável inteira ptr é o ponteiro (endereço) em si *ptr valor apontado por ptr

&var representa o endereço da variável var

NULL ponteiro nulo (não aponta para nada)

Page 14: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

14

Exemplo Simples – Notação

// Um inteiroint idade = 20;

// Um ponteiro para um inteiroint* ptrIdade = NULL;// Uma atribuição...ptrIdade = &idade;

// Acesso à idade original...printf(“%d”, *ptrIdade);

“20”idade (0x5490)

0ptrIdade (0x6000)

0x5490ptrIdade (0x6000)

// Acesso à idade original...*ptrIdade = 30;

“30”idade (0x5490)

(Nota para a versão impressa: este slide contém uma uma animação em que o 20 originalmente em idade passa a 30)

Page 15: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

15

Quiz

Page 16: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

16

Alocação dinâmica de memória

As tabelas têm de ter um tamanho fixo Para resolver esse problema, utiliza-se:

Alocação dinâmica de memória Ponteiros

void* malloc(size_t total_size) Reserva total_size size bytes retornando um ponteiro para

a zona de memória reservada. É necessário converter o ponteiro retornado num ponteiro

“real”

void free(void* ptr) Liberta a zona de memória apontada por ptr,

anteriormente reservada

Page 17: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

17

Exemplo de uso de memória dinâmica

Notas: Muitas vezes é possível utilizar os ponteiros como se fossem tabelas,

assim como usar tabelas como se fossem ponteiros Ao utilizar ponteiros como tabelas, o compilador gera o código para

aceder correctamente aos valores apontados pelos índices. Exemplo: tabela[i] é equivalente a *((char*) tabela + sizeof(double)*i)

Ao utilizar-se um ponteiro directamente, fazendo-se aritmética com o mesmo, os avanços são em múltiplos do tipo de dados base. Exemplo: tabela[2] é equivalente a *(tabela+2), que é sensivelmente equivalente a *((char*) tabela + sizeof(double)*i) (na verdade é um “bug” subtil…)

Page 18: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

18

Passagem de parâmetros por referência

Por vezes é necessário ter funções cujos argumentos sejam passados por referência…

Função que trocadois valores passadoscomo argumento

Função que calcula os quadrados deelementos passados numa tabela, porreferência

Page 19: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

19

CUIDADO

Nunca retornar referências para memória reservada na stack!!!!

Page 20: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

20

Possível solução

Existem outras soluções possíveis (e até mais seguras)… Qual é o problema desta abordagem?

Page 21: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

21

Estruturas

Uma estrutura permite agrupar a informação em blocos Há diferentes formas de o fazer, todas equivalentes

Original

Abreviada

Mais prática

Page 22: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

22

Estruturas e Ponteiros

Quando se utilizam estruturas e ponteiros, existe um operador especial de acesso: ->

É equivalente escrever: ptrPessoa->nome ou (*ptrPessoa).nome

Page 23: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

23

Mais um exemplo de ponteiros…

Uma lista ligada é uma estrutura de dados que permite armazenar um número arbitrário de elementos não pré-definidos

Consiste num encadear de elementos, em que cada elemento possui um ponteiro para o próximo elemento

30list

value next

20value next

10value next

NULL

Page 24: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

24

Programa (Parte I)

Page 25: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

25

Programa (Parte II)

NOTA: É muito mais fácil adicionar “à cabeça” do que no final da lista! TODO:

Implementar as funções: remove_list(), remove_element(), is_present() A memória não está a ser liberta no final do programa!!!

Page 26: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

26

Leitura e Escrita básica de disco

Existem dois tipos de leitura e escrita: Baixo nível: open()/close()/read()/write() Alto nível: fopen()/fclose()/fprintf()/fscanf()/fread()

Page 27: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

27

write_random_int_file()

Page 28: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

28

print_int_file()

Page 29: Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C.

29

» Now this is not the end. It is not even the beginning of the end. But it is, perhaps, the end of the beginning « Winston Churchill