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
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
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
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
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?
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
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)
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
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
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
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
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. : &&
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
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)
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, ¬a)
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) ;
}
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) ;
}
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
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ãox C1;
x C2;
x C3;
x C4;
Comandos Bá sicos do C
z
Alternativa simples
y “C”
if (<condição>) {
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
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
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;
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
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
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) ;
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' .
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()
{
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
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
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
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
# 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;
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
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
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 + + )
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.
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
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.
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
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
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)
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
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
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
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 }
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)
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.
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
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.
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) {
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) {
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
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>
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
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