Pomozte s programováním v Javě

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2029
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 04 pro 2011 22:32

No program načtu asi jen s parametrem vstupního souboru, ne? Automaticky jakmile se načtou data ze souboru se taky do souboru vypíšou... Mělo by to fungovat asi tak, že aby program načetl data ze souboru, musí být program spuštěn právě s tím parametrem, kterým je právě název vstupního souboru, tedy vstup.txt. Když program spustíš normálně bez zadání parametru, program si vyžádá data od uživatele z klávesnice.

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 04 pro 2011 22:37

Takže by se to mělo spouštět takhle:
java program vstup.txt vystup.txt
Protože tak jak jsi psal původně to udělá něco úplně jiného:
java program < vstup.txt > vystup.txt
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2029
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 04 pro 2011 22:43

Takže jakože mezi tím je rozdíl jaký?

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 04 pro 2011 22:59

To jsou právě ta kouzla s příkazovým řádkem 8)

Při prvním způsobu dostane program dva názvy souborů, a musí si je sám otevřít a načítat/zapisovat...
Při tom druhém způsobu si program myslí že dostává data z klávesnice a vypisuje na obrazovku.

Čili rozdíl je obrovský. Asi takový, jako když spustíš program, klikneš na ikonu Otevřít, vyhledáš soubor a ten si necháš načíst, a nebo když myší popadneš ikonu souboru a hodíš jí na ikonu programu, čímž se v něm automaticky otevře.
Ten výstup přesměrovaný do souboru se v GUI nedá udělat vůbec nijak, to musíš jedině v příkazovém řádku.

Také bych mohl udělat třeba tohle:
program1 <data.dat | program2 | program3 | program4 >> vysledek.txt
Každý ten program dělá jednu jednoduchou věc, a data pro ní si načítá ze vstupního proudu a vypisuje je do výstupního. Takže z pohledu programátora dostávají data z klávesnice a vypisují je na obrazovku.
Ve skutečnosti ale první program dostane data ze souboru, jeho výstup načítá druhý, jeho výstup zase třetí, jeho výstup čtvrtý a jeho výstup se ukládá do souboru, a to ještě tak že se přidá na jeho konec a předchozí data v něm zůstanou! Tohle všechno probíhá současně, protože operační systém se stará o multitasking i okamžité předávání dat rourami...
Dohromady se takhle dají poskládat funkce které nemají ani supersložité obrovské programy se stovkami megabajtů kódu, přitom každý z těch prográmků má jen pár kilobajtů. A jednoduchým přehozením nebo zapojením jiných prográmků dosáhneš úplně jiného efektu.

A zdaleka nejen to. Možná sis všiml jak spouštím ten můj kód:
$ bin/javac sekvence.java;bin/java sekvence
Na jednom řádku tam mám dva příkazy oddělené středníkem, které se vykonají postupně. Nejdřív se zkompiluje zdroják, a hned potom se výsledek spustí.
To proto, že když udělám nějakou změnu v kódu, stačí mi v konzoli zmáčknout šipku nahoru a Enter, tím se vyvolá poslední zadaný příkaz a ihned provede... Je jich tam v paměti pár stovek.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2029
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 05 pro 2011 00:36

Jo jasné, provádíš překlad a stuštění programu současně. Mno, teď v tom má zase zmatek. :lol: Program budu přes příkazovou řádku spoštět tak jako tak takže prostě pracujeme s tou příkazovou řádkou. Aby program vypsal výsledek do souboru tak ho nemusím uvádět ve spouštěcím příkazu ne? Soubor vlastně ani nemusí existovat... Celé je to na palici, jdu spát :D

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 05 pro 2011 17:14

Ten překlad a spuštění úplně současně provést nemůžu, ale oba příkazy se mi vejdou na jednu řádku.

To co program vypisuje na obrazovku, si můžeš nechat přesměrovat do souboru tím >, ten program o tom vůbec nebude vědět. Všechno co napíše se ti místo vypisování okamžitě uloží do zadaného souboru:
program > zaznam.txt
Pokud soubor neexistoval, tak se vytvoří, pokud existoval, smaže se všechno co v něm bylo a zapíšou se jen nová data.
Kdybys chtěl původní obsah zachovat a nový záznam přidat na konec, uděláš to takhle:
program >> zaznam.txt

Tohle je v Unixu asi od roku 1970 a M$ to přidal do MS-DOSu verze 2 v roce 1983 (takže je nejvyšší čas aby ses to také naučil používat). Ve windowsím cmd je to stále, i když pořád jen jako chudá napodobenina toho unixového shellu. Spousta vylomenin se v něm dělat nedá, třeba spuštění na pozadí, pozastavování a přepínání procesů...

Nejdůležitější z těch přesměrovacích kouzel je roura (pipe), kterou se právě propojují výstupy programů na vstupy jiných. Ty si můžeš vyzkoušet tenhle příkaz:
type text.txt | more
Příkazem type ze vypíše obsah souboru, jenže vcelku, takže pokud je delší než obrazovka, tak ti uletí nahoru. Abys ho mohl číst, tak ten výpis místo na obrazovku pošleš rourou na vstup programu more, který ho bude plivat po jednotlivých obrazovkách, a po každé počká až mu řekneš že chceš další.

