fundamentos de programação alexandre carlos brandão ramos [email protected]

106
Fundamentos de Programação Alexandre Carlos Brandão Ramos http :// www.ice.unifei.edu.br/ramos [email protected]

Upload: internet

Post on 22-Apr-2015

115 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Fundamentos de Programação

Alexandre Carlos Brandão Ramos

http://www.ice.unifei.edu.br/ramos

[email protected]

Page 2: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Ementa

• Fornecer os principais conceitos de linguagens de programação e explorar esses conceitos a partir de uma linguagem algorítmica (Português Estruturado) bem como sua implementação a partir do conhecimento da linguagem C.

01/08/2001

Page 3: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Objetivos

• 1.      Fornecer conhecimentos básicos sobre Álgebra binária;

• 2.      Introduzir conceitos sobre Representação de Dados, de modo a facilitar o entendimento da lógica de programação;

• 3.      Fornecer conhecimentos básicos sobre o funcionamento de Computadores Digitais (hardware e software);

• 4.      Introduzir ao conhecimento da Programação Estruturada, permitindo a criação (Análise e Projeto) de algoritmos.

• 5.      Fornecer subsídios para a implementação de programas utilizando a Linguagem de programação C.

Page 4: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Critérios de Avaliação

• 60% da nota do bimestre = prova

• 30% da nota do bimestre = trabalho individual a ser realizado em laboratório

• 10% trabalhos em grupo (máximo de 4 alunos) a ser entregue no dia da prova teórica.

• Datas de Provas: – B1: Teórica 30/09/2014

– Laboratorio 01/10/2014

– B2: Teórica 18/11/2014

– Laboratório 19/11/2014

Page 5: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Pré-história

• Pré-história das calculadoras– O primeiro dispositivo de cálculos foi o ábaco,

originário da China em 2000 AC.

Page 6: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Régua de cálculo

No início do século XVII, o escocês John Napier inventou um dispositivo chamado Ossos de Napier que são tabelas de multiplicação gravadas em bastão, o que evitava a memorização da tabuada, e que trouxe grande auxílio ao uso de logaritmos, em execução de operações aritméticas como multiplicações e divisões longas.Hoje, o dispositivo aperfeiçoado é empregado freqüentemente pelos engenheiros, através da régua de cálculo.

Page 7: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Calculadoras

• A primeira calculadora somente somava e subtraía e foi inventada por Blaise Pascal na França em 1642, para ajudar o seu pai.

• A máquina contém como elemento essencial uma roda dentada construída com 10 "dentes". Cada "dente" corresponde a um algarismo, de 0 a 9.

A primeira roda da direita

corresponde às unidades, a

imediatamente à sua

esquerda corresponde às

dezenas, a seguinte às

centenas e sucessivamente.

Page 8: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

A máquina de Leibniz

• Cerca de 30 anos após a construção da máquina de Pascal, Gottfried Wilhem Von Leibniz inventou um dispositivo constituído por um conjunto com dez "dentes", cada um dos quais mais comprido que o anterior, que permitiu efetuar de modo automático a multiplicação e divisão.

Page 9: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Alan Turing

• Alan Turing imaginou uma máquina “universal” que pudesse realizar cálculos automaticamente, demonstrando que um conjunto de estruturas simples podia resolver qualquer problema complexo. Esta máquina não chegou a ser montada.

• Entretanto ele e a sua equipe desenvolveram o Colossus, um dos primeiros computadores do mundo, visto aqui em operação durante a Segunda Guerra Mundial.

• Essa máquina enorme continha 1.500 válvulas, e sempre alguma se queimava em alguns minutos. O Colossus era capaz de processar 5.000 caracteres por segundo, e foi responsável pela decodificação das mensagens alemãs "Enigma".

Page 10: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

John Von Neumann

• Matemático brilhante, fugiu da Alemanha nazista para os Estados Unidos, professor em Princeton, participou do projeto para a construção da bomba atômica.

• Foi convidado para o projeto ENIAC (Electronic Numeric Integrator And Calculator). O trabalho estava sob a orientação de engenheiros eletrônicos mas, como matemático, analisou o problema de modo diferente e redigiu um relatório que estruturou a arquitetura dos modernos computadores.

• Ele e sua equipe desenvolveram o EDVAC (Electronic Discrete Variable Computer) onde, foi aplicada a idéia de programação interna que trata do armazenamento de programas, codificados de acordo com certos critérios na memória do computador e não em dispositivos externos, como ocorria até então.

• Esse procedimento aumenta a operacionalidade dos programas, pois grupos de instruções podem ser executados várias vezes e na ordem que se fizer necessária.

Page 11: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Computadores modernos

• Mudanças tecnológicas:

– vacuum tube -> transistor -> IC -> VLSI

– Nanocircuitos

– dobram a cada 1.5 anos:

capacidade de memória

velocidade do processador (devido a avanços

tecnológicos e organização)

Page 12: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Problemas

• Nos anos 60/70: – minimizar espaço em memória melhora o

desempenho

• Problema atual:– hierarquia de memórias

– paralelismo dos processadores

– otimização dos compiladores

– sistema operacional...

Page 13: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

O que é um computador?

• Componentes:

– entrada (mouse, teclado)– saída (monitor, impressora)– memória (discos, DRAM, SRAM, CD)– rede

Page 14: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Sistemas de Numeração

• Introdução– Existem várias regras que permitem ler e escrever

qualquer número, usando poucas palavras e poucos símbolos.

– O conjunto de tais regras constitui um Sistema de Numeração. Estes sistemas, têm variado com as épocas e com os povos.

Page 15: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Base de um Sistema

• É o número de elementos necessários para formar um conjunto padrão que auxilie a contagem de objetos.

• Assim, quando falamos em base 10, estamos pensando na formação de conjuntos com dez elementos, isto é, dada uma coleção de objetos, procuramos saber quantos conjuntos de 10 podem ser formados.

• A base 10 é usada desde a antigüidade, dada a correspondência com os dedos das duas mãos. Se tivéssemos 8 e não 10 dedos nas mãos qual seria a nossa base de numeração?

Page 16: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Outras bases

• Um sistema de base 12, é aquele que forma conjuntos de doze elementos. É nessa base que costumeiramente se contam as (em dúzias) as frutas, os ovos etc.

• A contagem do tempo, desde os antigos babilônios, é feita na base sessenta (o conjunto de sessenta segundos constitui um minuto)

• A civilização Maia, da América Central, usava a base vinte para a contagem de seus objetos

• Os computadores utilizam a base dois...

Page 17: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Base decimal

• Principais características:– é de base dez;

– usa somente os dez numerais indo-arábicos (algarismos) 1,2,3,4,5,6,7,8,9 e 0 para escrever todos os números.

– Obedece ao Princípio da Posição Decimal.

“Todo algarismo escrito imediatamente à esquerda de outro representa unidades de ordem imediatamente superior (dez vezes) à desse outro”

exemplo: 33 o primeiro 3 “vale” trinta (3x10) e o segundo 3 “vale” três mesmo!

Page 18: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Sistemas antigos - Egípcio

Há 6.000 anos eles

utilizavam um

sistema decimal

(dez cajados

valem um osso,

dez ossos valem

uma corda etc.) porém não conheciam o Princípio da Posição, razão porque se tornava difícil a representação de números grandes.

Page 19: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Exemplos

Page 20: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Sistemas antigos - Babilônio

Há 5.000 anos atrás eles utilizavam um sistema de base sessenta com símbolos cuneiformes.

Números usados:

Regras para escrever:

• Para números menores

que sessenta obedece ao

mesmo princípio da

justaposição usado pelos

egípcios.

Page 21: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Sistemas antigos - Babilônio

• Para números maiores que sessenta usa-se (e pela primeira vez na história!) o Princípio da Posição de base sessenta (Princípio Sexagesimal). Exemplos:

Page 22: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Sistemas antigos - Romano

Há 2.100 anos atrás os romanos utilizavam os seguintes numerais:

I : um V: cinco X: dez L: cinqüenta C: cem D: quinhentos M : milRegras para escrever:• Somente os numerais I, X, C e M podem ser

repetidos no máximo 3 vezes consecutivas.• Se um numeral (ou mais) está à direita de outro de

igual ou maior valor, somam-se os seus valores (princípio aditivo da justaposição) e se está (com exceção de V, L, D e M) à esquerda de outro de valor imediatamente superior, subtraem-se (princípio subtrativo da justaposição).

Page 23: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Sistemas antigos - Romano

• Para aumentar o valor do número 1.000 vezes, coloca-se um traço horizontal sobre o numeral (com exceção do I); para aumenta-lo um milhão de vezes colocam-se dois traços e assim sucessivamente. Exemplos:

3 = III 9 = IX 21 = XXI 206 = CCVI

1.969 = MCMLXIX

Nos sistemas antigos, não existia o ZERO que foi introduzido pelos hindus há 1500 anos atrás.

Page 24: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Sistemas modernos

Os vários sistemas de numeração que

hoje prevalecem, se valem do

Princípio da Posição, que varia de

acordo com a base adotada, que em

várias aplicações não é mais a base 10.

Os computadores utilizam a base dois

(Sistema de Numeração Binário),

usando somente dois numerais: 0 e 1,

para descrever qualquer número.

07/08/2001

Page 25: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Mudança de base

Ou decomposição, é conversão de um número escrito em uma determinada base para uma outra qualquer, exemplo:

• Base 10: (0 1 2 3 4 5 6 7 8 9)

5.386 = 5 x 1000 + 3 x 100 + 8 x 10 + 6

= 5 x 10³ + 3 x 10² + 8 x 10¹ + 6 x 10º

• Base 8: (0 1 2 3 4 5 6 7 8)

12348 = 1 x 8³ + 2 x 8² + 3 x 8¹ + 4 x 8º

12348 = 1 x 512 + 2 x 64 + 3 x 8 + 4 x 1

12348 = 512 + 128 + 24 + 4

12348 = 66810 Transformação para a base 10.

• Base 16: (0 1 2 3 4 5 6 7 8 9 A B C D E F)

1A2F = 1 x 16³ + A x 16² + 2 x 16¹ + F x 16°

Page 26: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Mudança de base

• Base 16: (0 1 2 3 4 5 6 7 8 9 A B C D E F)

1A2F16 = 1 x 16³ + A x 16² + 2 x 16¹ + F x 16º

= 1 x 16³ + 10 x 16² + 2 x 16¹ + 15 x 16º

= 4096 + 2560 + 32 + 15 = 670310

Page 27: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Mudança de base

• Da base10 para a base 2:

3010 = 111102

111102 = 1 x 24 + 1 x 23 + 1 x 22 + 1 x 21+ 0 x 20

= 16 + 8 + 4 + 2 + 0

= 3010

Page 28: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Mudança de base

• Da base 10 para a base 4:

3010 =1324

= 1 x 4² + 3 x 4¹ + 2 x 4º

= 16 + 12 + 2

1324 = 3010

Page 29: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Operações Aritméticas

• AdiçãoRegra 1: 0 + 0 = 0

Regra 2: 0 + 1 = 1

Regra 3: 1 + 0 = 1

Regra 4: 1 + 1 = 0 e vai 1 = 10Exemplos:

1 0 0 4 1 11 01 1 5

+ 0 1 0 2 + 0 1 1 3

1 1 0 6 1 0 0 0 8

08/08/2001

Page 30: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Operações Aritméticas

• SubtraçãoRegra 1: 0 - 0 = 0

Regra 2: 0 - 1 = 1 e empresta 1

Regra 3: 1 - 0 = 1

Regra 4: 1 - 1 = 0

Exemplos: 1 1 3 10 10 10 10 10

10 10 2 - 1 0 2 - 0 1 1 1 7

- 0 1 1 0 1 1 0 0 1 1 3

0 1 3 Lembrar que a subtração começa da

direita para a esquerda

Page 31: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Operações Lógicas

• Todos os sistemas digitais são construídos usando apenas 3 operações lógicas básicas, também chamadas de portas lógicas, quais sejam:

• E (and)

• Ou (or)

• Não (not)

Page 32: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Operação lógica E

• Gráficamente

B A Y A . B = Y

0 0 0

0 1 0

1 0 0

1 1 1 Tabela Verdade

Page 33: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Operação lógica OU

• Gráficamente

B A Y A + B = Y

0 0 0

0 1 1

1 0 1

1 1 1

Page 34: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Operação lógica NÃO

• Gráficamente

A Y A = 0 1

1 0

Page 35: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Expressões e circuitos

• Pode-se escrever uma expressão lógica (booleana) que seja executada por qualquer circuito lógico, exemplo:

1. Divide-se o circuito lógico em partes

2. Colocar na saída de cada bloco a expressão correspondente

3. Juntam-se as expressões

Page 36: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Exercícios

1. Escrever a expressão lógica executada pelo circuito abaixo:

1. Dada a expressão lógica, desenhar o circuito:• S = (A + B) . (C + D)• S = (A + B) + C + (C . D)

2. Representar as tabelas-verdade dos exercícios anteriores.

Page 37: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Algoritmos

Page 38: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Resolução de Problemas

Podemos identificar duas grandes estratégias de resolução de problemas:1. Estratégias algorítmicas, generalistas, por exemplo, os métodos numéricos, os sistemas de bancos de dados, as planilhas etc.2. Estratégias baseadas em conhecimento (especialistas) por exemplo, sistemas especialistas, sistemas de reconhecimento de voz, tutores inteligentes etc;

Page 39: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Exercícios

• Represente algorítmicamente a solução dos seguintes problemas:1. Sejam 2 vasilhames d’água, um de 4 litros e outro de

3 litros. Nenhum deles possui qualquer marcação de medida. Há uma torneira que pode ser utilizada para encher os vasilhames de água. Como você poderá colocar exatamente 2 litros d’água dentro do vasilhame de 4 litros?

Page 40: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Exercícios

2. Três missionários e três canibais se encontram em um lado do rio. Todos concordam que precisam chegar do outro lado. Mas os missionários não confiam nos canibais. Assim, os missionários querem atravessar o rio de modo tal que o número de missionários em qualquer das margens nunca seja inferior ao número de canibais que estiver do mesmo lado. O único barco disponível só carrega 2 pessoas por vez. Como todos poderão chegar ao outro lado, sem que os missionários arrisquem suas vidas?

Trabalho 1, para ser entregue no dia 19/08/2014 prova, impresso em folha de papel Almaço (pode ser a mesma da primeira série de exercícios) os passos numerados e em língua portuguesa.

Page 41: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Fluxogramas

Corresponde a uma forma gráfica muito comum utilizada para representar um algoritmo, indicando a seqüência em que as primitivas devem ser executadas.

Page 42: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Primitivas Gráficas

Início/Fim do programa

Processamento

Decisão

Page 43: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Montando um fluxograma

Em um fluxograma as operações primitivas aparecem envolvidas por retângulos, com exceção da primitiva Decisão, a qual é envolvida por um losango. As operações são interligadas por SETAS (-->).

Page 44: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Exemplo

Dados dois números inteiros positivos A e B, calcular o valor absoluto de A - B.

Resposta em forma de texto: nesse caso devemos realizar os seguintes passos:

1. Obter os valores de A e B;

2. Verificar qual deles é o maior;

3. Subtrair o número menor do número maior; e

4. Apresentar o valor resultante.

Page 45: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

GráficamenteInício

Obtenha A,B

A < BC <-- B - A C <-- A - B

Forneça C

Fim

Page 46: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Exercício

1. Calcular o produto de 10 por 7.

Início

PROD <-- 10*7

Fim

Forneça PROD

Page 47: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Estruturas de Dados

Page 48: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Programa

• Estruturas básicas: listas, árvores e suas generalizações. Manipulação de ponteiros. Algorítmos e manipulação de estruturas de dados. Inserção, eliminação, busca e percurso. Aplicações.

• Bibliografia

• Estruturas de dados. Paulo Veloso, Clésio Veloso dos Santos e outros. Ed. Campus.

• Algorítmos e Estruturas de dados. Guimarães Lages. Ed. LTC.

• Estruturas de dados Fundamentais: conceitos e aplicações. Silvio do Lago. Ed. Érica

Page 49: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Desenvolvimento de Programas

O processo de solução de problemas por meio de computador pode ser descrito a partir das seguintes etapas:

1. Especificação do problema

2. Projeto em alto nível

3. Análise de alternativas

4. Refinamento e codificação

5. Verificação do comportamento

Nesta descrição devemos ressaltar 3 pontos:

1. Estruturas de dados, que retratam as relações lógicas existentes entre os dados, de modo análogo ao uso de um modelo matemático para espelhar alguns aspectos de uma realidade física.

Page 50: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

2. Operações, manipulam as estruturas de dados transformando-as.

3. Estruturas de Representação, que são formas de armazenar na memória os dados, isto é, as estruturas de dados manipuladas pelas operações, que devem:

3.1 Preservar as relações lógicas existentes entre os dados.

3.2 Permitir que as operações sejam descritas por procedimentos simples e eficientes.

Page 51: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Tipos de dados

Page 52: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Tipos de Dados

Para descrever os algorítimos e procedimentos durante o curso, vamos utilizar uma linguagem de descrição muito parecida com as linguagens ALGOL e PASCAL.

A noção do tipo de dados ocorre na maioria das linguagens de programação. O tipo da variável delimita o conjunto de valores que ela pode tomar e as operações que podemos efetuar com elas.

Geralmente uma linguagem de programação oferece 2 tipos de Tipos de dados:

Tipos Primitivos: São tipos básicos pré definidos

Tipos construídos: tipos criados a partir de mecanismos presentes na linguagem.

Page 53: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Tipos primitivos Operações aceitas

inteiro - int + - * div mod

real - real + - * /

lógico - log e ou não (.e. & .ou. V )

caracter- car =

Exemplos: Tipos inteiro ? Real ? Lógica ? Caracter ?

V= F e F = V

5 div 2 = 2

5 mod 2 = 1

Exemplos

Page 54: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Funções de Transferência

São operações especiais que manipulam variáveis de tipos primitivos, diferentes entre si, por exemplo: Xi sendo X real e inteiro.

Comparações também podem ser consideradas funções de transferência, por exemplo:X < i sendo X real e i inteiro e o resultado lógico F(V)

Trunc, converte um numero real em inteiro trunc (75.37)=75

Tier, converte inteiro em real tier (75)= 75.0

Ord, transforma car em int que é seu numero de ordem no conjunto de caracteres ASCII ord (‘0’) <...< ord (‘9’)<...< ord(‘A’)<...< ord(‘a’). Mais funções de transferência podem ser obtidas nos tipos construídos.

Page 55: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Utilizados para construir tipos novos a partir de tipos primitivos, segundo a definição:

Tipos nome_do_tipo: definição_do_tipo

a ser utilizada com os seguintes mecanismos:

Tipos construídos forma Geral Vetor - Vet Vet (limite inferior...limite superior) de tipo

registro - reg reg (seletor1: tipo1, seletor2: tipo2,...,seletorn: tipon)

seqüência- seq seq de tipo p/ ex: tipo cadeia:: seq car

referência - ref ref a tipo p/ ex: tipo matricula:: ref int

alternativa - alt alt (tipo1 | tipo2 |...| tipon ) p/ ex: tipo questão:: alt (int | car)

Mecanismo para construção de tipos

Page 56: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Exemplos:

Vetor= tipo dia :: vet [0...30] de int [1,2,3,4,...31]

onde dia[2] = 3 dia [i] = 31 então i= 30

Registro= tipo inscrição::reg (disciplina: int, turma: car)

Se matricula: inscrição “Se matricula é uma variável do tipo inscrição, então matricula (103, ‘a’)

daí temos: matricula.turma= a

matricula.disciplina= 103

O elemento da turma”a”, quer inscrever-se na disciplina 103

Page 57: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Seqüência= tipo cadeia:: seq carSe x: cadeia e x< ‘r’, ‘a’, ‘m’> Seq. De comprimento 3

y: cadeia e y<‘e’, ‘m’, ‘i’, ‘g’, ‘r’, ‘a’> Seq. De comprimento 6

Então princ x = ‘r’

cont x = < ‘a’, ‘m’>

yconc x = < ‘e’, ‘m’, ‘i’, ‘g’, ‘r’, ‘a’, ‘r’, ‘a’, ‘m’>

Se Z: cadeia e Z< ’a ’> Então princ Z=‘a’ cont z=<>

Seqüência nula de comprimento 0

Page 58: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Referência

Tipo de matricula :: ref int

Este mecanismo permite uma modalidade dinâmica de alocação, ao contrário dos mecanismos anteriores (vet, seq, etc.) cuja alocação é contínua.

Se geografia: matrícula o espaço necessário para a variável geografia compreende 2 partes:

1° parte do valor: armazena um valor do tipo int;

2° parte de posição: armazena uma indicação de posição da localização da parte de valor.

Page 59: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Aloque geografia

a) após a declaração da variável

b)após a execução do comando alouque

Desaloque geografia

c)após a execução do comando

(Na memória) Parte de posição (geografia)

Parte de posição

Parte de valor geografia

Parte de posição

Sejam os comandos:

Page 60: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Alternativa= tipo questão:: alt ( int | car )

Se resposta : questão

Então resposta? tem valor igual a 1 (int) ou 2 (car)

Enumeração

Permite definir tipos de dados por meio dos valores que os dados daquele tipo podem tomar.

Tipo mês= (jan,fev,mar,abr,mai,jun,jul,ago,set,out,nov,dez)

seja mês_nasc: mês

Se mês_nasc= dez Então Processo qualquer

Permite que uma mesma variável possa, em momentos diferentes, ter valores e tipos diferentes

jan<fev<mar<...<dez

Page 61: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Variáveis, Declarações e Expressões

Nomes (identificadores) podem ser usados para denotar variáveis, do seguinte modo:

var nome: tipo; ou nome1, nome2,...,nome3: tipo;

Todas as variáveis existentes no programa fonte devem ser declaradas uma vez ( e somente uma vez) no seu cabeçalho, exemplos:

Tipos Variáveismatr10:: vet [0..9] de vet [0..9] de real; adj, custo: matr10;

status:: reg (no: int, ferias: log, dia: int); folha: seq de status;

nome:: seq car; alfa: vet [1970...1975] de nome;

celula:: ref int; onde : celula

Page 62: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Comandos Básicos

Page 63: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

São utilizados para manipular as variáveis, são eles:

Atribuição variável expressãoEntrada Leia ( lista_de_variáveis)Saída Escreva ( lista_de_variáveis) Se condição então comando

Condicionais Se condição então comando senão comando

Interação Enquanto condição faça comando Repita comando até

(que) condição para variável de valor_inicial incr

valor_do_incremento até valor_inicial.

Faça comando

Escape de malha Saída ou escape

Seleção Conforme variável, Faça lista_dos_casos

Page 64: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Atribuição

• V e (e precisa ser do mesmo tipo de V)

• X (Y+Z)/2.0 x,y e z: real;

• “O valor de X depois da avaliação será média aritmética dos valores de Y e Z antes”

• i i+1 exemplo comum para contagens Variáveis de tipo contruído:

var custo: vet[1..5] de real;

custo[1] custo[2] + 7.8 var matr: reg(disc: int, turma: car); matr (2015, ‘ a’ );

• Exemplos:

Page 65: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Entrada de Dados

• Leia (V1, V2, V3, ... , Vn); Neste caso todas as variáveis listadas recebem vetores do dispositivo de entrada. Por exemplo:

var

x: real; i: int; a: vet [1..3] de int;

Início

leia (x,a,i)

Fim.

Causará a leitura do dispositivo de entrada para x, a e i de um real, um vetor e um inteiro.

• Exemplos:

Page 66: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Saída de Dados

• Escreva (V1, V2, V3, ...Vn); Neste caso todas as variáveis listadas serão escritas no dispositivo de saída, por exemplo:

var

i: int; a: vet [1..5] de int; x: real;

Início

x 2.1; i i+ 2; a[2] i;

escreva(i,a,x);

Fim.

• Exemplos:

Page 67: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Condicional

• Se L Então A Senão B

var x,y,z: real; {Calcula o menor de 2 nos.}

Se x < y Então z x {comando simples}

Senão Início {comando composto}

z y;

Se x < z Então z x;

Fim;

• A avaliação da condição não altera o valor de nenhuma variável mesmo que ela contenha expressões como:

Se (2.0*y < x/3.2) .e. (z<>0) Então...

• Exemplos:

Page 68: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Iteração - Enquanto

• Enquanto L Faça A

Var x, y: int;

Início

Enquanto x =< y Faça x 2*y;

Enquanto x <> y Faça

Se x > y Então x x - y

Senão y Y - x;

Fim.

• Causa a repetição do comando até que x=y. Caso o sejam no início o programa termina após o primeiro teste.

Page 69: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Iteração - Repita

• Repita A até L

Var x,y: int;

Início

Se x >< y Então

Repita

Se x > y Então x x-y

Senão y y-x;

Até x=y;

Fim.

Page 70: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Iteração - Para

• Para V de i incr P até F Faça A

Var i, soma: int;

valor: vet [1..10] de int;

Início

Soma 0.0;

Para i 1 até 10 Faça

soma soma+valor[i];

Fim.

Page 71: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Seleção

• Caso V Faça (V1:C1, V2:C2,...,Vn:Cn) ou

• Caso V Faça (V1:C1, V2:C2,...,Vn:Cn)

Senão Faça (V1:C2, V2:C3,...,Vn:Cn+1)

Onde Vi são valores e Ci são comandos, exemplo:

Var Ch: car;

Início

Caso Ch Faça

‘A’..’Z’,’a’..’z’: Escreva (‘Letra’);

‘0’..’9’: Escreva(‘Digito’);

‘+’,’-’,’*’,’/’: Escreva (‘Operador’);

Senão Escreva (‘Caracter especial’);

Fim;

Fim.

Page 72: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Vetores

Page 73: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Variáveis Indexadas - Vetores

• A utilização de vetores em

computação é uma técnica

muito útil para a otimização

de tempo e memória e torna

um programa mais elaborado

e eficiente.

Forma geral:

Tipo vetor:: vet[1..3] de int;

Var A, B, C: vetorz;

Page 74: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Leitura e Escrita de Vetor

• Exemplo: Leitura

Var x: vet[1..4] de int;

Início

Para i:= 1 até 4 Faça leia(x[i]);

Fim.

• Exemplo: Escrita

Var x: vet[1..4] de int;

Início

Para i:=1 até 4 Faça Escreva(x[i]);

Fim.

• É bom lembrar que poderíamos usar os comandos Repita e Enquanto, tanto na leitura quanto na escrita.

Page 75: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Matrizes

Page 76: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Variáveis Indexadas - Matrizes

• Uma matriz é uma variável

indexada que possui 2 dimensões

e portanto precisa de 2 índices

para marcação de valor. Sua

representação matemática é:

dimensão: m - linhas representação: Amxn

n - colunas

Forma geral:

Tipo matriz:: vetor[1..3,1..3] de int;

Var A, B, C: matriz;

Page 77: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Leitura e Escrita de uma Matriz

• Faz-se necessário 2 varreduras,

uma com a variável “j” percorrendo

as colunas e outra com a variável

“i” percorrendo as linhas:

• Exemplo: Leitura

Para i:= 1 até m Faça

Para j:= 1 até n Faça Leia(A[i,j]);

• Exemplo: Escrita

Para i:= 1 até m Faça

Para j:= 1 até n Faça Escreva(A[i,j]);

Page 78: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Exemplo

• Fazer um algoritmo para ler e imprimir a matriz:

Algoritmo matriz;

var A: vet[1..3,1..3] de int; i,j: int;

Inicio

Para i:= 1 ate 3 Faça

Para j:= 1 ate 3 Faça Leia(A[i,]);

Para i:= 1 ate 3 Faça

Para j:= 1 ate 3 Faça Leia(A[i,]);

Fim.

Page 79: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Registros

Page 80: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Registros

• São conjuntos de dados logicamente relacionados, mas de tipos diferentes (inteiro, real, car etc.); Utilizamos registros, quando vetores ou matrizes possuem diferentes componentes dentro de um mesmo campo, por exemplo:

Como criar uma matriz

desse tipo, onde existem

2 tipos de variáveis (int

e car)? Percebe-se que é

impossível a utilizaçãode matrizes,

pois na mesma declaração só pode conter um tipo de elemento. Por isso utiliza-se “reg”.

Page 81: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Forma Geral de Registro

• Tipo

pagantes:: reg (cadast: int,

nome: caract,

bandeira: caract,

pagamento: caract);

• Pode-se utilizar vetor composto por reg ou matriz composta por reg, exemplo:

• Escreva um algoritmo que dados 10 codigos de profissão, emita o nome da profissão correspondente.

Page 82: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Tipo lista: reg(codigo: int,

nome:caract);

Var Tab: lista;

cod,i,k: int;

Inicio

Para i:= 1 ate 10 Faça leia(tab[i].codigo, tab[i].nome);

Leia (cod); {recebe o codigo para comparar}

Repita

i:= 1;

Enquanto(tab[i].cod<>cod) e (i=<10) Faça i:=i+1;

Se (i>10) Então Escreva(‘Codigo invalido’)

Senão Escreva(‘Cod. Desejado ‘,tab[i].nome);

Ate(cod=0);

Fim

Page 83: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Linguagem C

Page 84: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Linguagem C

• Principais Características– Entrada e saída de dados

– Bases numéricas

– Estruturas de seleção

– Estruturas de repetição

– Matrizes/vetores

– Operadores lógicos

– Funções internas e subprogramas

Page 85: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Ambiente de programação

• Para a edição de programas, compilação e execução utilizaremos o ambiente Turbo C, especificamente a IDE (Integrated Design Environment) que funciona a partir dos sistemas operacionais DOS e WindowsXX.

• A IDE é uma interface de desenvolvimento prática e eficiente que vai facilitar bastante o desenvolvimento dos programas em C.

• Maiores detalhes do funcionamento da IDE, principais menus e comandos de edição e compilação estão disponíveis em Turbo C - Guia do Usuário.

Page 86: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Identificadores• Usados para nomear as variáveis, as funções e os rótulos dos

programas. A linguagem C:

– reconhece os 31 primeiros caracteres do nome; e

– diferencia as maiúsculas e as minúsculas.

• O identificador sempre começa por letra

• Normalmente: maiúsculas constantes

minúsculas variáveis

• Exemplo: Corretos Errados

cont 1cont

teste23 alô!

Alto_balanco alto..balanço

Page 87: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Palavras reservadas

O nome deve ser diferente das seguintes palavras reservadas:

int char float void enum

short long signed unsigned double

struct union typedef sizeof auto

register static extern const volatile

goto if elseswitch case

default break while do for

continue return

Page 88: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Tipos e tamanhos

• Tipos simples:

char: caracter (1 byte)

int: inteiro (>= 2 bytes dependendo da máquina)

float: ponto flutuante, precisão simples (>= 6 bytes, dep. Máq.)

• Qualificadores:

short: se aplica ao tipo int long: se aplica a int e float

signed: se aplica a char e int unsigned: idem char e int

• Variáveis

Tipos simples: char, int, float e double

Tipos compostos: estruturas, tabelas, uniões etc.

Domínio de validade: auto, static, extern e register.

Sintaxe: [classe] [qualificador] tipo nome_variavel [=valor];

Page 89: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Constantes

• Declaração simples:

# define NUM_MAX_CARACT 100

# define MENSAGEM “alo, alo, Terezinha”

# define CR ‘\n’

# undef MENSAGEM

• Qualificadores

3.14 tipo “double” 3.14f ou 4.14F tipo “float”

1.3e-3 ou 1.3E-3 tipo double 074 tipo inteiro, em octal

3l ou 3L tipo inteiro longo 255u ou 255U tipo inteiro, sem sinal

3.14l ou 3.14L tipo d”double” longo

0x3b ou 0X”b tipo inteiro, hexadecimal

Page 90: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Constantes• Domínio de validade:

– da definição da constante até o final do arquivo ou até encontrar a diretiva #undef da constante

• Constantes do tipo caracter devem ser escritas entre apóstrofos (por exemplo: `l`, `a`, `x`, `\n`, `\t`)

• Representação de caracteres ASCII não imprimíveis:

– nova linha = `\n` tabulação = `\t`

– espaço p/trás = `\b` retorno do carro = `\r`

– página segui nte = `\f ` barra de fração revertida = `\\`

– apóstrofo = `\’` null = `\0`

– bell = ‘\a’ formfeed = `\f `

– haspas = `\” ` interrogação = `\?`

– caracter definido pelo seu valor ASCII (em octal) = `\ddd`, ex.: `121`

– caracter definido pelo seu valor ASCII (em hexa] = `\xdd`, ex.: `\x2a`

Page 91: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

• Operadores aritméticos (multiplicativos e aditivos):

+, -, *, /, % (resto de divisão inteira)

• Operadores bit a bit: & (e), | (ou), ^ (ou-exclusivo)

• Operadores de deslocamento: << (esquerda), >> (direita)

• Operadores relacionais: <,<=, >, >=

• Operadores de igualdade: ==, !=

• Operadores lógicos: && (e), || (ou)

• Operadores unários: *p : conteúdo de p &v : endereço de v

-e : menos e !e : negação (booleana) de e

~e : complemento bit a bit de e ++v : v = v + 1

-v : v = v - 1 v++ : retorna v e depois v = v + 1

v- : etorna v e depois v = v - 1 (tipo)v : converte v para o tipo

sizeof(e) : numero de bytes ocupado por e

sizeof(tipo) : n° de bytes ocupado por um objeto do tipo definido

Operadores

Page 92: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Operadores

• Operadores de atribuição:

=, +=, -=, *=, /=, %=, <<=, >>=, &=, |=, ^=

• Operador vírgula:

x = y++, z; equivale a y = y + 1; x = z

• Operador condicional:

exp ? exp1 : exp2

Exemplo: x = (a > b) ? a : b; equivale a:

Se a é maior que b, então x = a; senão x = b

Page 93: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Precedência e ordem de avaliação

Operador Avaliação

( ) [ ] -> . esq->dir

! ~ ++ --(tipo) * & sizeof dir->esq

* / % esq->dir

+ - esq->dir

<<>> esq->dir

< <=> >= esq->dir

== != esq->dir

& esq->dir

^ esq->dir

| esq->dir

&& esq->dir

|| esq->dir

? : dir -> esq

= += -= etc. dir -> esq

, esq-> dir

Page 94: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Instruções de controle• Observações preeliminares:

– uma instrução é sempre terminada por “ ; “

– comentários: /* isto é um comentário */

– as chaves { e } são usadas para agrupar declarações e instruções em um bloco, o qual é sintaticamente equivalente a uma única instrução, exemplo:

While (n != 2) { /* bloco*/

x = y + z;

n = n / 2;

}

– um bloco nunca termina com };

– variáveis podem ser declaradas dentro de

