30 novembro 2005

EXERCÍCIO PROPOSTO (2)

Criar uma aplicação semelhante à que aqui se apresenta e que ofereça 4 botões com os objectivos que de seguida se descrevem.
BOTÃO CRIAR: permite criar até 10 botões de rádio ou caixas de texto. Os objectos criados são colocados no grupo "Objectos Criados", em colunas e linhas separadas, conforme a figura ilustra. Nomes e Textos desses objectos são formados de forma igual como a figura também demonstra. Depois de serem criados 10 objectos, o botão CRIAR é desactivado.
CONTAR BOTÕES: O grupo "Objectos Criados" contém vários objectos, alguns são botões de rádios e outros são caixas de texto. Este botão informa sobre o nº de botões de rádio existentes no grupo "Objectos Criados" .
CONTAR CAIXAS: O grupo "Objectos Criados" contém vários objectos, alguns são botões de rádios e outros são caixas de texto. Este botão informa sobre o nº de caixas de texto existentes no grupo "Objectos Criados" .
LISTAGEM: lista os nomes dos botões de rádio e das caixas de texto existentes no grupo "Objectos Criados", num formato semelhante ao da imagem.

28 novembro 2005

Aula de 28-29/Nov/2005, 2ª-3ªFeira

Na aula de hoje vamos abordar alguns conceitos de balística: como disparar um canhão?

Depois da luminosa explosão, a bala sairá disparada em direcção a um alvo que a escuridão da noite não permite observar.

Não perca em breve, numa sala perto de si!

26 novembro 2005

EXERCÍCIO PROPOSTO (1)


OBJECTIVO:
Aplicar a técnica da criação de objectos, numa form, em tempo de execução e com resposta a eventos.


ENUNCIADO:
Pretende-se uma aplicação VB.Net, em modo Windows, que:
a) Crie 2 caixas de texto (sem texto e de nomes Caixa1 e Caixa2) e um botão (de nome Botão 1 e texto Copia);
b) Esses objectos têm todos altura 20 e estão centrados, na Form, em altura e em largura. Além disso: Caixa1 deve ter uma largura que depende da largura da Form, deixando sempre uma margem de 50 unidades à esqª e à dirª: Caixa2 tem uma largura 50; Botão1 tem uma largura 50;
c) As Caixas reagem ao Click escrevendo na própria caixa o nome do controlo (p. ex., a Caixa1 escreve "Caixa1" dentro da caixa). Note que, depois do click, podemos continuar a escrever na caixa...
d) O Botão1 reage ao Click transferindo o texto da Caixa1 para o texto da Caixa2.

O QUE INVESTIGAR:
Para resolver este exercício, terá de investigar, entre outras coisas:
a) Sobre Forms: ClientSize.Width ClientSize.Height;
b) Resposta a eventos: significado do parâmetro Sender (que está, por exº, na Sub queresponde a um Click).

22 novembro 2005

EXERCÍCIO PARA RESOLVER (1)

Este exercício foi distribuído, por mail, no dia 21/10/2005 - 2ª feira.

Pretende-se que os alunos o resolvam individualmente e que enviem, para aqui, as suas soluções.

As respostas devem estar devidamente identificadas (nome, nº e turma).

Data de entrega: até 26 Nov (sábado).

21 novembro 2005

Aula de 21-22/Nov/2005, 2ª-3ªFeira



Enunciado

1) Considere uma Sub Main() assim constituída:
----- LeNumeroNegativo()
----- LeNumeroPositivo()
----- LeNumeroNumIntervalo(3, 12)

2) Todas estas funções invocam a seguinte função :
----- Function LeNumero(ByVal Frase As String) As Integer
----- cuja missão é TENTAR ler, do teclado, um nº inteiro válido.
----- Para tal:
---------- imprime a Frase no ecrã e depois
---------- lê, do teclado, um valor que tenta converter para inteiro.
----- Esse nº inteiro será então o resultado da função ...
---------- ... mas só se for válido.
----- Pois todo este processo está suportado num Handler de erros:
---------- se algo correr mal, deve-se:
--------------- escrever: "Não introduziu um número inteiro." e,
--------------- sinalizar o erro ao chamador da função LeNumero.

Function LeNumeroNegativo() As Integer
Só se abandona esta função depois de se conseguir ler um negativo.
Esta função invoca a função LeNumero com uma mensagem adequada.
Atenção: LeNumero pode ter gerado um nº válido ou não... S
e o nº válido lido não for negativo, deve ser produzido e tratado um erro que faça aparecer a seguinte mensagem: "O nº não é negativo".

Function LeNumeroPositivo()
Semelhante à anterior, com as adaptações necessárias.

Function LeNumeroPositivo()
Semelhante à anterior, com as adaptações necessárias.