Jde to samozřejmě i jinak, například můžeš zkusit okopírovat soubor ne do jiného souboru, ale do nějakého zařízení. Klávesnice a obrazovka, jako konzole systému, mají v DOSu označení CON, takže zkus tohle:
copy soubor.txt con
Nevím jestli to ve Windows ještě bude fungovat, ale soubor by se tím měl vypsat na obrazovku.
Opačně to jde také, když zadáš:
copy con soubor.txt
tak jsi vlastně vytvořil jednoduchý textový editor. Vše co napíšeš se ti ukládá do souboru. Má to jen jednu chybu, když odešleš řádek Enterem, nemůžeš na něm už dělat změny*, je uložený. Pro ukončení zadávání musíš napsat znak EOF (End OF File), což je to Ctrl+Z o kterém jsem psal dřív. Tím se vše z bufferu zapíše do souboru a ten se uzavře.
Kdysi jsem si takhle hrával s modemem, napsal jsem copy con com1 a pak jsem pomocí AT příkazů prozváněl mobil, sobě nebo tomu komu jsem to ukazoval. Nikdo nechtěl věřit že to jde tak jednoduše :lol:

A teď k té Javě. Ta přebírá principy z Céčka, což je duše Unixu, a základní komunikace programu tam je založená na proudech dat. V Unixu se všechno chápe jako soubor (adresář je soubor, disk je soubor, klávesnice je soubor pro čtení, zvuková karta je soubor pro zápis, síť je soubor, operační paměť je soubor, dokonce i procesor je soubor, ze kterého se dozvíš informace o něm!) a s tímhle vším se pracuje úplně stejně (uni(x)fikovaně). Omezená jsou pouze přístupová práva různých uživatelů.

Když se program spustí, má okamžitě k dispozici tři automaticky otevřené soubory:
stdin - standardní vstup ze kterého může číst, pokud jsi neprovedl přesměrování, je to klávesnice,
stdout - standardní výstup do kterého může zapisovat, bez přesměrování to bude obrazovka,
stderr - chybový výstup, na terý se vypisují hlášení. Ten je až na výjimky vždy obrazovka, takže když si stdout přesměruješ do souboru, chyby se přesto vypisují na obrazovce a ihned je vidíš.
S těmi se dá pracovat pomocí vestavěných funkcí (například System.out), ale můžeš je také použít jako soubory v souborových příkazech, protože jsou typu FILE.
Tyhle tři soubory jsou otevřené po celou dobu běhu programu, teoreticky je možné je uzavřít, ale není to moc dobrý nápad. Asi jako by sis propíchal uši a oči a uříznul jazyk... :twisted:



* Změny dělat můžeš, ale až dodatečně a musíš na to mít nástroj. V unixových systémech jsou jich stovky, například program sed. Ten nahradí zadaný řetězec druhým zadaným řetězcem, a vstup se mu posílá jiným programem právě tou rourou. Příkaz echo asi znáš, tím se vypisují texty třeba z dávkových skriptů. Takže například:
echo Hello World
vypíše Hello World.
Ale když ten výpis proženeš sedem takhle:
echo Hello World. | sed s/Hello/"Fuck the"/
tak se vypíše Fuck the World.
A stejným způsobem můžeš upravit všechny výskyty daného řetězce v libovolně velkém souboru který si vypíšeš do roury a místo na obrazovku si konečný výstup přesměruješ do nového souboru.
Těch sedů (i jiných programů jako grep) si tam můžeš samozřejmě zřetězit víc (tomu se říká kolona), takže se postupně (a přitom současně) můžou změnit desítky výrazů a na konci máš úplně nový text, přepracovaný jedinou příkazovou řádkou. Ve Wordu bys to ručně dělal půl dne.
Můžeš tak také totálně překopat zdrojový kód programu :wink:
Naposledy upravil(a) faraon dne 06 pro 2011 00:50, celkem upraveno 1 x.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2029
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 05 pro 2011 17:34

No myslel tak jsem to myslel, samosebou že překlad a spuštění programu nemůžeš udělat úplně současně. první překlad a pak spuštění... V unixu jsme se chcíli učili ve škole. Z tej školy jsem toho moc nepochytil takže jakoby nic ale aspoň tak nějak vím, co že si to v předchozím příspěvku vlastně psal. Třeba to more jsem si hned vzpoměl. :) je jasné, že ty mezi tím a programem v javě vidíš mnohem víc souvislostí než já a očividně toho máš zažito daleko víc než já... Takže v našem případě bude na spuštění stačit java nazev_programu vstup.txt? Takhle nějak by to mělo proběhnout?

EDIT:
Jinak, v čem bys udělal ten graf? Používáme tady ve škole takovou ulitku, respektive java program, který umí kreslit čáry. Což v tomto případě stačí ale není to podmínkou tak jestli bude lepší udělat ho jinak...?

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 06 pro 2011 00:46

Ono se jen tak z výkladu moc pochytit nedá, zvlášť jestli vás to učil člověk který to nepoužívá a jede jen podle osnov. Ale něco ti v hlavě zůstalo, takže když to budeš potřebovat, budeš přinejmenším vědět CO hledat. To co jsem napsal je shrnutí asi pětisetstránkové knihy a hromady dalších textů, plus pár let co to sám občas používám. A to neumím zdaleka všechno, jen pár věcí které mi sem tam ušetří dost práce.

Když zadáš
java program vstup.txt
tak se program dozví název souboru ze kterého má načítat, a musí si to udělat sám. Pokud bys zadal
java program vstup.txt vystup.txt
tak bude vědět i kam ukládat, ale to se stejně tak dá zařídit tím přesměrováním, pokud o to budeš stát:
java program vstup.txt > vystup.txt
Z args.length zjistíš počet parametrů a zpracuješ si je podle svého.
Ideální by bylo aby program načítal a kontroloval i obsah parametrů, takže pokud by příkaz nebyl ve správném formátu, třeba
java program -i vstup.txt -o vystup.txt
java program -o vystup.txt -i vstup.txt
tak by jen napsal nápovědu (stejně jako po java program -h) a skončil. To je běžné chování konzolových programů.

Na nějaké utilitky a čáry se po těch pár dnech učení ještě rozhodně necítím, zatím bych zvládl udělat jednoduchý sloupcový graf přímo v textovém režimu, třeba takhle plus nějaký popis okolo:

Kód: Vybrat vše

            X
          X X
          X X
      X X X X
    X X X X X
  X X X X X X
  X X X X X X
X X X X X X X

Jde to i naležato, stačí jen vypočítat měřítko podle nejvyšší hodnoty, aby se to vešlo na obrazovku (do 20 řádků a 80 sloupců).

Ještě k té kompilaci, ono by to samozřejmě šlo udělat současně, musel bych zadat
bin/javac sekvence.java & ;bin/java sekvence
čímž bych kompilaci spustil na pozadí, a ihned by se začal provádět i další příkaz. Ale mohly by se dít zajímavé věci. Nejjednodušší možnost je, že by se spustila předchozí verze programu, ještě než by se přepsala tou právě kompilovanou. Horší by bylo, kdyby se obsah programu stihl změnit během načítání, to by mohlo mít dost divoké vedlejší efekty ;-)

Ještě mě napadl jeden příklad na ten sed, dají se tím opravit i pravopisné chyby:
cat dopis_poslanci.txt | sed s/debyl/debil/ > dopis_poslanci_2.txt
To nahradí všechny výskyty řetězce s chybou řetězcem bez chyby, během pár sekund to zvládne zpracovat soubor o stovkách megabajtů, mnohem rychleji než bys ho stihnul načíst do jakéhokoliv editoru. Přitom tomu programu k práci stačí pár kilobajtů paměti :lol:
Naposledy upravil(a) faraon dne 06 pro 2011 00:56, celkem upraveno 1 x.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2029
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 06 pro 2011 00:55

To spouštění bych neřešil. Program si můžu projednou spustit v příkazové řádce jevac > java. Zabere to asi 10 vteřin... Já myslel, že bude stačit spustit program s parametrem vstupu. To, kam se program vypíše se dozví v samotném programu... Teda aspoň tak jsem to pochopil, že to jde. Na ten graf se juknu zítra, respektive dneska :D ale až za pár hodin... :D

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2029
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 06 pro 2011 23:40

Tak jsem zjistil, že to máme udělané celkem složitě. Respektive složitě pro další úpravy. Věděl jsi, že existuje příkaz, který zkrátí pole jen na délku tak, aby zústaly jen čísla? :D

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 06 pro 2011 23:57

Napadají mě minimálně tři způsoby jak to udělat, takže proč by neexistoval :-D

Mám jiný problém, jakým způsobem načítat čísla z toho souboru. Už jsem se dostal tak daleko že je načtu, ale pokud neznám předem jejich počet a pokusím se číst dál, skončím s výjimkou. To zatím nemám nastudované ;-)
Je nějaký způsob jak předem zjistit že jsem na konci sekvenčního souboru?

Kód: Vybrat vše

             FileInputStream fis = new FileInputStream(args[0]);
             DataInputStream dis = new DataInputStream(fis);
             Scanner scan = new Scanner(fis);

             x=scan.nextInt();
             System.out.println(x);
             x=scan.nextInt();
             System.out.println(x);
             x=scan.nextInt();
             System.out.println(x);

             dis.close();
Pokud v souboru budou méně než tři čísla, program spadne.

Ono by teda nebylo těžké napsat vlastní Scanner, který by mi vracel místo výjimky EOF, ale nenašlo by se už nějaké hotové řešení?
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2029
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 07 pro 2011 00:12

Dneska už na to kašlu... Zítra se na to vrhnu a v průbehu dne to hodlám (musím) dodělat. A víc než to načítání ze souboru mi dělá ten graf. :/ Budeš tu zítra? Celkem by se určitě hodila pomoc...


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti