Být tebou, tak se na regulární výrazy vykašlu a udělám to pomocí XML parseru http://msdn.microsoft.com/en-us/library/cc189056(v=vs.95).aspx#Y480. Regulární výrazy budou složitější a nebude úplně snadné je odladit pro všechny okrajové podmínky.
Příspěvky odeslané z IP adresy 86.61.140.–
Reversi jsem si jednou zkoušel naprogramovat jako odreagování během zkouškového. Ty zdrojáky jsou dost neučesané, ale třeba ti to pomůže. Je to projekt do netbeans. Dokonce jsem tam udělal jak konzolové tak grafické rozhraní.
http://xml.netbeans.org/ - oficiální stránky o xml v netbeans.
http://netbeans.org/search_result.html?cx=006102455337629464213%3Amt38ytkbuak&cof=FORID%3A11&q=xml&siteurl=netbeans.org%2F&sa.x=0&sa.y=0
Napadlo mě, že to můžeš zkusit vydat pod nějakou open source licencí.
Výhody - nemusíš shánět lidi(najdou si tě samy), lidi nemusí být jenom z Čech/Slovenska takže si můžeš procvičit jazyky
Nevýhody - bude možné si překompilovat program bez reklamního banneru(to ale většina lidí neumí nebo to neudělá)
Pokud si dobře vybereš licenci bude možné ty zdrojáky využít i v uzavřené aplikaci. Navíc pro OS projekt najdeš snadno stránky pro podporu projektu zdarma(sourceforge.net, github.com, bitbucket.org, codeplex.com ...).
Použij http://download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#arraycopy(java.lang.Object, int, java.lang.Object, int, int). Kvůli zrychlení je lepší zvětšovat pole třeba na dvojnásobek nebo použít ArrayList nebo LinkedList.
V javě (ale i třeba v C/C++) se to právě udělat dá.
public static void main(String[] args) {
int[][] a = new int[3][];
for(int i = 0; i < a.length; i ++) {
a[i] = new int[i + 1];
for(int j = 0; j < a[i].length; j ++) {
a[i][j] = j;
}
}
for(int i = 0; i < a.length; i ++) {
for(int j = 0; j < a[i].length; j ++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
}
Menší optimalizace: stačí ověřovat od 2 po a/2.
Lepší optimalizace základního algoritmu je hledat čísla pouze do druhé odmocniny z maxCislo. Všechna další řešení už jsou symetrická (např. pro 100 = 25 * 4 = 4 * 25).
Řekl bych, že na to jdeš blbě. Zadávat ten graf ručně je dobré možná tak pro kontrolu. Lepší je si ten graf nějak zakódovat, a v té třídě graf ho vytvořit tak jak píšeš. Nejběžnější jsou následující způsoby: 1) matice sousednosti/vzdálenosti 2) matice incidence 3) seznam uzlů a seznam hran. Potom čteš zadanou matici nebo seznam a podle obsahu vytváříš graf.
Chyba je tady > if(znamenko=="+"){
Znaky se zapisují do jednoduchých úvozovek '+', řetězce do dvojitých.
Pokud se chceš naučit modulární návrh, tak doporučuju knihy a přednášky od Jaroslava Tulacha (hlavní architekt Netbeans). Je vidět, že tomu hodně rozumí a jeho výklad je dobře srozumitelný(např. tady http://www.avc-cvut.cz/avc.php?id=4671). Asi nejlepší příklady moderních multiplatformních modulárních aplikací jsou dnes platformy Netbeans a Eclipse. K oběma existují spousty knížek, článků a návodů. Obecně v Javě to vypadá, že se nejspíš uchytí OSGI(Eclipse moduly).
Však píšu ať použiješ metodu repaint(kotva v odkazu #repaint()), třeba v tom timeru. Jediný problém je v tom že can nemáš deklarovaný jako final, takže musíšbuď udělat can final, nebo si ho uložit i v třídě RunTimerTask. Kompletní dokumentace k překreslování je tady http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/Canvas.html#repaint(int, int, int, int)
http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/Canvas.html#repaint()
Použij funkci snprintf, která má parametr velikost bufferu.
int snprintf(char *str, size_t size, const char *format, ...);
Na to se používá File Connection API. Je to volitelný balík, tak nemusí být na všech telefonech.
Chyba je tady:
int Middle=Lenght/2;
Příště si to nejdřív zkus odkrokovat. Tam bys to viděl hned při prvním průchodu.
.
tak dej jako master
To nemusí vždycky pomoct. Zažil jsem u několika počítačů, že disk nemohl být na stejné kšandě jako mechanika.
http://netbeans.org/features/uml/ http://netbeans.org/projects/uml/ ale je pro verzi 6.7 a starší. Má funkce pro reversní inženýrství a to je přesně co potřebuješ. Pokud máš novější verzi netbeans můžeš zkusit nightly buildy, ale nevím jak jsou stabilní (přidej si do zdrojů http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/nbms/updates.xml.gz).
Je vidět, že ti (X)HTML nic neříká. Ten kód už na první pohled nic moc. Co znamená tag </br>? U obrázků chybí alt tagy (vypni si v prohlížeči zobrazení obrázku a podívej se na to). Menu by tam určitě nemělo chybět menu i textově a při zobrazných obrázkách ho schovat. I když to css je malé dal bych ho do zvláštního souboru. Největší prasárna jsou ty nadpisy. Dávat do nadpisu odřádkování nebo rovnou odstavec (blijící smajlík). Používání tagu center by taky není úplně košér, ale vzhledem k těm ostatním chybám je to detail. Ty stránky bych zahodil a napsal kompletně znova.
final to musí být abys zajistil, že se nezmění instance objektu přiřazeného do proměnné. Třeba těžko říct jak by se měl chovat následující kód:
String[] data = new String[10];
InnerClass ic = new InnerClass() {
public void do() {
for(int i = 0; i < data.length; i ++) {
data[i] = ...
}
}
}
data = new String[5];
ic.do(); //zapisovat do původního objektu (new String[10]) nebo do nově vytvořeného(new String[5])?
Můžeš zkusit použít něco efektivnějšího než XPath, třeba SAX (http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/package-summary.html). Dělá se to tak, že si vytvoříš svojí implementaci třídy org.xml.sax.helpers.DefaultHandler, kde přepíšeš metody aby zpracovali tvoje XML.
Zamrzá ti to, protože to nejspíš voláš ze stejného vlákna.
Výjimky se používají pro chybové stavy, není vhodné je používat pro řízení toku programu. Tohle bych přepsal, už jenom z toho důvodu, že ti může přijít jiná výjimka než očekáváš (např. OutOfMemory).
try
{
databaze = DatoveOperace.nacti();
}
catch (Exception ex)
{
databaze = new DatabazeZakazek();
}
Všechny streamy ve třídě Datové operace bych přepsal s použítím usinghttp://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx (např. operace ulož).
using(FileStream fs = File.Create("data.dat"))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, databaze);
}
Tak jak to máš teď to nebude fungovat správně, pokud bf.Serialize(fs, databaze); vyhodí výjimku, tak se ti nezavolá metoda Close. Ten objektový model se těžko odhaduje, pokud neznám zadání.
Obecně bych řekl, že v případě kdy nejde vrátit smysluplná hodnota je lepší použít výjimku. Ten tvůj příklad je hodně zjednodušený. Představ si, že funkci pro získání měsíce voláš někde v logice aplikace. Když ti vrátí nesmyslnou hodnotu, tak v podstatě nemáš jinou možnost než vyhodit výjimku(s chybnými daty nemá cenu pracovat) a odchytit ji v prezentační vrstvě, kde se zobrazí informace o chybě. Často ve větších aplikacích, prostě nemáš dost informací na to, abys mohl chybu vyřešit rovnou v místě, kde vznikne. V jednodušších programech výjimky často vypadají jako zbytečná komplikace. Výjimky mají tu výhodu, že když neumím nebo nechci řešit chybový stav, tak jí prostě nechám propadnout dál.
Tohle se obvykle řeší dvěma způsoby. Buď jako boahttp://en.wikipedia.org/wiki/Boa_(web_server), tedy že ve smyčce v 1 vláknu obsluhuješ postupně jednotlivé sockety, ale to je vhodné spíš pro pomalé počítače a malý počet klientů. Lepší řešení je použít thread pool http://en.wikipedia.org/wiki/Thread_pool(je to dokonce jeden z návrhových vzorů). Vytvoříš si omezený počet vláken a těm postupně přiřazuješ/odebíráš sockety. Je to rychlejší, díky tomu, že nemusíš neustále vytvářet a likvidovat vlákna. Navíc se ti nemůže stát, že se vytvoří moc vláken. .NET neznám, ale tipnul bych si, že thread pool bude součástí "standartní knihovny".