Exercicio C#

Tizaua

Membro
Boas!

Estou neste momento a aprender POO porém perdi o módulo das bases e ando a "safar me" pela internet a aprender cada vez mais.
Mas deparei me com um exercicio que me está a "baralhar" por não perceber ainda muito bem as bases.
O exercicio é:

Criar uma classe Retangulo com:
Dados privados(comprimento e largura) propriedades dos dados(get e set), métodos (calcular a area e outro para calcular o perimetro e construtores para inciar uma nova instancia sem parametros e outro para iniciar uma nova instancia mas com paramentros...

Alguém me faz isto para eu tentar perceber como funcionam os metodos, construtores, dados privados etc...? Agradecia, obrigado

O que eu fiz até agora:

namespace WindowsFormsApp2
{
class Retangulo
{
private double comprimento;
private double largura;

//Comprimento
private void setComprimento(double compri)
{
this.comprimento = compri;
}
private double getComprimento()
{
return comprimento;
}

//Largura
private void setLargura(double larg)
{
this.largura = larg;
}
private double getLargura()
{
return largura;
}

//AreaR
public double areaR(double area)
{
area = comprimento * largura;
return area;
}
//perimetroR
public double perimetroR(double perimetro)
{
perimetro = 2 * (comprimento + largura);
return perimetro;
}
}
 
Última edição:
Parece me correcto. Talvez faltem uns this. Mas penso que não é por aí.

Alguma razão para achares que não está bem?
 
Por acaso não tomei isso em consideração. E realmente não estão aí.

Mas será algo do género.

public Rectângulo(int c, int l)
{
this. comprimento = c;
...
}

Mas sem return.

Instancias como :

Rectângulo r = new Rectângulo(20,20)

Acho que já dá para teres uma ideia.
 
O contrutor é o metodo que inicializa a classe.
É o metodo que é chamado quando instancias uma classe.

Se nao criares um construtor o C# cria um sem argumentos que inicializa tudo por default.
Podes criar mais que um construtor, desde que os argumentos sejam diferentes.
Tem sempre o mesmo nome que a classe em si.
Nao tem tipo de retorno (é implicito que "retorna" uma instancia da classe em que está definido)

Assim por alto é isto.
 
perdi o módulo das bases e ando a "safar me"

Não me leves mal @Tizaua mas o que tens que fazer antes de resolver este exercício é "investires" cerca de 2 ou 3 horas para perceber como se define um objecto. E depois um pouco mais para entender como se declara esse objecto. Esses são mesmo as bases... o 101 de POO. Se não entenderes isso, vais perder o barco.

uma pesquisa rápida que fiz sobre OOP (ou POO):
https://dev.to/lefebvre/oop-101-understanding-classes-343p

Não descuides a teoria... Vi muita gente no 5 semestre de Eng Inf. a tremer quando o prof pergunta coisas básicas de OOP (que se aprende no 2 semestre). Não queiras ser um deles.
 
A mim também me parece tudo correto, faltando só os construtores que foram entretanto colcados depois nuns posts mais à frente.

Só tenho uma nota a deixar: os this. não são obrigatórios desde que não hajam confusões com os nomes das variáveis. Eu raramente uso this. No entanto são boa prática e não têm nenhuma contra indicação no seu uso.

Se perdeste as aulas das bases não deixes perder o barco. Há centenas de sites acerca do assunto e vídeos pelo youtube com tutoriais de C#, usa e abusa dessas ferramentas. Qualquer dúvida podes sempre vir aqui perguntar.

Eu programo C# profissionalmente, se tiveres alguma dúvida coloca por aqui e se eu nem ninguém responder envia-me uma PM a visar-me que venho cá.
 
A mim também me parece tudo correto, faltando só os construtores que foram entretanto colcados depois nuns posts mais à frente.

Só tenho uma nota a deixar: os this. não são obrigatórios desde que não hajam confusões com os nomes das variáveis. Eu raramente uso this. No entanto são boa prática e não têm nenhuma contra indicação no seu uso.

Se perdeste as aulas das bases não deixes perder o barco. Há centenas de sites acerca do assunto e vídeos pelo youtube com tutoriais de C#, usa e abusa dessas ferramentas. Qualquer dúvida podes sempre vir aqui perguntar.

Eu programo C# profissionalmente, se tiveres alguma dúvida coloca por aqui e se eu nem ninguém responder envia-me uma PM a visar-me que venho cá.
Há tantos videos que eu nem sei que escolher, consegues me fazer alguma recomendação?

E muito obrigado a ti e a todos pela ajuda, já consegui finalizar o exercicio e já tenho noção do que é um construtor ao contrário de quando criei o tópico que não fazia ideia do que era!
 
Há tantos videos que eu nem sei que escolher, consegues me fazer alguma recomendação?

E muito obrigado a ti e a todos pela ajuda, já consegui finalizar o exercicio e já tenho noção do que é um construtor ao contrário de quando criei o tópico que não fazia ideia do que era!
Dá a ideia que estás a tentar focar-te na aprendizagem de uma língua em concreto, mas deves criar um nível de abstração maior primeiro. Há bases que são comuns para muitas linguagens. Neste tema, por exemplo, deves pesquisar as bases de programação orientada a objetos inicialmente, é a minha sugestão. Isto irá beneficiar-te não só a entender o que estás a fazer agora mesmo, bem como quando te aventurares por outras linguagens e etc.
 
Também sou da opinião que deves tentar aprender a programar em geral e só depois deves focar-te numa linguagem.

Mas não te quero desmotivar. Se queres continuar com C# deves começar por safar-te em inglês, depois a própria Microsoft tem tutoriais: mva.microsoft.com. (podes e deves registar-te para seguires mais facilmente os tutoriais). Pesquisa lá por C# Absolute biginner, ou C# Jump Start. Depos relacionado com C# tens lá muita coisa, tanto para web como para Apps ou programas para windows.

No Youtube conheço este canal: https://www.youtube.com/channel/UCJ3AxeCHGPZkMi3kRfCuiHw
às vezes os vídeos são uma seca, mas parece-me que o canal é bem estruturado.
 
O código até pode estar correto sintaticamente, mas não faz sentido.

Pedem-te propriedades, mas defines métodos. Em C# não se costuma usar GetX e SetX. Fazes assim:

public double Comprimento;
public double Largura;

Como te pedem também dados privados, fazes assim, apesar de ser completamente desnecessário:

private double _comprimento;
private double _largura;

public double Comprimento
{
set { _comprimento = value; }
get { return _comprimento; }
}

public double Largura
{
set { _largura = value; }
get { return _largura; }
}

E acessam-se desta maneira:

obj.Comprimento = 5; // Set

Console.WriteLine(obj.Comprimento); // Get

Por outro lado, isto não faz sentido:

public double areaR(double area)
{
area = comprimento * largura;
return area;
}
//perimetroR
public double perimetroR(double perimetro)
{
perimetro = 2 * (comprimento + largura);
return perimetro;
}

Estás a definir 'area' e 'perimetro' como parâmetros, mas não os usas como tal. Parâmetros servem para passar informação para a função ou para fora da função, mas a função não precisa de informação nenhuma, e a função retorna o único valor que calcula, não o põe em nenhum parâmetro. Neste momento, para chamares a função tinhas que fazer obj.areaR(valor_qualquer_nao_usado);

O que tu queres é definir uma variável double DENTRO da função, assim:

public double areaR()
{
double area = comprimento * largura;
return area;
}
//perimetroR
public double perimetroR()
{
double perimetro = 2 * (comprimento + largura);
return perimetro;
}

E mesmo isso já é desnecessário, podes simplesmente pôr o valor diretamente à frente do 'return', tipo isto:

return comprimento * largura;

Por fim, mas isto já são mais mariquices minhas, nao uses nomes como 'areaR' e 'perimetroR'. As funções já fazem parte da classe "Rectangulo", não precisas de lá por o "R", que até fica feio.
 
Última edição:
O código até pode estar correto sintaticamente, mas não faz sentido.

Pedem-te propriedades, mas defines métodos. Em C# não se costuma usar GetX e SetX. Fazes assim:

public double Comprimento;
public double Largura;

Como te pedem também dados privados, fazes assim, apesar de ser completamente desnecessário:

private double _comprimento;
private double _largura;

public double Comprimento
{
set { _comprimento = value; }
get { return _comprimento; }
}

public double Largura
{
set { _largura = value; }
get { return _largura; }
}

E acessam-se desta maneira:

obj.Comprimento = 5; // Set

Console.WriteLine(obj.Comprimento); // Get

Esta maneira de implementar gets e sets, parece-me que é específica do c#. E até pode criar alguma confusão, porque ele não percebe de onde vem esse "value".

A maneira como ele fez, é como normalmente se aprende na primeira cadeira de programação na faculdade.

Por outro lado, isto não faz sentido:

public double areaR(double area)
{
area = comprimento * largura;
return area;
}
//perimetroR
public double perimetroR(double perimetro)
{
perimetro = 2 * (comprimento + largura);
return perimetro;
}

Estás a definir 'area' e 'perimetro' como parâmetros, mas não os usas como tal. Parâmetros servem para passar informação para a função ou para fora da função, mas a função não precisa de informação nenhuma, e a função retorna o único valor que calcula, não o põe em nenhum parâmetro. Neste momento, para chamares a função tinhas que fazer obj.areaR(valor_qualquer_nao_usado);

O que tu queres é definir uma variável double DENTRO da função, assim:

public double areaR()
{
double area = comprimento * largura;
return area;
}
//perimetroR
public double perimetroR()
{
double perimetro = 2 * (comprimento + largura);
return perimetro;
}

E mesmo isso já é desnecessário, podes simplesmente pôr o valor diretamente à frente do 'return', tipo isto:

returno comprimento * largura;

Por fim, mas isto já são mais mariquices minhas, nao uses nomes como 'areaR' e 'perimetroR'. As funções já fazem parte da classe "Rectangulo", não precisas de lá por o "R", que até fica feio.

Nesta parte, totalmente de acordo.
 
Back
Topo