CP 5593.6, 2009.2 — LP 1

Embed Size (px)

Citation preview

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

search

Prof. Luciano R. Coutinho email:[email protected]

Apresentaolrc , 16 March 2008 (created 16 March 2008)no tags

EmentaConceitos Gerais. Tipos de linguagens. Linguagem de programao estruturada. Variveis e tipos de dados. Estruturas de controle de fluxo de execuo. Modularizao. Tipos complexos de dados. Operaes com arquivos. Aplicaes.

ObjetivosApresentao de uma linguagem de programao que ser usada no aprendizado de tcnicas de programao e na modelagem de problemas.

Programa1 Introduo s linguagens de programao 2 Viso Geral de C 2.1 Padronizaes 2.2 Caractersticas 2.3 Estrutura geral de um programa em linguagem C 3 Tipos de dados e tipos de variveis 3.1 Variveis inteiras, caracter, e ponto flutuante 3.2 Definio de variveis globais, externas, locais e estticas 4 Operadores e expresses 4.1 Operadores aritmticos, relacionais, lgicos, bit a bit 4.2 Operador de atribuio condicional e operador de moldagem 4.3 Expresses em C 5 Controle de fluxo de execuo 5.1 Desvios incondicionais 5.2 Desvios condicionais 5.3 Comandos de malha 6 Funes 6.1 Tipos de funes 6.2 Passagem de parmetros por valor e por endereo 6.3 Construo de funes e funes padronizadas 7 Vetores e ponteiros 7.1 Alocao esttica e dinmica 7.2 Definio e inicializao de vetores 7.3 Ponteiros em C 7.4 Aplicaes de ponteiros 8 Estruturas, unies e tipos definidos pelo usurio 8.1 Definio de estruturas

1 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

8.2 Vetor de estruturas 8.3 Passagem de estruturas como parmetros 8.4 Definio de Unies 8.5 Tipos definidos pelo usurio 9 Entrada e sada em arquivos 9.1 Conceitos de arquivos 9.2 Arquivos no MSDOS e UNIX 9.3 Arquivos textos e binrios 9.4 Operaes de leitura e escrita em arquivos 9.5 Funes da biblioteca C para manipulao de arquivos 10 Pre - Processador C 10.1 Diretivas de Compilao

Procedimentos de Ensino/AprendizagemRecursos DidticosUso de computadores, ambiente desenvolvimento em C, quadro-branco, marcador, notas de aulas.

MetodologiaAulas terico - prticas em laboratrio, desenvolvimento e discusso de programas, trabalhos de programao pelos alunos.

Sistema de AvaliaoTrs Avaliaes (A1, A2 e A3), seguidas de uma Reposio (R) (para aqueles cuja mdia (A1+ A2+ A3)/ 3 < 7,0) e uma Final (F) (para aqueles cuja mdia corrigida pela Reposio seja > = 4,0 e < 7,0). Seguindo as normas da UFMA, ser APROVADO o aluno que: tiver mdia ao fim da ltima avaliao maior ou igual a SETE media = (A1+ A2+ A3)/ 3 > = 7,0 OU tiver mdia aps a reposio maior ou igual a SETE mediaRep = (A1+ A2+ A3 - min{ A1,A2,A3} + R)/ 3 > = 7,0 OU tiver mdia aps a reposio MAIS nota da Final maior ou igual a 12 mediaRep + Final > = 12,0

AvaliaesA1 e A2Feitas a partir de: PROVAS ESCRITAS INDIVIDUAL (P1 e P2) LISTAS de EXERCCIOS INDIVIDUAIS (L1 e L2) Calculo: Avaliao A1 = ( 2* P1 + L1 ) / 3 Avaliao A2 = ( 2* P2 + L2 ) / 3

A3Feita a partir de: PROVA ESCRITA INDIVIDUAL (P3) PROJETO de PROGRAMAO em GRUPO (T3) Calculo:

2 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Avaliao A3 = (2* T3 + P3) / 3

ReposioConsistir em uma PROVA ESCRITA INDIVIDUAL. A nota da Reposio ir substituir a menor nota dentre A1, A2 e A3. O assunto da Reposio ser o contedo correspondente ao contedo da menor nota sendo substituda.

FinalConsiste em uma PROVA ESCRITA INDIVIDUAL. O assunto da Final ser todo o contedo ministrado durante o curso.

Bibliografia

Cronogramalrc , 9 March 2009 (created 16 March 2008) Data Assunto 25/ 08 I ntroduo; viso geral de C 27/ 08 Declaraes: I dentificadores e Tipos de Dados Bsicos 01/ 09 Declaraes: Variveis e Classe de Memria 03/ 09 Declaraes: Tipo de Acesso, I nicializao e Constantes 08/ 09 sem aula; viajando S. Paulo 10/ 09 sem aula; viajando S. Paulo 15/ 09 Operadores e Expresses: atribuies, aritmtica e lgica 17/ 09 Operadores e Expresses: atribuies, aritmtica e lgica 22/ 09 Operadores e Expresses: bit-a-bit e especiais 24/ 09 Controle de Fluxo: Comandos de Seleo 29/ 09 Controle de Fluxo: Laos e Desvios I ncondicionais 01/ 10 1a. Prova 06/ 10 Funes: definio, declarao e chamada 08/ 10 Funes: main( ) e recurso 13/ 10 Vetores, matrizes e strings 15/ 10 Vetores, matrizes e strings 20/ 10 Ponteiros 22/ 10 Ponteiros 27/ 10 Exemplo: Lista de Strings 29/ 10 Alocao Dinmica 03/ 11 Vetores para Ponteiros, Ponteiros para Vetores e Ponteiros para Ponteiros 05/ 11 2a Prova Escrita 10/ 11 Estruturas 12/ 11 typedef, ponteiros para funes e union 17/ 11 typedef, ponteiros para funes e union 19/ 11 Enumeraes e Campos de Bits 24/ 11 Entrada/ Sada: console 26/ 11 Entrada/ Sada: arquivos 01/ 12 03/ 12 08/ 12 Pr-processador C 10/ 12 3a Prova Escrita 15/ 12 Reposiono tags

3 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

17/ 12 Final

I ntroduo; viso geral de Clrc , 16 March 2008 (created 16 March 2008)no tags

TpicosAs Origens de C C - Caractersticas Nvel Mdio Estruturada Para programadores Programao de sistemas Estrutura Geral de um programa em C Edio, compilao e Link Edio C versus C+ +

As Origens de CKen Thompson e Dennis Ritchie (da esquerda pra direita), os criadores das linguagens B e C, respectivamente:

Para detalhes, leia: D. M. Ritchie; O Desenvolvimento da Linguagem C http:/ / www.caloni.com.br/ blog/ archives/ historia-da-linguagem-c-parte-1 http:/ / www.caloni.com.br/ blog/ archives/ historia-da-linguagem-c-parte-2

Evoluo das Linguagem de ProgramaoRef: History of programming languages Computer Languages History

Padronizao ANSIRef: Jones, Derek M. (2008) "The New C Standard: An Economic and Cultural Commentary."

4 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

5 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

C - CaractersticasNvel Mdio Estruturada Para programadores Programao de sistemas

Linguagem de Nvel Mdio

Linguagem Estruturada

Linguagem para Programadores

Linguagem para Programao de Sistemas

6 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Estrutura geral de um programaPalavras Reservadas

Funes

Exemplo

Edio, compilao e Link Edio

7 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

IDE - Integrated Developmente EnvironmentsDevCpp Code::Blocks + gcc jGRASP + gcc TurboC

TermosCompilao Separada Biblioteca Padro ANSI

C versus C++

Leitura RecomendadaCCT captulo 1 K&R captulo 1 D. Ritche, O Desenvolvimento da Linguagem C* . Histrico das Linguagens de Programao Wikipedia: Ling. C

Exerccios1. A linguagem C considerada uma linguagem de nvel mdio. Explique o que isto significa e quais as implicaes em termos prticos. 2. Programas escritos em C so ditos possuir alto grau de portabilidade. Explique o que isto significa e quais as implicaes em termos prticos. 3. A linguagem C, a exemplo de Pascal dito ser uma linguagem estruturada. Pesquise e descreva as principais diferenas entre a programao estruturada em Pascal e a programao estruturada em C. 4. Faa um resumo esquemticos das datas e principais acontecimentos relatados no artigo O Desenvolvimento da Linguagem C* de D. Ritchie. 5. A linguagem C uma linguagem compacta com apenas 32 palavras reservadas. Pesquise e liste as palavras reservadas de C. Classifique-as em: especificadores de tipos controle de fluxo especificadores de classe de memria outros 6. Modifique o programa media.c para exibir o nome do vetores P e T durante a leitura dos dados. Dica: redefina a funo

ler para aceitar como parametro o nome do vetor sendo lido, alm do prprio vetor. De posse do nome do vetor sendolido, exiba este nome antes da leitura de cada posio.

Declaraes: I dentificadores e Tipos de Dados Bsicoslrc , 29 March 2008 (created 24 March 2008)no tags

ObjetivosNa primeira aula, vimos que um programa em C pode ser visto como uma seqncia de DECLARAES. De maneira geral, uma DECLARAO introduz um novo nome - um IDENTIFICADOR - e associa a este uma interpretao. Tome como exemplo o seguinte trecho de cdigo:

8 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

00: 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14:

#include double x; void p(float b, int e) { short int i; x = b; ... } int main() { p(3.1415, 5); printf("%f",x); return 0; }

Na linha 1, vemos uma DECLARAO de VARIVEL GLOBAL. Nas linhas 3 a 8, temos uma DECLARAO de FUNO que, por sua vez, formada por uma DECLARAO de PARMETROS (linha 3), uma DECLARAO de VARIVEL LOCAL (linha 4) e uma seqncia de comandos (linhas 5-7). Em cada uma dessas DECLARAES um novo IDENTIFICADOR introduzido com uma interpretao particular! Na declarao da linha 1, o IDENTIFICADOR introduzido x e sua interpretao VARIVEL GLOBAL do TIPO BSICO double. Na declarao das linhas 3 a 8, o IDENTIFICADOR p e sua interpretao FUNO que recebe como PARMETROS um valor do TIPO BSICO float e um valor do TIPO BSICO int; tem uma VARIVEL LOCAL do TIPO BSICO short int, executa os comandos das linhas 6-7 e ao final nada retorna ( TIPO BSICO void). Note que, nesses exemplos, a interpretao dada a um IDENTIFICADOR est ligada de maneira ntima com um TIPO de DADOS BSICO. Nesta aula, nosso objetivo mostrar atravs de exemplos o que um IDENTIFICADOR vlido e quais so os TIPOS de DADOS BSICOS - os dois ingredientes fundamentais de toda DECLARAO em um programa C.

IDENTIFICADORESEm C, um IDENTIFICADOR uma seqncia de LETRAS ou DGITOS onde: O primeiro caracter deve ser uma LETRA ( 'a',...,'z','A',...,'Z','_' ) O caracter '_' contado como uma LETRA LETRAS maisculas (e.g., 'A') so consideradas diferentes de letras minsculas (e.g., 'a') isto implica que o IDENTIFICADOR aux diferente de Aux que diferente de AUX PALAVRAS RESERVADAS tais como if, else, char, int, ... no podem ser usadas como IDENTIFICADORES.

Pelo padro C ANSI, um IDENTIFICADOR pode ter qualquer tamanho. Observaes Para IDENTIFICADORES INTERNOS (i.e., nomes restritos a uma nica UNIDADE de COMPILAO), pelo menos os primeiros 31 caracteres so significativos; algumas implementaes podem utilizar um conjunto maior de caracteres significativos. J os IDENTIFICADORES EXTERNOS (i.e., nomes de de VARIVEIS GLOBAIS e FUNES compartilhados entre vrias UNIDADES de COMPILAO) so mais restritos: as implementaes podem considerar em casos extremos apenas 6 caracteres como significativos, e podem ignorar as distines entre letras maisculas e minsculas.

Atividade 1: Validando IndentificadoresVamos escrever um programa em C ( id.c) que dado uma palavra (cadeia de caracteres) imprima na tela um

identificador! ou no um identificador! caso a palavra obedea ou no a definio de identificador dadaacima. DICA - comee o programa assim:

9 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

#include char str[80]; /* armazena uma cadeia de at 79 caracteres */

int main() { printf("Digite uma palavra: "); scanf("%s", str); /* le do usrio uma cadeia de caracteres */ ... }

TIPOS de DADOS BSICOSH cinco tipos de dados bsicos em C:

char : um nico byte, capaz de conter um caracter no conjunto de caracteres local; int : um inteiro, normalmente refletindo o tamanho natural dos inteiros da mquina hospedeira; float : ponto flutuante em preciso simples; double : ponto flutuante em dupla preciso; void : conjunto vazio de valores.Todos os outros tipos de dados em C so baseados em um desses tipos bsicos.

ModificadoresExceto void, os tipos de dados bsicos podem ter vrios MODIFICADORES precedendo-os. Um MODIFICADOR usado para alterar o significado de um tipo bsico para adapt-lo necessidade de diversas situaes. So MODIFICADORES de tipos:

long short signed unsigned

short ou long - referem-se a diferentes tipos de inteiros: A palavra int pode ser omitida e normalmente o ! short = short int long = long intObs.: Alguns compiladores permitem long long int ! (Fora do Padro ANSI)

long pode tambm ser aplicado a double de tal modo que: float double long double signed ou unsigned - podem ser aplicados a char, ou a short ou long ( int ).Equivalencias char = signed char ou char = unsigned char, a depender da mquina hospedeira;

signed int = int = signed signed long = long signed short = short unsigned int = unsignedObs.: Alguns compiladores podem permitir unsigned double ! (Fora do Padro ANSI)

Tamanho e Faixa de ValoresO tamanho e faixa de valores dos tipos bsicos de dados variam de acordo com: tipo do processador implementao do compilador No entanto, o padro ANSI C estipula valores mnimos:

10 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Atividade 2: Explorando Nos arquivos de cabealho e encontram-se definidas constantes simblicas para a faixa de valores e tamanho em bytes dos tipos de dados bsicos e modificados da linguagem C, conforme foram implementados em um dado compilador/ mquina. Nesta atividade, o seu objetivo escrever um programa tipos.c que inclua os arquivos de cabealho e

e imprima - para os tipos mostrados na tabela 2.1 - as seguintes informaes : TIPO char unsigned char signed char ... VALOR_MIN -128 0 -128 VALOR_MAX 127 255 127 TAMANHO em BYTES 1 1 1

Como ponto de partida, voc pode iniciar o seu programa assim:

#include #include char c; unsigned char uc; signed char sc; int i; ... int main(void) { printf("TIPO\t\t\tVALOR_MIN\t\tVALOR_MAX\tTAMANHO em BYTES\n"); printf("char\t\t\t%i\t\t\t%i\t\t%i\n", CHAR_MIN, CHAR_MAX, sizeof c); printf("unsigned char\t\t%i\t\t\t%i\t\t%i\n", 0, UCHAR_MAX, sizeof uc); printf("signed char\t\t%i\t\t\t%i\t\t%i\n", SCHAR_MIN, SCHAR_MAX, sizeof sc); ... }

Leitura RecomendadaCCT captulo 2 K&R captulos 2 Seebach, "Everything You Ever Wanted to Know about C Types"

11 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

What's in a type? Floating point and derived types Implementation details Portability and pitfalls http:/ / pt.wikipedia.org/ wiki/ Tipo_de_dado

Para detalhes sobre representacao de caracteres: http:/ / www.ime.usp.br/ ~ pf/ algoritmos/ aulas/ char.html Para detalhes sobre representao de nmeros: inteiros ( int) http:/ / www.ime.usp.br/ ~ pf/ algoritmos/ aulas/ int.html ponto flutuante ( float, double) http:/ / en.wikipedia.org/ wiki/ Floating_point http:/ / en.wikipedia.org/ wiki/ Double_precision http:/ / en.wikipedia.org/ wiki/ IEEE_754

Para detalhes sobre o padro ANSI C: Jones, Derek M. (2008) "The New C Standard: An Economic and Cultural Commentary."

Exerccios1. Faa por completo a atividade 1 2. Faa por completo a atividade 2 3. Utilizando os TIPOS inteiros em C, escreva programas para: a. Dado um nmero inteiro positivo n, calcular a soma dos n primeiros nmeros naturais. b. Dado um nmero inteiro positivo n, imprimir os n primeiros naturais mpares. Exemplo: Para n= 4 a sada dever ser 1,3,5,7. c. Dados n e dois nmeros inteiros positivos i e j diferentes de 0, imprimir em ordem crescente os n primeiros naturais que so mltiplos de i ou de j e ou de ambos. Exemplo: Para n = 6 , i = 2 e j = 3 a sada dever ser : 0,2,3,4,6,8. d. Dizemos que um nmero natural triangular se ele produto de trs nmeros naturais consecutivos. Exemplo: 120 triangular, pois 4.5.6 = 120. Dado um inteiro no-negativo n, verificar se n triangular. e. Dado um inteiro positivo p, verificar se p primo. f. Dados trs nmeros naturais, verificar se eles formam os lados de um tringulo retngulo. 4. Utilizando os TIPOS ponto flutuante em C, faa programas para os seguintes enunciados: a. Um programa que leia uma temperatura em graus celsius e a converta para fahrenheit. b. Uma pessoa aplicou um capital de x complexos (1) a juros mensais de z durante 1 ano. Deseja-se um programa que determine o montante de cada ms durante este perodo. c. Dados nmeros reais a, b e c, calcular as razes de uma equao do 2o grau da forma ax^ 2 + b^ x + c = 0. 5. Utilizando o TIPO char, re-escreva os programas anteriores para ao final perguntar ao usrio: deseja processar

outro valor? [s/n]. Se o usurio digitar 's' ou 'S' o programa deve continuar processando uma nova entrada;caso contrrio deve terminar.

Declaraes: Variveis e Classe de Memrialrc , 29 March 2008 (created 24 March 2008)no tags

ObjetivoNa ltima aula, vimos que uma DECLARAO introduz um novo IDENTIFICADOR e associa a este uma interpretao. Dentre as interpretaes possveis, um IDENTIFICADOR pode ser declarado para ser o nome smblico de uma VARIVEL. Neste caso, temos um dos mais importantes tipos de DECLARAO - a DECLARAO de VARIVEIS. Nesta aula, nosso objetivo estudar: a forma geral de DECLARAES de VARIVEIS em C a noo de CLASSE de MEMRIA associada a uma VARIVEL

Variveis

12 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

VARIVEIS so abstraes de locais de armazenamento de dados. Os dados armazenados em uma VARIVEL podem mudar ao longo da execuo de um programa. Da o nome VARIVEL. Uma VARIVEL possui dois atributos principais: um TIPO de DADO : determina o significado dos valores achados em uma VARIVEL. uma CLASSE de MEMRIA (ou CLASSE de ARMAZENAMENTO) : determina o tempo de vida e a rea de memria na qual a VARIVEL alocada. Variveis tambm podem ter: um TIPO de ACESSO : determinam a maneira como as variveis podem ser acessadas ou modificadas.

Variveis podem ser declaradas tanto fora quando dentro de funes. No primiro caso as variveis so ditas GLOBAIS; no segundo caso, LOCAIS.

Declarao de VariveisEm C, uma DECLARAO de VARIVEL assume a seguinte forma geral:

ESPEC-DECLARAO DECLARADOR-1 = INICIALIZADOR-1, ..., DECLARADOR-n = INCIALIZADOR-n;Onde: ESPEC-DECLARAO e cada DECLARADOR-i so obrigatrios; cada = INICIALIZADOR-i opcional.

ESPEC-DECLARAO uma sequncia composta de pelo menos um dentre trs categorias de ESPECIFICADOR: ESPECIFICADOR do TIPO de DADO; int, char, float, double e seus MODIFICADORES long, short, signed e unsigned ESPECIFICADOR da CLASSE de MEMRIA; auto, register, static e extern ESPECIFICADOR do TIPO de ACESSO; const e volatile

A forma mais simples de um DECLARADOR um IDENTIFICADOR. Nesta aula, iremos considerar como DECLARADOR apenas IDENTIFICADORES. Um INICIALIZADOR, de maneira geral, consiste em uma EXPRESSO.

Ambiente de Execuo CEm C, h quatro locais onde uma varivel pode ser alocada: na REA de DADOS ESTTICA na PILHA de EXECUO em REGISTRADORES no HEAP

13 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Especificadores da Classe de MEMRIAEm C, h quatro PALAVRAS RESERVADAS que funcionam como ESPECIFICADORES da CLASSE de MEMRIA durante a DECLARAO de uma VARIVEL:

auto - define variveis automticas na PILHA de EXECUOso sempre variveis locais a um BLOCO e que so descartados na sada do BLOCO;

register - define variveis automticas em REGISTRADORESso sempre variveis locais a um BLOCO e que so descartados na sada do BLOCO;

staticpodem ser variveis locais a um BLOCO ou externas a todos os BLOCOS retm seus valores durante toda execuo do programa pois so alocadas na REA de DADOS ESTTICA quando em DECLARAES LOCAIS, DEFINE variveis estticas (escopo de BLOCO) quando em DECLARAES GLOBAIS, DEFINE variveis estticas com ligao interna (escopo de UNIDADE DE COMPILAO)

externpodem ser variveis locais a um BLOCO ou externas a todos os BLOCOS quando em DECLARAES LOCAIS, DECLARA variveis estticas que foram definidas fora do BLOCO das declaraes quando em DECLARAES GLOBAIS, DECLARA variveis estticas com ligao externa, i.e, que foram definidas fora da UNIDADE DE COMPILAO das declaraes

Observao um BLOCO qualquer parte de um programa delimitada por { } ; um BLOCO pode ser o corpo de funo bem como o corpo de um comando composto como if, while, etc.

A seguir ilustram-se a utilizao de Variveis auto, register e static LOCAIS. Variveis static GLOBAIS e variveis

extern sero discutidas em aulas futuras.

Atividade 1: Variveis auto e registerPara ilustrar o uso de auto e register, compile e execute o programa abaixo.