16 novembro 2005

Aula de 14-15/Nov/2005, 2ª-3ªFeira - ON GOTO (Demonstração)

Module Module1
#Region "Caso 1"
Sub Mensagem(ByVal ParamArray S() As String)
Dim Frase As String
If S.Length = 0 Then
Err.Raise(1000, , "Mensagem sem texto")
Else
'MsgBox(S.GetLength(0))
For I As Integer = 0 To S.GetLength(0) - 1
Frase = Frase & S(I)
Next
End If
Console.WriteLine(Frase) ' Porque é que esta instrução fica fora do IF?

Exit Sub ' Para que serve esta instrução?
Handler_Msg:
Select Case Err.Number ' Veja como é possível centralizar o tratamento de erros
Case 1000
Console.WriteLine("Aconteceu um erro:")
Frase = "Causa do erro: " & Err.Description
End Select
Resume Next
End Sub

Sub Caso1()
' CASO 1
Mensagem("========== ", "Caso 1A", " ==========")
Console.ReadLine()
Mensagem("========== Caso 1B ==========")
Mensagem()
' Conclusão:
' Mensagem não não dispõe de Suporte Contra erros (Error Handler)
' pelo que não resiste ao RunTime Error
End Sub
#End Region

#Region "Caso 2"
Sub Msg(ByVal ParamArray S() As String)
Dim Frase As String
On Error GoTo Handler_Mensagem ' Criar o Handler de Erros
If S.Length = 0 Then
Err.Raise(1000, , "Mensagem sem texto")
ElseIf S.Length > 3 Then
Err.Raise(1001, , "Excesso de argumentos")
Else
For I As Integer = 0 To S.GetLength(0) - 1
Frase = Frase & S(I)
Next
End If
Console.WriteLine(Frase)

Exit Sub
Handler_Mensagem:
Select Case Err.Number ' Veja como é possível centralizar o tratamento de erros
Case 1000, 1001
Console.WriteLine("Aconteceu um erro:")
Frase = "Causa do erro: " & Err.Description
' Case 1002 ...
' Case 1003 ...
End Select
Resume Next ' Poderia ser só "Resume" ?
End Sub

Sub Caso2()
' CASO 2
Msg("========== ", "Caso 2A", " ==========")
Msg()
Console.ReadLine()
'Msg("========== Caso 1B ==========")
'Msg()
' Conclusão:
' Msg não não dispõe de Suporte Contra erros (Error Handler)
' pelo que não sesiste ao RunTime Error
End Sub
#End Region

#Region "Caso 3"
Sub Caso3(ByVal X As Integer, ByVal Y As Integer)
On Error GoTo Handler_Caso3
Console.WriteLine(X \ Y)
Console.ReadLine()

Exit Sub
Handler_Caso3:
Console.WriteLine("Y igual a zero")
Resume Next ' Poderia ser só "Resume" ?
End Sub
#End Region

#Region "Caso 4"
Sub Caso4(ByVal X As Integer, ByVal Y As Integer)
On Error GoTo Handler_Caso4A ' 1º Handler
Console.WriteLine(X \ Y)
' Tirar o comentário à próxima linha. O que acontece? Porquê?
On Error GoTo 0
'Console.WriteLine(X \ Y)
Console.ReadLine()

Exit Sub
Handler_Caso4A:
Console.WriteLine("Y igual a zero")
Resume Next ' Poderia ser só "Resume" ?

End Sub
#End Region

