Escolar Documentos
Profissional Documentos
Cultura Documentos
ENSINO A
DISTÂNCIA
Copyright © 2020 by Editora Faculdade Avantis.
Direitos de publicação reservados à Editora Faculdade
Avantis e ao Centro Universitário Avantis – UNIAVAN.
Av. Marginal Leste, 3600, Bloco 1.
88339-125 – Balneário Camboriú – SC.
editora@avantis.edu.br
EMENTA
OBJETIVOS DA DISCIPLINA
Prezado(a) aluno(a),
APRESENTAÇÃO DO AUTOR
Curriculum Lattes:
http://buscatextual.cnpq.br/buscatextual/visualizacv.do?id=K4705963J5
SUMÁRIO
CONCEITOS INICIAIS
DE PROJETO DE
ALGORITMOS
1 INTRODUÇÃO À UNIDADE
12
ALGORITMOS I
de comunicação do futuro.
Para fazermos isso, é necessário entender o que é um algoritmo e suas formas de
representação. O algoritmo dará origem ao programa que todos desejam, mas ele também
tem regras e estrutura própria a serem seguidas no seu projeto.
No encerramento da primeira unidade, veremos como os dados são tratados
nos algoritmos e, por consequência, nos programas. Estes dados são envolvidos em
expressões aritméticas e lógicas, as quais possuem regras de formação, bem como para
sua análise/solução.
Os principais objetivos de aprendizagem desta unidade são:
• compreender os conceitos fundamentais da lógica na solução de problemas;
• conhecer as técnicas de estruturação do pensamento lógico e sua formalização
enquanto algoritmos;
• identificar operadores e operandos envolvidos na construção de algoritmos e sua
aplicação na solução de problemas;
• conhecer e utilizar ferramentas básicas de projeto de software.
É bastante comum pensarmos, pelo menos para quem conhece o conceito, que
algoritmo é algo ligado à programação. Na verdade, este conceito é bem mais amplo, e
utilizado de forma inconsciente, do que pensamos. Por exemplo, você já viu uma receita
na cozinha? Ou então, algumas instruções que lhe permitem montar alguma coisa? Pois
é, também são algoritmos. Então, podemos entender, inicialmente, que um algoritmo é
uma sequência de passos que nos levam à solução de um problema.
Por outro lado, o que desejamos é automatizar este processo. Assim, ao descrevermos
as ações que nos levam à solução do problema, devemos sempre pensar de forma
repetitiva, ou seja, que o mesmo possa ser repetido tantas vezes quanto for necessário e,
de forma fundamental, com o mesmo resultado final.
Ainda sobre isso, devemos sempre pensar que estamos transmitindo instruções a
uma máquina, ou seja, um equipamento que não tem capacidade de pensamento e de
raciocínio e, portanto, precisa ser “ensinado” de forma muito objetiva, direta e sem
nenhuma margem para dúvida na execução daquela ação.
13
ALGORITMOS I
1.2 LÓGICA
Observe a premissa 3 logo acima. Nela, fizemos uma inferência (conclusão) sobre duas
outras premissas anteriores que fundamentam (dão base) esta conclusão.
EXERCÍCIO
Considere as seguintes premissas:
1. Rodrigo está inscrito no curso de preparação de motorista de uma
autoescola;
2. Para ser aprovado ele precisa ter 100% de frequência nas aulas teórico-práticas e ter
nota mínima de 80% nos testes;
3. Rodrigo compareceu em todas as aulas e obteve 90% de aproveitamento nos testes.
Então, o que podemos concluir sobre o Rodrigo neste curso?
14
ALGORITMOS I
Assim, entendemos que a lógica de programação é a capacidade que o programador
deve desenvolver para solucionar os problemas que lhe são apresentados. Esta capacidade
implica analisar cuidadosamente cada problema e/ou situação e propor um método
formal que, quando aplicado, conduza à solução correta para o problema.
Eventualmente, caso a dimensão do problema exija, ele ainda pode ser dividido em
partes menores que, ao serem solucionadas individualmente, comporão a solução do
problema integral. Se esse for o caso, a lógica de programação proposta deve, também,
indicar como estas soluções individuais serão combinadas ou agrupadas para formar a
solução total.
Vamos analisar o seguinte problema: dados três valores reais (que pertencem ao
conjunto dos números reais) quaisquer, sua tarefa é determinar se esses valores podem
ser usados para formar um triângulo (serão os possíveis tamanhos dos lados). Como você
poderia fazer para deduzir um caminho que o permitisse determinar se dá ou não para
formar esse triângulo?
Uma solução seria recortar três pedaços de algum material, madeira por exemplo,
com dimensões escolhidas para teste, e experimentar a construção da forma geométrica,
permitindo determinar se aquelas medidas formam ou não um triângulo, mas não
possibilita, pelo menos inicialmente, saber qual seria uma regra geral para resolvermos
o problema.
Por outro lado, ao tomarmos esses pedaços recortados, talvez venhamos a perceber
que, se colocarmos o maior deles sobre a mesa, os outros dois somente formarão um
triângulo caso “fiquem inclinados”, ou seja, que os dois juntos tenham dimensão maior
que o outro lado. Veja:
Na Figura 2(I), podemos observar que, ao tentarmos formar o triângulo, com lados
medindo 10cm, 8cm e 6cm, os lados azul (8cm) e verde (6cm) precisaram ficar inclinados (foi
aí que o triângulo apareceu!). Já na Figura 2(II), quando colocamos lados com medidas de 5cm
e 4cm, isto não aconteceu, porque os dois juntos não ocupam toda a dimensão do lado 10cm.
15
ALGORITMOS I
Se aplicarmos a lógica, podemos deduzir que sempre que os dois lados menores a
serem testados, somados, forem menores ou iguais ao lado maior, o triângulo não poderá
ser formado. Da mesma forma, caso esta soma seja maior que o outro lado, o triângulo é
possível. Isso é lógica!
Suponha, agora, que você precisa escrever uma “receita” de como essa solução pode ser
obtida por qualquer outra pessoa. Como seria isso? Bem, isso é Lógica de Programação,
e pode ser descrita da seguinte forma (como uma regra):
Você deve tomar as três medidas que deseja testar e separar aquela
que tiver o maior comprimento dentre elas. Depois disso, tome as outras
duas e as some. Caso o valor da soma seja maior do que a medida
separada, é possível formar um triângulo. Se a soma for igual ou menor,
o triângulo não poderá ser formado!
Observe que a solução proposta pode ser repetida quantas vezes desejarmos, e
sempre teremos o resultado correto, desde que a executemos conforme foi proposto. O
que acabamos de propor é o “algoritmo”. O conceito de algoritmo, como veremos depois,
não é exclusivo da área de programação. Ele é apenas uma “receita” para solucionar um
problema, a qual foi formalmente escrita e pode ser repetida, quando desejarmos.
16
ALGORITMOS I
entendido perfeitamente. Para compreender o problema, podemos realizar perguntas
como:
a) Quais são os dados de que dispomos?
b) Existem condições ou restrições para solucionarmos o problema?
c) Quais são as partes importantes do problema e da solução?
d) O que precisamos descobrir ou determinar?
4- Revisar a solução: uma vez obtida a solução, é necessário ter certeza de que se
resolveu o problema de maneira correta. Devemos ter em mente que a obtenção de
uma solução nos aproxima da solução final, mas não a garante. Executando o plano
adequadamente, cabe certificar se o problema foi realmente resolvido e se nenhum erro
ocorreu durante o processo. É preciso questionar:
a) É possível verificarmos o resultado? Ele está correto?
b) Todas as condições e restrições foram obtidas/respeitadas?
c) Existem outras estratégias para solucionar o problema?
Caso tenhamos êxito neste passo, obtivemos um processo que soluciona o nosso
problema. Observe que o modo como vemos o problema pode sofrer alterações durante o
seu processo de solução. No início, temos uma visão incompleta e complicada do mesmo,
mas quando avançamos na análise e planejamento, começamos a compreender melhor o
que necessitamos e quais são as implicações para obtermos a solução.
De forma sintética, podemos propor a seguinte ordem, para tratarmos a solução de
um problema (a sistemática está representada no Quadro 1):
1. Identificar o problema;
2. Analisar as características do problema;
3. Determinar suas causas e efeitos principais;
4. Conceber um plano para eliminar o problema;
17
ALGORITMOS I
5. Executar o plano;
6. Verificar a eficácia da sua ação (executando o plano);Eliminar os problemas e erros;
7. Recapturar as atividades desenvolvidas.
PARA PRATICAR
EXERCÍCIO
Você conhece o clássico (e histórico) problema das Torres de Hanói? Neste
problema, baseado em uma lenda, existem três torres iguais e, em uma delas, existem N (pode
ser qualquer número maior ou igual a 3!) torres com tamanhos diferentes. Elas estão colocadas
de tal forma que a maior está embaixo e a menor em cima, conforme o desenho (com cinco
discos):
18
ALGORITMOS I
Sua tarefa é mover todos estes discos da torre 1 para a torre 2, usando a torre 3 como arma-
zenamento temporário. Para realizar a tarefa, você deve respeitar duas regras: deve mover um
disco de cada vez e nunca pode colocar um disco maior sobre um menor.
Analise este problema e descreva uma forma de mover 3 (três) discos da torre 1 para a 2.
1.3 ALGORITMOS
Uma vez que já temos uma ideia básica do que é lógica e, especialmente, lógica de
programação, vamos conhecer o ator principal da tarefa de programação de computadores:
o algoritmo.
19
ALGORITMOS I
5. Soltar os parafusos que prendem o pneu (mas não soltar completamente);
6. Elevar o carro até que o pneu saia do chão e haja espaço para a entrada do pneu
novo;
7. Soltar e remover o restante dos parafusos;
8. Remover o pneu furado e colocar o novo no lugar;
9. Recolocar os parafusos e apertá-los o quanto possível;
10. Descer o carro e retirar o macaco;
11. Apertar novamente os parafusos o máximo possível;
12. Guardar as ferramentas e o pneu furado.
Estas ações constituem um algoritmo que poderia ser repassado para uma pessoa que
nunca trocou um pneu e, com os devidos cuidados, ela conseguiria efetuar a troca.
Formalmente, a definição de um algoritmo é:
Com base nesta definição, podemos caracterizar que um algoritmo deve obedecer a
alguns requisitos:
• Todo algoritmo tem um estado inicial em que o problema começa a ser preparado
para a solução;
• Ele consiste em uma sequência lógica e finita de ações que, por definição, devem
ser claras e precisas;
• Ao concluir a tarefa (ou durante ela) ele deve produzir dados de saída e resultados
corretos;
• Ele deve sempre ser finito, ou seja, ter um final previsível.
Por mais que um algoritmo possa estar presente em nossas tarefas diárias, para ser
executado em um computador, faz-se necessário identificar claramente quais serão as
ações que o computador deverá executar.
Devemos compreender que um computador é uma máquina eletrônica, com poucos
recursos no seu nível básico, sendo capaz de realizar operações aritméticas (somar,
subtrair e outras) e operações lógicas (decidir se algo é verdadeiro ou falso). Então, foram
implementadas linguagens de programação, com recursos para colocarmos os algoritmos
em funcionamento, mas que, em nível de máquina, serão traduzidas nestas operações
básicas (SANTOS, 2018).
20
ALGORITMOS I
Como os programas de computadores são um conjunto de instruções, admitidas
naquela linguagem, que devem ser executadas para concluir a tarefa, nossos algoritmos
também serão um conjunto de passos que foram projetados, com o foco de serem
transformados em um futuro programa.
FIQUE ATENTO
Um algoritmo também pode ser definido como uma sequência de passos que
visam atingir um objetivo definido previamente.
PARA PRATICAR
EXERCÍCIO
Suponha que você realizou três avaliações em uma disciplina qualquer. Com
base nestas avaliações, você precisa calcular sua média final (aritmética). Você será aprovado
na disciplina se sua média for igual ou superior a 7,0. Escreva, ou descreva, os passos necessá-
rios para resolver este problema.
21
ALGORITMOS I
exemplo:
Figura 3 - Fluxograma.
Fonte: Elaborado pelo autor (2020).
Algoritmo AreaCirculo
variável
area, raio: reais
início
ler (raio);
area = raio * raio * 3.14
escrever (“Área = “, area)
fim
22
ALGORITMOS I
Na primeira parte, nomearemos nosso algoritmo para identificá-lo, bem como a
tarefa que ele soluciona. Assim, devemos dar um nome significativo para ele: Algoritmo
AreaCirculo é melhor do que chamá-lo, por exemplo, Algoritmo Exercicio1.
Na parte seguinte, vamos declarar as variáveis que estarão envolvidas na solução deste
problema. Fique tranquilo, pois será o assunto da próxima seção deste material.
Finalmente, vem o corpo do algoritmo, começando na palavra “inicio” e terminando
em “fim”. Entre estas duas palavras, devem estar descritas as ações ou comandos que
levam à solução do problema. Perceba que as ações devem ser executadas na ordem que
aparecem, sequencialmente.
Os comandos e recursos possíveis de serem utilizados no corpo do algoritmo serão
objeto deste material, ou seja, iremos gradativamente descobrir que recursos podemos
usar na solução de um problema.
23
ALGORITMOS I
Figura 4 – Dado da altura
182
SAIBA MAIS
Memória de um computador é um meio físico para armazenar dados, temporá-
ria ou permanentemente. Para saber mais, consulte TANENBAUM, 2013.
Podemos entender, então, que dados são os recursos, os quais entregamos ao
algoritmo, para que ele realize a tarefa. Por exemplo, para executar o cálculo da área do
triângulo, nosso algoritmo precisa conhecer a base e a altura. Com isso, ele produzirá um
novo dado (ou informação) que é o resultado da área.
Os dados, que são armazenados na memória, chamam-se, em programação, de
variáveis. Este nome vem do fato de que, durante a execução do algoritmo, os dados
podem mudar de valor. Assim, variáveis são nomes atribuídos às posições de memória,
de forma que possamos usá-las em nosso algoritmo. Por exemplo, podemos nomear duas
posições de memória como “base” e como “altura” e, nelas, armazenarmos as medidas da
base e da altura do nosso triângulo:
base = 12
altura = 18
Com esses comandos, nosso algoritmo irá guardar nas posições de memória base e
altura os valores 12 e 18. Podemos, também, ter uma posição de memória, nomeada de
“area” e, para ela, atribuirmos:
area = (base * altura) / 2
Assim, na posição “area”, o valor armazenado será igual a 108, que representa a área
do nosso triângulo. Observe a Figura 4, para a visualização deste exemplo.
24
ALGORITMOS I
Figura 5 - Variáveis em memória.
Fonte: Elaborado pelo autor (2019).
Toda variável possui um nome definido pelo programador. Para nomear uma variável,
podemos usar letras minúsculas ou maiúsculas e números. O nome de uma variável
não pode ter espaços e nem acentuação. Ele deve sempre iniciar com uma letra, sendo
fortemente recomendado que haja relação com a sua função em nosso algoritmo. Por
exemplo, dadas as variáveis:
Por definição, devemos sempre assumir que, ao declaramos uma variável, não
sabemos qual será o valor presente na memória naquele momento. Assim, as variáveis
devem sempre ser inicializadas (receber um valor inicial) antes do seu uso:
base = 12
25
ALGORITMOS I
Observe o papel do operador = (igual) presente neste tipo de ação. Ele tem a função
de tomar o valor que está à direita (12) e armazená-lo na posição de memória chamada
“base”, ou seja, ele faz uma atribuição.
Além das variáveis, nossos algoritmos contêm constantes, que são valores utilizados
em nossas expressões e que não serão alterados em nenhum momento. Por exemplo:
26
ALGORITMOS I
Essas expressões devem ser escritas em uma única linha, e os operadores respeitam
a ordem de resolução tradicional da matemática: em primeiro lugar, serão solucionadas
as potências, depois as multiplicações e divisões e, no final, as somas e subtrações. No
caso de operações com a mesma precedência, a solução será sempre da esquerda para a
direita.
Para alterar a ordem de solução das operações em uma expressão, podemos utilizar
os parênteses. Observe que, em algoritmos e programação, diferente da matemática
tradicional, usamos apenas parênteses, em quantos níveis forem necessários. Os
colchetes e as chaves têm outra função em programação, e não podem ser usados neste
caso.
DICA
Tome cuidado: cada parêntese que for aberto em uma expressão deverá ter
seu correspondente de fechamento, pois a falta da abertura ou fechamento de um
parêntese causará um erro em nosso programa.
a+1
b * 2 + 3.14
peso / altura * altura
b*b–4*a*c
(a + 5) / ((b – 2) *(a – b + c)
Expressões mais complexas devem ser apresentadas sempre em uma linha única (ou
divididas em vários cálculos mais básicos). Por exemplo, considere a fórmula da soma
dos termos de uma progressão geométrica:
S = a1 * (q ^ n - 1) / (q - 1)
27
ALGORITMOS I
Com essas expressões, podemos resolver boa parte dos problemas, mas existem
situações em que elas não são suficientes. Por exemplo, se precisarmos calcular
uma raiz ou uma função matemática, como seno ou cosseno, o que faremos? Neste
caso, as linguagens de programação oferecem um conjunto de funções previamente
implementadas que podemos usar em nossos programas.
PARA PRATICAR
EXERCÍCIO
Determine o valor final das seguintes expressões aritméticas:
a) (3 * (5 + 6)) = ________
b) 9 + 9 * 2 – 14 % 5 = ___________
c) 4 + ((10 / 2) * 4) = _______
d) 125 / 3 % 7 + 3 * 5 – 4 = _________
e) 25 / 2 % 3 * 2 + 49 = _________
28
ALGORITMOS I
Um operador de negação será sempre resolvido em primeiro lugar na expressão, a
menos que existam parênteses, indicando uma ordem diferente.
b) Operação Binária
As operações lógicas binárias são o OR (ou) e o AND (e). Quando estes operadores
estiverem presentes em uma expressão, entre dois operandos lógicos (que são V/F),
devemos aplicar as seguintes tabelas verdade:
A B AeB A B A ou B
F F F F F F
F V F F V V
V F F V F V
V V V V V V
Observe que uma expressão com o operador AND ou E será verdadeira, apenas se
ambos os operandos forem verdadeiros. No OR ou OU, ela será falsa, apenas se ambos os
operandos forem falsos.
Podemos usar parênteses nas expressões lógicas com AND e OR. Caso eles não existam,
o operador AND tem prioridade sobre o OR e será resolvido primeiro.
Na Linguagem C, a qual usaremos em nossos programas, o operador OR é representado
pelo sinal || (duas barras verificais lado a lado) e o AND pelo sinal && (dois “e” comercial,
lado a lado).
c) Sinal Relacional
Um sinal relacional poderá ser utilizado entre dois operandos não lógicos (variáveis,
constantes e expressões) e terá sempre como resultado um valor lógico de verdadeiro ou
falso.
29
ALGORITMOS I
<= Menor ou igual
Fonte: Elaborado pelo autor (2020).Delacionaissinais eno, o que faz0).
Com esses sinais, podemos escrever expressões como:
idade > 18
altura == 182
(b * b – 4 * a * c) >= 0
Nas expressões acima, existem variáveis e constantes, e o resultado final será sempre
TRUE ou FALSE. Por exemplo, na primeira expressão, se a variável idade contiver um valor
como 25, o resultado da expressão será TRUE, pois 25 é maior do que 18. Já se o valor da
idade for 12, o resultado final será FALSE.
Com esses operadores e sinais, vamos escrever expressões combinadas que serão
avaliadas pelo computador e julgadas como verdadeiras ou falsas. Como exemplo, vamos
considerar a existência das variáveis aux e letra contendo, respectivamente, os valores 10
e ‘A’. Qual seria, então, o resultado das expressões:
30
ALGORITMOS I
c) (letra == “B”) and (27/3 == 9) or (aux <= 300/100)
Aqui, temos uma falsidade (letra igual a B), uma verdade (27/3 é igual a 9) e uma
falsidade, pois o valor de aux é maior que 3 (300/100). Assim, a expressão é:
PARA PRATICAR
EXERCÍCIO
Defina se o resultado final das expressões abaixo é true ou false:
a) 10 % 5 != 40 / 8.0
b) 127 % 40 >= 5
c) 25 / 2 % 3 * 2 + 40 <= 40
d) 9/3 != 3 h) true ||true && true
e) true && true && false ||!false
f) true || true ||false && true
g) true ||true && false
SAIBA MAIS
O Instituto de Matemática e Estatística da USP mantém uma página no ar com
a explicação dos operadores e operações lógicas. Nesta página, é possível fazer
simulações com os operadores lógicos e observar o resultado das expressões. Para mais infor-
mações, acesse: https://panda.ime.usp.br/cc110/static/cc110/02-booleanos.html. Acesso em: 12
de outubro de 2019.
31
ALGORITMOS I
1.5 ALGORITMOS SEQUENCIAIS
ler (altura)
Caso desejemos que o usuário digite, via dispositivo de entrada, um valor que será
armazenado na variável altura e, logo após a leitura, esteja disponível para uso em outras
expressões.
Se escrevermos:
ler( a, b, c )
Estaremos definindo que: serão recebidos 3 valores, via entrada, e serão atribuídos
às variáveis a, b e c, na ordem em que forem digitados. Vamos supor que estes sejam os
coeficientes de uma equação do segundo grau, e o usuário digitou:
32
ALGORITMOS I
C:\> 1, -7, 5
Se for o caso, após a leitura, ‘a’ valerá 1, ‘b’ valerá -7 e ‘c’ terá 5 como valor. Isso é
equivalente a escrevermos no algoritmo a=1, b=-7 e c=5, mas é mais genérico, pois permite
que possamos testar vários valores diferentes a cada execução do nosso algoritmo ou
programa.
Podemos, então, apresentar os resultados finais do nosso algoritmo através deste comando.
Por exemplo, após o cálculo da área do triângulo que usamos como exemplo anterior:
Observe que o texto entre aspas se apresenta de forma literal, ou seja, como estiver
escrito. Já fora das aspas, e separado por vírgula, existe uma variável e ali deve ser escrito
o nome dela, exatamente como foi declarado na primeira parte do algoritmo.
Caso seja necessário, podemos mostrar várias variáveis, com texto ou não. Por exemplo,
considere os coeficientes da equação que foram lidos acima. Podemos apresentá-los como:
escrever( a, b, c )
ou
escrever( “A=”, a, “B=”, b, “C=”, c );
Supondo, então, os valores lidos acima ( a=1, b=-7 e c=5), o resultado de cada uma das
linhas seria:
33
ALGORITMOS I
XX> 1 -7 5
XX> A=1 B=-7 C=5
Perceba, na segunda linha, a importância de transmitirmos a maior quantidade de
informação possível (ou necessária) ao usuário que estiver executando o programa. O
segundo resultado é muito mais legível e compreensível do que o primeiro.
1 Algoritmo MediaFinal
2 Variável
3 nota1, nota2, nota3: real
4 media: real
5 início
6 escrever( “Digite três notas: “)
7 ler( nota1, nota2, nota3 )
8 media = (nota1 + nota2 + nota3 ) / 3
9 escrever( “Sua média é: “, media )
10 fim
Fonte: Elaborado pelo autor (2020).
34
ALGORITMOS I
No nosso caso, são quatro variáveis reais, chamadas de “nota1”, “nota2”, “nota3” (linha
3) e “media” (linha 4). As variáveis de um mesmo tipo podem estar em uma mesma linha.
Assim, não haveria a necessidade de colocarmos “media” em uma linha separada.
Entre as linhas 5 (início) e 10 (fim) estarão os comandos do nosso algoritmo que
efetivamente resolvem o problema proposto. Na linha 6, é dada uma mensagem no
monitor, informando ao usuário que estão sendo aguardados três valores. Na linha 7, os
valores serão lidos e atribuídos às respectivas variáveis (o primeiro vai para “nota1”, o
segundo para “nota2” e o terceiro para “nota3”).
Finalmente, após a linha 7, já possuímos valores em nossas variáveis e podemos
proceder ao cálculo da média. Observe que, na linha 8, há uma expressão aritmética do
lado direito da igualdade, a qual será avaliada (ou calculada) primeiro, cujo resultado
será, então, atribuído à variável “media”. Para terminarmos o algoritmo, apresentamos,
na linha 9, na tela do usuário, o resultado do nosso cálculo.
Vamos supor, a título de exemplo, que o usuário digite os valores 7, 8 e 8 para as notas.
O resultado em tela seria próximo deste:
Digite três notas: 7, 8, 8
Sua média é: 7.666666
Problema 2: Comprimento (da circunferência) e área do círculo.
Neste problema, devemos determinar qual é a área de um círculo, e o comprimento da
circunferência que o define. Para isso, se verificarmos as fórmulas, vamos constatar que
precisamos do valor do raio deste círculo. Assim, podemos afirmar que trabalharemos
com as variáveis “raio”, “area” e “comp”.
O cálculo do comprimento da circunferência é C = 2piR e da área A=piR2. Assim,
podemos projetar o seguinte algoritmo:
Quadro 5 - :CC
1 Algoritmo Circulo
2 Variável
3 raio: real
4 area, comp: real
5 início
6 escrever( “Qual o raio do círculo? “)
7 ler( raio )
8 comp = 2 * 3.14 * raio
9 area = 3.14 * raio * raio
10 escrever( “Comprimento = “, comp )
11 escrever( “Área = “, area )
12 fim
Fonte: Elaborado pelo autor (2020).
35
ALGORITMOS I
Neste algoritmo, o usuário digitará um valor para o raio (linha 7) e, com ele, realizará
o cálculo do comprimento da circunferência (linha 8) e da área do círculo (linha 9), de
acordo com as fórmulas. Os resultados serão apresentados nas linhas 10 e 11.
Supondo um raio de 10 cm, o resultado seria apresentado assim:
36
ALGORITMOS I
Qual a distância a ser percorrida? 450
Qual a média de consumo do carro? 15
Serão necessários 30 litros de combustível
Quadro 7 - :C
1 Algoritmo Combustivel2
2 Variável
3 distancia: inteiro
4 consumo, preco, resultado, gasto: real
5 início
6 escrever( “Qual a distância a ser percorrida? “)
7 ler( distancia )
8 escrever( “Qual a média de consumo do carro? “)
9 ler( consumo )
10 escrever( “Qual a valor do litro do combustível? “)
11 ler( preco )
12 resultado = distancia / consumo
13 gasto = resultado * preco
14 escrever( “Serão necessários “, resultado, “ litros de combustível” )
15 escrever( “Você irá gastar R$ “, gasto )
16 fim
Fonte: Elaborado pelo autor (2020).
PARA PRATICAR
EXERCÍCIOS
1- Escreva um algoritmo que calcula e apresenta a área de um trapézio.
2- Escreva um algoritmo que solicita ao usuário o salário de uma pessoa e um aumento (por-
centagem) a ser aplicado nele. No final, apresente o salário original, o aumento e o novo salário,
37
ALGORITMOS I
separadamente.
3- Escreva um algoritmo que solicita dois valores inteiros (a e b) ao usuário e apresenta a
soma (a + b), subtração (a – b), produto (a * b), quociente (a / b) e o resto da divisão (a % b)
entre eles.
FÓRUM
Após construir seus algoritmos para os exercícios acima, acesse o sistema da
UNIAVAN e publique suas respostas no fórum de discussão, para que você e seus
colegas possam debater sobre as soluções construídas.
SUGESTÃO DE LIVRO
Este livro, presente nas referências, apresenta os con-
ceitos introdutórios dos algoritmos e traz vários exemplos
de algoritmos, desenvolvidos passo a passo pelos seus autores Nina
Edelweiss e Maria Aparecida Livi. Ele foi publicado pela Editora Bookamn,
em 2014.
1.6 LINGUAGEM C
38
ALGORITMOS I
Seus pontos fortes vêm do fato de ser compilada, bem como ser capaz de fornecer
acesso pleno, caso necessário, aos recursos do computador, inclusive ao hardware.
39
ALGORITMOS I
Em especial, devemos tomar cuidado com os comandos de leitura e escrita de dados que,
em C, chamam-se scanf (ler) e printf (escrever).
Na secção 1.4.2, escrevemos vários algoritmos, a título de exemplo de como fazê-lo.
Vamos, agora, transcrever estes algoritmos para a Linguagem C, e vê-los executar em um
computador.
40
ALGORITMOS I
Na linguagem C, as variáveis são declaradas dentro do código do programa. Isso está
presente nas linhas 6 e 7. O tipo de dado float é equivalente ao nosso real dos algoritmos,
conforme você encontra detalhado no Anexo I.
Os comandos de escrita e leitura chamam-se scanf e printf em C. Sua sintaxe é
muito parecida com aquela do algoritmo, exceto pelo fato de precisarmos indicar o
tipo de variável que será lida ou escrita. Isso é feito através do marcado %f, indicando
que estamos trabalhando com uma variável do tipo float. Se fossem variáveis inteiras,
deveríamos usar um %d e para caracteres %c (veja Anexo I). Atenção: no scanf, cada
variável que será lida deverá ter o símbolo & em frente ao seu nome.
No final dos nossos programas, como está na linha 13, vamos colocar um comando
return 0; indicando que o programa finalizou corretamente. Na unidade que tratarmos
de modularização, o assunto voltará à discussão, para ter o motivo deste comando
esclarecido.
Finalmente, observe que o nome do algoritmo não aparece em nenhum lugar do nosso
programa. Ele deve ser usado como nome do arquivo que vamos salvar em disco com o
programa. Por exemplo, no caso, o arquivo se chamará mediafinal.c.
Problema 2: Comprimento (da circunferência) e área do círculo.
O algoritmo que calcula a área do círculo e comprimento da circunferência, escrito em
C, será representado como:
41
ALGORITMOS I
Problema 3: Combustível necessário para uma viagem.
Os algoritmos 3 e 4 representaram duas versões de solução deste problema. Ambos
algoritmos, escritos em Linguagem C, são expressos, como segue:
42
ALGORITMOS I
Quadro 11 - Programa 4: Consumo de Combustível (versão 2)
1
#include <stdio.h>
2
#include <locale.h>
3
4
int main(){
5
setlocale( LC_ALL, “Portuguese” );
6
int distancia;
7
float consumo, resultado, preco, gasto;
8
9
printf( “Qual a distância a ser percorrida? “ );
10
scanf( “%d”, &distancia );
11
printf( “Qual a média de consumo do carro? “ );
12
scanf( “%f”, &consumo );
13
printf( “Qual a valor do litro do combustível? “ );
14
scanf( “%f”, &preco );
15
resultado = distancia / consumo;
16
gasto = resultado * preco;
17
printf( “Serão necessários %f litros de combustível”, resultado );
printf( “Você irá gastar R$ %f”, gasto );
18
return 0;
19
}
20
Fonte: Elaborado pelo autor (2020).
SUGESTÃO DE LIVRO
O livro de Francisco de Assis Pinheiro apresenta, em de-
talhes, como funciona o desenvolvimento de um programa
em C e suas características. Ele foi publicado pela Bookman, em 2012.
PARA PRATICAR
EXERCÍCIOReescreva os três algoritmos, que formaram a lista de atividades
da seção anterior, sobre os primeiros algoritmos, em Linguagem C, e os execute
corretamente, avaliando os diferentes resultados.
43
ALGORITMOS I
CONSIDERAÇÕES FINAIS
Nesta primeira unidade do caderno, foram apresentados os importantes conceitos de
algoritmos e linguagem de programação. É fundamental que a solução de um problema
seja agora transcrita em uma sequência de passos lógicos e organizados, que nos levem
à solução do problema.
Essa solução algorítmica pode, então, ser repetida de forma sistemática e, espera-se,
sempre com o mesmo resultado final para uma mesma entrada.
No decorrer da Unidade 1, foi possível perceber que o principal problema a ser
enfrentado por quem está aprendendo a programar é a dificuldade em transcrever
uma solução qualquer, nesta sequência de passos. Portanto, torna-se fundamental a
prática desta atividade até que se alcancem os objetivos. Para a prática, a linguagem de
programação desempenha um papel fundamental, pois permite que vejamos o algoritmo
em execução e possamos avaliar se o seu resultado está correto.
Por outro lado, pode acontecer de alguns dos nossos programas apresentarem erros
inesperados quando executados, mesmo que não os tenham na sua escrita. Existem erros
lógicos de programação que precisam ser tratados pelo programador, como, por exemplo,
não permitir que um valor 0 (zero) seja usado em uma divisão. Este será o foco da próxima
unidade: o controle da execução do nosso programa/algoritmo.
44
ALGORITMOS I
EXERCÍCIO FINAL
01- Analise cada uma das expressões lógicas a seguir e defina se o resultado final é
verdade (true) ou falso (false).
I) true && !false
II) !false || !true
III) (!true && true) || (!false && true)
IV) !true && !(false && true)
V) !(false && true)
VI) !(false && false)
VII) false || !true || !(!true && true)
VIII) true && !false && !(!(true || !false))
IX) !(!(false || !(false && !true)) && !true) || !true
X) !false && !(!(false && !true))
45
ALGORITMOS I
salario = salario * 1.15;
Fim se
aux = 0;
se aux <= 10 faça
escrever aux;
fim enquanto
Fim
Var
a, b, c : inteiros;
início
ler a, b, c;
c = (a + b) * 4;
escrever c;
fim
Com base no algoritmo acima, e supondo que o valor fornecido para “A”, na linha “leia
A”, seja 3; o valor fornecido para “B”, na linha “leia B”, seja 4, pode-se afirmar que o valor
da variável “C”, na linha “escreva C”, é:
a) 24
b) 28
c) 32
d) 34
e) 43
46
ALGORITMOS I
04- Considere o algoritmo abaixo:var a, b, x: inteiro
Início
Leia (a, b)
x=a
a=b
b = x
imprima(b * x + a) / 2;
Fim
47
ALGORITMOS I
REFERÊNCIAS
48
ALGORITMOS I
2
unidade
DESVIO CONDICIONAL
49
ALGORITMOS I
INTRODUÇÃO À UNIDADE
50
ALGORITMOS I
que permite realizar testes de forma agrupada com ações realizadas de acordo com a
classificação obtida para o item testado.
Os principais objetivos de aprendizagem desta unidade são:
• conhecer as estruturas de controle de fluxo de decisão;
• identificar situações, nas quais o controle fluxo de execução pode ser aplicado na
solução de problemas;
• saber aplicar os conceitos de controle de fluxo e analisar as suas necessidades e
aplicações;
• conhecer e utilizar ferramentas básicas de projeto de software.
51
ALGORITMOS I
Quadro 12 - Comando de Seleção Simples
Pseudocódigo Linguagem C
Neste comando, sempre que a expressão lógica for considerada como verdade (true), as
linhas de código que ficarem entre o comando e seu final (fimse nos algoritmos ou chaves
na linguagem C), serão executados. Caso a expressão seja falsa, este trecho de código não
será executado, e o fluxo seguirá para a primeira linha de código após ele. O fluxo de
execução pode ser observado na Figura 8.
Voltemos ao algoritmo 1 da unidade, que calcula a média das notas de uma disciplina.
Caso a média do aluno seja superior a 6, escreveremos uma mensagem, informando que
ele foi aprovado. Este pedaço do algoritmo será definido da seguinte forma:
Aqui, temos mais uma novidade no comando printf do C. Observe que, antes da
mensagem, foi inserido um comando \n. Este comando, quando presente no printf, faz
com que seja dada uma nova linha na tela, antes de escrever a mensagem.
O algoritmo e sua versão em C, completos, são:
52
ALGORITMOS I
Quadro 13 - :MDC
Algoritmo MediaFinal
Variável
nota1, nota2, nota3: real
media: real
início
escrever( “Digite três notas: “)
ler( nota1, nota2, nota3 )
media = (nota1 + nota2 + nota3 ) / 3
escrever( “Sua média é: “, media )
se (media >= 6.0 )
escrever( “Você foi aprovado!” );
fimse
fim
Fonte: Elaborado pelo autor (2020).
Quadro 14 - :MDC
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
float nota1, nota2, nota3;
float media;
53
ALGORITMOS I
final do algoritmo, garantindo que o consumo é um número superior a zero. Por exemplo,
na versão em C:
54
ALGORITMOS I
Quadro 15 - :NCE
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
int valor, nota50, nota10, nota5;
PARA PRATICAR
EXERCÍCIOS
1- Escreva um programa em C, que recebe dois valores reais e, caso seja possí-
vel, divide o primeiro pelo segundo e mostra o resultado.
2- Escreva um programa que recebe duas notas de um aluno e calcula a média aritmética
dele, apenas se as duas notas forem superiores a 7 e se a primeira for superior à segunda. Caso
contrário, não deve fazer nada.
55
ALGORITMOS I
2.1.2 Seleção Dupla
Observe, na Figura 9 abaixo, como é o fluxo de execução de uma seleção dupla. Na figura,
são apresentados os dois caminhos possíveis: para o caso verdadeiro e para o caso falso.
56
ALGORITMOS I
senão
escrever( “Infelizmente você não foi aprovado!” );
fimse
ou
int main(){
setlocale( LC_ALL, “Portuguese” );
int num;
Agora, com o uso desta variação do desvio condicional, podemos aprimorar o Programa
6, que determina a quantidade de notas a serem usadas para pagar certo valor,a fim de
57
ALGORITMOS I
podermos determinar se o valor digitado pelo usuário do caixa eletrônico pode ou não
ser pago com as notas disponíveis. Vamos a ele:
Quadro 18 - :NCE
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
int valor, nota50, nota10, nota5;
58
ALGORITMOS I
PARA PRATICAR
EXERCÍCIOS
1- O cálculo do peso (massa) ideal de uma pessoa é realizado, de acordo com o seguinte
critério:
- Para sexo masculino: peso ideal = (72.7 * altura) - 58
- Para sexo feminino: peso ideal = (62.1 * altura) - 44.7
Escreva um programa em C que solicita a altura de uma pessoa e seu sexo (M ou F) e, com
base nisso, executa e apresenta o peso ideal desta pessoa.
2- As maçãs custam R$ 1,80 cada, se forem compradas menos de uma dúzia, e R$ 1,50, se
forem compradas pelo menos 12. Escreva um programa que leia o número de maçãs compradas,
calcule e escreva o custo total da compra.
Para fazermos isso, é possível colocarmos vários SE/IF separados, cada um avaliando
um caso separado da tabela. Entretanto, podemos fazer isso, aninhando os comandos.
59
ALGORITMOS I
Veja como seria o programa que resolve o problema desta forma:
Quadro 20 - :CD
1 #include <stdio.h>
2 #include <locale.h>
3
4 int main(){
5 setlocale( LC_ALL, “Portuguese” );
6 float nota1, nota2, nota3;
7 float media;
8
9 printf( “Digite três notas: “ );
10 scanf( “%f, %f, %f”, ¬a1, ¬a2, ¬a3 );
11 media = (nota1 + nota2 + nota3 ) / 3;
12 printf( “Sua média é: %f”, media );
13 if( media >= 9.0 ){
14 printf( “\nConceito final: A” );
15 }
16 else{
17 if( media >= 7.0 ){
18 printf( “\nConceito final: B” );
19 }
20 else{
21 if( media >= 5.0 ){
22 printf( “\nConceito final: C” );
23 }
24 else{
25 printf( “\nConceito final: D” );
26 }
27 }
28 }
29 return 0;
30 }
Fonte: Elaborado pelo autor (2020).
Observe que, caso a expressão lógica da linha 13 seja considerada falsa, a execução
do programa será direcionada para o bloco entre as linhas 17 até 27. Desta forma, não é
necessário fazer um teste para o limite superior do conceito B, pois, caso o programa entre
neste pedaço, a média é, necessariamente, inferior a 9.0 (se fosse superior, teria entrado
na linha 14). A mesma linha de raciocínio justifica os testes feitos para os conceitos C e D.
60
ALGORITMOS I
PARA PRATICAR
EXERCÍCIOS
1- Escreva um programa em C, que recebe um número e apresenta uma mensa-
gem, mostrando se ele é igual, menor ou maior do que zero.
2- Escreva um programa que recebe três valores inteiros e mostra a soma dos dois maiores
entre eles.
Suponha que você precisa escrever um programa que recebe o número do mês de
nascimento de uma pessoa e deve escrever na tela o nome deste mês. Uma possível
solução do problema seria a escrita de 12 testes SE/IF, uma para cada mês, com o printf
correspondente dentro dele. Algo semelhante a:
if( mes == 1 ){
printf( “Você nasceu em janeiro!” );
}
if( mes == 2 ){
printf( “Você nasceu em fevereiro!” );
}
.........
Esse tipo de situação pode ser resolvida com outro comando de seleção, muito útil
para casos de multiplicidade de uma condição única, chamado SWITCH/ESCOLHA. Sua
sintaxe é:
61
ALGORITMOS I
Quadro 21 - Seleção Múltipla
Pseudocódigo Linguagem C
switch( <variável> ){
Escolha ( <variável> ) case valor_01:
Caso (valor_01) : <grupo de comandos 01>
<comandos> break;
Caso (valor_02) : case valor_02:
<comandos> <grupo de comandos 02>
Caso (valor_03) : break;
<comandos> case valor_03:
............... <grupo de comandos 03>
Senão: break;
<comandos> ..........
fim default :
<grupo de comandos do caso default>
}
Fonte: Elaborado pelo autor (2020).
Neste tipo de seleção, a variável a ser analisada é única, e com teste de igualdade
simples. Caso o seu valor seja igual àquele presente no valor_01, serão executados os
comandos listados a seguir. Quando um caso é aceito, a execução será sequencial e
linear, a partir daquele ponto. Assim sendo, é necessário que seja colocado um comando
chamado break, o qual faz com que a execução dos comandos seja finalizada de forma
compulsória, e a execução seja desviada para a primeira linha após o switch.
O comando switch também tem um caso, chamado default/senão, que será executado,
se nenhum dos outros casos for aceito, ou seja, todos os outros casos sendofalsos.
Voltando ao nosso programa do mês de nascimento, ele poderia ser descrito conforme
segue:
62
ALGORITMOS I
Quadro 22 - :MN
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
int mes;
63
ALGORITMOS I
somente se nenhum dos casos anteriores foi aceito como verdade.
Existem outras possibilidades de uso para o comando switch. Com ele, podemos
aplicar vários cases para um mesmo bloco lógico de programação. É como se fizessemos
um if contendo vários operadores or entre cada uma das seleções. Ou seja, caso uma
delas seja satisfeita, os comandos serão executados.
Por exemplo, vamos escrever um pequeno programa que deverá ler um caracter do
teclado e informar se ele é uma vogal, consoante ou não é uma letra. Para isso, podemos
usar comandos case agrupadamente. Vejamos o programa:
Quadro 23 - :C
#include <stdio.h>
#include <locale.h>
#include <ctype.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
char ch;
Observe que fizemos a escrita de dois blocos de teste: uma para vogais e outra para as
consoantes, porém eles foram escritos de forma diferente. No primeiro caso, das vogais,
cada uma das letras teve um case colocado em uma linha diferente. Veja que os : (dois
64
ALGORITMOS I
pontos) após cada um dos cases ainda é obrigatório. Já no segundo caso, das consoantes,
para evitar que o programa ficasse excessivamente longo, os cases foram colocados em
quatro linhas apenas. Isso funcionará exatamente como no caso acima, pois a Linguagem
C não diferencia esta nova linha (ou não) entre cada um dos cases.
PARA PRATICAR
EXERCÍCIOS
1- O preço a pagar por certo produto depende do código deste produto. O preço
de cada kg de produto, de acordo com o código, é definido por:
Código Preço Kg
10 2,80
15 3,50
20 4,20
25 1,60
30 3,85
Escreva um programa que leia o código do produto e a quantidade comprada (em kg), e
apresenta o valor total a ser pago.
SAIBA MAIS
Saiba mais sobre lógica de programação e algoritmos, assistindo, novamen-
te, aos vídeos de Gustavo Guanabara. O primeiro vídeo sobre este tema pode
ser acessado em: https://www.youtube.com/watch?v=U5PnCt58Q68&list=PLHz_AreHm4d-
mSj0MHol_ao NYCSGFqvfXV&index=10.
65
ALGORITMOS I
CONSIDERAÇÕES FINAIS
Nesta terceira unidade, aprendemos como fazer com que partes do nosso código sejam
ignoradas durante a execução do programa e, com isso, podemos qualificar o controle da
execução do mesmo. Necessitamos, então, dos controladores de fluxo que, na prática,
implementam “desvios” dentro do código, os quais serão usados sob determinadas
condições.
Neste contexto, o principal representante é o teste if e seu complemento else. No teste
if, teremos uma condição lógica, que deverá ser avaliada como verdadeira ou falsa pela
Linguagem C e, dependendo do resultado, haverá um bloco lógico a ser executado para a
condição verdadeira e outro (opcional) para a condição falsa.
Por outro lado, existem situações, nas quais vários testes if são necessários. Quando
isso acontece, podemos tanto aninhar vários deles, colocando um dentro do outro e,
portanto, refazendo condições que devem acontecer conjuntamente, ou, caso todos os
testes sejam realizados sob uma mesma variável, podemos usar o comando switch.
Com o comando switch, podemos realizar um conjunto agrupado de testes, mas
sempre sob uma mesma variável e com avaliação simples de equivalência. Neste caso,
incluiremos um “case” (caso) para cada valor aceito, e o que deve ser realizado, se ele for
verdade.
Na próxima unidade, iremos ampliar as formas de controle, introduzindo a possibilidade
de repetirmos uma parcela do código, mas sempre sob condições controladas. Estas
repetições controladas, em conjunto com os controles de fluxo representam os elementos
fundamentais de controle de código dentro de qualquer programa de computador,
independente da linguagem usada.
66
ALGORITMOS I
EXERCÍCIO FINAL
67
ALGORITMOS I
else{
printf( “\nAlguma das notas digitas está errada” );
}
Considerando que uma nota válida deve possuir valores entre 0 e 10 (inclusive), a
lacuna que corresponde à condição do comando IF é corretamente preenchida por:Parte
superior do formulário
algoritmo
variável
numero: inteiro
inicio
numero = 12;
se ( numero % 2 = 0) então
escrever “A”
senão
escrever “B”
fim-se
se ( numero > 12 ) então
escrever “C”
fim-se
fim
68
ALGORITMOS I
c) AC
d) C
e) BC
04- Fornecidos os dados das candidatas ao time de basquete: altura, peso e idade, e
as restrições abaixo:
altura: mínima de 1,70m
peso: de 48 a 60 kg
idade: máxima de 20
Caso este algoritmo tenha o valor 3 digitado para a variável a, o resultado apresentado
69
ALGORITMOS I
para a variável b será:
a) 6
b) 12
c) 15
d) 20
e) 25
70
ALGORITMOS I
REFERÊNCIAS
71
ALGORITMOS I
72
ALGORITMOS I
3
unidade
CONTROLE DE
REPETIÇÃO E FLUXO
73
ALGORITMOS I
INTRODUÇÃO À UNIDADE
74
ALGORITMOS I
3.1 CONTROLE DE REPETIÇÃO
75
ALGORITMOS I
Figura 12 - Controle de repetição com teste no início (for / while) .
Fonte: Elaborado pelo autor (2020).
Nos controles de laço, é comum estar presente uma variável que é conhecida como
“contador”. Contadora é aquela variável, a qual recebe certo valor inicial (chamado de
inicializador) e, após certas ações, é incrementada (somada a um valor – tipicamente 1
(um)), fazendo com que ele vá indicando o número de vezes que certa coisa foi realizada.
Por exemplo:
i=1
.......
i=i+1
76
ALGORITMOS I
Existe, também, a possibilidade de usarmos a variável contadora como decremento,
cujo valor inicial é indicado e, depois dele, há um decremento (diminuído um valor –
tipicamente 1 (um)). Veja:
i = 15
.......
i=i-1
A. Incremento
O incremento da variável contadora (não só para ela – pode usar sempre que
necessário), pode ser realizado de várias formas diferentes. Por exemplo, para somarmos
uma unidade a uma variável, podemos usar:
i = i + 1; ou i++
O segundo comando (i++) é igual ao primeiro, ou seja, soma uma unidade ao valor de
i e atribui o resultado ao próprio i. Caso o valor a ser incrementado seja superior a 1 (um),
podemos usar (tendo 2 como incremento):
i = i + 2 ou i+=2
Observe que, no segundo caso, há a indicação do valor a ser acrescentado, após o sinal
de igual. Se desejarmos somar 5 ao contador, por exemplo, devemos usar +=5 e assim por
diante.
B. Decremento
Da mesma forma que o incremento, podemos reduzir o valor de uma variável de várias
formas diferentes. Por exemplo:
77
ALGORITMOS I
SAIBA MAIS
Busque na bibliografia maiores informações sobre as formas de atribuir valo-
res às variáveis. É possível usar, por exemplo, *= ou /= além do incremento e do
decremento mostrados acima. O livro de Francisco Pinheiro, Elementos de Programação em C,
publicado pela Bookman, em 2012, é uma boa indicação para isso.
Linguagem C
Em um laço desta natureza, há uma variável de controle que recebe um valor inicial,
indicado com <inicio> (PARA) e <inicialização> (FOR). Essa variável é, então, testada na
parte <condição>, para receber autorização ou não de repetição. Quando a repetição
1 Na Linguagem C, o laço for pode ser utilizado com outro tipo de controle que não de variáveis contado-
ras. Tal forma não será abordada neste material.
78
ALGORITMOS I
chega ao fim, o próprio programa aplica um incremento/decremento nesta variável.
O programador, entretanto, é quem deve tomar o cuidado, para que o valor indicado a
esta mudança da variável, leve-a, necessariamente, a alcançar a condição de parada. Se
isso não acontecer, o laço não terá fim, e o seu programa, quando executado, travará.
Por exemplo, vamos criar uma variável de controle de laço <i> que devereceber o valor
0 (zero) como inicialização e deve repetir o laço até que i seja igual a 9, aumentada uma
unidade por vez (isso fará com que a repetição aconteça por 10 vezes). O laço seria escrito
assim:
Observe que i tem o valor 0 na primeira entrada do laço. Ao final, depois do printf, ele
é aumentado (incrementado) em uma unidade, passando a valer 1. Quando isso acontece,
a condição é testada, e a repetição liberada ou não. Neste caso, será liberada, pois i é
menor ou igual a 5 (verdade).
Após a segunda repetição, o i será aumentado para 2, e a condição verificada
79
ALGORITMOS I
novamente, o que acontecerá até o momento, no qual a repetição ocorrer com i=5. Assim
que este valor for mostrado, o i aumentará para 6; ao fazer o teste da condição, ele será
falso, e o laço terminará. A execução será, então, desviada para a linha imediatamente
seguinte ao final do laço. Nesta linha, haverá um printf, mostrando novamente o valor do
i e, agora, ele valerá 6, isto é, o valor que fez com que a condição fosse falsa.
Vamos fazer um exemplo completo agora. Tomando nosso algoritmo de média,
suponha que a turma tem 20 alunos e é preciso calcular a média, dando o resultado para
todos eles. Um laço for vai resolver o problema. Veja:
Quadro 25 - :MDCA
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
float nota1, nota2, nota3;
float media;
int i;
return 0;
}
Fonte: Elaborado pelo autor (2020).
80
ALGORITMOS I
VAMOS NOS DIVERTIR?!
Um professor pediu a um aluno (programador, óbvio!) que escrevesse no qua-
dro 100 vezes a frase “Não farei mais isso!”. Ele foi lá e....
Analisemos um segundo exemplo: fazer um programa que solicita ao usuário um número in-
teiro e mostra, na tela, a tabuada (até 10) deste número que ele entrou. No caso, após conhecer o
número, vamos usar um laço for, garantindo que a variável de controle assuma todos os valores
necessários ao produto da tabuada. Veja:
Quadro 26 - :TN
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
int num, i, valor;
Algumas novidades deste programa: observe que no printf dentro do laço for foi
usando um novo formatado \t (além do \n que muda a linha). Este comando acrescenta
uma tabulação (tecla TAB) no texto a ser mostrado, deslocando-o para a direita. No
laço, também estamos mostrando 3 variáveis: o número, o qual o usuário digitou, o
81
ALGORITMOS I
multiplicador (i) e o resultado (valor). Uma possível execução dele, considerando que o
usuário digite o valor 5 para num, seria:
Vamos a mais um exemplo de uso de laços de repetição. Nesta situação, vamos supor
que estamos fazendo um programa, cujo objetivo é controlar as vendas de uma loja. A
cada venda, o programa deve receber o valor vendido e a forma de pagamento. As formas
possíveis são P para prazo, V para à vista ou C para cartão de crédito. Ao final, o programa
deve informar a quantidade de vendas em cada caso de pagamento, sua porcentagem em
relação ao total de vendas e o valor total vendido. Antes de solicitar os dados ao usuário,
devemos pedir a quantidade de vendas feitas.
Esse programa pode ser expresso, usando o laço for, o qual iniciará em 1 (um), mas terá
seu final informado pelo usuário antes da solicitação dos dados. Observe:
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
int i, numVendas, numPrazo=0, numVista=0, numCartao=0;
float valor, porcentagem;
float totalVendas=0, totalPrazo=0, totasVista=0, totalCartao=0;
char pgto;
82
ALGORITMOS I
printf( “Venda número %d: “, i );
printf( “\n\tTotal vendido: “ );
scanf( “%f ”, &valor );
printf( “\n\tForma de pagamento ([P]razo, à [V]ista ou [C]artão): “ );
scanf( “ %c”, &pgto );
totalVendas += valor;
if( pgto == ‘P’ || pgto == ‘p’ ){
numPrazo++;
totalPrazo += valor;
}
if( pgto == ‘V’ || pgto == ‘v’ ){
numVista++;
totalVista += valor;
}
if( pgto == ‘C’ || pgto == ‘c’ ){
numCartao++;
totalCartao += valor;
}
}
return 0;
}
83
ALGORITMOS I
inteiros, e o resultado não teria casas decimais.
Ainda sobre a porcentagem, na sua apresentação, em cada uma das vendas, foi usado
o símbolo de % duas vezes (%%), sendo necessário, porque o C trata este símbolo como
um formatador de saída e, caso apenas um símbolo tivesse presente, o C esperaria o
formatador em seguida (%d, %f, %c e outros). Ao colocarmos dois símbolos, a linguagem
entende que o segundo deve ser apresentado na tela.
PARA PRATICAR
EXERCÍCIOS
1- Escreva um algoritmo ou programa que mostre uma tabuada genérica ao
usuário. Este programa deve, então, solicitar o número da tabuada e, também, até qual valor ela
deve ser feita. Por exemplo, podemos entrar com a tabuada do 7 até o valor 15. Assim, o progra-
ma deve mostrar: 7x1, 7x2 até 7x15.
2- Escreva um programa que mostra na tela todos os números naturais pares até um valor
limite informado pelo usuário.
3- Escreva um programa que solicita dois valores ao usuário (a e b) e mostra todos os valo-
res, em ordem decrescente, entre os dois valores. Lembre-se de verificar (testar) qual é o maior e
o menor dos valores. Por exemplo, se o usuário digitar a=40 e b=25, o programa deve apresen-
tar na tela os valores 40, 39, 38, 37 ... 25.
O segundo tipo de controlador de laço que vamos analisar também faz o teste da
condição no início do processo e, por conta disso, pode fazer com que os comandos
do interior não sejam executados nenhuma vez. Este é o controlador ENQUANTO
(pseudocódigo) ou WHILE (Linguagem C). Sua sintaxe é:
84
ALGORITMOS I
Quadro 28 - Repetição com Teste no Início
Pseudocódigo Linguagem C
Esse controlador repetirá o que está dentro dele, enquanto (daí vem o nome dele!) a
expressão lógica for verdadeira. No momento em que ela for considerada falsa, o fluxo de
execução será desviado para a instrução seguinte ao seu final.
Observe que, nesse laço, o valor de inicialização do controle (se houver necessidade) e
a garantia de que a condição seja, em algum momento falsa, é de responsabilidade única
do programador.
Vamos construir o mesmo exemplo do laço anterior, das médias, mas com o controlador
while. Ele será descrito da seguinte forma:
Quadro 29 - :MDCA
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
float nota1, nota2, nota3;
float media;
int i = 1;
while( i<=20 ){
printf( “Digite três notas (aluno %d): “, i );
scanf( “%f, %f, %f”, ¬a1, ¬a2, ¬a3 );
media = (nota1 + nota2 + nota3 ) / 3;
printf( “Média do aluno %d é: %f”, i, media );
if( media >= 6.0 ){
printf( “Aluno %d foi aprovado!”, i );
}
i = i + 1; // Aqui a variável de controle foi incrementada
} // Fim do laço while
return 0;
}
Fonte: Elaborado pelo autor (2020).
85
ALGORITMOS I
Basicamente, é o mesmo modo de operar. Entretanto, observe que foi responsabilidade
nossa fazer o i receber o valor inicial de 1, fora do laço, o que aconteceu no próprio
momento da criação da variável (mais uma novidade!). Além disso, sabendo que o laço
será repetido, enquanto i for menor ou igual a 20 (veja a condição do while), foi necessário
fazê-la aumentar para 2, depois 3 e assim por diante, dentro do próprio laço. Isto está no
final dele.
O controlador while nos dá maior liberdade para o controle da repetição. Com
ele, podemos fazer com que a repetição aconteça, enquanto o usuário desejar, sem
estabelecer um limite (como 20, no exemplo acima). Para tanto, podemos, por exemplo,
fazer o seguinte:
char continuar=’S’;
......
while( continuar == ‘S’ || continuar == ‘s’ ){
.......
<comandos>
.......
printf( “\nDeseja repetir (S/s)?” );
scanf( “%c”, &continuar ); // ou continuar = getch();
}
Esse laço será repetido, enquanto o usuário digitar uma letra s (maiúscula ou
minúscula). Caso o valor digitado seja outro, a repetição irá parar. Observe a necessidade
de testarmos os dois casos na condição do laço while, pois não sabemos se o usuário
digitará um S ou um s, quando solicitado. Esses dois valores foram unidos por um OR
(||) no teste. Assim, caso um deles seja verdadeiro, a execução continuará. A leitura do
caractere pode ser feita com o scanf ou com a função getch().
DICA
A Linguagem C pode apresentar problemas, caso, antes da leitura de um caractere,
seja realizada a leitura de um inteiro ou de um float. Quando isso acontece, o [ENTER],
utilizado para indicar a digitação do número, pode ficar armazenado na memória do teclado (buffer) e
ser atribuído automaticamente para o caractere lido na sequência, o que não ocorrerá com o uso do
getch(), mas sim com o uso de um scanf. Para evitar o problema, usando o scanf, basta acrescentar um
espaço em branco entre a primeira aspa e o %c do scanf, ficando assim: scanf( “[espaço]%c”, &ch).
86
ALGORITMOS I
Podemos, então, fazer com que o exemplo da média seja agora repetido, enquanto o
usuário desejar. Observe:
Quadro 30 - : MRCU
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
float nota1, nota2, nota3;
float media;
int i = 1;
char continuar = ‘S’;
Quandro 31 - : VLL
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
int i, numVendas, numPrazo=0, numVista=0, numCartao=0;
float valor, porcentagem;
float totalVendas=0, totalPrazo=0, totasVista=0, totalCartao=0;
char pgto;
87
ALGORITMOS I
printf( “Qual é o quantidade total de vendas? “ );
scanf( “%d”, & numVendas);
i = 1;
while( i<=numVendas ){
printf( “Venda número %d: “, i );
printf( “\n\tTotal vendido: “ );
scanf( “%f ”, &valor );
printf( “\n\tForma de pagamento ([P]razo, à [V]ista ou [C]artão): “ );
scanf( “ %c”, &pgto );
totalVendas += valor;
if( pgto == ‘P’ || pgto == ‘p’ ){
numPrazo++;
totalPrazo += valor;
}
if( pgto == ‘V’ || pgto == ‘v’ ){
numVista++;
totalVista += valor;
}
if( pgto == ‘C’ || pgto == ‘c’ ){
numCartao++;
totalCartao += valor;
}
i++;
}
return 0;
}
88
ALGORITMOS I
PARA PRATICAR
EXERCÍCIO
Reescreva todos os exercícios solicitados para o laço FOR, na seção 2.4, agora
utilizando o controlador de laço WHILE ou o ENQUANTO.
Faça
do{
.....
.....
<comandos a repetir>
<comandos a repetir>
.....
.....
Enquanto ( <expressão lógica> )
} while( <expressão lógica> );
89
ALGORITMOS I
Quadro 33 - Programa 18: Mostrando a Tabuada com o Laço DO...WHILE
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
int num, i, valor;
char continuar;
......
do{
.......
<comandos>
.......
printf( “\nDeseja repetir (S/s)?” );
scanf( “%c”, &continuar ); // ou continuar = getch();
} while( continuar == ‘S’ || continuar == ‘s’ );
.......
Façamos um exemplo desta situação. Vamos escrever um programa que irá verificar se
um número é primo2, enquanto o usuário desejar que isso aconteça.
2 Um número primo é aquele que tem exatamente dois divisores: o um (1) e ele próprio!
90
ALGORITMOS I
Quadro 34 - :NP
1 #include <stdio.h>
2 #include <locale.h>
3
4 int main(){
5 setlocale( LC_ALL, “Portuguese” );
6 char continuar;
7 int num, i, divisores;
8
9 do{
10 printf( “\n\nDigite um número: “);
11 scanf( “%d”, &num );
12
13 if( num > 1 ){
14 // Vamos contar quantos divisores ele tem
15 divisores = 0;
16 for( i=1; i<=num; i++ ){
17 if( num % i == 0 ) divisores++;
18 }
19 if( divisores == 2 )
20 printf( “\n\tO número %d é primo!”, num );
21 else
22 printf( “\n\tO número %d não é primo!”, num );
23 }
24 else{
25 if( num == 1 )
26 printf( “\n\tO número 1 não é primo!”);
27 else
28 printf( “\n\tO digitado [%d] não é positivo!”, num);
29 }
30
31 printf( “\n\nDeseja continuar (S/s)?”);
32 continuar = getch();
33 }while( continuar == ‘S’ || continuar == ‘s’ );
34 printf( “\nObrigado!”);
35 return 0;
36 }
Fonte: Elaborado pelo autor (2020).
91
ALGORITMOS I
Outro detalhe importante (e novo!) está em algumas linhas do programa como, por
exemplo, as linhas 17, 20, 22, 26 e 28. Nelas, o comando anterior é um if, e não há chaves
abrindo ou fechando os comandos que estão dentro dele. Quando existe um único
comando dentro de um if, for, while, ou qualquer outro que tenha chaves para definir o
bloco de comandos dentro dele, não há a necessidade das chaves. Elas só precisam estar
presentes, quando existir mais do que um comando.
Nosso último exemplo será o mesmo das seções anteriores, mas implementado de uma
outra forma. Desta vez, utilizaremos o laço do..while para permitir que a repetição aconteça,
enquanto o usuário desejar. Ou seja, ao final de cada interação, solicitaremos ao usuário se ele
deseja continuar ou não. Isso vai deixar nosso programa mais genérico e fácil de usar. Veja:
Quadro 35 - :VLL
#include <stdio.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, “Portuguese” );
int numVendas=0, numPrazo=0, numVista=0, numCartao=0;
float valor, porcentagem;
float totalVendas=0, totalPrazo=0, totasVista=0, totalCartao=0;
char pgto, aux;
do{
numVendas++;
printf( “Venda número %d: “, numVendas );
printf( “\n\tTotal vendido: “ );
scanf( “%f ”, &valor );
printf( “\n\tForma de pagamento ([P]razo, à [V]ista ou [C]artão): “ );
scanf( “ %c”, &pgto );
totalVendas += valor;
if( pgto == ‘P’ || pgto == ‘p’ ){
numPrazo++;
totalPrazo += valor;
}
if( pgto == ‘V’ || pgto == ‘v’ ){
numVista++;
totalVista += valor;
}
if( pgto == ‘C’ || pgto == ‘c’ ){
numCartao++;
totalCartao += valor;
}
printf( “\n\nDeseja continuar (S/N)? “ );
92
ALGORITMOS I
scanf( “%c”, &aux );
}while( aux == ‘S’ || aux == ‘s’ );
return 0;
}
PARA PRATICAR
EXERCÍCIOS
1- Reescreva os exercícios da secção 2.4 do comando for, agora usando do...while.
2- Escreva um programa que leia um número n e, caso ele seja maior que zero, o programa
deverá mostrar todos os números inteiros entre 1 e o valor informado. Caso ele seja inferior a
1(um), o programa deverá dar uma mensagem, informando o erro ao usuário.
3- Escreva um programa que solicita ao usuário a quantidade de alunos existentes em uma
turma, e calcule a média ponderada (pesquise como se faz isso!) de duas notas, cujos pesos são 3
e 2. O programa deve repetir o cálculo para toda a quantidade de alunos informados.
SAIBA MAIS
Saiba mais sobre lógica de programação e algoritmos, assistindo, novamen-
te, aos vídeos de Gustavo Guanabara. O primeiro vídeo sobre este tema pode
ser acessado em: https://www.youtube.com/watch?v=U5PnCt58Q68&list=PLHz_AreHm4d-
mSj0MHol_ao NYCSGFqvfXV&index=10.
93
ALGORITMOS I
CONSIDERAÇÕES FINAIS
Nesta unidade, aprendemos como fazer com que um pedaço do nosso código seja
repetido sob nosso controle. Assim, podemos otimizar os programas, evitando a reescrita
de elementos que podem, inclusive, levar ao aparecimento de erros de programação. Uma
vez que as instruções dentro da repetição estejam corretas, e foram exaustivamente
verificadas, não há mais possibilidade de as mesmas produzirem erros, independente de
quantas vezes sejam repetidas.
Este é um dos recursos de programação mais comuns em nossos códigos, sendo
fundamental que os programadores os conheçam a fundo. Por isso, você deve testar
cada um dos programas, verificar e acompanhar sua execução em detalhes e, sempre
que possível, fazer variações, analisando o novo resultado. Por exemplo, se o laço é
incrementado em uma unidade, tentar fazê-lo de dois em dois ou mais e, até mesmo,
invertê-lo, para iniciar no valor máximo e ir diminuindo até o início.
Em termos de comandos de programação, chegamos muito perto do final, uma vez que
não são muitos comandos disponíveis nas linguagens. O que encontramos são recursos
de programação, os quais agregam estes comandos, fornecendo novas funcionalidades,
o que será apresentado nas próximas unidades.
94
ALGORITMOS I
EXERCÍCIO FINAL
int main(){
int i=1, valor, total=0;
while( i<=10 ){
printf( “Digite um número: “ );
scanf( “%d”, &valor );
total += valor / 2;
i = i + 1;
}
printf( “\nTotal = %d”, total );
return 0;
}
int main(){
int a, b, c;
scanf( “%d”, &a );
scanf( “%d”, &b );
scanf( “%d”, &c );
do{
do{
a = a / 2;
95
ALGORITMOS I
}while(a > b );
b = b + 2;
}while( b > c );
printf( “%d, %d, %d ”, a, b, c );
}
int main(){
int x1, x2, x3, i;
scanf( “%d,%d,%d”, &x1, &x2, &x3 );
for( i = 1; i <= x1; i++ ){
x2 = x1 + x3;
x3 = x1 – x2;
}
printf( “%d”, x2+x3 );
}
O número de vezes que as instruções serão executadas dentro do loop for é igual a:
96
ALGORITMOS I
a) 0
b) 1
c) 2
d) 3
e) 5
int a = 11;
while ( a>= 0 ){
a--;
printf( “\nA”);
}
int b = 11;
do{
b--;
printf( “\nB”);
}while( b > 0 );
Com base no que foi escrito do código, podemos afirmar que o número de vezes que a
letra A e a letra B serão mostradas na tela, respetivamente, é:
a) 12 e 11
b) 10 e 10
c) 11 e 11
d) 12 e 12
e) 11 e 10
05- No algoritmo abaixo, todas as variáveis definidas são do tipo numérico inteiro.
x = 20;
y = 3;
z = 0;
do{
x = x – 5;
y = y + 2;
97
ALGORITMOS I
z = z + x + y;
}while( x > 5 || z > 100 );
a) X = 5, Y = 9 e Z = 51
b) X = 0, Y = 9 e Z = 51
c) X = 0, Y = 11 e Z = 62
d) X = 5, Y = 11 e Z = 62
e) X = 5, Y = 9 e Z = 62
98
ALGORITMOS I
REFERÊNCIAS
99
ALGORITMOS I
100
ALGORITMOS I
4
unidade
VETORES E MATRIZES
101
ALGORITMOS I
4 INTRODUÇÃO À UNIDADE
Figura 13 - Organizar dados é o segredo para o sucesso de um software. Fonte: < https://abracd.org/
tutorial-numpy-os-primeiros-passos-em-computacao-numerica-e-tratamento-de-dados//>. Acesso em:
Setembro de 2020.
102
ALGORITMOS I
Os vetores são estruturas unidimensionais. Na seção seguinte, vamos ampliar a
dimensionalidade e possibilitar que se trabalhe com armazenamento de dados em duas
ou mais dimensões, todavia ainda com dados homogêneos, ou seja, de um mesmo tipo.
Os principais objetivos de aprendizagem da Unidade 4 são:
• compreender a aplicação das estruturas bidimensionais no
desenvolvimento de software;
• conhecer as diferentes estruturas de dados básicas e suas aplicações na solução
de problemas;
• entender os mecanismos de controle e acesso a estruturas de dados; e
• assimilar a solução de problemas computacionais com processos recursivos.
4.1 VETORES
103
ALGORITMOS I
Quadro 36 - Variáveis
Agora, vamos supor que precisemos colocar todas as médias dos alunos em ordem
crescente. A ordenação de 20 médias, usando apenas desvios condicionais e laços, é
extremamente complexa.
Justamente para isso, é que vetores se apresentam como uma organização homogênea
de dados, formando conjuntos de elementos de mesma natureza. Um vetor é uma
estrutura de dados que ocupa N posições contíguas (vizinhas) de memória, todas de um
mesmo tipo. Ao declararmos um vetor de N posições, sua estrutura é a seguinte:
.....
0 1 2 3 4 5 6 7 n-2 n-1
2 3 5 7 11 13 17 19 23 29
0 1 2 3 4 5 6 7 8 9
104
ALGORITMOS I
Quando declaramos o vetor, damos um nome a ele, como se estivéssemos nomeando
uma variável (inclusive, as regras são as mesmas). Por exemplo, se chamarmos o vetor
acima de V, sua declaração em C seria:
int V[10];
Nesta declaração, estamos fornecendo o tipo dos dados no vetor (int), seu nome (V) e
o seu tamanho (10). Podemos declarar vetores de qualquer tamanho maior ou igual a 2.
O limite é a disponibilidade de memória do computador e a capacidade da linguagem de
usá-la.
Como chamamos nosso vetor de V, podemos indexar (acessar) qualquer uma das
posições dele, informando o nome e a posição desejada. Por exemplo, V[3] indica a
posição atualmente ocupada pelo número 7. Podemos usar este tipo de indexação para
realizarmos qualquer operação que faríamos com uma variável comum. Por exemplo:
V[5] = V[6] – 2;
Faz com que a quinta posição (sexta na sequência – porque começa em zero!) receba
o valor da posição 6, subtraído de duas unidades. Esta posição teria, após a execução do
comando, o valor 15 armazenado nela.
A sintaxe da declaração de um vetor é:
Como tipo de dado, podemos usar qualquer um dos tipos que estudamos até o
momento, por exemplo, char, int, float e outros tipos que a linguagem oferece. Para o
nome, valem as mesmas regras que usamos nas variáveis (afinal, estamos declarando
uma variável do tipo vetor). Já o tamanho, deve ser um número maior ou igual 2 e indicará
o número total de posições disponíveis.
A criação do vetor nos permite definir um grupo de variáveis que coexistem, mas e
quanto ao seu uso? Se usarmos o vetor como variáveis comuns, nomeando as posições
individualmente, nossos programas serão desorganizados. Para resolver este problema,
105
ALGORITMOS I
os vetores, normalmente, são utilizados em conjunto com controladores de laço,
especialmente o laço FOR.
Para lermos todas as posições de um vetor de 20 posições do tipo inteiro, não
declaramos um scanf para cada posição. Usaremos um for para isso. Observe:
Neste exemplo, criamos um laço for com uma variável de controle i que receberá os
valores de 0 (zero) até 19. Para cada um dos valores, o scanf fará a leitura do elemento v[i].
O seu uso é exatamente como uma variável comum, inclusive com o & à frente do nome.
Se, após a leitura ou operações, desejarmos mostrar todos os elementos do vetor na
tela, basta usar um outro for:
106
ALGORITMOS I
Quadro 38 - :NIS
int main(){
int V[10];
int i, soma=0;
2 + 4 + 6 + 8 + 10 + 12 + 14 + 16 + 18 + 20 = 110
O símbolo + (mais) será mostrado ao lado do número que está no vetor para todas
as posições, exceto a última, pois o if( i != 9 ) somente será verdade para as posições
anteriores. Como não foi usado o formatador \n, não haverá nenhuma nova linha até que
o valor da soma seja apresentado.
É possível percorrermos os vetores da forma que nos for mais conveniente. Por
exemplo, caso a necessidade indique que ele deve ser percorrido do último elemento ao
107
ALGORITMOS I
primeiro, basta trocarmos o laço de controle para:
108
ALGORITMOS I
Quadro 39 - Programa 22: Gerar 50 Números e Encontrar o Maior e o Menor Valor
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 int main(){
6 int V[50];
7 int i, menor, maior;
8
9 // Inicializar o gerador de números
10 srand( time( NULL) );
11
12 // Gerar os elementos
13 for(i=0; i<50; i++ ){
14 v[i] = rand() % 100;
15 }
16
17 // Procura dos valores
18 menor = v[0];
19 maior = v[0];
20 for(i=1; i<50; i++ ){
21 if( v[i] < menor ) menor = v[i];
22 if( v[i] > maior ) maior = v[i];
23 }
24 // Escrever o vetor e os valores encontrados
25 printf( “\nVetor gerado:\n” );
26 for(i=0; i<50; i++ ){
27 printf( “ %d “, V[i] );
28 }
29 printf( “O menor valor foi = %d\n”, menor );
30 printf( “O maior valor foi = %d\n”, maior );
31 return 0;
32 }
Fonte: Elaborado pelo autor (2020).
109
ALGORITMOS I
o restante do vetor e, encontrando um valor menor do que aquele que estiver na variável
menor, trocamos. O mesmo é feito para a variável maior.
PARA PRATICAR
EXERCÍCIOS
1- Leia 20 valores reais e os armazene em um vetor. Percorra este vetor e calcu-
le a média aritmética dos valores.
2- Faça um programa que carregue um vetor com dez números reais, calcule e mostre a quan-
tidade de números negativos e a soma dos números positivos deste vetor.
3- Faça um algoritmo que leia um vetor de 30 posições e informe quantos elementos são
múltiplos de 2, e quantos são múltiplos de 3.
4.1.3 Strings
Até o momento, trabalhamos com tipos de variáveis como int, float e char, mas, e se
precisarmos armazenar uma sequência de caracteres para formar, por exemplo, um nome
ou outro texto qualquer? Neste caso, usaremos um vetor feito de caracteres para tal tarefa:
char nome[50];
Para este tipo de vetor, possuímos, ainda, alguns recursos especiais que nos permitem
manipular os elementos de forma conjunta. Por exemplo, para ler ou escrever todo o
conjunto de elementos (e não um a um), usamos o controle %s no scanf e no printf.
Em relação ao scanf, temos um pequeno problema: ele lerá o texto digitado até o
primeiro espaço em branco encontrado. Desta forma, ele poderá não ler todo o conteúdo
digitado. Por exemplo, se você digitar o nome “João da Silva”, ele lerá somente o João.
Para resolver, temos duas soluções diferentes. Primeiro, podemos indicar ao scanf que
ele somente deve parar a leitura, quando encontrar um \n (enterou nova linha). A leitura
seria assim:
scanf(“%[^\n]s”,nome);
110
ALGORITMOS I
Ou podemos usar a função gets que faz a leitura de uma string em C, como o scanf:
gets( nome );
Desta forma, podemos escrever um pequeno programa para ler e apresentar o nome
completo de uma pessoa, fazendo:
Quadro 40 - :NP
int main(){
char nome[50];
return 0;
}
Fonte: Elaborado pelo autor (2020).
Atenção: vetores somente são comparáveis elemento a elemento. Assim, caso você
precise verificar se dois strings são iguais, deve escrever uma função que percorra cada
um deles e teste elemento a elemento. Também é possível usar um conjunto de funções
prontas do C, que estão disponíveis na biblioteca string.h e executam as tarefas básicas
com strings, como comparação, remover pedaços e outras. Para maiores informações,
procure nos livros [ZIVIANI,2004] ou [GOODRICH e TAMASIA, 2013].
4.2 MATRIZES
111
ALGORITMOS I
Quadro 41 - Estrutura Bidimensional
0 1 2 3 .... m COLUNAS
0
1
2
...
n
LINHAS
Fonte: Elaborado pelo autor (2020).
Assim, cada elemento terá um índice que o define de forma única. Para tal, utilizamos
a linha e a coluna onde ele se encontra. Por exemplo, podemos utilizar o elemento
pertencente à linha 2 e coluna 3 e que está marcado com outra cor.
A sintaxe da declaração de uma matriz é:
<tipo_de_dado> nome_matriz[dimensão_1][dimensão_2]...[dimensão_n];
Por exemplo, para declaramos uma matriz com 5 linhas e 6 colunas, de dados inteiros,
devemos fazer:
int matriz[5][6];
Na Figura 13, é possível observar uma matriz que tem 5 linhas, 4 colunas e 3 de
profundidade sendo, portanto, tridimensional. Não há limite para a dimensionalidade
na Linguagem C, embora, dificilmente, será necessária uma matriz com mais do que 3
dimensões.
112
ALGORITMOS I
A declaração desta matriz da Figura 14, considerando que os dados sejam do tipo float,
seria:
float cubo[5][4][3];
Já no caso do cubo da Figura 14, serão necessários três controladores de laço. Para
mostrá-los na tela, deveríamos fazer:
113
ALGORITMOS I
indica a linha e o segundo, a coluna. Não é preciso ser sempre assim, mas é altamente
recomendável que você siga sempre um padrão, para não criar problemas no seu programa.
Vamos construir um exemplo, baseado em matrizes ensinadas na Matemática do
Ensino Médio. Em nosso exemplo, vamos ler uma matriz quadrada 4x4 e um número real
e produzir uma segunda matriz, na qual os elementos devem estar multiplicados pelo
número dado. Esta operação chama-se produto escalar na álgebra de matrizes.
Quadro 42 - :EM
#include <stdio.h>
int main(){
float mat[4][4], res[4][4];
float num;
int i,j;
// Realizar a multiplicação
for( i=0; i<4; i++ ){
for( j=0; j<4; j++ ){
res[i][j] = num * mat[i][j];
}
}
// Mostrar o resultado
printf( “\nMatriz resultado:\n” );
for( i=0; i<4; i++ ){
for( j=0; j<4; j++ ){
printf( “\t%.2f”, res[i][j] );
}
printf( “\n” );
}
return 0;
}
Fonte: Elaborado pelo autor (2020).
114
ALGORITMOS I
Observe que, na impressão da matriz resultado, no final do programa, há uma linha,
contendo um printf(“\n”) entre a finalização dos dois laços for. Isso foi colocado, para
que a matriz apareça na tela com os elementos de cada linha dispostos lado a lado e, na
próxima linha, haja uma quebra de linha imposta pelo programa.
Ainda dentro do universo das matrizes, podemos fazer um novo programa, que recebe
duas matrizes 3x3 de inteiros e produz uma terceira matriz, o produto das duas primeiras.
Neste programa, precisamos lembrar que o produto de duas matrizes é realizado entre
as linhas da primeira, multiplicadas pelas colunas da segunda. Desta forma, vamos
necessitar de mais um controlador de laço para fazer o somatório destes produtos.
115
ALGORITMOS I
Quadro 43 - :M
#include <stdio.h>
int main(){
int A[3][3], B[3][3], res[3][3];
int i, j, k;
// Realizar a multiplicação
for( i=0; i<4; i++ ){
for( j=0; j<4; j++ ){
res[i][j] = 0;
for( k=0; k<3; k++ ){
res[i][j] = res[i][j] + (A[i][k] * B[k][j]);
}
}
}
// Mostrar o resultado
printf( “\nMatriz resultado:\n” );
for( i=0; i<3; i++ ){
for( j=0; j<3; j++ ){
printf( “\t%d”, res[i][j] );
}
printf( “\n” );
}
Para finalizar esta secção, teremos um novo exemplo. Vamos gerar uma matriz 8x8, a
partir da sua regra de formação:
116
ALGORITMOS I
Este tipo de definição é muito comum na matemática de matrizes e, para ser
implementada, obrigará o programador a testar cada um dos casos para aplicar a regra
correta àquela situação.
Quadro 44 - :MRF
#include <stdio.h>
int main(){
int A[8][8];
int i, j;
SAIBA MAIS
Saiba mais sobre a implementação de matrizes e vetores na linguagem C, as-
sistindo aos vídeos de Gustavo Guanabara e de Eduardo Casavelha. Os links são:
https://www.youtube.com/watch?v=j9473xQ39vY&list=PLHz_AreHm4dmSj0MHol_ao NYCS-
GFqvfXV&index=15
https://www.youtube.com/watch?v=8qbqFsPov3g&t=266s.
117
ALGORITMOS I
CONSIDERAÇÕES FINAIS
118
ALGORITMOS I
EXERCÍCIO FINAL
int main(){
int i, v[10];
for( i =0; i<10; i++ ){
scanf( “%d”, &v[i] );
}
for( i=9; i>0; i-- ){
v[i] = v[i-1];
}
}
Se a sequência de números digitados pelo teclado for: 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, o
conteúdo do vetor v será:
02- Considere o trecho de algoritmo a seguir, que usa uma matriz M[3][3] na sua
execução:
119
ALGORITMOS I
d)
e)
a) 110
b) 0
c) 22
d) 55
e) 50
120
ALGORITMOS I
Nesta matriz, por exemplo, o elemento a0,0 possui o valor 3. A matriz “B”, resultante da
execução do algoritmo acima, tendo a matriz “A” como entrada, é:
a.
b.
c.
d.
e.
121
ALGORITMOS I
REFERÊNCIAS
122
ALGORITMOS I
uniavan.edu.br
124
XXXX