Estrutura de Dados e Algoritmos I
Capítulo 2. Modularização
Márcio Palheta, M.Sc.
marcio.palheta@gmail.com
O instrutor
Desenvolve SW desde 2000
Mestre em BD-RI pela UFAM 2013
Especialista Aplicações Web pela FUCAPI 2008
marcio.palheta@gmail.com
Site das disciplinas:
https://sites.google.com/sit
e/marciopalheta/ Professor e Arquiteto de Software
MARCIO PALHETA
Plano de aula do 1º Bimestre
Funções e procedimentos (18/07)
Vetores (23, 25, 30/07, 01, 06 e 08/08)
Lista 01 – [AV1] (13 e 15/08)
Matrizes (20, 22, 27 e 29/08)
Recursividade e Strings (03, 10 e 12/09)
Lista 02 [AV2] (17 e 19/09)
Avaliação Bimestral [AVB1] (24 e 26/09) Trabalho Prático [TP1] (01 e 03/10)
Plano de aula do 2º Bimestre
Registros e ponteiros(08 e 10/10)
Alocação dinâmica(15, 17 e 22/10)
Lista03 - AV3 (29 e 31/10)
Arquivos(05, 07, 12 e 14/11)
Lista04 - AV4 (19 e 21/11)
Trabalho Prático TP2 (26 e 28/11)
Avaliação Bimestral AVB2 (03 e 05/12)
O problema da soma de 3 números
Imagine um cenário onde você precisa pedir do usuário 3 números quaisquer e devolver a soma deles.
Por onde começar?
Que tal escolher a estratégia?
Como seria nosso algoritmo?
A soma de três números:
Algoritmo
Declare a, b, c, soma
Leia a
Leia b
Leia c
soma = a + b + c
Imprima soma
DECLARAÇÃO das variáveis
A soma de três números:
Algoritmo
Declare a, b, c, soma
Leia a
Leia b
Leia c
soma = a + b + c
Imprima soma
LEITURA das variáveis
A soma de três números:
Algoritmo
Declare a, b, c, soma
Leia a
Leia b
Leia c
soma = a + b + c
Imprima soma
SOMA das variáveis
A soma de três números:
Algoritmo
Declare a, b, c, soma
Leia a
Leia b
Leia c
soma = a + b + c
Imprima soma
IMRESSÃO do resultado
Transformando algoritmo em código-fonte
Uma vez definido o passo-a-passo para resolver um problema, vem a escolha da linguagem de programação.
A título de exemplo, veremos a
implementação do nosso algoritmo em:
Java, Python e
C / C++ (que é o foco do nosso curso)
Soma de três números:
Implementação JAVA
DECLARAÇÃO das variáveis
Soma de três números:
Implementação JAVA
LEITURA das variáveis
Soma de três números:
Implementação JAVA
SOMA das variáveis
Soma de três números:
Implementação JAVA
IMPRESSÃO do resultado
Soma de três números:
Implementação PYTHON
DECLARAÇÃO das variáveis
Soma de três números:
Implementação PYTHON
LEITURA das variáveis
Soma de três números:
Implementação PYTHON
SOMA das variáveis
Soma de três números:
Implementação PYTHON
IMPRESSÃO do resultado
Soma de três números:
Implementação C / C++
DECLARAÇÃO de variáveis
Soma de três números:
Implementação C / C++
LEITURA de variáveis
Soma de três números:
Implementação C / C++
SOMA de variáveis
Soma de três números:
Implementação C / C++
IMPRESSÃO do resultado
Percebeu algo interessante?
Haaan...
Huuuum...
Percebeu algo interessante?
O algoritmo
é igual
Percebeu algo interessante?
O algoritmo é igual
Executado
linha-a-linha
Percebeu algo interessante?
O algoritmo é igual
O que muda é a linguagem de
programação
Executado
linha-a-linha
Exercícios
Implemente o código C/C++ para resolver a soma de três números, conforme slides anteriores.
Resolva o problema da anterior usando apenas as variáveis a e soma.
Problema do aumento de salário
Imagine que você foi escolhido para
programar a atualização de salários da sua empresa.
Nesse problema, você precisa:
Ler o nome do funcionário;
Ler o salário atual;
Ler o valor a ser acrescentado ao salário;
Imprimir o novo salário
Problema do aumento de salário
Imagine que você foi escolhido para
programar a atualização de salários da sua empresa.
Nesse problema, você precisa:
Ler o nome do funcionário;
Ler o salário atual;
Ler o valor a ser acrescentado ao salário;
Imprimir o novo salário
Oooopa! O
que é isso?
Problema do aumento de salário
Imagine que você foi escolhido para
programar a atualização de salários da sua empresa.
Nesse problema, você precisa:
Ler o nome do funcionário;
Ler o salário atual;
Ler o valor a ser acrescentado ao salário;
Imprimir o novo salário
Oooopa! O que é isso?
Isso mesmo,
nosso algoritmo
Implementação em C / C++
Implementação em C / C++
DECLARAÇÃO das variáveis
Implementação em C / C++
LEITURA das variáveis
Implementação em C / C++
CÁLCULO do novo salário
Implementação em C / C++
IMPRESSÃO do resultado
Pensando em organização do código-fonte
E se eu precisar calcular o novo salário em vários
pontos do sistema?
Pensando em organização do código-fonte
E se eu precisar calcular o novo salário em vários
pontos do sistema?
Tenho que Copiar
e Colar o código?
Modularização
Que nada!
Modularização
Que nada!
Você pode usar
sub-rotinas
Modularização
Que nada!
Você pode usar sub-rotinas
Conhecidas como
Métodos, Funções
Trabalhando com sub-rotinas
E como isso
funciona?
Trabalhando com sub-rotinas
Escreva um bloco de
código com o algoritmos
que você quer reutilizar
Trabalhando com sub-rotinas
Escreva um bloco de
código com o algoritmos que você quer reutilizar
Depois, é só chamar
a sub-rotina, sempre
Por exemplo
Imagine que você precisa calcular o novo salário duas vezes;
Defina a sub-rotina acima do seu método principal (int main())
Inclua na sub-rotina o algoritmo que você quer reaproveitar;
E chame a sua sub-rotina a partir do método main()
Trabalhando com sub-rotinas
Você vai ficar muito triste se eu perguntar...
Como assim?
Tá bom. 1º você precisa saber como declarar uma sub-rotina
A declaração de uma sub-rotina, função ou procedimento tem um padrão:
<tipo> nome_da_funcao(<tipo> arg1,
<tipo> arg2, ..., <tipo> argN){
<algoritmo da subrotina>
return valor_de_retorno;
}
Tá bom. 1º você precisa saber como declarar uma sub-rotina
A declaração de uma sub-rotina, função ou procedimento tem um padrão:
<tipo> nome_da_funcao(<tipo> arg1,
<tipo> arg2, ..., <tipo> argN){
<algoritmo da subrotina>
return valor_de_retorno;
}
Aqui vem o Tipo de Retorno da sub-rotina.
void, int, char, float etc
Tá bom. 1º você precisa saber como declarar uma sub-rotina
A declaração de uma sub-rotina, função ou procedimento tem um padrão:
<tipo> nome_da_funcao(<tipo> arg1,
<tipo> arg2, ..., <tipo> argN){
<algoritmo da subrotina>
return valor_de_retorno;
}
Aqui vem o Tipo de Retorno da sub-rotina.
void, int, char, float etc
Se tipo de retorno
void = Procedimento
qualquer outro = Função
Tá bom. 1º você precisa saber como declarar uma sub-rotina
A declaração de uma sub-rotina, função ou procedimento tem um padrão:
<tipo> nome_da_funcao(<tipo> arg1,
<tipo> arg2, ..., <tipo> argN){
<algoritmo da subrotina>
return valor_de_retorno;
}
Aqui vem o NOME
da sub-rotina.
A declaração de uma sub-rotina, função ou procedimento tem um padrão:
<tipo> nome_da_funcao(<tipo> arg1,
<tipo> arg2, ..., <tipo> argN){
<algoritmo da subrotina>
return valor_de_retorno;
}
Tá bom. 1º você precisa saber como declarar uma sub-rotina
Aqui vem o LISTA DE
PARÂMETROS da sub-rotina.
A declaração de uma sub-rotina, função ou procedimento tem um padrão:
<tipo> nome_da_funcao(<tipo> arg1,
<tipo> arg2, ..., <tipo> argN){
<algoritmo da subrotina>
return valor_de_retorno;
}
Tá bom. 1º você precisa saber como declarar uma sub-rotina
Aqui vem o CORPO
da sub-rotina.
A declaração de uma sub-rotina, função ou procedimento tem um padrão:
<tipo> nome_da_funcao(<tipo> arg1,
<tipo> arg2, ..., <tipo> argN){
<algoritmo da subrotina>
return valor_de_retorno;
}
Tá bom. 1º você precisa saber como declarar uma sub-rotina
Por último, você
retorna o RESULTADO
da sub-rotina...
A declaração de uma sub-rotina, função ou procedimento tem um padrão:
<tipo> nome_da_funcao(<tipo> arg1,
<tipo> arg2, ..., <tipo> argN){
<algoritmo da subrotina>
return valor_de_retorno;
}
Tá bom. 1º você precisa saber como declarar uma sub-rotina
Por último, você
retorna o RESULTADO da sub-rotina...
... mas só se for
uma função
Por exemplo, veja a função
para cálculo do aumento
Por exemplo, veja a função para cálculo do aumento
Tipo de retorno
da função.
Por exemplo, veja a função para cálculo do aumento
Nome da função.
Por exemplo, veja a função para cálculo do aumento
A Lista de parâmetros
da função está vazia.
Por exemplo, veja a função para cálculo do aumento
Corpo da função.
Por exemplo, veja a função para cálculo do aumento
Retorno da função.
Trabalhando com sub-rotinas
Sei, mas... Como
chamo a sub-rotina?
Trabalhando com sub-rotinas
Fácil fácil...
Você informa o nome da
sub-rotina...
Trabalhando com sub-rotinas
Fácil fácil...
Você informa o nome da sub-rotina...
... e sua lista de
parâmetros
Trabalhando com sub-rotinas
Olha só a continuação do
código anterior...
Trabalhando com sub-rotinas
Olha só a continuação do
código anterior...
Trabalhando com sub-rotinas
O resultado da função
calcularAumento()...
Trabalhando com sub-rotinas
O resultado da função calcularAumento()...
...é guardado na
variável salario
Trabalhando com sub-rotinas
Agora, você pode imprimir o conteúdo
da variável salario
Trabalhando com sub-rotinas
Que tal, é
difícil?
Trabalhando com sub-rotinas
Que tal, é difícil?
É naaaada.
Trabalhando com sub-rotinas
Huuuuum
Outra coisa...
Trabalhando com sub-rotinas
Huuuuum Outra coisa...
Como fica a
memória, durante a execução das sub-
rotinas?
Trabalhando com sub-rotinas
Bom... a execução
ocorre linha-a-linha
Trabalhando com sub-rotinas
Bom... a execução
ocorre linha-a-linha
Trabalhando com sub-rotinas
Bom... a execução
ocorre linha-a-linha
Trabalhando com sub-rotinas
Bom... a execução
ocorre linha-a-linha
A pilha de execução
Os métodos são empilhados na
memória
main()
Pilha de execução
A pilha de execução
Os métodos são empilhados na
memória
main()
Pilha de execução
A pilha de execução
main()
Pilha de execução
Quando um novo método é
encontrado...
A pilha de execução
main()
calculaAumento() Pilha de execução
... é incluído na pilha
de execução...
A pilha de execução
main()
calculaAumento() Pilha de execução
... a execução do método atual é
parada...
A pilha de execução
main()
calculaAumento() Pilha de execução
... e é iniciada a execução do novo
método...
A pilha de execução
main()
calculaAumento() Pilha de execução
... que também ocorre de forma
linear
A pilha de execução
main()
calculaAumento() Pilha de execução
printf()
A pilha de execução
main()
calculaAumento() Pilha de execução
printf()
Exclusão após a execução
X
A pilha de execução
main()
calculaAumento() Pilha de execução
Exclusão após
a execução
A pilha de execução
main()
calculaAumento() Pilha de execução
scanf()
A pilha de execução
main()
calculaAumento() Pilha de execução
printf()
A pilha de execução
main()
calculaAumento() Pilha de execução
scanf()
A pilha de execução
main()
calculaAumento() Pilha de execução
A pilha de execução
main()
calculaAumento() Pilha de execução
A pilha de execução
main()
calculaAumento() Pilha de execução
Exclusão após a execução
X
A pilha de execução
main() printf()
Pilha de execução
Trabalhando com sub-rotinas
main()
Pilha de execução
Pilha vazia
Pilha de execução
FIM da execução
do programa
É simples
assim ?
É simples assim ?
Úúúuuuuhhhh
SHOW!
É simples assim ?
Úúúuuuuhhhh SHOW!
Já é...
Então vumbora
praticar ...
Exercício de sub-rotinas
Responda usando C / C++
1. Escreva uma função que receba cinco
números inteiros e devolva o maior deles
2. Escreva um procedimento que peça dois
números do usuário e imprima seu produto
3. Escreva uma função que receba cinco valores de salários e devolva sua média
4. Faça um procedimento que receba um
inteiro N (nro de horas), calcule e imprime a conversão de N em minutos e segundos. 99
Exercício de sub-rotinas
Responda usando C / C++
5. Escreva uma função que receba as três
notas de um aluno e calcule e devolva sua média ponderada, considerando os pesos 2, 4 e 6, respectivamente.
6. Escreva um procedimento que imprima os próximos cinco números da progressão
aritmética (2, 7, 12, ....)
Exercício de sub-rotinas
Responda usando C / C++
7. Escrever uma função que receba um escalar X e devolva o seu fatorial.
8. Escreva um procedimento que imprima a série de Fibonacci até o N-ésimo elemento, onde N é recebido como parâmetro (1, 1, 2, 3, 5, 8, 13, 21...)
9. Crie uma função que receba a e b e devolva “𝑏𝑎”, sem usar operadores de
Exercício de sub-rotinas
Responda usando C / C++
10. Escrever uma função que receba X e Y e devolva o MDC entre eles.
11. Escreva uma função que receba um escalar X e devolva 1 se X for PAR e 0 do contrário
12. Escreva uma função que receba um escalar Y e devolva 1 se Y for PRIMO e 0 do
contrário
Bibliografia
ASSENCIO, Ana Fernandes Gomes. Fundamentos da
programação de computadores, 3ª edição, Pearson, 2012.
ASSENCIO, Ana Fernandes
Gomes. Estruturas de Dados, Pearson, 2010.
Referências
ASSENCIO, Ana Fernandes Gomes.
Fundamentos da programação de
computadores, 3ª edição, Pearson, 2012.
ASSENCIO, Ana Fernandes Gomes.
Estruturas de Dados, Pearson, 2010.
FORBELONE, André. Lógica de Programação.
Editora Makron Books, 2000
Projetos Pedagógicos dos Cursos de SIS, CCP e ECP;
Estrutura de Dados e Algoritmos I
Capítulo 2. Modularização
Márcio Palheta, M.Sc.
marcio.palheta@gmail.com