qualquer bloco (e tem validade só dentro do bloco).

Page 95: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Instrução if

• Caso mais simples: if (expressão) instrução

• Caso completo: if (expressão) instrução;

else if (expressão) instrução;

.....

else instrução;

Page 96: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Instrução switch

• Sintaxe:

switch (expressão) {

case expr-constante: instr;

instr;

break;

case expr-constante: instr;

break;

default: instr;

break;

}

Page 97: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Instrução while• Caso mais simples: while (expressão) instr;

• Caso geral: while (expressão) { instr;

instr; }

• A instrução “break” faz sair da malha “while”. Exemplo:

while (i++ != 10)

{ soma += x[i];

if (soma >= 100.) break; }

• A instrução “continue” faz com que a iteração seguinte da malha seja realizada imediatamente, exemplo:

while (i++ < 10)

{if (x[i] == ‘\n’) continue;

y[i] = y[i];

}

Page 98: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Instrução do/while

• Caso simples: do instrução;

while (expressão);

• Caso geral: do {

instrução;

.....

instrução;

}

while (expressão);

• As instruções break e continue também são aplicáveis ao do/while.

Page 99: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Instrução for• Sintaxe: for (expr1; expr2; expr3) {

instr;

...

instr; }

• A instrução “for” é equivalente a:

expr1;

while (expr2) {

instr;

....

instr;

expr3; }

• As instruções “break” e “continue” também são aplicáveis a malha for.

Page 100: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Instrução goto

• Sintaxe:

goto rotulo

...

Rotulo: instr;

instr;

...

Page 101: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Funções

• Generalidades

– A linguagem C é baseada no conceito de blocos de construção, que são chamados de funções.

– O nome de uma função sofre as mesmas restrições que o nome de uma variável.

– Como também ocorre com as variáveis, um tipo é sempre associado a uma função (tipo do valor de retorno)

• tipos básicos: void, char, int, float, double

• qualificadores: short, long, signed, unsigned, exemplo: short int func ()

– Retorno de valor: return expr;

– Declaração de uma função: float calc (int, float);

– definição de uma função: foat calc (n, x)

int n; float x;

{corpo da função}

– não se pode definir uma função no interior de um bloco {.....}

Page 102: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Função main• O programa principal é uma função cujo nome é “main”

• A função “main” pode ser do tipo: main ()

{ ...... }

• Ou do tipo: main (argc, argv)

int argc; char *argv;

{ .......... }

• O valor contido em “argc” corresponde ao número de argumentos recebido da linha de comando

• Por sua vez, “argv” corresponde à tabela de argumentos da linha de comando, exemplo: cp arq1 arq2

– cp: nome do programa

– arq1 e arq2 : argumentos

– argc = 3

– argv = [ “cp”, “arq1” , “arq2”]

Page 103: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Alocação do espaço de memória

• Classe auto

– alocação por “default”

– alocação feita no momento da declaração

– liberação no final do bloco (variável local) ou no final do programa (variável global)

• Classe static

– alocação feita na declaração

– liberação no final do programa

– uma variável local, declarada “static”, guarda seu valor de uma chamada a outra da função (conceito de permanência do valor)

– uma variável global, declarada “static” , só é acessível por funções contidas dentro do arquivo onde foi declarada (conceito de privacidade)

• Classe extern

– a variável é alocada em um outro arquivo

Page 104: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Alocação de espaço de memória

• Classe register

– deve ser empregado somente com as variáveis automáticas (“auto”)

– classe de alocação normalmente empregadas para as variáveis utilizadas de maneira intensiva

– o compilador é livre de atribuir um registrador do processador à variável ou de ignorar a solicitação

– não se pode, evidentemente, tentar obter o endereço de uma variável do tipo “register”

– como regra geral, as variáveis de classe “register” são do tipo “char” ou “int”

Page 105: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Definição de tabelas (arrays)

• Uma tabela é um conjunto de elementos de mesmo tipo.

• Declaração:

– [classe] [qualificador] tipo tabela [n° elementos];

• Inicialização:

– tipo tabela[ ] = {val1, val2, ...}

• Exemplos:

– char v[10];

– static double x[20];

– int stat[ ] = { -1, -1, 0, 1};

• Acesso a um elemento de uma tabela, exemplos:

– y = x[10];

– ss = stat [2*i-3];

• Tabelas multidimensionais

– int tab[2] [3] [4]; ou double pos[3] [3];

Page 106: Fundamentos de Programação Alexandre Carlos Brandão Ramos  ramos@unifei.edu.br

Estruturas• Uma estrutura corresponde a um conjunto de uma ou mais

variáveis, eventualmente de tipos diferentes e agrupadas sob um mesmo nome

• Exemplos de declarações de estruturas (“struct” define o tipo estrutura)

– declara a estrutura “x” (tipo “num_complexo”), alocando para a mesma 2 campos do tipo double:

struct num_complexo { double parte_real;

double parte_imag; } x;

– declara a estrutura “data”, alocando para a mesma inteiros:

struct { int dia;

int mês;

int ano; } data;

• Acesso aos membros de uma estrutura: data.dia = 18;