Zaslal: po 20. červen, 2005 9:01 Předmět: Ucim se programovat v C a mam problem
Jsem teprve ve 4 lekci a resim zakladni cvicebni. Akorat potrebuji neco vysvetlit.
Zadani: Napiste program, ktery precte cele dekadicke cislo (v rozsahu 0 az 255) a vypise jeho hexadecimalni hodnotu dvouznakove, napr.:
vstup: 127
vystup: 7Fh
Jak jsem nasel spravnou odpoved, tak je to:
#include main (void) /* fakt nevim proc je tam to void. Vzdyt by to melo fungovat i bez toho void. */
{
int i;
printf(" Zadej dekadicke cislo v rozsahu 0..255: ");
scanf("%d", &i);
printf("%2Xh\n", i); /* to 2 je asi pocet mist, ze?*/
return 0;
}
Co nechapu jsou asi zakladni matematicke postupy. Nechapu co je mysleno tim "hexadecimalni hodnotu DVOUZNAKOVE." Vzdyt hexa se zklada z nekolika znaku. A proc je tam to "h" u hexa cisla. Vzdyt hexa je pouze do F.
Stejne tak mam chaos i v tom rozsahu 0 az 255. To bych rekl ze tam ma byt unsigned int tedy "u", ale kdyz jsem se podival do reseni, bylo tam normalni i tedy signed. Mel jsem za to, ze signed je cislo mensiho rozsahu, ktere dokaze zobrazit i znamenkove zaporne cislo.
Takze asi nechapu smysl signed int, long, short a tak.
Asi to pro programatory bude skutecne trivialni, ale me to zatim jasne neni. _________________ Palm V, Vx, m505, m515, Tungsten T, T2, T3, Ipaq 1910, Treo 600, Zodiac 2, Clie NX73V, Treo 650, Treo 680, Palm Centro, chvíli Palm Pre a HTC Magic, iPhony od samého začátku od 4GB verze a nyní
Registrace: 19.11. 2004 Příspěvky: 723 Bydliště: Praha
Zaslal: po 20. červen, 2005 11:00 Předmět:
no to h jen znaci ze se jedna o hexadecimalni cislo , tedy te zajimaji jen ty prvni dve, coz jsou tedy DVA ZNAKY- dvojznakove
a ten zdrojak a datovy typy ti musi objasnit nejakej Ceckar, ja bych to asi nevysvetlil moc srozumitelne
Řádek
#include main (void)
je divný! Příkaz preprocesoru #include se vztahuje ke vkládání jiných souborů, například hlavičkových (s příponou "*.h").
Nemělo to být náhodou int main(void) ?
Když vynecháš void v parametrech, tak překladač skutečně nebude protestovat. Ostatně jazyk C dovoluje napsat téměř vše, ale pak za to poneseš následky
To slovo void v tomto případě znamená, že funkce nemá parametry.
Znak "h" znamená, že číslo v hexadecimálním tvaru.
Proměnná "i" je typu int (signed), který je rozsahem větší než 0-255, kokrétně závisí na systému překladači. Např. ve starém Borland C 3.1 je int 16 bitový, t.j rozsah -32768 až 32767, novější překladače používají int jako 32 bitový, t.j v rozsahu -2 miliardy až +2 miliardy.
Specifikace signed je dost důležitá. Např.
signed int v rozsahu -2 miliardy až +2 miliardy
kdežto unsigned int v rozsahu 0 až +4 miliardy
což u matematických operací může být hodně podstatné!
Jinak jako dobrou studijní literaturu dopoučuji knihu Herout: Učebnice jazyka C, nakl. KOPP, v současné době myslím je už čtvrté vydání
Dekuji vsem za rady. Prave tento priklad je z Heroutovy knizky. Jsem teprve ve 4 lekci a uz mi z toho jde hlava kolem. Ale bavi me to. Jeste mi ted vysvetloval kolega co jsou to Pointery a ze v programovani pro PalmOS si jiz uziju az az, protoze tam se pouzivaji na vsechno. Skoro mam pocit, ze kdyz pochopim tohle, muzu bez obav sahnout po ucebnici jaderne fyziky a hrave ji zmaknu.
Jinak onen kolega mi to zpracoval takhle.
Kód:
#include <stdio.h>
// void main(void) by znamenalo, ze tato funkce nevraci zadnouhodnotu a ani nema vstupni parametr
// pochopis az se dostanes k funkcim
main(void) // main(void) znamena, ze tato funkce nema zadne vstupni parametry
{
// POPIS PROMENNYCH vzestupne podle velikosti ulozitelnych dat:
//=================================================================
// typ: | rozsah: | velikost:/UNIX typ:
//=================================================================
// signed char | -127, +128 | [1byte]/[Int8]
// unsigned char | 0, +255 | [1byte]/[UInt8]
//----------------+---------------------------+--------------------
// short int | -127, +128 | [1byte]/[Int8]
// unsigned short | 0, 255 | [1byte]/[UInt8]
//----------------+---------------------------+--------------------
int i; // int | -32767, +32768 | [2byte]/[Int16]
// unsigned int | 0, +65535 | [2byte]/[UInt16]
//----------------+---------------------------+--------------------
// long int | -2147483647, +2147483648 | [4byte]/[Int32]
// unsigned long | 0, +4294967296 | [4byte]/[UInt32]
//-----------------------------------------------------------------
// DALE DESETINA: float < double < long double
// ty ale rozepisovat nebudu :)
printf("Zadej dekadicke cislo v rozsahu 0..255: ");
scanf("%d", &i);
/*
%2X byl nesmysl, %X znamena ze se hodnota nasledne udavane promenne
vypise jako hexadecimalni cislo.
A to male h\n uz je pouze dalsi retezec co se ma zobrazit, h jako hexa.
Zadani dvouznakove melo zrejme znamenat hodnota+jednotka[h].
*/
printf("%Xh\n", i);
// mno a tohle je jenom jina varianta toho sameho
printf("zadane dekadicke cislo %d = %X hexadecimalne.\n", i, i);
/*
Zkratka se nejdrive urcuje co vypisujes, vcetne textu a namisto
prommenych napises jejich datovy typ (jako co se vypisou) a dalsim
parametrem jsou uz danne prommene v temze poradi jako jsi uvadel jejich
datove typy v uvozovkach.
existuji nasledujici datove typy pro fci printf a scanf:
%c kdyz chces vypsat prommennou typu char
%d pro int(totez jako signed int, nebo Int16)
%ld pro long(totez jako signed long, nebo Int32)
%u pro unsigned int(, nebo UInt16)
%lu pro unsigned long(, nebo UInt32)
%f pro float
%Lf pro long double
*/
return 0;
}
_________________ Palm V, Vx, m505, m515, Tungsten T, T2, T3, Ipaq 1910, Treo 600, Zodiac 2, Clie NX73V, Treo 650, Treo 680, Palm Centro, chvíli Palm Pre a HTC Magic, iPhony od samého začátku od 4GB verze a nyní
Jeste me napadlo...ono to signed a unsigned je v podstate jenom takovy "syntakticky cukr" . Ty cisla jsou v pameti ulozeny porad stejne, jde jen o to, jak je ten urcity jazyk prezentuje. Pokud je ten typ signed, je jeden bit vyhrazen prave na urceni toho znamenka. Takze pokud je v pameti ulozeno (binarne) napr.
11111111 je to unsigned 255, ale signed je to -127
pokud je tam
01111111 je to unsigned i signed 127
V zakladu mas asi pravdu, dulezitejsi bude to Long a short. To asi zabere mene pameti. V realu na promennou je to asi maly dil, ale u velkeho projektu muze hrat kazde kousek pameti dost na vykonu.
BTW Float je cislo s desetinou carkou. Double je asi na vic desetinych mist a long double je asi na hooodne moc desetinych mist. Je to tak? _________________ Palm V, Vx, m505, m515, Tungsten T, T2, T3, Ipaq 1910, Treo 600, Zodiac 2, Clie NX73V, Treo 650, Treo 680, Palm Centro, chvíli Palm Pre a HTC Magic, iPhony od samého začátku od 4GB verze a nyní
Hmm, dobrý počin od pana Lesného. Akorát ten FrankenGarnet vydržel trošku déle než to na začátku vypadalo
"Nemusíte se mnou souhlasit, ale operační systém PalmOS 5.x považuji pouze za přechodnou verzi, jejímiž zvláštnostmi se nemá smysl zabývat." MUDr. Petr Lesný, 10. 9. 2003
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru.