Baixe o app para aproveitar ainda mais
Prévia do material em texto
Desenvolvimento de Software Estrutura de Linguagem - C# Prof. Henrique Mota mota.henrique@gmail.com http://www.henriquemota.com.br Linguagens de programação Introdução • Orientação a objetos é um modelo de programação ou paradigma de programação. É um conjunto de idéias, conceitos e abstrações que servem como um guia para construir um software. • A linguagem de programação é utilizada para definir formalmente todas as partes de um sistema e como essas partes se relacionam. • Conhecimento em OO é uma condição importante para o desenvolvimento de sistemas na maioria das linguagens de mercado. A Linguagem C# Características • Simplicidade: os projetistas de C# costumam dizer que essa linguagem é tão poderosa quanto o C++ e tão simples quanto o Visual Basic. • Completamente orientada a objetos: em C#, qualquer variável tem de fazer parte de uma classe. • Fortemente tipada: isso ajudará a evitar erros por manipulação imprópria de tipos, atribuições incorretas etc. Características • Gera código gerenciado: paradoxo da plataforma .NET, • Tudo é um objeto: System.Object é a classe base de todo o sistema de tipos de C#. • Controle de versões: cada assembly gerado, seja como EXE ou DLL, tem informação sobre a versão do código, permitindo a coexistência de dois assemblies homônimos, mas de versões diferentes no mesmo ambiente. Características • Suporte a código legado: o C# pode interagir com código legado de objetos COM e DLLs escritas em uma linguagem não gerenciada. • Flexibilidade: se o desenvolvedor precisar usar ponteiros, o C# permite, mas ao custo de desenvolver código não gerenciado, chamado ”unsafe”. Características • Linguagem gerenciada: os programas desenvolvidos em C# executam num ambiente gerenciado, o que significa que todo o gerenciamento de memória é feito pelo runtime via o GC (Garbage Collector), e não diretamente pelo programador, reduzindo as chances de cometer erros comuns a linguagens de programação onde o gerenciamento da memória é feito diretamente pelo programador. C# (CSharp) • Linguagem de Programação muito utilizada no mercado de trabalho. • Códigos de programas escritos em C# são colocados em arquivos com a extensão “.cs”. C# (CSharp) • Não é necessário entender todo esse código fonte. O importante é saber que todo programa escrito em C# para executar precisa ter o método especial Main. • Esse código fonte precisa ser traduzido para um executável para que um computador possa executá- lo. Essa “tradução” é realizada por um compilador da linguagem C#. • Suponha que o código acima seja colocado no arquivo OlaMundo.cs. O compilador padrão de C# (csc) pode ser utilizado para compilar esse arquivo. Método Main • Para executar um programa C#, é necessário definir um método especial para ser o ponto de entrada do programa, ou seja, para ser o primeiro método a ser chamado quando o programa for executado. • O método Main precisa ser static e seu tipo de retorno pode ser void ou int. • Ele também pode declarar parâmetros para receber os argumentos passados pela linha de comando e deve ser inserido em uma classe C#. Static, Void Algumas variações do método Main Método Main • Os parâmetros do método Main são passados pela linha de comando e podem ser manipulados dentro do programa. • O exemplo a seguir imprime cada parâmetro recebido em uma linha diferente. Método Main • Os parâmetros do método Main são passados pela linha de comando e podem ser manipulados dentro do programa. • O exemplo a seguir imprime cada parâmetro recebido em uma linha diferente. Exercício (OlaMundo.exe) Variáveis Variáveis e memória • Um dos recursos fundamentais que a maioria das Linguagens de Programação oferece é o de criação e utilização de variáveis. • A função de uma variável é permitir que um programa armazene e manipule dados na memória RAM do computador. • Uma variável é uma área de memória, associada a um nome, que pode armazenar valores de um determinado tipo. Variáveis e memória • Um tipo de dado define um conjunto de valores e um conjunto de operações. • Uma variável de um certo tipo T pode conter, num dado instante, um valor pertencente ao tipo T. Rigidez de tipos • C# é uma linguagem com rigidez de tipos (em inglês strongly typed). “um valor pertencente a um determinado tipo só pode ser usado como argumento em operações que preveem operações desse tipo.” Declaração de variáveis • Em C#, as variáveis devem ser declaradas para que possam ser utilizadas. • A declaração de uma variável envolve definir um nome único e um tipo de valor. • As variáveis são acessadas pelos nomes e armazenam valores compatíveis com o seu tipo. Declaração de variáveis Declaração de variáveis: tipo seguido de seu nome Declaração, inicialização e uso • Toda variável deve ser inicializada antes de ser utilizada pela primeira vez. • Se isso não for realizado ocorrerá um erro de compilação. • A inicialização é realizada através do operador de atribuição “=”. • Esse operador guarda um valor na variável, ou melhor, no espaço de memória reservado para a variável. Declaração, inicialização e uso Declaração de variáveis: operador “=” inicializa o valor da variável. Ainda sobre declarações • A declaração de uma variável pode ser feita em qualquer linha de um bloco. Não é necessário declarar todas as variáveis no começo do bloco. Declaração de variável em qualquer parte do bloco de instruções Declaração, inicialização e uso O comando de atribuição é usado para alterar o valor de uma variável. Sua forma: variável = expressão; Exemplos: x = z + 10; z = z + 1; b = true; Uma declaração da forma int x = 10; é na verdade a combinação de uma declaração de variável com uma atribuição. Escopo da variável • Toda variável pode ser utilizada dentro do bloco no qual ela foi declarada após a linha da sua inicialização. • Não é permitido declarar duas variáveis com o mesmo nome dentro de um mesmo bloco. Isso ocasionará um erro de compilação. Escopo da variável • Dentro de um bloco é possível abrir um sub-bloco. As variáveis declaradas antes do sub-bloco podem ser acessadas também no sub-bloco. Sub-bloco definido e acessando valores da varável “numero” Escopo da variável • Porém, variáveis declaradas em sub-blocos não podem ser acessadas do “bloco pai” nem de outro sub-bloco do “bloco pai”. Escopo da variável • Dentro de sub-blocos diferentes de um mesmo bloco é permitido declarar variáveis com nomes iguais. Exercício (Declaração de variáveis) Tipos de dados Tipos de dados • Como toda linguagem de programação, C# apresenta seu grupo de tipos de dados básico. • Esses tipos são conhecidos como “primitivos” ou “fundamentais” por serem suportados diretamente pelo compilador. • São utilizados durante a codificação na definição de variáveis, parâmetros e até mesmo em comparações. Sistema de Tipos do C# Object StringString ArrayArray T[]T[] enum Tenum T ValueTypeValueType class Tclass T intint shortshort bytebyte charchar floatfloat decimaldecimal longlong uintuint ulongulong sbytesbyte ushortushort boolbool doubledouble EnumEnum struct Tstruct T Tipo inteiro C# oferece diversos tipos de inteiros. Cada um deles é definido por: – uma gama de valores – uma representação interna O desenvolvedor tem a opção de decidir qual o tipo será usado em função da necessidade de sua aplicação. Tipo booleano • O tipo booleano, em C# chamado de bool, é usado em geral para operações lógicas. • Os valores possíveis para uma variável desse tipo são true e false. Categorias de tipos de dados Em C#, podemos apresentar 02 categorias: • Tipos valor: armazenam dados em memória enquanto. Ex.: int x =10; • Tipos referência: armazenam uma referência, o endereço, para o valor atual. Ex.: int x = newint(10); Conversão de tipo Conversões de tipos de dados é uma situação comum em programação. Devemos considerar: • Os tipos de menor faixa são convertidos para os de maior faixa. Por exemplo, o tipo int pode ser convertido para: long, float, double ou decimal. • A conversão dos tipos de ponto flutuante (float, double) para decimal causa erro. • A conversão entre os tipos com sinal e sem sinal de valores inteiros com o mesmo tamanho causa erro. Por exemplo, entre o tipo int e unit. Tabela de conversão automática O objeto “Convert” • Em C# temos o objeto Convert que é́ usado para converter um tipo de dado em outro. • Os tipos de dados suportados são: Boolean, Char, SByte, Byte, Int16, Int32, Int64, Uint16, UInt32, UInt64, Single, Double, Decimal, DateTime e String. Int numero = System.Convert.ToInt32 (decimal); Exercício (Conversão de tipos de dados) Operadores Operadores • Para manipular os valores das variáveis, podemos aplicar os operadores da linguagem. Há diversos tipos de operadores. Aritméticos Para realizar as operações matemáticas podemos aplicar os operadores: • + (soma), • - (subtração), • * (multiplicação), • / (divisão) e • % (módulo). Igualdade e desigualdade Para verificar se o valor armazenado em uma variável é igual ou diferente a um determinado valor ou ao valor de outra variável, devem ser utilizados os operadores: • == (igual) e • != (diferente). Esses operadores devolvem valores do tipo bool (true ou false). Relacionais As variáveis numéricas podem ser comparadas com o intuito de descobrir a ordem ou a relação numérica dos seus valores. Os operadores relacionais são: • > (maior que), • < (menor que), • >= (maior ou igual a) e • <= (menor ou igual a). Esses operadores devolvem valores do tipo bool (true ou false). Relacionais Lógicos Para verificar várias condições é possível aplicar os operadores lógicos: • && (e) e • || (ou). Expressões • Uma expressão é uma combinação de operandos e operadores. • Expressões em C# são semelhantes às expressões usadas em outras linguagens como C ou Pascal. Expressões • No caso de operações encadeadas, como em a+b*c o cálculo da expressão é feito de acordo com a precedência entre os operadores. • Parênteses podem ser utilizados para alterar a ordem de cálculo das operações. • Exemplos: (a+b)*c e a+(b*c) Expressões No caso de encadeamento de operações com a mesma precedência, a linguagem define o modo de associatividade (à esquerda ou à direita). Os operadores aritméticos em C# têm associatividade à esquerda. Exemplo: 6/2/3 é calculado como (6/2)/3 pois neste caso a associatividade é à esquerda. Em C#, apenas os operadores de atribuição (= *= /= %= += -= <<= >>= &= ^= |=) e o operador ternário (? :), têm associatividade à direita. Operadores Principais operadores, em ordem decrescente de precedência Categoria Operadores Associatividade Unário + - ! esquerda Multiplicativo * / % esquerda Aditivo + - esquerda Relacional < = > >= <= == is esquerda Igualdade == != esquerda 'and' (bool) && esquerda 'ou' (bool) || esquerda Operadores combinados O operador de atribuição pode ser combinado com outros operadores aritméticos. a op= exp; é equivalente a a = a op (exp); Exemplos: a += b; equivalente a a = a + b; a -= 2; equivalente a a = a - 2; a *= 1+1; equivalente a a = a * (1+1); a %= b*c+d; equivalente a a = a % (b*c+d); Auto-incremento e auto-decremento Numa expressão, os operadores ++ e -- podem ser usados antes ou depois da variável: – se usado após a variável, o incremento será feito depois de usar o valor da variável na expressão – se usado antes da variável, o incremento será feito antes do uso do valor na expressão Exemplos: a = a/i++; equivalente a a = a/i; i = i+1; b = --k*2; equivalente a k=k-1; b = k*2; Exercício (Operadores) Comandos Seleção • Os comandos de seleção são utilizados na escolha de uma possibilidade entre uma ou mais possíveis. • Os comandos if e switch fazem parte deste grupo. Comando if • O comando if utiliza uma expressão, ou expressões, booleana para executar um comando ou um bloco de comandos. • A cláusula else é opcional na utilização do if, no entanto, seu uso é comum em decisões com duas ou mais opções. Comando if Situação 01 (sem o uso do else) Situação 02 (com o uso do else) Comando if • Toda expressão do comando if deve ser embutida em parênteses () e possui o conceito de curto-circuito (short-circuit). • Isto quer dizer que se uma expressão composta por And (&&), fornecer na sua primeira análise um valor booleano false (falso), as restantes não serão analisadas. • Este conceito é válido para todas expressões booleanas. Comando if Assim como outros comandos. O if também pode ser encontrado na forma aninhada. Comando if O comando if com a cláusula else única pode ser encontrado em sua forma reduzida com operador ternário representado por interrogação (?:). E chamado de operador ternário por possuir 3 expressões: a primeira refere-se a condição boolena, a segunda se a condição é verdadeira e a terceira se a condição é falsa. Comando swicth • O comando switch utiliza o valor de uma determina expressão contra uma lista de valores constantes para execução de um ou mais comandos. • Os valor constante é tratado através da cláusula case e este pode ser numérico, caracter ou string. • A cláusula default é utilizada para qualquer caso não interceptado pelo case. Comando switch Comando switch Uma ou mais cláusulas case podem ser encontradas seguidamente quando mais do que uma opção é permitida para um comando ou bloco de comandos. Comando switch A cláusula break é utilizada para separar os blocos do switch e garante que o bloco seja executado somente até determinado ponto. Interação e Loop • Conhecidos como laço ou loop, os comandos de iteração executam repetidamente um comando ou bloco de comandos, a partir de uma determinada condição. • Esta condição pode ser pré-definida ou com final em aberto. • Em C#, fazem parte dos comandos de iteração: while, do, for e foreach. Comando for • O comando for possui 3 declarações opcionais, separadas por ponto e vírgula(;), dentro dos parênteses: • inicialização, • condição de interação, • e a iteração. • Em cada parâmetro, mais de uma expressão pode ser encontrada separada por vírgula. Comando for Comando foreach • O comando foreach enumera os elementos de uma coleção. Comando do e while • Os comandos do e while tem características semelhantes. Ambos executam condicionalmente um comando ou bloco de comandos. • No entanto, o comando do pode ser executado uma ou mais vezes e o comando while pode ser executado nenhuma ou mais vezes, isto ocorre porque a expressão condicional do comando do é́ encontrada no final do bloco. Comando do e while Exercício (Comandos) Vetores e matrizes Vetores e matrizes • C# oferece diversos mecanismos para a criação de novos tipos de dados a partir de tipos já existentes. • Um desses mecanismos é o que permite a construção de vetores e matrizes. • Suponha que o sistema de uma loja virtual precisa armazenar os preços dos produtos que ela comercializa. Vetores e matrizes • Não seria nada prático declarar para cada produto uma variável que armazena o preço do mesmo. • Para isso, é possível utilizar as estruturas chamadas Arrays (vetores). • Um array é uma estrutura que armazena um ou mais valores de um determinado tipo. Vetores e matrizes • A variável preços armazena uma referência de um array criado na memória RAM do computador. • Na memória, o espaço ocupado por esse array está dividido em 100 “pedaços” iguais numerados de 0 até 99. • Cada “pedaço” pode armazenar um valor do tipo double. • Quando um array é criado, as posições dele são inicializadas com os valores default. Vetores e matrizesAcessar posições fora do intervalo de índices de um array gera um erro de execução. No momento da criação de um array, os seus valores podem ser definidos. Declaração de um vetor Um exemplo: int[] v = new int[10]; – v é declarado com um vetor de inteiros – a expressão new int[10] cria efetivamente um vetor de inteiros, de tamanho 10. – o comando de atribuição associa o vetor criado ao vetor v. Declaração de um vetor • Tendo declarado a variável int[] v, esta pode ser associada a qualquer vetor de inteiros. Um exemplo: ... int[] v10 = new int[10]; int[] v20 = new int[20]; int i = x+10/16; int[] v; ... switch(i) { case 10: v = v10; break; case 20: v = v20; break; default: v = new int[i]; break; } ... Lista de valores • Um vetor também ser pode ser criado a partir de uma lista de valores entre { e } e separados por vírgula. • Exemplos: int[] primos = { 2,3,5,7,11,13,17,19 }; char[] dd = { 'd','s','t','q','q','s','s'}; string[] meses = {"jan","fev","mar","abr" }; Acesso aos elementos • Tendo criado um vetor, o acesso aos seus elementos é feito a partir da sua posição, ou índice, no vetor. • Se um vetor tem N elementos, os índices dos seus elementos vão variar entre 0 e N-1. • O índice para acesso ao elementos deve ser um valor inteiro entre 0 e N-1, definido por uma expressão. Um exemplo ... int[] f = new int[10]; f[0] = 0; f[1] = 1; for( int i = 2; i < 10; i++ ) f[i] = f[i-1]+f[i-2]; ... Outro exemplo public static void Main(string[] args){ int[] primos = { 2,3,5,7,11,13,17,19,23,29,31 }; int[] somas = new int[11]; for(int i = 0; i < 11; i++){ somas[i] = 0; for(int j = 0; j <= i; j++) somas[i] += primos[j]; } Console.Write("somas:",somas); for(int i = 0; i < 11; i++) Console.Write(" {0}",somas[i]); Console.WriteLine(); } Valor inicial de um vetor • A criação de um vetor através de new apenas aloca a memória necessária para o vetor, sem definir um valor inicial para o mesmo. • O valor inicial de um vetor pode ser definido através de uma tupla da forma { valor, valor, ... , valor } • O número de valores na tupla e o seu tipo devem ser compatíveis com o vetor. Um exemplo ... int[] p = { 2,3,5,7,11, 13 }; int[] s = { p[0]+p[1], p[2]+p[3],p[4]+p[5] }; string[] dias = { "seg","ter","qua","qui", "sex","sab","dom“ }; ... Arrays multidimensionais • É possível criar arrays de várias dimensões. • Isso permite a criação de estruturas para armazenar os valores de uma tabela. Percorrendo arrays • Os arrays podem ser facilmente preenchidos utilizando o comando while ou o for. Percorrendo arrays • A quantidade de elementos em cada dimensão dos arrays pode ser obtida através do método getLength. • A quantidade de elementos em todas as dimensões pode ser obtida através da propriedade Length. Propriedades e Métodos • obj.Length → Tamanho do vetor • Array.IndexOf(Array vetor, object value) → Procura a primeira ocorrência de valor em um vetor • Array.LastIndexOf(Array vetor, object value) → Procura a última ocorrência de valor em um vetor • Array.Sort(Array vetor) → Ordena o vetor crescentemente • Array.Reverse(Array vetor) → Ordena o vetor decrescentemente Tamanho de um vetor ... for(int m = 0; m < dias_mes.Length; m++){ gastos[m] = new float[dias_mes[m]]; for(int d = 0; d < gastos[m].Length; d++) gastos[m][d] = 0.0F; } ... Recomendações da MS • Evite usar “_” (underline) • Não crie variáveis com o mesmo nome alterando somente entre maiúsculas e minúsculas • Utilize nome de varáveis com minúsculas • Evite utilizar todas as letras maiúsculas (normalmente utilizado para definir constantes) • Utilize notação camelCasing • Em classes, métodos, propriedades, enumeradores, interfaces, constantes, campos somente leitura e namespaces use notação PascalCasing Exercícios Exercícios • Faça um programa que imprima na tela a mensagem “Bom Dia” 100 vezes. • Imprima na tela os números de 1 até 100. • Faça um programa que percorra todos os número de 1 até 100. Para os números ímpares deve ser impresso um “*” e para os números pares deve ser impresso dois “**”. • Faça um programa que percorra todos os número de 1 até 100. Para os números múltiplos de 4 imprima a palavra “PI” e para os outros imprima o próprio número. Exercícios • Crie um programa que imprima na tela um triângulo de “*” de 5 linhas. • Crie um programa que imprima na tela vários triângulos de “*” de 5 linhas. • A série fibonacci é uma sequência de números. O primeiro elemento da série é 0 e o segundo é 1. Os outros elementos são calculados somando os dois antecessores. Crie um programa para imprimir os 30 primeiros números da série de fibonacci. Exercícios • Crie um programa que imprima na tela os argumentos passados na linha de comando para o método MAIN. • Faça um programa que ordene o array de strings recebido na linha de comando. • Faça um programa que calcule a média dos elementos recebidos na linha de comando. • Crie um programa que encontre o maior número entre os valores passados na linha de comando. Exercícios Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 C# Type System Slide 36 Slide 37 Slide 38 Slide 39 Slide 40 Slide 41 Slide 42 Slide 43 Slide 44 Slide 45 Slide 46 Slide 47 Slide 48 Slide 49 Slide 50 Slide 51 Slide 52 Slide 53 Slide 54 Slide 55 Slide 56 Slide 57 Slide 58 Slide 59 Slide 60 Slide 61 Slide 62 Slide 63 Slide 64 Slide 65 Slide 66 Slide 67 Slide 68 Slide 69 Slide 70 Slide 71 Slide 72 Slide 73 Slide 74 Slide 75 Slide 76 Slide 77 Slide 78 Slide 79 Slide 80 Slide 81 Slide 82 Slide 83 Slide 84 Slide 85 Slide 86 Slide 87 Slide 88 Slide 89 Slide 90 Slide 91 Slide 92 Slide 93 Slide 94 Slide 95 Slide 96 Slide 97 Slide 98 Slide 99
Compartilhar