Prévia do material em texto
Programação Orientada a Objetos
Prof. Luiz Antonio Ferraro Mathias
GUIA DA
DISCIPLINA
1 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Objetivo:
A disciplina de Programação Orientada a Objetos (POO) tem como objetivo:
esclarecer os conceitos da linguagem de programação C#, utilizar as técnicas de
programação modular/estruturada, resolver problemas computacionais com uma visão
sistêmica, desenvolvendo programas de computador, além de propor o aprendizado
baseado em técnicas de programação orientada a objetos.
Introdução:
A programação é o processo de escrita, teste e manutenção de um programa de
computador. O programa é escrito em uma linguagem de programação, embora seja
possível, com alguma dificuldade, escrevê-lo diretamente em linguagem de máquina.
Diferentes partes de um programa podem ser escritas em diferentes linguagens e
programação.
Um programa de computador, por outro lado, se traduz em um conjunto de instruções
que descrevem uma tarefa a ser realizada por um computador. O termo pode ser uma
referência ao código fonte, escrito em alguma linguagem de programação, ou ao arquivo
que contém a forma executável deste código fonte.
As diversas linguagens de programação funcionam de diferentes modos, por esse
motivo, os programadores podem criar programas muito diferentes para diferentes
linguagens; muito embora, teoricamente, a maioria das linguagens possa ser usada para
criar qualquer programa.
A Programação Orientada a Objetos (POO) é um modelo de análise, projeto
e programação de software baseado na composição e interação entre diversas unidades
chamadas de “objetos”. Os programas são arquitetados através de objetos que interagem
entre si.
2 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
1. FUNDAMENTOS DA COMPUTAÇÃO E PROGRAMAÇÃO
1.1. O computador
Do ponto de vista do usuário, ou seja, daquele que apenas faz uso do computador, ele
é apenas uma máquina, isto é, um dispositivo eletrônico construído pelo homem, com o
objetivo de auxiliá-lo na execução de suas tarefas. É uma máquina (hardware) que pode
ser programada (software), apresentando as seguintes habilidades:
a) Armazenar informações;
b) Organizar essas informações;
c) Manipular informações gerando novas;
d) Comparar informações e em função dessa comparação, decidir;
e) Efetuar cálculos matemáticos.
Este conjunto de atividades que pode ser executada pelo computador recebe o nome
de processamento de informações ou processamento de dados. Existem 3 (três) tipos
básicos de informações que podem ser trabalhadas pelo computador entre as quais existe
uma grande diferença:
I. Informações numéricas: podem sofrer cálculo matemático. Exemplos: idade de
uma pessoa, tamanho da base de uma figura geométrica e salário de um
funcionário
II. Informações alfanuméricas: não podem sofrer cálculo matemático. Exemplos:
nome de uma pessoa, bairro de uma cidade, descrição de um produto, endereço
de e-mail e telefone
III. Informações lógicas: podem assumir apenas dois estados ou valores.
Exemplos: verdadeiro ou falso, ligado ou desligado, true ou false, on ou off, 0 ou
1, V ou F.
3 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Existem ainda outros tipos de dados que envolvem datas e moedas, tratadas por
poucas linguagens de programação. Mas como regra geral os três tipos acima são comuns
a praticamente todas as linguagens de programação existentes.
Uma discussão um pouco mais detalhada sobre os tipos básicos de dados existentes
e, utilizados pelo computador, será realizada oportunamente ao longo deste material
Apesar da aparente “inteligência” dos computadores, estes precisam de
instruções detalhadas para executarem a mais simples tarefa. Estas instruções
estão inseridas no computador em várias camadas, sendo as de mais baixo
nível responsáveis pelas operações mais básicas e as de alto nível as que
executam os trabalhos mais sofisticados.
1.2. A programação do computador
O computador é uma máquina programável, ou seja, adaptável às necessidades do
homem. A técnica para realização desta adaptação chama-se programação. Esta
programação do computador, por sua vez, consiste em se colocar na memória da máquina,
palavras ou símbolos gráficos que serão compilados e entendidos como ordens e, portanto,
executados, desde que seja possível a execução. Existem diferentes conjuntos de palavras
que podem ser entendidas e executadas pelo computador. Cada um desses conjuntos é
chamado de Linguagem de Programação. Existem diferentes linguagens de programação
disponíveis para utilização, cada uma das quais conhecida por um nome específico. Desta
forma temos o C#, C++, Visual Basic, ASP, Java, PHP, Python etc.
4 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Cada uma destas linguagens possui características próprias, utilizadas para
aplicações específicas. Temos ainda nestas linguagens palavras diferentes para execução
de uma mesma função, e cada uma destas palavras utilizada na programação do
computador terá por objetivo executar uma tarefa específica conforme exemplificado
abaixo.
As palavras (instruções/comandos) têm por função a execução tarefas similares,
como por exemplo, receber uma informação via teclado. Ao iniciar seu trabalho, o
desenvolvedor (programador) define a linguagem pela qual deseja executar suas
atividades. Isto é feito introduzindo-se um conjunto de programas (instruções) que fazem o
computador passar a “entender” os comandos específicos da linguagem que será utilizada.
O arquivo contendo as instruções preparadas pelo programador é conhecido por arquivo
fonte ou código fonte.
As linguagens de programação podem ser:
a) Alto nível: linguagem de programação mais próxima sintaticamente da linguagem
do ser humano. Tem como característica principal, a facilidade de entendimento e
a comodidade na programação.
b) Baixo nível: próxima da linguagem de máquina, por isso, mais difícil de ser
interpretada por nós e, também, de ser programada.
1.3. Compilação
Uma vez projetado a solução lógica (fluxogramas) e escrito o programa em um papel,
deve-se começar o processo de introduzir o programa em um arquivo no disco rígido do
computador. A introdução e a modificação do programa em um arquivo são feitas utilizando-
se um editor de texto, que é um programa que contém as características necessárias para
a digitação e gravação dos seus aplicativos e, também, permite a correção e manutenção,
quando necessário. A aprendizagem de como utilizar um editor de textos torna muito mais
fácil a tarefa de introduzir o programa. No caso específico do editor de programas para o
Visual C#, você verá que existem inúmeros recursos que facilitarão a nossa vida de
digitador. Estes programas escritos em Visual C# estão codificados em linguagem de alto
nível, projetadas para facilitar a programação.
5 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Um computador não entende as linguagens de alto nível, portanto, um programa
escrito em linguagem de alto nível precisa ser traduzido para linguagem de máquina. A
tradução de um programa escrito em linguagem de alto nível, como C#, para uma
linguagem que o computador possa entender faz-se através de outro programa, conhecido
como compilador.
O compilador faz a função de um tradutor em nosso dia a dia, ou seja, ele lê os códigos
em linguagem de alto nível e traduz para linguagem de máquina. Comodamente, se algum
erro existir em nosso código fonte, o compilador nos avisará e evidentemente abortará a
tradução, até que tenhamos codificado o programa com a sintaxe correta.Vale a pena
salientar que o compilador é um programa e que também só entende uma linguagem para
tradução, ou seja, para cada linguagem existe um compilador próprio.
É chamado de código objeto o programa gerado a partir do processo de compilação,
ou seja, este código não está legível para nós e sim para a máquina. Este é o programa
que será executado pelo computador. As relações em tempo de compilação e de execução
dos códigos C# estão detalhadas na figura 1 abaixo.
Figura 1: Relações em tempo de compilação e de execução dos códigos C#.
1CLI (Common Language Infrastructure) da Microsoft. Um padrão internacional que é
a base para a criação de ambientes de execução e de desenvolvimento nos quais
linguagens e bibliotecas funcionam de forma integrada.
6 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Com base nos esclarecimentos prestados acima, podemos considerar, no
desenvolvimento e processamento de programas de computador, 3 (três) tipos distintos de
códigos, a saber:
a) Código fonte – programa gerado pelo desenvolvedor (programador) – codificado
em uma linguagem de programação de alto nível.
b) Código objeto – programa gerado a partir do processo de programação, não
legível para nós e sim para a máquina.
c) Código executável – programas executáveis gerados a partir do código objeto
1.4. O Visual Studio .NET
O Visual Studio é um IDE – Integrated Development Environment (Ambiente de
Desenvolvimento Integrado) que permite ao desenvolvedor utilizar uma ou várias das
linguagens disponíveis para criar seus programas. A Microsoft disponibiliza 3 (três) versões
do IDE do Visual Studio: Community; Professional; e Enterprise. Estas diferentes versões
possuem recursos específicos que podem ser importantes dependendo do profissional ou
da empresa que a irá utilizá-las. Detalhes e componentes destas diferentes versões podem
ser encontrados no site da Microsoft no endereço https://visualstudio.microsoft.com/pt-
br/downloads/.
1.4.1. O que é o .NET Framework
O .NET Framework é um conjunto de programas rotinas e componentes, que são
integrados ao sistema operacional com o objetivo de permitir o desenvolvimento e a
execução de programas criados a partir da plataforma .NET ou outra plataforma que deseje
utilizar os componentes .NET Framework.
O .NET Framework permite a criação de aplicativos para serem utilizados em
“Ambiente Windows”, diretamente na Web, em Dispositivos móveis e em aplicativos do
pacote Office. Possui dois componentes principais: Common Language Runtime (CLR) e
Biblioteca de Classes.
https://visualstudio.microsoft.com/pt-br/downloads/
https://visualstudio.microsoft.com/pt-br/downloads/
7 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
1.4.1.1. O Common Language Runtime CLR
É a base do .NET, fornece os principais serviços de gerenciamento de memória de
arquitetura de comunicação de segurança, de compilação e outros. Em especial é
importante destacar o serviço de gerenciamento de memória utiliza o GC – Garbage
Collection (coletor de lixo), um componente que de tempos em tempos varre a memória do
computador identificando e limpando dados que não são mais utilizados.
A constante limpeza da memória, evita que o programador tenha que constantemente
utilizar comandos para limpar a memória do sistema ou que, em caso de não existirem
estes comandos, o usuário tenha que constantemente reiniciar o computador. Reiniciar o
computador além de ser uma operação bastante desagradável é muito custoso em
dispositivos portáteis (que na verdade nunca são desligados e sim hibernados) e em
servidores de rede.
1.4.1.2. A Biblioteca de Classes
É uma coleção de objetos (programas), reutilizáveis e compartilháveis que podem ser
utilizados pelo programador para facilitar o desenvolvimento de seus aplicativos.
1.4.2. O que é o C#
O C# é uma das linguagens integrantes do Visual Studio. É uma linguagem voltada a
objetos que tem suas raízes na linguagem C.
8 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
1.4.3. Máquina Virtual
Em uma linguagem de programação como C e Pascal, temos a seguinte situação
quando vamos compilar um programa: O código fonte é compilado para código de máquina
específico de uma plataforma e sistema operacional. Muitas vezes o próprio código fonte é
desenvolvido visando uma única plataforma.
Esse código executável (binário) resultante será executado pelo sistema operacional
e, por esse motivo, ele deve saber conversar com o sistema operacional em questão. Isto
é, temos um código executável diferente para cada sistema operacional diferente.
Precisamos reescrever um mesmo pedaço da aplicação para diferentes sistemas
operacionais, já que eles não são compatíveis.
O C# utiliza o conceito de máquina virtual. Entre o sistema operacional e a aplicação
existe uma camada extra responsável por "traduzir" — mas não apenas isso — o que sua
aplicação deseja fazer para as respectivas chamadas do sistema operacional onde ela está
rodando no momento.
Uma máquina virtual é um conceito bem mais amplo que o de um interpretador. Como
o próprio nome diz, uma máquina virtual é como um "computador de mentira": tem tudo que
um computador tem. Em outras palavras, ela é responsável por gerenciar memória, threads,
a pilha de execução etc.
1.4.4. Como um programa C# é executado
A arquitetura .NET apresentada no Microsoft Visual Studio, utiliza os mesmos
conceitos da tecnologia JAVA que converte os programas por intermédio do JIT (Just In
Time Compiler). Um programa desenvolvido em C# é convertido para uma linguagem
Assembly, através de um compilador chamado MSIL (Microsoft Intermediate Language),
que é capaz de gerar arquivos dos tipos:
9 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
a) EXE – Arquivos Executáveis, (Programas que podem ser executados diretamente
nos computadores)
b) DLL – Biblioteca de link Dinâmico que são funções que podem ser utilizadas por
diversos programas.
c) ASPX – Páginas Webs (Programas que podem ser executados diretamente na
World Wide Web – Páginas Web, Aplicações Web e Serviços Web).
d) ASMX – Rotinas que podem ser instaladas em Servidores Web .
e) Programas para serem utilizados em Windows Phone.
No momento da execução do programa ele é novamente compilado, desta vez pelo
compilador JIT de acordo com o dispositivo e o ambiente em que ele será executado.
1.4.5. Visual Studio C#
O Visual Studio é a plataforma da Microsoft destinada a desenvolvedores que
trabalham com a linguagem de programação C# e com o framework. Ele conta com uma
IDE (Integrated Development Environment) que permite o desenvolvimento de programas
em diversas linguagens (figura 2) e interfaces (aplicações console, windows, web etc.).
Nesse curso escreveremos todo o código utilizando o Visual Studio Comunity, a
versão gratuita da ferramenta de desenvolvimento de aplicações, que é distribuída pela
própria Microsoft. Apesar das explicações serem feitas com base na versão Comunity, tudo
funcionará da mesma forma dentro das versões pagas da ferramenta. O Visual Studio
Comunity pode ser encontrado no site: https://visualstudio.microsoft.com/pt-br/downloads/.
Dúvidas a respeito da instalação podem ser esclarecidas no site:
https://docs.microsoft.com/pt-br/visualstudio/install/install-visual-studio?view=vs-2022
A versão que utilizaremos neste material é a Visual Studio Comunity 2017, todavia, as
mesmas aplicações podem ser executadas em versões mais recente como a 2022. Durante
a instalação do Visual Studio, o .NET Framework também será, automaticamente, instalado
na máquina, então ela estará pronta paraexecutar as aplicações escritas em C#.
https://visualstudio.microsoft.com/pt-br/downloads/
https://docs.microsoft.com/pt-br/visualstudio/install/install-visual-studio?view=vs-2022
10 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Figura 2: Ambiente de desenvolvimento integrado do Visual Studio C#.
Um exemplo de programa codificado na linguagem C# (console application) é exposto
na figura 3 abaixo.
Figura 3: Exemplo de aplicação tipo “console” em linguagem C#.
11 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Quando queremos um programa que trabalha com o terminal do sistema operacional,
precisamos criar um tipo diferente de projeto no Visual Studio, o Console Application. Para
criarmos a aplicação que usa o terminal, devemos escolher o Console Application na janela
do assistente do Visual Studio.
Quando criamos uma aplicação deste tipo, o Visual Studio cria um projeto com uma
classe que contém um método (este assunto será tratado oportunamente no material)
chamado “Main”. É esse método que será executado quando pressionarmos a tecla “F5”
para rodar o programa. Os exemplos de código C# deste material são aplicações do tipo
Console Application.
1.5. Inicializando o C# no IDE do Visual Studio
Antes da inicialização do Visual Studio é importante verificar se este foi instalado
corretamente no computador. Conforme exposto anteriormente, nesse curso escreveremos
todo o código utilizando o Visual Studio Comunity, a versão gratuita da ferramenta de
desenvolvimento de aplicações, que é distribuída pela própria Microsoft. O Visual Studio
Comunity pode ser encontrado no site: https://visualstudio.microsoft.com/pt-br/downloads/.
1.5.1. Utilizando o Visual Studio
Para iniciar o Visual Studio, basta, no Menu Iniciar procurar o item “Visual Studio
2017” ou versão posterior, que será inicialmente fornecida a Tela de Splash abaixo (figura
4):
Figura 4: Tela de inicialização do Visual Studio.
https://visualstudio.microsoft.com/pt-br/downloads/
12 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Após a tela de Splash, surgirá a Página Inicial (figura 5) do Visual Studio, com diversas
opções, dentre elas a que permite que sejam abertos programas já criados anteriormente.
Figura 5: Página inicial do Visual Studio.
Caso se deseje criar um programa, tratado pelo Visual Studio como Projeto, basta
clicar em “Arquivo” e no Menu suspenso que surgir escolher “Novo” e no Novo Menu
suspenso escolher “Projeto” (figura 6).
Figura 6: Tela de criação de um novo programa.
13 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Na tela Novo Projeto, basta escolher o Visual C#, em suas opções escolher “Área de
trabalho clássica do Windows e na relação de aplicativos escolher “Arquivo de Console
(.NET Framework)”, conforme figura 7.
Figura 7: Seleção do tipo de “aplicativo de console”.
Observação: Aplicativos de Console (Console Application) são utilizados para criar
aplicativos de linha de comando, utilizando o Prompt do Windows, não tendo, portanto,
uma interface visual. A vantagem deste tipo de programação é ser leve e não desviar a
atenção do programador para a implementação da interface, fazendo com que ele se
concentre nos comandos e no comportamento do programa.
14 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
1.5.1.1. Como “salvar” o Projeto
A exemplo de qualquer trabalho de computador, antes de iniciar a sua
implementação, inclusive antes de clicar na Área de Programação, é recomendado salvar
o projeto. É interessante que seja criado uma pasta, no computador, para armazenar todos
os arquivos de maneira que esta pasta seja facilmente enviada e copiada para os diferentes
computadores que serão utilizados durante o desenvolvimento. Para tanto, a sugestão é
que na tela “Novo projeto”, conforme figura anterior, os dados para salvar (na parte inferior
da tela) sejam alterados conforme a seguir:
Nome: Ex01
Local: c:\Users\Nome_usuario\desktop (Área de trabalho)
Nome da Solução: Ex01 (já é sugerido automaticamente igual ao nome)
Figura 8: Tela para salvar o nome do projeto.
1.5.1.2. Elementos da área de programação do IDE do Visual Studio
Após realizar as operações do item anterior, será aberto o “Ambiente de
Desenvolvimento do C#” com aspecto conforme abaixo (figura 9):
Figura 9: Ambiente de desenvolvimento do C#.
15 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Observações:
a) Todas as seções de um programa em C# iniciam com chave de abertura “{“ e
fechamento com chave de fechamento “}”.
b) Após o nameespace seguido do nome do programa existe uma chave { abrindo o
programa que é fechada no final do programa }.
c) Após a class program, existe uma chave { abrindo a classe que é fechada na
penúltima linha do programa }.
d) Após a declaração do método Main – static void Main(string[] arg), existe uma
chave de abertura “{“ e todos os comandos que o programador for escrever
deverão estar após esta chave e antes da chave de fechamento “}” que facha o
método.
e) Durante a programação o usuário também deverá colocar chaves conforme será
orientado nas aulas seguintes.
Figura 10: Ambiente de desenvolvimento do C#.
Os “using systens” definem as classes
externas que serão utilizadas pelo C#.
Nesta primeira parte do curso, serão
utilizadas somente as classes definidas pelo
C#, entretanto, o programador pode criar suas
próprias classes.
“name space” é o nome do programa.
“class Program” será utilizado futuramente
quando se utilizar o conceito de classes.
Declara o método Main. A palavra void
declara que não estão sendo passados
valores
Os comandos devem ser escritos entre os
chaves (chave de abertura { e de fechamento
}.
16 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
1.5.1.3. Execução do programa
Conforme exposto anteriormente, o computador só entende linguagem de máquina,
ou seja, sinais elétricos. Com objetivo de facilitar a interpretação destes sinais elétricos pelo
computador, decidiu-se que se trabalharia unicamente com dois tipos de sinais ligado e
desligado (que eletricamente constitui-se em “com tensão elétrica” e “sem tensão elétrica”).
Para facilitar, as informações destes dados para o computador, decidiu-se utilizar o
valor 1 para ligado e o valor 0 para desligado. Então, qualquer que seja o programa, para
que ele passe instruções ao computador ele precisa fornecer conjuntos de zeros (0) e uns
(1), portanto, mesmo uma linguagem de programação de alto nível, como é o caso do C#,
em última análise precisa fornecer ao computador conjuntos de zeros (0) e uns (1).
No caso do C#, o programa gerado pelo desenvolvedor, que tem o nome de
programa fonte, e tem a extensão “cs”, não é um conjunto de zeros (0) e uns (1) e, portanto,
precisa ser convertido para ser executado. Desta forma, a execução de um programa criado
em C# pode ser feita de duas maneiras:
I. Dentro do ambiente do C#.
Neste caso o próprio arquivo de extensão “cs” sofre um processo chamado de
“debug”, e caso não existam erros o programa será “debugado” e executado
imediatamente. A operação de debug pode ser disparada das seguintes maneiras:
a) Escolhendo no menu Debug (Depurar) o item “Start debug” (Iniciar depuração);
b) Digitando a tecla F5;
c) Clicando na seta “Start debugging” (iniciar) da Barra de Ferramentas.
17 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
II.Fora do Ambiente C#.
Neste caso o arquivo “cs” será compilado, gerando um arquivo executável. Este
arquivo executável pode ser executado em qualquer computador que possua o .NET
Framework instalado. Em versões anteriores, para gerar o programa executável, é
necessário utilizar a Build Solution, nas novas versões existe a possibilidade de gerar um
pacote inteiro que será apresentado em outras oportunidades.
1.5.1.4. Erros durante a operação de “debug”
A operação de debug irá conferir o programa com objetivo de verificar se existem
erros de sintaxe (erros na escrituração dos comandos). Caso existam erros, o processo é
interrompido e surge para o usuário o Quadro de Mensagens abaixo (figura 11).
Figura 11: Tela de erro durante a operação de “debug”.
Ao receber o quadro de mensagem o desenvolvedor já sabe que seu programa
apresenta um erro, portanto ele precisa procurar o erro. Para procurar o erro ele deve
clicar o botão “Não” (para interromper a compilação) e verificar na parte inferior da tela
as mensagens que dão as informações necessárias para que o usuário concerte o erro. As
mensagens deverão ser algo como a figura 12 abaixo, onde é informado:
Figura 12: Mensagens de erro durante a operação de “debug”.
18 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
• A descrição de erro (no exemplo, é esperado um ;).
• O nome do arquivo (no exemplo Program.cs).
• A linha em que o erro foi encontrado (no exemplo linha 16).
• A coluna que o erro foi encontrado (no exemplo a coluna 39).
• O nome do projeto (no exemplo Ex01).
1.6. A importância da Lógica Computacional
A Lógica Computacional tem por objetivo estabelecer técnicas e critérios gerais de
programação do computador visando à execução de atividades específicas, maximizando
a utilização dos recursos do computador, utilizando procedimentos claros, de fácil
entendimento, minimizando a quantidade de memória e o tempo de execução dessas
atividades.
A Lógica Computacional independe das linguagens. Qualquer que seja a linguagem
utilizada existe uma sucessão de instruções que devem ser dadas ao computador para que
ele execute a tarefa desejada. Por esta razão a Lógica será estudada independentemente
de qualquer linguagem. Para isto, a Lógica será desenvolvida, utilizando figuras
geométricas para representar as várias instruções a serem dadas ao computador e,
também, através de pseudocódigos. O conjunto de instruções representadas por figuras
geométricas é denominado Fluxograma. Apresentamos abaixo, um fluxograma, mostrando
a existência de figuras geométricas encadeadas, cada uma representando uma instrução.
Os conceitos que norteiam a utilização de fluxogramas e pseudocódigos serão
gradativamente explicados ao longo do texto. Na figura 13 é apresentado um exemplo de
fluxograma
19 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Figura 13: Exemplo de fluxograma da solução lógica de um problema.
1.6.1. A representação do raciocínio lógico através de fluxogramas
Os fluxogramas procuram representar os algoritmos de uma forma visual, auxiliando
o programador a raciocinar. A partir deles é possível construir programas com facilidade
independente da linguagem de programação que está sendo utilizada. São formados a
partir de linhas, setas e figuras geométricas. As linhas e setas representam o fluxo, ou seja,
a sequência que o programa deve seguir. As figuras são utilizadas para representar os
comandos. Cada comando característico possui uma figura de forma peculiar. No final
deste material o aluno pode encontrar a lista de figuras utilizadas nos fluxogramas e seus
significados.
INICIO
P/ I = 1
ate 100
M = I * 3
M
FIM
20 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
1.6.2. Regras para utilização de fluxogramas
a) Todo elemento de um fluxograma deve ter apenas uma entrada e pelo
menos uma saída. (exceto os de Início, Fim e os de conexão);
b) Os traços que ligam os elementos (símbolos gráficos) devem ser sempre
horizontais ou verticais e representam o fluxo lógico de execução do
programa;
c) Um fluxograma tem apenas um Início e um Fim;
d) O sentido do fluxo da informação não pode retornar para cima, a menos que
esteja sendo usado um comando específico para este fim;
e) Nas caixas de decisão marcar pelo menos uma saída com “S” ou “N” de
acordo com o caso;
f) As linhas de um fluxograma jamais devem se cruzar se não for em um nó de
ligação;
g) Nunca utilize uma linha de retorno de laço para introduzir instruções.
21 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
2. VARIÁVEIS, OPERADORES E EXPRESSÕES
2.1. Instruções
Des
Uma outra regra também muito importante é que a linguagem C# diferencia os
caracteres minúsculos dos maiúsculos (Case Sensitive) e suas instruções devem ser
codificadas como definidas. Por exemplo, a instrução “Console.WriteLine("O casal nota
10!");” deverá ser digitada exatamente com esses caracteres, se não, ocorrerá erros de
compilação. Veja a figura 14 com a observação sobre o erro ao encontrar a palavra
“console”, mas iniciando com um caractere minúsculo.
Figura 14: Recurso do “case sensitive” do Visual Studio C#.
Para evitar erros desta natureza, sugere-se a utilização da técnica da codificação com
o recurso “IntelliSense“ que o framework disponibiliza para você. O “IntelliSense” é uma
ajuda de preenchimento de código que inclui inúmeras funcionalidades: Listar Membros,
22 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Informações do Parâmetro, Informações Rápidas e Completar Palavra. Essas
funcionalidades ajudam você a aprender mais sobre o código que está usando, a manter o
acompanhamento dos parâmetros que está digitando e a adicionar chamadas a métodos e
propriedades pressionando apenas algumas teclas. Veja o exemplo na figura 15 e
experimente você também.
Figura 15: Recurso “IntelliSense” do Visual Studio C#.
2.2. A memória do computador
Para que o computador possa processar dados, se faz necessário que eles estejam
armazenados na memória do computador. Esta memória pode ser entendida como um
conjunto de pequenos “pedaços”, cada um identificado por um número distinto conhecido
por endereço. Este endereço permite que as informações armazenadas na memória da
máquina sejam facilmente localizadas.
Cada uma destes “pedaços” ou endereços é conhecido por byte (figura 16). Neles
podemos armazenar um caractere gráfico qualquer, isto é, uma letra, símbolo ou sinal
gráfico. Cada byte é composto por um agrupamento de oito bits (menor memória
endereçável de um computador e menor unidade de armazenamento), numerados em
ordem decrescente de 7 (sete) até 0 (zero). Por sua vez cada bit é capaz de armazenar
uma informação binária (0 ou 1). Este armazenamento pode ser feito fisicamente através
23 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
de diferença de polaridade elétrica, diferença de nível de tensão, polaridade magnética e,
no caso de mídias óticas, marcas em uma superfície reflexiva.
Figura 16: Representação esquemática de um byte de memória no computador.
A memória do computador é dividida em regiões distintas, dentre as quais, podemos
destacar a memória “RAM” (Random Access Memory). Trata-se de uma memória de
acesso randômico ou aleatório), estando permanentemente disponível ao usuário do
computador, permitindo que nesta sejam gravados, lidos ou apagados dados existentes. É
nesta memória que estão armazenados os dados e programas passíveis de
processamento, e comoconsequência disto, as informações podem ser modificadas
continuamente a qualquer momento. Na figura 17 abaixo, é apresentado um exemplo de
armazenamento de informação na memória RAM do computador.
F A C U L D A D E
Figura 17: Esquema de um trecho da memória interna do computador
Conforme esclarecido anteriormente, cada célula de memória pode armazenar um
caractere, símbolo ou dígito. Neste exemplo a literal “FACULDADE” está ocupando 9 (nove)
células ou bytes de memória do computador.
2.3. Tipos de dados
Dentre as habilidades existentes no computador citadas anteriormente, o
processamento realizado pela máquina permite a manipulação de informações contidas em
sua memória, as quais são representadas através de diferentes tipos de dados.
Destacaremos os dados de acordo com a informação que pode ser contida neles.
Bit
7
Bit
4
Bit
5
Bit
6
Bit
2
Bit
3
Bit
0
Bit
1
BYTE
24 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
2.3.1. Dados literais numéricos
São caracterizados por dados que podem sofrer operações matemáticas, podendo ser
divididos em:
a) Dados numéricos inteiros: não possuem componentes decimais ou fracionários
podendo ser positivos ou negativos. Exemplos:
Tipo Exemplo
número inteiro positivo 38
número inteiro 0
número inteiro negativo -5
b) Dados numéricos reais: são aqueles possuem componentes decimais ou
fracionários, e, também, podem ser positivos e negativos. Exemplos:
Tipo Exemplo
Número real com uma casa decimal 1.5
Número real positivo com 2 casas decimais 19.02
Número real positivo sem casas decimais 893.
Número real negativo com uma casa decimal -20.8
Número real em notação científica 1.4E-5 (Ou seja: 1.4 * 10-5)
Nota: Normalmente as linguagens de programação adotam o ponto (.) como separador
decimal. Algumas linguagens, por outro lado, permitem que o programador escolha o
separador decimal entre o ponto e a vírgula. Linguagens como C++, C#, Java, dentre
outras, adotam o ponto sem possibilidade de escolha.
2.3.2. Dados literais alfanuméricos
Os dados do tipo literal são caracterizados por uma sequência de caracteres contendo
letras, símbolos e/ou dígitos. É também conhecido como alfanumérico, cadeia de
caracteres ou “string”. As informações alfanuméricas não podem sofrer operações
matemáticas, mas podem sofrer operações lógicas como será visto adiante. Exemplos:
25 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Tipo Exemplo
“Unisanta” Literal de comprimento 8
“ ” Literal de comprimento 1
“123456” Literal de comprimento 6
“0” Literal de comprimento 1
“AbCdEfGh” Literal de comprimento 8
“1+3+4=8” Literal de comprimento 7
Como apresentado nos exemplos acima, o símbolo “ (aspas) é utilizado
para representar dados do tipo literal. As aspas simples também podem ser utilizadas
para o mesmo fim, desde que uniformemente em todo documento.
O computador é uma máquina eletrônica que somente trabalha com informações
elétricas que são externamente representadas por 0 e 1. Por esta razão todas as
informações são tratadas e convertidas para o sistema binário para que possam ser
operadas internamente. Quando o computador opera com letras ou sinais gráficos, esta
transformação para binário não pode ser efetuada. Para resolver este problema, as letras,
os sinais gráficos e os algarismos são transformados em um código numérico de acordo
com uma tabela denominada “tabela ASCII” (American Standard Code for International
Interchange), de uso generalizado, código este que é então convertido para binário para
que possa assim ser armazenado na memória.
32 - 48 - 0 64 - @ 80 - P 96 - ` 112 - p
33 - ! 49 - 1 65 - A 81 - Q 97 - a 113 - q
34 - “ 50 - 2 66 - B 82 - R 98 - b 114 - r
35 - # 51 - 3 67 - C 83 - S 99 - c 115 - s
36 - $ 52 - 4 68 - D 84 - T 100 - d 116 - t
37 - % 53 - 5 69 - E 85 - U 101 - e 117 - u
38 - & 54 - 6 70 - F 86 - V 102 - f 118 - v
39 - ´ 55 - 7 71 - G 87 - W 103 - g 119 - w
40 - ( 56 - 8 72 - H 88 - X 104 - h 120 - x
41 - ) 57 - 9 73 - I 89 - Y 105 - i 121 - y
42 - * 58 - : 74 - J 90 - Z 106 - j 122 - z
43 - + 59 - ; 75 - K 91 - [ 107 - k 123 - {
44 - , 60 - < 76 - L 92 - \ 108 - l 124 - |
45 - - 61 - = 77 - M 93 - ] 109 - m 125 - }
26 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
46 - . 62 - > 78 - N 94 - ^ 110 - n 126 - ~
47 - / 63 - ? 79 - O 95 - _ 111 - o
Tabela 1: Tabela ASCII.
Com esta tabela, as letras estão colocadas respeitando a ordem alfabética,
o computador é capaz de comparar informações alfanuméricas. O computador “sabe” que
uma letra antecede outra na ordem alfabética quando seu código ASCII é menor. Observe
a tabela acima e verifique que o código de A é 65 enquanto de B é 66 o que garante para
o computador que A antecede B na ordem alfabética. Quando as informações contêm mais
de uma letra esta comparação também é possível. O processo dar-se-á através da
comparação de letra e letra, a partir da primeira, até concluir a que é anterior na ordem
alfabética.
2.3.3. Dados lógicos
O tipo de dado lógico é utilizado para representar dois estados, dois valores lógicos
possíveis: verdadeiro e falso. Os dados lógicos são também conhecidos e chamados de
booleanos, menção feita ao matemático George Boole. Exemplo:
Tipo Exemplo
.V. Valor lógico verdadeiro
.F. Valor lógico falso
True Valor lógico verdadeiro
False Valor lógico falso
Sim Valor lógico verdadeiro
Não Valor lógico falso
1 Valor lógico verdadeiro
0 Valor lógico falso
Diferentemente das variáveis matemáticas, as variáveis nos computadores
não são delimitadas por + e - , mas possuem limites finitos máximos e
mínimos dependendo de cada tipo. Esta limitação é devida à quantidade de
bytes que cada tipo de variável pode ocupar na memória.
27 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Hierarquia dos Tipos de Dados
2.4. Variáveis de memória
Uma variável representa uma região de memória (endereço) que poderá alocar
(armazenar) valores durante a execução do programa. Cada um destes endereços de
memória será identificado por um nome, denominado variável. Portanto, em uma variável,
você poderá armazenar diferentes valores durante a execução do programa, mas
evidentemente, não ao mesmo tempo.
Variáveis são como caixas na memória que podem armazenar um valor. A linguagem
C# tem muitos tipos de valores que podem ser armazenados e processados, entre eles:
inteiros, reais, strings (conjunto de caracteres) etc. Declaramos o tipo da variável seguido
de seu nome em uma única instrução, por exemplo: int idade;
Neste caso, temos uma variável de tipo inteiro, denominada idade (identificador). O
tipo de variável “int” é o nome de um dos tipos primitivos da linguagem C#, que representa
um valor inteiro, ou seja, sem ponto flutuante (casas decimais).
Curto
Inteiro Médio
Longo
Numérico
Baixa precisão
Real Média precisão
Alta precisão
Principais
String
Tipos de Dados Alfanumérico
Caractere
Lógico
28 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
O processo de armazenamento de dados na memória do computador pode ocorrer de
principalmente duas formas: através da instrução de atribuição ou através da instrução que
permita ao computador receber uma informação via teclado.
2.4.1. Instrução de atribuição
Esta instrução considerada uma das mais importantes dentre as várias entendidas
pelo computador, consiste em disponibilizar na memória do computador uma informação
para que ele possa processá-la e que ela esteja constantemente disponível paraacesso
por parte deste. A instrução de atribuição é representada da seguinte forma:
<identificador literal> = <informação>
<Identificador literal> geralmente chamado de variável
= operador de atribuição
<informação> qualquer dado a ser armazenado na memória do computador
Exemplos:
x = 20, onde X é uma variável numérica
cidade = “Santos”, onde ‘cidade’ é uma variável alfanumérica
No exemplo acima foram definidas duas variáveis (identificadores literais) as quais
armazenam respectivamente as informações: numérica (20) e alfanumérica (“Santos”).
Ao interpretar a instrução de atribuição, o computador automaticamente localiza em
sua memória um espaço livre para armazenar a informação, passando ela a ser identificada
pela variável a qual possui relacionado o endereço de memória da informação.
2.4.1.1. Propriedades da instrução de atribuição
a) A Instrução de Atribuição pode armazenar resultado de operações (expressões):
Atribuição Efeito da atribuição realizada
A = 3 atribuindo-se o valor 3 à variável A
29 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
B = 5 atribuindo-se o valor 5 à variável B
C = A * B atribuindo-se o resultado do produto de A por B (15) à variável C
Ou seja, armazenamos no endereço de memória representado pela variável C, o
resultado da operação.
Para que a operação seja realizada de forma correta, o computador pesquisa o
conteúdo das variáveis representadas pelos endereços A e B, efetua o cálculo (produto)
das duas informações numéricas e em seguida armazena o resultado em um espaço
disponível em memória representado pela variável (identificador literal) C.
b) O conteúdo de uma variável pode ser alterado ao longo do processamento
Atribuição Efeito da atribuição realizada
A = 3 neste momento atribuímos à variável A o valor 3
A = 7 o mesmo espaço de memória A passa a armazenar o valor 7
A = A + 3 agora, a variável A recebe como atribuição, o seu valor inicial acrescido
do valor 3, passando desta forma, a armazenar o valor 10
Com esta propriedade, concluímos que existe a possibilidade de reutilização de
um espaço de memória anteriormente utilizado. Salientamos ainda que o valor anterior
é automaticamente perdido não podendo mais ser utilizado ou recuperado.
c) A atribuição, representada pelo sinal de igual “=”, não tem o mesmo significado do
mesmo sinal para a matemática. Exemplo:
Matemática Computador
X = 5
X = X + 1
Desenvolvendo esta expressão, podemos passar X
para o primeiro membro, obtendo:
X = X – 1
X – X = 1 Ou 0 = 1 ( absurdo! )
X = 5
X = X + 1
Para o computador, esta instrução identifica apenas
a reutilização do endereço de memória X. O
conteúdo do endereço X (5) é somado ao valor 1
resultando 6 que também armazenado no mesmo
endereço X.
30 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Determine em cada um dos exercícios abaixo o conteúdo da variável (endereço
de memória) solicitado:
1-) Endereço X 2-) Endereço Z 3-) Endereço H 4-) Endereço M
A = 1
B = 5
C = A * B
A = A + C
X = B * C
X = X + 3
A = X – B
X = X * X
Z = 3
B = Z * 2
C = 4
D = 3
Z = B + C + D
Z = Z * Z
Z = C - Z
L = 5
D = 45
H = D / L
H = H + L + D
J = 5
M = 6
F = D
H = F
AD = 45
XJ = 21
M = AD + XJ
DD = 3 * M + XJ
XJ = 12
DD = XJ * M – DD
M = 5 * M
X = Z = H = M =
A linguagem C# disponibiliza vários outros tipos de dados primitivos, ilustrado na
tabela 2 e que teremos muito tempo para aprendê-los e utilizá-los.
Tipo de dado Descrição Tamanho
(em bits)
Intervalo Exemplo
int Números inteiros 32 -2147483648 até
2147483647
int idade;
idade = 42;
long Números inteiros 64 -9223372036854775808
até
9223372036854775807
long x;
x = 51L;
float Números reais 32 ± 3,4 x 1038 float nota;
nota = 5.5F;
double Números reais 64 ± 1,7 x 10308 double x;
x = 0.125;
decimal Valores
monetários
128 28 números significativos decimal v;
v = 0.42M;
string Sequência de
caracteres
16 bits por
caractere
string n;
n = ”Maria”;
char Único
caractere
16 0 a 32767 char let;
let = ‘A’;
31 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
bool Booleano 8 true ou false bool resp;
resp = true;
Tabela 2 – Tipos de dados primitivos da linguagem C#.
Observações:
i. Uma variável, em princípio deve ter um nome simples, que identifique seu
conteúdo e que não seja igual a nenhuma das palavras reservadas já utilizadas
pelo C#;
ii. É importante observar algumas regras para nomeação dos identificadores
(nome que se dá a uma variável):
a) Iniciar com uma letra;
b) Pode utilizar letras e números;
c) Não utilizar caracteres especiais (símbolos gráficos);
d) Não deixar espaço entre as letras;
e) Não colocar letras ou palavras sublinhadas;
f) Iniciar preferivelmente com letras minúsculas.
2.5. Operadores e expressões aritméticas
A linguagem C# suporta as 4 (quatro) operações aritméticas básicas, como
multiplicação, divisão, adição e subtração, respectivamente com os operadores “*”, “/”, “+”
e “-“. Quando em uma expressão aritmética, existir mais de um operador, valem as regras
e propriedades da matemática para dar prioridade aos cálculos.
Exemplos:
x = 3 + 5 * 2 (o valor atribuído para “x” será 13)
y = (3 + 5) * 2 (o valor atribuído para “y” será 16)
32 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Você deve estar ciente também de que o tipo de resultado de uma expressão
aritmética depende dos operandos utilizados. Veja o caso da operação de divisão:
z = 5 / 2 (o valor atribuído para “z” será 2)
w = 5.0 / 2.0 (o valor atribuído para “w” será 2.5)
O C# também suporta um operador para retornar o resto de uma divisão entre inteiros.
Este operador é chamado de módulo ou resto e é representado pelo caractere “%”. O
resultado de x % y é o resto da divisão de x por y.
Por exemplo: r = 9 % 2 (o valor atribuído para “r” será 1, pois 9 dividido por 2 é igual
a 4 e resta 1).
2.5.1. Incremento ou decremento de valores em variáveis
A linguagem C# possui alguns recursos relevantes para incremento e decremento de
valores em variáveis de memória. Para adicionar o valor 1 (um) a uma variável, poderia
fazer: x = x + 1; para subtrair o valor 1 (um) a uma variável, poderia fazer: y = y - 1;
Entretanto é pouco provável que um desenvolvedor experiente, que será seu caso,
faça um código como este. Para adicionar uma unidade para uma variável utilizaremos a
notação derivada da linguagem C, como a seguir: x++;
Da mesma maneira para subtrair 1 de uma variável, você poderá utilizar o operador “-
-”. Por exemplo, para decrementar (subtrair) 1 da variável x, poderá ser codificado: x--;
Os símbolos “++” e “—” são chamados de operadores (incremento ou decremento).
Ambos são operadores unários, ou seja, não precisam estar necessariamente entre dois
termos (variáveis, por exemplo).
33 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Prefixo e Sufixo: os operadores de incremento (++) e decremento (--) pode ser
inseridos antes ou depois de uma variável. Se utilizarmos o operador depois da variável,
chamamos de sufixo, mas se utilizarmos antes chamamos de prefixo. O detalhe é que o
cálculo da variável também varia com esta regra.
Variáveis Tipo de incremento/decremento
contador++ incremento por sufixo (pós-incremento)
++contador incremento por prefixo (pré-incremento)
contador-- decremento por sufixo (pós-decremento)
--contador decremento por prefixo (pré-decremento)
A utilização da forma prefixo ou sufixo não faz diferença para a variável que estásendo
incrementada ou decrementada. Por exemplo, se você codificar contador++ ou ++contador,
a variável “contador” será incrementada em uma unidade, ou seja, aumentará em 1. A
diferença está no resultado de uma expressão aritmética, pois um adiciona ou subtrai
ANTES (prefixo) da expressão aritmética, já o outro (sufixo), adiciona ou subtrai depois da
expressão.
Veja os exemplos:
x = 5;
y = x++ * 2;
Temos aqui x = 6 e y = 10.
x = 5;
y = ++x * 2;
Temos aqui x = 6 e y = 12.
Observação: Isoladamente, x++ tem o mesmo efeito que ++x. Veja o exemplo abaixo,
codifique em seu Microsoft Visual C# e faça algumas alterações. Crie exemplos a partir
deste. Mude os cálculos e valores. Analise os resultados obtidos...
34 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Figura 18: Exemplo de aplicação em linguagem C# com operadores.
Procure pesquisar algo mais a respeito da obra de George Boole, um
matemático, filósofo britânico, criador da álgebra booleana, fundamental para
o desenvolvimento da computação moderna.
35 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
3. ENTRADA E SAÍDA DE DADOS
O cálculo que o computador realiza requer, para ser útil, a entrada dos dados
necessários para o processamento. O projeto de programação, normalmente existe porque
se prevê a solução de algum problema computacional, isto é, temos que elaborar uma
solução para um problema. Partimos também do suposto que temos dados que deverão
ser processados e/ou calculados para gerar as informações de saída. Estes dados de
entrada deverão ser inseridos no projeto em variáveis.
Em muitas situações, a escolha do valor para uma variável é de competência do
usuário e não do desenvolvedor, por isso, vamos estudar nesta aula, como atribuir valores
para as variáveis em tempo de execução do programa, ou seja, o usuário irá escolher e
digitar o valor que deverá ser armazenado em uma variável.
Depois de processados os dados, vamos então informar os resultados obtidos, ou
seja, a saída de dados. Os programas desenvolvidos até agora, têm valores atribuídos pelo
desenvolvedor e não pelo usuário, isto significa que os programas irão gerar sempre o
mesmo resultado. Com os recursos estudados nesta aula, teremos condições de solicitar
valores ao usuário e processar estes dados, gerando resultados em função das entradas,
ou seja, resultados diferentes.
As operações de entrada permitem ler determinados valores e colocá-los em
variáveis. Essa entrada (teclado, unidades de disco etc.) é conhecida como operação de
leitura (read), após o processamento, os dados serão enviados para um dispositivo de
saída (tela, impressora etc.), denominada escrita (write).
36 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
3.1. Um programa simples
O C# utiliza algumas notações que podem parecer estranhas para quem está
iniciando, por isso, vamos fazer um programa que utiliza poucas variáveis e cálculos nada
complexos. O enunciado do programa é o seguinte: Fazer um programa para calcular e
exibir o dobro de um valor (real) qualquer que será escolhido pelo usuário.
Solução:
namespace Exemplo01
{
class Program
{
static void Main(string[] args)
{
// Declaração de duas variáveis reais
double x, resp;
// Limpar a tela
Console.Clear();
// Exibir a mensagem para o usuário digitar um valor
Console.Write("Digite um valor : ");
/* Aguardar a digitação de um valor
Converter a string digitada para o tipo double
Armazenar o valor escolhido na variável x
*/
x = double.Parse(Console.ReadLine());
// Calcular o dobro de x e armazenar o resultado em resp
resp = 2 * x;
// Exibir o resultado
Console.WriteLine("Dobro do valor escolhido : {0}", resp);
// Aguardar uma tecla, antes de encerrar o programa
37 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Console.ReadKey();
}
}
}
Analisando o código...
a) Definimos duas variáveis reais (x e resp) do tipo double. Uma para receber o valor
escolhido pelo usuário e outra para o cálculo do dobro do valor.
b) A linha com o código “Console.Clear();” remove os caracteres antigos da tela, para
que seu projeto possa utilizar uma tela limpa.
c) Exibimos uma mensagem na tela para o usuário digitar um valor:
Console.Write("Digite um valor : ");
Um detalhe muito importante nos processamentos de entrada de dados para
aplicações windows, é que as entradas são entendidas como sendo do tipo “string”, ou seja,
uma sequência de caracteres. Para que estas entradas sejam interpretadas como valores
numéricos nós deveremos nos utilizar de funções para conversão de tipos, como por
exemplo:
• X = int.Parse(Console.ReadLine());
• Y = float.Parse(Console.ReadLine());
• Z = double.Parse(Console.ReadLine());
• Nome = Console.ReadLine();
d) O código “x = double.Parse(Console.ReadLine());” aguarda a digitação de um valor
que será convertido e armazenado na variável x.
e) Veja o que acontece (figura 19) quando retiramos as funções de conversão para
linhas desta natureza. Suponha o seguinte código: x = Console.ReadLine();
38 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Figura 19: Erro de compilação por falha de conversão de tipos de dados.
f) Após a digitação, calculamos o dobro do valor digitado e armazenamos a resposta
na variável resp, com o código: “resp = 2 * x;”.
g) Com a variável “resp” em memória, podemos então enviar para o dispositivo de
saída (tela) com o código Console.WriteLine("Dobro do valor escolhido : {0}", resp);
Lembre-se que estamos utilizando o chamado “placeholder” (também chamado de
parâmetro de formatação) para informar o local onde o conteúdo da variável será
apresentado.
É possível concatenar informações com a instrução “Write”, ou seja, utilizar a mesma
instrução “Write” ou “WriteLine” para colocar mais de um conjunto de caracteres. É possível
concatenar utilizando o sinal “+” para separar 2 (dois) conjuntos. Exemplo:
// Concatena utilizando a sintaxe +
Console.WriteLine("O valor é: " + 100);
h) Apresentamos os resultados esperados, ou seja, já atendemos os requisitos do
usuário. Vamos então inserir uma instrução “Console.ReadKey();” para aguardar
que o usuário pressione uma tecla, antes do fechamento do aplicativo. Se você
não entendeu, retire esta linha e execute o programa novamente. Viu, não dá
tempo para visualizar o resultado.
39 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
3.2. Entrada e saída de dados
Basicamente as aplicações necessitam das entradas de dados, processam estes
dados e geram as informações de saída.
Admita o seguinte problema: calcular e exibir a idade em dias e a idade em horas de
uma pessoa qualquer, a partir da sua idade em anos, que será fornecida via teclado.
Para resolver este problema, você deverá criar variáveis para armazenar a idade em
anos que o usuário irá digitar e depois calcular os demais valores solicitados. Logicamente,
também seria um problema muito simples de resolver.
Exemplo:
namespace Exemplo02
{
class Program
{
static void Main(string[] args)
{
int anos, dias, horas;
Console.Clear();
Console.Write("Idade em anos: ");
anos = int.Parse(Console.ReadLine());
dias = anos * 365;
horas = dias * 24;
Console.WriteLine("{0} anos de vida", anos);
Console.WriteLine("Aproximadamente {0} dias", dias);
Console.WriteLine("{0} horas! ", horas);
Console.ReadKey();
}
}
}
40 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Para um treinamento, faça agora um programa para calcular e exibir a média
aritmética de dois valores que serão digitados: M = (p1 + p2) / 2.
3.2.1. Instrução de comentário no programa
O objetivo da instrução de “comentário” é permitir que o desenvolvedor escreva
comentários durante a programação. Na verdade, esta instrução não tem nenhuma função
para a linguagem de programação, o que se está fazendo quando se coloca um comando
comentário é equivalente a falar ao compilador que a linha que inicia com o comando
comentário deve ser desconsiderada.
Em resumo, os comentários só servem para dar ao desenvolvedor a oportunidade
de escrever informações no programa que lhe serão úteis como lembretes ou explicações
de decisões que ele tomou durante a elaboração do programa. Um bom programador deve
colocar o máximo possível de comentários, de maneira que estes possam lhe auxiliar
principalmente no futuro, quando ele for fazer alterações ou manutenções no programa.
Existem no C#, duas sintaxes para o comando comentário:
a) Para uma única linha de comentário: basta iniciar a linha de comentário com duas
barras normais. Não é necessário marcar o final da linha.
// ........Comentário
b) Para comentários com mais de uma linha: deve-se iniciar a linha de comentário
com uma barra normal seguida de asterisco e encerrar o comentário com
asterisco seguido de uma barra normal.
/* ...............Comentário ................ */
41 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Exemplo:
namespace Ex01
{
class Comentario
{
static void Main(string[] args)
{
// Esta é uma linha de comentário que será desprezada pelo comando
/* Caso se deseje escrever comentários
com mais de uma linha basta iniciar
com barra asterisco e fechar com */
}
}
}
3.2.2. Delimitando a largura de dados para a instrução “Write”
Caso seja utilizada a instrução “Write” com a sintaxe de “parâmetros de formatação”,
é possível delimitar o espaço onde uma informação será colocada. Para tanto, basta colocar
após o “parâmetro de formatação”, uma vírgula e em seguida um número inteiro
representando o espaço que será disponibilizado para a apresentação da informação. Caso
seja colocado um número positivo o alinhamento será justificado à direita, caso seja
colocado um número negativo o alinhamento será justificado à esquerda. Exemplo:
// Concatena utilizando parametros de formatação e delimitadores
Console.WriteLine("O primeiro valor é {0,10}, e o segundo é {1,10}", 120, 130);
Console.WriteLine("O primeiro valor é {0,-10}, e o segundo é {1,-10}", 120, 130);
42 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Figura 20: Resultado do processamento do programa com delimitação de espaço
para apresentação dos dados.
3.2.3. Determinando o número de casas decimais para a instrução “Write”
Caso seja utilizada a instrução “Write” com a sintaxe de “parâmetros de formatação”,
é possível determinar o número de casas decimais que um número será informado. Para
tanto, basta colocar após o “parâmetro de formatação” ou após a indicação de largura
disponibilizada dois pontos e em seguida a letra F e o número de casas desejadas.
Exemplo:
// Concatena utilizando parametros de formatação e delimitadores e
// duas ou três casas decimais
Console.WriteLine("O primeiro valor é {0,10:F2}, e o segundo é {1,10:F2}", 120, 130);
Console.WriteLine("O primeiro valor é {0,-10:F3}, e o segundo é {1,-10:F3}", 120, 130);
43 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Figura 21: Resultado do processamento do programa com determinação do número
de casas decimais para apresentação dos dados.
3.3. Lista de exercícios
1) Entrar via teclado com a base e a altura de um retângulo, calcular e exibir sua
área.
2) Calcular e exibir a área de um quadrado, a partir do valor de sua aresta que
será digitado.
3) Calcular e exibir a área de um quadrado a partir do valor de sua diagonal que
será digitado.
4) A partir dos valores da base e altura de um triângulo, calcular e exibir sua
área.
5) Calcular e exibir o volume de uma esfera a partir do valor de seu diâmetro que
será digitado.
6) Calcular e exibir a média aritmética de quatro valores quaisquer que serão
digitados.
7) Calcular e exibir a média geométrica de dois valores quaisquer que serão
digitados.
8) Sabendo que uma milha marítima equivale a um mil, oitocentos e cinquenta e
dois metros e que um quilômetro possui mil metros, fazer um programa para
converter milhas marítimas em quilômetros.
44 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
9) Calcular e exibir a tensão de um determinado circuito eletrônico a partir dos
valores da resistência e corrente elétrica que serão digitados. Utilize a lei de
Ohm.
10) Entrar via teclado com o valor de uma temperatura em graus Celsius, calcular
e exibir sua temperatura equivalente em Fahrenheit.
11) A partir do diâmetro de um círculo que será digitado, calcular e exibir sua área.
12) Calcular e exibir o volume de um cone a partir dos valores da altura e do raio
da base que serão digitados.
13) Calcular e exibir a velocidade final (em km/h) de um automóvel, a partir dos
valores da velocidade inicial (em m/s), da aceleração (m/s²) e do tempo de
percurso (em s) que serão digitados.
14) Calcular e exibir o volume livre de um ambiente que contém uma esfera de
raio “r” inscrita em um cubo perfeito de aresta “a”. Os valores de “r“ e “a” serão
digitados.
15) Entrar via teclado com o valor da cotação do dólar e uma certa quantidade de
dólares. Calcular e exibir o valor correspondente em Reais (R$).
16) Entrar via teclado com o valor de um ângulo em graus, calcular e exibir as
seguintes funções trigonométricas: seno, coseno, tangente e secante deste
ângulo. Lembre-se que uma função trigonométrica trabalha em radianos.
17) Entrar via teclado com o valor de cinco produtos. Após as entradas, digitar um
valor referente ao pagamento da somatória destes valores. Calcular e exibir o
troco que deverá ser devolvido.
45 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
4. ESTRUTURAS DE CONTROLE DE DECISÃO
4.1. Comparações
O computador tem a habilidade de efetuar comparações e em virtude desta
comparação, se torna possível a este, a tomada de decisões. Tais comparações ocorrem
através da análise de uma expressão, a qual, define o caminho correto a ser seguido pelo
fluxo do programa. Estas expressões são apresentadas na forma de comparações entre
informações, de tal forma que as mesmas possam ser analisadas pela máquina, retornando
um valor lógico. Tais comparações podem ser divididas em:
a) Comparações Simples
b) Comparações Múltiplas
Veremos a seguir as características de cada uma destas comparações, bem como
analisaremos os conectores lógicos utilizados para criação das expressões.
4.1.1. Comparações simples
Quando definimos o computador, dissemos que ele tem a habilidade de comparar
informações. Esta comparaçãoé realizada eletronicamente e como resultado dessa
comparação surge uma informação interna da máquina chamada variável lógica, que pode
assumir apenas dois valores: verdadeiro ou falso (true ou false). A variável lógica assumirá
um valor verdadeiro (V ou 1) se for verdadeira a comparação efetuada e será falsa (F ou
0) em caso contrário. Como internamente no computador temos apenas zeros e uns, o V é
equivalente a um e o F equivale a zero.
O resultado lógico de uma comparação definirá o caminho a ser seguido pelo
programa. No quadro abaixo, mostramos as possíveis comparações simples que podem
ser efetuadas entre os dados A e B:
46 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Comparação O computador é capaz de verificar se:
A = B os números são iguais (em C# usamos ==)
A <> B são diferentes (nas linguagens C# em Java, usamos != )
A > B o primeiro é maior que o segundo
A < B o primeiro é menor que o segundo
A >= B o primeiro é maior ou igual ao segundo
A <= B o primeiro é menor ou igual ao segundo
Nota: Os elementos A e B nas expressões no quadro acima, podem ser variáveis
numéricas, alfanuméricas ou ainda literais numéricos ou alfanuméricos.
Exemplos: Considere as variáveis A = 10, B = 5, C = “Programa”;
Comparação efetuada pelo
computador
Variável lógica interna gerada
A > B V ou 1
5 > A F ou 0
C > “Roberto” F ou 0
A >= A V ou 1
6 >= B V ou 1
6 <> 9 V ou 1
C < “Zulmira” V ou 1
A <> B V ou 1
C > “Alberto” V ou 1
“Programa” <> C F ou 0
“6” < “5” F ou 0
“63” > “120” V ou 1
12 = 13 F ou 0
Repare que não podemos comparar variáveis literais com variáveis ou literais
alfanuméricas e vice e versa.
47 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
4.1.2. Comparações múltiplas
A comparação pode também ser constituída pela associação de comparações
simples, associação esta chamada de comparação múltipla. Esta associação é feita
utilizando os chamados operadores lógicos AND (E) e OR (OU). Para entendermos esta
comparação múltipla, consideremos duas condições simples C1 e C2.
4.1.2.1. O Operador lógico “AND”
Regra: C1 AND C2 será V se C1 e C2 forem V.
Exemplos:
Comparação Múltipla Variável lógica interna gerada
5 > 3 AND 3 = 3 V – pois ambas são V
7 = 7 AND 3 = 5 F – pois a segunda é F
4 > 10 AND 6 <= 12 F – pois a primeira é F
12 <> 12 AND 6 > 10 F – pois ambas são F
Resumo:
V AND V V
V AND F F
F AND V F
F AND F F
48 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
4.1.2.2. O Operador lógico “OR”
Regra: C1 OR C2 será V se pelo menos uma das condições simples for V.
Exemplos:
Comparação Múltipla Variável lógica interna gerada
5 > 3 OR 3 = 3 V – pois ambas são V
7 = 7 OR 3 >= 5 V – pois a primeira é V
4 > 10 OR 6 <= 12 V – pois a segunda é V
12 <> 12 OR 6 > 10 F – pois ambas são F
Resumo:
V OR V V
V OR F V
F OR V V
F OR F F
As informações comparadas podem conter operações. Neste caso o computador
efetua inicialmente a operação e posteriormente a comparação, conforme exemplo abaixo:
( 3 * 4 ) > 10
O computador efetua a operação obtendo 12 e este valor é comparado com 10,
resultando a expressão em V. Podemos ter comparações múltiplas ainda mais complexas.
Isto é feito utilizando-se de parênteses para indicar a prioridade de análise, conforme o
exemplo abaixo:
( 3 > 4 AND 5 < > 6 ) OR 2 < 3
49 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
4.1.3. Comparações com variáveis alfanuméricas
A comparação pode também ser constituída pela associação de comparações
envolvendo, especificamente, as variáveis alfanuméricas. Vejamos os exemplos abaixo:
Comparação Variável lógica interna gerada
“SANTOS“ = “SANTOS” V ou 1
“ABEL” < “BENEDITO” V ou 1
“JULIA” > “MARCOS” F ou 0
“LUIZ” < “ LUIS” F ou 0
“MARCIA” >= “MARCIA” V ou 1
“AAA” <= “AAAB” V ou 1
“SISTEMA” <> “SISTEMA” F ou 0
“AAAAAA” = “aaaaaa” F ou 0
“MARIA “ = “MARIA” F ou 0
Notas:
a) Caracteres maiúsculos são menores que caracteres minúsculos.
b) Números são menores que letras.
c) Espaços são menores que qualquer caractere que possa ser impresso.
d) Caracteres acentuados e o ç são maiores que as letras não acentuadas (Mas
obedecem a ordem entre si “á” é menor que “é” e “Á” é menor que “É”)
4.1.4. Exercícios de reforço
Complete a tabela abaixo com V ou F:
01 5 <> 6 AND 5 <> 4
02 5 = 5 OR 6 < 6
03 5 <= 10 AND 5 <> 7
04 12 >= 12 OR 12 < 10
05 33 <> 5 OR 10 > 4
06 6 <= 10 AND 8 = 8
07 12 < 10 AND 56 <> 65
08 34 < 30 OR 15 <= 5
50 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
09 8 >= 10 AND 6 >= 7
10 45 < 23 AND 8 <= 5
11 (8 >= 10) AND (5 <> 7)
12 (34 < 30) OR (3 <> 3)
13 (5 = 5) XOR (10 > 4)
14 (6 <= 10 OR 45 < 23) AND (8 = 8)
15 (33 <> 5) AND (56 <> 65 OR 2 = 2)
16 (52 <= 67 AND 23 > 20) OR (15 <= 5)
17 (12 >= 12 AND 6 >= 7) AND (3 = 3)
18 (6 <= 10 OR 29 <> 32) AND (8 <= 5)
19 (12 < 10) AND (5 <> 4 OR 5 <> 6)
20 (5 <> 6 AND 3 > 4) OR (6 < 6)
21 (8 >= 10 AND 2 >= 2) AND (5 <> 7)
22 (34 < 30) XOR (12 < 10 OR 3 <> 3)
23 (6 <= 10 OR 45 < 23) AND (8 = 8)
24 (5 = 5) XOR (10 > 4 AND 4 >= 3)
25 (33 <> 5) AND (56 <> 65 XOR 2 = 2)
26 (52 <= 67 AND 23 > 20) OR (15 <= 5)
27 (12 >= 12 AND 6>= 7) AND (3 = 3)
28 (5 <= 10 OR 29 <> 32) AND (8 <= 5)
29 (4 < 1) AND (5 <> 4 OR 5 <> 6)
30 (‘123’ > ‘87’) OR (‘012’ >= ‘6’)
31 (‘Maria’ <= ‘Mario’ AND ‘É’ = ‘E’)
32 (34 < 30) AND (12 < 10 OR X <> Y)
33 ((6 <= 10) OR (45 < 23)) AND (‘A’ = ‘a’)
34 (5 =>5) OR (10 > 4 OR 4 >= 3) OR (X > Y)
35 (33 <> 5) OR (56 <> 65 AND 2 = 2)
36 ((‘A’ < ‘B’) OR (‘X’ > ‘x’)) AND (15 <= 15)
37 (12 <= 12 OR 6>= 7) AND (3 <= 5)
38 (4 >= 15 AND 29 <> 30) OR (8 <= 5)
39 (4 > 1) OR (5 <> A) OR (5 <> B) OR (A=B)
40 (15 <= 17 AND 1 > 2) XOR (5 <= 5)
51 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
4.2. Decisão lógica
Normalmente as instruções em um programa são executadas uma após a outra, na
ordem em que aparecem no programa. Isso é chamado de execução sequencial ou
execução em linha.
Muitas vezes em processamento de dados, devemos executar um determinado bloco
de instruções em função de uma condicional, isto é, se determinada condição for satisfeita,
o bloco será executado, caso contrário, não será. A decisão lógica possui apenas duas
respostas possíveis, o verdadeiro (true) ou o falso (false), e nosso problema consiste em
analisar quais instruções serão processadas em cada caso.
Parece simples, mas realmente no início qualquer um de nós poderá sentir as
dificuldades comuns de qualquer aprendizado. Veja a figura 22 abaixo para ilustrar melhor
a decisão lógica.
Figura 22: Representação gráfica (fluxograma) de uma decisão lógica.
Neste caso, o “blocoA” será processado somente se a condição for verdadeira, caso
contrário, o programa prossegue sua execução linear, ignorando o “blocoA”.
4.3. Estrutura de controle de decisão “IF”
Uma estrutura de decisão escolhe uma das duas opções possíveis de ações
alternativas. Por exemplo, admita que para passar de ano na disciplina, o aluno necessita
de média 7,0. Vamos gerar um pequeno fluxograma (figura 23) com esta condição e exibir
a mensagem “Aluno Aprovado”, esperamos inclusive, que seja o seu caso.
Condição
BlocoA
V F
52 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Figura 23: Representação gráfica (fluxograma) da solução.
Se a condição for verdadeira, então a mensagem éexibida e a próxima instrução é
executada na ordem. Se a condição for falsa, a instrução de exibição é ignorada, e a
próxima instrução é executada.
Vejamos este fluxo com a programação C#.
static void Main(string[] args)
{
float p1, p2, media;
Console.Clear();
Console.Write("Valor da P1 : ");
p1 = float.Parse(Console.ReadLine());
Console.Write("Valor da P2 : ");
p2 = float.Parse(Console.ReadLine());
media = (p1 + p2) / 2;
media >
= 7 . 0
V F
Aluno
Aprovado
Início
P 1
media =
( P 1 + P 2 ) / 2
P 2
Fim
Media
53 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Console.WriteLine("Media do aluno : {0}", media);
if (media >= 7.0)
{
Console.WriteLine("Aluno Aprovado");
}
Console.ReadKey();
}
Note que o código em C# é muito parecido, logicamente, com o fluxograma,
demonstrando como o fluxograma pode ser útil como ferramenta de programação. A
mensagem “Aluno Aprovado” será apresentada apenas se o aluno possuir média maior ou
igual a 7 (sete).
4.4. Operadores lógicos
O C# utiliza alguns símbolos para representar os chamados operadores para
comparação entre os argumentos, ou simplesmente, os operadores lógicos. São os
seguintes (quadro 1):
Operador Significado
> Maior que
< Menor que
>= Maior ou igual que
<= Menor ou igual que
== Igual a
!= Não igual a (diferente de)
Quadro 1: Listagem de operadores lógicos.
54 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
4.5. Estrutura de decisão “IF/ELSE”
A estrutura de decisão “if” executa uma ação indicada apenas quando a condição é
avaliada como sendo verdadeira, caso contrário, o programa prossegue linearmente, como
já vimos. A estrutura de decisão “if/else” permite ao programador especificar blocos de
instruções que serão executadas se a condição for verdadeira e, também, blocos de
instruções que serão executadas se a condição for falsa. Graficamente (figura 24), temos
a seguinte situação:
Figura 24: Representação gráfica (fluxograma) da decisão lógica “if/else”.
Neste caso, o “BlocoA” será executado se a condição for verdadeira, mas se a
condição for falsa, então o “BlocoB” será processado, para então o programa prosseguir
sequencialmente com as próximas instruções.
Suponha então uma alteração em nosso programa exemplo, no sentido de exibir a
mensagem “Aluno Aprovado”, se a média for maior ou igual a sete, mas exibir “Aluno
Reprovado”, se a média for menor do que 7 (sete).
O código em C# ficaria assim:
if (media >= 7.0)
{
Console.WriteLine("Aluno Aprovado");
}
else
Condição
BlocoA BlocoB
V F
55 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
{
Console.WriteLine("Aluno Reprovado");
}
Uma importante observação é que se um determinado bloco contiver mais de uma
instrução, será necessário inserir os caracteres chaves “{ }” para representar o início e o
final do bloco, mas lembre-se, isso é obrigatório apenas para mais de uma instrução no
bloco. Por exemplo, o código acima poderia ser codificado da seguinte maneira:
if (media >= 7.0)
{
Console.WriteLine("Aluno Aprovado");
Console.WriteLine(“Parabéns!”);
}
else
{
Console.WriteLine("Aluno Reprovado");
Console.WriteLine(“Ano que vem, recupera!”);
}
Como um desafio tente resolver o exercício abaixo:
O usuário deverá digitar, via teclado, os coeficientes a, b e c de uma equação do 2º
grau (ax2 + bx + c) e o programa deverá calcular e exibir suas raízes reais. Criamos duas
condições para exibir estas raízes:
• Se o valor “a” for igual a ZERO, exibir a mensagem “Não forma equação do 2º
grau”.
• Se o valor “∆” for negativo, exibir a mensagem “Não existem raízes reais”.
Equação de 2º grau:
∆= 𝑏2 − 4𝑎𝑐
𝑥 =
−𝑏 ± √∆
2𝑎
56 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
4.6. Estrutura de decisão “IF” em cascata
As instruções “if” pode ser aninhadas (colocado ou localizado em linha reta; posto em
fila) dentro de outras instruções “if”. Dessa maneira, você pode encadear uma sequência
de expressões booleanas (lógicas), que são testadas uma após a outra, até que umas delas
seja avaliada como verdadeira.
No exercício para calcular as raízes da equação, repare que o delta será comparado
somente se o primeiro teste for falso.
As estruturas “if/else” aninhadas podem testar múltiplos casos, colocando-as dentro
de outras estruturas if/else.
No exemplo abaixo, se o valor da variável “dia” for 0 (zero), o primeiro teste será
avaliado como verdadeiro e “Domingo” será atribuído à variável “diaNome”. Se o valor de
“dia” não for zero, o primeiro teste será falso e o controle passará para a cláusula else, que
executará a segunda instrução “if” que irá comparar a variável dia com o valor 1 (um). A
segunda instrução “if” só é avaliada se o primeiro teste for falso. Da mesma maneira, a
terceira instrução “if” só será avaliada se o primeiro e o segundo testes forem falsos.
namespace DiaSemana
{
class Program
{
static void Main(string[] args)
{
int dia; string diaNome; Console.Clear();
Console.Write("Digite um valor de 0 a 6 : ");
dia = int.Parse(Console.ReadLine());
if (dia == 0)
{
diaNome = "Domingo";
}
else
{
57 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
if (dia == 1)
{
diaNome = "Segunda-feira";
}
else
{
if (dia == 2)
{
diaNome = "Terça-feira";
}
else
{
if (dia == 3)
{
diaNome = "Quarta-feira";
}
else
{
if (dia == 4)
{
diaNome = "Quinta-feira";
}
else
{
if (dia == 5)
{
diaNome = "Sexta-feira";
}
else
{
if (dia == 6)
{
diaNome = "Sábado";
}
else
{
diaNome = "Não existe!";
}
}
}
}
}
58 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
}
}
Console.WriteLine("Dia da Semana : {0}", diaNome);
Console.ReadKey();
}
4.7. Operadores lógicos condicionais
O C# também oferece operadores booleanos: o operador lógico “and”, que é
representado pelo símbolo “&&” e o operador lógico “or”, que é representado pelo símbolo
“||”. Coletivamente são conhecidos comooperadores lógicos condicionais. Sua finalidade é
combinar expressões booleanas em expressões maiores.
O resultado do operador “&&” é true, se todas as relações comparadas forem
verdadeiras, enquanto, que o resultado do operador “||” é true, se pelo menos, uma das
relações comparadas for verdadeira.
Tabela das operações lógicas:
Comparação 1 Comparação 2 AND (&&) OR (||)
true true true true
true false false true
false true false true
false false false false
Vamos exemplificar com um programa para achar e exibir o maior de 3 (três) valores
distintos que serão digitados pelo usuário. Faremos este programa de algumas maneiras
diferentes para você se familiarizar com as várias formas da decisão lógica.
a) A “solução 1” é uma solução clássica que utiliza a decisão aninhada, ou seja,
instruções de decisão “dentro” de instruções de decisão.
b) A “solução 2” se utiliza de operadores lógicos do tipo “e” (AND), mas faça uma
análise e verifique que há perda de tempo nesta solução.
c) A “solução 3” se utiliza de operador lógico e aninhamento de “ifs”. Esta é a melhor
solução para este problema.
59 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
d) A “solução 4” utiliza uma técnica de atribuições, evitando a cláusula “else”.
Também é ótima solução.
Solução 1
namespace Solucao1
{
class Program
{
static void Main(string[] args)
{
int a, b, c;
Console.Clear(); Console.Write("1º valor : ");
a = int.Parse(Console.ReadLine());
Console.Write("2º valor : ");
b = int.Parse(Console.ReadLine());
Console.Write("3º valor : ");
c = int.Parse(Console.ReadLine());
if (a > b)
{
if (a > c)
{
Console.WriteLine("Maior valor : {0}", a);
}
else
{
Console.WriteLine("Maior valor : {0}", c);
}
}
else
{
if (b > c)
{
Console.WriteLine("Maior valor : {0}", b);
}
else
{
Console.WriteLine("Maior valor : {0}", c);
}
}
60 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Console.ReadKey();
}
}
}
Solução 2
namespace Solucao2
{
class Program
{
static void Main(string[] args)
{
int a, b, c;
Console.Clear();
Console.Write("1º valor : ");
a = int.Parse(Console.ReadLine());
Console.Write("2º valor : ");
b = int.Parse(Console.ReadLine());
Console.Write("3º valor : ");
c = int.Parse(Console.ReadLine());
if (a > b && a > c)
{
Console.WriteLine("Maior valor : {0}", a);
}
else
{
if (b > a && b > c)
{
Console.WriteLine("Maior valor : {0}", b);
}
else
{
if (c > a && c > b)
{
Console.WriteLine("Maior valor : {0}", c);
}
}
}
Console.ReadKey();
61 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
}
}
}
Solução 3
namespace Solucao3
{
class Program
{
static void Main(string[] args)
{
int a, b, c;
Console.Clear();
Console.Write("1º valor : ");
a = int.Parse(Console.ReadLine());
Console.Write("2º valor : ");
b = int.Parse(Console.ReadLine());
Console.Write("3º valor : ");
c = int.Parse(Console.ReadLine());
if (a > b && a > c)
{
Console.WriteLine("Maior valor : {0}", a);
}
else
{
if (b > c)
{
Console.WriteLine("Maior valor : {0}", b);
}
else
{
Console.WriteLine("Maior valor : {0}", c);
}
}
Console.ReadKey();
}
}
}
62 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Solução 4
namespace Solucao4
{
class Program
{
static void Main(string[] args)
{
int a, b, c, maior;
Console.Clear();
Console.Write("1º valor : ");
a = int.Parse(Console.ReadLine());
Console.Write("2º valor : ");
b = int.Parse(Console.ReadLine());
Console.Write("3º valor : ");
c = int.Parse(Console.ReadLine());
if (a > b)
{
maior = a;
}
else
{
maior = b;
}
if (c > maior)
{
maior = c;
}
Console.WriteLine("Maior valor : {0}", maior);
Console.ReadKey();
}
}
}
63 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
4.8. Lista de exercícios (1)
1) Entrar via teclado, com dois valores distintos. Exibir o maior deles.
2) Entrar via teclado, com dois valores distintos. Exibir o menor deles.
3) Entrar com dois valores quaisquer. Exibir o maior deles, se existir, caso contrário,
enviar mensagem avisando que os números são idênticos.
4) Calcular e exibir a área de um retângulo, a partir dos valores da base e altura
que serão digitados. Se a área for maior que 100, exibir a mensagem “Terreno
grande”.
5) Calcular e exibir a área de um retângulo, a partir dos valores da base e altura
que serão digitados. Se a área for maior que 100, exibir a mensagem “Terreno
grande”, caso contrário, exibir a mensagem “Terreno pequeno”.
6) Entrar via teclado com três valores distintos. Exibir o maior deles.
7) Uma escola com cursos em regime semestral, realiza 2 (duas) avaliações
durante o semestre e calcula a média do aluno, da seguinte maneira: media =
(p1 + 2p2) / 3. Fazer um programa para entrar via teclado com os valores das
notas (P1 e P2) e calcular a média. Exibir a situação final do aluno (“Aprovado
ou Reprovado”), sabendo que a média de aprovação é igual a 5 (cinco).
8) Uma escola com cursos em regime semestral realiza duas avaliações durante o
semestre e calcula a média do aluno, da seguinte maneira: media = (p1 + 2p2) /
3. Fazer um programa para entrar via teclado com o valor da primeira nota (P1)
e o programa deverá calcular e exibir quanto o aluno precisa tirar na segunda
nota (P2) para ser aprovado, sabendo que a média de aprovação é igual a cinco.
64 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
4.9. Lista de exercícios (2)
1) Entrar com o peso e a altura de uma determinada pessoa. Após a digitação,
exibir se esta pessoa está ou não com seu peso ideal. Veja tabela da relação
peso/altura².
Relação peso/altura2 Mensagem
R< 20 Abaixo do peso
20 <= R < 25 Peso ideal
R >= 25 Acima do peso
2) A partir de 3 (três) valores que serão digitados, verificar se formam ou não um
triângulo. Em caso positivo, exibir sua classificação: “Isósceles, escaleno ou
equilátero”. Um triânguloescaleno possui todos os lados diferentes, o triângulo
isósceles, dois lados iguais e o equilátero, todos os lados iguais. Para existir
triângulo é necessário que a soma de dois lados quaisquer seja maior que o
outro, isto, para os três lados.
3) Verificar se três valores quaisquer (A, B, C) que serão digitados formam ou não
um triângulo retângulo. Lembre-se que o quadrado da hipotenusa é igual à soma
dos quadrados dos catetos.
4) Entrar com o peso, o sexo e a altura de uma determinada pessoa. Após a
digitação, exibir se esta pessoa está ou não com seu peso ideal. Veja tabela da
relação peso/altura2.
Relação peso/altura2
Feminino
Mensagem
R< 19 Abaixo do peso
19 <= R < 24 Peso ideal
R >= 24 Acima do peso
65 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Relação peso/altura2
Masculino
Mensagem
R< 20 Abaixo do peso
20 <= R < 25 Peso ideal
R >= 25 Acima do peso
5) A partir dos valores da aceleração (a em m/s²), da velocidade inicial (v0 em m/s)
e do tempo de percurso (t em s). Calcular e exibir a velocidade final de automóvel
em km/h. Exibir mensagem de acordo com a tabela abaixo. Fórmula para o
cálculo da velocidade em m/s: V = v0 + a. t.
Velocidade em Km/h (V) Mensagem
V < = 40 Veículo muito lento
40 < V <= 60 Velocidade permitida
60 < V <= 80 Velocidade de cruzeiro
80 < V <= 120 Veículo rápido
R >= 120 Veículo muito rápido
66 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
5. ESTRUTURAS DE CONTROLE DE REPETIÇÃO
Em várias situações se faz necessário que um determinado conjunto de instruções
seja repetido um certo número de vezes. Para que este tipo de processamento seja
realizado, necessitamos utilizar uma “Estrutura de Repetição”, também conhecida como
“loop” ou laço. A classificação das estruturas dependerá do número de vezes que o conjunto
de instruções será executado. Desta forma podemos dividir as estruturas de repetição em
laços contados e laços condicionais.
5.1. Estrutura “WHILE”
Existe uma maneira de se repetir um determinado bloco de instruções, enquanto uma
condição permanecer verdadeira, ou seja, o programa irá executar as mesmas instruções
repetidamente, enquanto uma determinada condição se mantiver como verdadeira.
Utiliza-se a instrução “while” para executar repetidamente uma instrução enquanto
uma determinada condição permanecer como verdadeira. Logicamente temos a seguinte
estrutura:
Figura 25: Fluxograma da estrutura de controle de repetição “While”.
Condição
BlocoA
V
F
67 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Repare que a instrução “BlocoA” será executada se a condição testada for verdadeira
e que, após executar o bloco, a condição é testada novamente, ou seja, ENQUANTO a
condição permanecer como verdadeira o bloco de instruções será processado. Quando a
condição resultar em falso, então o programa continuará sua execução linear, deixando
assim, a estrutura de repetição.
Outro detalhe também importante nesta estrutura é que a condição é testada ANTES
de se executar o bloco de instruções, ou seja, se o bloco é processado, realmente a
condição é verdadeira. Isso significa que nesta estrutura, se a condição for falsa na primeira
vez que for testada, então o bloco não será executado nenhuma vez.
Em contrapartida, devemos tomar cuidado também com os procedimentos que farão
parte do bloco, pois se a condição sempre ficar como verdadeira, seu programa irá entrar
em “loop” infinito, pois não teria como sair do laço (estrutura de repetição).
Sintaticamente temos o seguinte:
while (condição)
{
blocoA;
}
A condição é analisada antes de se executar o bloco de instruções, que deverá estar
definido entre os caracteres chaves “{}”, a não ser, que o bloco tenha uma única instrução,
onde não seriam necessárias as chaves para a definição do bloco. Isto significa que os
caracteres chaves são necessários quando o bloco de instruções contiver mais de um
comando.
Assim como nas instruções de decisão lógica, a expressão a ser testada deverá estar
entre os caracteres parênteses “()” e se a expressão for avaliada como falsa, na primeira
avaliação, o bloco não será executado.
68 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Exemplo 1: Vamos criar um programa para exibir valores inteiros de 1 a 10.
static void Main(string[] args)
{
int contador = 0;
while (contador < 10)
{
Console.WriteLine("Contador = {0}", contador);
contador++;
}
Console.ReadKey();
}
O resultado do processamento é apresentado na figura 26 abaixo.
Figura 26: Resultado do processamento da aplicação do Exemplo 1
Neste caso, enquanto o contador se mantém menor que dez, o laço é executado.
Lembrando apenas que a expressão “contador++” é a mesma coisa que “contador =
contador + 1”.
69 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Desafio: Para um pequeno aquecimento, faça uma alteração no programa, no sentido
de exibir na tela, a tabuada do número 7 (sete).
Todas as instruções “while” devem terminar em algum ponto. Um erro muito comum
é “esquecer” de criar procedimentos que façam a expressão analisada se tornar falsa, e se
você esquecer, seu programa entrará em loop infinito. Por exemplo, no programa anterior,
troque a condição contador <0 para contador >=0 e veja o resultado.
Vamos agora exemplificar com mais códigos para você melhorar seu aprendizado.
Exemplo 2: Criar uma rotina de entrada que aceite somente um valor positivo.
static void Main(string[] args)
{
int x = 0;
while (x <= 0)
{
Console.Write("Valor positivo: ");
x = int.Parse(Console.ReadLine());
}
Console.Write("OK");
Console.ReadKey();
}
Exemplo 3: Entrar com dois valores via teclado, onde o segundo deverá ser maior que
o primeiro. Caso contrário solicitar novamente apenas o segundo valor.
static void Main(string[] args)
{
int a, b;
Console.Write("1º valor :");
a = int.Parse(Console.ReadLine()); Console.Write("2º valor :");
b = int.Parse(Console.ReadLine());
while (b <= a)
70 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
{
Console.Write("2º valor :");
b = int.Parse(Console.ReadLine());
}
Console.Write("OK");
Console.ReadKey();
}
Exemplo 4: Entrar via teclado com o sexo de determinado usuário, aceitar somente
“F” ou “M” como respostas válidas.
static void Main(string[] args)
{
char s;
Console.Write("Sexo:");
s = Console.ReadKey().KeyChar;
while (s != 'M' && s != 'F')
{
Console.SetCursorPosition(5, 0);
s = Console.ReadKey().KeyChar;
}
Console.Write("\nOK");
Console.ReadKey();
}
71 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
5.1.1. Lista de exercícios
1) Criar uma rotina de entrada que aceite somente um valor positivo.
2) Entrar com 2 (dois) valores via teclado, onde o segundo deverá ser maior que
o primeiro. Casocontrário solicitar novamente apenas o segundo valor.
3) Entrar via teclado com o sexo de determinado usuário, aceitar somente “F” ou
“M” como respostas válidas.
4) Exibir a tabuada do número 5 (cinco) no intervalo de um a dez.
5) Entrar via teclado com um valor qualquer. Travar a digitação, no sentido de
aceitar somente valores positivos. Após a digitação, exibir a tabuada do valor
solicitado, no intervalo de um a dez.
6) Entrar via teclado com um valor (X) qualquer. Travar a digitação, no sentido de
aceitar somente valores positivos. Solicitar o intervalo que o programa que
deverá calcular a tabuada do valor digitado, sendo que o segundo valor (B),
deverá ser maior que o primeiro (A), caso contrário, digitar novamente somente
o segundo. Após a validação dos dados, exibir a tabuada do valor digitado, no
intervalo decrescente, ou seja, a tabuada de X no intervalo de B para A.
7) Exibir a tabuada dos valores de um a vinte, no intervalo de um a dez. Entre as
tabuadas, solicitar que o usuário pressione uma tecla.
8) Exibir a soma dos números inteiros positivos do intervalo de um a cem.
9) escreva um programa que receba via teclado 10 (dez) valores e que, ao final,
exiba o maior e menor deles.
10) Exibir os 30 (trinta) primeiros valores da série de Fibonacci. A série: 1, 1, 2, 3,
5, 8, ...
11) Calcular e exibir a soma dos “N” primeiros valores da sequência abaixo. O valor
“N” será digitado, deverá ser positivo, mas menor que cinquenta. Caso o valor
não satisfaça a restrição, enviar mensagem de erro e solicitar o valor
novamente.
Sequência:
1
2
,
2
3
,
3
4
,
4
5
, …
72 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
12) Descreva um programa que receba via teclado 10 (dez) valores e que, ao final,
exiba o maior e menor deles.
13) Descreva um programa que calcule o resto da divisão de dois números A e B
(A>B) utilizando somente subtrações. Faça todas as proteções necessárias.
14) Descreva um programa que solicita que sejam digitados o peso e o sexo de um
grupo de 100 (cem) pessoas. No final, o programa deverá mostrar na tela a
média do peso dos homens e a média do peso das mulheres.
15) Entrar via teclado com “N” valores quaisquer. O valor “N” (que representa a
quantidade de números) será digitado, deverá ser positivo, mas menor que
vinte. Caso a quantidade não satisfaça a restrição, enviar mensagem de erro e
solicitar o valor novamente. Após a digitação dos “N” valores, exibir:
a) O maior valor;
b) O menor valor;
c) A soma dos valores;
d) A média aritmética dos valores;
e) A porcentagem de valores que são positivos;
f) A porcentagem de valores negativos.
5.2. Estrutura “DO-WHILE”
A instrução while faz o teste da condição antes de executar o laço (loop), já a instrução
“Do While” fará o teste condicional APÓS a iteração do bloco de instruções. Isso significa
que neste caso, o laço será executado com certeza pelo menos uma vez, pois a condição
será testada depois do bloco.
Da mesma maneira que a instrução “while” aqui também executará um bloco de
instruções enquanto uma condição se mantém como verdadeira. Logicamente temos o
seguinte gráfico:
73 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Figura 27: Fluxograma da estrutura de controle de repetição “Do While”.
Neste caso, o “BlocoA” será executado e DEPOIS a condição é avaliada e se
verdadeira, o laço é processado novamente. O loop deixa de ser executado quando a
condição avaliada for falsa.
Sintaticamente temos o seguinte:
do
{
blocoA;
} while (condição);
As mesmas regras dos caracteres chaves “{}” valem também para esta estrutura, ou
seja, é obrigatório o uso dos caracteres se o bloco contiver mais de uma instrução.
Exemplo 1: Vamos criar um programa para exibir valores inteiros de 1 a 10.
static void Main(string[] args)
{
int contador = 0;
do
{
contador++;
Console.WriteLine("Contador = {0}", contador);
} while (contador < 10);
Console.ReadKey();
BlocoA
Condição V
F
74 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
}
Figura 28: Resultado do processamento da aplicação do Exemplo 1
Para acompanhar melhor o que está acontecendo com a variável “contador” e,
também, com a avaliação, faça uma execução passo a passo do programa. No menu Debug
clique na opção “Step Into”, ou pressione a tecla de atalho “F11”.
Figura 29: Opção “Step Info” para “debugação” do código fonte.
75 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Uma linha ficará em destaque, representando qual a instrução que será processada
pelo programa e se você posicionar o indicador do mouse sobre a linha conseguirá
acompanhar os valores que estarão na memória naquele instante da execução.
Para encerrar este procedimento de acompanhamento, pressione as teclas “Shift+F5”,
ou no menu “Debug”, acione a opção “Stop Debugging”. Poderá fechar a janela da
“Console”, que o processamento também será interrompido.
Vamos agora exemplificar com mais códigos para você melhorar seu aprendizado.
Exemplo 2: Criar uma rotina de entrada que aceite somente um valor positivo.
static void Main(string[] args)
{
int x;
do
{
Console.Write("Valor positivo: ");
x = int.Parse(Console.ReadLine());
} while (x <= 0);
Console.Write("OK");
Console.ReadKey();
}
Exemplo 3: Entrar com dois valores via teclado, onde o segundo deverá ser maior que
o primeiro. Caso contrário solicitar novamente apenas o segundo valor.
static void Main(string[] args)
{
int a, b;
b = 0;
Console.Write("1º valor :");
a = int.Parse(Console.ReadLine());
76 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
do
{
Console.Write("2º valor :");
a = int.Parse(Console.ReadLine());
} while (b <= a);
Console.Write("OK");
Console.ReadKey();
}
Exemplo 4: Entrar via teclado com o sexo de determinado usuário, aceitar somente
“F” ou “M” como respostas válidas.
static void Main(string[] args)
{
char s;
Console.Write("Sexo:");
do
{
Console.SetCursorPosition(5, 0);
s = Console.ReadKey().KeyChar;
} while (s != 'M' && s != 'F');
Console.Write("\nOK");
Console.ReadKey();
}
77 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
5.2.1. Lista de exercícios
1) Descreva um programa que calcule a soma dos números inteiros positivos
menores que 100.
2) Descreva um programa que exiba no monitor os 100 primeiros números inteiros
múltiplos de 5.
3) Descreva um programa que a calcule a soma de: 1 + 3 + 5 + 7 + … + 121.
4) Descreva um programa que exiba no monitor a sequência de números: 10, 8,
6, 4, 2,0.
5) Calcule e exiba no monitor a soma e o produto dos 5 primeiros termos da série:
....
25
1
16
1
9
1
4
1
1
1
+++++
6) Desenvolva um programa que multiplique dois números inteiros A e B, que são
digitados via teclado, utilizando somente somas. Proteja para que a digitação
garanta que A seja maior que B bem como A e B sejam inteiros.
7) Analise o tempo de execução do problema anteriore determine uma solução
na qual a multiplicação ocorra num tempo mínimo.
8) Desenvolva um programa que exiba no vídeo os 20 primeiros números primos.
Um número é, por definição, primo se ele não tem divisores, exceto 1 e ele
próprio.
9) Desenvolva um programa que calcule a soma dos algarismos de um número
inteiro “N” digitado via teclado.
10) Descreva um programa que calcule a potência inteira N qualquer de um número
positivo B utilizando somente produtos. Prever a possibilidade de N ser maior,
menor ou igual a zero.
11) Desenvolva um programa que calcule e exiba no monitor o produto dos
números inteiros múltiplos de 9 menores que 39.
12) Elabore um algoritmo que escreva todos os números múltiplos de 7 entre 1 e
100.
13) Descreva um programa que receba via teclado 50 valores que são digitados e
a cada 5 valores exiba a soma parcial deles.
78 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
14) Calcule e exiba no monitor a soma dos 20 primeiros termos da série:
1
2
+
2
3
+
3
4
+
4
5
+⋯
15) Calcule e exiba no monitor a soma dos 10 primeiros termos da série:
1!
1
+
2!
3
+
3!
5
+
4!
7
+ ⋯
5.3. Estrutura “FOR”
Existe uma maneira de se repetir um determinado bloco de instruções, enquanto uma
condição permanecer verdadeira, ou seja, o programa irá executar as mesmas instruções
repetidamente, enquanto uma determinada condição se mantiver como verdadeira. Vimos
a utilização desta técnica na última aula, através da estrutura “while”.
Muito semelhante também será a estrutura de repetição deste capítulo, pois a
estrutura de repetição “For” também executa um determinado bloco enquanto uma
condição permanecer verdadeira, normalmente, um contador controla o laço.
Esta estrutura consiste em repetir blocos de instruções controlados por contadores.
Logicamente temos a seguinte estrutura (figura 30):
Figura 30: Fluxograma da estrutura de controle de repetição “For”.
79 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
A variável “V” irá variar de “A” até “B”, e para cada valor de “V”, o bloco de instruções
será processado. Dizemos que:
• V = variável de controle do laço.
• A = Valor inicial de V.
• B = Valor final de V.
• P = Representa o passo da variação, isto é, de quantas unidades o controlador (V)
será alterado, para se processar a variação.
Por exemplo, para X = 0 até 10 com passo 2, terá a variável “X”, assumindo os
seguintes valores: 0, 2, 4, 6, 8, 10. Um de cada vez, evidentemente.
Outro detalhe também importante nesta estrutura é que a condição é testada ANTES
de se executar o bloco de instruções, ou seja, se o bloco é processado, realmente a
condição é verdadeira. Isso significa que nesta estrutura, se a condição for falsa na primeira
vez que for testada, então o bloco não será executado nenhuma vez.
Em contrapartida, devemos tomar cuidado também com os procedimentos que farão
parte do bloco, pois se a condição sempre ficar como verdadeira, seu programa irá entrar
em “loop” infinito, pois não teria como sair do laço (estrutura de repetição). Isto também é
notado nas estruturas “while” e “do..while”, já vistas em capítulos anteriores.
Sintaticamente temos o seguinte:
for (v = a; v <= b; v++)
{
BlocoA;
}
Onde:
• v => Nome da variável de controle.
80 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
• a => Valor inicial da variável de controle.
• v <= b => Condição de continuação do laço.
• b => Valor final de variável de controle.
• v++ => Incremento da variável de controle
As partes da inicialização, expressão booleana e atualização da variável de controle
de uma instrução “for” devem sempre ser separadas por ponto-e-vírgulas (;).
A condição é analisada antes de se executar o bloco de instruções, que deverá estar
definido entre os caracteres chaves “{}”, a não ser, que o bloco tenha uma única instrução,
onde não seriam necessárias as chaves para a definição do bloco. Isto significa que os
caracteres chaves são necessários quando o bloco de instruções contiver mais de um
comando.
Exemplo 1: Vamos criar um programa para exibir valores inteiros de 1 a 10.
static void Main(string[] args)
{
int contador;
for (contador = 1; contador <= 10; contador++ )
{
Console.WriteLine("Contador = {0}", contador);
}
Console.ReadKey();
}
81 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Figura 31: Solução do processamento da solução do Exemplo 1.
Neste caso, enquanto o contador se mantém menor ou igual a dez, o laço será
executado. Lembrando apenas que a expressão “contador++” é a mesma coisa que
“contador = contador + 1”.
Podemos também fazer os laços em ordem decrescente, ou seja, a variável de
controle irá diminuir enquanto não atingir o valor final, que seria menor que o valor inicial.
Por exemplo, vamos fazer o mesmo projeto, mas exibir os valores em ordem decrescente,
de dez para um.
static void Main(string[] args)
{
int contador;
for (contador = 10; contador >= 1; contador-- )
{
Console.WriteLine("Contador = {0}", contador);
}
Console.ReadKey();
}
Neste caso, a variável de controle “contador” iniciou com o valor 10 (dez), executou o
laço e foi alterada, sendo decrementada em uma unidade (contador--). Enquanto o contador
se mantinha maior ou igual a 1 (um), o laço era repetido.
82 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
A inicialização ocorre uma única vez no início do loop. Se a expressão booleana
(condição) for avaliada como verdadeira, o laço será processado. A variável de controle é
atualizada e a expressão é reavaliada. Se a condição ainda for verdadeira, o laço se repete,
caso contrário, o programa prossegue sua execução linear, após o laço “for”.
Alguns exemplos usando a estrutura “for”
a) Variação da variável de controle de 1 a 10, em incrementos de 1.
for (int i = 1; i <= 10; i++)
b) Variação da variável de controle de 10 a 1 em incrementos de -1 (decrementos de
1).
for (int i = 10; i >= 1; i--)
c) Variação da variável de controle de 5 a 65 em incrementos de 5 (passos de 5)
for (int i = 5; i <= 65; i += 5)
d) Variação da variável de controle de 20 a 0 em decrementos de 2 (passos de -2)
for (int i = 20; i >= 0; i -= 2)
Quando uma variável de controle for declarada na estrutura “for”, então ela somente
poderá ser utilizada dentro do laço, ou seja, após o corpo da estrutura gera um erro de
compilação.
Se necessário, é possível fornecer várias inicializações e várias atualizações em um
loop “for” (com apenas uma expressão lógica). Para conseguir isso, separe as várias
inicializações e atualizações por vírgula, como mostrado no exemplo abaixo:
static void Main(string[] args)
{
int a, b, t;
for (a = 1, b = 10; a <= 10; a++, b--)
{
t = a * b;
83 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Console.WriteLine("{0} x {1} = {2}", a, b, t);
}
Console.ReadKey();
}
A variável “a” será inicializada com o valor 1 e a variável “b” será inicializada com o
valor 10. Enquanto a expressão lógica “a <= 10” resultar em verdadeiro, o laço será
executado. Após o loop, a variável “a” é incrementada e a variável “b” é decrementada,
simultaneamente. Vamos agora exemplificar com mais códigos paravocê melhorar seu
aprendizado.
Exemplo 2: Exibição da tabuada do número 5 (cinco) no intervalo de 1 (um) a 10 (dez).
static void Main(string[] args)
{
int i, t;
for (i = 1; i <= 10; i++)
{
t = 5 * i;
Console.WriteLine("{0} x {1} = {2}", 5, i, t);
}
Console.ReadKey();
}
5.3.1. Lista de exercícios
1) Calcular e exibir a soma dos “N” primeiros valores da sequência abaixo. O valor
“N” será digitado, deverá ser positivo, mas menor ou igual a 20 (vinte). Caso o
valor não satisfaça a restrição, enviar mensagem de erro e solicitar o valor
novamente.
1
2
,
2
3
,
3
4
,
4
5
,…
84 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
2) Calcular e exibir a soma dos “N” primeiros valores da sequência abaixo. O valor
“N” será digitado, deverá ser positivo, mas menor ou igual a 50 (cinquenta).
Caso o valor não satisfaça a restrição, enviar mensagem de erro e solicitar o
valor novamente.
2
1
,
5
8
,
10
27
,
17
64
,…
3) A prefeitura de uma cidade fez uma pesquisa entre seus 500 (quinhentos)
habitantes, coletando dados sobre o salário e o número de filhos. A prefeitura
deseja saber:
a) A média dos salários da população;
b) A média dos números de filhos;
c) O maior salário;
d) A porcentagem de pessoas com salários até R$ 1.000,00.
4) Um supermercado deseja facilitar o trabalho de seus caixas utilizando um
computador para calcular quantas moedas de cada espécie (0,01, 0,05, 0,10,
0,25, 0,50 e 1,00) devem ser devolvidas como troco. Desenvolva um programa
para que o caixa digite o valor da compra, a quantia dada para pagamento e
que após o processamento exiba no monitor o número de moedas a ser
devolvida de cada espécie.
5) Uma pessoa faz uma aplicação no valor digitado pelo usuário, durante 11
meses, a uma taxa de juros compostos de 5% a.m., capitalizados
mensalmente. Calcular o montante no final do prazo.
85 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
6. VARIÁVEIS INDEXADAS
6.1. Conceitos
Em muitas situações práticas, se faz necessário à referência a um conjunto de
variáveis do mesmo tipo através de um mesmo nome. Para que isto seja possível, foram
criadas as variáveis indexadas, também chamadas de arrays ou variáveis compostas
homogêneas, que representam um conjunto de variáveis do mesmo tipo, acessadas pelo
mesmo nome e diferenciadas entre si através de uma posição dentro desta estrutura. Esta
posição é chamada de índice ou subscritor do array, e as variáveis indexadas podem ser
definidas tendo um ou mais índices. Chamados de vetor as variáveis indexadas que
possuem apenas um índice. Quando uma variável indexada possuir mais de um índice, a
chamaremos de matriz.
Exemplo:
X[3]
A variável indexada X é afetada por 3 (três) índices, ou seja,
podemos dizer que ela poderá armazenar 3 (três) informações
distintas, todas do mesmo tipo.
As variáveis indexadas apresentam algumas propriedades que fazem com elas sejam
extremamente úteis em várias situações, a saber:
a) O índice pode ser genérico: pode-se escrever, por exemplo, F[Y], onde o índice é
Y desde que o valor de Y seja encontrado na memória conforme o exemplo:
K=7
X=D[K]
Neste ponto do programa, o computador procura em sua memória
o valor de K e passa então a entender que a variável indexada é
D[7]
b) É possível fazer operações internas no índice
T=5
Z=W[T+4]
Neste ponto do programa, o computador efetua a operação T+4
e passa a entender que a variável indexada é W[9]
86 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
As variáveis indexadas são tratadas no computador de forma idêntica às variáveis
convencionais, ou seja, elas representam endereços de memória nos quais estão
armazenados os valores.
No exemplo abaixo é demonstrado um vetor “prof” com seus índices e conteúdo:
prof[0] = “José”
prof[1] = “João”
prof[2] = “Joana”
prof[3] = “Maria”
prof[4] = “Fernando”
prof[5] = “Katia”
Este é um vetor do tipo “string” chamado “prof”, contém 6 elementos, (nomes dos
professores). O programa poderá fazer referência a qualquer elemento, bastando para isto,
identificar a posição do elemento, entre os caracteres colchetes “[ ]”.
Observações:
a) Os números de 0 a 5 representam a posição do elemento (índice do array);
b) Os valores “José”, “João” etc., representam o conteúdo do vetor “prof”;
c) Todos os elementos possuem o mesmo nome (prof);
d) O primeiro elemento de todo array é o elemento 0 (zero). Assim o primeiro
elemento deste vetor é o prof[0], que contém o nome “José”, o segundo é prof[1]
que contém “João”, o terceiro é prof[2] que contém “Joana” e assim até o enésimo
elemento que é prof[n-1] que contém “Katia”. Isto significa que se o vetor possuir
n elementos, os índices variam de 0 (zero) a n-1 (inteiros).
Existe uma propriedade para vetores chamada “Length” na linguagem C#, que retorna
o número de ocorrências de um vetor, ou seja, o tamanho do vetor em número de
elementos. Em nosso exemplo, “prof.Length” retorna o valor 6 (seis).
87 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
6.2. Declarando um vetor
Especificamos o tipo dos elementos e usamos o operador new para alocar de
maneira dinâmica os dados em memória.
Exemplo 1 int[] x = new int[15];
Aloca 15 elementos para o vetor inteiro x.
Isto também pode ser feito em dois momentos:
int[] x;
x = new int[15];
Exemplo 2 double[] r = new double[10];
Aloca 10 elementos para o vetor real r.
Exemplo 3 string[] prof = new string[6];
Aloca 6 elementos para o vetor string prof.
Vejamos o programa abaixo utilizando o vetor “prof”.
static void Main(string[] args)
{
string[] prof = new string[6] {
"José",
"João",
"Joana",
"Maria",
"Fernando",
"Katia" };
for (int i = 0; i < prof.Length; i++)
{
Console.WriteLine("{0}", prof[i]);
}
Console.ReadKey();
}
Neste caso, o vetor “prof” já foi declarado e inicializado com os elementos (nomes
dos professores). O laço simplesmente exibirá os elementos no vídeo. Repare que foi
utilizada a propriedade “Length” para saber o tamanho do vetor.
88 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Desafio: Faça uma alteração no programa, no sentido de solicitar os nomes dos
professores para o usuário, ou seja, os nomes serão digitados e não atribuídos
pelo programa.
No exemplo abaixo, serão digitados 10 valores quaisquer, e após a digitação, o
programa irá “varrer” o vetor e acumular os valores de todos os elementos na variável
soma. A soma será apresentada na tela, assim como os valores dos elementos digitados.
static void Main(string[] args)
{
double soma = 0;
int i;
double[] valor = new double[10]; // Entrada de dados no vetor
for (i = 0; i < valor.Length; i++)
{
Console.Write("{0}º valor :", i + 1);
valor[i] = double.Parse(Console.ReadLine());
}
Console.Clear();
// Varrer o vetor e calcular a soma
for (i = 0; i < valor.Length; i++)
{
Console.WriteLine("{0}º valor : {1}", i + 1, valor[i]);
soma += valor[i];}
// Exibir a soma dos valores
Console.WriteLine("Soma dos valores : {0:f1}", soma); Console.ReadKey();
}
89 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Mais exemplos...
1) A armazenar 10 (dez) números na memória do computador. Exibir os valores na
ordem inversa à da digitação.
static void Main(string[] args)
{
int i;
int[] x = new int[10]; // Entrada de dados
for (i = 0; i < x.Length; i++)
{
Console.Write("{0}º valor : ", i + 1);
x[i] = int.Parse(Console.ReadLine());
}
// Exibir em ordem inversa a da digitação
for (i = x.Length - 1; i >= 0; i--)
Console.WriteLine("{0}º valor : {1}", i + 1, x[i]);
Console.ReadKey();
}
2) Armazenar 10 (dez) valores na memória do computador. Após a digitação dos
valores, criar uma rotina para ler os valores e achar e exibir o maior deles.
static void Main(string[] args)
{
int i, maior;
int[] x = new int[10];
// Entrada de dados
for (i = 0; i < x.Length; i++)
{
Console.Write("{0}º valor : ", i + 1);
x[i] = int.Parse(Console.ReadLine());
}
// Achar e exibir o maior valor
maior = x[0];
for (i = 1; i < x.Length; i++)
90 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
{
if (x[i] > maior)
{
maior = x[i];
}
}
Console.WriteLine("Maior valor : {0}", maior);
Console.ReadKey();
}
3) Armazenar 20 (vinte) valores em um vetor. Após a digitação, entrar com uma
constante multiplicativa que deverá multiplicar cada um dos valores do vetor e
armazenar o resultado no próprio vetor, na respectiva posição.
static void Main(string[] args)
{
int i, k;
int[] x = new int[20];
// Entrada de dados
for (i = 0; i < x.Length; i++)
{
Console.Write("{0}º valor:", i + 1);
x[i] = int.Parse(Console.ReadLine());
}
// valor da constante multiplicativa Console.Write("Valor da constante : ");
k = int.Parse(Console.ReadLine());
// Multiplicar o vetor pela constante
for (i = 0; i < x.Length; i++)
{
x[i] = x[i] * k;
Console.WriteLine("{0}º valor: {1}", i + 1, x[i]);
}
Console.ReadKey();
}
91 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Conforme exposto anteriormente, chamados de vetor as variáveis indexadas que
possuem apenas um índice. Quando uma variável indexada possuir mais de um índice, a
chamaremos de matriz. Vejamos um exemplo de programa em linguagem C# que recebe
6 (seis) valores inteiros através do teclado, os armazena em uma matriz e, na sequência,
ainda, os exibe no vídeo.
static void Main(string[] args)
{
int i, j, contador = 1;
int[,] matriz = new int[2,3];
// Entrada de dados via teclado e armazenamento na MATRIZ
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
Console.Write("Digite o {0} valor : ", contador);
matriz[i,j] = int.Parse(Console.ReadLine());
contador++;
}
}
//Exibição dos valores armazenados na MATRIZ
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
Console.WriteLine("O valor da posição posicao {0},{1} é {2}", i, j, matriz[i, j]);
}
}
Console.ReadKey();
}
Vejamos outro exemplo com matriz no qual o objetivo é criar um programa para
controlar as reservas de poltronas de uma peça teatral, sabendo que o teatro possui “X”
seções de “Y” fileiras com “Z” cadeiras cada. Os valores de “X”, “Y” e “Z” serão digitados.
92 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
static void Main(string[] args)
{
int num = 10;
string[,,] teatro = new string[num, num, num];
int setor, fileira, cadeira, contador = 0;
string nome;
char resp;
do
{
Console.Write("Digite o seu nome : ");
nome = Console.ReadLine();
Console.Write("Digite o setor (1 a {0}) : ", num);
setor = int.Parse(Console.ReadLine());
Console.Write("Digite a fileira (1 a {0}) : ", num);
fileira = int.Parse(Console.ReadLine());
Console.Write("Digite a cadeira (1 a {0}) : ", num);
cadeira = int.Parse(Console.ReadLine());
teatro[--setor, --fileira, --cadeira] = nome;
contador++;
resp = 'N';
if (contador < num * num * num)
{
Console.Write("Deseja continuar (S/N)? ");
resp = char.Parse(Console.ReadLine().ToUpper());
}
} while (resp != 'N' && (contador < num*num*num));
for (setor = 0; setor < num; setor++)
for (fileira = 0; fileira < num; fileira++)
for (cadeira = 0; cadeira < num; cadeira++)
{
if (teatro[setor, fileira, cadeira] != null)
{
Console.WriteLine("Nome = {0}, Setor = {1}, Fileira = {2}, Cadeira {3}", teatro[setor, fileira,
cadeira], setor + 1, fileira + 1, cadeira + 1);
}
}
Console.ReadKey();
93 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
}
6.3. Lista de exercícios com Vetores
1) Desenvolva um programa que armazene em um vetor os 30 primeiros termos
da série abaixo:
1
2
,
2
3
,
3
4
,
4
5
,…
2) Armazenar vinte valores na memória. Após a digitação, entrar com uma
constante multiplicativa que deverá multiplicar cada um dos valores do vetor e
armazenar o resultado em outro vetor, porém em posições equivalentes. Exibir
os vetores na tela.
3) Crie um programa que armazene na memória do computador, os 100 primeiros
números inteiros, múltiplos de 5.
4) Descreva um programa que armazene em um vetor 100 números inteiros e
positivos que são digitados, e que em seguida leia esse vetor calculando a
média aritmética dos números que são ímpares.
5) Armazenar um máximo de 20 valores em um vetor. A quantidade de valores a
serem armazenados será escolhida pelo usuário. Enviar mensagem de erro,
caso a quantidade de valores escolhida esteja fora da faixa possível e solicitar
a quantidade novamente. Após a digitação dos valores, criar uma rotina de
consulta, onde o usuário digita um número e o programa exibe em qual posição
do vetor este número está localizado. Se o número não for encontrado, enviar
mensagem “Valor não encontrado!”.
6) Armazenar o nome, sexo e idade de cem pessoas. Consistir as entradas no
sentido de aceitar apenas “F” ou “M” para o sexo e valores positivos para a
idade. Após a digitação dos dados, exibiros dados (nome, sexo e idade) de
todas as pessoas do sexo feminino.
7) Desenvolva um programa que receba uma palavra via teclado e verifique se a
mesma é palíndroma. Uma palavra é palíndroma se é idêntica quando lida de
trás para diante. Por exemplo, "ovo" é um palíndromo.
8) Armazenar vinte valores em um vetor. Após a digitação, exibir os valores em
ordem crescente.
94 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
6.4. Lista de exercícios com Matrizes
1) Armazenar seis valores em uma matriz de ordem 2x3. Apresentar os valores
na tela.
2) Armazenar seis valores em uma matriz de ordem 3x2. Apresentar os valores
na tela.
3) Armazenar seis nomes em uma matriz de ordem 2x3. Apresentar os nomes na
tela.
4) Entrar via teclado com doze valores e armazená-los em uma matriz de ordem
3x4. Após a digitação dos valores solicitar uma constante multiplicativa, que
deverá multiplicar cada valor matriz e armazenar o resultado na própria matriz,
nas posições correspondentes.
5) Entrar via teclado com doze valores e armazená-los em uma matriz de ordem
3x4. Após a digitação dos valores solicitar uma constante multiplicativa, que
deverá multiplicar cada valor matriz e armazenar o resultado em outra matriz
de mesma ordem, nas posições correspondentes. Exibir as matrizes na tela,
sob a forma matricial, ou seja, linhas por colunas.
6) Entrar com uma matriz de ordem MxN, onde a ordem também será escolhida
pelo usuário, sendo que no máximo 10x10. Após a digitação dos elementos,
criar e exibir a matriz transposta.
95 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
7. PROGRAMAÇÃO MODULAR
7.1. Conceitos
Todo programa de computador profissional executa uma série de diferentes tarefas
como, por exemplo, realizar diferentes cálculos, emitir diferentes relatórios, arquivar
diferentes conjuntos de informações, enviar diferentes informações aos terminais etc.
Quando um problema dessa natureza é desenvolvido, é construído um conjunto de
subprogramas chamados módulos, cada um dos quais executando uma tarefa específica.
A junção desse conjunto de módulos constitui o que se chama de um Sistema. A grande
vantagem desse tipo de procedimento é reduzir um grande programa a pequenos
subprogramas, cada um dos quais será facilmente desenvolvido analisado e testado. Essa
técnica chama-se Programação Modular.
Como o Sistema é constituído de vários programas, se faz necessário à existência de
um módulo que os administre. Este módulo determina qual deve ser executado a cada
instante em função da determinação do usuário ou através da função de uma situação do
momento. O módulo de programa que executa essa função é chamado de Módulo de
gerenciamento do Sistema.
O princípio básico deste método é resolver um problema complexo, dividindo-o em
partes menores (subproblemas) e de soluções mais simples. Os subproblemas para os
quais não for possível encontrar uma solução de imediata poderão ser novamente
subdivididos. Ao solucionarmos todos os subproblemas menores, teremos solucionado
também o problema como um todo.
Este método também conhecido como Método dos Refinamentos Sucessivos
representa uma sistemática de abordagem para resolução de problemas e implementação
de aplicações.
96 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
A estrutura básica de um módulo de gerenciamento de um Sistema é constituída de
um “menu”, isto é, de uma lista de possíveis atividades realizadas pelo Sistema, entre as
quais o usuário pode escolher seguido de uma estrutura de decisão que determina qual
módulo (sub-rogaram) deve ser executado naquele momento.
Estrutura da Programação Modular:
Módulo A
Módulo B
Módulo A
Módulo B
Fim
Fim
Módulo C
Módulo C
Fim
No esquema acima é evidenciada a forma pela qual são invocados os módulos. Uma
vez executados, eles realizam o processamento das instruções ali definidas e ao término
da execução delas retornam ao programa chamador, para a próxima instrução após a
chamada.
É importante salientar que durante o processamento dos módulos A e B, o
processamento do programa principal é paralisado.
97 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Exemplo 1: Faça um algoritmo que leia a idade de uma pessoa expressa em
anos, meses e dias e escreva a idade dessa pessoa expressa apenas em dias.
Considerar ano com 365 dias e mês com 30 dias.
static int CalculaIdade (int anos, int meses, int dias)
{
int idade = (anos * 365) + (meses * 30) + dias;
return (idade);
}
static void Main(string[] args)
{
Console.Write("Digite a idade (anos) de uma pessoa: ");
int anos = int.Parse(Console.ReadLine());
Console.Write("Digite a idade (meses) de uma pessoa: ");
int meses = int.Parse(Console.ReadLine());
Console.Write("Digite a idade (dias) de uma pessoa: ");
int dias = int.Parse(Console.ReadLine());
Console.Write("Esta pessoa possui {0} dias de idade", CalculaIdade(anos, meses, dias));
Console.ReadKey();
}
}
Exemplo 2: Desenvolver um programa que permita ao usuário, selecionar as
seguintes opções a partir de uma menu: (1) Digitação de valores em um array; (2) Cálculo
da soma dos números pares; (3) Identificação do maior número do array; (4) Fim.
static void Criar_Array (ref int[]vetor)
{
for (int i = 0; i < vetor.Length; i++)
{
Console.Write("Digite o {0} valor: ", i + 1);
vetor[i] = int.Parse(Console.ReadLine());
}
}
static int Soma(int[] vetor)
{
98 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
int somatoria = 0;
for (int i = 0; i < vetor.Length; i++)
{
if (vetor[i] % 2 == 0)
{
somatoria += vetor[i];
}
}
return (somatoria);
}
static int Maior(int[] vetor)
{
int maior_numero = vetor[0];
for (int i = 1; i < vetor.Length; i++)
{
if (vetor[i] > maior_numero)
{
maior_numero = vetor[i];
}
}
return (maior_numero);
}
static void Main(string[] args)
{
int[] vetor = new int[20];
int escolha;
bool controle = true;
do
{
Console.Clear();
Console.WriteLine("1 - Digitação dos valores no ARRAY");
Console.WriteLine("2 - Cálculo da soma dos números pares");
Console.WriteLine("3 - Determinar maior número do ARRRAY");
Console.WriteLine("4 - Para SAIR");
escolha = int.Parse(Console.ReadLine());
switch(escolha)
{
case 1:
99 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
if (controle == false)
{
Console.Write("Vetor já criado!");
Console.ReadKey();
}
else
{
Criar_Array(ref vetor);
controle = false;
}break;
case 2:
Console.Write("A soma dos elementos pares do Array é {0}", Soma(vetor));
Console.ReadKey();
break;
case 3:
Console.Write("O maior número do Array é {0}", Maior(vetor));
Console.ReadKey();
break;
}
} while (escolha != 4);
}
7.2. Lista de exercícios
1) Escreva uma função que calcule e retorne o fatorial de um número inteiro
positivo.
2) Escreva uma função que verifique se um número é primo. Sua função deve
retornar verdadeiro ou falso. O argumento de entrada é o número a ser
verificado.
3) Descreva um programa que apresente as rotinas abaixo que são escolhidas
pelo usuário a partir de um menu apresentado no início do programa:
100 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
a) Criação de um array de 30 (trinta) números inteiros e positivos e que só pode
ser executada uma única vez (faça as proteções necessárias contra uma
Segunda utilização desta rotina);
b) Cálculo da soma de todos os números que são ímpares;
c) Determine o menor número do array;
Observação: O programa deve impedir que números negativos sejam gravados
no array bem como que a criação do array seja realizada uma 2ª vez ou então
que as rotinas “b” e “c” sejam realizadas antes da criação do array. A rotina a
ser executada deve ser de opção do usuário que a escolherá através de um
menu que deve ser apresentado no início do programa e no fim da operação de
cada rotina. Esse menu deve conter ainda a opção “Fim de serviço”.
4) Desenvolva um programa que receba via teclado o número do CPF do usuário
e o valide através de uma função C#. A fórmula de cálculo do dígito verificador
pode ser consultada em http://ghiorzi.org/DVnew.htm
7.3. Recursividade
A ideia de recursividade é a de um processo que é definido a partir de si próprio. No
caso de um algoritmo, esse é definido invocando a si mesmo. Em outras palavras, trata-se
de uma função que pode chamar a si própria, direta ou indiretamente. Uma função assim é
chamada função recursiva. Todo cuidado é pouco ao se fazer funções recursivas. A
primeira coisa a se providenciar é um critério de parada. Este vai determinar quando a
função deverá parar de chamar a si mesma. Isto impede que a função se chame infinitas
vezes.
7.3.1. Vantagens da recursividade
a) É a maneira mais natural e lógica de resolver um problema;
b) Redução do tamanho do código fonte;
c) Permite descrever algoritmos de forma mais clara e concisa.
http://ghiorzi.org/DVnew.htm
101 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
7.3.2. Desvantagens da recursividade
a) O constante uso da pilha pode levar a uma execução mais lenta;
b) O não gerenciamento dinâmico de memória pode levar a um “estouro” da
pilha;
c) Redução do desempenho de execução devido ao tempo para
gerenciamento de chamadas;
d) Dificuldades na depuração de programas recursivos, especialmente se a
recursão for muito profunda.
7.3.3. Outros aspectos da recursividade
a) Procedimentos recursivos introduzem a possibilidade de iterações que
podem não terminar: existe a necessidade de considerar o problema de
terminação. É fundamental que a chamada recursiva a um procedimento “P”
esteja sujeita a uma condição “A”, a qual se torna satisfeita em algum
momento da computação. Ex.: Se não existisse a condição n=0, quando o
procedimento terminaria?
b) Condição de terminação: permite que o procedimento deixe de ser
executado;
c) O procedimento deve ter pelo menos um caso básico para cada caso
recursivo, o que significa a finalização do procedimento
Exemplo 1: Cálculo do fatorial de um número inteiro (na matemática, o fatorial de um
número natural n, representado por n!, é o produto de todos os inteiros positivos menores
ou iguais a n).
static int fatorial(int n)
{
if (n == 0) return 1;
return (n * fatorial(n - 1));
}
static void Main(string[] args)
{
102 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
int num;
Console.Write("Digite um número: ");
num = int.Parse(Console.ReadLine());
Console.WriteLine("O fatorial de {0} é {1}", num, fatorial(num));
Console.ReadKey();
}
}
Exemplo 2: Cálculo da somatória de valores armazenados em um vetor.
static int somatoria (int max, int[]v)
{
if (max == 0)
return (v[0]);
else
return v[max] + somatoria(max - 1, v);
}
static void Main(string[] args)
{
int[] vetor = new int[] { 10, 20, 30, 40, 50 };
Console.WriteLine("A soma é {0}", somatoria(vetor.Length - 1, vetor));
Console.ReadKey();
}
Exemplo 3: Exibir valores armazenados em um vetor.
static void exibe(int max, int[] v)
{
Console.WriteLine(v[max]);
if (max != v.Length - 1)
exibe(max + 1, v);
}
static void Main(string[] args)
{
int[] vetor = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
exibe (0, vetor);
Console.ReadKey();
}
103 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
8. PROGRAMAÇÃO ORIENTADA A OBJETOS
8.1. Conceitos
Como a maioria das atividades que realizamos no dia a dia, programar também possui
modos diferentes de se fazer, os quais são chamados de paradigmas de programação e,
entre eles, estão a programação orientada a objetos (POO) e a programação estruturada.
A diferença principal é que na programação estruturada, um programa é tipicamente
escrito em uma única rotina (ou função) podendo, é claro, ser subdividido em rotinas. De
qualquer forma, o fluxo do programa continua o mesmo, como se pudéssemos copiar e
colar o código das sub-rotinas diretamente nas rotinas que as chamam, de tal forma que,
no final, só haja uma grande rotina que execute todo o programa.
A programação orientada a objetos (POO) surgiu como uma alternativa a essas
características da programação estruturada. O intuito da sua criação também foi o de
aproximar o manuseio das estruturas de um programa ao manuseio das coisas do mundo
real, daí o nome "objeto" como uma algo genérico, que pode representar qualquer coisa
tangível.
A POO envolve um paradigma de programação que se baseia fundamentalmente no
conceito de “Objetos”. É uma forma de desenvolvimento de sistemas de software que o
trata como um conjunto de componentes que interagem entre si para resolver um problema.
Esses componentes são denominados Objetos.
Qualquer pessoa ou empresa que vive da criação de software sem dúvidas não fica
contente ao ver-se escrevendo código similar infinitamente, gastando tempo e recursos na
programação de rotinas que já foram criadas anteriormente, mas que pela falta de uma
metodologia apropriada, não podem ser reutilizadas ou customizadas para suprirem
necessidades específicas de cada cenário. Resumindo, as principais vantagens da POO
são o reuso de código e a capacidade de expansão dele.
104 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
A POO utiliza tipos de dados personalizados. Em vez de operar apenas com tipos de
dados primitivos, podemos construir novos tipos de dados, conforme nossa necessidade.
Esses novos tipos de dados, que chamamos de “classes”, podem conter estruturas
semelhantesa funções, denominadas métodos, e variáveis internas, chamadas
de “atributos”. As classes dão origem a objetos, em um processo
denominado “instanciação”. Os objetos são, por sua vez, os “blocos de construção” de
software na OO (Orientação a Objetos).
São vantagens da Orientação a Objetos:
a) Fornece uma estrutura modular para a construção de programas;
b) Objetos podem ser reutilizados em aplicações diferentes;
c) O software se torna mais fácil de manter;
d) O desenvolvimento é mais rápido, devido ao reuso de código;
e) Encapsulamento: não é necessário conhecer a implementação interna de um
objeto para poder usá-lo.
Qualquer linguagem orientada a objetos deve oferecer suporte aos seguintes
conceitos da POO:
i. Abstração: modelagem de atributos relevantes e as interações de entidades
como classes para definir uma representação abstrata de um sistema.
ii. Encapsulamento: ocultar o estado interno e a funcionalidade de um objeto e
permitir o acesso apenas por meio de um conjunto público de funções.
iii. Herança: capacidade de criar novas abstrações com base em abstrações
existentes.
iv. Polimorfismo: capacidade de implementar propriedades ou métodos
herdados de diferentes maneiras em várias abstrações.
105 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
8.2. Abstração
Abstrair significa selecionar aspectos específicos de um problema a ser analisado,
deixando de lado outros aspectos. É a representação de uma entidade do mundo real na
forma de ideias. As entidades abstraídas podem se comunicar entre si, por meio da troca
de Mensagens.
Pode-se tomar um exemplo da vida real para ilustrar o conceito: um carro é uma
abstração de um veículo que um indivíduo pode utilizar com o objetivo de mover-se de um
ponto a outro. No dia a dia, ninguém dirá: “Vou abrir a porta daquele veículo movido a
combustível, entrarei, me sentarei, darei a partida no motor, pisarei na embreagem,
engatarei a primeira marcha, acelerarei, controlarei a direção em que o carro irá se mover
utilizando o volante”. Tamanha explicação não se faz necessária pois todo o conceito
daquilo foi abstraído para algo que conhecemos como “carro”. Apesar de um carro ser algo
bastante complexo, basta dizer “vou usar o meu carro para ir ao trabalho amanhã”, e
qualquer pessoa entenderá o recado.
Existem também objetos que são criados em muitas aplicações com o intuito de
abstraírem objetos complexos da vida real, como por exemplo Pedido, Cliente, Produto, e
muitos outros.
8.3. Classes
Uma Classe é uma coleção de objetos que são descritos com os mesmos atributos e
as mesmas operações. Uma classe representa uma ideia ou conceito e classifica objetos
que tenham propriedades similares.
As classes são os blocos de construção mais importantes dos sistemas orientados a
objetos, e devem possuir características bem definidas dentro da aplicação. Uma classe é
um tipo personalizado de dados.
Desta forma, uma classe é um tipo abstrato de dados, um “molde” para a criação de
objetos. Cada classe criada se torna um novo tipo disponível para declarar variáveis e criar
objetos. Um objeto é, portanto, um “Instância de uma Classe”.
106 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Por convenção, começamos o nome de uma classe com letra maiúscula, e
capitalizamos cada palavra subsequente que o compuser.
As classes possuem “atributos” e “métodos”. Atributos são características da classe,
que são comuns a todos os objetos derivados, e que podem apresentar valores diversos.
Já os Métodos são as operações possíveis em uma classe (nos objetos instanciados a
partir dela).
Conforme exposto acima, uma classe é um modelo para algo que deve ser criado. Por
exemplo, quando alguém vai fazer um bolo de chocolate, pega-se uma “Receita para Bolo
de Chocolate”, que será usada como um modelo para o bolo que será criado. De forma
análoga, a receita é uma classe, e o bolo é um objeto.
Uma classe não é utilizada diretamente. Ninguém come a receita de bolo. A classe é
utilizada somente para criar objetos baseados nela, e são os objetos que serão realmente
utilizados.
As classes descrevem o tipo de objetos, enquanto objetos são instâncias úteis de
classes. Por definição, afirma-se que um objeto é a instância de uma classe. Dessa forma,
o ato de criar um objeto é chamado de instanciação.
Cada classe pode ter membros de classe diferentes que incluem propriedades que
descrevem dados de classe, métodos que definem o comportamento da classe e eventos
que fornecem comunicação entre classes e objetos diferentes.
8.4. Objetos
Um objeto é uma ocorrência específica de uma classe, ou seja, uma “instância de
classe”. Os objetos são a base da OO. Os objetos representam entidades do mundo real,
como aviões, pessoas, contas correntes etc., mas também podem representar outros
conceitos, como gráficos (círculos, quadrados, cones, esferas etc.) Um objeto possui
características próprias (atributos) e executa determinadas ações (métodos), sendo esses
atributos e métodos provenientes da classe que origina o objeto (figura 32).
107 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Figura 32: Exemplo ilustrativo de classe e objetos.
8.5. Mensagens
Os objetos se comunicam a partir da troca de mensagens. Uma mensagem é um sinal
enviado de um objeto a outro, o qual requisita um serviço, usando uma operação
programada no objeto chamado. Por exemplo, para que um objeto execute um método, é
necessário enviar a este objeto uma mensagem solicitando a execução do método
desejado. As mensagens somente ocorrem entre objetos que possuem uma Associação.
As mensagens também são programadas. Quando uma mensagem é recebida, uma
operação é invocada no objeto chamado. Há vários formatos de mensagens: procedures
(subs e functions), passagem de sinais entre threads, acionamento de eventos etc.
8.6. Atributos de Classe
Os atributos de Classes, também chamados de Propriedades, envolvem a
característica particular de uma ocorrência de uma classe, como por exemplo o nome e a
idade de uma pessoa. Existem 2 (dois) tipos principais de propriedades:
108 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
a) Estáticas: mantém o valor durante toda a sua existência. Por exemplo, a data de
nascimento de uma pessoa é uma propriedade estática, pois mantém o valor
durante toda a existência do objeto instanciado;
b) Dinâmicas: podem ter valores que variam com o passar do tempo. A idade de uma
pessoa pode ser considerada um atributo dinâmico, pois pode variar ao longo do
tempo
8.7. Métodos
É a lógica contida em uma classe para atribuir-lhe comportamentos. São as funções
e procedimentos contidos na classe. O ato de invocar um método é a passagem de
mensagens para o objeto.
Um método é uma sequência de declarações (instruções) que possui um nome de
identificação. É similar a uma função ou procedimento. Um método possui um nome e um
corpo onde ficam os comandos que serão executados quando o método for chamado, e
podem receber dados para processamento (parâmetros) e retornar informações.
Os métodos são a forma principal de passagem de mensagens entre objetos. Um
método deve executar sempre uma operação única. Os métodos também precisam ter um
tipo de retorno, que pode ser um tipo de valor, de referência ou ainda void (não retornam
valor).
Para definir um método de uma classe:
class SampleClass
{
public int ExemploMetodo (string exemploArgumento)
{
// Insera o código aqui
}
}
109 Programação Orientada a Objetos
UniversidadeSanta Cecília - Educação a Distância
Toda classe possui um método especial chamado de método “construtor”, que
inicializa o objeto instanciado, ou seja, os Construtores são os métodos da classe que são
executados automaticamente quando um objeto de um determinado tipo é criado. Eles,
geralmente inicializam os membros de dados do novo objeto. Além disso, o código no
construtor é sempre executado antes de qualquer outro código em uma classe. Para definir
um construtor para uma classe:
class ExemploClasse
{
public ExemploClasse()
{
// Insera o código aqui
}
}
Por outro lado, as classes também usam métodos destruidores para finalizar os
objetos após seu uso.
8.8. Campos
Conforme exposto anteriormente, uma classe pode conter vários elementos, dentre
os quais, também se destacam os “Campos” que são variáveis declaradas dentro das
classes. Por exemplo:
class ExemploClass()
{
public string nome;
}
110 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
8.9. Exemplos de POO
Exemplo 1: Cálculo da área de um círculo com um único método construtor.
class Program
{
class Circle
{
private int raio;
public Circle() // construtor padrão
{
raio = 0;
}
public double Area()
{
return (Math.PI * raio * raio);
}
}
static void Main(string[] args)
{
Circle c; // cria uma variável da Classe Circle
c = new Circle(); // inicializa a variável
double areadocirculo;
areadocirculo = c.Area();
Console.WriteLine(areadocirculo);
Console.ReadKey();
}
}
111 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Exemplo 2: Cálculo da área de um círculo com 2 (dois) métodos construtores.
class Program
{
class Circle
{
private int raio;
public Circle() // construtor padrão
{
raio = 0;
}
public Circle(int raioinicial) // construtor sobrecarregado
{
raio = raioinicial;
}
public double Area()
{
return (Math.PI * raio * raio);
}
}
static void Main(string[] args)
{
Circle c; // cria uma variável da Classe Circle
c = new Circle(4); // inicializa a variável
double areadocirculo;
areadocirculo = c.Area();
Console.WriteLine(areadocirculo);
Console.ReadKey();
}
}
112 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Observação: O método construtor a ser processado é aquele que contém o montante
de argumentos de sua chamada. No exemplo acima, o método construtor é chamado
quando da instanciação do objeto e receberá o argumento “4”. O método construtor
“sobrecarregado” é aquele que será invocado pois este foi declarado para receber um
argumento.
Exemplo 3: Cálculo da área de um círculo com 2 (dois) métodos construtores. Neste
exemplo, 2 (dois) objetos serão instanciados.
class Program
{
class Circle
{
private int raio;
public Circle() // construtor padrão
{
raio = 0;
}
public Circle(int raioinicial) // construtor sobrecarregado
{
raio = raioinicial;
}
public double Area()
{
return (Math.PI * raio * raio);
}
}
static void Main(string[] args)
{
Circle c; // cria uma variável da Classe Circle
c = new Circle(); // inicializa a variável
double areadocirculo;
areadocirculo = c.Area();
Console.WriteLine(areadocirculo);
113 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Console.ReadKey();
Circle d; // cria uma variável da Classe Circle
d = new Circle(4); // inicializa a variável
areadocirculo = d.Area();
Console.WriteLine(areadocirculo);
Console.ReadKey();
}
}
Exemplo 4: Cálculo da área de um círculo. Neste exemplo, o método recebe um
argumento (valor) que representa o raio da figura geométrica.
class Program
{
class Circle
{
private int raio;
public Circle() // construtor padrão
{
raio = 0;
}
public double Area(int raio)
{
return (Math.PI * raio * raio);
}
}
static void Main(string[] args)
{
Circle c; // cria uma variável da Classe Circle
c = new Circle(); // inicializa a variável
double areadocirculo;
int raio = 4;
areadocirculo = c.Area(raio);
Console.WriteLine(areadocirculo);
Console.ReadKey();
114 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
}
}
Exemplo 5: Programa que permite o armazenamento e acesso do nome de um aluno
em um objeto instanciado da classe “Aluno”.
class Program
{
class Aluno
{
string nome;
// Método construtor
public Aluno(string n)
{
nome = n;
}
// Insere valor no atributo
public void GravaNome (string n)
{
nome = n;
}
// Método de retorna o valor do atributo
public string getNome()
{
return (nome);
}
}
static void Main(string[] args)
{
Aluno alu = new Aluno("Carlos");
Console.WriteLine("Nome do aluno é {0} ", alu.getNome());
Console.ReadKey();
alu.GravaNome("Pedro");
Console.WriteLine("Nome do aluno agora é {0} ", alu.getNome());
Console.ReadKey();
115 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
}
}
}
8.10. Lista de exercícios
1) Declare uma classe “Funcionario” que possui 2 (dois) campos (nome do
funcionário e salário). Em seguida realize o instanciamento de um objeto da
respectiva classe.
2) Altere a classe do exercício anterior de tal a forma a implementar um método
construtor que realizar a atribuição inicial para os campos da classe.
3) Crie uma classe chamada “Nota Fiscal” que possa ser utilizado por uma loja de
suprimentos de tecnologia para representar uma fatura de um item vendido na
loja. Uma Nota fiscal deve incluir as seguintes informações como atributos: o
número do item faturado; a descrição do item; a quantidade comprada do item;
o preço unitário do item. Esta classe deve ter um construtor que inicialize os
quatro atributos. Além disso, forneça um método chamado “getInvoiceAmount”
que calcula o valor da fatura (isso é, multiplica a quantidadepelo preço por
item) e depois retorna o valor como um double.
4) Implemente uma classe “Pessoa” que possua como atributos nome, idade,
peso (em quilogramas) e altura (em metros). Faça com que os dados sejam
inicializados através do construtor da classe. Adicione métodos para ler e
alterar cada um dos atributos em separado.
5) Altere a classe “Pessoa” do exercício anterior de modo que ela seja capaz de
calcular o Índice de Massa Corporal (IMC). O cálculo é feito através da fórmula
IMC = peso/altura2. Adicionalmente, implemente um método que informa a
faixa de categoria do IMC que a pessoa se encontra, utilizando a seguinte
tabela.
Peso Categoria
< 20 Abaixo do peso
> 20 e <=25 Peso normal
>25 e <= 30 Sobrepeso
> 30 e <=35 Obesidade grau I
> 35 e <=40 Obesidade grau II
> 40 Obesidade grau III
116 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
9. PROPRIEDAES, HERANÇA E ENCAPSULAMENTO
9.1. Propriedades
Uma propriedade é um cruzamento entre um campo e um método – ela parece um
campo, mas atua como um método. Uma propriedade é acessada, utilizando exatamente
a mesma sintaxe empregada para acessar um campo. O compilador, porém, converte
automaticamente essa sintaxe do tipo campo em chamadas a métodos de acesso.
Uma propriedade pode conter dois blocos de código, começando com as palavras-
chave “get” e “set”. O bloco “get” contém instruções que são executadas quando a
propriedade é lida, e o bloco “set” engloba instruções que são executadas quando a
propriedade é gravada.
As propriedades combinam aspectos de métodos e campos. Para o usuário de um
objeto, uma propriedade parece ser um campo. Acessar a propriedade requer a mesma
sintaxe.
Para o implementador de uma classe, uma propriedade consiste em um ou dois blocos
de código, que representam um acessador “get” e/ou um acessador “set”. O bloco de
código para o acessador “set” é executado quando a propriedade é lida. O bloco de código
para o acessador “set” é executado quando um novo valor é atribuído à propriedade.
Uma propriedade sem um acessador “set” é considerada como somente leitura. Uma
propriedade sem um acessador “get” é considerada como somente gravação. Uma
propriedade que tem os dois acessadores é leitura/gravação.
A sintaxe de uma declaração de propriedade se parece com esta:
AcessaModificador
{
get
{
117 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
// código da leitura da propriedade
}
set
{
// código da gravação da propriedade
}
}
Exemplo 1: Criação de uma classe “Triangulo” e instanciação de objeto com
atribuição de valores aos campos deste último, através de propriedades.
class Program
{
// Neste exemplo os campos privados são inicializados com seus valores padrão
// e são definidas propriedades
class Triangulo
{
private int lado1 = 10;
private int lado2 = 10;
private int lado3 = 10;
public int TamanhoLado1
{
set { this.lado1 = value; }
}
public int TamanhoLado2
{
set { this.lado2 = value; }
}
public int TamanhoLado3
{
set { this.lado3 = value; }
}
public void MostraLados()
{
118 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Console.WriteLine("Lado 1 = {0}", lado1);
Console.WriteLine("Lado 2 = {0}", lado2);
Console.WriteLine("Lado 3 = {0}", lado3);
Console.WriteLine();
Console.ReadKey();
}
}
static void Main(string[] args)
{
// A sintaxe abaixo é conhecida como inicializador do objeto
// O compilador C# chama o construtor padrão e então o método de acesso
// "set" de cada propriedade identificada para inicializá-la com o valor especificado
Triangulo a = new Triangulo { TamanhoLado3 = 15 };
a.MostraLados();
Console.ReadKey();
Triangulo b = new Triangulo { TamanhoLado1 = 15, TamanhoLado3 = 20 };
b.MostraLados();
Console.ReadKey();
Triangulo c = new Triangulo { TamanhoLado2 = 12, TamanhoLado3 = 17 };
c.MostraLados();
Triangulo d = new Triangulo { TamanhoLado1 = 09, TamanhoLado2 = 12, TamanhoLado3 =
15 };
d.MostraLados();
}
}
Exemplo 2: Criação de uma classe “Calculadora” que realiza operações matemáticas
através de propriedades.
class Program
{
class Calculadora
{
public Calculadora() // construtor padrão
{
termo1 = termo2 = 0;
119 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
}
public float termo1 { get; set; }
public float termo2 { get; set; }
public float Soma
{
get { return (termo1 + termo2); }
}
public float Subtracao
{
get { return (termo1 - termo2); }
}
public float Multiplicacao
{
get { return (termo1 * termo2); }
}
public float Divisao
{
get { return (float)(termo1 / termo2); }
}
public void MostraValores()
{
Console.WriteLine("O 1o termo é {0:F2}", this.termo1);
Console.WriteLine("O 2o termo é {0:F2}", this.termo2);
Console.ReadKey();
}
}
static void Main(string[] args)
{
int opcao;
Calculadora operacao = new Calculadora();
do
{
Console.Clear();
Console.WriteLine("1 - Soma");
120 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
Console.WriteLine("2 - Subtração");
Console.WriteLine("3 - Multiplicação");
Console.WriteLine("4 - Divisão");
Console.WriteLine("5 - Opção");
opcao = int.Parse(Console.ReadLine());
if (opcao != 5)
{
Console.Write("Digite o 1o. termo : ");
operacao.termo1 = float.Parse(Console.ReadLine());
Console.Write("Digite o 2o. termo : ");
operacao.termo2 = float.Parse(Console.ReadLine());
switch (opcao)
{
case 1:
Console.WriteLine("A soma dos valores é {0:F2}", operacao.Soma);
Console.ReadKey();
break;
case 2:
Console.WriteLine("A subtracao dos valores é {0:F2}", operacao.Subtracao);
Console.ReadKey();
break;
case 3:
Console.WriteLine("A multiplicação dos valores é {0:F2}", operacao.Multiplicacao);
Console.ReadKey();
break;
case 4:
Console.WriteLine("A divisão dos valores é {0:F2}", operacao.Divisao);
Console.ReadKey();
break;}
}
} while (opcao != 5);
}
}
121 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
9.2. Herança
Herança, em orientação a objetos, é a capacidade de um novo objeto tomar atributos
e operações de um objeto existente. Assim, podemos criar classes mais complexas sem
que precisemos repetir código.
Aqui, a palavra-chave é Reuso de código, e é uma das metas a se atingir ao
desenvolver softwares. O reuso permite reduzir o esforço dispendido no desenvolvimento
de software ao reaproveitarmos códigos de uma classe na criação de outras classes.
A Herança é, portanto, um conceito extremamente importante em Orientação a
Objetos. Usamos a herança, por exemplo, para evitar repetição ao definirmos classes com
características em comum e que são relacionadas entre si. A herança é um relacionamento
entre classes, que permite que uma classe “adquira” os membros (atributos e métodos) de
outra classe.
Um exemplo clássico de herança seria a classificação de mamíferos no reino animal.
Homens, Baleias e Gatos são mamíferos, que compartilham muitas características entre si,
mas claramente possuem atributos que os diferem uns dos outros.
Como podemos modelar Baleias, Gatos e Humanos em um software? Podemos criar
classes distintas para cada animal, mas essas classes teriam muitos comportamentos
(“métodos”) em comum entre eles, como Respirar, Mamar e Reproduzir-se, o que
ocasionaria repetição desnecessária de código.
Usamos então Herança para resolver esse problema. Podemos criar uma classe
chamada Mamífero que possua as características comuns a todos os animais mamíferos,
e então criar as classes Humano, Baleia e Gato herdando essas funcionalidades e também
implementando as funcionalidades específicas de cada animal, como Falar, Nadar e Miar.
122 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
A linguagem C# oferece suporte apenas à herança única, ou seja, uma classe pode
herdar apenas de uma única classe. No entanto, a herança é transitiva, o que permite que
você defina uma hierarquia de herança para um conjunto de tipos. Em outras palavras, o
tipo “D” pode herdar do tipo “C”, que herda do tipo ”B”, que herda do tipo de classe base ”A”.
Como a herança é transitiva, os membros do tipo “A” estão disponíveis ao tipo “D”.
Enquanto todos os outros membros de uma classe base são herdados por classes
derivadas, o fato de serem visíveis ou não depende de sua acessibilidade. A acessibilidade
de um membro afeta sua visibilidade para classes derivadas da seguinte maneira: membros
privados, membros protegidos, membros internos e membros públicos.
A sintaxe de uma declaração de herança se parece com esta:
Class ClasseDerivada : ClasseBase
{
...
}
Exemplo 1: Criação de uma classe “Animal” cujas características serão herdadas por
outra classe intitulada “Cachorro”.
class Program
{
public class Animal
{
public string Nome;
public int Idade;
public string CorDoPelo;
}
public class Cachorro : Animal
{
public string Raca;
123 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
public Cachorro() // construtor padrão
{
Nome = "Poli";
Idade = 12;
CorDoPelo = "branca";
Raca = "Dálmata";
}
public void ExibeDados()
{
Console.WriteLine(Nome);
Console.WriteLine(Idade);
Console.WriteLine(CorDoPelo);
Console.WriteLine(Raca);
Console.ReadKey();
}
}
static void Main(string[] args)
{
Cachorro cao = new Cachorro();
cao.ExibeDados();
}
}
Exemplo 2: Criação de uma classe “Animal” cujas características serão herdadas por
outras classes intituladas, respectivamente, “Mamifero”, “Morcedo” e “Baleia”.
class Program
{
public class Animal
{
private string nome;
public string AtribuirNome
{
set { this.nome = value; }
}
public string RetornaNome
124 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
{
get { return (this.nome); }
}
public void Acordar(string info)
{
Console.WriteLine("{0} acordou...", info);
}
public void Comer(string info)
{
Console.WriteLine("{0} está comendo...", info);
}
public void Dormir(string info)
{
Console.WriteLine("{0} está dormingo...", info);
}
}
public class Mamifero : Animal
{
public void Mamar(string info)
{
Console.WriteLine("{0} está mamando...", info);
}
}
public class Morcego : Mamifero
{
public void Voar(string info)
{
Console.WriteLine("{0} está voando...", info);
}
}
public class Baleia : Mamifero
{
public void Nadar(string info)
{
Console.WriteLine("{0} está nadando...", info);
}
125 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
}
static void Main(string[] args)
{
Morcego especie_voadora = new Morcego();
especie_voadora.AtribuirNome = "Morcego Hematófago";
especie_voadora.Acordar(especie_voadora.RetornaNome);
especie_voadora.Comer(especie_voadora.RetornaNome);
especie_voadora.Dormir(especie_voadora.RetornaNome);
especie_voadora.Voar(especie_voadora.RetornaNome);
Console.ReadKey();
Console.WriteLine();
Baleia especie_marinha = new Baleia();
especie_marinha.AtribuirNome = "Baleia Jubarte";
especie_marinha.Acordar(especie_marinha.RetornaNome);
especie_marinha.Comer(especie_marinha.RetornaNome);
especie_marinha.Dormir(especie_marinha.RetornaNome);
especie_marinha.Nadar(especie_marinha.RetornaNome);
Console.ReadKey();
}
}
9.3. Lista de exercícios com Herança
1) Faça um programa que calcule a área de uma figura geométrica. Aceite quatro
tipos de figura geométrica: quadrado, retângulo, triângulo e círculo. Use
herança.
2) Crie uma classe Calculadora que faça as quatro operações básicas (soma,
subtração, multiplicação e divisão). Crie uma classe derivada
“CalculadoraCientifica” que, além das operações básicas, faça extração de
raízes.
3) Crie uma classe chamada Ingresso que possui um valor em reais e um método
imprimeValor().
a) crie uma classe VIP, que herda Ingresso e possui um valor adicional. Crie
um método que retorne o valor do ingresso VIP (com o adicional incluído);
126 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
b) crie uma classe Normal, que herda Ingresso e possui um método que
imprime: "Ingresso Normal".
c) Crie uma classe CamaroteInferior (que possui a localização do ingresso e
métodos para acessar e imprimir esta localização) e uma classe
CamaroteSuperior, que é mais cara (possui valor adicional). Esta última
possui um método para retornar o valor do ingresso. Ambasas classes
herdam a classe VIP.
4) Crie a classe Imovel, que possui um endereço e um preço.
a) Crie uma classe Novo, que herda Imovel e possui um adicional no preço.
Crie métodos de acesso e impressão deste valor adicional;
b) Crie uma classe Velho, que herda Imovel e possui um desconto no preço.
Crie métodos de acesso e impressão para este desconto
5) Um aluno de graduacao possui as informações de matrícula, nome, código do
curso (1-Arquitetura, 2-Sistemas de Informação, 3-Engenharia e 4-
Biomedicina). Todo aluno deve poder calcular a mensalidade com base no
curso escolhido (Arquitetura = 450.00, Sistemas de Informação = 650.00,
Engenharia = 850.00 e Biomedicina = 750.00. O Aluno de pós-graduação
possui as mesmas informações do aluno de graduação e, adicionalmente,
possui as informações linha de pesquisa, orientador e valor da bolsa de
estudos. O aluno de pós-graduação deve calcular a mensalidade com base no
curso escolhido porem abatendo o valor da bolsa de estudos do valor do curso
escolhido.
9.4. Encapsulamento
Encapsulamento é a combinação de atributos e operações dentro de uma classe,
deixando visível apenas o que é necessário para a comunicação entre dois objetos, como
por exemplo alguns detalhes da implementação ou ainda a lógica de um método.
127 Programação Orientada a Objetos
Universidade Santa Cecília - Educação a Distância
O encapsulamento permite ocultar a complexidade do código. Não é necessário
entender como a operação funciona para poder utilizá-la. Um exemplo clássico é o de um
motorista conduzindo um veículo. O motorista não precisa saber exatamente como um
motor funciona internamente para poder dirigir o automóvel – os detalhes da
“implementação” do motor ficam ocultos do motorista.
O encapsulamento protege os dados, permitindo o acesso a eles apenas a partir de
métodos específicos e autorizados.
Desta forma, os objetos encapsulados podem ser comparados uma caixa preta:
conhecemos a sua interface externa, porém não precisamos nos preocupar com o que
acontece internamente na caixa.
Ao se tratar do conceito de encapsulamento, devem ser observados 3 (três) níveis
principais de acesso dos objetos: Público, Privado e Protegido.
O modificador de acesso “Public” permite que uma classe exponha suas variáveis de
membros e funções de membros a outras funções e objetos. Qualquer membro público
pode ser acessado de fora da classe.
O modificador “Private” permite que atributos e métodos sejam acessados apenas
pela própria classe.
Já o modificador “Protected” atua como modificador tanto o acesso público e privado.
Tal como privado, que só permite o acesso a membros de um mesmo tipo, exceto que ele
age como público apenas aos tipos de derivados. De outra forma, protegido tipo membros
só pode ser acessado por membros, quer dentro do mesmo tipo ou de membros de tipos
derivados.