Hirdetés
-
The Witcher - Jön az 5. évad, ezzel együtt pedig elkaszálták a sorozatot
gp A negyedik szezon forgatása a napokban kezdődött el, kíváncsian várjuk mikor láthatjuk a végeredményt.
-
AMD Radeon undervolt/overclock
lo Minden egy hideg, téli estén kezdődött, mikor rájöttem, hogy már kicsit kevés az RTX2060...
-
Sorra osztja a dollármilliárdokat az USA a chipgyártóknak
it Az Intel, a TSMC és a Samsung után a Micron következik, ők is tetemes összegű támogatást kapnak az USA-tól a chipgyártáshoz.
-
Mobilarena
Új hozzászólás Aktív témák
-
Sianis
addikt
Tehát a lényeg a következő!
Össze kell adnom 12 db 0 és 1 közé eső számot...majd összeadni őket és kivonni belőlük hatot... ennek a számnak nem szabad ismétlődnie olyan hamar amennyire csak lehet -
emitter
őstag
#include <time.h>
int main()
{
double veletlenszam;
srand(time(NULL));
veletlenszam=rand();
printf(''%lf\n'',veletlenszam);
system(''pause'');
}
ez elvileg működőképes kell, h legyen, próbáld ki!
az a baj, hogy nemigazán tudom, hogyan lehet 0 és 1 közé szorítani a visszaadott értéket, mert nem találtam egy olyan fv-t se, amelyik két nagy szám hányadosának a törtrészét adta volna vissza, double értékűként.
persze lehet, h csak rosszul kerestem -
emitter
őstag
hát ezaz, csak nem tom, mi a rand_max értéke, sehol nem találtam hozzá ''útmutatót''
azt sem tudom, hogyan lehet adott tartományon belül generálni számot:
devc++ om nem akarja elfogadni a random() fv-t, pedig elvileg ez lenne a megoldás
#include <time.h>
#include <stdlib.h>
int main()
{
double veletlenszam;
srand((unsigned)time(NULL));
veletlenszam=random(10000)/10000;
printf(''%lf\n'',veletlenszam);
system(''pause'');
}
próbáld ki, neked megy-e -
Hujikolp
őstag
[Szerkesztve]
-
emitter
őstag
Egy elég nehéz akadályba ütköztem aknakeresőm készítése közben:
ugye az úgy szép, meg elegáns, ha egy mezőnek a környezetében vmelyik másik mezőn nincs akna, és én erre a mezőre ''kattintok'', akkor addig tárja fel a szomszédos aknátlan mezőket, amíg csak lehet.
Hogy kicsit érthetőbb legyen, itt egy kép, h a májkroszofték ezt hogyan oldották meg:
Ha jól gondolkozom, akkor vmiféle rekurzív algoritmus kéne ehhez, de én az ilyenekben béna vagyok, nem nagyon tudnék magamtól ilyen algoritmus kitalálni.
Nálam így néz ki a dolog:
Pl. mikor a sárgán jelölt mezőre kattintottam, akkor csak azt az 1 mezőt tárta föl. Azt szeretném elérni, hogy az összes szomszédos nem-aknás mezőt tárja föl ilyenkor, tehát legalább a két fehér-keretes mezőig jusson el. (a fehér téglalap a kurzor akar lenni, azt nem kell nézni)
Szóval ha bárkinek bármilyen ötlete van, ne hallgassa el!
Előre is thx -
Sianis
addikt
Sziasztok!
Úgy tűnik kész a program közzé teszem a forrást, hátha lát benne valaki komolyabb hibát.
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#define random(range) (rand() % (range))
main()
{
char a;
unsigned int i,j,k,l,t,M,N,db;
double szam,szoras,szoras2,xatlag,szumma,r1,r2;
double xi[3000];
FILE *fout;
srand(time(NULL));
fout=fopen(''ki.txt'', ''w'');
printf(''\nNyitrai Istvan Statisztika feladata.'');
printf(''\nKerem adja meg a kiserletek szamat!'');
scanf(''\n%d'',&M);
printf(''\nKerem adja meg a valtozok szamat!(max 3000)'');
scanf(''\n%d'',&N);
if (N>3000)
{
printf(''/n Tul nagy elemszam,inditsa ujra.'');
exit;
}
xatlag=0;
db=M;
/*printf(''\nKivanja latni az adatokat? (0/1)'');
scanf(''%s \n'',&a);
if (a=='i')*/
for (i=0;i<N;i++)
{ // N kezdet
xi=0;
l=0;
r2=0;
for(j=0;j<M;j++)
{ //M kezdet
r1=0;
r2=0;
for (k=0; k<12; k++)
{ // k kezdet
szam=(random(10000));
szam=szam/10000;
r1+=szam;
} // k vég
r1=r1-(double)6;
r1=r1*(double)8.1666;
fprintf(fout,''\n%8.3lf'',r1);
r2=(((double)1.2*r1)+(double)1);
if (r1<(double)0)
if (r1>(double)(-0.1666))
{
fprintf(fout,'' megfelel %8.4lf'',r2);
l++;
}
else { fprintf(fout,'' nem felel meg %8.4lf'',r2);}
else { fprintf(fout,'' nem felel meg %8.4lf'',r2);}
}
//printf(''\ni = %d'',(int)i);
xi=l/(double)M;
xatlag=xatlag+xi;
}
printf(''\nxatlag összesen: %lf'',xatlag);
xatlag=(xatlag/N);
printf(''\n\n\n A szimulacio vegerdmenye: %3.8lf valoszinuseggel esik a megadott hatarok kozze.'',xatlag);
printf(''\n A pontos vegerdmeny : 0.008 .'');
getch();
fclose(fout);
}
Kérdésem a következő...hogyan lehetne úgy számot generálni, hogy 5-6 tizedesjegyű pontossággal állít elő 0-1 között? Nekem eddig 4-ig sikerült eljutni, ha feljebb veszem a 10000-ig generálást, akkor már hibás számok generálódnak. Ötlet esetleg?</p>
MOD: Kicsit bugos a PH motor, a ''-t ' '-nek írja...ha kódként írom be...[Szerkesztve]
-
emitter
őstag
/*printf(''\nKivanja latni az adatokat? (0/1)'');
scanf(''%s \n'',&a);
if (a=='i')*/
ez gondolom nem műxik, ha már kikommentezted
helyesen így nézne ki:
printf(''\nKivanja latni az adatokat? (i/n)'');
a=getch();
if (a=='i')
egyébként sajnos nem sokat réünk a forráskóddal, mert ha bekopipésztelem akárhova, átalakítja a '' idézőjelet ' ' idézőjellé
próbáld meg felrakni 1 tárhelyre
egyébként a scanf() nem parázik azért, mert beleírtál egy '\n'-t? Nálam ugyanilyenért asszem ezért fagyott rendesen a progi[Szerkesztve]
-
Sianis
addikt
[link]
Itt a végleges, nekem működik a letöltése!
Kérlek teszteljétek a progit, hogy nem ront-e el valamit...
Még valami. Egyik ismerősöm írt valami lrand() függvényt, amivel jobban lehet számokat generálni, long típusúakat ugyan, de nagyobb a ciklusideje. Viszont nem találom, hogy milyen headerben van definiálva, és hogyan kell meghívni. Valaki esetleg tud róla? Köszi előre is... -
emitter
őstag
azt nem tudjátok, hogy lehet C-ben pl. copyright-jelet írni? Meg az egyéb szimbólumokat, mondjuk a Unicode-kódokat kiiratni?
-
Jester01
veterán
1) a main függvénynek nincs megadva visszatérési típus. gcc szerint ez defaultból int. Viszont nincs return sem A helyes megoldás: kiírni, hogy int, és egy return 0 a végére.
2) az exit hívás így hibás, lemaradt a zárójel, nomeg a paraméter. Helyesen pl.: exit(1);
3) A ''/n Tul nagy elemszam,inditsa ujra.'' kiírásnál / van \ helyett. Különben meg szebb lenne, ha inkább újra bekérnéd a hibás értéket.
4) A ''\nKivanja fajba irni az adatokat? (i/n)'' kiírásnál kimaradt egy l betû
5) A ki.txt megnyitásának sikerességét nem ellenõrzöd.
6) Rengeteg double cast tök fölösleges.
7) A ''itt nem szabad osztani sehogy, mert nem kapunk jo eredmenyt'' megjegyzést nem értem. Itt pl. lehetne castolni, de persze simán egy lebegõpontos konstans is jó: szam=random(10000)/10000.; Mi ezzel a baj?Jester
-
Sianis
addikt
válasz Jester01 #1121 üzenetére
Szia!
Rád vártam vazze'
Válaszok:
1) Minek visszatérni? Szerintem egy ilyen laza kis feladathoz felesleges.
2) Ez is visszatérésel toldja meg nem? Vagy így abszolút nem megy?
3) Nem rontom el a változót, nem közösségi felhasználásra készül.
4) Javítva köszi...
5) Szerintem ezzel Win alatt nem lesz gond, főleg, hogy a tanár a saját gépén csak rendelkezik fájl létrehozási funkcióval.
6) Sokat szívtam vele, így legalább működik... Már nem tudom, hogy hol kell, hol nem, de azt tudom, hogy nélkülük nem volt tökéletes. Dev-C++ gcc-t használ, hát a fene sem tudja, hogy mikor mit ront el.
7) Nem működik, ha egy sorba van írva az osztással. Teljesen rejtély, de ha egy sorban van, akkor nagyon rossz számokat generál, így különírva megy.
Kérdés: Neked sincs ötleted, hogyan lehet pl 5-6 tizedesjegy pontosággal 0-1 között úgy, hogy 100000 generált szám között ne ismétlődjön túl gyakran? Tanár kötekedni szokott emiatt, de szerintem az én megoldásom sem rossz, szakmai fórumokon ezt a számot megírtam, plusz egyetemi tanárok is így használják. Neked esetleg valami ötlet? -
emitter
őstag
válasz Jester01 #1121 üzenetére
hali!
én is sokat szívtam nélküled de legalább kisebb simításokat tudtam végezni a ''holt időmben''
szóval a kérdésem az, h miért száll el a progim (lefut, rögtön bezáródik hibaüzi nélkül)
mindent kikommenteztem, csak a load() maradt, ez nem akar menni rendesen
[link]
megköszönném ha rá tudnál pislantani, köszi előre is! -
Jester01
veterán
válasz emitter #1125 üzenetére
Khm, a fejed fogod a falba csapkodni
A fagyi konkrétan azért van, mert a mezo változót akarod felszabadítani, aminek sosem adtál értéket. Ugyanúgy mint az mx és my esetén, ha azt akarod, hogy a függvénybõl visszajöjjön, akkor pointert kell átadni. Itt ez már 3 csillag lesz (Persze void visszatérési típus helyett lehet palya** is, és akkor return-nel adod vissza)
Ezen kívül: nem tudom mit ittál amikor ezt írtad:
temp=(char*)malloc((*mx)*sizeof(char)+(int)my);
Gondolom szegény fordító tiltakozott az my ellen (hiszen az most egy pointer!), de te jól ''megerõszakoltad''
Mivel az egész pálya most egy sorban van, így nyilván 4 * (*mx) * (*my) hely kell. Plusz az egy byte a lezáró nullának amire már valamikor felhívtam a figyelmed
Ha ez mind megvan, akkor már csak az a baj, hogy a k=k+4 rossz helyen van, a belsõ ciklusmag végére való (vagyis a kapcsoszárójelen belülre).Jester
-
Jester01
veterán
1) Ahogy gondolod. Nem fáj sokba.
2) Abszolút nem megy, hiszen ez így nem függvényhívás. ''warning: statement with no effect''
3) Felõlem
5) Jah, kivéve ha mondjuk read-only directoryban futtatja.
6) ''gcc-t használ, hát a fene sem tudja, hogy mikor mit ront el.'' Nem ront el semmit.
7) Érdekes. Nekem nagyjából hasonló eloszlású számok jöttek ki.
Sajna nem tudok random generátort.Jester
-
emitter
őstag
válasz emitter #1128 üzenetére
most palya**-t adtam vissza a load()-dal, most nem fagy
és műxik a betöltés is, eddig miden ok, köcce
még ott van viszont a szerencsétlen és átláthatatlan feltar() fv-em, ami szintén fagyaszt, de simán elronthattam benne akármit, mert rekurzív, és mint mondtam, ehhez nem sokat értek
bár ha te sem találod meg benne első ránézésre a hibát, akkor sztem ne fáradj vele, legfeljebb kihagyom a progiból ezt a fícsört mondjuk így majd sokkal többet kell kattintgatni... -
emitter
őstag
válasz Jester01 #1130 üzenetére
ok, javítottam, most jó kell legyen
meek csicsikálni, holnap a suliban még debuggolok
még azon a feltar()-on van mit csiszolni
meg a mentett pálya folytatása sem az igazi
ja, ha még nézegeted, akkor 'proba.txt' néven mentsd el a pályát, mert a load() is azt olvassa vissza (egyelőre)
jó éjt!
és köszi a segítséget[Szerkesztve]
-
Jester01
veterán
válasz emitter #1129 üzenetére
Rögvest három probléma is van vele, de fagyasztani elvileg csak az egyik fagyaszt. De a végtelen ciklus egyébként is garantált
if(y==0) //ha a legfelsõ sorban vagyunk
{
if(mezo[x][y-1].akna==0)
Ez nagyon egészségtelen. -1 lesz az index. Bye-bye ...
MOD: ebbõl van több is. Nem lenne egyszerûbb, ha mindig kiszámolnád mind a nyolc szomszéd koordinátáját, és egyszerûen ellenõriznéd, hogy a pályán belülre esik-e?
Második probléma, hogy nem ellenõrzöd merre jártál már.
A harmadik pedig alapvetõ koncepciós probléma: nem azt kell nézni, hogy az adott mezõn van-e akna, hanem azt, hogy az adott mezõ szomszédain van-e akna. Csak akkor szabad továbbmenni, ha egyik szomszédján sincs.[Szerkesztve]
Jester
-
Miracle
senior tag
válasz emitter #1109 üzenetére
ha ures mezot talalsz akkor beleteszed egy FIFOba az osszes szomszedos mezot, es egyesevel meghivod rajuk a kattint fuggvenyt. persze nem art, ha a kattint nem szall el olyan mezotol, ami nincs a palyan, vagy mar volt ra kattintva. ennyi az egesz.
értelmező késziszótár :: rekurzió --> lásd : rekurzió
-
emitter
őstag
válasz Jester01 #1132 üzenetére
kicsit bonyolultabb a helyzet, mint gondoljátok szóval ha lehet, máshogy oldom meg ezt a rekurzív cuccost:
kérdés, hogy lehet azt lekérdezni (''felfogni''), hogy ha én egy tömb nemlétező indexű elemét akarom elérni. Gondolom ilyen esetben a progi generál magának valahova egy hibaértéket (valami error-output-ba?) Van ilyen egyáltalán?
Csak mert ha ezt tudnám hasznosítani, akkor nem kellene ennyiféle if-elágazást csinálni a feltar() fv-emben, hanem elég lenne megnézni a szomszédos mezők akna-vizsgálatakor, hogy az igaz-e az error (azaz nem létezik ilyen indexű tömbelem, azaz túlléptem a pálya szélét).
Ha error==1, akkor break; vagy vmi ilyesmi, és folytatom a következő mezővel a vizsgálást.
Szal van ilyesmi error-cucc? -
Jester01
veterán
válasz emitter #1134 üzenetére
kicsit bonyolultabb a helyzet, mint gondoljátok
Nagyképűség be: Szerintem mi remekül átlátjuk a helyzetet
Van ilyen egyáltalán?
Nincs. De magadnak ellenőrizheted.int mx, my; /* palya meret */
int x, y; /* ennek a szomszedait keressuk */
for(int dx = -1; dx <= 1; dx++)
{
for(int dy = -1; dy <= 1; dy++)
{
int cx = x + dx;
int cy = y + dy;
if ((dx != 0 || dy != 0) && cx >= 0 && cx < mx && cy >= 0 && cy < my)
{
...
}
}
}
Nyilván külön függvénybe is teheted az ellenőrzést, és akkor még szebb lesz.
MOD: A cx kiszámítását és ellenőrzését persze az y cikluson kívülre is lehet tenni, úgy gyorsabb lesz[Szerkesztve]
Jester
-
-
Jester01
veterán
válasz emitter #1138 üzenetére
Igen, ez pontosan ezt jelenti
Amit te írtál, az sajnos azt jelentené, hogy csak átlósan menne tovább, hiszen megköveteled, hogy i és j sem nulla. Amit én írtam, az a !(i == 0 && j== 0) átalakítása a De Morgan azonosság szerint. Lehet, hogy ebben a formában érthetõbb lett volna, bocs
MOD: Amúgy ezt meg lehet spórolni, ha elõre felveszed mind a 8 lehetséges elmozdulásvektort és simán egy ciklusban mész végig rajtuk.[Szerkesztve]
Jester
-
emitter
őstag
válasz Jester01 #1139 üzenetére
na asszem ezt mára feladom, már nem fog az agyam ilyen későn
egyszerűen ez a rekurzív dolog nagyon bekavar, nem is értem a lényegét, hogy honnan hova ugrik a progi futása a rek. fv-hívások közben, stb...
másik kérdés:
konzolos módban végre rájöttem, hogyan lehet színeket kevergetni, de nincs vhol egy táblázat, hogy milyen kevergetéssel milyen színeket lehet előállítani?
ha jól számolok, összesen 22 színárnyalatot lehet csinálni, beleértve a fehéret, feketét, ugye? -
emitter
őstag
válasz emitter #1142 üzenetére
közben sikerült minden színt kikevernem:
#define color_white SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_INTENSITY)
#define color_lightgray SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED)
#define color_gray SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY)
#define color_black SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), )
#define color_red SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED|FOREGROUND_INTENSITY)
#define color_darkred SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED)
#define color_lime SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|FOREGROUND_INTENSITY)
#define color_green SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN)
#define color_blue SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE|FOREGROUND_INTENSITY)
#define color_darkblue SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE)
#define color_navyblue SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|FOREGROUND_BLUE
#define color_cyan SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY)
#define color_fuchsia SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE|FOREGROUND_RED)
#define color_purple SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_INTENSITY)
#define color_brown SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|FOREGROUND_RED)
#define color_yellow SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY)
sztem ennyi az összes lehetséges kombináció
azért csodálkozom, h C-ben ennyire alapszinten kezelik a színeket... pascalban simán rendelkezésre állt az összes szín... -
Jester01
veterán
válasz emitter #1143 üzenetére
Aztán ez mennyi? Mert szerintem 16
MOD: Amúgy ez nem a C nyelv jellemzõje, hanem a mindenkori terminálé, jelen esetben windows konzolé. A gyönyörû progid (valamikor küldtél screenshotot) nálam nem is fordul, mivel én linuxon vagyok. Pedig C az van...[Szerkesztve]
Jester
-
Jester01
veterán
válasz emitter #1145 üzenetére
Általánosságban nem. Viszont vannak APIk és libraryk amik nagyobb platformfüggetlenséget biztosítanak. Pl ANSI escape szekvenciák, curses.
A unixos világban mindig is sok különbözõ gép volt sok különbözõ termináltípussal így eleve igény volt a probléma kezelésére.Jester
-
Jester01
veterán
válasz Jester01 #1146 üzenetére
Nagyon akartam aknát keresni, úgyhogy csináltam egy kis windows over ncurses emulátor réteget Screenshot mûködés közben: [link]
Persze a színekkel meg a speciális keretrajzoló karakterekkel nem foglalkoztam.
Annyi haszna volt a dolognak, hogy felhívhatom a figyelmed arra a tényre, hogy a konzol ablak windows alatt is átméretezhetõ, vagyis nem szép dolog arra építeni, hogy 80 oszlop van.
Ja és persze kipróbáltam az automatikus feltárást is Azt kellene még lekezelnie, ha olyan mezõt tár fel, ahová a felhasználó már tett zászlót.
Valamint nem ártana egy #include <math.h> mivel így a floor függvényt implicit int visszatéréssel használja és telerakja aknával az egész táblát Persze lehet, hogy windows alatt valamelyik másik header már berántja, akkor vedd úgy, hogy nem szóltam.Jester
-
Jester01
veterán
-
emitter
őstag
válasz Jester01 #1149 üzenetére
köszi, már be is építettem!
és ezennel jelentem, kész a második verzió, felraktam a táramra! [link]
egy probléma lép még föl néha: a képen látszódó 2 db 1-es rögtön indítás után (új játék) jelent meg magától, úgy, hogy nem is nyomtam még sehova
de ez teljesen random, néha csinálja néha nem, ha csinálja akkor mindig a baloldali első v második sorban egy-két mezőt előre felderít nekem ráadásul nem is mindig jól, mert volt, h feketével jelölt nekem egy mezőt, mire miztonságból rákattintottam, ásláss csodát: akna volt alatta halvány gőzöm sincs, h ez mitől lehet...
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!