Вы находитесь на странице: 1из 25

Escola Naval Dep.

Formao Engenheiros Navais


ramo de Armas e Electrnica

Sistemas Operativos Algoritmos e Estruturas de Dados


Apresentao
CFR EN-AEL Ribeiro Correia
(Ph.D Eng. Informtica e de Computadores) ribeiro.correia@marinha.pt

12 de Setembro de 2012
CFR EN-AEL RC SO-AED 1/50

Programa
Linguagem de programao C#. Estruturas de dados e algoritmos. Carga horria: 2 aulas tericas + 2 aulas prticas. Projecto: 2 projectos, individuais. Avaliao contnua: trabalhos semanais. Docente: Fernando Correia. Pgina da cadeira: http://www.engenheiros.pt/~rcorreia

CFR EN-AEL RC

SO-AED

2/50

Programa da cadeira
1

Linguagem C#
Variveis e Estruturas Bsicas Estruturas Dinmicas Chamadas a funes Funes recursivas

Algoritmos e Estruturas de Dados


Listas, buffers circulares, e pilhas rvores binrias Tabelas de espalhamento Algoritmos de ordenao

Sistemas Operativos
Introduo e principais caractersticas Processamento paralelo: threads Comunicao em rede: sockets

CFR EN-AEL RC

SO-AED

3/50

Avaliao
Componente terica (T): Repetio - 17DEZ12 Projecto (P): 1 projecto 40% + 2 projecto 60%. Nota de cada aluno ponderada pela discusso nal. 1 projecto entregar a: 11NOV12 2 projecto entregar (com relatrio) a: 14JAN13 2 projecto discusso a: 15JAN13 Avaliao contnua (C): mdia dos exerccios semanais. Nota nal = 40% P + 30% T + 30% C

CFR EN-AEL RC

SO-AED

4/50

Bibliograa
Rob Miles, C# Programming Department of Computer Science University of Hull

John Sharp, Microsoft C# 2010 - step by step Microsoft Press

CFR EN-AEL RC

SO-AED

5/50

A linguagem de programao C#
O Microsoft Visual C# uma linguagem de programao vocacionada para aplicaes que usam o Microsoft .NET Framework . Herda as funcionalidades das linguagens C++ e Java, eliminando inconsistencias e anacronismos, resultando numa linguagem de programao mais limpa, fcil e lgica. A verso actual do C# a verso 4.0. O C# uma linguagem orientada por objectos, perfeitamente adaptado aos ambientes de funcionamento Windows, que est otimizada para o processamente paralelo de tarefas e funcionamento com as bibliotecas de comunicaes Windows Communication Foundation (WCF). uma linguagem de programao integrada no ambiente de desenvolvimento Microsoft Visual Studio 2010.
CFR EN-AEL RC SO-AED 6/50

Ferramentas a usar
Sistema Operativo
Windows XP Windows Vista Windows 7

Ambiente Integrado de Desenvolvimento (IDE)


Microsoft Visual Studio 2010 Ultimate (descarregar do sitio do MSDN) pgina Web: http://msdn.microsoft.com

CFR EN-AEL RC

SO-AED

7/50

AED - Parte I

CFR EN-AEL RC

SO-AED

8/50

Construo de um programa em C#
O C# uma linguagem de programao orientada por objectos, que deriva das linguagens C++ e JAVA. Uma boa politica de programao, dene que um programa deve ser desenhado por blocos, em que cada bloco agrupa um conjunto de funcionalidades relacionadas com o mesmo tema. Numa linguagem orientada por objectos, cada objecto deve ser desenhado num bloco especco, ou seja, cheiro. Esta soluo permite a reutilizao do cdigo. O arranque do programa escrito num objecto que contem o mtodo main(). Este objecto integra todos ou parte dos objectos necessrios ao funcionamento desse mesmo programa.
CFR EN-AEL RC SO-AED 9/50

Construo de um programa em C#

CFR EN-AEL RC

SO-AED

10/50

