Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Lógica de
Programação e
Algoritmos
com C#
Jackson Camara
Dedico este trabalho a minha amada filha Louise e esposa Daiana por todo amor e carinho. Vocês
deram um sentido especial a minha vida, me proporcionando grandes momentos de alegria.
3
As únicas limitações são aquelas que estabelecemos em nossa mente.
Napoleon Hill.
4
Isenção de Responsabilidade
Este livro é baseado em metodologias praticadas no Curso de Bacharel em Ciência da Computação e
também em livros renomados. Porém algumas abordagens são diferentes de acordo com a visão do
autor desta obra. Essas diferenças são para sintetizar o conteúdo e simplificar o aprendizado, afim de
reduzir anos de estudo para poucos meses.
Não há uma solução mágica que ensine você a programar em poucos dias, se você procura esta
solução, sinto muito, ela não existe. Porém, a metodologia aplicada neste livro, permite que o leitor
aprenda lógica de programação em poucos meses. Desde que, aplique todos os conceitos aprendidos
e faça todos exercícios. Saiba que seu aprendizado depende mais de você, do que qualquer outra
pessoa ou livro. Este livro, foi elaborado para facilitar o seu aprendizado, mas a caminhada será árdua.
Tenho certeza, que ao chegar ao fim desse livro, todo o seu esforço será compensando.
Este livro está na fase de desenvolvimento, não está completo e ainda não foi revisado. A distribuição
desta obra é gratuita, com o intuito de ajudar e receber feedbacks dos nossos leitores. Fique atento em
nosso site, verifique sempre que possível seu e-mail, que em breve teremos mais versões atualizadas.
Caso você queira baixar este e-book atualizado ou assinar a newsletter acesse
www.jacksoncamara.com.br.
5
Para quem é este livro?
Este livro foi elaborado para qualquer pessoa que queira se tornar um desenvolvedor de software. O
conteúdo deste livro apresenta a primeira etapa da programação, o alicerce para construir qualquer
aplicação. Se você deseja entrar no universo da programação de computadores, esta é uma leitura
indispensável.
Assumimos que você não tenha, nenhum conhecimento em algoritmos e lógica de programação ou
qualquer conhecimento avançado em matemática. Você apenas precisa ter vontade e disciplina, que
o resto te guiaremos passo a passo.
Este livro é voltado para o ensino inicial de algoritmos e lógica de programação até o ensino avançado
utilizando a linguagem C#. Procuramos fazer isso de uma maneira bem simples. O livro possui
conceitos teóricos, exemplos práticos e muitos exercícios resolvidos. Acreditamos que os iniciantes
na programação, precisam praticar muitos exercícios de lógica de programação antes de partir para
programação de softwares.
Os ensinamentos desse livro são baseados na grade curricular do Curso de Ciência da Computação,
em livros renomados sobre o assunto e toda a minha experiência adquirida em oito anos como
programador. Matérias do curso de Ciência da Computação como algoritmos, lógica de programação,
estrutura de dados e matemática, estão inseridas nesse livro de forma bem simples, sem pular
nenhuma etapa.
Se você deseja se tornar um programador com habilidades fantásticas em lógica computacional, este
livro lhe aguarda com todo carinho!
6
Fora da curva!
Antes de começar a estudar este livro ou qualquer outra ferramenta que você esteja utilizando para
aprender programação, você precisa entender de uma vez por todas: Você não aprenderá a programar
em poucos dias! Dito isto, deixe toda sua ansiedade de lado, aprenda a controlar, caso contrário, você
será engolido por uma ansiedade devastadora.
Não adianta você ficar 18 horas por dia na frente do computador estudando, seu cérebro precisa de
uma pausa. A melhor pausa para nosso cérebro, não é ficar nas redes sociais ou jogos, mas sim,
praticar exercícios físicos. Se você não pratica nenhum exercício, está na hora de começar. Vá pra
academia, se matricule num curso de arte marcial, natação, etc. Se não tem dinheiro ou tempo para
se deslocar até uma academia, coloque um tênis confortável e vá correr perto da sua casa. Só não
fique parado, sua mente é seu corpo!
Aprender a programar exige uma prática diária, não adianta você ficar dias sem estudar e depois
querer repor esses dias perdidos em um dia. Ser constante é mais importante que ser intenso, a
constância é a chave para aprender a programar. Se você conseguir ser constante e intenso, parabéns,
você se tornará um programador em breve. Defina uma quantidade de horas que você poderá se
dedicar ao estudo por dia, coloque no despertador a hora de começar e a hora de terminar. Já aproveite,
e faça o mesmo para a prática de exercícios físicos.
É comum as pessoas dizerem que não conseguem aprender a programar porque tem déficit de atenção.
Pode ser que realmente tenham, mas provavelmente não passam de um bando de procrastinadores
que preferem usar desculpas esfarrapadas para se sentirem menos mal. Quer ter foco, desligue seu
celular, vá estudar num lugar que tenha silêncio, de preferência o mais longe das pessoas que o
conhece. Se você não tem esse local, aprenda a acordar cedo, que tal as 4:30 da manhã? Se acordar
cedo, durma cedo! A maioria das pessoas precisam de 6 a 9 horas de sono, se você precisa mais do
que isso, algo pode estar errado. Dormir bem é a chave do sucesso.
Quando você acorda cedo, você se sente realizado, você sabe que está na frente da maioria das
pessoas. Por enquanto elas dormem, você já está trabalhando. Provavelmente até o horário do almoço,
você já terá feito todas as suas tarefas. Durante o desenvolvimento do meu TTC (Trabalho Técnico
Cientifico de Conclusão de Curso), eu li um livro que mudou minha vida, O milagre da Manhã de
Hal Elrod. Depois que li esse livro todas as complexidades do meu TTC foram resolvidas antes da
maioria das pessoas acordarem, isso me deixava energizado o dia inteiro.
Se alimentar bem é tão importante quanto praticar exercícios físicos e praticar exercícios físicos é tão
importante quanto estudar. Uma atividade depende da outra, nosso corpo é composto por peças, mas
temos que olhar como uma única peça. Não se esqueça, o seu corpo é sua ferramenta de trabalho. Se
uma coisa vai mal, tudo irá mal, cuide do seu corpo e da sua mente, é nela que você abita. Reduza o
consumo de pizzas, doces, massas, lanches, principalmente tudo que for fast-food e industrializado.
7
Se você possui vícios com drogas, álcool, cigarro está na hora de buscar tratamento. Empresas evitam
contratar pessoas que tenham qualquer tipo de vício, você está reduzindo suas chances de entrar no
mercado de trabalho. Consuma alimentos saudáveis como: aveia, frutas, verduras, sucos, iogurte
natural e beba muita água. Se você não gosta, lamento, em breve você pagará um preço alto.
Programadores adoram tomar café, não exagere, isso atrapalha a qualidade do seu sono, cafeína em
excesso faz mal.
Já ensinei muita coisa que você precisa saber, gostaria que alguém tivesse me ensinado. Mas tive que
aprender com muita luta, o quanto a vida pode ser cruel para aqueles que vivem na ignorância e no
comodismo. A minha liberdade mental veio com a leitura de livros maravilhosos, que me ensinaram
muito. Aprendi que o único culpado sou eu, seja do meu passado, presente ou futuro. Pare de culpar
as pessoas pelo seu fracasso e se vangloriar pelas suas conquistas. Pode ter certeza, você é mais
responsável pelo seu fracasso do que pelo seu sucesso.
Não adianta você querer algo, apenas acreditar que vai conseguir, falando palavras de incentivo, se
você não as coloca em prática. Um versículo da bíblia diz: “Assim também a fé, se não tiver as obras,
é morta em si mesma.” Tiago 2:17. Em suma, esse versículo diz que temos que acreditar e fazer
aquilo que acreditamos, um não vale sem o outro. Em outro versículo: “Bem vês que a fé cooperou
com as suas obras, e que pelas obras a fé foi aperfeiçoada.” Tiago 2:22. Em suma, se você acreditar
e fazer, a sua vontade será aperfeiçoada. Este pensamento gera um ciclo virtuoso, sua fé irá te
manter em pé para que você possa fazer todas obras que você deseja e, suas obras aperfeiçoarão a
sua fé e assim o ciclo continua. Muitos ensinamentos estão na Bíblia gratuitamente, não me importa
se você acredita ou não. Mas você, há de concordar que a bíblia nos ensina muito sobre a vida.
Se você é jovem, parabéns! Você deu um grande passo na sua vida. Se você já não é mais tão jovem
assim, parabéns! Você já ganhou a sua primeira medalha. Apenas por querer mudar de vida, você está
na frente de 99% das pessoas desse país. Se você está se achando velho, porque tem trintas e poucos
anos, quarenta ou cinquenta. Leia o parágrafo abaixo, nele compartilho um dos maiores momentos
da minha vida.
Tenha cuidado com os conselhos que você recebe, principalmente daqueles que nunca construíram
nada. Quando eu tinha meus 26 anos, decidi mudar de vida. Eu sabia que para começar a mudança na
minha vida, eu precisava estudar. Não importa o meio de estudo, faculdade, cursos, livros e etc., eu
apenas sabia que tinha que estudar. Inseguro como era, fui buscar apoio em pessoas próximas a mim,
perguntei a elas: Estou pensando em começar a faculdade de Ciência da Computação, o que vocês
acham? Recebi várias respostas diferentes: “Você já é concursado, tem um bom salário, pra que?”
“Você já está velho, tem que entrar na faculdade igual minha filha fez, aos 17 anos.”, “Vai fazer
faculdade pra ganhar os 10% a mais no trabalho, faz uma qualquer a distância!”, “Cara, não adianta
estudar, nascemos para ser pobre e ferrado.”, “Você sabe que essa faculdade é difícil né?”, “Vai deixar
de ir nos churrascos a noite para ir para faculdade, depois de velho, vai ficar com sua família, vai!”.
Embora eu tenha ouvido péssimos conselhos não fiquei com raiva de ninguém, acredito que nenhum
deles queriam meu mal. Apenas me falaram aquilo que eles tinham dentro deles, a culpa foi minha,
por buscar conselhos no lugar errado.
8
Nesta época eu já estava aprendendo programação sozinho a quase dois anos. Mas, depois de ouvir
todos esses conselhos abomináveis, eu já havia desistido dos meus estudos e da faculdade. Até que
um dia fui levar minha filha no pediatra para uma consulta rotineira. O pediatra dela o Dr. Júlio, além
de pediatra é um excelente psicanalista, com anos de experiência na área. Então perguntei a ele:
“Doutor, estou pensando em começar a faculdade, mas estou velho. O que o senhor acha?”. A resposta
não podia ser mais incrível: “O tempo vai passar de qualquer jeito, você estudando ou não. Daqui 5
anos você pode ser um cientista da computação ou não.
Meu avô aos 81 anos enfartou, e disse ao médico: “doutor eu nunca fumei e bebi, minha alimentação
é saudável, quase não como carne e doces, não tomo café e refrigerante, como isso pode acontecer?
Se eu já tivesse uns 100 anos eu entenderia, me explica? O médico apenas sorriu para meu avô. Em
outra ocasião, poucos dias antes de enfartar, meu avô estava fazendo uma das suas intermináveis
obras, já cansado, me falou: “A se eu tivesse meus 50 anos, eu poderia ...” Ele disse o quanto de coisas
que ele poderia e queria fazer. Você percebeu que ele acha que uma pessoa de cinquenta anos é nova
e que 81 anos é cedo para chegar ao fim da vida. Quero dizer com isso, que tudo depende do ponto
de vista, da perspectiva que você olha o problema, imagino que você entendeu a mensagem.
Infelizmente, só aprendemos a dar valor depois que perdemos. Sem dúvida, se tem algo que não
conseguimos recuperar é o tempo.
Se você chegou até aqui, imagino que está pronto para começar a estudar. Se você acha que não está
pronto ou quer transformar o seu mindset, te aconselho que faça a leitura de dois livros: “O poder da
ação” de Paulo Vieira e o já mencionado “O milagre da manhã” de Hal Elrod. Se após a leitura desses
livros você ainda acha que não está pronto, o universo da programação não é pra você.
Escrevi este livro para você, como se fosse um presente meu, para minha amada filha. Aproveite essa
oportunidade, ninguém fez isso por mim, te entrego esse livro gratuitamente com muito carinho, faça
valer a pena o tempo que dediquei. Os ensinamentos que escrevi nessa seção e todo conhecimento
que compartilharei com você nas próximas páginas, poderão ajudá-lo, para que sua vida seja mais
fácil do que a minha foi. Sei o quanto é difícil não nascer numa família abastada. Se você quer mudar
de vida, embarque nessa jornada, eu estarei aqui para ajudá-lo.
Para finalizar, vou falar um pouco sobre como você deve prosseguir nas próximas páginas. Este livro
utiliza uma abordagem de estudo passo a passo. A dificuldade do livro aumenta a cada nova página
e, cada capítulo depende do anterior. Não é aconselhável o estudo por tópicos, você deve estudar
página por página. Se você quer entrar em contato comigo para tirar alguma dúvida, contar como foi
a sua experiência, sugerir alguma melhoria ou participar de um dos meus cursos acesse
www.jacksoncamara.com.br ou mande um e-mail para jacksonjld@gmail.com.
9
Sobre o Autor
Jackson Camara
Começou sua jornada profissional, trabalhando em gráficas e Agências de Publicidade quando tinha
12 anos. Mas descobriu sua verdadeira paixão no ano de 2012, quando fez seu primeiro site utilizando
a plataforma Magento (se vale dizer isso) com ajuda de muitos plug-ins para criar um e-commerce
para sua esposa. Embora o site tenha funcionado, ocorreram uma série de problemas pela falta de
conhecimento em programação. Desde então, percebeu que o conhecimento em programação seria
necessário para desenvolver um website profissional, que não poderia continuar usando somente
plataformas e plug-ins.
Seus estudos começaram na área de desenvolvimento de websites com as linguagens HTML, CSS,
JavaScript, PHP e MySQL. Após dois anos estudando através de cursos online, começou a faculdade
de Ciência da Computação, aprendendo linguagens como Java, C, C++, muito cálculo e algoritmo. A
faculdade de Ciência da Computação proporcionou-lhe um conhecimento amplo sobre a área, porém,
seu foco sempre foi a programação.
Embora todo aprendizado que a faculdade propicia, não te ensina profundamente as linguagens de
programação e outras tecnologias para o mercado de trabalho. Paralelamente a faculdade se
especializou em Angular, .net Core, C#, Web API, PostgreSQL e AWS. Atualmente, são as principais
ferramentas que utiliza para desenvolver projetos profissionais.
Por saber o quanto é difícil achar conteúdos que ensinam a criar projetos profissionais, sentiu-se
obrigado a compartilhar seus conhecimentos com aqueles que almejam criar aplicações reais. Com
este objetivo resolveu criar o portal www.jacksoncamara.com.br para compartilhar seu
conhecimento. Jackson também é um grande entusiasta em microsserviços, DDD, SaaS, meta-
heurística e apaixonado por fotografia, filha e esposa.
10
Sumário
1 CONCEITOS BÁSICOS ............................................................................................. 15
1.1 Lógica de Programação e Algoritmos ........................................................................ 16
1.2 Pseudocódigo .......................................................................................................... 19
1.3 Linguagens de Programação ..................................................................................... 22
1.4 Editores de Texto e IDEs ........................................................................................... 23
Instalação do Visual Studio Code no Windows............................................................................ 25
Instalação Visual Studio Code no Mac ......................................................................................... 31
1.5 Tipos de fontes ........................................................................................................ 35
Configurando Fontes no VS Code ................................................................................................ 39
1.6 Extensões para Visual Studio Code ........................................................................... 39
Instalando Extensões no Visual Studio Code ............................................................................... 41
Configurando Auto Save no VS Code ........................................................................................... 43
1.7 Net Core Runtime e .Net Core SDK............................................................................ 44
Instalação SDK no Windows......................................................................................................... 46
Instalação SDK no Mac ................................................................................................................. 49
1.8 Terminal .................................................................................................................. 53
Instalando PowerShell Core e Integrando com VS Code no Windows ........................................ 54
Instalando PowerShell Core e Integrando com VS Code no Mac ................................................ 62
Comandos PowerShell, Terminal Linux e macOS ........................................................................ 71
Interface de Linha de Comando (CLI)........................................................................................... 73
1.9 Dispositivos de Entrada/Saída (E/S) .......................................................................... 81
1.10 Alocando espaço na memória, capturando e enviando Dados ao Usuário .................. 83
1.11 Debug ...................................................................................................................... 92
1.12 Unidade Central de Processamento (CPU)................................................................. 95
1.13 Memoria RAM e Memória Cache .............................................................................. 96
2 LINGUAGENS DE PROGRAMAÇÃO ......................................................................... 98
2.1 Introdução ............................................................................................................... 99
2.2 Palavras-chaves ....................................................................................................... 99
2.3 Sensível a Maiúsculo e Minúsculo........................................................................... 104
2.4 Declarações ........................................................................................................... 107
2.5 Espaços em Branco ................................................................................................ 110
2.6 Comentários .......................................................................................................... 112
3 VARIÁVEIS E CONSTANTES .................................................................................. 116
3.1 O que são variáveis ................................................................................................ 117
3.2 Tipos de dados ....................................................................................................... 122
3.3 Char....................................................................................................................... 123
11
ASCII e Unicode .......................................................................................................................... 125
3.4 string ..................................................................................................................... 126
3.5 bool ....................................................................................................................... 128
3.6 Diferença entre tipo numérico inteiro e tipo numérico de ponto flutuante .............. 131
3.7 Tipo numérico inteiro............................................................................................. 132
3.8 Tipo numérico de ponto flutuante .......................................................................... 134
Sufixo de ponto flutuante .......................................................................................................... 138
Precisão de tipos numéricos de ponto flutuante. ..................................................................... 140
3.9 Conversão implícita e explícita. .............................................................................. 142
Conversões entre tipos numéricos ............................................................................................ 142
Conversões entre tipo caractere e tipo numérico ..................................................................... 146
3.10 Constantes............................................................................................................. 150
4 OPERADORES ARITMÉTICOS ................................................................................ 154
4.1 Introdução ............................................................................................................. 155
4.2 Operador de adição ............................................................................................... 155
4.3 Operador de subtração .......................................................................................... 157
4.4 Operação de Multiplicação ..................................................................................... 158
4.5 Operador de divisão ............................................................................................... 159
4.6 Operador módulo .................................................................................................. 160
4.7 Precedência dos operadores................................................................................... 163
4.8 Exercício operações aritméticas e parênteses ......................................................... 167
4.9 Números positivos e negativos ............................................................................... 168
4.10 Exercício média aritmética do aluno ....................................................................... 172
5 Operadores de Atribuição Composta ................................................................... 174
6 OPERADORES RELACIONAIS ................................................................................ 179
6.1 Introdução ............................................................................................................. 180
6.2 Precedência dos operadores................................................................................... 184
6.3 Tipos de operandos ................................................................................................ 189
7 Estrutura de Seleção if ........................................................................................ 193
7.1 Instrução if ............................................................................................................ 194
7.2 Exercício controle de entrada de menores no parque .............................................. 197
7.3 Instrução if-else ..................................................................................................... 199
7.4 Instrução if-else aninhada ...................................................................................... 203
7.5 Exercício controle de entrada nos brinquedos do parque ........................................ 207
7.6 Escopo de bloco ..................................................................................................... 209
12
8 ESTRUTURA DE REPETIÇÃO WHILE ...................................................................... 212
8.1 Instrução while ...................................................................................................... 213
8.2 Laços que nunca executam. .................................................................................... 216
8.3 Laços Infinitos ........................................................................................................ 218
8.4 Laços Aninhados .................................................................................................... 220
8.5 Instrução Break ...................................................................................................... 223
8.6 Exercício contador de 0 a 10 com instrução break ................................................... 224
9 OPERADOR LÓGICO............................................................................................. 226
9.1 Operador not (!)..................................................................................................... 227
9.2 Exercício números impares de 0 a 100 .................................................................... 232
9.3 Operador and (&&) ................................................................................................ 234
9.4 Exercício número entre 0 e 100 .............................................................................. 238
9.5 Operador or (||) .................................................................................................... 239
9.6 Precedência dos operadores................................................................................... 244
9.7 Precedência dos operadores lógicos ....................................................................... 245
10 OPERADORES DE INCREMENTO E DECREMENTO .............................................. 247
10.1 Introdução ............................................................................................................. 248
10.2 Prefixo e Sufixo ...................................................................................................... 249
10.3 - Operadores de incremento e decremento com laço while. .................................... 251
10.4 Exercício contagem regressiva ................................................................................ 254
11 ESTRUTURA DE REPETIÇÃO FOR ....................................................................... 256
11.1 Introdução ............................................................................................................. 257
11.2 Formato Ascendente e Descendente ...................................................................... 258
11.3 Intervalos diferentes .............................................................................................. 261
11.4 Laços aninhados..................................................................................................... 262
11.5 Escopo de bloco ..................................................................................................... 264
12 ARRAY UNIDIMENSIONAL ................................................................................ 266
13.1 Introdução ............................................................................................................. 267
13.2 Declaração de array ............................................................................................... 268
Instanciando um array ........................................................................................................... 269
Atribuição de valor ................................................................................................................ 271
Sintaxe curta .......................................................................................................................... 272
Tipos de dados ....................................................................................................................... 273
13.3 Atribuição por índice .............................................................................................. 274
13
13.4 Acessando elementos por índice ............................................................................ 276
13.5 Atribuição com laço. .............................................................................................. 277
13.6 Acessando elementos com laço .............................................................................. 278
13.7 Exercício Palavra Inversa ........................................................................................ 280
13.8 Instrução foreach ................................................................................................... 281
13.9 Exercício Lista de Presença ..................................................................................... 284
14 Métodos.......................................................................................................... 287
14.1 Introdução ............................................................................................................. 288
14.2 Como funciona....................................................................................................... 288
14.3 Estrutura ............................................................................................................... 291
14.4 Invocando método ................................................................................................. 292
14.5 Definindo um método ............................................................................................ 295
14.6 Escopo de bloco ..................................................................................................... 297
Inacessíveis por métodos externos ....................................................................................... 297
Variáveis duplicadas no mesmo escopo ................................................................................ 299
Variáveis duplicadas em escopos diferentes......................................................................... 301
Alocação memória ................................................................................................................. 302
14.7 Exercício Vogal ‘a’ .................................................................................................. 304
14.8 Exercício Quantidade de Vogais .............................................................................. 306
14
1 CONCEITOS
BÁSICOS
15
1.1 Lógica de Programação e Algoritmos
Um programa de computador é uma lista de instruções que escrevemos em uma linguagem que o
computador entende. Essa é a frase mais popular para responder o que é um Programa de Computador.
Mas sabemos, que para fazer um programa, não posso escrever “faça um software rápido e bonito pra
mim”. O computador não entende o que falamos. Embora, algumas inteligências artificiais
conseguem entender, não significa que seja possível criar um programa dessa forma.
16
As instruções devem ter etapas e sequência bem definidas.
As etapas são instruções que determinam o que o computador
deve fazer, é uma fase do processo. A sequência é a ordem
em que as etapas são executadas para resolver o problema.
Imagine se você alterar a ordem da instrução “adicionar 4
ovos”, colocando essa instrução por último. Certamente você
não querer este resultado, como na imagem ao lado.
17
Vamos a um exemplo computacional. Precisamos
construir um módulo de fechamento de conta para os
clientes de um restaurante. Para desenvolver este
módulo é necessário definir as etapas e colocar numa
sequência, conforme apresentado a seguir:
• Somar itens consumidos;
• Calcular taxa de serviço;
• Selecionar forma de pagamento;
• Efetuar Pagamento;
• Calcular troco.
Imagino que você deva estar começando a entender como um software é desenvolvido. Todo esse
processo é feito através de etapas e sequência. Não importa o tamanho e complexidade do código,
você desenvolverá seu código através de pequenas etapas executadas numa sequência.
Etapas são instruções que determinam o que o computador deve fazer, é uma fase do processo. A
sequência é a ordem em que as etapas são executadas para resolver o problema. As etapas e sequência
fazem parte do desenvolvimento do algoritmo.
Um algoritmo é um conjunto das regras e procedimentos lógicos perfeitamente definidos que levam
à solução de um problema, em um número finito de etapas executadas em sequência.
Poderia dizer que programar e cozinhar é a mesma coisa, mas quando estamos cozinhando, não temos
ctrl + z. Então, acredito que é um pouco diferente. Exercite seu pensamento lógico, faça mais
exercícios como este.
18
1.2 Pseudocódigo
Quando escrevemos passos individuais e informais para serem compreendidos por humanos e não
por computadores, há um nome para isso, pseudocódigo. É uma espécie de tipo de código que
utilizamos quando estamos escrevendo instruções específicas, que ainda não são código fonte. No
exemplo do módulo de fechamento da conta do cliente em um restaurante, usamos pseudocódigo para
definir as etapas e sequências necessárias para desenvolver o módulo.
Existem vários benefícios pra isso, por ser uma maneira de se comunicar, pensar e progredir quando
seu cérebro está travado. O pseudocódigo nos ajuda a trabalhar em um problema, sem nos distrair
com a sintaxe da linguagem e outras complexidades ao escrever o código fonte.
19
Quando uma equipe se reúne, é comum usar pseudocódigo.
Assim, programadores, designers, representantes, clientes
conseguem entender as instruções que seus colegas estão
escrevendo.
• Ser definido: se seguir um algoritmo duas vezes, o resultado obtido deve ser o mesmo todas
as vezes;
• Ser finito: se seguir um algoritmo, a ação deve terminar em algum momento, ou seja, deve
ter um número finito de passos.
Um pseudocódigo também pode ser representado por um fluxograma, que pode ser feito com o auxílio
de um software ou apenas com lápis e papel. O fluxograma representado na Figura 1.1, representa
um software de uma fábrica. O fluxograma é executado quando o cliente faz um pedido. Leia-se o
fluxograma da seguinte forma:
• Receber pedido;
• Ler pedido;
20
Figura 1.1 – Fluxograma fábrica
Embora exista alguns softwares que nos auxiliam na construção de fluxogramas, deixando-o mais
profissional, prefiro lápis e papel.
Pseudocódigo: É uma forma genérica de escrever um algoritmo, utilizando uma linguagem simples
e informal
Código Fonte: O termo código fonte vem do inglês Source Code e define um conjunto de palavras
escritas de forma ordenada contendo instruções em determinada linguagem de programação.
Resumindo, é o algoritmo escrito em linguagem de computador.
21
1.3 Linguagens de Programação
22
Existem outras linguagens
computacionais que parecem
linguagens de programação, mas não
são. Isto acontece, porque são muito
utilizadas pelos programadores, mas
são linguagens que não podem ser
executadas sem a ajuda de outra
linguagem.
Embora o HTML, CSS, SQL não sejam linguagens de programação, isso não as torna menos
importante. São linguagens computacionais extremamente poderosas, que fazem parte de diversos
tipos de software.
23
Existem editores de textos especiais para programadores que possuem funcionalidades específicas,
como cores para diferentes funcionalidades do código e também ajudam nas correções e escrita do
código. Um editor de texto para programadores, ajuda
a escrever o código, da mesma forma que o Word ajuda
a escrever um texto.
Os editores de texto são muito úteis para os programadores e possuem muitas funcionalidades, que
podem ajudar no desenvolvimento de softwares. Mas existe um editor de texto mais robusto que é
chamado de IDE (inglês Integrated Development Enviroment - português Ambiente de
Desenvolvimento Integrado).
24
As IDEs são editores de texto com muitas
funcionalidades, que facilitam a vida dos
programadores. Há pouco tempo atrás, raramente
um programador .Net C#, utilizaria um editor de
texto para desenvolver seus projetos. Esses
programadores costumavam usar apenas a IDE
Visual Studio. Uma IDE extremamente poderosa
e cheia de recursos, principalmente para
programadores de linguagens como C# e C++.
Muitos programadores C# estão utilizando editores de texto como o Visual Studio Code em seus
projetos. Essa escolha ocorre, porque as IDEs consomem muita memória do computador e,
programadores que possuem pouca experiência, podem ter dificuldades em consertar alguns bugs que
acontecem nas IDEs.
25
Figura 1.3 - Download VS Code no Windows
A janela apresentada na Figura 1.5, solicita que o usuário selecione a linguagem. Selecione a opção
English e clique no botão OK.
26
Figura 1.5 - Janela de seleção de língua
A janela apresentada na Figura 1.6, solicita que o usuário aceite os termos. Selecione a opção “I
accept the agreement” e clique no botão Next.
A janela apresentada na Figura 1.7, informa o local onde o arquivo será salvo. Não altere o local,
apenas clique no botão Next.
27
Figura 1.7- Local de instalação
A janela apresentada na Figura 1.8, informa o local onde o atalho do programa será criado. Clique no
botão Next.
28
A janela apresentada na Figura 1.9, solicita ao usuário quais tarefas adicionais devem ser realizadas.
Marque as caixas “Create a desktop icon” e “Add to PATH” e clique no botão Next.
A janela apresentada na Figura 1.10, solicita ao usuário que confirme a instalação. Clique no botão
Install.
29
Figura 1.10 - Solicitação de confirmação de instalação
A janela apresentada na Figura 1.11 informa que o programa foi instalado. Clique no botão Finish.
30
A instalação foi concluída. Para abrir o Visual Studio Code clique no ícone do aplicativo na área de
trabalho ou clique no menu iniciar e procure pelo aplicativo conforme apresentado na Figura 1.12.
31
Figura 1.13 - Download VS Code Mac
32
Arraste o arquivo descompactado Visual Studio Code para dentro da pasta Aplicativos, conforme
apresentado na Figura 1.15.
Agora o Visual Studio Code está dentro do diretório aplicativos, conforme apresentado na Figura
1.16
33
Abra o Launchpad para visualizar os aplicativos. Clique no ícone Launchpad conforme apresentado
na Figura 1.17.
O Visual Studio Code já pode ser visualizado como um aplicativo. Clique duas vezes no ícone do
Visual Studio Code para abrir, conforme apresentado na Figura 1.18.
34
1.5 Tipos de fontes
Podemos utilizar qualquer tipo de fonte no Visual Studio Code, as linguagens de programação não se
importam, mas temos que ficar atento a um detalhe. Em fontes monoespaçada, todos caracteres
ocupam a mesma largura. Já em fontes proporcionais, os caracteres possuem diferentes larguras. As
diferenças entre as fontes são apresentadas na Figura 1.19.
A diferença na largura dos caracteres, pode ser um problema para indentar o código. Indentar o código
significa organizar o código, através de espaços em branco na frente de cada linha. Durante o
desenvolvimento, a indentação mantém a estrutura do código, em alguns casos, pode interferir na
execução do programa. Para que não ocorra problemas durante a indentação, deve-se utilizar fontes
monoespaçada. Na seção 2.5 Espaços em Branco é abordado de forma mais detalhada a indentação.
A Figura 1.20 apresenta um código escrito na linguagem C#, indentado com a Fonte Menlo. Observe
que os caracteres, estão um abaixo do outro, ocupando a mesma coluna. Para obter esse resultado
deve-se escolher fontes do tipo monoespaçada.
35
Figura 1.20 - Indentação com fonte Menlo
A Figura 1.21 apresenta um código escrito na linguagem C#, indentado com a Fonte Verdana.
Observe que os caracteres, não estão um abaixo do outro, estão ocupando colunas diferentes. Isto
ocorre ao usar fontes proporcionais. Você pode achar que isso não faz diferença, experimente ficar
várias horas em frente a tela olhando para o código.
36
Figura 1.21 – Indentação com fonte Verdana
A legibilidade da fonte é algo importante. Lembre-se, você terá que escolher uma fonte confortável de
se olhar por um longo período de tempo. Escolher a fonte apropriada, ajudará a distinguir caracteres
semelhantes, por exemplo a letra “l” (L minúsculo) do número “1” (um). Um exemplo é apresentado
na Figura 1.22.
Tenha cuidado ao escolher a fonte, não escolha fontes extravagantes, isso deixará seu código confuso.
Na Figura 1.23 é apresentado o código C#, escrito com a letra Impact. Observe como a leitura do
código ficou confusa.
37
Figura 1.23 - Letra Impact.
Procure utilizar fontes Menlo, Monaco, Courier New ou qualquer outra fonte monoespaçada que não
deixe seu código confuso. Figura 1.24 foi utilizada a letra Menlo, observe como a leitura do código
ficou legível.
38
Configurando Fontes no VS Code
Para alterar o tipo e tamanho da fonte no Visual Studio Code, clique no ícone Manage localizado na
parte inferior da barra lateral esquerda. Na aba que será aberta ao lado, selecione Text Editor => Font.
Em Font Family digite o nome das fontes que você deseja no seu editor de texto. Só é possível inserir
uma fonte que esteja instalada no seu computador. Siga o exemplo apresentado na Figura 1.25.
O VS Code seleciona as fontes pela sequência que foram inseridas, caso a primeira não exista, será
selecionado a segunda e assim sucessivamente. Monospace é um fallback, caso nenhuma das fontes
estejam instaladas no computador, o VS Code buscará uma fonte monoespaçada que esteja instalada.
Uma das extensões mais poderosas é o IntelliSense, que inclui inúmeras funcionalidades, como:
ajudar a escrever o código e verificar a sintaxe. Na Figura 1.26, o IntelliSense está informando ao
programador, as opções de código disponíveis para o contexto. O IntelliSense precisa ser instalado
de acordo com a linguagem, cada linguagem possui seu próprio IntelliSense.
39
Figura 1.26 – IntelliSense
A sintaxe se refere a escrita correta do código, de acordo com a linguagem. No exemplo da Figura
1.27, o IntelliSense está informando um erro de sintaxe no código. O erro de sintaxe informa que é
esperado o fechamento de chaves.
As extensões que serão utilizadas durante o desenvolvimento dos exercícios são: C#, Bracket Pair
Colorizer e Material Icon Theme. A extensão C# é o IntelliSense da linguagem. A extensão Bracket
Pair Colorizer altera a cor dos parênteses e chaves do código, facilita a indentação. A extensão
Material Icon Theme altera os ícones dos arquivos, ajuda a diferenciar os tipos de arquivos. Os ícones
são apresentados na Figura 1.28.
40
Figura 1.28 - Ícones das extensões
É possível instalar uma extensão pelo marketplace do VS Code ou diretamente pelo VS Code. Para
fazer a instalação diretamente pelo VS Code, clique no menu Extension que fica localizado na barra
lateral. Um campo de pesquisa e uma lista com várias extensões será apresentada igual a Figura 1.29
Digite C# no campo de pesquisa, na aba ao lado e clique no botão verde Install. Siga o exemplo da
Figura 1.30.
41
Figura 1.30 - Instalação do IntelliSense C#
Digite Bracket no campo de pesquisa, na aba ao lado clique no botão verde Install. Siga o exemplo
da Figura 1.31
Digite Material Icon Theme no campo de pesquisa, na aba ao lado clique no botão verde Install. Siga
o exemplo da Figura 1.32.
Após clicar no botão Install, uma janela será aberta. Selecione a opção Material Icon Theme conforme
apresentado na Figura 1.33.
42
Figura 1.33 - Configuração Material Icon Theme
Após instalar as três extensões feche o VS Code e abra novamente. As extensões estarão funcionando.
Durante o desenvolvimento do projeto, podemos ativar o Auto Save, para que salve automaticamente
o arquivo que estamos editando. Muitas vezes ficamos concentrado no código e esquecemos de salvar,
caso o computador tenha algum problema e acabe travando, corremos o risco de perder todo o código.
Para ativar o Auto Save no Visual Studio Code, clique no ícone Manage, localizado na parte inferior
da barra lateral esquerda. Na aba que será aberta ao lado, selecione Commonly Used e no campo Auto
Save selecione afterDelay. Siga o exemplo da Figura 1.34.
43
Agora você não precisa mais se preocupar em ficar salvando seus projetos. Não se esqueça de fazer
backups do seu arquivo.
Para executar as aplicações desenvolvidas no .Net Core é necessário instalar o .Net Core Runtime.
Para criar aplicações é necessário instalar o .Net Core SDK (inglês Software Development Kit -
português Kit de Desenvolvimento de Software). O SDK possui um conjunto de ferramentas, que
permitem que o programador desenvolva aplicações e bibliotecas para a plataforma .NET
Core. Quando você instala o SDK .Net Core também é instalado a Runtime.
Ao instalar .Net Core é necessários ficar atento as versões disponíveis. A versão que deve ser
escolhida para produção, deve ser a última versão com status LTS (inglês Long Term Support -
português Suporte de longo prazo). Significa que a versão está estável e terá suporte por três anos,
após a versão inicial. Para visualizar as versões .Net Core acesse o link
https://dotnet.microsoft.com/download/dotnet-core. A última versão LTS neste momento é a LTS
conforme apresentado na Figura 1.35.
Todo produto da Microsoft tem um ciclo de vida. O ciclo de vida começa quando um produto é
lançado e termina quando não recebe mais suporte. O fim do suporte refere-se à data em que a
44
Microsoft não fornece mais correções, atualizações ou assistência técnica on-line. O fim do suporte
também pode ser chamado de ‘End of life’ (português - Fim da vida) abreviado 'EOL'.
O conhecimento de datas importantes neste ciclo de vida, ajuda a tomar decisões sobre quando
atualizar o seu software, observe as datas na Figura 1.36. Para saber mais acesse o link
https://dotnet.microsoft.com/platform/support/policy/dotnet-core.
Multiplataforma: é um sistema que pode ser executado em mais de uma plataforma. O .Net Core
pode ser executado nos sistemas operacionais Windows, macOS, Linux e também no Docker.
Código aberto: é um modelo de desenvolvimento que promove o licenciamento livre para o design
ou esquematização de um produto e, a redistribuição universal, com a possibilidade de livre consulta,
examinação ou modificação do produto, sem a necessidade de pagar uma licença comercial,
promovendo um modelo colaborativo de produção intelectual. A Microsoft permite criar, modificar,
mesclar, publicar, distribuir, sublicenciar e/ou vender copias do software desenvolvidos com .Net
Core.
Visual Basic: é uma linguagem de programação orientada a objetos, produzida pela Microsoft
direcionada a plataforma .Net. Nos dias atuais raramente uma empresa usa esta linguagem para
desenvolver novos projetos, geralmente é usada em aplicações legadas.
45
Instalação SDK no Windows
Abra a pasta Downloads e clique duas vezes sobre o ícone dotnet-sdk-3.1.201-win-x64, conforme
apresentado na Figura 1.38.
Clique no botão Instalar para iniciar a instalação, conforme apresentado na Figura 1.39.
46
Figura 1.39 - Janela de Instalação
A janela informa que o SDK e a Runtime do .Net Core foram instalados com sucesso. Clique em
fechar para concluir a instalação, conforme a Figura 1.40.
47
Na barra de tarefas no campo de pesquisa digite command e clique em Prompt de Comando, conforme
apresentado na Figura 1.41.
No Prompt de Comando digite “dotnet - -version” para verificar se o dotnet foi instalado com sucesso.
Compare seu resultado com a Figura 1.42. Dependendo o momento que você estiver instalando o .Net
a versão pode ser diferente. Não se preocupe com isso.
48
Figura 1.42 - Verificação de instalação do SDK pelo Prompt de Comando
49
Figura 1.44 - Ícone de instalação
Na janela da Figura 1.46, o usuário tem a opção de alterar o local da instalação, não altere. Clique no
botão Instalar para manter o local padrão.
50
Figura 1.46 - Local de Instalação
A instalação é iniciada, conforme apresentado na Figura 1.47. Se o Mac pedir a senha de usuário
digite a senha.
51
A janela apresentada na Figura 1.48 informa que a instalação foi concluída corretamente. Clique no
botão fechar.
A janela apresentada na Figura 1.49, solicita se o usuário deseja manter ou mover o instalador para o
lixo. Clique no botão Mover para o Lixo.
52
Para verificar se a instalação ocorreu com sucesso, abra o terminal e digite “dotnet --version”.
Compare seu resultado com a Figura 1.50. Dependendo o momento que você estiver instalando o .Net
a versão pode ser diferente, não se preocupe.
1.8 Terminal
O terminal é um software que faz a comunicação entre usuário e sistema, enviando comandos e
exibindo a saída para o usuário. Geralmente possui uma tela preta, sem botões e elementos gráficos,
a qual o usuário interage digitando linhas de comando.
53
Alguns desenvolvedores evitam usar o terminal o máximo possível, preferem utilizar as IDEs, por
terem interfaces gráficas que auxiliam no desenvolvimento de suas aplicações. Apesar de ajudarem
muito, nem sempre são intuitivas, em algumas ocasiões, são muito lentas e as vezes geram bugs que
podem ser difíceis de consertar.
Com o terminal temos um resultado mais direto e geralmente mais rápido que a interface gráfica.
Além dessas vantagens, nos possibilita entender melhor como as coisas realmente acontecem. As
interfaces gráficas abstraem muitas coisas, fazendo com que os iniciantes pulem algumas etapas que
deveriam fazer parte do aprendizado.
Quando falamos em terminal, logo imaginamos o Linux. Mas podemos utilizar o terminal no macOS
e no Windows também. A maioria dos comandos do Linux é idêntico ao Mac, já no Windows os
comandos são diferentes. No Windows o terminal é chamado de cmd ou Prompt de Comando.
Outra opção para diferentes sistemas operacionais é o terminal PowerShell Core, que é uma ferramenta
multiplataforma, disponível para Windows, Linux e macOS. O PowerShell utiliza comandos bem
parecidos com o terminal do Linux e macOS.
Durante os exemplos desse curso, será utilizado o terminal PowerShell para não haver diferenças
entre os comandos dos sistemas operacionais Linux, macOS e Windows. A documentação do
PowerShell Core para Windows está disponível no link https://docs.microsoft.com/pt-
br/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-7.
54
Figura 1.51 - Download PowerShell
Clique duas vezes no arquivo que você fez o download. Clique em Install para iniciar a instalação,
conforme apresentado na Figura 1.52.
55
Figura 1.52 - Solicitação de instalação do PowerShell
Clique no botão Next para continuar a instalação, conforme apresentado na Figura 1.52.
56
Figura 1.53 - Prosseguir com a instalação PowerShell
O PowerShell será instalado na pasta c:\Program Files\PowerShell\. Mantenha o local padrão, clique
no botão Next conforme apresentado na Figura 1.54.
57
Figura 1.54 - Confirmar local de instalação do PowerShell
58
Clique no botão Finish para terminar a instalação, conforme apresentado na Figura 1.56.
Abra o VS Code conforme a Figura 1.57 para fazer a integração com o PowerShell.
59
Pressione control + ` para abrir o terminal integrado com o VS Code. Digite no terminal
$psversiontable para visualizar qual versão do PowerShell está sendo usada. Observe no seu terminal
e na Figura 1.58 que a versão utilizada é o PowerShell, mas não é o PowerShell Core. Feche o terminal
clicando no x no lado direito do terminal integrado.
Pressione shift + control + p para abrir a janela de comandos do VS Code. Digite Open Settings no
campo e selecione Open Settings (JSON) conforme apresentado na Figura 1.59.
Para configurar o terminal integrado do VS Code com o PowerShell. Abra o arquivo settings.json e
insira o texto "terminal.integrated.shell.windows": "c:/Program Files/PowerShell/6/pwsh.exe",
conforme apresentado na Figura 1.60. Observe que estamos definindo o caminho de instalação do
PowerShell.
60
Figura 1.60 - Configuração do arquivo settings.json
Pressione shift + control + p para abrir a janela de comandos. Selecione Reload Window para atualizar
o VS Code conforme a Figura 1.61.
Abra o terminal integrado aperte control + `. Digite no terminal $psversiontable para visualizar qual
versão do PowerShell esta sendo utilizada. Compare a Figura 1.62 com o resultado do seu terminal,
observe que agora aparece a palavra Core no lugar de Desktop. Provavelmente a versão será
diferente, não tem problema.
61
Figura 1.62 - Verificação de integração com PowerShell
Durante os exemplos desse curso será usado o terminal PowerShell para que não haja diferenças entre
os comandos dos sistemas operacionais Linux, macOS e Windows. A documentação do PowerShell
Core para macOS esta disponível no link https://docs.microsoft.com/pt-
br/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-7. Para baixar
o PowerShell acesse o link https://github.com/PowerShell/PowerShell/releases role a pagina até o
item assets e clique no link powershell-6.2.4-osx-x64.pkg para fazer o download para o macOS,
conforme apresentado na Figura 1.63.
62
Clique no ícone do arquivo para iniciar a instalação, conforme apresentado na Figura 1.64.
O macOS não reconhece o programa conforme apresentado na Figura 1.65. Clique em ok.
No canto superior esquerdo da área de trabalho clique na maçã e selecione Preferências do Sistema
conforme apresentado na Figura 1.66.
63
Figura 1.66 - Abrindo preferências do sistema
64
Figura 1.67 - Abrindo segurança e privacidade
65
A instalação do PowerShell é permitida pelo macOS. Clique em continuar, conforme a Figura 1.69
Clique no botão Instalar para iniciar a instalação, conforme apresentado na Figura 1.70.
66
Digite sua senha e clique em Instalar Software para permitir a instalação conforme a Figura 1.71.
A Figura 1.72 apresenta uma mensagem que a instalação foi realizada com sucesso. Clique no botão
Fechar.
67
Figura 1.72 - Instalação concluída com sucesso
Remova o instalador para o lixo, clique no botão Mover para o Lixo conforme apresentado na Figura
1.73
68
O PowerShell precisa ser integrado com o VS Code. Observe na Figura 1.74, que o terminal padrão
do Mac está integrado no VS Code. Se o terminal não estiver aparecendo pressione control + `.
Pressione shift + command + p para abrir a janela de comando do VS Code. Clique em Preferences:
Open Settings (JSON) para abrir o arquivo de settings.json conforme apresentado na Figura 1.75.
69
Figura 1.76 - Configuração do arquivo setting.json.
Aperte shift + command + p para abrir a janela de comandos. Selecione Reload Window para atualizar
o VS Code, conforme a Figura 1.77.
Abra o terminal integrado aperte control + `. Digite no terminal $psversiontable para visualizar qual
versão do PowerShell estamos usando. Observe que agora estamos usando o PowerShell Core,
conforme apresentado na Figura 1.78.
70
Figura 1.78 - Verificação de integração PowerShell e VS Code
Os comandos a seguir são compatíveis com terminal Linux, macOS e PowerShell. As diferenças
entre os comandos dos terminais são destacadas. Quando uma linha de comando é digitada no
terminal é necessário pressionar o botão enter para executar o comando. Leia e execute os comandos
a seguir:
man
O comando man mostra um manual sobre o uso de um determinado comando. Por exemplo,
digite “man cd” para ler todas as instruções do comando cd. Também existe o comando “man man”,
caso haja dúvidas sobre o uso do próprio man. Se você tiver dúvida sobre algum comando, basta
utilizar o comando “man” seguido do nome do comando. Para sair da tela do manual pressione “q”.
ls
Lista as pastas e arquivos existentes em um diretório. Também é possível usá-lo para conferir o
tamanho e a data de criação de um arquivo ou diretório. Digite “ls” para listar os arquivos e diretórios,
se precisar ver os detalhes digite “ls -lh”.
clear
Limpa o terminal, retirando as letras que foram exibidas no terminal. Digite “clear” para limpar o
terminal.
pwd
Encontra o caminho para o diretório atual. Digite “pwd” para visualizar o caminho do diretório atual.
71
mkdir
Cria um novo diretório (pasta). Digite “mkdir” seguido do nome do diretório, por exemplo “mkdir
pasta1”.
cd
Navega pelo sistema de arquivos e permite ir de um diretório para outro. Digite “cd” seguido do nome
do diretório, por exemplo “cd pasta1”. É possível determinar um caminho fazendo o uso de barra, por
exemplo “cd pasta1/pasta2”. Para voltar ao diretório anterior digite cd -. Para voltar um diretório
digite “cd..”.
cp
Permite copiar arquivos e diretórios. Para copiar um arquivo digite “cp” seguido do nome do arquivo
e diretório destino. Por exemplo, considerando que o caminho esteja no diretório pasta1, digite “cp
arquivo1.txt pasta2” para copiar o arquivo arquivo1.txt do diretório pasta1 para o diretório pasta2.
Para copiar um diretório digite “cp -r” seguido do nome do diretório e diretório destino. Por exemplo,
considerando que a pasta2 e a pasta3 estão dentro da pasta1, digite “cp -r pasta3 pasta2” para copiar
a pasta3 para dentro da pasta2. O comando -r permite copiar o diretório com seus arquivos internos.
mv
Move ou renomeia arquivos e pastas. Para renomear um diretório, digite mv seguido do nome da
pasta que você deseja renomear e do novo nome da pasta, por exemplo “mv pasta3 pasta4”, a pasta3
foi renomeado como pasta4. Para renomear um arquivo, insira a extensão do arquivo, por exemplo
digite “mv arquivo1.txt arquivo2.txt”. Para mover o diretório pasta4 para dentro do diretório pasta2,
digite mv pasta4 pasta2. Quando o nome do diretório de destino existe a pasta é movida, se o diretório
não existe é renomeado.
rm
Apaga um arquivo ou diretório. Para apagar um arquivo digite rm seguido do nome do arquivo, por
exemplo “rm arquivo2.txt”. Para apagar um diretório e o conteúdo digite rm -r seguido do nome do
diretório, por exemplo “rm -r pasta4”.
more
Mostra o conteúdo de um arquivo texto. Para ler o conteúdo de um arquivo digite more seguido do
nome do arquivo, por exemplo digite “more arquivo1.txt”.
sudo
Determinados comandos ou arquivos são acessíveis apenas pelo usuário administrador (root). Este é
um superusuário que possui privilégios de leitura e gravação em mais áreas do sistema, inclusive arquivos
72
em outras contas de usuários. Para que você não tenha que trocar de usuário a todo instante, existe o
comando sudo, que garante credenciais de usuário root temporariamente, mediante a informação de
uma senha. É mais seguro usar o comando sudo no terminal em vez de ativar o usuário raiz. Apenas utilize
este comando se souber o que está fazendo, caso contrário poderá danificar o sistema operacional.
history
Apresenta o histórico dos comandos utilizados. Digite “history” e uma lista com todos comandos
utilizados por você será apresentada.
Para desenvolver aplicações em .Net Core usando o VS Code, é necessário usar a CLI (Interface de
Linha de Comando) do .NET Core. A CLI é uma ferramenta multiplataforma para criação,
desenvolvimento, execução e publicação de aplicativos .NET Core. Não é necessário fazer a
instalação da CLI do .NET Core porque já está incluído no .NET Core SDK.
A estrutura de comando CLI consiste no driver, seguida pelo comando e possivelmente de templates,
opções e argumentos de comando. Para acessar uma breve documentação de ajuda dos comandos
dotnet, digite “dotnet help”, conforme apresentado na Figura 1.79. A lista completa de comandos,
pode ser acessada na documentação oficial do .Net Core https://docs.microsoft.com/pt-
br/dotnet/core/tools/dotnet?tabs=netcore21 .
73
Figura 1.79 - Comando dotnet help apresenta lista de comandos
Cada comando define seus próprios argumentos, para acessar uma breve documentação de ajuda,
digite “--help” após o comando. Por exemplo, para acessar a documentação de ajuda do comando
“new”, digite “dotnet new --help” conforme apresentado na Figura 1.80. Além das opções é
apresentado uma lista de templates.
74
Figura 1.80 - Lista de templates e opções do comando new
Os templates são os tipos de arquivos que podem ser criados, é possível criar arquivos do tipo
Console, Web API, MVC e vários outros. As opções passadas na linha de comando são referentes ao
comando invocado. Quando você cria um arquivo, você vai querer dar um nome. Para isso, é chamada
a opção “--name” seguida do argumento que é o nome que você pretende dar ao projeto.
75
Para criar um projeto do tipo console com o nome “MeuApp”, é necessário digitar no terminal o
comando “dotnet new console --name MeuApp”. Onde “dotnet” é o drive, “new” é o comando,
“console” é o template, “--name” é a opção para nomear o projeto e “MeuApp” é o nome do projeto
sendo o argumento da opção --name”. Observe o exemplo da Figura 1.81.
Exemplo prático
No PowerShell Core navegue pelo terminal com o comando cd até o diretório desktop para criar um
programa .Net Core. Digite no terminal o comando “dotnet new console --name MeuApp”. Siga o
exemplo da Figura 1.82.
76
Figura 1.82 - Criando programa do tipo console .Net Core
A pasta MeuApp com os arquivos do programa é criada na área de trabalho, conforme apresentada
na Figura 1.83.
Clique no ícone Explorer na barra lateral esquerda e no botão Open Folder conforme apresentado na
Figura 1.84.
77
Figura 1.84 - Abrindo o programa MeuApp
No canto inferior direito do VS Code uma janela é aberta, perguntando se você deseja adicionar os
arquivos de Construção e Debug. Clique no botão Yes para adicionar os arquivos.
78
Abra o terminal integrado. Vá até o menu superior e clique em Terminal => New Terminal, conforme
apresentado na Figura 1.86.
Digite no terminal integrado o comando “dotnet run” conforme apresentado na Figura 1.87. Se no
terminal aparecer a palavra “Hello World!”, você acaba de criar o seu primeiro programa. Parabéns!!!
79
Figura 1.87 - Executando o programa
80
1.9 Dispositivos de Entrada/Saída (E/S)
Os dispositivos de Entrada/Saída (E/S) (inglês, Input/Output, I/O) ou periféricos, permitem a
comunicação entre usuário e computador. Essa comunicação é feita através de instruções e dados que
são transmitidos entre os dispositivos. Os dados são introduzidos no computador pelos dispositivos
de entrada, em seguida, o computador processa esses dados para produzir uma saída.
Os dispositivos de entrada servem para introduzir dados no computador, para que possam ser
processados. Os dispositivos mais comuns são: teclado, mouse, microfone, webcam, scanner e outros,
conforme apresentado na Figura 1.88.
81
Figura 1.89 - Dispositivos de saída
Alguns dispositivos, fazem a função de entrada e também a de saída, são chamados de dispositivos
híbridos. Os dispositivos híbridos mais comuns são: pendrive, HD externo, impressora
multifuncional, monitor touch screen, modem e outros, conforme apresenta na Figura 1.90.
82
Os dispositivos de entrada e saída, permitem criar softwares, que capturaram os dados inseridos pelo
usuário para serem processados e posteriormente retornados ao usuário. Um exemplo é apresentado
na Figura 1.91.
Quando recebemos um dado do usuário, muitas vezes precisamos armazena-lo para processa-lo
posteriormente. Esse armazenamento é feito através de alocações de espaços na memória. A forma
mais simples de alocar um espaço na memória é através de variáveis. Para definir uma variável, digite
no programa a palavra-chave var acompanhada de um nome, que serve como um identificador.
Através do nome da variável, é possível chama-la quando for necessário. A declaração da variável é
apresentada na Figura 1.92.
83
Figura 1.92 - Alocação de espaço na memória
Durante os exercícios, será usado o terminal PowerShell para capturar os dados do usuário nas
aplicações desenvolvidas e também para enviar os dados processados ao usuário. O C# possui alguns
comandos para se comunicar com o usuário através do terminal:
• Console.ReadLine();
Captura uma entrada de texto inserida pelo usuário no terminal.
• Console.WriteLine();
Apresenta uma saída de texto ao usuário no terminal, fornece uma nova linha no fim do texto.
• Console.Write();
Apresenta uma saída de texto ao usuário no terminal, mas não fornece uma nova linha.
Podemos capturar um dado inserido pelo usuário e armazenar numa variável através da instrução
“Console.ReadLine()”. O operador de atribuição simples, é representado pelo símbolo “=” (sinal de
igual). Este operador, atribui o valor da expressão a direita para a variável situada a esquerda,
conforme apresentado na Figura 1.93.
84
Figura 1.93 - Capturando dado do usuário e armazenando
Exemplo prático
Abra o VS Code e o terminal integrado PowerShell. Crie um projeto do tipo console, digite no
terminal o comando “dotnet new console -n CapturaEnviaDadosUsuario” e pressione enter.
85
Figura 1.95 - Criando projeto do tipo console através do terminal
Clique em Open Folder, localize o projeto e abra no VS Code, conforme a Figura 1.96.
O VS Code abre uma janela no canto inferior direito informando que os recursos necessários para
construir e debugar o projeto estão ausentes. Clique em sim para criar os arquivos necessários,
conforme apresentado na Figura 1.97.
86
Figura 1.97 - Criando arquivos de compilação e debug.
Digite a instrução “Console.Write(“Digite seu nome: ”);” . O texto a ser mostrado para o usuário deve
ser escrito entre parênteses e aspas dupla. Observe o exemplo da Figura 1.99.
87
Figura 1.99 – Instrução para mostrar texto ao usuário
Na linha de baixo da instrução anterior, digite “Console.ReadLine();” para capturar o texto inserido
pelo usuário. Um exemplo é apresentado na Figura 1.100.
No terminal digite o comando “dotnet run” para executar o projeto. Observe que o texto “Digite seu
nome:” está aparecendo no terminal. Isso significa que a instrução “Console.Write(“Digite seu nome:
”);” foi executada com sucesso. A instrução “Console.ReadLine()” também foi executada e está
aguardando o usuário inserir o nome no terminal. Um exemplo é apresentado na Figura 1.101.
88
Figura 1.101 - Projeto em execução
Insira seu nome e pressione enter para encerrar a execução do sistema, conforme apresentado na
Figura 1.102.
89
O dado que estamos capturando através da instrução “Console.ReadLine()” não está sendo
armazenado em nenhum local da aplicação. Para armazenar os dados, precisamos alocar um espaço
na memória do computador. Declare a palavra chave “var”, seguida do nome que queremos dar para
esse espaço da memória. O nome do espaço da memória, deve fazer sentido, considerando que
estamos perguntando o nome do usuário, vamos nomear esse espaço na memória de “nomeUsuario”.
Siga o exemplo da Figura 1.103.
90
Figura 1.104 - Concatenando variável e texto
Digite “dotnet run” no terminal, o programa irá pedir seu nome. Digite seu nome e pressione enter
para o programa processar os seus dados. O programa mostrará o seu nome novamente conforme
apresentado na Figura 1.105.
91
1.11 Debug
A prática de debugar é muito usada por programadores, analistas de sistemas e demais profissionais
de T.I.. Pode ser usada em uma situação em que precisamos analisar um determinado trecho do
programa ou para localizar possíveis bugs (erros) de programação no sistema.
Para fazer o debug de um programa no VS Code é muito simples. Abra o programa da seção anterior
“CapturaEnviaDadosUsuario”. Durante o debug o terminal fica bloqueado, para que possamos
utilizar o terminal, precisamos configurar o arquivo launch.json localizado dentro da pasta .vscode.
Dentro do arquivo na propriedade “console” apague o valor “internalConsole” e insira
“integratedTerminal” entre aspas duplas. Siga o exemplo destacado na Figura 1.106.
Agora que o terminal está devidamente configurado para o debug, vamos fazer o debug. Abra o
arquivo program.cs e insira um breakpoint (ponto de parada) na linha 9. Para inserir o breakpoint
coloque o cursor do mouse um pouco á esquerda do numeral de identificação da linha, observe que
um ponto vermelho aparecerá, de um clique e o ponto ficará fixo. Na barra lateral esquerda de menu,
clique em Run. Clique na seta verde no canto superior esquerdo, para iniciar o debug. Observe na
Figura 1.107 que a execução do programa iniciou e parou na linha 9, onde está localizado o
breakpoint.
92
Figura 1.107 - Iniciando Debug.
O programa precisa receber uma ordem para avançar para próxima instrução, clique no botão “step
into”. Siga os passos da Figura 1.108 e observe que a frase “Digite seu nome: ” esta aparecendo no
terminal.
Durante o debug é apresentado um painel do lado esquerdo, dentro desse painel são apresentadas as
variáveis do programa. Observe na Figura 1.109 que a variável nome que declaramos se encontra
nesse painel, com o respectivo valor ao lado. A variável nome possui valor null, isso significa que
nada foi atribuído, está vazia.
93
Figura 1.109 - Painel de debug mostra variáveis.
Precisamos atribuir um valor a variável, clique novamente sobre o botão “step into”. Escreva seu
nome no terminal e aperte enter. Observe na Figura 1.110 que a variável nome foi preenchida com
meu nome.
Clique mais uma vez no botão “step into”. Observe na Figura 1.111 que a instrução da linha 11 foi
executada e apresenta a frase “Seu nome é: Jackson” no terminal. Clique mais uma vez no botão “step
into” para que o programa chegue no final das instruções e seja encerrado.
94
Figura 1.111 – Finalizando debug
A CPU controla as atividades do computador, determina quais operações devem ser realizadas,
colocando em ordem e sincronizando todo o processamento do computador. A CPU também processa
todas operações aritméticas e lógicas, tais como adição, subtração, multiplicação, divisão e
comparações que são cruciais para fazer as tomadas de decisões dos programas.
Um erro comum, é chamar o gabinete de CPU. O gabinete é uma estrutura física para armazenar as
peças do computador, por exemplo: HD, CPU, memória RAM, interfaces e placa mãe. Observe as
diferenças entre CPU e Gabinete na Figura 1.112.
95
Figura 1.112 - Diferença entre CPU e gabinete
A memória RAM (inglês Random Access Memory - português Memória de Acesso Aleatório) é
utilizada para armazenar informações. A memória RAM armazena as informações dentro de células
que são pequenos compartimentos, que podem armazenar informações como:
96
As células possuem um tamanho finito pra
armazenar os dados, e possuem um endereço
único para que possam ser localizadas. Quando
a CPU precisa de algum dado, busca na
memória RAM e armazena na memória cache.
Após processar os dados a CPU pode manipular os dados que estão na memória RAM. Por exemplo,
gravar um novo dado para ser usado posteriormente ou para enviar a um dispositivo de saída. A
principal função da memória RAM é entregar os dados de forma rápida para CPU. Observe um
exemplo de comunicação entre Memória RAM e CPU na Figura 1.113.
97
2 LINGUAGENS
DE
PROGRAMAÇÃO
98
2.1 Introdução
Neste capítulo teremos uma visão geral sobre as linguagens de programação, você não deve se
preocupar com os detalhes de cada linguagem. Apenas tente entender os princípios fundamentais que
estão inseridos nas linguagens de programação.
Toda linguagem de programação possui um conjunto de regras, que determinam como você escreve
o código. As regras das palavras regem: significado, ordem, maiúsculos ou minúsculos, etc. As regras
são a sintaxe da linguagem de programação, devem ser cumpridas.
A sintaxe deve ser respeitada para que o compilador ou interpretador possa ler as instruções do código
fonte. Por exemplo, em C# a regra maiúsculo e minúsculo, exige que a palavra “true” seja escrita em
minúsculo, se a primeira letra for maiúscula, o compilador não conseguirá entender o significado da
palavra e um erro será gerado.
Os cinco princípios fundamentais que definem as regras das linguagens são: Palavras-chave (inglês -
keywords), Declarações (inglês - statements), Sensível a Maiúsculo e Minúsculo (inglês - case-
sensitive), Espaços em branco (inglês - whitespace) e comentários (inglês - comments).
2.2 Palavras-chaves
Uma palavra-chave é uma palavra que quando escrita no código-fonte, a própria linguagem de
programação sabe o significado daquela palavra. Você não precisa dizer o que a palavra significa,
porque a palavra tem um significado especial para linguagem. Devemos usar, apenas quando
queremos que cumpra algum propósito específico da linguagem.
99
abstract as base bool
async await by
100
descending dynamic equals
let nameof on
yield
Exemplo prático
Digite no terminal o comando “dotnet new console -n PalavraChave” para criar um programa. Abra
o programa no VS Code e copie o código da Figura 2.1. Observe que foi alocado um espaço na
memória com o nome cidade. A palavra cidade não é uma palavra-chave, portanto, nenhum problema
ocorreu.
101
Figura 2.1 – Nome de variável sem ser palavra-chave.
Ao tentar alocar um espaço na memória com a palavra-chave “true”, o IntelliSense aponta um erro.
A mensagem de erro, informa que “O lado esquerdo de uma atribuição deve ser uma variável,
propriedade ou indexador”. Observe que a mensagem, não informa que “true” é uma palavra-chave,
porque subentendesse que o programador saiba. Copie o código da Figura 2.2, deixe o mouse sobre
o sublinhado vermelho da linha 9 para visualizar o mesmo erro.
Copie o código da Figura 2.2 e execute o programa. Após executar a aplicação, o terminal mostra o
nome da propriedade cidade e não o conteúdo Itajaí, isso significa que “nameof” foi utilizado como
palavra-chave.
102
Figura 2.3 – Uso da palavra-chave contextual nameof
Copie o código da Figura 2.4 e execute o programa, observe que o erro “Não é possível usar a variável
local 'nameof' antes de ser declarada” é apresentado no terminal. A palavra-chave contextual
“nameof” se utilizada como nome de variável, faz com que o compilador trate “nameof” como
variável e não como palavra-chave.
103
Copie o código da Figura 2.5 e execute o programa. A palavra-chave contextual é utilizada apenas
como variável, o programa é executado com sucesso.
Mesmo que seja permitido usar palavras-chaves contextuais para nomear outras propriedades,
devemos evitar. Assim, reduzimos as possibilidades de conflito em nosso código.
Cada linguagem possui uma quantidade de palavras-chaves, mas isso não é importante. Muito menos
você deve se preocupar em decorar todas essas palavras. Com o tempo você irá adquirir experiência
e seu vocabulário de palavras chaves e combinações aumentará cada vez mais.
Linguagens mais antigas como algumas versões do Basic ou Pascal são case-insensitive, não se
importam se você escreve as palavras com maiúsculo ou minúsculo. No entanto, a maioria das
linguagens modernas são case-sensitive, se importam se você usa maiúsculo ou minúsculo e são
extremamente exigentes em relação a isso.
Quando escrevemos uma frase, algumas palavras devem ser em maiúsculo outras em minúsculo,
assim é na linguagem de programação. As diferenças que você encontra no mundo real, você também
encontrará nas linguagens de programação.
104
Essas diferenças entre as linguagens, geralmente não tem motivo, foi apenas feito daquele jeito.
Observe a frase escrita em inglês na Figura 2.6. Na língua inglesa a palavra “I” (Eu) escrita no meio
da frase, se escreve em maiúsculo e “you” (você) se escreve em minúsculo. Por que essa diferença?
Não sei, apenas faço assim. E assim deve ser na programação, a não ser que você queira estudar toda
a história para tentar chegar a uma conclusão, se é que existe.
Exemplo prático
105
Figura 2.7 - Palavra-chave case-sensitive errado
Ao corrigir a palavra “True” para “true” o código é executado normalmente, conforme apresentado
na Figura 2.8.
106
Figura 2.8 - Palavra-chave case-sensitive correto
2.4 Declarações
Em uma declaração não perguntamos nada ao computador, apenas dizemos o que tem que ser feito.
Quando escrevemos uma instrução ao computador, estamos fazendo uma declaração. As declarações
podem ser variáveis, constantes, métodos, delegates, eventos, propriedades ou campos. Para informar
o fim da declaração na maioria das linguagens, devemos inserir um ponto e vírgula ou uma quebra
de linha.
Linguagens como C, C++, PHP, Java e C#, é necessário colocar um ponto e vírgula no fim da
declaração, para que o compilador ou interpretador, entenda que a declaração terminou. Outras
linguagens como Swift, Ruby, Python, apenas uma quebra de linha é suficiente. Observe na Figura
2.9, que a linguagem C# precisa de ponto e vírgula no final da instrução e utiliza chaves para delimitar
o bloco if. Por enquanto, a linguagem Python não precisa de ponto e vírgula no final da instrução e
chaves para delimitar o bloco if.
107
Figura 2.9 - Declaração em C# e Python
Exemplo prático
Digite o comando “dotnet new console -n Declaracoes” no terminal para criar um programa. Abra o
programa no VS Code e copie o código abaixo. Deixe o mouse sobre a linha vermelha, localizada no
final da linha 9. Observe que o IntelliSense informa que é esperado um ponto e vírgula.
Ao tentar executar o programa, o compilador retorna um erro no terminal. O erro informa que é
esperado um ponto e vírgula na linha 9. Observe na Figura 2.11, que a linha 11 não foi executada, o
compilador não executa o programa se houver erro.
108
Figura 2.11 - Erro de compilação por falta de ponto e vírgula
Após inserir um ponto e vírgula no final da declaração, o compilador não gera mais erro. Observe na
Figura 2.12 que a linha 11 foi executada com sucesso.
Figura 2.12 - Programa executado com sucesso após inserir ponto e vírgula.
Declarações que utilizam chave, não precisam de ponto e vírgula. Observe na Figura 2.13, a linha 15
não precisa de ponto e vírgula.
109
Figura 2.13 - Declarações que utilizam chave não precisam de ponto e vírgula.
Na maioria das linguagens os espaços em branco, não possuem um significado especial. Porém, para
algumas linguagens como Python, possuem um significado especial, alterando o comportamento do
código. Esses tipos de linguagem, usam a indentação para saber se a instrução pertence ou não a
determinado bloco.
110
Compare lado a lado o código C# e Python da Figura 2.15. Observe que a linguagem C#, usa uma
chave de abertura e uma de fechamento, para informar as instruções que pertencem ao bloco if. Já a
linguagem Python, utiliza a indentação. O código C# e Python executam as mesmas instruções, a
diferença é que Python está utilizando a indentação. Leia-se o código C# e Python do primeiro bloco,
da seguinte forma: Se a pontuação do jogador é maior que o recorde, o jogador recebe as mensagens
“Parabéns você é o novo recordista!” e “Obrigado por jogar!”.
O jogador que não bate o recorde, não recebe a mensagem “Obrigado por jogar!”. Queremos que a
mensagem “Obrigado por jogar!”, seja mostrada também aos jogadores que não bateram o recorde.
No segundo bloco é feito a correção. Observe que na linguagem C#, a instrução foi inserida fora da
chave e, no código Python, foi retirado o espaço em branco. Leia-se o segundo bloco da seguinte
forma: Se a pontuação do jogador é maior que o recorde, o jogador recebe a mensagem “Parabéns
você é o novo recordista!” e “Obrigado por jogar!”. Se a pontuação do jogador é menor que o recorde,
recebe apenas a mensagem “Obrigado por jogar!”.
Um código bem indentado, possui diferentes níveis de indentação. A Figura 2.16 possui quatro níveis
de indentação, que ajudam o programador a diferenciar quais instruções pertencem a cada bloco.
Cada seta de cor diferente, representa um nível diferente de indentação.
111
Figura 2.16 - Diferentes níveis de indentação
2.6 Comentários
Muitas vezes os programadores olham para o código e tem dificuldade de entender o propósito do
código. Isso acontece quando utilizamos códigos escritos por outros programadores ou até mesmo
escritos por nós a um tempo atrás. Isso é normal, não se assuste. Para facilitar esta tarefa podemos
comentar o código, escrevendo informações relevantes para facilitar a compreensão do código.
Para comentar o código em uma linha, deve-se utilizar duas barras no início do comentário. Esta é a
sintaxe para adicionar comentários em C# e várias outras linguagens. Os comentários são exibidos
numa cor diferente, para que você não confunda com o código regular. As cores variam de acordo
com cada editor de texto e configuração. Observe na Figura 2.17, que acima de cada instrução há um
comentário.
112
Figura 2.17 - Comentário de uma linha.
Para escrever comentários longos que ocupem mais de uma linha, deve-se usar uma barra seguida de
um asterisco, para abrir o campo de comentário e, um asterisco seguido de uma barra, para fechar o
campo de comentário. Um exemplo é apresentado na Figura 2.18.
O compilador ou interpretador ignora as linhas comentadas, o código não é executado pelo CPU. Os
comentários não fazem nenhuma diferença no desempenho das aplicações. Intuitivamente, parece
interessante comentar todo o código, mas isto não é necessário. Um código bem elaborado deve ser
autoexplicativo, devemos deixar os comentários, para códigos que não podem ser autoexplicativos.
O código apresentado na Figura 2.19, possui um comentário, dizendo que o método a seguir, verifica
se o numero é par ou impar. Mas, o próprio nome do método já informa o que faz, além de ser um
código muito simples de ler. Neste caso, este seria um comentário desnecessário.
113
Figura 2.19 - Método comentado
Não se preocupe se você gosta de comentar seus códigos, no início do aprendizado, é muito
importante comentar os códigos, isto ajuda no processo de aprendizado. A medida que você se torna
mais experiente, é natural que os códigos pareçam cada vez mais autoexplicativos e você passa a usar
cada vez menos comentários. Isso também acontece, porque a qualidade do seu código melhora com
o tempo, se tornando cada vez mais legível.
Use comentários em seu código e com o passar do tempo vá reduzindo. Deixe somente comentários
necessários. Mas, não se esqueça, que você poderá ter que revisitar aquele código no futuro.
Em alguns casos pode-se utilizar os comentários como lembretes, marcar locais no código fonte, que
ainda precisam ser adicionados, consertados ou melhorados. Isto acontece, quando não terminamos
aquela instrução ou estamos aguardando uma instrução complementar, que está sendo desenvolvida
por outra pessoa da equipe. Neste caso, você pode simplesmente fazer um comentário.
Ao longo dos anos, algumas convenções, vem sendo utilizadas pelos programadores (convenção não
é regra), que facilitam a comunicação com outros programadores. Você pode criar suas próprias
convenções, desde que seja legível para os demais. Essas convenções, usam palavras pequenas
escritas em maiúsculo. As convenções mais conhecidas são:
• TODO: Significa “para fazer”, é algo que ainda precisa ser feito;
• FIXME: Significa “precisa ser consertado”, não está funcionando 100%;
• HACK: Significa que foi “usado uma programação rápida e suja”, que deve ser melhorada.
Essas palavras, não possuem nada de especial ou formal, apenas facilitam a comunicação entre a
equipe. Observe a Figura 2.20, qualquer programador que ler o comentário, saberá que precisar fazer
o cálculo de verificação.
114
Figura 2.20 - Comentário TODO
Comentários também podem ser usados para desativar o código temporariamente. Se o código está
sendo testado, é comum não querer executar uma determinada instrução. Por exemplo, se você não
quiser correr o risco que alguém chame o método VerificarPrimo, porque não está pronta, basta
comentar o código para não ser executado. Observe o método VerificarPrimo sendo comentado na
Figura 2.21.
115
3 VARIÁVEIS E
CONSTANTES
116
3.1 O que são variáveis
Se pudéssemos olhar dentro de um programa quando ele está em execução, veríamos muitos dados
individuais, como: endereço de e-mail, data de nascimento, pontuação, login e várias outras
informações. O programa armazena esses dados durante a execução através das variáveis. As
variáveis possibilitam que o programa reivindique uma parte da memória do computador, para usar
enquanto está em execução. Observe na Figura 3.1 os nomes das variáveis utilizadas no programa e
seus dados armazenados na memória.
Uma variável em C# e nas outras linguagens de programação, é uma posição com nome e endereço
na memória, onde se armazena um valor que pode ser modificado. Quando um programa está sendo
executado, é necessário armazenar os resultados obtidos em tempo de execução ou armazenar as
entradas dos usuários, esses dados são armazenados em variáveis.
Na Figura 3.2 os nomes em rosa, representam as variáveis. Os valores que essas variáveis armazenam,
podem ser trocados a qualquer momento. O título pode ser alterado, a data de atualização, autor e
todos outros dados. Ao declarar uma variável, escolha um nome que descreva seu propósito.
117
Figura 3.2 - Variáveis armazenam dados em tempo de execução.
Algumas linguagens como C#, exigem que seja especificado um tipo para variável. Por exemplo, se
você especificar que a variável é do tipo numérica, não poderá atribuir uma letra a ela, se um tipo
diferente for atribuído, causará um erro. Primeiramente será apresentado, os tipos de dados de uma
forma mais ampla, para simplificar a explicação. Os tipos podem ser agrupados como caracteres,
numéricos e booleanos.
Para definir uma variável precisamos pensar em três coisas: tipo, nome e valor. O tipo define qual
será o tipo de dado, poderá ser um tipo numérico, caractere ou booleano. A variável poderá receber
diferentes dados, desde que sejam do mesmo tipo da variável. O nome é importante, para que o
programador possa identificar a variável quando precisar. O valor pode ser atribuído a variável
inicialmente ou no decorrer da execução do programa. A Figura 3.3 apresenta os 3 elementos
envolvidos na definição de uma variável.
118
Figura 3.3 - Elementos da variável.
119
No Swift a palavra-chave var define que “pontuação” é uma variável e a palavra-chave “int” define
o tipo da variável. No JavaScript para definir uma variável, apenas é necessário a palavra-chave var,
não precisa informar o tipo da variável. Em C++ e C#, é necessário colocar apenas o tipo e o nome,
não precisamos da palavra-chave var ou qualquer outra. A palavra-chave var utilizada nos exemplos
anteriores para definir uma variável em C#, também define um tipo, com base no tipo de dado a ser
atribuído.
Para declarar uma variável em C#, digite o tipo de dado, nome da variável e o operador de atribuição
“=” seguido do valor inicial a ser atribuído. O valor inicial atribuído na declaração da variável é
opcional. A Figura 3.5 apresenta um exemplo.
Exemplo prático
Digite o comando “dotnet new console -n VariavelDeclaracao” no terminal para criar um programa.
Abra o programa no VS Code, copie o código da Figura 3.6, insira um breakpoint na linha 9 e inicie
o debug. Neste exemplo, foi declarada uma variável do tipo numérico int e um valor inicial foi
atribuído. Observe no campo do debug, o tipo da variável “pontuacao” é int.
120
Figura 3.6 - Definindo um tipo a variável
Antes de executar uma variável é necessário ter atribuído um valor, caso contrário, será retornado um
erro. No exemplo da Figura 3.7, nenhum valor foi atribuído a variável “pontuacao”, um erro é
retornado no terminal.
Para corrigir o erro atribua um valor a variável, conforme apresentado na Figura 3.8.
121
Figura 3.8 - Atribuição de valor a variável
Como toda linguagem de programação, C# apresenta um grupo básico de tipos de dados que já vem
implementado na linguagem. Esses tipos são conhecidos como tipos primitivos ou fundamentais. Os
diferentes tipos de dados podem ser agrupados em três categorias: caractere, numérico e booleano.
O tipo caractere suporta letras, números, símbolos e sinais de pontuação. Dentro desse grupo existem
dois tipos. O tipo char que armazena apenas um caractere por vez e o tipo string aceita uma cadeia de
caractere, armazenando vários por vez. O tipo booleano é o mais simples, só possui o tipo bool que
aceita dois valores: true ou false. Os tipos numéricos são utilizados para armazenar números, esses
números podem ser positivos ou negativos, possuir casas decimais ou não. Este tipo pode ser dividido
em dois subgrupos. O subgrupo numérico inteiro que possui 8 tipos inteiros e não aceita casas
decimais. E o subgrupo tipo numérico de ponto flutuante que possui 3 tipos numéricos e aceita casas
decimais.
Algumas linguagens de programação, obrigam que o tipo da variável seja especificado, são chamadas
de linguagens fortemente tipadas. No entanto, existem outras linguagens que não obrigam que o tipo
da variável seja especificado, são chamadas de linguagens fracamente tipadas. Em linguagens
fortemente tipada, a variável só aceita a atribuição de um dado do mesmo tipo. Por enquanto, em
linguagens fracamente tipada, a variável aceita a atribuição de diferentes tipos de dado. As linguagens
C#, C++, Java são fortemente tipada, por enquanto, PHP, JavaScript são fracamente tipada.
122
Inicialmente parece ser mais simples não precisar definir o tipo da variável, mas há desvantagens. Se
as regras não forem impostas sobre esses dados, provavelmente será necessário escrever mais código,
para garantir que os dados estejam corretos. Mesmo com essas diferenças, a maioria das linguagens
trata os dados de forma muito semelhante.
3.3 Char
O tipo char armazena apenas um caractere por vez, ocupando na memória 2 bytes (16 bits). Uma
variável do tipo char pode receber apenas um caractere por vez, que deve estar entre aspas simples.
Para declarar uma variável do tipo char, digite char, nome da variável, operador de atribuição simples
e o valor inicial entre aspas simples. A Figura 3.9 apresenta uma variável do tipo char sendo declarada.
Exemplo prático
Digite o comando “dotnet new console -n Caractere” no terminal para criar um programa. Abra o
programa no VS Code, copie o código da Figura 3.10 e execute o programa digitando o comando
“dotnet run” no terminal.
123
Figura 3.10 - Declaração de variável do tipo char e atribuição de valor inicial.
Se o valor atribuído estiver entre aspas duplas, o compilador entenderá que está sendo atribuído uma
string. Copie o código da Figura 3.11 e execute o programa com o comando “dotnet run”.
Figura 3.11 - Atribuição de valor do tipo string para variável tipo char.
Copie o código da Figura 3.12, insira um breakpoint na linha 13 e inicie o debug. Observe durante o
debug, que cada caractere possui um número ao lado, isso acontece, porque os caracteres são
representados internamente por um número. Os números são diferentes para cada tipo de caractere,
inclusive maiúsculo e minúsculo.
124
Figura 3.12 - Caracteres são representados internamente por números
ASCII e Unicode
Você não pode salvar texto em seu disco rígido como "Unicode", porque é uma representação abstrata
do texto. Você precisa "codificar" esta representação abstrata, através da codificação UTF-8, UTF-
16 e UTF-32.
125
3.4 string
Quando precisamos armazenar mais de um caractere, utilizamos o tipo string. O tipo string é uma
cadeia de caractere, ou seja, possui vários caracteres. Deve-se considerar, que uma string é mais
complexa para o computador do que os demais tipos. Simplesmente porque não se sabe o tamanho,
até que se forneça um valor ao computador. A quantidade de espaço alocado na memória só será
definida no momento que a variável receber o dado. Um tipo string pode conter uma palavra, uma
frase, um documento inteiro, não existe um limite. Os caracteres atribuídos a uma variável do tipo
string, podem ser letras, símbolos, números, qualquer tipo de caractere.
Para declarar uma variável do tipo string, digite string, nome da variável, operador de atribuição
simples e o dado entre aspas duplas. Um exemplo é apresentado na Figura 3.13.
Exemplo prático
Digite o comando “dotnet new console -n String” no terminal. Abra o programa no VS Code, copie
o código da Figura 3.10, insira um breakpoint na linha 19 e inicie o debug. Neste exemplo, declaramos
a variável e atribuímos um valor a variável, observe a variável no painel de debug.
126
Figura 3.14 - Declaração de variável do tipo string e atribuição de valor inicial.
Uma string também pode armazenar apenas um caractere, conforme apresentado na Figura 3.15.
É possível armazenar um texto com mil palavras ou muito mais. No exemplo da Figura 3.16 foi
atribuído mil palavras.
Para atribuir um valor tipo string deve ser utilizado aspas duplas. Se for utilizado aspas simples o
compilador entenderá que está sendo atribuído um caractere. Um exemplo é apresentado na Figura
3.17.
127
Figura 3.17 - Atribuição de dado do tipo char para variável do tipo string
3.5 bool
Costuma-se utilizar o tipo bool para indicar se houve ou não sucesso. Também para efetuar
comparações em expressões lógicas, como verificar se uma lâmpada esta acesa ou apagada. O tipo
bool possui dois valores: verdadeiro ou falso. Esses dois valores são suficientes para executar as
expressões lógicas. Observe como pode ser feito o uso do tipo bool na Figura 3.18.
O tipo bool ocupa na memória 1 byte (8 bits). Para declarar uma variável do tipo bool, digite bool
para definir o tipo de dado, nome da variável, operador de atribuição simples e o valor a ser atribuído.
A Figura 3.19 apresenta o uso da variável do tipo bool.
128
Figura 3.19 - Declaração de variável do tipo bool e atribuição.
Exemplo prático
Digite o comando “dotnet new console -n Bool” no terminal para criar um programa. Abra o programa
no VS Code, copie o código da Figura 3.20, insira um breakpoint na linha 10 e inicie o debug. Observe
que o valor true foi atribuído a variável.
Se nenhum valor for atribuído ao tipo bool, o valor padrão inicial é false. Observe a Figura 3.21.
129
Figura 3.21 - Valor padrão do tipo bool é false.
Mesmo que o tipo bool possua um valor padrão inicial, não é possível executar a variável se nenhum
valor foi atribuído. Se tentar executar a variável, o compilador retornará um erro, conforme
apresentado na Figura 3.22.
130
3.6 Diferença entre tipo numérico inteiro e tipo numérico de
ponto flutuante
Os tipos numéricos são utilizados para armazenar números, esses números podem ser positivos ou
negativos, possuir casas decimais ou não. Ao usar valores numéricos é necessário fazer essas
distinções para escolher o tipo numérico apropriado.
Dentro dos tipos de variáveis numéricas temos dois subgrupos distintos, números inteiros e números
de ponto flutuante. Se você tem um número sem casas decimais, deve utilizar algum tipo numérico
inteiro. Mas se você tem valores com casas decimais, deve utilizar algum tipo numérico de ponto
flutuante.
Os números inteiros e números de ponto flutuantes possuem diversos tipos, que são diferenciados
pelo tamanho máximo do número, quantidade de dígitos e se permitem sinal. Tipos diferentes ocupam
quantidades diferentes de espaço na memória.
Exemplo prático
Digite o comando “dotnet new console -n InteiroPontoFlutuante” no terminal para criar um programa.
Abra o programa no VS Code, copie o código da Figura 3.23 e debug o sistema. Observe no painel
do debug as variáveis e seus respectivos valores.
131
Figura 3.23 - Atribuição de tipo numérico ponto flutuante a tipo numérico inteiro
Existem 8 tipos de números inteiros, provavelmente o tipo int é o mais familiar. Os dados do tipo int
são armazenados em 4 bytes (32 bits) e o valor numérico limite é -2.147.483.648 a 2.147.483.647. O
segundo tipo mais usado é o tipo long que possui uma capacidade maior, os dados são armazenados
em 8 bytes (64 bits) e o valor numérico limite é -9.223.372.036.854.775.808 a
9.223.372.036.854.775.807. Os tipos numéricos inteiros são apresentados na Tabela 3-1.
Alocação
Tipo Valor Numérico Limite Sinal
Memória
132
short -32.768 a 32.767 16 bits com sinal
-9.223.372.036.854.775.808 a
long 64 bits com sinal
9.223.372.036.854.775.807
Para declarar uma variável do tipo int, digite int para definir o tipo de dado, nome da variável,
operador de atribuição simples e valor inicial. Um exemplo é apresentado na Figura 3.24.
133
Para escolher o tipo apropriado, é necessário
saber qual o tamanho máximo do dado que se
espera e se pode ter ocorrências de números
negativos. Imagine que estamos desenvolvendo
um software de reservas de hospedagens de
hotéis e queremos criar um módulo de cadastro
de hotéis. Para definir as variáveis, é necessário
estipular alguns parâmetros (limite superior e
limite inferior) para escolher o tipo de dado
corretamente.
Agora precisamos registrar a quantidade de andares, seguindo a mesma lógica. O tipo sbyte possui
valor numérico limite de -128 a 127, é um limite muito baixo e não queremos números negativos. O
próximo tipo é o byte com valor limite de 0 a 255, este tipo é suficiente para o nosso software, pois
temos como parâmetro o prédio mais alto do mundo que possui 160 andares. Se usar o tipo byte, o
software poderá aceitar sem nenhum problema um prédio com até 255 andares. As variáveis ficaram
definidas da seguinte forma:
134
Os tipos numéricos de pontos flutuantes, devem ser utilizados para armazenar números que possuem
casas decimais, podendo ser positivo ou negativo. Alguns valores que usamos no mundo real,
obrigatoriamente precisam registrar as casas decimais, por exemplo:
É comum um valor decimal vir acompanhado de símbolo. Na programação não atribuímos o símbolo
como um dado a variável. O símbolo referente a unidade de medida, deve ser inserido por extenso no
nome da variável. Defina a casa decimal com ponto, não use vírgulas. Observe os exemplos:
• temperaturaCelsius = 39.7
• distanciaMetro= 1.34
• paredeMetroQuadrado = 23.4
• produtoPreco = 1997.90
135
Figura 3.25 - Diferença entre representação normal e computacional de número decimal
Existem 3 tipos de pontos flutuantes, o tipo float, double e decimal. A diferença entre os tipos, é a
capacidade de dígitos que conseguem armazenar. Quanto maior a capacidade, mais memória será
ocupada.
Alocação
Tipo Quantidade de dígitos
memória
float 6 a 9 dígitos 4 bytes
Para declarar uma variável do tipo decimal, digite decimal, nome da variável, operador de atribuição
simples e o valor inicial. Um exemplo é apresentado na Figura 3.26.
136
Figura 3.26 - Declaração de variável do tipo decimal.
O software precisa calcular o valor total da diária e outros serviços que o hóspede possa ter contratado.
O tipo decimal deve ser definido para o valor total. As variáveis ficaram definidas da seguinte forma:
137
• ushort predioAlturaMetro = 828
• byte predioQuantidadeAndar = 160
• decimal valorDiaria = 100000.00
Os sufixos definem o tipo de dado que está sendo atribuído. Os sufixos são identificados pelas letras
F, D e M para identificar os tipos float, double e decimal respectivamente. As letras podem ser,
maiúsculo ou minúsculo. Se o tipo de dado a ser atribuído não for especificado, o dado será tratado
como double. A sintaxe de atribuição da variável continua igual, apenas deve ser acrescentado o
sufixo atrás do número. Exemplo da sintaxe para cada tipo:
• valorFloat = 297.95F
• valorDouble= 297.95D
• valorDecimal= 297.95M
Exemplo prático
Digite o comando “dotnet new console -n PontoFlutuanteSufixo” no terminal para criar um programa.
Abra o programa no VS Code, copie o código da Figura 3.27 e execute o programa com o comando
“dotnet run” no terminal. Observe que o número atribuído está sem sufixo e nenhum erro é gerado.
Atribuições numéricas com casas decimais para variáveis do tipo double, não precisam de sufixo.
138
Figura 3.27 – Variáveis tipo double não precisam de sufixo no valor atribuído
Copie o código da Figura 3.28 e execute o programa. Observe que um erro foi gerado porque o
compilador espera uma atribuição do tipo float e não double.
Para corrigir o erro, digite o sufixo f ou F para definir o valor como float. Siga o exemplo da Figura
3.29.
139
Figura 3.29 - Acrescentando sufixo f na atribuição para tipo variável do tipo float
A soma de 26.5 + 0.1 com um tipo float obtém como resultado 26.600477. Mas a mesma soma com
decimal terá como resultado 26.6. Observe o exemplo da
140
Imagino que essa questão de arredondamento deixou você confuso, essa diferença ocorre porque o
decimal possui base 10, float e double possuem base 2. Não abordaremos este assunto nesse momento,
afinal queremos programar e não saber a origem do universo. Pelo menos por enquanto.
Exemplo prático
141
3.9 Conversão implícita e explícita.
As vezes é preciso transformar um tipo de dado em outro, isto é possível através da conversão. Por
exemplo, um número do tipo double, pode ser transformado em um número do tipo int e vice-versa.
A conversão pode ser feita de duas maneiras: implícita ou explícita. A conversão entre tipos
realizada automaticamente é conhecida como implícita , ocorre quando não precisamos
informar o tipo de conversão. A conversão explicita ocorre quando precisamos informar o tipo de
conversão, precisa ser feita manualmente com o operador cast ou a classe Convert por
exemplo.
142
As conversões implícitas podem ser feitas somente entre alguns tipos de dados. A Tabela
3-3 apresenta os tipos de conversão implícita.
de para
byte short, ushort, int, uint, long, ulong, float, double, decimal
float double
Os dados que podem ser convertidos explicitamente são apresentados na Tabela 3-4.
de para
decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double
double sbyte, byte, short, ushort, int, uint, long, ulong, char, float, decimal
float sbyte, byte, short, ushort, int, uint, long, ulong, char, decimal
143
uint Sbyte, byte, short, ushort, int, char
Exemplo prático
Um tipo double não pode ser convertido implicitamente para um tipo int. Se tentar converter
implicitamente um tipo double para um tipo int, o compilador retornará um erro, informando que não
é possível, mas existe uma conversão explicita. Siga o exemplo da Figura 3.34.
144
Figura 3.34 - Conversão tipo double para tipo int implicitamente
A conversão de um tipo double para int deve ser feita de forma explícita, através do operador cast. O
operador cast possibilita fazer a conversão explícita entre tipos numéricos. Para usar o operador cast
insira entre parênteses o tipo para qual o dado deve ser convertido na frente do valor. Siga o exemplo
da Figura 3.35.
É possível converter implicitamente tipos inteiros para todos os tipos de ponto flutuante. Conforme
apresentado na Figura 3.36.
145
Figura 3.36 - Tipo inteiro convertido implicitamente para todos tipos de ponto flutuante
A conversão implícita de tipo inteiro para ponto flutuante também pode ser com números negativos,
conforme apresentado na Figura 3.37.
Figura 3.37 - Conversão implícita de tipo inteiro negativo para ponto flutuante
A classe Convert possui vários métodos que possibilitam fazer a conversão. A Tabela 3-5 apresenta
os métodos da classe Convert para converter string em números. Para ver a lista completa acesse o
link https://docs.microsoft.com/pt-br/dotnet/api/system.convert?view=netframework-4.8
decimal ToDecimal(String)
146
float ToSingle(String)
double ToDouble(String)
short ToInt16(String)
int ToInt32(String)
long ToInt64(String)
ushort ToUInt16(String)
uint ToUInt32(String)
ulong ToUInt64(String)
Copie o código da Figura 3.39, insira um breakpoint na linha 12 e debug o código. Observe que a
conversão do tipo string para o tipo int ocorreu com sucesso.
147
Figura 3.39 - Conversão tipo string para int com classe Convert
O tipo string não pode ser convertido para o tipo numérico com o operador cast. Copie o código da
Figura 3.40 execute o programa. Um erro será apresentado.
Figura 3.40 - Conversão de tipo string para tipo int com operador cast
Copie o código da Figura 3.41, insira um breakpoint na linha 11 e debug o código. A conversão do
tipo char para o tipo int está sendo feita de forma implícita, com esta abordagem não conseguimos
148
obter o resultado esperado. Observe que a variável valorInteiro recebeu o número referente a tabela
Unicode e não o valor do número armazenado na variável. Como já visto, isso acontece porque cada
caractere é representado internamente por um número.
A forma correta de fazer a conversão do tipo char para o tipo int é através do método
GetNumericValue da classe Char. É necessário usar o operador Cast porque o método transformou o
caractere em double e precisamos transformá-lo em int. Copie o código, insira um breakpoint na linha
11 e inicia o debug.
Tipos numéricos também podem ser transformados em tipo caractere. No exemplo da Figura 3.43
uma variável do tipo int é transformada em tipo string.
149
Figura 3.43 - Conversão explicita de tipo int para o tipo string.
3.10 Constantes
Até agora focamos em variáveis que são dados que podem ser alterados a qualquer momento. Mas
nem todos dados variam, alguns dados sempre devem permanecer igual. Por exemplo, um jogo pode
ter uma quantidade máxima de jogadores que o software suporta, esse valor fixo deve ser inserido
diretamente no código. Também temos o número PI que nunca muda, não faria sentido mudar o valor
de PI durante a execução da aplicação.
As constantes devem ser usadas em valores que não mudam, valores armazenados com constantes
ficam protegidos de qualquer alteração durante a programação ou a execução do programa.
Constantes e variáveis são muitos parecidas, possuem tipo, nome e valor conforme apresentado na
Figura 3.44. A única diferença, é que uma vez que o valor é atribuído não pode mais ser alterado.
Qualquer tentativa de alterá-lo depois da primeira atribuição causará um erro.
150
Dados armazenados como constantes, são mais eficientes que os mesmos dados armazenados como
variáveis. Porque a linguagem pode otimizar a memória de maneira diferente, se souber que os dados
nunca serão alterados.
Em algumas linguagens, é comum ver o nome de constantes escritas em maiúsculo e separadas por
um sublinhado, ao contrário das variáveis que costumam usar Camel Case. Isto não é uma regra, mas
é uma convenção que pode ajudar a identificar de forma rápida as constantes.
Talvez uma dúvida esteja pairando sobre você. Para que ser uma
constante, não seria mais fácil eu inserir o valor diretamente no
código? A resposta é não, porque a constante dará um sentido
para o valor inserido no código, devido ao seu nome. Imagine
você olhar no código o número 2 e ficar pensando, será que esse
é mesmo a quantidade máxima de jogador. Outra vantagem, é
não ter que ficar repetindo no código o mesmo valor, imagine
quando você quiser alterar um valor, terá que alterar em todo
código. Por exemplo, agora o jogo tem suporte para 4 jogadores,
se você não estiver usando constante, terá que alterar em todo
código o número 2 para 4. Com as constantes você precisará
alterar apenas em um único lugar.
Se você estiver desenvolvendo um sistema para um elevador, é provável que utilize uma constante
para registrar capacidade máxima em quilo do elevador. Não faz sentido usar uma variável, porque o
elevador foi projetado pra suportar um peso máximo fixo.
As constantes devem ser declaradas com a palavra-chave const, tipo, nome da constante, operador de
atribuição e o valor inicial. Um exemplo é apresentado na Figura 3.45.
151
Exemplo prático.
Crie um programa digitando no terminal o comando “dotnet new console -n Constante”. Abra o
programa no VS Code. Copie o código da Figura 3.46.
Uma vez declarada a constante, o valor não poderá ser alterado. Caso contrário, um erro será
retornado conforme apresentado na Figura 3.48.
152
Figura 3.48 - Alterando valor da constante.
153
4 OPERADORES
ARITMÉTICOS
154
4.1 Introdução
Os operadores aritméticos são utilizados para fazer cálculos. O C# é uma linguagem rica em
operadores, que são representados por símbolos na construção de expressões. A sintaxe de expressão
do C# é baseada no C++. A Tabela 4-1 apresenta os 5 operadores aritméticos.
Operador Descrição
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Resto ou Mod
Quando os estudantes de programação estão lendo um livro técnico, muitas vezes não conseguem
resolver determinados problemas, não por terem dificuldades em matemática. Mas por não
conseguirem entender o enunciado do problema.
Um dos vários assuntos que são abordados nos primeiros anos de escola e esquecidos rapidamente, é
o nome dos termos (nomenclatura ou terminologia) utilizados nas quatro operações básicas
fundamentais: adição, subtração, multiplicação e divisão. Para entender melhor vamos fazer um passo
a passo bem simples, para relembrar esses termos. Só lembrando, que alguns termos podem ter
diferentes nomes, dependendo do país, tradução do livro e outros fatores.
155
Figura 4.1 - Termos da operação de adição
Exemplo prático
156
4.3 Operador de subtração
A operação de subtração utiliza o operador aritmético de subtração, representado pelo símbolo “-”
(sinal de menos). Os valores envolvidos na operação são chamados de minuendo e subtraendo, o
resultado é chamado de diferença. Um exemplo é apresentado na Figura 4.3.
Exemplo prático
157
Figura 4.4 - Operação de subtração
158
Figura 4.6 - Operação de multiplicação.
159
Exemplo prático
160
Figura 4.9 - Termos da operação módulo
Os operadores aritméticos são muitos usados na programação, geralmente essas operações são feitas
usando variáveis e constantes, não são chamadas de parcela, fator, produto ou qualquer outra
nomenclatura matemática. Geralmente são nomeadas pelo real significado da regra de negócio, por
exemplo: valor total, preço unitário, gorjeta, frete, tamanho da pizza, valor ingresso, quantidade de
ingresso.
Exemplo prático
161
o debug. A expressão 123 % 10 é representada pelo código “dividendo % divisor”. O resultado 3 da
expressão é atribuído a variável resto.
Desenvolva um programa que solicite a quantidade de ingressos que o usuário deseja e retorne o valor
total dos ingressos para o usuário. O valor do ingresso é R$ 89,99. O exercício resolvido é apresentado
na Figura 4.11
162
Figura 4.11 - Exercício operadores aritméticos calculando ingressos.
163
Expressões que possuem operadores de níveis de precedência diferentes, executam primeiramente os
operadores de nível mais alto. Um exemplo é apresentado na Figura 4.12.
Operadores aritméticos são associativos esquerdos, são avaliados da esquerda para direita. Nos casos
que houver operadores com a mesma precedência será executado da esquerda para direita. Por
exemplo, os operadores aritméticos de divisão e multiplicação possuem o mesmo nível de
precedência. A operação será executada da esquerda para direita, conforme apresentado na Figura
4.13.
164
Figura 4.13 - Associatividade a esquerda
A expressão que possuir operadores do mesmo nível e níveis diferentes, executará primeiro os
operadores de níveis mais alto da esquerda para direita e posteriormente os de níveis mais baixo da
esquerda para direita. Um exemplo é apresentado na Figura 4.14.
165
Parênteses podem ser usados para alterar a ordem de execução dos operadores aritméticos da
expressão. Observe a comparação entre os dois exemplos apresentado na Figura 4.15.
Exemplo prático
166
Figura 4.16 - Operadores aritméticos de precedência igual.
Para executar a expressão 4 * 2 antes de 8 / 4 é necessário fazer o uso de parênteses. Insira a expressão
4 * 2 entre parênteses para alterar a ordem de execução. A expressão 4 * 2 é executada primeiro e seu
resultado é dividido por 8. Observe no painel de debug da Figura 4.17 que um resultado diferente foi
obtido.
167
Figura 4.18 - Exercício resolvido uso de parênteses em operadores aritméticos.
As regras de sinais que usamos na matemática também são consideradas na programação, conforme
apresentado na Figura 4.20.
168
Figura 4.20 - Regras de sinais.
Observe na Figura 4.21 o comportamento das regras de sinais com a operação de multiplicação.
169
Figura 4.21 - Regras de sinais com multiplicação
Observe na Figura 4.22 o comportamento das regras de sinais com a operação de subtração.
170
Respeitando a ordem de precedência a primeira operação realizada é transformar o número 2 em
negativo. Os operadores divisão e multiplicação possuem a mesma precedência, serão executados da
esquerda para a direita. O número 8 será dividido por 4 e o resultado será multiplicado por -2. O
resultado gerado é -4. O exemplo é apresentado na Figura 4.24
Exemplo prático
171
Figura 4.24 - Multiplicação com números negativos
172
Figura 4.25 - Exercício resolvido média aritmética do aluno
173
5 Operadores de
Atribuição
Composta
174
Além do operador de atribuição simples “=”, C# proporciona cinco operadores de atribuição
composta, que combinam o operador de atribuição simples com algum operador aritmético. São muito
utilizados como um atalho para fazer uma operação aritmética. Operadores de atribuição composta
realizam uma operação aritmética utilizando o operando a esquerda com o operando a direita,
atribuindo o resultado ao operando a esquerda. Um exemplo é apresentado na Figura 5.1 utilizando o
operador de atribuição composta e ao lado a operação equivalente com operador de atribuição
simples.
Figura 5.1 - Operador de atribuição composta com o equivalente operador de atribuição simples
Os operadores de atribuição composta possuem todos operadores aritméticos. A Tabela 5-1 apresenta
os operadores.
175
Figura 5.2 – Soma com atribuição simples e composta.
A Tabela 5-2 apresenta expressões com atribuição simples e a respectiva expressão com atribuição
composta. Considere o valor 50 para variável x.
x=x*3 x *= 3 150
x=x/3 x /= 3 16
x = x% 3 x %= 3 2
x=x+3 x += 3 53
x=x-3 x -= 3 47
Exemplo prático
Digite no terminal o comando “dotnet new console -n OperadorAtribuicao” para criar um programa.
Abra o programa no VS Code, copie o código da Figura 5.4, insira um breakpoint na linha 15 e inicie
o debug observando os resultados gerados.
176
Figura 5.3 - Operador de atribuição composta
Exemplo prático
Imagine que estamos desenvolvendo um jogo e queremos armazenar os pontos do jogador durante o
jogo. Existe a pontuação total do jogador que armazena todos os pontos feitos durante a partida e,
existe os pontos novos que foram adquiridos em uma nova jogada. Devemos adicionar os pontos
novos a pontuação total do jogador. No exemplo abordado, o jogador possui 800 pontos na partida e
conseguiu mais 300 pontos em uma nova jogada. Precisamos somar o valor 800 da pontuação mais o
valor 300, referente aos novos pontos adquiridos. O programa com o operador de atribuição simples
é apresentado na Figura 5.4 e o programa com o operador de atribuição composta é apresentado na
Figura 5.5.
177
Figura 5.4 - Pontuação com operador de atribuição simples
178
6 OPERADORES
RELACIONAIS
179
6.1 Introdução
Os operadores relacionais permitem comparar dois valores, que são chamados de operandos. Se
utilizarmos um operando seguido de um operador relacional e outro operando, uma expressão
relacional é formada e um valor booleano será retornado. Os tipos numérico, caractere e booleanos
podem ser comparados pelo operador relacional. O exemplo da Figura 6.1 faz a comparação entre
dois operandos: se x for maior que y retorna true, se x for menor que y retorna false.
Existem seis tipos de operadores relacionais, a descrição e exemplo desses operadores é apresentado
na tabela Figura 6.2.
180
Operador Significado Exemplo
== Igual a x == y
!= Diferente de x != y
O valor retornado por uma expressão relacional, pode ser armazenado em uma variável do tipo bool.
Na expressão apresentada na Figura 6.3, a expressão avalia se 8 é maior ou igual a 4, como 8 é maior
que 4 a expressão retorna o valor true para variável resultado.
Exemplo prático
Digite no terminal o comando “dotnet new console -n OperadorRelacional” para criar um programa.
Abra o programa no VS Code, copie o código da Figura 6.4, insira um breakpoint na linha 10 e inicie
o debug. O operador relacional verifica se 5 é maior que 3 e atribui o valor true para variável
resultado.
181
Figura 6.4 - Operador relacional maior que
A expressão geralmente é criada com uso de variáveis ou constantes. Copie o código da Figura 6.5,
insira um breakpoint na linha 12 e inicie o debug. Observe que a expressão relacional retorna true
porque x é maior que y.
Copie o código da Figura 6.6, a expressão avalia se “x” é menor que “y” e retorna o valor false.
182
Figura 6.6 - Operador relacional menor que.
Copie o código da Figura 6.7, a expressão avalia se “x” é igual a “y” e retorna o valor false.
Copie o código da a Figura 6.8, a expressão avalia se “x” é diferente de “y” e retorna o valor true.
183
Copie o código da Figura 6.9, a expressão avalia se “x” é maior ou igual a “y” e retorna o valor true.
Copie o código da a Figura 6.10, a expressão avalia se “x” é menor ou igual a “y” e retorna o valor
true.
184
Figura 6.11 - Expressões aritméticas e operadores relacionais.
Em uma expressão com vários operadores, avalia-se os operadores pela ordem de prioridade de
precedência. Operadores relacionais possuem menor prioridade que os operadores aritméticos e
associatividade da esquerda para a direita. A ordem de precedência é apresenta na Tabela 6-1.
Operadores Aritméticos +, -, *, /, % 1
Operadores aritméticos são executados pelo programa antes dos operadores relacionais. Na Figura
6.12 operador aritmético de multiplicação é executado primeiramente, por possuir prioridade superior
ao operador de adição. Posteriormente o operador de adição é executado. Por último o operador
relacional compara os resultados das expressões aritméticas e retorna um valor booleano.
185
Figura 6.12 - Precedência dos operadores aritméticos e relacionais
Uma expressão relacional pode ter vários operadores relacionais, que são executados por ordem de
precedência e associatividade a esquerda. Os operadores relacionais “==” (igual a) e “!=” (diferente
de), possuem precedência diferente dos demais operadores relacionais e podem ser chamados de
operadores de igualdade, conforme apresentado na Figura 6.13.
186
Operador Símbolo Nível de prioridade
Uma expressão que possui operadores relacionais e operadores de igualdade, avalia-se primeiro os
operadores relacionais. Na Figura 6.14, o programa executa o operador relacional “>” (maior que) e
retorna o valor true. O operador de igualdade “!=” (diferente de) compara os dois operandos
booleanos “false != true” e retorna o valor true.
187
Figura 6.15 - Operadores relacionais associatividade a esquerda.
Exemplo prático
Copie o código da Figura 6.16, insira um breakpoint na linha 10 e inicie o debug. O operador de
adição entre parênteses 3 + 7 é executado, o resultado 12 é dividido por 2 e obtém o valor 6. O
operador de subtração 12 – 5 é executado e retorna o valor 7. O operador relacional avalia se 7 é
maior que 5 e retorna true.
188
6.3 Tipos de operandos
Operadores relacionais e de igualdade podem comparar qualquer valor de tipo numérico (float,
double, int, long, etc.). Os tipos bool e string não podem ser comparados pelos operadores relacionais,
apenas pelos operadores de igualdade. O tipo char pode ser comparado pelos operadores relacionais
e de igualdade, a comparação é realizada pelo número referente a tabela Unicode.
Operadores de igualdade podem comparar qualquer tipo de dado primitivo. Os exemplos são
apresentados na Tabela 6-3 – Expressões com operadores de igualdade
Int 4 != 4
Operadores relacionais podem comparar tipos numéricos e char. Os exemplos são apresentados na
Tabela 6-4.
Int 4<4
O tipo char é comparado numericamente pelo seu valor referente a tabela Unicode. Por exemplo se
comparar os caracteres ‘x’ e ‘y’, será comparado os valores 120 e 121. Um exemplo é apresenta na
Figura 6.17
189
Figura 6.17 - Operador relacional com tipo char
Exemplo prático
Copie o código da Figura 6.19, a expressão não pode comparar strings com operador relacional.
190
Figura 6.19 - Operador relacional não compara string
Copie o código da Figura 6.20, a expressão avalia se a string “jackson” é igual a “jackson” e retorna
o valor true.
Copie o código da Figura 6.21, a expressão avalia se a string “jackson” é igual a “Jackson” e retorna
o valor false. A expressão é falsa porque o operador diferencia maiúsculos e minúsculos.
191
Figura 6.21 - Operador relacional comparando string
192
7 Estrutura de
Seleção if
193
7.1 Instrução if
A instrução if é uma estrutura de seleção. Quando a instrução if é executada dentro de um programa,
é avaliada a expressão entre parênteses. Se a expressão é verdadeira, a instrução interna do bloco é
executada, caso contrário, não executa a instrução. Em qualquer caso, a execução do programa
continua com a instrução seguinte. A Figura 7.2 representa um diagrama de fluxo usando a instrução
if.
Para declarar a instrução if, insira a palavra-chave if e entre parênteses uma expressão booleana. As
instruções internas do bloco devem ser declaradas entre chaves. A estrutura da sentença if é
representada na Figura 7.2.
194
Figura 7.2 - Estrutura if.
O fluxograma da Figura 7.3 verifica se a média do aluno é maior ou igual 6. Se a média for maior
ou igual a 6 apresenta a mensagem Aluno Aprovado. Se a média for menor, nenhuma mensagem é
apresentada e o fluxo do programa continua normalmente. Observe o código correspondente ao
lado.
195
Exemplo prático
Digite no terminal o comando “dotnet new console -n InstrucaoIf”. Abra o programa no VS Code,
copie o código da Figura 7.4, insira um breakpoint na linha 14 e inicie o debug. O programa calcula
a média aritmética do aluno e verifica se o aluno foi aprovado. Se a média for maior ou igual a 6,
apresenta a mensagem “Aluno Aprovado”. Neste exemplo, a média do aluno é 6.53, o aluno foi
aprovado. A execução da instrução Console.WriteLine($“Média final:{media}”) é executada
indiferente do bloco if, por não esta dentro das chaves.
Insira o valor 5.5 na m1, a média do aluno passa a ser 5.26, conforme apresentado na Figura 7.5. A
instrução if verifica se a média é maior ou igual a 6. Neste caso a média é menor, a instrução
Console.WriteLine(“Aluno Aprovado”) não é executada, somente a instrução
Console.WriteLine($“Média final:{media}”) é executada.
196
Figura 7.5 - Instrução if média do aluno
197
Figura 7.6 - Fluxograma instrução if menor de idade
198
Figura 7.7 - Exercício resolvido instrução if menor de idade
199
Figura 7.8 - Fluxograma instrução if-else.
A estrutura da instrução if-else é parecida com a instrução if, a diferença é que adicionamos a palavra-
chave else, seguida de mais um bloco de instrução.
200
Figura 7.9 - Estrutura da instrução if-else
201
Exemplo prático
Digite no terminal o comando “dotnet new console - n InstrucaoIfElse” para criar um programa. Abra
o programa no VS Code, copie o código da Figura 7.11, insira um breakpoint na linha 14 e inicie o
debug. O programa calcula a média aritmética do aluno e verifica se o aluno foi aprovado ou
reprovado. Se a média for maior ou igual a 6, apresenta a mensagem “Aluno Aprovado”. Caso
contrário, apresenta a mensagem “Aluno Reprovado”. Neste exemplo, a média do aluno é 6.53, o
programa apresenta as mensagens “Aluno aprovado” e “Média final: 6.53”.
Insira o valor 5.5 na variável m1, a média do aluno passa a ser 5.26, conforme apresentado na Figura
7.12Figura 7.5. A instrução if verifica se a média é maior ou igual a 6, como não é, o bloco else é
acionado e executa a instrução Console.WriteLine(“Aluno Reprovado”). O programa continua o
fluxo normal e executa a instrução Console.WriteLine($“Média final:{media}”).
202
Figura 7.12 - Instrução if-else média do aluno reprovado
203
Figura 7.13 - Estrutura da instrução if-else aninhada
204
Figura 7.14 – Instrução if-else aninhada aluno aprovado, em recuperação e reprovado
Exemplo prático
205
Figura 7.15 - Instrução if-else aninhada aluno aprovado.
Insira o valor 5.5 na variável m1 e 6.2 na m2, a média do aluno passa a ser 5.4 conforme apresentado
na Figura 7.16. A instrução else-if é executada e apresenta a mensagem “Aluno em recuperação”.
206
Insira o valor 4.2 na variável m1, a média do aluno passa a ser 4.2 conforme apresentado na Figura
7.17. A instrução else-if é executada e apresenta a mensagem “Aluno Reprovado”.
207
Figura 7.18 - Exercício resolvido instrução if-else aninhada cor da fita.
208
7.6 Escopo de bloco
O escopo determina quais são os dados que podem ser acessados em uma determinada parte do
código, essas partes podem ser chamadas de blocos. As variáveis declaradas dentro de um bloco,
possuem escopo de bloco e não são visíveis fora do bloco.
A instrução if é um bloco. Uma variável declarada dentro de um bloco, poderá ser referenciada em
qualquer parte do bloco, do ponto em que foi declarada até o final do bloco. Mas não poderá ser
referenciada fora do bloco.
Na variável mensagem foi declarada dentro do bloco if e também no bloco else. Somente foi possível
declarar uma variável com o mesmo nome, porque a variável foi declarada em escopos diferentes. A
instrução Console.WriteLine(mensagem) não consegue executar a variável “mensagem”, porque um
bloco externo não pode acessar as propriedades de um bloco interno. Por outro lado, o bloco interno
pode acessar as propriedades do bloco externo, por exemplo a instrução if acessou as variáveis
numeroA e numeroB do bloco externo.
Exemplo prático
Digite no terminal o comando “dotnet new console -n EscopoBlocoIf” para criar um programa. Abra
o programa no VS Code, copie o código da Figura 7.20 e execute o programa com o comando dotnet
run. O programa verifica entre dois números qual é o maior. Observe que um erro foi gerado, a
instrução Console.WriteLine(mensagem) do bloco externo está tentando acessar a propriedade de um
bloco interno.
209
Figura 7.20 - Instrução if escopo de bloco errado
Para corrigir o problema declare a variável “mensagem” no bloco externo, fora da instrução if e else.
O exemplo é apresentado na Figura 7.21.
210
Figura 7.21 - Instrução if escopo de bloco
211
8 ESTRUTURA DE
REPETIÇÃO
WHILE
212
8.1 Instrução while
A instrução while representa uma estrutura de repetição, permite chamar várias vezes uma ou várias
instruções, por enquanto a condição for verdadeira. A instrução while representa um laço de repetição,
que também pode ser chamado de loop.
O fluxograma de uma instrução while é apresentada na Figura 8.1. Se a condição for verdadeira,
executa as instruções internas do laço e retorna ao inicio reavaliando a condição do laço. Se a condição
do laço for falsa, as instruções internas do while não são executadas e o programa continua no fluxo
normal do programa.
213
Para declarar uma instrução while é utilizado a palavra-chave while. Entre parênteses uma expressão
booleana deve ser inserida. Entre chaves deve ser inserida as instruções a serem executada a cada
iteração do laço. A estrutura é apresentada na Figura 8.2.
Um laço é uma construção de programa, que repete uma instrução ou sequência de instruções
determinado número de vezes. Cada repetição do corpo do laço se chama iteração do laço. O exemplo
apresentado na Figura 8.3 possui 11 iterações, que apresentam no terminal a contagem de 0 a 10.
214
Figura 8.3 - Instrução while iterações.
Exemplo prático
215
Figura 8.4 – Instrução while contador
A condição do laço precisa ser verdadeira para iniciar a execução do laço. Se a condição for falsa o
laço nunca é iniciado. É comum programadores iniciantes, escrever condições de laço como se fossem
o critério de parada, mas na verdade o que devemos escrever é o critério de execução do laço.
Um laço para ser executado precisa que condição seja verdadeira. No exemplo da Figura 8.5, o
contador é inicializado com o valor 0 e a condição do laço, exige que o contador seja igual a 10 para
executar o laço. O contador nunca chegará a 10, porque a atualização do contador está dentro do laço,
que nunca será executado. Neste caso, uma condição depende da outra, não sendo possível executar
o laço.
216
Figura 8.5 - Laços que nunca executam
Exemplo prático
217
8.3 Laços Infinitos
Se a condição for sempre verdadeira, um laço infinito será criado. A condição em algum momento
deve ser falsa, para que o laço pare a execução. No exemplo da Figura 8.7 o contador nunca é
atualizado, sempre será zero. A condição do laço sempre retorna true, fazendo com que o laço
continue sendo executado.
Exemplo prático
218
Figura 8.8 - Instrução while laços infinitos
219
8.4 Laços Aninhados
Um laço aninhado é um laço com um ou mais laços internos. A cada iteração do laço externo, os laços
internos iteram até a condição do laço for falsa. Um laço aninhado é categorizado em laço externo e
interno, conforme apresentado na Figura 8.9.
Quando o laço externo executa uma iteração, o laço interno executa todas iterações. Quando termina
as iterações do laço interno o programa retorna ao laço externo para reavaliar a condição. Um exemplo
é apresentado na Figura 8.10.
Se houver instruções após o laço interno, serão executadas antes de retornar à condição do laço
externo. Um exemplo é apresentado na Figura 8.11.
220
Figura 8.11 – Instrução while laço externo com instrução após laço interno.
O exemplo apresentado na Figura 8.13 exibe no terminal a tabuada de 1 a 10. A tabuada inicia em 1
x 1 = 1 e termina em 10 x 10 = 100.
Exemplo prático
221
Figura 8.13 - Tabuada com laços while aninhados
222
8.5 Instrução Break
É possível interromper a qualquer momento um bloco de instrução while utilizando a instrução
“break”. Se um laço precisa ser interrompido antes do previsto a instrução break pode ser utilizada.
No exemplo da Figura 8.14, se a condição da instrução “if” for verdadeira, a instrução “break” é
executada, a instrução 1 não é executada e a instrução 2 é executada.
Uma instrução break pode ser usada dentro de um laço com condição true. A instrução break deve
estar dentro de uma estrutura condicional, por exemplo uma instrução if. Se não houver nenhuma
estrutura condicional, a instrução break será executada na primeira iteração e o laço será interrompido.
Um exemplo de validação de menu é apresentado na Figura 8.15, o laço só é interrompido se o usuário
digitar “n”.
223
Figura 8.15 - While com condição true e instrução break
224
Figura 8.16 - Instrução break com contador.
225
9 OPERADOR
LÓGICO
226
Operadores lógicos comparam duas ou mais expressões booleanas e retornam um valor booleano.
Também pode inverter o valor de um operando ou resultado de uma expressão booleana. São
utilizados em expressões condicionais mediante a instrução if, while, for, switch, do-while. Um
exemplo é apresentado na Figura 9.1. Os operadores lógicos são: not (!), and (&&) e or (||).
227
Figura 9.2 - Operador "!" (not).
O operador lógico “not” somente inverte o valor de um operando booleano. Se o operador not for
inserido numa expressão booleana, somente o operando que o segue será alterado e não toda
expressão. Observe no primeiro exemplo da Figura 9.3, que o operador “!” (not) tenta alterar o
primeiro operando e não toda expressão, um erro é gerado porque o operando é do tipo int. O mesmo
problema se repete no segundo exemplo, porque o operando é do tipo char.
228
Figura 9.3 - Operador lógico "!" not altera apenas o primeiro operando.
Para inverter o valor da expressão booleana, é necessário inserir parênteses em torno da expressão.
Os parênteses transformam a expressão booleana em um único operando booleano. Um exemplo é
apresentado na Figura 9.4.
229
Figura 9.4 – Operador "!" (not) parênteses em expressões booleanas.
Na Figura 9.5 a primeira expressão verifica se 7 é menor ou igual a 4, como a expressão é falsa retorna
false. Na segunda expressão temos a mesma expressão, 7 é menor ou igual a 4, a expressão retorna
false, mas o operador not (!) inverte para true.
230
Figura 9.5 - Operador "!" (not) e operador relacional
Exemplo prático.
Digite no terminal o comando “dotnet new console -n “OperadorLogicoNot” para criar um programa.
Abra o programa no VS Code, copie o código da Figura 9.6, insira um breakpoint na linha 11 e inicie
o debug.
Copie o código da Figura 9.7 e digite o comando “dotnet run” no terminal para executar o programa.
Observe que o compilador retorna um erro, informa que o operador lógico "!" (not) não pode ser
aplicado ao tipo int.
231
Figura 9.7 - Operador lógico "!" (not) não pode ser aplicado a tipo numérico
O uso de parênteses em volta da expressão corrige o erro, conforme apresentado na Figura 9.8.
232
Figura 9.9 - Exercício resolvido números impares de 0 a 100.
233
Figura 9.10 - Resultado do exercício números impares de 0 a 100.
234
Expressão Resultado
Expressões com operadores relacionais e lógicos seguem uma ordem de prioridade. Primeiramente
avalia-se a expressão relacional e um resultado booleano é obtido. Posteriormente os resultados
booleanos obtidos são comparados pelo operador lógico. Por fim, um resultado booleano é obtido.
Um exemplo é apresentado na Figura 9.12.
235
Figura 9.12 - Precedência dos operadores relacionais e lógicos.
Exemplo prático.
Digite no terminal o comando “dotnet new console -n “OperadorLogicoAnd” para criar um programa.
Abra o programa no VS Code, copie o código da Figura 9.13, insira um breakpoint na linha 9 e inicie
o debug. Observe que apenas a primeira expressão retornou true, por ser a única expressão que possui
os dois operandos com o valor true.
236
Copie o código da Figura 9.14, insira um breakpoint na linha 9 e inicie o debug o código.
Primeiramente foi obtido o valor das expressões relacionais e por último os resultados são
comparados em uma expressão lógica.
Copie o código Figura 9.15, insira um breakpoint na linha 9 e debug o código. Leia as expressões e
compare com os resultados apresentados na janela do debug.
237
9.4 Exercício número entre 0 e 100
Desenvolva um programa que solicite ao usuário um número entre 0 e 100. Se o número digitado for
entre 0 e 100, o programa deve apresentar uma mensagem de agradecimento. Caso contrário, deve
apresentar uma mensagem de erro e solicitar um novo número. Os números entre 0 e 100 iniciam em
1 e terminam em 99. Utilize o operador lógico "&&" (and). O exercício resolvido é apresentado na
Figura 9.16. Teste seu código com os números 127, -49, 0, 100 e 33. Verifique se obteve os mesmos
resultados da Figura 9.17.
238
Figura 9.17 - Teste do exercício número entre 0 e 100.
Expressão Resultado
239
Figura 9.18 - Expressões relacionais são operandos de expressões lógicas.
As expressões com operadores relacionais e lógicos seguem uma ordem de prioridade. Primeiramente
avalia-se a expressão relacional, um resultado booleano é obtido. Posteriormente os resultados
booleanos obtidos são comparados pelo operador lógico. Por fim, um resultado booleano é obtido.
Um exemplo é apresentado na Figura 9.19
240
Figura 9.19 - Expressão lógica com expressões relacionais.
241
Figura 9.20 - Expressões relacionais e operador lógico “||” (not).
Exemplo prático
Digite no terminal o comando “dotnet new console -n “OperadorLogicoAnd” para criar um programa.
Abra o programa no VS Code, copie o código da Figura 9.21, insira um breakpoint na linha 9 e inicie
o debug. Observe que apenas a primeira expressão retornou false, porque é a única expressão que
possui os dois operandos false.
242
Figura 9.21 -Operador lógico “||” (not) e valores booleanos.
Copie o código da Figura 9.22, insira um break point na linha 9 e debug o código. Primeiramente foi
obtido o valor das expressões relacionais separadamente e por último foi comparado os resultados em
uma expressão lógica.
Copie o código da Figura 9.23, insira um breakpoint na linha 9 e debug o código. Leia as expressões
e compare com os resultados apresentados na janela do debug.
243
Figura 9.23 - Expressão relacional e operador lógico "||" (or).
Os operadores de maior nível de prioridade são executados primeiro. Por exemplo, os operadores
aritméticos são executados antes dos operadores relacionais, que por sua vez, são executados antes
dos operadores lógicos. Observe a ordem de execução dos operadores na expressão apresentada na
Figura 9.24.
244
Figura 9.24 - Precedência dos operadores
not ! 1
and && 2
or || 3
Primeiramente executa-se o operador “!” (not), posteriormente executa-se os operadores “&&” (and)
da esquerda para direita e por último executa-se o operador “||” (or). A regra de precedência e
associatividade é apresentada Figura 9.25.
245
Figura 9.25 - Precedência dos operadores lógicos e associatividade.
’
Exemplo prático
Copie o código da Figura 9.26 - Precedência dos operadores lógicos., insira um breakpoint na linha
10 e debug o código. Primeiramente executa-se o operador “!” (not), posteriormente executa-se os
operadores “&&” (and) da esquerda para direita e por último executa-se o operador “||” (or). Observe
o resultado apresentado na janela do debug.
246
10 OPERADORES
DE INCREMENTO
E DECREMENTO
247
10.1 Introdução
Operadores de incremento e decremento, somam ou subtraem 1 a variável, cada vez que são
aplicados. O operador de incremento é representado pelo símbolo “++” e o operador de decremento
pelo símbolo “--”.
Existem três formas de fazer o incremento e decremento de uma variável, conforme apresentado na
Figura 10.2. A forma mais curta é usando os operadores de incremento e decremento. A segunda
forma é utilizando os operadores de atribuição composta seguido dos operadores “+=” ou “-=” e do
valor 1. E a última forma é usando o operador de atribuição simples, seguida do valor da variável, do
operador aritmético “+” ou “–” e do valor 1.
248
10.2 Prefixo e Sufixo
Os operadores de incremento e decremento podem ser prefixo ou sufixo. Operador prefixo, vem antes
da variável e sufixo vem depois da variável. A Figura 10.3 apresenta um exemplo do operador de
incremento prefixo e sufixo, a mesma regra se aplica ao operador de decremento.
249
Figura 10.5 - Incremento sufixado e atribuição.
Exemplo prático
250
Figura 10.6 - Comportamento dos operadores de decremento e incremento prefixos e sufixos
251
Figura 10.7 – Comportamento do operador de incremento com laço while
Exemplo prático
252
Figura 10.8 - Operador de incremento com laço while.
Exemplo prático
253
Figura 10.9 - Operador incremento sufixo com laço while.
254
Figura 10.10 - Contagem regressiva de 10 a 0.
255
11 ESTRUTURA
DE REPETIÇÃO
FOR
256
11.1 Introdução
A instrução for é uma estrutura de repetição que permite repetir determinada ação um número de
vezes. A instrução for geralmente é chamada de laço for ou loop for. Já aprendemos como funciona
a sentença while, que também permite repetir uma determinada ação um número de vezes. Você deve
estar se perguntando: por que existe mais uma estrutura de repetição? Calma, cada estrutura é mais
apropriada para determinado problema.
O laço for é mais adequado para controlar laços controlados por contador, que são executados em um
intervalo específico. Dentro do laço for é possível iniciar o contador, condição da iteração e ainda
atualizar a variável contadora.
A sentença for executa um bloco de instruções um número fixo de vezes. O laço for se diferencia do
laço while porque as operações de controle do laço se situam em um só lugar, no cabeçalho da
instrução. Um exemplo da estrutura do laço for é apresentado na Figura 11.1
257
A variável de controle pode ser inicializada com qualquer valor e pode ser atualizada pelos operadores
de incremento e decremento, atribuição composta ou uma expressão utilizando o operador de
atribuição simples.
258
Exemplo prático
259
Exemplo prático
260
11.3 Intervalos diferentes
Os intervalos de incremento e decremento da variável de controle do laço podem ser qualquer valor
e não necessariamente sempre 1. Por exemplo, pode ser 5, 10, 20, -4 ou qualquer outro intervalo.
Exemplo prático
261
11.4 Laços aninhados
Um laço for pode possuir laços aninhados ou pode estar aninhado a outro laço. Por exemplo, um laço
for pode estar dentro de um laço while ou dentro de outro laço for, conforme apresentado na Figura
11.7.
Para cada iteração do laço externo, o laço interno é executado até que a condição de controle seja
falsa. No exemplo da Figura 11.8, a cada iteração do laço externo o laço interno é iterado 10 vezes.
O total de iterações do laço externo será 5 e do laço interno será 50 (5 x 10).
262
Exemplo prático laços aninhados
263
11.5 Escopo de bloco
A instrução for também é um bloco, as regras de escopo de bloco devem ser aplicadas. As variáveis
declaradas no cabeçalho e no corpo não podem ser acessadas por métodos externos. No exemplo da
Figura 11.10 o método Main (bloco externo) tenta acessar a variável “contador”. Um erro é gerado,
a variável “contador” pertence ao bloco interno, não pode ser acessa pelo bloco externo.
Blocos internos podem acessar as variáveis do bloco externo. No exemplo da Figura 11.11, o bloco
for (bloco interno) acessa a variável “numero” do método Main (bloco externo).
264
Na Figura 11.12, a instrução for (bloco interno) acessa a variável “i” da instrução for (bloco externo).
Figura 11.12 - Escopo de bloco laço for aninhado acesso a variável externa.
Na Figura 11.13, a variável “j” pertencente a instrução for (bloco interno) não pode ser acessada pela
instrução for (bloco externo).
Figura 11.13 - Escopo de bloco laço for aninhado acesso a variável interna.
265
12 ARRAY
UNIDIMENSIONAL
266
13.1 Introdução
Quando queremos guardar diversas informações, podemos fazer uso de arrays. Um array é uma
estrutura de dados que consegue armazenar uma série de dados ordenados, chamados elementos, que
podem ser localizados pelo índice. São úteis, quando trabalhamos com coleções de dados que
possuem um tamanho previamente definido. Um array unidimensional geralmente é chamado de
vetor.
Um array armazena muitos elementos do mesmo tipo, tais como vinte números inteiros, cinquenta
números de ponto flutuante ou quinze caracteres. Você pode definir qualquer tamanho e qualquer tipo
para um array. Um array pode conter, o nome dos alunos de uma sala, a temperatura de cada dia de
um mês, operações bancárias de um cliente e muito mais. Um array deve ser usado quando você
precisa armazenar um conjunto de informações do mesmo tipo.
Pense em arrays como um conjunto de variáveis do mesmo tipo e cada variável tem uma posição
dentro desse conjunto. Fazendo uma analogia entre um array e um trem, pense que o array é a
locomotiva e as variáveis são os vagões. A locomotiva para ser identificada precisa de um nome,
neste caso é o nome do array. Os vagões são identificados através de números inteiros, que
representam a posição de cada vagão, neste caso é a posição da variável no array. A numeração desses
vagões, começam em zero e vai até a quantidade de vagão menos um. Observe a analogia representada
na Figura 13.1.
267
13.2 Declaração de array
Assim como qualquer tipo de variável, um array também deve ser declarado antes de ser utilizado.
Um array é declarado de forma similar a uma variável, exceto que deve indicar o tamanho do array.
Para declarar um array, informe o tipo, abra e feche colchetes e por fim digite o nome. Por convenção
nomes de array podem ser escritos com a última palavra no plural. Um exemplo de declaração de
array é apresentado na Figura 13.2.
Exemplo prático
Digite no terminal o comando “dotnet new console -n “ArrayDeclaracao” para criar um programa.
Abra o programa no VS Code, copie o código da Figura 13.3 e inicie o debug. Observe que o array
não possui um tamanho definido e seu valor é null. O array precisa ser instanciado para que possa ser
utilizado.
268
Figura 13.3 - Declaração de array.
Instanciando um array
O array precisa ser instanciado para ser atribuído um valor. Instanciar é o processo de criar, de
concretizar algo que está declarado, mas não criado. Quando instanciamos um array montamos o
array na memória.
Para instanciar um array devemos inserir o operador de atribuição “=” seguido da palavra-chave
“new”, tipo do array e entre colchetes o tamanho do array.
269
Figura 13.4 –Declarando e Instanciando array
Exemplo prático
Copie o código da Figura 13.5, insira um breakpoint na linha 11 e inicie o debug. Observe a diferença
entre o array alunoNotas e a variável nota. No painel de debug o array é null, por enquanto a variável
nota possui o valor padrão zero. Isto acontece, porque os arrays precisam ser instanciados, por
enquanto, dados de tipos primitivos não precisam.
270
Copie o código da Figura 13.6 e inicie o debug. Observe que o array foi instanciado, o valor padrão
zero é atribuído aos elementos do array.
Figura 13.6 - Array do tipo int instanciando recebe o valor padrão zero.
Atribuição de valor
É possível atribuir valores ao arrays no momento da declaração, assim como é feito com as variáveis.
Para atribuir valores ao array, insira o valor entre chaves separados por vírgula. Um exemplo é
apresentado na Figura 13.7
Cada valor separado por vírgula, consiste em um elemento do array. Os elementos são inseridos no
array, pela ordem que são declarados entre as chaves, conforme apresentado na Figura 13.8.
271
Figura 13.8 - Posição dos elementos atribuídos ao array.
Exemplo prático
Copie o código da Figura 13.9, insira um breakpoint na linha 10 e inicie o debug. Observe no painel
de debug, que todos elementos do array foram preenchidos na ordem dos valores inseridos na
inicialização.
Sintaxe curta
Existe uma sintaxe mais curta, que pode ser usada quando os valores do array são atribuídos na
declaração. Nesta sintaxe, não é necessário inserir a palavra reservada new, tipo e tamanho. O
tamanho do array é determinado pela quantidade de elementos entre chaves. Observe a sintaxe na
Figura 13.10.
272
Figura 13.10 – Diferença entre sintaxe normal e curta de declaração de array.
Exemplo prático
Copie o código da Figura 13.11, insira um breakpoint na linha 10 e inicie o debug. O código é
executado com sucesso.
Tipos de dados
Os valores são atribuídos de forma diferente, conforme o tipo de dado. As mesmas regras de
atribuição aplicadas em atribuições de variáveis, também são aplicadas nos arrays. Por exemplo, para
atribuir um valor do tipo float é necessário utilizar a letra f no fim do número, aspas simples para
caractere, aspas duplas para string, etc.
273
Figura 13.12 - Tipos de dados em arrays
Exemplo prático
Copie o código da Figura 13.13, insira um breakpoint na linha 13 e inicie o debug. Observe os arrays
no painel de debug e os respectivos arrays no código.
274
Figura 13.14 - Atribuição por índice do array.
Exemplo prático
Copie o código Figura 13.15, insira um breakpoint na linha 15 e inicie o debug. Todos os elementos
recebem os valores atribuído de acordo com o índice, observe o painel do debug.
275
13.4 Acessando elementos por índice
Para obter o valor de um elemento do array, deve-se utilizar o índice do elemento. O índice se refere
a posição do elemento dentro do array, pense no índice como um endereço. Um elemento é localizado
pelo nome do array e índice, conforme apresentado na Figura 13.16.
Em alguns casos, podemos usar as informações de diferentes arrays e juntar essas informações. Desde
que, essas informações estejam alinhadas corretamente pelo índice. Por exemplo, no array
alunoNomes no índice 4 está o Igor e a nota referente ao Igor está no índice 4 do array alunoNotas.
Exemplo prático
Copie o código e execute o programa com o comando dotnet run. Observe no terminal que a nota
correspondente ao aluno Igor foi concatenada corretamente.
276
Figura 13.18 - Obtendo simultaneamente dados dos Arrays aluno Notas e alunoNomes
Exemplo prático
277
Figura 13.20 - Atribuição de array com laço for
Copie o programa da Figura 13.21, insira um breakpoint na linha 12 e inicie o debug. Observe o
debug do programa passo a passo.
278
Exemplo prático
279
Copie o código da Figura 13.23 e execute o programa com o comando “dotnet run”. O laço for itera
o array alunoNotas, este é o tipo de laço mais indicado para iterar arrays.
280
Figura 13.24 - Exercício resolvido palavra inversa
O foreach é uma estrutura mais simples para iterar um array, é apropriado para obter todos
elementos de um array. Não deve ser utilizado para atribuir um valor ao array, controlar
diretamente o índice ou manipular os dados de mais de um array simultaneamente . A
estrutura do array é apresentada na Figura 13.25.Figura 13.25
281
Figura 13.25 - Estrutura da instrução foreach.
Exemplo prático
Digite no terminal o comando “dotnet new console -n “ArrayForeach” para criar um programa. Abra
o programa no VS Code, copie o código da Figura 13.26, insira um breakpoint na linha 11 e inicie o
debug. A cada iteração a variável nota recebe um elemento do array AlunoNotas . Observe
o resultado no terminal.
282
Figura 13.26 - Array Foreach.
Se for necessário controlar dois arrays ao mesmo tempo, por exemplo, nome dos alunos
e nota, não tem como utilizar o foreach . Neste caso, o laço for é o mais indicado. Um
exemplo é apresentado na Figura 13.27.
283
Se tentar atribuir um valor a uma variável de iteração foreach, um erro será retornado. Observe o
exemplo da Figura 13.28
Figura 13.28 - Não é possível atribuir um valor a uma variável de iteração foreach.
284
Figura 13.29 - Exercício lista de presença resolvido.
285
Figura 13.30 - Lista de chamada do exercício lista de presença.
286
14 Métodos
287
14.1 Introdução
A maioria dos programas de computador resolvem problemas reais, esses programas são maiores do
que os programas apresentados até agora neste livro. Em todos exemplos apresentados, escrevemos
todo o nosso código dentro do método Main, isso não é aconselhável. Imagine um programa real
escrito dessa forma, seria impossível de mantê-lo. A experiência tem mostrado que a melhor maneira
de desenvolver e manter um grande programa, é construí-lo a partir de módulos, que são pequenas
partes de código. Em C#, os módulos são chamados de métodos ou classes, neste capítulo, falaremos
sobre métodos, que também são conhecidos pelo termo função. O nome método geralmente é usado
em programação orientada a objetos, enquanto o termo função é usado na programação procedural.
Como o C# é uma linguagem de programação orientada a objetos, devemos usar o termo método.
Até agora, usamos alguns métodos, que nos auxiliaram a desenvolver nossos pequenos programas.
Por exemplo, o método “WriteLine()” é um método da biblioteca do C#, usamos várias vezes para
escrever no console alguma mensagem ao usuário. Quando você chama um método como este, muito
código é executado, mas não precisamos conhecê-lo, porque as informações são abstraídas pelo
método. Imagine, toda vez que você precisar escrever no console, ter que escrever um monte de
código complexo, se preocupando com coisas como Fluxos de E/S de terminal, buffer de tela e
terminal, suporte Unicode do terminal e mais um monte de coisas. Por isto podemos usar os diversos
métodos que fazem parte da biblioteca do C#, ou escrever nossos próprios métodos.
288
Figura 14.1 - Métodos da calculadora
Para invocar um dos métodos, basta informar o nome, seguido dos argumentos e coletar o valor de
retorno se houver. A Figura 14.2 apresenta o código para invocar os métodos e coletar o retorno do
método.
289
As variáveis entre parênteses do método são chamadas de parâmetros e, os valores dentro dos
parênteses na invocação do método são chamados de argumentos.
Os argumentos inseridos entre os parênteses na invocação do método, são recebidos pelos parâmetros
do método. Os argumentos devem ser passados na ordem dos parâmetros e devem ser do mesmo tipo.
Neste exemplo, o parâmetro parcelaA recebe o valor 3 e o parâmetro parcelaB recebe o valor 8.
Quando um método é invocado, um valor pode ser retornado para instrução que o invocou. Este valor
pode ser armazenado em uma variável. No exemplo da Figura 14.5, o método Somar é invocado e
retorna uma valor, que é armazenado na variável resultado.
290
Figura 14.5 - Retorno do método.
14.3 Estrutura
A estrutura padrão do método, possui: tipo de retorno, nome, lista de parâmetros, corpo, palavra-
chave return e valor do retorno. A Figura 14.6 apresenta a estrutura padrão.
▪ Tipo de retorno: é o tipo de dado retornado pelo método ao invocador. Deve ser inserido
antes do nome da função;
291
▪ Nome: é o identificador do método, que deve corresponder a tarefa que o método faz. O
método é invocado pelo nome;
▪ Lista de parâmetros: é uma lista de variáveis, separadas por vírgula e são inseridas entre
parênteses. Ao invocar o método, os argumentos devem ser inseridos na mesma ordem dos
parâmetros e também devem ser do mesmo tipo dos parâmetros;
▪ Palavra-chave return: deve ser inserida antes do valor a ser retornado pelo método.
O método precisa ser invocado para ser executado. A estrutura padrão para invocar um método, possui
o nome do método, seguido de uma lista de argumentos separados por vírgula entre parênteses. A
estrutura é apresentada na Figura 14.7.
292
Figura 14.8 - Invocando método.
Exemplo Prático
Crie um programa, digite no terminal o comando “dotnet new console -n “MetodoSomar” para criar
um programa. Abra o programa no VS Code. Copie o código da Figura 14.9, insira um breakpoint na
linha 9 e inicie o debug. Os parâmetros do método recebem os valores passados como argumento na
invocação. No fim da execução do método, na linha 20, a variável soma já possui o resultado para
retornar. Quando o programa atinge o fim do método retorna o valor a quem o invocou.
293
Figura 14.9 - Método Somar
294
14.5 Definindo um método
Antes de escrever um método, é necessário defini-lo através de um conjunto de etapas, conforme
apresentado na Figura 14.10.
Neste problema vamos ilustrar o desenvolvimento de uma calculadora, porém vamos nos limitar
apenas na operação de divisão para simplificar o exemplo. A seguir são definidas as etapas de
definição do método:
295
• Erros: Divisor igual a 0 gera um erro.
O método apresentado na Figura 14.11 foi codificado seguindo a metodologia de definição de método.
A instrução if verifica se o valor do divisor é igual a zero, essa verificação é obrigatória porque
nenhum número pode ser dividido por zero. Se o divisor for igual a zero uma exceção será lançada
no sistema interrompendo o fluxo.
Exemplo prático
Digite no terminal o comando “dotnet new console -n “MetodoDividir” para criar um programa. Abra
o p