Anonymní profil cerf – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil cerf – Programujte.comAnonymní profil cerf – Programujte.com

 

Příspěvky odeslané z IP adresy 188.246.100.–

cerf
C / C++ › velikost pole
30. 7. 2011   #145458

I když fnenksovo řešení nevypovídá ani tak o pochopení principu, jako spíš o metodě pokus - omyl :)

int pole[5][8];
int y = sizeof (pole) / sizeof (pole[0]);          //5
int x = sizeof (pole[0]) / sizeof (pole[0][0]);  //8

cerf
C / C++ › velikost pole
30. 7. 2011   #145457

Odkázání na #define je sice hezká rada, ale pochopení principu, proč se je možné rozměry pole zjistit právě tak, jak na to fnenks nakonec správně přišel,
je rozhodně užitečnější. Navíc tohle se může hodit. Třeba v případě, kdy máš pole řetězců používaných v programu:

const char strArr[] = {
"Open",
"Close",
"Cancel"
};

Je to mnohem lepší způsob, než určit velikost pole přímo

const int ARR_SIZE = 3;

const char strArr[ARR_SIZE] = {
"Open",
"Close",
"Cancel"
};

protože při rozšíření pole o další řetězec je nutné změnit i hodnotu ARR_SIZE

cerf
C / C++ › Konstruktor / Destruktor
23. 6. 2011   #143388

V čem je lepší konstruktor? Ve všem :) Konstruktor slouží k počáteční inicializaci objektu. Pokud vytváříš objekt,
měl bys vždycky implementovat také vlastní konstruktor. Funkce Set() a pod. se používají na změnu hodnoty, ne k její inicializaci.
Inicializace probíhá při vytváření proměnné:

int a = 0;	//je inicializce

int b;
b = 0; //není inicializace ale přiřazení

Pokud neimplementuješ konstruktor, bude program, kromě jiného, náchylný k chybám. Můžeš se pak dopustit například následující chyby:
Macka kocka;

int vek = kocka.GetVek(); //vrací hodnotu Vek objektu kocka, které není přiřazena žádná hodnota

Pokud však vytvoříš bezparametrický konstruktor, který proměnné Vek přiřadí hodnotu 0, předchozí příklad bude fungovat správně:
//konstruktor

Macka::Macka()
{
Vek = 0;
}

Dále si představ, že by třída Macka obsahovala také jméno kočky, které by bylo reprezentováno jako pole type char:
char *m_jmeno;

Třída by také pomocí metody SetJmeno umožňovala změnu jména. Implementace funkce by mohla vypadat následovně:
void Macka::SetJmeno(const char *jmeno)

{
delete [] m_jmeno;
m_jmeno = new char[strlen(jmeno) + 1];
strcpy(m_jmeno, jmeno);
}

Pokud bys nevytvořil vlastní konstruktor, následující program by vygeneroval chybu:
Macka liza;

liza.SetJmeno("liza"); //CHYBA

Mělo by to být jasné. Ukazatel m_jmeno obsahuje náhodnou hodnotu, protože nebyl při vytvoření objektu inicializován. Použití operátoru delete [] proto skončí chybou. Avšak použití operátoru delete na nulový ukazatel je zcela bezpečné.
Proto stačí vytvořit vlastní konstruktor, který inicializuje ukazatel na hodnotu NULL (popř. 0)
Macka::Macka()

{
Vek = 0;
m_jmeno = NULL;
}

Samozřejmě by bylo možné vytvořit "inicializační funkci", která by se starala o totéž jako konstruktor. Ale jaký by byl k tomu důvod, když se konstruktor volá automaticky, zatímco takovou funkci bychom museli volat explicitně?
Macka kocka;

kocka.Init(); //??? Jaký to má smysl ???

cerf
Java › Zaokrouhlení čísel
11. 6. 2010   #130090

K tomu zaokrouhlování, co třeba:

1. přičíst k výsledku 0.005 (zaokrouhlení)
2. vynásobit 100.0
3. přetyopovat na int (ořezání desetinné části)
4. jako double vydělit 100.0

jinak řečeno...

12.2568 + 0.005 = 12.2618
12.2618 * 100.0 = 1226.18
(int) = 1226
(doble)1226 / 100.0 = 12.26

(JAVU téměř neznám, tak snad to není úplně mimo)

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý