Baixe o app para aproveitar ainda mais
Prévia do material em texto
Elementos básicos de algoritmos (estruturas sequenciais) Profa. Marluce Rodrigues Pereira Elementos Básicos de um Algoritmo Um algoritmo deve expressar os principais elementos de um programa, a saber: ● Dados (constantes e variáveis); ● Tipos de Dados; ● Operadores; ● Comandos; ● Funções; ● Comentários. Dado Um dado é uma informação que um algoritmo recebe ou manipula. Ex: nomes, datas, valores (preços, notas, etc.) e condições (verdadeiro e falso) Variáveis Em diversas situações estamos interessados em armazenar e processar informações, como o saldo de uma conta bancária, a nota de um aluno, etc. Essas informações são valores que variam com o contexto (donde o nome variável) e ocupam um espaço da memória do computador. Variáveis podem representar quantidades (ex: valores) ou qualidades (ex: positivo/negativo). Exemplo de algoritmo Início A, B, C AA>B B>C A>C B Sim Sim Sim NãoNão Não C Fim A← A+10 B← B+10 C← C+10 Problema: Encontre o maior de 3 números com valores diferentes, some 10 ao valor desse número e imprima-o. Exemplo de algoritmo- linguagem natural Início A, B, C AA>B B>C A>C B Sim Sim Sim NãoNão Não C Fim A← A+10 B← B+10 C← C+10 Problema: Encontre o maior de 3 números com valores diferentes, some 10 ao valor desse número e imprima-o. A, B e C são dados de entrada Exemplo de algoritmo - linguagem de programação #include <iostream> using namespace std; int main() { int A, B, C; cin >> A >> >> C; if (A>B) { if (A>C) { A = A+10; cout << A; } else { C = C+10; cout << C; } } else { //} else { //continuação if (B>C){ B = B+10; cout << B; }else { C = C+10; cout << C; } } return 0; } A, B e C armazena m os dados de entrada Tipos de dados Todo dado é de um certo tipo que define sua natureza (p. ex., um nome é diferente de um valor), identificando seu uso, e define as operações que podem ser realizadas com o dado. Exemplo de algoritmo - linguagem de programação #include <iostream> using namespace std; int main() { int A, B, C; cin >> A, B, C; if (A>B) { if (A>C) { A = A+10; cout << A; } else { C = C+10; cout << C; } } else { //} else { //continuação if (B>C){ B = B+10; cout << B; }else { C = C+10; cout << C; } } return 0; } A, B e C são do tipo inteiro (int) Características de uma variável ● Ocupa espaço na memória ● Existe apenas em tempo de execução ● Possui uma identificação (nome) ● Armazena um dado ● Possui um tipo (uma forma de dado, ex.: inteiro, texto, número de ponto flutuante, etc.) Tipos de variáveis Em geral, linguagens de programação permitem a representação de diferentes tipos de dados: ● Inteiros ● Números de ponto flutuante (para representação de números decimais e aproximações de números reais) ● Caracteres ● Textos Variáveis numéricas Inteiro: representa um número inteiro dentro de uma determinada faixa. Ex: -1, 0, 1, e 26 são dados inteiros. Ponto flutuante: também chamado erroneamente de real, representa um número racional ou em ponto flutuante. Ex: 1,2; 0,0; 26,4, 8x10-4, 3,145x1014 e -2,49 são dados em ponto flutuante. Cuidados com variáveis numéricas No projeto de um algoritmo devemos utilizar o tipo numérico mais adequado, tomando cuidado com o tipo de dado que será utilizado na resolução para não haver conflitos, por exemplo, a declaração de uma variável inteira para tratamento de valores não inteiros. Variáveis alfanuméricas - i Dados que representam valores alfanuméricos unitários são do tipo caracter. Ex: 'A', 'a', '*' Dados alfanuméricos também podem ser tratados pelo tipo caracter e incluem letras, algarismos e símbolos. Ex: '1' é um caracter se considerarmos apenas o símbolo '1' e não o valor 1. Variáveis alfanuméricas - ii Dados que representam valores alfanuméricos são do tipo caracter (char) ou cadeia de caracteres (string) Ex: 'A', 'a', '*' (char) “Casa”, “F-15” (string) Diferença: operações e tamanho de memória utilizado Variáveis lógicas Dados lógicos podem assumir apenas dois valores: verdadeiro ou falso. São usados para expressar uma condição: Ex: o fato de que 10 > 9 é verdadeiro; São também chamados booleanos (referência à teoria de George Boole). Resumindo... char letra = ‘A’ [0001] int numero = 12 [0002-0005] string palavra = “oi” [0006-0008] bool condicao = true [0009] Nem sempre! 0001 0002 0003 0004 0005 0006 0007 0008 0009 memória Tipos primitivos Linguagens de programação possuem em geral um conjunto de tipos básicos (também chamados de primitivos) e tipos adicionais que possibilitam a definição de variáveis compostas ou extensão dos tipos básicos. Em geral, os tipos primitivos permitem a representação de valores numéricos e textuais. Tipificação Forte x Fraca Algumas linguagens exigem que os tipos das variáveis sejam especificados e eles não podem ser modificados (tipificação forte). Algumas linguagens permitem que uma variável represente dados de diferentes tipos. Ex. Tipificação Fraca Python 3.4.3 on Linux >>> x = 8 >>> y = 2 >>> z = x + y >>> z 10 >>> y = "oi" >>> x = "oi" >>> z = x + y >>> z 'oioi' É possível mudar os tipos de dados representados! Ex. Tipificação Forte C++ // teste.cpp # include <iostream> using namespace std; int main() { int x; cin >> x; cout << "o valor de x é: " << x << endl; x = "oi"; // ERRO!!! return 0; } Tipos fundamentais em C++ * depende do compilador ** do ponto de vista teórico, uma string não é tipo primitivo, pois em geral sua implementação utiliza composição de outros tipos, por exemplo um vetor de caracteres; consideraremos como tipo fundamental por questões práticas. char caracteres (na verdade inteiros entre -128 a 127) - 1 byte (unidade básica de representação em memória) int inteiros (geralmente entre -2.147.483.648 e 2.147.483.647)* - 4 bytes unsigned int naturais (geralmente entre 0 a 4.294.967.295)* - 4 bytes bool true / false - 1 byte float valores em ponto flutuante (geralmente entre 1,2x10-38 a 3,4x1038)* - 4 bytes double valores em ponto flutuante (geralmente entre 2,2x10-308 a 1,8x10308)* - 8 bytes string textos** Declaração de variáveis em C++ Podem ser declaradas com ou sem valor inicial (inicialização): nomeDoTipo nomeDaVariável = valor; Exemplos: float numerador; float denominador = n + 1; Tentar usar o valor de variáveis que nunca ganharam valor é um erro comum. Constantes Constantes são valores que não se modificam durante a execução do código e ocupam local reservado em memória. Ex: const int x = 4; Nesse caso, o valor de x não pode ser modificado! Identificadores Exceto casos muito especiais, duas variáveis diferentes não podem ter o mesmo nome C++ diferencia maiúsculas e minúsculas. Os seguintes identificadores são diferentes: job, joB, jOb, jOB, Job, JoB, JOb, JOB Pode-se usar underscore, ou misturar maiúsculas e minúsculas para melhorar a legibilidade: valor_funcao, resultado_operacao, etc. valorFuncao, resultadoOperacao, etc. Palavras Reservadas Algumas palavras são reservadas, e não podem ser usadas como identificadores, ex: if, main, break, int, float, for, while, etc. Atribuição Para que uma variável possa ser utilizada em um programa, ela deve ter valores associados a ela. Esta associação é denominada atribuição. Em pseudocódigo, a atribuição geralmente é representada pelo operador '←'. Ex: idade ← 21 nome ← 'Antonio' salario ← 915,00 salario_total ← salario Exemplo de atribuição - i idade nome salario_total salario memória 21 memória idade ← 21 Obs: regiõesde memória com tamanhos diferentes! Exemplo de atribuição - ii 21 Antonio 915,00 idade nome salario_total salario memória 21 memória nome ← 'Antonio' salario ← 915,00 Exemplo de atribuição - iii 21 Antonio 915,00 915,00 idade nome salario_total salario memória 21 Antonio 915,00 memória salario_total ← salario Exemplo de atribuição - iii 21 Antonio 915,00 915,00 idade nome salario_total salario memória 21 Antonio 915,00 memória salario_total ← salario Valor de salario_total é separado de salario (caso salario seja alterado, salario_total continuará com valor anterior! Entrada e saída - i Um algoritmo geralmente recebe dados a serem manipulados. Tais dados podem ser fornecidos pelo usuário através do teclado ou mouse, por exemplo, ou ainda tais dados podem ser buscados no disco rígido, recebidos através de uma rede ou outros meios. Os resultados podem ser enviados para o monitor ou para uma impressora, por exemplo. O recebimento de dados por uma algoritmo e a apresentação dos resultados, independente dos dispositivos utilizados, são denominadas operações de Entrada e Saída. Entrada e saída - ii Função Parâmetros Resultado Leia (x) Variável de qualquer tipo básico O valor digitado no teclado vai ser armazenado em x Escreva (x) Variável, constante ou qualquer expressão de qualquer tipo básico O valor armazenado em x será apresentado no monitor Operações básicas em C++ Entrada e Saída [entrada] cin >> var1 >> var2 >> var3; [saída] cout << “texto” << var1 << “texto” << var2; Atribuição variável = valor; var1 = var2 + var3; Olá, Mundo! #include <iostream> using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; } Olá, Mundo! #include <iostream> using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; } Inclui biblioteca básica de entrada e saída Olá, Mundo! #include <iostream> using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; } Espaço de nomes utilizados (escopo) Olá, Mundo! #include <iostream> using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; } Função principal main() Olá, Mundo! #include <iostream> using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; } Uso de entrada e saída (apenas saída) Olá, Mundo! #include <iostream> using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; } Término da main() return 0 indica sucesso do programa Expressões Expressões são combinações de constantes, variáveis e operadores para produzir valores. As expressões mais simples são as variáveis e constantes. Expressões compostas aplicam operadores (+,-,*,/, etc) a operandos (que são outras expressões). Em a+(b*c) o operador + é aplicado em a e (b*c), que são expressões por si próprias Operadores aritméticos Podem ser binários ou unários. Operadores unários requerem apenas um operando: +a; -a; Operadores binários requerem dois operandos: a+b; a*b; a/b; a%b; O operador % retorna o resto da divisão inteira entre dois números: i = 23; j = i%2; // j = i mod 2 Precedência entre operadores Como a expressão i+j*k será avaliada? (i+j)*k ou i+(j*k)? Operações com maior precedência são realizadas primeiro i+j*k → i+(j*k) -i*-j → (-i)*(-j) +i+j/k → (+i)+(j/k) Ordem: 1) Operadores Unários (+ e -) 2) Multiplicação, divisão e resto (*, / e %) 3) Soma e subtração (+ e -) Associatividade Operadores com a mesma precedência são avaliados de acordo com a associatividade. Em operadores associativos à esquerda (+ e - binários, *, /, e %), as operações mais à esquerda são executadas primeiro. a*b/c*d → ((a*b)/c)*d) Em operadores associativos à direita (- e + unários), as operações mais à direita são executadas primeiro -+i → -(+i) Exemplos Recomendação Tentar decorar a precedência de operadores é uma má ideia. Sempre use parênteses para garantir que a operação será executada na ordem desejada. Inteiros e Ponto Flutuante Com exceção do operador %, os demais permitem que os operandos sejam inteiros ou em ponto flutuante. Quando inteiros e reais são misturados, o resultado será sempre ponto-flutuante: 9+2,5 terá valor 11,5 6,7/2 terá valor 3,35 Importante: a divisão de dois números inteiros resultará em um número inteiro! 7/2 terá valor 3 Atribuição Composta Considere a atribuição i = i + 2; Esta operação pode ser simplificada i += 2; O operador += adiciona o valor à direita à variável da esquerda Outros operadores compostos: -=, *=, /=, %= Incremento e decremento Uma das operações mais comuns em programas é aumentar ou diminuir o valor de uma variável em uma unidade (i = i+1) ou (i = i-1). Com o operador composto, isto fica: i += 1; ou i -= 1; O mais comum é usar os operadores ++ e -- i++; ou i--; Biblioteca <cmath> #include <cmath> habilita os seguintes recursos: Potenciação (pow(base, expoente), sqrt) Trigonometria (cos, sin, tan, acos, asin, atan) Arredondamento (ceil, floor) Valor absoluto / módulo (abs) π (M_PI) http://www.cplusplus.com/reference/cmath/ http://www.cplusplus.com/reference/cmath/ Comentários Comentários são textos que aparecem no programa, mas não são executados, servindo para que possamos colocar lembretes e outras informações no código. São utilizados para descrever um algoritmo ou parte dele. São importantes para aumentar a legibilidade ou entendimento da solução expressa por um algoritmo. Podem ser usados para indicar o significado das variáveis e constantes utilizadas. Comentários em C++ Opção 1: começam com /* e terminam com */. /* Comentários desse tipo podem ter várias linhas.*/ Opção 2: começam com //. // Este tipo de comentário // termina automaticamente no fim da linha. Comentários - Exemplo #include <iostream> /* Meu primeiro programa de IALG */ // by Sicrano Fulano, 2015 using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; } Linhas em branco e indentação São utilizados aumentar a legibilidade de um algoritmo; São utilizados para delimitar blocos de comandos, facilitando entendimento da lógica empregada; Estruturas condicionais devem sempre ser indentadas para facilitar o entendimento de quais comandos serão executados por cada alternativa possível. Exemplo - indentação #include <iostream> using namespace std; int main( ) { int x; cin >> x; cout << "Exemplo de indentação" << endl; if ( x > 10 ) { cout << "Outro exemplo de indentação" << endl; } return 0; } Indentação: tabs ou espaços? Indentação pode ser conseguida com uso de tabulação (tabs) ou espaços. Maioria dos desenvolvedores preferem espaços, pois fica independente do editor. Esta é a recomendação dos professores. Como configurar indentação no Geany ● Vá em “Documento” e selecione “Indentação Automática”; ● Em seguida, ainda em “Documento”, vá em “Tipo de Indentação” e selecione “Espaços”. ● Depois de selecionar o tipo de indentação, é necessário indicar o tamanho. Em “Documento”, vá em “Largura da Indentação” e escolha quantos espaços você quer que sejam usados para a indentação. Em geral, são utilizados quatro espaços. ● Caso tenha recebido documento com tabulação, você pode ainda em “Documento” utilizar “Substituir tabs por espaços”. Dicas adicionais antes de começar ➢ Desenvolva o algoritmo em etapas; ➢ Procure usar nomes de variáveis significativos, auto-explicativos, mesmo que fiquem longos; ➢ Identifique se os passos individuais são suficientes independentes um dos outros; ➢ Revise o algoritmo em busca de possíveis erros lógicos e exceções que possam ser tratados. Exemplo - calcular a média de duas notas Algoritmo Calcula_Media nome : cadeia de caracteres; nota1, nota2, media : real; Inicio escreva (“Digite o nome do aluno:”); leia (nome); escreva (“Digite as notas N1 e N2 do aluno:”);leia (nota1, nota2); media ← nota1 + nota2 / 2; escreva(“A média do aluno ”, nome, “ é ”, media); Fim Exemplo - calcular a média de duas notas Algoritmo Calcula_Media nome : cadeia de caracteres; nota1, nota2, media : real; Inicio escreva (“Digite o nome do aluno:”); leia (nome); escreva (“Digite as notas N1 e N2 do aluno:”); leia (nota1, nota2); media ← ( nota1 + nota2 ) / 2; escreva(“A média do aluno ”, nome, “ é ”, media); Fim Definição - Estrutura Sequencial Pseudocódigo comando 1; comando 2; comando 3; ... comando N; Fluxograma comando 1 comando N ESTRUTURA SEQUENCIAL Passos executados em uma seqüência pré-definida. comando 2 comando 3 Exemplo de estrutura sequencial Calcular a área de um triângulo dados seus três lados. programa AREA_TRIANGULO A,B,C : inteiros; Inicio leia(A, B, C) P ← (A + B + C)/2 AREA ← RAIZQ(P*(P−A)*(P−B)*(P−C)) escreva(AREA) fim Sobre este material Material produzido coletivamente, principalmente pelos seguintes professores do DCC/UFLA: ● Janderson Rodrigo de Oliveira ● Joaquim Quinteiro Uchôa ● Juliana Galvani Greghi ● Renato Ramos da Silva ● Marluce Rodrigues Pereira Inclui contribuições de outros professores do setor de Fundamentos de Programação do DCC/UFLA. Esta obra está licenciado com uma Licença Creative Commons Atribuição 4.0 Internacional. http://creativecommons.org/licenses/by/4.0/
Compartilhar