À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
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
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++)
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
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
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
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
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.
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
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.
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
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);}}
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
Top Related