- sziku69: Fűzzük össze a szavakat :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Argos: Szeretem az ecetfát
- Luck Dragon: Asszociációs játék. :)
- sziku69: Szólánc.
- Magga: PLEX: multimédia az egész lakásban
- eBay-es kütyük kis pénzért
- NASsoljunk: ZyXEL NSA-310 és az FFP
- Elektromos rásegítésű kerékpárok
- #95904256: Socket370 / 3DMark2001
-
LOGOUT
Új hozzászólás Aktív témák
-
pmonitor
aktív tag
válasz
janos1988 #16769 üzenetére
Sosem értettem a programozókat. Bármekkora tárhely áll rendelkezésre, azt hiszik, hogy azt mind meg kell tölteni... Egyébként meg sztem. nagyon sok ismétlődő függvény/metódus lehet azokban a hatalmas kódokban.
Miközben meg pl. én(egy 1-szerű hobbi programozgató), tudok olyan kódot írni a "beépített" függvényeivel szemben, ami legfeljebb fele annyi idő alatt lefut, mint a beépített. Éppen most készítem ezt a dolgot(még nincs teljesen kész). De az látszik, hogy a stringet számmá konvertáló beépített függvények C-ben ~19, míg C#-ban ~68 sec. alatt futnak le, miközben könnyedén lehet ~10 sec. körüli futásidőt elérni ugyanarra a feladatra(inputra).
Dehát ez az én külön bejáratú véleményem... -
vz12
tag
válasz
janos1988 #14181 üzenetére
Köszi.
Örülök, ha mostanra már magától értetődő, van néhány "apróság" amiről nem is beszéltünk, pedig kell a hibátlan működéshez, de nyilván felfigyeltél rá és érted.
Egyébként lehet, hogy a Te programod gyorsabb az enyémnél (de ez ennél a feladatnál nem igazán számít), viszont kacifántosabb (bonyolultabb) is, ami viszont nem előny.A nagy kapkodásban nálam bent maradt egy "var i,pos1:integer;", ami ugyan hibát nem okoz, de elpazaroltam 2 byte-ot feleslegesen a memóriából.
A "var i,pos1:byte;" jobb lett volna.
A stringek a "normál" pascal-ban max. 255 hosszúak lehetnek, amihez elég a "byte" típus.Mostanában már nemigen pascal-ozok, de régebben sok példa volt rá.
A tömb 0-záson annyit pontosítanék, hogy string típusú tömb esetén természetesen nem 0, hanem "üres string" van (ezt így is csináltam, csak félrebeszéltem), a többi stimel, tehát a TP 7.0 előtt ez is probléma volt, azóta valószínűleg az üres string a kezdőérték. De ha én beállítom az üres stringet kezdőértéknek, akkor tuti hogy az üres lesz, javaslom ezt mindenkinek.
-
vz12
tag
válasz
janos1988 #14178 üzenetére
A "+1", "-1' nem fétis, hanem fontos eleme a működésnek, nevezhetjük trükknek, de igazából ez szükségszerű. Ha belegondolsz és megérted a miértjét, szerintem el fogod ezt ismerni.
A programom ugye alapvetően nem karakterenként, hanem szavanként szeleteli le az input szöveget, pontosabban szóköztől szóközig. Minden lépésben megkeresi a következő szóközt, viszont a megtalált szónak ez a szóköz már nem része, ezért van a "-1". A "szeletelésnél" (delete) viszont nem csak tisztán a szót, hanem a megtalált szóközt is le kell szedni a szöveg elejéről, ezért van a "+1".
Ezt nem úgy kell nézni, hogy 1-1 = 0 és ennyi, nem. A folyamat (ciklusmag) végén 1-1 = 0, ez rendben van, de ez nem azt jelenti, hogy működés közben a "mikrokörnyezetben" ez végig így van.Csak a végén.
Közel kell menni a részletekhez hogy megértsük a dolgokat, a működést nem (mindig) lehet "távolról" nézni, vagy átlagolni, ahol már összemosódnak a részletek. Pl. ha fociban egy játékos egy meccsen rúgott 2 db gólt tizenegyesből, az ugyanaz, mint ha az egyiket a kapu mellé rúgta balról 1 méterrel, a másikat a kapu mellé rúgta jobbról 1 méterrel, vagyis átlagban 2 gólt rúgott a kapu közepébe ... (?)A "tmp" változó a függvényemben a jelen esetben nem szükségszerű, mert az eredeti input szövegre menet közben nincs szükség, de más esetben előfordulhatna hogy szükség van rá, ezért én szeretem így csinálni. De itt, most ez valóban tűnhet feleslegesnek.
A tömböket én mindig nullázom induláskor, régebben ez szükségszerű volt (mert nem lehetett arra számítani, hogy 0-val indulnak), az "újabb" pascal verziókban (TP 7.0-tól kezdve) úgy tudom hogy ez a probléma már nincs meg, ez is csak egy (jó) szokásom. Persze az is lehet hogy nem 0 a tömbelemek kezdeti értéke, akkor mindenképpen inicializálni kell, én ezt inkább rutinszerűvé tettem, ennyi.
A "delete(tmp,1,pos1)" az általam írt szóköz végű inputtal jó (mondjuk rá), de ha nem szóközre végződik (azaz normális esetben) NEM JÓ, úgy kell ahogy én csináltam. Próbáld ki az én programomat olyan input szöveggel, aminek a végén nincsenek szóközök (egy sem). Sőt, a "delete(tmp,1,pos1+1)" sem jó. Meg lehet érteni, hogy miért van ez így, de ezt az olvasóra bízom.
-
janos1988
addikt
válasz
janos1988 #14178 üzenetére
Kisebb sikerélmény, sikerült megoldani a szóközöket.
program szoveg_bontas;
function bontas(s1:string;var pos1:integer):string;
begin
bontas:='';
while (s1[pos1]<>#32) and (pos1<>length(s1)+1) do
begin
bontas:=bontas+s1[pos1];
inc(pos1);
end;
if s1[pos1]=' ' then inc(pos1);
end;
var
s2,s3:string;
pos2,t,i:integer;
tomb:array [1..10] of string;
begin
pos2:=1;
t:=1;
s2:=' Ez megint egy szep hosszu proba mondat.';
repeat
s3:=bontas(s2,pos2);
if s3<>'' then
begin
tomb[t]:=s3;
inc(t);
end;
until pos2>length(s2);
for i:=1 to t do writeln(tomb[i]);
end.
-
vz12
tag
válasz
janos1988 #14175 üzenetére
Én valahogy így csinálnám.
Extra feature: a szóközök száma akár több is lehet a szavak között.
A "+1" és "-1" dolgokra nagyon oda kell figyelni.program szoveg_bontas;
const N=100;
type tomb_type=array[1..N] of string;
var tomb:tomb_type; i,db:byte; s:string;
procedure bontas(s:string; var tomb:tomb_type; var db:byte);
var i,pos1:integer; tmp,szo:string;
begin
tmp:=s;
for i:=1 to N do tomb[i]:='';
db:=0;
while tmp<>'' do begin
pos1:=pos(' ',tmp);
if (pos1>0) then szo:=copy(tmp,1,pos1-1) else szo:=tmp;
if (szo<>'') then begin
db:=db+1;
tomb[db]:=szo;
end;
delete(tmp,1,length(szo)+1);
end;
end;
begin
s:=' Ez egy ronda mondat. ';
bontas(s,tomb,db);
for i:=1 to db do
writeln(tomb[i]);
end. -
janos1988
addikt
válasz
janos1988 #14174 üzenetére
A temps-re nincs is szükség és 2 komment.
program szoveg_bontas;
function bontas(s1:string;var pos1:integer):string;
begin
bontas:='';
while (s1[pos1]<>#32) and (pos1<>length(s1)+1) do //a . lemarad ha nincs +1
begin
bontas:=bontas+s1[pos1];
inc(pos1);
end;
inc(pos1); //szokoz (#32) atugrasa
end;
var
s2:string;
pos2,t,i:integer;
tomb:array [1..10] of string;
begin
pos2:=1;
t:=0;
s2:='Ez megint egy szep hosszu proba mondat.';
repeat
inc(t);
tomb[t]:=bontas(s2,pos2);
until pos2>length(s2);
for i:=1 to t do writeln(tomb[i]);
end.
-
-
janos1988
addikt
válasz
janos1988 #14161 üzenetére
Ez az egész arra kellett, hogy ha egy fájlból beolvasom a sorokat (#10#13) akkor azt szét tudjam bontani és a szeparált adatokat a rekord megfelelő mezőibe bemásolni. De közben rájöttem, hogy ez nem lesz annyira egyszerű.
Addig, oké, hogy szétszedem a sort, de, hogy mondom meg neki, hogy az első szétszedett részt rakja be a rekord első/megfelelő mezőjébe és így tovább... Fejben már vannak tervek, hogy kettészedem a szeparálós algoritmust két függvénybe és a visszatérési értékét fogom megadni a rekord egyes mezőibe, de hogy ez mennyire fog működni a gyakorlatban... De ez már a holnapi feladat lesz. De "léci" egyelőre ne adjatok tippeket, küszködni akarok vele.
-
vz12
tag
válasz
janos1988 #14151 üzenetére
Az első megoldás (is) majdnem jó, teljesen végigmegy a mondaton, a "pont" is megvan a végén, csak éppen nem írja ki az utolsó szót. A szg. ugye nem a kívánságaink, hanem az utasításaink szerint működik, tehát ha nem írja ki a gép, akkor az azért van, mert nem lett megmondva neki.
Nos, akkor mondjuk meg neki, az első megoldást egészítsd ki a for ciklus után, az "end." előtt a következővel:if (s2<>'') then writeln(s2);
-
kovisoft
őstag
válasz
janos1988 #14151 üzenetére
Alapvetően az a probléma mindkét megoldásoddal, hogy az a feltétel, ahogyan vizsgálod az új szó kezdetét, az nem érvényes a string legvégén. A szöveg közepén amikor a szóköz jön, akkor az aktuális előtt lévő karakter a szó utolsó betűje, amikor viszont a szöveg utolsó karakteréhez értél, akkor ez nem igaz, mert ott az aktuális karakter a szó utolsó betűje.
Az első változatodban figyelmen kívül hagyod azt, hogy a szöveg végén nem lesz szóköz, tehát ott marad a "levegőben" még az utolsó szó, amivel nem csinálsz semmit. Ezt még valahogy le kellene kezelni a ciklus után.
A második változatodban valami ilyesmit csinálsz: a szónak akkor van vége, ha szóköz karakter jön vagy ha a szöveg utolsó karaktere jön. De ez nem igaz, mert így kimarad a legutolsó karakter. Ehelyett valami ilyesmit kell csinálnod: a szónak ez az utolsó karaktere, ha tart még tovább a szöveg és szóköz lesz a következő, vagy ha ez a szöveg utolsó karaktere. Az nem korrekt megoldás, hogy túlfuttatod a ciklust, legfeljebb akkor, ha gondoskodsz róla, hogy a túlfuttatott n+1. tömbelemre semmiképpen sem fogsz hivatkozni.
A többieknek: ez Pascal-szerűség, itt 1-től indul a ciklus.
-
-
bandi0000
nagyúr
válasz
janos1988 #14153 üzenetére
Azt felejted el, hogy a tömbök mindig 0-tól indeelődnek, szóval valójában ha 1-ről indítod a ciklust, akkor a "z" -vel kezdItt lehet rosszra gondolok, bár a "<>" operátor sztem a != akar lenni nem?Mert itt nem a length(s1)-ig kell menni, hanem s1-1 ig, mivel 0-val kezdődik az index ugyeif (s1[i]<>#32) and (i<>length(s1))
Sőt, most utánaolvasva elvileg a stringek 1-től indexelődnek, akkor mind1, akkor meg length+1-ig kell menniSilεncε:
Nekem is hálistennek, csak okoskodni próbálok
-
janos1988
addikt
válasz
janos1988 #14151 üzenetére
A . lemaradása már megvan, mert ha a for ciklus elér a 45. lefutáshoz akkor i<>45 hamis (mivel i=45) lesz így már a feltétel is hamis lesz, azaz else ág. Na de, hogy tudom mégis kiíratni.
Szerk.: Ha a for ciklushoz hozzáadok egyet for i:=1 to length(s1)+1 és a kiértékeléshez is (i<>length(s1)+1) akkor minden okés. De szerintem ezt nem így kell(ene) megoldani, hogy túlfuttatom a cilust.
-
válasz
janos1988 #14118 üzenetére
Bármilyen suliba megy az ember, sokat kell gyakorolni sulin kívül is. Az egyetemmel levelező formában az a bajom, hogy ott az anyag aztán vagy megérted vagy nem magadtól, mert el nem magyarázza senki. A webler teljesen jó, igaz házit nem nagyon adnak, viszont arra jó, hogy tudjam miket kell néznem, pár olyan honlapot mutattak, aminek a létezéséről sem tudtam . Mellette elő vagyok fizetve a letscode-ra is. Nem a szorgalommal van bajom, hanem hiányzik az útmutatás, illetve nem tudom, hogy hol van az a szint, amikor már elkezdhetek állást keresni juniorként. A hardskill úgyis munkahelyen fog jönni. Próbálok majd portfóliót is csinálni, egyik haveromnak építgetek honlapot, amiket tanulok azt próbálom beletenni majd. De visszatérve a green foxra szerintem én is hagyom. Még a brainig hubot néztem, talán őket megérné választani, de ők meg majd ősszel indítanak megint 3+6hónapos weblapkészítő képzést, ami nem ilyen bootcamp stílusú.
-
sztanozs
veterán
válasz
janos1988 #14084 üzenetére
Még mindig a break-re - ha megy az angol ezt a thread-et érdemes végigolvasni:
https://softwareengineering.stackexchange.com/questions/58237/are-break-and-continue-bad-programming-practices -
Silεncε
őstag
válasz
janos1988 #14079 üzenetére
Igen, pontosan ez a lényege.
A túlcsordulás C esetében kétféleképpen működik, attól függ, hogy signed vagy unsigned. Signed esetben definiáltan 0-ról indul előről (szóval tulképp ha x a szám, akkor x % 2^bitszélesség lesz az értéke), unsigned esetében MIN_VALUE-ról indul el visszafele (a kettes komplemens számábrázolás miatt), de ha jól tudom, ez hivatalosan nem definiált a szabványban
-
Reflax
tag
válasz
janos1988 #14037 üzenetére
Értem, nos én már évek óta szerettem volna infóban elhelyezkedni és azt tanulni de csak az utóbbi pár évben alakult ki bennem eléggé az, hogy még is melyik része. Eleinte a hálózat érdekelt majd a hardver. De később elkezdtem a progrmamozás felé kacsintgatni és az fogott meg. Onnantól ha valami eszembe jutott infós rész, az kifejezetten csak programozás volt. Hol PLC, hol banki, és a játéknál kötöttem ki jó ideje és ez ragadt meg. Elkezdtem youtuben Unityben készíteni tower defenset, és tetszett, anno órán is pici kis játékot készítettünk ,meg számológépet és tetszett. Ezért érdekel, ée szeretnék az ELTE-re bekerülni, hogy tanulhassam amennyire tudom. És kifejezetten ez a célom, hogy játékok készítésében szerepeljek, és idővel pedig az M.I.-vel foglalkozhassak mellette. Ezek a terveim és ezt is szeretném megvalósítani. Játékkal örömöt adni másoknak és élvezni amit csinálok, az M.I-vel iletve szerves technológiával pedig az emberiségnek segíteni.
-
kovisoft
őstag
válasz
janos1988 #14035 üzenetére
Ha mindenáron ki akarod hagyni az if-et, akkor ezt esetleg egy while ... do ciklussal tudnád megoldani úgy, hogy először (még a cikluson kívül) bekéred az a-t, majd jön a while ... do, ami az elején tesztel nemnulla a-ra (a while fordítva működik, mint az until), és a ciklus legvégén mindig újra bekéred az a-t.
-
kovisoft
őstag
válasz
janos1988 #14032 üzenetére
A második változatod az "a" változó beolvasása után nem ellenőrzi, hogy annak nulla-e az értéke, ezért 0-ra is végigcsinálja a ciklus belsejét és csak a végén az "until a=0" tesztel 0-ra. Az első változatban ott van egy "if a>0", emiatt nem csinál semmit 0-ra.
Számomra nem világos, hogy mit akartál csinálni. Olyan, mintha egy elöl tesztelő ciklusból akartál volna hátul tesztelőt csinálni úgy, hogy egyszer mindenképpen végrehajtódjon a ciklusmag. Viszont neked már eleve hátul tesztelő ciklusod van, ebből max egy még hátrébb tesztelő lesz így.
-
#78693120
törölt tag
válasz
janos1988 #14000 üzenetére
A rekurziónál kell egy újrahívási feltétel.
Ez lehet egy if (ez egyszerűbb), vagy pl.: string/tömb feldolgozás esetén levágsz egy elemet a végéről/elejéről, tehát valamikor elfogynak az elemek. Esetleg egy szám értékéhez nézed, pl: >10 és ha 10, vagy alá csökken, akkor nem dolgozod fel tovább, vagyis nem hívod a függvényt, stb.
Persze, így is ki lehet futni a memóriából, ha túl sok elem van.Egy ilyen feltétel hiányzik a kódodból.
-
sztanozs
veterán
válasz
janos1988 #14000 üzenetére
A kódot nem igazán sikerült megfejtenem, csak, hogy egy végtelen rekurzív ciklusba fut (a for ciklusban mindig kötelezően meghívja magát...)
mod: hiányzik az exit az if-ek végéről
program ermek_demo;
const
n=2;
type
a = array [1..n] of integer;
const
ermek:a=(1,2);
function f_kombok(ermek:a;osszeg:integer;temp_index:integer):integer;
var
temp:integer;
begin
if osszeg=0 then
f_kombok:=1;
exit;
end;
if osszeg<0 then
f_kombok:=0;
exit;
end;
f_kombok:=0;
for temp:=temp_index to n do f_kombok:=f_kombok+f_kombok(ermek,osszeg-ermek[temp],temp);
end;
begin
writeln(f_kombok(ermek,4,1));
readln;
end.
modmod: kib&@#{ kódszerkesztő
-
janos1988
addikt
válasz
janos1988 #13999 üzenetére
Az én mitudoménhanyadik verzióm, de ez meg végtelen ciklusba megy át.
program ermek_demo;
const
n=2;
type
a = array [1..n] of integer;
const
ermek:a=(1,2);
function f_kombok(ermek:a;osszeg:integer):integer;
var
kombo,temp:integer;
begin
if osszeg=0 then f_kombok:=kombo;
if osszeg<0 then f_kombok:=0;
kombo:=0;
for temp:=1 to n do kombo:=f_kombok(ermek,osszeg-ermek[temp]);
f_kombok:=kombo;
end;
begin
writeln(f_kombok(ermek,4));
readln;
end.
-
janos1988
addikt
-
dabadab
titán
válasz
janos1988 #13966 üzenetére
Pedig tényleg az történik, amit látsz, csak ne felejtsd el, hogy egy csomo f1 van ilyenkor
Amikor eljut odáig, hogy az f1 megkapja a nullás értéket, addigra már három félbeszakadt f1 van, amik ezek után szépen befejeződnek, szóval valahogy így halad a végrehajtás (balról jobbra, a magasság csak szemléltetésnek van, ahol pontok vannak, ott nem fut a függvény, mert egy általa meghívott másik (vagy az azáltal meghívott harmadik, stb) függvény fut):
f1(3) előtt................................................után
f1(2) előtt...............................után
f1(1) előtt..............után
f1(0) f1 = 1Ha ugyanezt nemrekurzívan akarnánk megírni, az kb. így nézne ki:
Program nemrekurzio(output);
procedure f0();
begin
writeln('f0');
end;
procedure f1();
begin
writeln('f1 elott');
f0();
writeln('f1 utan');
end;
procedure f2();
begin
writeln('f2 elott');
f1();
writeln('f2 utan');
end;
procedure f3();
begin
writeln('f3 elott');
f2();
writeln('f3 utan');
end;
begin
f3();
end. -
Silεncε
őstag
válasz
janos1988 #13962 üzenetére
Természetesen nem. Ugye rekurzív függvény esetén önmagát hívja a fgv (van ennek egy szép definíciója, de sose jegyeztem meg). Jelen esetben ugye az történik, hogy elkezdődik a futás, n = akármennyinél, de az nem nulla, szóval jön az else ág, és meghívódik a fgv mégegyszer n-1-el. Ez megy egészen n=0-ig, ez ugye a rekurzív fgv alapesete, itt lefut az if igaz ága, kiíródik az "n=0" mivel ő az első fgv példány ami befejezi a futást, azután visszatér. És így ezután szépen egymás után visszatér a 0+1, 0+2, ... n-1, n is. Ezért van az, hogy fordítva íródik ki.
TL;DR: az első fgv példány ami visszatért a legutolsó, az alapesetes, ezután szépen sorban visszafelé a többi. Ezért íródik ki fordítva
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
- sziku69: Fűzzük össze a szavakat :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Kerékpárosok, bringások ide!
- Nintendo Switch 2
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- E-roller topik
- Milyen széket vegyek?
- Azonnali mobilos kérdések órája
- Magyarországon is kapható a Moto G85 5G
- 24 Hours of Le Mans
- További aktív témák...
- Csere-Beszámítás! Sapphire Nitro+ RX 7800 XT 16GB GDDR6 Videokártya! Bemutató Darab!
- Kaspersky, McAfee, Norton, Avast és egyéb vírusírtó licencek a legolcsóbban, egyenesen a gyártóktól!
- Csere-Beszámítás! RGB Számítógép PC játékra! R5 5600X / RTX 3060Ti 8GB / 32GB DDR4 / 500GB SSD
- Telefon felvásárlás!! iPhone 12 Mini/iPhone 12/iPhone 12 Pro/iPhone 12 Pro Max
- Telefon felvásárlás!! iPhone 13 Mini/iPhone 13/iPhone 13 Pro/iPhone 13 Pro Max
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest