Názory ke článku Některé zajímavé funkce pro začátečníka – Palindrom
#1 xxar3s
Toť otázka, já osobně ho neznám, v Pascalu nepracuji. Pascalovou část jsem psal tak, že mi ji ověřoval kolega, zda je korektně napsána. Tuším, že ale zase extra velký problém v tom není, ne? :)
Jinak se za svou neznalost omlouvám.
#1 xxar3s
A proč ano? Pro začátečníka je to akorát zmatení navíc, výhody to pokud vím nepřináší žádné. Pokud nepočítám mezery, je to dokonce stejně dlouhé (pro jednoznakové proměnné):
inc(x);
x:=x+1;
Ale samozřejmě se o výhodách rád nechám poučit ;)
#1 xxar3s
Výhody tam v praxi v té základní formě žádné nejsou (kromě možná místy zkrácení kódu či zjednodušené čitelnosti). inc a dec také mají dvouparametrovou verzi, kde je možné uvést o kolik se má proměnná změnit.
Většina překladačů inc a dec překládá jako inline funkce (tedy volání nahradí přímo jejím tělem), ale možná některé výjimky také existují a proto při náročnějších operacích možná je zbytečné přitěžovat si zbytečně voláním funkce navíc.
Navíc pascal nyní podporuje příkaz +=, což se mi zdá jako náhrada inc a dec výborné - například x+=1; je kratší na zápis než oba dva zbylé způsoby inkrementace.
#4 MZetko
Navíc pascal nyní podporuje příkaz +=, což se mi zdá jako náhrada inc a dec výborné - například x+=1; je kratší na zápis než oba dva zbylé způsoby inkrementace.
A opravdu, to jsem netušil. Díky. A dodám, že mi funguje i *= a -=.
26. 4. 2012
sizeof není funkce.
počet prvků pole není to samé jako délka řetezce.
nepoužíváme strlen na řetězci bez ukončovacího znaku.
nezapisujeme do pole bez zajištění/kontroly dostatečné velikosti.
proměnnou nepojmenováváme vysledek, pokud neobsahuje konečný výsledek.
kód před zveřejněním aspoň vyzkoušíme.
když mi dáte kontakt, tak vám koupím knihu o základech céčka a pascalu dle vašeho výběru. než je přečtete, tak články nepište.
26. 4. 2012
nejsem Céčkař ani Pascalista, ale ten kód je hrozný. Dle mého názoru sizeof funkce je a proto mi jde proti srsti když na začátku je napsáno, že se využije jen to a to a přitom sizeof tam napsáno není. Psát programy se základními funkcemi bývá lehké, problémem je, že je to pak hrozný guláš a taky to co vám zde chybí a to je optimalizace, nemám s C moc zkušeností (naprosté minimum s c++), ale procházet zbytečně celé pole vícekrát než je potřeba není dobré nikde, zrovna tak například zbytečná proměnná- zaver.
Taky by mě zajímala ta věta, že v C můžeme jen tak přidávat znaky do pole a vše bude v fungovat, měl jsem za to, že v C je pamět pod kontrolou programátora, čili je třeba nadefinovat si pro to pole paměť a tu nepřesáhnout. (ale možná sem zcela mimo ;))
Samozřejmě každý článek dobrý, ale když už to dá tolik práce, tak by nebylo od věci věnovat tomu o procento víc a udělat to líp.
27. 4. 2012
Pár poznámek:
- funkci JepPovolenýZnak() urychlíte přepsáním algoritmu na tzv. binární vyhledávání (vyžaduje seřazené povoloné znaky - to není porblém), nebo využijte funkci ze standardní knihovny C++ std::binary_search, nebo jí "znovu" implementujte v C
- v cyklech for nepoužívejte i++ ale ++i, když někdy přejdete na iterátory (C++) tak se i++ může stát výkonostní brzdou
- příklady předpokládájí ASCII abecedu, jenže už jsme v 21. století a unicode je všude kolem nás, vím že je práce s unikode kolikrát netriviální ale je dobré na to myslet
- proč dobrovolně používat C když C++ je kolikrát rychlejší (délka vývoje) a minimálně stejně rychlé nebo rychlejší - rychlost hotového programu (třeba templatovaná funkce std::sort vs qsort)
#8 Marek
tywe Marku, co to meles?
- binarni vyhledavani na poli o delce 6? deleni a skoky jsou pro procesor mnohem vetsi problem, nez sekvencne projit male pole
- ano, v c++ je zvykem pouzivat prefixovou variantu inkrementu, protoze na objektech to MUZE usetrit vytvoreni jednoho objektu, ale zadna "vykonostni brzda" to v zadnem pripade neni, v C je to uplene sumak
- na co tady unicode?! vzdyt je to vyukovej priklad!
- to by me zajimalo, kdy je c++ rychlejsi a proc je std::sort rychlejsi nez qsort? ;D
27. 4. 2012
OK, trochu jsem to přehnal.
Binární vyhledávání je rychlejší (O(log(n)) než průlet polem/vectorem (O(n)), v tomto případě bych spíše použil něco jako char c=/*getPismeno()*/; if(c>='a' && c<='z').
it++ vs ++it osobně všude a vždy píšu ++it, nic mi to neudělá, takže jsem výkonnostní propad nezažil, pravda nic jsem neměřil. Proč zbytečně psát (možná trošku) pomalejší variantu? Jednou někde někdo (nějaká babka na trhu?) vyprávěl jak tím dost urychlil program.
Unicode: ano toto je výukový program, ale zatím u VSECH (nevýukových) programů co jsem kdy psal jsem musel počítat minimálně s češtinou (a různým kodováním), a je tu riziko ze VSECHNY programy začnou používat neczechši nebo neameričani, kolikrát se mi stává, že mi třeba webová aplikace zkomolí jméno, apod.
std::sort vs qsort: to je známé a je toho na webu určitě mnoho, naposledy jsem to slyšel na přednášce GoingNative2012 snad od samotného Bjarne Stroustrup http://channel9.msdn.com/Events/GoingNative/GoingNative-2012
1. 5. 2012
Autor by se měl naučit alespoň jeden z použitých jazyků, dělá naprosto elementární chyby.
char znaky[] = {" ", ",", ".", "!", "?", "'"}; // a další dle uvážení
znaky deklaroval jako pole znaků, ale inicializuje ho polem řetězců (tj. efektivně polem polí znaků)
int delka_pole = sizeof(znaky)/sizeof(znaky[0]);
dělení naprosto zbytečné, protože typ znaky[0] je char a sizeof(char) je ze standardu 1
bool jePalindrom( char palindrom[] ){
int j = 0;
int delka = sizeof(palindrom)/sizeof(palindrom[0]);
to nemůže fungovat, protože sizeof(palindrom) == sizeof(char*) neboť při předávání polí jako parametrů se jejich velikost nepředává, ale předávají se jako ukazatel na první prvek. za tohle by od každé zkoušky z jazyka C vyletěl
for( int i = 0; i < delka; i++ ){
vysledek[i] = toupper(vysledek[i]);
}
chyba, delka byla (resp. mela byt) delka vstupniho textu, vysledek muze byt kratsi
delka = strlen( vysledek );
predchozi kod bohuzel nikde vysledek neukoncuje nulou, strlen nemusi fungovat
for( int i = 0; i < delka; i++ ){
if( i > (delka - i) ) break;
což takhle for( int i = 0; i < delka / 2; i++ ){
if( vysledek[i] != vysledek[delka-i] ){
nema to bejt if( vysledek[i] != vysledek[delka-i-1] ){
Pascal
function jePovolen( c: char ):boolean;
begin
znaky[1] := ' ';
znaky[2] := ','; {a další dle uvážení}
delka_pole := const.; { určujeme nějakou konstantu,
která je daná v Pascalu při deklaraci }
nechapu, v Pascalu lze inicializovat staticky retezec, ale i pole znaku normalne. A take lze snadno ziskat jejich delku
for i := 1 to delka_pole do begin
if znaky[i] = c then jePovolen := false;
end;
jePovolen := true;
coz nebude vubec fungovat nebot uvnitr cyklu chybi prikaz exit
function jePailndrom( palindrom :string );
preklep + chybi " : boolean"
delka := length( vysledek );
for i := 1 to delka - 1 do begin
if i > (delka - 1) then break;
tady melo bejt asi (delka - i), soude podle podobnosti s C verzi (samozrejme jednodussi by bylo mit ten for cyklus do delka div 2
if( vysledek[i] <> vysledek[delka-i] ) then begin
vysledek[delka-i+1]
28. 6. 2012
Preco je v prvom priklade operator OR pouzity 2x za sebou? ( "||" )
Zasláno z mobilního telefonu.