Kezdőoldal » Számítástechnika » Programozás » Tudna segíteni valaki ennek a...

Tudna segíteni valaki ennek a C++ feladat végének a megoldásában?

Figyelt kérdés

Egy N résztvevőjű kutyaszépségversenyen M különböző szempont szerint pontoznak minden kutyát. Minden szemponthoz adott egy maximális pontszám. Az összetett versenyből automatikusan kiesik az a kutya, amely valamelyik szempont szerint nem éri el a szempontonként megadott alsó ponthatárt az adott szempontból sem értékelhető, más szempontokból viszont igen.

Készíts programot, amely megadja az összetett verseny sorrendjét!

Bemenet:

A standard bemenet első sorában a résztvevő kutyák száma (1≤N≤100) és a szempontok száma (1≤M≤100) van. A második sorban M szám van, az egyes szempontok szerint elérhető maximális pontok (1≤Maxi≤100). A harmadik sorban M szám van, az egyes szempontok alsó ponthatárai (1≤Mini≤Maxi). Az ezeket követő N sor mindegyikében az adott résztvevő kutya M pontszáma található (0≤Pi,j≤Maxj).

Kimenet:

A standard kimenet első sorába az összetett verseny sorrendjét kell írni a győztes kutya indexével kezdve, kihagyva a kiesettek indexét!

Példa

Bemenet

6 8

9 9 9 9 9 9 9 9

5 5 5 5 5 5 5 5

8 4 6 6 6 6 6 6

7 5 7 6 6 6 6 5

6 6 6 5 5 5 5 6

8 6 8 7 7 7 7 6

8 6 9 6 6 6 6 6

8 6 6 6 6 6 6 1


Kimenet:

4 5 2 3


Már nagyrészt sikerült megcsinálnom a feladatot, de a végén elakadtam. Kigyűjtöttem a maradtak nevű tömbbe a még versenyben lévő kutyák összpontszámait és az index jelöli a kutyák sorszámait. A pontszámokat csökkenő sorrendbe kellene állítani úgy, hogy az indexük ne változzon, de ezt eddig sehogy sem sikerült megoldani. Valaki tudna segíteni megoldani?


Kódom:

[link]



2021. dec. 3. 21:39
 1/4 anonim ***** válasza:
51%

Szia!


A feladatod roppant egyszerű. Mielőtt bármit csinálnál, a feladatot vázlatszerűen, értelmesen és röviden, tényszerűen fel kell írnod, és meg kell értened. Ha ezt nem teszed meg, nem érted meg és nem tudod azt, hogy milyen problémát kell megoldanod, akkor egyáltalán hogy írhatnál kódot?


Tudd elmodnani a saját szavaiddal, hogy mit akarsz csinálni. Ha el tudod mondani egymás után háromszor anélkül, hogy saját magadat összezavarnád, akkor érted a problémát, és van egy megoldásod rá. Legyenek modelljeid, megfelelő methodokkal, valósuljon meg az OOP minden szabálya, írj egy szép kódot.


Ha valamit nem értesz, az azért lehet, mert kapkodsz. Lépjél vissza hármat, tegyél le mindent, olvass, értelmezz, rakd össze a fejedben újra az egészet, és észre fogod venni, hogy a kódod felét ki fogod dobni. Ennyit kell tenned.

2021. dec. 3. 23:24
Hasznos számodra ez a válasz?
 2/4 anonim ***** válasza:
0%
#1 A jövőben én is alkalmazni fogom a javaslataidat, köszönöm szépen.
2021. dec. 4. 00:58
Hasznos számodra ez a válasz?
 3/4 anonim ***** válasza:
100%

Változóval nem kellene megadni a tömb hosszát C-ben vagy C++-ban.


A pontok összesítésén módosíts kicsit. A belső ciklust feltételéhez hozzá lehetne adni azt is, hogy csak addig menjen, amíg a "kiesett" értéke hamis.


