









Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
conhecimentos básicos de algorítmos com exercicios resolvidos
Tipologia: Exercícios
1 / 15
Esta página não é visível na pré-visualização
Não perca as partes importantes!










A Tabela 1 mostra um histórico sucinto da maneira como o Homem calcula e dos meios que utiliza para facilitar este processo.
Tabela 1: Breve Histórico da Computação Dedos (origem do sistema decimal).
Seixos.
Ábaco.
1617 John Napier Ossos de Napier. Régua de cálculo. 1633 Wilhelm Schickard
Primeira calculadora mecânica.
1642 Blaise Pascal Calculadora mecânica de rodas dentadas de 10 posições. 1694 Gottfried Wilhelm von Leibnitz
Máquina de multiplicar totalmente mecânica.
1728 Basile Bouchon Tear com desenhos programados por folha giratória de papel perfurado. 1859 Charles Babbage Máquina para computar tabelas matemáticas. 1875 Frank Baldwin Máquina para somar, subtrair, multiplicar e dividir a partir de móveis acionados no painel. 1887 Dorr Feld Computômetro – máquina dirigida por chaves. 1890 W.Burroughs Primeira máquina de somar e imprimir. 1890 Herman Holerith Perfuradora de cartões - registrava e classificava números através de furos em cartões; a leitura era feita através de pinos que se encaixavam em localizações específicas. Criada para utilização no censo americano. Empresa origem da IBM (1924). 1920 Caixas registradoras elétricas e máquinas com teclado.
1946 ENIAC (Eletronic Integrator and Calculator), primeiro computador digital eletrônico: 19000 válvulas, 1500 relés, resistores, capacitores, indutores, 200 kW de potência. Memória para até 20 números de 10 dígitos cada um. Programação através de fios e pinos (painel de telefonista). Apenas dados armazenados na memória. 1948 EDVAC (Electronic Discrete Variable Automatic Computer), baseado na proposta de John Von Neumann de uma máquina que armazenava na memória dados e instruções. 1949 UNIVAC, primeiro computador em escala comercial, utilizado com sucesso no censo dos EUA em 1951.
É comum referenciar-se aos computadores com relação ao seu grau de evolução tecnológica em função de gerações. A Tabela 2 dá um resumo das gerações de computadores.
Tabela 2: Gerações de Computadores. Década Geração Características 1940 1ª ENIAC, EDVAC,UNIVAC– Circuitos eletromecânicos e válvulas. 1950 2ª Transistores (Bell Telephone Laboratories, 1948), dispositivos menores com menor consumo de potência, mais robustos e confiáveis. 1960 3ª Circuitos integrados – integração de vários transistores em uma única embalagem (chip) com aproximadamente as mesmas dimensões de um transistor. 1970 4ª Milhares de transistores em uma única pastilha VLSI (Very Large Scale Integration).
1.3. ESTRUTURA BÁSICA DE UM COMPUTADOR
O computador é uma máquina programável capaz de processar informações com grande rapidez. A estrutura básica de um computador é composta de: unidades de entrada, unidades de saída, unidade central de processamento, memória principal e memória secundária.
As unidades de entrada permitem ao computador acessar informações do mundo externo. As informações são traduzidas em códigos que possam ser entendidos pela Unidade Central de Processamento. Exemplos de dispositivos de entrada são: teclado, mouse, tela touchscreen, leitora de cartão magnético, joystick, caneta ótica, scanner de imagens, scanner de código de barras, driver de disquete, driver de CD-ROM, disco rígido (hard disk ou HD), leitora de fita magnética, leitora de cartão perfurado, sensores, etc.
As unidades de saída convertem impulsos elétricos, permitindo a saída de informações para meios externos e possibilitando sua visualização, armazenamento ou utilização por outro equipamento. Exemplos de dispositivos de saída são: impressora, plotadora, monitor ou vídeo, driver de disquete (3 1/2 e 5 1/4 pol), disco rígido (hard disk ou HD), gravadora de fita magnética, emissor de som, controladores, etc.
A Unidade Central de Processamento (UCP) é formada pela Unidade de Controle e Unidade Lógico-Aritmética (ULA). A Unidade Lógico-Aritmética realiza operações aritméticas (adição, subtração, multiplicação, divisão) e operações lógicas (conjunção, disjunção e negação). A Unidade Central de Processamento também é conhecida pela sigla inglesa CPU (Central Processor Unit).
A memória principal do computador é conhecida por RAM (Random Access Memory). Na memória principal estão as instruções que estão sendo executadas e os dados necessários a sua execução. A memória principal também chamada de memória de trabalho ou memória temporária, é uma memória de leitura e escrita (read/write). Suas características são: rápido acesso (da ordem de nanosegundos em computadores mais modernos), acesso aleatório e volatilidade (em caso de falta de energia elétrica ou desligamento do computador há perda de informações).
O computador possui também uma memória chamada ROM (Read Only Memory) onde são guardadas informações para inicializar o computador, ativando o sistema operacional. Esta memória é não volátil, e em geral gravada pelo fabricante e com pequena capacidade de armazenamento. Depois de gravada a ROM não pode ser mais gravada pelo usuário.
A memória secundária ou memória auxiliar é usada para armazenar grandes quantidades de informações. Um exemplo comum de memória secundária são os discos rígidos que são usados para armazenar grandes volumes de informações.
O hardware de um computador consiste dos componentes físicos, tais como a UCP (Unidade Central de Processamento), memória e os dispositivos de entrada/saída (comumente chamados de periféricos) que formam o sistema.
O software refere-se aos programas usados para controlar a operação do hardware para solucionar problemas.
A unidade básica de informação é o bit (binary digit). O bit pode ter valor 0 (desligado) ou 1 (ligado). Esta representação não é usual para seres humanos por envolver grandes seqüências de dígitos binários para representar números decimais. Entretanto esta representação pode ser usada convenientemente por computadores usando circuitos eletrônicos pois os dois valores básicos (0 e 1) são representados de modo confiável e eficiente, pela presença ou ausência de correntes elétricas, cargas elétricas ou campos magnéticos nos circuitos.
Chama-se byte um conjunto de 8 bits. Bytes são usados para representar informações tais como caracter, número e outros tipos de dados. É comum se referir aos seus múltiplos:kilobyte, megabyte e gigabyte.
1 Kilobyte = 1024 bytes 1 Megabyte = 1024 kilobytes = 1048576 bytes 1 Gigabyte = 1024 Megabytes = 1048576 kilobytes = 1073741824 bytes
O ASCII (American Standard Code for Information Interchange), é o código normalmente usado para representar caracteres em computadores. Ele é constituído de 95 caracteres de impressão (gráficos) e 33 caracteres de controle, que são usados principalmente em transmissão de dados e para controle de equipamentos de impressão. Por exemplo os caracteres A maiúsculo e minúsculo são representados em ASCII pelas seqüências:
Letra Binário Decimal
A 01000001 65
a 01100001 97
A memória do computador está subdividida em palavras, que é a menor quantidade de informação endereçável. Uma palavra de computador é um conjunto de bytes. O tamanho da palavra do computador é uma escolha de arquitetura, variando de máquina para máquina. Por exemplo no microprocessador Pentium a palavra é de 32 bits (ou 4 bytes).
1.4. CONCEITOS BÁSICOS
1.4.1. SISTEMA OPERACIONAL
O sistema operacional (SO) gerencia os recursos (hardware e software) do computador, disponibilizando-os de maneira amigável ao usuário. As funções do sistema operacional são: gerenciamento de memória, gerenciamento de processos, gerenciamento de E/S (entrada/saida) e gerenciamento de arquivos. O SO tem como objetivo facilitar o acesso ao hardware, apresentando ao usuário, através de uma interface, uma máquina mais fácil de entender e programar. Exemplos: DOS,Windows, Mac OS, UNIX, Linux.
1.4.2. PROGRAMA
É um conjunto de ações a serem executadas, em determinada ordem, com o objetivo de obter um determinado resultado.
1.4.3. LINGUAGEM DE PROGRAMAÇÃO
É a linguagem usada para escrever o programa, evitando que tenhamos que programar diretamente usando as instruções em linguagem de máquina. As linguagens dividem-se em:
diversos componentes do computador, além de realizar comparações e operações aritméticas.
1.4.4. COMPILADORES
São programas escritos com a finalidade de converter um programa de sua representação textual (código fonte) para a forma executável pelo computador (código objeto). Exemplos: Turbo Pascal, Turbo C++, Delphi.
1.4.5. INTERPRETADORES
São programas escritos com a finalidade de executar diretamente um programa a partir do seu código fonte. As instruções são decodificadas e executadas, através de um ciclo repetitivo. A desvantagem é que isso leva a um tempo de execução maior. Diferentemente dos compiladores, nenhum código é gerado. Exemplo: PHP.
1.4.6. IDE
Do inglês Integrated Development Enviroment (Ambiente Integrado de Desenvolvimento). É um aplicativo gráfico através do qual é possível realizar, de forma unificada, tudo que é necessário para programar: editar o código fonte, compilar,debugar (depurar) e rodar (executar) o programa.
1.4.7. BIT
É a menor unidade de informação que pode ser representada pelo computador. Um bit pode estar resetado (0) ou setado (1).
1.4.8. BYTE
Antes de começarmos a escrita do algoritmo é interessante analisarmos as restrições do exercício. O homem não deve deixar em uma mesma margem do rio: (a) a onça e a paca (senão a onça devorará a paca) e (b) a paca e o maço de alface (senão a paca devorará a alface). O resto tudo é possível. É importante notar que nada foi falado sobre quantas viagens o homem poderia fazer.
Tendo em vista estas restrições já é possível buscar a solução. Inicialmente simplesmente não podemos levar nem a onça e nem a alface, senão uma restrição seria violada. E daí por diante continuaremos sempre tentado nunca violar as restrições.
Uma solução possível, seria:
Pode haver, e há, outra solução para o mesmo problema. Qual seria a outra solução?
2.2. DEFINIÇÃO DE ALGORITMOS
Com base neste exercício podemos dizer que algoritmo é: uma seqüência de ações que, se executadas em ordem, nos permite chegar a um objetivo bem definido.
Em alguns casos, um determinado conjunto de ações precisará ser executado várias vezes, em outros, um determinado conjunto de ações só precisará ser executado caso uma determinada condição seja verdadeira (ou falsa). Para estes casos, existem estruturas condicionais e de repetição que podem ser utilizadas nos algoritmos. Estas estruturas, e exemplos de algoritmos que as usam, serão vistas mais adiante.
Acabamos de explicitar as três estruturas que compõem os algoritmos: seqüência, seleção e repetição. Todo e qualquer algoritmo é sempre desenvolvido através do uso de apenas estas três estruturas. Quando descrevemos algoritmos utilizando estas estruturas de controle os mesmos tornam-se mais claros e elegantes, além de serem mais gerais do que a simples descrição de ações.
Um cuidado adicional ao se criar um algoritmo é com a qualidade do mesmo. Existem qualidades que devem ser buscadas em qualquer algoritmo, que são:
executadas e em que sequência, tornando explícito o maior número possível de informações de forma a evitar a interpretação errônea do algoritmo
todas as situações de exceção
memória, tempo de processamento, etc)
Na nossa disciplina atentaremos as três primeiras qualidades, ignorando a eficiência do algoritmo.
2.3. REFINAMENTOS SUCESSIVOS
Na vida quotidiana, os algoritmos são encontrados freqüentemente: instruções para se utilizar um aparelho eletrodoméstico, uma receita para o preparo de algum prato, o guia de preenchimento da declaração do imposto de renda, a regra para a determinação dos máximos e mínimos de funções por derivadas sucessivas, dentre várias outras.
Um algoritmo é considerado completo se seus comandos forem do entendimento de seu destinatário. Um comando que não for do entendimento do destinatário tem que ser desdobrado em novos comandos, que constituirão um refinamento do comando original.
Considere como exemplo o algoritmo para calcular a multiplicação de matrizes.
Algoritmo Multiplicacao_de_Matrizes Ler as matrizes A e B Calcular C = A x B Mostrar as matrizes A, B e C FimAlgoritmo
Se algum destes comandos não for do entendimento do destinatário, este comando precisa ser refinado.
2.4. ALGORITMOS ESTRUTURADOS
A flexibilidade da utilização de computadores exige que, para cada problema a ser levado ao computador, sejam planejadas as operações correspondentes. Este planejamento deve ser feito antes de se utilizar o computador. Desta forma, antes de se usar um computador para resolver problemas é necessário que se construa antes um algoritmo. Este algoritmo tem que ser, codificado na forma de um programa, transmitido ao computador e armazenado em sua memória, para depois ser posto em execução e conduzir o computador para a solução do problema proposto. O algoritmo deve, portanto, prever antecipadamente todas as situações que possam vir a ocorrer quando for posto em execução.
Se um problema for muito simples e pequeno, não há qualquer dificuldade em desenvolver um algoritmo. Entretanto, com o avanço da tecnologia de hardware, os computadores de hoje em dia têm grande poder de processamento e memória. Com esta evolução, os problemas que estão sendo levados aos computadores são maiores e mais complexos. Por esta razão, surgiram técnicas que permitem sistematizar e ajudar o desenvolvimento de algoritmos para a resolução de grandes e complexos problemas. Estas técnicas são chamadas de desenvolvimento estruturado de algoritmos.
Os objetivos destas técnicas são:
Para atingir estes objetivos o desenvolvimento estruturado preconiza que:
módulos ;
O refinamento sucessivo permite que se aborde o problema de forma mais segura e objetiva. A integração dos módulos é mais perfeita porque o módulo é atacado quando já se estudou claramente o ambiente onde este deve atuar. A divisão por módulos permite contornar a complexidade e, ainda, permite que sejam desenvolvidos de forma independente, inclusive por pessoas diferentes. O uso limitado de diferentes estruturas e comandos, apesar de parecer muito restritiva, são úteis para manter a simplicidade e clareza, sendo estas inestimáveis quando se está fazendo alguma manutenção.
2.5. PORTUGUÊS ESTRUTURADO
A liberdade de expressão é essencial para o desenvolvimento da criatividade em praticamente todas as atividades humanas. Para tanto, o uso da linguagem natural é o que se tem de melhor para expressar os nossos pensamentos. Entretanto, as linguagens naturais vêm com a problemática das ambigüidades e, algumas vezes, de falta de concisão. Uma linguagem formal evita estes problemas, mas limita o poder de expressão. Estamos, portanto, diante de um impasse. A solução é a escolha de uma linguagem que ofereça estruturas adequadas, bem projetadas, com efeitos bem definidos e que, além disso, não restrinjam a criatividade do programador, para tanto, utilizaremos o português estruturado.
A idéia é permitir que com um conjunto básico de primitivas seja possível ao projetista pensar no problema e não na linguagem na qual o algoritmo será implementado e, por outro lado, não fique tão distante desta implementação.
Em toda a linguagem, as frases construídas envolvem dois aspectos: a sintaxe e a semântica. A sintaxe tem a ver com a forma e a semântica com o conteúdo. Considere a seguinte frase, sintaticamente correta (tem verbo, sujeito e objeto, e as palavras estão escritas corretamente), em português:
“ Aqui vendem-se frangos abatidos ”
A semântica correta desta frase é que naquele estabelecimento existe uma venda de frangos já mortos , e não frangos deprimidos ou anêmicos.
2.5.1. IDENTIFICADORES
Os identificadores são nomes dados à variáveis e constantes. Estes nomes devem ser o mais significativo possível, isto é, devem refletir o que está sendo armazenado naquela variável ou constante. Um identificador é formado por um ou mais caracteres, sendo que o primeiro caractere deve, obrigatoriamente, ser uma letra. O restante podem ser letras, números ou o caracter de sublinhado “_”.
2.5.2. CONSTANTES
Uma constante é um determinado valor fixo que não se modifica ao longo do tempo, durante a execução de um programa. Com o propósito de deixar mais claro o algoritmo, algumas vezes são dados nomes (ou identificadores) para as constantes. Esta pode ser um número, um valor lógico ou uma seqüência de caracteres (constante literal).
A constante numérica é expressa na notação decimal, com ou sem parte fracionária, podendo ser positiva ou negativa.
A constante lógica só assume dois valores possíveis: verdadeiro ou falso. As constantes literais englobam qualquer seqüência de caracteres (letras, dígitos ou símbolos especiais).
Estas constantes são representadas entre aspas para que não seja confundida com outro item qualquer.
2.5.3. VARIÁVEIS
Na matemática, sabemos que uma variável é a representação simbólica dos elementos de um certo conjunto. Nos algoritmos uma variável corresponde a uma área de memória do computador, à qual atribuimos um nome, e cujo conteúdo pode variar ao longo do tempo, durante a execução do programa. As variáveis só podem assumir um valor a cada instante.
Toda variável é identificada por um identificador.
Nos nossos algoritmos não precisaremos declarar as variáveis e seus tipos antecipadamente. Ao usá-las estas serão criadas, se necessário, e o tipo atribuído conforme o tipo do valor que ela contém.
2.5.4. COMENTÁRIOS
C caracteres
Este comando permite que se forneça um valor a uma variável, onde a natureza deste valor tem que ser compatível com o tipo da variável. O comando de atribuição tem a forma a seguir:
variável = expressão
A expressão deve ser primeiramente avaliada e depois atribuída à variável. As constantes e variáveis são também formas de expressão mais simples.
2.5.9. COMANDOS DE ENTRADA E SAÍDA
Sabemos que as unidades de entrada e saída são dispositivos que possibilitam a comunicação entre o usuário e o computador. Por exemplo, através do teclado, o usuário consegue dar entrada ao programa e os dados na memória do computador. Por outro lado, o computador pode emitir os resultados e outras mensagens para o usuário através de uma impressora ou do monitor de vídeo. Os comandos de entrada e saída têm a finalidade de fazer esta interação com o usuário.
O comando de entrada é feito de acordo com a seguinte forma geral:
Leia ()
Exemplo:
Leia (codigo_aluno, nota)
O comando de saída tem a forma geral:
Escreva ( e/ou )
Exemplo:
Escreva (“Código do Aluno: ” , codigo_aluno, “Nota: ”, nota)
2.5.10. ESTRUTURA SEQUENCIAL
Em um algoritmo aparecem em primeiro lugar as declarações seguidas por comandos que, senão houver indicação em contrário, deverão ser executados em seqüência. Os algoritmos são iniciados com a palavra Algoritmo e terminados com FimAlgoritmo.
Exemplo:
Algoritmo Exemplo Leia (a, b, c) d = (a + b) x c Escreva (a, b, c, d) FimAlgoritmo
Neste exemplo, os valores de a , b e c são lidos, o valor de d é calculado e os valores contidos nas variáveis a , b e c serão escritos.
2.5.11. ESTRUTURAS CONDICIONAIS
A estrutura condicional permite a escolha do grupo de ações e estruturas a serem executados quando determinadas condições , representadas por operações lógicas, são ou não satisfeitas. Esta estrutura é delimitada pelo comando Se e pela expressão FimSe. Esta estrutura pode se apresentar de duas formas: (a) estrutura condicional simples e; (b) estrutura condicional composta.
A estrutura condicional simples tem a seguinte forma:
Se () Entao FimSe
A estrutura condicional composta tem a seguinte forma:
Se () Entao Senao FimSe
A estrutura de repetição permite que uma seqüência de comandos seja executada repetidamente até que uma determinada condição de interrupção seja satisfeita. A estrutura será delimitada pelo comando Repita e pela expressão FimRepita. A interrupção é feita através do comando Interrompa. Esta estrutura pode ter duas formas: interrupção no início e interrupção no fim.
A interrupção no início tem a seguinte forma:
Repita Se () Entao Interrompa ; FimSe
FimRepita
A interrupção no fim tem a seguinte a forma:
Repita
Se () Entao Interrompa ; FimSe FimRepita
Exercícios - Algoritmos
1) Faca um algoritmo para calcular a média de 3 números.
Solucao
Algoritmo Media
Escreva ( "Digite tres numeros" )
Leia ( n1, n2, n3 )
med = (n1 + n2 + n3) / 3
Escreva ( "Media = ", med )
Fim_Algoritmo
2) Faca um algoritmo para calcular a média de N números.
Solucao
Algoritmo MediaN
Escreva ( "Digite a quantidade de numeros" )
Leia ( n )
cont = 0 # contador
soma = 0 # soma dos numeros digitados
Repita
Se ( cont >= n )
Entao Interrompa
Fim_Se
cont = cont + 1
Escreva ("Digite o ", cont, "º numero")
Leia ( x )
soma = soma + x
Fim_Repita
Escreva ( "Fatorial = ", fat )
Fim_Algoritmo
5) Faca um algoritmo para calcular n!/m!, sem calcular nem n! nem m!.
Solucao
Algoritmo Fatorial
Escreva ( "Digite dois numeros" )
Leia ( m, n )
Se ( m > n )
Entao
p = m
m = n
n = p
Fim_Se
fat = 1 # fatorial
Repita
Se ( n = m )
Entao Interrompa
Fim_Se
fat = fat * n
n = n - 1
Fim_Repita
Escreva ( "n!/m! = ", fat )
Fim_Algoritmo
6) Faca um algoritmo para mostrar uma tabela com o peso considerado normal para pessoas com altura entre 1.60m e 1.90m ( IMC = peso / ( altura * altura ) ). O IMC é considerado normal se estiver entre 18.5 e 25.
Solucao
Algoritmo IMC
min = 18.5 # menor imc normal
max = 25.0 # maior imc normal
h = 1.60 # altura
Escreva ( "ALTURA MINIMO MAXIMO" )
Repita
Se ( h > 1.90 )
Entao Interrompa
Fim_Se
pmin = min * h * h # menor peso normal
pmax = max * h * h # maior peso normal
Escreva ( h, pmin, pmax )
h = h + 0.01 # incrementa a altura em 1 cm
Fim_Repita
Fim_Algoritmo
7) Faca um algoritmo para calcular o seno de um ângulo em graus, com erro inferior a 0.01. Em uma série alternada, o valor do erro é inferior ao valor absoluto do último termo desprezado.
Solucao
Algoritmo Seno
Escreva ( "Digite um numero" )
Leia ( x )
y = PI * x / 180
i = 1 # contador
num = y # numerador
den = 1 # denominador
si = 1 # sinal
ter = num / den # termo
seno = si * ter # primeira aproximacao
Repita
Se ( ter < 0.01 )
Entao Interrompa
Fim_Se
num = num * y * y
den = den * ( i + 1 ) * ( i + 2 )
r = Resto ( x, y )
Repita
Se ( r = 0 )
Entao Interrompa
Fim_Se
x = y
y = r
r = Resto ( x, y )
Fim_Repita
Escreva ( "MDC = ", y )
Fim_Algoritmo
10) Faca um algoritmo para converter um valor decimal em seu correspondente binário.
Solucao
Algoritmo Dec2Bin
Escreva ( "Digite um numero" )
Leia ( n )
str = "" # literal vazio
Repita
Se ( n = 0 )
Entao Interrompa
Fim_Se
r = Resto ( n, 2 )
n = Quociente ( n, 2 )
Se ( r = 0 )
Entao str = "0" + str
Senao str = "1" + str
Fim_Se
Fim_Repita
Escreva ( "Em binario = ", str )
Fim_Algoritmo
11) Faca um algoritmo para calcular os divisores de um número inteiro.
Solucao
Algoritmo Divisores
Escreva ( "Digite um numero" )
Leia ( n )
i = 1
Escreva ( "Divisores" )
Repita
Se ( i > n )
Entao Interrompa
Fim_Se
Se ( Resto ( n, i ) = 0 )
Entao Escreva ( i )
Fim_Se
i = i + 1
Fim_Repita
Fim_Algoritmo
12) Faca um algoritmo para calcular os divisores primos de um número inteiro.
Solucao
Algoritmo Divisores_Primos
Escreva ( "Digite um numero" )
Leia ( n )
i = 2
Escreva ( "Divisores Primos" )
Repita
Se ( i > n )
Entao Interrompa
Fim_Se
Se ( Resto ( n, i ) = 0 )
Entao