práticas c# algoritmia e programação estruturada

14

Upload: grupo-lidel

Post on 25-Jul-2016

342 views

Category:

Documents


39 download

DESCRIPTION

Esta obra, Práticas de C#: Algoritmia e Programação Estruturada, tem por objectivo promover o estudo da linguagem de programação C# da Microsoft através da resolução algorítmica de diversos problemas, que demonstram os princípios e as regras da Programação Estruturada. O livro é dedicado à Programação Estruturada, que é o primeiro paradigma formal de programação sobre o qual assentam todos os outros. Os problemas de dificuldade crescente apresentam-se classificados segundo os tópicos das disciplinas de Introdução à Programação e Programação I de diversos cursos de licenciatura e de mestrado. A resolução de cada problema baseia-se na metodologia Top-down e consiste na elaboração de um algoritmo apropriado, na sua codificação em C# e na sua verificação através da execução de jogos de teste.

TRANSCRIPT

Page 1: Práticas C# Algoritmia e Programação Estruturada
Page 2: Práticas C# Algoritmia e Programação Estruturada

ÀpeCsodsu

Ovred

Aqtep

Eedrev

À semelhançprovoca na levar as cap

C# é a mais obre a plata

de aplicaçõeustente a ut

O C#, que pevez mais simeutilizáveis

desafios hist

• A objpor proginteprim

• O bus-se quequecom

A estes desaque facilitamempo de c

programação

Esta obra, Pstudo da li

diversos proegras da pro

versão Expr

ça da alteraaltura de dpacidades drecente lin

aforma .Netes Web a tilização de

ersegue o omples de uti, integráveitóricos impo

consolidaçectos (POOexemplo, o

gramação eeiramente ormeiras lingu

desenvolvimsiness) – A

à Gestão, estões técnice a programmponentes d

afios procurm a constitucompilação o orientada

Práticas de inguagem d

oblemas espogramação ress do C#

ação ascenddeterminadadas linguagenguagem det Frameworcaminho dsoftware a p

objectivo deilizar, fáceisis, constituíortantes:

ção do paO) – A expo Java e o Cestruturada,rientada poruagens dedi

mento da filosofia deprincipalm

cas de utilizmação procdesenvolvid

rou o C# reuição de bib

e de execpor compon

C#: Algoride programpecialmente estruturada2010.

dente de meia nota, tambens de prog

e programaçrk, pretendede um novpedido.

contribuir s de compreíveis em we

aradigma periência deC++, enrique, e permitir objectos qcadas a este

filosofia de on-deman

mente, a parzação de fecura respon

das em ambi

esponder ofebliotecas de cução, segunentes (POC

itmia e Promação C# a

concebidosa. Os exercí

© FCA

io tom que,bém, em Prgramação orção da Micre ser um mvo paradigm

para a conceender, flexeb services,

de prograe programaçeceu e agiliziu modelizaque ultrapase paradigma

de negóciond business,rtir da era erramentas dnder, promientes diver

ferecendo prcomponent

undo os paC).

ogramação através da rs para demoícios foram

P

– Editora de In

, em Músicrogramaçãorientadas porosoft que, arco no des

ma de prog

cepção de prxíveis, robus, etc., bene

amação orção em lingzou a POO ar uma nossasse as dia de program

o a pedido, que tem vda Web, t

de tratamenmovendo a

sos.

rimitivas detes e a sua

aradigmas d

Estruturadresolução aonstrar os p

m resolvidos

Prefáci

formática V

a, o carácteo, o # aspiror objectosexecutandosenvolvimengramação q

rogramas castos, portáte

eficiou de d

rientada pguagens come a subjaceva linguagficuldades dmação;

o (on-demavindo a imptem levantanto de dadointegração

e programaçintegração

de POO e

da, promovealgorítmica princípios es com base

io

VII

er # a a . O

o-se nto que

ada eis,

dois

por mo, ente gem das

and por- ado os a

de

ção em de

e o de

e as na

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

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

© FCA – Editora de Informática 102

{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

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

Estruturas Repetitivas

© FCA – Editora de Informática 103

CONSTANTE E VARIÁVEIS

Constante Tipo Valor Significado

C Char X Carácter do interior do triângulo

Variável Tipo Significado

A int Altura dos triângulosCaract int Contador de caracteresLinha int Contador de linhas T int Contador de triângulosTrian string Figura com a sequência de triângulos Triangulos int 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++)

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

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

© FCA – Editora de Informática 104

Trian += C; Trian += "\t";}

Trian+="\n";} Console.WriteLine(Trian);

}}}

EXECUÇÃO

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

? EXERCÍCIO 16: ÁRVORE

Elabore um programa que imprima a seguinte árvore:

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

TOP-DOWN

1. Ler o número de linhas árvore 2. Determinar a coluna do ecrã onde será impresso o topo da árvore 3. Inicializar o primeiro ímpar 4. 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 Tipo Valor Significado

C Char * Carácter da árvoreEspaco Char Espaço

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

Vectores e Matrizes

© FCA – Editora de Informática 213

{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 1 1 3 2 0 7 0 6

? EXERCÍCIO 32: MULTIPLICAÇÃO DE MATRIZES

Elabore um programa que multiplique duas matrizes de número inteiros. Por exemplo:

⎥⎦

⎤⎢⎣

⎡=

⎥⎥⎥

⎢⎢⎢

⎥⎦

⎤⎢⎣

⎡610

1314

332201

204321

x

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 Tipo Significado

A int[,] Matriz multiplicanda B int[,] Matriz multiplicadora

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

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

© FCA – Editora de Informática 214

Variável Tipo Significado

C int[,] Matriz produto I int Índice-linha da matriz multiplicanda e da matriz produto J int Índice-coluna da matriz multiplicanda e índice-linha da

matriz multiplicadoraK int Índice-coluna da matriz multiplicadora e índice-coluna

da matriz produtoM1 int Número de colunas da matriz multiplicanda M2 int Número de colunas da matriz multiplicadora N1 int Número de linhas da matriz multiplicandaN2 int Número de linhas da matriz multiplicadora Total int 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

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

Vectores e Matrizes

© FCA – Editora de Informática 215

{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 13 10 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:

⎥⎥⎥

⎢⎢⎢

210413321

1. Duplicar as duas primeiras colunas:

⎥⎥⎥

⎢⎢⎢

102101341321321

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

77 Erros, Validações e Correcções

© FCA – Editora de Informática 225

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.

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

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

© FCA – Editora de Informática 254

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 Tipo Significado

Nome string Nome que o utilizador digitar Conta int 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

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

Procedimentos e Funções

© FCA – Editora de Informática 255

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.

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

Recorrência

© FCA – Editora de Informática 321

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

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

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

© FCA – Editora de Informática 322

RESULTADO E PARÂMETROS

Resultado Tipo Significado

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

Parâmetro Tipo Significado

A int[] Vector de inteirosInferior int Índice mais baixo do intervalo a pesquisar Superior int Índice mais alto do intervalo a pesquisar X int 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);}}

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

Recorrência

© FCA – Editora de Informática 323

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:

⎪⎪⎩

⎪⎪⎨

−−=>+==

=

=

nemoutrosnnmmannAcmannAcnmmnm

m

nmmannAc

),1),,1(ker(ker0,1,20,1,2

0,1

),(ker