Valaki segítene nekem programozásban? C#
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
Köszönöm szépen a választ!
Már sikerült megoldanom. Írtam egy függvényt az IComparer helyett.
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.
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!