04.09.2013 Views

Programação Imperativa e C e C++ PICC - deetc - isel

Programação Imperativa e C e C++ PICC - deetc - isel

Programação Imperativa e C e C++ PICC - deetc - isel

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Programação</strong> <strong>Imperativa</strong> e C e <strong>C++</strong><br />

<strong>PICC</strong><br />

Linguagem C<br />

Introdução, tipos<br />

Centro de Cálculo<br />

Instituto Superior de Engenharia de Lisboa<br />

Pedro Pereira palex@cc.<strong>isel</strong>.ipl.pt


Objectivos de <strong>PICC</strong><br />

• Assume que os estudantes já consolidaram os conceitos de<br />

programação em Java<br />

– Conceitos básicos em PG; <strong>Programação</strong> orientada por objectos em<br />

POO.<br />

• Dá a conhecer os ambientes de programação com acesso directo ao<br />

hardware em ambiente real de execução.<br />

– Introdução à linguagem C por comparação com Java.<br />

CCISEL, 2009<br />

• Pré-processamento; Compilação; Ligação.<br />

• Representação de números; Manipulação bit a bit; Tipos;<br />

• Alojamento estático. Funções; Alojamento automático; Registo de activação.<br />

• Alojamento dinâmico; Ponteiros e aritmética.<br />

• Estruturas; Ficheiros de texto e binários; Acesso sequencial e aleatório.<br />

– Introdução à linguagem <strong>C++</strong> por comparação com C e Java.<br />

• Construtor; Destrutor; Cópia e Operador = (igual)<br />

• Representação dos objectos em memória; Tabela de métodos virtuais.<br />

<strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

2


Avaliação<br />

• A realizar em grupo (2-3 pessoas)<br />

– 2 Trabalhos Práticos [40% da nota, > 9,5]<br />

CCISEL, 2009<br />

• Classificação atribuída individualmente, após discussão no final do semestre.<br />

– 2 Séries de exercícios [15% da nota]<br />

• Classificação igual para cada membro do grupo, atribuída na correcção.<br />

• A realizar individualmente:<br />

– 2 Mini-testes [15% da nota]<br />

• A resolver, na aula, nas datas de entrega das séries de exercícios.<br />

– 1 Teste Final [30% da nota, > 9,5 ] (ATENÇÃO: não é exame)<br />

• Realizado no final do semestre nas duas datas marcadas para exame.<br />

• Consulta: folha A4 elaborada pelo aluno<br />

Todos os intervenientes em cópias, detectadas em qualquer<br />

elemento de avaliação, terão o respectivo elemento anulado.<br />

<strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

3


Antes do C<br />

• Linguagens de programação nos anos 60:<br />

– COBOL<br />

• Para tratamento de ficheiros de dados<br />

• Utilização comercial (Bancos, Seguradoras, …)<br />

– FORTRAN<br />

• Para cálculo numérico<br />

• Utilização científica<br />

– LISP e Prolog<br />

• Para dedução lógica<br />

• Utilização em Inteligência Artificial<br />

– Assembly<br />

• Para código de baixo nível e onde o tempo de execução é critico<br />

• Utilizado no desenvolvimento de sistemas operativos e drivers<br />

• Laboratórios Bell (AT&T): desenvolvimento de sistemas operativos<br />

– Ken Thompson: linguagem B (evolução do Assembly)<br />

– Dennis Ritchie: linguagem C (B com tipos)<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

4


C versus Java<br />

• C<br />

– Dennis Ritchie: 196?- 197?<br />

– <strong>Programação</strong> de sistemas<br />

• Desenhado para estar “perto” do hardware<br />

• Acesso directo à memória (eficiência tempo/espaço)<br />

– Permite portabilidade entre várias plataformas de hardware<br />

• Portabilidade ao nível do código fonte<br />

– Linguagem procedimental<br />

• Java<br />

– James Gosling: 199?<br />

– Sintaxe semelhante a C<br />

– Suporte de OOP com mais mecanismos automáticos mas menos<br />

liberdade nos paradigmas suportados<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

5


Perigos e (des)vantagens face a Java<br />

• Gestão de memória feita explicitamente<br />

– Java tem gestão automática com garbage collection<br />

• Iniciação explícita<br />

– Java inicia os campos e detecta utilização sem iniciação<br />

• Detecção de erros explícita<br />

– Java gera excepção (referência a null, indexação fora dos limites, …)<br />

• Mais linhas de código para a mesma funcionalidade<br />

• Fácil cometer erros não detectados pelo compilador<br />

• Não existe portabilidade de código já compilado<br />

– As bibliotecas não são portáveis<br />

• Não existe uma interface gráfica standard e portável<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

6


Exemplo em C<br />

#include <br />

int main() {<br />

int nextChar; /* char readed */<br />

int count = 0; /* words counter */<br />

int inWord = 0; /* current state */<br />

}<br />

words.c<br />

