Baixe o app para aproveitar ainda mais
Prévia do material em texto
Unidade I - INTRODUÇÃO A ALGORITMOS E LINGUAGENS DE PROGRAMAÇÃO 1 ALGORITMOS I.1.1 DEFINIÇÃO A palavra algoritmo, à primeira vista, nos parece estranha. Embora possua designação desconhecida, fazemos uso constantemente de algoritmos em nosso cotidiano: a maneira como uma pessoa toma banho é um algoritmo. Outros algoritmos freqüentemente encontrados são: Instruções para se utilizar um aparelho eletrodoméstico; Uma receita para preparo de algum prato; Guia de preenchimento para declaração do imposto de renda; A regra para determinação de máximos e mínimos de funções por derivadas sucessivas; A maneira como as contas de água, luz e telefone são calculados mensalmente. São vários os conceitos para algoritmo. Escolhemos alguns para serem apresentados aqui: “Um conjunto finito de regras que provê uma seqüência de operações para resolver um tipo de problema específico.” [KNUTH] “Seqüência ordenada, e não ambígua, de passos que levam à solução de um dado problema.” [TREMBLAY] “Processo de cálculo, ou de resolução de um grupo de problemas semelhantes, em que se estipulam, com generalidade e sem restrições, as regras formais para a obtenção do resultado ou da solução do problema.” [AURÉLIO] Um conjunto de instruções organizadas numa sequência lógica, que conduzem o interpretador a solucionar um determinado problema. ÂNGELO STROLIGO PECLY Resumindo, um algoritmo é uma interpretação, passo a passo, de um determinado problema do mundo real, estabelecendo todos os passos na busca de uma solução. Existem duas técnicas que se completam para melhor documentar o algoritmo: Diagrama de Blocos: consiste em representar a seqüência de operações do algoritmo utilizando símbolos geométricos. Português Estruturado: consiste em transformar o diagrama de blocos numa forma narrativa, denominada pseudocódigo, muito próximo de uma linguagem computacional. I.1.2 CARACTERÍSTICAS Todo algoritmo deve apresentar algumas características básicas: Ter fim; Não dar margem à dupla interpretação (não ambíguo); Capacidade de receber dado(s) de entrada do mundo exterior; Poder gerar informações de saída para o mundo externo ao do ambiente do microcomputador; Ser efetivo (todas as etapas especificadas no algoritmo devem ser alcançáveis em um tempo finito). I.1.3 SOLUÇÃO DE PROBLEMAS O aluno de algoritmos deve ter sempre em mente que a solução de um problema do mundo real não está relacionado à informática, a menos que se queira informatizar tal solução. Observe que, pela afirmação anterior a solução já deve existir para que se possa informatizá-la, ou seja, primeiro deve-se descobrir a solução do problema, independentemente de qualquer ferramenta de informática. A solução de problemas envolve duas principais etapas: Deve-se conhecer/entender muito bem o problema que se deseja solucionar. Estude o problema. Leia sobre o problema. Converse com quem conhece o problema. Enfim, procure dominar o problema; Busque uma solução para problema. Muitas vezes, basta conhecer o problema para solucioná-lo, em outras, deve-se aplicar muito raciocínio lógico para encontrar uma solução. Como já foi dito, algoritmos são utilizados para expressar (escrever, tornar legível por outra pessoa) um raciocínio, logo, de posse da solução, basta representá-la através de algoritmos, ou seja, traduzir a solução encontrada para uma linguagem mais específica e padronizada, para que outras pessoas possam ler o raciocínio utilizado para solucionar o problema. Compreender Solucionar Representação a solução I.1.4 EXEMPLOS Os algoritmos são comuns em nosso cotidiano como, por exemplo, uma receita de bolo. Em uma receita de bolo, está descrita uma série de ingredientes necessários e uma seqüência de passos a serem cumpridos para atingir o objetivo que é ter um bolo pronto. ALGORITMO 1: Receita de Bolo Providencie manteiga, ovos, 2 quilos de massa; Misture os ingredientes; Despeje a mistura na fôrma de bolo; Leve a fôrma ao forno; Espere 20 minutos; Retire a fôrma do forno; Deixe esfriar; Prove. Outra atividade algorítmica comum em nosso dia a dia é o ato de trocar uma lâmpada queimada. Apesar de aparentemente bastante óbvio, muitas vezes fazemos esse tipo de atividade sem percebermos determinados detalhes. Podemos descrever de maneira simples: ALGORITMO 2: Troca de lâmpadas Pegue uma escada; Posicione-a embaixo da lâmpada queimada; Pegue uma lâmpada nova; Suba na escada; Retire a lâmpada velha; Coloque a lâmpada nova, desça e guarde a escada. Já se deparou com alguém lhe abordando na rua e lhe perguntando sobre como chegar a algum lugar? Sua resposta à dúvida desta pessoa nada mais é do que um algoritmo. I.1.5 EXERCÍCIOS 1 - Elabore um algoritmo que mova os três discos da haste “1” para a haste “2” ou para a haste “3”. Só é possível movimentar um único disco de cada vez para qualquer haste, contanto que nunca seja colocado um disco maior sobre um disco menor. O objetivo é transferir os três discos para a haste destino, tal como se apresentam ordenados na haste “1”, conforme a figura a seguir: 2 - Três jesuítas e três canibais precisam atravessar um rio. Para tal, dispõem de um barco com capacidade para duas pessoas. Por medidas de segurança não se permite que em alguma margem a quantidade de jesuítas seja inferior à de canibais. Qual a seqüência de passos que permitiria a travessia com segurança? 3 - Um homem precisa atravessar um rio com um barco que possui capacidade de transportar apenas ele mesmo e mais uma de suas três cargas que são: um lobo, um bode e um mole de alfafa. O lobo e o bode não podem ficar sozinhos em uma margem, pois o lobo comerá o bode. O bode e a alfafa também não podem ficar sozinhos em uma margem, pois o bode comerá a alfafa. O que o homem deve fazer para conseguir atravessar o rio sem perder suas cargas? 4 - Um algoritmo não pode conter um comando como “Escreva todos os números inteiros positivos”. Por quê? 5 – Descreva um algoritmo para trocar o pneu de um carro. 6 – Você dispõe de nove bolas – das quais oito possuem um mesmo peso e uma é mais pesada que as demais – e uma balança. Descreva um algoritmo para descobrir qual é a bola mais pesada, utilizando-se apenas de duas pesagens na balança. 7 – Você está em uma sala que contém três interruptores. Cada interruptor está ligado a uma lâmpada presente em uma sala ao lado. As três lâmpadas estão inicialmente apagadas. Descreva um algoritmo para descobrir qual interruptor está ligado a qual lâmpada, sabendo que você só pode ir uma única vez à sala ao lado. 8 – Como você descreveria um algoritmo para resolver o problema proposto no Exercício 1, porém com quatro discos? I.2 ESTRUTURAS DE DADOS Representação dos dados que serão manipulados pelo algoritmo. Como representar dados? Depende da ferramenta usada na solução; É, geralmente, uma tarefa difícil; Não existe uma única solução; Não existe receita. Os dados utilizados por um algoritmo podem ser muito simples ou muito complexos. Veja os exemplos a seguir: Calcular quantos dias faltam para terminar o ano; Este algoritmo manipula dados inteiros, que nos são bastante familiares, ou seja, são dados simples. Controlar o cadastramento de uma nota fiscal, considerando todo seu cabeçalho assim como todo seus itens. Este algoritmo já deve manipularum tipo de dado bem complexo, principalmente por ser composto de outros tipos de dados e ainda possuir um relacionamento entre o cabeçalho da nota com seus respectivos itens. Resumindo, deve-se exercitar-se bastante, ou seja, aprender com a prática. I.3 PROGRAMAS Um programa nada mais é que um algoritmo expresso numa linguagem formal, Linguagem de Programação. A Linguagem de Programação nos faz um grande serviço, o de traduzir um programa escrito por nós, respeitando a sintaxe da linguagem escolhida, na linguagem reconhecida pelo computador, ou seja, a linguagem binária, que é a única executável pelo computador. I.3.1 O processo de construção de programas: compreender o problema do mundo real; solucionar o problema; formular o algoritmo (representação do comportamento); definir as estruturas de dados a serem usadas (representação da informação); transcrever o algoritmo para a linguagem de programação desejada. Toda linguagem envolve dois aspectos: Sintaxe: forma, a correta escrita dos comandos; Semântica: conteúdo, sequência lógica dos comandos; I.4 LINGUAGENS DE PROGRAMAÇÃO Nós podemos descrever algoritmos através da língua portuguesa, já que o Português é a linguagem que conhecemos e usamos em nossa comunicação. No entanto, os computadores só compreendem uma linguagem composta de combinações entre zero e um, conhecida como linguagem de máquina, que é bastante complicada para nós, seres humanos. Por exemplo, suponhamos que as letras „o‟ e „i‟ sejam reconhecidas pela máquina pelos símbolos 10010110 e 01101001, respectivamente. Vamos supor também que um comando responsável por escrever algo na tela do computador seja 00001111. Pois bem, para escrever a palavra „oi‟ no monitor, seria necessário enviar a seguinte mensagem para o computador: 0000111110010110 01101001 Complicado, não? Dá para se ter idéia que, para descrever um algoritmo ao computador, fazendo uso da linguagem de máquina, é necessário ter ao lado uma lista de códigos compreendidos pela máquina. Além disso, para compreender um algoritmo já escrito em linguagem de máquina, também se torna primordial ter em mãos a mesma lista de códigos. Para eliminar este inconveniente, foram criadas a linguagens de programação. Estas linguagens são formadas por comandos de alto nível, representados por palavras em inglês – já que foram criadas por pessoas oriundas de países de língua inglesa. As linguagens de programação possuem um módulo chamado compilador – ou interpretador, dependendo da linguagem – que é responsável por traduzir programas de computadores em linguagem de máquina. Alguns exemplos de linguagens de programação são: Fortran, Basic, Cobol, Clipper, C e Pascal. Neste documento, abordaremos a linguagem C, por ser bastante poderosa, acadêmica e estruturada. I.5 PORTUGUÊS ESTRUTURADO A partir deste ponto, começaremos a estudar a representação de algoritmos através do Português Estruturado. I.5.1 TIPOS PRIMITIVOS DE DADOS VARIÁVEL Uma variável funciona como um container de algum dado, ou seja, um “lugar” onde podemos guardar um valor para ser utilizado ao longo do algoritmo. A primeira vista, pode soar estranho ter que guardar dados num “lugar” para poder utilizá-lo mais adiante, isso devido ao fato de que em nosso cotidiano fazemos isso de maneira muito automática. Vejamos um exemplo de forma mais minuciosa: Considere o valor 5; Considere o valor 3; Considere a operação de adição; Qual o resultado da operação? Automaticamente dizemos oito, sem pestanejar. Mas o que realmente fizemos? Ao considerar o valor 5, nosso cérebro armazenou este valor em algum lugar em nossa memória. Com o segundo valor aconteceu a mesma coisa, porém o valor 3 foi armazenado num lugar diferente do primeiro valor. Os dois valores não poderiam ser armazenados no mesmo lugar pois o segundo valor sobrescreveria o primeiro. A terceira informação, a operação desejada, também foi armazenada em nossa memória, num terceiro lugar. Ao considerar o comando para efetuar o cálculo, nosso cérebro, de posse de todos os argumentos necessários, efetua o cálculo e também armazena o resultado numa posição de nossa memória. No ambiente computacional, já pensando em como representar o raciocínio acima através de um algoritmo, devemos considerar uma variável como sendo uma referência à uma posição da memória principal do computador, é como se estivéssemos dando nomes às posições de nossa memória (cérebro). Assim sendo, para resolvermos o cálculo acima, precisaremos de três variáveis, as duas primeiras para armazenar os dois primeiros valores e a terceira para armazenar o resultado. O comando de adição, no alto nível de raciocínio em que é escrito um algoritmo, não precisará ser armazenado na memória. Dessa forma, podemos esboçar um pequeno algoritmo: A=5; B=3; C=A+B; Por todo raciocínio descrito acima, o resultado armazenado na variável C é o número inteiro 8. TIPOS DE DADOS As variáveis utilizadas anteriormente respeitam, perfeitamente, as regras impostas pelo Português Estruturado para se descrever algoritmos, porém, antes de utilizar uma variável, devemos antes criá-las, ou seja, requisitar ao computador que reserve uma posição de memória para um determinado tipo de dado e que construa a referência desta posição de memória ao nome dado pelo programador como identificador da variável. Na afirmação acima podemos constatar algumas características fundamentais de uma variável: A posição de memória reservada; Não estaremos preocupados com esta informação no contexto deste curso. O identificador da variável; É o nome que damos à variável para que possamos referenciá-la durante o desenvolvimento do algoritmo. O tipo de dado a ser armazenado. Esta informação é de suma importância, pois cada tipo de dado ocupa um determinado espaço na memória, por exemplo, um número inteiro ocupa menos espaço que um nome de uma pessoa. O nome/identificador de uma variável pode ser uma seqüência de um ou mais caracteres alfabéticos e numéricos, iniciados por uma letra ou ainda pelo caracter „_‟. Os nomes não podem conter outros símbolos gráficos, operadores ou espaços em branco. É importante ressaltar que as letras minúsculas são consideradas diferentes das letras maiúsculas, assim temos como exemplos válidos: a total x2 min_sal _especial VALOR Maximo ExpData Seguindo as mesmas regras temos abaixo exemplos inválidos de nomes de variáveis: 1x Total geral numero-minimo A razão destes nomes serem inválidos é simples: o primeiro começa com um algarismo, o segundo possui um espaço em branco e o terceiro contém o operador de subtração. Além das regras de formação de nome em si (identificadores), uma variável não pode utilizar como identificador uma palavra reservada da linguagem. Desta forma para declararmos uma variável devemos seguir a seguinte sintaxe: tipo nome1 [, nome2 [, nome3 [ …, nomeN]]]; Ou seja, primeiro indicamos um tipo, depois declaramos uma lista contendo um ou mais nomes (identificadores) de variáveis desejadas deste tipo, onde nesta lista os nomes são separados por vírgulas e a declaração terminada por „;‟ (ponto-e-vírgula). No Português Estruturado existem os seguintes tipos de dados: Tipo Tamanho/Formato Descrição Numéricas Int 32-bit complemento a dois Inteiro Real 32-bit IEEE 754 Ponto flutuante Outros tipos Logico 8-bit Tipo booleano(true e false) char 8-bit Um único caracter String 8-bit por caractere Conjunto de caracteres Vejamos alguns exemplos: int i; real total, preco; Também é possível definirmos um valor inicial para uma variável diretamente em sua declaração: int quantidade = 0; real angulo = 1.57; logico ok = false; char letra = „c‟; string nome = “Unesa”; Algumas observações importantes: Um número em ponto flutuante é sempre representado com um “.” (ponto) para separar a parte inteira da fracionária; O dado do tipo char deve ser representado sempre entre aspas simples „‟; O dado do tipo string deve ser representado sempre entre aspas “”; O dado do tipo booleano possui apenas os valores true e false, sempre SEM aspas; COMENTÁRIOS Comentários são trechos de texto, usualmente explicativos, inseridos no programa de forma que não sejam considerados como parte do código, ou seja, são informações deixadas juntamente com o código como informação para quem programa. O Português Estruturado aceita dois tipos de comentários: de uma linha de múltiplas linhas O primeiro, de uma linha, utiliza duas barras (//) para marcar seu início: // comentário de uma linha // tudo após as duas barras é considerado comentário O segundo usa a combinação /* e */ para delimitar uma ou mais linhas de comentários: /* comentário de múltiplas linhas */ OPERADORES Operadores aritméticos Operador Uso Descrição + op1 + op2 Soma op1 com op2 - op1 - op2 Subtrai op2 de op1 * op1 * op2 Multiplica op1 por op2 / op1 / op2 Divide op1 por op2 % op1 % op2 Calcula o resto da divisão inteira de op1 por op2 div op1 div op2 Calcula o quociente da divisão inteira ** op1 ** op2 Calcula op1 elevado à potência op2 Operadores relacionais Operador Uso Retorna verdadeiro se > op1 > op2 op1 é maior que op2 >= op1 >= op2 op1 é maior ou igual que op2 < op1 < op2 op1 é menor que op2 <= op1 <= op2 op1 é menor ou igual que op2 == op1 == op2 op1 e op2 são iguais != op1 != op2 op1 e op2 são diferentes Operadores Lógicos Operador Uso Retorna verdadeiro se && op1 && op2 Ambos op1 e op2 são verdadeiros. Avalia a expressão op1 e condicionalmente avalia a expressão op2 || op1 || op2 Ou op1 ou op2 é verdadeiro. Avalia a expressão op1 e condicionalmente avalia a expressão op2 ! ! op Negação de op Operadores de atribuição Operador Uso Equivalente a = op1 = op2 op1 recebe o valor de op2 += op1 += op2 op1 = op1 + op2 -= op1 -= op2 op1 = op1 – op2 *= op1 *= op2 op1 = op1 * op2 /= op1 /= op2 op1 = op1 / op2 %= op1 %= op2 op1 = op1 % op2 EXERCÍCIOS 1 – Defina variável. 2 – Qual a finalidade de declararmos uma variável? 3 – Escreva o tipo de dado ideal para se representar as seguintes informações: a) O número da conta bancária; b) A altura de uma pessoa em metros; c) A placa de um veículo; d) O número de filhos de uma pessoa; e) A população de um país; f) A cor de um objeto. 4 – Quais os tipos de dados nativos do Português Estruturado? 5 – Quais os valores possíveis para um dado do tipo Logico? 6 – O que é uma string? 7 – Identifique os tipos dos seguintes dados: a) "Processamento de Dados" b) 0.4 c) "4.5E10" d) true e) '?' f) ' ' g) -5.3E-02 h) ".05" i) "false" j) 0 8 – O que são identificadores? 9 – Quais as regras básicas para a formação de identificadores? 10 – Assinale os identificadores inválidos, justificando. a) A1BC b) XA,1d c) NomeDoAluno d) 198aberto e) prog 11 - Escreva os comandos necessários para declarar: uma variável que receba uma frase, três variáveis que recebam as três notas de um aluno e uma variável que receba a idade de uma pessoa. 12 – Qual a finalidade de um comentário dentro de um programa? Como deve ser escrito em Português Estruturado? ESTRUTURA DE UM ALGORITMO ESCRITO EM PORTUGUÊS ESTRUTURADO Algoritmo, assim como muitas linguagens de programação, é uma linguagem altamente estruturada que possui uma rigidez definida, embora sua estrutura de programa seja flexível. Cada seção ou parte de um programa deve aparecer numa seqüência apropriada e ser sistematicamente correta, senão ocorrerá um erro. Por outro lado, não há regras específicas para o uso de espaço e linhas quebradas, dando ao programador liberdade para escrever programas mais adequados ao seu estilo. Um algoritmo escrito em Português Estruturado tem o seguinte formato: PROG <identificador> tipo identificador1 [,identificador2 [,identificador3 [,identificador N]]]; [<comando1>;] [...;] [<comandoN>;] FIMPROG COMANDOS DE ENTRADA E SAÍDA DE DADOS SAÍDA Normalmente, em programação, quando nos referimos à saída de dados estamos particularmente interessados em exibir mensagens no monitor do computador. O comando utilizado para isso é o imprima, veja a sintaxe acompanhada de alguns exemplos: imprima expressão ou variável ; Algoritmo 01 prog imp1 imprima “Aprendendo algoritmo!!!”; fimprog Este algoritmo faz com que seja exibida, na tela do computador, a mensagem: Aprendendo Algoritmo!!! Algoritmo 02 prog imp2 int x; x=10; imprima “Valor de x = ”, x; fimprog Este algoritmo faz com que seja exibida, na tela do computador, a mensagem e o conteúdo da variável x: Valor de x = 10 Algoritmo 03 prog imp3 int x; x=10; imprima “Resultado = ”, x+1; fimprog Este algoritmo faz com que seja exibida, na tela do computador, a mensagem e o conteúdo da variável x acrescido em uma unidade, sem alterar o valor de x: Resultado = 11. ENTRADA O comando de entrada faz com que uma informação digitada no teclado, pelo usuário, entre no computador e fique armazenada numa variável previamente declarada, ou seja, o dado digitado parte do teclado e vai direto para uma posição de memória RAM, veja a sintaxe acompanhada de alguns exemplos: leia nome da variável ; Algoritmo 04 prog leia1 int x; leia x; imprima “Número lido = ”, x; fimprog Este algoritmo exibirá, na tela do computador, a mensagem e o número digitado pelo usuário. EXPRESSÕES O conceito de expressão em termos computacionais está intimamente ligado ao conceito de expressão matemática onde um conjunto de variáveis e constantes numéricas relacionam-se por meio de operadores compondo uma fórmula que, ao ser avaliada, resulta num valor. As expressões se dividem em: Aritméticas Nas expressões aritméticas fazemos o uso dos operadores aritméticos que são símbolos utilizados para efetuarmos cálculos matemáticos. Os operadores aritméticos são utilizados somente com dados do tipo int e do tipo real. Expressão Resultado 3 + 2 5 8 – 5 3 3 * 3.5 10.5 5 / 2 2.5 A=5; A div 2; 2 A=5; B=2; C = A % B; C vale 1 Prioridades As prioridades seguem o mesmo contexto das regras de precedência nas expressões matemáticas. Segue abaixo uma tabela contendo as prioridades e suas exceções. Prioridade Operadores 1ª * / div % 2ª + - Observações: 1 – Quando houver expressões com operadores de mesma prioridade, executa-se da esquerda para direita. 2 – A utilização de parênteses indica que as expressões contidas nos mesmos tem prioridade máxima. E se houver parêntese aninhados os parênteses mais internostem prioridade. Relacionais e Lógicas As expressões lógicas sempre retornaram true (Verdadeiro) e false (Falso). Para se montar expressões lógicas utilizamos de operadores relacionais e operadores lógicos. Veremos como funciona cada um destes operadores e exemplificaremos cada um deles. A utilização das expressões lógicas somente serão aplicadas em termos com o mesmo tipo de dados. Expressão Resultado 1 == 2 false „A‟ == „a‟ False 5 > 2 True 3 <= 3 True true < false False „JOAO‟ > „JOSE‟ False (2 + 3) != 5 False „comp‟ != „COMP‟ True 11 > 4 True EXERCICIOS RESOLVIDOS 1- Considerando que X = 1, Y = 2 e Z = 5, desenvolva. a) Z % Y div Y b) X + Y + Z / 3 2- Dadas as comparações abaixo, escreva os resultados. a) 3 == 3.0 b) „a‟ <= „A‟ c) „ „ == „ „ d) „CASA‟ != „casa‟ e) false == false f) „JOAQUIM‟ < „JOSE‟ g) „22‟ > „200‟ 3- Sendo A = true e B = false. Qual o resultado das expressões abaixo a) !A && B || A && !B b) !(!(A || B) && (A || B)) c) A || B && !A || !B d) (A || B) && (!A || B) GABARITO 1- a) Resp.: 5 mod 2 div 2 -> 1 div 2 -> 0 b) Resp.: 1 + 2 + 5 / 3 -> 3 + 1.667 -> 4.667 2- a) Resp.: false b) Resp.: false c) Resp.: true d) Resp.: true e) Resp.: true f) Resp.: true g) Resp.: true 3- a) Resp.: true b) Resp.: true c) Resp.: true d) Resp.: false EXERCÍCIOS Algoritmo 05 Construa um algoritmo que obtenha do usuário, via teclado, o seu nome e exiba a mensagem: Olá <nome digitado>! Algoritmo 06 Construa um algoritmo que imprima o produto entre 28 e 43. Algoritmo 07 Construa um algoritmo que imprima a média aritimética entre os números 8, 9 e 7. Algoritmo 08 Construa um algoritmo que leia um número inteiro e imprima seu antecessor e seu sucessor. Algoritmo 09 Construa um algoritmo que leia um nome, um endereço e um telefone e imprima-os na tela do micro. Algoritmo 10 Construa um algoritmo que leia dois números inteiros e imprima a soma. Antes do resultado, deverá aparecer a mensagem: Soma. Algoritmo 11 Construa um algoritmo que leia dois números inteiros e imprima o produto. Algoritmo 12 Construa um algoritmo que leia um número real e imprima a terça parte deste número. Algoritmo 13 Construa um algoritmo que obtenha do usuário, via teclado, dois números inteiros e mostre a média destes números. Algoritmo 14 Construa um algoritmo que obtenha do usuário/aluno o seu nome e suas duas melhores notas em Av´s. Como resultado o algoritmo deve exibir o nome do aluno seguido de sua média. Algoritmo 15 Construa um algoritmo que obtenha o nome e o sobrenome de uma pessoa e, como resultado, escreva-os na seguinte forma: sobrenome seguido por uma vírgula e pelo nome. Exemplo: entrada: “Ângelo”, “Pecly” saída: Pecly, Ângelo Algoritmo 16 Construa um algoritmo que leia um número inteiro positivo e exiba o dobro do mesmo. Algoritmo 17 Construa um algoritmo que leia dois números inteiros e imprima a seguinte saída: Dividendo: Divisor: Quociente: Resto: Algoritmo 18 Construa um algoritmo que leia um número inteiro de três casas e imprima o algarismo da casa das dezenas. Algoritmo 19 Construa um algoritmo que leia uma data no formato ddmmaa e imprima: dia, mês e ano separados. Algoritmo 20 Construa um algoritmo que leia uma data no formato ddmmaa e imprimano formato mmddaa. Algoritmo 21 Construa um algoritmo que leia quatro números inteiros e imprima a média ponderada, sabendo-se que os pesos são respectivamente 1, 2, 3 e 4. Algoritmo 22 Construa um algoritmo que leia um saldo de uma aplicação bancária e imprima este saldo reajustado em 2%. Algoritmo 23 Construa um algoritmo para calcular a área de um triângulo, sendo dados a sua base e a sua altura. Algoritmo 24 Construa um algoritmo para calcular e exibir o comprimento de uma circunferência, sendo dado o valor de seu raio. C= 2πR Defina π como sendo uma constante de valor igual a 3.1415. Algoritmo 25 Construa um algoritmo para ler uma temperatura dada na escala Fahrenheit e exibir o equivalente em Celsius. Algoritmo 26 Construa um algoritmo que leia duas variáveis inteiras e troque o conteúdo de uma com a outra. Algoritmo 27 – Desafio 01 Construa um algoritmo que leia um número inteiro e informe se ele é maior que zero. ESTRUTURAS DE SELEÇÃO Um programa de computador é uma seqüência de instruções organizadas de forma tal a produzir a solução de um determinado problema. Naturalmente tais instruções são executadas em seqüência, o que denomina-se fluxo seqüencial de execução. Em inúmeras circunstâncias é necessário executar as instruções de um programa numa ordem diferente da estritamente seqüencial. Tais situações são caracterizadas pela necessidade de repetição de instruções individuais ou grupos de instruções e também pelo desvio do fluxo de execução. As linguagens de programação tipicamente possuem alguns comandos estruturados destinados ao controle do fluxo de execução, isto é, estruturas que permitem a repetição e o desvio do fluxo de execução. Para que fique mais claro, vamos, mais uma vez, considerar um exemplo do nosso cotidiano. Imagine que você esteja planejando passar o fim de semana numa praia, mas esteja preocupado com as condições do clima, dessa forma você teria, naturalmente, o seguinte raciocínio: ...amanhã, SE fizer um dia ensolarado, viajarei para praia, MAS SE estiver chovendo, passarei pela locadora de vídeo. Por este exemplo, fica evidente que alguns “comandos” não serão executados, ou seja, se você for à praia, não irá à locadora. Você fará uma coisa ou outra. Neste tipo de situação, os “comandos” excluídos pela condição nunca serão executados. COMANDO SE No Português Estruturado, para que se implemente um desvio simples no fluxo de execução do programa, deve-se utilizar o comando se. Este comando deve respeitar a seguinte sintaxe: se ( expressão lógica ) { comando1_1; [ coamndo1_2; comando1_N;] } [ senao { comando2_1; comando2_2; comando2_N; }] Alguns aspectos importantes da sintaxe acima: O comando se, em si, não possui “;”, apenas os comandos embutidos nele; Este comando pode ter um ou mais comandos dentro dele, mas pelo menos um deve existir; Os comandos dentro do comando se ou da cláusula senao, são delimitados por { e }; A cláusula senao, também é opcional; Caso exista a cláusula senao, dentro dela também pode existir um ou mais comandos, mas pelo menos um deve existir. O comando se funciona da seguinte forma: caso a expressão lógica (condição) tenha como resultado um valor true, o(s) comando(s), logo abaixo, é (serão) executado(s). No caso de existir a cláusula senao, o(s) comando(s) embutido(s) nela, só será (serão) executado(s) caso a expressão lógica (condição) retorne false. Desta, forma, pode-se perceber que os comandos do primeiro grupo são excludentes em relação ao segundo, ou seja, não há uma circunstância possível em que os dois grupos sejam executados. Uma observação importante neste ponto, é que os comandos embutidos no comando se, podem ser quaisquer comandos da linguagem, inclusive outro comando se. Caso isto ocorra, diz-se que estes comandos se são aninhados. Ao se aninhar comandos se, deve-se redobrar a atenção em relação às cláusulassenao no que diz respeito a identificar a qual comando se pertence um determinado senao. Veja como ficaria a sintaxe: se ( expressão lógica ) { comando1_1; [ coamndo1_2; comando1_N;] se ( expressão lógica ) { comando1_1_1; [ coamndo1_1_2; comando1_1_N;] } } [ senao { comando2_1; comando2_2; comando2_N; }] Observe que o comando se mais interno não possui a cláusula senao. É comum encontrar na literatura a denominação estrutura de decisão simples para um comando se sem a cláusula senao e, estrutura de decisão composta, para o comando se seguido da cláusula senao. Veja o algoritmo do fim de semana: ... se (clima == “sol”) { viajar; } senao { ir à locadora; } ... Algoritmo 28 Construa um algoritmo que leia um número e se ele for maior do que 20, imprima a metade do número. prog metade real numero, metade; imprima “Digite um numero: ”; leia numero; se ( numero > 20 ) { metade = numero / 2; imprima “Metade: ”, metade; } fimprog Algoritmo 29 Construa um algoritmo que leia um número e, se for positivo, mostre seu inverso; caso contrário, imprima o valor absoluto do número. prog inversoabsoluto real numero, inverso, absoluto; imprima “Digite um número”; leia numero; se ( numero > 0.0 ) { inverso = 1 / numero; imprima “Inverso: ”,inverso; } senao { absoluto = numero * -1; imprima “Absoluto: ”,absoluto; } fimprog Algoritmo 30 Construa um algoritmo que leia um número inteiro e diga (mostre a mensagem) se ele é divisível por 3. prog div3 int n, resto; imprima “Digite um numero inteiro: ”; leia n; resto = n % 3; se ( resto == 0 ) { imprima “O numero e múltiplo de 3!!!”; } senao { imprima “O numero NÃO e múltiplo de 3!!!”; } fimprog Algoritmo 31 Construa um algoritmo que leia um número inteiro e diga se ele é PAR ou ÍMPAR. Algoritmo 32 Construa um algoritmo que leia um número e diga se ele é positivo, negativo ou nulo. Algoritmo 33 Construa um algoritmo que leia dois números e mostre o maior deles. COMANDO ESCOLHA O comando escolha é um comando de desvio múltiplo de fluxo, isto é, baseado na avaliação de uma expressão ordinal é escolhido um caminho de execução dentre vários possíveis. Um resultado ordinal é aquele que pertence a um conjunto onde se conhece precisamente o elemento anterior e posterior, ou seja, um valor dentro de um conjunto, cujos valores podem ser claramente ordenados („A‟,„B‟,„C‟, . . . ). O escolha equivale, logicamente, a um conjunto de comandos se aninhados, embora seja usualmente mais eficiente durante a execução. A sintaxe é a seguinte: escolha(expressão ordinal) { caso ordinal1: comando1_1; [comando1_2; comando1_N;] interrompe; caso ordinal2: comando2_1; [comando2_2; comando2_N;] interrompe; [padrao: comando_padrao1; [comando_padrao2; comando_padraoN;]] } A expressão utilizada pelo escolha deve, necessariamente, retornar um resultado ordinal. Conforme o resultado é selecionado em cada um dos casos indicados pela construção caso. Os comandos encontrados a partir do caso escolhido são executados até o final do comando escolha ou até encontrar um comando interrompe. Se o valor resultante não possuir um caso específico, serão executados os comandos colocados na cláusula padrao, que é opcional neste comando. Exercícios 1 - Qual a utilidade da estrutura de decisão? 2 – Qual a diferença entre a estrutura de decisão simples e a composta? 3 – Quais são os comandos de decisão existentes no Português Estruturado? 4 – Em que situações é mais indicado o uso do comando escolha? Algoritmo 34 Construa um algoritmo que leia dois números e mostre o maior deles. Algoritmo 35 Construa um algoritmo que leia dois números e os mostre em ordem crescente e decrescente. Algoritmo 36 Deseja-se calcular a conta de consumo de energia elétrica de um consumidor. Para isto, escreva um algoritmo que leia o código do consumidor, o preço do Kw e a quantidade de Kw consumido, e exiba o código do consumidor e o total a pagar. - total a pagar = preço x quantidade - total a pagar mínimo = R$ 11,20 Algoritmo 37 Construa um algoritmo que, dado as três notas de um aluno, determine e exiba a sua média final e o seu conceito, sabendo-se que: -a média final é calculada pela média aritmética das três notas; -o conceito é determinado de com base na tabela abaixo: Média Final Conceito >=8.0 A >=5.0 e <8.0 B <5.0 C Algoritmo 38 Construa um algoritmo que determine o grau de obesidade de uma pessoa, sendo fornecido o peso e a altura da pessoa. O grau de obesidade é determinado pelo índice da massa corpórea (Massa = Peso / Altura2) através da tabela abaixo: Massa Corpórea Grau de Obsidade <26 Normal >= 26 e <30 Obeso >=30 Obeso Móbido Algoritmo 39 Uma empresa deseja aumentar o salário de seus empregados. O reajuste deverá obedecer a seguinte tabela: Salário Atual (R$) Rejuste 0.0 a 1000.00 20% 1000.01 a 5000.00 10% Acima de 5000.00 0% Construa um algoritmo que leia o nome e o salário atual de um empregado, e exiba o nome, o salário atual e o salário reajustado. Algoritmo 40 Construa um algoritmo que calcule a conta final de um hóspede de um hotel, considerando que: a) serão lidos o nome do hóspede, o tipo do apartamento utilizado (A, B, C ou D), o número de diárias utilizadas pelo hóspede e o valor do consumo interno do hóspede; b) o valor da diária é determinado pela seguinte tabela: Apartamento Valor da Diária (R$) A 150.00 B 100.00 C 75.00 D 50.00 c) o valor total das diárias é o número de dias hospedados multiplicado pelo valor da diária; d) o subtotal é calculado pela soma do valor total das diárias e o valor do consumo interno; e) o valor da taxa de serviço equivale a 10% do subtotal; f) o total geral resulta da soma do subtotal com a taxa de serviço. Escreva a conta final contendo: o nome do hóspede, o tipo do apartamento, o número de diárias utilizadas, o valor unitário da diária, o valor total das diárias, o valor do consumo interno, o subtotal, o valor da taxa de serviço e o total geral. Algoritmo 41 Deseja-se calcular o imposto de renda de um contribuinte. Para isto, escreva um algoritmo que: a) leia os seguintes dados do contribuinte: CPF, nome, rendimento anual, imposto retido na fonte, contribuição previdenciária, despesas médicas, número de dependentes; b) seja deduzido o valor de R$ 1080.00 por cada dependente; c) calcule o valor total das deduções: contribuição previdenciária + despesas médicas + dedução dos dependentes; d) calcule a base de cálculo: rendimento anual – total das deduções; e) calcule o imposto devido: (base de cálculo * alíquota) - parcela a deduzir, com base na tabela abaixo: Base de Cálculo Alíquota Parcela a Deduzir até 10800.00 Isento - De 10800.01 até 21600.00 15% 1620.00 acima de 21600.00 25% 3780.00 Haverá imposto a pagar se a diferença entre o imposto devido e o imposto retido na fonte for positiva; caso contrário, haverá imposto a restituir; Algoritmo 42 Construa um algoritmo que leia um número e informe se ele é divisível por 3 e por 7. Algoritmo 43 Construa um algoritmo que leia um número inteiro de 3 casas e informe se o algarismo da casa das centenas é par ou ímpar.Algoritmo 44 Construa um algoritmo que leia o ano de nascimento de uma pessoa e o ano atual e informe a idade da pessoa. Não se esqueça de verificar se o ano de nascimento é um ano válido. Obs.: Não se preocupe com o mês e o dia do nascimento da pessoa. Algoritmo 45 Construa um algoritmo que implemente uma calculadora básica. Para isto o algoritmo deverá obter dois números do teclado e um operador (caractere que representará a operação matemática desejada [„+‟, „-‟, „*‟ e „/‟]). De posse dos dados de entrada, o algoritmo deve efetuar o calculo desejado e exibir o resultado. Algoritmo 46 Construa um algoritmo que leia a sigla do estado de uma pessoa e informe se ela é carioca, paulista, mineiro ou outros. Algoritmo 47 Construa um algoritmo que leia dois nomes e os mostre em ordem alfabética. Algoritmo 48 Construa um algoritmo que leia três números e mostre o maior deles. Algoritmo 49 Construa um algoritmo que leia três números e os mostre em ordem crescente e decrescente. Algoritmo 50 Construa um algoritmo que leia cinco números e mostre o maior e o menor deles. Algoritmo 51 Construa um algoritmo que leia as três notas de um aluno. Das três, o algoritmo deve calcular e mostrar, a média aritmética das duas maiores notas. Algoritmo 52 Construa um algoritmo que leia uma quantia em reais e transforme para dólar. Algoritmo 53 Segundo uma tabela médica, o peso ideal de uma pessoa está relacionado com a altura e o sexo. Construa um algoritmo que leia a altura e o sexo da pessoa e calcule e mostre o seu peso ideal, utilizando as seguintes fórmulas: para homens: (72.7 * H) – 58 para mulheres: (62.1 * H) – 44.7 Algoritmo 54 Construa um algoritmo que leia um número inteiro entre 1 e 7 e mostre o dia da semana correspondente. Exemplos: Entrada: 1 Saída: Domingo Entrada: 4 Saída: Quarta Algoritmo 55 Construa um algoritmo que leia um número inteiro entre 1 e 12 e mostre o mês correspondente. Algoritmo 56 Construa um algoritmo que leia o tipo de carro e a distância, em Km, que se deseja percorrer. O programa deverá, baseado na tabela a seguir, calcular o consumo de combustível para o percurso. Tipo de carro Consumo A 13.5 Km/l B 12.0 Km/l C 10.5 Km/l D 9.0 Km/l E 7.5 Km/l Algoritmo 57 Construa um algoritmo que leia uma data no formato ddmmaaaa e informe se a data é válida ou não. Algoritmo 58 Construa um algoritmo que leia uma letra do teclado e informe: se é uma vogal maiúscula; se é uma vogal minúscula; ou se é uma consoante. Algoritmo 59 Construa um algoritmo que leia o ano de nascimento de um nadador e o classifique de acordo com a tabela a seguir: Faixa de Idade Categoria 0 – 4 anos Não aceito 5 – 7 anos Infantil A 8 – 10 anos Infantil B 11 – 13 anos Juvenil A 14 – 17 anos Juvenil B Maiores de 17 anos Sênior Algoritmo 60 – Desafio 02 Construa um algoritmo que calcule a média de idade dos moradores de uma cidade, ou seja, leia a idade de cada pessoa da cidade e calcule a média. O algoritmo deve obter do usuário, via teclado (comando leia), o número de habitantes da cidade. ESTRUTURAS DE REPETIÇÃO No ambiente computacional, consideramos repetição um comando ou um trecho de código que deve se repetido por algumas vezes. A repetição é uma das tarefas mais comuns da programação utilizada para efetuarmos contagens, para obtenção de dados a serem manipulados pelo programa. Em Português Estruturado dispomos do comando para, cuja sintaxe é dada a seguir: para(inicialização; condição de execução; incr/decremento) { Lista de comandos } O comando para possui três campos ou seções, todas opcionais, delimitados por um par de parênteses que controlam a repetição de um comando individual ou de um bloco de comandos. Cada campo é separado um do outro por um ponto e vírgula. O primeiro campo é usado para dar valor inicial a uma variável de controle (um contador). O segundo campo é uma expressão lógica que determina a execução ou não do(s) comando(s) associado(s) ao para. O terceiro campo realiza uma operação sobre a variável de controle, geralmente incrementando ou decrementando tal variável. Algoritmo 61 Construa um algoritmo que conte de 1 à 5. prog contador01 imprima “1”; imprima “2”; imprima “3”; imprima “4”; imprima “5”; fimprog Algoritmo 62 Construa um algoritmo que conte de 1 à 5000. prog contador01 imprima “1”; . . . imprima “5000”; fimprog Para que o Algoritmo 62 funcione, o computador deveria entender o significado da reticência, mas como isso não ocorre, devemos repetir a digitação do comando imprima por 5000 vezes. Felizmente temos uma alternativa a este exaustivo trabalho, o comando para apresentado anteriormente se adapta perfeitamente a esta situação. Veja como ficaria a solução do Algoritmo 62: Algoritmo 63 prog contador02 int i; para (i=1; i<=5000; i=i+1) { imprima i; } fimprog Outro comando bastante utilizado para construir laços de repetição é o comando enquanto, cuja sintaxe é dada a seguir: enquanto (expressão lógica) { lista de comandos } O comando enquanto, assim como no comando para, avalia o resultado da expressão lógica antes de executar o(s) comando(s) associado(s), assim, caso a condição seja inicialmente falsa, tal(tais) comando(s) não será(serão) executado(s). Um problema típico relacionado à aos comandos de repetição é o seguinte: se a condição nunca se tornar falsa o laço será repetido ininterruptamente. Esta situação pode ocorrer tanto no comando para como no comando enquanto, porém, é muito mais comum no comando enquanto devido sua estrutura menos rígida. No para as três seções em que se divide o controle do loop, impõem uma maior formalidade à construção do comando, o que inconscientemente, nos induz a sermos mais cautelosos. Veja o exemplo: Algoritmo 64 prog contador03 int i; i=1; enquanto (i<=5000) { imprima i; i=i+1; } fimprog Os algoritmos 63 e 64 executam exatamente a mesma tarefa, porém, observe que é mais fácil o programador se distrair e esquecer-se do comando “i=1;” ou do comando “i=i+1;”. Isto exposto, fica a critério de cada um a opção por adotar um comando ou o outro. Exercícios Algoritmo 65 Tente resolver o Algoritmo 60 – Desafio 02, utilizando algum dos comandos de repetição. Algoritmo 66 Construa um algoritmo que obtenha cinco números e mostre o quadrado de cada um dos números. Algoritmo 67 Construa um algoritmo que imprima todos os números inteiros entre 1 e 100. Algoritmo 68 Construa um algoritmo que imprima todos os números inteiros entre 100 e 1. Algoritmo 69 Construa um algoritmo que imprima os 200 primeiros números pares. Algoritmo 70 Construa um algoritmo que mostre os múltiplos de 5 no intervalo entre 1 e 500. Algoritmo 71 Construa um algoritmo que imprima os quadrados dos inteiros entre 1 e 50. Algoritmo 72 Construa um algoritmo que imprima os números pares no intervalo entre 400 e 600. Algoritmo 73 Construa um algoritmo que imprima a soma dos inteiros entre 1 e 100 . Algoritmo 74 Construa um algoritmo que obtenha o nome, a idade e o sexo de 29 pessoas e imprima o nome se a pessoa for do sexo masculino e tiver mais de 21 anos. Algoritmo 75 Construa um algoritmo que leia um número N, some todos os números inteiros de 1 a N, e mostre o resultado obtido. Algoritmo 76Construa um algoritmo que leia N e uma lista de N números e mostre a soma de todos os números lidos. Algoritmo 77 Construa um algoritmo que leia um conjunto de 100 números inteiros positivos e determine o maior deles. Algoritmo 78 Construa um algoritmo que leia um conjunto de 100 números inteiros (positivos ou negativos) e determine o maior deles. Algoritmo 79 Construa um algoritmo que leia um conjunto de números inteiros (positivos ou negativos) e determine o maior e o menor deles. A leitura do valor 0 (zero) indica o fim da entrada dos dados. Algoritmo 80 Construa um algoritmo que leia um conjunto de números inteiros positivos terminado pelo número 0 (zero). Ao final, o programa deverá mostrar a média aritmética de todos os números lidos. Algoritmo 81 Construa um algoritmo que leia dois números inteiros e mostre o produto entre eles. Calcule o produto através de somas sucessivas. Algoritmo 82 Construa um algoritmo que calcule o fatorial de um número inteiro lido, sabendo-se que: N! = 1 x 2 x 3 x . . . x N-1 x N; 0! = 1. Algoritmo 83 Um número é, por definição, primo se ele não tem divisores, exceto 1 e ele próprio. Escreva um algoritmo que leia um número inteiro e determine se ele é ou não primo. Algoritmo 84 Construa um algoritmo que leia dois números inteiros (X e Y) e mostre todos os primos entre X e Y. Algoritmo 85 Construa um algoritmo que leia um número N, calcule e mostre os N primeiros termos da sequência de Fibonacci. A sequência de Fibonacci é formada inicialmente pelos valores 0 e 1 e, a partir de então, cada novo elemento desta sequência é obtido pela soma dos dois elementos imediatamente anteriores. Exemplo: (0,1,1,2,3,5,8,13,...) Algoritmo 86 A série de RICCI difere da série de Fibonacci pelo fato de que os dois primeiros termos são fornecidos pelo usuário. Os demais termos são gerados da mesma forma que na série de Fibonacci. Construa um algoritmo que leia um número inteiro N, calcule e mostre os N primeiros termos da série de RICCI. Algoritmo 87 Construa um algoritmo que leia o número de alunos de uma turma. Baseado neste número, obtenha a nota na AV1 de cada aluno e mostre, ao final, a média da turma. Algoritmo 88 Construa um algoritmo que leia 200 números inteiros e imprima quantos são pares e quantos são ímpares. Algoritmo 89 Construa um algoritmo que leia 200 números inteiros e imprima quantos são pares e quantos são ímpares. Algoritmo 90 – Desafio 03 Construa um algoritmo que leia 100 números inteiros e, após a leitura do último número, os mostre na ordem inversa da que foram lidos, ou seja, do último até o primeiro. VETOR Em muitas aplicações os tipos básicos de dados não são suficientes para suprir as necessidades da estrutura de dados do problema. Já vimos em algoritmos passados a necessidade de lermos diversos valores, para isso usamos uma única variável, o que atendeu perfeitamente a demanda oriunda do problema. Porém, caso seja necessário recuperar um valor lido anteriormente, não será possível, pois a cada nova leitura o conteúdo da variável é sobrescrito. A única maneira de guardarmos todos os valores lidos (individualmente) é declarando uma variável para cada valor. Já pensou, declarar 100, 200 ou até mil variáveis? Pois existe uma maneira muito simples de se fazer isso, basta criarmos um tipo de dado chamado VETOR. O vetor é uma estrutura de dados homogênea indexada, ou seja, devemos entender um vetor como sendo um conjunto de variáveis do mesmo tipo, onde cada uma dessas “variáveis” é acessada através de um índice. É importante ressaltar que os índices de um vetor sempre variam de 0 (zero) à N-1, onde N é o tamanho do vetor. A declaração de um vetor deve respeitar a a seguinte sintaxe: tipo_dos_dados nome_do_vetor[Quantidade_de_elementos]; Algoritmo 91 prog vetor01 int i, vet[5]; vet[0]=3; vet[1]=5; vet[2]=2; vet[3]=6; vet[4]=8; imprima “A terceira posição do vetor guarda o nº ”, vet[2]; fimprog Assim sendo, o Algoritmo 91 exibirá como resultado a seguinte mensagem: A terceira posição do vetor guarda o nº 2 Algoritmo 92 prog vetor02 int i, vet[5]; para(i=0;i<5;i++) { imprima “Digite um número inteiro: ” leia vet[i]; } imprima “A terceira posição do vetor guarda o nº ”, vet[2]; fimprog Para o Algoritmo 92, vamos imaginar que o usuário tenha digitado os números 3, 5, 2, 6 e 8. Desta forma o vetor vet deverá ter a seguinte configuração em memória: Índice 0 1 2 3 4 Valor 3 5 2 6 8 Assim sendo, o Algoritmo 92 exibirá como resultado a seguinte mensagem: A terceira posição do vetor guarda o nº 2 Exercícios Algoritmo 93 Tente resolver o Algoritmo 90 – Desafio 03, utilizando um vetor para armazenar os números. Algoritmo 94 Construa um algoritmo que declare três vetores, A, B e C, de inteiros com 10 elementos cada um. O algoritmo deverá preencher os dois primeiros vetores com dados lidos à partir do teclado. O terceiro vetor deverá ser preenchido à partir da soma, dos elementos posicionalmente correspondentes, dos dois primeiros vetores. Algoritmo 95 Construa um algoritmo que armazene 15 números inteiros num vetor e imprima uma listagem numerada contendo o número e uma mensagem informando se ele é par ou ímpar. Algoritmo 96 Construa um algoritmo que armazene o nome e o salário de 20 pessoas, aplique um reajuste de 20% para todas as pessoas e gere uma listagem contendo os nomes e os novos salários. Algoritmo 97 Construa um algoritmo que armazene o preço de compra e o preço de venda de 100 mercadorias e imprima quantas mercadorias proporcionam: ➢ lucro < 10% ➢ lucro entre 10% e 20% ➢ lucro > 20% Algoritmo 98 Um professor tem uma turma de 80 alunos e deseja calcular e imprimir a nota de cada aluno seguida da média da turma. Algoritmo 99 Construa um algoritmo que armazene código, nome, quantidade, valor de compra e valor de venda de 100 produtos e gere uma listagem de todos os produtos ou somente de um, quando se digitar o código. Algoritmo 100 Construa um algoritmo que armazene dois conjuntos de números inteiros, tendo um 10 e o outro 20 elementos e apresente os elementos comuns aos dois conjuntos. Algoritmo 101 Construa um algoritmo que armazene dois conjuntos de números inteiros, tendo um 10 e o outro 20 elementos e apresente os elementos comuns aos dois conjuntos. Podem existir números repetidos nos conjuntos de dados, porém, a saída não deverá mostrar repetições. Algoritmo 102 Construa um algoritmo que armazene um vetor vet01 de 10 números inteiros e positivos e gere um vetor vet02 contendo os quadrados dos respectivos componentes de vet01. Algoritmo 103 Construa um algoritmo que armazene 100 números inteiros e positivos, que imprima o maior e menor dos números e imprima o percentual de números pares e ímpares. Algoritmo 104 Num torneio de futsal inscreveram-se 12 times. Construa um algoritmo que armazene os nomes dos times e imprima a tabela de jogos. Algoritmo 105 Construa um algoritmo que armazene dois conjuntos de 25 números inteiros, preencha um terceiro vetor intercalando os elementos dos dois primeiros e mostre o terceiro vetor. Algoritmo 106 Construa um algoritmo que armazene números inteiros e positivos. A entrada de dados deve parar ao ser digitado o número 0 (zero) ou ser atingido o limite do vetor, que é de 100 posições. O algoritmo deverá imprimir a quantidade de númerosiguais ao último número lido. Algoritmo 107 Construa um algoritmo que armazene um conjunto de 100 números reais e imprima a quantidade de números maiores que a média do vetor. Algoritmo 108 No vestibular de uma universidade, no curso de informática, inscreveram-se 1200 pessoas. Construa um algoritmo que armazene o gabarito da prova que tinha 100 questões, sendo que cada questão valia 1 ponto. O algoritmo deverá ainda obter o número de inscrição, o nome e as respostas de cada candidato. Ao final, deve-se imprimir o número de inscrição, o nome e a nota de cada candidato. Algoritmo 109 Construa um algoritmo que armazene nome, endereço e telefone de 50 pessoas e mostre, a partir de um nome digitado, as informações referentes ao nome. Algoritmo 110 – Desafio 04 No vestibular de uma universidade, no curso de informática, inscreveram-se 1200 pessoas. Construa um algoritmo que armazene o gabarito da prova que tinha 100 questões, sendo que cada questão valia 1 ponto. O algoritmo deverá ainda obter o número de inscrição, o nome e as respostas de cada candidato. Ao final, deve-se imprimir o número de inscrição, o nome, as respostas e a nota de cada candidato. MATRIZ Os vetores são arranjos homogêneos unidimensionais, no entanto, podemos encontrar diversos problemas que envolvem na sua solução arranjos homogêneos multi-dimensionais, particularmente de duas ou três dimensões. tipo_dos_dados nome_da_matriz[Qtd,...,Qtd]; Exemplo: int m[5,10]; Este exemplo cria uma matriz, ou vetor multi-dimensional, com cinco linhas e dez colunas. Na memória esta matriz terá a seguinte configuração. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 Para que se possa acessar um elemento da matriz, será necessário um número de índices igual à dimensão da matriz, ou seja, numa matriz bi-dimensional serão necessários 2 índices, um para referenciar as linhas e outro para as colunas. Na matriz dada como exemplo, para referenciarmos o elemento em destaque, teremos que utilizar as coordenadas linha 2 e coluna 3, dessa forma, caso queiramos ler um determinado número do teclado e guardá-lo nesta posição da matriz, deveremos utilizar o comando a seguir: leia m[2,3]; Algoritmo 111 Construa um algoritmo que crie e preencha, com números inteiros lidos do teclado, uma matriz 7x6. prog matriz01 int i,j, m[7,6]; para(i=0;i<7;i++) { para(j=0;j<6;j++) { imprima “Digite um número inteiro: ” leia m[i,j]; } } fimprog Exercícios Algoritmo 112 Construa um algoritmo que crie duas matrizes 2x3, A e B, de inteiros e as preencha com dados lidos do teclado. O algoritmo deverá preencher e exibir a matriz C, também 2x3, com a soma da matriz A com a matriz B. Algoritmo 113 Construa um algoritmo que leia uma matriz de ordem 3x5 de elementos inteiros, calcule e imprima: a) o maior elemento da matriz; b) a soma dos elementos da matriz; e c) a média dos elementos da matriz. Algoritmo 114 Construa um algoritmo que leia uma matriz quadrada de ordem 5 de inteiros e exiba os elementos da diagonal principal. Algoritmo 115 Tente resolver o Algoritmo 110 – Desafio 04, utilizando o conceito de matrizes. Algoritmo 116 A tabela abaixo demonstra a quantidade de vendas dos fabricantes de veículos durante o período de 1993 a 1998, em mil unidades. Construa um algoritmo que: a) leia os dados da tabela; b) determine e exiba o fabricante que mais vendeu em 1996; c) determine e exiba o ano de maior volume geral de vendas; d) determine e exiba a média anual de vendas de cada fabricante no período. Algoritmo 117 Construa um algoritmo que leia uma matriz quadrada de ordem 10 e, a pós a leitura dos dados, mostre os números ímpares constantes na matriz. Algoritmo 118 Construa um algoritmo que leia uma matriz 8x10 e a preencha com números reais. Após o preenchimento da matriz o algoritmo deverá somar os elementos de cada linha armazenando tais resultados num vetor. Ao final, deve-se mostrar o vetor resultante. Algoritmo 119 Construa um algoritmo que leia uma matriz 5x3 e gere a transposta desta matriz. Obs.: Uma matriz transposta é gerada trocando-se as linhas pelas colunas. Algoritmo 120 Construa um algoritmo que leia uma matriz de ordem 10 e a imprima. A seguir, troque: a) a segunda linha pela oitava linha; b) a quarta coluna pela décima coluna; e c) a diagonal principal pela diagonal secundária. Imprima a matriz resultante. Algoritmo 121 Construa um algoritmo que armazene as alturas dos atletas de cinco delegações que participarão dos jogos de verão. Cada delegação tem 10 atletas. O algoritmo deverá imprimir a maior altura de cada delegação e a maior entre todos os atletas. Algoritmo 122 A viação XPTO tem na rodoviária Novo Rio uma tabela contendo os horários de partidas dos ônibus para Nova Friburgo nos sete dias da semana. Construa um algoritmo que possa armazenar estes horários e que dê duas opções de consulta ao usuário: ➢ por dia da semana – o usuário deverá digitar o dia da semana [1..7] e o algoritmo deverá mostrar todos os horários daquele dia; ➢ por dia da semana entre os horários x e y – o usuário deverá entrar com os três argumentos e o algoritmo deverá exibir os horários que se encaixem nas condições. Algoritmo 123 Construa um algoritmo que leia uma matriz 5x5 de inteiros e apresente uma determinada linha da matriz, solicitada via teclado. Algoritmo 124 Construa um algoritmo que leia uma matriz 12x4 com os valores das vendas de uma loja. Cada linha representará um mês do ano e cada coluna representará uma semana no mês. O algoritmo deverá calcular e exibir os seguintes dados: a) total vendido em cada mês; b) total vendido em cada semana durante todo o ano; c) total vendido em cada semana de um determinado mês digitado pelo usuários; d) total vendido no ano; MIGRAÇÃO PARA LINGUAGEM C **********[ Reescrever os Algoritmos em Linguagem C ]********** FUNÇÕES Uma Função é um trecho de programa independente com um objetivo determinado, simplificando o entendimento do programa e proporcionando-o menores chances de erro e de complexidade. A Função, na programação imperativa, é a melhor ferramenta para particionamento do programa. Mas qual a finalidade de se particionar um programa? Um programa ao ser particionado passa a ser visto, obrigatoriamente, naturalmente e intuitivamente, como um conjunto de partes, onde cada uma delas pode ser pensada e implementada separadamente. Serve para se reduzir a complexidade do programa? Sim, pois quando se esta pensando numa parte, o programador abstrai a existência das outras. É claro que a abstração não é total, pois as partes deverão ser capazes de interagir. Podemos dizer que um programa desenvolvido de forma particionada trás benefícios quanto à confiabilidade de sua correta execução? Sim, uma vez concluída, testada e aprovada, uma parte poderá ser usada futuramente de maneira confiável e sem a necessidade de ser reescrita. Ganha-se alguma performance no desenvolvimento do programa? Em programas menores, os ganhos são menores, porém, em sistemas maiores a reusabilidade das Funções é de fundamental importância para o sucesso do produto final. Podemos resumir as vantagens do emprego de Funções em: 1- Dividir e estruturar um programa em partes logicamente coerentes; 2- Facilidade em testar trechos em separados; 3- Melhorlegibilidade do programa; 4- Evitar redundância de programação; 5- Possibilidade de criar bibliotecas de Funções. Quando uma Função é chamada, o fluxo de controle de execução é desviado para a Função. Ao terminar a execução dos comandos da Função, o fluxo retorna ao comando seguinte àquele onde ela foi ativada. A seguir, a estrutura de uma Função: <tipo_de_retorno> nome_da_função(parâmetros) { Declaração das variáveis Comandos que formam o corpo da Função Retorno de valores } Algoritmo 125 Construa um programa em C que receba três números inteiros e mostre o dobro de cada um deles. Use uma Função para o cálculo. #include <conio.h> int dobro(int num) { int r; r=num*2; return r; } void main(void) { int i, n, resultado; for(i=0;i<3;i++) { printf("Entre com um n£mero inteiro: "); scanf("%d",&n); resultado=dobro(n); printf("O dobro de %d eh %d.\n\n",n,resultado); } getch(); } Algoritmo 126 Construa um programa em C que receba três notas de um aluno e calcule a sua média. Use uma Função para o cálculo. Algoritmo 127 Construa um programa em C que receba três números inteiros e mostre o maior deles. Utilize um Função para encontrar o maior dos números. Algoritmo 128 Construa um programa em C que receba um número inteiro e mostre o seu fatorial. Utilize uma Função para realizar o cálculo. Algoritmo 129 Construa um programa em C que receba um caracter via teclado e informe se ele é uma consoante ou uma vogal. Utilize uma Função para descobrir se o caracter é consoante ou vogal. A Função não deverá emitir mensagens ao monitor. Algoritmo 130 Construa um programa em C que receba um número inteiro na base 10 e o represente na base 2 e na base 8. Utilize uma Função para cada base. Algoritmo 131 Construa um programa em C que implemente uma Função que receba um vetor de inteiros e seu tamanho e retorne o menor dos elementos do vetor. Algoritmo 132 Construa um programa em C que implemente uma Função que receba um vetor de 10 posições e um número e verifique se tal número existe no vetor. Algoritmo 133 Construa um programa em C que implemente uma Função que receba um vetor de 20 caracteres e um caracter e retorne a quantidade de vezes que o caracter aparece no vetor. Algoritmo 134 Construa um programa em C que implemente uma Função que receba um vetor com 10 inteiros e informe o vetor esta em ordem crescente. Algoritmo 135 Construa um programa em C que implemente uma Função que receba um número inteiro e mostre a tabuada deste número. ESCOPO DAS VARIÁVEIS Entende-se por escopo de variáveis a visibilidade/acessibilidade que determinada variável terá dependendo de onde ela for declarada. Existem três possibilidades: Variáveis Locais; Variáveis Globais; e Variáveis Formais. LOCAIS As variáveis locais possuem visibilidade apenas dentro do bloco onde foram declaradas, ou seja, são de uso exclusivo do bloco em questão. Por exemplo, uma variável declarada dentro da função main(), não é acessível dentro de outras funções. Algoritmo 136 //**************[ Exemplo Correto ]************** int dobro(int x) { return x*2; } void main(void) { int i; printf(“Entre com um inteiro: ”); scanf(“%d”,&i); printf(“O dobro de %d eh %d\n”,i,dobro(i)); getch(); } Algoritmo 137 //**************[ Exemplo Errado ]************** int dobro(void) { return i*2; // Erro de acesso à variável i } // i é reconhecida apenas na função main() void main(void) { int i; printf(“Entre com um inteiro: ”); scanf(“%d”,&i); printf(“O dobro de %d eh %d\n”,i,dobro()); getch(); } FORMAIS As variáveis formais são os parâmetros declarados nas funções. Alguns autores e a própria linguagem C, tratam estas variáveis como locais, isto porque a única diferença entre estas e as locais, é o local onde elas são declaradas...na linha em que se cria uma função, quanto ao funcionamento e a acessibilidade, as locais e formais funcionam da mesma forma. int dobro(int x) { // x é uma variável formal. return x*2; } GLOBAIS As variáveis globais são declaradas fora de qualquer bloco/função. Elas são acessíveis, tanto para leitura ou manipulação, por qualquer bloco ou função do programa. Algoritmo 138 //**************[ Exemplo Correto ]************** int i; int dobro(void) { return i*2; } void main(void) { printf(“Entre com um inteiro: ”); scanf(“%d”,&i); printf(“O dobro de %d eh %d\n”,i,dobro()); getch(); } Observe que a variável i foi declarada antes de qualquer função e isso a torna global e consequentemente acessível em qualquer lugar. Note que tanto a função dobro() quanto a função main() acessam normalmente a variável i. Num primeiro instante esta versatilidade pode parecer atrativa e simplificadora. Porém, algumas confusões podem ocorrer. Veja que a função dobro() só é capaz de efetuar o cálculo sobre esta variável, caso se necessário dobrar o valor de outra variável, a função dobro() não poderá ser utilizada. Outra confusão pode ser gerada, normalmente em programas maiores, quanto a duplicidade de nomes de variáveis. Um terceiro problema ocorre em contraste à principal vantagem das variáveis locais/formais que é a liberação do espaço de memória ocupado por uma variável local quando o bloco em que ela foi definida não esta em execução. As variáveis globais existem durante todo o tempo de execução do programa, mesmo que não sejam utilizadas. Algoritmo 139 Construa um programa em C que armazene um vetor de caracter de vinte posições. Implemente uma função que receba um caracter e que percorra o vetor trocando a ocorrência deste caracter por um *. A função deverá retornar a quantidade de substituições efetuadas. Algoritmo 140 Construa um programa em C que armazene um vetor de caracter de vinte posições. Implemente uma função que receba dois caracteres e que percorra o vetor trocando a ocorrência do primeiro caracter pelo segundo. Algoritmo 140 – Desafio 05 Construa um programa em C que armazene um vetor de 20 inteiros. Após o preenchimento do vetor, deve-se chamar a função Ordena(), que deverá colocar vetor em ordem crescente.
Compartilhar