Valaki tud tenni valamit?
Csináltam egy programot, amiben van két tömb benne számokkal, a tömb tagjai is adottak.
Akérdésem az, hogy hogyan csináljam meg azt, hogy a két tömbből 4-es számkombinációkat alkosson, de az első tömbből 3 tago míg a másodikból csak egyet használjon a számkombinációkhoz.
Kombinációnként a számok sem ismétlődhetnek és ugyanolyan számokat tartalmazó kombinációk sem lehetnek más sorrendben.





Adott egy A halmaz és egy B halmaz.
Képezzük az összes lehetséges (k, b) párt, ahol
* K: az A halmaz 3-ad osztályú **kombinációja**,
* b: a B halmaz eleme,
* és még az is teljesüljön, hogy b nem lehet benne K-ban.
{ (K, b) : K ∈ C_A^3, és b ∈ B, és b ∉ K }
Az összes dolog az algoritmusban azért van, hogy mindez stimmeljen. (Tömbökből az ismétlődők irtása, indexeknél meg az, hogy a j-t átpöccenéskor nem 0-tól, hanem az i utáni helyről indítjuk újra, és csak hátrafele mozoghat, és k is így mozog a j-hez képest. Így az i < j < k sorrend mindvégig megmarad, így a ciklus tényleg nem fog kétszer venni olyan esetet, ahol csak a sorrend lenne a különbség)










A külső ciklus (ami önmaga is 3 ciklusból áll) erről akartam egy videót találni, sajnos azt nem találtam, pedig jó lenne egy videón bemutatni az i, j, k index mozgását, mindenesetre ha videót nem is, de egy képsorozatot találtam erről:





Én is köszönöm, sok iskert kívánok Neked.
A legeslegeslegbelső magra (,,kiírás'') találtam még egyszerűbb felirást: tkp. még a continue utasítás is felesleges, elég egy if sima vizsgálat:
if (b != a[i] && b != a[j] && b != a[k])
. , . printf("%d, %d, %d, %d\n", a[i], a[j], a[k], b[m]);
vgyis ha b épp aktuális nincs meg az a-ból szintén épp aktuálisan választott kombinációban, AKKOR írja ki az esetet, egyébkét meg ne tegyen semmit (és így persze a ciklusok egyszerűen továbbveszik a következő lépést)
Így a program egésze így nézne ki:
A tömbök előszűrése ,javított' változataikba
Külső ciklus az 'a' tömbre (tkp három ciklus egymásban, 'i', 'j', 'k' "indexekkel" 'a' tömb 3-kombinációit egyenként)
. , .Belső ciklus 'b' tömbre ('m' index egyszerűen végigszalad 'b' tömbön)
. , . . ,if (b != a[i] && b != a[j] && b != a[k])
. , . . , . .printf("%d, %d, %d, %d\n", a[i], a[j], a[k], b[m]);





JAVÍTÁS (a legbelső magban):
A 'a' és a 'b' tömb előszűrése;
Külső ciklus az 'a' tömbre (három ciklus egymásban, 'i', 'j', 'k' "indexekkel", ábra szerint);
. , .Belső ciklus 'b' tömbre ('m' index végigfut 'b' tömbön);
. , . . ,if (b[m] != a[i] && b[m] != a[j] && b[m] != a[k])
. , . . , . .printf("%d, %d, %d, %d\n", a[i], a[j], a[k], b[m]);





Most most ki is próbáltam:
Itt van ugye a main.c file, meg a kényelmesebb tesztelhetőség érdekében egy teszt-adatfile is (test1.data). Ha a programot önmagában futtatod, akkor interaktívan bekéri az adatokat. Ha viszont programot úgy futtatod, hogy a tesztfile tartalmát (pl. Linux parancssorban) átirányítod a standard bemenetre, akkor nem is kell a gépeléssel fáradni, és egy megírt tesztfile akárhányszor felhasználható, módosítható. A tesztfile (test1.data) adatait úgy kell érteni, hogy az első két szám az 'a' és a 'b' tömb mérete, utána jönnek (a megadott méretek szerint) az 'a' tömb adatai, majd a 'b'tömb adatai. A nekem kijött futási eredmény a test1.log fájlban található. Az egszerűség kedvéért a teszt-adatfájlba azokat az adatokat tettem, amiket Te is megadtál példaként.





Ha a kommenteknél, szövegeknél nem látszanak az ékezetek, akkor megadom összecsomagolt formában is:
A kódot picit elbonyolítottam, de egy részét nyugodtan át lehet ugrani: az elején csak adatbeolvasások vannak, meg tömbfeltöltések, meg az ismétlődő elemek kiválogatása a ,,javított'' tömbökbe, meg a magyarázó kiírások.
A végén van az igazi lényeg. Az elejét nyugodtan el is lehet hagyni, igaz, akkor a felhasználó jóindulatán múlik, hogy ne adjon meg ismétlődő elemeket a tömbökön belül.





Az ilyen előkészítő dolgokra külön függvényeket írtam, ezek definíciója persze külön modulba került: segedfuggvenyek.c
Persze fordításkor ezt is hozzá kell linkelni a projekthez:
gcc main.c segedfuggvenyek.c
Így áttekinthetőbb és tömörebb lett.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!