460 likes | 584 Views
Prof. Gerson Pastre de Oliveira. Técnicas e Linguagem de Programação. Disciplina teórica : conceitos importantes são trabalhados em sala de aula;
E N D
Técnicas e Linguagem de Programação • Disciplina teórica: conceitos importantes são trabalhados em sala de aula; • Analisar problemas e projetar, implementar e validar soluções computacionais para os mesmos, através do uso de metodologias, técnicas e ferramentas de programação que envolvam elementos básicos da construção de algoritmos; • Aulas expositivas com base em apostilas, discussões em sala de aula, reuniões de grupo e elaboração de listas de exercícios, para resolução individual e/ou em grupo;
Técnicas e Linguagem de Programação • A avaliação bimestral é composta pelas notas de trabalhos individuais e/ou em grupo que correspondem a 20% da média bimestral e por uma prova individual que corresponde a 80% da nota final; • Bibliografia: • Apostilas semanais; • CORMEN, T.H.; LEISERSON, C.E. RIVEST, R.L. Introduction to Algorithms. MIT Press, 2000. • FORBELLONE, A. L. V.; Eberspächer, H. F. Lógica de Programação: a construção de algoritmos e estruturas de dados. São Paulo: Makron Books, 1993.
Conteúdo Programático • Noções de Programação; • Introdução a Linguagem Algorítmica; • Noções Gerais; Atribuição de variável; Algoritmos numéricos; Cláusula condicional; Comando composto; Operadores aritméticos; Variável Booleana; Comando Repetitivo. • Noções de Linguagem computacional; • Estrutura de programa; identificadores e variáveis; • Comentários; Comandos de leitura e escrita; • Operadores aritméticos e lógicos; • Comandos condicionais simples e compostos; • Laços. • Modularização; • Estrutura de dados; • Variáveis compostas heterogêneas (Registros e conjuntos de registros); • Arquivos; • Conceito, Organização e Operações.
O que é Lógica? • Coerência e racionalidade; • Só na matemática? E os demais assuntos? • “Correção de pensamento”: quais operações, de um determinado conjunto são válidas, analisando formas e leis preexistentes – e, eventualmente, padrões de um certo tipo; • Na verdade, estamos falando de uma verificação do próprio raciocínio; • Quando tratamos disto em Sistemas de Informação, estamos falando em aplicar todo o cabedal lógico humano na programação de computadores? • LÓGICA LINEAR X LÓGICA NEBULOSA; • Tudo ao seu tempo: como trata-se de nosso aprendizado inicial, partimos do elementar, passando pelo simples, rumo ao complexo.
Alguns outros exemplos • Lógica proposicional – Exemplo 1; • Todo mamífero é um animal; • Todo cavalo é mamífero; • Logo, todo cavalo é um animal. • Lógica proposicional – Exemplo 2; • Toda ave voa; • Todo morcego voa; • Logo, todo morcego é ave. • O primeiro silogismo acima é válido, enquanto que o segundo é um sofisma, ou seja, um argumento não-válido; • Lógica proposicional – Exemplo 3; • Estocolmo é a capital da Suécia; • O canguru é um marsupial; • Beethoven era surdo; • Se Estocolmo é a capital da Suécia e o canguru é um marsupial, então Beethoven era surdo.
Lógica? É lógico! • Não tem nada errado com o exemplo anterior? • Não, está tudo certo! É uma aplicação da chamada lógica proposicional (formal); • Vejamos um outro exemplo: • A variável x tem o valor 5; • A variável y tem o valor 3; • Se x é maior do 6 então z é igual a x mais y; senão, z é igual a x menos y. • Qual é o valor da variável z? • Resposta: 2; • Mais um exemplo: • Imagine um valor para x; • Imagine um valor para y; • Se x é menor que y então z é igual a x multiplicado por 2; senão, z é igual a y dividido por 2. • Qual é o valor da variável z, agora? • Resposta: Depende!
Uso da lógica no dia-a-dia • Nas mais corriqueiras atividades cotidianas, usamos lógica: para ordenar as atividades, para classificar as tarefas, para analisar questões,... • Uso de lógica para pegar uma caneta em uma gaveta: • A gaveta está fechada; • A caneta está dentro da gaveta; • Para pegar a caneta, preciso abrir a gaveta. • O mesmo problema pode apresentar-se – ou ser declarado de maneira lógica – de forma mais complexa e/ou completa: • A gaveta está trancada? • Sim: Eu tenho a chave? • Sim: Destrancar; Abrir a gaveta; Ir p/ o passo 2; • Não: Ir para o passo 4; • Não: Abrir a gaveta; • A caneta está na gaveta? • Sim: Pegar a caneta; • Não: Não pegar coisa alguma; • Fechar a gaveta; • Terminar.
Lógica de programação • Trata-se da resolução de problemas e/ou desempenho de tarefas, de maneira eficiente e eficaz, através de processos formais de racionalização; • Definição de passos e/ou etapas e suas conseqüentes interligações, de maneira racional, provendo uma solução que resolva uma tarefa específica (da melhor maneira possível); • Existe um produto que representa a solução procurada: o programa; • O raciocínio é, então, a ferramenta primordial; • Como as linguagens computacionais são diferentes, pode ocorrer alguma dificuldade na transformação da solução-raciocínio na solução-produto (programa).
? ? Algoritmo
ALGORITMOS • Chama-se de algoritmo a seqüência de instruções, ordenadas de forma lógica, para a resolução de uma determinada tarefa ou problema; • Em outras palavras, “um algoritmo é processo sistemático para a resolução de um problema”; • “Um algoritmo computa uma saída, o resultado do problema, a partir de uma entrada”, ou seja, “as informações inicialmente conhecidas e que permitem encontrar a solução do problema”; • “Durante o processo de computação, o algoritmo manipula dados, gerados a partir de sua entrada”.
ALGORITMO 1 • Pegar um macaco e uma chave de roda; • Posicionar o macaco embaixo do carro; • Pegar o estepe; • Subir o carro; • Soltar os parafusos e tirar o pneu; • Colocar o estepe e apertar os parafusos. • Objetivo: trocar um pneu; • Seqüência; • E se o pneu não estiver furado? • Inserir um teste!
ALGORITMO 2 • Pegar um macaco e uma chave de roda; • Posicionar o macaco embaixo do carro; • Pegar o estepe; • Verificar se o pneu está furado; • Se o pneu estiver furado, então • Subir o carro; • Soltar os parafusos e tirar o pneu; • Colocar o estepe e apertar os parafusos. • Teste seletivo, determinando quais ações serão executadas; • Está correto! • Evidentemente, pode ser melhorado... • Mudar o lugar do teste.
ALGORITMO 3 • Verificar se o pneu está furado; • Se o pneu estiver furado, então • Pegar um macaco e uma chave de roda; • Posicionar o macaco embaixo do carro; • Pegar o estepe; • Subir o carro; • Soltar os parafusos e tirar o pneu; • Colocar o estepe e apertar os parafusos; • Descer o carro; • Guardar o pneu. • Há outras formas de resolver o problema; • Melhor solução: mesmo resultado com o menor esforço possível; • E se o estepe também estiver furado? (supondo que temos muitos estepes)
ALGORITMO 4 • Verificar se o pneu está furado; • Se o pneu estiver furado, então • Pegar um macaco e uma chave de roda; • Posicionar o macaco embaixo do carro; • Pegar o estepe; • Se o estepe estiver furado • Pegar outro estepe • Se o estepe estiver furado • Pegar outro estepe ... • Subir o carro; • Soltar os parafusos e tirar o pneu; • Colocar o estepe e apertar os parafusos; • Descer o carro; • Guardar o pneu. • Até quando pegar outro estepe?
ALGORITMO 5 • Verificar se o pneu está furado; • Se o pneu estiver furado, então • Pegar um macaco e uma chave de roda; • Posicionar o macaco embaixo do carro; • Enquanto o estepe estiver furado, faça • Pegar o estepe; • Subir o carro; • Soltar os parafusos e tirar o pneu; • Colocar o estepe e apertar os parafusos; • Descer o carro; • Guardar o pneu. • Existe um número virtualmente ilimitado de ações do tipo “Pegar o estepe”; • Há um teste de parada, ou seja, quando um estepe sem furo for encontrado, a ação seguinte será feita; • E para trocar os quatro pneus?
ALGORITMO 6 • Verificar se o primeiro pneu está furado; • Enquanto o número de pneus verificados for menor ou igual a 4, faça • Se o pneu estiver furado, então • Pegar um macaco e uma chave de roda; • Posicionar o macaco embaixo do carro; • Enquanto o estepe estiver furado, faça • Pegar o estepe; • Subir o carro; • Soltar os parafusos e tirar o pneu; • Colocar o estepe e apertar os parafusos; • Descer o carro; • Guardar o pneu. • Próximo pneu;
Pseudocódigo • Para o desenvolvimento de algoritmos, pode-se usar uma pseudolinguagem, com algumas convenções simbólicas; • Apesar dos pseudocódigos não constituírem uma linguagem de programação, é importante que os mesmos mantenham uma estrutura definida; • Sintaxe: manter a convenção simbólica adotada; • Pode usar de uma certa flexibilidade, o que não é admissível em uma linguagem de programação; • Alguns elementos importantes: operadores aritméticos, operadores lógicos, variáveis, constantes, tipos de dados, identificadores, instruções e funções
Variáveis • Variáveis são estruturas destinadas a guardar temporariamente uma certa categoria de dados (isto ocorre durante a execução de um algoritmo); • Uma variável pode ser alterada em um determinado momento durante a execução de um algoritmo; • Pode-se enxergar uma variável como uma “caixa”, na qual armazenamos determinado valor, que pode ser usado, alterado e manipulado durante o algoritmo; • Para poder ser identificada, uma variável tem um “rótulo”, um nome, que chamamos de identificador; • Com alguns exemplos, poderemos entender este conceito:
Variáveis G X A 5 Caracter Inteiro 16.3 Falso Fix12 R5 Real Lógico
Tipos de dados • Todos os dados armazenados em alguma estrutura de um algoritmo são de determinados tipos; • Os tipos de dados básicos, aplicáveis a variáveis e constantes, são: • INTEIRO: constituído por números inteiros (sem parte decimal); • REAL: constituído por números “não-inteiros”, ou seja, números que possuem parte inteira e parte decimal (números reais); • CARACTER: constituído por um (e apenas um) dígito alfanumérico (A..Z, 0..9, *, -, etc.); • LÓGICO: constituído pelos valores lógicos VERDADEIRO e/ou FALSO.
Identificadores • Identificadores são os nomes ou “rótulos” dados a variáveis e/ou constantes na estrutura algorítmica; • As regras de construção de identificadores dependem da ferramenta computacional (linguagem) utilizada, variando de uma para outra; • Pode-se, entretanto, usar algumas regras universalmente aceitas: • Começar por um caractere alfabético (A..Z ou a..z); • Caso seja maior do que um caractere, os demais deverão ser outros caracteres alfabéticos ou numéricos; • Não usar caracteres especiais.
Constantes • Constantes são estruturas destinadas a armazenar definitivamente, durante a execução de um algoritmo, uma certa categoria de dados; • Ao contrário de uma variável, uma constante não pode ter seu valor alterado durante a execução do algoritmo; • As regras válidas para identificadores, tipos de dados e atribuição em variáveis são válidas, igualmente, para as constantes; • Exemplo de uma constante “clássica”: PI = 3,1416
Atribuição • O comando de atribuição é utilizado para guardar um valor em uma variável ou constante; • Semelhante valor pode ser atribuído de maneira simples – um valor como 11 (inteiro), 45,325 (real), a (caracter) – ou através de uma operação qualquer (vide próximo slide); • A atribuição é representada pelo sinal de igual (=) ou, eventualmente, pelos sinal gráfico dois pontos (:) junto com o sinal de igual (:=); • Mais adiante, veremos como se faz a declaração de variáveis, mas desde já devemos saber que uma atribuição não pode ser feita para uma variável incompatível com o tipo de atribuição proposto; • Suponha que FG seja uma variável numérica do tipo inteiro: Atribuição válida: FG = 150 Atribuições inválidas: FG = 12.56 FG = “P” Obs: Variáveis do tipo caracter devem ser atribuídas com aspas. Ex: var1 = “G”
Operadores Aritméticos * Multiplicação / Divisão + Adição – Subtração % Resto de divisão inteira1 Exemplos: A = 5 * 2; X = A + C; B = 10 / 4; Y = D / 2; C = 15 + 11; D = 19 – 7. 1 - não é um operador aritmético clássico Os exemplos são comandos de atribuição
Estrutura genérica... ALGORITMO <identificador>; CONSTANTES <identificador> = <valor_constante>; VARIÁVEIS <identificador> : <tipo_variável>; INÍCIO <instrução1>; <instrução2>; <instrução3>; ... ... ... <instruçãoN>; FIM.
DECLARAÇÃO DE VARIÁVEIS E CONSTANTES INSTRUÇÕES DE ENTRADA/SAÍDA E ATRIBUIÇÕES ALGORITMO 7 ALGORITMO números; CONSTANTES fator = 2; VARIÁVEIS num1, num2, dobro, soma :INTEIRO; metade : REAL; INÍCIO ESCREVER(“Primeiro número : ”); LER(num1); ESCREVER(“Segundo número : ”); LER(num2); soma:=num1+num2; dobro:=soma * fator; metade:=soma / fator; ESCREVER(soma, dobro, metade); FIM.
Explicando... • O exemplo anterior deixou mais clara a estrutura de um algoritmo com o pseudocódigo que utilizaremos no curso; • Em princípio, todo o algoritmo deve receber um nome, que é dado por um identificador após a palavra ALGORITMO (no exemplo, o algoritmo tem o nome de números); • As constantes e variáveis que serão utilizadas devem ser declaradas em uma área própria (temos, no exemplo, a constante fator declarada na área CONSTANTES e as variáveis num1, num2, dobro, soma e metade declaradas na área VARIÁVEIS); • Desde o INÍCIO até o FIM, temos a parte operacional do algoritmo, ou seja, diretivas chamadas de INSTRUÇÕES (e, eventualmente, de FUNÇÕES) são utilizadas para a execução das finalidades do algoritmo, incluindo a utilização de variáveis e constantes e de comandos de ATRIBUIÇÃO;
Explicando... • Em breve, veremos que uma instrução e/ou declaração pode exceder o espaço de uma linha; • De qualquer forma, utilizaremos o sinal gráfico ponto-e-vírgula (;) para identificar o final de uma declaração e/ou instrução; • As expressões INÍCIO e FIM também poderão aparecer diversas vezes em um mesmo algoritmo; • Para identificar a expressão que indica o final de todas as operações algorítmicas, utilizaremos o sinal gráfico ponto (.);
Declarações • Variáveis e constantes devem ser declaradas na seções próprias do algoritmo antes de serem usadas; • A declaração de uma variável implica na definição do tipo de dado que a mesma poderá conter. Exemplos: a, b, resultado : INTEIRO; resposta, cont : CARACTER; média : REAL; verifica : LÓGICA; • Uma constante é sempre declarada em conjunto com o seu valor. Exemplo: pi = 3,1416; fac = “Politécnica”; num = 5; x = VERDADEIRO;
Instruções • Também conhecidas como comandos, tem a finalidade de executar uma ação qualquer na estrutura algorítmica (entrada, saída, condicional, repetição, etc); • A instrução de entrada é representada pela palavra LER, e tem por função identificar a entrada de dados em um algoritmo, sempre através de uma variável. LER (<variável1>,[<variável2>],...,[<variável_n]); • Podem ser lidas várias variáveis em uma só instrução LER ou apenas uma; • A(s) variável(is) lida(s) deve(m) ficar entre parênteses; • Por uma questão de organização, não convém “misturar” variáveis de diferentes tipos em uma mesma instrução LER; • Para ser lida, uma variável deve ter sido declarada.
Instruções • A instrução de entrada é representada pela palavra ESCREVER, e tem por função identificar a saída de dados de um algoritmo, o que pode acontecer através de uma variável, de uma constante ou de uma cadeia de caracteres; ESCREVER (<var1>,[<var2>],...,[<var_n]); ESCREVER (<const1>,[<const2>],...,[<const_n>]; ESCREVER (“<cadeia_caracteres”); ESCREVER (“<cadeia_caracteres”, <var/const>); • Podem ser escritas diversas variáveis e/ou constantes em uma única instrução ESCREVER (misturar constantes e variáveis é permitido); • Uma cadeia de caracteres (mensagem) também pode ser escrita com o mesmo comando, isoladamente ou em conjunto com variáveis e/ou constantes.
Instruções • Para qualquer instrução que utilize uma série de variáveis, as mesmas devem ser separadas pelo sinal gráfico vírgula (,); • Um comando ESCREVER também pode ser usado para efetuar cálculos sem a necessidade de atribuição de valores; • Exemplos (trechos de algoritmos, considerando todas as variáveis do tipo INTEIRO): x:=10 + 20 * 2; y:=x / 2 – 1; ESCREVER(“Resultados”); ESCREVER(“Valores : ”,x,y); LER(x,y); LER(z); ESCREVER(“Soma das variáveis: ”,x+y+z);
Alguns detalhes... • Instruções e demais palavras-chave (aí incluídas expressões como INÍCIO e FIM), bem como tipo de variáveis devem ser grafadas em letras maiúsculas; • As demais expressões da estrutura algorítmica (como nome de variáveis e constantes, por exemplo) devem ser grafadas em letras minúsculas; • Os diversos níveis do algoritmo devem ser destacados através de endentação, de modo que seja possível perceber quando determinadas linhas pertencem a um conjunto distinto; • Cadeias de caracteres (ou mesmo caracteres isolados) deverão sempre ser inseridos entre aspas (“ ”), em qualquer lugar onde sejam necessários (instruções ou atribuições, por exemplo).
ALGORITMO 8 Construir um algoritmo para ler 4 notas de um aluno e calcular sua média. Imprimir a média e o nome da matéria (“Algoritmos”). ALGORITMO média_aluno; CONSTANTES matéria = “Algoritmos”; VARIÁVEIS nota1, nota2, nota3, nota4, média : REAL; INÍCIO LER(nota1, nota2, nota3, nota4); média:=(nota1+nota2+nota3+nota4) / 4; ESCREVER(matéria,média) FIM.
ALGORITMO 9 Construir um algoritmo para, dado o raio, calcular a área de um círculo. Lembre-se que Área = .R2 ALGORITMO área_círculo; CONSTANTES pi = 3,141592654; VARIÁVEIS raio, área : REAL; INÍCIO LER(raio); área:=pi * raio * raio; ESCREVER(área) FIM.
Exercícios • Calcular a quantidade de tijolos necessária para a construção de uma parede, tendo como dados de entrada a altura da parede, a largura da parede, o comprimento do tijolo e a largura do tijolo; • Calcular o salário mensal de um funcionário, considerando os seguintes dados de entrada: nº de dias trabalhados no mês, valor da hora de trabalho, número de horas extras. Considere que cada dia de trabalho tem 8 horas e que o valor da hora extra é 20% maior que o valor da hora normal; • Construa um algoritmo para que, dado um número inteiro maior 9, seja possível determinar o algarismo que representa as unidades deste número; • Construa um algoritmo para que, dado um número inteiro maior 9 e menor do que 100, seja possível inverter seus dois algarismos; • Construa um algoritmo para que, dadas duas variáveis quaisquer, seus valores possam ser invertidos (ex: variáveis a e b, o valor de a passa para b e vice-versa – não esqueça que ao trocar o valor de uma variável, o anterior é perdido).
ALGORITMO 10 Calcular a quantidade de tijolos necessária para a construção de uma parede, tendo como dados de entrada a altura da parede, a largura da parede, o comprimento do tijolo e a largura do tijolo. ALGORITMO parede; VARIÁVEIS areap, alturap, larguarap : REAL; areat, compt, largurat, quant : REAL; INÍCIO ESCREVER(“Dados da parede: ”); LER(alturap, largurap); ESCREVER(“Dados dos tijolos: ”); LER(compt, largurat); areap:=largurap * alturap; areat:=compt * largurat; quant:=areap / areat; ESCREVER(“Quantidade necessária: ”, quant); FIM.
ALGORITMO 11 Calcular o salário mensal de um funcionário, considerando os seguintes dados de entrada: nº de dias trabalhados no mês, valor da hora de trabalho, número de horas extras. Considere que cada dia de trabalho tem 8 horas e que o valor da hora extra é 20% maior que o valor da hora normal. ALGORITMO salário; CONSTANTES dia = 8; VARIÁVEIS diast, numhe : INTEIRO; valorht, valorhe, salário : REAL; INÍCIO ESCREVER(“Quantidade de trabalho: ”); LER(diast, numhe); ESCREVER(“Valor da hora de trabalho: ”); LER(valorht); valorhe:=valorht * 1,2; salário:=(diast*dia*valorht) + (numhe*valorhe); ESCREVER(“Salário: ”, salário); FIM.
ALGORITMO 12 Construa um algoritmo para que, dado um número inteiro maior 9, seja possível determinar o algarismo que representa as unidades deste número. ALGORITMO unidades; VARIÁVEIS n, unid : INTEIRO; INÍCIO ESCREVER(“Número: ”); LER(n); unid:=n % 10; ESCREVER(“Unidades: ”, unid); FIM.
ALGORITMO 13 Construa um algoritmo para que, dado um número inteiro maior 9 e menor do que 100, seja possível inverter seus dois algarismos. ALGORITMO inverte; VARIÁVEIS n, unid, dez, inv : INTEIRO; INÍCIO ESCREVER(“Número entre 10 e 99: ”); LER(n); unid:=n % 10; dez:=(n – unid) / 10; inv:=unid * 10 + dez; ESCREVER(“Invertido: ”, inv); FIM.
ALGORITMO 14 Construa um algoritmo para que, dadas duas variáveis quaisquer, seus valores possam ser invertidos (ex: variáveis a e b, o valor de a passa para b e vice-versa – não esqueça que ao trocar o valor de uma variável, o anterior é perdido). ALGORITMO troca; VARIÁVEIS a, b, aux : CARACTER; INÍCIO ESCREVER(“Valor de a: ”); LER(a); ESCREVER(“Valor de b: ”); LER(b); aux:=b; b:=a; a:=aux; ESCREVER(“O valor de a agora: ”, a); ESCREVER(“O valor de b agora: ”, b); FIM.