Új hozzászólás Aktív témák
-
proci985
MODERÁTOR
programkód tényleg megoldás és érdemes a valós kódot leírni.
tipp: kell egy kétdimenzós lista (vector), illetve még két lista letárolni a neveket. illetve kell egy harmadik lista is, amibe berakod azokat a számokat, amelyik sorban volt legalább egy olyan elem, ami nem -1 volt. aztán a végén végigmész az épített listán, és a számok segítségével kilistázod a neveket a tanulók neveinek listájából.
-
scream
veterán
válasz
proci985 #1896 üzenetére
Mi nem i ?
Szerk. : De, a kódban is sima tanulok-van csak a PH! motorja teledobálta a kódot italic stíluselemekkel (mint ahogyan a tiedet is, ha jól látom)
(I)Nem, az nem kódrészlet csak szemléltetés képpen írtam oda, hogy azt változtattam azokra.(/I)
(I)Tehát a True-ból False lett, az == -ből először !=, majd mivel azzal sem ment >. Csak próbálgattam, hátha valahogy menni fog rendesen.(/I)
-
scream
veterán
Na, most rámentem a Debug/Continue gombra és azzal kezdtem el tesztelni.
Itt ha 100-as értéket írok elfogadja és kiírja, szóval az már nem gond, viszont ha -1, -1 az adott tanuló pontjai akkor is kilistázza és a mehet=true vagy mehet=false felcserélése esetén semmi különbség nincs! Legalábbis nem látszik.
A végére teljesen belefogok zavarodni.
Más :
Hogyan kell a Release-t létrehozni Code:: Blocks-ban? Mert állandóan csak a ./Debug/valami.exe-t futtatja és hozza létre, de nekem a ./Release/valami.exe kéne és azt is hozza létre a Debug mellé.
Illetve hogyan tudok tesztadatokokat csinálni és azokkal tesztelni a programot?
Tehát mondjuk 1versenyzo.be, 2versenyzo.be, 100versenyzo.be fileokat megcsinálom (sima notepadban megírom) majd az exe mellérakom és hogyan indítom el vele?Vagy mit kell csinálni hozzá?
-
scream
veterán
válasz
proci985 #1893 üzenetére
Na, végül struct-tal csináltam ...
Idáig jutottam : KATT
Viszont elkezdtem tesztelgetni és ha valakinek 100 pontot írok elért pontnak mondjuk 2 vagy 3 tantárynál, akkor nem listázza ki! Illetve, ha Mondjuk az 1-es számú tanuló 1. tantárgyának adok 100-at majd a 2. tantárgynak -1-et akkor nem listázza ki a nevet pedig elvileg ki kéne írni (csak nem tudom hogyan) mivel hiába van az 1-es számú tanulónak a 2. tantárgyból -1 az 1. tantárgy 100 pont tehát abból indult a versenyen, ezért mivel van egy -1 től különb elért pontszáma listázandó.
Hogyan kéne megcsinálni ezt ?
Próbálkoztam ezzel, hogy átírtam ebből :
for(int i=0;i<N;i++)
{
mehet=true; (->false)
int j=0;
while(tanulok[I].jegyek[j])
{
if(tanulok(i).jegyek[j]==-1) (->!=-1 vagy >-1)
{
mehet=false; (->true)
}Tehát megcseréltem a true/false-t meg a relációt átírtam az if-ben de nem megy csak azért sem
-
proci985
MODERÁTOR
egyszerű mátrix. gyakorlatilag minden tanulón végig kell menni, végignézni az összes tárgyat, ha pedig legalább egy közülük nem -1es értéket ad, akkor indult a versenyen, tehát listázható.
structal/classal kell egy harmadik összekötő is szerintem (m-n kapcsolat van köztük, tehát connector kell ha az ember megtartja a high cohesion/low coupling szabályokat komponenseknél), mivel minden tanulónál a feladat szerint minden versenyhez tartozik érték, szerintem ez durva túlbonyolítása a problémának.
mátrix szvsz jó ötlet, én azzal csinálnám. esetleg láncolt listával, ha a -1es értékeket nem kötelező tárolni (ha nincs tárolva, akkor -1nek kell venni).
manuális bekérés helyett én feltöltenék az elején pár rekordot a tárolódba, minden alkalommal beírogatni dolgokat tesztelésnél, hogy rendesen működik-e baromi sok időt elvesz.
-
kispx
addikt
-
scream
veterán
Sziasztok!
Adott ez a feladat :
Egy iskolában tantárgyankénti és összetett tanulmányi versenyt tartottak. A versenyekben összesen N (>0) tanuló vett részt. A versenyek száma M (>0). Rendelkezésre áll versenyenként a tanulók neve és elért pontszáma. Összetett versenyben csak azon tanulók eredményét értékelik, akik az összes tantárgyankénti versenyen indultak, és elérték a versenyenként adott minimális pontszámot (MIN(1..M)>0). Ha a tanuló az adott versenyen nem indult, akkor -1 a pontszáma. Készíts programot, amely megadja azon tanulók névsorát, akik legalább 1 versenyen elindultak!
Nagyjából értem és tudom mit kéne csinálnom azután,hogy bekértem az adatokat (ez egy kiválasztás adott feltétel alapján, jelen esetben ugye azokat kell kiválogatni, majd kilistázni, akiknek nem -1 a pontja). Viszont az adatokat nem tudom hogyan kéne bekérnem.
Nincsen kész vagy megadott adat, szóval nekem kell bevinni az adatokat, csak a módszert nem tudom,hogyan kéne.
Első körben ugye bekérem hány tanuló van, aztán azt, hogy mi a nevük, majd hogy hány tantárgy van, azoknak mik a neveik, majd hogy az adott tanuló az adott tantárgyból indult-e vagy sem.
Ti hogy állnátok neki?
Többek struktúrával oldották meg (még egyetemen nem tanultuk), de elvileg mátrixosan is meg lehet oldani, melyikkel egyszerűbb ?
-
Dj Sügi
őstag
Sziasztok!
Aki egy kicsit jártasabb C++ nyelvben az dobjon már egy PÜ-t, mert szeretnék egy kis segítséget kérni egy egyszerűbb feladathoz.
Részleteket PÜ-ben leírom.Köszi!
-
Dave-11
tag
Valami nem okés a CodeBlocksommal. Ki akarok íratni egy float típusú változót, de állandóan lekerekíti egészre. pl.: 13/9 -re ezt írja ki: 1.00000 . De miért? Haveromnál néztem, ugyanígy iratja ki CodeBlocks-szal ( printf("A szám=%f",szam); ) és neki rendesen kiírta 5 vagy 6 számjegyig.
-
Sziasztok,
C++ beadandonak az alabbi kovetelmenyekkel milyen progit szokas csinalni?
-hasznaljon osztalyt (min 1, ajánlott több)
-operator overloading legyen benne (min 1)
-min 5 fuggvenye legyen
-dimanikus mem foglalas es felszabaditas legyen benneA 4 napba megakarom csinalni, de meg soha nem programoztam C++-ban, szoval ehhez merten keresek valami temat, nem mondom, hogy csak a total minimumot akarom teljesiteni, mert ZH-n ugyis bonyolultabb lesz s azt is meg kell oldanom, de mindenkepp el is akarok keszulni vele a 4 munkaszuneti nap alatt.
Matrix szorzast mondtak peldanak, de felek, hogy azzal nem lennek kesz.
Mit tudnatok ajanlani? -
mgoogyi
senior tag
válasz
jattila48 #1867 üzenetére
Szia,
Ennek mi lenne a gyakorlati haszna számodra?
Csak a polimorfizmust akarod kihasználni, mert minden ilyen objektumra ugyanazt a virtuális függvényt hívod majd meg az f(Base **)-on belül?
Ezesetben azt tudod mondani, amit előttem is írtak, hogy Base ** tömb-ben közlekedtesd az összes leszármozott objektum-ra mutató pointert.Kooperálnak is ezek az objektumok f()-en belül, vagy csak minden egyes tömbelemre meg kell hívni egy függvényt?
Googyi
b, lehetőség egy makró, aminek a paramétere a tömböd, amit meg csinálni akarsz a makrón belül, azt úgyis csak a Base-ben definiált függvényekkel tudod.
-
Vico87
tag
válasz
jattila48 #1878 üzenetére
Az egyik megoldás, ha Base** példányt vár a függvényed és létrehozáskor is Base**-ba pakolod a Derived példányaidat. Ez akkor jó, ha ki akarod használni a polimorfizmust és a kollekciód heterogén, azaz statikus típusa Base* tömb, de az egyes elemek dinamikus típusa elemenként eltérő.
Ha biztosan csak Derived példányokat akarsz átadni és ez nem fog változni, akkor minek Base* tömb? A megoldás, hogy a függvényed Derived* tömböt kapjon.
Megjegyzés: a fordító számára nincs különbség Base** és Base*[] között. Az, hogy számodra szemantikailag a két dolog eltérő, az jogos, de a szándékodat (hogy ez most egy Base* tömb, vagy pedig egy Base példányra mutató mutatónak mutatója) a tömb technikai megvalósítása (memóriaterületre pointer) miatt nem tudja megvalósítani a fordító. Csak akkor tudná kitalálni a pontos konverziót, ha pontosan tudná, hogy a Base* tömbödben mennyi példány van, de ezt nem tudhatja, mivel ez futási időben derül csak ki és függvényhívásonként nem konstans.
Ez a konverzió olyan esetben veszélyes, amilyet írtál: egyik leszármazottból konvertálás másik ágon lévőbe, például a tömbödben nem csak Derived*-ok vannak, hanem Derived2*-ok is.
-
jattila48
aktív tag
válasz
jattila48 #1873 üzenetére
Ha a Derived **-ról Base **-ra castolást megengedné a fordító, akkor meg lehetne csinálni a következőt:
Derived2 szintén származzon Base-ből.Derived *d=new Derived;
Base **b;
b=&d; //ezt a Derived **-ról Base **-ra castolást nem engedi a fordító, de reinterpret_cast-tal ki lehet erőszakolni
*b=new Derived2; //ez simán megy, mert Derived2 *-ról Base *-ra castolEz után a d pointer egy Derived2 típusú objektumra fog mutatni, holott Derived *-ként van deklarálva. Ez nyilván baj lenne, ezért nem engedi meg ezt a fajta cast-ot a fordító. Azonban más a helyzet pointer tömbökre. Ha b nem Base ** típusú, hanem Base *[], akkor a b=&d értékadást eleve nem lehetne megcsinálni, mivel b nem megváltoztatható (hiszen konstans tömb cím, amit a fordító konstans értékként kezel). Tehát a Derived *[]-ról Base *[]-ra való castolás biztonságos, és esetenként kívánatos is lenne, de sajnos a fordítók nem tesznek különbséget ezek között.
-
jattila48
aktív tag
Azt is lehetne, de így egyszerűbb volt. Igazából a lényegen nem változtat. Ilyenről még nem hallottam, hogy a pointerek mérete különböző lenne (ettől persze lehet), de a Derived **-ról Base **-ra castolás nem is azért veszélyes. Viszont a pointer tömbök közötti castolást nem látom veszélyesnek.
-
Karma
félisten
válasz
jattila48 #1871 üzenetére
Nem úgy értem a cserét, hanem hogy sehol se használsz Derived tömböt, csak Base tömböt és virtuális metódusokat. Élő helyzetben ennek még értelme is lehet
Veszélyességet csak nagyon madártávlatból gondoltam: StackOverflown olvastam, hogy van olyan architektúra, ahol a pointerek mérete nem állandó. Arra nem emlékszem melyik, valószínűleg nem is releváns.
Agyilag ma elég zokninak érzem magam.
-
jattila48
aktív tag
De, le lehet cserélni a a Derived *[] tömböt Base *[] tömbre, ez történt az átmásolással. A kérdés azonban elvileg is érdekes. Szerintem a Derived *[] tömb Base *[]-ra castolása teljesen legális lehetne, (de a Derived ** Base **-ra castolása már nem), a probléma szerintem az, hogy függvény paraméterként a fordító nem tesz különbséget a pointer és tömb között. Természetesen általában a tömbök közti castolás nem legális, de ebben a példában semmilyen veszélyét nem látom (vagy esetleg tudnál veszélyes példát mutatni?). Egész más a helyzet a Derived **-ról Base **-ra castolással.
-
jattila48
aktív tag
válasz
jattila48 #1868 üzenetére
Ugyanakkor, ha az f függvény Base[] típusú paramétert vár f(Base *), akkor simán meg lehet hívni Derived[] típusú tömbbel, mivel a Derived[] típust Derived *-nak tekinti, a Base[] típust Base *-nak, és az ősosztály pointerére gond nélkül lehet konvertálni. Ez azonban egészen biztosan hibás működést eredményez. Ebből is látszik, hogy a tömb az nem pointer (minden ellenkező hiedlemmel szemben), még ha hasonlóan kezelhető is.
-
Karma
félisten
válasz
jattila48 #1867 üzenetére
Semmilyen környezetben nem legális művelet a tömb átcastolása, még ha véletlenül működik jelen esetben. A Base** és a Derived** között nincs semmilyen kapcsolat, jogos a compiler panasza.
Egyszeri megoldásnak jó amit csináltál, de nem lehetne a Derived*[]-öt teljesen Base*[]-re cserélni?
-
jattila48
aktív tag
Sziasztok!
A következő problémára várok megoldási javaslatot:
Van egy függvényem, ami paraméterként Base * pointereket tartalmazó tömböt vár, de szeretném Derived * pointer tömbbel is meghívni. Valahogy így:class Derived : public Base{...}
void f(Base **){...}
Derived *d[10];
....
f(d);A fordító természetesen hibát jelez, hogy nem tud Derived **-ról Base **-ra konvertálni. Ez világos hogy miért veszélyes általában, de nekem nem igazán Base ** típusú az f paramétere, hanem Base *[] tömb, amire teljesen természetes és veszélytelen lenne Derived *[] típusú tömböt konvertálni. reinterpret_cast-tal megoldható, de az elég rondán néz ki. Az a gond, hogy paraméterként átadva a Base *[] típust Base **-nak tekinti, holott nem egészen az. Esetleg valami elegánsabb megoldást tudnátok javasolni? Lehet, hogy a Base *[] tömböt be kéne ágyazni egy Barray osztályba, a Derived *[] tömböt pedig egy ebből származó Darray osztályba, az f-nek Barray * típusú paramétert adni. Ez sem tetszik, akkor már inkább a reinterpret_cast.
-
Lacces
őstag
Sziasztok!
Egyelőre csak érdeklődés szintjén kérdeznék.
Ez inkább C/C++ téma.
Mindig is érdekeltek a Beágyazott rendszerek, még finomítok az adatb, java és php tudásomon és utána szeretnék foglalkozni a beágyazott rendszerekkel, valszeg majd olyan irányba mennék, programtervezőiről mérnökinfóra, diploma után.Ez ügyben lenne a kérdésem, hogy elsősorban C vagy a C++-ra kellene ráfeküdni, illetve a Beágyazott rendszerek, melyik részére építenek a C++-ból? Objektum orientált, generikus megközelítést gondolom nem visznek bele. Ahogy nézegettem ez ritka.
A képfelfolgozás is érdekel, abba is szívesen belekóstolnék.
Üdv.:
Tudom van ilyen topic, de engem elsősorban, most a C/C++nyelv felől érdekelne a dolog.
-
Jhonny06
veterán
válasz
playnsmile #1860 üzenetére
Ezt ide kellett volna.
-
kispx
addikt
Kifutottam a szerkesztési időből
A printf végén a %c és %i nem kell.
Ha a név több karakterből áll mint egy, akkor érdemesebb több karakternyi helyet lefoglalni a char nev[50]; utasítással (max 49 karakter lehet a név) és akkor a scanf("%c",&nev); helyett érdemes gets(nev); utasítással beolvasni.
-
kispx
addikt
válasz
playnsmile #1860 üzenetére
A nevet miért egy char-nak deklaráltad?
-
playnsmile
csendes tag
Sziasztok!
Még csak most kezdtem a programozást ilyen nagyon alap dolgokkal, mint scanf, printf, de már is elakadtam. Van egy feladat amiben be kéne kérni a nevet és a kort majd kiírni, hogy ihat-e alkoholt. A probléma az lenne, hogy a nevet bekéri, de a kort már nem, hanem (nekem) random számok alapján ad meg egy eredményt. Ha esetleg valaki rá bírna nézni és megmondani, hogy hol hibádzik azt nagyon megköszönném.#include <stdio.h>
int main () {
char nev;
int a;
printf("Add meg a neved:\n %c");
scanf("%c",&nev);
printf("Add meg a korod:\n %i");
scanf("%i",&a);
if (a>=18) {
printf("Ihatsz alkoholt!");
} else{
printf("Kiskoru vagy!");
}
return 0;
}Előre is köszönöm!
-
bandi0000
nagyúr
hali
kérdés az hogy olyan feladatom van hogy bekérek egy 1 vagy 2 vagy 3 jegyű számot és azt átírja római számokká
odaáig jutottam hogy bekérem a számot és szétválsztja számjegyekre de nem tudom hogy csináljam tovább azt hogy átírja am a szám 1000 ig lehet
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
main()
{
int i,szam,szamj1,szamj2,szamj3;
scanf("%d",&szam);
printf("A szam: %d",szam);
szamj3=szam/100;
szamj2=(szam-szamj3*100)/10;
szamj1=((szam-szamj3*100)-szamj2*10);
}
printf("szazas: %d tizes: %d eggyes: %d\n",szamj3,szamj2,szamj1);
system("pause");
} -
Karma
félisten
válasz
Dave-11 #1855 üzenetére
Továbbra se javaslom a C++/CLI-t. Ha már egyszer CLI-re dolgozol (amit bevonzottál a Windows Forms-szal), vannak fejlesztőbarátabb nyelvek is, nem véletlen emlegetem a C#-ot
Én eléggé beleszülettem (meg egyetemen tanultam meg a nyelvi alapokat), így nem nagyon tudok jó forrást, de a StackOverflow megér egy keresést. Ez mondjuk egy C#-os topik linkje.
-
Dave-11
tag
Igen, közben rájöttem hogy az a Text, csak közben te már írtál hsz-t.
Amúgy ismerkedek vele, eddig mindig console appokat csináltam, mosz szeretnék valami felhasználóbarátabbat készíteni. Ha már itt vagyunk, tudsz ajánlani valami jó forrást, ahonnan tanulhatnám a használatát?
Köszi, így már működik az áthelyezés -
Karma
félisten
válasz
Dave-11 #1853 üzenetére
Azt szabad tudni, hogy miért erőlködsz a Visual C++-szal, ha nem értesz hozzá? Miért nem inkább C# kódot írsz? Akkor legalább lenne IntelliSense VS2010-ben is.
A formnak elvileg nincs is Name propertyje a designerben, mert nincs sok értelme. A Text propertyje befolyásolja az ablak címét.
A Location pedig Point típusú, úgyhogy nem fogsz tudni stringet megadni neki. Sőt az se jó, ha a point X vagy Y propertyjét kézzel frissíted, ez a sor viszont működik:
button1->Location = Point(button1->Location.X, button1->Location.Y + 10);
-
Dave-11
tag
Ha az ablak Name paraméterét megváltoztatom, akkor az ablak címsorában lévő cím változik meg, ezért kérdeztem, hogy milyen nevet kell megadni. Vagy csak én nem látom hol lehet átnevezni a formot(mármint amit a kódban használok, azt a nevét)?
A this-t pedig már próbáltam, de akkor is hibát dobott. Egyébként akkor hogyan változtassam a Locationt?
Form1->Location="200,100"; (egybe kell megadnom?)
Form1->Location->X="200"; (vagy így is jó, illetve kell-e az idézőjel, bár mivel ez integer nem hiszem) -
sztanozs
veterán
válasz
Dave-11 #1850 üzenetére
Ez kb annyira mellékkérdés, mint sz*r mellett falni, vagy fal mellett sz*rni...
Azt a "nevet" kell használni, amit az osztályból rétrehoztál. A Name property abban tud segíteni, ha egy konténerben név alapján akarsz megkereni egy kontrollt. Elnevezheted akárminek, de az a lényeg, hogy a kódban hogy lett létrehozva az objektum.
Ahogy nézem magára formra nem szokott lenni létrehozva változó, de a Form1 kódján belül a Form1->Location helyett a this->Location-t tudod használni (vagy csinálsz egy változót és átadod neki a this referenciáját).
Kicsit bővebben: this
-
Karma
félisten
válasz
Dave-11 #1850 üzenetére
Nem értem a kérdés azon részét, hogy elérni az adatokat. Nem a Form codebehind fájljába írod ezt a logikát?
Már ha Windows Formsot használsz a Designerrel.
Ha igen, akkor megadhatsz minden komponensnek egy Name tulajdonságot, amivel el tudod érni kódból (ha a GenerateMember.vagy nagyon hasonló nevű property true, ami alapból az).
Ha meg kézzel csinálod a GUI-t, akkor te irányítasz mindent.
Hozzá kell tennem, hogy én elsősorban C#-os vagyok, és abból indulok ki jobb híján.
-
Dave-11
tag
-
Dave-11
tag
Visual Studio 2010-ben szeretném a következőt megcsinálni:
Van egy ablak, az alján egy gomb és a tetején egy szöveg label. Azt akarom, ha megnyomom a gombot, a label szépen leúszik az ablak aljára.
Úgy terveztem, hogy van egy for cilus ami a következőt csinálja:
for(int i=1; i<=100; i++){
Form1->Location->Y-=1;
sleep(10);
}
De sajnos ez nem működik. Nem ismeri a sleep() függvényt, és a fenti második sorral is baja van. Próbáltam for nélkül, hogy csak egyszerűen átdobja egy másik pontba, de az se működik.
Ötlet? Tanács? -
kispx
addikt
Sziasztok,
lenne a C++/Qt problémán (de inkább csak Qt-s)A Design nézetbe rápakolom a szükséges elemeket a QMainWindow-ra (2 db ListWidget és 2 db Graphics View). Beállítom a ezeknek a méretét és a helyét. Majd Layout-ba szeretném foglalni őket:
a 2 db Graphics View kerülne egy Horizontally Layout-ba, és az így keletkező layout a maradék 2 elemmel egy Vertically Layout-ba).De ekkor a már beállított méretűket felülírja. (És ezután meg nem lehet átméretezni egyenként az elemeket.) Layout-ot muszáj használni, mert azt akarom, hogy az ablak átméretezésekor méreteződjenek át az elemet, de úgy, hogy a méretarányukat megtartsák.
-
Karma
félisten
A legegyszerűbb az lenne, ha leraknál egy rejtett fájlt mindkét meghajtóra (azonos névvel+más tartalommal vagy eltérő nevekkel, ízlés dolga), és ezt ellenőrzöd.
Platformfüggetlenül szerintem nem nagyon van más megoldásod. Már a volume label olvasásához is WINAPI-t kell használnod, pl. így.
-
n00n
őstag
Sziasztok!
Van egy C++/Qt-s programom amin kicsit módosítanom kellene. Adott kettő ugyanolyan pendrive, amit felváltva használunk naponta. Azt kellene megoldani, hogy a program felismerje, hogy melyik van éppen bedugva. Ezt mi alapján lehetne, név alapján? Ötlet?
-
Vico87
tag
A szerverekbe szánt chipsetekben szokott lenni random hardver (többnyire valamilyen kaotikus fizikai jelenséget idéznek elő és azt mintavételezik). Consumer chipsetekben ritka, ha jól tudom az Intel 810/815/840/845 chipsetekben volt csak.
Szerintem kriptográfián kívül senkinek sincs szüksége valódi véletlenre, hanem elég ha "ránézésre" az. Sőt, a reprodukálható "véletlen" hasznos tud lenni (pl. könnyebb debuggolni).
-
Karma
félisten
válasz
dabadab #1833 üzenetére
A tesó topikban nem olyan rég már többen is írtunk látszatos magyarázatot
A veszélyeket kiemelni viszont jó húzás volt -
dabadab
titán
válasz
Dave-11 #1830 üzenetére
Az srand() inicializalja a randomgeneratort, ezt csak egyszer kell megcsinalni, praktikusan a program elejen. Ez altalaban nem tul bonyolult kod es elmondhato rola, hogy ha ugyanazzal a szammal inicializalod, akkor utana pontosan ugyanazokat a "veletlen" szamokat fogod kapni, ezert nepszeru megoldas, hogy a jelenlegi idovel inicializaljak, valahogy igy: srand( time() );
A rand() meg ezek utan egyszeruen visszaad egy veletlenszamot (ami a 0 - RAND_MAX intervallumba esik).
Ha intervallumot akarsz (mondjuk X es X+Y koze), akkor az egyszeru, ertheto es naiv megoldas az, hogy a rand altal visszaadott szamnak az Y-nal valo osztasanak a maradekat veszed es hozzaadod X-et. Konkretan a te peldadban (1-50, ahol X = 1 es Y = 49):
int random_number = rand() % 49 + 1;Es akkor most egy kicsit kenytelen vagyok arrol szolni, hogy valojaban miert istentelen nagy szivas ez az egesz veletlenszam-temakor: a fenti peldaban, ha Y nem ketto valamelyik egesz szamu hatvanya (1, 2, 4, 8, 16 stb), akkor a veletlen szamaid eloszlasat megnezve fel fog tunni, hogy nem azonos esellyel kapod a szamokat, hanem lesz egy hatar es az alattiak valamivel nagyobb valoszinuseggel fordulnak elo. A miert megmagyarazasat az olvasora bizom
A masik problema meg a kiszamithatosag: a Firefoxban (illetve akkor meg Mozillanak hivtak) volt egy olyan biztonsagi hiba, hogy a fenti modon inicializalta a randomgeneratort amikor titkositashoz generalt veletlenszamokat. Csakhogy - a fentiek miatt - a tamadonak eleg volt azt kitalalnia, hogy milyen idot mutatott a gep oraja, amikor legeneralta a titkositashoz szukseges szamokat, marpedig ha egy titkositott kapcsolatot 12:54-kor kezd a bongeszo, akkor jo esellyel a gep oraja is 12:54-et fog mutatni, vagy akornyeken valamit - es mivel a time() felbontasa csak masodperces, ezert nem is kellett olyan tul sok szamot vegigprobalni ahhoz, hogy fel lehessen torni a titkositast.
Szoval a veletlenszamgeneralas nehez problema, ahol komolyan erre van szukseg, ott valami plusz hardverrel generaljak, ami valami kellokeppen veletlenszeru fizikai folyamaton alapszik.
szerk: Latom, en irtam a legtobb ideig, de legalabb latszatja is van
-
kispx
addikt
válasz
Dave-11 #1830 üzenetére
srand(); inicializálja a randomszámgenerátort. Mindig a legelső szám generálása előtt kell ezt megtenni.
"srand(12);" Konstanssal nem illik inicializálni, mert minden egyes futás során ugyanazokat a számokat fogja előállítani. Helyette olyan módszert kell választani, ami futásról futásra változik, pl idő:
srand ( time(NULL) );rand(), egy véletlen számot fog visszaadni 0 és RAND_MAX között.
Ha kisebb értéktartományon szeretnénk véletlen számot generálni akkor, akkor egy X számmal kell a maradékát képezni, pl
rand() % X ez [0; X-1] tartományban képez egy véletlen számot
Szerk.: látom túl sokáig írtam a hszt
-
Karma
félisten
-
Dave-11
tag
Sziasztok!
Egy kis magyarázatot szeretnék kérni:
Van ugye a random szám generáltatása:
srand(12);
rand();
Itt hogy működik ez a két függvény?
A másik:
Hogyan tudom megadni, h a random szám mondjuk 1 és 50 közé essen? -
sztanozs
veterán
válasz
dabadab #1823 üzenetére
Ja, valószínűleg makróként működött csak a for és valójában elöltesztelő ciklusra fordította le a fordító (nem neked írom, te biztosan tisztában vagy vele
):
for ( int c = 0 ; c < 10 ; c++ )
{
printf("Hello\n");
}
erre:
int c = 0 ;
while ( c < 10 )
{
printf("Hello\n");
c++;
}
Így látszik, hogy miért működik a cikluson kívüli értékadás. -
Dave-11
tag
Ahham. Tehát akkor elvileg ez a két függvény így rendben lenne?
1. Nem ad vissza értéket, csak kiír egy sort mikor meghívjuk a programban:
void kiir(){ std::cout << "Csak kiírom a szöveget."; }
2. Ez meg kiszámol egy értéket és a végén ezzel az értékkel tér vissza:
double pitagorasz( double a, b) {
double ertek;
ertek = sqrt(sqr(a)+sqr(b));
return ertek;
} -
Karma
félisten
válasz
Dave-11 #1824 üzenetére
Hát bármi más, amit visszatérési típusnak megadsz. Amíg helloworldözöl valószínűleg int, double, vagy egyéb primitív típusok főleg - ezt írod a void helyére és kész.
Egyébként a void *-nak különleges jelentése van, ez az általános pointer amihez nem tartozik típus. Manuális memóriakezelésnél (C-ben malloc/free) kerül elő főleg, de ideális viszonyok között C++-ban nem kellene ezzel találkoznod (magasabb szintű absztrakcióknak hála).
-
Dave-11
tag
Rendben eddig világos de ha a void nem ad vissza értéket akkor mi az ami igen?
-
-
kispx
addikt
válasz
Dave-11 #1820 üzenetére
Vannak olyan függvények amiknek nem kell visszaadnia értéket csupán csak valamit meg kell csinálniuk. (pl. clearerr) Ezeket eljárásoknak is nevezik.
C/C++-ban nincs külön kulcsszó a függvények és az eljárások megkülönböztetésére. C-ben ha eljárást szeretnénk csinálni akkor a visszatérési típusnak void-nak kell lennie. Ezzel jelezzük a fordítónak, hogy valójában semmit sem fog visszaadni a függvény. Egy ilyen függvényben értéket nem adhatunk vissza (pl.: return 1; ) mert ez fordítási hibához vezet. Viszont használhatjuk függvényből való visszatérésre a return; utasítást. (A függvényt lezáró kapcsos zárójel elé nem kötelező kitenni)
void f () { //.... }
az függvényt így hívjuk meg:
//...
f(); //változónak nem adhatunk vele értéketint g() { //.... return valami; }
a g függvényt így hívhatjuk meg:
int x = g(); //a g() visszatérési értékét az x változónak adjuk át
g(); // a g() visszatérési értékét minek sem adjuk át, így ez az érték elveszlikSzerk.:
"void Osztaly::Tag(){...}
Mondjuk ebben kiszámítok valamit, és a végére odaírom hogy: return vegeredmeny; Akkor hogy-hogy nem tér vissza semmi?"
Az fordítási hibához vezet.(#1821) dabadab
Régebben volt kezemben egy ősköri C++ fordító, ott lehetett main-nak void visszatérési értéke -
dabadab
titán
"A main függvénynek lehet visszatérési értéke"
A main()-nek kötelezően intet kell visszaadnia, se a void, se más visszaadott típus nem engedélyezett a C++ szabványban.
A main() által visszaadott érték lesz a végrehajtott program exit statusa.Dave-11: a "nem ad vissza semmit" pontosan ezt jelenti. Ha egy void függvénybe returnt írsz, akkor hibát dob a fordító. Mondjuk egy sin() függvénynél, vagy hasonlónál, nincs sok értelme a void-nak, mert ott vissza kell adni valamit, de van egy csomó olyan függvény, ami nem kiszámol valamit, hanem csak pl. egyszerűen kiír egy üzenetet, akármi, ahol nincs semmi, amit vissza lehetne adni, azok lesznek a void függvények.
-
Dave-11
tag
Az utolsó sort nem igazán értem. Igazából már mondták ezt nekem, hogy semmit sem ad vissza, de ez hogy lehet? Hogy hogy nem ad vissza semmit? Például mikor a könyvem példáit csinálom, létrehozok egy osztályt. És ennek az osztálynak az egyik tagja elé voidot írok. Tehát a deklarálásánál így néz ki:
void Osztaly::Tag(){...}
Mondjuk ebben kiszámítok valamit, és a végére odaírom hogy: return vegeredmeny; Akkor hogy-hogy nem tér vissza semmi? Vagy ez a visszatérés mást jelent?
És ha itt nem tér vissza semmi (void), akkor mi az aminél igen? -
kispx
addikt
válasz
Dave-11 #1818 üzenetére
Függvény.
A main függvénynek lehet visszatérési értéke:
- ha int akkor program visszaad egy hibakódot az oprendszernek (hívó programnak). 0 a sikeres végrehajtás (ilyenkor egy fordítási hibaüzenetet fogsz kapni, ha elfelejtkezel a return 0; utasításról)
- void, visszatérési érték hiánya semmit sem ad vissza -
Dave-11
tag
Segítenétek tisztázni két dolgot?
1. Van ugye a main() rész vagy függvény? Melyik illik rá jobban? Szerintem a függvény de ti biztos tudjátok. Szóval. Miért szerepel előtte int? Pl.: int main() {....}
2. A void konkrétan mit jelent? -
Davs
tag
válasz
Dave-11 #1816 üzenetére
Ha ertesz angolul, akkor ajanlanam a Stanford egyetem programozas-eloadas triojat. Nem csak c/c++ van benne, hanem altalanos programozas, memoriarol es assemblerrol is van kicsit szo, hogy tudd mi folyik a hatterben..Youtube-on keress ra a programming methodology, programming abstractions es programming paradigms-re(ebben a sorrendben), mindharom playlist kb 25-28 ~50perces eloadast tartalmaz (nagyon jok, nekem nagyon tetszenek). A methodology a legkonnyebb, Java nyelven "tanitanak", de nem is igazan a nyelvet, hanem amolyan bevetezest a programozasba (kezdoknek valo). Az abstractions mar c++ orientaltabb, mindenfele sorting-algorithm-eket, adatstrukturakat taglal (array, vector,map, hashmap, binary search tree, queue, stack stb - ezekkel nagyon jo tisztaban lenni, hogy tudd melyik hol eros es miben verzik el). Aztan a 3. a programming abstractions (most nezem, kb 10. eloadasnal tartok). C-vel kezdi, nagyon ramegy a pointerekre, hogy megtalnuld kezelni a memoriat, aztan most kezdi kicsit az assembly-t, hogy kb tudd mi tortenik a hatterben pl egy i++ parancsnal, vagy egy funkciohivasnal, aztan lesz szo alap concurrecy-rol is ("parhuzamositas", szoval multithreaded alapok)..a harmadik elegge low-level szintu (hardver-hez kozeli). Amugy lattam meg MIT-nek is eloadasaint iTunes-on, de meg nem lestem nagyon belejuk..Amugy en is hobbiprogramozonak vallom magam, viszont fosuli utan ebbol szeretnek megelni.
-
Dave-11
tag
Srácok csak úgy kíváncsiságból megkérdezhetem, hogy az itt fórumozók közül ki melyik kategóriába sorolná magát?
-hobbiprogramozó
-épp tanulja a C++ (iskolára vagy tanfolyamra gondolok)
-C++ programozóként keresi a kenyerét
Én a hobbiprogramozó kategóriában vagyok, de később szeretnék ezzel foglalkozni és ilyen egyetemre vagy fősulira szeretnék menni, ahol ezt tudom tanulni. Ha esetleg van itt valaki, aki tanul/tanult egyetemen ilyen irányzatban, az el tudná mondani hogy hogyan zajlik egy nyelv tanulása ott? -
Davs
tag
válasz
Dave-11 #1813 üzenetére
Ha van egy tombod, pl int x[10], akkor az x valojaban egy pointer a tomb elso elemere..
x[0] az ugyanaz, mint a *(x+0), x[1] ugyanaz, mint az *(x+1), szoval a char *y lenyegeben karaktertombot jelez. Amugy pointereket akkor is szokjak meg hasznalni, ha egy funkcioban egy masik funkcio (pl akar a main() ) valtozoit akarod modositani, vagy ha dinamikusan hozol letre valtozokat (a konyv remelem jobban elmagyarazza majd, mint en)
-
kispx
addikt
válasz
Dave-11 #1813 üzenetére
Karaktersorozat vagy string (szerk.: lehet, hogy a könyv jobban fog fogalmazni, mint a linkem)
"int main( ...,char* ) {"
Nem ezt láttad, hanem: int main(int argc, char *argv[]) vagy int main(int argc, char **argv)
-
kispx
addikt
válasz
Dave-11 #1811 üzenetére
Pontosan annyiszor használom őket ahányszor kellenek (se többször, se kevesebbszer
)
Feleslegesen nem fogom tele pointerezni a forráskódot, azért mert csak azzal is meglehet vele oldani a feladatot. Végig kell gondolni a programot, hogy éri meg lekódolni és aszerint fejleszteni.Legtöbbször használom: (hirtelen ennyi jutott eszembe)
- ha külső függvénykönyvtárok megkövetelik
- char*
- ha olyan paramétert adok át aminek az értékét meg kell változtatni (bár ha már C++ a nyelv, akkor inkább referencia) -
Dave-11
tag
Úúúúh na végre értem a pointereket!!
Ez a Tanuljuk meg a .... 24 óra alatt sorozat nagyon jó, aki valami nyelven tanulni szeretne annak csak ajánlani tudomMikor megláttam hogy van C++ -szal foglalkozó változata tudtam hogy ez az ami kell nekem, így hát elkezdtem bújni, és most hogy a pointereknél járok és szépen haladok bégig rajta és magyaráz és hozza a példákat egyre jobban és jobban értem őket, nagyon faja
Ha már ennél a témánál vagyok megkérdezem az itt fórumozgató nagy programfejlesztőket, hogy ti a projektjeitek során milyen gyakran használjátok őket, és mikre például?
-
szoke12
őstag
Jó napot emberek!
Van itt, aki linux alatt programioz?
Én is el szeretném kezdeni tanulni a nyelvet, csak nem tudom, hogyan kezdjek hozzá.
Kell fejlesztői környezet? Vagy az alap linuxos is jó?
Vázlatos, szórványos ismereteim vannak. -
Davs
tag
válasz
Dave-11 #1800 üzenetére
Szerintem eloszor is egy kis alap memory management lecket kellene venned, aztan egyszerubb lesz megerteni (stack vs heap)..angol tudas jol jon, van par nagyon jo video Youtubeon (Stanford vagy MIT youtubeos videoi, egesz eloadassorozatok vannak fent playlistre osztva)
Azt meg, hogy mire jo, hat..tombokre pl., meg majd utananezhetsz a valtozok scope-janak (lokalis vs globalis valtozok) meg meg biztos kismillio dologra
-
Sk8erPeter
nagyúr
válasz
Dave-11 #1800 üzenetére
Pedig most rákerestem, és WonderCSabo elkezdte már neked magyarázni.
A C programozás topicban is érdemes lenne rákeresned, itt nagyon sok hsz.-ben szerepel a szó, de ahogy elnézem, kingabo egy igen hosszú hsz.-ben elég korrekt módon elmagyarázta a dolog lényegét:
[link]
Itt is van még egy.
Ú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!
- Lenovo ThinkPad T14 3 Gen 16/256GB SSD, Újszerű, 1 Év Garanciával
- NEC MultiSync V421 monitor (42") 1920 x1080px
- Azonnali készpénzes Intel i3 i5 i7 i9 12/13/14 gen processzor felvásárlás személyesen / csomagküldés
- Telefon felvásárlás!! Samsung Galaxy S21/Samsung Galaxy S21+/Samsung Galaxy S21 Ultra
- Jogtiszta Microsoft Windows / Office / Stb.
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest