CES10 Cap 2-c

Fazer download em ppt, pdf ou txt
Fazer download em ppt, pdf ou txt
Você está na página 1de 44

Capítulo II – Algoritmos e

Programas
2.1 – Elementos básicos de algoritmos e programas

2.2 – Linguagens para algoritmos

2.3 – Propriedades dos bons algoritmos

2.4 – Estrutura de um programa em C


2.4 – Estrutura de um Programa em C
2.4.1 – Partes componentes de um programa em C

Como já foi comentado,


um programa pode ter
vários módulos
O módulo principal é
obrigatório
Por ele começa a
execução
Os outros módulos
(opcionais) são os
subprogramas
Em C, todos os módulos
de um programa são
denominados funções

O módulo principal tem


o nome de função main

Cada módulo pode ter


declarações locais

Pode haver ainda


declarações fora do
escopo de qualquer
função Declarações globais podem figurar no
início ou no final do programa, ou
São as declarações depois de quaisquer de suas funções
globais Nesta disciplina elas estarão sempre no
início dos programas
Estrutura básica de um programa em C, para fins
didáticos:

Diretivas de pré-
A função main deve aparecer depois
processamento de suas funções auxiliares, pois em
Declarações
seu escopo elas são referenciadas
globais
Se ela aparecesse antes, o compilador,
Funções
auxiliares ao encontrar tais referências, iria
notificar o aparecimento de nomes
Função
main não declarados
Programa
Toda função chamada dentro de
outra deve aparecer no programa
antes dessa outra
Prototipação – vista no capítulo de Subprogramação –
permite inverter a ordem:

Diretivas de pré- Isso pode ajudar na aplicação da


processamento metodologia “top-down”
Declarações
globais Mostra primeiro a função main
Funções
auxiliares Depois suas auxiliares
Função
main Depois as auxiliares das auxiliares
Programa
E assim por diante
Antes do capítulo de Subprogramação, os programas não
terão subprogramas:

Diretivas de pré-
processamento Estrutura sugerida de uma função
Declarações
em C:
globais
Cabeçalho {
Função
main Declarações locais Comandos
}
Programa
Declarações poderiam vir no meio dos
comandos, mas isso será evitado
2.4.2 – Cabeçalho de uma função
 Forma geral:

tipo nome (lista de parâmetros)

 nome ( ) tem presença obrigatória; o restante é opcional

 Uma função pode retornar um valor para aquela que a


invocou

 tipo é o tipo do valor retornado pela função


tipo nome (lista de parâmetros)

 Parâmetro é uma variável local especial de uma função:

 Destina-se a receber um argumento de chamada dessa


função
 Exemplo: seja a atribuição z = sin(x+y), numa função
qualquer f

 A função sin pertence à biblioteca da Linguagem C

 Na função f, o valor de x+y é calculado; ele é o


argumento dessa chamada da função sin

 A função sin é então invocada e seu único parâmetro


recebe tal argumento

 A função sin calcula o seno do valor de seu parâmetro,


resultando em um valor do tipo real

 Finalmente a função sin retorna esse valor real à função


f, que o atribui à variável z
 Por default, o tipo de uma função é int

 Quando uma função não produz nenhum valor a ser


retornado, seu tipo deve ser void

 É o caso da função main de muitos programas, em alguns


ambientes de programação

 A função main de muitos programas também não tem


parâmetros
Na maioria dos casos, Alguns ambientes como o
sua forma será: Borland C++ também aceitam

int main ( ) void main ( )


2.4.3 – Declarações globais e locais

 Declarações são usadas para:

 Dar nome às variáveis e constantes do programa

 Reservar-lhes espaço na memória

 Especificar os tipos de valores que elas devem guardar

 Criar outros tipos além daqueles disponibilizados pela


linguagem
 Nos programas em C, toda variável referenciada nos
comandos deve estar previamente declarada

 Quando mais de uma função de um programa referencia


uma mesma variável, essa deve ser declarada como global

 Se apenas uma função o fizer, ela pode ser declarada como


local a essa função

 Somente a partir do capítulo sobre Subprogramação os


programas terão mais de uma função

 Até lá, suas variáveis serão globais ou locais à função main


2.4.4 – Diretivas de pré-processamento

 Pré-processamento: fase da compilação anterior à


tradução do programa para a linguagem Assembly ou de
máquina

 Tarefas do pré-processamento – entre outras:

 Inclusão de arquivos auxiliares

 Tradução de constantes simbólicas

 Pré-processamento de macros
Diretivas de pré-processamento em C:

 Toda linha iniciada com o caractere ‘#’

 Podem aparecer em qualquer posição nos programas

 Em CES-10, para fins didáticos, serão apresentadas no


