Prévia do material em texto
Algoritmos e Linguagem C#
Até agora tivemos nossa experiência com lógica, algoritmos e programação
utilizando as ferramentas do Scratch. Esta é ao mesmo tempo, uma linguagem
que representa um algoritmo e um programa executável.
A partir dele podemos usar as estruturas básicas de programação: entradas e
saídas, variáveis, condicionais e repetições. A interface de programação é
simples, mas não somos capazes de exportar a aplicação criada para um
formato a ser usado ou distribuído em computadores ou mobile – todas as
aplicações Scratch estão limitadas à própria plataforma.
Para programar aplicações de maneira geral precisamos de uma linguagem de
programação; a partir dela um processo chamado “compilação” cria o software
executável.
De maneira geral podemos dizer que a criação de software obedece estas
etapas:
O executável é um arquivo que está no formato mais primitivo para que a
máquina consiga executá-lo instrução a instrução – o processador recebe as
instruções e realiza os cálculos enquanto que a memória guarda as
informações; a linguagem de programação é um elo entre a linguagem primitiva
de máquina (muito complexa de compreender) e a linguagem humana. Assim
conseguimos escrever comandos que podemos ler e compreender e que,
através do processo de compilação, serão transformados em um arquivo que a
máquina consegue compreender.
A linguagem que estudaremos é o C# (C Sharp), usada para programação de
jogos com Unity. Nos exemplos compararemos as abordagens do Scratch, de
algoritmo escrito e de C# para melhor compreensão e ambientação com a
linguagem.
Primeiro, algoritmos
A montagem de um programa, especialmente um programa complexo, deve
passar pela definição de um algoritmo. Encare isso como um planejamento do
que você vai programar.
Há diversas maneiras de representar um algoritmo. Duas das mais usadas são
os fluxogramas (diagramas em que os formatos representam instruções) e as
linguagens algorítmicas (escrita que simula uma linguagem de programação).
Para ver a diferença, vamos considerar o seguinte algoritmo para somar ou
subtrair dois números de acordo com a entrada do usuário que está descrito
em linguagem natural abaixo:
1. Guardar Resultado = 0
2. Ler num1 e num2
3. Ler operacao
4. Se operacao igual a “A”, então Resultado guarda a soma de
num1 e num2
5. Senão Resultado guarda a subtração de num1 e num2
6. Escrever Resultado
7. Parar
Para a representação através de fluxogramas usaríamos formas geométricas e
as ligaríamos de acordo com a sequencia de passos que deve ser obedecida.
As formas são:
O algoritmo de soma/subtração ficaria da seguinte maneira:
O interessante desse formato é que o fluxo do algoritmo fica bastante claro. O
lado negativo é que pode ser trabalhoso desenhar um algoritmo dessa
maneira. Por isso, é bastante comum montar algoritmos de maneira escrita.
Pode-se usar uma linguagem mais formal como Algol, ou Portugol, mas não é
obrigatório.
Em linguagem algorítmica o exemplo da soma/subtração ficaria assim:
var
num1, num2, resultado: inteiro
operacao: texto
início
leia(num1);
leia(num2);
leia(operacao);
se operacao = “A” então
resultado num1 + num2;
senão
resultado num1 - num2;
fimse
escreva(resultado);
fim
Note que estamos definindo de maneira esquemática variáveis (var), funções
de leitura e escrita (leia e escreva), atribuições de valores a variáveis (símbolo
) e condicionais (“se então senão”). Cada operação é seguida de “;” que
finaliza a linha de código.
Ambas as representações são apenas rascunhos, ou seja, ainda não podemos
executar nada na máquina. No entanto podemos acompanhar linha a linha o
algoritmo e, mentalmente, executa-lo, definido valores de leitura, anotando em
papel os valores que as variáveis vão assumindo e verificando se no final o
resultado esperado é alcançado.
var
num1, num2, resultado: inteiro Defino que há variáveis num1, num2,
operacao: texto resultado e operacao
início
leia(num1); Chuto um nº, digamos num1 = 7
leia(num2); Digamos num2 = 3
leia(operacao); Digamos operacao = “A”
se operacao = “A” então Sim, operacao é igual a A
resultado num1 + num2; Resultado = 7 + 3 = 10
senão Não cai no senão
resultado num1 - num2;
fimse
escreva(resultado);
Escreverá “10”, pois esse é o valor que
está na variável resultado fim
Para programar de fato precisamos usar a linguagem de programação.Uma
linguagem de programação sempre tem estruturas muito bem definidas para as
operações e recursos usados. A essas estruturas damos nome de “sintaxe”.
Além da sintaxe, as linguagens trabalham com uma “semântica” entre suas
estruturas, dando significado ao código. Ou seja, estruturas ou comandos
soltos no código, por mais que estejam sintaticamente corretos, não executam
nada por si só.
Linguagem C#
Para treinar a linguagem C# em seu formato mais simples, mais algorítmico,
vamos utilizar uma espécie de compilador que executa diretamente no
navegador. Acesse http://www.volatileread.com/UtilityLibrary/SnippetCompiler
para experimentar trechos de código.
Figura 1 – página “Snippet” compiler do Volatile Read.
Por padrão, na caixa de texto principal da página, onde você pode digitar seu
código, você encontrará os seguintes comandos:
http://www.volatileread.com/UtilityLibrary/SnippetCompiler
Experimente clicar no botão “Run” abaixo dessa caixa de texto. O resultado do
programa aparecerá logo abaixo, escrevendo “Hello C#”.
O tipo de programa construído pelo Volatile Read é um programa chamado de
“Console”. São programas cuja interação se dá toda por textos, sem janelas ou
elementos visuais. A simplicidade desse tipo de aplicação é ideal para estudar
e treinar código algorítmico.
Pelo código inicial oferecido pelo Volatile Read podemos observar pontos
importantes da sintaxe do C#:
1. Espaços brancos são ignorados pelo C#. Poderíamos omitir o espaço da
linha 4, por exemplo, ou retirar os recuos no código. No entanto é boa
prática manter o código em níveis para ficar claro o contexto em que
variáveis e comandos estão incluídos.
2. As chaves { e } marcam sempre início e fim de blocos de código.
3. As palavras “public static” são modificadores para itens da classe
Program; void é um tipo e Main() é o nome de um método. Não se
preocupe com esse detalhe agora; mantenha em mente, no entanto, que
Main() contém o código que será executado no programa entre seu {
(linha 8) e } (linha 10).
4. Todos os métodos usam ( e ) após o nome. Dentro dos parênteses
geralmente podemos incluir informações que serão usadas pelos
métodos – métodos são como algoritmos que podem ser reutilizados no
código.
5. WriteLine() é um método da classe Console. Por isso
Console.WriteLine() . Esse é um detalhe que também pode ser deixado
de lado por enquanto. Vamos apenas assumir que através desse
comando imprimimos coisas na tela.
6. WriteLine() tem dentro de seus parênteses o valor “Hello C#”, um texto
que será usado pelo método como o valor a ser impresso na tela. Nesse
caso chamamos desse valor “Hello C#” de parâmetro.
7. Todas as instruções em C# terminam com “;”.
8. C# diferencia maiúsculas de minúsculas. Assim, minhaVariavel se
refere a algo diferente de minhavariavel.
Variáveis
Pouca coisa no C# pode ser feita sem variáveis. As rotinas de leitura, por
exemplo, ficam impossíveis.
Como sabemos as variáveis nada mais são do que espaços na memória que
possuem um endereço, recebem um determinado tipo de dado e são
referenciados pelo seu nome.
Diferente do Scratch, no C# as variáveis indicam qual o tipo de informação elas
podem carregar. Entre os principais tipos estão:
Tipo de Dado Descrição
Int Numérico Inteiro com sinal.
Float Numérico Decimal com precisão simples
Double Numérico Decimal com precisão dupla
Bool Tipo Lógico
StringSequência de caracteres
A sintaxe para declaração de variáveis é [tipo de dado] [nomedavariável];
Observe os exemplos:
int dias;
string nomeClienteAtual;
float fornecedor;
float alturaCliente;
A atribuição, ou seja, a inclusão de valor em uma variável ocorre com o sinal de
“=”.
dias = 100;
Esta última linha quer dizer que a variável “dias” recebe o valor 100.
Exemplo 1: soma dois valores inteiros:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
int numero1;
int numero2;
int resultado;
numero1 = 10;
numero2 = 5;
resultado = numero1 + numero2;
Console.WriteLine(resultado);
}
}
Nota: a partir de agora, mostraremos apenas o trecho de código interno a Main(){}.
No código primeiro declaramos 3 variáveis, depois realizamos a atribuição de
valor a duas delas; a resultado atribuímos a própria soma das duas outras
variáveis.
No fim mostramos na tela, em forma de texto, o valor da variável “resultado”.
Vamos agora fazer uma comparação com o código em Scratch:
int numero1;
int numero2;
int resultado;
numero1 = 10;
numero2 = 5;
resultado = numero1 + numero2;
Console.WriteLine(resultado);
Uma última observação quanto a declarações. Se as variáveis forem do
mesmo tipo, elas podem ser declaradas em uma mesma instrução. No exemplo
anterior, então seria totalmente válido:
int numero1, numero2, resultado;
Quando temos tipos diferentes isso não é possível.
Exemplo 2: variáveis para nome e idade.
string nome;
int idade;
nome = "Fulano de tal";
idade = 20;
Console.WriteLine("O nome é "+ nome + "e a idade é " +
idade);
Scratch Algoritmo C#
var
idade: inteiro;
nome: texto;
inicio
nome “Fulano de tal”;
idade 20;
escreva("O nome é ", nome ,
"e a idade é ", idade);
fim
string nome;
int idade;
nome = "Fulano de tal";
idade = 20;
Console.WriteLine("O nome é "+
nome + "e a idade é " + idade);
Quando utilizamos texto, precisamos delimitar o valor com aspas duplas, uma
para indicar o início do texto e outra para indicar o fim.
Operadores
No exemplo acima já utilizamos uma operação aritmética de soma. A seguir os
principais operadores usados no C#:
Operador Resultado
+ Adição de valores inteiros e decimais; concatenação para
valores de texto.
- Subtração de valores inteiros e decimais
* Multiplicação de valores inteiros e decimais
/ Divisão de valores inteiros e decimais
% Resto da divisão de valores inteiros
= Operação de atribuição
Desafio 1: experimente alterar o programa de soma do Exemplo 1 para que
faça subtração, multiplicação e divisão dos valores.
Entradas e saídas de dados em C#
O comando padrão utilizado para entrada de dados, ou seja, a leitura das
variáveis é o Console.ReadLine. Esse comando lê uma informação digitada
pelo usuário e atribui a mesma a uma variável.
Ex.:
string nome;
nome = Console.ReadLine();
O conteúdo lido é entendido como uma string (texto), logo deve ser atribuído a
uma variável string, caso contrário resultará em erro.
Para fazermos uma leitura de uma informação que será atribuída a uma
variável numérica deverá ser feita uma conversão.
Observe o exemplo:
int dias;
dias = int.Parse(Console.ReadLine());
O comando int.Parse converte a informação digitada pelo usuário
(Console.ReadLine) em um valor inteiro que é atribuído a também variável
inteira dias.
O comando de saída padrão, ou seja, de impressão na tela é o
Console.WriteLine.
Console.WriteLine("Hello, Senac EAD");
Você pode ainda concatenar, ou seja juntar mensagens com os conteúdos de
variáveis.
Console.WriteLine("O número de dias é: "+dias);
O caracter utilizado para concatenar Texto e variáveis é o sinal de adição (“+”).
Exemplo 3: mostrando idade e peso.
int idade=20;
float peso=70f;
string info = "você têm " +idade + "anos e pesa " + peso +
"kg.";
Console.WriteLine(info);
Scratch Algoritmo C#
var
idade: inteiro;
peso: real;
info: texto;
inicio
idade 20;
peso 70.0;
info “Você tem ”, idade,
“e pesa”, peso;
escreva(info);
fim
int idade=20;
float peso=70f;
string info = "você têm " +idade
+ "anos e pesa " + peso + "kg.";
Console.WriteLine(info);
Nota: Outra forma de substituir variáveis é utilizando uma cadeia de caracteres
interpolada. Nessa forma você coloca o nome das variáveis entre chaves e seu
conteúdo será colocado nos respectivos lugares.
int idade=20;
float peso=70f;
string info = $"você têm {idade} anos e pesa {peso} kg.";
Exemplo 4: incrementando o exemplo 1 e permitindo que o usuário informe os
valores para a soma.
int numero1, numero2, resultado;
Console.WriteLine("Digite o primeiro número: ");
numero1 = int.Parse(Console.ReadLine());
Console.WriteLine("Digite o segundo número: ");
numero2 = int.Parse(Console.ReadLine());
resultado = numero1 + numero2;
Console.WriteLine("Resultado " + resultado);
Scratch Algoritmo C#
var
numero1, numero2, resultado: inteiro
inicio
escreva(“Digite o primeiro número:”);
leia(numero1);
escreva(“Digite o segundo número:”);
leia(numero1);
resultado numero1 + numero2;
escreva(“Resultado”, resultado);
fim
int numero1, numero2, resultado;
Console.WriteLine("Digite o primeiro
número: ");
numero1 = int.Parse(Console.ReadLine());
Console.WriteLine("Digite o segundo
número: ");
numero2 = int.Parse(Console.ReadLine());
resultado = numero1 + numero2;
Console.WriteLine("Resultado " +
resultado);
Exemplo 5: recebendo informações de endereço do usuário, montando-o e
mostrando na tela
string log, nome;
int numero;
Console.WriteLine("Digite o Logradouro (r, av...)");
log = Console.ReadLine();
Console.WriteLine("Digite o nome");
nome = Console.ReadLine();
Console.WriteLine("Digite o número");
numero = int.Parse(Console.ReadLine());
Console.WriteLine("Endereço completo: " + log + " "+ nome
+", "+ numero);
Scratch Algoritmo C#
var
log, nome: texto
numero: inteiro
inicio
escreva("Digite o Logradouro");
leia(log);
escreva("Digite o nome");
leia(nome);
escreva("Digite o número");
leia(nome);
escreva("Endereço completo: ", log
, " ", nome ,", ", numero);
fim
string log, nome;
int numero;
Console.WriteLine("Digite o Logradouro");
log = Console.ReadLine();
Console.WriteLine("Digite o nome");
nome = Console.ReadLine();
Console.WriteLine("Digite o número");
numero = int.Parse(Console.ReadLine());
Console.WriteLine("Endereço completo: " +
log + " "+ nome +", "+ numero);
Exemplo 6: convertendo a temperatura informada pelo usuário em Celsius
para a escala Fahrenheit. A conversão obedece à fórmula (Celsius *1,8) + 32.
float tc,tf;
Console.WriteLine("Informe em Celsius:");
tc = float.Parse(Console.ReadLine());
tf = (tc * 1.8f) + 32f;
Console.WriteLine($"{tf} Fahrenheit");
Scratch Algoritmo C#
var
tc, tf: real
inicio
escreva("Informe em Celsius:");
leia(tc);
tf (tc * 1.8) + 32;
escreva(tf ," Fahrenheit”);
fim
float tc,tf;
Console.WriteLine("Informe em Celsius:");
tc = float.Parse(Console.ReadLine());
tf = (tc * 1.8f) + 32f;
Console.WriteLine($"{tf} Fahrenheit");
Note que quando usamos tipo float colocamos um “f” à frente do numeral. Isso
o diferencial do tipo “double”, que também é de casas decimais, mas permite
números mais extensos. Note ainda que para números decimais no C# usamos
ponto para separar as casas decimais, nunca vírgula.
Desafio 2: escreva um programa em C# que pergunte o nome da pessoa e leia
esse valor, depois pergunte o ano de nascimento e leia esse valor. Em
seguida, faça a conta de quantos anos a pessoa tem (ano atual – idade) e
mostre em formato de texto a frase “Olá [nome informado] sua idade é [idade
calculada]” (substituindo os valores nos colchetes pelos valores obtidos).Desafio 3: programe em C# uma aplicação que receba a idade de uma
pessoa. A partir disso, calcule quantos dias a pessoa viveu (considere 1 ano =
365 dias, ignorando bissextos). Faça o gato dizer essa informação na tela.
Depois, a partir dos dias, calcule quantas horas a pessoa viveu e faça o gato
dizer essa resposta na tela.
Desafio 4: desenvolva um programa em C# que receba uma temperatura em
Celsius e transforme em escala Kelvin (formula: Kelvin = Celsius + 273,15).
Comparações e condicionais em C#
É claro que em C#, assim como no Scratch, podemos tomar decisões. Para
isso, usamos operadores relacionais, ou seja, operadores que permitem
realização de comparações
Operador Descrição No Scratch
< Menor que
> Maior que
<= Menor ou igual a
>= Maior ou igual a
== Igual a (sim, são dois
sinais de =)
!= Diferente de
Também obviamente podemos usar esses operadores entre valores constantes
ou entre variáveis. As seguintes são comparações válidas:
num1 > 100
10 != 0
num1 <= num2
Comparações entre tipos diferentes são inválidas e geram erro:
10 < "abobora"
As comparações resultarão nos valores Verdadeiro (True) ou
Falso (False).
Exemplo 7: comparando se número digitado pelo usuário é maior que 10.
int numero;
numero = int.Parse(Console.ReadLine());
Console.WriteLine(numero > 10);
Isso nos leva diretamente à estrutura “se/então”. Ou, no caso do C#, “if/else.”
Scratch Algoritmos C#
Se <condição> então
<código>
Senão
<código>
fimse
if(<condição>)
{
<código>
}
else
{
<código>
}
A estrutura if/else se comporta da mesma maneira que no Scratch: o programa
faz a comparação que surge entre os parênteses; se ela for verdadeira então o
primeiro bloco de códigos é executado; caso contrário, se houver “else”, o
bloco correspondente é executado.
Exemplo 8: comparando se número digitado pelo usuário é positivo.
int numero;
numero = int.Parse(Console.ReadLine());
if(numero > 0)
{
Console.WriteLine("positivo");
}
else
{
Console.WriteLine("negativo");
}
Scratch Algoritmo C#
var
numero: inteiro;
inicio
leia(numero);
se numero >0 entao
escreva(“positivo”);
senão
escreva(“negativo”);
fimse
fim
int numero;
numero = int.Parse(Console.ReadLine());
if(numero > 0)
{
Console.WriteLine("positivo");
}
else
{
Console.WriteLine("negativo");
}
No exemplo anterior, a variável “numero” recebe o valor que o usuário digita e
esse valor é comparado com “0”. Se for maior que zero, indica que é positivo;
caso contrário, indica que esse número é negativo ou igual a zero.
Exemplo 9: retomando o primeiro exemplo do material, um programa que
realiza um cálculo de adição ou subtração de acordo com o que o usuário
informa (“A” para adição e “S” ou outra letra para subtração).
int num1, num2, resultado;
string operacao;
num1 = int.Parse(Console.ReadLine());
num2 = int.Parse(Console.ReadLine());
operacao = Console.ReadLine();
if(operacao == "A")
{
resultado = num1 + num2;
}
else
{
resultado = num1 - num2;
}
Console.WriteLine(resultado);
Scratch Algoritmo C#
var
num1, num2, resultado:
inteiro
operacao: texto
início
leia(num1);
leia(num2);
leia(operacao);
se operacao = “A” então
resultado num1 + num2;
senão
resultado num1 - num2;
fimse
escreva(resultado);
fim
int num1, num2, resultado;
string operacao;
num1 =
int.Parse(Console.ReadLine());
num2 =
int.Parse(Console.ReadLine());
operacao = Console.ReadLine();
if(operacao == "A")
{
resultado = num1 + num2;
}
else
{
resultado = num1 - num2;
}
Console.WriteLine(resultado);
Cuidado com o operador “=”: “operacao = "A"”, por exemplo, significa uma
atribuição de variável, e não uma comparação.
Assim como no Scratch, podemos combinar comparações com E (quando
queremos que ambas as condições sejam verdadeiras) e OU (quando
queremos que pelo menos uma das condições sejam verdadeiras).
Operador Descrição No Scratch
&& Operador lógico “E”.
Ex.: (num1 > 10 && num1 < 20)
|| Operador lógico “OU”.
Ex.: (num1 == 0 || num1 > 100)
Exemplo 10: programa que verifica se o aluno está aprovado. Ele será
aprovado quando tiver média maior ou igual a sete e frequência maior ou igual
a 75%.
float media,frequencia;
Console.WriteLine("Informe sua média:");
media = float.Parse(Console.ReadLine());
Console.WriteLine("Informe sua frequencia:");
frequencia = float.Parse(Console.ReadLine());
if(media>=7 && frequencia>=75)
{
Console.WriteLine("Você está aprovado.");
}
else
{
Console.WriteLine("Você está reprovado.");
}
Scratch
Algoritmo
var
media, frequencia: real
início
escreva(“Informe sua média”);
leia(media);
escreva(“Informe sua frequência”);
leia(frequencia);
se media ≥ 7 E frequencia ≥ 75 então
escreva(“Você está aprovado”);
senão
escreva(“Você está reprovado”);
fimse
fim
C#
float media,frequencia;
Console.WriteLine("Informe sua média:");
media = float.Parse(Console.ReadLine());
Console.WriteLine("Informe sua frequencia:");
frequencia = float.Parse(Console.ReadLine());
if(media>=7 && frequencia>=75)
{
Console.WriteLine("Você está aprovado.");
}
else
{
Console.WriteLine("Você está reprovado.");
}
Desafio 5: escreva um programa em C# que leia dois valores inteiros
(considere que não serão lidos valores iguais) e escreva na tela o maior deles.
Desafio 6: escreva um programa em C# que verifique se um número é par ou
ímpar. Um número é par quando o resto de sua divisão por 2 é zero; para obter
o resto da divisão, use o operador % (ex: 6 % 2 resultará em 0).
Desafio7: expandindo o código do desafio anterior, faça um jogo de par ou
ímpar. Peça que o usuário informa um número para o jogador 1 e outro para o
jogador 2. Assuma sempre que jogador 1 optará por par e jogador 2 por ímpar.
Some os números e verifique quem ganhou, mostrando na tela, em texto, quem
foi vencedor.