14 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* teste_fat.c ( rev 1.1 ) **/ /* funo fat: calcula fatorial de x **/ unsigned long fat(unsigned short x) { register int i; /* acesso o mais rpido possvel; se no possvel em pilha */ unsigned long ret; /* alocada na pilha; se possvel acesso o mais rpido possve ret = 1; for ( i = 1; i 12, fat(n) estoura a representao unsigned long int assim, uma primeira medida deve ser barrar o clculo de fat(n) para n> 12 dado que o nmero de valores possveis pequeno, uma segunda idia armazenar os valores j calcular para evitar repetir clculos em chamadas futuras.

15 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* teste_fat.c **/

(rev 1.2)

/* funo fat: para x 12, retorna 0 **/ unsigned long fat(unsigned short x) { register int i; static unsigned long ret[13]; if ( x > 12 ) return 0; if ( ret[x] != 0 ) return ret[x]; ret[x] = 1; for ( i = 1; i B ----------------0 0 1 0 1 1 1 0 0 1 1 1OU EXCLUSIVO

A B A OUEXCL B ----------------0 0 0 0 1 1 1 0 1 1 1 0

Nesta atividade, implemente estes dois operadores como duas funes em C!

int implica(int a, int b) { ... } int ouexcl(int a, int b) { ... }

27 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Aps criar as funes acima, teste-as por meio da funo main abaixo:

int main() { printf("teste printf("%i -> printf("%i -> printf("%i -> printf("%i ->

implica:\n" %i = %i\n", %i = %i\n", %i = %i\n", %i = %i\n",

1, 3, 0, 0,

7, 0, 1, 0,

implica(1,7)); implica(3,0)); implica(0,1)); implica(0,0));

printf("teste ouexcl:\n" printf("%i xor %i = %i\n", printf("%i xor %i = %i\n", printf("%i xor %i = %i\n", printf("%i xor %i = %i\n", }

3, 1, 0, 0,

4, 0, 5, 0,

ouexcl(3,4)); ouexcl(1,0)); ouexcl(0,5)); ouexcl(0,0));

Leituras RecomendadasCCT captulo 2 K&R captulos 2 http:/ / pt.wikipedia.org/ wiki/ Operadores_em_C_e_C% 2B% 2B http:/ / www.mspc.eng.br/ info/ cpp_oper_10.shtml

Exerccios1. Diga a ordem de clculo e o resultado das expresses constantes abaixo: a. x = 5 * 4 / 6 + 7 ; b. x = 5 * 4.0 / 6 + 7 ; c. x = 5 * 4 % 6 + 7 ; d. x = ((4 / 2) + (3.0 * 5)) ; e. x = 3 + 2* 4% 3/ 2 1 ; f. x = 3 > = 2 && ! 2 | | 0 ; g. x = 2 && 0 | | 1 ; 2. Escreva um programa que imprima a tabela verdade da funcao ou exclusivo. 3. Escreva um programa que leia um ngulo em segundos e imprima quantos graus, minutos e segundos h neste ngulo. 4. Escreva um programa que leia um tempo em segundos e imprima quantas horas, minutos e segundos h neste tempo. 5. Escreva um programa que leia um comprimento em centmetros e imprima quantos metros, decmetros e centmetros h neste comprimento.

Operadores e Expresses: bit-a-bit e especiaislrc , 10 April 2008 (created 31 March 2008)no tags

ObjetivosEm C, OPERADORES e EXPRESSES podem ser classificados em cinco grande categorias: Atribuies Aritmticos Lgicos e Relacionais Bit-a-Bit Especiais Na ltima aula, disticutimos as trs primeiras categorias acima. HOJE, iremos dar prosseguimento ao estudo apresentado os OPERADORES e EXPRESSES:

28 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Bit-a-Bit Especiais Ao final, concluiremos o assunto mostrando um quadro que resume e compara os OPERADORES da linguagem C por ordem de precedncia e associatividade.

Manipulao de BitsOPERADORES e EXPRESSES de manipulao de bits ( bit-a-bit ) referem-se a testar, atribuir ou deslocar os bits efetivos em um byte ou palavra que correspondem aos tipos bsicos char, int e variantes. OBS.: Operaes bit-a-bit no podem ser feitas sobre float, double, long double, void ou outros tipos mais complexos.

Significados: Os operadores &, | e ~ tm a mesma tabela verdade que &&, || e ! (respectivamente), com a diferena que operam sobre os bits individuais da representao de dois nmeros (ou apenas um, no caso de ~) e no sobre expresses numricas. o operador ^ tem a mesma tabela verdade que a funo xor() discutida na aula passada (novamente operando sobre bits individuais e no sobre expresses numricas). o operador >> desloca os bits de um nmero k casas para esquerda fazendo com que os k bits mais esquerda se percam e os k bits mais direita sejam '0' o operador ): Considere:

unsigned int

x = 7;

Se pudssemos olhar a representao do valor 7 (decimal) 'dentro' da varivel x, veramos os seguinte padro de bits: x =

0...00000111 ( a quantidade total de bits depende de quantos bytes so utilizados para armazenar um unsigned int, quantidade que depende da mquina alvo e compilador ).A EXPRESSO abaixo (deslocamento esquerda):

x = x k, resulta em:x = | 0 | 0 | ... | 0 | 0 | 0 | bn-1 | bn-2 | ... | bk-1 | bk | onde a seq. inicial de '0's contm k '0's

Exemplo 2 ( ~): Continuando o exemplo anterior, tem-se x = 0...00011100. A EXPRESSO abaixo ( complemento de 1 ):

x = ~ x;tem o seguinte efeito na representao de x em binrio: x = 1...11100011 . Ou seja, os bits que so '0' passam a ser '1', os que so '1' tornam-se '0'. Exemplo 3 ( |): Continuando o exemplo anterior, tem-se x = 1...11100011. A EXPRESSO abaixo ( OR ):

x =

x | 8 ;

transforma x em : x = 1...11101011 . Quer dizer, muda o quarto bit (da direita para a esquerda) de '0' para '1'. Isto acontece por que:

x 4

= 1...11100011 = 0...00001000 -------------x | 4 = 1...11101011

/* OU bit a bit */

| frequentemente utilizado para LIGAR bits particulares

Exemplo 4 ( &): Continuando o exemplo anterior, tem-se x = 1...11101011. A EXPRESSO abaixo ( AND ):

x =

x & 0xf...f7 ;

transforma x em : x = 1...11100011 . Quer dizer, muda o quarto bit (da direita para a esquerda) de '1' para '0'. Isto acontece por que:

x 0xf...f7

= 1...11101011 = 1...11110111 -------------x | 0xf...f7 = 1...11100011

/* AND bit a bit */

& frequentemente utilizado para DESLIGAR bits particularesAplicaes Tpicas: rotinas de SO, drivers de dispositivos criptografia compactao de dados

Atividade 1Tendo em vista os significados de | e & que so, respectivamente, similares aos de || e &&, descreva - atravs de um exemplo - o significado de ^ que similar funo xor() descrita na ltima aula.

Atividade 2

30 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Uma tabela binria uma tabela (matriz linhas x colunas ) onde cada clula armazena um dentre dois valores possveis. Por exemplo, a Freqncia deste curso em essncia uma tabela binria uma vez que cada clula s pode conter ou '0' (presente) ou '2' (ausente). Uma maneira simples de representar uma tabela binria atravs da seguinte estrutura:

char tabela1[40][10];Nesta representao so gastos : 40* 10 = 400 bytes ( sizeof char = 1 byte ). Uma maneira mais eficiente (do ponto de vista da quantidade de memria utilizada) seria utilizar um mapa de bits para armazenar a tabela binria. Tal mapa de bits uma sequencia de bits mantidas pelos operadores bit a bit. Para a tabela acima de 40 linhas por 10 colunas poderamos ter a seguinte declarao:

char tabela2[ (40*10) / 8 ];Nesta representao so gastos : (40* 10)/ 8 = 50 bytes. A idia aqui , ao invs de usar um char (1 byte) para armazenar 0 ou 1, usar um bit individual dentro de um char. Vejamos como isto pode ser feito. Atribuindo valor a uma determinada clula ( linha,coluna) Na primeira representao acima, uma dada clula pode ter seu valor modificado da seguinte maneira:

tabela1 [3][5] = 0; tabela1 [7][5] = 2;

/* aluno 3 esteve presente */ /* aluno 7 faltou */

Na segunda representao acima, o mesmo processo tem de ser simulado atravs de uma funo:

void set(unsigned x, unsigned y, int val) { unsigned pos = ( x* 10 + y ) / 8; unsigned des = ( x* 10 + y ) % 8; if (val) tabela2[pos] |= ( 1 size +1 ) when the list size equals LIST_MAX_SIZE when str is greater than LINE_MAX_SIZE

list_add(const char * str, unsigned short pos) { sprintf(xcpt_cmsg,"@%s[%d]\n> list_ins (\"%s\",%d);\n", __FILE__,__LINE__,str,pos); if ( pos > size + 1 ) { THROW(INDEX_OUT_OF_BOUNDS_XCPT,xcpt_cmsg); return ; } if ( size + 1 > LIST_MAX_SIZE ) { THROW(LIST_FULL_XCPT,xcpt_cmsg); return ; } if ( strlen(str) > LINE_MAX_SIZE ) { THROW(LINE_TOO_LONG_XCPT,xcpt_cmsg); } if ( pos == 0 ) { strncpy(list[size],str,LINE_MAX_SIZE); } else { int i; for ( i = size ; i >= pos; i-- ) strcpy(list[i],list[i-1]);

59 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

xcpt.h, xcpt.c

/* xcpt.h, Rev. 1.1 (c) 2007, Luciano R. Coutinho Implements an exception handling mechanism inspired in Java. **/ #ifndef XCPT_H #define XCPT_H #define XCPT_NAME_MAX_SIZE #define XCPT_CMSG_MAX_SIZE #define THROW(e,m) #define TRY(f) #define CATCH(e,m) #define #define #define #define #define 32 1024

__throw((e),(m)) __begin_try();f;__end_try(); if(m=__catch(e)) "null pointer" "index out of bounds" "overflow" "underflow" "illegal argument"

NULL_POINTER_XCPT INDEX_OUT_OF_BOUNDS_XCPT OVERFLOW_XCPT UNDERFLOW_XCPT ILLEGAL_ARGUMENT_XCPT

void void const char * void #endif

__begin_try(void); __end_try(void); __catch(const char *name); __throw(const char *name, const char *cmsg);

60 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* xcpt.c, Rev. 1.1 (c) 2007, Luciano R. Coutinho Implements an exception handling mechanism inspired in Java. **/ #include #include #include #include "xcpt.h"

static char xcpt_name[XCPT_NAME_MAX_SIZE + 1]; static char xcpt_cmsg[XCPT_CMSG_MAX_SIZE + 1]; static int trying; /* Sets try_flag. **/ void __begin_try(void) { trying = 1; } /* UnSets try_flag. **/ void __end_try(void){ trying = 0; } /* From exception name, gets the exception message thown by __throw(n,m). Once cautch, the exception name is cleared . **/ const char * __catch(const char * name) { if ( strcmp(xcpt_name,name) == 0 ) { xcpt_name[0] = '\0'; return xcpt_cmsg; } else return NULL; } /* Stores an exception contextual message. When called outside a __begin_try(); ...; __end_try(); pair, the exception message is also printed to the stderr stream . **/ void __throw(const char * name,const char * cmsg) { strncpy(xcpt_name,name,XCPT_NAME_MAX_SIZE); strncpy(xcpt_cmsg,cmsg,XCPT_CMSG_MAX_SIZE); if ( !trying ) fprintf(stderr,"exception: %s: %s\n",xcpt_name,xcpt_cmsg); }

61 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Leitura recomendadaCCT Cap 5

Exerccios1. Termine a atividade 1 acima, escrevendo as funes:

list_rem() list_get() list_set()

Exemplo: Lista de Stringslrc , 20 May 2008 (created 20 May 2008) Dado o cdigo abaixo (que pode ser obtido como projeto Dev-Cpp neste link), complemente o cdigo do arquivo lista.c escrevendo as funes:no tags

list_rem() list_get() list_set()

main.c

62 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* main.c **/ #include #include #include #include "list.h" "xcpt.h"

int main(int argc, char *argv[]) { while (1) { char str[1024]; int pos; const char * xc; printf("\nAdicionar\n"); printf(" printf(" pos = "); scanf("%d",&pos); str = "); gets(str); gets(str);

list_add(str,pos); /* TRY(list_add(str,pos)); CATCH(INDEX_OUT_OF_BOUNDS_XCPT,xc) printf("\npos invalida!\n"); CATCH(LIST_FULL_XCPT,xc) printf("\nlista cheia!\n"); CATCH(LINE_TOO_LONG_XCPT,xc) printf("\nstr muito grande!\n"); */ printf("\nLista\n"); list_print(); } }

list.h, list.c

63 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* list.h, Rev. 1.1 (c) 2007, Luciano R. Coutinho Implements a list of strings. **/ #ifndef LIST_H #define LIST_H #define LIST_MAX_SIZE #define LINE_MAX_SIZE 99 60

#define LIST_FULL_XCPT "list full" #define LINE_TOO_LONG_XCPT "line too long" unsigned short list_size(void); void char * void char * void #endif list_add(const char * str, unsigned short pos); list_rem(unsigned short pos); list_set(const char * str, unsigned short pos); list_get(unsigned short pos); list_print(void);

64 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* list.c, Rev. 1.1 (c) 2007, Luciano R. Coutinho Implements a list of strings. **/ #include #include #include #include #include "list.h" "xcpt.h"

/** private data */ static char list[LIST_MAX_SIZE][LINE_MAX_SIZE+1]; static unsigned short size = 0; static char xcpt_cmsg[XCPT_CMSG_MAX_SIZE+1];

/** public functions */ unsigned short list_size(void) { return size; } /* Add a new element str in the list at a given position pos. From pos to the end of the list, all existing elements are shifted right. Throws: INDEX_OUT_OF_BOUNDS_XCPT LIST_FULL_XCPT LINE_TOO_LONG_XCPT **/ void when pos is invalid ( > size +1 ) when the list size equals LIST_MAX_SIZE when str is greater than LINE_MAX_SIZE

list_add(const char * str, unsigned short pos) { sprintf(xcpt_cmsg,"@%s[%d]\n> list_ins (\"%s\",%d);\n", __FILE__,__LINE__,str,pos); if ( pos > size + 1 ) { THROW(INDEX_OUT_OF_BOUNDS_XCPT,xcpt_cmsg); return ; } if ( size + 1 > LIST_MAX_SIZE ) { THROW(LIST_FULL_XCPT,xcpt_cmsg); return ; } if ( strlen(str) > LINE_MAX_SIZE ) { THROW(LINE_TOO_LONG_XCPT,xcpt_cmsg); } if ( pos == 0 ) { strncpy(list[size],str,LINE_MAX_SIZE); } else { int i; for ( i = size ; i >= pos; i-- ) strcpy(list[i],list[i-1]);

65 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

xcpt.h, xcpt.c

/* xcpt.h, Rev. 1.1 (c) 2007, Luciano R. Coutinho Implements an exception handling mechanism inspired in Java. **/ #ifndef XCPT_H #define XCPT_H #define XCPT_NAME_MAX_SIZE #define XCPT_CMSG_MAX_SIZE #define THROW(e,m) #define TRY(f) #define CATCH(e,m) #define #define #define #define #define 32 1024

__throw((e),(m)) __begin_try();f;__end_try(); if(m=__catch(e)) "null pointer" "index out of bounds" "overflow" "underflow" "illegal argument"

NULL_POINTER_XCPT INDEX_OUT_OF_BOUNDS_XCPT OVERFLOW_XCPT UNDERFLOW_XCPT ILLEGAL_ARGUMENT_XCPT

void void const char * void #endif

__begin_try(void); __end_try(void); __catch(const char *name); __throw(const char *name, const char *cmsg);

66 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* xcpt.c, Rev. 1.1 (c) 2007, Luciano R. Coutinho Implements an exception handling mechanism inspired in Java. **/ #include #include #include #include "xcpt.h"

static char xcpt_name[XCPT_NAME_MAX_SIZE + 1]; static char xcpt_cmsg[XCPT_CMSG_MAX_SIZE + 1]; static int trying; /* Sets try_flag. **/ void __begin_try(void) { trying = 1; } /* UnSets try_flag. **/ void __end_try(void){ trying = 0; } /* From exception name, gets the exception message thown by __throw(n,m). Once cautch, the exception name is cleared . **/ const char * __catch(const char * name) { if ( strcmp(xcpt_name,name) == 0 ) { xcpt_name[0] = '\0'; return xcpt_cmsg; } else return NULL; } /* Stores an exception contextual message. When called outside a __begin_try(); ...; __end_try(); pair, the exception message is also printed to the stderr stream . **/ void __throw(const char * name,const char * cmsg) { strncpy(xcpt_name,name,XCPT_NAME_MAX_SIZE); strncpy(xcpt_cmsg,cmsg,XCPT_CMSG_MAX_SIZE); if ( !trying ) fprintf(stderr,"exception: %s: %s\n",xcpt_name,xcpt_cmsg); }

67 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Alocao Dinmicalrc , 23 June 2008 (created 20 May 2008)no tags

DefinioALOCAO DINMICA o processo atravs do qual um programa pode criar novas variveis (reas de memria) em tempo de execuo. Variveis alocadas dinmicamente so criadas em uma rea de memria livre chamada de HEAP e so acessadas atravs de PONTEIROS.

Funes de Alocao Dinmica em CPadro ANSI#include void * calloc(size_t num, size_t size); Aloca uma quantidade de memria igual a num* size. Isto , aloca memria suficiente para um ARRANJO de num VARIVEIS de tamanho size.Devolve o endereo para o primeiro byte da regio alocada. Se no houver memria suficiente para satisfazer a solicitao, devolvido NULL (endereo nulo).

void * malloc(size_t size);Aloca uma quantidade de memria igual a size. Isto , aloca memria suficiente para uma VARIVEL de tamanho size. Devolve o endereo para o primeiro byte da regio alocada. Se no houver memria suficiente para satisfazer a solicitao, devolvido NULL (endereo nulo).

void * realloc(void * ptr, size_t size);Modifica o tamanho da memria previamente alocada apontada por ptr para um novo tamanho especificado por

size. O valor size pode ser maior ou menor que o original.Retorna o endereo para o primeiro byte da regio de memria redimensionada. Se no houver memria suficiente no HEAP para satisfazer a solicitao, devolvido NULL (endereo nulo) e o endereo originalmente em ptr deixado inalterado.

void free(void * ptr);Devolve ao HEAP a memria apontada por ptr, tornando a memria disponvel para alocao futura. Deve ser chamada somente com um PONTEIRO ptr cujo endereo de memria foi previamente alocado por meio de uma das funes do sistema de alocao dinmica ( calloc(), malloc(), realloc()).

Outras#include char * strdup(const char * pstr); Duplica a STRING apontada por pstr. Ou seja, aloca no HEAP strlen(pstr)+1 bytes e copia a STRING comeando em pstr para o endereo alocado. Retorna o endereo alocado contendo uma cpia da STRING apontada por pstr ou NULL caso no haja memriasuficiente no HEAP.

68 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Ex.: O trecho de cdigo abaixo:

char str[] = "Teste"; char * pstr = strdup(str); equivalente a:

char str[] = "Teste"; char * pstr = calloc(strlen(str) + 1, sizeof char); strcpy(pstr,str);

Atividade 1Utilizando as funes de alocao dinmica em C, iremos agora implementar uma segunda verso do programa lista de strings estudado na aula Ponteiros.

list.h/* list.h, Rev. 1.2 (c) 2007, Luciano R. Coutinho Implements a list of strings. **/ #ifndef LIST_H #define LIST_H unsigned short list_size(void); void char * void char * void #endif list_add(const char * str, unsigned short pos); list_rem(unsigned short pos); list_set(const char * str, unsigned short pos); list_get(unsigned short pos); list_print(void);

list.c

69 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* list.c, Rev. 1.3 (c) 2007, Luciano R. Coutinho Implements a list of strings. **/ #include #include #include #include #include "list.h" "xcpt.h"

/** private data */ static char ** list; static unsigned short static

size = 0;

char xcpt_cmsg[XCPT_CMSG_MAX_SIZE+1];

/** public functions */ unsigned short list_size(void) { return size; } /* Add a new element str in the list at a given position pos. From pos to the end of the list, all existing elements are shifted right. Throws: INDEX_OUT_OF_BOUNDS_XCPT NULL_POINTER_XCPT **/ void when pos is invalid ( > size +1 ) when there is no memory available to add a new element to the list.

list_add(const char * str, unsigned short pos) { char * line = strdup(str); sprintf(xcpt_cmsg,"%s, %d: list_ins (\"%s\",%d);",__FILE__,__LINE__,str,pos) if ( line == NULL ) { THROW(NULL_POINTER_XCPT,xcpt_cmsg); return ; } if ( pos > size + 1 ) { THROW(INDEX_OUT_OF_BOUNDS_XCPT,xcpt_cmsg); return ; } if ( size % 10 == 0 ) { char ** aux = (char **) realloc(list,(size + 10)*(sizeof (char**))); if ( aux == NULL ) { THROW(NULL_POINTER_XCPT,xcpt_cmsg); return ; } list = aux; }

70 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Exerccios1. Conclua a Atividade 1 implementando as funes:

char * list_rem(unsigned short pos); void list_set(const char * str, unsigned short pos); char * list_get(unsigned short pos); 2. Teste a nova implementao de list.h e list.c com o mesmo arquivo main.c apresentado na aula Ponteiros.

Vetores para Ponteiros, Ponteiros para Vetores e Ponteiros para Ponteiroslrc , 20 May 2008 (created 20 May 2008) Considere as declaraes:no tags

int * x [10]; int (* y)[10]; int * * z;Questes: O que significam? Quais dos usos abaixo so vlidos?

int i,j,k[10],l[10][5],m[5][10]; x[1] = &i; x[3] = j; x[5] = k; x[7] = k[2]; x[9] = k + 5; x[0] x[2] x[4] x[6] x[8] = = = = = l[1]; l + 1; m[1]; &l[3][2]; m[3] + 2;

y = &i; y = k; y[2] = k; y = &k; y y y y = = = = l; m; l[1]; m + 2;

z = k; z = l; z = m;

ExercciosSeja o seguinte trecho de programa:

71 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

int i=3,j=5; int *p, *q; p = &i; q = &j;Qual o valor das seguintes expresses ?

p == &i *p - *q **&p 3* - *p/(*q)+7Qual ser a sada do programa abaixo supondo que i ocupa o endereo 4094 na memria?

main() { int i=5, *p; p = &i; printf( %x %d }Qual o resultado do seguinte programa?

%d

%d

%d \n , p,*p+2,**&p,3**p,**&p+4);

#include #include void main(){ float vet[5] = {1.1,2.2,3.3,4.4,5.5}; float *f; int i; f = vet; printf("contador/valor/valor/endereco/endereco"); for(i = 0 ; i = LAR_MAX || y >= ALT_MAX ) { printf("erro: Max x = %hu e Max y = %hu\n", LAR_MAX -1, ALT_MAX -1); continue; } printf(" c = "); scanf(" %c" ,&c); asciimap[y][x] = c; printf("Outro? [sim|nao]\n"); scanf("%s",opc); } } void imprimir(char asciimap[ALT_MAX][LAR_MAX]) { int x,y; for( y=0; y < ALT_MAX; y++ ) { for( x=0; x < LAR_MAX; x++ ) printf("%c",asciimap[y][x]); printf("\n"); } }

76 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* asciimap-teste.c */ #include "asciimap.h" main() { char map[ALT_MAX][LAR_MAX]; memset(map,' ',LAR_MAX * ALT_MAX); ler_pontos(map); imprimir(map); }

Atividade 2 : retangulo1. crie um projeto C e salve com o nome de retangulo 2. crie os arquivos abaixo no projeto retangulo

/* retangulo.h */ #include "asciimap.h" struct ponto { unsigned short x,y; char c; }; struct retangulo { struct ponto ini; unsigned short dx,dy; }; #define min(a,b) ((a) < (b) ? (a) : (b))

void desenhar(char asciimap[ALT_MAX][LAR_MAX], struct retangulo ret);

77 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* retangulo.c */ #include "retangulo.h" void desenhar(char asciimap[ALT_MAX][LAR_MAX], struct retangulo ret) { int x,xf,y,yf; xf = min(ret.ini.x + ret.dx, LAR_MAX); for ( x = ret.ini.x ; x < xf; x++ ) asciimap[ret.ini.y][x] = ret.ini.c; yf = min(ret.ini.y + ret.dy, ALT_MAX); for ( y = ret.ini.y; y < yf; y++ ) asciimap[y][ret.ini.x] = ret.ini.c; if ( ret.ini.y + ret.dy nxt ) { if ( strcmp(ptr->str,str) == 0 ) return; ptr = ptr->nxt; } ptr->nxt = (Item *) malloc(sizeof (Item)); ptr->nxt->prv = ptr; ptr = ptr->nxt; } ptr->str = strdup(str); ptr->fun = fun; /** ATRIBUICAO PONTEIRO FUNCAO **/ ptr->sub = NULL; ptr->sup = NULL; ptr->nxt = NULL; }

... { ... case ENTER: if ( menu_sel->fun ) (*(menu_sel->fun))(); else ... }

/** CHAMADA FUNCAO VIA PONTEIRO **/

81 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

#define #define #define #define #define #define union

ENTER ESC RTARR LTARR UPARR DWARR

13 27 77 75 72 80

u_type{ int i; char ch;

} ich;

void loopMenu() { while ( 1 ) { ich.i = getch(); switch ( ich.ch ) { case ENTER: ....

CDIGO COMPLETOO cdigo abaixo implementa um sistema de menus para um programa de controle acadmico.

82 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/** main.c */ #include #include #include "menu.h"

void f() { printf("function activation!"); getch(); } extern Item * menu; extern Item * menu_sel; extern int sub_items_visible; int main(int argc, char *argv[]) { addMenuItem("CADASTRO",NULL); addMenuItem("MATRICULA",NULL); addMenuItem("RELATORIO",NULL); addMenuSubItem("CADASTRO","Alunos",f); addMenuSubItem("CADASTRO","Professores",f); addMenuSubItem("CADASTRO","Disciplinas",f); addMenuSubItem("MATRICULA","Matriculas",f); addMenuSubItem("MATRICULA","Turma",f); loopMenu(); return 0; }

#ifndef MENU_H #define MENU_H typedef struct char * void(* struct struct struct struct } Item; item { str; fun)(void); item * sub; item * sup; item * nxt; item * prv;

void addMenuItem (const char * str, void(* fun)(void)); void addMenuSubItem (const char * str_i,const char * str_si, void(* fun)(void)); void loopMenu(void); #endif

83 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/** menu.c */ #include #include #include #include #include "buffer.h" "menu.h"

Item * menu; Item * menu_sel; int sub_items_visible;

void addMenuItem (const char * str, void(* fun)(void)) { Item * ptr; if ( menu == NULL ) { menu = (Item *) malloc(sizeof (Item)); ptr = menu; ptr->prv = NULL; } else { ptr = menu; while ( ptr->nxt ) { if ( strcmp(ptr->str,str) == 0 ) return; ptr = ptr->nxt; } ptr->nxt = (Item *) malloc(sizeof (Item)); ptr->nxt->prv = ptr; ptr = ptr->nxt; } ptr->str = strdup(str); ptr->fun = fun; ptr->sub = NULL; ptr->sup = NULL; ptr->nxt = NULL; } void addMenuSubItem (const char * str_i,const char * str_si, void(* fun)(void)) { Item * ptr; ptr = menu; while ( ptr ) { if ( strcmp(ptr->str,str_i) == 0 ) break; ptr = ptr->nxt; } if ( ptr == NULL ) return; if ( ptr->sub == NULL ) { ptr->sub = (Item *) malloc(sizeof (Item)); ptr->sub->prv = NULL; ptr->sub->sup = ptr; ptr = ptr->sub; } else { ptr = ptr->sub;

84 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/** buffer.h */ #ifndef BUFFER_H #define BUFFER_H void clearBuf(void); void xyputs(unsigned short x, unsigned short y, const char * str); void displayBuf(void);

#endif

85 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/** buffer.c */ #include #include #include #define BUFW #define BUFH 80 24

char buf[BUFH][BUFW]; void clearBuf(void){ int x,y; for( y = 0; y < BUFH; y++ ) { for( x = 0; x < BUFW; x++ ) buf[y][x] = ' '; } } void xyputs(unsigned short x, unsigned short y, const char * str) { x %= BUFW; y %= BUFH; for ( ; *str ; str++ ) { switch( *str ) { case '\n' : x = 0, y = (y + 1) % BUFH; break; case '\b' : if ( x == 0 ) { x = BUFW - 1; y = y == 0 ? BUFH - 1 : y -1; } else x --; break; default : buf[y][x] = *str; x = (x+1)%BUFW; y = x == 0 ? (y+1)%BUFH : y; } } } void displayBuf(void) { //fseek(stdout,sizeof buf,SEEK_END); system("cls"); fwrite(&buf,sizeof buf ,1,stdout); }

Enumeraes e Campos de Bitslrc , 23 June 2008 (created 23 June 2008)

86 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

no tags

EnumeraesUma enumerao uma extenso da linguagem C acrescentada pelo padro ANSI. Uma enumerao uma declarao de um novo tipo de dados que consiste em um conjunto de constantes inteiras que especficam todos os valores legais que uma varivel desse tipo pode ter. Enumeraes so definidas de forma semelhante a estruturas; no entanto, utiliza-se a palavra-chave enum para assinalar o incio de um tipo de enumerao. FORMA GERAL:

enum identificador { Simbolo_1, Simbolo_2, ... Simbolo_n } var_1, var_2, ..., var_n;

Em uma enumarao cada Simbolo_i representa um valor inteiro. Cada smbolo recebe um valor maior em uma unidade do precedente. Por default, o valor do primeiro smbolo 0. No entanto, voc pode especificar o valor de um ou mais smbolos usando um inicializador. O smbolos que aparecem aps os inicializadores recebem valores maiores que o da inicializao precedente.

Exemplosenum dt_wday { Sunday Monday Tuesday Wednsday Thursday Friday Saturday }; enum dt_month{ January = 1 February Mars April May June July August September October November December };

, , , , , ,

, , , , , , , , , , ,

Campos de Bits

87 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Exemplostruct { unsigned unsigned unsigned unsigned } bitf; mday : 5; month: 4; year :22; isBCE: 1;

Exemplo CompletoO programa abaixo ilustra todos os mecanismos de definio de novos tipos estruturados pelo usurio: estruturas struct definio de novos nomes para tipos typedef enumeraes enum unies union campos de bits struct Alm disso, o exemplo tambm aborda o uso de funes da biblioteca . Para o entedimento do exemplo que trata de datas do calendrio gregoriano voc pode consultar: http:/ / en.wikipedia.org/ wiki/ Gregorian_calendar Para implementao do algoritmo DOOMSDAY para o clculo do dia da semana de uma data, consulte: http:/ / en.wikipedia.org/ wiki/ Doomsday_algorithm

88 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/** date.h Author: Luciano R. Coutinho, 2007. [email protected] */ #ifndef DATE_H #define DATE_H #include /* * A type for storing dates in the range: * from Jan 1st , year 2^22 BCE * to Dec 31th, year 2^22 */ #if ( UINT_MAX < 0xffffffff ) typedef long date_t; #else typedef int date_t; #endif enum dt_wday { Sunday Monday Tuesday Wednsday Thursday Friday Saturday }; enum dt_month{ January = 1 February Mars April May June July August September October November December }; struct dt { enum dt_wday unsigned unsigned unsigned unsigned enum dt_month long unsigned long };

, , , , , ,

, , , , , , , , , , ,

wday; mday; yday; mweek; yweek; month; year; isBCE; serial;

/* /* /* /* /* /* /* /* /*

day of the week : 0 .. day of the month : 1 .. days since Jan. 1 : 1 .. week of the month : 0 .. week of the year : 0 .. month : 1 .. year : -2^22 .. is Before Common Era ? number of days

6 31 366 5 53 12 2^22

*/ */ */ */ */ */ */ */ */

date_t date_t

date(date_t *); mkdate(struct dt *);

/* get current date */ /* code struct dt* in a date_t */

89 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

90 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/** date.c Author: Luciano R. Coutinho, 2007. [email protected] */ #include #include #include #include "date.h"

union date_t { date_t ival; struct { unsigned unsigned unsigned unsigned } bitf; }; /* Global Shared */ static static int 0 , /* 31, /* 28, /* 31, /* 30, 31, 30, 31, 31, 30, 31, 30, 31 /* };

mday : 5; month: 4; year :22; isBCE: 1;

struct dt dt_buf; num_days[13] = { skiped */ January */ February */ Mars */

December */

/* Functions */ date_t date(date_t * d) { time_t now = time(NULL); struct tm *tm_now = localtime(&now); union date_t ud; ud.bitf.mday = ud.bitf.month= ud.bitf.year = ud.bitf.isBCE= tm_now->tm_mday; tm_now->tm_mon + 1; tm_now->tm_year + 1900; 0;

if ( d ) *d = ud.ival; return ud.ival; } /* Gregorian Calendar

91 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

#include #include #include "date.h" union date_t { date_t ival; struct { unsigned unsigned unsigned unsigned } bitf; }; char

mday : 5; month: 4; year :22; isBCE: 1;

* wday_name[] = { "Seguinda", "Terca", "Quarta", "Quinta", "Sexta", "Sabado" }

int main(int argc, char *argv[]) { union date_t ud; date_t d; struct dt *sd; d = date(NULL); printf("hoje representado no tipo date_t: %ld\n",d); sd = gcdate(d); printf("hoje decomposto\t\t\t: %d %2d/%2d/%4d\n",sd->wday,sd->mday,sd->month,sdud.bitf.mday = 7; ud.bitf.month = September; ud.bitf.year = 1822; ud.bitf.isBCE = 0; sd = gcdate(ud.ival); printf("a idependncia ocorreu num(a) %s

\n",wday_name[sd->wday]);

//system("PAUSE"); return 0; }

Exerccios1. Conclua o exemplo date.h/ date.c; Escreva as funes

date_t mkdate(struct dt *); /* code struct dt* in a date_t */ struct dt * gcdate(date_t); /* decode date_t in a struct dt */ struct dt * diffdate(date_t,date_t); /* interval between dates */ size_t strfdate(char*, size_t, const char*, const struct dt*); int printf_date(const char *, const struct dt*); int scanf_date (const char *, const struct dt*);2. Escreva um programa que teste todas as funes criadas acima.

92 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Entrada/ Sada: consolelrc , 23 June 2008 (created 23 June 2008)no tags

Lendo e Escrevendo Caracteres#include int getchar(void); int putchar(int c); #include int getch(void) int getche(void)

Lendo e Escrevendo Strings#include char * gets(char *str); int puts(const char *str);

Exemplo 1

#include #include

main() { char ch; printf("Digite algum texto (termine com ponto para sair)\n"); do { ch = getchar(); if ( islower(ch) ) ch = toupper(ch); else ch = tolower(ch); putchar(ch); } while ( ch != '.' ); }

93 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Atividade 1Refaa o programa acima utilizando getch() e getche().

Entrada/Sada Formatada#include int printf(const char * string_de_controle, ...); int scanf(const char * string_de_controle, ...);

printf(): Formato Geral

printf(): Formato Detalhado

94 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Exemplo 2printf ("\nResultado :%3.2f",num); printf ("Frase : %s\nContador = %x",string,cont); printf ("a : %-5d b : %-5d c : %-5d",a,b,c);

Atividade 1Teste o trecho de cdigo acima em um programa.

scanf(): Formato

95 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Leitura RecomendadaCCT Cap 8. http:/ / www.dee.feis.unesp.br/ graduacao/ disciplinas/ langc/ modulo_linguagemc/ modulo4.htm

Entrada/ Sada: arquivoslrc , 23 June 2008 (created 23 June 2008)no tags

fopen(), fclose()

96 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

#include FILE * fopen(const char * nomearq, const char * modo); int fclose(FILE * fp);

putc(), fputc(), getc(), fgetc()#include int putc(int char, FILE * fp); int fputc(int char, FILE * fp); int getc(FILE * fp); int fgetc(FILE * fp);

Exemplo 1

97 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/** ktod.c */ #include #include int main(int argc, char * argv[]) { FILE * fp; char ch; if ( argc != 2 ) { printf("sintaxe:\n"); printf(" %s NOME_ARQ\n",argv[0]); exit (1); } fp = fopen(argv[1],"w"); if ( fp == NULL ) { printf("O arquivo exit(1); } do { ch = getchar(); putc(ch, fp); } while ( ch != '$' ); fclose(fp); }

%s

no pode ser aberto.\n",argv[1]);

Exemplo 2

98 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/** dtos.c */ #include #include int main(int argc, char * argv[]) { FILE * fp; char ch; if ( argc != 2 ) { printf("sintaxe:\n"); printf(" %s NOME_ARQ\n",argv[0]); exit (1); } fp = fopen(argv[1],"r"); if ( fp == NULL ) { printf("O arquivo exit(1); } ch = getc(fp); while ( ch != EOF ) { putchar(ch); ch = getc(fp); } fclose(fp); }

%s

no pode ser aberto.\n",argv[1]);

fputs() , fgets()#include int fputs(const char * str, FILE * fp); char * fgets(char *str, int length, FILE * fp);

fread() , fwrite()#include size_t fread(void * buffer, size_t num_bytes, size_t count, FILE * fp); size_t fwrite(const void * buffer, size_t num_bytes, size_t count, FILE * fp);

Leitura RecomendadaCCT Cap 9 http:/ / www.dee.feis.unesp.br/ graduacao/ disciplinas/ langc/ modulo_linguagemc/ modulo8.htm

99 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Exerccios1. Refaa os programas dos exemplos 3 e 4 utilizando fputs() e fgets(). 2. Escreva um programa que abra um arquivo texto e conte o nmero de caracteres presentes nele. Imprima o nmero de caracteres na tela. 3. Considere um arquivo de dados do tipo texto com o seguinte contedo:

3 ZE SA 8.5 10.0 ANTONIO SANTOS 7.5 8.5 SEBASTIAO OLIVEIRA 5.0 6.0O arquivo acima apenas um exemplo. Nestes arquivos de alunos a primeira linha contm o nmero de alunos no arquivo. As linhas seguintes contm os seguintes dados: nome do aluno com no mximo 50 caracteres; nota da primeira prova; nota da segunda prova. Escreva um programa que imprima os nomes de todos os alunos que tm a mdia das duas notas menor que 7.0

4. Escreva um programa que grave os dados lidos no exerccio anterior em um arquivo do tipo binrio de acesso aleatrio. O nmero que indica quantos alunos devem ser lidos (primeira linha do arquivo) no deve ser gravado no arquivo binrio. Nesta questo os dados devem estar obrigatoriamente armazenados em um vetor de estruturas do seguinte tipo:

typedef struc _aluno { char nome[81]; float n1, n2; } ALUNO;

5. Escreva um programa que leia de um arquivo, cujo nome sera fornecido pelo usuario, um conjunto de numeros reais e armazena em um vetor. O tamanho mximo do vetor e dado pela constante TAM_MAX. A quantidade de numeros no arquivo varia entre 0 e TAM_MAX. O programa ao final calcula a media dos numeros lidos. 6. Faa um programa que leia 10 caracteres e armazene em um arquivo 10 cpias de cada um. Exiba o contedo do arquivo. 7. Crie uma funo que receba duas strings como parmetros, uma com um endereo de arquivo e outra com um texto qualquer, e adicione o texto no fim do arquivo. 8. Utilizando a funo do exerccio anterior faa um programa que gere 10 arquivos com o nome "Teste" e extenses "01", ..., "10". Cada um contendo o texto "Texto do arquivo [ NMERO DO ARQUIVO] ". 9. Escreva um programa para armazenar o telefone de 5 amigos atravez da estrutura

struct pessoa{ char nome[50]; int idade; float altura; char telefone[10]; } amigos[5];a ser preenchida pelo usurio antes do armazenamento de cada registro. 10. Faa um programa que leia os dados do arquivo gerado no exerccio anterior e salve-os num novo arquivo utilizando uma sada formatada.

100 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

FORMATO: -------[nome] tem [idade] anos e [altura] de altura. Tel.: [telefone]. --------

11. Escreva um programa que leia um arquivo texto contendo linhas de dados. Em cada linha do arquivo h o nome de um aluno e duas notas. Estes dados esto separados por ponto e vrgula. Existe um ponto e vrgula ao final de cada linha. O formato dos dados e o seguinte:

ze sa; 10.0; 9.0; antonio silva: 9.0; 7.0;O programa deve ler estes dados e imprimir os valores lidos, a mdia das duas notas e se o aluno foi aprovado ou no (media > = 5). O formato de saida e:

ze sa 10.0 8.0 9.0 aprovado antonio silva 9.0 7.0 8.0 aprovado

12. Faa um programa que ao receber o nome de um arquivo, gere uma cpia deste. 13. Escreva um programa que compare dois arquivos especificados pelo usurio e imprima sempre que os caracteres dos dois arquivos coincidirem. Por exemplo:

arquivo1.c Ol, pessoal! arquivo2.c Oi, como vai?Neste caso, os caracteres na primeira e dcima primeira posio so iguais nos dois arquivos. A sada do seu programa deve ser algo como:

1 - O (79) 11 - a (97)Os valores entre parenteses so os respectivos cdigos ASCII dos caracteres.

Pr-processador Clrc , 23 June 2008 (created 23 June 2008)no tags

Leitura RecomendadaCCT-cap10

IntroduoUm programa em C transformado em cdigo objeto em duas etapas: uma de PRE-PROCESSAMENTO e a outra de COMPILAO propriamente dita. Na primeira etapa, as DIRETIVAS de PRE-PROCESSAMENTO so convertidas em cdigo C; na segunda etapa, o cdigo C resultante compilado. Abaixo iremos estudar o PRE-PROCESSADOR de C e suas DIRETIVAS. Ao longo da explicao utilizaremos como exemplo os arquivos de programa main.c, list.c, list.h, xcpt.c e xcpt.h discutidos ao final da aula Ponteiros.

101 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

#include

Exemplo

102 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

/* main.c **/ #include #include #include "list.h" #include "xcpt.h" int main(int argc, char *argv[]) { ... } /* arquivos de cabealho padro */

/* arquivos de cabealho do projeto */

#define

103 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Exemplo/* xcpt.h, Rev. 1.1 (c) 2007, Luciano R. Coutinho Implements an exception handling mechanism inspired in Java. **/ #ifndef XCPT_H #define XCPT_H #define XCPT_NAME_MAX_SIZE #define XCPT_CMSG_MAX_SIZE #define THROW(e,m) #define TRY(f) #define CATCH(e,m) #define #define #define #define #define 32 1024

__throw((e),(m)) __begin_try();f;__end_try(); if(m=__catch(e)) "null pointer" "index out of bounds" "overflow" "underflow" "illegal argument"

NULL_POINTER_XCPT INDEX_OUT_OF_BOUNDS_XCPT OVERFLOW_XCPT UNDERFLOW_XCPT ILLEGAL_ARGUMENT_XCPT

void void const char * void #endif

__begin_try(void); __end_try(void); __catch(const char *name); __throw(const char *name, const char *cmsg);

#if, #else, #elif e #endif

104 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Exemplo-1

105 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Exemplo-2/** date.h Author: Luciano R. Coutinho, 2007. [email protected] */ #ifndef DATE_H #define DATE_H #include /* * A type for storing dates in the range: * from Jan 1st , year 2^22 BCE * to Dec 31th, year 2^22 */ #if ( UINT_MAX < 0xffffffff ) typedef long date_t; #else typedef int date_t; #endif ...

#ifdef

ExemploVide inicio dos exemplos anteriores. Eles comeam assim:

106 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

#ifndef FILENAME_H #define FILENAME_H ... #endif

#undef

#line

Macros pr-definidas

107 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

ExemploVeja um exemplo de uso de __LINE__ e __FILE__ no trecho de programa abaixo que foi apresentado na aula Ponteiros:

/* Add a new element str in the list at a given position pos. From pos to the end of the list, all existing elements are shifted right. Throws: INDEX_OUT_OF_BOUNDS_XCPT LIST_FULL_XCPT LINE_TOO_LONG_XCPT **/ void when pos is invalid ( > size +1 ) when the list size equals LIST_MAX_SIZE when str is greater than LINE_MAX_SIZE

list_add(const char * str, unsigned short pos) { sprintf(xcpt_cmsg,"@%s[%d]\n> list_ins (\"%s\",%d);\n", __FILE__,__LINE__,str,pos); if ( pos > size + 1 ) { THROW(INDEX_OUT_OF_BOUNDS_XCPT,xcpt_cmsg); return ; } ...

}

#pragma

108 de 109

14/10/2009 10:46

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

TiddlyWiki Osmosoft

109 de 109

14/10/2009 10:46

This document was created with Win2PDF available at http://www.win2pdf.com. The unregistered version of Win2PDF is for evaluation or non-commercial use only. This page will not be added after purchasing Win2PDF.

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

search

Prof. Luciano R. Coutinho email:[email protected]

Apresentaolrc , 16 March 2008 (created 16 March 2008)no tags

EmentaConceitos Gerais. Tipos de linguagens. Linguagem de programao estruturada. Variveis e tipos de dados. Estruturas de controle de fluxo de execuo. Modularizao. Tipos complexos de dados. Operaes com arquivos. Aplicaes.

ObjetivosApresentao de uma linguagem de programao que ser usada no aprendizado de tcnicas de programao e na modelagem de problemas.

Programa1 Introduo s linguagens de programao 2 Viso Geral de C 2.1 Padronizaes 2.2 Caractersticas 2.3 Estrutura geral de um programa em linguagem C 3 Tipos de dados e tipos de variveis 3.1 Variveis inteiras, caracter, e ponto flutuante 3.2 Definio de variveis globais, externas, locais e estticas 4 Operadores e expresses 4.1 Operadores aritmticos, relacionais, lgicos, bit a bit 4.2 Operador de atribuio condicional e operador de moldagem 4.3 Expresses em C 5 Controle de fluxo de execuo 5.1 Desvios incondicionais 5.2 Desvios condicionais 5.3 Comandos de malha 6 Funes 6.1 Tipos de funes 6.2 Passagem de parmetros por valor e por endereo 6.3 Construo de funes e funes padronizadas 7 Vetores e ponteiros 7.1 Alocao esttica e dinmica 7.2 Definio e inicializao de vetores 7.3 Ponteiros em C 7.4 Aplicaes de ponteiros 8 Estruturas, unies e tipos definidos pelo usurio 8.1 Definio de estruturas

1 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

8.2 Vetor de estruturas 8.3 Passagem de estruturas como parmetros 8.4 Definio de Unies 8.5 Tipos definidos pelo usurio 9 Entrada e sada em arquivos 9.1 Conceitos de arquivos 9.2 Arquivos no MSDOS e UNIX 9.3 Arquivos textos e binrios 9.4 Operaes de leitura e escrita em arquivos 9.5 Funes da biblioteca C para manipulao de arquivos 10 Pre - Processador C 10.1 Diretivas de Compilao

Procedimentos de Ensino/AprendizagemRecursos DidticosUso de computadores, ambiente desenvolvimento em C, quadro-branco, marcador, notas de aulas.

MetodologiaAulas terico - prticas em laboratrio, desenvolvimento e discusso de programas, trabalhos de programao pelos alunos.

Sistema de AvaliaoTrs Avaliaes (A1, A2 e A3), seguidas de uma Reposio (R) (para aqueles cuja mdia (A1+ A2+ A3)/ 3 < 7,0) e uma Final (F) (para aqueles cuja mdia corrigida pela Reposio seja > = 4,0 e < 7,0). Seguindo as normas da UFMA, ser APROVADO o aluno que: tiver mdia ao fim da ltima avaliao maior ou igual a SETE media = (A1+ A2+ A3)/ 3 > = 7,0 OU tiver mdia aps a reposio maior ou igual a SETE mediaRep = (A1+ A2+ A3 - min{ A1,A2,A3} + R)/ 3 > = 7,0 OU tiver mdia aps a reposio MAIS nota da Final maior ou igual a 12 mediaRep + Final > = 12,0

AvaliaesA1 e A2Feitas a partir de: PROVAS ESCRITAS INDIVIDUAL (P1 e P2) LISTAS de EXERCCIOS INDIVIDUAIS (L1 e L2) Calculo: Avaliao A1 = ( 2* P1 + L1 ) / 3 Avaliao A2 = ( 2* P2 + L2 ) / 3

A3Feita a partir de: PROVA ESCRITA INDIVIDUAL (P3) PROJETO de PROGRAMAO em GRUPO (T3) Calculo:

2 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Avaliao A3 = (2* T3 + P3) / 3

ReposioConsistir em uma PROVA ESCRITA INDIVIDUAL. A nota da Reposio ir substituir a menor nota dentre A1, A2 e A3. O assunto da Reposio ser o contedo correspondente ao contedo da menor nota sendo substituda.

FinalConsiste em uma PROVA ESCRITA INDIVIDUAL. O assunto da Final ser todo o contedo ministrado durante o curso.

Bibliografia

Cronogramalrc , 9 March 2009 (created 16 March 2008) Data Assunto 25/ 08 I ntroduo; viso geral de C 27/ 08 Declaraes: I dentificadores e Tipos de Dados Bsicos 01/ 09 Declaraes: Variveis e Classe de Memria 03/ 09 Declaraes: Tipo de Acesso, I nicializao e Constantes 08/ 09 sem aula; viajando S. Paulo 10/ 09 sem aula; viajando S. Paulo 15/ 09 Operadores e Expresses: atribuies, aritmtica e lgica 17/ 09 Operadores e Expresses: atribuies, aritmtica e lgica 22/ 09 Operadores e Expresses: bit-a-bit e especiais 24/ 09 Controle de Fluxo: Comandos de Seleo 29/ 09 Controle de Fluxo: Laos e Desvios I ncondicionais 01/ 10 1a. Prova 06/ 10 Funes: definio, declarao e chamada 08/ 10 Funes: main( ) e recurso 13/ 10 Vetores, matrizes e strings 15/ 10 Vetores, matrizes e strings 20/ 10 Ponteiros 22/ 10 Ponteiros 27/ 10 Exemplo: Lista de Strings 29/ 10 Alocao Dinmica 03/ 11 Vetores para Ponteiros, Ponteiros para Vetores e Ponteiros para Ponteiros 05/ 11 2a Prova Escrita 10/ 11 Estruturas 12/ 11 typedef, ponteiros para funes e union 17/ 11 typedef, ponteiros para funes e union 19/ 11 Enumeraes e Campos de Bits 24/ 11 Entrada/ Sada: console 26/ 11 Entrada/ Sada: arquivos 01/ 12 03/ 12 08/ 12 Pr-processador C 10/ 12 3a Prova Escrita 15/ 12 Reposiono tags

3 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

17/ 12 Final

I ntroduo; viso geral de Clrc , 16 March 2008 (created 16 March 2008)no tags

TpicosAs Origens de C C - Caractersticas Nvel Mdio Estruturada Para programadores Programao de sistemas Estrutura Geral de um programa em C Edio, compilao e Link Edio C versus C+ +

As Origens de CKen Thompson e Dennis Ritchie (da esquerda pra direita), os criadores das linguagens B e C, respectivamente:

Para detalhes, leia: D. M. Ritchie; O Desenvolvimento da Linguagem C http:/ / www.caloni.com.br/ blog/ archives/ historia-da-linguagem-c-parte-1 http:/ / www.caloni.com.br/ blog/ archives/ historia-da-linguagem-c-parte-2

Evoluo das Linguagem de ProgramaoRef: History of programming languages Computer Languages History

4 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Padronizao ANSIRef: Jones, Derek M. (2008) "The New C Standard: An Economic and Cultural Commentary."

5 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

6 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

C - CaractersticasNvel Mdio Estruturada Para programadores Programao de sistemas

Linguagem de Nvel Mdio

Linguagem Estruturada

Linguagem para Programadores

Linguagem para Programao de Sistemas

7 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Estrutura geral de um programaPalavras Reservadas

Funes

Exemplo

8 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Edio, compilao e Link Edio

IDE - Integrated Developmente EnvironmentsDevCpp Code::Blocks + gcc

9 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

jGRASP + gcc TurboC

TermosCompilao Separada Biblioteca Padro ANSI

C versus C++

Leitura RecomendadaCCT captulo 1 K&R captulo 1 D. Ritche, O Desenvolvimento da Linguagem C* . Histrico das Linguagens de Programao Wikipedia: Ling. C

Exerccios1. A linguagem C considerada uma linguagem de nvel mdio. Explique o que isto significa e quais as implicaes em termos prticos. 2. Programas escritos em C so ditos possuir alto grau de portabilidade. Explique o que isto significa e quais as implicaes em termos prticos. 3. A linguagem C, a exemplo de Pascal dito ser uma linguagem estruturada. Pesquise e descreva as principais diferenas entre a programao estruturada em Pascal e a programao estruturada em C. 4. Faa um resumo esquemticos das datas e principais acontecimentos relatados no artigo O Desenvolvimento da Linguagem C* de D. Ritchie. 5. A linguagem C uma linguagem compacta com apenas 32 palavras reservadas. Pesquise e liste as palavras reservadas de C. Classifique-as em: especificadores de tipos controle de fluxo especificadores de classe de memria outros 6. Modifique o programa media.c para exibir o nome do vetores P e T durante a leitura dos dados. Dica: redefina a funo

ler para aceitar como parametro o nome do vetor sendo lido, alm do prprio vetor. De posse do nome do vetor sendolido, exiba este nome antes da leitura de cada posio.

10 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

Declaraes: I dentificadores e Tipos de Dados Bsicoslrc , 29 March 2008 (created 24 March 2008)no tags

ObjetivosNa primeira aula, vimos que um programa em C pode ser visto como uma seqncia de DECLARAES. De maneira geral, uma DECLARAO introduz um novo nome - um IDENTIFICADOR - e associa a este uma interpretao. Tome como exemplo o seguinte trecho de cdigo:

00: 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14:

#include double x; void p(float b, int e) { short int i; x = b; ... } int main() { p(3.1415, 5); printf("%f",x); return 0; }

Na linha 1, vemos uma DECLARAO de VARIVEL GLOBAL. Nas linhas 3 a 8, temos uma DECLARAO de FUNO que, por sua vez, formada por uma DECLARAO de PARMETROS (linha 3), uma DECLARAO de VARIVEL LOCAL (linha 4) e uma seqncia de comandos (linhas 5-7). Em cada uma dessas DECLARAES um novo IDENTIFICADOR introduzido com uma interpretao particular! Na declarao da linha 1, o IDENTIFICADOR introduzido x e sua interpretao VARIVEL GLOBAL do TIPO BSICO double. Na declarao das linhas 3 a 8, o IDENTIFICADOR p e sua interpretao FUNO que recebe como PARMETROS um valor do TIPO BSICO float e um valor do TIPO BSICO int; tem uma VARIVEL LOCAL do TIPO BSICO short int, executa os comandos das linhas 6-7 e ao final nada retorna ( TIPO BSICO void). Note que, nesses exemplos, a interpretao dada a um IDENTIFICADOR est ligada de maneira ntima com um TIPO de DADOS BSICO. Nesta aula, nosso objetivo mostrar atravs de exemplos o que um IDENTIFICADOR vlido e quais so os TIPOS de DADOS BSICOS - os dois ingredientes fundamentais de toda DECLARAO em um programa C.

IDENTIFICADORESEm C, um IDENTIFICADOR uma seqncia de LETRAS ou DGITOS onde: O primeiro caracter deve ser uma LETRA ( 'a',...,'z','A',...,'Z','_' ) O caracter '_' contado como uma LETRA LETRAS maisculas (e.g., 'A') so consideradas diferentes de letras minsculas (e.g., 'a') isto implica que o IDENTIFICADOR aux diferente de Aux que diferente de AUX PALAVRAS RESERVADAS tais como if, else, char, int, ... no podem ser usadas como IDENTIFICADORES.

Pelo padro C ANSI, um IDENTIFICADOR pode ter qualquer tamanho. Observaes Para IDENTIFICADORES INTERNOS (i.e., nomes restritos a uma nica UNIDADE de COMPILAO), pelo menos os primeiros 31 caracteres so significativos; algumas implementaes podem utilizar um conjunto maior de caracteres

11 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

significativos. J os IDENTIFICADORES EXTERNOS (i.e., nomes de de VARIVEIS GLOBAIS e FUNES compartilhados entre vrias UNIDADES de COMPILAO) so mais restritos: as implementaes podem considerar em casos extremos apenas 6 caracteres como significativos, e podem ignorar as distines entre letras maisculas e minsculas.

Atividade 1: Validando IndentificadoresVamos escrever um programa em C ( id.c) que dado uma palavra (cadeia de caracteres) imprima na tela um

identificador! ou no um identificador! caso a palavra obedea ou no a definio de identificador dadaacima. DICA - comee o programa assim:

#include char str[80]; /* armazena uma cadeia de at 79 caracteres */

int main() { printf("Digite uma palavra: "); scanf("%s", str); /* le do usrio uma cadeia de caracteres */ ... }

TIPOS de DADOS BSICOSH cinco tipos de dados bsicos em C:

char : um nico byte, capaz de conter um caracter no conjunto de caracteres local; int : um inteiro, normalmente refletindo o tamanho natural dos inteiros da mquina hospedeira; float : ponto flutuante em preciso simples; double : ponto flutuante em dupla preciso; void : conjunto vazio de valores.Todos os outros tipos de dados em C so baseados em um desses tipos bsicos.

ModificadoresExceto void, os tipos de dados bsicos podem ter vrios MODIFICADORES precedendo-os. Um MODIFICADOR usado para alterar o significado de um tipo bsico para adapt-lo necessidade de diversas situaes. So MODIFICADORES de tipos:

long short signed unsigned

short ou long - referem-se a diferentes tipos de inteiros: A palavra int pode ser omitida e normalmente o ! short = short int long = long intObs.: Alguns compiladores permitem long long int ! (Fora do Padro ANSI)

long pode tambm ser aplicado a double de tal modo que: float double long double signed ou unsigned - podem ser aplicados a char, ou a short ou long ( int ).Equivalencias char = signed char ou char = unsigned char, a depender da mquina hospedeira;

signed int = int = signed signed long = long

12 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

signed short = short unsigned int = unsignedObs.: Alguns compiladores podem permitir unsigned double ! (Fora do Padro ANSI)

Tamanho e Faixa de ValoresO tamanho e faixa de valores dos tipos bsicos de dados variam de acordo com: tipo do processador implementao do compilador No entanto, o padro ANSI C estipula valores mnimos:

Atividade 2: Explorando Nos arquivos de cabealho e encontram-se definidas constantes simblicas para a faixa de valores e tamanho em bytes dos tipos de dados bsicos e modificados da linguagem C, conforme foram implementados em um dado compilador/ mquina. Nesta atividade, o seu objetivo escrever um programa tipos.c que inclua os arquivos de cabealho e

e imprima - para os tipos mostrados na tabela 2.1 - as seguintes informaes : TIPO char unsigned char signed char ... VALOR_MIN -128 0 -128 VALOR_MAX 127 255 127 TAMANHO em BYTES 1 1 1

Como ponto de partida, voc pode iniciar o seu programa assim:

13 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

#include #include char c; unsigned char uc; signed char sc; int i; ... int main(void) { printf("TIPO\t\t\tVALOR_MIN\t\tVALOR_MAX\tTAMANHO em BYTES\n"); printf("char\t\t\t%i\t\t\t%i\t\t%i\n", CHAR_MIN, CHAR_MAX, sizeof c); printf("unsigned char\t\t%i\t\t\t%i\t\t%i\n", 0, UCHAR_MAX, sizeof uc); printf("signed char\t\t%i\t\t\t%i\t\t%i\n", SCHAR_MIN, SCHAR_MAX, sizeof sc); ... }

Leitura RecomendadaCCT captulo 2 K&R captulos 2 Seebach, "Everything You Ever Wanted to Know about C Types" What's in a type? Floating point and derived types Implementation details Portability and pitfalls http:/ / pt.wikipedia.org/ wiki/ Tipo_de_dado

Para detalhes sobre representacao de caracteres: http:/ / www.ime.usp.br/ ~ pf/ algoritmos/ aulas/ char.html Para detalhes sobre representao de nmeros: inteiros ( int) http:/ / www.ime.usp.br/ ~ pf/ algoritmos/ aulas/ int.html ponto flutuante ( float, double) http:/ / en.wikipedia.org/ wiki/ Floating_point http:/ / en.wikipedia.org/ wiki/ Double_precision http:/ / en.wikipedia.org/ wiki/ IEEE_754

Para detalhes sobre o padro ANSI C: Jones, Derek M. (2008) "The New C Standard: An Economic and Cultural Commentary."

Exerccios1. Faa por completo a atividade 1 2. Faa por completo a atividade 2 3. Utilizando os TIPOS inteiros em C, escreva programas para: a. Dado um nmero inteiro positivo n, calcular a soma dos n primeiros nmeros naturais. b. Dado um nmero inteiro positivo n, imprimir os n primeiros naturais mpares. Exemplo: Para n= 4 a sada dever ser 1,3,5,7. c. Dados n e dois nmeros inteiros positivos i e j diferentes de 0, imprimir em ordem crescente os n primeiros naturais que so mltiplos de i ou de j e ou de ambos. Exemplo: Para n = 6 , i = 2 e j = 3 a sada dever ser : 0,2,3,4,6,8. d. Dizemos que um nmero natural triangular se ele produto de trs nmeros naturais consecutivos. Exemplo: 120 triangular, pois 4.5.6 = 120. Dado um inteiro no-negativo n, verificar se n triangular. e. Dado um inteiro positivo p, verificar se p primo. f. Dados trs nmeros naturais, verificar se eles formam os lados de um tringulo retngulo. 4. Utilizando os TIPOS ponto flutuante em C, faa programas para os seguintes enunciados: a. Um programa que leia uma temperatura em graus celsius e a converta para fahrenheit.

14 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

b. Uma pessoa aplicou um capital de x complexos (1) a juros mensais de z durante 1 ano. Deseja-se um programa que determine o montante de cada ms durante este perodo. c. Dados nmeros reais a, b e c, calcular as razes de uma equao do 2o grau da forma ax^ 2 + b^ x + c = 0. 5. Utilizando o TIPO char, re-escreva os programas anteriores para ao final perguntar ao usrio: deseja processar

outro valor? [s/n]. Se o usurio digitar 's' ou 'S' o programa deve continuar processando uma nova entrada;caso contrrio deve terminar.

Declaraes: Variveis e Classe de Memrialrc , 29 March 2008 (created 24 March 2008)no tags

ObjetivoNa ltima aula, vimos que uma DECLARAO introduz um novo IDENTIFICADOR e associa a este uma interpretao. Dentre as interpretaes possveis, um IDENTIFICADOR pode ser declarado para ser o nome smblico de uma VARIVEL. Neste caso, temos um dos mais importantes tipos de DECLARAO - a DECLARAO de VARIVEIS. Nesta aula, nosso objetivo estudar: a forma geral de DECLARAES de VARIVEIS em C a noo de CLASSE de MEMRIA associada a uma VARIVEL

VariveisVARIVEIS so abstraes de locais de armazenamento de dados. Os dados armazenados em uma VARIVEL podem mudar ao longo da execuo de um programa. Da o nome VARIVEL. Uma VARIVEL possui dois atributos principais: um TIPO de DADO : determina o significado dos valores achados em uma VARIVEL. uma CLASSE de MEMRIA (ou CLASSE de ARMAZENAMENTO) : determina o tempo de vida e a rea de memria na qual a VARIVEL alocada. Variveis tambm podem ter: um TIPO de ACESSO : determinam a maneira como as variveis podem ser acessadas ou modificadas.

Variveis podem ser declaradas tanto fora quando dentro de funes. No primiro caso as variveis so ditas GLOBAIS; no segundo caso, LOCAIS.

Declarao de VariveisEm C, uma DECLARAO de VARIVEL assume a seguinte forma geral:

ESPEC-DECLARAO DECLARADOR-1 = INICIALIZADOR-1, ..., DECLARADOR-n = INCIALIZADOR-n;Onde: ESPEC-DECLARAO e cada DECLARADOR-i so obrigatrios; cada = INICIALIZADOR-i opcional.

ESPEC-DECLARAO uma sequncia composta de pelo menos um dentre trs categorias de ESPECIFICADOR: ESPECIFICADOR do TIPO de DADO; int, char, float, double e seus MODIFICADORES long, short, signed e unsigned ESPECIFICADOR da CLASSE de MEMRIA; auto, register, static e extern ESPECIFICADOR do TIPO de ACESSO; const e volatile

15 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

A forma mais simples de um DECLARADOR um IDENTIFICADOR. Nesta aula, iremos considerar como DECLARADOR apenas IDENTIFICADORES. Um INICIALIZADOR, de maneira geral, consiste em uma EXPRESSO.

Ambiente de Execuo CEm C, h quatro locais onde uma varivel pode ser alocada: na REA de DADOS ESTTICA na PILHA de EXECUO em REGISTRADORES no HEAP

Especificadores da Classe de MEMRIAEm C, h quatro PALAVRAS RESERVADAS que funcionam como ESPECIFICADORES da CLASSE de MEMRIA durante a DECLARAO de uma VARIVEL:

auto - define variveis automticas na PILHA de EXECUOso sempre variveis locais a um BLOCO e que so descartados na sada do BLOCO;

register - define variveis automticas em REGISTRADORESso sempre variveis locais a um BLOCO e que so descartados na sada do BLOCO;

staticpodem ser variveis locais a um BLOCO ou externas a todos os BLOCOS retm seus valores durante toda execuo do programa pois so alocadas na REA de DADOS ESTTICA quando em DECLARAES LOCAIS, DEFINE variveis estticas (escopo de BLOCO) quando em DECLARAES GLOBAIS, DEFINE variveis estticas com ligao interna (escopo de UNIDADE DE COMPILAO)

externpodem ser variveis locais a um BLOCO ou externas a todos os BLOCOS quando em DECLARAES LOCAIS, DECLARA variveis estticas que foram definidas fora do BLOCO das declaraes quando em DECLARAES GLOBAIS, DECLARA variveis estticas com ligao externa, i.e, que foram definidas fora da UNIDADE DE COMPILAO das declaraes

Observao um BLOCO qualquer parte de um programa delimitada por { } ; um BLOCO pode ser o corpo de funo bem como o corpo

16 de 111

14/10/2009 11:04

.: CP 5593.6, 2009.2

Linguagem de Programao - Prof. Luciano R....

http://www.deinf.ufma.br/~lrc/2009.2/LP/

de um comando composto como if, while