Kezdőoldal » Számítástechnika » Programozás » Valaki segítene nekem programo...

Gál Mihály kérdése:

Valaki segítene nekem programozásban? C#

Figyelt kérdés

Nem a komplett feladatmegoldásra lennék kiváncsi. Csak egy kis útmutatásra lenne szükségem.


Az objektum ezen adatok szerint van létrehozva:

Feladatrész: filmcím;forgatás_éve;rendező;költség;bevétel + a nyeresegé is, ami bevétel - költség szerint alakul


A program írja a standard kimenetre a filmek címeit az általuk termelt nyereség (ami nem más, mint a költségekkel csökkentett bevétel) csökkenő sorrendjében, soronként egyet-egyet! Ha két film azonos nyereséget termelt volna, akkor a régebben készült film szerepeljen előrébb; ha a készítésük dátuma is megegyezne, akkor a bevételek nagysága szerint csökkenő sorrendben írja őket a kimenetre; ha pedig ez is azonos lenne, akkor a címük szerint lexikografikusan növekvő sorrendben jelenítse meg őket!


A rendezésre lennék csak kiváncsi:

A rendező algoritmusokat megcsináltam IComparer interfésszel:


public class shortBynyereseg : IComparer<Filmek>

{

public int Compare(Filmek x, Filmek y)

{

if (x.nyereseg > y.nyereseg)

{

return -1;

}

if (x.nyereseg < y.nyereseg)

{

return 1;

}

else

return 0;

}

}


public class shortByforgataseve : IComparer<Filmek>

{

public int Compare(Filmek x, Filmek y)

{

if (x.forgataseve > y.forgataseve)

{

return 1;

}

if (x.forgataseve < y.forgataseve)

{

return -1;

}

else

return 0;

}

}


public class shortBybevetel : IComparer<Filmek>

{

public int Compare(Filmek x, Filmek y)

{

if (x.bevetel > y.bevetel)

{

return -1;

}

if (x.bevetel < y.bevetel)

{

return 1;

}

else

return 0;

}

}


public class shortByfilcim : IComparer<Filmek>

{

public int Compare(Filmek x, Filmek y)

{

return x.filmcime.CompareTo(y.filmcime);

}

}


Arra vagyok kiváncsi hogy hogyan kell a mainben helyesen megírni úgy, hogy feladat szövege szerint rendezzen több feltétel alapján.

Azért az én gondolatmenetemet is berakom ide:


if (n > 1)

{

for (int l = 0; l < list.Count - 1; l++)

for (int k = 1; k < list.Count; k++)

if (l != k)

if (list[l].nyereseg == list[k].nyereseg)

{

list.Sort(sev);

if (list[l].forgataseve==list[k].forgataseve)

{

list.Sort(bev);

if (list[l].bevetel==list[k].bevetel)

{

list.Sort(cim);

}

}

}

}


A sev, bev stb ami a list.Sort ban van megadva az mind e szerint van dekralálva: pl.: shorBynyereseg sb = new shorBynyereseg<Filmek>();


A feladat szövege alapján szerintem érthetőnek kell lennie a gondolatmenetemnek (lehet benne azért bőven hiba)


Egyszerűen nem tudok rájönni hogy hogyan kellene felételek alapján rendezni a listát. Az objektum osztálya természetesen el van látva get és set el, toStringgel és egyébbel. (comperTo nincs mert az külön classba definiált interfészben vannnak megírva)


Tudom hogy lehet Orderby - al meg mással is rendezni de én inkább ezt választottam mert számomra így átláthatóbb az egész programom



2020. okt. 30. 22:47
 1/6 savanyújóska ***** válasza:
Szerintem kicsit túlbonyolítod, egyszerűbb egy komparátort írni, amelyik egy függvényen belül mindent figyelembe véve visszaadja, hogy két film közül melyik profitja a nagyobb. Ezután ezt akár egy bubble sort feltételébe is beillesztheted a mainbe, és működni fog, azt pedig amit most a mainben próbálsz megalkotni, át kellene helyezni a létrehozandó függvénybe, hogy egyszerre csak kettőt hasonlítson össze, mivel a jelenlegi megoldásodnál minden egyes feltételre újra rendezned kell az egészet, figyelembe véve az előző rendezést, ami egyrészt egy létező feladat, és nem is túl nehéz, de itt azért még nem kell, és azért mindig macerás megírni.
2020. okt. 31. 00:38
Hasznos számodra ez a válasz?
 2/6 A kérdező kommentje:
De nem minden Comparer függvény növekvő sorrendbe rendez. Van közötte olyan ami csökkenő sorrendet csinál. Valamint azt észrevettem hogy nem kellene minden elemet vizsgálni (ezért írtam hogy biztos hogy van benne hiba). Nem tudom hogy hogyan kellene csak KÉT elemet rendezni egy listában. Tehát az rendben van hogy 2 elemet vizsgálok, de ha függvényben meghívom a comparer függvényt akkor is az egész listát fogja rendezni. Próbáltam úgyis hogy a list.Sortban delegate-tel írtam meg de akkor is az egészet rendezte.
2020. okt. 31. 08:37
 3/6 savanyújóska ***** válasza:
De neked nem kell az IComparer, csak egy függvény, ami A és B közül eldönti melyik van előbb, és 1-et ad vissza, ha A, -1-et ha B és 0-t, ha egyenlőek (jelen esetben ez kb. kizárt, de ettől még hozzátartozik). Ez azért lesz jó, mert az összes bonyolult feltételt kiemeled egy pontra, abba a függvénybe, amelyik összehasonlítja a két elemet, így a feladat legegyszerűsödik, és olyan lesz mintha rendezned kéne egy random számokból álló tömböt. (Mivel már van módod, hogy egyértelműen megmondd, két film közül melyik a "nagyobb", így csak köré kell alkalmaznod bármelyik rendezési algoritmust ami számokra működik.) Ha a Quicksort, Bubblesort nem mond semmit, akkor azoknak mindenképp nézz utána, sokkal egyszerűbb lesz velük ez a feladat is. Hála az OOP-nek, csábító, hogy magadnak ird
2020. okt. 31. 12:45
Hasznos számodra ez a válasz?
 4/6 savanyújóska ***** válasza:
meg a comparert az egész listâra, de mint mondtam, szerintem ezzel. logikával, amit eredetileg küldtél, sokkal bonyolultabb lesz a végeredmény, és debugolni is nehezebbm
2020. okt. 31. 12:46
Hasznos számodra ez a válasz?
 5/6 A kérdező kommentje:

Köszönöm szépen a választ!

Már sikerült megoldanom. Írtam egy függvényt az IComparer helyett.

2020. okt. 31. 13:38
 6/6 anonim ***** válasza:

Pedig nem volt rossz út az IComparer. Ennél példánál az egyszerűsége miatt, lehet könnyebb megvalósítani egy függvényben, mint kisebb darabokban, de azt nem árt tudni, hogy egy összetett és bonyolult elágazást, amiben ezernyi if-else van egymásba ágyazva, mindig szenvedős lesz olvasni, módosítani és karbantani. Ilyen esetekre találták ki az állapot mintát vagy a felelőségláncot.


Pl itt, nemes egyszerűsségel 0 érték esetén tovább tudod passzolni az összehasonlítást egyik IComparertől egy másiknak, majd aztán tovább, tovább és tovább...míg a végére nem érünk, valahogy így:


class SortByNyeresegCsokkeno : IComparer<Film>

{

public int Compare(Film x, Film y)

{

int eredmeny = x.Nyereseg.CompareTo(y.Nyereseg)*-1;


if (eredmeny != 0) return eredmeny;

else return new SortByForgatasEve().Compare(x, y);

}

}

class SortByForgatasEve : IComparer<Film>

{

public int Compare(Film x, Film y)

{

int eredmeny = x.ForgatasEve.CompareTo(y.ForgatasEve);


if (eredmeny != 0) return eredmeny;

else return new SortByBevetelCsokkeno().Compare(x, y);

}

}

class SortByBevetelCsokkeno:IComparer<Film>

{

public int Compare(Film x, Film y)

{

int eredmeny = x.Bevetel.CompareTo(y.Bevetel)*-1;


if (eredmeny != 0) return eredmeny;

else return new SortByFilmCim().Compare(x, y);

}

}

class SortByFilmCim:IComparer<Film>

{

public int Compare(Film x, Film y)

{

return x.FilmCim.CompareTo(y.FilmCim);

}

}


Persze lehet így is:


class SortByNyeresegCsokkenoV2 : IComparer<Film>

{

public int Compare(Film x, Film y)

{

int eredmeny = x.Nyereseg.CompareTo(y.Nyereseg) * -1;


if (eredmeny != 0) return eredmeny;

else

{

eredmeny = x.ForgatasEve.CompareTo(y.ForgatasEve);

if (eredmeny != 0) return eredmeny;

else

{

eredmeny= x.Bevetel.CompareTo(y.Bevetel) * -1;

if (eredmeny != 0) return eredmeny;

else

{

return x.FilmCim.CompareTo(y.FilmCim);

}

}

}

}

}


Ugyanazt csinálják, de én mégis szívesebben nyúlnék bele az előzőbe, ha arról szólna a fáma, hogy az összehasonlítás új szempontokkal bővűl vagy ne talán megváltozna a sorrend.


Másik, van pár dolog, ami szúrta a szemem, c#-os kódolási konvenciókat tekintve. Nem kell az alábbi részt véresen komolyan venni még, a tanulás legelején elsősorban az a fontos, hogy az algoritmus logikailag helyes legyen.


1."public class shortBynyereseg"

Classok neve mindig nagybetűvel kezdődik.


2."list[l].nyereseg":

-Ha fieldet használtál:

Fieldek sose legyenek publikusak, ha mégis elakarod érni az értéküket kívülről,akkor írj hozzá publikus property-t vagy getter függvényt.


-Ha propertyt: Property első betűje mindig nagybetű.


3."Compare(Filmek x, Filmek y)"

Ha az osztály/objektum nem kollekció, akkor a neve ne álljon többesszámban.

2020. nov. 1. 01:45
Hasznos számodra ez a válasz?

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

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!