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