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 » 03 pro 2011 16:19

Ještě jsem doplňoval předchozí příspěvek...

Jinak, ten scanner lze hodit přímo do třídy takto:

Kód: Vybrat vše

static Scanner sc = new Scanner(System.in);

Výhodou pak je, že se nemusíš při více vstupech starat kde je a kde není...

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 » 03 pro 2011 22:31

Takže tam mají být tři možnosti vstupu?
1. spuštění s parametrem: program 23
2. spuštění bez parametru a zadání čísla
3. spuštění bez parametru a zadání názvu souboru
Tak to tady (je tam celý zdroják i výsledky) fakt neodladím, a v počítači překladač nemám, takže se soubory pracovat nemůžu :eh:
A co když bude mít při spuštění víc parametrů nebo rovnou název souboru? Má se to rozeznat automaticky nebo z nějakého menu...

Koukám že jsi tu mojí analýzu nedočetl do konce, protože tam pořád máš int[] pole = new int[20]; a přitom nejdelší sekvence má 28 prvků, takže ti dojde k přetečení! Zvyš to aspoň na 30, ať je tam nějaká rezerva.
Nemělo by to =! být spíš != jako v Céčku? Proměnná pocet udává aktuální počet prvků v poli, tedy délku sekvence. Vrací jí právě ta metoda která řadu vypočítává a do pole zapisuje.
Cyklus výpočtu a vložení se opakuje dokud není stejná hodnota nalezená v poli, mohl bys to udělat přímo ve smyčce přes nějaký flag, ale zase by to bylo minimálně dvakrát tak dlouhé a nepřehledné...

To System.out.println(pole.length + " " + Arrays.toString(pole)); vypíše nejdřív velikost pole a pak jeho obsah? V tom případě by pole.length mělo obsahovat to samé co proměnná pocet.
Ale pozor, je v ní skutečně počet vložených prvků a nebo deklarovaná velikost pole?! To bys mohl mít v poli jen jedno nebo dvě čísla, ale vypisovalo by se ti úplně celé s hromadou nul na konci!
Tohle je potřeba ověřit.

Seřazení mám podobně, jen porovnávám nižší buňku s ukazatelem, ty vyšší.
"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 » 03 pro 2011 23:07

Ne, pole.length je sřejmě jen deklarovaná délka pole. Vím, když jsem to kopíroval, zapoměl jsem to tu změnit ale u sebe mám už 28. Ovšem nevím ale u tebe mi to v tom kódu nechce vzít ten Arrays.toString ale vůbec nevím proč. Můžu tam ty hranaté závorky vypsat ručně ale na začátku bude mezera, kterou tam nechci. Jinak pro vypsání délky pole ve tvém případě je na snadě využít proměnnou pocet. Ta vypíše délku pole. A případné vstupy budou jen dva. Spuštění s parametrem a bez něj...

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 08:17

Takže spuštění takhle?
1. program 23 - tím se zpracuje sekvence z čísla 23,
2. program - požádá o název souboru a z něj načte a postupně zpracuje všechna čísla.

To se dá jednoduše rozhodnout načtením String[] args uvedeného v hlavičce main(), jen musíš znát jeho formát.
Tím pádem bude nejvýhodnější veškerou dosavadní činnost z main() odsunout do metody, a v main() mít jen větvení, které buď zpracuje jedno číslo nebo otevře soubor, a v cyklu bude zpracovávat čísla z něj. Asi takhle bych to udělal já:

Kód: Vybrat vše

if (args.lenght>0)
   {
   x=převod(args);
   zpracuj(x);
   }
else
   {
   nazevSouboru=scan(stream);
   vstup=otevři(nazevSouboru);
   while ((x=scan(vstup))!=EOF)
         zpracuj(x);
   zavři(vstup);
   }
A k tomu metoda zpracuj:

Kód: Vybrat vše

public static void zpracuj(int cislo)
       {
       pocet=naplnit(cislo,pole);
       vypsat(pole,pocet);
       seradit(pole,pocet);
       vypsat(pole,pocet);
       }

To pole.lenght by tedy se dalo při vytváření sekvence přidat jako hlídání vrcholu, aby nedošlo k přetečení.
Arrays.toString si vyzkouším.

