• Nenhum resultado encontrado

UNIVERSIDADE SALGADO DE OLIVEIRA

N/A
N/A
Protected

Academic year: 2019

Share "UNIVERSIDADE SALGADO DE OLIVEIRA"

Copied!
76
0
0

Texto

(1)

1

U N IVERSI DADE SALGADO

DE OLI VEI RA

Curso de Li nguagem Curso de Li nguagem

de Program aç ão C de Program aç ão C

Prof. Giuliano Prado M. Giglio, M.Sc.

Prof. Giuliano Prado M. Giglio, M.Sc. [email protected]

2

PROGRAM A

z 1. INTRODUÇÃO

z 1.1 História

z 1.2 Estruturação de um Programa em C

z 1.3 Tipos

z 1.4 Variáveis

z 1.5 Constantes

z 1.6 Entrada e Saída Básicas

z 1.6.1 A Função printf()

z 1.6.2 A Função scanf()

PROGRAM A

z 2. OPERADORES

z 2.1 Operadores aritméticos

z 2.2 Operador de atribuição

z 2.3 Operadores relacionais

z 2.4 Operadores lógicos

z 2.5 Operadores bit a bit

z 2.6 Atribuições reduzidas

z 2.7 Operadores pré e pós fixados

z 2.8 Operadores condicionais

z 2.9 Operador vírgula

z 2.10 Precedência de operadores

z 3. CONTROLE DE

FLUXO z 3.1 if

z 3.2 while

z 3.3 do-while

z 3.4 for

z 3.5 break

z 3.6 switch

PROGRAM A

z 4. FUNÇÕES

z 4.1 Definição de Função

z 4.1.1 Variáveis Locais

z 4.1.2 Chamando Funções

z 4.1.3 Programa Exemplo

z 4.2 Argumentos

z 4.3 Valor de Retorno

z 4.4 Recursividade

z 4.5 Classes de Armazenamento

z 4.6 O Pré-processador C

z 4.6.1 A Diretiva #define

z 4.6.2 A Diretiva #undef

(2)

5

PROGRAM A

z 5. VETORES E MATRIZES

z 5.1 Vetores

z 5.1.1 Inicialização

z 5.1.2 Vetores como argumento de funções

z 5.2 Vetores de Caracteres

z 5.2.1 A função strlen()

z 5.2.2 A função strcmp()

z 5.2.3 A função strcpy() z 5.2.4 A função strcat()

z 5.3 Matrizes

z 5.3.1 Inicialização

z 5.3.2 Matrizes como argumento de funções 6

PROGRAM A

z 6. DADOS ORGANIZADOS

z 6.1 Estruturas

z 6.1.1 Acessando dados membro

z 6.1.2 Estruturas dentro de estruturas

z 6.1.3 Atribuição entre estruturas

z 6.1.4 Passando estruturas para funções

z 6.1.5 Vetores de estruturas

z 6.1.6 Ponteiros para estruturas

z 6.2 Uniões

z 6.3 Enumeração

z 7. ENTRADA E SAÍDA z 7.1 Arquivos Texto

z 7.1.1 As funções fopen() e fclose()

z 7.1.2 As funções getc () e putc()

z 7.1.3 As funções fgets () e fputs()

z 7.1.4 As funções fprintf () e fscanf

z 8. PONTEIROS

Progra m a

If (a>b) {

printf ( “A é maior”) }

else {

printf (“B é maior”)

} Tradutor:

Compilador + Linkeditor

programa.exe

(3)

9

Proc e ssa me nt o de Lingua ge ns

z

Linguagens de Programação

: são

projetadas em função da facilidade na

construção e confiabilidade dos

programas

z

Como executam em uma computador cuja

Linguagem de Máquina é bastante

diferente?

10

Proc e ssa me nt o de Lingua ge ns

z

Existem basicamente duas alternativas

para esta implementação :

1) Interpretação 2) Tradução

z

A interpretação de um programa é feita

pela chamada dos subprogramas, escrito

na linguagem de máquina do computador

hospedeiro, em seqüência apropriada

Int e rpre t a ç ã o

1. Obter o próximo comando do programa

2. Determinar que ações devem ser

executadas

3. Executar essas ações

z

simulação de um computador

hospedeiro

de uma máquina especial

cuja linguagem de máquina é de nível

mais alto

Int e rpre t a ç ã o

z

Esta seqüência é bastante semelhante

àquela executada por computadores

tradicionais:

1. Obter a próxima instrução (PC) 2. Incrementar o PC

(4)

13

TRADU ÇÃO

z

Programas escritos em LP de alto nível

são traduzidos para versões equivalentes

em linguagem de máquina antes de

serem executados

y Essa tradução é feita em vários passos y Compilador

y Linkeditor y Loader

14

COM PILAÇÃO

z

Logicamente a tradução pode ser dividida

em 2 grandes partes:

y análise do programa fonte (dados de entrada)

y síntese do programa objeto executável

Sínt ese do programa objet o

z

A saída da fase anterior consiste

basicamente de

y programas quase executáveis (*.o)

y podem fazer referências a dados externos ou outros programas

z

Linkedição: une diversos *.o em um

programa executável pronto para rodar

Progra m a

If (a>b) {

printf ( “A é maior”) }

else {

printf (“B é maior”) }

Compilador programa.exe

A é maior

If (a>b) {

printf ( “A é maior”) }

else {

printf (“B é maior”) }

If (a>b) {

printf ( “A é maior”) }

else {

printf (“B é maior”) }

pgm1.c

pgm2.c

Linkeditor pgm1.o

pgm2.o

(5)

17

Sínt ese do programa objet o

z

Linkedição

y um procedimento para finalizar a resolução de referências

y programas podem ser traduzidos separadamente

y ou utiliza-se uma biblioteca

18

Visão Geral de um Progra m a

z

O Problema

º Imprimir uma mensagem mostrando o que está sendo somado

º Calcular a soma de três números º Imprimir o resultado

Visão Geral de um Progra m a

z

Este programa não faz muita coisa

y Como seleciona os números a somar? y Não imprime nenhuma mensagem

explicativa?

(6)

21

Visão Geral de um Progra m a

º

Definindo melhor o problema

º Exibir para o usuário o que faz o programa

º Exibir o que espera como entrada

º Pedir os três valores (A, B,C) e armazenar

º Somar A + B + C e guardar em SOMA

º Exibir o valor SOMA ao usuário

22

M odelo de um Programa

z

Este é um modelo seguido pelos

programas

z

Um programa tem que ser capaz de

armazenar sua entrada em algum lugar

Entrada Processa a Entrada Produz a Saída

M odelo de um Programa

z

Entradas são armazenadas para serem

processadas e gerar uma saída útil

z

Dados são armazenados em variáveis

y posições de memória com um nome que podem conter dados

y as variáveis podem conter tipos diferentes de dados

Variá veis e Tipos de Dados

z

Variáveis podem conter valores diferentes

durante a execução do programa

y os valores são consistentes com o tipo da variável

z

Alguns valores não devem ser alterados

durante a execução

(7)

25

Variá veis e Tipos de Dados

z

Dados em variáveis ou constantes

-podem ser de diferentes tipos

y inteiros ( curtos / longos) y reais - ponto flutuante

