Escolar Documentos
Profissional Documentos
Cultura Documentos
Metodologia da Programação e
Desenvolvimento de Software
Sumário
1
INTRODUÇÃO
Este capítulo introduz a metodologia a ser se- Um dos objetivos fundamentais deste li-
guida para a resolução de problemas com vro é a aprendizagem e o projeto dos algorit-
computadores e com uma linguagem de pro- mos. Este capítulo introduz ao leitor o concei-
gramação como C. to de algoritmo e de programa, bem como as
A resolução de um problema com um com- ferramentas que permitem ao usuário «dialo-
putador se faz pela escrita de um programa, gar» com a máquina: as linguagens de pro-
que exige no mínimo os seguintes passos: gramação.
CONCEITOS-CHAVE
• Algoritmo • Métodos formais
• Ciclo de vida • Pós-condições
• Projeto descendente • Precondições
• Diagrama Nassi Schneiderman • Programação modular
• Diagramas de fluxo • Programação estruturada
• Projeto • Testes
• Domínio do problema • Pseudocódigo
• Fatores de qualidade • Verificação
• Invariantes
2
Metodologia da programação e desenvolvimento de software 3
Características de um algoritmo
• preciso (indica a ordem de realização em cada passo);
• definido (o mesmo resultado é obtido a cada vez que é seguido);
• finito (tem fim; um número determinado de passos).
1
Escreveu um tratado matemático famoso sobre manipulação de números e equações, intitulado Kitab al-jabr w’almugabala. A palavra álgebra é derivada, por sua
semelhança sonora, de al-jabr.
4 Programação em C: Metodologia, algoritmos e estruturas de dados
Um algoritmo deve produzir um resultado em um tempo finito. Os métodos que utilizam algoritmos são deno-
minados métodos algorítmicos e levam esse nome em oposição aos métodos que implicam algum juízo ou interpre-
tação denominados métodos heurísticos. Os métodos algorítmicos podem ser implementados em computadores,
entretanto, os processos heurísticos não foram facilmente convertidos para os computadores. Nos últimos anos, as
técnicas de inteligência artificial tornaram possível a implementação do processo heurístico em computadores.
Exemplos de algoritmos são: instruções para montar em uma bicicleta, fazer uma receita de comida, obter o
máximo divisor comum de dois números etc. Os algoritmos podem ser expressos por fórmulas, diagramas de
fluxo ou N-S e pseudocódigos. Essa última representação é a mais utilizada para seu uso com linguagens estrutu-
radas como C.
Resolução
de um
problema
Para poder identificar e definir bem um problema, é conveniente responder às seguintes perguntas:
• Que entradas são necessárias? (tipo e quantidade de dados com os quais se trabalha).
• Qual é a saída desejada? (tipo e quantidade de dados dos resultados).
• Que método produz a saída desejada?
• Requisitos ou necessidades adicionais e restrições para a solução.
Problema 2.1
Obter uma tabela com as depreciações acumuladas e os valores reais de cada ano de um automóvel comprado
em 1996 por 1.800.000 pesetas, durante os seis anos seguintes, supondo um valor de recuperação ou resgate de
120.000. Desenvolver a análise do problema, conhecendo a fórmula da depreciação anual constante D para cada
ano de vida útil.
nização) e os empregados com mais freqüência são mostrados na Figura 2.2, juntamente com um modelo utiliza-
do para o projeto dos diagramas de fluxo (Figura 2.3). Na Figura 2.4 está representado o diagrama de fluxo que
resolve o Problema 2.1.
Entrada/
Terminal Subprograma
Saída
Decisão Processo
Não
Sim Conectores
O pseudocódigo é uma ferramenta de programação na qual as instruções são escritas em palavras similares
ao inglês ou ao português, que facilitam tanto a escrita como a leitura de programas. Em essência, o pseudocódigo
pode ser definido como uma linguagem de especificações de algoritmos.
Ainda que não existam regras para a escrita do pseudocódigo em português, elegeu-se uma notação-padrão
que será utilizada neste livro e que já é bastante empregada em livros de programação.2
As palavras reservadas básicas serão representadas por letras minúsculas em negrito. Essas palavras são tra-
dução livre de palavras reservadas de linguagens como C, Pascal etc. Mais à frente serão indicados os pseudocó-
digos fundamentais a ser utilizados nesta obra.
2
Para maiores esclarecimentos sobre o pseudocódigo, pode-se consultar, entre outras, algumas dessas obras em espanhol: JOYANES,
Luis. Fundamentos de programación, 2. ed., 1997; Id. Metodologia de la programación, 1986; Id. Problemas de Metodología de la pro-
gramación, 1991 (todas elas publicadas por McGraw-Hill, Madri); bem como CLAVEL; BIONDI. Introducción a la programación. Bar-
celona: Masson, 1987; ou também BRAUNSTEIN; GROIA. Introducción a la programación y a las estructuras de datos. Buenos Aires:
Editorial Eudeba, 1986. Para uma formação prática, pode-se consultar: JOYANES, Luis et al. Fundamentos de programación: Libro de
problemas. Madri: McGraw-Hill, 1998.
Metodologia da programação e desenvolvimento de software 7
Exemplo 2.1
Calcular o pagamento final de um trabalhador conhecendo o número de horas trabalhadas, a taxa horária e a
alíquota de impostos.
Algoritmo
1. Ler Horas, Taxa, alíquota
2. Calcular PagamentoBruto = Horas * Taxa
3. Calcular Impostos = PagamentoBruto * Alíquota
4. Calcular PagamentoFinal = PagamentoBruto — Impostos
5. Visualizar PagamentoBruto, Impostos, PagamentoFinal
Início
Não
Ano < Vida_Útil
Ler
Custo, Vida
Útil, ValorResgate Sim
Acumulada ←
Acumulada + Fim
Ler Ano Depreciação
Exemplo 2.2
Calcular o valor da soma 1+2+3+...+100.
8 Programação em C: Metodologia, algoritmos e estruturas de dados
Algoritmo
Uma variável Contador é utilizada como um contador que gere os sucessivos números inteiros e Soma é utiliza-
da para armazenar as somas parciais 1, 1+2, 1+2+3…
1. Estabelecer Contador a 1
2. Estabelecer Soma a 0
3. enquanto Contador < = 100 fazer
Somar Contador a Soma
Incrementar Contador em 1
fim_enquanto
4. Visualizar Soma
Documentação interna
Como se verá adiante, a documentação de um programa é classificada em interna e externa. A documentação
interna é aquela que é incluída dentro do código do programa fonte por meio de comentários que ajudam na
Metodologia da programação e desenvolvimento de software 9
compreensão do código. Todas as linhas de programas que comecem com um símbolo / * são comentários. O pro-
grama não necessita deles e o computador os ignora. Essas linhas de comentários servem somente para tornar os
programas mais fáceis de compreender. O programador deve ter como objetivo escrever códigos simples e limpos.
Como as máquinas atuais suportam grandes memórias (512 Mb ou 1.024 Mb de memória central mínima em
computadores pessoais), não é necessário recorrer a técnicas de economia de memória, sendo assim é recomendá-
vel que se inclua o maior número de possível de comentários desde que sejam significativos.
a)
c)
Memória
externa
CPU
Programa
editor
Compilador Programa-
objeto
b)
O processo de montagem produz um programa executável. A Figura 2.5 descreve o processo completo de com-
pilação/execução de um programa.
Depois de criado o programa executável, este poderá ser executado (rodado) do sistema operacional, bastando,
para isso, apenas teclar seu nome (no caso de DOS). Supondo que não existam erros durante a execução (chama-
dos erros em tempo de execução), será obtida a saída de resultados do programa.
10 Programação em C: Metodologia, algoritmos e estruturas de dados
As instruções ou ordens para compilar e executar um programa em C podem variar segundo o tipo de compi-
lador. Assim, o processo de Visual C++ é diferente do de C com o UNIX ou o Linux.
entrada, saída, manipulação de dados, controle de outros módulos ou alguma combinação destes. Um módulo
pode transferir temporariamente (bifurcar) o controle para outro módulo, entretanto, cada módulo deve eventual-
mente devolver o controle ao módulo do qual originalmente recebeu o controle.
Os módulos são independentes no sentido que nenhum módulo pode ter acesso direto a qualquer outro módu-
lo, exceto ao módulo ao qual chama e seus próprios submódulos. No entanto, os resultados produzidos por um
módulo podem ser utilizados por qualquer outro módulo quando o controle é transferido para eles.
Raiz
Módulo 21 Módulo 22
Dado que os módulos são independentes, diferentes programadores podem trabalhar simultaneamente em di-
ferentes partes do mesmo programa. Isso reduzirá o tempo de projeto do algoritmo e a posterior codificação do
programa. Além disso, um módulo pode ser radicalmente modificado sem afetar outros módulos, inclusive sem
alterar sua função principal.
A decomposição de um programa em módulos independentes mais simples é conhecida como o método de
«divide e vencerás» (divide and conquer). Cada módulo é projetado com independência dos demais e, seguin-
do um método ascendente ou descendente, se chegará até a decomposição final do problema em módulos de
forma hierárquica.
reduzindo em elevado grau o tempo necessário para escrever, verificar, depurar e manter os programas. A pro-
gramação estruturada utiliza um número limitado de estruturas de controle que minimizam a complexidade dos
programas e, conseqüentemente, reduzem os erros, tornam os programas mais fáceis de escrever, verificar, ler e
manter. Os programas devem estar dotados de uma estrutura.
A programação estruturada é um conjunto de técnicas que incorporam:
• recursos abstratos;
• projeto descendente (top-down);
• estruturas básicas.
O professor Niklaus Wirth — inventor de Pascal, Modula-2 e Oberon — intitulou um dos seus mais famosos
livros, Algoritmos e estruturas de dados, mostrando-nos que só é possível chegar a desenvolver um bom programa
com o projeto de um algoritmo e uma correta estrutura de dados. Essa equação será uma das hipóteses fundamen-
tais consideradas nesta obra.
A resolução de um problema exige o projeto de um algoritmo que resolva o problema proposto.
Projeto Programa
Problema
do algoritmo de computador
Exemplo 2.3
Um cliente faz um pedido para uma fábrica. A fábrica examina em seu banco de dados a ficha do cliente, se
o cliente for solvente, então a empresa aceita o pedido, caso contrário, o pedido é recusado. Redigir o algo-
ritmo correspondente.
Os passos do algoritmo são:
1. Início.
2. Ler o pedido.
3. Examinar a ficha do cliente.
4. Se o cliente for solvente, aceitar o pedido; caso contrário, recusar o pedido.
5. Fim.
Exemplo 2.4
Quer-se projetar um algoritmo para saber se um número é primo ou não.
Um número primo é aquele que só pode ser dividido por si mesmo e pela unidade (tem somente dois divisores:
ele mesmo e a unidade). Por exemplo, 9, 8, 6, 4, 12, 16, 20 etc. não são primos, já que são divisíveis por números
diferentes deles mesmos e da unidade. Assim, 9 é divisível por 3, 8 é divisível por 2 etc. O algoritmo de resolução
do problema passa por dividir sucessivamente o número por 2, 3, 4... etc.
1. Início.
2. Colocar X igual a 2 (X = 2, X variável que representa os divisores do número
N que se busca).
3. Dividir N por X (N/X).
4. Se o resultado de N/X for inteiro, então N não é um número primo e retornar
ao ponto 7; caso contrário continuar o processo.
5. Soma 1 a X (X ← X + 1).
6. Se X for igual a N, então N é um número primo, caso contrário, retornar ao
ponto 3.
7. Fim.
Exemplo 2.5
Realizar a soma de todos os números pares entre 2 e 1.000.
O problema consiste em somar 2 + 4 + 6 + 8 ... + 1.000. Utilizaremos as palavras SOMA e NÚMERO (as
variáveis serão denominadas mais tarde) para representar as somas sucessivas (2+4), (2+4+6), (2+4+6+8) etc.
A solução pode ser escrita com o seguinte algoritmo:
16 Programação em C: Metodologia, algoritmos e estruturas de dados
1. Início.
2. Estabelecer SOMA a 0.
3. Estabelecer NÚMERO a 2.
4. Somar NÚMERO a SOMA. O resultado será o novo valor da soma (SOMA).
5. Incrementar NÚMERO em 2 unidades.
6. Se NÚMERO =< 1.000 retornar ao passo 4, caso contrário, escrever o último
valor de SOMA e terminar o processo.
7. Fim.
Superfície
e comprimento de
circunferência
A decomposição do problema original em subproblemas mais simples e, em seguida, a divisão destes subpro-
blemas em outros ainda mais simples que possam ser implementados para sua solução no computador é chamada
projeto descendente (top-down design). Em geral os passos projetados no primeiro esboço do algoritmo são in-
completos e indicam apenas alguns poucos passos (um máximo de doze aproximadamente). Depois dessa primei-
ra descrição, eles aumentam em uma descrição mais detalhada, com mais passos específicos. Esse processo é
denominado refinamento do algoritmo (stepwise refinement). Para problemas complexos, com freqüência são ne-
cessários diferentes níveis de refinamento, antes que se possa obter um algoritmo claro, preciso e completo.
O problema de cálculo da circunferência e superfície de um círculo pode ser decomposto em subproblemas
mais simples: (1) ler dados de entrada, (2) calcular superfície e comprimento da circunferência e (3) escrever re-
sultados (dados de saída).
Metodologia da programação e desenvolvimento de software 17
Subproblema Refinamento
ler raio ler raio
calcular superfície superfície = 3.141592 * raio ^ 2
calcular circunferência circunferência = 2 * 3.141592 * raio
escrever resultados escrever raio, circunferência, superfície
Projeto
de um
algoritmo
O algoritmo é formado por quatro ações básicas, e cada uma delas deve ser executada antes de realizar a
seguinte. Em termos de computador, cada ação será codificada em uma ou várias sentenças que executam uma
tarefa particular.
18 Programação em C: Metodologia, algoritmos e estruturas de dados
O algoritmo descrito é muito simples, entretanto, como já foi indicado em parágrafos anteriores, o algoritmo
geral será decomposto em passos mais simples em um procedimento denominado refinamento sucessivo já que
cada ação pode ser decomposta em outras ações mais simples. Dessa maneira, por exemplo, um primeiro refina-
mento do algoritmo ir ao cinema pode ser escrito da seguinte forma:
1. início
2. ver a página de cinemas no jornal
3. se não estiver passando “Harry Potter” então
3.1. decidir por outra atividade
3.2. retornar ao passo 7
se_não
3.3. ir ao cinema
fim_se
4. se há fila então
4.1. entrar na fila
4.2. enquanto houver pessoas adiante fazer
4.2.1. avançar na fila
fim_enquanto
fim_se
5. se houver lugar então
5.1. comprar uma entrada
5.2. entrar na sala
5.3. localizar a(s) poltrona(s)
5.4. enquanto projetam o filme fazer
5.4.1. ver o filme
fim_enquanto
5.5. sair do cinema
se_não
5.6. resmungar
fim_se
6. voltar para casa
7. fim
Existem diferentes aspectos a considerar no algoritmo anterior. Em primeiro lugar, certas palavras reservadas
foram deliberadamente escritas em negrito (enquanto, se_não etc.). Essas palavras descrevem as estruturas de
controle fundamentais e os processos de tomada de decisão no algoritmo. Incluem também os conceitos importan-
tes de seleção (expressos por se-então-se_não, if-then-else) e de repetição (expressos com enquanto-fazer
ou, às vezes, repetir-até e iterar-fim_iterar — em inglês, while-do e repeat-until) que se encontram em
quase todos os algoritmos, especialmente os de processo de dados. A capacidade de decisão permite selecionar
alternativas de ações a seguir ou a repetição uma e outra vez de operações básicas.
se passam o filme escolhido ir ao cinema
se_não ver televisão, ir ao futebol ou ler jornal
enquanto houver pessoas na fila, ir avançando repetidamente
até chegar ao guichê
Outro aspecto a considerar é o método escolhido para descrever os algoritmos: emprego de indentação ou jus-
tificativa na escrita de algoritmos. Atualmente, a escrita de um programa é tão importante quanto a sua posterior
leitura. A escrita de um programa é facilitada com a justificativa das ações interiores às estruturas fundamentais
citadas: seletivas e repetitivas. No decorrer de todo este livro, a justificativa dos algoritmos será norma constante.
Para terminar essas considerações iniciais sobre algoritmos, descreveremos as ações necessárias para refinar
o algoritmo objeto do nosso estudo. Para isso, analisemos a ação:
Localizar a(s) poltrona(s).
Se os números dos assentos estiverem impressos na entrada, a ação composta será resolvida com o se-
guinte algoritmo:
Metodologia da programação e desenvolvimento de software 19
Nesse algoritmo, a repetição foi mostrada de duas maneiras, utilizando ambas as notações, repetir...
até_que e enquanto... fim_enquanto. Foi considerado, também, como ocorre normalmente, que o número
do assento e a fila coincidem com o número e fila impressos no bilhete.
2.6.1 Pseudocódigo
O pseudocódigo é uma linguagem de especificação (descrição) de algoritmos. O uso de tal linguagem torna o
passo de codificação final (isto é, a tradução a uma linguagem de programação) relativamente fácil. As linguagens
APL Pascal e Ada são utilizadas, às vezes, como linguagens de especificação de algoritmos.
O pseudocódigo nasceu como uma linguagem semelhante ao inglês e era um meio de representar basicamente
as estruturas de controle de programação estruturada, as quais serão vistas em capítulos posteriores. Considera-se
como um primeiro rascunho, dado que o pseudocódigo tem de ser posteriormente traduzido para uma linguagem
20 Programação em C: Metodologia, algoritmos e estruturas de dados
de programação. O pseudocódigo não pode ser executado por um computador. A vantagem do pseudocódigo é que,
com a sua utilização, no planejamento de um programa, o programador pode se concentrar na lógica e nas estrutu-
ras de controle, não precisando preocupar-se com as regras de uma linguagem específica. Além disso, quando erros
ou anomalias são descobertos na lógica do programa seu pseudocódigo, é fácil de ser modificado, enquanto em
muitas ocasiões costuma ser difícil a alteração na lógica uma vez que está codificada em uma linguagem de progra-
mação. Outra vantagem do pseudocódigo é que pode ser facilmente traduzido para linguagens estruturados como
Pascal, C, FORTRAN 77/90, C++, Java, C# etc.
Para representar as ações, o pseudocódigo original utiliza sucessivas palavras reservadas em inglês — similares
a suas homônimas nas linguagens de programação —, tais como start, end, stop, if-then-else, while-end,
repeat-until etc. A escrita do pseudocódigo exige normalmente a indentação (sangramento na margem esquer-
da) de diferentes linhas.
A representação do diagrama de fluxo em pseudocódigo na Figura 2.11 é a seguinte:
start
//cálculo de imposto e salários
read nome, horas, preço_hora
salário_bruto ← horas * preço_hora
taxas ← 0,25 * salário_bruto
salário_líquido ← salário_bruto - taxas
write nome, salário_bruto, taxas, salário_líquido
end
O algoritmo começa com a palavra start e termina com a palavra end, em inglês (em português, início,
fim). Entre essas palavras, somente se escreve uma instrução ou uma ação por linha.
A linha precedida por // é denominada comentário. É apenas uma informação para o leitor do e não realiza
nenhuma instrução executável, apenas tem efeito como documentação interna do programa. Alguns autores cos-
tumam colchetes ou chaves.
O uso de apóstrofes ou aspas, como são representados os comentários no BASIC, da Microsoft, não é reco-
mendável, uma vez que esse caractere é utilizado para abertura ou fechamento de cadeias de caracteres em lingua-
gens Pascal ou FORTRAN e causariam confusão.
Outro exemplo para esclarecer o uso do pseudocódigo poderia ser um simples algoritmo da partida matinal de
um carro.
início
//partida matinal de um carro
introduzir a chave no contato
puxar o afogador
girar a chave no contacto
pisar no acelerador
ouvir o ruído do motor
pisar novamente no acelerador
esperar uns instantes para que esquente o motor
voltar o afogador para sua posição
fim
Felizmente, ainda que o pseudocódigo tenha nascido como um substituto da linguagem de programação e, por
conseguinte, suas palavras reservadas se conservaram ou ficaram muito semelhantes às palavras do idioma inglês,
o uso do pseudocódigo se estendeu com termos em português como início, fim, parada, ler, escrever, se-
então-se_no, enquanto, fim_enquanto, repetir, até_que etc. Sem dúvida, o uso da terminologia do
pseudocódigo em português facilitou e facilitará consideravelmente a aprendizagem e o uso diário da programação.
Nesta obra, da mesma maneira que em outras de nossas obras, utilizaremos o pseudocódigo em português e dare-
mos nos momentos adequados as estruturas equivalentes em inglês com o objetivo de facilitar a tradução do pseu-
docódigo à linguagem de programação selecionada.
Dessa forma, nos pseudocódigos citados anteriormente, as palavras start, end, read, write deveriam ser
substituídas, respectivamente, por início, fim, ler, escrever.
Metodologia da programação e desenvolvimento de software 21
Principais
Função
símbolos
Terminal (representa o começo, «início», e o final, «fim» de um programa. Pode representar também uma
parada ou interrupção programada que seja necessário desenvolver em um programa.
Entrada/Saída (qualquer tipo de introdução de dados na memória nos periféricos, «entrada», ou registro da
informação processada em um periférico, «saída».
Processo (qualquer tipo de operação que possa originar mudança de valor, formato ou posição da infor-
mação armazenada na memória, operações aritméticas, de transferência etc.).
Decisão (indica operações lógicas ou de comparação entre dados — normalmente, dois — e, em função
dela, o resultado determina qual dos distintos caminhos alternativos do programa deve seguir.
NÃO Em geral, há duas saídas — respostas SIM ou NÃO —, mas pode haver três ou mais,
SIM de acordo com os casos).
Decisão múltipla (em função do resultado da comparação e de acordo com esse resultado se seguirá um
dos diferentes caminhos).
Conector (serve para enlaçar duas partes quaisquer de um organograma por meio de um conector na saí-
da e outro conector na entrada. Trata-se da conexão na mesma página do diagrama.
(Continua)
22 Programação em C: Metodologia, algoritmos e estruturas de dados
(Continuação)
Conector (conexão entre dois pontos do organograma situado em páginas diferentes).
Símbolos
Função
secundários
início
ler nome,
horas,
preço
bruto ←
horas * preço
alíquota ←
0,25 * bruto
líquido ←
bruto – alíquotas
escrever nome,
bruto, alíquotas,
nome
fim
sim
Entrada/ Processo
Saída
Exemplo 2.6
Calcular a média de uma série de números positivos, supondo que os dados sejam lidos de um terminal. Um valor
de zero — como entrada — indicará que o final da série de números positivos foi alcançado.
O primeiro passo a ser dado no desenvolvimento do algoritmo é decompor o problema em uma série de passos
seqüenciais. Para calcular uma média, é necessário somar e contar os valores. Conseqüentemente, nosso algoritmo
na forma descritiva seria:
1. Inicializar contador de números C e variável soma S.
2. Ler um número.
3. Se o número lido for zero :
• calcular a média ;
• imprimir a média ;
• fim do processo.
Se o número lido não for zero :
• calcular a soma ;
• incrementar em um o contador de números ;
• ir para o passo 2.
4. Fim.
O refinamento do algoritmo conduz aos passos sucessivos necessários para realizar as operações de leitura,
verificação do último dado, soma e média dos dados.
Se o primeiro dado lido for 0, a divisão S/C produzirá um erro ao se executar o algoritmo em um computador
já que não é permitida a divisão por zero.
24 Programação em C: Metodologia, algoritmos e estruturas de dados
Diagrama de fluxo
ler dado
Fim
não
dado <> 0
sim
C C+1
S S + dado
Codificação em C
long dado;
int C;
double Média, S;
C = 0;
S = 0;
puts(“Dados numéricos; para
finalizar se introduz 0.”);
do {
scanf(“%ld”, &dado);
if (dado != 0)
{
C = C + 1;
S = S + dado;
}
} while (dado != 0);
/* Calcula a média e se
escreve */
if (C > 0)
{
Média = S/C;
printf(“\nMédia = %.2lf”,
Média);
}
Metodologia da programação e desenvolvimento de software 25
Exemplo 2.7
Soma dos números pares compreendidos entre 2 e 100.
Início
int número, soma;
soma = 2;
SOMA 2
NÚMERO 4
número = 4;
sim
NÚMERO = < 100
não
escrever
SOMA
Fim
Exemplo 2.8
Desenvolver o algoritmo que resolva o seguinte problema: cálculo dos salários mensais dos funcionários de uma
empresa, sabendo que esses salários são calculados com base nas horas semanais trabalhadas e de acordo com
um preço especificado por horas. Se as quarenta horas semanais são ultrapassadas, as horas
extraordinárias serão pagas na razão de 1,5 vez a hora ordinária.
Os cálculos são:
1. Ler dados do arquivo da empresa até que se encontre a ficha final do arquivo
(HORAS, PREÇO_HORA, NOME).
2. Se HORAS <= 40, então SALÁRIO é o produto de horas por PREÇO_HORA.
3. Se HORAS > 40, então SALÁRIO é a soma de 40 vezes PREÇO_HORA mais 1,5 vez
PREÇO_HORA por (HORAS-40).
26 Programação em C: Metodologia, algoritmos e estruturas de dados
Início
do {
printf(“Nome: “);
gets(nome);
sim não
HORAS < = 40 printf(“Horas trabalhadas: “);
scanf(“%f”, &horas);
printf(“Preço hora: “);
scanf(“%f%*c”, &preçoHora);
if (horas <= 40.0)
SALÁRIO = SALÁRIO = salário = horas * preçoHora;
HORAS* 40* PREÇO_HORA + else
PREÇO_HORA 1,5* PREÇO_HORA salário = 40 * preçoHora +
(HORAS–40) 1.5 * (horas — 40.0) *
preçoHora;
printf(“Salário de %s %.1f\n”,
nome, salário);
printf(“\nMais trabalhadores (S/N): “);
scanf(“%c%*c”, &maisDados);
sim
mais dados
não
Fim
Metodologia da programação e desenvolvimento de software 27
Início
printf(“Salário de %s %.1f\n”,
Escrever
SALÁRIO nombre, salário);
Exemplo 2.9
A escrita de algoritmos para realizar operações simples de contagem é uma das primeiras coisas que um progra-
mador pode aprender.
Suponhamos que se proporcione uma seqüência de números, tais como
5 3 0 2 4 4 0 0 2 3 6 0 2
e se deseje contar e imprimir o número de zeros da seqüência.
O algoritmo é muito simples, já que basta somente ler os números da esquerda para a direita, enquanto se
contam os zeros. Utiliza como variável a palavra NÚMERO para os números que são examinados e TOTAL para o
número de zeros encontrados. Os passos a seguir são:
1. Estabelecer TOTAL em zero.
2. Restam mais números para examinar?
3. Se não restam números, imprimir o valor de TOTAL e fim.
28 Programação em C: Metodologia, algoritmos e estruturas de dados
Início
não
NÚMERO = 0
sim
TOTAL
TOTAL + 1
Fim
Exemplo 2.10
Dados três números, determinar se a soma de qualquer par deles é igual ao terceiro número. Se a condição for
cumprida, escrever «Iguais», caso contrário, escrever «Diferentes».
No caso de os números serem: 3 9 6
Metodologia da programação e desenvolvimento de software 29
Início
int a, b, c;
if ((a + b) == c)
printf(“\nIguais, %d + %d = %d”, a, b, c);
sim else if ((a + c) == b)
A+B=C
printf(“\nIguais, %d + %d = %d”, a, c, b);
else if ((b + c) == a)
não printf(“\nIguais, %d + %d = %d”, b, c, a);
sim
A+C=B
não
sim
B+C=A
não
escrever escrever
“diferentes” “iguais”
Fim
Um algoritmo é representado por um retângulo no qual cada face é uma ação a realizar:
ler
nome, horas, preço
calcular
salário ← horas * preço
calcular
líquido ← salário – impostos
escrever
nome, salário, impostos, líquido
nome do algoritmo
<ação 1>
<ação 2>
<ação 3>
...
fim
a) b)
sim não condição?
condição?
sim não
ação 1 ação 2
<ações> <ações>
Figura 2.15 Estrutura condicional ou seletiva: (a) diagrama de fluxo: (b) diagrama N-S.
Metodologia da programação e desenvolvimento de software 31
Exemplo 2.11
Calcular o salário líquido semanal de um trabalhador em função do número de horas trabalhadas e da alíquota
de impostos:
• as primeiras 35 horas são pagas a tarifa normal;
• as horas que ultrapassem 35 são pagas a 1,5 vez a tarifa normal
• as alíquotas de impostos são:
a) as primeiras 60.000 pesetas são livres de impostos;
b) as 40.000 pesetas seguinte têm 25% de impostos;
c) as demais têm 45% de impostos;
• a tarifa horária é de 800 pesetas.
Também é necessário escrever o nome, salário bruto, alíquotas e salário líquido (esse exemplo será deixado
como exercício para o aluno).
ANÁLISE
PROJETO
IMPLEMENTAÇÃO
DEPURAÇÃO
MANUTENÇÃO
3
CARRANO et al. Data structures and problem solving with Turbo Pascal. The Benjaming/Cummings Publishing, 1993, p. 210.
32 Programação em C: Metodologia, algoritmos e estruturas de dados
quando depois do sistema implementado e depurado, apareçam erros que necessitem ser corrigidos e depurados e
que requeiram a repetição de etapas anteriores.
A Figura 2.16 mostra o ciclo de vida do software e a disposição típica de suas diferentes etapas no sistema
conhecido como ciclo de vida em cascata, que supõe que a saída de cada etapa seja a entrada da etapa seguinte.
2.7.1 Análise
A primeira etapa na produção de um sistema de software é decidir exatamente o que se supõe que o sistema deva
fazer. Essa etapa também é conhecida como análise de requisitos ou de especificações e, por essa razão, muitos
tratadistas costumam subdividi-la em outras duas etapas:
• Análise e definição do problema.
• Especificação de requisitos.
A parte mais difícil na criação de um sistema de software é definir qual é o problema e em seguida especifi-
car o que é necessário para resolvê-lo. Normalmente a definição do problema começa com a análise dos requisi-
tos feitos pelo usuário, mas, com freqüência, esses requisitos costumam ser imprecisos e difíceis de descrever.
Todos os aspectos do programa devem ser especificados, porém, habitualmente, as pessoas que descrevem o pro-
blema não são programadores e isso torna imprecisa a definição. A fase de especificação, em geral, requer uma
comunicação entre os programadores e os futuros usuários do sistema e a iteração da especificação até que tanto
o especificador quanto os usuários estejam satisfeitos com as especificações e que todos os problemas tenham sido
normalmente resolvidos.
Na etapa de especificações pode ser muito útil para melhorar a comunicação entre as diferentes partes impli-
cadas na construção de um protótipo ou modelo simples do sistema final, isto é, escrever um programa protótipo
que simule o comportamento das partes do produto software desejado. Por exemplo, um programa simples — in-
clusive, ineficiente — pode demonstrar ao usuário a interface proposta pelo analista. É melhor descobrir qualquer
dificuldade ou mudar sua idéia original agora que depois que a programação se encontre em estado avançado ou,
inclusive, já esteja terminada. A modelagem de dados é uma ferramenta muito importante na etapa de definição
do problema. Essa ferramenta é muito utilizada no projeto e construção de bases de dados.
Lembre que o usuário final, como regra, não conhece exatamente o que deseja que o sistema faça, portanto, o
analista de software ou programador, de acordo com o caso, deve interagir com o usuário para descobrir o que ele
quer que o sistema faça. Nessa etapa, é importante responder a perguntas tais como:
Quais são os dados de entrada?
Que dados são válidos e que dados são inválidos?
Quem utilizará o sistema: especialistas qualificados ou quaisquer usuários (sem formação)?
Que interfaces de usuário serão utilizadas?
Quais mensagens de erro e de detecção de erro são desejadas? Como o sistema deverá atuar quando o usuário
cometer um erro na entrada?
Que hipóteses são possíveis?
Existem casos especiais?
Qual deve ser o formato de saída?
Que documentação é necessária?
Que melhorias serão introduzidas — provavelmente — no programa (no futuro)?
Qual deve ser a rapidez do sistema?
A cada quanto tempo, depois de pronto, o sistema deverá ser alterado?
O resultado final da fase de análise é uma especificação dos requisitos do software.
2.7.2 Projeto
A especificação de um sistema indica o que o sistema deve fazer. A etapa de projeto do sistema indica como de-
verá fazer. Para um sistema pequeno a etapa de projeto pode ser tão simples como escrever um algoritmo em
pseudocódigo, já para um sistema grande essa etapa inclui também a fase de projeto de algoritmos (que inclui o
projeto e a interação de um número diferente de algoritmos), com freqüência apenas esboçados, bem como uma
estratégia para satisfazer todos os detalhes e produzir o código correspondente.
É preciso determinar se programas ou subprogramas já existentes podem ser utilizados ou se será necessário
construí-lo totalmente. O projeto deverá ser dividido em módulos utilizando os princípios de projeto descendente
e em seguida deve-se indicar a interação entre módulos. Um diagrama de estruturas proporciona um esquema cla-
ro destas relações.4
Neste ponto, é importante especificar claramente não só o propósito de cada módulo como também o fluxo de
dados entre os módulos. Por exemplo, deve-se responder às seguintes perguntas: quais dados estão disponíveis
para o módulo antes de sua execução? O que o módulo supõe? O que fazem os dados depois de executado o mó-
dulo? Conseqüentemente, as hipóteses, a entrada e a saída para cada módulo devem ser especificadas em detalhes.
Um meio para desenvolver essas especificações é escrever uma precondição, ou seja, uma descrição das condições
que devem ser satisfeitas no início do módulo e uma pós-condição que é uma descrição das condições que devem
ser encontradas no final de um módulo. Por exemplo, é possível descrever um subprograma que ordena uma lista
(um array) da seguinte forma:
subprograma ordenar (A, n)
{Ordena uma lista em ordem ascendente}
precondição: A é um array de n inteiros, 1<= n <= Máx.
pós-condição: A[1] <= A[2] <...<= A[n], n é inalterável}
Por último, pode-se utilizar pseudocódigo5 para especificar os detalhes do algoritmo. É importante que se
empregue bastante tempo na fase de projeto de seus programas. O resultado final do projeto descendente é uma
solução que seja fácil de transformar em estruturas de controle e estruturas de dados de uma linguagem de pro-
gramação específica — em nosso caso, C.
O tempo gasto na fase de projeto se traduzirá em economia de tempo na escrita e depuração do seu
programa.
4
Para conhecer mais sobre o tema de diagramas de estruturas, consulte estas obras: JOYANES, Luis. Fundamentos de programación. 3. ed.
McGraw-Hill, 1992; Id. Problemas de metodología de la programación. McGraw-Hill, 1992 ou também a obra de JOYANES et al. Pascal
y Turbo Pascal. Un enfoque práctico. McGraw-Hill, 1995.
5
Para consultar o tema pseudocódigo, consulte as obras: JOYANES, Luis. Fundamentos de programación. Algoritmos y estructuras de da-
tos, 2. ed. McGraw-Hill, 2003; e JOYANES et al. Fundamentos de programación. Libro de problemas, McGraw-Hill, 1996.
34 Programação em C: Metodologia, algoritmos e estruturas de dados
2.7.5 Verificação
A etapa de testes na fase de projeto deve começar tão logo seja possível e deve continuar durante a a implemen-
tação do sistema. Ainda que os testes sejam ferramentas extremamente válidas para proporcionar a evidência de
que um programa está correto e satisfaz suas especificações, é difícil saber se os testes realizadas são suficientes.
Por exemplo, como é possível saber se os conjuntos de dados de teste são suficientes ou ainda se executaram todos
os caminhos possíveis por meio do programa?
Por essas razões um segundo método foi desenvolvido para demonstrar a correção e a exatidão de um progra-
ma. Esse método, denominado verificação formal, implica a construção de testes matemáticas que ajudam a de-
terminar se os programas fazem o que se propõem a fazer. A verificação formal implica a aplicação de regras
formais para mostrar que um programa satisfaz sua especificação. A verificação formal funciona bem em progra-
mas pequenos, mas torna-se complexa quando utilizada em programas grandes. A teoria da verificação pressupõe
conhecimentos matemáticos avançados o que está fora dos objetivos deste livro, por essa razão, somente consta-
tamos a importância dessa etapa.
Provar que um algoritmo está correto é como testar um teorema matemático. Por exemplo, provar que um
módulo é exato (está correto) começa com as precondições (axiomas e hipóteses em matemática) e mostra que as
etapas do algoritmo conduzem às pós-condições. A verificação trata de testar com meios matemáticos que os al-
goritmos estão corretos.
Quando um erro é descoberto durante o processo de verificação seu algoritmo deve ser corrigido e possivelmen-
te as especificações do problema devem ser modificadas. Um método para isso é utilizar invariáveis (condições sem-
pre verdadeiras em um ponto específico de um algoritmo), o que provavelmente fará que seu algoritmo contenha
poucos erros antes do início da codificação. Como resultado, será gasto menos tempo na depuração do programa.
2.7.6 Manutenção
Quando o produto software (o programa) estiver terminado, este será distribuído entre os possíveis usuários, ins-
talado nos computadores e utilizado (produção). Entretanto, e ainda que a priori o programa funcione corretamen-
te, o software deve ser mantido e atualizado. De fato, custo típico de manutenção excede o custo de produção do
sistema original.
Metodologia da programação e desenvolvimento de software 35
Um sistema de software produzirá erros que serão detectados pelos usuários do sistema que não foram desco-
bertos na fase de teste. A correção desses erros faz parte da manutenção do software. Outro aspecto importante da
fase de manutenção é a melhoria do software, acrescentando mais características ou modificando partes existentes
que se adaptem da melhor maneira possível aos usuários.
Outras causas que obrigarão à revisão do sistema de software na etapa de manutenção são as seguintes:
1) quando um novo hardware é introduzido, o sistema pode ser modificado para executá-lo em um novo am-
biente; 2) quando mudam as necessidades dos usuários, costuma ser mais rápido e mais barato modificar o
sistema existente que produzir um sistema totalmente novo. A maior parte do tempo dos programadores é
gasta em manutenção dos sistemas existentes e não com projeto de sistemas totalmente novos. Por essa razão,
entre outras, há sempre que se projetar programas de modo que estes sejam fáceis de compreender e entender
(legíveis) e também fáceis de mudar.
Manutenção Especificações
Evolução Projeto
Produção Verificação
Testes Codificação
Figura 2.17 Etapas do ciclo de vida do software cujo núcleo aglutinador é a documentação.
36 Programação em C: Metodologia, algoritmos e estruturas de dados
Eficiência
A eficiência de um software é sua capacidade para fazer um bom uso dos recursos que manipula.
Transportabilidade (portabilidade)
A transportabilidade ou portabilidade é a facilidade com a qual um software pode ser transportado em diferentes
sistemas físicos ou lógicos.
Verificabilidade
A verificabilidade — facilidade de verificação de um software — é sua capacidade para suportar os procedimentos
de validação e de aceitar conjuntos de teste ou ensaio de programas.
Integridade
A integridade e a capacidade de um software de proteger seus próprios componentes contra os processos que não
tenham o direito de acessar.
Fácil de utilizar
Um software é fácil de utilizar se pode comunicar com o usuário de maneira cômoda.
Correção (exatidão)
Capacidade dos produtos software de realizar exatamente as tarefas definidas por sua especificação.
Robustez
Capacidade dos produtos software de funcionar, inclusive em situações anormais.
Extensibilidade
Facilidade que os produtos têm de se adaptar a mudanças em sua especificação. Existem dois princípios funda-
mentais para conseguir essa característica:
• projeto simples;
• descentralização.
Reutilização
Capacidade dos produtos de ser reutilizados, em sua totalidade ou em parte, em novas aplicações.
Compatibilidade
Facilidade dos produtos para ser combinados com outros.
2.8.1 Asserções6
Uma parte importante de uma verificação formal é a documentação de um programa por meio de asserções ou
afirmações — sentenças lógicas acerca do programa que são declaradas «verdadeiras». Uma asserção é escrita
como um comentário e descreve o que se supõe ser verdadeiro sobre as variáveis do programa nesse ponto.
Uma asserção é uma frase sobre uma condição específica em certo ponto de um algoritmo ou programa.
Exemplo 2.12
O fragmento de programa a seguir contém uma seqüência de sentenças de atribuição seguidas por uma asserção.
A = 10; { asserção: A é 10 }
X = A; { asserção: X é 10 }
Y = X + A; { asserção: Y é 20 }
A verdade da primeira afirmação {A é 10} segue a execução da primeira sentença com o conhecimento de
que 10 é uma constante. A verdade da segunda afirmação {X é 10} vem da execução de X = A com o conhe-
cimento de que A é 10. A verdade da terceira afirmação {Y é 20} vem da execução Y = X + A com o
conhecimento de que X é 10 e A é 10. Nesse segmento do programa, afirmações são utilizadas como comentá-
rios para documentar a mudança em uma variável do programa depois de executada cada sentença de afirmação.
A tarefa de utilizar verificação formal serve para testar que um segmento de programa satisfaz sua especifica-
ção. A afirmação final é chamada pós-condição (nesse caso, {Y é 20}) e segue a presunção inicial ou precondi-
ção (nesse caso, {10 é uma constante}), depois de executado o segmento do programa.
Exemplo 2.13
Precondições e pós-condições do subprograma LerInteiros.
6
Este termo também costuma ser traduzido como afirmações ou declarações. O termo asserção está difundido na linguagem de informática.
38 Programação em C: Metodologia, algoritmos e estruturas de dados
A precondição indica que os parâmetros de entrada Mín e Máx são definidos antes do início da execução do
procedimento. A pós-condição indica que a execução do procedimento atribui o primeiro dado entre Mín e Máx
para o parâmetro de saída sempre que Mín <= Máx for verdadeiro.
As precondições e as pós-condições são mais que um método para resumir ações de um procedimento. A declara-
ção dessas condições deve ser sempre a primeira etapa no projeto e escrita de um procedimento. Ao escrever algoritmos
de procedimentos, é conveniente que se escreva o cabeçalho do procedimento que mostra os parâmetros afetados pelo
procedimento, bem como alguns comentários de cabeçalho que contenham as precondições e as pós-condições.
Precondição: Predicado lógico que deve ser cumprido ao começar a execução de uma operação.
Pós-condição: Predicado lógico que deve ser cumprido ao terminar a execução de uma operação desde
que a precondição correspondente tenha sido cumprida.
Exemplo 2.14
O procedimento OrdenarSeleção (A, m, n) ordena os elementos do array A[m..n] em ordem descendente.
O modelo correspondente pode ser escrito assim:
{m n} {precondição: A tem de ter pelo menos 1 elemento}
OrdenarSeleção (A,m,n) {programa de ordenação a executar}
{A[m] A[m+1] ... A[n]} {pós-condição: elementos de A em ordem
descendente}
Problema 2.2
Encontrar a posição do maior elemento de uma lista com indicação de precondições e pós-condições.
int EncontrarMax (int* A,int m,int n)
{
/* precondição : m < n
pós-condição: devolve posição elemento maior em A[m..n] */
int i, j;
i = m;
j = n; {asserção}
/* (i = m)^(j = m)^(m < n) */ {^, operador and}
do {
i = i + 1;
if (A[i] > A[j])
j = i;
}while (i<n);
return j; /*devolve j como maior elemento*/
}
Metodologia da programação e desenvolvimento de software 39
Exemplo 2.15
Um laço que calcula a soma dos n primeiros elementos do array (lista) A:
{calcular a soma de A[0], A[2],...A[n]}
{asserção n >= 14}
Soma = 0;
j = 0;
while (j <= n)
{
Soma = Soma + A[j];
j = j+1;
}
Antes de que esse laço comece a execução, Soma é 0 e j é 0. Depois de o laço ter sido executado uma vez,
Soma é A[0] e j é 1.
A invariante do laço Soma é a soma dos elementos A[0]a A[j+0]
Uma invariante é um predicado que cumpre tanto antes quanto depois de cada iteração (volta) e que
descreve a missão do laço.
Exemplo 2.16
Se a invariante de um laço é:
{invariante : i <= n e Soma é a soma de todos os números lidos do teclado}
Pode-se deduzir que:
Soma = 0.0; {iniciação}
i = 0;
i < n {condição/prova do laço}
scanf(“%d”,&Item);
Soma = Soma + Item; {corpo do laço}
i = i + 1;
Com todas essas informações, escrever o laço de soma torna-se uma tarefa fácil
Soma = 0.0;
i = 0;
while (i < n) /*i, recebe os valores 0,1,2,3,..n-1*/
{
scanf(“%d”,&Item);
Soma = Soma + Item;
i = i + 1;
}
40 Programação em C: Metodologia, algoritmos e estruturas de dados
Exemplo 2.17
Também é possível declarar invariantes nos laços for, mas deve-se ter presente a particularidade desta sentença:
a variável de controle do laço é indefinida depois que sai do laço, razão pela qual para, definir sua invariante,
é necessário considerar que a mencionada variável de controle seja incrementada antes de sair do laço e que
mantenha seu valor final.
/*precondição n >= 1*/
Soma = 0;
for (i=1; i<=n; i=i+1)
{ /*invariante : i <= n+1 e Soma é 1+2+...i-1*/
Soma = Soma + i;
}
/*pós-condição: Soma é 1+2+3+..n-1+n*/
Problema 2.3
Escrever um laço controlado por sentinela que calcule o produto de um conjunto de dados.
/*Calcular o produto de uma série de dados*/
/*precondição : sentinela é constante*/
Produto = 1;
printf(“Para terminar, introduza %d”, Sentinela);
puts(“Introduza número:”);
scanf(“%d”,&Número);
while (Número != Sentinela)
{ /*invariante: Produto é o produto de todos os valores
lidos em Número e nenhum é o Sentinela*/
Produto = Produto * Número;
puts(“Introduza número seguinte:”); scanf(“%d”,&Número);
}
/*pós-condição: Produto é o produto de todos os números lidos em
Número antes do sentinela*/
7
CARRASCO et al., 1993, op. cit., p. 15.
Metodologia da programação e desenvolvimento de software 41
2. Uma execução de laço deve manter a invariante. Se a invariante for verdadeira antes de qualquer ite-
ração do laço, deve-se demonstrar que também é verdadeira depois da iteração. No exemplo, o laço
acrescenta A[j] a Soma e em seguida incrementa j em 1. Por conseguinte, depois de uma execução do
laço, o elemento acrescentado mais recentemente a Soma é A[j—1]; ou seja, a invariante que é verdadei-
ra depois da iteração.
3. A invariante deve capturar a exatidão de algoritmo, isto é, deve demonstrar que se a invariante for
verdadeira quando terminar o laço, então o algoritmo está correto. Quando o laço do exemplo termina, j
contém n e a invariante é verdadeira: Soma contém a soma dos elementos A[0] a A[j—1], que é a soma
que se quer calcular.
4. O laço deve terminar, isto é, deve-se demonstrar que o laço termina depois de um número finito de ite-
rações. No exemplo, j começa em 0 e em seguida se incrementa em 1 em cada execução do laço. Por
conseguinte, j eventualmente excederá a n independente do valor de n. Esse fato e a característica funda-
mental de while garantem que o laço terminará.
A identificação de invariantes de laços ajuda a escrever laços corretos. A invariante é representada como
um comentário que precede cada laço. No exemplo anterior
{Invariante: 0 <= j < N e Soma = A[0]+...+A[j-1]}
while (j <= n—1)
2.9 RESUMO
Um método geral para a resolução de um problema com descendentes e refinamento sucessivo, chegar a módulos
computador tem as seguintes fases: facilmente codificáveis. Esses módulos devem ser codificados
1. Análise do programa. com as estruturas de controle de programação estruturada.
2. Projeto do algoritmo. 1. Seqüenciais: as instruções são executadas uma depois
3. Codificação. da outra.
4. Compilação e execução. 2. Repetitivas: uma série de instruções são repetidas até
5. Verificação e depuração. que se cumpra certa condição.
6. Documentação e manutenção. 3. Seletivas: permite escolher entre duas alternativas
O sistema mais seguro para resolver um problema é de- (dois conjuntos de instruções), dependendo de uma
compô-lo em módulos mais simples e, por meio de projeto condição determinada.
2.10 EXERCÍCIOS
2.1. Projetar uma solução para resolver cada um dos se- corredor e o algoritmo deve imprimir o tempo em
guintes problemas e tratar de refinar suas soluções minutos e segundos bem como a velocidade média.
por meio dos algoritmos adequados: Exemplo de entrada de dados: (3,53) (3,40) (3,46)
a) Realizar uma chamada telefônica de um telefone (3,52) (4,0) (0,0); o último par de dados será utiliza-
público. do, como fim da entrada de dados.
b) Cozinhar uma omelete.
c) Consertar um furo em uma bicicleta. 2.9. Projetar um algoritmo para determinar se um número
d) Fritar um ovo. N é primo. (Um número primo somente pode ser di-
visível por ele mesmo e pela unidade).
2.2. Escrever um algoritmo para:
a) Somar dois números inteiros. 2.10. Escrever um algoritmo que calcule a superfície de um
b) Diminuir dois números inteiros. triângulo em função da base e da altura (S = 1/2 Base
c) Multiplicar dois números inteiros. Altura).
d) Dividir um número inteiro por outro.
2.11. Calcular e visualizar o comprimento da circunferên-
2.3. Escrever um algoritmo para determinar o máximo cia e a área de um círculo de raio dado.
divisor comum de dois números inteiros (MDC) pelo
2.12. Escrever um algoritmo que encontre o salário sema-
algoritmo de Euclides:
nal de um trabalhador, dada a taxa horária e o núme-
• Dividir o maior dos dois inteiros positivos pelo ro de horas trabalhadas diariamente.
menor deles.
• Em seguida dividir o divisor pelo resto. 2.13. Escrever um algoritmo que indique se uma palavra
• Continuar o processo de dividir o último divisor lida do teclado é um palíndromo. Um palíndromo é
pelo último resto até que a divisão seja exata. uma palavra que se lê igual em ambos os sentidos
• O último divisor é o mdc. como «radar».
2.4. Projetar um algoritmo que leia e imprima uma série 2.14. Escrever um algoritmo que conte o número de ocor-
de números diferentes de zero. O algoritmo deve ter- rências de cada letra em uma palavra lida como en-
minar com um valor zero que não deve ser impresso. trada. Por exemplo, «Mortimer» contém dois «m»,
Visualizar o número de valores lidos. um «o», dois «r», um «i», um «t» e um «e».
2.5. Projetar um algoritmo que imprima e some a série de 2.15. Muitos bancos calculam diariamente os juros das
números 3, 6, 9, 12…, 99. quantidades depositadas pelos clientes com base nas
seguintes premissas. Um capital de 1.000 euros com
2.6. Escrever um algoritmo que leia quatro números e em uma taxa de juros de 6% rende em um dia 0,06 mul-
seguida imprima o maior dos quatro. tiplicado por 1.000 e dividido por 365. Essa operação
produzirá 0,16 euros de juros e o capital acumulado
2.7. Projetar um algoritmo que leia três números e descu- será 1.000,16. Os juros para o segundo dia serão
bra se um deles é a soma dos outros dois. calculados multiplicando-se 0,06 por 1.000 e divi-
dindo-se o resultado por 365. Projetar um algoritmo
2.8. Projetar um algoritmo para calcular a velocidade (em que receba três entradas: o capital a ser depositado,
m/s) dos corredores da corrida de 1.500 metros. A a taxa de juros e a duração do depósito em semanas
entrada consistirá em pares de números (minutos, e calcule o capital total acumulado no final do perío-
segundos) que dão o tempo do corredor; para cada do de tempo especificado.
Metodologia da programação e desenvolvimento de software 43
Análise do problema
2.9 Desenvolver um algoritmo que calcule e visualize as
DADOS DE SAÍDA: s (superfície). potências de 2 entre 0 e 10.
Para calcular a superfície se aplica a fórmula Deve-se implementar um laço que seja executado onze ve-
zes e dentro dele ir incrementando uma variável que assuma
S = base * altura / 2. valores entre 0 e 10. Essa variável será chamada num. Den-
tro do laço também será visualizado o resultado da opera-
Projeto do algoritmo ção 2 ^ num.
início
Projeto do algoritmo
ler (b, a)
s = b * a / 2 TABELA DE VARIÁVEIS
escrever (s) inteiro: num
fim
Início
2.8 Desenvolver um algoritmo que calcule a soma dos
inteiros entre 1 e 10, ou seja, 1+2+3+...+10. núm 0
Análise do problema
escrever
DADOS DE SAÍDA: Soma (contém a soma reque- 2 ^ núm
rida
DADOS AUXILIARES: num (será uma variável que núm núm + 1
assumirá valores entre 1 e 10
e se acumulará em soma).
não
núm > 10
Deve-se executar um laço que se realize 10 vezes.
Nele, a variável num vai sendo incrementada em 1 e seu sim
valor será acumulado na variável soma. Depois de sair do Fim
laço se visualizará o valor da variável soma.
2.11 Definir o algoritmo necessário para intercambiar os valores de duas variáveis numéricas.
Análise do problema
Para desenvolver essa análise, utiliza-se uma variável denominada auxiliar que,
de modo temporal, assuma um dos valores dados. Início
Variáveis: A B AUX
O método consiste em atribuir uma das variáveis para a variável auxiliar:
AUX ← A ler A, B
Em seguida, atribui-se o valor da outra variável B para a primeira:
A ← B
AUX ← A
Por último, atribui-se o valor da variável auxiliar para a segunda variável A: A←B
B ← AUX B ← AUX
Variáveis: A primeiro valor
B segundo valor
AUX variável auxiliar escrever
A, B
Projeto do algoritmo
início
ler(A, B)
Fim
AX ← A
A ← B
B ← AUX
escrever(A, B)
fim