Avatar
Peter Lazorik:

Dobrý deň,
Dajme tomu, že by som chcel spraviť program na výpočet kvadratickej rovnice v OOP, ak by som vychádzal z tejto kapitoly tak počet stien bol zadaný ako parameter, ale ak rátam kvadratickú rovnicu tak koeficienty sú do značnej miery rôzne takže zrejme by sa zadávali ako vstup od užívateľa z klávesnice ako ten vstup z klávesnice spravím v OOP C#?

Odpovědět 23.8.2013 16:21
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:

Ty 3 čísla budeš někde muset uložit, to znamená, že si je v té hlavní metodě normálně necháš a předáš je v parametru té metodě, která už se postará o zbytek.

 
Nahoru Odpovědět 23.8.2013 16:23
Avatar
Odpovídá na Jan Vargovský
Peter Lazorik:

Takže si napr. deklarujem private premenne a, b, c potom vytvorím konštruktor a v ňom im priradím hodnoty cez Console.ReadLine(); hneď v tomto konštruktore nechám vypočítať diskriminant a korene poprípade to tu aj budem vetviť pre záporný diskriminant potom vytvorím metódu v ktorá bude vracať korene x1 a x1 ako návratovú hodnotu a v hlavnom programe Program.cs tie korene nechám vypísať samozrejme po založení instancie. Mohlo by to tak byť z hľadiska OOP?

Nahoru Odpovědět 23.8.2013 16:35
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Peter Lazorik
Petr Nymsa:

Skoro až na to že třída která slouží pro výpočet rovnic nebude načítat vstup od uživatele. Pouze bude očekávat čísla a je jedno jestli ji přijdou načtené ze souboru, poslané přes internet nebo načtené z klávesnice :)

Nahoru Odpovědět 23.8.2013 16:44
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:

Nene. Přece nebudeš vytvářet instanci třídy pokaždé, když budeš zadávat nové koeficienty, ne? Toto není moc dobrý příklad na oop, resp. nevidíš v tom tu efektivnost. Jednoduše budeš mít třídu, která bude mít metodu na vypočítání kvadratické rovnice z koeficientů, které jsou zadané v parametru té metody, pak si uděláš ještě privátní metodu, která ti rozdělí ten velký problém na menší -> bude ti vypočítávat diskriminant. Pak je ještě problém, že kvadratická rovnice má většinou 2 výsledky, to znamená, že je potřebuješ nějak vrátit, takže bych si udělal nějakou pomocnou třídu, která by měla jen 2 vlastnosti a to x1 a x2 :)

Editováno 23.8.2013 16:47
 
Nahoru Odpovědět 23.8.2013 16:46
Avatar
Peter Lazorik:

Dobre tak inak skúsim to na niečom jednoduchšom napr. obvod kružnice mohlo by to vyzerať takto?
Class Kruznica.cs:
namespace Kruznica
{
// Konštruktor
class Kruznica
{
private double obvod;
public Kruznica(double polomer)
{
obvod = 2 * 3.14 * polomer;
}
//Metoda
public double Obvod()
{
return obvod;
}
}
}
Program.cs:
namespace Kruznica
{
class Program
{
static void Main(string[] args)
{
Console.Write­Line("Zadajte obvod prosím");
Kruznica kObvod = new Kruznica(double­.Parse(Console­.ReadLine()));
Console.Write­Line("{0}", kObvod.Obvod());
Console.ReadKey();
}
}
}

Editováno 23.8.2013 17:11
Nahoru Odpovědět 23.8.2013 17:09
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:

Nene, ten konstruktor tam vůbec nedávej, to je většinou na nastavení potřebných proměnných dané třídy. Každá ta funkce, by měla být závislá na tom co dostane v parametru.

Představ si, že máš za úkol vytvořit graf závislosti obvodu na poloměru ( u té tvojí kružnice třeba)

Pokaždé, co by jsi chtěl vypočítat ten obvod, by jsi musel vytvořit nový objekt ( to je to = new ...) z hlediska výkonu je to plýtvání, takže by jsi měl jen volat kružnice.Ziske­jObvod(double obvod)

 
Nahoru Odpovědět 23.8.2013 17:18
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:

http://www.itnetwork.cz/dev-lighter/182 tu jsem něco rychle splácal, jak by to mohlo vypadat

 
Nahoru Odpovědět 23.8.2013 17:23
Avatar
Peter Lazorik:

Takže konštruktor vymazať. A ten vzorec v konštruktore presunnú pred return do metódy Obvod a potom už len na metóde obvod definovať parameter?
public double Obvod(double polomer)
obvod = 2 * 3.14 * polomer;
return obvod;

Nahoru Odpovědět 23.8.2013 17:30
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:

Jo, to je přesně ono.

EDIT: Kdyžtak třída Math tam má přímo Pí :) ale to je jen takový detail.

Editováno 23.8.2013 17:33
 
Nahoru Odpovědět 23.8.2013 17:32
Avatar
Peter Lazorik:

A mohlo by to byť aj takto?
class Kruznica
{
private double obvod;
public double polomer;
public double Obvod()
{
obvod = 2 * 3.14 * polomer;
return obvod;
}
}

Nahoru Odpovědět 23.8.2013 17:48
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:

Na přístup k proměnným třídy máme vlastnosti (get/set) nebo public metody, zase by jsi udržoval zbytečný poloměr a obvod v paměti, který potřebuješ jen když voláš tu metodu Obvod.

Ještě poznámka, na kódy tu máme "Vložit zdrojový kód"

 
Nahoru Odpovědět 23.8.2013 17:53
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:

Obvod můžeš udělat jako prázdný atribut a k němu napíšeš getter, který si ten obvod spočítá. Případně i setter.

Nahoru Odpovědět 23.8.2013 17:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Peter Lazorik:

Z toho vlastne vyplýva, že: 1. Najlepšie je inicializovať premenné cez parametre metódy.
2. Premenné, alebo parametre sa inicializujú v iba v Program.cs nie v Class.
3. Premenné, alebo parametre sa v Class iba deklarujú.
Pochopil som to správne?
Akurát si to musím vyjasniť okolo konštruktorov.
Vďaka za tu poznámku.

Nahoru Odpovědět 23.8.2013 18:01
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Peter Lazorik
Kit:

Ne. Možní to tak spousta vývojářů dělá, ale je to špatně. Konstruktory jsou od toho, aby vytvářený objekt naplnily atributy.

Nahoru Odpovědět  +1 23.8.2013 18:08
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jan Vargovský
David Čápka:

Záleží jak často ten obvod chce, kolik těch kružnic má a jestli se ty kružnice mění (případně jak často) :)

Nahoru Odpovědět 23.8.2013 18:13
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Peter Lazorik
Kit:

Zkus si tento příklad. Vytvořil jsem kružnici k, nadefinoval jsem její poloměr. Obvod je atribut závislý na poloměru, proto je zbytečné ho mít v objektu. Přesto k němu mohu mít getter i setter.

using System;

class Kruznice {
    static void Main(string[] args) {
        Kruznice k = new Kruznice();
        k.Polomer = 5;
        Console.WriteLine(k.Obvod);
        k.Obvod = 10;
        Console.WriteLine(k.Polomer);
    }

    public double Polomer{get; set;}

    public double Obvod {
        get {
            return 2 * 3.14 * Polomer;
        }
        set {
            Polomer = value / 2 / 3.14;
        }
    }
}
Nahoru Odpovědět 23.8.2013 18:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Peter Lazorik:

Takže len trénovať aby som sa do toho dostal. Veľmi pekne ďakujem všetkým za rady a tŕpezlivosť.

Nahoru Odpovědět 23.8.2013 20:10
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.