x precisão simples ou dupla y caracteres isolados y string de caracteres

26

Variá veis

z

Variável é algo que se altera

z

Dados armazenados em uma variável

podem se modificar

z

Em um programa

y definir uma variável significa reservar uma memória para armazenar seus valores

Variá veis

z

As linguagens de Programação permitem

definir identificadores as variáveis

º Imprima(“Programa de Soma de Valores”) º Imprima (“Entre 3 valores inteiros separados

por branco”)

º Leia (A,B,C)

(8)

29

Variá veis

z

Deve-se atribuir às variáveis nomes que o

ajudem a lembrar a finalidade de cada

uma delas

z

Nomes mais longos tornam seu programa

mais claro

y outros podem ter que revisar seu código y pode ser necessário revisar o programa

daqui a 6 meses

30

Ident ificadore s

z

Identificador: Um elemento básico da

Linguagem

y identificadores válidos: A, AB, A1B12C y identificador inválido: 1AB

z

Identificadores dão nomes a:

y Variáveis

y Trechos de Programa

Ident ificadore s

z

C- Padrão ANSI: nomes de variáveis,

funções, rótulos == identificadores

y Tamanho: 1 a diversos caracteres: pelo menos os 61ºs são válidos

y 1o. caracter - letra ou sublinhado

(9)

33

Tipo de Dados

z

Na matemática, variáveis são classificadas

de acordo com algumas características

importantes

z

Existe distinção clara entre

y variáveis reais, complexas e lógicas y valores individuais e conjunto de valores y funções

34

Tipo de Dados

z

Esta noção de classificação é muito

importante

z

Cada constante, variável, expressão ou

função é de um certo

tipo

y refere-se ao conjunto de valores que pode assumir

Tipo de Dados

z

Em programas, não é possível deduzir o

tipo da variável a partir do seu contexto

y é necessário explicitar o tipo de cada variável y a cada tipo de dados está associada uma

representação na computador

y é necessário conhecer o tipo de dados para saber qual a sua representação

Tipo de Dados

z

A um tipo de dados está associado:

y uma representação

y o tamanho de células de memória para armazenar esta representação

x a área de memória onde ficará o valor da variável tem que ter dimensões compatíveis com a sua representação

(10)

37

Tipo de Dados

z

As operações exigem argumentos de um

dado tipo e produzem resultados do

mesmo tipo

z

É importante para o compilador saber o

tipo de cada variável antes de empregá-la

em uma operação

38

Definiç ão de Variá veis

z Variável

y o nome do local onde se pode colocar qualquer conjunto de valores possíveis do tipo básico associado.

y nome da variável é um identificador

y toda a variável deve ser declarada da seguinte forma:

x tipo identificador [,identificador, ...] ;

Tipos Básicos do C

z

São cinco os tipos de dados básicos do

C

y char y int y float y double y void

Tipos Básicos do C

z O tamanho e a faixa destes dados dependem do processador e da implementação do compilador

x char - 1 byte - ASCII - byte (signed/unsigned : depende da implementação)

x inteiro - 2 bytes - tamanho natural de uma palavra do processador

x float - dependem da representação do ponto flutuante - padrão ANSI: 1 x 10-37 a 1 x 10+37

(11)

41

Definiç ão de Variá veis

z

int X1

z

float A, B;

z

char Nome;

42

Definiç ão de Variá veis

z

A semântica da declaração de uma

variável corresponde a

y criação de locais na memória rotulados com o nome da variável (identificador)

y marcada com o tipo de valores que ela pode conter (equivale a um tamanho e forma de representação)

y X1: é o nome do local de memória que só pode conter variáveis do tipo inteiro

y A e B só podem conter variáveis do tipo real

Compa t ibilida de de Tipos

z

É importante observar que:

y o resultado da expressão do lado direito de um comando de atribuição deve ser coerente com o tipo declarado para a variável do lado esquerdo

y a = b+c;

b e c float então a deve ser float

Compa t ibilida de de Tipos

z

a = 3;

y a inteiro

z

i = i + 1;

y i inteiro

(12)

45

Ex pressõe s

z

Uma forma linearizada da usada na

matemática

z

Operadores Aritméticos

x +, -, *, /

x 3/2 = 1 (divisão de inteiros)

z

Precedência: da matemática

y uso de parênteses y a = b+c * (x*y-5); y a = a+2;

y mod : resto da divisão inteira

46

Ex pressõe s

z

Operadores Lógicos

y dentro das relações lógicas, usaremos conectivos lógicos usuais

y E (&&)

y OU (||)

y NEGAÇÃO (!)

z

Conectivos relacionais

y >, <, >=, <=, ==, !=

Ex pressõe s

z

Prioridades para operações mistas

x 1o. : parênteses e funções

x 2o. : expressões aritméticas * , /

+ , - (binários)

x 3o. : comparações

>, >=, <, <=, ==, !=

x 4o. : !

x 5o. : &&

(13)

49

Com ent ários

z

Uma anotacão

z

Servem para ajudar a explicar a

codificação

z

Seu programa deve ser compreendido por

qualquer outro programador

y /* ………COMENTÁRIO ………..*/ y // …… comentário até o fim da linha

50

Com ent ários

z

Devem ser utilizados com liberalidade em

todo o programa

z

Devem explicar seu algoritmo

z

Estão relacionados com a solução do

problema

z

Não devem ser óbvios

At ribuiçã o

z

Atribuição

y designam valores a uma variável y A = B /* Faz A = B */

y /* Este é um comentário óbvio -desnecessário */

y os valores atribuídos a uma variável devem ser compatíveis com seu tipo

z

Sintaxe:

identificador = valor ;

Ent rada / Sa ída

z

Entrada: informações para o programa

y ítens sendo adquiridos em uma compra de supermercado

z

Saída: informações para o usuário

(14)

53

Ent rada / Sa ída

z

A instrução de entrada lê de um

dispositivo de I/O uma informação

y teclado y leitora ótica

y ao digitar o número 10

x 2 caracteres

x a operação de entrada converte para a representação interna

54

Ent rada / Sa ída

z

Origem da Entrada

y teclado

y disco - arquivo

z

Destino da Saída

y vídeo y impressora y disco - arquivo

Ent rada / Sa ída

z

Entrada

y scanf (“%d”, &a); y c = getc();

z

Saída

y printf(“O número é %d”, a);

Comandos de Ent rada/Saída

z

c = getc()

y le um caracter do teclado

z

scanf (“%d”, &num)

y le um dado do teclado com o formato especificado

z

printf (“%d”, num)

(15)

57

Form at o

z

%d - inteiro

z

%f - real

z

%c - caracter

z

%s - string

z

\n - próxima linha

z

scanf(“%s %d, %f”, nome, &freq, &nota)

y le uma linha no seguinte formato Maria 12, 7.5

58

Prime iros Programas e m C

# include < st dio.h>

/ * Um Prim eiro Program a * / int m ain ( )

{

print f ( " Ola! Eu est ou v iv o! \ n" ) ; ret urn( 0) ;

}

Prime iros Programas e m C

# include < st dio.h> int m ain ( )

{

int Dias; / * Declaracao de Var iaveis * / float Anos;

pr int f ( " Ent re com o núm ero de dias: " ) ; / * Ent rada de Dados * /

scanf ( " % d" ,&Dias) ;

Anos= Dias/ 365.25; / * Conversao Dias- > Anos * / pr int f ( "\ n\ n% d dias equivalem a % f anos.\ n" ,Dias,Anos) ; ret urn( 0) ;

}

Prime iros Programas e m C

# include < stdio.h> int m ain ( )

{

char Ch; Ch= 'D';

pr int f ( "% c",Ch) ; r et ur n( 0) ;

}

(16)

61

Operações Especiais do “C”

z

Incrementando 1:

y i++; y ++i;

z

Decrementando 1:

y i--; y --i;

62

Operações Especiais do “C”

z

x + + ;

z

x - - ;

são equiv alent es a

z

x = x + 1;

z

x = x - 1;

Operações Especiais do “C”

z

x = 23;

z

y = x + + ;

t er em os, no final,

y=23

e

x=24

.

Em

z

x = 23;

z

y = + + x ;

t er em os, no final,

y=24

e

x=24

.

Operações Especiais do “C”

# include < stdio.h> int m ain ( )

{

char Ch; Ch= 'D';

pr int f ( "% c",Ch) ; r et ur n( 0) ;

}

(17)

65

Comando para o Compilador

z

#include <Nome_arquivo>

y expande o arquivo de Nome_arquivo dentro do arquivo fonte

z

#define MAX 10

y define MAX como uma constante 10 y substitui o texto MAX por 10

y funciona como uma macro

66

U m Programa em “C”

# include <……> # include <……> #define …… #define ……

/* definições de tipos */ typedef int tipo_a;

/* protótipos de funções */ float calc_media (int x, int y, int

z);

/* função principal */ main ()

{ …………. }

/* as outras funções */

int calc_media (int x, inty, int z) {

……… }

Comandos Bá sicos do C

z

Seqüência simples

(18)

69

Inst ruçõe s Condicionais

z

Se não pode agüentar o calor, fique fora

da cozinha

y avalia uma condição

y executa uma ação com base no resultado positivo

y if (calor > máximo) {………}

70

Inst ruçõe s Condicionais

y if (NaoAguentaCalor) {

if (JanelaNaoAbre) {

FiqueForaDaCozinha} }

else

{ LavePratos}

Comandos Bá sicos do C

z

Alternativa

y Quando a ação a ser executada depender de uma inspeção ou teste, teremos uma alternativa simples ou composta

z

Alternativa simples

x se <condição> então

x C1;

x C2;

x C3;

x C4;

Comandos Bá sicos do C

z

Alternativa simples

y “C”

