CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA CELSO SUCKOW DA FONSECA
CAMPUS PETRÓPOLIS
CURSO TÉCNICO EM TELECOMUNICAÇÕESINTEGRADO AO ENSINO MÉDIO
Apostila 1 de
Introdução à Programação
Eixo Temático: Computação
Objetivos: • Conceituar algoritmos e estruturas de
dados• Introduzir as estruturas básicas de
controle• Apresentar a programação estruturada
como metodologia para desenvolvimentode algoritmos
• Introduzir uma linguagem de expressãode algoritmos e uma alternativa gráficaequivalente (fluxograma)
• Despertar a capacidade de descrever umpadrão de comportamento através dealgoritmos
• Capacitar o aluno na implementação deprogramas estruturados
Programa: • Conceitos de algoritmos e estruturas de
dados• Estruturas básicas de controle de fluxo• Técnicas de Programação estruturada• Portugol e Fluxograma
Petrópolis, 1ª Edição - 2016.
Este material trata de forma resumida os principais tópicos da disciplina. Osassuntos contidos neste guia não são abordados de forma exaustiva. Este guia de estudostem o objetivo de orientar o aluno nos tópicos da disciplina.
O aprofundamento da matéria se dará através das notas de aula e dasatividades sugeridas em classe pelo professor. Além disso, através da bibliografia indicada,o aluno poderá encontrar material suficiente para um estudo mais abrangente e umapesquisa mais dirigida.
O conteúdo deste material será útil exclusivamente para os alunos do 1º ano doCurso Técnico em Telecomunicações Integrado ao Ensino Médio, para utilização em sala deaula.
Este trabalho foi licenciado com uma Licença Creative Commons – Atribuição-Não Comercial – Sem Derivados 3.0 Brasil.
Maiores informações sobre este material e download visite:http://www.telpet.com.br/retondaro
e sobre a licença, visite:creativecommons.org.br.
Guia de Estudos - 2016 Introdução à Programação
1. Fundamentos Data: / /
“Na ciência e em todo trabalho de criaçãonós falhamos repetidas vezes.
Normalmente para cada ideia bem sucedidahá dúzias de outras que não funcionaram .”
John Backus, criador do Fortran e da programação funcional,em seu discurso ao receber o prêmio Charles Stark Draper, 1994.
“A história não é exclusivamente caos ou acaso:existe no comportamento humano
um certo grau de ordem e padrão observáveisde uma regularidade parcialmente previsível. ”The Social Sciences in Historical Study (vários autores)
Definições
1.1 O que é uma Informação? A palavra informação carrega em si diversos conceitos. De maneira geral, a
informação representa a qualidade ou valor de um conjunto de dados agregados, manipuladosou processados. Sempre associamos informação com algo que possa promover ou modificar oconhecimento. Para melhor entendimento deste conceito vamos fazer uma comparação:
Dado x Informação
Por exemplo: 25/12 - É um dado. Apenas pode-se atribuir um valor matemático. Uma fração talvez. Isoladamente, sem um contexto,não se pode arbitrar nada sobre esse valor.25/12, Natal - É uma informação.Aqui já se obtém uma qualificação dos números, fazendo-nos identificá-los como sendo uma data específica do nosso calendário.
A informação gera uma identidade, uma qualidade, uma quantificação, ou ainda,uma especificação de determinado dado, promovendo um conhecimento. Pode ser coerente,verdadeira, influente, ou incoerente, falsa, de pouco valor. Ainda assim, se denota a essênciade algo, é informação.
Para debate:- Como é possível melhorar a informação?
1.2 O que é algoritmo?
Um procedimento metódico, passo a passo e descrito em termos de instruçõestotalmente isentas de ambiguidade, que começa numa condição inicial especificada e terminacom o fornecimento do resultado desejado.
3
Notas Iniciais:
____________________________
____________________________
____________________________
____________________________
____________________________
____________________________
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
O termo algoritmo tem origem na Matemática. A palavra "algoritmo" vem datranscrição europeia do nome do astrônomo e matemático do século IX Al Khwarizmi, deBagdá, que catalogou e aperfeiçoou esses métodos, sendo o inventor de muitos deles.
Sua compilação de algoritmos, Hisab al-jabr w'al-muqabala, é considerada oprimeiro tratado de Álgebra da história. O termo "álgebra", inclusive, vem da expressão al-jabrcontida em seu título.
Um exemplo de algoritmo matemático simples é aquele que aprendemos na escolaprimária para somar dois números inteiros: "escreva os dois números um embaixo do outrocom os últimos dígitos alinhados à direita; some os últimos dígitos; se o resultado for menorque 10, escreva esse número debaixo dos outros dois; se o resultado for maior que 10, escrevao segundo dígito debaixo dos outros dois e inclua o primeiro dígito na soma dos dígitosimediatamente à esquerda...", e assim por diante. O primeiro algoritmo ocidental sofisticado éprovavelmente aquele presente em "Os Elementos", de Euclides, cuja finalidade é encontrar omáximo divisor comum de dois números não negativos.
Nos dias atuais os algoritmos costumam aparecer codificados em notaçõescomplexas chamadas linguagens de programação, e são os elementos constitutivos dosprogramas.
Exemplo:
Algoritmo SOMA_VALORES;inteiro VALOR, SOMA;inícioSOMA 0;←leia (VALOR);enquanto VALOR ≠ 1 faça
SOMA SOMA + VALOR;←leia (VALOR);
fim enquanto;imprima (“O VALOR DA SOMA É: ”, SOMA);
fim.
1.3 O programa
Programar é basicamente construir algoritmos de forma sistemática. O aspecto fundamental nos programas é que eles são formulações concretas de
algoritmos abstratos. Estas formulações são baseadas em representações e estruturasespecíficas de dados.
Tais estruturas são representações das informações do problema a ser resolvido.Formular algoritmo e definir estruturas de dados apropriadas são tarefas intimamente ligadas.
Num algoritmo/programa devemos distinguir claramente dois aspectos: estático edinâmico.
• O aspecto estático de um algoritmo consiste no texto contendo as instruções a seremexecutadas. Esse texto representa concretamente o algoritmo e tem um caráteratemporal, estático.
• O aspecto dinâmico de um algoritmo está além do texto. Está nos efeitos da execuçãode cada instrução no tempo, dado um conjunto de valores iniciais.
De fato, a grande dificuldade na criação e no entendimento de algoritmos está noproblema do relacionamento desses aspectos, ou seja, como entender e visualizar asestruturas dinâmicas das possíveis execuções do algoritmo a partir da estrutura estática do seu
4
Guia de Estudos - 2016 Introdução à Programação
texto.Para facilitar, limitamos a quantidade de estruturas de controle em um algoritmo em
poucas sequências simples, alternativas e repetições. Uma ação é um evento que ocorre numperíodo de tempo finito, estabelecendo um efeito intencionado e bem definido.
Exemplos:“caminhar até a próxima esquina”“descascar batatas”
Outra coisa importante a considerar é que o efeito de uma ação não pode serimprevisível. O estado de um objeto no tempo são as propriedades que são relevantes paranós na situação considerada. Por exemplo: batatas com casca ou descascadas. No caso deum programa, podemos considerar um determinado valor num certo instante da execução.
Quando consideramos um evento como uma sequência de ações, cujo efeitoacumulado é igual ao efeito do evento total, falamos de um processo sequencial, ousimplesmente de um processo.
Para descrever um evento, inicialmente, usamos a forma de relato de umobservador.
Por exemplo, para o evento “a cozinheira descasca as batatas para o jantar”, asações podem ser separadas por “;” e descritas na seguinte sequência:
“traz a cesta com batatas para a cozinha” ;EV1 “pega a panela no armário” ; “descasca as batatas”.
Suponhamos que EV1 seja um relato de um observador em um certo dia.No outro dia, a cozinheira novamente descasca as batatas para o jantar, e o
observador descreve o evento com um relato idêntico.Podemos dizer que os dois relatos descrevem o mesmo evento? - Não, pois trata-
se de eventos distintos, ocorridos em dias diferentes, com batatas diferentes de cada vez.Por outro lado, os dois eventos são muito similares, a tal ponto que os dois podem
ser descritos com o mesmo relato e que concordamos em dar aos dois eventos o mesmonome: “a cozinheira descasca as batatas para o jantar”. Que é que os dois eventos tem emcomum? - Neles reconhecemos o mesmo padrão de comportamento.
Então dizemos que, em todo evento podemos reconhecer um padrão decomportamento, fazendo abstração dos possivelmente diferentes estados iniciais e efeitos.Inversamente, cada vez que o padrão de comportamento é “seguido” o evento ocorre. O efeitode um evento está totalmente determinado pelo padrão de comportamento e eventualmentepelo estado inicial.
Por exemplo:Nas diferentes execuções da operação n2 , para diferentes valores de n, podemos
reconhecer um mesmo padrão de comportamento, e o nome que damos a todos os eventos é“elevar um número ao quadrado”. Neste caso, o estado inicial é dado pelo valor de n, e o efeito,pelo valor obtido multiplicando-se esse valor por si mesmo.
Exercício:Qual o padrão de comportamento utilizado para gerar a sequência: 1, 5, 9, 13, 17, 21, 25 ?
Resposta:A partir do valor inicial 1, cada termo seguinte é obtido somando-se 4 ao termo anterior.
5
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
1.4 A lógica formal
A lógica é uma ciência antiga, intimamente ligada à filosofia e à matemática. Otermo lógica se origina da palavra grega logos que significa “verbo”, “palavra”, “pensamento”,“razão”. Aristóteles entendia que a lógica é a ciência da demonstração. De forma resumida,podemos dizer que a lógica se preocupa com a formatação de um raciocínio, ou com a maneiraque uma ideia pode ser expressa, a fim de possibilitar uma conclusão sobre determinadopensamento em busca da verdade.
Simplificadamente, a lógica pode ser dividida em lógica formal e lógica material.A lógica formal não depende das verdades de cada premissa, mas da relação
destas com a conclusão, afim de determinar se elas podem sustentar a conclusão. Nesse caso,para a lógica formal, todas as premissas são verdadeiras.
Os dois tipos de argumentação usados na lógica formal são: a dedução e aindução. O método lógico dedutivo parte de fatos ou eventos universais ou mais genéricos,para concluir os mais particulares. O método indutivo analisa os fatos ou eventos particularesou específicos para concluir uma hipótese mais geral, abrangente, universal, genérica.
Exemplos:
a) Dedução“Todos os humanos são mortais.”“Todos os petropolitanos são humanos.”“Todos os petropolitanos são mortais.”
b) Indução“A macieira é uma fruteira.”“O limoeiro é uma fruteira.”“A laranjeira é uma fruteira.”“A macieira, o limoeiro e a laranjeira são árvores.”“As árvores são fruteiras.”
Note que, apesar da indução ser um processo natural, suas conclusões podem serperigosas, pois generalizar premissas verdadeiras podem levar a uma falsa conclusão. Nessecaso, não se pode dizer que a conclusão do argumento é uma verdade.
Já que os argumentos dedutivos são considerados válidos pela forma lógica e nãopelo conteúdo dos seus enunciados, é neste método que se baseia a lógica de construção dealgoritmos.
1.5 O Fluxo de Controle
O conceito que relaciona o aspecto estático de um algoritmo com o seu aspectodinâmico, é o de fluxo de controle. Ele determina em cada passo da execução qual é opróximo comando a ser executado. A ordem de execução dos comandos, geralmente não é amesma ordem descrita no texto estático.
Compreender a lógica de um algoritmo significa visualizar os processos (sequênciade comandos) que serão executados, dependendo do fluxo de controle.
Vejamos a seguir, um exemplo que utiliza apenas as estruturas básicas de controle:sequência e alternativa:
6
Guia de Estudos - 2016 Introdução à Programação
se a > 15 { a > 15 }então
x x * 4;←y y + 3;←
senão se a > 10 { 10 < a ⩽ 15 }então
x x * 3;←y y + 2;←
senãox 0;←y 0;←
fim se;fim se;
Neste exemplo, as sequências simples são comandos de atribuição de valorrepresentados pelo símbolo “←”. Portanto, x ← x * 4, equivale a ação de multiplicar x por 4 eatribuir o novo resultado a x.
As alternativas são representadas por estruturas condicionais “se”, onde: “se a >15” , indica que as instruções seguintes serão executadas se esta condição for verdadeira.
Os símbolos “{}” apenas representam comentários que facilitam o entendimento daação ou explicam o efeito esperado. Comentários não fazem parte do aspecto dinâmico doalgoritmo.
E, por último, a identação é o recuo à esquerda, antes de cada instrução, paraindicar que se uma instrução está “identada”, ou seja, mais à direita que a anterior, ela édependente de sua execução. Dizemos que esta última instrução está “aninhada”. Noexemplo, a instrução “x ← x * 3” só será executada, se a > 10 e a ⩽ 15, pois está aninhada nasegunda instrução alternativa “se”.
1.6 A Linguagem de Programação
Uma linguagem de programação é uma notação técnica que permite a construçãodos programas expressando o seu raciocínio algorítmico, bem como a sua execução por umcomputador.
Existem algumas metodologias de programação: estruturada, orientada a objetos,orientada a eventos, e outras menos populares.
Para o facilitar o aprendizado, introduziremos a programação estruturada, com umalinguagem de programação de alto nível. A linguagem de alto nível recebe esta denominação,por ser baseada em uma notação sintática bem próxima da linguagem natural do programador,fazendo-se uso da lógica formal.
A metodologia de programação estruturada é fundamentada na busca pela reduçãoda complexidade da escrita dos programas e a sua devida modularização, permitindo umaverificação mais fácil dos processos a serem executados, bem como a sua ideal manutenção.
Para a programação estruturada deve-se estabelecer a metodologia derefinamentos sucessivos, ou seja, um desenvolvimento de cima para baixo (top-down).
O desenvolvimento top-down é conhecido como “dividir para conquistar” pois éimplementado da seguinte forma:
1. Descreve-se o processo de raciocínio geral (algoritmo);2. Utiliza-se estruturas genéricas abstratas para a representação de dados;3. Divide-se o programa em categorias relevantes do problema;4. Refina-se cada fase anterior, obtendo uma codificação mais detalhada;5. Após o detalhamento de cada nível do programa, este pode ser implementado
diretamente em uma linguagem de programação.
7
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
2. Expressão sintática e semântica Data: / /
“Ciência da computação tem tanto a ver com o computador
como a Astronomia com o telescópio, a Biologia com o microscópio, ou
a Química com os tubos de ensaio. A Ciência não estuda ferramentas,
mas o que fazemos e o que descobrimos com elas."”
Edsger Dijkstra.
Dijkstra foi o principal contribuidor no final dos anos 1950 para o desenvolvimento do ALGOL,
uma linguagem de programação de alto nível, modelo de clareza e rigor matemático.
Ele é um dos maiores expoentes na arte e ciência das linguagens de programação, e contribuiu enormemente para a compreensão de sua estrutura, representação, e implementação.
Seus quinze anos de publicações vão de artigos teóricos na teoria dos grafos até manuais, textos expositores, e filosofia contemplativa no campo das linguagens de programação.
Estruturas básicas de controle de fluxo
2.1 Sintaxe e semântica
Em toda linguagem, as sentenças construídas envolvem dois aspectos: a sintaxe ea semântica. A sintaxe tem a ver com a forma e a semântica com o conteúdo.
Para a elaboração de algoritmos consideramos aqui uma pseudo-linguagem deprogramação, parecida com a linguagem natural (português) e com expressões sintáticasbaseadas no Algol e Pascal. Esta pseudo-linguagem é conhecida como “Portugol”.
Considerando a pseudo-linguagem Portugol, cada estrutura de controle pode terum significado específico ao representar um evento.
Para atingir o objetivo de construir um bom algoritmo, cada estrutura em Portugoldeve ser aceita e respeitada como padrão, sob o risco do evento não poder ser executado, ouexecutar com erro de semântica.
A seguir, seguem-se as sintaxes das principais estruturas em portugol:
IDENTIFICADOR – é o elemento básico da linguagem, ele representa o nome deuma estrutura, principalmente, uma variável.
Sintaxe: Qualquer nome ou palavra, iniciadas por letras sem a separação porespaços.
Exemplos válidos: A15, IDADE, MENOR, XTOTAL, X2, PRIMEIRO_NOME.Exemplos inválidos: 20X, MAIOR PESO, %3K
VARIÁVEL – representa a identidade de um espaço de armazenamento deconteúdo/valor específico. Se precisamos armazenar um determinado valor X, podemos alocarum espaço denominado X. Como o conteúdo de X pode ser modificado ao longo do programa,dizemos que X é a variável.
Exemplo: x 4; { o valor 4 é armazenado em X }←
COMENTÁRIOS – O texto do programa é chamado de código-fonte.Simplificadamente, chamamos apenas de código. Como já mencionado anteriormente, oscomentários são elementos da pseudo-linguagem que não serão interpretados comocomandos, portanto não fazem parte do aspecto dinâmico do algoritmo. Só servem para ajudarna leitura e na manutenção futura do código.
Geralmente, em Portugol, os comentários são identificados por estarem entre
8
Notas Iniciais:
____________________________
____________________________
____________________________
____________________________
____________________________
____________________________
Guia de Estudos - 2016 Introdução à Programação
chaves { }. Porém, a pseudo-linguagem nos dá a liberdade de expressamos de outras formas.Exclusivamente para este material, usa-se a notação // <comentário> ou /* <comentário>*/ , por ser a forma exclusiva da linguagem C que será usada no segundo ano.
Exemplos:notação geralmente utilizada (observe para futura consulta na bibliografia):x 4; { x é atualizado com valor 4... }←notação exclusiva, utilizada a partir daqui:x 4; // x é atualizado com valor 4... ←notação exclusiva, utilizada com comentários que ocupam mais de uma linha:x 4; /* x é atualizado← com valor 4... */
TIPOS DE DADOS – basicamente, em Portugol, podemos declarar as variáveis em4 tipos: Inteiro, Real, Caracter e Lógico. A declaração das variáveis é uma terefa de extremaimportância, pois trata-se de reservar um espaço na “memória do computador” (neste caso acomputação ainda é feita no papel) para armazenar os dados.
Os dados precisam ser armazenados de forma a permitir o fácil acesso ao seuconteúdo/valor. Estas estruturas de armazenamento e de acesso, devem ser pensadas eestabelecidas para permitir esta ação com segurança, rapidez e integridade. Estas estruturassão chamadas de estruturas de dados. São estruturas abstratas que permitem uma alocaçãode dados ideal para determinada situação.
Os tipos de dados em Portugol são as estruturas de dados mais simples queexistem. Adiante outras estruturas mais complexas serão abordadas.
INTEIRO: qualquer número inteiro, negativo, nulo ou positivo. Ex.: -4, 0, 46REAL: qualquer número real, negativo, nulo ou positivo. Ex.: -4, 0, 46, 2.3, -1.57CARACTER: qualquer conjunto de caracteres alfanuméricos, também conhecidos
como strings. Ex.: “AB”, “ “, “LARANJA”LÓGICO: assume os valores FALSO ou VERDADEIRO como resultados de
expressões lógicas.As declarações de variáveis são escritas antes de qualquer comando e são
separadas por tipos de dados e suas respectivas variáveis. Exemplo: para um algoritmo quenecessite tratar dois dados inteiros, dois dados lógicos e um dado caracter, 5 variáveis devemser declaradas e associadas a eles com a seguinte sintaxe:
inteiro: X, Y; lógico: CADASTRADO, TERMINADO;caracter: NOME;
COMANDO DE ATRIBUIÇÂO – vide exemplo de variável acima. É o comando maisbásico. Com este comando, pode-se atribuir um valor/conteúdo à uma variável.
Exemplo: a 5;←
OPERADORES ARITMÉTICOS – são símbolos usados para representar operaçõesaritméticas. São eles: + (soma), - (subtração), * (multiplicação), / (divisão), mod (resto de umadivisão), raiz (raiz quadrada), ** (exponenciação);
Exemplo: a (5 ** 3) + 4; //cinco elevado ao cubo mais 4←
OPERADORES LÓGICOS – são símbolos usados para representar conectivos emoperações lógicas. São eles: e (para conjunção), ou (para disjunção), não (para negação);
Exemplo: a não(TERMINADO ou CADASTRADO);←
OPERADORES RELACIONAIS – são símbolos usados para representarconectivos relacionais. São eles: = (igual), <> (diferente), >=, <=, >, e < .
Exemplo: x (a <= 10) ou (b <> 5);←
9
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
PROCESSAMENTO DE ENTRADA E SAÍDA – são comandos básicos utilizadosno algoritmo para receber valores de entrada, geralmente fornecidos pelo usuário, e armazená-lo em diretamente em uma variável e também para gerar uma saída que geralmente é umaimpressão de um resultado na tela.
Exemplo de entrada: leia(A);/* o usuário fornece um valor via teclado e este é armazenado na variável A. */
Exemplo de saída: escreva(“TESTE ”,A); // será “impresso” na tela a palavra TESTE // seguida do conteúdo da variável A.
ALTERNATIVA OU DESVIO CONDICIONAL – são blocos de código queselecionam a sequência de comandos a serem executados, dependendo do resultado daexpressão lógica que é utilizada como condição para a avaliação.
Exemplo: se a > 10então
x x * 3;←senão
x 0;←fim se;
REPETIÇÃO COM TESTE NO INÍCIO – são blocos de código que permitem aexecução repetitiva de determinada sequência de comandos, dependendo do resultado doteste condicional da expressão lógica.
Exemplo: a 0;←enquanto (a < 2) faça
escreva (“Contando...”,a);a a + 1;←
fim enquanto;
Neste caso será “impresso” na tela: Contando... 0Contando... 1
Observação: caso o teste inicial seja FALSO, nenhum comando dentro do enquantoserá executado.
2.2 Metodologia de Desenvolvimento
Iniciar o desenvolvimento de um algoritmo para resolver um determinado problemapode ser algo difícil. Para auxiliar nesta tarefa podemos seguir os seguintes passos:
1) Leia cuidadosamente a especificação do problema até o final quantas vezes
10
Guia de Estudos - 2016 Introdução à Programação
for necessário e faça anotações;2) Determinar as saídas exigidas na especificação do problema;3) Determinar as entradas citadas na especificação do problema;4) Verificar se é necessário gerar valores internamente ao algoritmo e verificar
se os valores de entrada precisam ser inicializados com algum valor;5) Determinar todas as transformações necessárias nos dados a fim de obter
os resultados para o problema;6) Testar cada passo do algoritmo, verificando as transformações ocorridas
com os dados e fazer anotações. Esta é a fase de depuração e análise. Nesta faze pode-sealterar comandos ou adaptar estruturas;
7) Reavaliar tudo.
Analise o método acima a partir do exemplo a seguir.
2.3 Fluxogramas
Fluxograma é um tipo de diagrama esquemático que representa bem o aspectodinâmico de um algoritmo. O fluxo de execução, bem como as estruturas de controle sãoevidenciadas e é possível compreender a semântica da solução.
As notações usadas em um fluxograma são:
Marca o início e o fim do algoritmo
Denota um processo/comando
Representa um desvio condicional
Usado como conector. Geralmente, marca o fim de um bloco
Representa um bloco de repetição, com condição inicial.
Entrada e Saída
11
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
Em toda linguagem, as sentenças construídas envolvem dois aspectos: a sintaxe ea semântica. A sintaxe tem a ver com a forma e a semântica com o conteúdo.
Vejamos uma comparação, entre as duas expressões (texto e gráfico) utilizando asestruturas já conhecidas até então:
Problema: “Achar o maior e o menor número de uma série de númerospositivos fornecidos pelo usuário” (nota: existe pelo menos 1 número)
PORTUGOL:
Algoritmo MAIOR_E_MENOR;
inteiro: MAIOR, // conterá o maior valorMENOR, // conterá o menor valorVALOR; // será o valor lido
início
leia (VALOR);
MAIOR VALOR;←
MENOR VALOR;←
enquanto VALOR 0 ≠ faça // admitindo que 0 é o// último valor
se VALOR > MAIORentão
MAIOR VALOR;←senão se VALOR < MENOR
entãoMENOR VALOR;←
fim se;fim se;
leia (VALOR);
fim enquanto;
escreva (MAIOR, MENOR);
fim.
12
Guia de Estudos - 2016 Introdução à Programação
FLUXOGRAMA TRADICIONAL:
13
início
leiaVALOR
MAIOR VALOR←
VALOR ≠ 0
VALOR >MAIOR
MENOR VALOR←
VALOR <MENOR
MENOR VALOR←MAIOR VALOR←
leiaVALOR
escrevaVALOR
fim
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
Exercícios
1) Construir um algoritmo para gerar e imprimir N termos da série deFibonacci: 1, 1, 2, 3, 5, 8, 13, 21, … N deve ser informado pelo usuário e N >= 2
2) Construir um algoritmo para calcular a média de um conjunto devalores inteiros e positivos fornecidos pelo usuário. Como flag, pode-se assumir o valor-1. Expressar o algoritmo em Portugol e em Fluxograma.
3) Escrever um algoritmo para calcular o fatorial de um número Nfornecido pelo usuário. Expressar o algoritmo em Portugol e em Fluxograma.
4) Escrever em Portugol o trecho de algoritmo equivalente ao fluxogramaa seguir:
a)
14
X ← 3
Y < 30
Y ← Y + 3
X ← X + 1
Escreva (y)
Guia de Estudos - 2016 Introdução à Programação
3. Técnica de Refinamentos Sucessivos Data: / /
“A correta especificação do problema,a análise dos requisitos de entrada e saída,
o reconhecimento de padrões ea documentação detalhada
são as principais ferramentas do programador. ”
Luis Retondaro
3.1 Refinamentos em Fluxogramas
A expressão gráfica dos algoritmos em Fluxogramas torna mais claro ocontrole de fluxo. Entretanto, o uso inadequado dos fluxogramas tradicionais, pode“desestruturar” a solução se determinados cuidados não foram tomados.
Vamos analisar o caso a seguir:Trata-se do exemplo de um algoritmo e seu correspondente fluxograma. As
possíveis instruções/ações/comandos são representados por instruções numeradasiniciadas pela letra “C”; Já as expressões lógicas necessárias para satisfazerdeterminadas condições (alternativas) são iniciadas pela letra “L”. Repare que nãoimporta saber quais condições ou que tipo de comandos serão executados, apenasinteressa refletir sobre a estrutura do algoritmo.
Algoritmo EXEMPLO_ESTRUTURADO;// declaração de variáveis;
inícioC1;se L1;então
C2;enquanto L2 faça
C3;C4;
fim enquanto;senão
enquanto L3 façaC5;se L4então
se L5então
enquanto L6 façaC6;C7;
fim enquanto;fim se;
senãoC8;
15
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
C9;fim se;C10;
fim enquanto;C11;
fim se;C12;
fim.
16
Guia de Estudos - 2016 Introdução à Programação
Para verificar se o fluxograma tradicional está estruturado, substitui-se osconjuntos de comando que contêm uma única entrada e uma única saída, por “caixas-pretas”.
17
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
Observe o último estágio de análise: com um algoritmo não estruturado nãoteria sido possível fazer a decomposição. Este é um método para testar se um dadofluxograma é estruturado ou não.
18
Guia de Estudos - 2016 Introdução à Programação
Exercício:Analisar o fluxograma a seguir. Verificar se ele é um fluxograma estruturado
ou não. Se não for, mostrar como é possível torná-lo estruturado.
19
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
4. Estruturas de dados homogêneos Data: / /
Vetores
4.1 Uso
Para dados enumerados em grande quantidade sendo o meso tipo deconteúdo para cada valor, pode-se ao invés de criar inúmeras variáveis daquele tipo,criar uma única estrutura que possa indexar os valores e permitir o fácil acesso a cadaum. Esta estrutura é denominada vetor e é um tipo abstrato de dados criado peloprogramador.
Por exemplo, quando se deseja calcular a média das notas dos 80 alunos deuma classe, pode-se criar um novo tipo vetor de 80 posições numéricas, assim:
tipo tipo_vet = vetor [1..80] inteiro;tipo_vet : MEU_VETOR ;
“MEU_VETOR” é uma variável do tipo que criei (tipo_vet), que é um vetor.
1 2 3 4 80
Introduzindo outra estrutura de controle de fluxo – Repetição indexada.
REPETIÇÃO COM VARIÁVEL DE CONTROLE INDEXADA – são blocos de códigoque permitem a execução repetitiva de determinada sequência de comandos, baseada nasvariáveis de controle. A variável deve ser inicializada e será incrementada a cada loop (blocode repetição) até atingir o valor limite. Após isso o fluxo de controle abandona o loop.
Exemplo: para i de 1 até 5 passo 2 faça
escreva (“Contando...”,i);fim para;
Neste caso será “impresso” na tela: Contando... 1Contando... 3Contando... 5
Na maioria dos casos não será necessário especificar o passo, pois oincremento será de uma unidade. Neste caso, a sintaxe ficaria assim:
para i de 1 até 5 faça
Repare que não há necessidade de incrementar a variável através de umcomando de atribuição (comumente: i = i + 1), pois na estrutura para isto é implícito.
20
5,0 6,5 8,0 7,2 . . . . . . . . . 6,0
Guia de Estudos - 2016 Introdução à Programação
Exemplo de manipulação de vetores:
– O que será impresso no algoritmo abaixo? (qual será a saída?)
Algoritmo EXEMPLO_VETORES;i : inteiro;tipo v = vetor [1..6] inteiro;tipo c = vetor [1..6] caracter;v : VE;c : CA;
inícioVE [1] ← 1;VE [2] ← 1;VE [3] ← 2;VE [4] ← 2;VE [5] ← 5;VE [6] ← 6;CA [1] ← “SEG”;CA [2] ← “TER”;CA [3] ← “QUA”;CA [5] ← “SEX”;CA [6] ← “SAB”;para i de 1 até 6 passo 3 faça
escreva (CA [VE [i] ] );fim para;escreva (CA [ VE [ VE [3] ] ]);
fim.
4.2 Ordenação de vetores - Método da Bolha
O método da bolha é um algoritmo clássico de classificação/ordenação, queilustra muito bem o uso de vetores. Esta ilustração facilita o entendimento da estruturade dados e ajuda a implementar outras possibilidades de solução usando vetores.
A ideia é comparar os elementos dois a dois e ir colocando os elementosmaiores nas últimas posições do vetor até obter o vetor classificado. Uma vez que oelemento atinge a mais alta posição do vetor, o tamanho dele é reduzido para continuara classificação na parte restante.
Exemplo:
3 2 4 1
2 3 4 1
2 3 1 4
2 1 3 4
1 2 3 4
21
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
Algoritmo BOLHA;tipo v = vetor [1..30] inteiro;v : VET;inteiro : AUX, // auxiliar para troca de elementos
BOLHA, // indicador de mais alto elemento fora de ordem LSUP, /* indicador do tamanho do vetor a ser pesquisado,
sendo o valor inicial igual a 30 */ J; // indicador do elemento do vetor
inícioleia (VET);LSUP ← 30;enquanto LSUP > 1 faça
BOLHA ← 0;para J de 1 até LSUP - 1 faça
se VET [J] > VET [J+1]então // troca elemento J com J + 1
AUX ← VET [J];VET [J] ← VET [J+1];VET [J+1] ← AUX;BOLHA ← J;
fim se;fim para;LSUP ← BOLHA;
fim enquanto;escreva (VET);
fim.
4.3 Acesso a índices e uso de flags em vetores
É comum uso de variáveis de controle (flags) para limitar o acesso adeterminado índice do vetor, ou até mesmo para permitir o acesso ordenado a taisíndices.
Imagine por exemplo, que se deseja fazer uma busca em um vetor de 128posições. Esta busca deve escrever se existe o elemento procurado no vetor e indicarem qual posição ele está. Uma forma bem eficiente de fazer esta busca é a pesquisabinária, desde que o vetor já esteja ordenado. Nesta pesquisa procuramos o elementoK dividindo o vetor em duas partes e testando em qual das duas ele deveria estar.Procedendo sucessivamente, da mesma forma para a parte provável.
No exemplo da página seguinte pode-se observar as variáveis de controleno acesso aos índices adequados. Observe também que há a introdução de uma outraestrutura de repetição, o repita. Esta estrutura é utilizada da mesma maneira que oenquanto, com a diferença que o teste condicional é realizado somente no final. Istogarante que o bloco mais interno ao repita seja executado pelo menos uma vez, e casoo teste seja verdadeiro ele abandonará o repita. Um exemplo de uso do repita é:
i ← 0repita
escreva (“Programa”,i);i = i + 1;
até (i = 10);Neste exemplo o loop será interrompido quando i = 10.
22
Guia de Estudos - 2016 Introdução à Programação
Algoritmo PESQUISA_BINARIA;tipo v = vetor [1..128] inteiro;v : A;inteiro : COMEÇO, // 1º elemento da parte do vetor a considerar
FIM, // último elemento da parte considerada MEIO, // elemento do meio da parte considerada K; // elemento procurado
inícioleia (A, K);COMEÇO ← 1;FIM ← 128;repita
MEIO ← (COMEÇO + FIM) / 2;se K < A [MEIO]então
FIM ← MEIO – 1;senão
COMEÇO ← MEIO + 1;fim se;
até A [MEIO] = K ou COMEÇO > FIM;se A [MEIO] <> Kentão
escreva (“NÃO EXISTE O ELEMENTO “,K);senão
escreva (K, “ ESTÁ NA POSIÇÃO “, MEIO);fim se;
fim.
23
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
Exercício extra – Matriz
Dado um tabuleiro de xadrez TAB onde, para facilitar a indicação daspedras, vamos convencionar:
1 – PEÕES 2 – CAVALOS 3 – TORRES4 – BISPOS 5 – REIS 6 – RAINHAS0 – AUSÊNCIA DE PEDRAS,
Contar a quantidade de cada tipo de peça no tabuleiro:
6 0 0 5 0 0 1 0
0 1 0 2 0 3 0 2
0 1 1 1 0 1 0 0
0 0 2 0 3 4 4 3
1 0 1 1 0 1 0 0
0 0 1 3 0 4 0 1
1 0 0 0 2 2 2 1
1 5 0 6 0 1 1 0
A saída deve ser:
PEÕES COM 17 PEÇASCAVALOS COM 6 PEÇASTORRES COM 4 PEÇAS… … …… … …
Para este problema, vamos utilizar um vetor OC para contar as ocorrênciasde pedras usando a própria convenção da pedra como indicador para o vetor:
TORRE = 3
+1
OC = 0 1 2 3 4 5 6
Usaremos também um vetor de caracteres com o nome das peças para finsde impressão.
NOMES = 1 2 …
24
PEÕES CAVALOS ...
Guia de Estudos - 2016 Introdução à Programação
Exercícios de ProgramaçãoUtilize o Portugol
Estrutura sequencial
1) Faça um Programa que peça um número e então mostre a mensagem O númeroinformado foi [número].
2) Faça um Programa que pergunte quanto você ganha por hora e o número de horastrabalhadas no mês. Calcule e mostre o total do seu salário no referido mês.
3) Faça um Programa que peça a temperatura em graus Farenheit, transforme e mostre atemperatura em graus Celsius.
• C = (5 * (F-32) / 9).
4) Faça um Programa para uma loja de tintas. O programa deverá pedir o tamanho emmetros quadrados da área a ser pintada. Considere que a cobertura da tinta é de 1 litro paracada 6 metros quadrados e que a tinta é vendida em latas de 18 litros, que custam R$ 80,00 ouem galões de 3,6 litros, que custam R$ 25,00.
➢ Informe ao usuário as quantidades de tinta a serem compradas e os respectivos preços em 3 situações:
➢ comprar apenas latas de 18 litros; ➢ comprar apenas galões de 3,6 litros; ➢ misturar latas e galões, de forma que o preço seja o menor. Acrescente 10% de folga e
sempre arredonde os valores para cima, isto é, considere latas cheias.
Estrutura de decisão5) Faça um Programa que leia três números e mostre-os em ordem decrescente.
6) Faça um Programa que pergunte em que turno você estuda. Peça para digitarM-matutino ou V-Vespertino ou N- Noturno. Imprima a mensagem "Bom Dia!","Boa Tarde!" ou "Boa Noite!" ou "Valor Inválido!", conforme o caso.
7) As Organizações Tabajara resolveram dar um aumento de salário aos seuscolaboradores e lhe contraram para desenvolver o programa que calculará osreajustes. Faça um programa que recebe o salário de um colaborador e oreajuste segundo o seguinte critério, baseado no salário atual:
• salários até R$ 280,00 (incluindo) : aumento de 15% • salários entre R$ 280,00 e R$ 700,00 : aumento de 10% • salários de R$ 700,00 em diante : aumento de 5%
Após o aumento ser realizado, informe na tela: • o salário antes do reajuste; • o percentual de aumento aplicado; • o valor do aumento; • o novo salário, após o aumento.
Estrutura de repetição
8) Faça um programa que, dado um conjunto de N números, determine o menor valor, o maior valor e a soma dos valores.
9) Numa eleição existem três candidatos. Faça um programa que peça o número total de eleitores. Peça para cada eleitor votar e ao final mostrar o número de votos de cada candidato.
25
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
5. Montando uma solução eficiente Data: / /
Simplificação
5.1 Escrevendo comandos simples e observando padrões
Quando vamos escrever um algoritmo, frequentemente temos a dificuldadede esboçar o raciocínio lógico diretamente na linguagem de blocos ou textos emPortugol. Mas o fato é que não precisamos fazer isso de imediato. Depois de pronto,um algoritmo de 300 linhas pode parecer assustador mas quando ainda era umrascunho certamente traduzia apenas ideias encadeadas.
Agora vamos ver um jeito simples de construir um algoritmo a partir doreconhecimento de padrões seguindo os métodos já descritos anteriormente. Namaioria dos casos a solução nasce das próprias declarações do enunciado doproblema. Se você está com muita dificuldade, releia os primeiros capítulos da apostila,observando onde se aplicam as técnicas ali descritas sobre cada evento do algoritmo.
Lembre-se que: Em todo evento podemos reconhecer um padrão decomportamento, fazendo abstração dos possivelmente diferentes estados iniciais e efeitos.Inversamente, cada vez que o padrão de comportamento é “seguido” o evento ocorre. O efeitode um evento está totalmente determinado pelo padrão de comportamento e eventualmentepelo estado inicial.
Para simplificar, cada bloco de eventos semelhantes, cujo objetivo único pode serisolado do restante do algoritmo sem prejudicar o funcionamento, escrevemos funções.
Vamos começar! Siga os passos para atingir a solução.
Exemplo 1Enunciado do problema: Faça uma algoritmo para preencher uma matriz
quadrada de tamanho 4x4 e depois exibir a sua transposta.
1) Preciso entender o enunciado. a) Primeira dificuldade: o que é uma matriz transposta? Resposta:
Dada uma matriz A de ordem m x n, a matriztransposta dela será representada por At de ordem“invertida” n x m.Essa ordem invertida significa que paratransformarmos uma matriz em matriz transposta,basta trocar os elementos das linhas pelo dascolunas e viceversa. Por exemplo:
2 3 4 2 5 8A = 5 6 7 At = 3 6 9 8 9 1 4 7 1
b) Outras perguntas: Como preencher uma matriz? Como obter a sua transposta? Resposta:
Para preencher uma matriz qualquer, precisamosalocar valores a cada elemento dela. Mas não bastaescolher os valores destes elementos, precisamos
26
Guia de Estudos - 2016 Introdução à Programação
saber em qual posição (linha e coluna) ele seráalocado. Em nosso enunciado a matriz 4 x 4 terá 16elementos dispostos em 4 linhas e 4 colunas.
2) Preciso anotar quais são as entradas e seus estados iniciais. O enunciado diz que precisamos preencher uma matriz 4 x 4, então como entradado algoritmo precisaremos de 16 números inteiros (assumimos que é uma matriz deinteiros, pois o enunciado não especifica). Neste caso, os 16 números serão alocadosem cada posição da matriz.
3) Preciso saber de antemão quais serão as saídas e seu estado final. O enunciado diz que precisamos obter uma matriz transposta da original. Istosignifica que teremos como saída uma outra matriz 4 x 4, com 16 números inteirosalocados nas posições correspondentes à transposição da matriz original.
4) Preciso associar eventos/ações que serão aplicadas às entradas a fim de obteràs saídas. Neste momento, precisamos observar os dados de entrada e ir produzindomanualmente a solução esperada a fim de tentar reconhecer um padrão decomportamento. Fazemos isso para qualquer complexidade de algoritmo. Para assoluções mais complexas, ou que exijam muitas variáveis, podemos seguir o mesmoraciocínio com a ajuda também de uma teste de mesa.
Uma forma simples de fazer isso poderia ser o descrito abaixo. Suponha que eucomece a descrever a minha solução assim:
Vou chamar a minha matriz original de A, e vou alocar 16 elementos nela.Quero que ela tenha esta configuração:
1 2 3 4 6 7 8 9 1 1 1 2 3 4 5 5
então penso em fazer isso: A[1,1] 1; A[1,2] 2; A[1,3] 3; A[1,4] 4;← ← ← ← A[2,1] 6; A[2,2] 7; A[2,3] 8; A[2,4] 9;← ← ← ← A[3,1] 1; A[3,2] 1; A[3,3] 1; A[3,4] 2;← ← ← ← A[4,1] 3; A[4,2] 4; A[4,3] 5; A[4,4] 5;← ← ← ←
Pronto! Primeira parte do algoritmo já está pronta.Mas tem como otimizar mais o código? Dá para deixá-lo mais genérico esimples?Sim, mas precisamos observar padrões e anotar primeiro:Na escrita acima observei que o primeiro número entre colchete refere-se aoíndice da linha e o segundo número o índice da coluna. Observo também que acada comando, as linhas aumentam mais lentamente que as colunas, ou seja, aslinhas se mantém iguais a cada comando enquanto as colunas vão de 1 a 4.Sendo assim, ao invés de preencher a matriz com um número específico, possosolicitar ao usuário do programa que forneça estes números, de preferência na
27
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
ordem acima.
Então um provável rascunho da minha solução seria:
“Para cada linha da matriz, forneça 4 números, sendo 1 para cada coluna.”
Esta frase traduz a solução proposta e generaliza de maneira a simplificá-la.Agora vamos traduzir esta frase em comandos do Portugol. No primeiromomento, posso ter dificuldades em selecionar os comando adequados, masposso escrever os mais básicos primeiro e aos poucos ir reescrevendo melhor.
Por exemplo: Qual o comando que solicita ao usuário o fornecimento de umdeterminado valor? Resposta: o comando LEIA.Se eu quiser ler um número e alocá-lo em uma matriz denominada A, deveriaentão escrever assim: leia (A [i, j]); , onde i e j representam a linha e acoluna da matriz A quereceberá o número fornecido.Como são 16 elementos meu primeiro rascunho ficaria assim:
leia(A[1,1]);leia(A[1,2]);leia(A[1,3]);leia(A[1,4]);leia(A[2,1]);leia(A[2,2]);leia(A[2,3]);leia(A[2,4]);leia(A[3,1]);leia(A[3,2]);leia(A[3,3]);leia(A[3,4]);leia(A[4,1]);leia(A[4,2]);leia(A[4,3]);leia(A[4,4]);
Depois que eu escrevo estas linhas em meu rascunho, percebo que os comandosão muito repetitivos, onde somente variam as linhas e as colunas da matriz.Neste momento é que eu busco otimizar o código usando uma estrutura derepetição. Se você não está familiarizado com as estruturas do Portugol, nãotente usar estruturas de repetição sem antes ter a certeza de quais são as
28
Guia de Estudos - 2016 Introdução à Programação
partes que serão variadas e quais se manterão intactas durante o loop.
A estrutura que melhor representa a variação de 4 colunas a cada linha, sendoum total de 4 linhas é:
para i de 1 até 4 façapara j de 1 até 4 faça
(*) “ler um elemento e associar a um índice da matriz”fimpara;
fimpara;
O comando que entrará no lugar de (*) é que será repetido. Então a escritafinal será:
para i de 1 até 4 façapara j de 1 até 4 faça
leia (A[i,j]); - Note que para cada 4 j temos 1 i→fimpara;
fimpara;
Pronto! Assim ficou bem melhor!Agora preciso obter a transposta de A.Bem, por definição, basta trocar as linhas e as colunas mas antes devoobservar padrões e anotar. Para isso seria bom desenhar a matriz final jápreenchida e olhar para ela tentando achar algo que me conduza na solução: 1 6 1 3A transposta de A deverá ficar assim: 2 7 1 4 3 8 1 5 4 9 2 5
Colocando as matrizes lado a lado, posso observar o seguinte:
29
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
1) A diagonal principal da matriz não muda. A transposta de A tem os mesmosvalores de A na sua diagonal principal.2) cada elemento da diagonal principal tem índice de linha igual ao índice decoluna, ou seja, i = j. A[1,1], A[2,2], A[3,3] e A[4,4].3) Os elementos que serão alterados estão destacados na figura pelas setas.Observe que estes elementos tem algo em comum. As comparações são sempreentre A[i,j] e A[j,i], veja só:
A[3,1] é igual a 1 e será trocado por A[1,3] que é igual a 3.A[4,2] é igual a 4 e será trocado por A[2,4] que é igual a 8.
Percebeu o padrão? - Cada elemento i,j será trocado pelo seu correspondente j,i.
Desta forma posso escrever o restante do algoritmo realizando estas trocas.Desta vez não vou escrever os comandos um a um. Vou usar o mesmo conceitovisto anteriormente. Então meu rascunho ficaria assim:
para i de 1 até 4 façapara j de 1 até 4 faça
“trocar elementos se eles não forem da diagonal principal”fimpara;
fimpara;
Agora é só substituir o comando interno ao loop pelos seus correspondentesem Portugol. Mas como eu posso dizer em Portugol que o elemento pertence ounão à diagonal principal?- Que tal assim: se (i ? j) então … não está na diagonal principal!→
Então vamos tentar:
para i de 1 até 4 façapara j de 1 até 4 faça
se (i ? j) então “trocar o elemento i,j com o elemento j,i”
fimse;fimpara;
fimpara;
Agora é só substituir o comando interno ao “se” pelo seu correspondenteem Portugol. Teoricamente, o conteúdo de A[i,j] irá ocupar o lugar de A[j,i].
Porém, sabemos que ao alocar um conteúdo em uma variável o conteúdoanterior será perdido, porque aquele o sobrescreverá.
30
Guia de Estudos - 2016 Introdução à Programação
Então preciso tem em mente que antes de sobrescrever um conteúdo em A[j,i],preciso salvar o conteúdo lá existente em uma variável auxiliar.Daí, então meu rascunho fica assim:para i de 1 até 4 faça
para j de 1 até 4 façase (i ? j) então
aux A[j,i];←A[j,i] A[i,j];←
A[i,j] aux;←fimse;
fimpara;fimpara;
Perfeito!Vamos fazer um teste de mesa para verificar.O primeiro elemento avaliado é A[1,1]. Ele será ignorado porque faz parte da matriz principal.O segundo elemento (i = 1 e j = 2) será A[1,2] e será feita a trocaadequadamente com o elemento A[2,1].Ops! Aqui observo um problema… Se A[1,2] será trocado por A[2,1], quandochegar o momento de trocar A[2,1] por A[1,2] a matriz voltará ao conteúdooriginal. Isto significa que haverá uma troca que será destrocada.
Precisamos corrigir este problema. Como fazer?Vamos ao rascunho:
para i de 1 até 4 façapara j de 1 até 4 faça
se (i ? j) então“Verificar antes de trocar se a troca já foi realizada”
aux A[j,i];←A[j,i] A[i,j];←
A[i,j] aux;←fimse;
fimpara;fimpara;
Humm. Para saber se a troca já foi realizada posso usar a seguinte estratégia:1) Se as trocas só são realizadas com i ? j, significa que i > j ou i < j.2) Se eu trocar sempre quando i > j não precisarei trocar quando j > i, pois istofaria o conteúdo voltar ao original.
31
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
Legal! Então meu rascunho seria modificado para:
para i de 1 até 4 façapara j de 1 até 4 faça
se (i ? j) entãose (i < j) então
aux A[j,i];←A[j,i] A[i,j];←
A[i,j] aux;←fimse;
fimse;fimpara;
fimpara;
Muito bem! O teste de mesa agora passa perfeitamente.Mas observe que o segundo “se” (i < j) só será executado se a condição doprimeiro “se” for verdadeira (i ?j).É sabido e notório que sempre que i < j será verdade que i ? j. Desta forma, podemos otimizar o código eliminando o primeiro “se” egarantindo ainda o funcionamento. Veja como ficou o rascunho com estamodificação:
para i de 1 até 4 façapara j de 1 até 4 faça
se (i < j) entãoaux A[j,i];←A[j,i] A[i,j];←A[i,j] aux;←
fimse;fimpara;
fimpara;
Chegamos ao final! Só agora é que vamos escrever o algoritmo completamente e declarar asvariáveis necessárias para ele funcionar.Copiamos tudo, acrescentando as variáveis que usamos nos rascunhos.
Veja a seguir, a solução final para este exercício:
32
Guia de Estudos - 2016 Introdução à Programação
Algoritmo TRANSPOSTA;tipo MAT = matriz [1..4][1..4] inteiro;MAT: A;inteiro: i, j, aux;
início//preenche a matriz quadrada 4x4, conforme o enunciado do problema.para i de 1 até 4 faça
para j de 1 até 4 façaleia (A[i,j]);
fimpara;fimpara;//realiza a troca dos elementos obtendo a matriz transposta.para i de 1 até 4 faça
para j de 1 até 4 façase (i < j) então
aux A[j,i];←A[j,i] A[i,j];←
A[i,j] aux;←fimse;
fimpara;fimpara;
fim.
Seguindo estas dicas você conseguirá resolver qualquer problema eescrever o seu algoritmo. Não se preocupe em escrever todo o algoritmo de uma sóvez e nem se importe em declarar as variáveis de início. Vá construindo sua soluçãoaos poucos. Faça vários rascunhos e vá analisando os padrões e os efeitos de cadabloco de comandos. Não escreva os comandos diretamente. Escreva frases quemanifestam a ação e descrevem cada evento. Não se esqueça do teste de mesa.Releia tudo sempre. Simplifique!
5.2 Usando a técnica com algumas questões de prova
Parabéns por chegar até esta parte. Agora vamos exercitar o queaprendemos.
Considere a questão de prova abaixo e acompanhe mais uma vez a técnicade desenvolvimento do algoritmo:
Numa eleição existem três candidatos. Faça um programa que peça o número total deeleitores. Peça para cada eleitor votar e ao final mostrar o número de votos de cadacandidato.
33
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
Vou começar listando as entradas e as saídas:Entradas Saída
3 candidatosNúmero de votos de cada candidatoNúmero total de eleitores
Voto de cada eleitor
Observações:a) O comando que receberá o voto de cada eleitor será igual em todos os casos.b) Este comando será repetido N vezes, sendo N o número total de eleitores.
Com estas observações posso arriscar um palpite e rascunhar o seguinte:
para i de 1 até N façaleia (VOTO);
fimpara;
Agora podem surgir algumas dúvidas:Quanto vale N?-R.: Será fornecido pelo usuário através de um comando leia.VOTO tem qual tipo de conteúdo? Será um número? Será uma string?-R.: Como o enunciado não deixa claro, posso sugerir que seja um nº sequencial. Assim:VOTO = 1, para o 1º candidato; VOTO = 2, para o 2º candidato, VOTO = 3, para o 3ºcandidato.
Daí eu posso modificar meu rascunho:
leia(N);para i de 1 até N faça
leia (VOTO); “Depois de ler o VOTO devo acumulá-lo ao total do candidato correspondente”fimpara;
Acumular um valor não é simplesmente fazer um comando de atribuição do tipo A 1;←Para manter o valor já existente na variável e acrescentar uma unidade devo fazer:A A + 1;←Seguindo este raciocínio, posso substituir a ação descrita na frase que está internaao loop, pelo comando de atribuição. Mas devo me lembrar que são 3 candidatos,portanto são 3 atribuições distintas.
Sugiro então o seguinte comando:Total_Candidato1 Total_Candidato1 + 1;←Total_Candidato2 Total_Candidato2 + 1;←Total_Candidato3 Total_Candidato3 + 1;←
34
Guia de Estudos - 2016 Introdução à Programação
Então meu rascunho será escrito assim:leia(N);para i de 1 até N faça
leia (VOTO);Total_Candidato1 Total_Candidato1 + 1;←Total_Candidato2 Total_Candidato2 + 1;←Total_Candidato3 Total_Candidato3 + 1;←
fimpara;
Isto não parece correto, pois foi lido apenas um voto e acrescenta +1 para 3 variáveisdiferentes.Cabe então um desvio condicional para testar se o VOTO está vinculado ao candidato1, 2 ou 3.Como somente 1 candidato receberá o voto de cada vez, então o desvio “se” seráaninhado, para evitar que todas as opções tenham que ser testadas. Este aninhamentoé feito através do uso de se..então..senão..se.. etc.
leia(N);para i de 1 até N faça
leia (VOTO);se (VOTO = 1) então
Total_Candidato1 Total_Candidato1 + 1;← senão se (VOTO = 2) então
Total_Candidato2 Total_Candidato2 + 1;← senão se (VOTO = 3) então Total_Candidato3 Total_Candidato3 + 1;← fimse; fimse; fimse;fimpara;
Isto parece funcionar bem, desde que as variáveis que totalizam os votos sejaminicializadas com 0.Total_Candidato1 0;←Total_Candidato2 0;←Total_Candidato3 0;←
Apesar da solução ser eficaz, antes de reescrever o rascunho com a inclusão doscomandos acima, devo observar que:- Quando há muitas variáveis parecidas que armazenam conteúdos idênticos o melhora fazer é substituí-las por um vetor.O vetor também pode ser mais interessante porque se eu quiser ampliar meuprograma para mais de 3 candidatos a alteração é simples: basta aumentar o tamanhodo vetor! Sem o vetor, para aumentar o nº de candidatos eu teria de criar tantas
35
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
variáveis quanto for o nº de candidatos.A ilustração explica melhor:
Vetor TOT que armazena a quantidade de votos de cada candidato:? ? ?1 2 3
Repare que com o vetor temos a facilidade de identificar o voto:Se (VOTO = 1) então
TOT[1] TOT[1] + 1;←
Meu rascunho ficaria então:
leia(N);para i de 1 até N faça
leia (VOTO);se (VOTO = 1) então
TOT[1] TOT[1] + 1;← senão se (VOTO = 2) então
TOT[2] TOT[2] + 1;← senão se (VOTO = 3) então TOT[3] TOT[3] + 1;← fimse; fimse; fimse;fimpara;
Lembre-se de simplificar sempre!Vamos simplificar este código observando um padrão.Repare que quando VOTO = 1, TOT[1] será acumulado; quando VOTO = 2, TOT[2] seráacumulado, e assim sucessivamente…Seria correto então escrever o seguinte:“Para qualquer VOTO, o vetor TOT será acumulado com o índice igual a este VOTO.”Esta frase pode ser escrita também assim:
TOT[VOTO] deverá ser acumulado!Veja como simplificou o código:
leia(N);para i de 1 até N faça
leia (VOTO); TOT[VOTO] TOT[VOTO] + 1;←fimpara;
Porque retiramos os comandos “se”?-R.: porque qualquer que seja o VOTO (1, 2 ou 3) o vetor será acumulado naqueleíndice correspondente. Isso é muito mais simples, concorda?
36
Guia de Estudos - 2016 Introdução à Programação
Agora chegou a hora de escrever a versão final do algoritmo, declarando as variáveisinclusive. Não podemos esquecer de inicializar o vetor TOT com 0...
Algoritmo VOTOS;tipo V = vetor[1..3] inteiro;
V: TOT;inteiro: i, VOTO;
inicio//conta até 3 que é o número de candidatos, inicializando o vetor TOTpara i de 1 até 3 faça
TOT[i] 0;←fimpara;//Lê o nº de eleitores/votosleia(N);//acumula os votos de cada eleitor para cada candidatopara i de 1 até N faça
leia (VOTO); TOT[VOTO] TOT[VOTO] + 1;←
fimpara;
//agora vamos escrever o resultado obtidopara i de 1 até 3 faça
escreva (“Candidato “+ i + “ recebeu “+ TOT[i] + “ votos. “)fimpara;
fim.
Muito bem! Agora treine bastante. E seja criativo!
37
CEFET/RJ – Campus Petrópolis Curso Técnico em Telecomunicações
TAREFAS DESTA SEMANA
Alunos dos Grupos A, B e C: (aprox. 30minutos)- Elaborar algoritmos para os problemas relacionados abaixo nas letras (a, b e c).
Alunos do Grupo A: (aprox. 20minutos)- Elaborar o algoritmo para a letra d.
Alunos do Grupo B e C: (aprox. 30minutos)- Refazer a prova 3º bimestre e apresentar ao professor. O aluno poderá ser convidado a explicar como chegou às soluções das questões.
Alunos do Grupo C: (aprox. 12minutos)- Para cada algoritmo feito, você deve apresentar pelo menos 1 teste de mesa.- Entrevista agendada com o professor.
a) Elaborar um programa que leia duas matrizes A e B, cada uma de duas dimensõescom 5 linhas e 3 colunas para valores inteiros. Construir uma matriz C de mesmadimensão, que seja formada pela soma dos elementos da matriz A com os elementosda matriz B. Apresentar os elementos da matriz C.
b) Elaborar um programa que leia uma matriz A de duas dimensões com 5 linhas e 4colunas. Construir uma matriz B de mesma dimensão, em que cada elemento seja ofatorial de cada elemento correspondente armazenado na matriz A. Apresentar aofinal as matrizes A e B.
c) Elaborar um programa que leia uma matriz A do tipo real de duas dimensões com 8linhas e 6 colunas. Construir um vetor B que seja formado pela soma de cada linha damatriz A. Ao final apresentar o somatório dos elementos da matriz B.
d) Elabore um algoritmo de forma otimizada usando funções para executar o jogo davelha entre dois usuários.
TAREFA PARA O FIM DO ANO
Alunos dos Grupos A, B e C: (aprox. 20horas)- Elabore um algoritmo de forma otimizada para executar o jogo Tetris.
Alunos do Grupo B: (aprox. 4horas)- Projetar as funções que movimentam as peças e apresentar um seminário para osalunos do Grupo C (toda turma vai poder assistir e ajudar).
Alunos do Grupo C: (aprox. 40minutos)- Apresentar o código à toda turma explicando cada função, comando ou declaraçãode variável.
38
Top Related