Buscar

Livro de Programacao I

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 154 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 154 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 154 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Continue navegando