S poli a ukazateli se dá užít spousta zábavy, tak pro zasmání (a výstrahu) jeden fórek z Céčka.
Máš deklarované pole a několik proměnných:
int pole[10],x,y,z;
V programu provedeš omylem přiřazení:
pole[11]=12345;
Víš co jsi právě udělal? Zapsal jsi hodnotu 12345 do proměnné y!
To je jeden z důvodů proč by se ve zdrojovém kódu NIKDY neměla objevit napevno zadaná čísla (kromě 0 a výjimečně 1), ale vždy jen konstanty a symboly definované ve zvláštním bloku na začátku programu nebo aspoň třídy.
:listen:





--- Doplnění předchozího příspěvku (04 Pro 2011 12:56) ---

Tak to Arrays.toString fakt nefunguje, ale dost podivně, vyhazuje to výjimku v úplně jiné metodě než je umístěné. Jestli máš chuť to dva dny hledat v dokumentaci, můžeš, ale osobně bych na to hodil šišku a udělal si to sám:

Kód: Vybrat vše

public static void vypsat(int[] pole,int pocet)
       {
       int i;
 
       System.out.print(pocet+" [");
       for (i=0;i<pocet;++i)
           System.out.print((i>0?" ":"")+pole[i]);
       System.out.println("]");
       }
Tu první mezeru u nultého prvku pole není problém ohackovat pomocí ternárního výrazu, od toho v tom jazyce jsou: (i>0?" ":"")

Kód: Vybrat vše

3 [21 45 67]
V tom Arrays.toString to stejně mají udělané nějak podobně.

Navíc to bere počet prvků z toho pole.lenght, takže by ti to vypsalo tohle:

Kód: Vybrat vše

[21 45 67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
"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 15:11

Aha, takže se omlouvám, bude to ještě trošku jinak. Možnosti vstupu budou tedy dva:

1) Bez zadání parametru.
Program bude spuštěn klasicky třeba přez příkazovou řádku příkazem java nazev_programu. Vyžádá si vstupní hodnotu, vypočítá posloupnost, seřadí ji a pak je vypíše na obrazovku a vykreslí graf.

2) Se zadáním parametru.
Program bude spuštěn příkazem java nazev_programu < vstup.txt > vystup.txt. Tady si program vezme vstupní hodnoty ze souboru vstup.txt a pro každé dvouciferné číslo vypíše do souboru vystup.txt dvě posloupnosti, jednu neseřazenou a jednu seřazenou. Tyto dvě posloupnosti budou vždy odděleny prázdným řádkem. V tomto případě zde program končí a už nedělá nic.

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 15:19

Takže tím se to dost podstatně zjednodušuje, < a > jsou přesměrování vstupu a výstupu které obstarává operační systém, takže program akorát musí umět načíst několik čísel ze standardního vstupu a poznat že už je konec... To znamená jen jednu smyčku navíc, akorát nevím jestli se v Javě dá jednoduše testovat EOF nebo je třeba odchytávat výjimku.
Teď je jen otázka jak program pozná co se děje v operačním systému někde úplně jinde :-D



Aktuální sdělení, podařilo se mi aspoň provizorně nainstalovat překladač, nevím jestli kompletní, na tenhle program to zatím stačí. Ale než jsem přišel na to jak spustit program.class! Tos' mi nemohl říct že nemám zadávat název souboru, ale název třídy co je v něm, a navíc bez toho class? :lol:

A zajímavé je, že Arrays.toString funguje bez problému:

Kód: Vybrat vše

