25-én elkezdjük összefoglalni a feladatsort, végignézzük a tanári megoldást. A kiírást még megnéztük, innen folytatjuk.
Elméletben és gyakorlatban számonkérések várhatók, többek között gyakorlati témazáró is.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
//Monitor vásár
//Egy hardver cég többféle monitort árul.A monitorokról a következő adatokat tároljuk:
//a monitor gyártója; típusa; mérete; ára;
//illetve amelyik kifejezetten játékra való, ott még megadják azt is, hogy gamer.
//A méret colban van, az ár nettó és forintban értjük.
//Forrásfájl tartalma (a tartalmat használd így, ahogy van, az első sort majd nem kell figyelembe venni beolvasáskor):
//Keszleten levo monitorok
//Samsung;S24D330H;24;33000
//Acer;V227Qbi;21.5;31000
//AOC;24G2U;23.8;66000
//Samsung;Odyssey G9 C49g95TSSU;49;449989;gamer
//LG;25UM58-P;25;56000
//Samsung;C27JG50QQU;27.5;91000
//Feladatok:
//Lehetőleg minden kiírást a főprogram végezzen el paramétereken keresztül.
//Próbálj minél több kódot újrahasznosítani.
//1. Hozz létre egy osztályt a monitorok adatai számára. Olvasd be a fájl tartalmát.
//Oldd meg, hogy bármennyi monitort is tudj kezelni.
//2. Írd ki a monitorok összes adatát, soronként egy monitort a képernyőre.
//A kiírás így nézzen ki:
//Gyártó: Samsung; Típus: S24D330H; Méret: 24 col; Nettó ár: 33000 Ft
//2. Tárold az osztálypéldányokban a bruttó árat is (ÁFA: 27%, konkrétan a 27-tel számolj.)
//3. Tételezzük fel, hogy mindegyik monitorból 15 db van készleten, ez a nyitókészlet. Mekkora a nyitó raktárkészlet bruttó (tehát áfával növelt) értéke?
//Írj egy metódust, ami meghívásakor kiszámolja
//a raktárkészlet aktuális bruttó értékét. A főprogram írja ki az értéket.
//4. Írd ki egy új fájlba, és a képernyőre az 50.000 Ft feletti nettó értékű monitorok összes adatát (a darabszámmal együtt) úgy,
//hogy a szöveges adatok nagybetűsek legyenek, illetve az árak ezer forintba legyenek átszámítva.
//Az ezer forintba átszámítást egy külön függvényben valósítsd meg.
//5. Egy vevő keresi a HP EliteDisplay E242 monitort.
//Írd ki neki a képernyőre, hogy hány darab ilyen van a készleten.
//Ha nincs a készleten, ajánlj neki egy olyan monitort, aminek az ára
//az átlaghoz fölülről közelít.
//Ehhez használd az átlagszámító függvényt (később lesz feladat).
//6. Egy újabb vevőt csak az ár érdekli. Írd ki neki a legolcsóbb monitor méretét,
//és árát.
//7. A cég akciót hirdet. A 70.000 Ft fölötti árú Samsung monitorok bruttó árából
// 5%-ot elenged.
//Írd ki, hogy mennyit veszítene a cég az akcióval,
//ha az összes akciós monitort eladná.
//8. Írd ki a képernyőre minden monitor esetén,
//hogy az adott monitor nettó ára a nettó átlag ár alatt van-e, vagy fölötte,
//esetleg pontosan egyenlő az átlag árral. Ezt is a főprogram írja ki.
//9. Modellezzük, hogy megrohamozták a vevők a boltot. 5 és 15 közötti
//random számú vásárló 1 vagy 2 random módon kiválasztott monitort vásárol,
//ezzel csökkentve az eredeti készletet.
//Írd ki, hogy melyik monitorból mennyi maradt a boltban.
//Vigyázz, hogy nulla darab alá ne mehessen a készlet.
//Ha az adott monitor éppen elfogyott, ajánlj neki egy másikat (lásd fent).
//10. Írd ki a képernyőre, hogy a vásárlások után
//van-e olyan monitor, amelyikből mindegyik elfogyott.
//11. Írd ki a gyártókat abc sorrendben a képernyőre. Oldd meg úgy is,
//hogy a metódus írja ki, és úgy is, hogy a főprogram.
//12. Csökkentsd a legdrágább monitor bruttó árát
//10%-kal, írd ki ezt az értéket a képernyőre.
//A feladatsor egy lehetséges megoldása:
namespace monitorAlapOOP
{
class Monitor
{
public string gyarto { get; set; }
public string tipus { get; set; }
public double meret { get; set; }
public double ar { get; set; }
public bool gamer { get; set; }
private double bruttoAr; //Ennél az adattagnál kidolgozzuk a propertyt.
public int darab;
public const double afa = 27;
public string gamerErteke(bool gmr)
{
if (gmr) return "játék gép";
else return "nem játék gép";
}
public double brutto
{
get { return bruttoAr; }
set
{
if (value > ar)
{
bruttoAr = value;
}
else
{
throw new Exception("HIBA! A bruttó érték nem nagyobb a nettónál!");
}
}
}
public Monitor(string sor) //ez a konstruktor
{
List<string> kezelo = sor.Split(';').ToList();
gyarto = kezelo[0];
tipus = kezelo[1];
meret = Convert.ToDouble(kezelo[2].Replace('.', ','));
ar = Convert.ToDouble(kezelo[3]);
if (kezelo.Contains("gamer")) //vagy: kezelo.Count == 5
{
gamer = true;
}
else
{
gamer = false;
}
brutto = Convert.ToDouble(kezelo[3]) * (afa / 100 + 1);
darab = 15;
//itt nem közvetlenül az adattagba írunk, hiszen a <brutto> propertyt használjuk itt,
//ami a rejtett bruttoAr adattagba ír
//ha itt rosszul számoljuk a bruttó árat, nem engedi beletenni az adattagba
//nyilván itt ugyanaz az ember írja mindkettőt, de megeshet, hogy ez nem így van
}
public override string ToString() //virtuális metódus
{
//így is jó:
//return "Gyártó: " + gyarto + "; | Típus: " + tipus + "; | Méret: " + meret + " col;" + " | Nettó ár: " + ar +" Ft\n";
return $"Gyártó: {gyarto}; | Típus: {tipus} | Méret: {meret} col; | Nettó ár: {ar} Ft\n";
}
public double ezer(double a)
{
return a / 1000;
}
public string kiir()
{
return $"Gyártó: {gyarto.ToUpper()};\nTípus: {tipus.ToUpper()} ;\nMéret: {meret} col;\nNettó ár (ezer ft): {ezer(ar):0}\nBruttó ár (ezer ft): {ezer(brutto):0}\nRaktárkészlet: {darab} darab\n{gamerErteke(gamer)}";
}
}
class Program
{
public static double atlag(List<Monitor> adatok, List<double> arLista)
{
for (int i = 0; i < adatok.Count; i++)
{
arLista.Add(adatok[i].ar);
}
return arLista.Average();
}
public static int ajanlo(List<Monitor> adatok, List<double> arLista, double atlag)
{
List<double> arakTavolsag = new List<double>();
for (int i = 0; i < adatok.Count; i++)
{
arakTavolsag.Add(arLista[i] - atlag);
}
double min = double.MaxValue;
int monitorIndex = 0;
for (int i = 0; i < arakTavolsag.Count; i++)
{
if (arakTavolsag[i] > 0)
{
if (arakTavolsag[i] < min)
{
min = arakTavolsag[i];
monitorIndex = i;
}
}
}
return monitorIndex;
}
public static string abcSorrend1(List<Monitor> adatok)
{
List<string> gyartok = new List<string>();
for (int i = 0; i < adatok.Count; i++)
{
gyartok.Add(adatok[i].gyarto);
}
gyartok.Sort();
return string.Join("\n", gyartok);
}
public static void abcSorrend2(List<Monitor> adatok)
{
Console.WriteLine("A gyártók abc sorrendben:");
List<string> gyartok = new List<string>();
for (int i = 0; i < adatok.Count; i++)
{
gyartok.Add(adatok[i].gyarto);
}
gyartok.Sort();
for (int i = 0; i < adatok.Count; i++)
{
Console.WriteLine(gyartok[i]);
}
}
static void Main(string[] args)
{
//1. Hozz létre egy osztályt a monitorok adatai számára. Olvasd be a fájl tartalmát. Oldd meg, hogy bármennyi monitort is tudj kezelni.
List<Monitor> monitorok = new List<Monitor>();
#region 1. Feladat: Beolvasás
Console.WriteLine("\n1. Feladat");
foreach (var item in File.ReadAllLines("monitor.txt").Skip(1))
{
monitorok.Add(new Monitor(item));
}
#endregion
//2. Tárold az osztálypéldányokban a bruttó árat is (ÁFA: 27%, konkrétan a 27-tel számolj.)
#region globális változók egy helyen
List<double> arak = new List<double>();
double atlagErtek = atlag(monitorok, arak);
int index;
bool log;
#endregion
#region 2. Feladat: Kiírás
Console.WriteLine("\n2. Feladat");
foreach (var i in monitorok)
{
Console.WriteLine(i);
}
#endregion
//3. Tételezzük fel, hogy mindegyik monitorból 15 db van készleten, ez a nyitókészlet. Mekkora a nyitó raktárkészlet bruttó (tehát áfával növelt) értéke?
//Írj egy metódust, ami meghívásakor kiszámolja a raktárkészlet aktuális bruttó értékét. A főprogram írja ki az értéket.
#region 3. feladat:raktárkészlet
Console.WriteLine("\n3. Feladat");
double osszeg = 0;
for (int i = 0; i < monitorok.Count; i++)
{
osszeg += monitorok[i].brutto * monitorok[i].darab;
}
Console.WriteLine($"A raktárkészlet összértéke {osszeg:0} Ft");
#endregion
//4. Írd ki egy új fájlba, és a képernyőre az 50.000 Ft feletti nettó értékű monitorok összes adatát (a darabszámmal együtt) úgy,
//hogy a szöveges adatok nagybetűsek legyenek, illetve az árak ezer forintba legyenek átszámítva.
//Az ezer forintba átszámítást egy külön függvényben valósítsd meg.
#region 4. Feladat: Mentés
Console.WriteLine("\n4. Feladat");
Console.WriteLine("Mentés...");
StreamWriter sw = new StreamWriter("out.txt");
string ki = string.Empty;
for (int i = 0; i < monitorok.Count; i++)
{
if (monitorok[i].ar < 50000)
{
ki = monitorok[i].kiir();
Console.WriteLine(ki);
sw.WriteLine(ki);
}
}
sw.Close();
Console.WriteLine("Mentve\n");
#endregion
#region 4. Feladat: Mentés másképp
Console.WriteLine("\n4. Feladat másképp");
Console.WriteLine("Mentés másképp...");
List<string> toFile = new List<string>();
for (int i = 0; i < monitorok.Count; i++)
{
if (monitorok[i].ar < 50000)
{
ki = monitorok[i].kiir();
toFile.Add(ki);
Console.WriteLine(ki);
}
}
File.WriteAllLines("out1.txt", toFile);
Console.WriteLine("Mentve\n");
#endregion
//5. Egy vevő keresi a HP EliteDisplay E242 monitort. Írd ki neki a képernyőre, hogy hány darab ilyen van a készleten.
//Ha nincs a készleten, ajánlj neki egy olyan monitort, aminek az ára az átlaghoz fölülről közelít. Ehhez használd az átlagszámító függvényt (később lesz feladat).
#region 5. Feladat: Átlag
Console.WriteLine("\n5. Feladat");
string kerMonitor = "HP EliteDisplay E242";
Console.WriteLine("\nAjánlás");
List<string> adatok = new List<string>();
index = 0;
for (int i = 0; i < monitorok.Count; i++)
{
adatok.Add(monitorok[i].gyarto + " " + monitorok[i].tipus);
}
if (adatok.Contains(kerMonitor))
{
Console.WriteLine($"{kerMonitor} monitorból {monitorok[adatok.IndexOf(kerMonitor)].darab} darab van készleten.");
}
else
{
index = ajanlo(monitorok, arak, atlagErtek);
Console.WriteLine($"{monitorok[index].gyarto} {monitorok[index].tipus} monitort ajánlom, ennek ára: {monitorok[index].ar} Ft");
}
#endregion
//6. Egy újabb vevőt csak az ár érdekli. Írd ki neki a legolcsóbb monitor méretét, és árát.
#region 6. Feladat: Legolcsóbb
Console.WriteLine("\n6. Feladat");
index = arak.IndexOf(arak.Min());
Console.WriteLine($"Legolcsóbb monitor {monitorok[index].ar} Ft; {monitorok[index].meret} col");
#endregion
//7. A cég akciót hirdet. A 70.000 Ft fölötti árú Samsung monitorok bruttó árából 5%-ot elenged.
//Írd ki, hogy mennyit veszítene a cég az akcióval, ha az összes akciós monitort eladná.
#region 7. Feladat: Akció
Console.WriteLine("\n7. Feladat");
List<double> hetvenPluszArak = new List<double>();
for (int i = 0; i < monitorok.Count; i++)
{
if (monitorok[i].ar >= 70000 && monitorok[i].gyarto == "Samsung")
{
hetvenPluszArak.Add((monitorok[i].ar * 0.05) * monitorok[i].darab);
}
}
Console.WriteLine($"A cég {hetvenPluszArak.Sum():0} Ft-ot veszítene");
#endregion
//8. Írd ki a képernyőre minden monitor esetén, hogy az adott monitor nettó ára a nettó átlag ár alatt van-e, vagy fölötte,
//esetleg pontosan egyenlő az átlag árral. Ezt is a főprogram írja ki.
#region 8. Feladat: Netto
Console.WriteLine("\n8. Feladat");
double atlagErteke = arak.Average();
for (int i = 0; i < monitorok.Count; i++)
{
Console.Write($"{monitorok[i].tipus} monitor ára az ");
if (monitorok[i].ar < atlagErteke)
{
Console.WriteLine("átlag alatt van.");
}
else
if (monitorok[i].ar > atlagErteke)
{
Console.WriteLine("átlag fölött van.");
}
else
{
Console.WriteLine("átlaggal egyenlő.");
}
}
#endregion
//9. Modellezzük, hogy megrohamozták a vevők a boltot. 5 és 15 közötti random számú vásárló 1 vagy 2 random módon kiválasztott monitort vásárol,
//ezzel csökkentve az eredeti készletet. Írd ki, hogy melyik monitorból mennyi maradt a boltban.
//Vigyázz, hogy nulla darab alá ne mehessen a készlet. Ha az adott monitor éppen elfogyott, ajánlj neki egy másikat (lásd fent).
#region 9. Feladat: Roham
Console.WriteLine("\n9. Feladat");
Random rnd = new Random();
int random1 = rnd.Next(5, 16); //Teszteld 100 vásárlóval, akkor biztos lesz olyan monitor, amelyik elfogy.
int random2;
int random3;
index = 0;
for (int i = 0; i < random1; i++)
{
random2 = rnd.Next(1, 3);
for (int j = 0; j < random2; j++)
{
random3 = rnd.Next(monitorok.Count);
if (monitorok[random3].darab > 0)
{
monitorok[random3].darab--;
Console.WriteLine($"{monitorok[random3].gyarto} {monitorok[random3].tipus} monitorból {monitorok[random3].darab} db maradt készleten.");
}
else
{
index = ajanlo(monitorok, arak, atlagErtek);
Console.WriteLine($"A keresett monitor elfogyott. Ajánlott monitor: {monitorok[index].gyarto} {monitorok[index].tipus}");
}
}
}
#endregion
//10. Írd ki a képernyőre, hogy a vásárlások után van-e olyan monitor, amelyikből mindegyik elfogyott.
#region 10. Feladat: Elfogyott
Console.WriteLine("\n10. Feladat");
log = false;
for (int i = 0; i < monitorok.Count; i++)
{
if (monitorok[i].darab == 0)
{
Console.WriteLine($"{monitorok[i].gyarto} {monitorok[i].tipus} monitor teljesen elfogyott.");
log = true;
}
}
if (!log)
{
Console.WriteLine("Minden monitorból van még készleten minimum 1 db.");
}
#endregion
//11. Írd ki a gyártókat abc sorrendben a képernyőre. Oldd meg úgy is, hogy a metódus írja ki, és úgy is, hogy a főprogram.
#region 11. Feladat: abc sorrend
Console.WriteLine("\n11. Feladat/1");
Console.WriteLine("A gyártók abc sorrendben:");
Console.WriteLine(abcSorrend1(monitorok));
Console.WriteLine("\n11. Feladat/2");
abcSorrend2(monitorok);
#endregion
//12. Csökkentsd a legdrágább monitor bruttó árát 10%-kal, írd ki ezt az értéket a képernyőre.
#region 12. Feladat: -10%
Console.WriteLine("\n12. Feladat");
index = Array.IndexOf(arak.ToArray(), arak.Max());
monitorok[index].brutto = monitorok[index].brutto - (monitorok[index].brutto * 0.1);
Console.WriteLine("Mostantól a legdrágább monitor {0:0} Ft", monitorok[index].brutto);
#endregion
Console.ReadLine();
}
}
}
Nincsenek megjegyzések:
Megjegyzés küldése
Megjegyzés: Megjegyzéseket csak a blog tagjai írhatnak a blogba.