- btz: Internet fejlesztés országosan!
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Luck Dragon: Asszociációs játék. :)
- VoidXs: Tényleg minden játék optimalizálatlan?
- sziku69: Fűzzük össze a szavakat :)
- Hieronymus: A németországi vasúthálózat
- sziku69: Szólánc.
- gban: Ingyen kellene, de tegnapra
- Gurulunk, WAZE?!
- Hieronymus: Három júniusi képem
Új hozzászólás Aktív témák
-
Dave-11
tag
Néztem egy videót, amiben a srác létrehoz egy tömböt a dinamikus memóriában úgy, hogy a felhasználó adja meg a méretét:
cin >> size;
int * array = new int[size];
Aztán bejárja ezt a töböt egy for ciklussal, de egy valamit nem értek.
for(int i=0; i<size; i++)
{
array[i] = 7*(i+1);
}
A ciklusmagon belül az array elé miért nem kell a * operátor?
*array[i] = 7*(i+1); // miért nem így? -
-
chabeee
aktív tag
válasz
WonderCSabo #2092 üzenetére
ezt én így tanultam/csináltam:
class Vector {
double * elemek;
int mennyi;
public:
friend ostream & operator<<(ostream & os,
const Vector & v) {
for (int i = 0; i < v.mennyi; i++)
os<<v.elemek[i]<<" ";
return os;
}
}; -
WonderCSabo
félisten
válasz
Jester01 #2086 üzenetére
Bocs, teljesen hülye vagyok, összekevertem a másik iránnyal, általában kiíró operátort szoktam írni, elnézést kérek, nem figyeltem.
#include <string>
#include <iostream>
class c {
public:
// std::ostream& operator<<(std::ostream& os) { // ez nem megy
// return os;
// }
};
std::ostream& operator<<(std::ostream& os, c& a) {
return os;
}
int main() {
c a;
std::cout << a;
return 0;
} -
Jester01
veterán
-
chabeee
aktív tag
lenne még egy feladat.
van egy aru osztályom amiből származtattam elelmiszert és muszakicikket.
van egy raktár osztályom ahol árukat (élelmiszerekre és műszakicikkekre mutató pointereket tárolok)
A raktárban polcok vannak. tudjuk, hogy a raktárban hány darab polc van, és ismert az is, hogy egy polcon hány darab (minden polcon ugyanannyi) áru tárolható. Raktár osztályhoz van egy konstruktort amely paraméterként átveszi a raktárban tárolt polcok számát, illetve azt az értéket, hogy a polcokon egységesen maximum hány árú fér el.
kell egy addÁru függvény ami nálam így néz ki:bool raktar::addAru(aru* pt, int ppolc){
int i = 0;
while(i < max_aru && tomb[ppolc][i]){
i++;
}
if(max_aru > i){
tomb[ppolc][i] = pt;
return 1;
} else{
delete pt;
return 0;
}továbbá a main-ben így hívnám meg:
r1.addAru(new elelmiszer("Liszt", 540,2013,10,23),0); // a 0. polcra kerül
r1.addAru(new elelmiszer("Kenyer", 250,2012,11,17),0); // a 0. polcra kerül
r1.addAru(new muszakicikk("Hangfal", 12000,"Philips"),1); // az 1. polcra kerülmásoló konstruktor megvan, igaz lehet az a rossz, mai nap csináltam először 2 dimenziójú dinamikus tömböt:
raktar::raktar(int v1, int v2) : tomb(0), sz(0), polc(v1), max_aru(v2){}
raktar::raktar(const raktar & a){
tomb = new aru**[polc];
for(int i = 0; i < polc; i++){
tomb[i] = new aru*[max_aru];
}
for(int i = 0; i < polc; i++){
for(int j = 0; j < max_negy_aru; j++){
tomb[i][j] = a.tomb[i][j];
}
}
sz = a.sz;
polc = a.polc;
max_aru = a.max_aru;
}hiba: memória hiba miatt elszáll, valaki ötlet?
-
chabeee
aktív tag
válasz
WonderCSabo #2084 üzenetére
rendben, köszönöm
de igen, nekem is működik tagfüggvényként -
Jester01
veterán
válasz
WonderCSabo #2084 üzenetére
Ez nem igaz
Kiválóan működik tagfüggvényként is, miért ne menne?Zoli133: mi okozza a problémát? Kiveszed a halmazt a map-ból, onnantól meg iterálhatsz rajta kedvedre.
const set<string>& s = ab["foo"];
for(set<string>::const_iterator it = s.begin(); it != s.end(); ++it) ... -
Zoli133
addikt
Sziasztok kellene egy kis segítség.
Van egy map típusú objektumom, eslő kulcsa string, második egy set ami szintén stringeket tartalmaz, valami ilyesmi:
map<string, set<string> ab;A kérdés az, hogy hogyan tudok iterátort csinálni ami végig megy adott stringhez tartozó halmaz elemein?
Köszönöm a választ. -
WonderCSabo
félisten
válasz
chabeee #2083 üzenetére
Ehhez én annyit tennék hozzá, hogy gondolom azért térsz vissza az objektummal, mert szeretnéd, hogy láncolva lehessen hívni az operátort. Csak ez úgy nem fog működni, ha tagfüggvényként deklarálod.
Ha tagfényként deklarálod, például így:
class CS {
public:
CS& operator<<(int be);
};Akkor az valójában így fog "megjelenni" fordítás után:
CS & operator<<(int be, CS& cs);
Ezzel még működni fog ez a hívás:
cs << 2;
De ez már nem:
cs << 2 << 3;
Megoldás: ha szeretnéd, hogy láncolni lehessen, globális operátort kell definiálnod, így:
CS & operator<<(CS& cs, int be);
-
-
modder
aktív tag
-
chabeee
aktív tag
sziasztok, operátor túlterhelést vettünk, de az indulásnál elakadtam.
// 1.: Irjal egy CSet osztalyt, amely int-eket tarolo halmaz. Az osztaly rendelkezzen egy egesz erteket varo
// konstruktorral, amely inicializalja a belso adatszerkezetet ugy, hogy az objektum annyi elemet tudjon tarolni,
// amennyi a parameter erteke. Ird meg a masolo konstruktort, es a destruktort is.// 2.: Terheld tul az << operatort ugy, hogy a segitsegevel uj elemeket lehessen belerakni a halmazba. Figyelj arra,
// hogy a halmazban minden elem legfeljebb egyszer fordulhat elo!
// {
// CSet a(60);
// a<<3<<4<<53<<3;
// }első az megvan, csak hogy értsétek mi a feladat azért másoltam be
-
modder
aktív tag
válasz
mgoogyi #2079 üzenetére
Hali,
Azt hiszem igazad van, a "A b = B();" tényleg az A copy konstruktorát fogja meghívni, tehát ez egy A objektum lesz. Akkor viszont pvt.péter felvetésére mégis csak jogos, hogy a dinamikus kötés csak pointeren keresztül lehetséges C++-ban. De nem a stack vs. heap miatt, hanem a pointer miatt.
Megnéztem az egyik régi házimat, ahol nem lehetett new operátort használni, és így oldottam meg:
Henger henger;
Asztal asztal;
Object* objects_[ MAX_OBJECTS ] = {&henger,&asztal};Ezt csak azért írom, mert a new operátort direkt el akartam kerülni az egész példámban, hogy látszódjon, anélkül is lehet dinamikus kötést alkalmazni.
Köszi a tisztázást!
-
mgoogyi
senior tag
"A b = B();"
Itt lehet van egy kis zavar az erőben, ugyanis ez a sor arra enged következtetni a 'b' változónévvel, hogy ez egy B típusú objektum lesz.
Holott ez a sor a következőt a jelenti:
A b ( B() );
Azaz hozz létre egy A típusú objektumot annak a copy konstruktorával, amely egy B objektumot kap paraméterként.
Ennek két lényeges aspektusa van.
Egyrészt a B() objektumból ledarálódik minden és A típusú objektum marad, merthogy a copy konstruktor érték szerinti A típusú bemenetet vár.
kb így néz ki és defaultból létrejön a copy constructor: A (A input)
Ez a ledarálás az ős irányába meg mindig implicit ( ~= láthatatlanul magától) megtörténik.Másrészt A típusú objektum fog létrejönni.
Másik dolog, hogy ez a kései virtuális kötés csak pointeren és referencián keresztül értelmezhető.
-
modder
aktív tag
válasz
pvt.peter #2074 üzenetére
Szia, Karmának igaza van mindkét esetben. A heap vagy stack nem befolyásol semmit a virtuális függvények terén, a new operátor pedig tényleg hibát dobna az első esetben. Javítva:
A b = B();
b.valami();
// most vonatkoztassunk el attól, hogy ugyanaz a változónév
B b = B();
b.valami()(már régen c++-tam)
-
-
pvt.peter
őstag
class A {
public:
void valami() { std::cout << "A"; }
virtual void virt() { std::cout << "A"; }
}
class B : A {
public:
void valami() { std::cout << "B; }
void virt() { std::cout << "B"; }
}És ha ezek helyett:
A b = new B();
b.valami();
B b = new B();
b.valami();ezek lennének:
A* b = new B();
b.valami();
B* b = new B();
b.valami();akkor is "A" illetve "B" íródna ki? Tehát nem befolyásolná az, hogyha heapen van létrehozva?
-
pvt.peter
őstag
mgoogyi: és modder köszönöm szépen a válaszaitokat, illetve a részletes példákat is.
-
modder
aktív tag
Hali,
Csinálsz egy 10 elemű segédtömböt, amibe a 10, tag1 attribútum szerinti legkisebb értéket fogod tárolni. Ez a segédtömb tag1 szerinti NÖVEKVŐ sorrendben fogja tartalmazni az Adatszerk típusú adatokat.
Végigiterálsz az eredeti tömbön, és minden egyes elemére megnézed, hogy a tag1 attribútuma kisebb-e, mint a legnagyobb tag1 attribútum a segédtömbödben. Ha igen, akkor az addigi 10 legkisebb közé be fog kerülni, err szolgál a pushMin() metódus.struct Adatszerk {
int tag1;
int tag2;
}
// legyen egy listád az adatszerkezettel
Adatszerk adatok[] = { Adatszerk(1,1), Adatszerk(1,2), ... }
int adatokSize = 50 // vagy akármennyi
Adatszerk[] legkisebb10 = Adatszerk[10];
initLegkisebb10( legkisebb10 ); // mindegyiket feltöltöd legalább akkora értékkel, amekkora maximum értéke lehet tag1-nek
for( int i = 0; i < adatokSize; i++ ){
if( adatok[i].tag1 < legkisebb10[9].tag1 ) {
pushMin( legkisebb10, adatok[i] );
}
}
// ezzel a függvénnyel növekvő sorrendbe szúrjuk be 'legkisebb10'-be a legkisebb tag1 attribútum szerinti
// adatokat
void pushMin( Adatszerk[] legkisebb10, Adatszerk adat ) {
int i = 0;
for ( i = 0; i < 10 ; i++ ) {
if ( adat.tag1 < legkisebb10[i].tag1 ) {
break;
}
}
// a legkisebb10 tömbben az i. helyen volt az elem, ami már nagyobb volt 'adat'-nál
// ezért oda tesszük be az 'adat'-ot, és a maradékot hátra toljuk a tömbben
// fontos, hogy a for-ciklus a tömb hátulja felől menjen i-ig
for( int k = 9 ; k > i ; k-- ) {
legkisebb10[k] = legkisebb10[k-1];
}
// i-edig helyre beszúrjuk az új 'adat'-ot
legkisebb[i] = adat;
}Amit WonderCSabo is említett, ha nem olyan nagy a listád, szóval lemásolhatod, akkor lehet, hogy egyszerűbb először rendezve lemásolni, majd az első 10-et kiírni
-
WonderCSabo
félisten
A következőt teheted:
1. lépésben kiválasztod a 10. legkisebb elemet valamelyik kiválasztó algoritmussal.
2. lépésben még egyszer végigiterálsz a listádon, és ha az aktuális elem kisebb vagy egyenlő a 10. legkisebb elemmel, akkor kiírod.Arra figyelj, hogy van a linken felsoroltak között van olyan algoritmus, ami megváltoztatja a listádat. Ha olyat használsz, akkor először másold le az egész listát, hogy az eredeti ne változzon.
Egy másik módszer lehet, hogy ha rendező algoritmust használsz, vagy elemeket rendezetten tároló segéd adatszerkezetet, de asszem egyszerűbb lesz számodra az előző megoldás.
-
Brumi˘
addikt
Üdv all!
Egy kis segitséget szeretnék kérni. Olyan feladatom van, hogy adott egy struktúra aminek 5 eleme van.
Ebből kellene kinyernem az egyik elem szerinti 10 legkissebbet, úgy hogy az eredeti struktúra sorrendje változatlan maradjon. (kezdő vagyok még a témába) A segítséget előre is köszönöm.
-
WonderCSabo
félisten
Miért, elég egyszer is végigmenni a fájlhoz egy ilyen lekérdezéshez.
akiknek csak egy sikeres próbálkozása (150 cm-nél magasabb ugrása) volt
Megnézed, hogy az aktuális épp beolvasott embernek hány nagyobb ugrása volt, mint 150, ha 1, akkor kiírod a konzolra a nevét.valamint adja meg a legjobb ugrást teljesítő sportoló nevét és összes eredményét!
Sima max keresés az ugrás magassának függvényében, ezt tudod egy menetben az előző lekérdezéssel végezni. Temporális változóban tárolnod kell az éppen legjobb sportoló összes eredményét.Látható, hogy az egész cucchoz a memóriában két ember adatait (a struktáradat) kell tárolnod, egyrészt az éppen legjobbnak tartottat, másrészt az éppen beolvasottat, és egyszer végigolvasni a fájlt elég is.
-
scream
veterán
válasz
mgoogyi #2067 üzenetére
Van egy konkrét feladatom :
"Egy szöveges állományban tároljuk egy magasugró verseny eredményét. Az állomány minden sorában egy-egy versenyző adatait találjuk: a versenyző nevét (szóközök nélküli szöveg) és mellette azt, hogy az egyes próbáknál mekkorát ugrott. A versenyen egy versenyző 6-szor próbálkozhatott. Ha leverte a lécet, X a próba eredménye, ha kihagyta az adott magasságot, akkor O. Feltehetjük, hogy az állomány helyesen van kitöltve.
Listázza ki azoknak a nevét a konzolra, akiknek csak egy sikeres próbálkozása (150 cm-nél magasabb ugrása) volt, valamint adja meg a legjobb ugrást teljesítő sportoló nevét és összes eredményét! "Például az input fájl adatai:
Nagy_Bela 120 X O 125 130 X
Kiss_Agoston 140 145 X 150 155 X
Toth_Pal 135 O 140 145 X 155Namármost kell használnom szekvenciális inputfile-t, majd a két feladatra kell egy keresést meg egy max.kiv-t csinálnom, nem ?
Én úgy indultam neki, hogy egy struktúrában (7 string) vannak az adatok, a beolvasás is megvolt, az adatok a megfelelő helyen szerepelnek. Viszont innen most nem tudom hogyan induljak tovább, mert csak 1-szer lehet bejárni a meghívott file-t.
Intervallumos progtételek : ITT.
Nevezetes felsorolós progtéltelek : ITT -
modder
aktív tag
-
modder
aktív tag
Ez így elég absztrakt. Ez az iterátor akar lenni? Iterátort azért használnak, hogy elrejtsék a tároló adatstruktúra sajátosságait. például ha tároló struktúra egy bináris fa, azt nem tudod tömbként visszaadni anélkül, hogy le ne másolnád az egész struktúrát, aminek nem sok értelme van. Ezért csinálnak iterátort.
-
scream
veterán
Egy olyan kérdésem volna, hogy magasabb szinteken mennyire használatosak a nevezetes/egyéni felsorolók ?
Mert most a 2. progbeadandóban nevezetes felsorolókat kell használni (szekvenciális input file) és nem nagyon értem, pontosan mi előnyöm van belőle,ha felsorolóval írom meg?
Miért jobb felsorolókat használni, mint mondjuk sima intervallumos tételeket alkalmazni?
Nekem sokkal bonyolultabbnak és sok felesleges dolognak tűnik, bár valószínű én nem értem
-
mgoogyi
senior tag
válasz
axelf92 #2056 üzenetére
Valami ehhez hasonló kéne legyen az osztályod:
template < class Key, class Value>
class HashArray
{
bool Insert(const Key & index, const Value & value);
Value operator[] (Key index) { return ...}
stb..
}A kérdés az, hogy a mögöttes adatstruktúra hogy kéne, hogy kinézzen.
Két általános módszer van:
1, Bináris fában vannak a kulcs-érték párok. Ezesetben a kulcsra értelmezhető kell legyen a < operátor.
2, Vagy úgynevezett bucketokban, kb van egy tömb, aminek minden eleme egy lista. A tömbbéli indexet valamiféle hasheléssel találod ki. Pl. ha a kulcs egy szám és 1024 elemű a belső tömböd, akkor a kulcs % 1024 helyen lévő listába tolod bele az új elemet. Csakhogy itt generikus kulcsról van szó, azt nem annyira triviális hash-elni.Itt valszeg az 1-es az ésszerű irány, ami nagyrészt ugyanez, mint az stl mapje:
pl:
#include <map>
#include <string>
std::map<int, std::string> m;
m[1] = "kutya";A legegyszerűbb az lenne nyilván, ha lenne belül egy std::map-ed memberként. (leszármaztatni nem szabad belőle)
De valszeg az 1-es irányt akarja az oktatód, szerintem kérdezd meg, hogy arra gondolt e. -
modder
aktív tag
válasz
pvt.peter #2057 üzenetére
Hali. Polimorfizmus (többalakúság, ugyanolyan ős típusú objektumok másképpen viselkedhetnek). Amikor több osztályod van, ami ugyanazokat a tulajdonságokat (metódusokat) definiálja, ezért közös ősből származik, de mégis minden osztály egy kicsit másképpen viselkedik, vagyis kicsit más az implementációjuk, viszont az interfészük (amit az osztály használója lát) megegyezik.
Most hirtelen a Java JDBC API jut eszembe:
//Create the connection using the static getConnection method
Connection con = DriverManager.getConnection (connectionURL);
//Create a Statement class to execute the SQL statement
Statement stmt = con.createStatement();Itt a DriverManager egy factory osztály, ami olyan Connection példányt ad vissza, ami adatbázis specifikus a szerint, hogy milyen adatbázis típus szerepel a connection URL-ben. A Connection csak egy interfész, minden konkrét adatbázis JDBC driver a sajátját specifikálja, és a konkrét, con változóhoz kötött példány lehet, hogy mondjuk MysqlConnection típus lesz. Itt a lényeg az, hogy a MysqlConnection a Connection-ből származik, és felülírja a Connection metódusait.
Ami fontos megjegyezni futás időben fog eldőlni, hogy melyik metódus fog meghívódni, mert fordításkor lehetetlen eldönteni a fenti kódrészletből, hogy a con változó konkrétan milyen osztály lesz.
C++-ban explicite ki kell írnod a virtual kulcsszót a függvény elé. Ha nem teszed ki, akkor is felülírhatod a metódust, de nem biztos, hogy azt az eredményt fogod kapni, amit vársz. Például
class A {
public:
void valami() { std::cout << "A"; }
virtual void virt() { std::cout << "A"; }
}
class B : A {
public:
void valami() { std::cout << "B"; }
void virt() { std::cout << "B"; }
}A b = new B();
b.valami(); // "A" fog kiíródni, mert valami() nem virtuális, tehát a változó "statikus" típusa alapján dől el, hogy melyik metódus fog meghívódni. A statikus típus pedig "A"B b = new B();
b.valami(); // itt a statikus típus "B", tehát "B" fog kiírodóni.Ezzel szemben
A b = new B();
b.virt(); // itt "B" fog kiíródni azért, mert a virt() függvény virtuális. futás időben a virtuális függvény táblából a program megnézi, hogy melyik konkrét függvény hívódjon meg. Mindezt a b változó futásidejű (dinamikus) típusa alapján, ami itt "B"Heterogén kollekciókban szokták hasznát venni, amikor (mint az első példában) egy közöt ős van, ami szolgáltatja az interfészt, de többféle implementációt tárolsz egy tömbben vagy listában. Amikor végigiterálsz rajtuk, hogy meghívd mindegyiken valamelyik metódusát, nem kell foglalkoznod a konkrét típussal, ami nagyban leegyszerűsíti a programozó munkáját. Ez annyira az általános elvárt működés, hogy Javában minden metódus virtuális. Ha nem akarod, hogy valamelyiket felül lehessen írni, akkor a final kulcsszót kell elé tenni.
Amikor egy osztályt kiterjeszthetőségre tervezel, ki kell választanod azokat a metódusait, amiket felül lehet majd írni, és virtuálissá teszed őket. Ezzel elég körültekintőnek kell lenned, mert egy felülírt virtuális metódus a származtatott osztályban el is ronthatja az alap működést.
-
mgoogyi
senior tag
válasz
pvt.peter #2057 üzenetére
röviden:
polimorf osztályoknál van értelme, amikor specializálod a működését az ősosztálynak és minden leszármazottat kezelhetsz úgy, mint ha az egy ősosztálybeli objektum lenne.
pl. minden almát és körtét kezelhetsz gyümölcsként
pl. Akkor van ennek haszna, mikor van egy rakás valamilyen gyümölcsöd mondjuk egy halmazban és együtt akarod kezelni őket, mert pl. az adott helyzetben számodra nem lényeg, hogy milyen specializált gyümölcsről van szó.Amikor örökölsz, akkor a virtuális függvények mindig befigyelnek!
hosszan:
class Gyumolcs
{
...
virtual void print() {printf("gyumolcs")}
...
};
class Alma() : public Gyumolcs
{
...
virtual void print() {printf("alma")}
...
};
class Korte() : public Gyumolcs
{
...
virtual void print() {printf("korte")}
...
};
Gyumolcs * a = new Alma();
a->print(); //azt írja ki, hogy alma, pedig ez egy Gyumolcs pointer
/*mivel: a virtuális függvényeknél futási időben dől el (dinamikusan), hogy mi hívódik (megnézi, hogy valójában milyen objektumról van szó és annak a függvényét hívja - a háttérben egyébként van az objektumnak egy virtuális táblája és abból nézi ki, hogy mit kell hívni)
ha nem virtuális lenne a függvény, akkor fordítási időben (statikusan dőlne el, mit kell hívni és "gyumolcs" íródna ki)*/ -
pvt.peter
őstag
Sziasztok!
A virtuális függvények használatára tudna vki olyan példát mondani, ami megmutatná, hogy ténylegesen mi értelme van ezek használatára? Illetve milyen helyzetekben érdemes használni őket?
Köszi,
Peti -
axelf92
csendes tag
Sziasztok!
A C++ házi feladatom felépítéséről nem sok fogalmam van, ezért szeretnék segítséget kérni. Ez a következő:Kulcs-érték párokat tároló generikus asszociatív hash tömböt kell létre hozni, melyben az elemek hash táblában tárolódnak. A kulcs és az érték osztályok legyenek sablonparaméterek, a kulcsokat az < operátorral lehessen összehasonlítani. A tömbhöz lehessen új elemeket hozzáadni, módosítani, törölni, lekérdezni, hogy adott kulcshoz van-e érték tárolva. Működjön az indexelő operátor is és valósítsa meg a másoló konstruktort, az értékadást és az egyenlőség vizsgálatot is!
Jelenleg a fő problémám, hogy az osztályok hogyan nézzenek ki, tehát legyenek leszármaztatva valamiből, vagy egyik a másikból? És az osztályokban milyen private tagok legyenek?
A függvényeket szerintem meg tudom írni, de ehhez kellene tudnom, hogyan néz ki az egész struktúra, ami gondot okoz, mert nem beszéltünk asszociatív tömbökről. (tehát ebben is örülnék bárminemű segítségnek
Köszönöm, hogy elolvastad.
-
Ton-ton
tag
modder, Karma köszönöm.
-
modder
aktív tag
válasz
Ton-ton #2050 üzenetére
nekem az Eclipse jól bevált C++-ra. Automake meg mindenféle van benne, cross-compilingra is biztosan be lehet lőni. Lehet, hogy nem tökéletes, de elég jól működik benne a kódkiegészítés, meg minden cucc. A Qt developert még nem próbáltam ki sima C++ alkalmazás készítésére, egyszer volt alkalmam vele találkozni, és nagyon tetszett az egyszerűsége és gyorsasága.
-
Karma
félisten
-
Ton-ton
tag
Sziasztok!
Azt szeretném kérdezni, hogy tudtok-e fejlesztőkörnyezetet ajánlani. A tervezett program (úgy szoktam tanulni, hogy egy konkrét programot írok meg, lehet vitatni a módszert, nekem ez vált be) képmanipulálásról szól, több nyelvű, ablakos, és keresztplatformos.
A problémát az okozza hogy Linux alatt szeretném fejleszteni, viszont innen kellene (Windowsos) exe-be is fordítani. (Linuxra is, de feltételezem az nem gond) Nincs jelenleg lehetőségem win-t telepíteni (abból is csak XP licenszem lenne).
Maga a program ingyenes lenne zárt forráskóddal. Előnyben részesíteném lehetőleg a nem kereskedelmi programokat (pl. Qt fizetős a kereskedelmi programoknál, ami csupán zavaró).Előre is köszönöm a segítséget.
Ui:
Csak közepes mértékű php ismeretem van, és minimális TP. -
icons
addikt
Hello!
Szeretnék C++ul megtanulni.
Tudnátok ehhez valami jó könyvet /tutorialt ajánlani? (a neten persze sok megtalálható, a kérdés a minőség)Eddig C#ban programoztam, egy keveset Java-ban is. Elsősorban angol irodalom érdekelne. Az alapokat valamennyire értem, de sose baj, hogyha az is benne van! (de azt, hogy mi az a programozás, mi az osztály és mire használjuk, na ezeket a részeket jó eséllyel átugram majd
Köszi szépen!
-
Vico87
tag
Szerintem a legegyszerűbb, ha bool[16]-ot használ, mivel úgy könnyen hozzá lehet férni az egyes "bitekhez," a kód szemléletesebb, és nem utolsó sorban ez egy tanulási célú házi feladat. Szerintem arra megy ki a játék, hogy implementáljon egy saját matematikai típust, operator overloadinggal.
Az már más kérdés, hogy mennyire értelmes vagy életszerű maga a feladat.
-
WonderCSabo
félisten
Vagy akár lehetne std::bitset.
-
modder
aktív tag
válasz
Spam123 #2042 üzenetére
ha unsigned shortban vagy intben tárolod a számokat, akkor a biteket nem tömbelemekként éred el, hanem bitszintű operátorokat kell használnod. maszkolnod, shiftelned kell &, >> és << operátorokkal.
Talán kicsit bonyolultabb, de szerintem szebb megoldás, ha már alacsony szintű működést kell szimulálni. Meg kevesebb helyet is foglalsz így, mert egy boolean változó a memóriában szintén lefoglal vagy 2 byteot, ami összesen 32 byte. -
Spam123
tag
Köszönöm! Itt az erőforrásigény a legutolsó szempont, a lényeg, hogy működjön. Esetleg nem található valami minta program valahol?
dabadab:
És az miért lenne jobb mint a bool tömb? Minden platformon ugyanúgy futna? Azért válaszoztam a bool-t mert az linuxon se tud hülyeséget produkálni.
-
Vico87
tag
válasz
Spam123 #2039 üzenetére
Szia!
Szükséged lesz további tagfüggvényekre is. Egyrészt decimálisból is kell konvertálnod kettes komplemensre, másrészt valahogy a hibákat is kell tudni jelezni (pl. overflow, underflow, nullával osztás, ...). Ami jó volna, ha implementálnád ezeket a műveleteket operátor túlterheléssel is, így tömörebb, olvashatóbb kódot is lehet majd írni a tesztelésre.
A kettes komplemenses számábrázolás egyik előnye, hogy az alapműveletek úgy mennek, mint "sima" bináris számoknál egy-két apróságtól eltekintve. Az angol wikipédián szépen le is vannak írva, példákkal ([link]). Az osztásra sokféle módszer van ([link]), ha nem teljesítménykritikus a feladat, akkor elég a legegyszerűbb, naiv módszer, azaz a sorozatos kivonás, ami kb 5 sor kód, felhasználva a korábban implementált kivonást. Persze, ha gyorsan kell az eredmény, akkor a linkelt oldalon le vannak írva sokkal trükkösebb és egyben gyorsabb algoritmusok is.
-
Spam123
tag
Sziasztok!
16 jegyű kettes komplemensű konvertert kéne írnom C++ -ban, a számokkal a 4 alapműveletet is kéne végezni. Egy kis segítséget kérnék az elindulásban, mert elakadtam.
Arra gondoltam, hogy egy fix 16 méretű bool tömbbe kéne betölteni a decimálisan kapott számokat, majd azokkal végezném a műveleteket.
Eddig arra jutottam, hogy 1 osztályom lesz amiben lesz 5 tagfüggvény:
4 darab a 4 alapművelethez
1 darab a konvertáláshoz 2-es komp.-ből decimálisba.Kb. eddig jutottam. Most az algoritmusokat kéne megtervezni, hogy hogyan kellene kettes komplemensű számokkal a 4 alapműveletet elvégezni. Nem tud valaki valamit erre?
Továbbá hogy lehetne könnyen kettes komplemensűvé varázsolni a a decimális számot ahogy bekérem az elején?
-
gabs84
csendes tag
na jó, megoldódott a probléma a következő módon.
kicsit még szétnéztem és megpróbáltam összerakni amiket itt is hallottam.
lényeg hogy amit pl megjelenítéssel megírok és futtatásnál egyből kilép, de ha dos alatt futtatom szépen kiírja amit megírtam.
na persze nektek ez lehet hogy alap csak én ezt nem tudtam, de mostmár legalább látom hogy mit csinálok.
köszönöm a segítséget
-
gabs84
csendes tag
felraktam a codeblocksot, lefut, jó, de full szürke háttér. mi a gond?
mármint bejön az ablak , meg is áll de szürke háttér és semmi szöveget nem látni
-
gabs84
csendes tag
kapisgálom...
ha jól értem akkor ezt a beállítás dolgot code blocksra írtad. teszek vele egy próbát mert dev c++-ban nincs ilyen lehetőség, végignéztem a súgóját is -
gabs84
csendes tag
#include <stdio.h>
int main (void)
{
printf ("remelem sikerul...\n");
char ch;
cin >> ch;
return 0;
}ezt próbáltam, én így értettem de nem jó.
C:\Dev-Cpp\Gabs 1.0\1.cpp In function `int main()':
7 C:\Dev-Cpp\Gabs 1.0\1.cpp `cin' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)csak találgatásaim vannak hogy mit akarhat én még ezt így nem értem,
segíts, hogy kéne kinéznie.
köszönöm -
WonderCSabo
félisten
Alapvetően ez minden programnál így van. Ha minden feladatot elvégzett, akkor leáll. Épp ezért az IDEk a parancssorok progik esetén maguk akasztják meg a parancssor ablak bezárását, pl. a Code::Blocks is ezt teszi, alapból. Projectre jobbgomb -> Properties -> Build targets -> Pause when esecution ends.
-
gabs84
csendes tag
válasz
WonderCSabo #2030 üzenetére
megpróbálom köszi.
de akkor ezt gyakorlatilag az összes ilyen megjelenítős végére oda kell majd rakni ugye?
annyit még megkérdeznék hogy ez miért van? más a program? ez mindegyiknél így van már? azért csak eltelt 9 év, vagy ez csak ennél a proginál van így?
később már érteni fogom hogy mi ez amit mondtál de most még csak így elfogadom
már csak azért is kérdezem mert főleg ilyen régebben írt könyveket találtam, mire számítsak ezekkel?
amúgy meg köszönöm szépen, mindjárt rápróbálok aztán majd visszajelzek, mennie kell.
-
gabs84
csendes tag
Sziasztok, üdv mindenkinek.
Teljesen új vagyok, és egy nagyon alap kérdéssel fordulok hozzátok hosszú próbálkozás és olvasgatás után.Lényeg hogy el szeretnék kezdeni programozást tanulni és a C++ nyelvet választottam. Eddig még nem is volt gond, full alap dolgot kéne megcsinálnom, kiíratni egy szöveget a programmal.
Legelején tartok, a Stephen G Kohan - Programfejlesztés C nyelven könyvet sikerült beszereznem.
Amivel megakadtam, hogy nem találtam olyan fordítót ami IDE felülettel lenne és egyszerűen le tudnám fordítani a parancssort. végigpróbáltam vagy 6-8-at, nem vicc. a legtöbb ami elérhető volt az paracssoros, de azon nem tudok elmenni, nekem ez a programozás ma kezdődött, és soha nem használtam parancssort.
ami tetszett volna az a DEV-C++ volt, de ha pl beütöttem a könyvben levő példát, egy pillanatra felvillant az ablak és semmit nem láttam belőle. pedig a lefutásnál sikeresnek írta. utánanéztem, másnak is előfordult ilyen ezzel a programmal. hogy ez miért van nem tudom, írták hogy be kell írni ezt azt és akkor jó lesz de pl rápróbáltam egy konkrét példára amit írtak, lefuttattam ok, aztán bejött az ablak hogy nyomjak egy billenty, aztán kilépett. lol. valszeg nem jól volt megírva... de ezt nem tudom.
szóval nekem egy olyan IDE felületű egyszerű program kellene amivel a 2004-es könyv szerint be tudom tolni a dolgokat és működik. most még tanulok... kombinálni később szeretnék, egyelőre próbálom megérteni a dolgokat ami eddig még jól is ment csak nem tudok így gyakorolni.
próbáltam mindenfélét, de vagy elbénáztam, vagy nem volt semmi indító része a programnak amivel elboldogultam volna.
Eclipse CDT, Borland 5.5, gcc -nél nem találtam felületet, microsoft visual vmiért nem ment fel, qt-t nem vágtam pedig kerestem benne össze vissza.
alapból nem szoktak gondjaim lenni a programok installálásával, meg ha valami elsőre nem megy utánaolvasok és meg szoktam tudni oldani de itt most elvéreztem.
segítsetek légyszíves, adjatok egy működő formát kérlek.
elnézést hogy ilyen hosszú lett, a segítséget pedig köszönöm
várom válaszotokat.Gábor
-
Petyyyyy
addikt
Üdv uraim!
Egy eléggé elborult kérdéssel fordulnék hozzátok. Szeretném megkérdezni, hogy véleményetek szerint egy közepes C++ tudással( a tanulás jelenleg is folyik és C++ ban guru segítsége is várható) kb. 6 hónap alatt elkészíthető-e egy olyan alkalmazás, amely megváltoztatja a Windows témát (akár már meglévő témafájlok alkalmazásával), lecseréli az ikonokat, a használt fontokat, wallt? Egy ilyesmit szeretnék összedobni, de nem tudom elég lenne-e rá az idő. A válaszokat/véleményeket előre is köszönöm.
-
Karma
félisten
válasz
beast27 #2022 üzenetére
Nem, ez a topik áll legközelebb hozzá.
De a kérdésed sokkal alapvetőbb, szerintem üss fel valami szakirodalmat.
-
dabadab
titán
válasz
beast27 #2022 üzenetére
C# programozás [Olvasd el az #1 hozzászólást!]
Egyebkent a fort arra hasznaljak, hogy utasitasokat tobbszor futtassanak le. Amit te irtal, az tizszer fog lefutni: az elejen beallitja, hogy i erteket 1 legyen (i=1), aztan megnezi, hogy teljesul-e az a feltetel, hogy i ne legyen nagyobb tiznel (i<=10), aztan lefuttatja a ciklusmagot (azokat az utasitasokat, amiket tobbszor kell futtatni, ezt a reszt nem irtad oda) es a vegen megnoveli eggyel i-t (i++).
-
beast27
senior tag
Sziasztok tudom hogy nem ide tartozik de ez az a topic ami legközelebb áll a témához
Tudna valaki segíteni c# programozásban?
Meg tudná magyarázni valaki hogy mi az a for (pl: for (i=1; i<=10; i++)), és mire használják? -
Vasinger!
nagyúr
Van itt valaki akinek megvan a SZAK kiadótól a Szoftverfejlesztés C++ nyelven című könyvhöz tartozó CD melléklet?
Ha igen, megtenné hogy feltenné nekem valahova?
Megvettem a könyvet, sajna nem kaptam hozzá valamiért.Nagyon hálás lennék érte!
-
modder
aktív tag
Hát itt alapvetően 3 lehetőséged van szerintem.
1) OpenGL/DirectX. Én csak az előbbihez értek. Kirajzolni egyszerű 2D objektumokat nem túl nehéz. Az ablakkezelőt GLUT-nak hívják, és setuppolni windows alatt egy freeglut környezetet nem olyan egyértelmű, de vannak tutorialok neten. Kirajzolni egyszerű alakzatokat viszont nem nehéz pl.: http://www.gamedev.net/page/resources/_/technical/opengl/basics-of-glut-r1680 . Ja, GLUT, OpenGL elvileg platformfüggetlen.2) GnuPlot library http://www.gnuplot.info/download.html . Ez csak egy gyors ötlet volt, elvileg ezt is fel tudod tenni windowsra, ha van egy MinGW környezeted. Linux alatt valószínűleg ez is csak egy yum install gnuplot-dev vagy aptitude install gnuplot-dev.
3) valamilyen grafikus könyvtárat használsz, mint Qt, GTK+ vagy wxWidgets. Sajnos nem tudok róla nyilatkozni, hogy melyiket milyen egyszerű használni, de elvileg mind a három multiplatform. Mindegyikben van canvas-szerű komponens, amivel 2D ábrákat gyárthatsz. Most így hirtelen az a megérzésem, hogy wxWidgets talán pont megfelelne.
4 (bónusz) Ha csak ábra kell, generálj képet pl. ezzel: http://cairographics.org/samples/.
vagy generálj HTML-ben egy SVG képet, majd nyisd meg böngészőben.Mivel én már használtam OpenGL-t, ezért én azt választanám. Ha kell valami extra, mondjuk külfönféle görbéket akarsz illeszteni a mintavételi pontokra, arra fog kelleni valamilyen másik library, de alapvetően megjelenítésre az OpenGL még mindig megfelelő.
-
Déta
tag
Én írom.
Én bármire nyitott vagyok, ami egyszerűen kirajzol egy téglalapot rajta körökkel. -
Déta
tag
Sziasztok!
Egy óriási segítségre lenne szükségem, mert az idegösszeomlás szélén állok.
Disszertációs témáként egy szimulációt kell írnom C++-ban, és szeretném az adatokat megjeleníteni grafikusan. Nem kell nagy dolog legyen: téglalapok, körök, pontok. Ennyi.
3 napja nem találtam egy értelmes programot, amivel ezt a kettőt meglehetne csinálni.
Kérlek, adjatok valami tippeket.
Fáradozásaitokat előre is köszönöm. -
Karma
félisten
válasz
Dave-11 #2012 üzenetére
Miért pont a GTK-t választottad? Egyrészt az egy C library, nem C++, másrészt ha nem kötelezően ez a parancs, miért nem Qt?
A kérdésre válaszolva a lib használatához két dologra van szükség: az include path helyes beállítására (hogy a C fordító megtalálja a headeröket, azaz fel kell venned a GTK megfelelő mappáját oda); másrészt a linkernek tudnia kell arról, hogy egybe kéne fordítani a cuccod a GTK library-val.
CB-t már nagyon régen nem használtam, úgyhogy nem mondom meg merre is találod ezeket. De valószínűleg a projekt tulajdonságainál.
-
Dave-11
tag
Szeretném majd elkezdeni megtanulni a C/C++ hoz a gtk+ könyvtár használatát. Már anyagot szereztem hozzá, de nem tudom, hogyan állítsam be a könyvtárat. Tudnátok adni valamiféle segítséget? És például csak akkor fog működni a grafikus dolog, ha GTK+ Projektet hozok létre, vagy akkor is, ha sima .c vagy .cpp fájlt csinálok? (CodeBlocks-ot használok)
-
Azazel999
csendes tag
válasz
alratar #2006 üzenetére
Várj csak! Rákerestem egy másikra, ami még hasznosabb, csak nem emlékeztem a címére, de képekre kerestem google-ben és úgy meglett (csak a borítótól ismerem fel, mindig elfelejtem a pontos címet
). Szóval a "Szoftverfejlesztés C++ nyelven" című könyvről van szó, a szerzők pedig Benedek Zoltán és Levendovszky Tihamér. Ez tényleg tök jó anyag és kezdőknek főleg hasznos, mert nagyon szájbarágós. Legalább is nekem annak tűnt, amikor olvastam.
-
Azazel999
csendes tag
válasz
alratar #2003 üzenetére
"Tanuljuk meg a C++ 24 óra alatt"
Ez a könyv nekem is megvan, szerintem kezdésnek bőven megteszi, például a Prog II (nekünk ezen tanították a C++-t egyetemen) ennek egy részét fedi le. Ez persze ne azt jelenti, hogy holnapra már C++ programozó vagy, hanem hogy 24 leckét tartalmaz, amik kb 1-2 órát vesznek igénybe, ha tényleg tanulni akarod.
-
Azazel999
csendes tag
Köszönöm a gratulációkat, de még inkább a segítségeteket
A beszúrás egy kicsit összetettebb, ahogy én értelmeztem az előadásfóliákról. Ebbe a bizonyos szájba vert önszervező bináris keresőfába nem lehet csak úgy beszúrni, mint egy sima bin.ker. fába. Ha új elemet akarunk, akkor keresést futtatunk az elemre, ami nyilván null-ba fut, mert az elem még nincs a fában. Ha mégis benne volt, akkor nem is kell csinálni semmit. Na most, ha ez megvan, akkor ugye keresés közben dobáltuk a részfákat a két vektorunkba (a kisebb/nagyobb csoportokba). Ezután úgy teszünk, mintha csak megvágtuk volna a fát a beszúrandó elemnél, tehát ő lesz a gyökér és rákapaszkodik a kisebb és a nagyobb fa balról, illetve jobbról. Ez volna a beszúrás. A törlést még nem sikerült kihámoznom, de erőlködök vele még holnapig, mert az a határidő.
-
alratar
addikt
Üdv.
Szeretnék megtanulni ezen nyelven a programozást.
Mit ajánlotok? (könyv, program stb.) -
modder
aktív tag
válasz
Azazel999 #2000 üzenetére
Az király ha sikerült. Tegnap én sem értettem az algoritmusodat, aztán lejátszottam papíron úgy, hogy a keresett elem (a vágási pont) tetszőleges a fában, aztán rekonstruáltam az új fát, és jó lett.
Viszont nem jöttem rá, hogy beszúrásnál mi a teendő, mert ha ez egy szimpla bináris fa, és keresünk egy nem létező elemet, akkor elérünk az egyik levélbe. akkor melyik lesz a vágási pont? Kipróbáltam több verziót: a vágási pont a létező levél, vagy a vágási pont az új elem, vagy a vágási pont a levél előtti elem, de egyik esetben sem kaptam kiegyensúlyozott fát. Ezt a lépést leírnád?
Amúgy meg rekurzióval tényleg egyszerűbb. az ugye csak egy Depth First Search, ahol minden lépés után vagy B vagy J tömbbe teszed a részfákat, a végén pedig mikor visszatérsz a keresésből építesz egy új fát a B és J elemekből. De általában "hatékonyabb" a nem rekurzív megoldás: erőforráskímélőbb, hiszen nem kell állandóan függvényt hívni.
Amúgy meg erről eszembe jutott, az 1. féléves C nagyházim. Egy logikai kifejezés kiértékelő program tetszőleges logikai kifejezést megadva, épít belőle egy fát (amit ma Abstract Syntax Tree-nek mondanék, mert az jó hangzatos), majd bejárja és közben kiértékeli a kifejezést. Miután működött, három napomba tellett, mire kijavítottam a pointerezést, és a Valgrind végre nem mutatott memória szivárgást
szerk: azt akartam kihozni belőle, hogy jó, hogy meg tudtad oldani egyedül, mert mire kiszeneded magadból a megoldást, sokat megtanulsz
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Új! Számla + 1-3ÉV Gari! Áfás! Gamer PC - Számítógép! R5 9600X / RX 9070XT / 32GB DDR5 / 1TB SSD M.2
- Új! Számla + 1-3ÉV Gari! Áfás! Gamer PC - Számítógép! R5 8400F / RX 9060XT / 32GB DDR5 / 1TB SSD M.2
- Új! Számla + 1-3ÉV Gari! Áfás! Gamer PC - Számítógép! I5 14400F / RTX 3080 / 32GB DDR5 / 1TB SSD M.2
- Új! Számla + 1-3ÉV Gari! Áfás! Gamer PC - Számítógép! I5 14400F / RTX 5070 / 32GB DDR5 / 1TB SSD M.2
- Új! Számla + 1-3ÉV Gari! Áfás! Gamer PC - Számítógép! I5 14400F / RTX 5060 Ti / 32GB DDR5 / 1TB SSD
- AKCIÓ! "ÚJ" Microsoft Surface 5 13,5 notebook - i5 1235U 8GB RAM 256GB SSD Intel Iris Xe IGP 27% áfa
- MacBook felvásárlás!! MacBook, MacBook Air, MacBook Pro
- Telefon felvásárlás!! iPhone X/iPhone Xs/iPhone XR/iPhone Xs Max
- Erdély története I-II-III egyben 3990 ft
- BESZÁMÍTÁS! Asus TUF F15 FX506HM Gamer notebook - i5 11400H 16GB DDR4 RAM 512GB SSD RTX 3060 6GB W10
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest