- Megvan, milyen chipet használ a Pura 80 Ultra
- Bemutatkozott a Poco X7 és X7 Pro
- Nem várt platformon a OnePlus Nord 5
- Samsung Galaxy Watch6 Classic - tekerd!
- Milyen okostelefont vegyek?
- Motorola Edge 50 Neo - az egyensúly gyengesége
- Honor 400 Pro - gép a képben
- Nothing Phone (3a) és (3a) Pro - az ügyes meg sasszemű
- One mobilszolgáltatások
- Milyen GPS-t vegyek?
Új hozzászólás Aktív témák
-
WonderCSabo
félisten
válasz
kmisi99 #1599 üzenetére
Gondolom van egy/kettő fájlod, amiben az angol-magyar szópárok vannak felsorolva. Nos, ezekből szépen beolvasod a párokat egy vektorba, ami stringekbből álló pair - eket tárol, vagy két vektorba, ami stringeket tárolnak. Végigmész a fájlon, és feltöltöd az "adatbázisodat". Ezek után úgy tudsz fordítani, hogy lineáris kereséssel végigmész a vektoron, és ha megvan az angol szó, akkor a magyar párját kiírod.
Ha gyorsítani akarod a dolgot, használj map - et, és akkor lineáris keresés helyett logaritmikusat használsz, cserébe a feltöltés kvázi konstans időigény helyett logaritmikus lesz.
-
kmisi99
addikt
Heló! Tudnátok segíteni némi c++ ban. Az a feleadatom hogy egy egyszerű full gagyi szótárt programot írjak ami egy szöveges állomány az adatbázis és onnan olvassa be a szavakat és ha beírom az angol szót akkor kiadja a másik oldalt a magyart. Hogyan foghatnék neki mert fogalmam sincs. Tényleg teljesen gagyinak kell lenni semmi komoly.
-
Gibkey
tag
Sziasztok, C,C++,C# és/vagy MQL4-hez értő programozókat keresünk az új projectünkhöz. Akit érdekelne esetleg az keressen meg privatban (közösbe ne).
Nem reklámnak szántam, akit sért vagy zavarja a kiírásom utólagosan is elnézést kérek. Gondoltam itt találok olyan programozót, aki épp munka hiányban szenved.
-
szkorhetz
őstag
Sziasztok!
Lenne itt valaki aki segítene nekem két programozásos beadandó feladat megszülésében?
Én megkaptam őket és azt sem tudtam, hányadikán van elseje.
Köszönöm! -
WonderCSabo
félisten
válasz
csepcsavoka #1593 üzenetére
Átírtam C++ -osra, mert a feladatkiírást elolvasva látom, hogy valszeg C++ -ban kell (vectort említi). A távirat feltöltést és postán maradó számolást ez alapján meg tudod írni.
-
csepcsavoka
csendes tag
válasz
WonderCSabo #1592 üzenetére
beleírnád a program megfelelő helyére?
és így hogy számolja meg majd ossza el? vagy a többi jó?
próbáltam a füzetből megírni, lehet h teljesen összekeverem a C-t és a C++-t
am gépész vagyok és csak 2 féléves az infó... -
WonderCSabo
félisten
válasz
csepcsavoka #1591 üzenetére
Hát, elég durván C-s kódolást nyomtok C++ néven, a class-on és new-n kívül mindenhol a régi C-s megoldásokat használod. Így természetesen nem fog működni a s.length()-el a hossz lekérdezés, hanem így:
int string_length(char str[])
{
for(int i = 0; i < 30; ++i)
{
if(str[i] == '\0')
{
return i;
}
}
} -
csepcsavoka
csendes tag
válasz
WonderCSabo #1590 üzenetére
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typdef char nevtip[30];
class Udvozlo_kuldemeny
{
protected:
nevtip Feladas_helye, Udvozlo_szoveg, Alkalom;
long int Feladasi_datum;public:
void Feladas_helyeBE(nevtip Feladas_helyeIN)
{ strcpy(Feladas_helye,Feladas_helyeIN); }void Feladas_helyeKI(nevtip Feladas_helyeOUT)
{ strcpy(Feladas_helyeOUT,Feladas_helye); }void Udvozlo_szovegBE(nevtip Udvozlo_szovegIN)
{ strcpy(Udvozlo_szoveg,Udvozlo_szovegIN); }void Udvozlo_szovegKI(nevtip Udvozlo_szovegOUT)
{ strcpy(Udvozlo_szovegOUT,Udvozlo_szoveg); }void AlkalomBE(nevtip AlkalomIN)
{ strcpy(Alkalom,AlkalomIN); }void AlkalomKI(nevtip AlkalomOUT)
{ strcpy(AlkalomOUT,Alkalom); }void Feladasi_datumBE(long int Feladasi_datumIN)
{ Feladasi_datum=Feladasi_datumIN; }void Feladasi_datumKI(long int Feladasi_datumOUT)
{ Feladasi_datumOUT=Feladasi_datum; }};
class Kepeslap: public Udvozlo_kuldemeny
{
private:
int Belyeg_erteke;
;
public:
void Belyeg_ertekeBE(int Belyeg_ertekeIN)
{ Belyeg_erteke=Belyeg_ertekeIN; }void Belyeg_ertekeKI(int Belyeg_ertekeOUT)
{ Belyeg_ertekeOUT=Belyeg_erteke; }};
class Udvozlo_tavirat: public Udvozlo_kuldemeny
{
private:
int Postan_marado;public:
void Postan_maradoBE(int Postan_maradoIN)
{ Postan_marado=Postan_maradoIN; }void Postan_maradoKI(int Postan_maradoOUT)
{ Postan_maradoOUT=Postan_marado; }};
void main()
{
Kepeslap* kepeslapok;
Udvozlo_tavirat* udvozlo_taviratok;
int i, n, db, kuldossz=0, karossz=0, Postan_marado=0, Belyeg_erteke=0;
long int Feladasi_datum=0;
float karatl=0;
nevtip Feladas_helye, Udvozlo_szoveg, Alkalom;
kepeslapok= new Kepeslap
udvozlo_taviratok= new Udvozlo_tavirat
clrscr();
printf("Mennyi a küldemények száma?\n");
scanf("%d",&n);for(i=0;i<n;i++)
{
printf("A %d. feladási helye?\n",i+1);
gets(Feladas_helye);kepeslapok.Feladas_helyeBE(Feladas_helyeIN)
printf("A %d. üdvözlő szövege?\n",i+1);
gets(Udvozlo_szoveg);
printf("A %d. alkalma?\n",i+1);
gets(Alkalom);
printf("A %ld. feladási dátuma (Pl:20120521)\n",i+1);
scanf("%ld",&Feladasi_datum);
printf("A %d. bélyeg értéke \n",i+1);
scanf("%ld",&Belyeg_erteke);
printf("A %d. postán maradt e (Pl: igen, nem)\n",i+1);
gets(Postan_marado);
}
if(strcmp(Postan_marado,"igen")==0) db++;
karatl=karossz/dbif(strcmp("Budapest",Feladas_helye)==0)
{kuldossz+=Kepeslap(i).Belyeg_ertekeKI();}printf("\nA Budapesten feladott képeslapok küldési összege: %dFt",kuldossz);
printf("\nAPostán maradó táviratokon található üdvözlő szövegek átlaga: %7.2f",karatl);getch();
}na eddig így néz ki tudom van benne pár hiba meg bizonytalankodok is egy kicsit
-
WonderCSabo
félisten
válasz
csepcsavoka #1588 üzenetére
Adatlapomon megtalálod, de egyébként ide is belinkelheted a fórumba. Vagy attól félsz, hogy a többiek lemásolják?
Szerk.: Mégsem találod meg, akkor küldd privát üzenetben, ha úgy akarod.és a szöveg hosszát hogy adom hozzá??
string szoveg;
// ...
sum += szoveg.length(); -
csepcsavoka
csendes tag
válasz
csepcsavoka #1588 üzenetére
és a szöveg hosszát hogy adom hozzá??
-
csepcsavoka
csendes tag
válasz
WonderCSabo #1587 üzenetére
ha adsz egy emailcímet elküldöm a majdnem kész feladatot és megnézed h mi hiányzik belőle, nagy segítség lenne...
-
WonderCSabo
félisten
válasz
csepcsavoka #1586 üzenetére
Így viszont már nagyon is egyértelmű a feladat. Hozd létre a kívánt osztályokat, teljesen specifikálva vannak. Aztán írj egy-egy fvt, ami képes egy-egy vektorba új képeslapot/táviratot push_backelni. A postán maradóakhoz pedig: végigmész a vektoron lineáris kereséssel, megnézed, hogy az adott távirat postán maradó-e, ha igen a counter értékét növeled, a szöveg hozzát pedid hozzáadod egy szummához. A végén leosztod a szummát a counter értékével.
Elég egyszerű a feladat, ennél többet írva szinte már csak a megoldást tudnám leírni...
-
csepcsavoka
csendes tag
válasz
WonderCSabo #1585 üzenetére
3. Hozza létre az Üdvözlő küldemény osztályt a Feladási dátum, Feladás helye, Üdvözlő szöveg és Alkalom adattagokkal. Származtassa belőle a Képeslap és az Üdvözlő távirat alosztályokat. A Képeslap osztályt bővítse a Bélyeg értéke adattaggal. Az Üdvözlő távirat osztályt bővítse Postán maradó adattaggal. Írjon programot, amellyel létrehozhatók a Képeslap és az Üdvözlő távirat egyedeket tároló vektorok. A program tegye lehetővé a feltöltést és a Budapesten feladott képeslapok küldési összköltségének meghatározását, valamint a Postán maradó táviratokon található Üdvözlő szövegek karakterekben mért átlagos hosszának meghatározását.
-
WonderCSabo
félisten
válasz
csepcsavoka #1584 üzenetére
Ez a feladat kiírás így eléggé homályos, több részlet kéne.
-
csepcsavoka
csendes tag
Valaki tud segíteni?? feladatrész
A program tegye lehetővé a Postán maradó táviratokon található Üdvözlő szövegek karakterekben mért átlagos hosszának meghatározását.
merthogy: meg kell határozni azokat amik a postán maradtak, és azoknak kell az üdvözlő szövegének a karaktereit összeadni és elosztani amennyit talált. -
Brianiac
aktív tag
Dinamikus struktúra tömbbe hogyan tudok adatokat beolvasni mondjuk egy külső txt fájlból??
Így próbáltam, de így nem jó: "be>>csomag[db].nev" Itt a csomag a struktúra neve lenne.. -
proci985
MODERÁTOR
válasz
Dave-11 #1579 üzenetére
kicsit kompaktabban és konyhanyelven:
a program leképezi a valós dolgot, innentől könnyebben elképzelhető, könnyebben használható. az emberi agy szeret kötni dolgokat valahova, tehát végereményben logikusabb lesz a felépítés.
ez azt is jelenti, hogy általában a dologok közötti egymásrahatások is átláthatóbbak, jól csinálva egyszerűbben átlátható lesz az architektúra (tehát a classok kapcsolata, egymásraépülése és végeredményben a program felépítése), tisztábbak lesznek az interfacek. a funkciók és változók szintén köthetőek lesznek a valós dologhoz, tehát könnyebben átlátható lesz, hogy mi miért kellhet, kevesebbet kell kommenteket/dokumentációt olvasni, emiatt könnyebben módosíthatóvá és megérthetővé válik a program. az ember kvázi építőkockákat kap, amik segítségével a nagy egész könnyebben feldarabolhatóvá (főleg design patternsek alkalmazásával), így könnyebben megérthetővé válik.
másik fontos szempont, hogy a dolgok elkülönülnek egymástól, tehát egy dolog nem több egységben (component/class) lesz megvalósítva, ez megint átláthatóbb kódot jelent. ami egyben azt is jelenti, hogy egyszerűbben átláthatóvá válik a programlogika. ez ismét a módosíthatóság/karbantarthatóság/megérthetőség hármast erősíti, illetve a tesztelhetőséghez is kell. htlmt generáló php+jquery+css+sqlnél pl elég vicces tud lenni, amikor az ember elkezdi keresni, hogy a 20+ fileból ugyanmár mi is felelős egy adott gomb működéséért, ha nincsen szépen megtervezve a rendszer (és persze a html útközben változik).
tesztelhetőséghez amiatt fontos, mert egyszerűbb egységek szintjén kezdeni, és általában minél kevesebb egység kell egy adott feladat kipróbálásához (elsősorban itt dependencykre kell gondolni), annál könnyebben lesz tesztelhető egy adott megoldás. a jól definiált interface szintén nagyban segíti a blackbox testinget. azt nem szabad elfelejteni, hogy az OO design egyben ronthat is a tesztelhetőségen, bizonyos design patternek (pl singleton vagy insulation classek) ilyen szempontból problémásak.
ami még lényeges, hogy az OO design nem igazán enged meg globális változókat, amik megintcsak nagyban rontják a későbbi karbantarthatóságot.
namost, ami az egésznek a lényege: a programok életciklusa hosszú lehet, ezalatt cserélődhet a teljes fejlesztői gárda, cserélődhetnek a célok, amiket az ember elvár a terméktől. az OO design ezekre a kérdésekre ad (részleges) választ és segít abban, hogy az a kód, amit az ember megír, később is használható legyen, amikor módosítani kell.
-
Dave-11
tag
Az objektum orientált programtervezésben egyébként mi a jó? Mármint tudom róla hogy nagyon hasznos és divatos manapság, de kb. ennyi: objektum orientált programozás -> jó. Ennyi amit tudok róla. Meg amit már futólag láttam belőle php tanulása során, hogy classok, szülő classok, tulajdonságok, öröklés, de csak ilyen kulcsszavak maradtak meg.
Egyszóval, miért olyan jó? -
WonderCSabo
félisten
válasz
Dave-11 #1577 üzenetére
Egyébként van valamilyen szisztéma, ami alapján a címekbe rakja az értékeket?
Sajnos ez egy nagyon bonyolult kérdés. Az alap koncepció az, new operátor hívásakor keres egy akkora összefüggő, üres területet a heap-en, amitbe belefér a változó, és ennek a területnek a címe kerül bele a pointeredbe. Hogy milyen szisztéma alapján keresi a területet, az egyrészt rendszerenként is változó, másrészt az adott szituációtól is függ. Ennél sokkal többet nem tudok erről a dologról, mert nem igazán volt szükséges utánajárnom eddig. De ha további kérdéseid vannak, talán a hozzáértőbbek tudnak válaszolni rá.
-
Dave-11
tag
válasz
WonderCSabo #1576 üzenetére
Értem, akkor ez engem, mint kezdőt még nem érint, csak így beletekintés szintjén jó volt, később biztos hasznos lesz
Egyébként van valamilyen szisztéma, ami alapján a címekbe rakja az értékeket? -
WonderCSabo
félisten
válasz
Dave-11 #1575 üzenetére
Nem, nem erre való. A memóriában valóban egy címen van a változó értéke, de ehhez szükségtelen pointereket használni. A címet egyébként is le lehet kérni az & operátorral.
A pointerek azért jók, mert segítségével láncolt adatszerkezeteket tudunk létrehozni. Pl. nem kell a tömbben tárolni a bazinagy képeket, elég csak a rá mutató pointert, és emiatt a tömb sokkal jobban kezelhető, vagy létrehozhatsz láncolt listát, fákat, stb.
A másik dolog, amit Te is írtál, hogy a pointerek segítségével tudunk dinamikusan lefoglalni memóriaterületet, és ezt bármikor fel is szabadíthatjuk. Ettől a program nem fog feltétlenül gyorsabban futni, viszont a memóriahasználata nyilvánvalóan csökkenni fog. Ellenkező esetben a sima automatikusan lefoglalt változók esetén a változó csak az adott blokk lefutása végén szabadul fel.Ezen kívül C++ - ban még a pointereken keresztül lehet megvalósítani a polimorfizmust és a dinamikus kötést, és még ezer dolog van, hogy miért is jók a pointerek.
-
Dave-11
tag
Kicsit jobban utánnajártam a pointereknek, megnéztem két videót ( videó1 és videó2 ), és hát kicsit segített letisztázni pár dolgot, de még mindig van pár dolog, amiben nem vagyok biztos. Tehát:
1. ha létrehozunk egy változót, és annak adunk egy értéket, akkor az az érték eltárolódik a memóriánk egyik címében. És valahányszor használja a programunk a változót, az értékét az adott memóriacímről nyeri ki? És erre jó a pointer, hogy megkapjuk az adott memóriacímet?
2. ha egy változó feleslegessé válik, vagy ha változik az értéke, akkor a korábbi memóriacímről törölni tudjuk a pointerünk segítségével, és egyszerűen új értéket adunk neki, ami már egy más címen lesz? És ezzel kerüljük el, hogy felesleges dolgok megmaradjanak, és a program kevesebb memória használatával, valószínűleg gyorsabban fusson? -
dany27
őstag
válasz
WonderCSabo #1561 üzenetére
Köszi!
Nem, még sosem programoztam Java-ban
-
Chipi333
csendes tag
válasz
h1ght3chzor #1570 üzenetére
Szerintem a pointer és a tömb fogalmát nem érdemes összemosni, mert két teljesen különböző dologról van szó. Az, hogy egy tömböt általában úgy szokás használni, hogy egy pointerrel mutatsz az elejére nem jelenti azt, hogy minden pointer mögött tömb lesz.
-
Dave-11
tag
És ez a csillag mit jelent egy adattípus végén? Pl.: int*, char*, stb.
-
Dave-11
tag
válasz
Jhonny06 #1566 üzenetére
Mármint nem úgy értettem, hogy teljesen kihagyom, hanem hogy csak most ugrom át. Az a helyzet, hogy még elég kezdő vagyok. De nem tudom, a könyv később abszolút nem tárgyal róla?
És egy kérdés, nem biztos hogy jó, csak azt néztem, hogy amit írtál:
int x = 3;
phone_book.push_back(int);
Az utolsó sor, nem inkább: phone_book.push_back(x); ?
Vagy hülyeséget írok? Csak mert ugye az x változót akarjuk belerakni a vektorba, vagy nem? -
Jhonny06
veterán
válasz
Dave-11 #1565 üzenetére
Ezzel hozol létre egy vektort:
vector<Entry> phone_book(1000)
vector -> vektor, egy adatszerkezet, ami nagyon hasonló a tömbökhöz
<Entry> -> a vektor típusa, lehet pl. int, string, egy struktúra, kvázi amit akarsz
phone_book -> a vektor neve, értelemszerűen bármi lehet
(1000) -> a vektor mérete, nem kötelező megadni, mert dinamikusan tudja bővíteni magátÚgy éred el az elemeit, mint a tömbnek:
phone_book[0], stb..
Ha nem adsz meg neki méretet, akkor a push_back()-el tudsz egy elemet beilleszteni:
int x = 3;
phone_book.push_back(x);Röviden ennyi. Ne hagyd ki, mert elég alap dolog szvsz. Ha megy az angol, ezt érdemes átolvasni (meg úgy alapvetően ajánlom figyelmedbe az oldalt).
[ Módosította: philoxenia ]
-
Dave-11
tag
Olvasok egy könyvet a C++ ról, amit még korábban ajánlott itt valaki, és ahol járok van egy ilyen rész, ami beszél egy kicsit a vektorról. Na és van egy ilyen kódrész benne: vector<Entry> phone_book(1000);
Ez mit akar jelenten?? Ha valaki lenne olyan szíves elmagyarázná szavanként?
Vagy ha netán valakinek megvan ez a könyv ( [link] ) akkor odaugrana gyorsan a 66-66 oldal tájékára? Kicsit zavaros ez a rész, és nem is nagyon értem hogy mit keres ittCsak ha meg kihagyom lehet hogy később meg gondom lesz belőle
-
Jhonny06
veterán
válasz
Dave-11 #1562 üzenetére
Ha visszatérsz egy függvénnyel, az csak 1 érték (ráadásul ugye lokális, ennek nézz utána). Ellenben mutatókkal a függvényen belül annyit módosítasz, amennyit akarsz.
pl.:
int main(void) {
int a = 5;
int b = 3;
cout << osszead(a, b) << endl;
return 0;
}
int osszead(int x, int y) {
return x + y;
}Itt látszik a korlátja a dolognak. Egy összeadó függvénnyel tökéletesen működik, mert csak egy értékkel tér vissza, az eredménnyel. De ha mondjuk van egy olyan függvény, ami két számot külön-külön négyzetre emel, ott már elbukott az egész, mert érték szerinti paraméterátadásnál másolat készül a változóról és amit a függvényben változtatsz rajta, az visszatérés után/vagy nélkül elveszik. És csak 1 értéket tudsz visszaadni.
-
WonderCSabo
félisten
Kijavítgattam, így működik, legalábbis erre a kemény 3 adatra, többre nem tesztelgettem le.
Viszont ez az egész nagyon kusza így. A fa adatszerkezetet rakd el külön fájlba. Az "elem" osztály a fának egy belső osztálya legyen, sokkal egyszerűbb és szebb lesz a megvalósítás úgy. A student, szamok classt, main fv-t legalább egy külön fájlba rakd a fától, semmi közük egymáshoz. Ennek a sornak:
fa<T>::fa.beszur(adat.convert(line));
Mi akar lenni a jelentése? Ha a beszur statikus fv lenne, akkor arra hivatkozhatnál így:
fa<T>::beszur()
Ha a fa egy objektum lenne, akkor hivatkozhatnál rá így.
fa.beszur()
Amit te leírtál, az azt jelenti, hogy van egy fa osztálynak statikus fa adattagja, aminek statikus beszur fv-ére hivatkozol...
Aztán ez:
y.beszur(*(new student("dsfdsf","KSDFGH")));
Ha rögtön dereferálod, semmi értelme dinamikusa allokálni, mert csak egy szép memory leaket kapsz, és semmi előnyt.
Az ilyet C++ -ban így írjuk:
y.beszur(student("dsfdsf","KSDFGH"));
A BST-nek hol maradt a destruktora? Dinamikusan hozod létre a csúcsokat és sehol sem szabadítod fel őket.
Illetve: a fa nem lesz túl általános, hordozható, ha ilyen módon írod meg. A compare fv helyett használj sima < operátort, a convert helyett pedig << operátort. És ezeket terheld túl a saját típusaidban. Így még a beépített típusokra is fog működni.
Jól sejtem, hogy Javában kezdtél el programozni?
-
dany27
őstag
válasz
WonderCSabo #1557 üzenetére
A kiírás megy rendesen a vissza olvasással vannak gondok:
Így valosítottam meg: [link]146 és a 39. sorra kapok hibát
Mindegyik ezt: error: expected unqualified-id before '.' token
5let hogy mi lehet a gond?
Előre is köszi!
-
Dave-11
tag
Mikor használjuk az std::cout vagy a print parancsot? Mert ugye elvileg mindkettővel kiírathatunk valamilyen szöveget, vagy változóz, de melyiket milyen esetben használjuk. Mert gondolom azért van különbség
Ja és még valami. Ilyen void -ot már hoztam létre, csak egy valami nem tiszta belőle, csak sejtem. Szóval, ezzel a kulcsszóval egy új általunk definiált függvény hozhatunk létre? -
dany27
őstag
Elkészültem azzal a generikus bináris fával amihez tőletek kértem tippeket, segítséget.
Most még egy dolgot kéne véghez vinnem benne. Mégpedig azt hogy képes legyen magát kiírni majd vissza olvasni egy fileból.
Írtam hozzá egy Serialize osztályt valamint egy PFa osztályt is mely örökli a Serialize valamint a Fa osztály össze cuccát. De nem jövök rá hogy hogyan tudnám azt biztosítani hogy bármilyen adat szerkezetet kitudjon írni magától...Nem is húzom tovább az időt, beszéljen inkább a program kód: [link]
Előre is köszi a segítséget!
-
Dave-11
tag
C++ hoz van ingyenes könyv a neten, ami kezdőknek jó?
Illetve érdekelne, hogy szerintetek az jó stratégia, ha előbb kicsit alaposan megismerkedem a C++ szal, aztám váltanék Visual C++ ra? -
bradam
aktív tag
Köszönöm mindhármótoknak hátulról kivagdosós módszerrel és sstreammel sikerült
-
Jhonny06
veterán
Egy egész függvénykönyvtár áll a rendelkezésedre, nem kell int-é alakítani (érdekes is lenne). Ha mindegyiknek 192.168.100 az eleje, akkor simán tudsz szűrni, hogy egy csoportosításnál csak az azután lévő karaktereket vegye figyelembe, vagy a 3. pont utánit, ilyesmi. Azokat már lehet int-é alakítani, úgy rendezni, stb.
-
doc
nagyúr
milyen az a "barmilyen" muvelet?
muveleteket (osszehasonlitas, rendezes, stb) stringekkel is tudsz csinalni
ha meg mindenkepp int-te akarod alakitani, akkor ott a jo oreg atoi
vagy ha C++ -os megoldast keresel, akkor a stringstream
persze mindkettohoz megfeleloen 'vagni' kell a stringet -
bradam
aktív tag
Sziasztok!
Lenne egy nagyon idióta, és valószínűleg hülye kérdésem készülvén az érettségire, remélem tudtok segíteni
Szóval van egy txt fájlom benne ip címek ilyen módon.
Ezt úgy kéne beolvasnom,hogy tudjak szűrni ip alapján(If-el),viszont csak stringbe tudom beolvasni, úgy meg nem tudom kezelni. Valahogy String-Int átalakítást lehetne végezni, úgy hogy tudjak vele bármilyen műveletet csinálni? A pontos feladat egyébként az,hogy 192.168.100.X-es IP címeknél X alapján csoportosítsak.
(Itta kódrészlet,bár nem hiszem,hogy kellene, Substr-el próbáltam megoldani, sikertelenül
Előre is köszönömDoc: Gyakorlatilag annyi a feladat,hogy az IP címnél ha x<200, akkor az egyik, egyébként a másik csoportba kell rakni.
-
Chipi333
csendes tag
válasz
ArchElf #1546 üzenetére
Ha kevesebb a delete mint a new, akkor ott memory leak van
this->temp = new Project [pm+1];Ez nem egy Projekt* tömböt csinál, hanem egy Project tömböt. És a this->temp[i]=tomb[i]; az másol nem pointert állítgat. Probléma akkor van, ha a Projecten belül is vannak pointerek, mert akkor defaultbol csak a pointer lesz másolva, és ugyanoda fog mutatni mint az eredeti. A deletekből amiatt lehetett baj, ha a Projeknek van destruktora, ami ezeket a területeket szépen felszabadítja, és az új példány meg megpróbálja ezeket elérni (vagy éppen deletnél megpróbálja újra felszabadítani). Szóval ha ez van, akkor valóban kell a copy operátor.
-
ArchElf
addikt
válasz
h1ght3chzor #1545 üzenetére
Szerintem még lehet memóriaszivárgás, mert az itt generált elemeket:
this->temp = new Project [pm+1];
nem szabadítod fel, hanem egyszerűen a hivatkozáést felülcsapod ezzel:
for(i=0;i<pm;++i){ this->temp[i]=tomb[i];}
Ezen elméláztam este, de nem tudtam működő megoldást találni elemszintű cserére. Nem vagyok sajna c++ terén ennyire jártas...Ja és még egy probléma: ha referencia alapján tárolod le (nem másolod), akkor a kód mindig (fizikailag) ugyanazt a változót teszi be a memóriába:
if(menu=='1'){
system("CLS");
char projektnev[200];
int projektmeret;
cout << "Adja meg a projekt nevet: ";
cin >> projektnev;
cout << endl;
cout << "Adja meg a projekt memoriameretet: ";
cin >> projektmeret;
if(projektmeret<=0){
cout << endl;
cout <<"Hibas memoriameretet adott meg!"<< endl;;
cout << "Adja meg a projekt memoriameretet: ";
cin >> projektmeret;
}
b.psetname(projektnev);
b.setmeret(projektmeret);
a.phozzaad(b);
}Így tényleg a legjobbnak tűnik egy a másoló operátort felülírni (operator=) és nincs több gond...
AE
-
h1ght3chzor
őstag
válasz
ArchElf #1541 üzenetére
int pm = getprojektmeret();
this->temp = new Project [pm+1];
int i;
for(i=0;i<pm;++i){
this->temp[i]=tomb[i];
}
this->temp[i] = a;
this->tomb = new Project [pm+1];
for(i=0;i<pm+1;++i)
this->tomb[i]=this->temp[i];
this->temp=0;Ehhez mit szólsz? Úgy néz ki működik, létrehoztam a Memory class-ban egy Project* temp-et, és abba másolgatom, így még nem sikerült lefagyasztanom a progit, és nincs sztem memóriaszivárgásom sem...
Viszont ezt e kezdőcím beállítást nem látom még.
-
-
h1ght3chzor
őstag
válasz
ArchElf #1541 üzenetére
Igen, a terület kiosztással van probléma. Nagyon belebonyolódtam, mert ugye akkor is vizsgálnom kell, ha ==1 vagy (i)==0 ugye, és ennek rengeteg kombinációját látom, de lehet csak nagyon nem látom már át.
Egyébként a kezdőcímet nem tudom beállítani pontosan ez miatt, a legkisebb helyet azt szerintem jól megtalálom, bár már ez sem biztos.
-
ArchElf
addikt
válasz
h1ght3chzor #1540 üzenetére
Memóriaszivárgásra csak azt tudom, hogy ha másolod az elemeket, akkor lehet törölni az eredeti tömböt...
copy operator a project-re:
void Project::operator=(Project& p){
this->kezdocim=p.kezdocim;
this->meret=p.meret;
//következő sor esetleg még kellehet
//delete[] this->nev;
this->nev=new char[sizeof(p.nev)];
strcpy(this->nev, p.nev);
}Kicsit tesztelgettem, de úgy néz ki a terület allokálással még gondok vannak.
Nem merültem nagyon bele, de simán kiosztott az első üres helyre két helyet foglaló projectnek területet (és utána azt törölve törölte az utána következőt is):
Memória: 5
A:1 hozzáadása
B:1 hozzáadása
A törlése
C:2 hozzáadása (nem a 3. memóriahelyre teszi, hanem az elsőre)
C törlése (törli a B helyét is)AE
-
h1ght3chzor
őstag
válasz
h1ght3chzor #1538 üzenetére
Boccs, félreírtam, eltárolja, viszont vmit elnéztem feljebb, mert ha kitörlök egy középső elemet, akkor vmiért 0-s kezdőcímet kap.
Ezt még kidebugolom, viszont a memóriaszivárgás ismét kérdéses.
-
ArchElf
addikt
válasz
h1ght3chzor #1538 üzenetére
Nálam működik így:
int pm = getprojektmeret();
Project* temp1 = new Project [pm+1];
int i;
for(i=0;i<pm;++i){
temp1[i]=this->tomb[i];
}
temp1[i]=a;
this->tomb = temp1;
temp1 = 0;AE
-
ArchElf
addikt
válasz
h1ght3chzor #1536 üzenetére
A delete[] this->tomb; nélkül. Ugyanis ez is kitörli az eredeti elemeket.
AE
-
-
Chipi333
csendes tag
válasz
Jhonny06 #1533 üzenetére
"Mert gyakorlatilag egy bármilyen IDE-be bemásolom a forrást és ugyanúgy lefut a VS-ben használt kód mondjuk egy Code::Blocks-ban is."
Hát az IDE az aztán pont lényegtelenAz a kérdés, hogy milyen compiler van mögötte. Ha elég türelmes vagy VS-böl is tudsz g++-al forgatni, és CodeBlocksban is vc++-al.
A fordítók meg olyanok, hogy van egy bizonyos szint ameddig kompatibilisek, aztán meg nem annyira. Pl. Hello world nem fog elhasalni egyiken sem nyilván, meg a legtöbb szabványosan megírt kód sem, de a vc tud olyan dolgokat amiket a g++ nem és fordítva is. Ha meg elkezdesz mondjuk templateket irogatni mint a kolléga pár hsz-el lejjebb, akkor aztán esélyed sincs a hordozhatóságra -
Jhonny06
veterán
Tehát ha a VS-ben létrehozok egy bármilyen C++ projektet, akkor az tuti Visual C++? Egyáltalán honnan ismerem meg, hogy standard C++-e vagy nem? Mert gyakorlatilag egy bármilyen IDE-be bemásolom a forrást és ugyanúgy lefut a VS-ben használt kód mondjuk egy Code::Blocks-ban is.
-
ArchElf
addikt
válasz
h1ght3chzor #1524 üzenetére
Amit kiókumláltam (hiányos c++ tudásommal):
Project* temp1 = new Project [getprojektmeret()];
for(int i=0;i<getprojektmeret();++i){
temp1[i]=this->tomb[i];
}
delete[] this->tomb;
this->tomb = new Project[getprojektmeret()+1];
int k=0;
for(k=0;k<getprojektmeret();++k){
this->tomb[k]=temp1[k];
}
this->tomb[k]=a;
delete[] temp1;A második sorban referencia szerint másolod át az osztályokat, így hiába másoltad át, ha a referencia a temp1-ben ugyanoda mutat, mint a tomb-ben.
Miután az 5. sorban delete-tel kitörlöd a tömböt látszólag törlődik a temp1 tömb tartalma is, hiszen a delete igazából nem (csak?) a hivatkozás tömböt törli, hanem a mögötte álló tartalmat is. A következő sorbancsinálsz egy új tömböt az elemeidnek, de azok már valójában törlődtek az előző sorban, hiába másolod át a for ciklusban, már nem lesznek valid elemek (príma érvénytelen hivatkozásokat sikerül így generálnod. A második delete meg valószínűleg azért hal meg, mert már eleve érvénytelen hivatkozások vannak a tömbben.Alapvetően az alábbi lehetőségeid vannak:
- ne töröld az elemeket delete-el (se az elején se a végén), csak nullázd ki a tömbböt, az új elemet add hozzá egyszerűen (lehet, hogy memory leak-et okoz - bár jobban belegondolva taláűn nem is)
- nem kell a sok másolgatós mizéria, csinálj neki egy új tömböt a régit meg dobd el (kb ugyanaz mint az előző, kevesebb másolással), korábban már írtam hogyan
- add át érték szerint az elemeket - kell hozzá egy Project(const Project& p) konstruktor, amivel másolni tudod az elemeket. Bonyolultabb (illetve volatilis) osztályok esetén nem igazán működik, de ha mindenképp szeretnéd használni a delete-et akkor ide jó lesz.AE
-
WonderCSabo
félisten
-
-
Jester01
veterán
A template-k már csak ilyenek. A fordítónak látnia kell a definíciót, nem csak a deklarációt (mintha ezeket te kevernéd kicsit).
Olyat lehet játszani, hogy konkrét paraméterre explicit példányosítod akkor meg fogja találni másik fordítási egységben is.Amúgy nem véletlen, hogy az új módi szerint a "headereknek" nincs .h kiterjesztése. Szegény c++ nagyon el lett barmolva, hogy az interface és az implementáció összemosódik.
-
dany27
őstag
Sziasztok!
Kicsit meggyűlt a bajom a templatekkel....
Valamiért állandóan undefined refernce hibát kapok.. headerben megvan írva az osztály meg benne az össze tag fügvény definiciója, a cpp-ben az össze tagfügvény megírva és mégsem jó.Ha a headerben kifejtem a tagfügvényt akkor tökéletesen megy.
Ha nem a headert includeolom hanem a cpp-t egyből megy....(tudom hogy ilyent nem szabad, meilőtt megköveznétek)
Mi lehet a gond?
Előre is köszi!
-
proci985
MODERÁTOR
válasz
h1ght3chzor #1524 üzenetére
teljes kód nem kell, pl egy tömb típusa, még az a is elég szvsz.
tipp: szeparáld a tárolóclasst a projecttől, és teszteld pl egy célra létrehozott classal külön. szerintem egyszerűbb lenne, hacsak nem valami minimálprojektről van szó, ahol nem éri meg mindent szétválasztani.
"Egyébként stl tárolót, nem használhatok"
beadandó?WonderCSabo: jogos, push_back pedig tényleg a legegyszerűbb
.
Mindent van értelme dinamikusan kezelni, sokszor jól jöhet (bár nyilván ilyen kicsi feladatnál nem sok értelme van).
persze, de elnézve a kódot volt egy olyan sanda gyanúm, hogy itt valami egyéb követelmény is van a háttérben (tipikus c iskolapéldának tűnt).. -
WonderCSabo
félisten
válasz
proci985 #1523 üzenetére
ArrayListel egy sima add()
Ez nem Java. Vector és push_back()
más kérdés, hogy nem értem, hogy ez minek C++ alatt, amikor ott vannak a beépített funkciók.
Mindent van értelme dinamikusan kezelni, sokszor jól jöhet (bár nyilván ilyen kicsi feladatnál nem sok értelme van).
tippeltem, illetve tippelek.
Jaja, jó a gondolatmenet, csak arra akartam utalni, hogy jobb lenne bővebb kóddal kérdezni.
-
h1ght3chzor
őstag
-
proci985
MODERÁTOR
szerintem lehet egyel nagyobb is az eredeti tömbméretnél. leírás alapján nekem ez egy Cben használt dinamikus tömb megoldásnak tűnik. más kérdés, hogy nem értem, hogy ez minek C++ alatt, amikor ott vannak a beépített funkciók.
h1ght3chzor:
Memory::tomb[k]=a;a az itt micsoda? honnan jön? mi a típusa? szerintem ez is lehet baj.
tippek:
- használj változóneveket angolul, konvenciókkal. pl class scope változóneveknél m előtag sokkal átláthatóbb kódot eredményez.
- a this és Class:: jó móka, de legyél velük koherens
- ha nem ez volt a lényeg, akkor használd a beépített C++ funkciókat. vannak szép dinamikus listák, ez nem C. ArrayListel egy sima add() meghívásával megoldható a problémád
- getProjektMeret redundanciát és több helyen tárolt változókat jelent, amiket pl a mutatott kód alapján nem is updateltél. szerencsésebb a tömb méretét nem letárolni külön, vagy létrehozni egy külön container classot, ha mndenképpen sajátot akarsz írni.
(másképp: ránézésre vizsgafeladatnak hittem a problémád, annyira spagettiszerű. ez hosszú távon nem jó)ArchElf: még azon gondolkodtam el, hogy a tömbnél a tárolás hogy van megoldva, mert a delete[] elvileg csak a mutatókat törli implementációfüggően. nem vagyok benne biztos, de ez nekem gyanús, hogy leakelni fog (pl saját operator= segítségével nem).
WonderCSabo: tippeltem, illetve tippelek.
temp1[i]=tomb[i];
this->tomb=new Project [this->getprojektmeret()+1];
Memory::tomb[k]=temp1[k];mivel egy dinamikus tömböt megvalósító funkcióról van szó arrayekkel, a két tombnek elvileg ugyanoda kéne kerülnie. a két kódrészlet futás után csak akkor egyezik, ha ugyan ahhoz a classhoz tartoznak. hacsak nem tomb egyszerre van deklarálva globális változóként és a Memory class változójaként (és a this miatt ebben az osztályban) is, de az azért erős lenne. ha viszont eléri a tomb[]ot innen, tomb[], Memory::tomb[] és this->tomb[] megoldásokkal is, akkor jelen pillanatban a Memory classban kell lennünk, másképp három különböző tömbről lenne szó. habár, a this->tomb sor kiakad, szóval lehet, hogy mégse így van. ebből következtettem, hogy ha ez így működik, akkor a Memory classban kell lenni.
getprojektmeretnek classfunctionnak kell lennie, ami eltárolja az elvárt projektméretet és nem a tomb méretét adja vissza (egyébként az új projektnél kiakadna).
-
ArchElf
addikt
válasz
Jhonny06 #1519 üzenetére
így nem megy?
int pm = getprojektmeret();
Project* temp1 = new Project [pm];
for(int i=0;i<pm;++i){
temp1[i]=tomb[i];
}
delete[] this->tomb;
this->tomb=new Project [pm+1];
int k;
for(k=0;k<pm;++k){
Memory::tomb[k]=temp1[k];
}
Memory::tomb[k]=a;
delete[] temp1;Amúgy így nem jó?
int pm = getprojektmeret();
Project* temp1 = new Project [pm+1];
for(int i=0;i<pm;++i){
temp1[i]=tomb[i];
}
temp1[i] = a
delete[] this->tomb;
this->tomb = temp1;AE
-
ArchElf
addikt
válasz
h1ght3chzor #1510 üzenetére
Én ezt a getprojektmeret() hívást egyszer tenném be egy változóba és az egész eljárás alatt azt a változót használnám (gyorsabb és egyszerűbb is).
Amúgy mit csinál a getprojektmeret() metódus? Megnézi mekkor a tomb mérete?
Mert itt az elözö sorban épp törlöd a tömböd...
//...
delete[] this->tomb;
this->tomb=new Project [this->getprojektmeret()+1];
//...AE
-
doc
nagyúr
"Memory::tomb[k]=temp1[k];"
ha a masodik getprojectmeret()+1 nem ugyanakkora vagy kisebb mint az elso getprojectmeret(), akkor tulcimzed a temp1 tombot
-
Jhonny06
veterán
válasz
h1ght3chzor #1514 üzenetére
Nekem ez a sor gyanús, szerintem valami indexeléssel kapcsolat hiba lesz:
this->tomb=new Project [this->getprojektmeret()+1];
-
h1ght3chzor
őstag
válasz
h1ght3chzor #1513 üzenetére
-
h1ght3chzor
őstag
válasz
proci985 #1511 üzenetére
Getprojektmeretet szépen megkapom, azzal nincs probléma, itt vmi olyan érdekes dolog történt, hogy a tomb az egy Project* típusú, és mikor a for ciklusban visszamásolom az értékét a temp-ből, akkor az szépen meg is történik, de mikor a tomb[k], tehát az egyel nagyobbi részébe szeretném elmenteni az új projektet amit kaptam, akkor ott mintha nem is Projekt* tomb típusba mentené, hanem Projekt tomb[k]. Tehát gyakorlati példánál, ahol teszteltem: 1. Projekt amit elmentek nev: 1 meret: 1, ezt szépen el is menti, stb, 2. Projekt nev:2 meret:2, és ezt, a 2. Projektet menti el a Projekt tomb[k]-ba, és nem a Projekt* tomb-nek az elemei közé...
Egy kép róla: http://www20.zippyshare.com/v/10637883/file.html
Nem tudom mennyire érthető amit leírtam, ha vki gondolja, szívesen átküldöm az egész kódot.A getprojektmeret a Memory classhoz tartozik igen.
-
proci985
MODERÁTOR
válasz
h1ght3chzor #1510 üzenetére
(memműveletekben annyira nem vagyok jó)
szerintem itt a getprojectmeret lesz a hunyó, elvileg az a Memory classhoz tartozik, és a projectméret által visszaadott változó nem lesz updatelve az új, egyel nagyobb értékre. magyarul a következő másolásnál elveszik az utolsó eleme a tömbnek..
vagy esetleg fel lehet még hozni a hungrish elnevezéseket, meg az elnevezési konvenciók figyelmen kívül hagyását (getProjectSize / get_project_size), bár valszeg nem azokra gondoltak
-
h1ght3chzor
őstag
Segítséget szeretnék kérni, az alábbi kódrészletben hol a hiba?
Project* temp1 = new Project [getprojektmeret()];
for(int i=0;i<getprojektmeret();++i){
temp1[i]=tomb[i];
}
delete[] this->tomb;
this->tomb=new Project [this->getprojektmeret()+1];
int k;
for(k=0;k<getprojektmeret();++k){
Memory::tomb[k]=temp1[k];
}
Memory::tomb[k]=a;
delete[] temp1; -
-
doc
nagyúr
a jovore nezve egyebkent nem feltetlenul rossz valasztas, szoktak keresni kimondottan Visual C++ -os embereket allashirdetesekben
az mar az en szemelyes nyomorom, hogy nem vagyok hajlando Visual C++ -ban dolgozni, mar azt is igyekszem elkerulni hogy windowst kelljen latnom -
doc
nagyúr
válasz
peterszky #1502 üzenetére
meghogy szakerto... azert jol esett, koszonom
Qt-ben MINDENT lehettermeszetesen azt is amit te szeretnel
a (mellesleg peldaertekuen profi) doksibol kiderul hogyan1) igy hirtelenjeben nem tudok egyszeru megoldast ra (bar konnyen meglehet hogy van), de ha egy altalad kivalasztott delegate-et hasznalsz, konnyen megadhatod barmilyen elkepzelheto es elkepzelhetetlen modon hogy hogyan jelenjen meg, de azt is csinalhatod hogy az egyes indexekhez widgeteket rendelsz (ez utobbi azert SZVSZ nem tul elegans megoldas). de mondom, konnyen meglehet hogy van ra egyszeru megoldas, kicsit nezz korul a Qt doksiban, lehet hogy gyorsan rabukkansz
2) ajanlom figyelmedbe a setSelectionModel metodust (bovebben: [link]) a bonyolultabb kijelolesi modokhoz, illetve a setSelectionBehaviourt az egyszerubbekhez (mint pl. a teljes sor kijelolese)
lacces:
mar kaptal ra egy korrekt valaszt, annyival egeszitenem ki, hogy a Visual C++ az CSAK Visual Studio, barhol mashol csak allsz mint 'gyerek a szarban', mig a normal, standard C++ -szal barhova mehetsz, mindenhol mukodni fog (marmint a normalisan megirt kod) -
Lacces
őstag
Sziasztok!
Mi a különbség a sima C++ és a Visual C++ között?
-
peterszky
őstag
Ahogy néztem, a két fellelhető Qt téma eléggé halott, plusz Doc itt is megfordul, mint a téma egyik szakértője
Szóval két kérdésem lenne:
1. Az összeg mezőnél: van-e lehetőség, hogy ne ezt a tudományos alakot használja a nagy számokhoz? Az átméretezés nem segít.
2. Van-e olyan lehetősége a QTableViewnak, hogy kijelölni csak egy egész sort lehessen, mezőket egyenként ne, meg több sort se?
-
Jhonny06
veterán
válasz
h1ght3chzor #1500 üzenetére
Én a CodeToGo-t használtam egy ideig, de nem tud sokat, úgyhogy ne várj csodát. Jobb szerintem nincs.
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Fujitsu AKCIÓ!!! 14,1"-15,6"FullHD IPS,8.gen.i5,10.gen.i5
- HP Elitebook 840 G3 laptop (14FHD/I5-G6/8GB/256SSD/Matricázott) - Akku X
- Asus Rog Strix Gamer laptop makulátlan állapotban
- ThinkPad T14 Gen4 14" FHD+ IPS érintő Ryzen 5 PRO 7540U 16GB 256GB NVMe ujjlolv IR kam gar
- 16GB-os SODIMM (notebook) DDR4 RAM bazár - nézz be, lesz, ami kell neked!
- Lenovo Thinkpad x1 carbon 5i 7-7600u // Carbon 6 i7-8650 // carbon 7 i7-8365u touch
- Lenovo ThinkPad X13 G2 multitouch
- Beszámítás! Oculus Rift virtuális valóság szemüveg garanciával hibátlan működéssel
- Azonnali készpénzes félkonfig / félgép felvásárlás személyesen / csomagküldéssel korrekt áron
- Apple Ipad Pro 2 gen2 10,5" 2K retina A1709 64GB
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: CAMERA-PRO Hungary Kft
Város: Budapest