Java programozás - Szoftverfejlesztés fórum

üzenetek

hozzászólások


andriscs
(aktív tag)

Hi!

Láttam, hogy nincs igazi Java topic, ezért gondoltam, én nyitok egyet, jó lenne, ha itt kérdezgetnénk Java-s dolgokat. Szóval, hogy megnyissam a sort, lenne is egy kérdésem. Szóval van egy egyszerű Java alkalmazás, é szeretnék beolvasni az inputról. Van két {B}int tpusú változó, és {B}readCharacter(){/B} függvénnyel próbáltam beolvasni, de nem igazán ismeri a függvényt a fordító. Mit kell importálni, hogy működjön?

Kb. ilyen a progi:
class xy{
public static void main(String []args)
{
int x;
int y;
x=readCharacter();
y=readCharacter();
}
}

Ha van ötlet, írjatok!!


Szenty
(tag)

Hali!

Ezt máshogy lehet csak megoldani.
Most már túl álmos vagyok a válaszhoz, de addig is, amíg fel nem ébredek, töltsd le az alábbi filet:
ftp://ftp.gdf.hu/Public/Java/javaprog.zip

Ebben lesz egy Extra nevű csomag, abban egy Console nevű osztály. Abban van számbeolvasó rutin (mert amúgy csak stringbe lehetne).

Alszok...
Szenty

[Szerkesztve]


andriscs
(aktív tag)

Hi!

Nekem jó az is, ha String-be olvassa be, mert utána átalakítom parseInt-el, de a readCharacter sehogy sem működik. String-gel hogy kell?


WuDu
(tag)

Input.readInt();


andriscs
(aktív tag)

Hi!

És ezzel most mit kezdjek? Mi az input? Mert nem igazán ismer ilyen függvényket, bármit import-álok be. ha xyválozó.readInt() van, akkor nem lehet hívni, ha csak magában readInt() van, az úgy nem elérhető, ha osztályszinten csinálom, az se jó. Szóval ez így nem működik. Kicsit bőveb help?


Alvin_ti4200
(félisten)
Blog

Az említett Console osztály segítségével a Console.ReadInt() paranccsal tudod beolvasni őket, ha ki akarsz írni vmit a beolvasás elé, pl., hogy ''írj be egy számot'', akkor x=Console.ReadInt(''Írj be egy számot''). Persze ha jól emléxem:)


faster
(nagyúr)

Console.ReadInt() ? A Console nem .NET osztály?

Mod: Ja nem, van Java is. Az Console.readInt();

[Szerkesztve]


Alvin_ti4200
(félisten)
Blog

Nem, arról az osztályról van szó, amiről a kolléga fentebb beszélt.


faster
(nagyúr)

Ez valami extra osztály, nem a Java része?


andriscs
(aktív tag)

Hi!

Oké, de akkor ebből a Console osztályból kellene származtatnom az eredeti osztályt, hogy elérjem a Console class metódusait. De ez a Console nem ''gyári'' Java osztály, hiába írnám be, hogy class xy extends Console. Szóval vmi eredeti Sun inputolvasás nincs? :)

[Szerkesztve]


faster
(nagyúr)

Van inputolvasás, anélkül nehéz lenne bármit is csinálni. de már olyan rég foglalkoztam Java-val, alig emlékszem.
Nem tudom, talán a System.in InputStream-nek kéne a tagfüggvényeit megnézni.


andriscs
(aktív tag)

Hi!

Megnéztem, létezik olyan, hogy System.in.read(), és elvileg van olyan verziója, ami int-et kér argumentumnak, de miután megkapja, gondol egyet, és kér még egy int-et, meg egy byte-ot. Pedig van olyan read aminek 1 int argumentum kell. Szerintem be van b*szv* a fordítóm. :)


andriscs
(aktív tag)

Hi!

De lehet, hogy én is be vagyok :) Késő van már, nem tudom, miért ilyenkor programozok. Szóval melyik a jó verzió(amúgy egyik sem működik):
int first=System.in.read();
vagy:
System.in.read(first);
?


faster
(nagyúr)

Egy példa:

Bővebben: link

Ebből már bizonyára tudsz parseInt-tel számot csinálni.

Ezért nem emlékeztem erre, mert bonyolult. BufferedReader, InputStreamReader, readLine(); sok ez egyszerre. :DD

[Szerkesztve]


Alvin_ti4200
(félisten)
Blog

nem a Java része


Alvin_ti4200
(félisten)
Blog

Csinálsz egy Console nevű osztályt és belemásolod a letöltött Console osztály minden sorát, a package extra sort pedig kitörlöd. Így már elvileg tudsz majd hivatkozni rá.


faster
(nagyúr)

Mondom, hogy eredetileg .NET osztály. :DD


andriscs
(aktív tag)

Hi!

Ez így oké, de majd mikor ZH-t írok Java-ból, akkor mit írjak a lapra? Hogy tessék tanár úr, itt egy link, ezen ellenőrizheti, hogy az általam használt Console osztály létezik, csak nem jegyeztem meg, de amúgy müködik. :) Megpróbálom ezt a BufferedInputStream.In.Read.Int.Load.Integer.ReadLine.DoWork.Already.Java.Very.Easy.ToUse.This.Input.Read() függvényt, talán működik :D


andriscs
(aktív tag)

Hi!

Működik a dolog, csak csináltam auto-formázást, és a csodálatos progi átrakott egy {-t, így minden a catch alá került, persze, hogy nem futott le. Ez így elég hosszadalmas dolog, de ha nincs ló, jó a szamár is (én is megnéztem C#-ban van olyan Console-os readInt() ). :)

[Szerkesztve]


andriscs
(aktív tag)

HI!

Címkézett vezérlésnél mi a teendő? Elvileg csináltam egy ide: cimkét, majd használtam a break ide parancsot, de hibát jelez, hogy a cimke hiányik. Hova kell rakni?


andriscs
(aktív tag)

Hi!

Megvan a hiba, hiába, minden ember a saját példáján okul. :)


andriscs
(aktív tag)

Sziasztok!

Új problémával állok elő. Szóval van egy 2 dimenziós tömb, amiben azt vizsgálom, hogy egy adott elemtől indulva az elemet körbevevú 8 irányban találok-e még legalább 3 ugyanolyan elemet (amőba jellegű a dolog). A probléma azt, hogy a tömb belsejében tökéletesen működik a dolog, de a széleken mintha összeadná az összes találatot. Emiatt megcsináltam úgy, hogy minden irányban új változó tárolja a találatot, de így sem működik. Nincs ötletem, hogy mi a hiba. Természtesen a tömböknél figyelni kell, hogy ne lépje túl a tömb határait. Bemásolom ide az adott függvény kódját, hátha valaki rátalála hibára:

public boolean searchEngine() //need to check
{
int clone1=0;
int clone2=0;
int clone3=0;
int clone4=0;
int clone5=0;
int clone6=0;
int clone7=0;
int clone8=0;

for(row=0;row<size;row++)
{
for(col=0;col<size;col++)
{
for(int count=1;row+count<game.length;count++){
if (game[row+count][col].equals(game[row][col])) {
clone1++;
if (clone1>=3) return true;}
else clone1=0;
}
for(int count=1;row-count>-1;count++)
if (game[row-count][col].equals(game[row][col])) {clone2++;
if (clone2>=3) return true;}
else clone2=0;
for(int count=1;col+count<game.length;count++)
if (game[row][col+count].equals(game[row][col])) {clone3++;
if (clone3>=3) return true;}
else clone3=0;
for(int count=1;col-count>-1;count++)
if (game[row][col-count].equals(game[row][col])) {
clone4++;
if (clone4>=3) return true;}
else clone4=0;
for(int count=1;(row+count<game.length) && (col+count<game.length);count++)
if (game[row+count][col+count].equals(game[row][col])) {clone5++;
if (clone5>=3) return true;}
else clone5=0;
for(int count=1;(row-count>-1) && (col-count>-1);count++)
if (game[row-count][col-count].equals(game[row][col])) {
clone6++;
if (clone6>=3) return true;}
else clone6=0;
for(int count=1;(row+count<game.length)&& (col-count>-1);count++)
if (game[row+count][col-count].equals(game[row][col])) {clone7++;
if (clone7>=3) return true;}
else clone7=0;
for(int count=1;(row-count>-1) && (col+count<game.length) ;count++)
if (game[row-count][col+count].equals(game[row][col])) {clone8++;
if (clone8>=3) return true;}
else clone8=0;
}
}
return false;
}

Akinek van ötlete, ne kíméljen!


Miracle
(senior tag)

mondjuk azt nem vágom, hogy mit akar az a hosszú függvény amit leírtál, mert a kommenteknél csak a whitespacekkel bántál fukarabbul(jó, ez lehet, hogy a PH), nomeg hajnali 2 van... de abból amit mondtál talán segíthet, hogy ha n*m-es a meződ, akkor (n+2)*(m+2) méretű tömbben tárolod, aminek a szélső soraiban és oszlopaiban nincsen csak 0 vagy az, amivel jelölöd, hogy nincs ott semmi, és okosan írod meg a hozzáférő-függvényeket, úgy, hogy a felhasználó ebből semmit se lásson, tobábbra is n*m-esként kell paraméterezni. azaz amikor kap egy n*mes paramétert, hozzáad egyet egyet.
mondjuk nyilván van elegéns megoldás is a problémára, de ahoz egy szépen igazított kód kellene ide bekommentelve.


andriscs
(aktív tag)

Hi!

Azt hiszem, hogy egy ilyen, viszonylag egyszerű kódot nem kell agyonkommentezni. A lényege az, hogy minden egyes elemtől indulva végigmegy az irányokon. amit mondazs, azt más is ajánlotta már, de nem tudom, hogy miért jobb az, ah a for ciklusok feltételében ez van, hogy a következő elem 0 (ami a keretező tömbelemeket jelentené), vagy hogy ne lépje túl a tömb htaárait. Ennek így is működnie kellene. Amit te ajánlasz, az annyiban változtatná meg a kódot, hogy for(count=1;game[row+count][col]!=''0'';count++). De ez pontosan azt csinálná, mint hogy elér az eredeti tömb széléhez, ami az én feltételeimben van.


andriscs
(aktív tag)

Hi!

Úgy látom, hogy tényleg el kell megyaráznom, hogy hogyan működik a függvény. Szóval a külső 'for' ciklus a tömb oszlopain lépdes egyesével, az abba beágyazott 'for' pedig a sorokon lépked, magyarul a két 'for' bejárja a 2D-s hálót. A kis 'for' ciklusok az adott elem (game[row][col]) értékét hasonlítják össze egy bizonyos irányban a többi tömbelemmel (tehát mikor pl- game[row+count][col] van, akkor egy soron megy végig addig, amíg el nem éri a tömb szélét). Minden irányban más változó tárolja az azonos elemek számát. Mikor ez a változó elérte a 3-at, akkor van 4 egyforma elem ugyanabban az irányban. Ilyenkor lesz a return true. Egyébként pedig false. Szóval egy elég primitív algoritmus. Csak ezt nem értem, hogy miért nem működik a széleken. Ha valaki rájön a megoldásra, szóljon!


andriscs
(aktív tag)

Hi!

Látom, hogy senkit sem mozgat az előbbi probléma, most viszont van egy újabb. betöltöttem egy képet így: Image img=Toolkit.getDefaultToolkit().getImage(''bg.jpg''); Ezután egy a metódusban meghívtam ezt: g.drawImage(img,0,0,Color.RED,this);, ennek ellenére csak egy fehér képet kapok. Mi a hiba?


andriscs
(aktív tag)

Hi!

Arra már rájöttem, hogy miért fehér a háttér, de a képet még mindig nem tölti be. Van ötletetek?

[Szerkesztve]


andriscs
(aktív tag)

Hi!

Azt hiszem, hogy megtaláltam a 2000-es év 101. matematikai problémáját, ugyanis a kód szintaktikailag jó, és véleményem szerint szemantikailag is, csak éppen nem úgy működik, ahogy kellene, de ne, jövök rá, hogy mi okozza az anomáliát. Ha valaki tudna segíteni, annak nagyon örülnék, mindegy, hogy milyen nyelven próbálja ki, nekem még pszeudo-kód is jó, csak valaki nézzen már rá, hogy mi a hiba! Arra már rájöttem, hogy akkor is talál megoldást, ha egy irányban elszórva vannak azonos elemek. De ez még nem magyarázza meg, hogy a derékszögű 4-es sort miért találja meg. Légyszi segítsetek!


Kr1xX
(csendes tag)

import java.awt.*;
import java.applet.Applet;

public class Valami extends Applet {
Image background;

public void init() {
background=getImage(getCodeBase(), ''egyKep.gif'');
}

public void paint(Graphics g) {
g.drawImage(background, 0, 0, this);
}
}

Én ezt ha lefordítom, akkor kirajzolja a képement. Próbáld meg lefuttatni te is ezt először, aztán módosítsd kedvedre. Ja értelem szerűen az ''egyKep.gif''-nek léteznie kell abban a könyvárban, ahol a class is van!


Kr1xX
(csendes tag)

Nekem is van egy kérdésem. Írtam egy Snake apletet, de annyi bajom van vele, hogy ahhoz, hogy a kígyó az mozogjon, ahhoz animálno kell, tehát azadott területet minig repaint()-elnem kell mozgásonként. Ettől viszont néha villog a kép. Láttam már viszont olyan megoldásokat is, ahol ezt megoldották valahogy. Tud e valaki segíteni, mi ennek a titka?


andriscs
(aktív tag)

Hi!

Segítek, ha te is nekem :) Na jó, ilyenkor kell double buffering-et használni, hogy ne villogjon. A neten rengeteg cucc van róla, lényegében Foreground és Background -okat kell váltogatni (ha jól emlékszem)


Kr1xX
(csendes tag)

Thx, esetlen ha tudsz dobj egy linet is ;) ! Egyébként ha tudok persze segítek!


andriscs
(aktív tag)

Hi!

Itt egy link, remélem, nem gond, hogy angol:
Bővebben: link
Az én problémámra nem talál senki megoldást? Már el tudom érni, hogy 1 irányban max 3 egységig keressen, de még mindig talál derékszögű dolgokat. Help me!


andriscs
(aktív tag)

Hi!

Kipróbáltam, de így nem működik. A getImage() metódus csak egy paraméterrel működik, nem lehet egyszerre getCodeBase() és képnév is a paramétereknél. Tuti így működött neked?


Kr1xX
(csendes tag)

Kössz a linket! Lehet nem értem a problémádat... ha én képeket akarok megjeleníteni mindig így csinálom, igen nekem így működik. Egykét munkám eddig: http://sztyan.uw.hu/Sztyan/java/java.htm


Kr1xX
(csendes tag)

Uhh, volna még egy kérdésem: játékhoz toplistát szeretnék írni. Ehhez pedig azt kellene egoldani, hogy nevet és eredményt kiírni egy fájlba. Ezzel nincs is gond, csupán annyi,hogy apletben nem sikerült megoldanom. Be tudok olvasni TextField-ből egy stringet me minden,de nem tudom, hogy lehetne kiírni egy fájlba (alkalmazásnál tökéetesen működik, de applenél nem megy).


andriscs
(aktív tag)

Hi!

Az ilyen file-kezelésről nem nagyon tudok még dologokat, de asszem itt is valami FileInputStream kell, meg adatcsatornák, ilyesmi. Szerintem nézz körül a Sun honlapján.
Nem tudom, hogy miért nem működik, de kiírja, hogy a paraméterlistában vessző helyett ) kell. Szóval nem megy. Megnézem, hátha találok mást is. Egyelőre a háttér a legkisebb bajom. Fontosabb a hégyzethálóm problémája, amit sehogy se lehet megoldani. Azt hiszem, ez lesz a diplomamunkám: Univerzális hálóprobléma, avagy egy újabb NP probléma, amelyik megoldásra vár. :)


Kr1xX
(csendes tag)

Mert mit kellene a négyzethálóddal kezdeni?


andriscs
(aktív tag)

Hi!

Olvasd el a #22 üzenetet, ott leírtam. De ddig még senki nem tudta megoldani.

[Szerkesztve]


Kr1xX
(csendes tag)

Csak egy őszinte megjegyzés, aztán elkezdek kondolozni is. Így végigolvasva a forráskódod, csodálom, hogy ezt a sok feltételt még a géped felfogja, és lefordítja. Persze nem cseszegetni akarlek, mert már velem is előfordult, hogy nagyon nem jöttek össze a dolgok, aztán jöttek a feltételek egymás után, hogy szűrjem vele a hibákat, kivételeket...DE az kizárt, hogy ezt más is felfogja rajtad kívól, feltéve ha te még érted. Ja meg olyan tömör egy kicsit. Azt javaslom, inkább fogalmazd meg a problémádat pontosabban, azzzal talán rövidebb átláthatóbb és frappánsabb kódokat kaphatsz cserébe.


andriscs
(aktív tag)

Hi!

Kicsit átírtam a kódot, hogy világosabb legyen, tettem bele megjegyzéseket. Természtesen értem, ogy mit csinála kód, a látszólagos kuszasága ellenére eléggé szimpla kód, csak sokat ismétlődik, apróbb változásokkal. Szóval a koncepció az, hogy minden kattintás után a függvény végigfut a tömbelemeken, ls megvizsgálja, hogy van-e valamelyik irányban 4 egyforma jel. A lényeg (tehát a keresés) mindenhol ugyanaz, csak az irány változik, szóval lényegében 8x fut le ugyanaz a kód, nagyon minimális eltéréssel. Ami a for ciklusok feltételeit illeti, az azért annyira bonyolult, mert ugye nem léphetek túl a tömb határain, tehát pl. az 1,1 elemtől nem tudok 4-et balra menni, mert az már kilépne a tömbből. Tehát biztonsági intézkedések miatt van a hosszfigyelés. Ha még valami nem tiszta, akkor magyarázok, de itt az új kód (ez már csak max. 4 egyforma elemet talál):

public boolean searchEngine() //need to check
{

for(col=0;col<size;col++) //oszlopokon lépked
{
for(row=0;row<size;row++) //sorokon lépked
{
for(int count=1;row+count<game.length && count<4;count++) //soron jobbra
{ //ameddig nem éri
if (game[row+count][col]==(game[row][col])) //el a tömb szélét v. 4 jelet
{
clone1++; //ha van egyforma, növeli
if (clone1==3) return true; //min. 3 kell, hogy összesen 4 legyen
}
else clone1=0; //ha nincs egyforma, nullázza a számlálót
}
for(int count=1;row-count>-1 && count<4;count++){ //elemtől balra megy
if (game[row-count][col]==(game[row][col])) //stb...
{
clone2++;
if (clone2==3) return true;
}
else clone2=0;
}
for(int count=1;col+count<game.length && count<4;count++)
{
if (game[row][col+count]==(game[row][col]))
{
clone3++;
if (clone3==3) return true;
}
else clone3=0;
}
for(int count=1;col-count>-1 && count<4;count++)
{
if (game[row][col-count]==(game[row][col])) {
clone4++;
if (clone4==3) return true;}
else clone4=0;
}
for(int count=1;(row+count<game.length) && (col+count<game.length) && count<4;count++)
{
if (game[row+count][col+count]==(game[row][col]))
{
clone5++;
if (clone5==3) return true;}
else clone5=0;
}
for(int count=1;(row-count>-1) && (col-count>-1) && count<4;count++)
{
if (game[row-count][col-count]==(game[row][col])) {
clone6++;
if (clone6==3) return true;}
else clone6=0;
}
for(int count=1;(row+count<game.length)&& (col-count>-1) && count<4;count++)
{
if (game[row+count][col-count]==(game[row][col]))
{
clone7++;
if (clone7==3) return true;}
else clone7=0;
}
for(int count=1;(row-count>-1) && (col+count<game.length) && count<4;count++)
{
if (game[row-count][col+count]==(game[row][col]))
{
clone8++;
if (clone8==3) return true;}
else clone8=0;
}
}
}

return false;
}


Kr1xX
(csendes tag)

http://sztyan.uw.hu/Andris.rar


Kr1xX
(csendes tag)

Annyi hozzáfűznivalóm van, hogy tiszta lappal indultam, mert nekem úgy könnyebb. Egy 10x10-es integer mátrixban keres egymás mellett 4 ugyan olyan számot, és ha talál, akkor azt írja ki a konzolra, hogy talált, egyébként, hogy nem. Még annyi megjegyzés, hogy felesleges pl vízszintnél jobbról + balról viszgálgatni, mert ha balról jobbra haladva találunk egymás mellet 4 ugyanolyan értéket, akkor nyílván jobbról balrahaladva is :). Ugyanez igaz a többi irányra. Tesztelgessed, állítsd át a mátrix értékeit kölönböző helyeket azonos értékűre, és kerestesd meg vele. Nekem műxött. Próbáld értelmezni a kódot, hátha tudtam segíteni...


andriscs
(aktív tag)

Hi!

Csak most olvastam, hogy válaszoltál, ezért lehet, hogy így éjjel nem látom át tisztán, de nagyon köszönöm a segítséget, örülök, hogy vannak ilyen segítőkész emberek. Remélem, hogy nálam is működni fog!


andriscs
(aktív tag)

Hi!

Nem tudtam megállni, és teszteltem, úgy néz ki működik. Ahogy átnéztem a kódodat, rájöttem, hogy az enyém túlságosan körülményes, a tied viszont lényegretörő. Az egyik tanáromnak is írtam már, aki azt ajánlotta, hogy vigyázzak, mivel én String tömben tárolom a dolgokat, és a sima == csak referencia, inkább használjak equals() tagfüggvényt, mert az ő szavaival élve a ''programom egy időzített bomba''. Remélem, hogy azzal már rendesen működni fog, most már csak egy alap mesterséges intelligencia kell bele, aztán mehet a dolog.
Apró megjegyzés, hogy rájöttem (mivel ma tanultuk :) ), hogy hogyan lehet képet betölteni (kicsit eltér az Applet-ek képbetöltésétől): Szóval valahogy így kell:
Image img=Toolkit.getDefaultToolkit().getImage(''kep.jpg'');
utána pedig paint()-ben g.drawImage(img,0,0,this). Apró szépséghiba, hogy a kép nem jelenik meg. Vajon miért nem? Add metódus nincs képekhez, requestFocus() nem kell neki, tehát elvileg már látnom kellene a képet. De mégsem látok semmit. Ötlet?


andriscs
(aktív tag)

Hi!

Nem akarom elvenni a kedved, hogy újra átnézd, de ezt is be lehet csapni, mert sikerült olyasmiket csinálnom, aminél elfogadta megoldásnak. Pl itt nincs sehol 4 hosszú sor, mégis nyert az 'O' játékos:


andriscs
(aktív tag)

Hi!

Most megtettem azt, hogy String helyett int tömböt használok, most viszont nem mindig találja meg az átlókat a program. Érdekes...


andriscs
(aktív tag)

Hi!

Rájöttem, hogy miért nem találta meg az átlókat. Azért, mert a lefele balról jobbra függvény csak a mátrix felső háromszögét járja be, az alsót nem, és ugyanez igaz a másik irányra is. Szóval ezt kellene még megoldani. De az lehet, hogy már holnapra marad.:)


Kr1xX
(csendes tag)

Fúha. Énis éjszaka írtam, szóval biztosan nem hibátlana szoftver, én is inkább kezdő lökésnek szántam. Most per pillanat nincs indőm vele foglalkozni, de majd még átnézem a kódomat. Ha nem sikerül megoldanod a problémát csak szólj... addig is gondolkozom a megodáson, de ezt igazából csak úgy lehetne, ha írom a progit közben. ja egy kis ízelítés a progijaimból ha érdekel: http:sztyan.uw.hu ott van egy menüpont legalul, hogy Java progik amiket én írtam. Nézd meg. AMúgy én sem vagyok még benne a Javaban teljesen, Szeptemner óta tanuklom a nyelvet. Sok sikert!


Fko
(tag)

Sziasztok! Ha Java-val kapcsolatos kérdésetek van, gyertek el a most induló Bővebben: link oldalra és tegyétek fel ott is a kérdést.

üzenetek