Baixe o app para aproveitar ainda mais
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.
Compartilhar