Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO “A Faculdade Católica Paulista tem por missão exercer uma ação integrada de suas atividades educacionais, visando à geração, sistematização e disseminação do conhecimento, para formar profissionais empreendedores que promovam a transformação e o desenvolvimento social, econômico e cultural da comunidade em que está inserida. Missão da Faculdade Católica Paulista Av. Cristo Rei, 305 - Banzato, CEP 17515-200 Marília - São Paulo. www.uca.edu.br Nenhuma parte desta publicação poderá ser reproduzida por qualquer meio ou forma sem autorização. Todos os gráficos, tabelas e elementos são creditados à autoria, salvo quando indicada a referência, sendo de inteira responsabilidade da autoria a emissão de conceitos. Diretor Geral | Valdir Carrenho Junior PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 3 SUMÁRIO AULA 01 AULA 02 AULA 03 AULA 04 AULA 05 AULA 06 AULA 07 AULA 08 AULA 09 AULA 10 AULA 11 AULA 12 AULA 13 AULA 14 AULA 15 05 14 24 32 43 52 64 74 84 93 104 111 120 129 139 PARADIGMA DE PROGRAMAÇÃO ORIENTADO A OBJETOS SISTEMAS DISTRIBUÍDOS ARQUITETURA CLIENTE-SERVIDOR INTRODUÇÃO À LINGUAGEM “C” MANIPULAÇÃO DE VARIÁVEIS LOCAIS, GLOBAIS E SUPERGLOBAIS; OPERADORES ESTRUTURA DE DESVIO CONDICIONAL ESTRUTURA DE LAÇO DE REPETIÇÃO ESTRUTURA DE MÉTODOS/ FUNÇÕES PASSAGEM DE ARGUMENTOS POR VALORES E REFERÊNCIAS PRINCIPAIS FUNÇÕES DO C# MANIPULAÇÃO DE VETORES (ARRAY) MANIPULAÇÃO DE MATRIZES RECURSIVIDADE, TRATAMENTO DE EXCEÇÕES E PERSISTÊNCIA DE DADOS INTERFACES GRÁFICAS E EVENTOS PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 4 INTRODUÇÃO Há diversas linguagens de programação no mercado. Muitas delas têm diversas finalidades. Desde a programação para aplicações locais, aquelas que rodam no seu computador, bem como aplicativos para celulares e programas para executar na internet. Neste conteúdo, vamos entender como utilizarmos a linguagem de programação C, na sua variação C# (C – Sharp). Fonte: https://growiz.com.br/wp-content/uploads/2020/08/kisspng-c-programming-language-logo-microsoft-visual-stud-atlas-portfolio-5b899192d 7c600.1628571115357423548838.png Vamos entender o que é uma programação orientada a objetos, manipular variáveis, desvios condicionais, estrutura de laços, matrizes e vetores dentro da programação. Teremos exemplos práticos e passo a passo para instalação da ferramenta e também realizar as atividades de forma que ajude o aprendizado e você consiga ver em tempo real a execução dos exemplos. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 5 AULA 1 PARADIGMA DE PROGRAMAÇÃO ORIENTADO A OBJETOS A programação orientada a objetos (POO) é um dos paradigmas mais utilizados atualmente no desenvolvimento de sistemas. Com linguagens de programação analistas e programadores constroem classes e implementam métodos que permitem construir programas baseados em objetos que representam o mundo real, por meio de características, estados e comportamentos. Neste capítulo, você estudará sobre classes, objetos e métodos no paradigma da POO. Antes de entrarmos no conceito de POO, temos que entender um outro tipo de programação: Programação Orientada a Procedimentos (POP). A Programação Procedural é uma metodologia para modelar o mundo real do problema a ser resolvido, determinando a ordem das fases a serem seguidas para que o resultado desejado seja alcançado. Os blocos de construção são procedimentos conhecidos como “rotinas” ou “métodos”. São segmentos de código que podem ser chamados várias vezes no programa. Quando os procedimentos são bem projetados, eles podem ser reutilizáveis, acelerando o processo de desenvolvimento, facilitando as modificações do sistema e reduzindo a base de código onde os defeitos podem ocorrer. Exemplo: “Limpar Campos” ou “Gravar Dados” podem ser chamados em qualquer parte da programação. Já a Programação Orientada a Objeto lida com as partes básicas elementares ou blocos de construção do problema, enquanto a programação procedural se concentra nas etapas necessárias para produzir o resultado desejado. É uma metodologia de programação prática e útil que incentiva o design de módulos e reutilização de software. Um de seus principais recursos é o suporte para abstração de dados, a capacidade de definir novos tipos de objetos cujo comportamento é definido abstratamente, sem referência a detalhes de implementação, como a estrutura de dados usada para representar os objetos. A programação orientada a objetos é um importante conjunto de técnicas que podem ser utilizadas para realizar o desenvolvimento de programas mais eficientes, melhorando a confiabilidade dos programas de computação. Na programação orientada a objetos, os objetos são os elementos principais de construção. Entretanto, a simples compreensão. Em ciência da computação, um programa é composto por uma série PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 6 de comandos, que são executados em um computador ou um circuito eletrônico. A programação de um computador é o processo de escrever um algoritmo e é também o processo de codificar um algoritmo em uma notação denominada como linguagem de programação. A POO lida sobre como as informações são representadas na mente humana. Como uma abordagem de programação de computador, a POO é útil de forma a fornecer uma modelagem fácil para a dinâmica da construção e desenvolvimento de entidades reais. Esta abordagem visa modelar as entidades e, também, as relações existentes entre eles. A POO permite que os programadores definam as classes necessárias para criar os objetos e apliquem essas modificações (manipulações) sobre eles. Além disso, pode fornecer recursos de herança, polimorfismo e encapsulamento para os desenvolvedores. De acordo com Ledgard (1996), o paradigma de programação é um estilo fundamental de programação de computadores que classifica as linguagens de programação. A abordagem orientada a objetos permite dividir um sistema complexo em partes menores e em módulos gerenciáveis que tornam o processo de desenvolvimento mais fácil de entender e compartilhar entre os membros de uma equipe de desenvolvedores, e mais fácil de se comunicar com os usuários que são necessários para fornecer requisitos e confirmar o quão bem o sistema atende aos requisitos ao longo do processo. Assim, a POO permite a aplicação da modularidade e abstração com maior compreensão, manutenção e expansão do código. ISTO ESTÁ NA REDE A programação procedural trata de escrever procedimentos ou métodos que realizam operações nos dados, enquanto a programação orientada a objetos trata da criação de objetos que contêm dados e métodos. A programação orientada a objetos possui várias vantagens sobre a programação procedural, como, por exemplo: • mais rápido e fácil de executar; • fornece uma estrutura clara para os programas; • torna o código mais fácil de manter, modificar e depurar; • torna possível criar aplicativos totalmente reutilizáveis com menos código e menor tempo de desenvolvimento. Ao longo do texto, será possível compreender o significado dos princípios da POO – Programação Orientada a Objetos e a sua aplicação em uma linguagem de programação (Java). Disponível no seguinte link: https://www.devmedia.com.br/programacao-orientada-a-objetos-com-java/18449. https://www.devmedia.com.br/programacao-orientada-a-objetos-com-java/18449 PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 7 1.1. Classes e Objetos O conceito de classes na orientação a objetos gira em torno da abstração, que é a definição simplificada dos objetos e apresenta informações relevantes para os usuários, porém, esconde detalhes que são irrelevantes paradeterminado contexto. Na Unified Modeling Language (UML), uma classe pode ser representada pelas especificações nome da classe, atributos e métodos, como você pode observar a seguir: • Nome da classe: é o identificador da classe e define o nome pelo qual a classe é referenciada, em geral, utiliza-se apenas a primeira letra maiúscula na declaração de uma classe. • Atributos: é o conjunto de características da classe, isto é, os campos que armazenam e definem as propriedades do objeto. Assim como as variáveis, esses campos possuem um tipo, por exemplo, int, float, string, etc. • Métodos: definem o comportamento da classe por meio das operações que ela pode executar, ou seja, compreende as funcionalidades da classe. Por exemplo, imagine que você comprou um carro recentemente e decide modelar esse carro usando programação orientada a objetos. O seu carro tem as características que você estava procurando: um motor 1.5 turbo, cinza escuro, quatro portas e câmbio automático. O veículo também possui comportamentos que, provavelmente, foram o motivo de sua compra, como acelerar, desacelerar, acender os faróis, buzinar e tocar música. Este carro novo é um objeto, em que suas características são seus atributos (dados atrelados ao objeto) e seus comportamentos são ações ou métodos. O carro adquirido é um objeto que te pertence, mas, na loja onde você o comprou existiam vários outros, muito similares, com quatro rodas, volante, câmbio, retrovisores, faróis, entre outras partes. Observe que, apesar do seu carro ser único (por exemplo, possui um registro único no Departamento de Trânsito), podem existir outros com exatamente os mesmos atributos, ou parecidos, ou mesmo totalmente diferentes, mas que ainda são considerados carros. Podemos dizer então que seu objeto pode ser classificado como um carro, e que seu carro nada mais é que uma instância dessa classe chamada “carro”. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 8 Fonte: https://www.alura.com.br/artigos/assets/poo-programacao-orientada-a-objetos/class-analogy.png Note que os objetos “polo”, “mini” e “beetle” são instâncias da classe “car”. Assim, abstraindo um pouco a analogia, uma classe é um conjunto de características e comportamentos que definem o conjunto de objetos pertencentes à essa classe. Repare que a classe em si é um conceito abstrato, como um molde, que se torna concreto e palpável através da criação de um objeto. Chamamos essa criação de instanciação da classe, como se estivéssemos usando esse molde (classe) para criar um objeto. O algoritmo para se criar uma classe pode ser observado a seguir: classe Carro { Real velocidade; Caractere modelo; Carro(Caractere modelo) { carro.modelo = modelo; carro.velocidade = 0; } função acelerar() { /* código do carro para acelerar */ } função frear() { /* código do carro para frear */ } função acenderFarol() { /* código do carro para acender o farol */ } } PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 9 Note que acima estão as definições da classe. Isto é, estão feitas as declarações. No exemplo acima temos a CLASSE. Os objetos “polo”, “mini” e “beetle” são instâncias da classe Carro, que pode ser criado a partir do exemplo a seguir: Tipo Obj_carro = novo(carro(‘polo‘)); Obj_carro.acelerar(); O código acima exemplifica a criação da instância “polo” do objeto Carro e executa o método acelerar. 1.2. Encapsulamento Ainda, no exemplo do carro, sabemos que ele possui características e comportamentos. Os métodos do carro, como acelerar, podem usar atributos e outros métodos do carro como o mecanismo de injeção de combustível, a coleta do combustível no tanque, etc., uma vez que acelerar gasta combustível. Fonte: https://www.alura.com.br/artigos/assets/poo-programacao-orientada-a-objetos/oop-car-methods-and-attributes.png No entanto, se alguns desses atributos ou métodos forem facilmente visíveis e modificáveis, como o mecanismo de aceleração do carro, isso pode dar liberdade para que alterações sejam feitas, resultando em efeitos colaterais imprevisíveis. Nessa analogia, uma pessoa pode não estar satisfeita com a aceleração do carro e modifica a forma como ela ocorre, criando efeitos colaterais que podem fazer o carro por PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 10 exemplo, nem andar. Nesse caso, o método de aceleração do carro não é visível por fora do próprio carro. Na POO, um atributo ou método que não é visível de fora do próprio objeto é chamado de “privado”; quando é visível, é chamado de “público”. Fonte: https://www.alura.com.br/artigos/assets/poo-programacao-orientada-a-objetos/encapsulation.png Como saber como o nosso carro acelera? Simples: não sabemos. Para acelerar, devemos pisar no acelerador e, de resto, o objeto sabe como executar essa ação sem expor como o faz. Neste caso, podemos afirmar que a aceleração do carro está encapsulada, pois sabemos o que ele vai fazer ao executarmos esse método, mas para o programa não importa como o objeto o faz, só que ele o faça. O mesmo vale para atributos. Não se sabe como o carro demonstra qual velocidade mostrar no velocímetro ou como ele calcula sua velocidade, mas não precisamos saber como isso é feito, ele só precisa dar a velocidade certa. O encapsulamento de atributos e métodos impede o chamado “vazamento de escopo”, onde um atributo ou método é visível por alguém que não deveria vê-lo, como outro objeto ou classe. Isso evita a confusão do uso de variáveis globais no programa, deixando mais fácil de identificar em qual estado cada variável vai estar a cada momento do programa, já que a restrição de acesso nos permite identificar quem consegue modificá-la. 1.3. Herança No exemplo, foi instanciado o objeto “carro” com os atributos que procurava. Apesar de ser único, existem carros com exatamente os mesmos atributos ou formas modificadas. Digamos que você tenha comprado o modelo Y, da montadora “ABC”. Esse modelo possui uma outra versão, chamada Y+ (ou “Y plus”), que possui muitos atributos da versão clássica, mas com diferenças bem grandes: o motor é híbrido PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 11 (elétrico e à combustão), possui um sistema de suspensão diferente e, vamos supor que, além disso, ele tenha um sistema de tração diferente (tração nas quatro rodas). Não são só alguns atributos, mas também alguns mecanismos (ou métodos, traduzindo para POO) que mudam. No entanto, essa versão “plus” ainda é do modelo Y, ou melhor, é um tipo do modelo. Fonte: https://www.alura.com.br/artigos/assets/poo-programacao-orientada-a-objetos/inheritance.png Quando uma classe A é um tipo de classe B, dizemos que a classe A herda as características da classe B, e que a classe B é mãe da classe A, estabelecendo então uma relação de herança entre elas. No caso do carro, Y+ é um tipo de Y, e o que muda são alguns atributos (para-lama reforçado, altura da suspensão etc.), e um dos métodos da classe (acelerar, pois agora há tração nas quatro rodas), mas todo o resto permanece o mesmo, e o novo modelo recebe os mesmos atributos e métodos do modelo clássico. ANOTE ISSO Uma classe é a descrição de um conjunto de objetos; consta de métodos e dados que resumem características comuns de um conjunto de objetos. Podemos definir muitos objetos da mesma classe, ou seja, uma classe é a declaração de um tipo de objeto (Aguilar, 2008). 1.4. Interface Muitos métodos dos carros são comuns em vários veículos. Tanto um carro quanto uma motocicleta são classes cujos objetos podem acelerar, parar, acender o farol etc., pois são coisas comuns a automóveis. Podemos dizer, então, que ambas as classes “carro” e “motocicleta” são “veículos”. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTOFACULDADE CATÓLICA PAULISTA | 12 Quando duas ou mais classes possuem comportamentos comuns que podem ser separados em uma outra classe, costuma-se dizer que a classe comum é uma interface, que pode ser “herdada” pelas outras classes. Note que colocamos a interface como classe comum, que pode ser “herdada” (com aspas), porque uma interface não é exatamente uma classe, mas um conjunto de métodos que todas as classes que herdarem dela devem possuir (implementar) - portanto, uma interface não é “herdada” por uma classe, mas sim implementada. No mundo do desenvolvimento de software, dizemos que uma interface é como se fosse um contrato: uma classe que implementa uma interface deve fornecer uma implementação a todos os métodos que a interface define, e em compensação, a classe implementadora é do tipo da interface. No nosso exemplo, “carro” e “motocicleta” são classes que implementam os métodos da interface “veículo”, logo, podemos dizer que qualquer objeto dessas duas primeiras classes, como um carro Y ou uma motocicleta H, são veículos. Um pequeno detalhe: uma interface não pode ser herdada por uma classe, mas implementada. No entanto, uma interface pode herdar de outra interface, criando uma hierarquia de interfaces. Usando um exemplo completo com carros, dizemos que a classe “Y+” herda da classe “Y”, que, por sua vez, herda da classe “Carro”. A classe “Carro” implementa a interface “Veículo” que, por sua vez, pode herdar (por exemplo) uma interface chamada “Transporte”, uma vez que, tanto um “veículo” quanto uma “bicicleta” são meios de transporte, ainda que bicicleta não seja um automóvel. 1.5. Polimorfismo A palavra “polimorfismo” vem do grego poli = muitas e morphos = forma. Digamos que um dos motivos da escolha do carro foi a qualidade do sistema de som. Todavia, digamos que a reprodução só pode ser feita via bluetooth, enquanto no veículo antigo carro, podia ser feita apenas via pendrive. Em ambos os carros está presente o método “tocar música”. No entanto, como o sistema de som deles é diferente, a forma como o carro toca músicas é diferente. Neste caso, o método «tocar música» é uma forma de polimorfismo, pois dois objetos, de duas classes diferentes, têm um mesmo método que é implementado de formas diferentes, ou seja, um método possui várias formas, várias implementações diferentes em classes diferentes, mas que possuem o mesmo efeito. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 13 1.6. Sobrecarga A sobrecarga de métodos é um conceito do polimorfismo que consiste basicamente em criar variações de um mesmo método, ou seja, a criação de dois ou mais métodos com nomes totalmente iguais em uma classe. A Sobrecarga permite que utilizemos o mesmo nome em mais de um método contanto que suas listas de argumentos sejam diferentes para que seja feita a sua separação. Para entender melhor a sobrecarga, vamos pensar que estamos implementando uma calculadora simples que some apenas dois valores do mesmo tipo por vez. Nela teremos o método calcula que será sobrecarregado com variações de tipos de soma. A seguir, um exemplo de sobrecarga: classe calculadora{ Função Inteiro calcula(inteiro a, inteiro b){ retorna a+b; } Função Real calcula(Real a, Real b){ Retorna a+b; } Função Caractere calcula(Caractere a, Caractere b){ Retorna a+b; } Como você pode perceber, as três funções acima se chamam “calcula()”. Como o objeto vai entender qual o método a ser utilizado? Através da passagem dos parâmetros. Exemplo: • Se for implementado o método “calcula(1,3)” passando como parâmetro os valores 1 e 3, o resultado dessa função será 4. O objeto entende que os valores são do tipo “inteiro” e irá retornar a operação implementada na Função Inteiro Calcula(). • Se for implementado o método “calcula(1.5, 3.1)”, a função retornará o número real “4,6”. • Finalmente, se for implementado o método “calcula(“a”,”b”)”, a função retornará o caractere “ab”. Note que o código executado na função é o que foi determinado na assinatura do método, isto é, os parâmetros que foram passados na função. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 14 AULA 2 SISTEMAS DISTRIBUÍDOS Segundo Monteiro (2020), a principal característica do sistema distribuído é permitir que várias funções sejam conectadas em rede para que os usuários possam compartilhá-los. Desde uma simples impressora compartilhada em rede até aglomerados de computadores dedicados à execução de uma aplicação em larga escala, a disponibilidade de recursos, abstração, sistema aberto e escalabilidade geram diversos desafios para seu desenvolvimento e sua implantação. Um sistema distribuído tem como característica a abstração, pois os usuários não percebem que sua aplicação está executando de tal forma. Eles não notam que partes de um programa ou aplicação estão executando em diferentes computadores. Os usuários podem interagir com o sistema distribuído de forma consistente e uniforme, independentemente de onde e quando a interação ocorrer. Fonte: https://pplware.sapo.pt/wp-content/uploads/2015/10/img0_thumb.jpg O fato desse tipo de sistema distribuído atuar em diferentes computadores, possibilita a expansão e o aumento da oferta de recursos físicos de processamento. Em um PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 15 sistema distribuído, os usuários não podem ser prejudicados quando uma operação é realizada, seja ela por indisponibilidade de recursos ou pela falha de um hardware ou software. Quando um processo da aplicação precisa ser migrado para outro computador ou quando um hardware é substituído para manutenção, os usuários não devem perceber essa movimentação: O estágio de implementação do desenvolvimento de software é o processo de conversão de uma especificação do sistema em um sistema executável. Sempre envolve processos de projeto e programação de software, mas, se for usada uma abordagem incremental para o desenvolvimento, também pode envolver o refinamento da especificação do software. Um projeto de software é uma descrição da estrutura do software a ser implementado, dos modelos e estruturas de dados usados pelo sistema, das interfaces entre os componentes do sistema e, às vezes, dos algoritmos usados. Os projetistas não chegam a um projeto final imediatamente, mas desenvolvem-no de forma iterativa. Eles acrescentam formalidade e detalhes, enquanto desenvolvem seu projeto por meio de revisões constantes para correção de projetos anteriores. A maioria dos softwares interage com outros sistemas de software, incluindo o sistema operacional, o banco de dados, o middleware e outros aplicativos. Estes formam a ‘plataforma de software’, o ambiente em que o software será executado. Informações sobre essa plataforma são entradas essenciais para o processo de projeto, pois os projetistas devem decidir a melhor forma de integrá-la ao ambiente do software. A especificação de requisitos é uma descrição da funcionalidade que o software deve oferecer, e seus requisitos de desempenho e confiança. Se o sistema for para processamento de dados existentes, a descrição desses dados poderia ser incluída na especificação da plataforma; caso contrário, a descrição dos dados deve ser uma entrada para o processo de projeto, para que a organização dos dados do sistema seja definida. (SOMMERVILLE, 2011, p. 25). Por exemplo, um sistema que suporta um processamento automático de pedidos, os usuários do departamento de vendas podem estar distribuídos por todo país e os pedidos são feitos de notebooks ou celulares conectados através da rede. Estes pedidos chegam, são processados e enviados automaticamente para algum setor disponível. Os usuários não sabem por onde os pedidos navegam pelo sistema, mas para os usuários, o sistema parece que opera com um único banco de dados centralizado. PROGRAMAÇÃO IPROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 16 Fonte: Monteiro 2020 Diferentes tipos de entidades computacionais, controladas por diferentes S.O. e conectadas por diferentes tipos de rede podem compor um sistema distribuído. Os protocolos de rede são usados para tornar a comunicação entre essas entidades transparente. No entanto, algumas aplicações requerem o uso de um Middleware para assegurar a coerência na comunicação. O Middleware é um conjunto de funcionalidades e padronizações que atua entre a aplicação e a plataforma, oferecendo uma abstração para a comunicação e representação dos dados, permitindo que diferentes aplicações rodando em diferentes plataformas se comuniquem de forma transparente em um sistema distribuído. ISTO ACONTECE NA PRÁTICA Um sistema distribuído é o conjunto de computadores autônomos conectados por meio de uma rede de comunicação e que se comunicam por meio de mensagens. Os diferentes processadores têm sua própria memória local. Eles usam um middleware de distribuição, que ajudam no compartilhamento de diferentes recursos e capacidades para fornecer aos usuários uma rede coerente única e integrada. A computação distribuída é um campo da ciência da computação que estuda sistemas distribuídos e o programa de computador executado em um sistema distribuído é chamado de programa distribuído. Um sistema distribuído requer componentes simultâneos, rede de comunicação e um mecanismo de sincronização. Um sistema distribuído permite o compartilhamento de recursos, incluindo software por sistemas conectados à rede. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 17 2.1 Disponibilidade de Recursos O sistema distribuído precisa ser capaz de tornar os recursos técnicos acessíveis aos usuários e permitir o compartilhamento de maneira eficiente e controlada. Um recurso pode ser uma impressora, um computador, dados, internet, entre outros. Compartilhar recursos é uma forma mais econômica de lidar com eles. Por exemplo, em vez de todas as pessoas de uma família contratarem um serviço de streaming individualmente, é mais barato fazer um único contrato, pois, em razão dos diferentes padrões de comportamento de uso da plataforma, a maior parte do tempo eles não estarão usando a capacidade total contratada. A internet é um claro exemplo da facilidade de conectar usuários e recursos, tornando a colaboração e a troca de informações (arquivos, documentos, áudios e/ou vídeos) mais fáceis. No entanto, é um fator que gera preocupação quanto à segurança nos sistemas distribuídos. É preciso se ter garantias de que a troca de informações é segura e o indivíduo é realmente quem acusa ser. 2.2. Tipos de sistemas distribuídos 2.2.1 Sistemas Computacionais Distribuídos São construídos para tarefas que necessitam de alto desempenho computacional. Segundo Tanenbaum(2007) apud Monteiro(2020), podem ser subdivididos em clusters computacionais e grades computacionais. Os clusters computacionais possuem uma coleção de computadores dedicados e ligados por meio de uma rede de interconexão de alta velocidade, tornando-se popular quando as estações de trabalho diminuíram de preço e aumentaram seu desempenho. Assim, a construção de máquinas superpotentes passou a ser atrativa do ponto de vista financeiro e técnico. Normalmente esses sistemas são usados para programação em paralelo, na qual um único programa de computação intensiva pode ser executado em múltiplas máquinas. Fonte: Monteiro 2020 PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 18 A ilustração acima é um exemplo baseado em sistemas operacionais Linux. Cada nodo possui instalado um mesmo SO local e estão conectados com o mesmo tipo de rede. Esses nodos são controlados e gerenciados pelo nodo mestre, responsável por alocar os nodos auxiliares para um determinado programa paralelo, gerenciar uma fila de lotes de trabalhos e oferecer uma interface de sistema para os usuários interagirem. Dessa forma, o mestre atua como se fosse um middleware para a execução de programas e o gerenciamento do cluster, ao passo que os nodos auxiliares precisam apenas do sistema. A arquitetura em grade pode ser organizada em camadas. O nível 1 oferece uma interface para reservar os recursos locais de um site. O segundo nível é a de abstração e envolve oferecer protocolos de comunicação para suportar as transações da grade, as quais permitem o uso de múltiplos recursos. Na camada de nível 3, o sistema é responsável por gerenciar múltiplos recursos e usuários, como serviços de descoberta de recursos, alocação e escalonamento de tarefas para múltiplos recursos, replicação de dados, entre outros. O nível 4 é a camada de aplicação, na qual, dentro de uma organização virtual, as aplicações executam em um ambiente de grade computacional. 2.2.2. Sistemas de informações distribuídos Permite que um sistema se comunique com outro de forma transparente, normalmente é acessado por meio de um navegador ou aplicativo que se comunica com um provedor. Além disso, diversos tipos de dispositivos podem se conectar à internet e acessar esse serviço. Os dados e o processamento ficam do lado do provedor enquanto os clientes enviam requisições que, depois de processadas, são devolvidas ao cliente. Toda essa operação deve ocorrer, preferencialmente, de maneira transparente ao usuário. Fonte: Monteiro 2020 PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 19 A ilustração acima demonstra um cenário clássico de um sistema de informação distribuído, que precisa lidar com várias transações vindas de diferentes clientes e distribui-las para servidores. As informações, então, são armazenadas ou consultadas e o monitoramento do processamento de transações é necessário para permitir que uma aplicação do cliente consiga acessar múltiplos bancos de dados (Monteiro 2020). 2.3. Tipos de sistemas distribuídos Um sistema distribuído deve possuir as seguintes características para entregar o máximo de desempenho para os usuários: • Tolerante a Falhas: consiste em um grande número de hardware e módulos de software que estão fadados a falhar a longo prazo. Os sistemas devem ser capazes de se recuperar de falhas de componentes sem realizar ações errôneas. O objetivo é evitar falhas no sistema, mesmo na presença de falhas para fornecer um serviço ininterrupto. Um sistema é considerado tolerante a falhas se puder mascarar a presença de falhas. A confiabilidade de um sistema é definida como a probabilidade de que o sistema sobrevive até aquele momento. Normalmente, a tolerância a falhas é obtida fornecendo redundância. • Escalonável: três técnicas são empregadas para gerenciar escala: replicação, distribuição e armazenamento em cache: ം Replicação cria várias cópias de recursos. Seu uso em nomenclatura, autenticação e serviços de arquivo reduzem a carga em servidores individuais e aumentam a confiabilidade e disponibilidade dos serviços como um todo. As duas questões importantes de replicação são a colocação das réplicas e os mecanismos pelos quais são mantidas de forma consistente. Se um serviço está sendo replicado para reduzir os atrasos da rede quando o serviço é acessado, as réplicas são espalhadas pelo sistema. Se a maioria dos usuários é local, e se o serviço está sendo replicado para melhorar sua disponibilidade ou para distribuir a carga por vários servidores, então as réplicas podem ser colocadas perto uma da outra. Se uma mudança for feita no objeto, a mudança deve ser perceptível para todos no sistema. Por exemplo, o sistema envia as atualizações para qualquer réplica, e essa réplica encaminha a atualização para as outras conforme elas se tornam disponíveis. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 20 ം A distribuição, outro mecanismo de gerenciamento de escala em sistemasdistribuídos, permite que as informações mantidas por um serviço distribuído sejam estendidas a vários servidores. Distribuir dados em vários servidores reduz o tamanho do banco de dados que deve ser mantido por cada servidor, reduzindo o tempo necessário para pesquisar o banco de dados. A distribuição também distribui a carga entre os servidores, reduzindo o número de solicitações que são tratadas por cada um. No sistema estruturado em árvore, se as cópias em cache estiverem disponíveis em servidores subordinados, os níveis superiores podem ser evitados. ം Armazenamento em cache é outra técnica importante para a construção de sistemas escaláveis, pois diminui a carga nos servidores e na rede. Os dados em cache podem ser acessados mais rapidamente do que se um novo pedido for feito. A diferença entre replicação e cache é que os dados em cache são dados de curto prazo. Em vez de propagar as atualizações em dados em cache, a consistência é mantida anulando os dados em cache quando a consistência não pode ser garantida. A cache geralmente é realizada pelo cliente, reduzindo as solicitações frequentes para os serviços de rede. O armazenamento em cache também pode ocorrer nos servidores que executam esses serviços. Ler um arquivo da cópia em cache da memória no servidor de arquivos é mais rápido do que o ler no disco local do cliente. • Desempenho previsível: várias métricas de desempenho, como tempo de resposta (tempo decorrido entre o final de uma consulta ou demanda em um sistema de computador e o início de uma resposta), throughput (a taxa em que uma rede envia ou recebe os dados), utilização do sistema, capacidade da rede etc. são empregadas para avaliar a atuação. O desempenho previsível é a capacidade de fornecer a capacidade de resposta desejada em tempo hábil. • Abertura: garante que um subsistema esteja continuamente aberto para a interação com outros sistemas. Os serviços da Web são sistemas de software projetados para suportar a interação interoperável entre as máquinas em uma rede. Esses protocolos permitem que os sistemas distribuídos sejam estendidos e escalados. Um sistema distribuído independente da heterogeneidade do ambiente subjacente, como as plataformas de hardware e software alcançam a propriedade de abertura. Portanto, todo serviço é igualmente acessível a todos os clientes (locais ou remotos) do sistema. A implementação, instalação e depuração PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 21 de novos serviços não deve ser muito complexa em um sistema que possui característica de abertura. • Segurança: os sistemas distribuídos devem permitir a comunicação entre programas/ usuários/ recursos em diferentes computadores, reforçando os arranjos de segurança necessários. Os recursos de segurança têm como objetivo principal fornecer confidencialidade, integridade e disponibilidade. Confidencialidade (privacidade) é a proteção contra divulgação a pessoas não autorizadas. A violação da confidencialidade varia do desconfortável ao catastrófico. A integridade fornece proteção contra alteração e corrupção. A disponibilidade mantém o recurso acessível. Muitos incidentes de hacking comprometem a integridade dos bancos de dados e outros recursos. Ataques de “negação de serviço” são ataques contra a disponibilidade. Outras preocupações de segurança importantes são o controle de acesso e o não-repúdio. Mantendo o controle de acesso, os usuários poderão acessar apenas os recursos e serviços a que têm direito. O não-repúdio fornece proteção contra a negação por uma das entidades envolvidas em uma comunicação. Os mecanismos de segurança colocados em prática devem garantir o uso adequado de recursos por diferentes usuários no sistema. • Transparência: os sistemas distribuídos devem ser percebidos pelos usuários e pelos desenvolvedores como um todo, e não como uma coleção de componentes cooperativos. As localizações dos sistemas de computador envolvidos nas operações, replicação de dados, descoberta de recursos de vários sites, falhas, recuperação de sistema etc. são ocultados dos usuários. A transparência oculta a natureza distribuída do sistema de seus usuários e mostra ao usuário que o sistema está aparecendo e funcionando normalmente. A transparência pode ser empregada de diferentes maneiras em um sistema distribuído, como segue: ം Transparência de acesso facilita para os usuários de um sistema distribuído o acesso local e recursos remotos usando operações idênticas (por exemplo, navegação na web). ം Transparência de localização descreve nomes usados para identificar recursos de rede (por exemplo, o endereço IP) independentemente da localização do usuário e do recurso. Em outras palavras, a transparência da localização facilita ao usuário acessar recursos de qualquer lugar da rede sem saber onde o recurso está localizado. Um arquivo pode estar no próprio PC do usuário ou a milhares de quilômetros de distância em outros servidores. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 22 ം Transparência de simultaneidade permite que vários processos operem simultaneamente usando objetos de informação compartilhados sem interferência entre eles (por exemplo: a rede de caixas automáticos). Os usuários não perceberão a existência de outros usuários no sistema (mesmo que acessem os mesmos recursos). ം Transparência de replicação permite que o sistema faça cópias adicionais de arquivos e outros recursos para fins de desempenho e/ ou confiabilidade, sem que os usuários percebam. Se um recurso é replicado entre vários locais, ele deve aparecer para o usuário como um único recurso (por exemplo, espelhamento - sites espelho geralmente são usados para oferecer várias fontes das mesmas informações como uma forma de fornecer acesso confiável a grandes downloads). ം Transparência de falhas permite que os aplicativos concluam suas tarefas, apesar das falhas que ocorrem em certos componentes do sistema. Por exemplo, se um servidor falhar, os usuários devem ser redirecionados automaticamente para outro servidor e o usuário nunca deve perceber a falha (esse processo diz-se que o sistema mostra alta transparência de falha). A transparência de falhas é um dos tipos de transparência mais difíceis de realizar, uma vez que é difícil determinar se um servidor realmente falhou, ou se está simplesmente respondendo muito lentamente. Além disso, geralmente é inviável alcançar transparência total de falhas em um sistema distribuído, uma vez que as redes não são confiáveis. ം Transparência da migração facilita os recursos para mover de um local para outro sem ter seus nomes mudados (por exemplo: páginas da Web). Os usuários não devem ser informados (estar cientes) se um recurso ou entidade de computação possui a capacidade para mudar de um local físico ou lógico diferente. ം Transparência de desempenho garante que a variação de carga não deve levar à degradação do desempenho. Isso pode ser alcançado por reconfiguração automática como resposta às mudanças da carga (por exemplo: distribuição de carga). ം Transparência da escalabilidade permite que o sistema permaneça eficiente, mesmo com um aumento significativo no número de usuários e recursos conectados (por exemplo, World-Wide-Web, banco de dados distribuído). PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 23 ISTO ESTÁ NA REDE Na palestra “Raciocinando sobre sistemas distribuídos”, o profissional Renan Ranelli (engenheiro de software e consultor independente) apresenta temas importantes, como: consistência, disponibilidade, deploy, arquiteturas de dados, redes, relógios, testes e performance. Ao longo da palestra discute acerca do desenvolvimento e gestão dos sistemas distribuídos e trata sobre computação ponto a ponto e redes de sensores. Ao final, é possível refletir sobre arquiteturas que refletem o progressofeito na organização de sistemas distribuídos, além de apresentar sistemas descentralizados e computação ponto a ponto. Disponível em: https://www.infoq.com/br/presentations/raciocinando-sobre-sistemas- distribuidos/. https://www.infoq.com/br/presentations/raciocinando-sobre-sistemas-distribuidos/ https://www.infoq.com/br/presentations/raciocinando-sobre-sistemas-distribuidos/ PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 24 AULA 3 ARQUITETURA CLIENTE-SERVIDOR A arquitetura de processos colabora com a identificação de suas responsabilidades no sistema, a verificação de cargas de trabalhos e a identificação de falhas de forma mais isolada. Classificam-se os processos como: • Cliente: processos que, em geral, acessam os recursos oferecidos pelo sistema e realizam solicitações; • Servidor: processos que aceitam os pedidos e processam os respectivos serviços solicitados pelos clientes. Tanto clientes como servidores podem ser diferentes componentes, como clientes, web services, clusters, grades, entre outros (Monteiro, 2020). Para tornar os modelos físicos para sistemas distribuídos vistos até agora mais concretos, apresentaremos em detalhes os protocolos utilizados no modelo cliente/ servidor. Esse modelo se trata de um estilo arquitetônico de ampla utilização nos projetos físicos de sistemas distribuídos. Fonte: https://i1.wp.com/4.bp.blogspot.com/_xVuusqQvFWI/S83DmWhrrzI/AAAAAAAAAC4/NPWIkf0MYBo/s1600/ClienteServidor.png PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 25 Uma das principais características é a centralização de recursos. Sua ideia geral é acessar e concorrer por recursos compartilhados, portanto, os processos clientes interagem com os processos servidores, localizados fisicamente em distintos computadores hospedeiros. Os recursos compartilhados providos pelo sistema são gerenciados pelos processos servidores. Os processos se comunicam através de premissas sobre a troca de mensagens que ocorre entre os componentes em um nível considerado baixo. Um protocolo é necessário para que todos os dispositivos e elementos de uma rede possam se entender, independentemente do sistema, da aplicação utilizada ou, até mesmo, dos fabricantes dos componentes. Os dispositivos precisam trocar mensagens a partir de uma determinada linguagem, denominada “protocolo”. 3.1. Protocolos No cenário base cliente/ servidor, existem os protocolos da camada de transporte de redes de computadores: User Data Procol (UDP) e Transmission Control Protocol (TCP). Os protocolos fornecem uma relação de comunicação por meio de troca de mensagens entre processo remetente e processo destinatário. 3.1.1. Protocolo UDP Tem como característica a falta de confiabilidade. Isso significa que, através da utilização desse protocolo, pode-se enviar datagramas de uma máquina à outra, mas sem garantia de que os dados enviados chegarão intactos e na ordem correta. Fonte: adaptado de https://nordvpn.com/wp-content/uploads/2020/09/TCP_vs_UDP_02_BR.gif PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 26 O UDP é um protocolo que não é voltado à conexão. Isso significa que o “aperto de mão”, ou, tecnicamente, handshake, não é necessário para que se estabeleça uma comunicação. Dessa forma, com o UDP é possível enviar, pela mesma saída, dados para diversas máquinas diferentes sem problema algum. Imagine uma transmissão de rádio. A transmissora (servidor) transmite o sinal sem saber se os receptores (terminais) estão recebendo corretamente. Se houver uma perda de sinal nesse intervalo, a transmissão não será interrompida. A falta de confiabilidade dele fez com que as mensagens enviadas se corrompessem de diversas formas. Tais características podem parecer contra produtivas no geral, mas elas formam um outro atributo que dá muito poder ao protocolo: a velocidade. No geral, o protocolo UDP permite uma comunicação bastante rápida, o que é muito vantajoso. Altas velocidades, mas com baixa confiabilidade, ainda parecem suspeitas, porém, o UDP tem sua grande vantagem quando se trata de serviços cuja velocidade é fundamental e a perda mínima de dados não muito desvantajosa. Um exemplo é com streaming de vídeos, em que é normal alguns bytes se perderem na comunicação, mas é sempre importante que a aplicação continue rodando com rapidez (sem se importar tanto com as perdas e falhas), para que não ocorra o lag. 3.1.2. Protocolo TCP O protocolo TCP é, talvez, o mais utilizado na camada de transporte para aplicações na Web. Diferente do UDP, o TCP é voltado à conexão e tem como garantia a integridade e ordem de todos os dados. Para manter a confiabilidade dos dados, o TCP utiliza um aperto de mãos de três vias, o three way handshake, também chamado de SYN, SYN-ACK, ACK. O nome SYN, SYN-ACK, ACK é uma resumida descrição de como esse handshake funciona. A conexão entre dois hosts começa com o primeiro enviando ao segundo um pacote de sincronização. O segundo host recebe esse pacote e responde com a confirmação da sincronização (SYNchronize-ACKnowledgment). O primeiro host, por fim, manda uma confirmação (ACKnowledge) para o segundo, assim estabelecendo a conexão. Com o TCP há uma conexão entre um ponto e outro, comumente chamados de servidor e cliente. É interessante notar que o TCP permite o envio simultâneo de dados de ambos os pontos ao outro, durante todo o fluxo de comunicação. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 27 Fonte: https://upload.wikimedia.org/wikipedia/commons/f/f5/Comunica%C3%A7%C3%A3o_TCP_cliente_servidor.png Desse modo, o TCP é ideal para casos em que a confiabilidade dos dados é essencial, como quando se trata de mensagens de texto. Trocando o uso do UDP pelo TCP a confiabilidade aumenta, mesmo que com uma velocidade possivelmente um pouco menor. O importante é que a troca de dados seja efetuada com sucesso, de modo que quem está se comunicando consiga se entender. 3.1.3. UDP ou TCP? Não existe um protocolo certo ou errado, nem um melhor ou pior que outro. O que existe são situações diferentes. Essa é a chave para trabalhar com aplicações que se comunicam com diferentes máquinas. Entendemos algumas das diferenças entre os dois principais protocolos da camada de transporte dos modelos da Internet: o UDP e o TCP. Assim, entendemos a importância de ambos os protocolos e quando devemos preferir um ou outro. Podemos entender que o UDP serve melhor casos em que a integridade constante dos dados não é essencial (é menos importante que a velocidade da comunicação), como em livestreams de vídeos e jogos on-line. Por outro lado, o TCP funciona melhor em PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 28 casos que a confiabilidade do transporte de dados é o foco, como quando trabalhamos com comunicação em texto ou com documentos. O mais importante, portanto, é entender as diferenças entre os protocolos e, assim, saber qual utilizar em cada caso. Assim, teremos uma aplicação mais funcional. 3.2. Processos Cliente/Servidor em Sistemas Distribuídos 3.2.1. Clientes A principal tarefa de uma máquina cliente é prover meios de interação entre usuários e seus servidores remotos. Para isso, existem duas estratégias possíveis: para cada serviço remoto, a máquina cliente permitir o contato com o serviço via rede. Um exemplo típico dessa estratégia é uma agenda executando no smartphone de um cliente, que precisa estar devidamente sincronizada com uma agenda remota. Essa agenda está possivelmente compartilhada, portanto, a sincronização será efetivada por um protocolo de nível de aplicação. Fonte: Monteiro 2020 Já a segunda estratégia visa apresentar uma solução neutra, ou seja, independentemente de aplicação, por exemplo, nas quais a máquina cliente é utilizada apenas como um terminal, sem a necessidade dearmazenamento local, que repassa os comandos para que tudo seja executado e armazenado no servidor. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 29 Fonte: Monteiro, 2020 Nessa estratégia é importante fornecer as informações sobre a interface do usuário, mas que não tenha conhecimento de qual(is) servidor(es) ele está se conectando. É de extrema relevância que a implantação do cliente oculte a comunicação que ocorre com o servidor e mantenha um dos principais desafios de sistemas distribuídos: a transparência de acesso. Essa abordagem, que consiste em terminais clientes minimizados tem atenção crescente à medida que a conectividade da internet cresce e dispositivos móveis estão cada vez potentes. Segundo Monteiro (2020), a literatura apresenta outro modelo importante em relação aos clientes, que considera o software como muito mais do que apenas uma interface com o usuário. É possível ter parte do processamento em uma aplicação sendo executada no lado do cliente. Esse modelo é chamado de software cliente/ servidor formado por dispositivos que abrangem software em cliente embarcado, como caixas eletrônicos, leitores de código de barras e decodificadores de televisões. Nessa modelagem, as interfaces de usuários são consideradas uma pequena parte do software cliente, em contraste com as facilidades de processamento local e comunicação. 3.2.2. Servidores Em um servidor há a espera por uma requisição de um cliente. A seguir, garante- se que a solicitação seja atendida e, depois disso, espera o próximo chamado. Um servidor implementa um serviço específico em nome de uma coleção de clientes. Os servidores podem ser iterativos ou concorrentes. Um servidor iterativo gerencia as requisições e retorna o resultado ao cliente solicitante. Já um concorrente pode PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 30 ser implementado com processos filhos em que a manipulação das requisições são papéis desempenhados separadamente pelos processos inerentes ao mesmo servidor. Dessa forma, cada processo que gerencia as requisições é responsável por enviar a resposta ao cliente solicitante. Servidores concorrentes podem lidar com várias solicitações. Nesse sentido, pode-se dizer que, uma vez considerada a implementação de um servidor com os processos, o sistema atende às requisições separadamente. Outra questão interessante é como os clientes entram em contato com um servidor. Em geral, eles enviam solicitações para uma porta, na qual o servidor está executando e aguardando requisições, onde cada servidor escuta em uma porta específica. Neste caso, os clientes precisam saber previamente qual(is) a(s) porta(s) que o servidor está executando. Geralmente, serviços conhecidos atenderem em portas padrão. Fonte: Monteiro (2020) Um cluster de servidores é um conjunto de máquinas interconectadas via rede, em que, cada máquina pode executar um ou mais servidores simultaneamente. A estrutura típica de um cluster é organizada em três camadas, conforme demonstrado a seguir: PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 31 Fonte: Monteiro (2020) Observando as camadas ilustradas acima, observamos que a primeira se refere a um computador lógico, responsável por distribuir as requisições dos clientes entre os servidores de aplicação, os quais realizarão as computações propriamente ditas na segunda camada. Em qualquer arquitetura cliente/ servidor multicamadas, vários clusters são formados de servidores dedicados aos processamentos de aplicações específicas, ao contrário de clusters convencionais, constituídos de computadores normais. Em clusters corporativos, a capacidade de computação não é o foco principal, mas a garantia do acesso ao armazenamento. A ideia lógica dos clusters de servidores propõe a terceira camada que concentra no processamento de dados, em especial, os de arquivos e bancos de dados. Os servidores podem rodar em máquinas especializadas e devidamente configuradas para garantir acesso de alta velocidade aos discos. ISSO ESTÁ NA REDE Em muitos sistemas informatizados é necessário armazenar informações em bancos de dados, podemos constatar isso observando que, nas últimas décadas, o banco de dados se tornou o coração de muitos sistemas. A conexão aos bancos de dados também faz parte da arquitetura Cliente-Servidor. Para entender um conceito introdutório de Sistema de Banco de Dados, o link abaixo pode ajudar a entender. https://dicasdeprogramacao.com.br/o-que-e-um-sgbd/ http://www.dicasdeprogramacao.com.br/o-que-e-um-banco-de-dados/ https://dicasdeprogramacao.com.br/o-que-e-um-sgbd/ PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 32 AULA 4 INTRODUÇÃO À LINGUAGEM “C” Seu nome pode parecer estranho se for comparado com as linguagens contemporâneas, como FORTRAN, PASCAL ou COBOL, a linguagem C foi criada em 1972, nos Bell Telephone Laboratories, por Dennis Ritchie, com a finalidade de permitir a escrita do sistema operacional Unix, utilizando uma linguagem de relativo alto nível tentando evitar o recurso ao Assembly. Por divulgar sistema Unix pelas universidades dos Estados Unidos, a linguagem C se disseminou e se tornou conhecida por todos os tipos de programadores fazendo com que diferentes organizações desenvolvessem e utilizassem diferentes versões da linguagem C, e ela se tornou um verdadeiro fenômeno entre programadores e organizações. O American National Standards Institute (ANSI) formou, em 1983, um comitê para a definição de um padrão da linguagem C, que visa o funcionamento semelhante de todos os compiladores da linguagem, com especificações muito precisas sobre aquilo que a linguagem deve ou não fazer, seus limites, definições (DAMAS, 2016). O nome da linguagem resulta da evolução de uma outra linguagem de programação, desenvolvida por Ken Thompson, também nos Laboratórios Bell, chamada B. Dessa forma, é perfeitamente natural que a evolução da linguagem “B” originasse a linguagem C. Fonte: https://programadoresbrasil.com.br/wp-content/uploads/2020/05/C-programming-1024x530-1.jpg https://programadoresbrasil.com.br/wp-content/uploads/2020/05/C-programming-1024x530-1.jpg PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 33 4.1. Por que programar em C? Pelo fato de existirem várias linguagens de programação disponíveis no mercado, seria necessário que uma delas se destacasse muito em relação às outras para conseguir interessar tantos programadores. Segundo DAMAS (2016), a maior parte das linguagens tem um objetivo a atingir: • COBOL — Processamento de Registros • PASCAL — Ensino das Técnicas de Programação • FORTRAN — Cálculo Científico • LISP e PROLOG — Vocacionadas para as áreas de Inteligência Artificial A linguagem C não se destina a nenhuma perna em particular. É aquilo que habitualmente se denomina general purpose. Esta é uma das suas grandes vantagens, pois se adapta ao desenvolvimento de qualquer projeto, como sistemas operacionais, interfaces gráficas, processamento de registros, etc. Segundo DAMAS (2016), a linguagem C é uma linguagem extremamente potente e flexível pelos motivos a seguir: Rapidez — Consegue obter performances semelhantes às obtidas pelo Assembly, através de instruções de alto nível, isto é, fazendo uso de instruções semelhantes às utilizadas por linguagens como PASCAL ou COBOL, mesmo para usar mecanismos de mais baixo nível, como o endereçamento de memória ou a manipulação de bits. Simples — A sua sintaxe é extremamente simples, e o número de palavras reservadas, de tipos de dados básicos e de operadores é diminuto, reduzindo assim a quantidade de tempo e esforço necessários à aprendizagem da linguagem. Portável — Existe um padrão (ANSI) que define as características de qualquer compilador. Desse modo, o código escrito numa máquina pode ser transportadopara outra máquina e compilado sem qualquer alteração (ou com um número reduzido de alterações). Popular — É internacionalmente conhecida e utilizada. Está muito bem documentada em livros, revistas especializadas, manuais, etc. Existem compiladores para todo tipo de arquiteturas e computadores. Modular — C permite o desenvolvimento modular de aplicações, facilitando a separação de projetos em módulos distintos e independentes, recorrendo à utilização de funções específicas dentro de cada módulo. Alto Nível — C é considerada uma linguagem de terceira geração, tal como PASCAL, COBOL, BASIC, etc., as quais são habitualmente denominadas de alto nível quando comparadas com a linguagem Assembly. C permite, ainda, o acesso à maior parte das funcionalidades de Assembly, utilizando expressões e instruções de alto nível. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 34 Através da linguagem C é possível manipular a memória diretamente, utilizando o endereço de qualquer objeto, atuando diretamente na memória sem qualquer tipo de restrição, o que aumenta a flexibilidade da linguagem. A maior parte das funcionalidades da linguagem C é adicionada pela utilização de funções que existem em bibliotecas adicionais e realizam todo tipo de tarefas, desde a escrita de um caractere na tela até o processamento de strings, etc. A linguagem C permite ao programador escrever o código como bem quiser. Um programa pode ser todo escrito numa única linha ou dividido por inúmeras linhas. A forma como o código é escrito depende do programador, o qual tem apenas que se preocupar com o objetivo e a correção da aplicação. A evolução das linguagens fez também com que a linguagem C evoluísse no sentido das Linguagens Orientadas a Objetos, dando origem a uma nova linguagem: C++ a qual mantém a sintaxe da linguagem C e permite um conjunto adicional de características (encapsulamento, hereditariedade, polimorfismo, sobrecarga, etc.). 4.2. Introdução ao C# A linguagem C# (lê-se C sharp) foi criada junto com a arquitetura .NET. Embora existam várias outras linguagens que suportam essa tecnologia (como VB.NET, C++, J#), C# é considerada a linguagem símbolo do .NET, devido à funcionalidade da plataforma .NET terem sido desenvolvidas em C#. É uma linguagem orientada a objetos criada pela Microsoft, faz parte da sua plataforma .Net baseada em C++ e Java. 4.2.1. Características do C# A linguagem C#, na verdade, é uma junção das principais vantagens do C++ e do Java, melhorando suas implementações e adicionando novos recursos, fazendo a linguagem atrativa para desenvolvedores que queiram migrar para o Microsoft .NET. Sua sintaxe é simples e de fácil aprendizagem, muito familiar com a sintaxe de JAVA e C. Além disso, simplifica muitas complexidades do C++, fornecendo recursos poderosos, como tipos de valor nulo, enumerações, delegações, expressões lambdas e acesso direto à memória, suporte a métodos e tipos genéricos. Como C# é uma linguagem orientada a objetos, ela suporta conceitos como encapsulamento, herança e polimorfismo. Todas suas variáveis e métodos são PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 35 encapsulados dentro das definições de uma classe. Ela é usada na maioria das classes do .NET framework. Foi a primeira linguagem orientada a componentes da família C/ C++, segue os padrões da programação orientada a objetos, onde tudo deriva de um ancestral comum. Seus programas executam sobre um ambiente gerenciável, ficando a cargo do .NET framework realizar o controle de memória. Possui a Language Integrated Query (LINQ), que fornece recursos de consulta interna entre uma variedade de fontes de dados. Métodos e tipos não precisam ser declarados em ordem, um arquivo C# pode conter inúmeras classes, estruturas e interfaces. As inovações do C# permitem escrita de aplicativos de maneira rápida e aos seus desenvolvedores criarem uma infinidade de aplicativos compatíveis com o .NET framework, como, por exemplo aplicações tradicionais do Windows, componentes distribuídos, aplicativos cliente-servidor e aplicativos com integração de banco de dados. Segundo a Microsoft (2021), vários recursos do C# ajudam a criar aplicações robustas. A garbage collection recupera automaticamente a memória ocupada por objetos não utilizados inacessíveis. A manipulação das exceções fornece uma abordagem para detecção e recuperação de erros. As expressões lambda dão suporte a técnicas de programação funcional. A sintaxe de linguagem de consulta integrada (LINQ) cria um padrão comum para trabalhar com dados de qualquer base. 4.2.2. Execução do C# com .NET Os programas em C# são executados no .NET, um sistema de execução virtual chamado Common Language Runtime (CLR) e um conjunto de bibliotecas de classes. O CLR é a implementação da Microsoft da CLI (Common Language Infrastructure), um padrão internacional. A CLI é a base para a criação de ambientes de execução e desenvolvimento nos quais as linguagens e bibliotecas funcionam em conjunto diretamente. O código-fonte escrito em C# é compilado em uma linguagem intermediária que está de acordo com a especificação da CLI. A interoperabilidade de linguagem é um recurso fundamental do .NET. Além dos serviços de tempo de execução, o .NET também inclui bibliotecas extensivas. Essas bibliotecas dão suporte a várias cargas de trabalho diferentes. Elas são organizadas em namespaces que fornecem uma ampla variedade de funcionalidades úteis para tudo, desde entrada e saída de arquivos, a manipulação de cadeia de caracteres até PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 36 estruturas de aplicação web para Windows Forms controles. O aplicativo C# típico usa a biblioteca de classes .NET extensivamente para lidar com tarefas comuns. (Microsoft 2021). 4.3. Primeiro contato com o C# As primeiras lições explicam os conceitos de C# usando pequenos trechos de código. Os conceitos básicos da sintaxe de C#, bem como trabalhar com tipos de dados como cadeias de caracteres, números e valores booleanos. É tudo interativo e você começará a gravar e executar o código em questão de minutos. As primeiras lições não exigem conhecimento prévio de programação ou da linguagem C#. Sua plataforma é gratuita e pode ser baixada diretamente pelo site da Microsoft, através do link https://dotnet.microsoft.com/download. Porém, antes de baixar e instalar de forma local no computador, vamos nos ambientar com a linguagem, utilizando uma ferramenta online para executar o primeiro programa: Acesse o link https://docs.microsoft.com/pt-br/dotnet/csharp/tour-of-csharp/ tutorials/hello-world?tutorial-step=1 . A página inicial é mostrada, conforme abaixo: Após isso, clique no botão verde escrito “Entrar do modo de foco” (OBS: alguns navegadores abrem diretamente no modo de foco). Feito isso, será mostrada a tela a seguir: https://dotnet.microsoft.com/download https://docs.microsoft.com/pt-br/dotnet/csharp/tour-of-csharp/tutorials/hello-world?tutorial-step=1 https://docs.microsoft.com/pt-br/dotnet/csharp/tour-of-csharp/tutorials/hello-world?tutorial-step=1 PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 37 É bem simples. No campo do lado direito, em frente ao número 1, digite: Console. WriteLine(“Hello World!”); A seguir, clique em “Executar”. No campo “Saída” aparece o resultado da execução desse código. Nesta mesma página, no canto inferior direito, há a sequência do tutorial para ir se ambientando na linguagem. Entretanto, a ideia é deixar o computador preparado para que possamos desenvolver as atividades práticas de programação. Portanto, voltamos ao link https://dotnet.microsoft.com/download para instalarmos a versão local. Ao aparecer a página a seguir, selecione “Download .NET SDK x64” da versão 5.0: https://dotnet.microsoft.com/download PROGRAMAÇÃO I PROF. ESP.FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 38 O arquivo será baixado. Execute e siga os passos abaixo: Clique em “Instalar” e aguarde. Finalizada a instalação, instalaremos o “Visual Studio Code”, que é o ambiente de desenvolvimento. Ele pode ser baixado aqui: https://code.visualstudio.com/ https://code.visualstudio.com/ PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 39 Clique em Download for Windows, escolha a versão do seu Windows. Execute o arquivo baixado da maneira padrão: PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 40 Abra o Visual Studio Code, vá em Arquivo e, em seguida, em Abrir Pasta. Crie uma pasta chamada Teste e, em seguida, Selecionar Pasta. Feito isso, vá em “Ver” e em “Terminal”. Abrirá uma sessão na tela, que ficará assim: No campo abaixo, digite: dotnet new console --framework net5.0 PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 41 Feito isso, seu primeiro “Hello World” está criado: Feito isso, vamos executar esse primeiro programa. Ainda no terminal, digite: dotnet run Program.cs e pressione Enter. Pronto. Fizemos o primeiro “Hello World” e estamos preparados para começar a linguagem. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 42 ANOTE ISSO Experimente trocar o “Hello World” para “Olá Mundo”, ou “Olá, eu sou o programador” e execute o comando dotnet run Program.cs PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 43 AULA 5 MANIPULAÇÃO DE VARIÁVEIS LOCAIS, GLOBAIS E SUPERGLOBAIS; Toda informação processada no computador precisa, necessariamente, ser previamente armazenada na memória. Essa ação é executada quando usamos variáveis. Uma variável é uma região de memória, previamente identificada por um nome, cuja finalidade é armazenar os dados de um programa temporariamente. Cada variável armazena apenas um valor por vez, sendo esse valor um elemento qualificado a partir de um dos tipos de dados da linguagem. Fonte: https://www.devmedia.com.br/arquivos/Artigos/40728/variavel.png O nome de uma variável é usado para sua identificação e manipulação no programa. Devemos considerar algumas regras quanto aos nomes: pode ser atribuído com um ou mais caracteres, sendo que o primeiro caractere não pode ser número. O nome não pode ter espaços em branco e não pode ter o nome de uma palavra reservada a uma instrução ou um identificador. Não podem ser utilizados outros caracteres que não letras e números, com exceção do caractere underscore “_”, que pode ser utilizado para simular a separação de duas palavras, como Nome_Aluno, que também podem estar escritas como NomeAluno. No PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 44 C# as variáveis são Case Sensitive, isto é, há a diferenciação de caracteres maiúsculos e minúsculos. Por exemplo, “NomeAluno” é diferente de “nomealuno”. A linguagem C# fornece os tipos de dados disponíveis em Java. Ela adiciona suporte para números não assinados e um novo tipo de ponto flutuante de alta precisão de 128 bits. Por exemplo, a classe Int32 envolve o tipo de dados int. Já a classe Double envolve o tipo de dados double. Por outro lado, todos os tipos de dados primitivos em C# são objetos no namespace do sistema. Para cada tipo de dados, é fornecido um nome curto ou alias. Por exemplo, int é o nome curto para System.Int32, e o double é a forma curta do System.Double. A lista de tipos de dados C# pode ser conferida abaixo: Fonte: Ledur (2018) PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 45 5.1. Variáveis Locais São aquelas que só têm validade dentro do bloco no qual são declaradas. A declaração de variáveis locais é a primeira coisa que devemos colocar num bloco. A característica que torna as variáveis locais tão importantes é justamente a de serem exclusivas do bloco. Podemos ter quantos blocos de código quisermos com uma variável local chamada x, por exemplo, e elas não apresentarão conflito entre elas. Vamos à prática: abra o Visual Studio Code. Ele estará conforme vimos na aula anterior: Note que temos a classe Program, declarada em “class Program”. Logo abaixo, temos a primeira função “main”, onde está o código para demonstrar a expressão “Hello World”. Tanto a classe Program quanto a função Main são blocos de código. Como vimos, os tipos acima, para poderem testar as variáveis de forma local, temos que declarar uma variável chamada “NomeAluno” do tipo string, dentro do bloco “main”: PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 46 string NomeAluno; A seguir, atribuiremos o valor “Fulano de Tal” para a variável NomeAluno: NomeAluno = “Fulano de Tal”; Finalmente, faremos o comando para escrever na tela o conteúdo da variável. Abaixo, como vai ficar o bloco: Console.WriteLine(NomeAluno); Ao executarmos o programa1 teremos o resultado: Note que foi mostrado o conteúdo da variável “NomeAluno”. 1 A partir de agora, quando for mencionado “Executarmos o programa”, usaremos o comando dotnet run Program.cs PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 47 ANOTE ISSO Faça o teste do bloco acima, colocando o seu nome na variável NomeAluno, entre Aspas duplas “ ” e execute o programa. O resultado será o conteúdo da variável. A variável NomeAluno está declarada dentro do código “Main”. Isto é, ela é uma variável LOCAL do bloco MAIN. Para conseguirmos entender, vamos ao Visual Studio criar uma nova função para podermos testar: No exemplo do código acima, foi criada a função Serie(). Dentro desta função foi declarada apenas a variável SerieAluno. Porém, dentro deste bloco, foi solicitada a utilização da variável NomeAluno. No caso, ela apareceu com erro, pois está declarada apenas no bloco de código Main. No caso, podemos dizer que as variáveis SerieAluno e NomeAluno são variáveis locais para cada um dos seus blocos de código. 5.2. Variáveis Globais São declaradas fora de todas as funções do programa. Elas são conhecidas e podem ser alteradas por todas as funções do programa. Quando uma função tem uma variável local com o mesmo nome de uma variável global a função dará preferência à variável local. Vamos ao exemplo: PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 48 ANOTE ISSO O termo “static” na frente da variável é para “avisar” o compilador que é uma variável estática e não precisará ser instanciada. Na Programação Orientada a Objetos, ao utilizar a classe, precisa-se inicialmente instanciá-la. As variáveis declaradas como “static” não precisam ser instanciadas, já tendo sua posição de memória definida. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 49 No bloco acima declaramos a variável global DisciplinaAluno do tipo String. Ela foi declarada fora do bloco de funções e foi utilizada nos dois blocos. Tanto no Main() quanto no Serie(). Ao executar a o bloco acima, temos o seguinte resultado: A resposta da execução escreve os dois conteúdos apresentados na variável DisciplinaAluno, pois ela é uma variável global e é utilizada nos dois blocos. ANOTE ISSO Note que na função Main() colocamos uma chamada da função Serie(). Esse exemplo significa que pedimos que o sistema execute o conteúdo da função Serie() dentro do programa principal Main(). ISSO ACONTECE NA PRÁTICA Segundo UEHARA (2021), em um artigo publicado em 1973, por Wulf e Shaw, foi descrito que o uso indiscriminado de variáveis globais é prejudicial. O problema independe da linguagem de programação: as variáveis globais são danosas desde a linguagem de baixo nível até as mais altas. Os mais jovens acabam aprendendo sobre isso quandoentram em contato com comunidades de programação, o livro de Jack Ganslee ou errando nos projetos da empresa. Em 2011, houve problemas com a Toyota Camry, e foi apontado que uma das causas era o uso de 11.000 variáveis globais. Qual é exatamente o problema das variáveis globais? Para quem já trabalhou em algum projeto sabe que é fácil chegar a mil ou duas mil linhas de código, ficando, pouco a pouco, mais difícil de cumprir o fluxograma inicial ou diagrama de estados planejados. Uma das razões é devido ao fato de várias funções e interrupções terem livre acesso às variáveis globais, gerando estados não existentes ao inicialmente planejado. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 50 5.3. Variáveis Superglobais Alguns ambientes de desenvolvimento web apresentam o conceito de variáveis superglobais, as quais estão disponíveis em qualquer lugar do script, sem que seja necessário as declarar globais. A principal finalidade dessas variáveis é facilitar o acesso a dados enviados pelo servidor web (como, por exemplo, campos de um formulário). Segundo SOARES (2013), na linguagem para web PHP, as seguintes variáveis superglobais estão disponíveis: $GLOBALS: retorna um array associativo com referência para toda e qualquer variável atualmente disponível no escopo global do script. A chave desse array é o nome das variáveis. $_SERVER: contém as variáveis com informações relativas ao servidor web e ao ambiente de execução do script, por exemplo: $_GET:contém as variáveis enviadas pelo método GET. Por exemplo, se chamarmos um script da seguinte forma: http://localhost/scriptx. php5?codigo=10& nome=Walace, temos que $_GET conterá dois elementos («codigo” = 10, nome= “Walace”). $_POST: contém as variáveis enviadas pelo método HTTP POST, por exemplo, no envio de um formulário web. $_COOKIE: contém as variáveis disponíveis como cookies, as quais são especiais, gravadas nas máquinas do usuário e recuperadas pelo browser. $_FILES: esse array contém informações de arquivos enviados pelo computador cliente para o servidor web. Por exemplo, quando no formulário web anexar uma foto ou um documento qualquer. $_ENV: contém as variáveis de ambiente disponíveis no momento. $_REQUEST: este é um array com o mesmo conteúdo de $_GET, $_POST e $_COOKIE juntos, porém não é muito confiável, uma vez que variáveis com mesmo nome serão sobrepostas conforme o valor do parâmetro variables_order do arquivo php.ini (o padrão é EGPCS, ou seja, Env, Get, Post, Cookie e por último Server). $_SESSION: contém as variáveis registradas na sessão corrente. ISSO ESTÁ NA REDE O VisualStudio Code tem a possibilidade de executar alguns scripts em PHP. Você pode conferir um excelente artigo no link a seguir: https://www.ti-enxame. com/pt/php/como-executar-ou-depurar-o-php-no-codigo-do-visual-studio- vscode/1052106567/ PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 51 5.4. Constantes Tudo que é estável, inalterável, de valor fixo pode ser considerado constante. Assim, do ponto de vista computacional, uma constante é uma grandeza fixa, que usamos em uma expressão, pela qual definimos um valor que será inalterado na expressão, independentemente das variáveis envolvidas na operação a ser realizada. Por exemplo prático pode-se considerar a constante matemática pi, que equivale ao valor aproximado 3,14159. Além de ser um valor fixo, usado em uma expressão, uma constante pode ser usada como rótulo de identificação. A maneira mais comum que temos para definir uma constante é usar a diretiva definida por meio da sintaxe: const double Pi = 3.14159; Sabemos que a variável ocupa espaço na memória do computador, pois, quando é definida, segundo o tipo associado, o compilador aloca na memória espaço para armazenar o valor associado. Já uma constante é definida de maneira diferente. Ela não ocupa espaço na memória por se tratar apenas de um rótulo associado a um valor que será usado pelo programa, e esse valor não é armazenado em memória, ficando apenas vinculado ao código do programa. PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 52 AULA 6 OPERADORES Tanto as variáveis como as constantes podem ser usadas na elaboração de cálculos matemáticos com operadores. Os operadores podem ser unários ou binários. São binários quando atuam em operações de exponenciação, multiplicação, divisão, adição e subtração, em que se utilizam dois componentes. São unários quando atuam na inversão de um valor, atribuindo a ele o sinal positivo ou negativo, ou seja, atuam diretamente em apenas um componente. 6.1. Operações matemáticas em C# É comum usar em um programa expressões aritméticas quando necessitamos efetuar cálculos matemáticos. Nessas expressões definimos o relacionamento existente entre variáveis e constantes numéricas com a utilização dos operadores aritméticos. Para exemplificarmos as operações a seguir, faremos voltar ao Visual Studio Code. Iniciaremos com as operações mais simples, passando para as mais complexas. 6.1.1. Adição (+); A operação de adição é simples. Criaremos uma função chamada Calculo, na qual declararemos três variáveis (a, b, c). Feito isso, faremos nosso programa ler a informação que digitarmos. O código ficará assim: PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 53 ANOTE ISSO O comandoConsole.ReadLine() é utilizado para capturar a informação digitada. O comando Convert.ToInt32() serve para que o valor capturado pelo teclado fosse convertido do padrão “Char” para int. Ao executarmos o programa, irá aparece o prompt para digitarmos os valores para a soma. Simulando uma soma simples, de 3 + 5, teremos: PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 54 6.1.2. Subtração (-); Utilizando o exemplo anterior, vamos mudar a operação para a subtração. Trocamos apenas o conteúdo das seguintes linhas: Ao executarmos o programa, aparecerá o prompt para digitarmos os valores para a subtração. Simulando uma operação simples, de 5 - 3, teremos: 6.1.3. Multiplicação (*); Utilizando o exemplo anterior, vamos mudar a operação para a multiplicação. Em C# o sinal da multiplicação é representado pelo asterisco “*”. Trocamos apenas o conteúdo das seguintes linhas: Ao executarmos o programa, aparecerá o prompt para digitarmos os valores para a multiplicação. Simulando uma operação simples, de 5 x 3, teremos: PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 55 6.1.4. Divisão ( / ); Utilizando o exemplo anterior, vamos mudar a operação para a divisão. Em C# o sinal da divisão é representado pela barra “/”. Trocamos apenas o conteúdo das seguintes linhas: Ao executarmos o programa, aparecerá o prompt para digitarmos os valores para a divisão. Simulando uma operação simples, de 6 : 3, teremos: ANOTE ISSO Note que usamos números inteiros (6 e 3) para a divisão. O resultado (2) também foi um número inteiro. Porém, sabemos que na grande maioria dos casos, o resultado de uma divisão não é um número inteiro, se trocarmos a operação de 6 : 3 para 6 : 4 mantendo as variáveis declaradas como inteiras, teremos: Note que o resultado trouxe “1”, o que não condiz com a realidade da operação. Se você fizer essa mesma operação (6 : 4) na sua calculadora, o resultado dará 1,5. E no C#? Como faremos? Simples. Alteramos a declaração das variáveis (a, b, c) para double: PROGRAMAÇÃO I PROF. ESP. FRANCISCO LUÍS BORGHI NASCIMENTO FACULDADE CATÓLICA PAULISTA | 56 Executando a operação 6 : 4 temos: 6.1.5. Operador de Resto ( % ); Também conhecido como “Módulo”, este operador retorna o resto de uma divisão. Dos operadores citados acima os três primeiros trabalham da maneira que nós já conhecemos (Adição, Subtração e Multiplicação), já o operador de Divisão ‘/’ trabalha de maneira diferente na
Compartilhar