.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Heranca { class Program { static void Main(string [] args) { ClassY y = new ClassY(); y.Display(); ClassX x = y; x.Display();

Declarao de bibliotecas de sistema. Nome do programa e denio do ambiente de programao. Agrupa todas as classes afectas a este programa. Nome da classe que contem o mtodo main() Contedo do mtodo main().

CFR EN-AEL RC

SO-AED

11/50

Ol Mundo!
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OlaMundo { class Program { static void Main(string [] args) { Console.WriteLine(Ol Mundo.); } } }

Bibliotecas de sistema Nome do ambiente de trabalho Classe que contm o mtodo main() Mtodo main() que recebe um vector de argumentos. Estes argumentos so passados para o programa atravs da linha de comandos. Apenas uma instruo Chamada ao mtodo WriteLine da classe Console Escreve uma string na consola String Ol mundo
CFR EN-AEL RC SO-AED

Cadeia de caracteres entre 12/50

Converso de temperaturas
Construir um programa que converte temperaturas da escala Fahrenheit para escala Celsius
Fahrenheit 0 20 40 60 80 260 280 300 Celsius -17 -6 4 15 26 126 137 148

CFR EN-AEL RC

SO-AED

13/50

Converso de temperaturas
Desenvolvimento do algoritmo:
Programa
Executa as instrues em ciclo at efectuar o calculo de todas as temperaturas Dado o valor de temperatura na escala Fahrenheit Enquanto a temperatura for inferior ao limite superior, fazer:
Converte temperatura para graus Celsius Escreve resultado em tabela Aumenta o valor da temperatura Fahrenheit

CFR EN-AEL RC

SO-AED

14/50

Converso de temperaturas

Parmetros do algoritmo:
Limite inferior = 0 Limite superior = 300 Passo de incremento = 20

CFR EN-AEL RC

SO-AED

15/50

Converso de graus Fahrneit em Celsius


using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConvTemp { class Program { /* Escreve tabela de converso de temperaturas */ static void Main(string [] args) { int fahr, cels, inferior, superior, incremento; inferior = 0; superior = 300; incremento = 20; fahr = inferior; // iniciar a varivel fahr while(fahr <= superior){ // ciclo while cels = 5/9*(fahr-32); Console.WriteLine("{0}\t{1}", fahr, cels); fahr += incremento; }

CFR EN-AEL RC

SO-AED

16/50

Converso de graus Fahrneit em Celsius

class Program { /* Escreve tabela de converso de temperaturas */ static void Main(string [] args) { int fahr, cels, inferior, superior, incremento; fahr = inferior; // iniciar a varivel fahr while(fahr <= superior){ // ciclo while cels = 5/9*(fahr-32);

Comentrios Texto entre /* e */, ou a seguir a //

CFR EN-AEL RC

SO-AED

17/50

Converso de graus Fahrneit em Celsius

static void Main(string [] args) { int fahr, cels; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20;

Declarao de variveis Tipos bsicos: char, short, int, long, oat, double, bool Tipos complexos: estruturas, unies, tabelas e classes (objectos)
CFR EN-AEL RC SO-AED 18/50

Converso de graus Fahrneit em Celsius

int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; fahr = inferior; // iniciar a varivel fahr while(fahr <= superior){ // ciclo while cels = 5/9 * (fahr-32);

Instruo de atribuio de valor a varivel Sintaxe: variavel = expresso

CFR EN-AEL RC

SO-AED

19/50

Converso de graus Fahrneit em Celsius


fahr = inferior; while(fahr <= superior){ cels = 5/9 * (fahr-32); Console.WriteLine("{0}\t{1}", fahr, cels); fahr += incremento; } return 0;

Ciclo while Sintaxe: while(expresso) <instruo > Indentao ajuda a perceber a estrutura do programa Erro frequente: while(i >= 0); i = i-1;
CFR EN-AEL RC SO-AED 20/50

Converso de graus Fahrneit em Celsius


fahr = inferior; while(fahr <= superior){ cels = 5/9 * (fahr-32); Console.WriteLine("{0}\t{1}", fahr, cels); fahr += incremento; } return 0; }

Diviso inteira Diviso entre inteiros diviso inteira 5/9 0


CFR EN-AEL RC SO-AED 21/50

Converso de graus Fahrneit em Celsius


fahr = inferior; while(fahr <= superior){ cels = 5/9 * (fahr-32); Console.WriteLine("{0}\t{1}", fahr, cels); fahr = += passo; } return 0; }

Console.WriteLine escrita formatada automtica Melhorar a formatao: necessrio converso de valores inteiros ou reais para strings. Problema: com inteiros, 0F so -17,8C e no -17C
CFR EN-AEL RC SO-AED 22/50

Converso de graus Fahrneit em Celsius - Novo


using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConvTemp { class Program { static void Main(string [] args) { int fahr, inferior, superior, incremento; double cels; inferior = 0; superior = 300; incremento = 20; fahr = inferior; // iniciar a varivel fahr while(fahr <= superior){ // ciclo while cels = 5.0/9.0*(fahr-32); Console.WriteLine("{0,3:0}{1,10:0.00}", fahr, cels); fahr += incremento; }

CFR EN-AEL RC

SO-AED

23/50

Converso de graus Fahrneit em Celsius - Novo

Principais diferenas: double cels; cels = 5.0/9.0 * (fahr-32); Console.WriteLine("{0,3:0}{1,10:0.00}", fahr, cels); Descrio:
inteiro depois da , - dimenso do campo sinal - depois da , - alinha informao esquerda sequncia de caracteres depois de : - formato de um nmero inteiro ou real

CFR EN-AEL RC

SO-AED

24/50

Converso de graus Fahrneit em Celsius - Ciclo for


static void Main(string [] args) { int fahr; for(fahr = 0; fahr <= 300; fahr += 20) Console.WriteLine("{0,3:0}{1,10:0.00}", fahr, 5.0/9.0*(fahr-32)); Console.ReadKey(); } O mesmo programa com um ciclo for: Inicializao de variveis: fahr = 0 Teste: fahr <= 300 Incremento: fahr += 20 Ciclo termina quando a condio de teste for falsa
CFR EN-AEL RC SO-AED 25/50

Leitura e escrita na consola


Text stream sequncia de caracteres dividida em linhas Cada linha contm 0 ou mais caracteres e acaba com CarriageReturn Newline (\r\n) Mtodo Console.Read(): l o prximo caracter da text stream Mtodo Console.Write(): recebe um objecto como argumento e escreve esse mesmo objecto na consola. O valor a escrever pode ser o contedo da varivel, ou o contedo do objecto devolvido atravs do mtodo ToString().

CFR EN-AEL RC

SO-AED

26/50

Leitura e escrita na consola

Algoritmo:
L um caracter Enquanto o resultado de ler caracter no for indicador m de texto, fazer:
Escreve caracter L prximo caracter

CFR EN-AEL RC

SO-AED

27/50

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LerFicheiros { class Program { static void Main(string[] args) { int c; c = Console.Read(); while (c != ) { Console.WriteLine((char)c); c = Console.Read(); } Console.Write("\nCarregue numa tecla para terminar..."); Console.ReadKey();

!= signica diferente Porqu int c ?


CFR EN-AEL RC SO-AED 28/50

Contagem de caracteres

Algoritmo:
Inicializa contador a 0 Enquanto o resultado de ler um caracter != m texto Incrementa contador Escreve contador

CFR EN-AEL RC

SO-AED

29/50

Contagem de caracteres
namespace ContaCaracteres { class Program { static void Main(string[] args) { long contador = 0; while (Console.Read() != ) contador++; Console.WriteLine("Li {0} caracteres da consola.", contador); Console.ReadKey();

Varivel do tipo long Pelo menos 64 bits para guardar um nmero inteiro Instruo de incremento da varivel contador Tipicamente mais eciente que: contador = contador + 1 Tambm h ++contador
CFR EN-AEL RC SO-AED 30/50

Contagem de linhas

Algoritmo:
Inicializa contador a 0 Enquanto o resultado de ler um caracter != m de texto Se caracter lido for == m de linha (\n) Incrementa contador Escreve contador

CFR EN-AEL RC

SO-AED

31/50

Contagem de linhas
namespace ContaLinhas { class Program { static void Main(string[] args) { int caracter, contador; contador = 0; caracter = Console.Read(); while(caracter != ){ if(caracter == \n) ++contador; caracter = Console.Read(); } Console.WriteLine(Nmero de linhas: {0}, contador);

Teste de igualdade == Caracter de mudana de linha \n


CFR EN-AEL RC SO-AED 32/50

Contagem de palavras
Algoritmo:
Estado toma o valor FORA Inicializa contador de caracteres, palavras e linhas a 0 Enquanto o resultado de ler um caracter != m de dados Incrementa contador de letras Se caracter lido for == m de linha (\n)
Incrementa contador de linhas

Se caracter lido for espao ou m de linha ou tabulao (\t)


Estado toma o valor FORA

Caso contrrio, se estado FORA ento:


Estado para a DENTRO Incrementa contador de palavras

Escreve contadores

CFR EN-AEL RC

SO-AED

33/50

Contagem de palavras
namespace ContaPalavras { class Program { const int DENTRO = 1; // denio de constante const int FORA = 0; static void Main(string[] args) { int c, nl, np, nc, estado; estado = FORA; nl = np = nc = 0; c = Console.Read(); while (c != ){ nc++; if (c == \n) nl++; if (c == || c == \n || c == \t) estado = FORA; else if (estado == FORA) { estado = DENTRO; np++; } c = Console.Read(); } Console.WriteLine("Nr. Linhas: {0}\nNr. Palavras: {1}\nNr. Caracteres: {2}", nl, np, nc);

CFR EN-AEL RC

SO-AED

34/50

Contagem de palavras
static void Main(string[] args) { int c, nl, np, nc, estado; estado = FORA; nl = np = nc = 0; c = Console.Read(); while (c != ){ ++nc; if(c == \n) ++nl;

Atribuio mltipla Equivale a: nl = 0; np = 0; nc = 0;


CFR EN-AEL RC SO-AED 35/50

Contagem de palavras
if (c == || c == \n || c == \t) estado = FORA; else if(estado == FORA){ estado = DENTRO; ++np; }

Operador lgico de disjuno || Operador lgico de conjuno && (tem maior precedncia que ||) Os argumentos so avaliados da esquerda para a direita. Interrompe a avaliao quando o argumento for suciente para denir o valor da expresso

CFR EN-AEL RC

SO-AED

36/50

Contagem de palavras
if (c == || c == \n || c == \t) estado = FORA; else if(estado == FORA){ estado = DENTRO; ++np; }

Instruo if-then-else Sintaxe: if (expresso) instruo 1 else instruo 2

CFR EN-AEL RC

SO-AED

37/50

Tabelas
Programa que conta ocorrncias de dgitos, espaos e de outros caracteres.

Algoritmo
Inicializa contadores dgitos, brancos e outros Enquanto resultado de ler caracter no indicador de m de cheiro, fazer:

Se caracter lido digito, ento Incrementa contador de dgito correspondente Seno, se caracter lido branco, ento: Incrementa contador de brancos Seno: Incrementa contador de outros
Escreve contadores

CFR EN-AEL RC

SO-AED

38/50

Tabelas
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Tabelas { class Program { static void Main(string[] args) { int c, i, nbrancos, noutros; int[] ndigitos; ndigitos = new int[10]; nbrancos = noutros = 0; for (i = 0; i < 10; i++) ndigitos[i] = 0; (cont.)
CFR EN-AEL RC SO-AED 39/50

Tabelas
c = Console.Read(); while (c != ) { if (c >= 0 && c <= 9) ++ndigitos[c - 0]; else if (c == || c == \n || c == \t) ++nbrancos; else ++noutros; c = Console.Read(); } Console.WriteLine("Digitos:"); for (i = 0; i < 10; i++) Console.WriteLine("{0,5:0} - {1}", i, ndigitos[i]); Console.WriteLine("\nEspaos em branco: {0}\nOutros: {1}", nbrancos, noutros); Console.ReadKey();

CFR EN-AEL RC

SO-AED

40/50

Tabelas
static void Main(string[] args) { int c, i, nbrancos, noutros; int[] ndigitos; ndigitos = new int[10]; nbrancos = noutros = 0;

Declarao de tabelas Varivel ndigitos uma tabela de 10 inteiros ndigitos[0], ndigitos[1], , ndigitos[9]

CFR EN-AEL RC

SO-AED

41/50

Tabelas
while (c != ) { if (c >= 0 && c <= 9) ++ndigitos[c - 0]; else if (c == || c == \n || c == \t) ++nbrancos; else ++noutros; c = Console.Read(); }

Os caracteres tambm so inteiros (cdigo ASCII) Valor do dgito c c-0 Funciona porque os dgitos aparecem seguidos nas tabelas de caracteres Utilizar valor do dgito como ndice, para guardar informao sobre o dgito numa tabela. Ex: ndigitos[2-0] representa o nmero de vezes que aparece o caracter 2
CFR EN-AEL RC SO-AED 42/50

Tabelas
if(c >= 0 && c <= 9) ++ndigitos[c-0]; else if(c == || c == \n || c == \t) ++nbrancos; else ++noutros;

ifs encadeados if (condio) instruo 1 else if (condio 2) instruo 2 else instruo N

CFR EN-AEL RC

SO-AED

43/50

Tabelas

if(c >= 0 && c <= 9) ++ndigitos[c-0]; else if(c == || c == \n || c == \t) ++nbrancos; else ++noutros;

Indentao crescente problemtica em instrues grandes Instruo switch semelhante a ifs encadeados

CFR EN-AEL RC

SO-AED

44/50

Mtodos
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Funcoes { class Program { static void Main(string[] args) { int i; for (i = 0; i < 10; i++) Console.WriteLine("{0} - {1,5:0}{2,10:0}", i, potencia(2, i), potencia(-3, i)); Console.ReadKey();

} (cont.)

CFR EN-AEL RC

SO-AED

45/50

Mtodos
static int potencia(int vbase, int vexpoente) { int i, p = 1; for (i = 1; i <= vexpoente; i++) p *= vbase; } return p;

Os Mtodos so procedimentos ou funes que esto includos nas classes. Fazem parte do conjunto de propriedades de cada objecto. Os Mtodos podem ser estticos (static) ou no. Diz-se que mtodos estticos fazem parte da classe mas no precisam de objecto. Um mtodo esttico apenas pode chamar directamente outros mtodos do tipo esttico. Caso contrrio, chamam propriedades afectas aos objectos. Os Mtodos podem aparecer em qualquer ordem dentro da classe.
CFR EN-AEL RC SO-AED 46/50

Mtodos
/* potencia: levanta base n-esima potencia; $n>=0$ */ static int potencia(int vbase, int vexpoente) { int i, p = 1; for(i = 1; i <= vexpoente; i++) p *= vbase; return p; } Parmetros formais de funo so variaveis locais do mtodo (inacessveis a partir de outros mtodos). Instruo return especica valor a retornar Um mtodo retorna sempre um valor do mesmo tipo com que foi declarado, excepto se for do tipo void
CFR EN-AEL RC SO-AED 47/50

Passagem por valor


Parmetros actuais copiados para variveis temporrias quando a funo executada. A funo no tem acesso a parmetros actuais (s s cpias). No os pode alterar. Diferente da passagem por referncia. Para funo mudar o contedo da varivel, recebe a referncia relativa ao endereo de memria onde est localizada a varivel. Excepo: se o parmetro actual uma tabela ou um objecto, sempre passada a referencia.
CFR EN-AEL RC SO-AED 48/50

Passagem por valor


Verso de potencia que usa menos variveis
/* potencia: levanta base n-esima potencia; n>= 0; */ int potencia(int vbase, int vexpoente) { int p; for(p = 1; vexpoente > 0; vexpoente--) p *= vbase; } return p;

CFR EN-AEL RC

SO-AED

49/50

Dvidas ?

CFR EN-AEL RC

SO-AED

50/50

Вам также может понравиться