Baixe o app para aproveitar ainda mais
Prévia do material em texto
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica COMPUTAÇÃO BÁSICA Sub-algoritmos I Prof. Bruno Macchiavello (bruno@cic.unb.br) Universidade de Brasília – UnB Instituto de Ciências Exatas – IE Departamento de Ciência da Computação – CIC Prof. Bruno Macchiavello 1 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Modularização • Às vezes, como programadores temos de desenvolver programas para resolver problemas muito complicados, o que provavelmente envolve algoritmos grandes e complexos. Isso costuma implicar em códigos mais difíceis decostuma implicar em códigos mais difíceis de ler e em repetição de trechos de código ao longo do programa. Prof. Bruno Macchiavello 2 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Modularização • Uma técnica aconselhada para desenvolver bons programas de computador consiste em dividir o problema inicial em subproblemas mais simples ou, por outras palavras, dividir o programa que permite a resoluçãoprograma que permite a resolução computacional do problema em subprogramas ou sub-algoritmos. • A idéia é dividir os algoritmos em subalgoritmos menores e de mais fácil compreensão. Prof. Bruno Macchiavello 3 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Modularização • Um subprograma constitui um bloco independente dentro de um programa, podendo ser visto como um programa dentro de outro programa. • Tal como um programa necessita de comunicar com o ambiente exterior, através da leitura de dados e da apresentação de resultados, também um subprograma deve ter capacidade de aceitar valores e de, eventualmente, devolver resultados ao ambiente em que se insere, ou seja, o programa ou subprograma que controla a sua execução. Prof. Bruno Macchiavello 4 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Funções vs Procedimentos • Em algumas linguagens de programação e em alguns livros os sub-algoritmos são divididos em: funções e procedimentos. �O procedimentos não devolvem nenhum valor ao programa que o invocou. �A função devolve um valor ao programa que o invocou. Prof. Bruno Macchiavello 5 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Funções vs Procedimentos • Porém, um procedimento pode ser visto como uma função sem valor de retorno. • Logo, na disciplinas vamos chamar todos os• Logo, na disciplinas vamos chamar todos os sub-algoritmos de FUNÇÕES, mesmo se retornam ou não nenhum valor. Prof. Bruno Macchiavello 6 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Declaração em Pseudo-código • Para declarar as funções usaremos o seguinte formato Função tipo_de_retorno nome_da_função (t1 p1, t2 p2, ..., tn pn) • onde ti é o tipo do parâmetro i e pi é o nome do parâmetro i (no exemplo mostrado, só há um parâmetro, do tipo inteiro, que chamamos de “a”.) Prof. Bruno Macchiavello 7 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Declarando em Pseudo-código • Em seguida, haverá uma declaração Início, que delimita visualmente a função. • Pode haver ainda declarações de variáveis, como haveria num programa sem funções. • Depois há o corpo da função, onde são realizados os cálculos, e o comando retorne(), que encerra a função e se o valor de retorno for informado, retorna este valor. • Depois há a declaração Fim, para delimitar visualmente o limite da função. Prof. Bruno Macchiavello 8 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo 1 Exemplo: Faça um faça o algoritmo, que leia um número inteiro digitado pelo usuário e mostre na tela o quadrado dele que deve ser calculado por um subalgoritmo (função). Algoritmo Modular Função inteiro Quadrado (inteiro a) Prof. Bruno Macchiavello 9 Função inteiro Quadrado (inteiro a) Início retorne (a*a) Fim Variáveis i : inteiro Início Leia(i) Escreva(Quadrado(i)) Fim SUBALGORITMO (FUNÇÃO) ALGORITMO PRINCIPAL Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo 1 Exemplo: Faça um faça o algoritmo, que leia um número inteiro digitado pelo usuário e mostre na tela o quadrado dele que deve ser calculado por um subalgoritmo (função). Algoritmo Modular Função inteiro Quadrado (inteiro a) Prof. Bruno Macchiavello 10 Função inteiro Quadrado (inteiro a) Início retorne (a*a) Fim Variáveis i : inteiro Início Leia(i) Escreva(Quadrado(i)) Fim Tipo do retorno da função Tipo do parâmetro de entrada da função Parâmetro de entrada da função Chama a função Encerra a função Argumento de chamada Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Argumentos e Parâmetros • Muitas vezes é necessário indicar explicitamente ao subprograma as condições sob as quais a sua execução vai ser realizada. Por estas razões, um subprograma poderá aceitar argumentos que determinam essas condições. Os argumentosdeterminam essas condições. Os argumentos poderão ser variáveis, constantes ou expressões • Na descrição do subprograma terão de estar definidos, por sua vez, os parâmetros que correspondem aos argumentos que o programa do nível acima determinou Prof. Bruno Macchiavello 11 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Argumentos e Parâmetros • Considere-se, por exemplo, um subprograma para calcular a área de um retângulo, dados os comprimentos dos lados. Este subprograma irá devolver o valor da área do retângulo. O subprograma seria invocado recorrendo a uma instrução do tipoinstrução do tipo a = retangulo( comprimento, largura ) • A variável a seria de um tipo compatível com o valor de retorno do subprograma e comprimento e largura seriam variáveis usadas como argumentos Prof. Bruno Macchiavello 12 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Argumentos e Parâmetros • O subprograma seria definido como: Função real rectangulo( real x, real y ) Variaveis Inicio retorne (x*y); Fim • Na função rectangulo x e y são parâmetros do tipo real. Prof. Bruno Macchiavello 13 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo 2 Exemplo: Faça um algoritmo que leia um número inteiro e mostre o fatorial dele, sendo que o fatorial deve ser calculado por uma função. Algoritmo FatorialModular Função inteiro Fatorial (inteiro a) Variáveis i, fat : inteiro Prof. Bruno Macchiavello14 i, fat : inteiro Início fat←1 para i←1 até a faça fat←fat*i retorne (fat) Fim Variáveis n : inteiro Início Leia(n) Escreva(Fatorial(n)) Fim Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica A função Retorne() • Quando uma função está sendo executada, e se chega a uma declaração Retorne() a função é encerrada imediatamente e, se o valor de retorno é informado, a função retorna este valor. • OBS: É importante lembrar que o valor de retorno• OBS: É importante lembrar que o valor de retorno fornecido tem que ser compatível com o tipo de retorno declarado para a função. • Uma função pode ter mais de uma declaração Retorne(). A função é terminada quando o programa chega à primeira declaração Retorne(). Prof. Bruno Macchiavello 15 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo 3 Exemplo de um algoritmo com uma função que utiliza dois comandos Retorne(). Algoritmo ExemploRetorne Função inteiro Negativo (inteiro a) Início Se (a<0) Retorne (1) Prof. Bruno Macchiavello 16 Retorne (1) Senão Retorne (0) Fim Variáveis n : inteiro Início Leia(n) Se (negativo(n)==1) Escreva (“O número é negativo”) Senão Escreva (“O número não é negativo”) Fim Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Funções da Linguagem C • Formalmente, uma função em C tem essa “cara”: tipo_de_retorno nome_da_função (t1 p1, t2 p2, ..., tn pn) {tipo_de_retorno nome_da_função (t1 p1, t2 p2, ..., tn pn) { corpo da função • Onde ti é o tipo do parâmetro i e pi é o nome do parâmetro i; Prof. Bruno Macchiavello 17 corpo da função } Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo 4 Exemplo de um algoritmo com uma função que utiliza dois comandos Retorne() em Ansi C. #include <stdio.h> int negativo (int a) { if (a<0) return 1; else Prof. Bruno Macchiavello 18 else return 0; } int main () { int n; scanf("%d",&n); if (negativo(n)==1) printf("O número é negativo\n"); else printf("O número não é negativo\n"); return 0; } Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Funções da Linguagem C • Pelo exemplo anterior, podemos ver que uma função pode ser declarada antes da main, e que seu formato é muito parecido com o da main (de fato, a main é uma função!). • No exemplo mostrado, só há um parâmetro, do tipo int que chamamos de “a”. • Vale ressaltar que o nome do parâmetro na função não tem relação com o nome do argumento (da variável que será passada por quem a chamou). Prof. Bruno Macchiavello 19 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Funçoes de Linguagem C • Como já foi dito, a main() é uma função, e seu valor de retorno é lido pelo sistema operacional. A convenção é que se um programa retorna zero ele foi executado com sucesso, e se retorna não-zero é porque teve problemas. • O printf() é uma função que retorna um inteiro com o número de caracteres impressos na tela. (Embora esse valor seja descartado, pois não é utilizado.) • O scanf() é uma função que retorna um inteiro com o número de elementos lidos. Prof. Bruno Macchiavello 20 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Escopos de Variáveis • Uma variavél puede ser global o local. A varaivél local tem como esopo a função onde é declarada, a global tem como escopo TODAS as funções. • VARIÁVEIS GLOBAIS: são úteis para facilitar a vida do programador em algumas circunstâncias, mas podem ser realmente perigosas, pois podem ser alteradas em qualquerrealmente perigosas, pois podem ser alteradas em qualquer parte do programa. Evite ao máximo o uso de variáveis globais (NOS TRABALHOS É PROIBIDO O USO DE VARIAVEIS GLOBAIS). • VARIÁVEIS LOCAIS: são mais seguras e permitem que várias funções possuam variáveis com o mesmo nome (embora pareça contraditório, a experiência mostra que isso facilita a leitura do programa). Além disso, variáveis locais poupam memória, pois só existem enquanto são necessárias. Prof. Bruno Macchiavello 21 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Escopo de Variáveis Esqueleto de um programa em C. A variável N é global, enquanto func() e main() possuem cada uma uma variável i, e modificar o valor em uma não influencia o valor que é mantido em outra. Se modificarmos N tanto em func() quanto em main(), o valor visto pela outra será alterado, pois N é modificável por todas elas. #include <stdio.h> Prof. Bruno Macchiavello 22 int N; int func (...) { int i; ... return (...); } int main () { int i; ... return 0; } Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica O tipo VOID • Em inglês, void quer dizer vazio. • O tipo void em C é usado (dentre outras circunstâncias) quando uma função não retorna nada e em funções que não têm parâmetros! • Uma função do tipo void não precisa de return, pois ela não retorna nada. Caso deseje sair imediatamente da função, use return; (sem um valor associado). • Uma função do tipo void pode ser considerada com um Procedimento. Prof. Bruno Macchiavello 23 void nome_da_função (t1 p1, t2 p2, ..., tn pn) Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica O tipo VOID • Também podemos fazer funções que não têm parâmetros: tipo_de_retorno nome_da_função (void) • Ou ainda, que não tem parâmetros e que não retornam nada: Prof. Bruno Macchiavello 24 void nome_da_função (void) Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica O tipo VOID • Em C se vc não declara parâmetros assume que é void. tipo_de_retorno nome_da_função (void) • É equivalente a: Prof. Bruno Macchiavello 25 tipo_de_retorno nome_da_função () Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo 5 Exemplo: Programa em C com uma função do tipo Void (não retorna nada) e sem parâmetros de entrada. #include <stdio.h> void Mensagem (void) { Prof. Bruno Macchiavello 26 { printf ("Ola! Eu estou vivo.\n"); } int main () { Mensagem(); printf ("\tDiga de novo:\n"); Mensagem(); return 0; } Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Diferentes Declarações de Funções • Na linguagem ANSI C existem 3 formas de declarar uma função: 1. Sempre escrever a função acima da função que vai chamar ela. 2. Escrever a função em qualquer posição mas fazer a referência de todas as funções antes. 3. Utilizar um arquivo auxiliar (.h) para fazer a referênciae incluir o arquivo auxiliar no programa. Prof. Bruno Macchiavello 27 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo 6 #include <stdio.h> int negativo (float a) { if (a < 0 ) return 1; else return 0; } void area (void) { Prof. Bruno Macchiavello 28 { float r; do { printf(“Informe o valor do raio:\n”); scanf(“%f”,r); }while(negativo(r)); printf(“A area e: %.2f”, 3.14*r^2); } int main () { area(); return 1; } Funções na ordem correta Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica #include <stdio.h> int negativo (float a); float area (void); int main () { area(); return 1; } void area (void) { float r; Referencia das funções Prof. Bruno Macchiavello 29 float r; do { printf(“Informe o valor do raio:\n”); scanf(“%f”,r); }while(negativo(r)); printf(“A area e: %.2f”, 3.14*r^2); } int negativo (float a) { if (a < 0 ) return 1; else return 0; } Funções em qualquer ordem Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica #include <stdio.h> #include “funcoes.h” int main () { area(); return 1; } void area (void) { float r; do Funções • A terceira forma é criar um arquivo com extensão “.h” para fazer as referência e colocar o arquivo na mesma pasta do arquivo “.c”. Por exemplo criarmos um arquivo chamado “funcoes.h”. Com o Prof. Bruno Macchiavello 30 int negativo (float a); float area (void); do { printf(“Informe o valor do raio:\n”); scanf(“%f”,r); }while(negativo(r)); printf(“A area e: %.2f”, 3.14*r^2); } int negativo (float a) { if (a < 0 ) return 1; else return 0; } Funções em qualquer ordem “funcoes.h”. Com o conteúdo abaixo. • No programa (arquivo “.c”) deve-se incluir o arquivo de cabeçalho com o comando INCLUDE. Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Diferentes Declarações de Funções • Qual a melhor forma? • Não existe uma opção melhor (todas são equivalentes). • Porém é recomendado sempre declarar as funções na ordem correta, para facilitar a leitura do código. E utilizar a referência das funções (podendo utilizar o arquivo .h ou não) para garantir possíveis erros de compilação em um programa com MUITAS funções. Prof. Bruno Macchiavello 31 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Observação • Em pseudo-código vamos utilizar como padrão na disciplina sempre a opção 1 (colocar as funções na ordem correta). Prof. Bruno Macchiavello 32
Compartilhar