while (( nextChar = getchar() ) != EOF) {<br />

if (nextChar == '\n' || nextChar == ' ')<br />

inWord = 0;<br />

else<br />

if (! inWord) {<br />

inWord = 1;<br />

++count;<br />

}<br />

}<br />

printf("Words=%d\n",count);<br />

return 0;<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

7


Compilar, Ligar e Executar (Linux / GNU)<br />

debug<br />

• gcc -Wall -g -c words.c<br />

– Compila o ficheiro fonte words.c e gera o ficheiro<br />

words.o com o código compilado.<br />

– Neste passo são detectados os erros de compilação<br />

• pre-processador; sintaxe; semânticos<br />

• gcc words.o –o words<br />

– Liga words.o com a biblioteca standard e gera o ficheiro<br />

executável words<br />

– Neste passo são detectados erros de ligação<br />

• Símbolo não encontrado<br />

• words < abc.txt<br />

– Executa o programa dando como entrada (input) o<br />

conteúdo do ficheiro abc.txt<br />

– Neste passo são detectados os erros de execução<br />

• O programa não cumpre o objectivo<br />

insight words<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

8


Compilar, Ligar e Executar (Windows / Microsoft)<br />

debug<br />

• cl /Wall /Zi /c words.c<br />

– Compila o ficheiro fonte words.c e gera o ficheiro<br />

words.obj com o código compilado.<br />

– Neste passo são detectados os erros de compilação<br />

• pre-processador; sintaxe; semânticos<br />

• cl /Zi /Fewords.exe words.obj<br />

– Liga words.obj com a biblioteca standard e gera o<br />

ficheiro executável words.exe<br />

– Neste passo são detectados erros de ligação<br />

• Símbolo não encontrado<br />

• words < abc.txt<br />

– Executa o programa dando como entrada (input) o<br />

conteúdo do ficheiro abc.txt<br />

– Neste passo são detectados os erros de execução<br />

• O programa não cumpre o objectivo<br />

devenv words.exe<br />

vsvars32<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

9


Exemplo em C<br />

#include <br />

void printChar( int c ) {<br />

printf(“Char „%c‟ code=%d hex=%x\n”,c,c,c);<br />

}<br />

int main() {<br />

printChar(„A‟);<br />

printChar(„H‟);<br />

return 0;<br />

}<br />

%c Carácter cujo código é o valor<br />

%d Valor inteiro em decimal<br />

%x %X Valor inteiro em hexadecimal<br />

%o Valor inteiro em octal<br />

pc.c<br />

Char „A‟ code=65 hex=41<br />

Char „H‟ code=72 hex=48<br />

\n Mudança de linha<br />

\t Tabulador<br />

\b Backspace<br />

\” Carácter aspas<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

10


Identificadores, Tipos e Constantes<br />

• Identificadores<br />

– As mesmas regras de Java: …<br />

• Tipos básicos ( char, int, float, double )<br />

– Modificadores de dimensão (short, long) aplicáveis a int<br />

– Modificadores de sinal (signed, unsigned) aplicáveis a int e char<br />

• Constantes<br />

– int: 23 023 0x23 23L 23U<br />

– double ou float: 23.5 23.5F 23. 23.F 12.3e-4 12.3e10F<br />

– char: „K‟ „\n‟ „\t‟ „\\‟ „\0‟ „\113‟ „\x48‟<br />

– string: “abc” “aspas=\”” “linha\n”<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

11


Variáveis<br />

• Nome<br />

• Tipo<br />

– Zona de memória associada a um nome<br />

– Significado e dimensão dos valores armazenados<br />

• Âmbito (scope)<br />

– Onde é vista a variável<br />

• Bloco de função, Argumento de função, Global, outros blocos…<br />

• Tempo de vida<br />

char c<br />

– Desde a reserva de memória à libertação<br />

• Automático (sujeito ao bloco)<br />

• Estático (sujeito ao programa)<br />

int count = 0<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

12


Tipo char<br />

Tipo Utilização Dimensão Valores<br />

signed char<br />

-128..127<br />

unsigned char<br />

char<br />

Valores muito pequenos<br />

código de um carácter<br />

8 bits<br />

(1 byte)<br />

0..255<br />

???<br />

