Linguagem C# Versão – 090528 Prof.: Mauro César Lopes Sumário • • • • • • • Identificadores Tipos Constantes Enumerações Expressões Declarações Bloco de declarações Identificadores • São nomes utilizados para identificar os elementos nos seus programas. Esses elementos podem ser: namespace (espaço de nomes), classes, métodos, variáveis, etc. • Podemos usar apenas letras, número e sublinhado para compor o nome dos identificadores Palavras Chaves • C# reserva 77 identificadores, os quais não poderão ser utilizados para outros propósitos • Alguns exemplos: bool, break, char, default, enum, float, ... Variáveis • Uma variável é definida como um lugar onde podemos armazenar dados temporariamente e usá-los posteriormente • Normalmente um variável possui um nome (identificador) que é usado para acessar seu conteúdo • Uma variável poderá armazenar um número inteiro, de ponto flutuante, um caractere, uma cadeia de caracteres (String) , um valor booleano, etc. • O nome de uma variável pode conter letras, número e ‘_’ (não pode haver sinais de pontuação e espaços em branco) Boas práticas de programação • Adote uma convenção de nomes que torne claras as variáveis definidas – Não utilize sublinhados nos identificadores Exemplo: Use valorMercadoria ao invés de valor_da_mercadoria – Não use identificadores cuja única diferença seja entre letras maiúsculas e minúsculas – É importante notar que C# faz diferença entre letras maiúsculas e minúsculas – Comece o nome com uma letra Tipos de variáveis Define o tipo de dados que a variável irá armazenar • Inteira – byte, short, int, long • Ponto flutuante – float, double, decimal • Caractere – char • Booleana – bool: valores true (verdadeiro), false (falso) Tipos de variáveis Tipo Tamanho (em bytes) Tipo .NET Descrição byte 1 Byte Sem sinal (0-255) char 2 Char Caractere Unicode bool 1 Boolean Booleano (Verdadeiro ou Falso) sbyte 1 Sbyte Com sinal (-128 a 127) short 2 Int16 Com sinal ushort 2 UInt16 Sem sinal int 4 Int32 Com sinal uint 4 UInt32 Sem sinal float 4 Single Números de ponto flutuante double 8 Double Números de ponto flutuante de precisão dupla decimal 16 Decimal Valores monetários long 8 Int64 Números inteiros ulong 8 UInt64 Tipos de variáveis (2) Tipo Tamanho (em bytes) Tipo .NET Descrição byte 1 Byte Sem sinal (0-255) char 2 Char Caractere Unicode bool 1 Boolean Booleano (true=Verdadeiro ou false=Falso) short 2 Int16 Com sinal (-32.768 a 32.767) int 4 Int32 Com sinal (-2.147.483.648 e 2.147.483.647) float 4 Single Números de ponto flutuante. Armazena os valores de aproximadamente +/- 1,5*10-45 até aproximadamente +/3,4*10^38 com sete número significativos. Usa o sufixo F double 8 Double Números de ponto flutuante de precisão dupla (com 15 a 16 números significativos) decimal 16 Decimal Valores monetários. Precisão fixa até 28 dígitos e a posição do ponto decimal. É normalmente usado em cálculos financeiros. Exibe sufixo “m” ou “M” long 8 Int64 Números inteiros com sinal de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 Variáveis • Uma variável poderá ser signed (sbyte, short, int) ou unsigned (byte, ushort, uint), isto é, com sinal ou sem sinal. • Uma variável unsigned possui apenas valores positivos • Uma variável signed possui valores positivos e negativos Exemplos de declaração de variáveis • • • • • int a, idade; char ch, caracter; float f, valor; double d; string s; Toda variável deverá ser declarada explicitamente antes de ser usada Atribuição de valores a variáveis • Podemos atribuir o valor a uma variável usando o símbolo ‘=‘ (operador de atribuição) • Exemplos: int a = 1; // atribui o valor 1 a variável inteira a float f = -8.76F; // observe o sufixo F char c=‘a’; Atribuições • Se tentarmos atribuir um número a uma propriedade do tipo texto o programa não irá compilar • Por exemplo – value.text = 1; erro – value.text = “1”; ok, porém o número um está sendo tratado como texto e não como número – value.text = string.Parse(1); o número um é convertido de inteiro para uma string pelo uso do método parse da classe string Comentários • // comentário até o final da linha • /* ... Comentário multilinha */ Os comentários são ignorados pelo compilador, porém são úteis aos desenvolvedores porque ajudam a comentar o que o programa está fazendo Operadores • Numéricos agem em valores para criar novos valores • Lógicos ou Booleanos é um operador que faz cálculos cujo resultado é verdadeiro ou falso. • Relacionais são usados para descobrir se um valor é menor ou maior que outro do mesmo tipo • Binários agem sobre dois operandos Operadores Numéricos ++, -- Incremento, decremento +, -, *, /, % adição, subtração, multiplicação, divisão, módulo (resto) Exemplo: int int int x = y = a = 7; b = 3; x,y; a / b; a % b; Operador ++ int x; int y; x = 23; y = x++; // operador pós-fixado Console.WriteLine(x + " " + y); // 23 24 x = 23; y = ++x; // operador pré-fixado Console.WriteLine(x + " " + y); // 24 e 24 Operadores Relacionais e Lógicos (Booleanos) Um operador booleano é um operador que faz um cálculo cujo resultado é true (verdadeiro) ou false (falso) Operador ==, != >, >=, <, <= Ação Igual a, diferente de Maior que, maior ou igual a, menor que, menor ou igual a && “E” lógico (AND) || “OU” lógico (OR) ! “NÃO” lógico Operadores Lógicos Podem ser usados para testar condições mais complexas combinando condições simples • Operador && (“e” lógico - AND) • Operador || (“ou” lógico - OR) • Operador ! (“não” lógico - NOT) Exemplo: bool porcentagemValida = (porcentagem>=0) && (porcentagem<=100); Operadores Relacionais > Maior que >= maior ou igual a < menor que <= menor ou igual a Operadores Lógicos Bit a Bit & “E” binário ^ “XOR” ou-exclusivo | “OU” binário ~ “NÃO” binário >> deslocamento de bits a direito << deslocamento de bits a esquerda Operadores de igualdade e atribuição Não confunda o operador de igualdade ‘==‘ com o operador de atribuição ‘=‘. A expressão x==y compara x com y tem valor true se os dois valores forem idênticos e false caso contrário. Já a expressão x=y atribui o valor de y a variável x Expressões • São combinações de variáveis, constantes e operadores • Quando montamos expressões temos que considerar a ordem em que os operadores são executados • Essa ordem é definida pela tabela de precedência Precedência de Operadores Categoria Operadores Primário (x) x.y x’y f(x) a[x] x++ x– new typeof sizeof checked unchecked stackalloc Unário + - ! ~++x –x (T)x *x &x Multiplicativo * / % Aditivo + - Deslocamento << >> Relacional < > <= >= is as Igualdade == != Lógico AND & Lógico XOR ^ Lógico OR | Condicional AND && Condicional OR || Condicional ?: Atribuição = *= /= %= += -= <<= &= ^= |= Seqüência de comandos • Um programa é uma seqüência de comandos ou instruções (executa uma ação) <comando 1>; <comando 2>; ... <comando N>; Bloco de comandos • Um bloco é uma seqüência de instruções agrupadas entre uma chave de abertura ({) e uma de fechamento (}) • Um bloco inicia um novo escopo • Novas variáveis poderão ser definidas dentro do bloco, porém seus valores serão perdidos no final do bloco Comandos condicionais • Permitem que uma expressão seja avaliada e que uma ação seja executada no caso da expressão ser avaliada verdadeira (true) ou falsa (false). Comando if É usado para que possamos escolher entre dois blocos diferentes de código com base no resultado de uma expressão booleana. A sintaxe de uma instrução if é: if(expressãoBooleana) instrução-1; else instrução-2; Comando if - Exemplo int a = 5; if(a<0) Console.WriteLine (“a é negativo”); else Console.WriteLine (“a é positivo”); Comando if - Exemplo int a = 5; if(a<0) { // avalia a condição a<0 Console.WriteLine (“a é negativo”); } else { Console.WriteLine (“a é positivo”); } Comandos if em cascata if(dia==0) nome=“Domingo”; else if (dia==1) nome=“Segunda-Feira”; else if (dia==2) nome=“Segunda-Feira”; else if (dia==3) nome=“Segunda-Feira”; else if (dia==4) nome=“Segunda-Feira”; else if (dia==5) nome=“Segunda-Feira”; else if (dia==6) nome=“Segunda-Feira”; else if (dia==1) nome=“Segunda-Feira”; Switch switch (expressãoDeControle) { case expressãoConstante: instruções; break; case expressãoConstante: instruções; break; ... default: instruções; break; } Switch • expressãoDeControle: é avaliada uma única vez • expressãoConstante Comparação if / switch if(dia==0) nome=“Domingo”; else if(dia==1) nome=“segunda-feira”; ... else nome=“desconhecido”; switch(dia) { case 0: nome=“Domingo”; break; case 1: nome=“segunda-feira”; break ... default: nome=“desconhecido”; break; } Controle de Fluxo Um loop (laço) é uma série de instruções que devem ser repetidas até que uma certa condição seja encontrada Controle de Fluxo (2) • Loops (laços) com teste no início (while) • Loops (laços) com testes no final (do/while) • Loops (laços) de tamanho definido (for) • Saindo de loops (laços) antes do término (break) • Retestando a condição em loops (laços) (ex: continue) Comando while Repete o laço enquanto uma condição for verdadeira Exemplo: int i=0; while(i<5) { Console.WriteLine (i); i = i + 1; } Comando do/while int i=0; do { Console.WriteLine("i={0}",i); i = i + 1; } while (i<5); Exemplo do uso de do/while do { Console.WriteLine(“Menu”); Console.WriteLine(“1. Incluir”); Console.WriteLine(“2. Alterar”); Console.WriteLine(“3. Excluir”); Console.WriteLine(“4. Consultar”); Console.WriteLine(“0. Sair”); String opcao=Console.ReadLine(); } while(opcao!=“0”); Exercício • Escreva uma aplicação que leia e exiba a tecla lida enquanto a tecla ‘s’ não for pressionada. A aplicação deverá contar também o número de teclas pressionadas e exibi-las no final da aplicação Comando for Repete um loop (laço) um determinado número de vezes Exemplo: int i = 0; for(i=0;i<5;i++) { Console.WriteLine("i={0}",i); } Comparação for x while for( inicialização; condição; incremento ) declaração; inicialização; while(condição) { declaração; incremento; } Comparação for x while int i; for(i=0; i<=9; i++) { Console.WriteLine(i); } int i; i=0; while(i<=9) { Console.WriteLine(i); i++; } Loop Infinito int i; for(;;) { Console.WriteLine(i); } int i; i=0; while(true) { Console.WriteLine(i); } Comando break int i=0; while (i++<10) { Console.WriteLine("i={0}",i); if(i==5) { break; } } Exemplo do Comando Break int numTeclas=0; while (true) { // loop infinito // leia uma tecla em ch if(ch==‘s’) { break; } // exibe a tecla pressionada // incrementa contador de teclas pressionadas numTeclas++; } Comando continue int 0=0; while (i<10) { if(i%2!=0) {// testa se o número for par continue; } // exibe os números ímpares Console.WriteLine(i); i++; } Formatação de Cadeia de Caracteres {númParâmetro,espaçoReservado:formatação} onde: • númParâmetro: indica que parâmetro está sendo formatado • espaçoReservado: indica o número de caracteres mínimos para ocupar com o parâmetro • formatação: indica formatação específica do tipo de dados a utilizar Formatação de cadeia de caracteres - Exemplo Especifica ção Aplicação Significado C valores em geral valor monetário de acordo com o pais local D E F G inteiros inteiros genéricos valores em geral notação científica valores reais numero em formato de ponto fixo valores em geral geral (é utilizada a representação mais adequada ao número) N P X valores em geral numero de acordo com o pais local valores em geral percentagem inteiros notação científica Exemplo • {0,4} parâmetro 0, 4 espaços reservados com alinhamento à direita, sem formatação específica • {0,-4} parâmetro 0, 4 espaços reservados com alinhamento à esquerda, sem formatação específica Exemplos • • • • • • • • • Console.WriteLine("{0:C}", 1000.32); Console.WriteLine("{0:D}", 23); Console.WriteLine("{0:E2}", 13.322); Console.WriteLine("{0:F2}", 13.322); Console.WriteLine("{0:G}", 13.322); Console.WriteLine("{0:G}", 13); Console.WriteLine("{0:N}", 1000000.32); Console.WriteLine("{0:P}", 0.43); Console.WriteLine("{0:X}", 29); Concatenção de Strings • Console.WriteLine(“mauro “ + “cesar “ + “lopes”); • Console.WriteLine(“3 “ + “7”); • Retorna a string 37 e não a operação de 3+7=10 • Para obtermos a soma de 3 + 7 teríamos que proceder da seguinte forma: • Console.WriteLine(int.Parse(“3“) + int.Parse(“7”)); Conversão de Tipos • Use o método chamado Int32.Parse ou int.Parse para converter um valor contido em uma string em um inteiro se você precisar realizar cálculos aritméticos em valores armazenados em string Conversão de Tipos // o método Console.ReadLine() recebe // retorna uma variável do tipo String String s = Console.ReadLine(); // quando temos um número representado por // uma string não podemos fazer operações aritméticas com ele // Abaixo estão definidas as variáveis i, f e d int i; float f; double d; // converte uma variável do tipo String (s no exemplo) em um inteiro i = int.Parse(s); // converte uma variável do tipo String (s no exemplo) em um float f = float.Parse(s) // converte uma variável do tipo String (s no exemplo) em um double d = double.Parse(s) Definição de Constantes const <tipo> <nomeDaConstante> = <valor> Exemplos: const int numLinhas = 3; const int numColunas = 2; Arrays • Um array é um vetor ou matriz que permite guardar um certo conjunto de variáveis, todas do mesmo tipo Vetores • Para criar um vetor que armazene N elementos de um certo tipo (identificado por tipoDoVetor), utiliza-se a seguinte forma: tipoDoVetor[] nomeDoVetor = new tipoDoVetor[N] Vetores - Exemplo • Criação de um vetor com a nota de prova de cada aluno da turma int numAlunos=30; double[] notas = new notas[numAlunos]; Vetores • Para acessar cada elemento do array, usa-se colchetes: // coloca na posição 3 do vetor a nota 7.9 notas[3]=7.9; // atribui a nota da posição 0 do vetor double nota = notas[0]; Vetores • Observe que o primeiro elemento do array é o elemento 0 [0] primeiro elemento [1] segundo elemento ... [N-1] enésimo elemento Criação e inicialização de um vetor // Cria e inicializa um vetor string[] nomeDePessoas = { “Antonio”, “Jose”, “Joao”}; string[] nomeDePessoas = new String[] { “Antonio”, “Jose”, “Joao”}; Obs: o compilador determina qual deverá ser o tamanho do vetor Matrizes Multidimensionais • São matrizes com mais de uma dimensão (duas, três, quatro, ...) Exemplo: Uma matriz bidimensional de 2 linhas por 3 colunas (2x3) int[,] matriz = new [2,3]; Acesso de elementos • matriz[1,2]=35; • int valor = matriz[1,2]; Exemplo - Matriz com três dimensões double[,,] matriz3D = new double[10,10,10]; matriz3D[0,0,1]=1.0; matriz3D[0,1,0]=0.65; ... Inicialização de Matrizes // inicializa uma matriz bidimensional (2 x 3), isto é, duas linhas e três coluna int[,] matriz = { {1,2,3}, {4,5,6} }; Inicialização de Matrizes // inicializa uma matriz bidimensional (3 x 2), isto é, três linhas e duas coluna int[,] matriz = { {1,2}, {3,4}, {5,6} }; Alguns métodos da matrizes • matriz.Length obtém o número de elementos da matriz • matriz.Rank obtém o número de dimensões da matriz • matriz.GetLength(dim) obtém o número de elementos da dimensão dim Soma de Matrizes int[,] matrizA = { {1,2,3}, {4,5,6} }; int[,] matrizB = { {4,-1,2}, {-3,-7,-6} }; int[,] matrizC = new int[2,3]; // C = A + B Multiplicação de Matrizes int[,] matrizA = { {1,2}, {4,5} }; int[,] matrizB = { {4,-1}, {-3,-7} }; int[,] matrizC = new int[2,2]; // C = A x B Condições: - o número de colunas da matriz A deverá ser igual ao número de linhas da matriz B - a matriz resultante, C, terá a dimensão dada pelo número de linhas da matriz A e o número de colunas da matriz B Multiplicação de Matrizes Cada elemento c[i,j] será dado pela multiplicação dos elemento da linha i multiplicados pelos elementos da linha j c[i,j] += a[i,k] * b[k,j] onde k varia de 0 a número de linhas da matriz A ou número de colunas da matriz B, que são iguais Criando um método para exibir uma matriz Backup - Slides Palavras chave da Linguagem C# abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explict extern false finally Palavras chave da Linguagem C# (2) fixed float for foreach get goto if implict in int interface internal is lock long namespac e new null object operator out override params private protected Palavras chave da Linguagem C# (3) public readonly ref return sbyte sealed set short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecke d unsafe ushort using Palavras chave da Linguagem C# (4) value virtual void volatile while