2ª Licenciatura AED1 e PC1 Prof. Eduardo 1 1 MODULARIZAÇÃO - PDF
Download "2ª Licenciatura AED1 e PC1 Prof. Eduardo 1 1 MODULARIZAÇÃO"
Isaac Sampaio Borges
1 2ª Licenciatura AED1 e PC1 Prof. Eduardo 1 1 MODULARIZAÇÃO A identificação de problemas mais complexos resultará no desenvolvimento de algoritmos também mais complexos para resolve-os. Uma abordagem eficiente para este tipo de problema é a divisão do problema mais complexo em problemas mais simples de serem resolvidos. Este método é conhecido como modularização, onde um grande problema é divido em problemas menores e a solução destes problemas menores resultará na solução do problema maior (mais complexo). Estes programas menores são denominados sub-rotinas, subprogramas ou subalgoritmos. Um subprograma é um trecho de um algoritmo (futuro programa) maior (mais complexo) que realiza qualquer operação computacional estudada até agora (entrada, processamento, saída). Ele efetua parte de uma tarefa que um algoritmo maior deverá executar. O algoritmo que aciona um subprograma é chamado de algoritmo principal daquele subprograma. O funcionamento de um subprograma corresponde a implementação de uma função, no sentido matemático da expressão, pois um subprograma também retorna um único valor, de um ou mais valores manipulados em uma ou mais operações realizadas. A expressão "função" também é usada na elaboração de um subprograma, onde ela identifica a disponibilização de um ou mais subprogramas para um algoritmo principal, sendo esta expressão (função) uma palavra reservada. Portanto, sub-rotinas, também chamadas subprogramas, são blocos de instruções que realizam tarefas específicas. O código de uma sub-rotina é carregado uma vez e pode ser executado quantas vezes forem necessárias. Como o problema pode ser subdividido em pequenas tarefas, os programas tendem a ficar menores e mais organizados. Os programas em geral são executados linearmente, uma linha após a outra, até o fim. Entretanto, quando são utilizadas sub-rotinas, é possível a realização de desvios na execução dos programas. Veja a representação de um subprograma, em fluxograma, apresentado a seguir. Estes desvios são efetuados quando uma função é chamada pelo programa principal. Observe o exemplo a seguir: (a numeração das linhas à esquerda está apenas para facilitar a explicação) 1 algoritmo exemplo 2 declaração de variáveis 3 início 4 real sal; 5 escreva( Digite o salário: ); 6 leia(sal); 7 aum calculo(sal); 8 novo_sal sal + aum; 9 escreva( Novo salário:,novo_sal); 10 fim_algoritmo 11
2 2ª Licenciatura AED1 e PC1 Prof. Eduardo 2 12 sub-rotina calculo (real sal) 13 início 14 real perc,valor; 15 escreva( Digite o percentual de aumento: ); 16 leia(perc); 17 valor sal * perc/100; 18 retorne valor; 19 fim_sub-rotina calculo O algoritmo apresentado tem como objetivo receber o salário de um funcionário e calcular o novo salário. Para resolver este problema, utilizou-se o programa principal (representado pelo bloco de instruções entre as linhas 1 e 10) e sub-rotina (representada pelo bloco de instruções entre as linhas 12 e 19). O programa principal é executado linearmente até a linha 7. Neste ponto, existe uma chamada à sub-rotina calculo (que recebe como parâmetro o valor do salário inicial) e o programa principal fica temporariamente suspenso. A ordem de execução das instruções é, então, desviada para a linha 12, onde começa a sub-rotina calculo. A execução só volta ao programa principal quando o comando retorne é executado (linha 18). Esse comando é responsável também por devolver ao programa principal um valor calculado dentro da sub-rotina (nesse exemplo, foi devolvido o conteúdo da variável valor). A execução do programa principal é retornada exatamente no ponto em que foi interrompida; dessa maneira, o valor devolvido pela sub-rotina é atribuído à variável aum (linha 7). A partir daí, o programa volta a ser executado linearmente até o fim (linha 10). O exemplo apresentado mostra a utilização de uma sub-rotina que recebe um parâmetro (o valor atual do salário) e que, ao final, retorna um valor (aumento que será dado ao salário) para quem a chamou. Porém, as sub-rotinas podem não receber parâmetros nem retornar valor. Outro ponto que precisa ser destacado é que, dentro das sub-rotinas, pode ocorrer declaração de variáveis, chamadas variáveis locais. Elas recebem este nome porque podem ser utilizadas apenas dentro da sub-rotina. Quando a execução desta chega ao fim, essas variáveis são destruídas e seus conteúdos são perdidos. Variáveis declaradas fora de qualquer sub-rotina são chamadas de globais. Elas recebem este nome porque qualquer ponto do programa, incluindo as sub-rotinas, pode utilizá-las. São destruídas quando a execução do programa chega ao fim. Observação: Não se aconselha a utilização excessiva de variáveis globais, por tornar difícil a manutenção e a busca por erros nos programas. 2 MODULARIZAÇÃO EM C/C++ (FUNÇÕES) Um importante recurso apresentado nas linguagens de programação é a modularização, onde um programa pode ser particionado em sub-rotinas bastante específicas. A linguagem C/C++ possibilita a modularização por meio das funções. Um programa escrito na linguagem C/C ++ tem, no mínimo, uma função chamada main, por onde a execução começa. Existem também muitas outras funções predefinidas na linguagem C/C++, por exemplo: clrscr(), gets(), strcmp(), strcpy() etc. Estas funções são adicionadas aos programas pela diretiva #include, no momento da "linkedição". Além disso, o usuário também pode criar quantas funções quiser, dependendo do problema que estiver sendo resolvido pelo programa. As funções às vezes precisam receber valores externos, chamados parâmetros, e também podem devolver algum valor produzido para o ambiente externo, denominado retomo. Os parâmetros são representados por uma lista de variáveis colocadas dentro de parênteses, logo após o nome da função. Caso haja retomo, a última linha da função deverá incluir o comando return, seguido do valor ou variável que será devolvido a quem chamou a função. O tipo do valor
3 2ª Licenciatura AED1 e PC1 Prof. Eduardo 3 retomado deverá ser exatamente igual ao tipo informado antes do nome da função. Caso não haja retorno, deverá ser digitada a palavra void Funções com passagem de parâmetros e com retorno Um dos principais tipos de função é representado por aquelas que recebem valores no momento em que são chamadas (parâmetros) e que, no final, devolvem um valor para quem as chamou (retorno). A seguir é apresentado um exemplo (a numeração das linhas não faz parte do programa, servindo apenas para facilitar a explicação) float divisao(int dividendo, int divisor) 4 { float q; 5 q = dividendo / divisor; 6 return q; { int nl, n2; 11 float resposta; 12 cout << \ndigite o valor do dividendo: ; 13 cin >> nl; 14 cout << "\ndigite o valor do divisor: "; 15 cin >> n2; 16 resposta = divisao(nl, n2); 17 cout << "\no resultado da divisão é << resposta; Como já comentado na seção 2, a execução de programa escrito em C/C++ sempre começa pela função main. No exemplo, a execução iniciou na linha 9. A partir daí, são executadas seqüencialmente as linhas 10, 11, 12, 13,14 e 15. Nas linhas 13 e 15, dois valores são recebidos e armazenados nas variáveis nl e n2. Chegando à linha 16, o fluxo de execução é desviado para a função divisa0, levando para lá os valores das variáveis nl e n2. Serão então executadas as linhas 3, 4 e 5. Ao chegar à linha 6, o comando return é encontrado. Isto indica que a execução da função chegou ao fim e que o conteúdo da variável q será devolvido para quem a chamou. O fluxo de execução retoma à função main, na linha 16, e o valor retornado é atribuído à variável resposta. Depois disso, as linhas 17, 18 e 19 são executadas e o programa chega ao fim. Devemos destacar que, no momento em que a função divisão foi chamada, na linha 16, duas variáveis foram colocadas entre parênteses, indicando que houve passagem de parâmetros. Assim, os valores destas variáveis são copiados, respectivamente, para as variáveis dividendo e divisor, descritas no cabeçalho da função, na linha 3. Além disso, dentro da função di visão foi utilizado o comando return q, sinalizando que o valor da variável q será devolvido a quem a chamou. Por esta razão, o tipo da função é, exatamente igual ao tipo do valor retornado. Observação Em qualquer programa, podemos escrever funções antes ou depois da função main. Se optarmos por escrevê-las antes, nenhum cuidado especial será necessário. Porém, se optarmos por escrevê-las abaixo da função main, deveremos fazer uso dos protótipos de função. Protótipo de uma função é uma linha exatamente igual ao cabeçalho da função (terminando com um ponto-e-vírgula) que sempre deverá ser escrita antes da função main. Esta linha é responsável por informar ao compilador quais outras funções serão encontradas ao término da main. Observe o exemplo a seguir.
4 2ª Licenciatura AED1 e PC1 Prof. Eduardo 4 #include <iostream.> float divisao(int dividendo, int divisor); // esta linha descreve o protótipo // da função { int nl, n2; float r; cout << \ndigite o primeiro número: ; cin» nl; do { cout << "\ndigite o segundo número: "; cin» n2: while (n2 == 0); r = divisao{nl, n2); cout << \na divisão resultou em : << r; float divisao{int dividendo, int divisor) { float q; q = dividendo / divisor; return q; Exercícios resolvidos: 1 Faça um programa contendo uma sub-rotina que retorne 1 se o número digitado for positivo ou 0 se for negativo. 1ª Solução: int verifica(int num) { int res; if (num >= 0) res = 1; res = 0; return res; { int num, x; cout << "\ndigite um numero: "; cin >> num; x = verifica(num); if (x==1) cout << "\nn mero positivo"; cout << "\nn mero negativo"; 2ª Solução: int verifica(int num); { int num, x; cout << "\ndigite um numero: "; cin >> num; x = verifica(num); if (x==1) cout << "\nn mero positivo"; cout << "\nn mero negativo"; int verifica(int num) { int res; if (num >= 0) res = 1; res = 0; return res;
5 2ª Licenciatura AED1 e PC1 Prof. Eduardo 5 2 Crie um programa que receba os valores antigo e atual de um produto. Chame uma sub-rotina que determine o percentual de acréscimo entre esses valores. O resultado deverá ser mostrado no programa principal. float calculo_reajuste(float pa, float pn) { float result; result = (100 * pn * pa) / pa; return result; { float precoantigo, precoatual, acrescimo; cout << "Digite o pre o antigo: "; cin >> precoantigo; cout << "Digite o pre o final: "; cin >> precoatual; acrescimo = calculo_reajuste(precoantigo, precoatual); cout << "\no reajuste foi de " << acrescimo << "%"; 3 Elabore um programa contendo uma sub-rotina que receba as três notas de um aluno como parâmetros e uma letra. Se a letra for A, a sub-rotina deverá calcular a média aritmética das notas do aluno; se for P, deverá calcular a média ponderada, com pesos 5, 3 e 2. A média calculada deverá ser devolvida ao programa principal para, então se mostrada. Solução 1: #include <ctype.h> float calcula_media(float n1, float n2, float n3, char l) { float media; if (l == 'A') media = (n1+n2+n3)/3; media = (n1*5+n2*3+n3*2)/(5+3+2); return media; { float nota1, nota2, nota3, m; char letra; cout << "Digite a 1ª nota: "; cin >> nota1; cout << "Digite a 2ª nota: "; cin >> nota2; cout << "Digite a 3ª nota: "; cin >> nota3; do { cout << "Digite uma letra (A-Media aritmetica, P-M dia ponderada) "; cin >> letra; letra = toupper(letra); while ((letra!= 'A') && (letra!= 'P')); m = calcula_media(nota1, nota2, nota3, letra); if (letra=='a') cout << "\nmedia aritmetica = " << m; cout << "\nmedia ponderada = " << m;
6 2ª Licenciatura AED1 e PC1 Prof. Eduardo 6 Solução 2: #include <ctype.h> float calcula_media(float n1, float n2, float n3, char l); { float nota1, nota2, nota3, m; char letra; cout << "Digite a 1 nota: "; cin >> nota1; cout << "Digite a 2 nota: "; cin >> nota2; cout << "Digite a 3 nota: "; cin >> nota3; do { cout << "Digite uma letra (A-Media aritmetica, P-M dia ponderada) "; cin >> letra; letra = toupper(letra); while ((letra!= 'A') && (letra!= 'P')); m = calcula_media(nota1, nota2, nota3, letra); if (letra=='a') cout << "\nmedia aritmetica = " << m; cout << "\nmedia ponderada = " << m; float calcula_media(float n1, float n2, float n3, char l) { float media; if (l == 'A') media = (n1+n2+n3)/3; media = (n1*5+n2*3+n3*2)/(5+3+2); return media; Exercícios: 1 Criar um algoritmo que mostre um menu com as seguintes opções: 1 Área do retângulo 2 Área do triângulo 3 Área da circunferência 4 Sair Se opção = 1, deve-se ler a base e a altura e executar a função retângulo. Se for escolhida a opção 2, deve-se ler a base e a altura e chamar a função triângulo. Se for escolhido a opção 3, deve-se ler o raio e chamar a função circunferência. O algoritmo só termina quando for digitada a opção 4. 2 Faça um algoritmo contendo uma função que retorne 1 se o número for positivo ou 0 se for negativo. 3 Faça uma função que receba dois números positivos por parâmetro e retorne a soma dos N números inteiros existentes entre eles. 4 Crie uma função que receba três números inteiros a, b e c, sendo a maior que 1. A função deverá somar todos os inteiros entre b e c que sejam divisíveis por a (inclusive b e c) e retorne o resultado para a função principal. 5 Elabore um algoritmo contendo uma função que receba as três notas de um aluno como parâmetros e uma letra. Se a letra for A, a função deverá calcular a média aritmética das notas do aluno; se for P, deverá calcular a média ponderada, com pesos 5, 3 e 2. A média calculada deverá ser devolvida ao programa principal para, então, ser mostrada.
Funções em C. Funções em C. Funções em C. Prof. Yandre Maldonado e Gomes da Costa
Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa Prof. Yandre Maldonado - 2 Subprogramas são estabelecidos em linguagem C através da construção de funções; A sub-programação é uma ferramenta
ALGORITMOS E ESTRUTURAS DE DADOS II (Parte 1)
Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1 ALGORITMOS E ESTRUTURAS DE DADOS II (Parte 1) Prof. Eduardo Machado Real Conteúdos: Funções Ponteiros Se A é o sucesso, então A é igual a X mais Y mais