[21, 45, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
"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 19:56

Až na ty nuly... Teď vůbec nevím o čem mluvíš :D Jako, když použiješ příkazovou řádku tak program přeložíš příkazem javac nazev_programu.java, vytvoří se soubor class a ten spustíš příkazem java nazev_programu. A pokud vím, název souboru, v mém případě fiktivní nazev_programu je stejný jako samotná třída programu takže je to snad jedno ne? U toho spuštění .class souboru by mělo údajně stačit, když napíšeš třeba jen java nazev_pr a pokud bude ve složce pouze jeden soubor obsahující tuto část, tak se spustí. Ale ozkoušené to nemám. Já si program spouštím rovnou tam, kde ho i píšu. Používání příkazové řádky mi už přijde trochu barbarské... :lol:

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 20:09

Jo, to už teď také vím, ale chvíli mi trvalo než jsem se tím prokousal :lol:

Příkazová řádka je nejmocnější nástroj který v počítači máš, bohužel cmd ve Windows je ubohý crippleware proti shellu v Unixu a Linuxu. A jak bys chtěl provést tohle pomocí okének a myši?
java nazev_programu < vstup.txt > vystup.txt

Ty nuly jsou dané tím, že to pole má nastavenou pevnou velikost. Pokud bys chtěl používat tohle, musel bys pole při každém zápisu přealokovat, někde jsem zahlédl jak se to dělá, ale do toho mám ještě dost daleko. takže bych dal přednost tomu mému výpisu ve vlastní metodě. Výsledek je naprosto stejný:

Kód: Vybrat vše

$ bin/javac sekvence.java;bin/java sekvence
Zadej dvouciferné číslo: 41
18 [41, 17, 29, 85, 73, 54, 30, 91, 83, 69, 48, 24, 58, 34, 12, 15, 23, 53]
18 [12, 15, 17, 23, 24, 29, 30, 34, 41, 48, 53, 54, 58, 69, 73, 83, 85, 91]

Tady máš upravenou metodu co vypisuje i ty čárky, musel jsem tam přidat jeden bajt :wink:

Kód: Vybrat vše

public static void vypsat(int[] pole,int pocet)
       {
       int i;
 
       System.out.print(pocet+" [");
       for (i=0;i<pocet;++i)
           System.out.print((i>0?", ":"")+pole[i]);
       System.out.println("]");
       }

Jak teda s těmi vstupy? Nenašel jsem žádný způsob jak program zjistí odkud načítá, pro něj je to stále jeden a tentýž stream, a do args se to také nepromítne, protože se to zpracuje v operačním systému ještě dřív, než se něco předá programu.
Jediná možnost je smyčka, která bude načítat až do EOF, který budeš muset zadat ručně z klávesnice. Ve Windowsu je to Ctrl+Z, u mě Ctrl+D.
"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 20:22

No jistě, že bych pro vstup a výstup do souboru musel použít příkazovou řádku ale když ten program píšeš normálně pro vstup z klávesnice, je mnohem rychlejší ho rovnou spouštět tam. Ani ho nemusím překládat. Ten výpis nechám tak jak je, učel to má stejný tak proč to řešit dál... S tim bajtem jsem to nepochopil :lol:

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 20:29

Původní verze vypisovala jen mezeru:
(i>0?" ":"")
Nová verze vypisuje čárku a mezeru:
(i>0?", ":"")
Rozdíl jeden bajt :lol:
"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 20:52

Jo vidíš, toho jsem si ani nevšimnul. Tak, co se toho vstupu a výstupu týče, zatím vím jen to, že na začátku musí být import java.io.*;. :D Ještě bych to tak dal dokupy pro samostatný vstup ze souboru ale nakombinovat to pro obojí....

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 21:40

To java.io.* bude dobrá na práci se soubory, ale pokud použiješ ten příkaz co jsi mi psal, tak je to k ničemu. To totiž funguje tak, že OS obsah toho prvního souboru vypíše na standardní vstup a program si ho načítá úplně stejně jako z klávesnice, aniž by se o tom mohl nějak dozvědět.
Jsi si jistý že to < a > tam opravdu má být? S tím to totiž proběhne takhle:

Kód: Vybrat vše

$ bin/javac sekvence.java;bin/java sekvence < vstup.txt
Zadej dvouciferné číslo: 19 [63, 40, 17, 29, 85, 73, 54, 30, 91, 83, 69, 48, 24, 58, 34, 12, 15, 23, 53]
19 [12, 15, 17, 23, 24, 29, 30, 34, 40, 48, 53, 54, 58, 63, 69, 73, 83, 85, 91]
"Král Lávra má dlouhé oslí uši, král je ušatec!

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


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 6 hostů