Post on 22-Apr-2015
Módulo 3
1 2 3 4 5 6 7Apênd
ice1
1 Conceitos básicos
2 Variáveis locais e globais
3 Passagem de parâmetros
4 Estrutura de subprogramas
5 Procedimentos e funções
6 Recursividade
7 Construção de bibliotecas
Apêndice - Programação em C
Programação e Sistemas de Informação
Índice
• Programação Estruturada
Módulo 3
1 2 3 4 5 6 7Apênd
ice2
1 Conceitos básicos
• Programação estruturada– Subalgoritmos
1
• Permitem organizar a complexidade de um programa;
• Reduzir custos de desenvolvimento de sistemas;
• Criação de blocos de instruções que podem ser chamadas várias vezes no mesmo programa ou em vários programas.
Para resolver um problema complexo, comece por decompô-lo em pequenos subproblemas.
Módulo 3
1 2 3 4 5 6 7Apênd
ice3
1 Conceitos básicos
• Controlo de execução do programa
Função SQR
T
Algoritmo principal....
Y SQRT (X) ....
Instruções que definem a função
Controlo transferido para a função SQRT
Retorno do controloPara executar as instruções da função SQRT (square root ) é fornecido um valor como argumento para corresponder ao parâmetro à custa do qual a função está definida.
1
Módulo 3
1 2 3 4 5 6 7Apênd
ice4
1 Conceitos básicos
• Exemplo:Função MEDIA(VAL1, VAL2, VAL3)M (VAL1+ VAL2 + VAL3)/3Retornar (M)
Algoritmo TESTEInícioLer (A, B, C)D MEDIA(A, B, C)Escrever (D)E MEDIA(C, A, B) + MEDIA (A+1, B, 10)Escrever (E)Fim
Função MEDIA tem 3 parâmetros
A, B e C são os argumentos para a função MEDIA da primeira vez que é chamada neste algoritmo: VAL1=A, VAL2=B e VAL3=C
VAL1=C, VAL2=A e VAL3=BVAL1=A+1, VAL2=B e VAL3=10
1
Módulo 3
1 2 3 4 5 6 7Apênd
ice5
2 Variáveis locais e globais
• Abrangência (scope ) de uma variável
2
•A maior parte das variáveis usadas num programa são variáveis locais;
•Uma variável local (privada) só é reconhecida dentro do subalgoritmo em que é usada;
•Uma variável global é reconhecida em todo o algoritmo.As variáveis globais valem em qualquer parte do algoritmo, excepto no caso de ser novamente declarada como variável local. As variáveis locais mantém-se em memória apenas durante a execução do subprograma.
Módulo 3
1 2 3 4 5 6 7Apênd
ice6
2 Variáveis locais e globais
• Exemplo
2
Algoritmo TESTEVARVariável I inteiro [I variável global]
Procedimento TESTEVariável I inteiro [I variável local]Início
I 5Fim[Programa principal]Início
I 1TESTEEscrever (I)
Fim
•O output do programa será 1:
•A variável I declarada dentro do procedimento ignora a variável global e perde a validade ao terminar o procedimento.Se retirássemos a declaração da variável I do procedimento TESTE, o output seria 5.
Módulo 3
1 2 3 4 5 6 7Apênd
ice7
• Passagem por valorA 3B 6PROC( A, 17 , B^2-1 ).....procedimento PROC(X, Y, Z)
17
3 Passagem de parâmetros
•É o método mais directo de fazer corresponder um argumento a um parâmetro de uma função;
•Cada um dos argumentos é atribuído ao respectivo parâmetro, pela mesma ordem;
•O argumento pode ser uma variável, uma expressão ou uma constante.Os parâmetros recebem os valores dos argumentos, mas não há maneira de os ligar. Assim, alterações dos parâmetros durante o procedimento, não afectam os argumentos.
335
3
Módulo 3
1 2 3 4 5 6 7Apênd
ice8
• Passagem por referência (ou por endereço - como variável)A 3
B 6PROC( A, 17 , B^2-1 ).....procedimento PROC(X, Y, Z)
17
3 Passagem de parâmetros
3 35Local de
armazenamento em memória
•Em vez de passar o valor, passa a própria variável, possibilitando que possa ser modificada durante o procedimento;
•Pode ser feito de 2 maneiras:1. Copiar o valor do argumento, no momento em que é chamado o procedimento, e, no fim, copiar os valores dos parâmetros, antes de retornar;2. Passar o endereço do argumento.
Pode provocar efeitos indesejados nas variáveis.3
Módulo 3
1 2 3 4 5 6 7Apênd
ice9
• Exemplo
procedimento DOBRO(X )X X+Xretornar
Algoritmo PRINCIPALN 5DOBRO(N)Escrever(N)Fim
3 Passagem de parâmetros
DOBRO(5)
N é passado por valor
3
X=5X=10
5
procedimento DOBRO(X )X X+Xretornar
Algoritmo PRINCIPALN 5DOBRO(N)Escrever(N)Fim
DOBRO(N)
N é passado por referência
N=X=5N=X=1
0
10
Módulo 3
1 2 3 4 5 6 7Apênd
ice10
• Estrutura de um programa em C# include <bibliotecas.h># define constantes
tipo funcao( tipo param1, …){declaração de variáveis;instruções;}main(){declaração de variáveis;instruções;}
# Directivas do pré-processadorUma ou mais funções: main() e outras…Cabeçalho (header )
4 Estrutura de um subprograma
4
Módulo 3
1 2 3 4 5 6 7Apênd
ice11
5 Procedimentos e funções
• Funções
• Predefinidas: ROUND, TRUNC, INT, SQRT, ABS, SIN, COS, TAN, etc.
• Construídas pelo programador
Uma função é definida em termos de um ou mais parâmetros e retorna um valor.Exemplo: Y=SQRT(X)SQRT calcula a raiz quadrada de X e retorna um valor que será atribuído a Y.
5
Módulo 3
1 2 3 4 5 6 7Apênd
ice12
5 Procedimentos e funções
• Procedimentos
• São executadas as instruções mas não há retorno de valores.
Um procedimento é definido em termos de parâmetros de input e/ou de output.
Procedimento TROCA(VAL1, VAL2)TMP VAL1VAL1 VAL2VAL2 TMPRetornar
Algoritmo ORDENAR2InícioLer (A, B)Se A>B então TROCA(A,B)Escrever (A,B)Fim
• Exemplo:
Na prática, não é tão simples...Ver implementação em C: «troca.c» Cuidado na passagem de argumentos!!
5
Módulo 3
1 2 3 4 5 6 7Apênd
ice13
6 Recursividade
• Exemplo
Um subalgoritmo é recursivo se ele chama-se a si próprio.
Função FACT_RECURSIVO(N)Se N=0 então
Retornar(1)Senão
Retornar(N*FACT_RECURSIVO(N-1))
Fim se
6
Módulo 3
1 2 3 4 5 6 7Apênd
ice14
6 Recursividade
• Traçagem de FACT_RECURSIVO(4)
FACT_RECURSIVO(4) = 4 * FACT_RECURSIVO(3) = 24
FACT_RECURSIVO(3) = 3 * FACT_RECURSIVO(2) = 6
FACT_RECURSIVO(2) = 2 * FACT_RECURSIVO(1) = 2
FACT_RECURSIVO(1) = 1 * FACT_RECURSIVO(0) = 1
FACT_RECURSIVO(0) = 1
Resultado final
6
Módulo 3
1 2 3 4 5 6 7Apênd
ice15
7 Construção de bibliotecas
• Exemplos:#include
<math.h>#include <stdio.h>•A linguagem C é muito compacta. Muitas das funções que
fazem parte de outras linguagens não estão directamente incluídas na linguagem C.
Temos como exemplo as operações de entrada/saída, a manipulação de strings e certas operações matemáticas.
A funcionalidade correspondente a estas e outras operações não faz parte integrante da linguagem, mas está incluída numa biblioteca externa, bastante rica e standard. Todas essas operações são executadas por via da invocação de funções externas definidas nessa biblioteca standard.
•Qualquer programador poderá desenvolver a sua própria biblioteca de funções, podendo até substituir algumas das funções standard, e também utilizar outras bibliotecas comerciais já existentes (p. ex. NAG, PHIGS, etc). 7
Módulo 3
1 2 3 4 5 6 7Apênd
ice16
• Compilação e execução de um programa em C
Programação em C
•Criação do programa fonte (texto)
•Compilação desse programa, para a sua tradução para código executável;
•Execução do código produzido.
No caso da detecção de qualquer erro em qualquer dos estados, todos eles deverão ser repetidos desde o início.
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice17
Código fonte
Código assembly
Código objecto
Código executável
Pré-processador
Compilador
Assembler
Linker
Bibliotecas externas
• remover os comentários de um programa;
• interpretar directivas especiais a si dirigidas, que começam pelo carácter #. • traduzir o código fonte para linguagem assembly (texto);
• traduzir o código assembly para código objecto (instruções em binário).
• combinar todos os objectos com o resultado compilado dessas funções num único ficheiro com código executável.
Programação em C
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice18
Programação em C
#include <stdio.h>
main() {float raio, area;printf("raio = ?");scanf("%f", &raio);area =3.14159*raio*raio;printf("Area = %f", area);
}
#include <stdio.h>#define PI 3.14159
float processa(float r) {float a;a = PI*r*r;return(a);
}
main() {float raio, area;
printf("raio = ?");scanf("%f", &raio);area = processa(raio);printf("Area = %f", area);
}
• Funções em C
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice19
Programação em C
#include <stdio.h>#define PI 3.14159
float processa(float r) {float a;a = PI*r*r;return(a);
}
main() {float raio, area;
printf("raio = ?");scanf("%f", &raio);area = processa(raio);printf("Area = %f", area);
}
#include <stdio.h>#define PI 3.14159
float processa(float r) {float a;a = PI*r*r;return(a);
}
main() {float raio, area;int cont;
printf("para sair,introduza 0");printf("\nraio = ?");scanf("%f", &n);
for(cont=1;raio !=0;cont++) {area = processa(raio);printf("Area = %f", area);printf("\nraio = ?");scanf("%f", &raio);
}}
• Funções em C
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice20
Programação em C
#include <stdio.h>#define PI 3.14159main() {
float raio, area;int cont;float processa(float raio);
printf("para sair,introduza 0");printf("\nraio = ?");scanf("%f", &n);
for(cont=1;raio !=0;cont++) {area = processa(raio);printf("Area=
%f",area);printf("\nraio=?");scanf("%f",&raio);
}}
float processa(float r) {float a;a = PI*r*r;return(a);
}
#include <stdio.h>#define PI 3.14159main() {
float raio, area;float processa(float raio);
printf("para sair,introduza 0");printf("\nraio = ?");scanf("%f", &n);
while(raio !=0) {area = processa(raio);printf("Area=%f",area);printf("\nraio=?");scanf("%f", &raio);
}}
float processa(float r) {float a;a = PI*r*r;return(a);
}
• Funções em C
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice21
Resumo
• Em C, um programa inclui sempre uma função main().
• Um conjunto de instruções é colocado entre {}.• Cada instrução é seguida de ;.• A disposição do programa é arbitrária.• O C é Case Sensitive.• printf pertence a uma biblioteca de funções.• Os comentários são escritos entre /* e */ e são
ignorados pelo compilador (ou // até ao fim da linha).
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice22
Tipos de dados
• Declaração de variáveis tipo var1 [, var2, …, varn];
int 2 a 4 bytes %d (formato de leitura/escrita)
char 1 byte %c (ou em formato ASCII %d)
float 4 bytes %f, %e, %Edouble 8 bytes %f, %e, %E
short int 2 bytes %hd entre -32768 e 32767
long int 4 bytes %ldunsigned %u
• Atribuição de valores às variáveis var = valor;• &var endereço da variável var
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice23
Tipos de dados
0 127 255-128
signed char
unsigned char
TipoTamanho
Menor Maior
char 1 byte -128 127
int2
bytes-32768 32767
unsigned int
2 bytes
0 65535
long int4
bytes-2147483648 2147483647
float4
bytes3,4x10-38 3,4x1038
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice24
Resumo
• Depois de declarada, uma variável assume um valor aleatório.
• A atribuição de valores a uma variável é feita pelo sinal =.
• Uma variável pode ser inicializada assim que é declarada, colocando o sinal de atribuição seguido do valor a atribuir.
• As operações +, -, *, /(divisão inteira) e %(resto da divisão inteira) entre inteiros é um número inteiro.
• A leitura e escrita de valores pode fazer-se através das funções printf e scanf, usando os formatos adequados a cada tipo. No caso do scanf, cada variável deve ser precedida por &.
• Sempre que é necessário (des)promover uma variável a um determinado tipo utiliza-se o casting (tipo). Esta promoção é temporária.
• Não se deve realizar a leitura de variáveis de um determinado tipo, usando um formato de leitura que não corresponda a esse tipo.
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice25
Funções
• Um programa em C tem sempre a função main().• As variáveis declaradas dentro de um bloco, são
locais a esse bloco, não sendo conhecidas fora dele.
• O nome de uma função é único, num programa.• Uma função pode ser chamada dentro de outra
função.• Uma função pode retornar um valor.• Quando um programa chama uma função, pode
enviar argumentos, que são recebidos e armazenados em variáveis locais que são automaticamente inicializadas com esses valores. A estas variáveis dá-se o nome de PARÂMETROS.
• Se uma função não retorna valores chama-se procedimento.
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice26
main(){ …
void funcao(‘A’, 123, 23.456);
…}
void funcao(char ch, int n, float x){ …
return;}
Funções
ch, n e x são parâmetros da
função.
Esta função não retorna um valor,
diz-se um procedimento.
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice27
Funções printf, scanf e getchar
Exemplos de leitura e escrita de variáveis
• printf(“O caracter ‘%c’ tem código ASCII n.o %d\n”, ch, ch);
• printf(“O caracter ‘%c’ tem código ASCII n.o %d\n”, ch, (int) ch);
• scanf(“%d”,&num);
• char ch=getchar();
(CASTING)
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice28
Estruturas de repetição
WHILE FOR DO … WHILE
Sintaxewhile (condição) instrução;
for(inic;cond;posinst) instrução;
do instrução;while (condição);
Executa a
instrução
Zero oumais vezes
Zero oumais vezes
Uma oumais vezes
Testa aCondiç
ão
Antes dainstrução
Antes dainstrução
Depois dainstrução
Utilização
Frequente FrequentePouco
frequente
• CICLOS (RESUMO)
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice29
Estruturas de repetição
• breakPode ser usada para terminar uma sequência de instruções dentro de um switch ou para parar um ciclo.
• continuePode ser utilizada dentro de um ciclo para fazer avançar o ciclo para a próxima iteração.
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice30
Operadores ++ e – –
++ Incremento de 1-- Decremento de 1
Modo Posfixo Modo Prefixo
Y= X++ ++X =Y
1.º O valor de X é
atribuído a Y;
1.º O valor de X é
incrementado;
2.º O valor de X é
incrementado.
2.º O valor de X é
atribuído a Y.
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice31
Atribuição composta
VAR OP= EXPRESSÃOé equivalente a
VAR = VAR OP (EXPRESSÃO)
EXEMPLO SIGNIFICADO
X += 1 X = X + 1
Y *= 2+3 Y = Y * (2+3)
A –= B+1 A = A – (B+1)
R %= 2 R = R % 2
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice32
Resumo
• Em C, não existe um tipo específico para armazenar valores lógicos: 0 equivale a FALSO; qualquer valor diferente de 0 equivale a VERDADE.
• O teste de condições pode ser realizado através das instruções if-else e switch.
• Na instrução if-else, a condição é avaliada e caso seja Verdadeira (isto é, diferente de zero) é executada a instrução associada ao if. A componente else é executada quando a condição devolve o valor lógico Falso (zero).
• A componente else do if é opcional.• É possível operar valores lógicos através dos
operadores && (AND), || (OR) ou ! (NOT).• O operador && tem maior precedência que o
operador ||.
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice33
Resumo
• A instrução if-else pode ser evitada sempre que uma mesma variável, dependendo de uma condição, possa receber dois valores diferentes. Neste caso, pode ser substituída pelo operador condicional ?:.
• A fim de eliminar conjuntos de if-else encadeados, pode usar-se a instrução switch.
• Ao contrário do if, que permite definir intervalos de valores (x>=10 && x<=120), o switch só admite valores constantes predefinidas do tipo int ou char.
• A instrução break permite parar um conjunto de instruções dentro de um switch, continuando o programa na instrução imediatamente a seguir.
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice34
Macros
• A definição de constantes deve ser feita fora das funções, de forma bem visível
• const
Sintaxe:
const tipo nome_var=valor;
• #define
Sintaxe:
#define nome_var valor
• Outras bibliotecas standard#include <string.h> //funções de manipulação de
strings#include <mem.h> //funções de manipulação de
memória (RAM)
Apêndice
Módulo 3
1 2 3 4 5 6 7Apênd
ice35
Referências
• TREMBLAY, Jean-Paul & BUNT, Richard B., Introduction to Computer Science: An Algorithmic Approach, 2.ª Ed. Lisboa: McGraw-Hill, 1989.
• AZUL, Artur A., Bases de Programação – Curso Tecnológico de Informática – 10.º ano, Porto: Porto Editora, 2004.
• MARQUES DE SÁ, Joaquim P., Fundamentos de Programação Usando C, Lisboa: FCA, 2004.
• KERNIGHAN, Brian & RITCHIE, Dennis, The C Programming Language, 2nd Ed. New Jersey: Prentice Hall, 1988.