void main() {<br />

char cA='A', ca;<br />

for(ca=cA+32 ; cA


Tipo int<br />

CCISEL, 2009<br />

Tipo Utilização Dimensão<br />

Típica (32bits)<br />

Valores<br />

signed int ou int Valores 32 bits -2<br />

inteiros (4 bytes)<br />

31 .. 231-1 unsigned int 0.. 232-1 (232 =4.294.967.296)<br />

long int ou long Valores 32 ou 64 bits -2<br />

grandes (4 ou 8 bytes)<br />

31 .. 231-1 unsigned long 0.. 232-1 (232 =4.294.967.296)<br />

short int ou short Valores 16 bits -2<br />

pequenos (2 bytes)<br />

15 .. 215-1 unsigned short 0.. 216-1 (216 =65.536)<br />

Standard só garante: sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long)<br />

unsigned int ui= ~0;<br />

unsigned long ul= ~0;<br />

unsigned short us= ~0;<br />

printf("max unsigned\n int=%u\n"<br />

" long=%lu\n short=%u\n",ui,ul,us);<br />

<strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

max unsigned<br />

int=4294967295<br />

long=4294967295<br />

short=65535<br />

14


Tipo float e double<br />

Tipo Utilização Dimensão<br />

(norma IEEE 754)<br />

float<br />

double<br />

CCISEL, 2009<br />

Valores reais<br />

pequenos<br />

Valores reais<br />

grandes<br />

float<br />

v = ± m x 2 e<br />

32 bits<br />

(4 bytes)<br />

64 bits<br />

(8 bytes)<br />

Expoente<br />

(bits)<br />

<strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

Mantissa<br />

(bits)<br />

Valores<br />

8 23 ± ≈1.2×10 -38 .. ≈3.4×10 38<br />

11 52 ± ≈2.2×10 −308 .. ≈1.8×10 308<br />

m = 1.M M é a mantissa, valendo cada bit:<br />

2 -1 + 2 -2 + 2 -3 +…+ 2 -22<br />

e = E-127 E é o expoente, valendo cada bit:<br />

2 7 + 2 6 + 2 5 +…+ 2 0<br />

M=2 -2 =0.25 → m=1.25 E=01111100 2=124 → e=-3 v=+1.25x2 -3 =0.15625<br />

Existem representações especiais para: zero, infinito e indeterminado.<br />

15


Conversão de tipos<br />

• Conversão implícita<br />

– Verificada em tempo de compilação<br />

– Promoção<br />

• char int float double<br />

• short int int long int<br />

– Em expressões quando os operandos<br />

são de tipos diferentes<br />

• Conversão para o tipo mais abrangente<br />

• Conversão explícita (cast)<br />

– Para realizar despromoções<br />

• Podem gerar código<br />

int small = 10L;<br />

long large;<br />

...<br />

large = small;<br />

??? any;<br />

any = large + small;<br />

small = (int) large;<br />

short int val = -1;<br />

small = (int) val;<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

16


Operadores<br />

• Aritméticos:<br />

– Quatro operadores entre inteiros e<br />

reais: +, -, * e /<br />

– Resto de divisão inteira: %<br />

– Operadores unários: + e –<br />

– Incremento e decremento (prefixo e<br />

sufixo): ++ e –-<br />

• Relacionais: >, >=, . <br />

! ~ ++ -- + - *<br />

& (type) sizeof<br />

<br />

* / % <br />

+ - <br />

> <br />

< >= <br />

== != <br />

& <br />

^ <br />

| <br />

&& <br />

|| <br />

?: <br />

= += -= … <br />

, <br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

17


Expressões, Instruções e Blocos<br />

• Cada expressão produz um valor<br />

1


Instruções de controlo e valores lógicos<br />

• As instruções if, while, do..while, for e switch têm sintaxe e<br />

semântica semelhantes à linguagem Java<br />

– Cada instrução pode ser substituída por um bloco ou ;<br />

if () [else ]<br />

while () <br />

do while ();<br />

for([];[];[]) <br />

• Não existe o tipo boolean em C<br />

– O valor das condições do if, while, do..while, for e os argumentos dos operadores<br />

lógicos são considerados verdadeiros se forem diferentes de zero.<br />

– O valor que resulta da avaliação das operações relacionais é 1 ou 0.<br />

CCISEL, 2009<br />

<strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

switch() {<br />

{case : {}}<br />

[default: {}]<br />

}<br />

while(x) { putchar(„.‟); --x; }<br />

a = (x==y);<br />

19


typedef<br />

• Definir outro nome para um tipo<br />

– Sintaxe semelhante à declaração de variável, mas prefixada por<br />

typedef<br />

– Os dois tipos são iguais.<br />

typedef unsigned char byte;<br />

typedef unsigned short int word16;<br />

typedef unsigned int word32;<br />

void main() {<br />

byte b = 0x0F;<br />

word16 w = 0x3A1C;<br />

...<br />

}<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

20


enum<br />

• Definir um tipo com um<br />

conjunto de valores por nome<br />

• Valores inteiros atribuídos<br />

automaticamente ou<br />

explicitamente<br />

• O primeiro é zero se não<br />

indicado<br />

• Os restantes não indicados<br />

ficam com o valor seguinte ao<br />

anterior.<br />

enum semaphore {RED,YELLOW,GREEN};<br />

...<br />

enum semaphore s1= GREEN;<br />

printf("%d\n",s1);<br />

if ( s1>RED ) printf("Try pass\n");<br />

2<br />

Try pass<br />

enum logic {FALSE,TRUE,NO=0,YES};<br />

enum bool_t {false, true};<br />

typedef enum bool_t boolean;<br />

...<br />

boolean flag;<br />

CCISEL, 2009 <strong>Programação</strong> <strong>Imperativa</strong> em C e <strong>C++</strong><br />

21

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!