21
1 Disciplina: Introdução à Programação. IPRJ/UERJ Professora: Sílvia Mara da Costa Campos Victer Índice: Aula10 Sub-rotina: Em algoritmos Em C Sub-rotinas subprograma - programação modularizada Definição: As sub-rotinas são blocos de instruções que realizam tarefas específicas. O código de um subprograma é carregado uma vez e executado várias vezes. O problema pode ser subdividido em pequenas tarefas, com isso 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. Mas quando usamos sub-rotinas, é possível realizar desvios na execução dos programas. Estes desvios são efetuados quando uma função é chamada pelo programa principal. Exemplo: Explicação do programa: Objetivo desse algoritmo: receber o valor do salário de um funcionário e calcular o novo salário. Para resolver este problema, utilizou-se o programa principal (bloco de instruções entre as linha 1 e 7) e uma sub-rotina (bloco de instruções entre as linhas 8 e 13).

Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

1

Disciplina: Introdução à Programação.

IPRJ/UERJ Professora: Sílvia Mara da Costa Campos Victer

Índice:

Aula10 – Sub-rotina: Em algoritmos

Em C

Sub-rotinas – subprograma - programação modularizada

Definição:

As sub-rotinas são blocos de instruções que realizam tarefas específicas. O código de um subprograma é carregado uma vez e executado várias vezes.

O problema pode ser subdividido em pequenas tarefas, com isso 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. Mas quando usamos sub-rotinas, é possível realizar desvios na execução dos programas. Estes desvios são efetuados quando uma função é chamada pelo

programa principal.

Exemplo:

Explicação do programa:

Objetivo desse algoritmo: receber o valor do salário de um funcionário e calcular o

novo salário. Para resolver este problema, utilizou-se o programa principal (bloco de instruções entre as linha 1 e 7) e uma sub-rotina (bloco de instruções entre as

linhas 8 e 13).

Page 2: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

2

Este exemplo 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.

Qual a diferença entre variáveis locais e globais?

Variáveis locais: variáveis declaradas dentro das sub-rotinas. As variáveis

locais 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 globais: variáveis declaradas fora de qualquer sub-rotina. As

variáveis globais recebem este nome porque qualquer ponto do programa, incluindo as sub-rotinas, pode utilizá-las. Elas são destruídas quando a

execução do programa chega ao fim.

Obs: não é aconselhável a utilização excessiva de variáveis globais, pois torna difícil a manutenção e a busca por erros nos programas.

Sub-rotinas em C/C++ (funções)

Modularização - Recurso das linguagens de programação – particionar um

programa em sub-rotinas bastante específicas.

Um programa escrito na linguagem C/C++ tem, no mínimo, uma função chamada main, que indica o início da execução. Existe um série de outras funções

predefinidas, por exemplo: clrscr(), gets(), strcpy(), printf(), scanf(), pow(), etc.

Estas funções são adicionadas aos programas pela diretiva #include, no momento da “linkedição”.

O usuário pode criar quantas funções quiser, dependendo do problema que estiver sendo resolvido pelo programa.

As funções podem, quando houver necessidade, receber valores externos, chamados parâmetros, e também podem devolver algum valor produzido para o

ambiente externo, denominado retorno. 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 retorno, 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

Page 3: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

3

valor retornado deverá ser exatamente igual ao tipo informado antes do nome da

função. A palavra void deverá ser digitada caso a função não retorne valor.

Tipos de funções

1- Funções sem passagem de parâmetro e sem retorno.

Este é o tipo mais simples de função, pois não recebe nenhuma informação no momento de sua chamada e também não repassa nenhum valor para quem a

chamou.

Exemplo:

Explicação do programa

A execução sempre começa pela função main.

A execução se inicia na linha 13.

Na linha 15, existe uma chamada à função soma, onde o fluxo da execução é desviado para a linha 3. Depois são executada as linhas 4 até 11.

Quando a execução atinge a linha 12, a marca de final da função é encontrada. Neste momento, o fluxo da execução retorna para a linha 16, exatamente abaixo de

onde ocorreu o desvio para a função soma. Na linha 16 está a marca de finalização da função main, e o programa é concluído.

OBS_1: no momento em que a função soma foi chamada, na linha 15, nenhum valor

ou variável foi colocado entre parênteses, indicando que não houve passagem de parâmetros.

OBS_2: dentro da função soma não foi utilizado o comando return, indicando que ela não retornou nenhum valor para quem a chamou, logo, o seu tipo é void.

Fazer: Exercícios 1, 6.

Page 4: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

4

2- Funções com passagem de parâmetros e sem retorno.

Este tipo de função é representado por aquelas que recebem valores no momento em

que são chamadas (parâmetros), mas que, no final, não devolvem valor para quem a chamou (retorno).

Exemplo:

Explicação do programa:

A execução do programa sempre começa pela função main. A execução iniciou-se na linha 9.

Em seguida, são executadas sequencialmente as linhas 10 até 14. Nas linha 12 e 14, dois valores são recebidos e armazenados nas variáveis n1 e n2.

Serão executadas então as linhas 3 a 8, onde está a marca de encerramento da

função. O fluxo de execução retorna à função main, na linha 16, imediatamente abaixo do

ponto de chamada da função calcula_media. A execução do programa é concluída.

OBS_1: no momento em que a função calcula_media foi chamada, na linha 15, duas

variáveis foram colocadas entre parênteses, indicando que houve passagem de parâmetros. Os valores delas são copiados para as variáveis numero 1 e numero 2,

descrita no cabeçalho da função, na linha 3. OBS_2: na função calcula_media, não foi utilizado o comando return, indicando que

ela não retornou valor para quem a chamou. Logo, seu tipo foi definido como void.

Fazer: Exercício 4

3- Funções sem passagem de parâmetros e com retorno

Este tipo de função é representado por aquelas que não recebem valores no momento

em que são chamadas (parâmetros), mas que, no final, devolvem um valor para quem as chamou (retorno).

Page 5: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

5

Exemplo:

A execução do programa começa pela função main (sempre).

A execução tem início na linha 12. Continua na linha 13.

Na linha 14, o fluxo de execução é desviado para a função multiplicação, na linha 3. As linhas 3 a 10 são executadas.

Ao chegar à linha 10, o comando return é encontrado. Isto significa que a execução da função chegou ao fim e que o conteúdo da variável produto será devolvido para

quem a chamou. O fluxo de execução retorna à função main, na linha 14.

O valor retornado é atribuído à variável resposta. As linhas 15,16 e 17 são executadas.

Fim do programa.

OBS_1: no momento em que a função multiplicação foi chamada, na linha 14,

nenhum valor ou variável foi colocada entre parênteses, o que indica que não houve passagem de parâmetros.

OBS_2: na função multiplicação foi utilizado o comando return produto, significa que o valor da variável produto foi devolvido a quem a chamou. Logo, o tipo da função é

float, exatamente igual ao tipo do valor retornado.

4- Funções com passagem de parâmetro e com retorno

Este tipo 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 a

chamou (retorno).

Exemplo:

Page 6: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

6

Explicação do programa:

1- A execução do programa começa pela função main (sempre), na linha 9.

2- As linhas 10, 11,12,13,14 e 15 são executadas sequencialmente. 3- Nas linhas 13 e 15 dois valores são recebidos e armazenados nas variáveis n1 e

n2, respectivamente. 4- Na linha 16, o fluxo de execução é desviado para a função divisão, com os

valores das variáveis n1 e n2. 5- As linhas 3,4, e 5 são executadas.

6- Na linha 6, o comando return é encontrado. 7- A execução da função termina.

8- O conteúdo da variável q será devolvido para quem a chamou. 9- Na linha 16, o fluxo da execução retorna à função main e o valor retornado é

atribuído à variável resposta.

10- As linhas 17, 18 e 19 são executadas. 11- Término do programa.

OBS_1: quando a função divisão foi chamada, na linha 16, duas variáveis foram

colocada entre parênteses, indicando que houve passagem de parâmetros. Assim, os valores destas variáveis são copiados, respectivamente, para a variáveis dividendo e

divisor, descritas no cabeçalho da função, na linha 3. OBS_2: na função divisão foi utilizado o comando return q, indicando que o valor da

variável q será devolvido a quem a chamou. Portanto, o tipo da função é, exatamente igual ao tipo do valor retornado.

Fazer: Exercícios 2, 3, 5, 7.

Page 7: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

7

Protótipo de função

Em qualquer programa, podemos escrever funções antes ou depois da função main.

Caso as funções sejam escritas abaixo da função main, devemos fazer uso dos protótipos de função.

Definiçã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. Essa linha é responsável por informar ao compilador quais outras funções serão

encontradas ao término da função main.

Exemplo:

Page 8: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

8

Passagem de parâmetros por valor

Significa que a função trabalhará com cópia dos valores passados no momento de sua chamada.

Exemplo:

Representação gráfica:

Explicação do programa

Supor que os valores armazenados nas variáveis x e y, pela execução das linhas 7 e

9, sejam, respectivamente, 5 e 3. Quando a linha 10 é executada, esses valores são copiados para as variáveis a e b

(pertencentes a função soma_dobro). Nas linhas 17 e 18 os valores de a e b são multiplicados por 2.

Na linha 19 é feita a soma. O resultado dessa soma é devolvido à função main pela execução da linha 20, onde o

valor calculado recai sobre a variável res (retorno à linha 10). Quando a função soma_dobro chega ao fim, as variáveis a, b e soma são destruídas

e, portanto, as alterações realizadas pelas multiplicações por 2 são perdidas, ou seja, x continua valendo 5 e y continua valendo 3.

Page 9: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

9

Passagem de parâmetros por referência

Significa que os parâmetros passados para uma função correspondem a endereços de memória ocupados por variáveis. Toda vez que for necessário acessar

determinado valor, isso será feito por meio de referência, ou seja, apontamento ao seu endereço.

Representação gráfica:

Explicação do programa