Egyrészt "if(kutyak[i][j] > minpontszam[j] )" ez így nem jó, akkor is hozzá kell adni szerintem, ha a minimum pontot elérte, tehát nem ">", hanem ">=". Másrészt erre a feltételre semmi szükség, akkor is hozzáadhatod a pontokhoz, ha nem érte el a minimumot, mivel a végén úgyis csak akkor lesz eltárolva, ha a "kiesett" false.


Ha az összesítés végén a "kiesett == false", akkor el kell tárolni.

Az is egy megoldás, ahogy csináltad, hogy az azonosítójával megegyező indexre írod be a pontot, viszont így előfordulhat a végén az, hogy a tömbben pl. lesz 1 pontszám, utána 1000 üres hely, aztán még 1 pontszám, majd 1000 üres hely, stb. Szóval ez így nem túl jó.

Ehelyett lehetne azt csinálni, hogy 2 tömböt használsz az eredmények tárolására. Az egyikbe írod az azonosítót, a másikba a pontszámot. Kell egy "i" változó, ami kezdetben 0, és azt adja meg, hogy eddig hányan nem estek ki. Ha az összesítés végén "kiesett == false", akkor az egyik tömb i-edik helyére beírod az azonosítót, a másik tömb i-edik helyére a pontszámot, majd i-t megnöveled eggyel.

Ezzel elérted, hogy egy egybefüggő területen egymás után legyenek a pontok.


Ezután csökkenő sorrendbe kell rendezni az azonosítókat a pontszámok alapján. Az előbb leírt tárolás alapján az egyik tömbben az azonosítók, a másikban a pontok vannak. Mindegyik azonosító esetén megszámolod, hogy hány kisebb pontszámú van nála, és ez alapján meg lehet határozni a helyezést, majd beírni az azonosítót a megfelelő helyre az eredmény tömbbe.

A végén meg csak ki kell írni az eredmény tömb elemeit.


(A rendezéshez még egy kis segítség:

Egyesével végig kell menni az azonosítók tömbön. Tegyük fel, hogy az azonositok[j]-nél tartasz. Ekkor azt kell megszámolni, hogy a pontok tömbben hány darab pontok[j]-nél kisebb pontszámú van. Viszont ez nem ilyen egyszerű, ha azonos pontszámok is lehetnek, és itt szerintem előfordulhat ilyen (egyszerű végiggondolni, hogy mi lenne a probléma ilyenkor).

Szóval ahelyett, hogy azt számolnád, hogy a pontok[j]-nél hány kisebb van, azt kellene nézni, hogy hány kisebb vagy egyenlő van, és ezt is csak pontok[j+1]-től kezdve. (ezt is végig lehet gondolni, vagy egy konkrét példát megnézni))



Ez egy megoldás a feladatra. Nyilván lehetne ezt hatékonyabban csinálni, de ha az a cél, hogy tömbökkel oldd meg, programozási tételeket használva, akkor szerintem ez egy jó megoldás lehet.


Egyébként meg célszerű lenne nem mindent a main-be írni. Lehet függvényeket csinálni, ami paraméterként átvehetik a tömböket (mint első elemre mutató pointer), és átláthatóbb lesz az egész.

2021. dec. 4. 12:57
Hasznos számodra ez a válasz?
 4/4 anonim ***** válasza:
52%

3 hiába próbálsz tanácsot adni egy meglévő, rosszul felépített kódra, ha idáig el se jutott volna, ha normálisan végiggondolja a feladatot miután elkezdi lekódolni.


A feladat ennél soha nem lesz bonyolultabb, semmilyen formában, maximum absztraktabb objektumokkal fogsz dolgozni a sokadik öröklési szinteken. Egymásba ágyazott forciklusok (még ha nem is látod), elágazások. Minden más csak maszlag, de a lényeg mindig ugyan az. Ha végig van gondolva, akkor nem lehet elrontani. Ezért kell debuggolni, és LÉPÉSENKÉNT végigmenni a kódon. Soronként.

2021. dec. 4. 13:39
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!