Lógica de Programação Algoritmos e implementação Este material aborda os conceitos básicos de lógica de programação, com o intuito de auxiliar o aluno nos seus primeiros passos na programação de computadores. Versão: 1.03 Me. Marcos Roberto de Moraes - Maromo 01/08/2013
Lista de Figuras Figura 1 - Planilha Eletrônica... 5 Figura 2 - Trecho do programa Chrome em Binário (Fonte: K19)... 6 Figura 3 - Trecho de programa na Linguagem C#... 7 Figura 4 Compilação... 7 Figura 5 - Ilustração do Funcionamento de uma Máquina Virtual (Fonte: K19)... 8 Figura 9 Fila de Pessoas... 9 Figura 10 - Receita (Fonte: obadenbaden.com.br)... 10 Figura 11 - Principais formas usadas em fluxogramas (símbolos mais usados)... 12 Figura 12 - Fluxograma para soma de dois valores... 13 Figura 13 - Zebra (imagem construída em ASCII)... 15 Figura 14 - Exemplo de Tipos de dados na Linguagem C... 16 Figura 15 - Exemplo de declaração em C#... 17 Figura 16 - Exemplo de declaração em Java... 17 Figura 17 - Exemplo de inicialização em C#... 17 Figura 18 - Exemplo de inicialização em Java... 18 Figura 19 - Exemplo de nomes de variáveis válidos utilizando caracteres especiais em outros idiomas.... 20 Figura 20 - Operadores Matemáticos... 21 Figura 21 - Exemplo de uso de operador de verificação de igualdade em C#... 22 Figura 22 - Exemplo de uso do operador && em C#... 22 Figura 23 - Exemplo de Tabela da Verdade... 22 Figura 24 Fluxograma: média de duas notas... 26 Figura 25 - Exemplo If/then/else... 27 Figura 26 - Fluxograma com cadeia de ifs... 28 Figura 27 - Cadeia de Ifs em C#... 29 Figura 28 - Código Fatorial em C# (Condição pré-testada )... 35 Figura 29 - Código Fatorial em C# (Condição pós-testada )... 36 Figura 30 - Código Fatorial em C# (Comando for)... 37 Figura 31 - Exemplo de um algoritmo para o cálculo da média de 4 notas... 41 Figura 32 - Programa Visualg... 42 1
Sumário 1 Introdução... 4 2 Programação... 5 2.1 Programa... 5 2.2 Linguagem de Máquina... 6 2.3 Linguagem de Programação... 6 2.4 Compilador... 7 2.5 Máquinas Virtuais... 7 2.6 Exercícios de Fixação... 8 3 Lógica de Programação... 9 3.1 Lógica... 9 3.2 Algoritmos e Implementação... 10 3.3 Representação dos Algoritmos... 11 3.3.1 Linguagem Natural... 11 3.3.2 Fluxogramas... 11 3.3.3 Pseudocódigo... 13 3.4 Exercício de Fixação... 14 4 Tipos de Dados... 15 4.1 Constantes... 16 4.1.1 Constantes Inteiras... 16 4.2 Variáveis... 16 4.2.1 Declaração... 17 4.2.2 Inicialização... 17 4.3 Tipos de variáveis... 18 4.3.1 Tipos primitivos em C... 18 4.3.2 Tipos primitivos em C#... 18 4.3.3 Tipos primitivos em Java... 19 4.4 Convenção para a nomenclatura... 19 4.5 Regras para a nomenclatura... 20 4.6 Exercício de Fixação... 20 5 Operadores... 21 5.1 Tabela Verdade... 22 5.1.1 Exercícios de Fixação... 23 6 Controle de Fluxo - Decisão... 26 6.1 Estrutura SE ENTÃO SENÃO / IF... THEN... ELSE... 26 7 Comandos de Fluxo - Estruturas de Repetição... 31 2
7.1 Tipos ou modelos de repetição... 31 7.2 Repetição pré-testada... 31 7.3 Repetição pós-testada... 32 7.4 Repetição com variável de controle... 33 7.5 Iteração de coleção... 34 7.6 Exemplo em três formas:... 34 7.7 Exercícios de Fixação... 38 8 Linguagem de Projeto de Programação... 41 8.1 Linguagem PDL... 42 8.1.1 Tipos de Dados... 43 8.1.2 Nomes de Variáveis e sua Declaração... 43 8.1.3 Constantes e Comando de Atribuição... 44 8.2 Exercícios de Fixação... 45 9 Bibliografia... 46 3
1 Introdução Com base nas experiências que tive com os meus alunos nos últimos 15 anos, ao elaborar esta apostila resolvi usar uma abordagem um pouco diferente em relação ao que é apresentado na maioria dos livros sobre o assunto. Aqui se pretende embasar a teoria por meio da prática em linguagem de programação C e Pascal. A cada capítulo, serão apresentados diversos problemas que servirão de base para o aprendizado sobre algoritmos e lógica de programação. Os exercícios servem como complementação do aprendizado, por essa razão são chamados de exercícios de fixação. Bom aprendizado. Professor Me. Marcos Roberto de Moraes Mestre em Educação, Especialista em Administração de Sistemas de Informação, Tecnólogo em Processamento de Dados, Professor do Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas e Mecânica de Precisão da Fatec de Mogi Mirim-SP 4
2 Programação Neste capítulo serão apresentados alguns conceitos importantes antes de iniciarmos o estudo da lógica de programação. Afinal o que são programas? O que é uma linguagem de máquina? Para que servem as diferentes linguagens de programação, o que é um Compilador? O que é o processo de compilação? E por fim, o que são Máquinas Virtuais? 2.1 Programa O que é um programa de computador? Figura 1 - Planilha Eletrônica Um programa ou programa de computador é um conjunto de instruções que são interpretadas pelo computador com a finalidade de se executar uma determinada tarefa. Essas instruções estão armazenadas em um arquivo que comumente é chamado de executável e, dentro deste arquivo, as instruções aparecem no formato binário que é extremamente difícil de ser lido por um ser humano. É uma coleção de instruções que descrevem uma tarefa a ser realizada por um computador. O termo pode ser uma referência ao código fonte, escrito em alguma linguagem de programação, ou ao arquivo que contém a forma executável deste código fonte. No momento em que um programa é gerado, é dito a ele em qual sistema operacional e em qual arquitetura de processador ele será executado. Ou seja, nele estarão contidas instruções específicas para um determinado tipo de processador, além de instruções específicas para um determinado sistema operacional. (K19, 2011) 5
2.2 Linguagem de Máquina Todo computador possui um conjunto de instruções que seu processador é capaz de executar. Essas instruções são chamadas de código de máquina, são representadas por sequências de bits, normalmente limitadas pelo número de bits do registrador principal da CPU. Esse código é chamado de código binário. São formados por 0 e 1. Na Linguagem de Máquina o código é escrito como uma sequência de números que representam as instruções a serem executadas pelo processador. É uma linguagem praticamente impossível de se trabalhar dado à dificuldade de se ler o código e de mantê-lo. (K19, 2011). Podemos verificar essa complexidade na figura abaixo: Figura 2 - Trecho do programa Chrome em Binário (Fonte: K19) 2.3 Linguagem de Programação Uma linguagem de programação é um método padronizado para expressar instruções para um computador. É um conjunto de regras sintáticas e semânticas usadas para definir um programa de computador. Permite que um programador especifique precisamente sobre quais dados um computador vai atuar, como estes dados serão armazenados ou transmitidos e quais ações devem ser tomadas sobre várias circunstâncias. Outra definição dada por Said (2007) é que linguagens de programação são conjuntos de padrões e comandos com sintaxes predefinidas que o programador utiliza para traduzir os algoritmos escritos, o que permite dar ordens ao processador e à memória de um computador. Escrever um programa em Linguagem de Máquina é totalmente inviável. As Linguagens de Programação que tentam se aproximar das linguagens humanas. Veja um trecho de código na Linguagem C#. 6
Figura 3 - Trecho de programa na Linguagem C# 2.4 Compilador Se o processador entende apenas Linguagem de Máquina, como ele irá interpretar o código escrito em uma Linguagem de Programação? Um compilador é um programa de computador ou um conjunto de programas que, a partir de um código fonte escrito em uma linguagem de programação, cria um programa semanticamente equivalente, porém escrito em outra linguagem, objeto. Ou seja, o papel do compilador é, basicamente, traduzir um código em Linguagem de Programação para um código em Linguagem de Máquina. Figura 4 Compilação 2.5 Máquinas Virtuais A empresa que desejar ter a sua aplicação disponível para diversos sistemas operacionais (Windows, Linux, Mac OS X, etc), e arquiteturas de processadores (Intel, ARM, PowerPC, etc), terá que escrever versões diferentes do código fonte para cada plataforma (sistema operacional + arquitetura de processador). Isso pode ser traduzido, do ponto de vista dos administradores de uma empresa, como um investimento muito alto em desenvolvimento e manutenção de um sistema. (K19, 2011) 7
Para solucionar esse problema, ou seja, a tarefa custosa de gerenciar diversas versões do código, alguns softwares compilar os programas para uma máquina virtual. De acordo com os autores da K19, Uma máquina virtual funciona como uma camada a mais entre o código compilado e a plataforma. Portanto, quando compilamos um código fonte, estamos criando um executável que a máquina virtual saberá interpretar e ela é quem deverá traduzir as instruções do seu programa para a plataforma. (K19, 2011) Figura 5 - Ilustração do Funcionamento de uma Máquina Virtual (Fonte: K19) 2.6 Exercícios de Fixação 1. O que são algoritmos? E qual sua importância? 2. Pesquise informações na internet sobre a história das linguagens de programação. Crie uma linha do tempo identificando os principais acontecimentos sobre o assunto nos últimos 40 anos. 8
3 Lógica de Programação Neste capítulo são apresentados os conceitos de lógica, algoritmos e implementação. 3.1 Lógica Existem muitas definições para a palavra lógica, porém no caso do nosso estudo não é relevante um aprofundamento nesse ponto, é suficiente apenas discutir alguns pontos de vista sobre o assunto. Lógica é uma parte da filosofia que estuda o fundamento, a estrutura e as expressões humanas do conhecimento. A lógica foi criada por Aristóteles no século IV a.c. para estudar o pensamento humano e distinguir interferências e argumentos certos e errados. (CABRAL, 2012) A lógica estuda a correção do raciocínio, ou seja a ordem da razão. Isso dá para entender que a nossa razão pode funcionar desordenadamente. Por isso, a lógica estuda maneiras de colocar ordem no pensamento. (SAID, 2007) Considere o problema de descobrir a idade da pessoa mais velha de um grupo de pessoas. Suponha que estas pessoas estão em uma fila qualquer (banco, cinema, etc.), e que esta fila não está vazia. Figura 6 Fila de Pessoas Vamos elaborar uma estratégia para resolver este problema. Uma solução bem simples seria fazer o seguinte (Veja a seção a seguir - 3.2 Algoritmos e Implementação). 9
3.2 Algoritmos e Implementação Um algoritmo é uma sequência de passos que resolve algum problema ou alcança algum objetivo, como a sequência de passos para resolver o problema de descobrir a idade mais velha de uma pessoa. É importante salientar que um algoritmo simplesmente diz o que deve ser feito. Como uma receita de bolo. Dizemos que um algoritmo é um sequencia finita de passos, descritos em uma ordem lógica, que visam atingir um objetivo bem definido. Figura 7 - Receita (Fonte: obadenbaden.com.br) Para resolver um problema, como em uma receita qualquer, devemos definir como executar os passos do algoritmo. Por exemplo, para o problema anterior (Seção 3.1- Lógica) de encontrar a maior idade do grupo de pessoas na fila, deveríamos definir como colher as informações sobre as idades das pessoas (perguntar para a própria pessoa, ver a data de nascimento em algum cadastro que a pessoa tenha feito) e como manter as informações sobre as idades (anotar em um papel ou guardar em uma variável no computador). A definição de como os passos de um algoritmo serão executados é uma implementação do algoritmo. Resumindo, algoritmo é o que deve ser feito e implementação é o como deve ser feito. (CAELUM, 2011) Uma solução simples para o nosso problema: 1) Pegue a idade da primeira pessoa. A única informação que você tem é que esta idade é a maior até o momento. Então, guarde em algum lugar esta informação. 2) Percorra cada uma das próximas pessoas e faça o seguinte: a) Pegue a idade da pessoa, esta é a idade atual. b) Compare a idade atual com a maior até o momento. Esta comparação pode resultar em três possibilidades: a idade atual é menor, é igual ou é maior. c) Se a altura atual for maior, então faça o valor da maior idade ser igual a atual. Um algoritmo deve ter uma sequencia de passos finitos e que garanta a sua repetição, ou seja, toda vez que for executado deve chegar ao resultado desejado. 10
3.3 Representação dos Algoritmos Há diversas formas de representar os algoritmos, as formas mais utilizadas de representação: Fluxograma e Pseudocódigo. Há ainda a linguagem natural, que será apresentada apenas como forma introdutória neste material, já que não se recomenda solucionar um problema computacional com o seu uso. 3.3.1 Linguagem Natural Suponha que você tenha um colega que é o mais novo cliente do seu banco, e ele quer aprender a sacar dinheiro no caixa eletrônico. Você já tem uma solução para o problema dele, então resolve ensiná-lo a sacar dinheiro. Para tanto, você escreve no papel as seguintes instruções: 1. Passe o cartão do banco no leitor. 2. Digite a senha da conta-corrente. 3. No menu que aparecer, escolha a opção SAQUE. 4. Digite o valor desejado e tecle ENTRA. 5. Confirme o valor do saque e aperte ENTRA. 6. Aguarde na frente do caixa até sair o dinheiro. 7. Pegue o dinheiro. Com esse algoritmo para sacar dinheiro, de forma ordenada, se seu amigo seguir os passos conseguirá ter as notas em suas mãos. Mas, Seu amigo já recebeu o cartão? Tem dinheiro na máquina? Tem saldo na conta? Muitas vezes, terão diferentes versões, ou diferentes fluxos de uma mesma versão de um algoritmo, para se resolver um problema, como esse que foi exemplificado. 3.3.2 Fluxogramas Fluxograma é um tipo de diagrama, às vezes conhecidos como diagrama de blocos, e pode ser entendido como uma representação esquemática de um processo, muitas vezes feito através de gráficos que ilustram de forma descomplicada a transição de informações entre os elementos que o compõem. É uma representação gráfica de algoritmos onde formas geométricas diferentes implicam ações distintas (instruções e comandos). Facilita o entendimento das ideias contidas nos algoritmos. 11
Forma Significado Terminador: Início e Fim do Fluxograma. Processo Entrada de Dados Saída de Dados Decisão Conector Sentido do fluxo Figura 8 - Principais formas usadas em fluxogramas (símbolos mais usados) 12
Exemplo: Vamos supor que precisemos criar um algoritmo para somar dois valores (dados pelo usuário) e exibir o seu resultado. Início A, B SOMA A + B SOMA Fim Figura 9 - Fluxograma para soma de dois valores 3.3.3 Pseudocódigo Esta forma de representação de algoritmos é rica em detalhes, como a definição dos tipos das variáveis usadas no algoritmo. Por assemelhar-se bastante à forma em que os programas são escritos, encontra muita aceitação. Na verdade, esta representação é suficientemente geral para permitir a tradução de um algoritmo nela representado para uma linguagem de programação específica seja praticamente direta. (UFRN, 2004) A forma geral da representação de um algoritmo na forma de pseudocódigo é a seguinte: Algoritmo é uma palavra que indica o início da definição de um algoritmo em forma de pseudocódigo. <nome_do_algoritmo> é um nome simbólico dado ao algoritmo com a finalidade de distingui-los dos demais. <declaração_de_variáveis> consiste em uma porção opcional onde são declaradas as variáveis globais usadas no algoritmo principal e, eventualmente, nos subalgoritmos. 13
<subalgoritmos> consiste de uma porção opcional do pseudocódigo onde são definidos os subalgoritmos. Exemplo: A soma de dois valores, agora representados em pseudocódigo. A representação em pseudocódigo é bem simples e na maioria dos casos é o suficiente para se explicar um algoritmo. Existem alguns interpretadores de portugol como o VisuAlg e, no caso da língua inglesa, temos algumas linguagens como Pascal e BASIC cuja sintaxe se assemelha muito com a sintaxe de um pseudocódigo em inglês. (K19, 2011) 3.4 Exercício de Fixação 1. Pesquise sobre as formas de representar algoritmos. O que é dito sobre descrição narrativa? É interessante ou não utilizar essa forma para a elaboração de algoritmos? 2. Baixe o aplicativo VISUALG e tente executar o algoritmo acima. Veja instruções no capítulo 8 - Linguagem de Projeto de Programação. 14
4 Tipos de Dados Neste capítulo são apresentados os conceitos de tipos de dados, constantes e variáveis. Declaração e inicialização de variáveis nas linguagens C# e Java. Apresenta-se também as regras de declaração e as convenções utilizadas. Figura 10 - Zebra (imagem construída em ASCII) Nota sobre ASCII: ASCII (acrônimo para American Standard Code for Information Interchange, que em português significa "Código Padrão Americano para o Intercâmbio de Informação") é uma codificação de caracteres de oito bits baseada no alfabeto inglês. Os códigos ASCII representam texto em computadores, equipamentos de comunicação, entre outros dispositivos que trabalham com texto. Desenvolvida a partir de 1960, grande parte das codificações de caracteres modernas a herdaram como base. Os dados representam as informações processadas pelo computador. Alguns tipos de dados: numéricos (inteiros e reais), dados caracteres ou literais, lógicos, datas, entre outros. Os tipos numéricos inteiros são dados numéricos positivos, negativos e não fracionários. Ex: 50, 12, 0, -14. Já os tipos reais são aqueles também numéricos positivos e negativos, mas, nesse caso, fracionário. Exemplo: 50.34, 12.14, -14.23. Os tipos caracteres são sequencias de letras, números e símbolos especiais, também é conhecido por cadeia de string, literal ou alfanumérico. São representados entre aspas. Exemplo: bola, Programa, 19-3806-5555, etc. Os tipos lógicos, chamados de booleanos, são dados que representam apenas dois valores: verdadeiro e falso. Nas linguagens de alto nível como Pascal, C/C++, PHP, é reconhecido pelos termos em inglês, ou seja, true ou false. Nota: Algumas linguagens tratam datas como tipos especiais. Nos exemplos deste material, quando usarmos datas, utilizaremos entre aspas como se fosse um tipo string. 15
Figura 11 - Exemplo de Tipos de dados na Linguagem C 4.1 Constantes Constantes são usadas em expressões para representar vários tipos de valores. Em C# existem regras rígidas para determinar como devem ser escritos estes valores. A seguir iremos mostrar as regras para escrever constantes. 4.1.1 Constantes Inteiras São valores numéricos sem ponto decimal, precedidos ou não por um sinal. Não é possível separar o sinal do valor numérico. Constantes válidas são, por exemplo: 1997-3 +5 0-32000 Alguns exemplos de erros na escrita de constantes inteiras são: 1.3 (Não é possível usar ponto decimal). - 345 (Não é possível colocar um espaço entre o sinal e o valor numérico). 2 3 (Não é possível usar notação de expoentes) 4.2 Variáveis varx 189 Em computação uma variável representa um endereço da memória RAM. Nela somos capazes de armazenar informações de vários tipos: numéricos, strings (texto), booleanos (verdadeiro ou falso), objetos e etc. Quando declaramos uma variável estamos atribuindo um nome simbólico à um endereço da memória RAM. Dentro de nosso programa utilizaremos esse nome 16
para manipular a informação contida no endereço da memória relacionado à variável. (K19, 2011) O computador, para poder trabalhar com algumas destas informações precisa saber onde, na memória, o dado está localizado. Fisicamente, cada posição de memória, possui um endereço, ou seja, um número, normalmente em hexadecimal, que indica onde cada informação está localizada. Como utilizamos as variáveis? Para utilizarmos as variáveis na linguagem Java ou C# (duas das mais utilizadas atualmente) precisamos passar pelas seguintes etapas: declaração e inicialização. 4.2.1 Declaração Tanto em Java como em C# declaramos uma variável informando o seu tipo e o seu nome (identificador). Figura 12 - Exemplo de declaração em C# Figura 13 - Exemplo de declaração em Java 4.2.2 Inicialização Após declararmos uma variável, antes de utilizá-la, devemos inicializá-la para evitarmos um erro de compilação. Figura 14 - Exemplo de inicialização em C# 17
Figura 15 - Exemplo de inicialização em Java 4.3 Tipos de variáveis Pelo fato das variáveis possuírem um tipo nas linguagens C, Java e C#, normalmente dizemos apenas qual o tipo da variável? quando queremos saber qual o tipo de dado associado àquela variável em questão. Existem diversos tipos de dados, sendo os mais básicos os tipos primitivos que são pré-definidos pelas duas linguagens. (K19, 2011) 4.3.1 Tipos primitivos em C Tipo Tamanho em Bytes Faixa Mínima char 1-127 a 127 unsigned char 1 0 a 255 signed char 1-127 a 127 int 4-2.147.483.648 a 2.147.483.647 unsigned int 4 0 a 4.294.967.295 signed int 4-2.147.483.648 a 2.147.483.647 short int 2-32.768 a 32.767 unsigned short int 2 0 a 65.535 signed short int 2-32.768 a 32.767 long int 4-2.147.483.648 a 2.147.483.647 signed long int 4-2.147.483.648 a 2.147.483.647 unsigned long int 4 0 a 4.294.967.295 float 4 Seis digitos de precisão double 8 Dez digitos de precisão long double 10 Dez digitos de precisão 4.3.2 Tipos primitivos em C# Tipo C# Tipo.NET Descrição Faixa de dados Bool System.Boolean Booleano true ou false Byte System.Byte Inteiro de 8-bit com sina -127 a 128 Char System.Char Caracter Unicode de 16-bit U+0000 a U+ffff Decimal System.Decimal Inteiro de 96-bit com sinal 1,0 10-28 a 7,9 1028 com 28-29 dígitos significativos Double System.Double Flutuante IEEE 64-bit com 15- ±5,0 10-324 a ±1,7 10308 16 dígitos significativos Float System.Single Flutuante IEEE 32-bit com 7 ±1,5 10-45 a ±3,4 1038 18
dígitos significativos Int System.Int32 Inteiro de 32-bit com sinal -2.147.483.648 a 2.147.483.647 Long System.Int64 Inteiro de 64-bit com sinal 9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 Object System.Object Classe base Sbyte System.Sbyte Inteiro de 8-bit sem sinal 0 a 255 Short System.Int16 Inteiro de 16-bit com sinal -32,768 a 32,767 String System.String String de caracteres Unicode Uint System.UInt32 Inteiro de 32-bit sem sinal 0 a 4,294,967,295 Ulong System.UInt64 Inteiro de 64-bit sem sinal 0 a 18,446,744,073,709,551,615 Ushort System.UInt16 Inteiro de 16-bit sem sinal 0 a 65,535 4.3.3 Tipos primitivos em Java Java possui 8 tipos primitivos. Quatro deles são usados para representar inteiros. São eles: byte, short, int, long. A diferença entre eles é o tamanho em bytes. Todos representam números inteiros positivos e negativos. Outros dois tipos primitivos são usados para representar números reais (ponto flutuante). São eles: float e double. A diferença entre eles é a quantidade de bytes utilizados para sua representação. Tanto float quanto o double seguem a norma IEE754 1 para formação de números de ponto flutuantes. Os dois últimos tipos são char e boolean. O primeiro é utilizado para representar caracteres ou números positivos. O segundo aceita dois valores lógicos true ou false. Tipo Faixa de dados byte (8bits) -128 a 127 short (16bits) -32768 a 32767 int (32bits) 2147483648 a 2147483647 long (64bits) 9223372036854775808 a 9223372036854775807 float (32 bits) single-precision 32-bit IEEE 754 floating point double (64 bits) double-precision 64-bit IEEE 754 floating point char (16 bits) '\u0000' (ou 0) a '\uffff' (or 65.535 inclusive) Boolean Assume true ou false (tamanho não defnido) 4.4 Convenção para a nomenclatura Tanto em Java como em C# existe uma convenção para a escrita dos nomes das variáveis. Ambas as linguagens utilizam o padrão Camel Case, que consiste em escrever o nome da variável com a primeira letra de cada palavra em maiúscula exceto a primeira. Também devemos nos lembrar de que as três linguagens são Case Sensitive, ou seja, numerodaconta e NumeroDaConta são consideradas duas variáveis diferentes pelo fato do nome da primeira começar com letra minúscula e a da segunda maiúscula. 1 A Norma IEEE 754-2008 define os formatos adequados para representar números em ponto flutuante de precisão simples (32 bits) e de precisão dupla (64 bits) 19
4.5 Regras para a nomenclatura As linguagens C, Java e C# possuem regras muito parecidas. O nome de uma variável: 1. Não deve começar com um dígito; 2. Não pode ser igual a uma palavra reservada; 3. Não pode conter espaço(s); 4. Pode ser uma palavra de qualquer tamanho; 5. Pode conter letras, dígitos e _ (underscore). Em Java, pode conter também o caractere $. As linguagens Java e C# nos permite escrever os nomes das variáveis em qualquer idioma, pois elas aceitam qualquer caractere Unicode. Portanto são válidas as variáveis escritas com as acentuações do português, assim como as variáveis escritas em japonês, por exemplo. int númerodaconta; int アカウント 番 号 ; Figura 16 - Exemplo de nomes de variáveis válidos utilizando caracteres especiais em outros idiomas. Apesar de ser possível o uso de caracteres em outros idiomas, assim como o uso dos caracteres $ (cifrão) e _ (underscore), não é recomendável utilizá-los. Não utilizar tais caracteres é uma das boas práticas de programação. 4.6 Exercício de Fixação 1. Indique os nomes de variáveis que são válidos. Justifique os nomes inválidos. a) tempo b) nota_final c) us$ d) char e) 2dias f) teste 1 g) raio.do.circulo 2. Indique quais dos números abaixo são constantes inteiras (longas ou não) válidas. Justifique suas respostas. a) 100 b) 2 345 123 c) 3.0 d) -35 e) - 234 f) 0L g) 2l 20
5 Operadores Nas diferentes linguagens de programação utilizamos os operadores para manipularmos as variáveis de nossa aplicação. As linguagens C, Java e C# possuem diversos operadores que são categorizados da seguinte forma: Aritmético (+, -, *, /, %) Atribuição (=, +=, -=, *=, /=, %=) Relacional (==,!=, <, <=, >, >=) Lógico (&&, ) Veja a seguir uma lista de operadores matemáticos básicos, listados em ordem de precedência. Use parênteses para outra ordem. Operador Objetivo *, /, % Multiplicação, Divisão, Módulo +, - Adição, subtração Exemplo Figura 17 - Operadores Matemáticos Lista de operadores de atribuição e Incremento: Operador Objetivo = Atribuir valor v++ Incremento variável v por 1. v+=n Incremento variável v por n. v*=n Multiplique variável v por n. v-=n Subtrair n da variável v. Veja lista de operadores relacionais: Operador Objetivo == Verifica a igualdade.!= Verifica a desigualdade. 21
> Mais de. < Menor que. >= Maior que ou igual a. <= Menor ou igual a. Figura 18 - Exemplo de uso de operador de verificação de igualdade em C# Veja a lista dos operadores lógicos: Operador Objetivo && And condicional. OR condicional.! NOT condicional. Figura 19 - Exemplo de uso do operador && em C# 5.1 Tabela Verdade Os autores da K19 (K19, 2011) apresentam a tabela verdade com uma tabela matemática muito utilizada na Álgebra Booleana e faremos o uso dela para compreendermos melhor os operadores lógicos. Sendo A e B duas variáveis booleanas, confira como ficaria a tabela verdade para os operadores lógicos E (&&) e OU ( ): Figura 20 - Exemplo de Tabela da Verdade 22
Rapidamente notamos que a operação E devolve true apenas quando A e B são true. Também notamos que a operação OU devolve false apenas quando A e B são false. Vamos utilizar os exemplos de operadores lógicos dados anteriormente para ilustrarmos melhor como funciona a tabela verdade. Exemplo 1: Seja A=5, B=3, C=2. Calcule o resultado da expressão lógica: 1) A + 7 > B * C Sendo A = 5 Então 5 + 7 = 12 E 3 * 2 = 6 Então a expressão é 12 > 6, ou seja, o resultado é.verdadeiro. (Verdadeiro) Exemplo 2: Suponha que temos três variáveis A = 5, B = 8 e C =1, os resultados das expressões seriam: Operações Lógicas são utilizadas quando se torna necessário tomar decisões em um fluxograma ou diagrama de bloco. Num fluxograma, toda decisão terá sempre como resposta o resultado.verdeiro. ou.falso. (true ou false) Uma estrutura de decisão ou desvio faz parte das técnicas de programação que conduzem a estruturas de programas que não são totalmente sequenciais. Com as instruções de SALTO ou DESVIO pode-se fazer com que o programa proceda de uma ou outra maneira, de acordo com as decisões lógicas tomadas em função dos dados ou resultados anteriores. 5.1.1 Exercícios de Fixação 1. Crie um fluxograma para calcular o estoque médio de uma peça, sendo que: ESTOQUEMÉDIO = (QUANTIDADE MÍNIMA + QUANTIDADE MÁXIMA) /2. 23
2. Crie um fluxograma para calcular a idade aproximada em anos de uma pessoa, Sendo que IDADE = ANOATUAL ANONASC. 3. Crie um fluxograma para calcular a seguinte expressão: X:= X ^ 2 + 2. Onde X é informado como entrada pelo usuário. 4. Crie um fluxograma para calcular a seguinte expressão: A:= A + B * C. Os valores devem ser lidos do teclado. 5. Crie um fluxograma para calcular a média ponderada de duas notas de um aluno. A nota 1 tem peso 3 e a nota 2 tem peso 7. 6. Indique com um I os tipos inteiros, R os tipos reais, B os tipos booleanos e L os tipos literais para os dados abaixo: ( ) 100 ( ) 34.34 ( ) 12.12 ( ) 0 ( ) -34 ( ) -9 ( ) 10/11/09 ( ) Maria ( ) 0 ( ).verdadeiro. ( ).falso. ( ) ( ) 34 ( ) -1.45 ( ) -30.3 7. Construa um fluxograma que: Leia a cotação do dólar Leia um valor em dólares Converta esse valor para Real Mostre o resultado 8. Construa um fluxograma que: Leia 4(quatro) números Calcule o quadrado para cada um Somem todos e Mostre o resultado 9. Construa um algoritmo para pagamento de comissão de vendedores de peças, levando-se em consideração que sua comissão será de 5% do total da venda e que você tem os seguintes dados: Identificação do vendedor Código da peça Preço unitário da peça Quantidade vendida 10. Construa um algoritmo que receba como entrada os seguintes dados: Peso de uma pessoa; Sua altura em centímetros; E em seguida calcule o Índice de Massa Corpórea (IMC) através da seguinte fórmula: PESO / ALT ^ 2 24
11. Construa um algoritmo que leia três valores e mostre o produto dos mesmos. 12. Construa um algoritmo para calcular o volume de uma garrafa de água, utilizando a fórmula: VOLUME:= 3.14159 * R ^ 2 * H, onde R é o valor do Raio, e H é a altura. 13. Construa um algoritmo para efetuar as operações básicas de adição, multiplicação e divisão de dois valores dados pelo usuário A e B, apresentando ao final todos os resultados. 14. Uma loja de animais precisa de um programa para calcular o custo da criação de determinada ave. O custo é calculado com a fórmula CUSTO:= (NRAVES * 0.30) / 15 + 10. Construa um algoritmo para efetuar o presente cálculo e apresentar ao final o custo de criação do número de aves informado pelo usuário (Valor lido). Até agora entendemos o que é um programa, como ele funciona, de que maneira armazenamos os dados na memória do computador através das variáveis e como realizamos operações de diversos tipos por meio dos operadores que as linguagens disponibilizam. Nos dois próximos capítulos serão estudadas instruções para o controle de fluxo: instruções de decisão e de repetição. 25
6 Controle de Fluxo - Decisão Por meio do fluxograma que calcula a média de duas notas de um aluno e mostra como resultado se o mesmo foi aprovado ou não, de acordo com a seguinte condição: para ser aprovado o aluno deverá ter média superior ou igual a sete. Início N1, N2 Soma N1 + N2 Media (N1 + N2) / 2 Media, Reprovado Não Media>=7 Sim Media, Aprovado Fim Figura 21 Fluxograma: média de duas notas 6.1 Estrutura SE ENTÃO SENÃO / IF... THEN... ELSE A estrutura de decisão SE/IF normalmente vem acompanhada de um comando, ou seja, se determinada condição for satisfeita pelo comando SE/IF então execute determinado comando. Imagine um algoritmo que determinado aluno somente estará aprovado se sua média for maior ou igual a 7.0, como visto no fluxograma da Figura 24 Fluxograma: média de duas notas. SE MEDIA >= 7.0 ENTÃO ALUNO APROVADO SENÃO ALUNO REPROVADO Veja o código na linguagem C#. 26
Figura 22 - Exemplo If/then/else Podemos também, dentro de uma mesma condição testar outras condições. Supondo que agora tenhamos uma nova condição, a de RECUPERAÇÃO. Dessa forma, se a Média for Menor ou igual a 3.5 o aluno está REPROVADO, com Média superior a 3.5 e menor que 7 o aluno está de RECUPERAÇÃO, caso seja maior ou igual a 7.0 sua situação será aprovado. 27
Início N1, N2 Soma N1 + N2 Media (N1 + N2) / 2 N Media<=3.5 S Media, Reprovado Media>3.5 && Media<7.0 S Media, Recuperação N Media, Aprovado Fim Figura 23 - Fluxograma com cadeia de ifs 28