Escolar Documentos
Profissional Documentos
Cultura Documentos
“
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.
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.
PROGRAMAÇÃO I
PROF. ESP. FRANCISCO
LUÍS BORGHI NASCIMENTO
SUMÁRIO
AULA 01 PARADIGMA DE PROGRAMAÇÃO ORIENTADO A 05
OBJETOS
AULA 06 OPERADORES 52
INTRODUÇÃO
Fonte: https://growiz.com.br/wp-content/uploads/2020/08/kisspng-c-programming-language-logo-microsoft-visual-stud-atlas-portfolio-5b899192d
7c600.1628571115357423548838.png
AULA 1
PARADIGMA DE PROGRAMAÇÃO
ORIENTADO A OBJETOS
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”.
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 */
}
}
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:
Obj_carro.acelerar();
1.2. Encapsulamento
Fonte: https://www.alura.com.br/artigos/assets/poo-programacao-orientada-a-objetos/oop-car-methods-and-attributes.png
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
Fonte: https://www.alura.com.br/artigos/assets/poo-programacao-orientada-a-objetos/inheritance.png
ANOTE ISSO
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”.
1.5. Polimorfismo
1.6. Sobrecarga
classe calculadora{
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.
AULA 2
SISTEMAS DISTRIBUÍDOS
Fonte: https://pplware.sapo.pt/wp-content/uploads/2015/10/img0_thumb.jpg
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 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.
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.
AULA 3
ARQUITETURA
CLIENTE-SERVIDOR
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
3.1. Protocolos
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.
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.
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
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.
3.2.2. Servidores
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.
AULA 4
INTRODUÇÃO À LINGUAGEM “C”
Fonte: https://programadoresbrasil.com.br/wp-content/uploads/2020/05/C-programming-1024x530-1.jpg
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#
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.
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:
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:
Feito isso, vamos executar esse primeiro programa. Ainda no terminal, digite: dotnet
run Program.cs e pressione Enter.
ANOTE ISSO
Experimente trocar o “Hello World” para “Olá Mundo”, ou “Olá, eu sou o programador”
e execute o comando dotnet run Program.cs
AULA 5
MANIPULAÇÃO DE
VARIÁVEIS LOCAIS,
GLOBAIS E SUPERGLOBAIS;
Fonte: https://www.devmedia.com.br/arquivos/Artigos/40728/variavel.png
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”:
string NomeAluno;
Console.WriteLine(NomeAluno);
1 A partir de agora, quando for mencionado “Executarmos o programa”, usaremos o comando dotnet run Program.cs
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.
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.
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:
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().
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 quando entram 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.
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:
AULA 6
OPERADORES
ANOTE ISSO
6.1.4. Divisão ( / );
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:
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 divisão de um inteiro, por exemplo, quando dividimos 11
por 2 usando esse operador (sendo 11 um inteiro) o resto da divisão é descartado,
pois os inteiros não aceitam números fracionários, ou seja, o resultado seria 5. Já
o operador ‘%’ tem como sua única função pegar o resto de uma divisão usando o
mesmo exemplo dividindo 11 por 2 usando o operador ‘%’ modulo o resultado seria
1, já que é o resto da divisão.
Utilizando o exemplo anterior, vamos mudar a operação para a Resto. Em C# o sinal
do resto é representado pelo símbolo percentual “%”. Trocamos apenas o conteúdo
das seguintes linhas:
a += b;
a = a + b;
Note que por não precisarmos da variável “c”, pois a variável “a” recebeu o valor da
soma. A seguir, faremos exemplos para os outros operadores:
• Subtração, utilizando os números 5 e 3:
Ao executar:
Ao executar:
Ao executar:
Ao executar:
6.3.1. Igual ( == )
Este operador retornará true quando os valores testados forem iguais. Para podermos
testar os operadores, vamos fazer algumas mudanças no nosso programa de teste.
Vamos declarar a variável “c” como do tipo Boolean ( bool ). Em seguida, vamos deixar
o programa assim:
Note que a variável “c” retornou true quando os valores são iguais e false com
valores diferentes.
ANOTE ISSO
Este operador irá retornar true quando um valor testado é maior ou se ele for maior
ou igual ao outro. No nosso exemplo, vamos testar simultaneamente os operadores:
Ao executarmos, o primeiro valor retornado foi false pois 5 não é maior que 5. Mas,
a segunda retornou true porque 5 é maior ou igual a 5.
Este operador retornará true quando um valor testado é menor ou se ele for menor
ou igual ao outro. No nosso exemplo, vamos testar simultaneamente os operadores:
Use os exemplos acima com vários números diferentes para que você consiga
verificar cada situação específica e os resultados.
AULA 7
ESTRUTURA DE
DESVIO CONDICIONAL
Para um programa tomar decisões é necessário criar uma condição para que ele
possa produzir uma de duas respostas: pode ser uma resposta verdadeira ou uma
resposta falsa. A condição é a definição de relação lógica entre variáveis ou entre
variáveis e constantes, definidas com o uso dos operadores relacionais vistos no
capítulo anterior. A relação lógica existente entre os elementos de uma condição é
conseguida com a utilização dos operadores relacionais.
Um desvio condicional será simples quando tivermos uma condição que desvia
a execução do programa caso o resultado lógico avaliado de certa condição seja
verdadeiro. Se o resultado lógico avaliado for falso, nada acontecerá, e o programa
simplesmente seguirá o seu fluxo de execução. Um desvio condicional simples em
C# é realizado por meio da instrução if, que possui a seguinte sintaxe:
if <(condição)>
{
<instrução 1 executada quando condição for verdadeira>;
<instrução 2 executada quando condição for verdadeira>;
<instrução N executada quando condição for verdadeira>;
}
<instrução executada após condição ser verdadeira e/ou
falsa>;
Agora, veremos como usar a instrução if... else. Numa instrução If... else, se a
condição for verdadeira, será executada a instrução posicionada entre as instruções
if e else. Sendo a condição falsa, será executada a instrução posicionada logo após a
else, como indicado na seguinte sintaxe:
if <(condição)>
{
<instrução 1 executada quando condição for verdadeira>;
<instrução 2 executada quando condição for verdadeira>;
<instrução N executada quando condição for verdadeira>;
}
else
{
<instrução 1 executada quando condição for falsa>;
<instrução 2 executada quando condição for falsa>;
<instrução N executada quando condição for falsa>;
}
<instrução executada após condição ser verdadeira ou falsa>
Vamos mudar nosso exemplo. Agora, para testarmos o desvio condicional composto,
faremos um teste de idade. Então, no Visual Studio Code, prepararemos o programa
como abaixo:
Agora, o programa verifica se o valor digitado é maior que 17. Caso a expressão
seja true, o sistema executará o bloco informando que o digitador é maior de idade.
Caso o valor seja menor do que 17, ele executará o bloco que está embaixo.
Ao executarmos, temos:
Note que ao executar, ele verificou se o número digitado é MAIOR que 12 e (&&)
MENOR que 18. Se o número digitado obedeceu essas duas condições, foi executado
o código da condição. Caso contrário, executou outro código.
7.3.2. Disjunção ( || )
7.3.3. Negação ( ! )
switch <variável>
{
case <opção 1>: <operação 1>; break;
case <opção 2>: <operação 2>; break;
case <opção 3>: <operação 3>; break;
default <opção 4>: <operação 4>; break;
}
Para podermos testar, faremos um programa para retornar o mês por extenso quando
digitarmos o número referente. Apenas uma observação: para facilitar o entendimento,
foi colocado abaixo apenas a rotina da função Calculo(), mas o restante do programa
não foi alterado, como foram vistos em exemplos anteriores.
ANOTE ISSO
As instruções do Case podem ter mais de uma linha dentro do bloco. Para isso,
temos que utilizar as chaves ( {} ) para delimitar o código, como podemos ver
abaixo:
AULA 8
ESTRUTURA DE LAÇO
DE REPETIÇÃO
Até agora, vimos como proceder com o uso de uma programação sequencial e com
o uso de tomada de decisões. Ainda não tivemos a necessidade de ter que repetir mais
de uma vez determinado trecho de programa. Neste capítulo, executaremos estruturas
que repetem partes códigos até que seja atingida uma determinada instrução.
Fonte: https://www.researchgate.net/profile/Ulisses-Correa/publication/320237195/figure/fig7/AS:556732465074176@1509746771080/Figura-310-Exemplo-de-
laco-de-repeticao-com-validacao-final-em-um-grafo-de-fluxo-de.png
while (condição)
{
<executa instrução 1 enquanto condição for válida>;
<executa instrução 2 enquanto condição for válida>;
<executa instrução 3 enquanto condição for válida>;
<executa instrução N enquanto condição for válida>;
}
Fonte: https://www.completecsharptutorial.com/basics/images/while.jpg
ANOTE ISSO
O comando while é considerado como pré-teste porque ele executa o teste antes de
iniciar o laço. Como exemplo, atribuiremos o valor de 10 na variável B e digitaremos
um valor menor que 10. Neste caso, o laço não será executado, justamente porque
o teste é anterior:
Ao executar:
Para a execução de laço condicional pós teste temos a instrução do ... while, que
faz um teste lógico no final do laço. Esse laço tem como característica operacional
sempre executar o bloco subordinado ao laço no mínimo uma vez. A estrutura de laço
do ... while tem seu funcionamento controlado por condição, mas esse tipo de laço,
como dito, executa o bloco de instruções subordinadas ao laço pelo menos uma vez
antes de verificar a validade da condição estabelecida. Diferentemente do laço pré
teste while, que executa somente um conjunto de instruções quando a condição for
favorável.
Fonte: https://www.completecsharptutorial.com/basics/images/dowhile.jpg
Dessa forma, do ... while funciona em sentido contrário ao while, pois sempre processa
um conjunto de instruções no mínimo uma vez, mesmo que a condição não seja
válida. A instrução do ... while pode ser escrita com a sintaxe:
do
{
<faz a execução da instrução 1 enquanto condição válida>;
<faz a execução da instrução 2 enquanto condição válida>;
<faz a execução da instrução 3 enquanto condição válida>;
<faz a execução da instrução N enquanto condição válida>;
} while (condição);
No bloco acima o que está dentro de do será executado ao menos uma vez. Após a
digitação do número será verificado se o número digitado é diferente (ou não igual “!=”
a 9) . Quando o usuário digitar o 9, o laço é encerrado, conforme a execução a seguir:
ANOTE ISSO
Os programadores têm que ter muito cuidado com os chamados “laços infinitos”,
quando é definida uma condição que não será executada no bloco dentro do laço,
fazendo com que o programa execute aquele laço de maneira infinita, podendo
causar travamento do sistema até que o usuário intervenha. Os laços infinitos são
derivados de erro e falta de atenção ao programar. Temos exemplo de laço infinito:
Já vimos os conceitos de laços com while e do ... while. Nesses dois exemplos
vimos que se podem elaborar trechos que executem uma parte do programa um
determinado número de vezes com a utilização de uma variável contador. Além das
formas já vistas, há outra forma de facilitar o uso de contadores por meio do laço for,
que possui a sintaxe:
for (<início>; <fim>; <incremento>)
{
<executa instrução 1>
<executa instrução 2>
<executa instrução 3>
<executa instrução N>
}
O laço for é executado por uma instrução que recebe três parâmetros de trabalho,
separados por ponto e vírgula. O primeiro parâmetro é representado por uma variável
e seu valor inicial; o segundo parâmetro, pela condição de finalização da execução do
laço; o terceiro e último parâmetro, pelo contador de incremento que ocorre entre os
valores inicial e final da contagem.
Por ser incondicional, não precisamos colocar uma condição para que seja encerrado
o laço e, sim, um limite. Como exemplo, faremos um contador de 1 a 10 onde o valor
será incrementado de um em um, e o programa demonstrará o valor:
ANOTE ISSO
Os parâmetros passados dentro do comando for vão definir o início e o final. Porém,
no incremento, podemos utilizar qualquer tipo de razão. Se quisermos, por exemplo,
incrementar de 2 em 2 e fazer um contador, a sintaxe ficaria a seguinte:
E como resultado:
Nós aprenderemos sobre listas e vetores mais adiante. Porém, para mostrar o
funcionamento do loop “foreach” é preciso usar um vetor. O loop “foreach” é usado
para interagir (percorrer) listas. Ele opera sobre vetores ou listas:
Criamos uma lista do tipo string e colocamos alguns elementos dentro. No nosso
laço “foreach” serão exibidos todos os elementos dentro da lista. Ao executar, temos:
AULA 9
ESTRUTURA DE MÉTODOS/
FUNÇÕES
Fonte: https://miro.medium.com/max/13288/1*dR2xNH0uBPrVuV4S5x9KFg.jpeg
Note que temos um programa onde o Menu aparece dentro da execução do método
principal, já devidamente programado para receber apenas números válidos digitados.
Note que foi separado o bloco de código na função principal Main(), onde, nela
temos um chamado para a função Menu():
Ao executar:
ANOTE ISSO
Para que uma mesma variável tenha acesso a vários métodos, vimos na aula 5, o
conceito de variável local e global. Neste caso, a variável opcao está declarada como
global, pois vários métodos poderão acessar:
Ainda temos como simplificar a rotina acima? A resposta é SIM! Note que precisamos
declarar uma variável global opcao para que consigamos acessar o que foi digitada
nela. Agora, vamos fazer com que a própria função Menu() retorne para nós o valor
digitado, para que não precisemos declarar a variável global:
Note que a função Menu() está declarada como int e no final do bloco temos o
comando return que será o valor que a função Menu() irá retornar. Dentro da função
temos apenas a demonstração dos itens do menu e a coleta do valor digitado. Todas
as verificações e validações do que foi digitado ficará FORA da função Menu(), sendo
feita onde ela é chamada, como no exemplo, em Main():
No código acima foi declarada uma variável opcao que receberá o conteúdo retornado
pela função Menu() e todo tratamento será da variável opcao sem precisar codificar
nada na função Menu(). Ao executarmos temos:
Agora, vamos implementar as funções da nossa calculadora. Vamos fazer uma função
para cada operação determinada no Menu() e trazer o resultado na tela. Primeiramente,
declararemos uma variável chamada resultado no programa principal Main(). Esta
variável irá receber o resultado das operações. A partir de agora colocaremos em
prática diversos comandos vistos anteriormente. Agora, implementaremos cada uma
das funções:
Foi criada uma função para cada operação, onde a variável resultado receberá o
conteúdo retornado pela sua respectiva função. Trocamos o if para a validação da
opção digitada por switch, pois o switch nos permite limitar o escopo de digitação.
Cada um dos valores possíveis (1, 2, 3, 4 ou 9) tem sua linha de código de execução.
Qualquer valor diferente destes descritos o programa apresentará a mensagem de
“Valor inválido”.
ANOTE ISSO
Uma função pode retornar qualquer tipo de valor. Como teste, vamos simular uma
função que retorne um valor String e outro que retorne um valor booleano, a ser
implementado na função Main():
Ao executarmos:
AULA 10
PASSAGEM DE ARGUMENTOS
POR VALORES E REFERÊNCIAS
http://www.andrealveslima.com.br/blog/wp-content/uploads/2016/02/020516_0509_Passandopar1.png
Quando se trabalha com funções, é possível passar valores de uma sub-rotina para
outra. A passagem de parâmetro entre funções poderá ser definida sob a ótica de
dois comportamentos: passagem de parâmetro por valor e passagem de parâmetro
por referência.
Ocorre quando uma sub-rotina envia um conteúdo para outra sub-rotina e essa
segunda não passa à primeira nenhum valor por parâmetro. Vamos ao nosso Visual
Studio Code, onde temos nosso programa de cálculos prontos. Ainda podemos otimizá-
lo utilizando parâmetros nas funções e diminuindo significativamente a quantidade
de código. Usamos a passagem de parâmetro por valor quando há necessidade de
passar algum conteúdo à sub-rotina chamada.
O conteúdo passado pelo parâmetro na chamada da sub-rotina é copiado a partir
da chamada para a sub-rotina chamada. Qualquer modificação na variável local da
sub-rotina não afetará o valor do parâmetro passado, ficando assim o resultado fixado
na área de abrangência da sub-rotina chamada (MANZANO, 2014). Modificaremos as
funções das operações para que elas estejam preparadas para receber os valores do
parâmetro:
Como pode ser visto, a quantidade de código das funções reduziu drasticamente.
No exemplo do capítulo anterior, dentro de cada função havia os códigos de entrada
de dados para as variáveis A e B. Agora, note que essas variáveis estão declaradas
nas funções: static double Adicao(double a, double b) onde as variáveis
double a e double b os parâmetros que serão passados pela função Main() conforme
a seguir:
No exemplo acima nota-se que a função Main() atribuiu 5 para a variável valor. Feito
isso, chamando-se a função, passando a variável valor como referência Metodo(ref
valor), dentro da função Metodo, o valor Param1 que é recebido pela variável valor é
alterado. Ao voltar na função Main() será demonstrado o valor 105 na linha Console.
WriteLine(“Valor na Main = “ + valor); porque foi passado como
referência. Vamos preparar nosso Visual Studio Code para exemplificarmos o conceito,
otimizando nosso programa de cálculos:
ANOTE ISSO
A Função Calcular() é a função principal do programa. Ela foi feita para retornar o valor
bool, pois dentro dela teremos uma validação de conteúdo. Caso o conteúdo validado
esteja OK, a função irá retornar o valor True, caso contrário, False. Sua declaração
pode ser analisada a seguir:
São definidos:
• O tipo bool, como foi explicado anteriormente, é para que ela retorne True caso
dê tudo certo.
• O parâmetro de referência declarado como tpOper, na sua chamada é passada
à variável TipoOperacao, que será atribuído o tipo de operação.
• O parâmetro de valor opMenu que recebe o valor da variável opcao em sua
chamada, é a opção digitada pelo usuário no Menu().
• O parâmetro A, que recebe a variável A, que agora, como é passado por referência,
servirá para que seja atribuído o resultado da operação, já que não temos mais
a variável resultado como foi visto no exemplo anterior.
• O parâmetro B recebe como valor a variável B, que é o segundo número utilizado
no exemplo de operação.
ANOTE ISSO
O parâmetro out é um parâmetro «emissor», o que significa que seu valor somente
é passado de uma função. Sempre que um parâmetro out é passado, somente a
referência da variável é passada para a função.
Foram inseridas apenas duas linhas na função Menu() demonstrando novas opções
a serem adicionadas.
E a função Main()? Não precisamos alterar sequer uma linha nela. Com algumas
poucas linhas, sem precisar alterar a função principal, temos nosso programa rodando:
ANOTE ISSO
AULA 11
PRINCIPAIS FUNÇÕES DO C#
Fonte: https://motc.gov.qa/sites/default/files/c-programming.png
• Absoluto, onde retorna seu valor numérico sem seu sinal. A sintaxe Abs(decimal)
retorna:
Agora, testaremos algumas das várias funções para String do C#. Por serem várias,
a ideia é utilizar as principais. Para isso, podemos apagar o conteúdo da função Main(),
Ao executar, temos:
ANOTE ISSO
O outro método foi como utilizamos no exemplo acima. Iniciamos a string com o
símbolo $ antes de abrir as aspas e colocamos o conteúdo das variáveis dentro das
chaves { }. O resultado prático é o mesmo e as duas maneiras estão corretas.
Ao executar, temos:
Ao executarmos, temos:
Ao executarmos:
Neste caso, significa que a última ocorrência da string “bc” se inicia na posição 38
do conteúdo da variável strExemplo.
Limitando o recorte:
Ao executarmos:
Note que, no primeiro caso, sem limitar o corte, foi retornada parte da string iniciando
a partir da posição 4 até o final da string. Limitando o corte, no segundo caso, é
retornada a string.
É muito útil a conversão de números para string. Neste caso o C# fornece uma
função para converter o número em diversos formatos diferentes. É a função ToString(),
que aceita diversos parâmetros que servirão para cada um dos formatos:
Ao executar, temos:
No exemplo acima, definimos as variáveis str1, str2, str3 e str4 recebendo o valor
3, já convertendo para o argumento pré-definido:
• Sem argumento (): retorna o número como é digitado.
• Argumento (“C”): retorna no formato de moeda com as casas decimais padrão.
Neste caso, o padrão do Windows.
• Argumento (“C3”): retorna no formato de moeda com as casas decimais definidas.
No exemplo, 3 casas decimais.
• Argumento (“F2”): retorna no formato de um número decimal, com as casas
decimais definidas, no exemplo, com duas casas.
ANOTE ISSO
Fonte: https://dotnet.microsoft.com/static/images/illustrations/swimlane-operating-systems.svg?v=N_fhFXVLGtIWZteO-psDLzC_ZY22DmT3-b6XfPh_PDM
AULA 12
MANIPULAÇÃO DE
VETORES (ARRAY)
Fonte: https://www.blogson.com.br/wp-content/uploads/2020/11/2820053-637286284193596179-16x91-1.jpg
Vetores podem ser tanto listas simples e sequenciais, como coleções compostas,
ou seja, podem possuir tanto apenas uma como várias dimensões:
• Com uma dimensão é chamada simplesmente de vetor;
Fonte: http://www.linhadecodigo.com.br/artigos/img_artigos/Joel_Rodrigues/ArraysCsharp/ArraysEmCSharpTeoriaEPratica1.jpg
Fonte: http://www.linhadecodigo.com.br/artigos/img_artigos/Joel_Rodrigues/ArraysCsharp/ArraysEmCSharpTeoriaEPratica2.jpg
Fonte: http://www.linhadecodigo.com.br/artigos/img_artigos/Joel_Rodrigues/ArraysCsharp/ArraysEmCSharpTeoriaEPratica4.jpg
Os chamados ‘jagged arrays’ são um tipo a mais de array, onde cada elemento é
um vetor. Supõe-se um vetor que armazena as turmas de uma escola e, para cada
turma, há um número diferente de alunos dos quais é preciso armazenar o código.
Ao usar uma matriz, onde as linhas representariam a turma e as colunas
representariam os alunos, poderia haver uma limitação, onde o número de alunos
seria fixo para todas as turmas. Aqui entram as matrizes denteadas, onde pode ter
um vetor que comporte a quantidade de turmas e cada elemento é um vetor, cujo
comprimento varia e podemos definir individualmente.
12.3. Vetores em C#
12.3.1. Declaração
12.3.2. Inicialização
Neste caso, teremos uma situação diferente das variáveis. Quando uma variável é
declarada, ela já está pronta para ser utilizada. No caso de vetores, primeiramente é
declarado o tipo do vetor, como foi visto acima. Feito isso, será feita a inicialização
deste vetor, onde, agora sim, serão definidos os espaços de memória:
Neste caso, foram inicializados os vetores, sendo definido, em memória, que cada
um deles terá 10 espaços.
ANOTE ISSO
Agora, vamos ao Visual Studio Code para podermos exemplificar, na prática, como
utilizamos o vetor. Vamos declarar dois vetores com 3 posições, diferente do de 10
posições declarados acima, para conseguirmos ilustrar a manipulação das posições.
Digite o código conforme abaixo no VS Code:
(...)
O código acima faz com que sejam digitados os nomes e as notas de 20 alunos,
no qual é preenchido o vetor nomes[] e notas[]. Depois de digitados os valores, o vetor
é novamente percorrido, para que se alimente a variável media. Ao executar, temos:
(...)
Note que foram executadas 20 vezes cada código, e no final, o vetor foi percorrido
novamente, tendo as notas somadas. Feito o percurso final, a variável, já somada com
todas as notas, é apresentada com a média das notas dos alunos.
AULA 13
MANIPULAÇÃO DE MATRIZES
Fonte https://maiscommenosmatematica.com/wp-content/uploads/2020/06/matriz-quadrada.png
Fonte: http://www.linhadecodigo.com.br/artigos/img_artigos/Joel_Rodrigues/ArraysCsharp/ArraysEmCSharpTeoriaEPratica2.jpg
ou denteada:
Fonte: https://i.stack.imgur.com/KDfnM.gif
No exemplo acima, como podemos acessar, por exemplo, o número “14”? Podemos
ver que ele está na posição B3. Isto é, Coluna B, linha 3. Esta posição é chamada de
Note que no exemplo acima, o número 14 se encontra na posição [1,2], sendo Coluna
1 e Linha 2, não se esquecendo o conceito zero-based onde as posições se iniciam em
zero. Vamos para o Visual Studio Code fazer uma matriz desde sua declaração até
a inserção das informações, para fazê-la ficar igual ao exemplo acima? Iniciaremos
com a declaração e inicialização:
Assim como nos vetores, podemos também otimizar o código para que a matriz seja
gerada através de estruturas de repetição, bem como preenchermos os valores nas
coordenadas da maneira que quisermos. Podemos também, tanto nos vetores quanto
nas matrizes, dimensionar da maneira que quisermos. Para isso, a inicialização da matriz
é feita após a declaração. Exemplificaremos, no Visual Studio Code, uma matriz na qual
o usuário vai definir sua estrutura e preencher os valores de acordo com a declaração:
ANOTE ISSO
ANOTE ISSO
Fonte: http://s3-sa-east-1.amazonaws.com/descomplica-blog/wp-content/uploads/2015/08/matriz.png
Como vimos no capítulo passado, podemos ter as matrizes denteadas, onde cada
elemento é um vetor. Vamos ao exemplo no Visual Studio Code, onde utilizaremos
um Array Jagged para armazenar turmas com vários alunos cada uma.
AULA 14
RECURSIVIDADE,
TRATAMENTO DE EXCEÇÕES
E PERSISTÊNCIA DE DADOS
14.1. Recursividade
Capacidade que uma linguagem tem de permitir que uma função possa invocar a
si mesma. A recursividade pode ser direta, onde uma função invoca a si mesma no
seu corpo de função, ou indireta, onde a função f invoca uma outra função g que, por
sua vez, volta a invocar a função f.
Até que não é um código tão complexo. Mas, no caso, precisamos executar um laço
para que o resultado seja apresentado. Como já vimos anteriormente, poupar recursos
é imprescindível para um bom sistema. No caso, o laço pode ocupar processamento e
memória, dependendo do tamanho do valor a ser calculado. Porém, vamos exemplificar
o mesmo código, utilizando a função recursiva:
Note que o programa principal possui apenas 3 linhas e não possui laço de repetição.
A função fat() será chamada dentro dela mesma quantas vezes forem necessárias,
de acordo com o parâmetro passado. Ao executarmos, temos:
Podemos ver que a função Media() foi executada dentro da própria função,
caracterizando-se a recursividade. Ao executarmos o código, temos:
14.2. Exceções
Os sistemas devem ser capazes de tratar os erros que ocorrem em sua execução
de maneira consistente. Uma exceção é qualquer condição de erro ou comportamento
inesperado encontrado por um programa em execução. Exceções podem ser geradas
devido a uma falha no código ou no código que chamado, como uma função, recursos
do sistema operacional não disponíveis, condições inesperadas encontradas pelo
compilador.
Fonte: https://static.imasters.com.br/wp-content/uploads/2016/06/exce%C3%A7%C3%A3o-1.jpg
Note que a plataforma, no caso o Visual Studio Code, lançou uma exceção assim
que digitamos a letra “A” onde deveria ser digitado um número. A maneira como o
C# implementa o tratamento de exceção oferece as seguintes vantagens, Segundo
a Microsoft (2021):
O lançamento e tratamento de exceção funciona da mesma maneira
para linguagens de programação .NET.
Não requer nenhuma sintaxe de linguagem específica para tratamento
de exceção, mas permite que cada linguagem defina sua própria sintaxe.
Exceções podem ser geradas pelos limites de processo e até mesmo
de computador.
O código de tratamento de exceção pode ser adicionado a um
aplicativo para aumentar a confiabilidade do programa.
As exceções oferecem vantagens sobre outros métodos de notificação
de erro, como códigos de retorno. Falhas não passam despercebidas
porque se uma exceção for lançada e você não tratar dela, o runtime
encerra o aplicativo. Valores inválidos não continuam a se propagar
através do sistema como resultado do código que não consegue
verificar se há um código de retorno de falha.
ANOTE ISSO
Por isso, ao tratarmos a exceção abaixo, no exemplo, utilizaremos este erro para
informar.
Note que a coleta dos números agora pertence toda ao bloco try catch(). Se ocorrer
alguma exceção relacionada ao formato, o sistema irá retornar uma mensagem tratada,
facilitando o entendimento do usuário:
ANOTE ISSO
Podemos colocar dentro do mesmo bloco try catch() vários catch() para tratarmos
as exceções do jeito que quisermos. Caso não tenha alguma exceção específica,
deixamos apenas o catch sem parâmetros:
Existem diversos Frameworks para acessar dados em C#, dentre elas o Entity
Framework, que pode ser baixado diretamente no Visual Studio e Visual Studio
Code. Mais informações e instruções de como utilizá-lo podem ser encontradas no
link abaixo: https://www.alura.com.br/conteudo/entity-framework-core-banco-pre-
existente-parte1?gclid=Cj0KCQjww4OMBhCUARIsAILndv79-MlQdkndoKhQ5ktco6dG
2besyLW6tDlel7OlHt6pQKTpfdxF6AAaAsUyEALw_wcB
AULA 15
INTERFACES GRÁFICAS
E EVENTOS
Fonte: http://videcursos.com.br/wp-content/uploads/2016/11/c-windows-form.png
O Windows Forms é uma biblioteca parte do Microsoft .NET Framework. Ele fornece
uma plataforma para escrever aplicativos para computadores de mesa, laptops e
tablets.
É uma aplicação baseada em eventos suportada pelo .NET Framework da Microsoft.
Ao contrário de um programa em lote, ele passa a maior parte do tempo simplesmente
esperando que o usuário faça algo, como preencher uma caixa de texto ou clicar
em um botão. O Windows Forms fornece acesso aos controles comuns nativos da
interface do usuário do Windows, envolvendo a API do Windows existente no código
gerenciado (FREEMAN, 2017 apud LEDUR, 2018).
Fonte: https://visualstudio.microsoft.com/pt-br/downloads/
Já com o Visual Studio instalado, para darmos início a uma aplicação, seguimos
a sequência a seguir:
Clique em “Próximo”, que estará na parte de baixo da tela. Feito isso, temos o
primeiro formulário (Form) no Visual Studio.
Os elementos que estão dentro da caixa de ferramentas podem ser arrastados para
um modo de exibição. Qualquer ação adiciona o código fundamental para criar uma
instância do item no arquivo de projeto ativo. A caixa de ferramentas exibe apenas
os itens que são apropriados para o tipo de arquivo em que se está trabalhando. Se
o projeto requer um controle que não é compatível com o perfil de cliente, você pode
definir seu projeto para a estrutura inteira, editando as propriedades dele.
A seguir, você pode simplesmente arrastar um item da caixa de ferramentas para
o form. Faça um teste utilizando um button (que cria um botão no form):
15.3. Eventos
Um evento é uma ação a que você pode responder ou que pode manipular no
código. Os eventos podem ser gerados por uma ação do usuário, como clicar no mouse
ou pressionar uma tecla. Eles também podem ser criados pelo código do programa
ou pelo sistema. Aplicações dirigidas por eventos executam o código em resposta
a um evento. Cada formulário e controle expõe um conjunto predefinido de eventos
programáveis. Se um desses eventos ocorre e existe um código no manipulador de
eventos associado, esse código é invocado (MICROSOFT, 2021).
Um manipulador de eventos é um método vinculado a um evento. Quando o evento
é gerado, o código dentro do manipulador de eventos é executado. Cada manipulador
de eventos fornece dois parâmetros que permitem manipular o evento corretamente.
No código abaixo, você pode ver um manipulador de eventos para um evento de clique
do controle de botão.
Para aparecer o código acima, basta clicar duas vezes no botão inserido no Form.
Vamos colocar no evento “button1_Click()” um comando que será executado quando
for clicado o botão:
O código que é invocado no evento tem a mesma sintaxe do que vimos nos exemplos
anteriores, o C#. Para isso, vamos exemplificar a manipulação de vetores, porém,
utilizando um evento de botão.
Vamos colocar um botão Button, um Label, um TextBox e um Rich Text Box. Mudamos
a propriedade Text do Label para “Digite a quantidade de elementos” e “Gerar Vetor”
na mesma propriedade Text do Button.
Com 2 cliques no quadro a frente de onde está selecionado o evento Leave, deverá
aparecer o código abaixo:
Agora, dentro da função, vamos codificar a rotina para evitar que seja digitado um
valor inválido:
Note que:
• foi criada uma variável pública chamada qtdeElementos, que foi utilizada para
receber o valor do textbox, convertido para inteiro:
O código acima vai gerar um vetor com valores aleatórios, gerados pela função
Random(), e irá preencher o vetor com os valores definidos. Não sem antes efetuar
a verificação se o valor foi digitado corretamente na quantidade de elementos. Caso
o botão seja clicado sem que seja informada a quantidade, o sistema retornará a
mensagem de que não pode ser vazio:
CONCLUSÃO
Fonte: https://suporteninja.com/wp-content/uploads/2015/11/1431583113431.jpg
Sabemos que, mesmo com o final desta etapa, estamos apenas iniciando um
processo que, certamente, será de muito estudo e muitos desafios. Por isso, há muitos
materiais a serem pesquisados e desenvolvidos. A rotina e sequência de estudos trará
perspectivas de sucesso na profissão.
ELEMENTOS COMPLEMENTARES
LIVRO
REFERÊNCIAS
MONTEIRO, E. R.; Junior, R.C. M.; Lima, B.S. D.; al., E. Sistemas Distribuídos. Porto
Alegre, SAGAH, 2020
SANTOS, M.G. D.; Saraiva, M.O. D.; Fátima, P.G. D. Linguagem de programação. Porto
Alegre, SAGAH, 2018