sistemas operativos paulo marques departamento de eng. informática universidade de coimbra...
TRANSCRIPT
![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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/1.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/2.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/28.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062818/5706384b1a28abb8238f5b14/html5/thumbnails/29.jpg)
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