Nas linhas 7 e 9 são lidos, respectivamente, os valores para as variáveis x e y (no

exemplo, supor que x=5 e y=3).

Quando a função soma_dobro é chamada, na linha 10, são passados como parâmetros para a função os endereços de memória ocupados pelas variáveis x e y

Page 10: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

10

(isso é feito pelo operador & que obtém o endereço de memória de uma variável), ou

seja, do exemplo, os valores 800 (endereço ocupado por x) e 300 (endereço ocupado por y). Os valores que recaem sobre as variáveis a e b (da função) são,

respectivamente, 800 e 300 (isto é correto, já que a e b são ponteiro do tipo int).

Nas linhas 16 e 17, os valores 5 e 3 são multiplicados por 2. Neste momento ocorre a ‘referência’ aos endereços de memória 800 e 300, para que sejam obtidos os

valores iniciais e, após a realização das multiplicações, os valores sejam alterados. Dessa forma, no endereço 800 passamos a ter o valor 10, e no endereço 300

passamos a ter o valor 6. Na linha 18, é realizada a soma dos valores que estão nos endereços especificados

por a e b (que já foram multiplicados por 2). Na linha 19, o resultado da soma é devolvido à função main, recaindo sobre a

variável res (linha10) e encerrando a função soma_dobro. Quando a função soma_dobro chega ao fim, as variáveis a,b e soma são destruídas.

Entretanto, as alterações decorrentes das multiplicações feitas são mantidas, pois

cada alteração fez referência a endereços de memória que estavam fora da área destinada à função. Assim, após a função soma_dobro, o valor de x será 10 e o de y,

6.

Observações: A linguagem C/C++ não permite que vetores e matrizes sejam passados na íntegra

como parâmetro para uma função. Deve-se passar apenas o endereço da posição inicial do vetor ou da matriz. Esse endereço é obtido utilizando-se o nome do vetor

(ou da matriz) sem o índice entre colchetes.

É possível passar um vetor para uma função somente se essa passagem for por referência.

Exemplo:

Page 11: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

11

Fazer: Exercício 8

Perguntas:

1- O que são sub-rotinas? 2- O que significa modularização?

3- Para que serve o comando return? 4- O que são parâmetros de funções? como são representados?

5- O que significa o tipo void usado em funções? 6- Quais são os quatro tipos de funções existentes? Explique dois tipos.

7- O que significa modularização?

8- Explique cada algoritmo apresentado. 9- Qual a diferença entre variáveis locais e globais?

Page 12: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

12

10- Para que serve o comando return?

11- Para que serve o comando void? 12- O que é protótipo de função? Quando devemos usá-lo?

13- O que significa passagem de parâmetros por valor? Dê um exemplo.

14- O que significa passagem de parâmetros por referência? Dê um exemplo.

15- Como é feita a passagem de um vetor para uma função?

Exercícios:

1) Faça um programa contento uma sub-rotina que retorne 1 se o número digitado

for positivo ou 0 se for negativo.

2) Faça um programa que receba dois números positivos por parâmetro e retorne

a soma dos N números existentes entre eles.

Page 13: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

13

3) 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 retornar o resultado para a função principal.

4) Faça uma função que receba como parâmetro um inteiro no intervalo de 1 a 9 e

mostre a seguinte tabela de multiplicação (neste exemplo, n=9).

Page 14: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

14

5) 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, ser mostrada.

6) Faça uma sub-rotina que leia cinco valores inteiros, determine e mostre o maior e o menor deles.

Page 15: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

15

7) Crie uma sub-rotina que receba como parâmetro um valor inteiro e positivo N e

retorne o valor de S, obtido pelo seguinte cálculo:

8) Elabore uma sub-rotina que retorne ao programa principal um vetor com os três

primeiros números perfeitos. Um número é perfeito quando é igual à soma de seus divisores (exceto ele mesmo). Exemplo: os divisores de 6 são: 1, 2 e 3, e 1+2+3=6.

Logo, ele é perfeito.

Page 16: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

16

Page 17: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

17

9) Faça uma sub-rotina que receba um vetor A de dez elementos inteiros como

parâmetro. Ao final dessa função, deverá ter sido gerado um vetor B contendo o fatorial de cada elemento de A. O vetor B deverá ser mostrado no programa principal.

10) Faça uma sub-rotina que receba como parâmetro um vetor A com cinco números

reais e retorne esses números ordenados de forma crescente.

Page 18: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

18

11)

Page 19: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

19

12)

Page 20: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

20

Outros exercícios propostos:

Page 21: Disciplina: Introdução à Programação. IPRJ/UERJ Professora: …files.silviavicter.webnode.com/200000103-c3451c43b4/Aula... · 2016. 11. 21. · Sub-rotinas em C/C++ (funções)

21

Livros:

1- Fundamentos da Programação.

Ascencio, Ana/Campos, Edilene.

http://wps.prenhall.com/br_ascencio_2/77/19865/5085520.cw/index.html

2- C completo e total.

Herbert Schildt

3- Programando em C. Schaum McGraw-Hill