#Region "Caso 5"
Sub Caso5(ByVal X As Integer, ByVal Y As Integer)
On Error GoTo Handler_Caso5A ' 1º Handler
Console.WriteLine(X \ Y)
On Error GoTo Handler_Caso5B ' 2º Handler
Console.WriteLine(Y \ X)
'''' Se se retirar o comentário da próxima linha,
'''' desactiva-se o Handler_Caso5B mas não se activa o Handler_Caso5A :
'''' não ficará nenhum activo !

'On Error GoTo 0
'Console.WriteLine(X \ Y)

Console.ReadLine()
Exit Sub
Handler_Caso5A:
Console.WriteLine("Y igual a zero")
Resume Next ' Poderia ser só "Resume" ?
Handler_Caso5B:
Console.WriteLine("X igual a zero")
Resume Next ' Poderia ser só "Resume" ?
End Sub
#End Region

#Region "Caso 6"
Sub Sub6A(ByVal X As Integer, ByVal Y As Integer)
Console.WriteLine(X \ Y)
End Sub
Sub Sub6B(ByVal X As Integer)
Console.WriteLine(X * X)
End Sub
Sub Sub6C(ByVal X As Integer)
On Error Resume Next ' Em vez de GOTO HANDLER_Sub6C...
Console.WriteLine(X * X)
Console.WriteLine("Deu erro!!!")
End Sub

Sub Caso6()
Dim X As Integer = 100000
Dim Y As Integer = 0
On Error GoTo Handler_Caso6
Sub6A(X, Y)
Sub6B(X)
Sub6C(X)

Exit Sub
Handler_Caso6:
Console.WriteLine("Erro matemático")
Resume Next
End Sub
#End Region
Sub Main()
'Caso1()
'Caso2()
'Caso3(5, 0)
'Caso4(5, 0)
'Caso5(5, 0) : Caso5(0, 5)
Caso6()
Console.ReadLine()
End Sub

End Module

07 novembro 2005

Aula de 7-8/Nov/2005, 2ª-3ªFeira

Pretende-se fazer a gestão das classificações obtidas por vários alunos, do 3º ciclo, nos vários testes das várias disciplinas que compõem o seu plano de estudos. Para isso:

1) Solicite ao utilizador que indique o nº de alunos, de disciplinas e de frequências a considerar;
2) Faça a recolha de todas as notas. Estas são dadas em valores inteiros numa escala de 0 a 20. A leitura das notas poderá ser feita de uma de duas maneiras: por alunos+disciplinas+testes ou por disciplinas+testes+alunos (nota: o último termo é o que varia mais depressa);
3) Defina uma função que receba duas notas e que devolva a mais baixa;
4) Defina uma função que receba duas notas e que devolva a maior;
5) Calcule e indique qual o aluno+disciplina+teste que teve a maior nota (se houver vários com a mesma nota, indique o primeiro deles);
6) Calcule e indique qual o aluno+disciplina+teste que teve a pior nota (se houver vários com a mesma nota, indique o último deles);
7) Defina uma operação para alterar a nota de um aluno no teste de uma disciplina indicados pelo utilizador;
8) Defina uma operação para bonificar em 20% todas as notas do teste e da disciplina indicados pelo utilizador;
9) Conceba um menu que esteja sempre presente no ecrã e que disponibilize as operações previstas nos pontos 5 a 8.

06 novembro 2005

Aula de 3/Nov/2005, 5ªFeira

Enunciado:

Codifique uma aplicação, em modo consola, que cumpra os seguintes requisitos:
1.1. Defina o tipo enumerado umaOperação, que represente as quatro operações aritméticas: soma, subtracção, multiplicação e divisão;
1.2. Implemente a Sub Separador, que imprima no ecrã uma linha separadora formada por todas as strings que a Sub receber como argumentos;
1.3. Na Sub Main(), teste a Sub Separador invocando: Separador("==========", " Exercício ", "==========")
2.1 Na Sub Main(), leia um nº inteiro T, do intervalo [1,10];
2.2 Implemente a função Sub Tabuada, que receba um parâmetro, opcional, e que imprima a tabuada desse parâmetro (se ele não for dado, assume-se o valor 1);
2.3. Na Sub Main(), teste a Sub Tabuada invocando, Tabuada(T) e depois Tabuada();
3.1 Implemente a função Operação, que recebe dois operandos inteiros e uma operação, e que retorna o resultado dessa operação (em valor absoluto, ou não, conforme o valor de um outro parâmetro, opcional, falso por defeito);
3.2 Altere a função anterior, de modo a que ela imprima uma string com a operação a realizar (p. ex, “3 \ 2”);
3.3 Teste, na Sub Main(), a função Operação com as seguintes instruções:
Console.WriteLine(Operação(4, umaOperação.Subtracção, 5))
Console.WriteLine(Operação(5, umaOperação.Subtracção, 4))
Console.WriteLine(Operação(4, umaOperação.Subtracção, 5, True))
Console.WriteLine(Operação(4, umaOperação.Subtracção, 5, False))
Console.WriteLine(Operação(4, umaOperação.Multiplicação, -5))
Console.WriteLine(Operação(-5, umaOperação.Multiplicação, 4))
Console.WriteLine(Operação(4, umaOperação.Multiplicação, -5, True))
Console.WriteLine(Operação(4, umaOperação.Multiplicação, -5, False))
4.1. Crie uma nova (outra) versão da função Operação, que receba só um operando e uma operação, e que depois retorne:
- como resultado da função, o valor absoluto do resultado da operação indicada envolvendo duas vezes o mesmo operando;
- como novo valor do operando, o resultado achado mas sem valor absoluto;
4.2. Teste, na Sub Main, essa nova versão da função Operação, com 4 operações sobre um mesmo operando;
5.1. Implemente a função FazTodasAsOperações, que recebe dois parâmetros inteiros e retorna um vector com 4 inteiros (cada um deles é o resultado de uma das operações possíveis);
5.2. Na Sub Main(), teste essa função, invocando FazTodasAsOperações(3, -4) e depois imprimindo todos os elementos do vector resultante.

Aula de 20/OUT/2005, 5ªFeira

Enunciado:

A) Definir uma matriz A 3x3;
B) pedir, por coluna, os seus valores (que devem ser não negativos), indicando as coordenadas de cada elemento lido;
C) definir uma matriz B 3x3;
D) pedir, por linha, os seus valores (que devem ser não positivos), indicando as coordenadas de cada elemento lido;
E) definir uma matriz S 3x3;
F) calcular, em S, a matriz soma A+B;
G) informar se a matriz S corresponde a uma matriz nula;
H) informar se a matriz S corresponde à matriz identidade;
I) definir uma matriz T 3x3;
J) calcular, em T, a transposta de A;
K) Informar se a matriz B é simétrica;
L) Calcular AxB.

Aula de 17/OUT/2005, 2ªFeira

Objectivos: ganhar competências no uso dos vários tipos de ciclo, sabendo eleger o melhor ciclo para resolver um problema concreto e conceber uma solução com base nesse ciclo.

Enunciado: Pretende-se uma aplicação, em modo consola, que:
a) Declare o tipo enumerado TipoDeCiclo, com os valores cFor, cWhile, cRepeat e cEach;
b) Declare uma variável global, a matriz M, com os seguinte valores por linha: 11, 12, 13; 21, 22, 23; 31, 32, 33;
c) Declare e implemente a Sub ImprimirMatriz(ByVal Tipo As TipoDeCiclo), que imprime no ecrã a matriz M, usando para o efeito um destes ciclos: For, While e Until;
d) Na Sub Main() use a Sub ImprimirMatriz para imprimir a matriz. Está correcta?
e) De seguida, use esta instrução: ReDim Preserve M(2, 4). Execute o programa: que aconteceu? porquê?
f) Redimensione a matriz M para 3 linhas e 5 colunas, preservando os seus valores;
g) Preencha os novos valores de forma semelhante ao dos valores existentes. Imprima a matriz: está correcta?
h) Declare e implemente a Sub MostraElementosDaColuna3(ByVal Tipo As TipoDeCiclo), que imprime no ecrã os elemento da coluna 3 da matriz M, usando para o efeito um destes ciclos: For, While e Until;
i) Declare e implemente a Sub SomarElementosDoArray(ByVal Tipo As TipoDeCiclo), que imprima no ecrã o valor da soma de todos os elementos da matriz M, usando para o efeito um destes ciclos: For e For Each. Use na Sub Main() chamadas a essa Sub;
j) Declare e implemente a Function MaximoDaLinha(ByVal Tipo As TipoDeCiclo). Use na Sub Main() chamadas a essa Function;
k) Declare e implemente uma função que calcule o valor máximo dos elementos de M com base na função MaximoDaLinh. Use na Sub Main() chamadas a essa Function;
l) Declare e implemente uma função que calcule o valor médio dos elementos de M, usando para o efeito um destes ciclos: For, While, Until e For Each; Use na Sub Main() chamadas a essa Function;
m) Declare e implemente uma função que calcule o valor do desvio padrão dos elementos de M, usando para o efeito um destes ciclos: For, While, Until e For Each; Use na Sub Main() chamadas a essa Function;

Aula de 13/OUT/2005, 5ª Feira

OBJECTIVOS: Ganhar competências no uso das várias formas de tomar decisões, em código VB.Net, experimentando o uso de tipos enumerados de dados.

ENUNCIADO: Pretende-se criar uma aplicação, em modo Consola, que defina o tipo enumerado MARCA de carros, para representar carros das seguintes marcas: BMW, Citroen, Fiat e Honda.A aplicação deverá recolher um código (digito) fornecido pelo utilizador e escrever no ecrã a marca correspondente:
1 --> "BMW" ; 2 --> "Citroen"; 3 --> "Fiat"; 4 --> "Honda"; Em qualquer outro caso --> "Resposta incorrecta"
Resolva o problema das seguinte 7 maneiras diferentes:

a) Sem usar variáveis do tipo MARCA e usando decisões apenas do género IF...THEN...ELSE....;
b) Usando variáveis do tipo MARCA e decisões apenas do género IF...THEN...ELSE....;
c) Usando variáveis do tipo MARCA e decisões apenas do género IF...THEN...ELSEIF ...ELSE....;
d) Usando variáveis do tipo MARCA e decisões apenas do género SELECT CASE...;
e) Usando variáveis do tipo MARCA e decisões apenas do género IIF;
f) Usando variáveis do tipo MARCA e decisões apenas do género CHOOSE e IIF;
g) Usando variáveis do tipo MARCA e decisões apenas do género SWITCH e IIF;