### INFO B - Caroline Campos Lima, 04
# F.L Session Three: It's always time to restart
[toc]
## Exercício 1
Crie uma classe representando a abstração de função e/ou dados ao lado. Abaixo a especificação das situações a serem resolvidas:
▪ Calcular a área do retângulo baseado em sua altura e base.
▪ Calcular o perímetro do retângulo baseado em sua altura e base.
▪ Verificar se dois retângulos são iguais baseado em suas áreas.
```csharp=
public class Trigonometria
{
public int AreaRetangulo(int altura, int basee)
{
int area = altura * basee;
return area;
}
public int PerimetroRetangulo(int altura, int basee)
{
int perimetro = (altura * 2) + (basee * 2);
return perimetro;
}
public bool RetangulosIguais(int a1, int b1, int a2, int b2)
{
int retangulo1 = AreaRetangulo(b1, a1);
int retangulo2 = AreaRetangulo(b2, a2);
bool iguais = retangulo1 == retangulo2;
return iguais;
}
}
Trigonometria t = new Trigonometria();
int a = t.AreaRetangulo(24, 13);
Console.WriteLine("Área do retângulo: " + a);
int b = t.PerimetroRetangulo(15, 7);
Console.WriteLine("Perímetro do retângulo: " + b);
bool c = t.RetangulosIguais(34, 26, 22, 5);
Console.WriteLine("São retângulos iguais? " + c);
// Área do retângulo: 312
// Perímetro do retângulo: 44
// São retângulos iguais? False
```
## Exercício 2
Crie uma classe representando a abstração de função e/ou dados ao lado. Abaixo a especificação das situações a serem resolvidas:
▪ Calcular a área do retângulo baseado em sua altura e base abstraído em um tipo composto.
▪ Calcular a área do triângulo baseado em sua altura e base abstraído em um tipo composto.
▪ Calcular a área do paralelogramo baseado em sua altura e base abstraído em um tipo composto.
```csharp=
public class Forma
{
public double Base {get;set;}
public double Altura {get;set;}
}
public class Trigonometria
{
public double AreaRetangulo(Forma retangulo)
{
double areaR = retangulo.Base * retangulo.Altura;
return areaR;
}
public double AreaTriangulo(Forma triangulo)
{
double areaT = (triangulo.Base * triangulo.Altura) / 2;
return areaT;
}
public double AreaParalelogramo(Forma paralelogramo)
{
double areaP = paralelogramo.Base * paralelogramo.Altura;
return areaP;
}
}
Trigonometria t = new Trigonometria();
Forma ar = new Forma();
ar.Base = 10;
ar.Altura = 12;
Forma at = new Forma();
at.Base = 5;
at.Altura = 9;
Forma ap = new Forma();
ap.Base = 10;
ap.Altura = 8;
double a = t.AreaRetangulo(ar);
Console.WriteLine("Área do retângulo: " + a);
double b = t.AreaTriangulo(at);
Console.WriteLine("Área do triângulo: " + b);
double c = t.AreaParalelogramo(ap);
Console.WriteLine("Área do paralelogramo: " + c);
// Área do retângulo: 120
// Área do triângulo: 22.5
// Área do paralelogramo: 80
```
## Exercício 3
Crie uma classe representando a abstração de função e/ou dados ao lado. Abaixo a especificação das situações a serem resolvidas:
▪ Retorne o primeiro dia do mês a partir de uma data.
▪ Retorne o último dia do mês a partir de uma data.
▪ Verifique se o mês possui 31 dias a partir de uma data.
▪ Verifique se uma data cai em uma sexta-feira 13
▪ Retorne quantas semanas faltam para chegar no aniversário de uma pessoa a partir de seu nome e data de aniversário abstraído em um tipo composto. O retorno deve seguir o template: “XXXX, faltam XXXX semanas para seu niver.”
▪ Retorne se uma pessoa é de Libra a partir do dia em que nasceu abstraído em um tipo composto.
```csharp=
public class Pessoa
{
public string Nome {get;set;}
public DateTime Niver {get;set;}
}
public class Calendario
{
public DateTime PrimeiroDia(DateTime data)
{
DateTime dia1 = data.AddDays(1 - data.Day);
return dia1;
}
public DateTime UltimoDia(DateTime data)
{
DateTime passo = data.AddMonths(1).AddDays(- data.Day);
return passo;
}
public bool Possui31Dias(DateTime data)
{
bool dia31 = UltimoDia(data).Day == 31;
return dia31;
}
public bool SextaFeira13(DateTime data)
{
bool sexta13 = data.DayOfWeek == DayOfWeek.Friday && data.Day == 13;
return sexta13;
}
public string SemanasParaNiver(Pessoa pessoa)
{
DateTime data1 = DateTime.Now;
DateTime data2 = new DateTime(data1.Year, pessoa.Niver.Month, pessoa.Niver.Day);
TimeSpan data = data2 - data1;
double dia = data.TotalDays/7;
double semana = Math.Round(dia);
string frase = pessoa.Nome + ", faltam " + semana + " semanas para seu niver";
return frase;
}
public bool SouDeLibra(Pessoa pessoa)
{
DateTime passo1 = new DateTime(pessoa.Niver.Year,09,23);
DateTime passo2 = new DateTime(pessoa.Niver.Year,10,22);
return pessoa.Niver >= passo1 && pessoa.Niver <= passo2;
}
}
Calendario cal = new Calendario ();
Pessoa p = new Pessoa ();
p.Nome = "Eduarda de Lima Severo";
p.Niver = new DateTime(2001,08,12);
DateTime a = cal.PrimeiroDia(p.Niver);
Console.WriteLine("Primeiro dia do mês: " + a);
DateTime b = cal.UltimoDia(p.Niver);
Console.WriteLine("Último dia do mês: " + b);
bool c = cal.Possui31Dias(p.Niver);
Console.WriteLine("O mês possui 31 dias? " + c);
bool d = cal.SextaFeira13(p.Niver);
Console.WriteLine("É uma sexta-feira 13? " + d);
string e = cal.SemanasParaNiver(p);
Console.WriteLine(e);
bool f = cal.SouDeLibra(p);
Console.WriteLine("É de Libra? " + f);
// Primeiro dia do mês: 8/1/2001 12:00:00 AM
// Último dia do mês: 8/31/2001 12:00:00 AM
// O mês possui 31 dias? True
// É uma sexta-feira 13? False
// Eduarda de Lima Severo, faltam 13 semanas para seu niver
// É de Libra? False
```
## Exercício 4
Crie uma classe representando a abstração de função e/ou dados ao lado. Abaixo a especificação das situações a serem resolvidas:
▪ Verifique se um cadastro de usuário é válido seguindo as regras: (1) O e-mail deve ter o caractere ‘@’ e possuir no mínimo 2 caracteres antes e depois do ‘@’. (2) A senha precisa ter pelo menos uma vogal, um caractere especial e tamanho de 8 caracteres.
▪ Verifique se um domínio escolhido é válido se terminar em ‘.com.br’ , se o primeiro caractere não for um número e o domínio possuir 5 caracteres no mínimo.
* Deve-se enviar o domínio completo.
ex: meudominio.com.br
```csharp=
public class RegistroBRValidator
{
public bool ValidarCadastro (string email, string senha)
{
bool v1 = email.Contains("@");
bool v2 = email.Contains("@") && email.Substring(0, email.IndexOf("@")).Length >= 2 && email.Substring(email.IndexOf("@")).Length >= 2;
bool v3 = senha.Contains("a") || senha.Contains("e") || senha.Contains("i") || senha.Contains("o") || senha.Contains("u");
bool v4 = senha.Contains("!") || senha.Contains("@") || senha.Contains("#") || senha.Contains("$") || senha.Contains("%") || senha.Contains("&") || senha.Contains("*") || senha.Contains("-") || senha.Contains("_") || senha.Contains("/");
bool v5 = senha.Length >= 8;
return v1 && v2 && v3 && v4 && v5;
}
public bool ValidarDominio (string dominio)
{
bool v1 = dominio.EndsWith(".com.br");
bool v2 = dominio[0] != '0' && dominio[0] != '1' && dominio[0] != '2' && dominio[0] != '3' && dominio[0] != '4' && dominio[0] != '5' && dominio[0] != '6' && dominio[0] != '7' && dominio[0] != '8' && dominio[0] != '9';
bool v3 = dominio.Substring(0, dominio.IndexOf(".com.br")).Length >= 5;
return v1 && v2 && v3;
}
}
RegistroBRValidator registroBR = new RegistroBRValidator();
bool a = registroBR.ValidarCadastro("carol@gmail.com", "23_lindinha");
Console.WriteLine("O cadastro foi aprovado? " + a);
// O cadastro foi aprovado? True
```
## Exercícioo 5
Crie uma classe representando a abstração de função e/ou dados ao lado. Abaixo a especificação das situações a serem resolvidas:
▪ Calcular a área do retângulo.
▪ Calcular o volume do cilindro.
▪ Verificar se dois retângulos são iguais baseado em sua área. Utilize a ideia de função composta.
▪ Verificar se é possível transferir o conteúdo do primeiro cilindro ao segundo. Utilize a ideia de função composta.
```csharp=
public class Retangulo
{
public double Base {get;set;}
public double Altura {get;set;}
}
public class Cilindro
{
public double Raio {get;set;}
public double Altura {get;set;}
}
public class Trigonometria
{
public double AreaRetangulo(Retangulo ret)
{
double area = ret.Altura * ret.Base;
return area;
}
public double VolumeCilindro(Cilindro cilindro)
{
double volume = Math.Round(Math.PI * Math.Pow(cilindro.Raio, 2) * cilindro.Altura, 2);
return volume;
}
public bool AreasIguais(Retangulo ret1, Retangulo ret2)
{
double retangulo1 = AreaRetangulo(ret1);
double retangulo2 = AreaRetangulo(ret2);
bool iguais = retangulo1 == retangulo2;
return iguais;
}
public bool TransferenciaPossivel(Cilindro ci1, Cilindro ci2)
{
double cilindro1 = VolumeCilindro(ci1);
double cilindro2 = VolumeCilindro(ci2);
bool possivel = cilindro1 <= cilindro2;
return possivel;
}
}
Retangulo r = new Retangulo();
r.Altura = 4;
r.Base = 7;
Cilindro ci = new Cilindro();
ci.Raio = 4;
ci.Altura = 6;
Retangulo r1 = new Retangulo();
r1.Base = 9;
r1.Altura = 2;
Retangulo r2 = new Retangulo();
r2.Base = 6;
r2.Altura = 3;
Cilindro ci1 = new Cilindro();
ci1.Raio = 12;
ci1.Altura = 8;
Cilindro ci2 = new Cilindro();
ci2.Raio = 15;
ci2.Altura = 20;
Trigonometria t = new Trigonometria();
double a = t.AreaRetangulo(r);
Console.WriteLine("Área do retângulo: " + a);
double b = t.VolumeCilindro(ci);
Console.WriteLine("Volume do cilindro: " + b);
bool c = t.AreasIguais(r1, r2);
Console.WriteLine("São retângulos iguais? " + c);
bool d = t.TransferenciaPossivel(ci1, ci2);
Console.WriteLine("É possível fazer a transferência? " + d);
// Área do retângulo: 28
// Volume do cilindro: 301.59
// São retângulos iguais? True
// É possível fazer a transferência? True
```
## Exercício 6
Crie uma classe representando a abstração de função e/ou dados ao lado. Abaixo a especificação das situações a serem resolvidas:
▪ Calcular o total de uma compra em um brechó a partir das compras masculinas, femininas e infantis. Nesse brechó, todas as roupas de uma categoria possui o mesmo preço, conforme listagem abaixo:
- Masculina = R$ 30,00
- Feminina = R$ 40,00
- Infantil = R$ 20,00
- Calçados = R$ 35,00
* Os calçados são cobrados independente do gênero.
* Utilize ideia de função composta.
* Utilize a ideia de tipos compostos.
* As funções auxiliares devem ser marcadas como private.
```csharp=
public class Compra
{
public int QtdCalca {get;set;}
public int QtdCamiseta {get;set;}
public int QtdBlusa {get;set;}
public int QtdCalcados {get;set;}
}
public class Brecho
{
public double CalcularTotal(Compra masculino, Compra feminino, Compra infantil)
{
return TotalMasculino(masculino) + TotalFeminino(feminino) + TotalInfantil(infantil) + TotalCalcados(masculino.QtdCalcados, feminino.QtdCalcados, infantil.QtdCalcados);
}
private double TotalMasculino(Compra compra)
{
double totalM = (compra.QtdCalca + compra.QtdCamiseta + compra.QtdBlusa) * 30.00;
return totalM;
}
private double TotalFeminino(Compra compra)
{
double totalF = (compra.QtdCalca + compra.QtdCamiseta + compra.QtdBlusa) * 40.00;
return totalF;
}
private double TotalInfantil(Compra compra)
{
double totalI = (compra.QtdCalca + compra.QtdCamiseta + compra.QtdBlusa) * 20.00;
return totalI;
}
private double TotalCalcados(int qtdCalcadoMasculino, int qtdCalcadoFeminino, int qtdCalcadoInfantil)
{
double totalC = (qtdCalcadoMasculino + qtdCalcadoFeminino + qtdCalcadoInfantil) * 35.00;
return totalC;
}
}
Compra cm = new Compra();
cm.QtdCalca = 2;
cm.QtdCamiseta = 4;
cm.QtdBlusa = 1;
cm.QtdCalcados = 0;
Compra cf = new Compra();
cf.QtdCalca = 1;
cf.QtdCamiseta = 1;
cf.QtdBlusa = 3;
cf.QtdCalcados = 1;
Compra ci = new Compra();
ci.QtdCalca = 2;
ci.QtdCamiseta = 2;
ci.QtdBlusa = 1;
ci.QtdCalcados = 0;
Brecho b = new Brecho();
double a = b.CalcularTotal(cm, cf, ci);
Console.WriteLine("Total da compra: " + a);
// Total da compra: 545
```
## Exercício 7
Crie uma classe representando a abstração de função e/ou dados ao lado. Abaixo a especificação das situações a serem resolvidas:
▪ Calcular o total de uma compra em uma loja de móveis
seguindo as seguintes regras de negócio:
(1) O cupom é um valor representando a porcentagem de
desconto a ser aplicado no valor da compra antes de aplicar
os juros, frete e garantia.
(2) Cada ano de garantia é adicionado 15% do valor da
compra.
(3) A cada 10km de distância é cobrado o valor de R$ 3,00
(4) Deve ser aplicado o juros compostos de 3% ao mês no
valor da compra com o desconto, garantia e frete aplicados.
(5) A nota fiscal é a hora atual no formato YYYYMMDDHHmm
com o prefixo NF. Ex: NF202105091918
* Utilize ideia de função composta.
* Utilize a ideia de tipos compostos.
* As funções auxiliares devem ser marcadas como private.
```csharp=
public class Pedido
{
public double Valor {get;set;}
public int AnosGarantia {get;set;}
public int DistanciaEntregaKm {get;set;}
public int Parcelas {get;set;}
}
public class Nota
{
public double ValorFinal {get;set;}
public string NotaFiscal {get;set;}
}
public class LojaMoveis
{
public Nota CalcularCompra (Pedido pedido, double cupom)
{
double valorCompra = ValorJuros(pedido.Valor - ValorDesconto(pedido.Valor, cupom) + ValorGarantia(pedido.Valor, pedido.AnosGarantia) + ValorFrete(pedido.DistanciaEntregaKm), pedido.Parcelas);
valorCompra = Math.Round(valorCompra, 2);
Nota nf = new Nota();
nf.ValorFinal = valorCompra;
nf.NotaFiscal = "NF" + DateTime.Now.ToString("yyyyMMddHHmmss");
return nf;
}
private double ValorDesconto(double valorCompra, double cupom)
{
double desconto = valorCompra * (cupom / 100);
return desconto;
}
private double ValorGarantia(double valorCompra, int anos)
{
double garantia = valorCompra * (15.0 / 100.0) * anos;
return garantia;
}
private double ValorFrete(int distancia)
{
double frete = distancia / 10 * 3;
return frete;
}
private double ValorJuros(double valor, int parcelas)
{
double juros = valor * Math.Pow(1 + 0.03, parcelas);
return juros;
}
}
LojaMoveis lm = new LojaMoveis();
Pedido p = new Pedido();
p.Valor = 5649;
p.AnosGarantia = 3;
p.DistanciaEntregaKm = 70;
p.Parcelas = 10;
double cupom = 20;
Nota a = lm.CalcularCompra(p,cupom);
Console.WriteLine("Valor da compra: " + a.ValorFinal);
Console.WriteLine("Nota fiscal: " + a.NotaFiscal);
// Valor da compra: 9517.95
// Nota fiscal: NF20210514171236
```