if (<condição>) {

(19)

73

Comandos Bá sicos do C

z

Alternativa composta

se <condição> então C1;

C2; C3; C4; senão C5; C6; C7; C8; fim se;

74

Comandos Bá sicos do C

z

Alternativa composta

y “C”

if (<condição>) { C1;

C2; C3; C4; } else { C5;

C6; C7; C8; }

Comandos Bá sicos do C

z

Nos comandos acima <condição> é

qualquer expressão cujo resultado é

um valor booleano ou seja true ou false

z

Exemplos

y onde está relacionado um bloco de comandos (limitados por { / }) pode ser usado um único comando

y bloco: como um novo comando / extensão da linguagem

Inst ruçõe s Ca se

z

Forma abreviada de escrever instruções

condicionais

y quando se compara uma mesma variável com diversos valores

(20)

77

Inst ruçõe s Ca se

switch idade { case “20”:

printf (“Ola!”); break; case “30”:

printf (“Tudo bem?”); break; case “40“:

printf (“Como vai?”); break; }

78

Inst ruçõe s Ca se

# include < st dio.h> int m ain ( )

{

int num ;

prin t f ( " Digit e um num ero: " ) ; scanf ( " % d" ,& num ) ;

sw it ch ( num ) {

case 9 : prin t f ( " \ n\ nO num e ro e igual a 9 . \ n" ) ; bre a k ; case 1 0 : prin t f ( " \ n\ nO num er o e igual a 1 0 . \ n" ) ; br ea k ; case 1 1 : prin t f ( " \ n\ nO num er o e igual a 1 1 . \ n" ) ; br ea k ; defa ult : prin t f ( " \ n\ nO num e ro nao e ne m 9 nem 1 0 nem 1 1 .\ n" ) ;

}

ret u r n( 0 ) ; }

Inst ruçõe s Ca se - EXERCÍ CI O

Escrev a um program a que pede para o usuário ent rar um núm ero correspondent e

a um dia da sem ana e que ent ão

apresent e na t ela o nom e do dia, ut ilizando o com ando swit ch.

Comandos Bá sicos do C

z

Repetição

y quando um conjunto de ações é executado repetidamente enquanto uma determinada condição permanece válida

(21)

81

Comandos Bá sicos do C

z

Repetição

enquanto <condição> faça C1;

C2; C3; C4;

fim enquanto;

82

Comandos Bá sicos do C

z

Repetição - “C”

while ( <condição> )

{ C1;

C2;

C3;

C4; }

Comandos Bá sicos do C

z

Repetição

faça C1; C2; C3; C4;

enquanto <condição>;

Comandos Bá sicos do C

z

Repetição “C “

do { C1; C2; C3; C4;

(22)

85

Comandos Bá sicos do C

z

Repetição

for (i=0; i<N; i++) { C1;

C2; C3; C4; };

86

Comandos Bá sicos do C

z

Repetição

y while<condição> ……...

x se já da primeira vez a condição for falsa, os comandos não são executados nenhuma vez y do {……} while , condição>

x se da primeira vez a condição for falsa, os comandos são executados uma vez

y Enquanto a condição for verdadeira os comandos são executados, quando for falsa, o comando é abandonado

Loops

z

Repete uma instrução ou um conjunto de

instruções até que uma condição seja

satisfeita

z

while (condição) { ……… }

z

do { ………… } while (condição)

z

for (i=0; i<N; i++) { ……… }

Loops - EX ERCÍCIO

Escrev a um program a que coloque

os núm eros de 1 a 100 na t ela na

ordem inv ersa ( com eçando em 100

(23)

89

Brea k / Bloco

z

Go To com destino específico

y 1a. Instrução após o final do switch y 1a. Instrução após o final de um loop

z

Bloco

y conjunto de comandos que substituem um comando na sintaxe da linguagem

y { ………}

90

Int eiros

z

Qualquer valor do conjunto dos números

inteiros

y inteiros curtos - int - 4 bytes y inteiros longos - long - 8 bytes y operações

x =

x +, -, *, /(divisão de inteiros)

x mod

Rea is

z

Também chamados de ponto flutuante

z

Qualquer valor do conjunto dos números

reais

y estão limitados no número de dígitos decimais - floatou double

(24)

93

U sando Tipos

z

Se tenho que definir uma variável para

conter idades, que tipo usar?

y inteiros, e curtos são suficientes

z

É função do:

y conjunto de valores que a variável pode assumir

y da precisão que se deseja no resultado de operações

94

U sando Tipos -

Casting

# include < st dio.h> int m ain ( ) {

int num ; float f; num = 10;

f= ( float ) num / 7; prin t f ( " % f" ,f) ;

ret urn( 0) ; }

Ca rac t ere s

z

É qualquer caracter isolado representado

no computador

y letras e números são caracteres y caracteres especiais - &, %

y caracteres especiais e não visíveis - ESC, CR, LF,…

y ocupam 1 byte - ASCII y char a = ‘A’;

Ca rac t ere s

# include < st dio.h> int m ain ( )

{

char let ra;

for( let ra = 'A' ; let ra < = 'Z' ; let ra = let ra+ 1) prin t f( " % c " , let ra) ;

(25)

97

St rings de Ca ract ere s

z

Um número arbitrário de ocorrências de

caracteres

y deixa em aberto o número de ocorrências y não possui uma representação direta no C

y char a[50]

y #define nome ”Maria”

98

St rings de Ca ract ere s

# include < st dio.h> int m ain ( )

{

char st ring[ 100] ;

print f ( " Digit e um a st ring: " ) ;

get s ( st ring) ;

print f ( " \ n\ nVoce digit ou % s" ,st ring) ; ret urn( 0) ;

}

St rings de Ca ract ere s

# include < stdio.h> int m ain( )

{

char str [ 10] = "Joao";

pr int f( "\ n\ nSt r ing: % s", str ) ;

pr int f( "\ nSegunda let r a: % c", str [ 1] ) ; str [ 1] = 'U';

pr int f( "\ nAgora a segunda let r a eh: % c", str [ 1] ) ; pr int f( "\ n\ nSt r ing r esult ant e: % s", st r) ;

r et ur n( 0) ;

St rings – EXERCI CIOS

1. Faça um pr ogr am a que leia um a st r ing e cont a quant os dos car act er es dest a st r ing são iguais à let r a 'c' .

(26)

101

St rings

Funç ã o st rlen();

A função st r len( ) r et or na o núm er o de car act er es da st r ing, sem cont ar o car act er e nulo.

int strlen(char[] s); main()

{

char Nome[6] = "Navio";

printf("%d\n%d\n", strlen("Barco a vela"), strlen(Nome)); }

102

St rings

Funç ã o st rc m p();

A função str cm p( ) com par a duas st r ings.

int strcmp(char[] s1, char[] s2);

Ret or na :

um valor menor que zero se a primeira string for menor que a segunda;

zero se as strings forem iguais;

um valor maior que zero se a primeira string for maior que a segunda.

St rings

Funç ã o st rc m p();

Entende-se pôr comparação entre strings:

sua posição em ordem alfabética.

baseada na tabela ASCII:

as letras maiúsculas possuem um valor menor que as letras minúsculas, ou seja, o caracter 'Z' vem antes do caracter 'a'.

St rings

Funç ã o st rc m p();

# include < st dio.h>

main()

{

(27)

105

St rings

Funç ã o st rc py();

A função strcpy() copia o conteúdo de uma string para outra. A string de destino já tem que ter espaço reservado na memória antes de ser chamada a função.

void strcpy(char[] destino,char[] origem); main()

{

char Nome[10];

strcpy(Nome, "Teste") printf("%s\n", Nome); }

106

St rings

Funç ã o st rc at ();

A função strcat() concatena duas strings, ou seja, anexa o conteúdo de uma na outra. (A string de destino tem que ter espaço reservado na memória).

void strcat(char[] destino,char[] origem); main()

{

char Nome[12];

strcpy(Nome, "Teste") strcpy(Nome, "geral") printf("%s\n", Nome); }

Const a nt e s

z

Não tem seu valor alterado durante a

execução

z

Um programa que verifica idade mínima

para dirigir = 18

º

18 será uma

constante

y de nomes simbólicos a constantes

y facilita a alteração da idade mínima para 16 y numéricas- o próprio número

y caracteres ou strings: ‘A’ “Maria”

N omes das V ariáveis

z

As variáveis devem ser criadas

explicitamente antes de serem usadas

y listar variáveis e seus tipos

y duas variáveis em uma mesma área de programa não podem ter o mesmo nome y use nomes que possuam significado em

relação ao problema

(28)

109

At ribuindo Va lor

z

int idade;

idade = 30;

z

vendas = vendas_antigas +

vendas_novas;

z

num = num + 1;

110

At ribuiçã o

int a = 17, b = 3;

int x , y ;

float z = 17. , z1, z2;

x = a / b;

y = a % b;

z1 = z / b;

z2 = a/ b;

Tipos Embut idos

z

Identifica o comportamento abstrato de

um conjunto de objetos com um conjunto

comum de operações

y inteiros = ...-2,-10,1,2,...

x Operadores: *,-,+,e /

y o tradutor da LP mapeia 25 em 000011001 em representação de complemento a dois.

Tipos Embut idos

z propriedades úteis:

y invisibilidadeda representação subjacente

x o programador não tem acesso a seqüência de bits que o representa

x só pode ser alterada apenas como resultado de operações x alteração visível com novo valor do tipo embutido

y estilo de programação

x protege contra manipulação indisciplinada

(29)

113

Tipos Embut idos

y Modificabilidade

x a implementação das abstrações podem ser mudadas sem afetar os programas que as usam

x aumenta a portabilidade

y Identificação de operadores ambíguos

x os mesmos símbolos de operações podem ser usados para representar um grande número de operações

x por exemplo: soma de inteiros e soma de reais utilizam o mesmo símbolo mas implementam operações diferentes

114

Arra ys

z

Imagine que é necessário controlar uma

centena de valores de pontos em um

torneio

y ponto_1, ponto_2, ……., ponto_100

z

Array é um agregado de variáveis do

mesmo tipo e de mesmo nome

y cada variável é distinguida pelo seu índice no array

Arra ys

z

int ponto [100]

for (i=0; i<99; i++)

ponto [i] = 0;

z

são alocadas em posições consecutivas de

memória

ponto[0] ponto[1] ………. ponto[99]

Arra ys - Inic ia lizaçã o

int numdias[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

O número de elementos do vetor pode ser omitido, ou seja

(30)

117

EXERCÍCIOS - VETORES

1. Escreva um programa C que leia e mostre um vetor de 20 elementos inteiros. A seguir, conte quantos valores pares existem no vetor.

2. Escreva um programa C que leia um vetor de 30 elementos inteiros. Encontre e mostre o menor elemento e sua posição no vetor.

3. Escreva um programa C que leia um vetor de 25 elementos inteiros e um valor inteiro K. Encontre todas as posições do vetor onde temos valores iguais a K.

4. Escreva um programa C que leia dois vetores de 10 posições e faça a multiplicação dos elementos de mesmo índice, colocando o resultado em um terceiro vetor. Mostre o vetor resultante.

118

Arra ys 02 dim ensões - M at rize s

A declaração intA[5][6];

indica que A é uma matriz 5x6 e seus elementos são inteiros.

INICIALIZAÇÃO:

intA[5][6] =

{

{ 1, 2, 3, 4, 5, 6}, { 7, 8, 9, 10, 11, 12},

{13, 14, 15, 16, 17, 18}, {19, 20, 21, 22, 23, 24},

{25, 26, 27, 28, 29, 30}

}

;

intmatrx [3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

PROPRIEDADES DE M AT RI Z

3;3 3;2 3;1 3;0 3 2;3 2;2 2;1 2;0 2 1;3 1;2 1;1 1;0 1 0;3 0;2 0;1 0;0 0 3 2 1 0 MAT 4X4

PROPRIEDADES DE M AT RI Z

(31)

# include < stdio.h> # define lin = 2 0 # define col = 1 0 int m ain ( ) {

int m trx [ lin] [ col] ; int i,j ;

for ( i= 0 ;i< 2 0 ;i+ + ) for ( j = 0 ;j < 1 0 ;j + + ) {

printf( “Digite um valor: ”) ; scanf( “% d”,m tr x[ i] [ j ] ) ; }

re tur n( 0 ) ;

} 122

EXERCÍCIOS - M AT RIZ ES

1. Escrever um programa C que lê uma matriz 5 por 5 e mostre os elementos da diagonal principal. Modifique este programa para calcular a soma dos elementos desta diagonal.

2. Escrever um programa C que lê uma matriz 5 por 5 e mostre os elementos abaixo da diagonal principal. Modifique este programa para mostrar agora os elementos acima da diagonal principal.

3. Escrever um programa C que lê uma matriz 3 por 4 e calcule a média dos elementos desta matriz. Modifique este programa para realizar a média das linhas pares da matriz.

4. Escrever um programa C que lê uma matriz 4 por 4 e um elemento igual a K. Mostre as posições de todos os elementos da matriz que sejam iguais ao valor K fornecido.

Est rut ura s

z

Agrupa de maneira independente um

conjunto de variáveis de tipos diferentes

y pode-se incluir variáveis simples, arrays, outras estruturas

y struct {

char Nome[20]; float Salario; int dependentes;

(32)

125

Pont eiros

z Endereço de memória

y uma variável ponteiro é uma variável especialmente declarada para guardar um ponteiro para seu tipo especificado

y guarda o endereço de uma variável deste tipo z Operadores de Ponteiro: & e *

y &a = endereço da variável a

y *a = conteúdo do endereço cujo valor é a

126

Pont eiros

z

ponteiros em C

y retorno de valores em argumentos de função

y tipos de dados recursivos

estruturas de dados dinâmicas: listas encadeadas ...

Pont eiros

z

&: devolve o endereço de memória do seu

operando ( m = &count)

z

*: devolve o conteúdo de memória

apontado por um ponteiro (q = *m)

z

variáveis que guardam ponteiros devem

ser declaradas como tal

y declaração: tipo * nome_ponteiro y tipo: tipo base do ponteiro

y aloca memória para um endereço

Pont eiros

z

Alargam o contexto a partir do qual se

(33)

129

Pont eiros

z

Podem ser usados para outros propósitos,

tornando programas menos

compreensíveis e inseguros

y pode levar a sérias violações de tipos

x em tempo de tradução é possível garantir que o ponteiro aponta para o tipo correspondente, no entanto isto não é feito em tempo de execução (caro)

130 # include < std io.h>

int m ain ( ) {

int num ,va lor; int * p;

nu m = 5 5 ;

p= & num ; / * Pega o end ereco de num * /

valor= * p; / * Valor e igualado a num de um a m aneira indireta * /

prin t f ( "\ n\ n% d\ n",valor) ;

prin t f ( " Ender eco para onde o pont eiro apont a: p\ n",p) ; prin t f ( "Valor da varia vel apont ada: % d\ n",* p) ;

ret urn( 0 ) ; }

# include < stdio.h> int m ain ( )

{

int num ,* p; num = 5 5 ;

p= & num ; / * Pega o ender eco de num * / printf ( "\ nValor inicial: % d\ n" ,num ) ; * p= 1 0 0 ; / * M uda o valor de num de um a

m aneira indireta * /

printf ( "\ nValor final: % d\ n" ,num ) ; re tur n( 0 ) ;

}

Operações Arit mét icas com

Pont eiros

z p1=p2 z *p1=*p2 z p++ z p -z (*p)++ z *(p+15) z p1>p2

(34)

int m ain( ) {

int y, * p, x; y = 0 ;

p = & y; x = * p; x = 4 ; ( * p) + + ; x - - ;

46

( * p) + = x;

printf ( " y = % d\ n" , y) ; re tur n( 0 ) ;

}

Exercício: Qual o valor de y no final do progr am a?

Tent e pr im eir o descobr ir e depois verifique no com put ador o result ado.

A seguir, escreva um / * com ent ário * / em cada com ando de at r ibuição explicando o

que

ele faz e o valor da var iáve l à esquerda do ’= ’

após sua execuçã o.

134

Pont eiros e V et ores

z Quando você declar a um a m at r iz da seguint e for m a:

tipo_da_variável nome_da_variável [tam1][tam2] ... [tamN];

z O com pilador C calcula o t am anho, em byt es, necessár io par a ar m azenar est a m at r iz:

tam1 x tam2 x tam3 x ... x tamN x tamanho_do_tipo

z O com pilador ent ão aloca est e núm er o de byt es em um espaço livr e de m em ór ia. O

nome da variável que você declar ou é na

ver dade um ponteiro para o tipo da variável da matriz.

Pont eiros e V et ores

z nome_da_variável[índice] *(nome_da_variável+índice)

z *nome_da_variável nome_da_variável[0]

z Apesar de, na m aioria dos casos, nã o fazer m uito sentido, poder íam os ter índices negativos.

z Est aríam os pegando posições de m em ória antes do vetor.

z I sto explica tam bém porque o C nã o verifica a validade dos índices.

y Ele não sabe o t am anho do vet or.

y Ele apenas aloca a m em ór ia, aj ust a o pont eiro do

nom e do vet or par a o início do m esm o e, quando

Varredura Se qüencial

z Conside r e o se guint e pr ogr a m a pa r a z e r a r um a m a t r iz :

int m ain ( ) {

float m at rx [ 5 0 ] [ 5 0 ] ; int i,j ;

for ( i= 0 ;i< 5 0 ;i+ + ) for ( j = 0 ;j < 5 0 ;j + + )

(35)

137

Varredura Se qüencial

z Pode m os r e e scr e v e - lo usa ndo pont e ir os:

int m a in ( ) {

floa t m a t rx [ 5 0 ] [ 5 0 ] ; floa t * p;

int count ; p= m a t rx[ 0 ] ;

for ( count = 0 ;count< 2 5 0 0 ;count + + ) {

* p= 0 .0 ; p+ + ; }

} 138

Varredura Se qüencial

z N o prim eiro program a, cada vez que se faz

matrx[i][j] o program a tem que calcular o

deslocam ento para dar ao ponteiro.

z Ou sej a, o program a tem que calcular 2 5 0 0 deslocam entos.

z N o segundo program a o único cálculo que deve ser feito é o de um increm ento de ponteir o.

z Fazer 2 5 0 0 increm entos em um ponteiro é m uito m ais rá pido que calcular 2 5 0 0 deslocam entos com pletos.

Pont eiros como Ve t ore s

z Sabem os agora que, na verdade, o nom e de um vetor é um ponteiro constante.

z O program a m ostrado a seguir funciona perfeita m ente:

# include < st d io.h> in t m a in ( )

{

int m a t rx [ 1 0 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 } ; in t * p ;

p= m a t rx ;

prin t f ( "O t e rce iro e le m e nt o do vet or e : % d",p[ 2 ] ) ; re t ur n( 0 ) ;

}

z Podem os ver que p[2] equivale a *(p+2).

Cuidados a Serem T omados ao se

U sar Pont eiros

z O principa l cuida do a o se usa r um pont e iro de ve se r: sa iba se m pre para onde o pont e iro e stá a pont ando.

(36)

141

Como

não

usa r um pont e iro:

int m a in ( ) / * Erra do - N ao Ex e cut e * / {

int x ,* p; x = 1 3 ; * p= x ; re t urn( 0 ) ; }

142

Como

não

usa r um pont e iro:

v Este program a com pilar á e rodará . v O que acontecerá ? N inguém sabe!

v O pont eiro p pode est ar apont ando par a qualquer

lugar.

v Você est ar á gr avando o núm er o 1 3 em um lugar

desconhecido. Com um núm er o apenas, você provavelm ent e não vai ver nenhum defeit o.

v Agora, se você com eçar a gravar núm eros em posições aleatórias no seu com putador, não vai dem orar m uito para travar o m icro ( se não acontecer coisa pior) .

EXERCÍCIO

z

Escrev a um pr ogram a que declare

um a m at riz 100x 100 de int eir os.

Você dev e inicializar a m at riz com

zeros usando pont eiros para

ender eçar seus elem ent os.

z

Preencha depois a m at riz com os

núm eros de 1 a 10000, t am bém

usando pont eir os.

Pont eiros

(37)

145

Pont eiros

z

Alocação Dinâmica

y int * x;

x = malloc(sizeof(int));

y um ponteiro pode ficar pendurado, isto é, pode se referir a uma posição que não está mais alocada

free(x);

y uma posição de memória alocada pode ficar inacessível (x local a uma função)

146

Pont eiros

z

Alocação pode causar estouro do heap

ou da pilha

y deve-se sempre utilizar o free quando a memória é desnecessária

z

Ponteiros não inicializados

y podem provocar acesso não controlado à memória

Pont eiros

z

Uma variável ponteiro contém como valor

o endereço absoluto de um objeto do tipo

ao qual o ponteiro está amarrado.

z

NULL: não aponta para nada

z

São variáveis:

y locais ou globais (a ser definido)

Funç ã o

malloc

z Sintaxe:

void* malloc(unsigned long size); z A função malloc aloca um espaço de memória (size

bytes) e retorna o endereço do primeiro byte alocado. y Como pode-se alocar espaço para qualquer tipo de

variável, o tipo de retorno é void*.

y Torna-se necessário converte-lo para um ponteiro do tipo desejado.

(38)

149

Funç ã o

free

z Ao contrário das variáveis estaticamente alocadas apresentadas até agora, a memória dinamicamente alocada não é automaticamente liberada.

z É necessário que o programador libere a memória dinamicamente alocada através da funçãofree.

z Sintaxe:

void free(void* block);

z A função free desaloca a memória alocada..

150

Ex em plo

#include <string.h> #include <stdio.h> #include <alloc.h> void main(void) {

char* str = (char*) malloc(10); strcpy(str, "Alo mundo");

printf("Variavel str: %s\n", str); free(str);

}

Tipos definidos

z

O programador pode definir seus próprios

tipos de dados

y tipos complexos usados da mesma forma que tipos simples

y declaram-se variáveis utilizando-se esses novos tipos

(39)

153

Tipos definidos

z

Estrutura de dados X implementação

y ao criar sua própria estrutura de dados um novo tipo para as finalidades do seu programa

y terá que usá-lo na criação de algumas de suas variáveis

154

Tipos definidos pelo usuário

z

Meios de fornecer nomes aos tipos

z

Novos tipos são definidos a partir de:

y mecanismos construtores de tipos; y tipos embutidos

y tipos já definidos pelo usuário

Tipos definidos pelo usuário

z

Definição de tipo

y equivale a um padrão instanciado pela definição de variáveis

y não incorpora novas operações de acesso ao tipo

y operações: as mesmas dos elementos básicos usados na construção do tipo

Tipos definidos pelo usuário

z

Vantagens

y Legibilidade y Modificabilidade y Fatoração

x reduz quantidade de codificação e erros por distração

y Teste de Consistência

(40)

157

Tipos definidos pelo usuário

z Tipos embutidos :

y não estruturados: int, float, char

z Tipos não estruturados são construídos a partir de tipos primitivos não estruturados

158

Tipos de Dados

z

Agregados de Dados

y Homogêneos y Heterogêneos

z

Seqüência

z

Recursão

z

União Discriminada

z

Conjunto Potência

Agre ga dos de Da dos

z

Agregado de objetos elementares ou de

outros agregados

y de elementos homogêneos: array

y de elementos heterogêneos: struct

z

Um objeto agregado tem um único nome

x a manipulação pode ser feita em um único componente elementar de cada vez

x operação de seleção

x algumas linguagens permitem atribuir valores ou comparar agregados inteiros

Agregados de Dados

z

Heterogêneos: produtos cartesianos

y struct

y é um conjuntos cujos elementos são n-tuplas ordenadas (a1,...,an)

(41)

161

Agregados H e t erogêneos

z Notação (“C”) typedef struct { int registro; char nome[50]; int idade; float salario; } tipo_funcionario;

z Seu emprego

tipo_funcionario funcionario;

tipo_funcionario * end_func;

funcionario.idade = 35; end_func = &funcionario; end_func->salario = 1000; (*end_func).salario = 1000;

162

Agregados H e t erogêneos

z

Struct: arranjo seqüencial de

componentes

y cada componente ocupa um número inteiro de unidades endereçáveis de memória, podendo ser referenciado pelo nome de seu campo

y variáveis não podem conter nomes de campos

Agregados H e t erogêneos

z Struct { int a; float b; int c[5]; } tipo_T

z “C” permite que o programador tenha acesso a todos os campos da estrutura

Agregados H omogêneos

z

Homogêneos: mapeamentos finitos

(42)

165

Agregados H omogêneos

z Declaração: float a [5]

y pode ser encarada como o mapeamento dos inteiros de 0 a 4 no conjuntos dos reais

y um objeto do conjunto imagem pode ser selecionado por indexação: índice do domínio

z a[k]: aplicação da função ao argumento k

y k fora do domínio implica em erro

y só pode ser detectado em tempo de execução

y algumas linguagens guardam descritores capazes de identificar este erro

y “C” não detecta

166

Agregados H omogêneos

z

Vetor com várias dimensões

y typedef int tipo_linha[10]

y typedef tipo_linha tipo_coluna [5] y define uma matrix 10 x 5

y typedef int tipo_matriz [10][5]

z

“C”: fixado em tempo de compilação

x SUBCONJUNTO FIXADO QUANDO O PROGRAMA É ESCRITO

Agregados H omogêneos

z Agregados Homogêneos

y tipo_T a[N]

z tipo dos índices: sempre inteiros de 0 a N-1 z tipo_T: tipo de cada elemento do array

z Os tipos int a1[50] e int a2[70] são diferentes z A alocação de memória é estática e contígua.

Agregados H omogêneos

z

Array “C”

y aloca um número inteiro de unidades endereçáveis de memória para cada componente.

y o nome do array indica a posição de memória onde se encontra o 1o. elemento

x uma referência a primeira posição da área onde o objeto de informação está armazenado

(43)

169

Agregados H omogêneos

z

Array “C”

y a declaração de um array aloca memória para os elementos do array em área contígua y o nome do array equivale ao ponteiro para o

1o. elemento do array

y não guarda informação de limites em tempo de execução o que implica em não efetuar testes

170

Se qüências

z

Consiste em um número arbitrário de

ocorrências de ítens de dado de um

determinado tipo componente.

y deixa em aberto o número de ocorrências y Cadeias de Caracteres (STRINGS)

x exemplo onde o tipo de componente é o caracter y mesmo conceito de um arquivo seqüencial

Se qüências

z

operações sobre cadeia:

y concatenação

y seleção do primeiro ou último componente y fatia: uma subcadeia pode ser extraída

especificando-se as posições do primeiro e do último caracteres desejados

y pattern matching

Se qüências

z

operações sobre arquivo seqüencial

(44)

173

U nião Discrim inada

z Especifica uma escolha será feita dentre as diferentes estruturas

alternativas

y cada estrutura

alternativa é chamada de variante

y o tamanho da variável é o da maior variante

z “C” - UNION union { tipo_a A; tipo_b B; tipo_c C; }

z as 3 estruturas ficam sobre a mesma região da memória

174

U nião Discrim inada

z Typedef struct { float dist;

float rad; } polar;

z Typedef struct { float x;

float y; } cart;

z Typedef struct{ char id [5]; int tipoMedida;

union {

polar coord_polar; cart coord_cartesiana; }

float modulo_veloc; } t_dados;

Conjunt o Pot ência

z Variáveis cujo valor pode ser qualquer

subconjunto de um conjunto de elementos do tipo T

y o tipo de tais variáveis é o conjunto potência T

y equivale ao conjunto de todos os subconjuntos de elementos do tipo T: tipo base

z Operações permitidas união e interseção, pertence

z Existe em PASCAL, não existe em “C”

Tipos do “C”

z

Não possui o tipo boolean

y TRUE e FALSE

y manipulados pelos operadores lógicos OR, AND, NOT

y implementa-se normalmente da seguinte forma em “C”

x enum { true = -1;

x false = 0 }

(45)

177

Tipos do “C”

z

Enumeração

y typedef enum dia = {domingo, segunda, …} y define um conjunto e relações de ordem

x domingo equivale a uma constante deste novo tipo

x implementação: em um byte, limitado a 255, com valores associados de 0 em diante as constantes na ordem em que aparecem

x é possível também atribuir valor às constantes

178

Tipos do “C”

z

Seu emprego aumenta legibilidade do

código

z

Operações

y atribuições e comparações

y não podem ser usados em operações de entrada e saída

z

Os valores são mapeados em inteiros de

0 a n-1 sendo n a cardinalidade do tipo

Tipos do “C”

z Ponteiros

y Tipo_T * ponteiro

y um ponteiro armazena um endereço z ponteiro = malloc (sizeof(Tipo_T))

y aloco memória para uma estrutura do Tipo_T e coloco seu endereço no ponteiro

Tipos do “C”

z Strings de Caracteres

y trata cadeias de caracteres como vetores

y char a[50], b[30]

y utiliza funções para manipular strings

y strcpy (a, “texto”)

y strcmp(a,b)

y strcat(a,b)

(46)

181

Tipos do “C”

z Strings de Caracteres

y CUIDADOS ESPECIAIS

char nome[5];

strcpy(nome, “Maria”)

M A R I A \0

0 1 2 3 4 5

182

Compa t ibilida de de Tipos

typedef int tipo[20] int a [20], b[20] int c[1..20] tipo d; tipo f;

z Equivalência por nome (“C”)

y mesmo nome de tipo, definido pelo usuário ou primitivo ou se aparecem na mesma declaração

y são equivalentes: a e b ; d e f

Compa t ibilida de de Tipos

z Equivalência estrutural

y duas variáveis têm tipos compatíveis se possuem a mesma estrutura

y segundo esta definição, nomes de tipos definidos pelo usuário são usados só como uma abreviatura (ou como comentário) da estrutura que representam

y não introduzem uma nova característica semântica.

(47)

185

Cont role a N ível de Inst ruç ão

z

Seqüência

z

Seleção

y if (condição) comando else comando y switch ... Case

z

Repetição

y while (condição)... y do ... While(condição) y for (i=0; i<N; i++) ...

z

Break

186

Subprogra ma s e Blocos

z

Controle a nível de unidades

z

Blocos

:uma unidade de programa

y substitui um comando da linguagem de programação

y o bloco é iniciado em seqüência ao ser executada sua primeira instrução

y define um ambiente local

Subprogra ma s e Blocos

z

Subprogramas

:

y também definem um ambiente local

y definem um nível superior para a linguagem-um novo “comando”

y dá o nome a uma determinada unidade de programa

x sua chamada faz com que o controle seja transferido para a unidade chamada (primeira instrução) e executa até encontrar o fim da unidade (última instrução)

Subprogra ma s e Blocos

Main() { ...

A = Calculo() A= A+1; ... }

Calculo() {

1a. instrução 2a. instrução ...

última instrução }

1

(48)

189

Subprogra ma s e Blocos

z

Ao terminar devolve o controle para

instrução seguinte a chamada

z

Fim do subprograma - devolve controle ao

ponto de chamada

z

Parâmetros Formais

x convenções para passagem de parâmetros permitem troca de informação explícita entre unidades

190

Subprogra ma s e Blocos

z

Onde as variáveis são declaradas?

y dentro de funções: locais a função

x variáveis locais

y na lista de parâmetros das funções

x parâmetros

y fora de todas as funções

x variáveis globais

Funções em C

z Funções são as est rut uras que perm it em ao usuário separar seus program as em blocos.

z Um a fun ção no C t em a seguint e form a geral:

tipo_de_retorno nome_da_função (declaração_de_parâmetros) {

corpo_da_função }

O comando re t urn

z O comando return tem a seguinte forma geral: return valor_de_retorno; ou return;

z Digamos que uma função está sendo executada. Quando se chega a uma declaração return a função é encerrada imediatamente e, se o valor de retorno é informado, a função retorna este valor.

(49)

193

# include < st dio.h> int Square ( int a) {

ret urn ( a* a) ; }

int m ain ( ) {

int num ;

pr int f ( "Ent r e com um num er o: ") ; scanf ( " % d",&num ) ;

num = Squar e( num ) ;

pr int f ( "\ n\ n O seu quadr ado vale: % d\ n",num ) ; r et ur n 0;

}

# include < st dio.h> int EPar ( int a) {

if ( a% 2 ) / * Ver ifica se a e divisivel por dois * / ret urn 0 ; / * Ret orna 0 se nao for divisivel * / else

ret urn 1 ; / * Ret orna 1 se for divisivel * / }

int m ain ( ) {

int num ;

pr int f ( " Ent re com num ero: " ) ; scanf ( " % d" ,& num ) ;

if ( EPar( num ) )

pr int f ( " \ n\ nO num er o e par.\ n" ) ; else

pr int f ( " \ n\ nO num er o e im par.\ n" ) ; ret urn 0 ;

}

Prot ót ipos de Funções

z Prot ót ipos são nada m ais, nada m enos, que declarações de funções. I st o é, v ocê declara um a função que irá usar.

z O com pilador t om a ent ão conhecim ent o do form at o daquela função ant es de com pilá- la.

z Formato:

tipo_de_retorno nome_da_função (declaração_de_parâmetros);

# include < st dio.h>

float Square ( float a) ;

int m ain ( ) {

floa t num ;

print f ( "Entre com um num e ro: ") ; sca nf ( "% f",& num ) ;

num = Square ( num ) ;

print f ( " \ n\ nO seu qua dra do va le : % f\ n",nu m ) ; re turn 0 ;

}

float Square ( float a) {

(50)

197

O Tipo void

z Em inglês, voidquer dizer v azio

z Ele nos perm it e fazer funções que não ret ornam nada e funções que não t êm par âm et ros!

z Podem os agora escrev er o prot ót ipo de um a função que não ret orna nada:

void nome_da_função (declaração_de_parâmetros);

198

O Tipo void

z Num a fun ção, com o a acim a, não t em os v alor de ret orno na declaração return. O com ando returnnão é necessário na função.

z Podem os, t am bém , fazer funções que não t êm parâm et ros:

tipo_de_retorno nome_da_função (void);

z ou, ainda, que não t em par âm et ros e não ret ornam nada:

void nome_da_função (void);

Exemplo Tipo void

# include < stdio.h>

void M ensagem ( void) ;

int m ain ( ) {

Mensagem ( ) ;

pr int f ( " \ t D iga de novo:\ n" ) ; Mensagem ( ) ;

ret urn 0 ;

}

void M ensagem ( void) {

(51)

201

Variá veis Loc ais

z

são variáveis automáticas

z

sua memória é alocada na entrada da

execução da função e liberada na saída

z

normalmente são declaradas logo no

início da função (após { ) e antes dos

comandos

z

podem ser declaradas dentro de qualquer

bloco de código (variáveis locais ao bloco)

202

Variá veis Globais

z

declaradas fora de qualquer função

z

podem ser usadas indiscriminadamente

em qualquer função

y a declaração pode ser colocada em qualquer lugar no programa fonte: deve ficar no início do arquivo, antes da declaração da main, mais fácil localizar y não é uma boa prática

Variá veis Globais

z

são globais àquela unidade de

programa

z

para outro programa fonte devem ser

declaradas com qualificador

extern

Variá veis Loc ais X Globais

z

Variáveis locais com o mesmo nome de

uma global: a referência prevalece a local

A B

C

D E

(52)

205

Variá veis Loc ais x Globais

z

Locais

y são declaradas dentro de blocos e existem apenas enquanto o bloco está sendo

executado

x C: não existem enquanto o bloco não estiver executando, e desaparecem quando o bloco terminar sua execução

y não é verdade para todas as linguagens

206

Variá veis Loc ais x Globais

z

Static

y locais: memória da variável local alocada estaticamente

y global: limita o escopo da variável a unidade de implementação

Código

Globais e Estáticas HEAP

Pilha

Variá veis Loc ais x Globais

z

Globais: não são declaradas no bloco

y são declaradas e existem para todo o programa

y seu uso é perigoso, sua alteração pode causar efeitos colaterais em trechos completamente separados do programa

Variá veis Loc ais x Globais

z

Bloco

y início de bloco: { y fim de bloco : } y {

<declaração de variáveis locais> <comandos>

(53)

209

int z,k ; func1 ( ...) {

int x,y; ...

}

func2 ( ...) {

int x,y,z; ...

z= 1 0 ; ...

}

m a in ( ) {

int count ; ...

}

VARIÁVEIS

GLOBAIS

210 func1 ( ...)

{

int abc,x; ...

}

func ( ...) {

int abc; ...

}

void m ain ( ) {

int a,x,y; for ( ...) {

float a,b,c; ... } ... }

VARIÁVEIS

LOCAIS

# include < st dio.h> int num ;

int func( int a , int b) {

a = ( a+ b) / 2 ; / * Qual e o valor de a apos a at r ibuição? * /

num - = a; ret urn a;

}

m a in( ) {

int first = 0 , se c = 5 0 ; num = 1 0 ;

num + = func( first, se c) ; / * Qua l e o v a lor de num , first e se c a nt es e de pois da a t ribuica o? * /

print f( " \ n\ nConfira ! num = % d\ tfirst = % d\ t se c = % d",num , fir st , se c) ;

Parâme t ros Formais

z

Subprograma é um segmento de

programa com propriedades de

comunicação com o mundo exterior

y interface bem definida - parâmetros formais. y sua integração é realizada sem conhecimento

de seus mecanismos internos y sua corretude é determinada sem

(54)

213

Parâme t ros Formais

z

Função:

y chamada com argumentos

y parâmetros: variáveis que receberão os valores do argumentos

y se comportam como qualquer variável local dentro da função

y is_in (&nome, ‘M’)

214

Parâme t ros Formais

is_in (char *s, char c)

{ /* retorna 1 se c é parte da string s; 0

se não é o caso */

while ( *s )

if (*s == c) return 1;

else s++;

return 0;

}

Parâme t ros Formais

z Parâmetros formais º função (tipo nome, ...)

x relação com argumentos: posicional

x são usadas dentro da função como variáveis locais normais

x também são dinâmicas: criadas na entrada, destruídas na saída

y argumentos usados na chamada tem que ser do mesmo tipo dos parâmetros formais declarados

Parâme t ros Formais

z Parâmetros se comportam como variáveis locais

y na ativação do subprograma sua área de memória é alocada

z Passagem de parâmetros:

y cópia:

y referência

Referências

Documentos relacionados

Todas as outras estações registaram valores muito abaixo dos registados no Instituto Geofísico de Coimbra e de Paços de Ferreira e a totalidade dos registos

F REQUÊNCIAS PRÓPRIAS E MODOS DE VIBRAÇÃO ( MÉTODO ANALÍTICO ) ... O RIENTAÇÃO PELAS EQUAÇÕES DE PROPAGAÇÃO DE VIBRAÇÕES ... P REVISÃO DOS VALORES MÁXIMOS DE PPV ...

insights into the effects of small obstacles on riverine habitat and fish community structure of two Iberian streams with different levels of impact from the

A versão reduzida do Questionário de Conhecimentos da Diabetes (Sousa, McIntyre, Martins &amp; Silva. 2015), foi desenvolvido com o objectivo de avaliar o

Taking into account the theoretical framework we have presented as relevant for understanding the organization, expression and social impact of these civic movements, grounded on

Os dados referentes aos sentimentos dos acadêmicos de enfermagem durante a realização do banho de leito, a preparação destes para a realização, a atribuição

Janaína Oliveira, que esteve presente em Ouagadougou nas últimas três edições do FESPACO (2011, 2013, 2015) e participou de todos os fóruns de debate promovidos

A pesquisa pode ser caracterizada como exploratória e experimental em uma primeira etapa (estudo piloto), na qual foram geradas hipóteses e um conjunto de observáveis, variáveis