Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROGRAMAÇÃO EM C# Cronograma • Ambiente de Programação • Visual Studio • Programação em C# • Bibliotecas • Extensão • Função principal • Variáveis • Leitura e escrita • Exercícios Ambiente de Programação • Visual Studio 2017 COMMUNITY • Gratuito • https://www.visualstudio.com/pt-br/vs/community/ Instalação Ambiente de Programação Motivação - Linguagem C# - Criada por Anders Hejlsberg na Microsoft - Apresentada publicamente em 2000 junto com o lançamento do .NET Framework - Linguagem Orientada a Objetos - Suporte a internacionalização - Portável - Roda em servidores, sistemas embarcados, celulares, smartdevices etc. - Não roda somente em Windows - Utilizada em diversos tipos de sistemas - Web - Jogos - Sistemas Embarcados Motivação - Linguagem C# - Fortemente Tipada - Compilador e IDE "inteligentes" Quem usa? Primeiro programa em C# using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Olá!"); } } } • Variáveis em C# •Servem para armazenar informações durante a execução do programa • •Algumas regras para utilizar variáveis: •Quanto ao nome: • Devem iniciar com uma letra • Os caracteres subsequentes podem ser letras, números ou _ • Dica (para facilitar a leitura): • Utilizar letras minúsculas para variáveis • A segunda palavra inicia com maiúscula float valorCarro; • Utilizar letras MAIÚSCULAS para constantes Variáveis using System; namespace Aula01 { class Program { static void Main(string[] args) { String nome = "Guilherme"; int idade = 29; String email = "guilherme.defreitas@gmail.com"; } } } Variáveis vs constantes • Variáveis tem valor variável, constantes tem valor fixo • Variáveis são declaradas no corpo do programa • Constantes são declarados como: • const int NOME_DA_CONSTANTE = 10; Tipos primitivos de variáveis - C# • Em C# podemos ter diversos tipos de variáveis Data Type Range byte 0 .. 255 sbyte -128 .. 127 short -32,768 .. 32,767 ushort 0 .. 65,535 int -2,147,483,648 .. 2,147,483,647 uint 0 .. 4,294,967,295 long -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807 ulong 0 .. 18,446,744,073,709,551,615 float -3.402823e38 .. 3.402823e38 double -1.79769313486232e308 .. 1.79769313486232e308 decimal -79228162514264337593543950335 .. 79228162514264337593543950335 char A Unicode character. string A string of Unicode characters. bool True or False. object An object. Tipos de variáveis – C# • Utilizaremos também outros tipos de variáveis • Int16 • Int32 • Int64 • String • DateTime String O tipo String é o tipo de dado utilizado para armazenar texto. ... String nomeDoCliente = "Zezinho"; ... Obs: o tipo primitivo char serve apenas para armazenar um único caracter e não pode armazenar texto. Float O tipo float é o tipo de dado utilizado para armazenar números reais. ... float medidaAltura = 1.97f; ... Repare que é necessário colocar o “f” no final do valor atribuído. Isso é necessário pois no c# qualquer valor real é um por padrão um double e para avisá-lo de que é um float colocamos o f. Decimal O tipo Decimal também é utilizado para armazenar números reais, mas possui uma precisão muito superior do que o double ou float. Isso o torna o tipo de dado ideal para tratar valores monetários. ... Decimal precoProduto = 99.90d; ... Repare que é necessário colocar o “d” no final do valor atribuído. Isso é necessário pois no c# qualquer valor real é um double e para avisá-lo de que é um Decimal colocamos o d. Declaração de variáveis • Declaração e inicialização de variáveis • Antes de utilizar uma variável ela deve ser declarada e inicializada • A declaração é feita da seguinte forma: String nome = “Guilherme”; ou pode ser inicializada posteriormente String nome; ... nome = “Guilherme”; • Inicializar significa atribuir algum valor: • int cont=0; • As variáveis precisam ser inicializadas antes de serem utilizadas. Escrevendo na tela Para escrever um dado no console (tela preta) é utilizada o comando Console. O comando Environment.NewLine ou \n podem ser usado para quebrar linhas. static void Main(string[] args) { //Escreve uma mensagem na tela Console.WriteLine("Bem vindos ao curso de C#!"); //Evita que o programa feche Console.ReadLine(); } Escrevendo na tela Podemos juntar (concatenar) diferentes variáveis em uma mesma saída. Existem algumas formas de fazer isso. 1) Utilizando o operador + String nome = "Guilherme"; String sobrenome = "Defreitas"; Console.WriteLine("O sobrenome do " + nome + " é " + sobrenome); Console.ReadLine(); 2) Utilizando o índice de posição String nome = "Guilherme"; String sobrenome = "Defreitas"; Console.WriteLine("O sobrenome do {0} é {1} ", nome, sobrenome); Console.ReadLine(); 3) Utilizando interpolação (funciona apenas no visual studio 2017) String nome = "Guilherme"; String sobrenome = "Defreitas"; Console.WriteLine($"O sobrenome do {nome} é {sobrenome}."); Console.ReadLine(); Escrevendo números na tela Podemos informar quantas casas antes e depois do separador decimal utilizando o comando: Decimal valor = 100.99d; Console.WriteLine("O valor é de {0:0.00} ", valor); Console.ReadLine(); Dessa forma só serão exibidos 2 dígitos após a vírgula Escrevendo na tela A saída pode ser formatada utilizando o método String.Format String nome = "Zezinho"; Console.Write(String.Format("Nome: {0, 20} ", nome)); Console.Write(String.Format("Idade: {0, 5}", 30)); Neste caso a palavra “Zezinho” será mostrada ocupando 20 posições e a idade ocupando 5, independentemente de quantas letras ou números a variável possui. Escrevendo na tela using System; namespace DemoConsole { class Program { static void Main(string[] args) { String nomeCurso = "Mini Curso de C#"; Console.WriteLine(nomeCurso); Console.WriteLine("A disciplina de {0} é {1}", "programação", "a melhor de todas"); Console.Write(String.Format("Nome: {0, 20} ", "Zezinho")); Console.Write(String.Format("Idade: {0, 5}", 30)); Console.ReadLine(); } } } Exercícios 1. Declarar 3 variáveis de tipos diferentes no bloco Main. 2. Imprimir o valor da variável utilizando Console.WriteLine. 3. Tentar declarar duas variáveis com o mesmo nome. Lendo dados do usuário Utilizamos o comando Console.ReadLine() para ler os dados informados pelo usuário. Esse comando espera até que o usuário aperte ENTER para capturar os dados e prosseguir na execução das demais operações do programa. Lendo dados do usuário using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Digite o seu nome:"); String nome = ""; nome = Console.ReadLine(); Console.WriteLine("Bem vindo " + nome); Console.ReadLine(); } } } Convertendo dados Conversões explícitas long idade = 10; int novaIdade = (int) idade; Utilizando Convert String idade = "20"; int novaIdade = Convert.ToInt32(idade); Convertendo dados Função Exemplo Expliçação Convert.ToInt32(dado) String idade = “18”; int valorIdade = Convert.ToInt32(idade); Converte uma variável para um inteiro de 32 bits. Convert.ToInt16(dado) String idade = “18”; int valorIdade = Convert.ToInt16(idade); Converte uma variável para um inteiro de 16 bits (ou short) Convert.ToInt64(dado) String numeroGrande = “18123124123123123”; intvalorNumero = Convert.ToInt64(idade); Converte uma variável para um inteiro de 64 bits (ou long) Convert.ToSingle(dado) String numero = “10,50”; float valorNumero = Convert.ToSingle(numero); Converte uma variável para o tipo float. Convert.ToDouble(dado) String numero = “10,50”; Double valorNumero = Convert.ToDouble(numero); Converte uma variável para o tipo Double. Convert.ToDecimal(dado) String preco = “199,90”; Decimal valorPreco = Convert.ToDecimal(preco); Converte uma variável para o tipo Decimal Se não for possível efetuar a conversão o programa irá disparar uma excessão e será interrompido. Convertendo e validando dados Ao converter um dado com Convet é possível que o dado a ser convertido não seja compatível com o tipo de dado desejado. Veja o exemplo abaixo: String idade = "vinte"; int novaIdade = Convert.ToInt32(idade); Neste caso o programa será encerrado com um erro. Convertendo e validando dados Para evitar que isso aconteça é possível converter os dados utilizando o TryParse. String idade = "vinte"; int novaIdade; bool conseguiu = Int32.TryParse(idade, out novaIdade); if(conseguiu){ Console.WriteLine("Idade convertida: {0}", novaIdade); }else{ Console.WriteLine("Você não informou um número"); } Repare que o TryParse é um método do tipo de dado que se deseja ser convertido (nesse caso um Int32). Outra particularidade é que é necessário criar a variável de retorno e passá-la como parâmetro utilizando o operador out. O método TryParse retorna um valor booleano informando se conseguiu efetuar a conversão ou não. Se a conversão puder ser realizada o método retorna true e a variável novaIdade passa a assumir o novo valor senão, o método retorna false. Convertendo e validando dados Segue abaixo alguns exemplos com outros tipos de dados: Decimal.TryParse(entrada, out saída); Double.TryParse(entrada, out saída); Float.TryParse(entrada, out saída); Int32.TryParse(entrada, out saída); Boolean.TryParse(entrada, out saída); Byte.TryParse(entrada, out saída); Operadores aritméticos • Para manipular os valores das variáveis utilizamos os seguintes operadores: • As atribuições são feitas com o símbolo = Operadores Os operadores permitem manipular as variáveis de um programa. A linguagem C# possui os seguintes operadores: - Aritmético (+, -, *, /, %) - Atribuição (=, +=, -=, *=, /=, %=) - Relacional (==, !=, <, <=, >, >=) - Lógico (&&, ||) Operadores - Aritméticos Funcionam de forma semelhante aos operadores matemáticos. Soma + Subtração - Multiplicação * Divisão / Módulo % Operadores - Aritméticos ... int resultadoSoma = 10 + 20; //Atribui o valor 30 String nome = "Zezinho" + " Patinhas"; //Pode ser usado com Strings int x, y; //Variáveis de mesmo tipo podem ser declaradas na mesma linha x = 10; x = x * 2; //x passa a ser 20 y = x / 2; //y passa a ser 10 ... Operadores - Aritméticos Módulo (%) Na matemática corresponde ao valor absoluto (sem sinal) de um número. |-5| = 5 Na linguagem de programação o módulo corresponde ao resto da divisão de dois números. Exemplo 6%5 = 1. Operadores - Aritméticos Na linguagem C# a precedência das operações funciona de forma semelhante a matemática. Primeiro as multiplicações, divisões e módulos em seguida as adições e subtrações. A precedência pode ser forçada com a utilização de parênteses. ... int x = x / (6 - 2 + (3 * 5)/(16 - 1)); ... Operadores - Atribuição Simples = Incremental += Decremental -= Multiplicativa *= Divisória /= Modular %= Pós incremento i++ Pré incremento ++i Operadores - Atribuição ... int valor = 1; valor += 2; //valor = 3 valor -= 1; //valor = 2 valor *= 6; //valor = 12 valor /= 3; //valor = 4 valor %=3 ; //valor = 1 ... Operadores - Atribuição //As operações de atribuição podem ser escritas utilizando //operações aritméticas. ... int valor = 1; valor = valor + 2; //valor = 3 valor = valor - 1; //valor = 2 valor = valor * 6; //valor = 12 valor = valor / 3; //valor = 4 valor = valor % 3; //valor = 1 ... Operadores - Pré e pós incrementos Qual é o valor mostrado de x? Qual é o valor mostrado de i? ... int i = 5; int x = i++; Console.WriteLine(i); Console.WriteLine(x); ... Operadores - Pós incrementos Quando o operador ++ vem após a variável, o valor antigo é retornado primeiro e depois é evetuado o incremento (pós incremento). Neste caso x = 5. ... int i = 5; int x = i++; Console.WriteLine(i); Console.WriteLine(x); ... Operadores - Pré incrementos Quanto utilizado o pré incremento a variável é incrementada e depois o seu valor é retornado. Neste caso x = 6. ... int i = 5; int x = ++i; Console.WriteLine(i); Console.WriteLine(x); ... Operadores - Relacionais Igualdade == Diferença != Menor < Menor ou igual <= Maior > Maior ou igual >= ... int valor = 2; bool t = false; t = (valor == 2); //t = true t = (valor != 2); //t = false t = (valor < 2); //t = false t = (valor <= 2); //t = true t = (valor > 1); //t = true t = (valor >= 1); //t = true ... Operadores - Relacionais Operadores - Lógicos Permite verificar se duas ou mais condições são satisfeitas. Os operadores lógicos retornam um tipo primitivo booleano. Operador "E" && Operador "OU" || Operadores - Lógicos ... int valor = 30; boolean t = false; t = valor < 40 && valor > 20; //t = true t = valor < 40 && valor > 30; //t = false t = valor > 30 || valor > 20; //t = true t = valor > 30 || valor < 20; //t = false t = valor < 50 && valor == 30; //t = true ... Exercícios 1) Escreva um programa que solicite o valor de um produto, a quantidade comprada e mostre o valor total da compra. 2) Escreva um programa que dado o raio de um círculo, calcule o seu perímetro e a sua área: perímetro: 2.ᷜ.raio área: ᷜ.raio² ESTRUTURAS DE DECISÃO Estruturas de controle de fluxo •Fundamentais em qualquer linguagem de programação • Como seria um programa sem essas estruturas? • Para fazer uma repetição teríamos de colocar o mesmo trecho de código muitas vezes • Utilizamos estas estruturas para: • Testar condições • Fazer repetições • Realizar saltos O comando IF •Está relacionado ao SE do nosso algoritmo •SE uma condição é verdadeira executa um trecho de código •A sintaxe do comando é: • if (condição) declaração; • A condição é avaliada, se for verdadeira, a declaração é executada, se for falso, pula a declaração para a próxima linha de código O comando IF using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Informe um número:"); String num = Console.ReadLine(); int numero = Convert.ToInt32(num); if (numero > 10) { Console.WriteLine("O número digitado é maior que 10"); } if (numero == 10) { Console.WriteLine("O número é igual a 10"); } if (numero < 0) { Console.WriteLine("O número é menor que 10"); } } } } O Comando IF-else •É um complemento do IF •Podemos ver da seguinte forma: • if (condição) declaração_1; • else declaração_2; •Caso a condição seja verdadeira executa a declaração_1, se a negativa dela for verdadeira, executa a declaração_2 •Se usarmos IF-ELSE uma das duas sempre executará, não existe como não executar O comando if-else using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Informe um número:"); String num = Console.ReadLine();int numero = Convert.ToInt32(num); if (numero == 10) { Console.WriteLine("O número é igual a 10"); } else { if (numero > 10) { Console.WriteLine("O número digitado é maior que 10"); } else { Console.WriteLine("O número é menor que 10"); } } } } } O comando if-else-if • Uma extensão da estrutura IF-ELSE • Podemos utilizar mais de uma condição • if (condição_1) declaração_1; • else if (condição_2) declaração_2; • else if (condição_3) declaração_3; • . • . • . • else if (condição_n) declaração_n; • else declaração_default; O comando if-else-if using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Informe um número:"); String num = Console.ReadLine(); int numero = Convert.ToInt32(num); if (numero > 10) { Console.WriteLine("O número digitado é maior que 10"); }else if (numero == 10) { Console.WriteLine("O número é igual a 10"); }else if (numero < 0) { Console.WriteLine("O número é menor que 10"); } } } } Condições aninhadas •Em algumas lógicas, ou algoritmos precisamos inserir novas condições quando uma for verdadeira • Para isto podemos utilizar um conjunto de estruturas de seleção de forma sequencial • Uma estrutura dentro de outra • Assim teremos condições dentro de condições • Temos de ter cuidado com os elses Comando switch •Utilizado para verificar os diversos valores que podem ser estabelecidos a uma variável •Muito usado em menus de escolha switch (variável) { case constante_1: declaração_1; break; case constante_2: declaração_2; break; ... case constante_n: declaração_n; break; default declaração_default; } O comando break faz com que o switch seja finalizado assim que uma das condições for aceita Comando switch using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Opções:"); Console.WriteLine("1 - Exercício 1"); Console.WriteLine("2 - Exercício 2"); Console.WriteLine("Informe a opção desejada:"); String num = Console.ReadLine(); int numero = Convert.ToInt32(num); switch(numero) { case 1: Console.WriteLine("Exercício 1 selecionado"); break; case 2: Console.WriteLine("Exercício 2 selecionado"); break; default: Console.WriteLine("Opção inválida"); break; } Console.ReadLine(); } } } Operadores relacionais • Operadores utilizados para comparar duas variáveis Operadores lógicos • Utilizados para fazer operações entre elementos lógicos Exercício 1) Faça um programa em C# que leia a média e a frequência de um aluno em programação, e indique se o aluno foi aprovado ou reprovado. 2) Escreva um programa que leia o valor de um item, leia a quantidade comprada deste item e leia o valor pago pelo cliente. - Se o valor pago pelo cliente for menor que o valor total da compra (valor do item x quantidade), informe a mensagem “Valor pago inferior ao valor total”. - Se o valor for igual ao valor da compra imprima a mensagem “Obrigado, volte sempre!” - Se o valor for maior do que o valor da compra imprima a mensagem “Seu troco é de .....” com o valor do troco. Códigos Github: https://github.com/unisociesc-programacao/poo_exercicios Estruturas de seleção • Exercício: • Dados três valores A, B, C, verificar se eles podem ser os comprimentos dos lados de um triângulo. Se forem, verificar se compõem um triângulo equilátero, isósceles, ou escaleno. Informar se os valores não formarem nenhum triângulo; • Dados de entrada: • Três lados de um triângulo; • Dados de saída: • Mensagens; 65 Estruturas de seleção • Exemplo 4 (cont.): • O que é um triângulo? • Figura geométrica fechada de três lados, em que cada um é menor que a soma dos outros dois. • O que é um triângulo equilátero? • O que é um triângulo isósceles? • O que é um triângulo escaleno? 66 ESTRUTURAS DE REPETIÇÃO Estruturas de repetição - While Utilizado para repetir um bloco de código enquanto a condição booleana especificada como parâmetro para o comando while for true. Testa a condição, executa o código, e testa a condição novamente ... int contador = 0; while(contador < 100){ Console.WriteLine("Bom dia " + contador); contador += 1; } Console.ReadLine(); ... • Funcionamento semelhante aos laços while • A grande diferença é “quando” se faz a condicional • As instruções executam 1 vez, e depois testa a condicional para executar a (s) próxima (s) Sintaxe: int i = 0; do { Console.WriteLine("Valor de i: " + i); i++; } while (i < 100); Console.ReadLine(); Estruturas de repetição Do While • O principal uso se dá em Menus • Caso o usuário selecione uma opção que não é válida vai repetir o menu até que ele selecione a opção válida • Exemplo: • Construir um Menu para que o usuário escolha entre 3 opções, caso o usuário selecione um número fora das alternativas, deve repetir o menu. Caso selecione o número certo deve imprimir a mensagem: Você escolheu a fruta nome_fruta • 1 é laranja • 2 é mamão • 3 é abacate Estruturas de repetição Do While Exemplo de Do While int opcao = 0; do { Console.Clear(); Console.WriteLine("Menu: "); Console.WriteLine("1 - Exemplo 1 "); Console.WriteLine("2 - Exemplo 2 "); String opcaoUsuario = Console.ReadLine(); opcao = Convert.ToInt32(opcaoUsuario); switch (opcao) { case 1: Console.WriteLine("Selecionada a opção 1"); break; case 2: Console.WriteLine("Selecionada a opção 2"); break; default: Console.WriteLine("Opção inválida"); break; } Console.WriteLine("Pressione enter para tentar novamente"); Console.ReadLine(); } while (opcao != 0); 71 Estruturas de repetição • For • Substitui o para • É um laço de repetição comumente utilizado de forma iterativa, usa uma variável de controle para contar o número de repetições • Sintaxe: for(inicialização ;condicional ;incrementação){ //Comandos } 72 Estruturas de repetição •Podemos utilizar laços for em: •Repetições definidas • Os comandos internos devem ocorrer por um determinado número de vezes • Número de vezes → associado aos três parâmetros •Repetições infinitas • O número de vezes é infinito • Condicional •Laços omissos • O laço irá se repetir, mas sem instruções internas • Causar pausas 73 Exercício • A concessionária de veículos está vendendo os seus veículos com desconto. Faça um programa que calcule e exiba o valor do desconto e o valor a ser pago pelo cliente de vários carros. O desconto deverá ser calculado de acordo com o ano do veículo. • Até 2000 - 12% de desconto • acima de 2000 - 7% de desconto • O sistema deverá perguntar se deseja continuar informando veículos e calculando desconto até que a resposta seja “N” • Após informar “N” o sistema deve exibir: • o total de carros com ano até 2000 • o total de carros acima de 2000 • o total de valores (soma de todos os carros) • o total de descontos 74/22 Exercícios • 2 - Escrevaum algoritmo que leia 10 números inteiros fornecidos pelo usuário e informe ao final do processamento qual foi o maior número fornecido e qual foi o menor número fornecido. 75 Escopo da variável No C# as variáveis podem ser declaradas a qualquer momento no código. Porém, o local da declaração afeta a visibilidade da variável. O escopo da variável é o nome dado ao trecho de código em que aquela variável existe e pode ser acessada. Escopo da variável ... //Aqui a variável i não existe int i = 5; //A partir daqui a variável i existe while(true){ //O i ainda vale aqui int j = 7; //o j passa a existir } //o j não existe mais, mas o i continua existindo ... Vetores (arrays) É utilizado para armazenar vários valores de um mesmo tipo. ... int[] idades; //declaração do array idades = new int[10] //inicializa do array com 10 posições idades[5] = 10; //atribui o valor 10 na posição 5 ... 10idades Vetores (arrays) Um array é sempre um objeto, portanto é sempre uma referência. O índice dos vetores iniciam em 0 (semelhante ao C) e vão até n-1 onde n é o tamanho do vetor. O tamanho do vetor precisa ser especificado no momento da inicialização e não pode ser alterado. Vetores (arrays) - Percorrendo um vetor ... int[] idades = new int[10]; for(int i = 0; i < 10; i++){ idades[i] = i * 10; } //Imprimindo todas as idades for(int i = 0; i < 10; i++){ int x = idades[i]; Console.WriteLine(x); } //Forma mais simples de imprimir todas as idades foreach(int x in idades){ Console.WriteLine(x); } ... Exercício 1) Crie um programa que guarde em um vetor e imprima a o nome de todas as disciplinas em que você está matriculado neste semestre. 2) Crie um programa que solicite ao usuário e armazene 5 receitas e 5 despesas (apenas valores) e no final: - Imprima o saldo. - Imprima a média de receitas - Imprima a média de despesas Matrizes • São vetores de duas dimensões //Criando uma matriz vazia int[,] matriz = new int[10, 10]; //Atribuindo um valor na posição 0, 0. matriz[0, 0] = 10; //Criando uma matriz e inicializando int[,] matriz2D = { { 1, 2, 3 }, { 4, 5, 6 } }; Exercícios • Crie uma aplicação que realize a seguinte operação: A + B – C //Criando uma matriz vazia int[,] matriz = new int[10, 10]; //Atribuindo um valor na posição 0, 0. matriz[0, 0] = 10; //Criando uma matriz e inicializando int[,] matriz2D = { { 1, 2, 3 }, { 4, 5, 6 } }; Exercícios • Dada uma matriz de relacionamento onde cada linha e cada coluna correspondem a uma pessoa, o valor da matriz corresponde a 1 se essas pessoas são amigas e 0 se não forem. Imprima uma lista contendo a quantidade de amigos de cada uma das pessoas. Exemplo (Desconsiderar os cabeçalhos/títulos): Pessoa1 Pessoa2 Pessoa3 Pessoa4 Pessoa5 Pessoa1 0 1 0 0 0 Pessoa2 1 0 1 1 0 Pessoa3 0 1 0 0 1 Pessoa4 0 1 0 0 0 Pessoa5 0 0 1 0 0 *por enquanto a tabela pode estar fixa dentro do programa Listas - ArrayList • Cria uma lista de itens de qualquer tipo • Pode conter tipos diferentes de dados em uma mesma lista ArrayList coisas = new ArrayList(); coisas.Add(10); coisas.Add("Teste"); coisas.Add(19.90); coisas.Add(true); Listas - List • Funciona de forma semelhante ao ArrayList porém, exige que todos os elementos da lista sejam de um mesmo tipo. List<String> nomes = new List<String>(); nomes.Add("Zezinho"); nomes.Add("Huguinho"); nomes.Add("Luizinho"); foreach (String nome in nomes) { Console.WriteLine(nome); } Console.ReadLine(); Exemplos List<String> nomes = new List<String>(); nomes.Add("Zezinho"); nomes.Add("Huguinho"); nomes.Add("Luizinho"); foreach (String nome in nomes) { Console.WriteLine(nome); } Console.WriteLine("A lista tem {0} itens", nomes.Count); Console.WriteLine("Nome na primeira posição: {0}", nomes.ElementAt(0)); Console.WriteLine("Removendo nome na posição 2"); nomes.RemoveAt(2); Console.WriteLine("A lista tem {0} itens", nomes.Count); Console.WriteLine("Huguinho está na lista?"); if (nomes.Contains("Huguinho")) { Console.WriteLine("Sim"); } else { Console.WriteLine("Não"); } String nomePesquisado = nomes.Where(n => n.Contains("zinh")).FirstOrDefault(); Console.WriteLine("Resultado da pesquisa: {0}", nomePesquisado); if (nomes.Where(nome => nome.Contains("zinh")).Any()) { Console.WriteLine("Sim, tem um elemento que começa com Z"); } Listas - List • Listas possuem alguns métodos adicionais como: List<String> nomes = new List<String>(); nomes.Add("Zezinho"); nomes.Add("Huguinho"); nomes.Add("Luizinho"); foreach (String nome in nomes) { Console.WriteLine(nome); } //Remove um elemento da lista nomes.Remove("Huguinho"); //Pega o tamanho da lista int numElementos = nomes.Count; //Limpa a lista nomes.Clear(); //Verifica se o elemento existe na lista nomes.Contains("Luizinho"); Console.ReadLine(); 3) Refazer o exercício de receitas e despesas. O programa agora deve fornecer as seguintes opções: a) Cadastrar uma nova receita b) Cadastrar uma nova despesa c) Mostrar o saldo d) Mostrar a maior e a menor receita e despesa Listas - SortedList • Guarda uma coleção de itens de forma ordenada • Utiliza uma chave e um valor. Os elementos da chave devem ser de um mesmo tipo using System.Collections; ... SortedList Paises = new SortedList(); Paises.Add("Brasil", 0); Paises.Add("Espanha", 1); Paises.Add("Alemanha", 2); Paises.Add("Mexico", 3); Paises.Add("Italia", 4); foreach (DictionaryEntry locais in Paises) { Console.WriteLine(locais.Key.ToString() + "=" + locais.Value.ToString()); } Console.ReadLine(); Dicionários - Dictionary Muitas vezes queremos buscar um objeto a partir de alguma informação sobre ele. Ex: Buscar um carro a partir do numero da placa Buscar um usuário a partir do email Buscar uma pessoa a partir do cpf Buscar um livro a partir do ISBN Mapas - Dictionary Dictionary<int, String> usuarios = new Dictionary<int, String>(); usuarios.Add(012388877, "Zezinho"); usuarios.Add(827382, "Huguinho"); usuarios.Add(1444, "Luizinho"); //Recupera o nome do usuário a partir do código Console.WriteLine("O usuário com CPF 1444 é o " + usuarios[1444]); foreach (int cpf in usuarios.Keys) { Console.WriteLine("Cpf: " + cpf); Console.WriteLine("Nome: " + usuarios[cpf]); } Console.ReadLine(); Exercício • 1) Crie um programa que guarde e imprima o nome de todas as disciplinas que você está matriculado este semestre • O programa deve permitir o cadastro de um número indeterminado de disciplinas • 2) Crie um programa que guarde o código e o nome das disciplinas e imprima em ordem alfabética (pelo nome) todas as disciplinas em que você está matriculado neste semestre. • O programa deve permitir o cadastro de um número indeterminado de disciplinas 3) Crie um programa para gerenciar os ganhos e gastos. Cada registro deve conter uma descrição da operação (Ex: salário, almoço e etc) e o valor. O programa deve permitir a impressão de um relatório com o saldo restante, a lista de ganhos e a lista de gastos. - O usuário deve ser capaz de cadastrar um número indeterminado de ganhos e gastos - O sistema deve oferecer um menupara: - Cadastrar ganhos - Cadastrar gastos - Imprimir relatório - Sair Funções • Funções são pequenos blocos de código que podem • Receber parâmetros • Retornar valores Funções static String CriaMensagemBoasVindas(String nome) { String msg = ""; msg += "+-----------------------------------------+\n"; msg += "| |\n"; msg += "| Bem Vindo!!!!! |\n"; msg += "|" + new String(' ', 20 - (nome.Length/2)) + "\n"; msg += nome + "\n"; msg += new String(' ',20-(nome.Length/2)) + "|\n"; msg += "| |\n"; msg += "| |\n"; msg += "+-----------------------------------------+\n"; } static void Main(string[] args) { Console.WriteLine("Digite seu nome: "); String nome = Console.ReadLine(); String mensagem = CriaMensagemBoasVindas(nome); Console.WriteLine(mensagem); Console.ReadLine(); } Datas A classe responsável por manipular datas é chamada DateTime e corresponde a uma única data. A classe GregorianCalendar corresponde a um conjunto de dadas em um formato de calendário. DateTime hoje = DateTime.Now; //Pega a data atual Console.WriteLine("Hoje é {0} de {1} de {2}", hoje.Day, hoje.Month, hoje.Year); GregorianCalendar cal = new GregorianCalendar(); int dias = cal.GetDaysInMonth(1957, 2); Console.WriteLine("Fevereiro de 1957 teve {0} dias", dias); Console.ReadLine(); Calculando a diferença entre datas • Usando a classe DateTime podemos fazer cálculas entre duas datas: DateTime hoje = DateTime.Now; DateTime natal = new DateTime(2017, 12, 25); TimeSpan tempoNatal = natal - hoje; Console.WriteLine("Faltam {0} dias, {1} horas e {2} minutos para o natal", tempoNatal.TotalDays, tempoNatal.Hours, tempoNatal.Minutes); Console.ReadLine(); Convertendo uma String em DateTime String evento = "21/07/1997"; DateTime data = DateTime.ParseExact(evento, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture); //Convertendo de DateTime para String Console.WriteLine(data.ToString("dd/MM/yyyy")); Validando uma conversão de DateTime String evento = Console.ReadLine(); DateTime dataConvertida; bool conseguiu = DateTime.TryParseExact(evento, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dataConvertida); if(conseguiu) { Console.WriteLine("Data: {0}", dataConvertida.ToString("dd/MM/yyyy")); } else { Console.WriteLine("Formato de data inválida"); } Exercícios • Escreva um programa que solicite a data de nascimento de uma pessoa e mostre a quantidade de dias passados desde essa data. • Escreva um programa que mostre quantos dias, horas e minutos faltam para o natal. Console - Avançado • É possível melhorar as telas do console utilizando caracteres especiais para definir bordas e cores. • Console.SetCursorPosition(x, y); • Posiciona o cursor em um local da tela. Tudo que for digitado após esse comando será escrito nesta coordenada. • Console.ForegroundColor = ConsoleColor.Yellow; • Muda a cor da letra. Neste exemplo a letra será amarela • Console.BackgroundColor = ConsoleColor.Red; • Muda a cor do fundo. Neste exemplo a cor será vermelha. • Console.WindowWidth • Pega a largura da janela • Console.WindowHeight • Pega a altura da janela • Console.CursorVisible • Oculta ou mostra o cursor piscando _ Console - Avançado 9472: ─ 9474: │ 9484: ┌ 9488: ┐ 9492: └ 9496: ┘ 9500: ├ 9508: ┤ 9516: ┬ 9524: ┴ 9532: ┼ 9552: ═ 9553: ║ 9554: ╔ 9555: ╔ 9556: ╔ 9557: ╗ 9558: ╗ 9559: ╗ 9560: ╚ 9561: ╚ 9562: ╚ 9563: ╝ 9564: ╝ 9565: ╝ 9566: ╠ 9567: ╠ 9568: ╠ 9569: ╣ 9570: ╣ 9571: ╣ 9572: ╦ 9573: ╦ 9574: ╦ 9575: ╩ 9576: ╩ 9577: ╩ 9578: ╬ 9579: ╬ 9580: ╬ 9612: █ 9619: ▓ 9604: ▄ 9632: ■ static void DesenhaTela() { Console.SetCursorPosition(0, 0); Console.Write((char)9554); Console.Write(new String((char)9552, Console.WindowWidth-2)); Console.SetCursorPosition(Console.WindowWidth-1, 0); Console.Write((char)9557); for (int i = 1; i < Console.WindowHeight - 2; i++) { Console.SetCursorPosition(0, i); Console.WriteLine((char)9553); Console.SetCursorPosition(Console.WindowWidth - 1, i); Console.WriteLine((char)9553); } Console.SetCursorPosition(0, Console.WindowHeight - 2); Console.Write((char)9561); Console.Write(new String((char)9552, Console.WindowWidth - 2)); Console.SetCursorPosition(Console.WindowWidth - 1, Console.WindowHeight-2); Console.Write((char)9564); Console.SetCursorPosition(1, 1); } static void Main(string[] args) { DesenhaTela(); } ... Exercícios • Escreva um programa que mostre um retângulo utilizando os símbolos abaixo. O programa deve solicitar os valores das medidas dos lados para o usuário. 9472: ─ 9474: │ 9492: └ 9496: ┘ 9484: ┌ 9488: ┐ • Escreva um programa que exiba um menu contendo as opções (1 – Brasil, 2 – Alemanha, 3 – Inglaterra) e mostre no console a bandeira correspondente. Utilize matrizes para a definição das cores das bandeiras. • Escreva um programa que mostre um círculo (aproximado). O programa deve solicitar para o usuário o raio e a cor da linha. ... static void PreencheTela() { for (int x = 0; x < Console.WindowWidth - 1; x++) { for (int y = 0; y < Console.WindowHeight - 1; y++) { //Gera um número aleatório entre 0 e o número de cores disponíveis int randomIndex = new Random(x).Next(0, Enum.GetValues(typeof(ConsoleColor)).Length); //Seleciona a cor com base no índice aleatório gerado ConsoleColor color = (ConsoleColor) Enum.GetValues(typeof(ConsoleColor)).GetValue(randomIndex); //Posiciona o cursor na posição x e y Console.SetCursorPosition(x, y); //Seta a cor da letra como sendo a cor selecionada aleatoriamente Console.ForegroundColor = color; //Escreve um caractere na posição x e y Console.Write("#"); } } } static void Main(string[] args) { PreencheTela(); } ... ESTRUTURAS Estruturas Permite criar tipos de dados personalizados. São especificadas utilizando o comando struct. public struct Usuario { public String Nome; public String Email; public Int32 Matricula; } Estes dados podem ser compostos de outros dados com tipos conhecidos como String, Int32, Decimal e/ou outras estruturas. Estruturas Após definir a estrutura é possível criar variáveis com o tipo definido pela estrutura. Usuario u1 = new Usuario();u1.Nome = “Zezinho"; u1.Email = “zeh@patinhasinc.com"; u1.Matricula = 123; Estruturas Essas estruturas podem ser usadas em conjunto com List Usuario u1 = new Usuario(); u1.Nome = "Guilherme"; u1.Email = "guilherme.defreitas@gmail.com"; u1.Matricula = 12345; List<Usuario> usuarios = new List<Usuario>(); usuarios.Add(u1); foreach (Usuario usuario in usuarios) { Console.WriteLine("Matricula: {0}",usuario.Matricula); Console.WriteLine("Nome: {0}", usuario.Nome); } public struct Aluno { public int Matricula; public String Nome; } class Program { static void Main(string[] args) { Aluno aluno = new Aluno(); aluno.Matricula = 1; aluno.Nome = "Joaozinho"; AlteraAluno(aluno); Console.WriteLine("Matricula: {0}", aluno.Matricula); Console.WriteLine("Nome: {0}", aluno.Nome); Console.ReadLine(); } public static void AlteraAluno(Aluno aluno) { aluno.Nome = "Zezinho"; } } Estruturas vs Classes -No C# estruturas podem ter métodos (diferente do C/C++) -Estruturas são passadas por valor (copiadas) para funções/métodos enquanto classes são passadas por referência (o endereço de memória da variável é passado). - Exemplo Exercício Em uma agenda telefônica os contatos são cadastrados com os seguintes dados: Nome Telefone Celular Email DataAniversario Essas informações devem ser representadas em um tipo estruturado de dados Contato. Escreva um programa que permita o cadastro, remoção, busca e impressão de contatos desta agenda telefônica conforme as opções abaixo. 1 – Inserir Contato 2 – Listar Contatos 3 – Buscar Contato por nome 5 – Remover Contato 6 - Listar aniversariantes do mês 0 – Sair Memória Código Estática Dinâmica Código fonte do programa em código de máquina Área de dados • Variáveis Globais • Variáveis “static” • Constantes • Pilha • Hea p Memória Pilha (stack) Heap Memória dinâmica • Estrutura de pilha (LIFO) • Variáveis locais • Parâmetros de funções • Endereço de retorno • Malloc • Calloc • New • *qualquer alocação dinâmica Recursividade • Ocorre quando um método chama ele mesmo. • Promove a solução de problemas com um código mais elegante. • Normalmente utiliza mais memória de pilha • Pode ser utilizado como mecanismo de repetição em linguagens puramente funcionais (onde não existe for, foreach, while e do). • Necessita de uma “condição de parada” para que a recursão não continue indefinidamente. Fatorial – Versão recursiva 1. public static void Executar(){ 2. int valor = 5; 3. int resultado = Fatorial(valor); 4. Console.WriteLine(“O fatorial de {0} é: {1}", valor, resultado); 5. } 6. 7. public static int Fatorial(int num) 8. { 9. if (num <= 1) 10. { 11. return num; 12. } 13. else 14. { 15. int res = Fatorial(num - 1); 16. return num * res; 17. } 18. } Recursividade - Exercício • A sequência de Fibonacci tem como primeiros termos os números 0 e 1 e, a seguir, cada termo subsequente é obtido pela soma dos dois termos predecessores. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ... Crie um programa que: 1) Solicite que o usuário informe um valor inteiro correspondente a posição até onde a sequência de Fibinacci deve ser impressa. 2) Calcule e imprima todos os números da sequência de Fibonacci até o a posição do solicitada. Ex: Informe a posição a ser mostrada: 7 0, 1, 1, 2, 3, 5, 8 a) Implemente a solução iterativa (tradicional) b) Implemente o programa usando a solução recursiva Fibonacci - Recursivo static void FibonacciRecursivo(Int64 a, Int64 b, Int64 cont, Int64 posicao) { if (cont < posicao) { Console.Write("{0} ", a); FibonacciRecursivo(b, a + b, cont + 1, posicao); } } ... Console.WriteLine("Informe a posição de Fibonacci a ser calculada:"); Int64 posicao = Convert.ToInt64(Console.ReadLine()); FibonacciRecursivo(0, 1, 0, posicao); Fibonacci - Iterativo static void FibonacciIterativo(Int64 posicao) { Int64 a = 0, b = 1, c = 0; Console.Write("{0} {1}", a, b); for (Int64 i = 2; i < posicao; i++) { c = a + b; Console.Write(" {0}", c); a = b; b = c; } } ... Console.WriteLine("Informe a posição de Fibonacci a ser calculada:"); Int64 posicao = Convert.ToInt64(Console.ReadLine()); FibonacciIterativo(posicao); Trabalho 1 • Em trios. • Apresentação: 10/11 • Pesquisar e implementar em C# um algoritmo recursivo • Implementar a versão recursiva • Implementar a versão iterativa • Apresentação • Qual problema o algoritmo resolve? • Executar manualmente (teste de mesa) o algoritmo em uma instância pequena do problema • Código Recursivo • Código Iterativo Obs: O algoritmos NÃO podem ser - Sequência de Fibonacci - Fatorial O mesmo problema não pode ser escolhido por diferentes duplas. Para isso, cadastre o problema que irá resolver no formulário abaixo: Cadastre aqui - http://goo.gl/forms/8cFNirpTW7 Planilha com as escolhas das duplas (consulte antes de cadastrar o seu tema) https://docs.google.com/spreadsheets/d/1mLx6JezNxtctn0aSKxe9qL9WIihJILkeRbD28v2tJx0/edit#gid=1196 360872 GRAVANDO E LENDO ARQUIVOS TEXTO Gravando arquivos texto Para gravar e ler arquivos utilizaremos a classe StreamWriter (em System.IO) Com ela podemos gravar um arquivo com dados no formato de texto. *ver exemplo disponibilizado no site Gravando um arquivo using System; using System.IO; namespace DemoConsole { class Program { static void Main(string[] args) { //Cria um arquivo e grava um texto StreamWriter arquivo = new StreamWriter("arquivo.txt"); arquivo.WriteLine("Olá"); arquivo.Close(); } } } Lendo um arquivo texto Para ler um arquivo utilizamos a classe StreamReader. *ver o exemplo de código colocado no site Lendo um arquivo texto using System; using System.IO; namespace DemoConsole { class Program { static void Main(string[] args) { //Abre e lê o conteúdo do arquivo StreamReader reader = new StreamReader("arquivo.txt"); String dados = reader.ReadToEnd(); Console.Write(dados); Console.ReadLine(); } } } Serialização automática - Gravando • Grava os dados no formato XML de forma automática • Funciona apenas com classes • As classes precisam ser marcadas com o atributo [Serializable] Usuario u1 = new Usuario(); u1.Nome = "Guilherme"; u1.Email = "guilherme.defreitas@gmail.com"; u1.Matricula = 12345; //Cria o arquivo usuarios.xml com os dados StreamWriter writer = new StreamWriter("usuario.xml"); XmlSerializer xmlserializer = new XmlSerializer(typeof(Usuario)); xmlserializer.Serialize(writer, u1); writer.Close(); Serialização automática - Lendo • Recupera os dados do arquivo e cria um novo objeto FileStream stream = System.IO.File.OpenRead("usuario.xml"); XmlSerializer serializer = new XmlSerializer(typeof(Usuario)); Usuario u2 = serializer.Deserialize(stream) as Usuario; stream.Close(); Console.WriteLine("Nome: {0}", u2.Nome); Serialização binária • Converte os dados para um formato binário para transferência via rede ou gravação em arquivo public static byte[] Serialize<T>(T objectSerialize) { MemoryStream memorystream = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(memorystream, objectSerialize); memorystream.Flush(); byte[] bytesData = memorystream.ToArray(); return bytesData; } public static object Deserialize(byte[] data) { BinaryFormatter bf = new BinaryFormatter(); MemoryStream memorystream = new MemoryStream(data); object objDeserialized = bf.Deserialize(memorystream); return objDeserialized; } Exercício Um empresa de entrega de pizzas deseja criar um sistema para automatizar suas entregas. Para isso o sistema deve possuir: 1 - Cadastrar uma entrega - CPF do solicitante - Nomedo solicitante - Telefone do solicitante - Rua - Numero - Bairro - Cidade 2 - Listar entregas NÃO finalizadas 3 - Buscar entregas por CPF do solicitante 4 - Marcar uma entrega como finalizada (entregue) 5 - Mostar todas as entregas finalizadas *O sistema deve gravar todas as informações em arquivo XML
Compartilhar