Práticas C# Algoritmia e Programação Estruturada

Page 1


P Prefáciio

À semelhançça da alteraação ascenddente de meiio tom que,, em Música, o carácteer # p provoca na altura de determinada d a nota, tamb bém, em Prrogramaçãoo, o # aspira a elevar as cappacidades das d linguageens de prog gramação orrientadas poor objectos. O C é a mais recente linnguagem dee programaçção da Micrrosoft que, executando C# o-se soobre a plataaforma .Nett Frameworrk, pretendee ser um marco no dessenvolvimen nto d aplicaçõees Web a caminho de de d um nov vo paradigm ma de proggramação que q suustente a uttilização de software a pedido. p O C#, que peersegue o objectivo o de contribuir para a conccepção de prrogramas caada v mais sim vez mples de utiilizar, fáceiss de compreeender, flexxíveis, robusstos, portáteeis, reeutilizáveis, integráveiis, constituííveis em weeb services,, etc., beneeficiou de dois d d desafios histtóricos impoortantes: • A consolidaçção do paaradigma de prograamação orrientada por p objectos (POO O) – A expperiência dee programaçção em lingguagens com mo, por exemplo, o Java e o C++, C enriqueeceu e agilizzou a POO e a subjaceente proggramação estruturada, e , e permitiiu modelizaar uma nova linguag gem inteeiramente orrientada porr objectos que q ultrapasssasse as dificuldades das d prim meiras linguuagens dedicadas a estee paradigmaa de program mação; • O desenvolvim mento da filosofia de d negócioo a pedidoo (on-dema and bussiness) – A filosofia dee on-deman nd business,, que tem vvindo a imp por-se à Gestão, principalm mente, a parrtir da era da Web, ttem levantaado d tratamennto de dado os a queestões técniccas de utilizzação de feerramentas de quee a program mação proccura respon nder, prom movendo a integração de com mponentes desenvolvid d das em ambiientes diversos. A estes desaafios procurrou o C# reesponder ofe ferecendo prrimitivas dee programaçção q facilitam que m a constituuição de bibbliotecas de componenttes e a sua integração em teempo de compilação c e de execcução, segu undo os paaradigmas dde POO e de p programação o orientada por componnentes (POC C). Esta obra, Práticas E P de C#: Algoriitmia e Pro ogramação Estruturadda, promovee o estudo da liinguagem de d program mação C# através a da resolução r aalgorítmica de d diversos prooblemas esppecialmente concebidoss para demoonstrar os pprincípios e as reegras da proogramação estruturadaa. Os exercíícios foram m resolvidoss com base na v versão Exprress do C# 2010.

© FCA – Editora de Informática

VII V


Práticas de C#: Algoritmia e Programação Estruturada {for (int Coluna=1; Coluna<=Dimensao; Coluna++) {if ((Linha==Coluna) || (Coluna==Dimensao-Linha+1)) Console.Write(Caract); else Console.Write(Ponto);} Console.WriteLine();} }}}

 EXECUÇÃO X..........X .X........X. ..X......X.. ...X....X... ....X..X.... .....XX..... .....XX..... ....X..X.... ...X....X... ..X......X.. .X........X. X..........X

? EXERCÍCIO 15: TRIÂNGULOS RECTÂNGULOS Elabore um programa que imprima os seguintes triângulos rectângulos: x

x

x

x

x

xx

xx

xx

xx

xx

xxx

xxx

xxx

xxx

xxx

xxxx

xxxx

xxxx

xxxx

xxxx

xxxxx

xxxxx

xxxxx

xxxxx

xxxxx

 TOP-DOWN 1. Para cada linha dos triângulos 1.1. Para cada triângulo 1.1.1. Imprimir o carácter do padrão escolhido 1.1.2. Avançar o tabulador para o próximo campo de edição 1.2. Mudar de linha

102

© FCA – Editora de Informática


Estruturas Repetitivas  CONSTANTE E VARIÁVEIS Constante C

Tipo Char

Valor X

Significado Carácter do interior do triângulo

Variável

Tipo

Significado

A Caract Linha T Trian Triangulos

int int int int string int

Altura dos triângulos Contador de caracteres Contador de linhas Contador de triângulos Figura com a sequência de triângulos Número de triângulos

 ALGORITMO TRIANGULOSRECTANGULOS C:=’X’ A:=6 T:=5 Para Linha=1 até A Para T=1 até Triangulos Para Caract=1 até Linha Trian:=Trian+”*” FimPara Trian=Trian+”\t” FimPara Trian:=Trian+”\n” FimPara Escrever(Trian)

 PROGRAMA TRIANGULOSRECTANGULOS using System; namespace R15 {class TriangulosRectangulos {static void Main(string[] args) {const char C='*'; int A=6; int Triangulos=5; string Trian=""; for (int Linha=1; Linha<=A; Linha++) {for (int T=1; T <= Triangulos; T++) {for (int Caract=1; Caract <= Linha; Caract++) © FCA – Editora de Informática

103


Práticas de C#: Algoritmia e Programação Estruturada Trian += C; Trian += "\t";} Trian+="\n";} Console.WriteLine(Trian); }}}

 EXECUÇÃO x xx xxx xxxx xxxxx

x xx xxx xxxx xxxxx

x xx xxx xxxx xxxxx

x xx xxx xxxx xxxxx

x xx xxx xxxx xxxxx

? EXERCÍCIO 16: ÁRVORE Elabore um programa que imprima a seguinte árvore:

* * * * * * * * * *

* * * * * *

* * * * *

* * * * *

* * * * * * * * * *

 TOP-DOWN 1. 2. 3. 4.

Ler o número de linhas árvore Determinar a coluna do ecrã onde será impresso o topo da árvore Inicializar o primeiro ímpar Para cada linha da árvore 4.1. Imprimir espaços até ao início da linha 4.2. Imprimir um número ímpar de asteriscos 4.3. Preparar a impressão da linha seguinte 4.3.1. Gerar o próximo ímpar 4.3.2. Determinar o início da próxima linha

 CONSTANTES E VARIÁVEIS Constante C Espaco

104

Tipo Char Char

© FCA – Editora de Informática

Valor *

Significado Carácter da árvore Espaço


Vectores e Matrizes {int[,] A = { { 0, 1, 0 }, { 4, 0, 2 }, {6, 3, 3}}; int[,] B = { { 1, 0, 1 }, { -1, 2, -2 }, { 1, -3, 3 } }; int N = A.GetLength(0); int M = A.GetLength(1); int[,] C = new int[N,M]; for (int I = 0; I <= N-1 ; I++) for (int J = 0; J <= M-1; J++) C[I, J] = A[I, J] + B[I, J]; for (int I = 0; I <= N-1; I++) {for (int J = 0; J <= M-1; J++) Console.Write("{0, 4}", C[I, J]); Console.WriteLine();} }}}

 EXECUÇÃO 1 3 7

1 2 0

1 0 6

? EXERCÍCIO 32: MULTIPLICAÇÃO DE MATRIZES Elabore um programa que multiplique duas matrizes de número inteiros. Por exemplo: ⎡ 1 0⎤ ⎡1 2 3 ⎤ ⎢ ⎥ ⎡14 13⎤ ⎢4 0 2⎥ x ⎢ 2 2⎥ = ⎢10 6⎥ ⎦ ⎢3 3 ⎥ ⎣ ⎣ ⎦ ⎣ ⎦

 TOP-DOWN 1. Formar a matriz multiplicanda e a matriz multiplicadora 2. Para cada linha da matriz produto 2.1. Para cada coluna da matriz produto 2.1.1. Adicionar o produto de cada elemento de uma linha da matriz multiplicanda por um elemento de uma coluna da matriz multiplicadora 3. Imprimir a matriz produto

 VARIÁVEIS Variável A B

Tipo int[,] int[,]

Significado Matriz multiplicanda Matriz multiplicadora © FCA – Editora de Informática

213


Práticas de C#: Algoritmia e Programação Estruturada Variável

Tipo

C I J

int[,] int int

K

int

M1 M2 N1 N2 Total

int int int int int

Significado Matriz produto Índice-linha da matriz multiplicanda e da matriz produto Índice-coluna da matriz multiplicanda e índice-linha da matriz multiplicadora Índice-coluna da matriz multiplicadora e índice-coluna da matriz produto Número de colunas da matriz multiplicanda Número de colunas da matriz multiplicadora Número de linhas da matriz multiplicanda Número de linhas da matriz multiplicadora Somatório do produto de uma linha da matriz multiplicanda por uma coluna da matriz multiplicadora

 ALGORITMO MULTIPLICACAODEMATRIZES A:={ { 1, 2, 3 }, { 4, 0, 2 } } N1:=A.Comprimento(linhas) M1:=A.Comprimento(colunas) B:={ { 1, 0 }, { 2, 2 }, { 3, 3 } } N2:=B.Comprimento(linhas) M2:=B.Comprimento(colunas) Para I=0 até N1-1 Para K=0 até M2-1 Total:=0 Para J=0 até M1-1 Total:=Total+A[I,J]*B[J,K] FimPara C[I,K]:=Total FimPara Fimpara Para I=0 até N1-1 Para J=0 até M2-1 Ecrever (C[I,J]) FimPara FimPara

 PROGRAMA MULTIPLICACAODEMATRIZES using System; namespace VM32 {class MultiplicacaoDeMatrizes 214

© FCA – Editora de Informática


Vectores e Matrizes {static void Main(string[] args) {int[,] A = { { 1, 2, 3 }, { 4, 0, 2 } }; int N1 = A.GetLength(0); int M1 = A.GetLength(1); int[,] B = { { 1, 0 }, { 2, 2 }, { 3, 3 } }; int N2 = B.GetLength(0); int M2 = B.GetLength(1); int[,] C = new int[N1,M2]; int Total = 0; for (int I = 0; I <= N1-1 ; I++) {for (int K = 0; K <= M2-1; K++) {Total = 0; for (int J = 0; J <= M1-1; J++) Total = Total + A[I, J] * B[J, K]; C[I, K] = Total;}} for (int I = 0; I <= N1-1; I++) {for (int J = 0; J <= M2-1; J++) Console.Write("{0, 4}", C[I, J]); Console.WriteLine(); }}}}

 EXECUÇÃO 14 10

13 6

? EXERCÍCIO 33: DETERMINANTE DA MATRIZ Elabore um programa que calcule o determinante de uma matriz de terceira ordem pela regra de Sarrus. Por exemplo, o cálculo do determinante da matriz pela regra de Sarrus: ⎡1 2 3 ⎤ ⎢3 1 4 ⎥ ⎢ ⎥ ⎢⎣0 1 2⎥⎦

1. Duplicar as duas primeiras colunas: ⎡1 2 3 1 2 ⎤ ⎢3 1 4 3 1 ⎥ ⎢ ⎥ ⎢⎣0 1 2 0 1⎥⎦ © FCA – Editora de Informática

215


7

Erros, Validações e Correcções

A introdução e o processamento de dados podem gerar erros que alteram a execução dos programas. Estes erros são causados pelo ambiente de programação ou pela semântica do programa que estamos a executar. Se os dados ou o seu processamento não se adequam às exigências do sistema computacional em que o programa está a ser executado, por exemplo, a tentativa de aceder a uma drive, pasta ou ficheiro inexistente, o seu software ou hardware geram erros e param a execução do programa. Por outro lado, se a introdução de dados e o seu processamento não se adequam às especificações do programa, por exemplo, quando o utilizador introduz uma letra em vez do número inteiro que lhe é pedido ou qualquer tentativa de ultrapassar os limites das matrizes, o software reage e pára a sua execução. Um bom programa detecta estes erros e trata-os, isto é, contém procedimentos de detecção e de resposta aos erros – mecanismos de error handling – para que não seja interrompido sem, pelo menos, informar o utilizador sobre as características dos erros que ocorreram. Um programa é tão mais robusto quantos mais erros detectar, permitir a correcção desses erros e continuar a sua execução. O C# designa estes erros por excepções, uma vez que resultam de situações extraordinárias que alteram a execução geral do programa, e procura dar-lhes resposta, apresentando a estrutura de tratamento de excepções que mostra a Fig. 7.1.

Fig. 7.1: Estrutura de detecção e recuperação de erros. © FCA – Editora de Informática 225


Práticas de C#: Algoritmia e Programação Estruturada Console.Write("Digite o primeiro valor (X) "); X=Convert.ToInt16(Console.ReadLine()); Console.Write("Digite o segundo valor (Y) "); Y=Convert.ToInt16(Console.ReadLine()); Console.Write("Digite o terceiro valor (Z) "); Z=Convert.ToInt16(Console.ReadLine()); Console.WriteLine("Maior={0}", Maiorde3(X, Y, Z)); Console.WriteLine("Menor={0}", Menorde3(X, Y, Z)); }}}

 EXECUÇÃO Digite o primeiro valor (X) 4 Digite o segundo valor (Y) 3 Digite o terceiro valor (Z) 6 Maior=6 Menor=3

? EXERCÍCIO 6: CONTAGEM DE NOMES Elabore um procedimento que conte o número de nomes começados por A, B ou C. O procedimento tem como parâmetros um nome e o valor corrente do contador. Â TOP-DOWN CONTAINICIAIS 1. Enquanto houver nomes 1.1. Ler cada nome 1.2. Actualizar o contador se o nome começar por A, B ou C

 PARÂMETROS Parâmetro Nome Conta

Tipo string int

Significado Nome que o utilizador digitar Número de nomes começados por A, B ou C

 SUBALGORITMO CONTAINICIAIS(NOME, CONTA) Se Nome.subcadeia(0,1)=’A’ ou Nome.subcadeia(0,1)=’B’ ou Nome.subcadeia(0,1)=’C’ Então Conta:=Conta+1 FimSe 254

© FCA – Editora de Informática


Procedimentos e Funções  SUBPROGRAMA CONTAINICIAIS static void ContaIniciais(string Nome, ref int Conta) {if ((Nome.Substring(0, 1)== "A")|| (Nome.Substring(0,1)=="B") ||(Nome.Substring(0,1)=="C")) Conta++;}

 INVOCAÇÃO DO SUBPROGRAMA using System; namespace PF6 {class ContagemNomes {static void ContaIniciais(string Nome, ref int Conta) {if ((Nome.Substring(0, 1)== "A")|| (Nome.Substring(0,1)=="B") ||(Nome.Substring(0,1)=="C")) Conta++;} static void Main(string[] args) {int Conta=0; string Nome; Console.Write("Digite um nome ou ZZZ "); Nome=Console.ReadLine().ToUpper(); while (Nome.ToUpper()!="ZZZ") {ContaIniciais(Nome, ref Conta); Console.Write("Digite um nome ou ZZZ "); Nome=Console.ReadLine().ToUpper();} Console.WriteLine("Há {0} nomes começados por A, B ou C", Conta); }}}

 EXECUÇÃO Digite um nome ou ZZZ Ana Digite um nome ou ZZZ Teresa Digite um nome ou ZZZ Rosa Digite um nome ou ZZZ Rita Digite um nome ou ZZZ Albertina Digite um nome ou ZZZ Beatriz Digite um nome ou ZZZ Carla Digite um nome ou ZZZ ZZZ Há 4 nomes começados por A, B ou C

? EXERCÍCIO 7: EFEITOS INDESEJADOS Evidencie a necessidade da passagem de argumentos por referência, elaborando um procedimento que calcule o triplo de um número. © FCA – Editora de Informática

255


Recorrência if (A[I] == X) return X + " existe na posição " + I; else return ExisteLinear(X, A, I + 1);}

 INVOCAÇÃO DO SUBPROGRAMA using System; namespace RC18 {class PesquisaLinear {static String ExisteLinear(int X, int[] A, int I) {if (I == A.Length) return X + " Não existe no vector"; else if (A[I] == X) return X + " existe na posição " + I; else return ExisteLinear(X, A, I + 1);} static void Main(string[] args) {int[] A = { 3, 8, 2, 19, 56, 20, 90 }; Console.Write("Número a procurar "); int X=Convert.ToInt16(Console.ReadLine()); Console.WriteLine(ExisteLinear(X, A, 0));} }}

 EXECUÇÃO Número a procurar 56 56 existe na posição 4

? EXERCÍCIO 19: PESQUISA BINÁRIA Elabore uma função recorrente que verifique se um determinado número X existe num vector ordenado por ordem crescente. Â TOP-DOWN EXISTEBINARIA 1. Se o índice inferior for maior do que o índice superior, X não existe 2. Se o índice inferior for menor do que o índice superior 2.1. Calcular o índice do meio do vector 2.2. Se o elemento do meio 2.2.1. For igual a X, encontrámos 2.2.2. For maior do que X, procuramos para a esquerda 2.2.3. For menor do que X, procuramos para a direita © FCA – Editora de Informática

321


Práticas de C#: Algoritmia e Programação Estruturada  RESULTADO E PARÂMETROS Resultado ExisteBinaria

Parâmetro A Inferior Superior X

Tipo

Significado

string

Índice do elemento a procurar ou mensagem de não existência

Tipo int[] int int int

Significado Vector de inteiros Índice mais baixo do intervalo a pesquisar Índice mais alto do intervalo a pesquisar Elemento a procurar

 SUBALGORITMO EXISTEBINARIA(X, A, INFERIOR, SUPERIOR) Se Inferior > Superior Então ExisteBinaria= X + " não existe" Senão Meio = (Inferior + Superior) / 2 Se A[Meio] = X Então ExisteBinaria= X + " existe na posição " + Meio Senão Se A[Meio] > X) Então ExisteBinaria= ExisteBinaria(X, A, Inferior, Meio-1) Senão ExisteBinaria=ExisteBinaria(X, A, Meio+1,Superior) FimSe FimSe FimSe

 SUBPROGRAMA EXISTEBINARIA static String ExisteBinaria(int X, int[] A, int Inferior, int Superior) {int Meio; if (Inferior > Superior) return X + " não existe"; else {Meio = (Inferior + Superior) / 2; if (A[Meio] == X) return X + " existe na posição " + Meio; else if (A[Meio] > X) return ExisteBinaria(X, A, Inferior, Meio - 1); else return ExisteBinaria(X, A, Meio + 1, Superior);}}

322

© FCA – Editora de Informática


Recorrência  INVOCAÇÃO DO SUBPROGRAMA using System; namespace RC19 {class PesquisaBinaria {static String ExisteBinaria(int X, int[] A, int Inferior, int Superior) {int Meio; if (Inferior > Superior) return X + " não existe"; else {Meio = (Inferior + Superior) / 2; if (A[Meio] == X) return X + " existe na posição " + Meio; else if (A[Meio] > X) return ExisteBinaria(X, A, Inferior, Meio - 1); else return ExisteBinaria(X, A, Meio + 1, Superior);}} static void Main(string[] args) {int[] A = { 2, 3, 8, 19, 20, 56, 90 }; Console.Write("Número a procurar "); int X=Convert.ToInt16(Console.ReadLine()); int Inferior=0; int Superior=A.Length-1; Console.WriteLine(ExisteBinaria(X, A,Inferior, Superior));} }}

 EXECUÇÃO Número a procurar 20 20 existe na posição 4

? EXERCÍCIO 20: FUNÇÃO DE ACKERMANN Elabore uma função recorrente que calcule: m=0 ⎧1, ⎪2, m = 1, n = 0 ⎪ Ac ker mann(m, n) = ⎨ m > 1, n = 0 ⎪m + 2, ⎪⎩ Ac ker mann( Ac ker mann(m − 1, n), n − 1), outros m e n

© FCA – Editora de Informática

323


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.