início dos programas
Diretivas de pré-
processamento
Declarações
globais
Função
main

Programa
Inclusão de arquivos auxiliares:

 Os arquivos podem ser de dois tipos:

 Arquivos do acervo do programador

 Exemplo: #include "sistemas.c"

 Arquivos da biblioteca da linguagem

 Exemplo: #include <math.h>


Arquivos do acervo do programador:

 Exemplo: #include "sistemas.c"

 Tipicamente escritos em C

 Incorporados ao programa-fonte durante o pré-


processamento

 Traduzidos para Assembly ou linguagem de máquina


juntamente com o restante do programa-fonte
Arquivos da biblioteca da linguagem :

 Exemplo: #include <math.h>

 Contém apenas cabeçalhos (protótipos) de algumas funções


da biblioteca, escritos em C

 Os códigos-objetos dessas funções já estão prontos e se


encontram em algum lugar da biblioteca da linguagem

 Todos os cabeçalhos do arquivo são incorporados ao


programa-fonte durante o pré-processamento, mesmo
aqueles que não serão usados
Arquivos da biblioteca da linguagem:

 Esses cabeçalhos entram no processo de tradução para


Assembly ou linguagem de máquina, juntamente com o
restante do programa-fonte

 Durante a edição de ligações, os códigos-objetos das


funções da biblioteca usadas no programa são ligadas ao
restante do programa-objeto

 Obs.: a inclusão dos cabeçalhos no programa-fonte evita


que o compilador acuse falta de declaração, ao encontrar a
chamada de uma função da biblioteca
Tradução de constantes simbólicas:

 Diretiva #define: serve para incluir constantes simbólicas


no programa

 Por exemplo, caso o programa contenha as seguintes


diretivas:
Durante o pré-processamento,
#define pi 3.14159 todas as ocorrências das cadeias de
#define limite 100 caracteres:
#define enquanto while
#define se if pi, limite, enquanto, se, senao, eq
#define senao else Serão substituídas respectivamente
#define eq == pelas cadeias:
3.14159, 100, while, if, else, ==
Utilidades de constantes simbólicas:

 Evitar distrações:

 É comum trocar distraidamente “==” por ‘=’

 Usando #define eq ==

pode-se escrever sistematicamente “eq” no lugar de


“==”, evitando distrações
Utilidades de constantes simbólicas:

 Evitar escrever cadeias de caracteres compridas,


repetidamente:

 Seja um programa que referencia muito o valor da


constante π (pi)

Usando #define pi 3.14159

Evita-se escrever várias vezes o extenso valor 3.14159


Utilidades de constantes simbólicas:

 Escrever os programas em Português:

 Com diretivas similares às seguintes:

#define enquanto while


#define se if
#define senao else

O programador pode escrever seus programas em


Português
Seja o pré-processamento
Exemplo com #include’s do arquivo preproc.c
e #define’s:

 Seja o arquivo preproc.c que inclui o arquivo defines.h:


#define LIMITE 100
#include <stdio.h> #define EQ ==
#include “defines.h” #define SE if
int main () { #define SENAO else
int i; defines.h
printf (“LIMITE_1: %d\n”, LIMITE);
i = 100;
#define LIMITE 200
SE (i EQ LIMITE)
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
} preproc.c
#include <stdio.h>
#define LIMITE 100
#include “defines.h” #define EQ ==
int main () { #define SE if
int i; #define SENAO else
printf (“LIMITE_1: %d\n”, LIMITE); defines.h
i = 100;
#define LIMITE 200 Protótipos das funções do stdio.h
SE (i EQ LIMITE)
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
#define LIMITE 100
#include “defines.h” #define EQ ==
int main () { #define SE if
int i; #define SENAO else
printf (“LIMITE_1: %d\n”, LIMITE); defines.h
i = 100;
#define LIMITE 200
SE (i EQ LIMITE)
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
#define LIMITE 100
#include “defines.h” #define EQ ==
int main () { #define SE if
int i; #define SENAO else
printf (“LIMITE_1: %d\n”, LIMITE); defines.h
i = 100;
#define LIMITE 200
SE (i EQ LIMITE)
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
#define LIMITE 100
Original Substituta
#define EQ == LIMITE 100
#define SE if EQ ==
#define SENAO else SE if
int main () { SENAO else
int i;
printf (“LIMITE_1: %d\n”, LIMITE);
i = 100;
#define LIMITE 200
SE (i EQ LIMITE)
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
int main () { Original Substituta
int i; LIMITE 100
printf (“LIMITE_1: %d\n”, LIMITE); EQ ==
i = 100; SE if
#define LIMITE 200 SENAO else
SE (i EQ LIMITE)
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
int main () { Original Substituta
int i; LIMITE 100
printf (“LIMITE_1: %d\n”, LIMITE); EQ ==
i = 100; SE if
#define LIMITE 200 SENAO else
SE (i EQ LIMITE)
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}

Dentro das aspas


não há substituição
Protótipos das funções do stdio.h
int main () { Original Substituta
int i; LIMITE 100
printf (“LIMITE_1: %d\n”, 100); EQ ==
i = 100; SE if
#define LIMITE 200 SENAO else
SE (i EQ LIMITE)
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
int main () { Original Substituta
int i; LIMITE 100
printf (“LIMITE_1: %d\n”, 100); EQ ==
i = 100; SE if
#define LIMITE 200 SENAO else
SE (i EQ LIMITE)
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
int main () { Original Substituta
int i; LIMITE 200
printf (“LIMITE_1: %d\n”, 100); EQ ==
i = 100; SE if
SE (i EQ LIMITE) SENAO else
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
int main () { Original Substituta
int i; LIMITE 200
printf (“LIMITE_1: %d\n”, 100); EQ ==
i = 100; SE if
SE (i EQ LIMITE) SENAO else
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
int main () { Original Substituta
int i; LIMITE 200
printf (“LIMITE_1: %d\n”, 100); EQ ==
i = 100; SE if
if (i == 200) SENAO else
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
int main () { Original Substituta
int i; LIMITE 200
printf (“LIMITE_1: %d\n”, 100); EQ ==
i = 100; SE if
if (i == 200) SENAO else
printf (“i: %d”, i);
SENAO
printf (“LIMITE_2: %d”, LIMITE);
}
Protótipos das funções do stdio.h
int main () { Original Substituta
int i; LIMITE 200
printf (“LIMITE_1: %d\n”, 100); EQ ==
i = 100; SE if
if (i == 200) SENAO else
printf (“i: %d”, i);
else
printf (“LIMITE_2: %d”, 200);
}

Final do pré-processamento!
Pré-processamento de macros:

 Macros: expressões para abreviar códigos longos, códigos


esses usados com muita frequência num programa

 São substituídas por esses códigos durante o pré-


processamento

 Em C, as macros são criadas também através da diretiva


#define
Exemplo: sejam as macros

#define EHPAR(x) (((x)%2)?0:1)


#define ERRO(mens) printf(“ERRO:%s\n”,mens)

 Com elas, pode-se escrever comandos tais como

if (EHPAR(a+b)) ....... ;
if (valor > max) ERRO(“Valor muito grande”);

 O resultado do pré-processamento é:

if ((((a+b)%2)?0:1)) ....... ;
if (valor > max) printf(“ERRO:%s\n”,“Valor muito grande”);
#define EHPAR(x) (((x)%2)?0:1)
Macros
#define ERRO(mens) printf(“ERRO:%s\n”,mens)

if (EHPAR(a+b)) ....... ; Comandos


if (valor > max) ERRO(“Valor muito grande”); escritos

if ((((a+b)%2)?0:1)) ....... ;
if (valor > max) printf(“ERRO:%s\n”,“Valor muito grande”);

Pré-processados

 Nos resultados, observa-se inclusive passagem de


argumentos:

 x é substituído por a+b


 mens é substituído por “Valor muito grande”
 A propósito:
((a+b)%2)?0:1
é denominada expressão condicional

 (a+b)%2 é o resto da divisão de (a+b) por 2

 A expressão toda é
Ou seja, tal
0 (zero), se (a+b)%2 ≠ 0 expressão verifica
1 (um), caso contrário se (a+b) é par

 Expressões condicionais serão estudadas no capítulo de


Comandos de Controle de Fluxo
Exemplo: seja a macro
Os parêntesis são necessários
#define cubo(x) ((x)*(x)*(x)) porque ‘*’ é realizada antes
de ‘+’ e de ‘-’
 Pode-se usá-la em expressões aritméticas tais como

cubo(a+b) + cubo(a-b)

 Se a macro fosse

#define cubo(x) (x*x*x)

então cubo(a+b) se tornaria (a+b*a+b*a+b)


2.4.5 – Comentários em programas

 Usados para documentar e elucidar trechos de programas

 Facilitam a correção, a compreensão e a manutenção dos


programas

 O próprio programador ou outras pessoas podem se


beneficiar deles, em épocas diferentes daquela em que o
programa foi elaborado
Em C, duas formas de introduzir comentários em programas:

 Tudo entre as sub-cadeias “/*” e “*/”, sem as aspas, é


considerado pelo compilador um comentário

 Se, numa linha do programa, aparecer a sub-cadeia “//”,


sem as aspas, o restante da linha à direita é considerado um
comentário

 O compilador elimina todos os comentários do programa-


fonte
Programa da equação
do 2º grau contendo
comentários:

Você também pode gostar