Zadatak 8-Upravljanje porudžbinama u restoranu- rešenje zadatka:
U ovom zadatku ćemo kreirati jednostavnu konzolnu aplikaciju koja simulira upravljanje porudžbinama u restoranu. Aplikacija će omogućiti dodavanje, prikazivanje i sortiranje porudžbina, kao i izračunavanje cena jela sa popustima ili dodatnim troškovima, zavisno od načina plaćanja i dostave. Kroz ovaj zadatak ćemo naučiti kako da koristimo interfejse, obradimo izuzetke, implementiramo metode za sortiranje koristeći LINQ, i kako da primenimo indekse za pristupanje elementima liste.
Uputstvo za rešavanje zadatka
Uputstvo za rešavanje zadatka
Ovaj program predstavlja osnovni model upravljanja porudžbinama u restoranu. Implementacijom interfejsa i klase za rukovanje izuzecima, program omogućava upravljanje velikim brojem porudžbina uz mogućnost proširenja i dodatne funkcionalnosti po potrebi.
- Kreiranje novog projekta i osnovna implementacija:
- Otvorite Visual Studio i kreirajte novu Konzolnu aplikaciju pod nazivom "RestoranApp1".
- Kreirajte klasu Porudzbina koja će sadržati osnovne informacije o porudžbini kao što su ime gosta, jelo, način plaćanja, broj porudžbine, način dostave, i cena.
- Implementacija interfejsa IRestoran:
- Kreirajte interfejs IRestoran koji definiše tri metode:
- DodajPorudzbinu(Porudzbina p) za dodavanje porudžbine u listu sa proverom da li broj porudžbina prelazi dozvoljeni limit (10).
- CenaJela() za izračunavanje i prikaz cena jela uz odgovarajuće popuste ili dodatne troškove.
- PrikaziPorudzbine() za prikaz svih porudžbina.
- Kreirajte interfejs IRestoran koji definiše tri metode:
- Implementacija klase Restoran:
- Kreirajte klasu Restoran koja implementira interfejs IRestoran. Ova klasa će sadržati listu porudžbina i metode za dodavanje, prikaz, i sortiranje porudžbina.
- Dodajte metode za sortiranje porudžbina po imenu gosta i po jelu, prvo rastuće po imenu, a zatim opadajuće po jelu.
- Implementirajte i indekser kako bi se porudžbinama moglo pristupiti kao elementima niza.
- Glavna klasa:
- U glavnoj klasi Program kreirajte instancu klase Restoran i dodajte nekoliko porudžbina.
- Sortirajte porudžbine i prikažite ih na ekranu.
- Demonstrirajte rukovanje izuzecima kada broj porudžbina prelazi dozvoljeni limit.
- Koristite indekser za promenu porudžbine na određenom indeksu.
Ovaj program predstavlja osnovni model upravljanja porudžbinama u restoranu. Implementacijom interfejsa i klase za rukovanje izuzecima, program omogućava upravljanje velikim brojem porudžbina uz mogućnost proširenja i dodatne funkcionalnosti po potrebi.
Rešenje zadatka u C#
prvo ćemo kreirati klasu Porudzbina koja treba da se nalazi unutar fajla Porudzbina.cs:
Porudzbina.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RestoranApp
{
internal class Porudzbina
{
private string imePrezime;
private string jelo;
private string nacinPlacanja;
private int brojPorudzbine;
private bool dostavljaKurir;
private double cena;
public Porudzbina(string imePrezime, string jelo,string nacinPlacanja, int brojPorudzbine, bool dostavljaKurir, double cena)
{
this.imePrezime = imePrezime;
this.jelo = jelo;
this.nacinPlacanja = nacinPlacanja;
this.brojPorudzbine = brojPorudzbine;
this.DostavljaKurir= dostavljaKurir;
this.cena = cena;
}
public string ImePrezime
{
get { return imePrezime; }
set { imePrezime = value; }
}
public string NacinPlacanja {
get => nacinPlacanja;
set => nacinPlacanja = value;
}
public double Cena {
get => cena;
set=>cena = value;
}
public bool DostavljaKurir { get => dostavljaKurir; set => dostavljaKurir = value; }
public string Jelo { get => jelo; set => jelo = value; }
public string OdabranaDostava()
{
if (DostavljaKurir)
{
return "Dostavlja kurir";
}
else
{
return "U restoranu";
}
}
public override string? ToString()
{
return $" Ime i prezime: {ImePrezime}, Jelo: {Jelo}, nacin placanja: {NacinPlacanja}, Cena: {Cena}";
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RestoranApp
{
internal class Porudzbina
{
private string imePrezime;
private string jelo;
private string nacinPlacanja;
private int brojPorudzbine;
private bool dostavljaKurir;
private double cena;
public Porudzbina(string imePrezime, string jelo,string nacinPlacanja, int brojPorudzbine, bool dostavljaKurir, double cena)
{
this.imePrezime = imePrezime;
this.jelo = jelo;
this.nacinPlacanja = nacinPlacanja;
this.brojPorudzbine = brojPorudzbine;
this.DostavljaKurir= dostavljaKurir;
this.cena = cena;
}
public string ImePrezime
{
get { return imePrezime; }
set { imePrezime = value; }
}
public string NacinPlacanja {
get => nacinPlacanja;
set => nacinPlacanja = value;
}
public double Cena {
get => cena;
set=>cena = value;
}
public bool DostavljaKurir { get => dostavljaKurir; set => dostavljaKurir = value; }
public string Jelo { get => jelo; set => jelo = value; }
public string OdabranaDostava()
{
if (DostavljaKurir)
{
return "Dostavlja kurir";
}
else
{
return "U restoranu";
}
}
public override string? ToString()
{
return $" Ime i prezime: {ImePrezime}, Jelo: {Jelo}, nacin placanja: {NacinPlacanja}, Cena: {Cena}";
}
}
}
Objašnjenje: Ova klasa predstavlja jednu porudžbinu sa svim potrebnim atributima. Metoda OdabranaDostava() vraća tekstualni opis načina dostave, dok metoda ToString() prikazuje detalje porudžbine.
Interfejs: IRestoran.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RestoranApp
{
internal interface IRestoran
{
/*Metoda koja dodaje porudžbine u listu vodeći
računa da maksimalan broj porudžbina ne bude veći od 10*/
void DodajPorudzbinu(Porudzbina p);
/*Metoda koja ispisuje porudžbine*/
void PrikaziPorudzbine();
/*Metoda koja ispisuje cenu za pojedine porudžbine, kao i ukupnu cenu jela*/
void CenaJela();
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RestoranApp
{
internal interface IRestoran
{
/*Metoda koja dodaje porudžbine u listu vodeći
računa da maksimalan broj porudžbina ne bude veći od 10*/
void DodajPorudzbinu(Porudzbina p);
/*Metoda koja ispisuje porudžbine*/
void PrikaziPorudzbine();
/*Metoda koja ispisuje cenu za pojedine porudžbine, kao i ukupnu cenu jela*/
void CenaJela();
}
}
Ovaj interfejs definiše metode koje klasa Restoran mora implementirati, omogućavajući dodavanje, prikazivanje, i izračunavanje cena porudžbina.
Klasa za obradu izuzetka: IzuzetakRestoran.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RestoranApp
{
internal class IzuzetakRestoran : Exception
{
public IzuzetakRestoran(string? message) : base(message)
{
Console.WriteLine(message);
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RestoranApp
{
internal class IzuzetakRestoran : Exception
{
public IzuzetakRestoran(string? message) : base(message)
{
Console.WriteLine(message);
}
}
}
Nasleđivanje od Exception: Klasa IzuzetakRestoran nasleđuje klasu Exception, što znači da predstavlja prilagođeni tip izuzetka koji se može koristiti za specifične greške u aplikaciji. Nasleđivanje omogućava da se koriste sve funkcionalnosti standardnog izuzetka u .NET-u, kao što je hvatanje izuzetaka, prikazivanje poruka, itd.
Konstruktor sa parametrom message: Konstruktor klase IzuzetakRestoran prima string parametar message, koji predstavlja poruku o grešci. Ova poruka se prosleđuje bazičnoj klasi Exception pomoću base(message), čime se osigurava da se poruka pravilno postavi i može biti prikazana ili zabeležena.
Ispis poruke: Nakon što se izuzetak kreira, poruka se ispisuje na konzoli koristeći Console.WriteLine(message). Ovo omogućava korisnicima aplikacije da odmah vide informaciju o grešci.
Konstruktor sa parametrom message: Konstruktor klase IzuzetakRestoran prima string parametar message, koji predstavlja poruku o grešci. Ova poruka se prosleđuje bazičnoj klasi Exception pomoću base(message), čime se osigurava da se poruka pravilno postavi i može biti prikazana ili zabeležena.
Ispis poruke: Nakon što se izuzetak kreira, poruka se ispisuje na konzoli koristeći Console.WriteLine(message). Ovo omogućava korisnicima aplikacije da odmah vide informaciju o grešci.
Klasa koja obrađuje porudžbine: Restoran.cs
using RestoranApp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RestoranApp1
{
internal class Restoran : IRestoran
{
List<Porudzbina> porudzbine;
double ukupnaCena;
public Restoran()
{
porudzbine = new List<Porudzbina>();
}
public void CenaJela()
{
ukupnaCena = 0;
foreach (Porudzbina p in porudzbine)
{
double cena = 0;
if (p.NacinPlacanja == "Keš" && p.OdabranaDostava() == "U restoranu")
{
cena = 0.85 * p.Cena;
Console.WriteLine($"porudzbina:{p.ToString()}, cena: {cena}");
}
else if (p.NacinPlacanja == "Keš" && p.OdabranaDostava() == "Kurir")
{
cena = 0.85 * p.Cena + 500;
Console.WriteLine($"porudzbina:{p.ToString()}, cena: {cena}");
}
else if (p.NacinPlacanja == "Kartica" && p.OdabranaDostava() == "Kurir")
{
cena = p.Cena + 500;
Console.WriteLine($"porudzbina:{p.ToString()}, cena: {cena}");
}
else if (p.NacinPlacanja == "Kartica" && p.OdabranaDostava() == "U restoranu")
{
cena = p.Cena;
Console.WriteLine($"porudzbina:{p.ToString()}, cena: {cena}");
}
ukupnaCena += cena;
}
Console.WriteLine($"Ukupna cena porudžbina: {ukupnaCena}");
}
public void DodajPorudzbinu(Porudzbina p)
{
if (porudzbine.Count > 10)
{
throw new IzuzetakRestoran("Ne primamo vise od 10 porudzbina");
}
porudzbine.Add(p);//Dodaje novu porudzbinu
}
public void PrikaziPorudzbine()
{
foreach (Porudzbina p in porudzbine)
{
Console.WriteLine(p.ToString());
}
}
public void SortirajPoImenuIPoJelu()
{
var sortiranePorudzbine = porudzbine
.OrderBy(p => p.ImePrezime)
.ThenByDescending(p => p.Jelo)
.ToList();
Console.WriteLine("Porudzbine sortirane po imenu i po jelu (opadajuće):");
foreach (var porudzbina in sortiranePorudzbine)
{
Console.WriteLine($"{porudzbina.ImePrezime}: {porudzbina.Jelo}");
}
}
// Sortiranje prema imenu koristeći IComparer
public void IspisiSortirajPoImenu()
{
porudzbine.Sort(new PorudzbinaComparer());
foreach (var p in porudzbine)
{
Console.WriteLine(p);
}
}
// IComparer za sortiranje po imenu i prezimenu
public class PorudzbinaComparer : IComparer<Porudzbina>
{
public int Compare(Porudzbina x, Porudzbina y)
{
return string.Compare(x.ImePrezime, y.ImePrezime);
}
}
// Implementacija indeksera
public Porudzbina this[int index]
{
get { return porudzbine[index]; }
set { porudzbine[index] = value; }
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RestoranApp1
{
internal class Restoran : IRestoran
{
List<Porudzbina> porudzbine;
double ukupnaCena;
public Restoran()
{
porudzbine = new List<Porudzbina>();
}
public void CenaJela()
{
ukupnaCena = 0;
foreach (Porudzbina p in porudzbine)
{
double cena = 0;
if (p.NacinPlacanja == "Keš" && p.OdabranaDostava() == "U restoranu")
{
cena = 0.85 * p.Cena;
Console.WriteLine($"porudzbina:{p.ToString()}, cena: {cena}");
}
else if (p.NacinPlacanja == "Keš" && p.OdabranaDostava() == "Kurir")
{
cena = 0.85 * p.Cena + 500;
Console.WriteLine($"porudzbina:{p.ToString()}, cena: {cena}");
}
else if (p.NacinPlacanja == "Kartica" && p.OdabranaDostava() == "Kurir")
{
cena = p.Cena + 500;
Console.WriteLine($"porudzbina:{p.ToString()}, cena: {cena}");
}
else if (p.NacinPlacanja == "Kartica" && p.OdabranaDostava() == "U restoranu")
{
cena = p.Cena;
Console.WriteLine($"porudzbina:{p.ToString()}, cena: {cena}");
}
ukupnaCena += cena;
}
Console.WriteLine($"Ukupna cena porudžbina: {ukupnaCena}");
}
public void DodajPorudzbinu(Porudzbina p)
{
if (porudzbine.Count > 10)
{
throw new IzuzetakRestoran("Ne primamo vise od 10 porudzbina");
}
porudzbine.Add(p);//Dodaje novu porudzbinu
}
public void PrikaziPorudzbine()
{
foreach (Porudzbina p in porudzbine)
{
Console.WriteLine(p.ToString());
}
}
public void SortirajPoImenuIPoJelu()
{
var sortiranePorudzbine = porudzbine
.OrderBy(p => p.ImePrezime)
.ThenByDescending(p => p.Jelo)
.ToList();
Console.WriteLine("Porudzbine sortirane po imenu i po jelu (opadajuće):");
foreach (var porudzbina in sortiranePorudzbine)
{
Console.WriteLine($"{porudzbina.ImePrezime}: {porudzbina.Jelo}");
}
}
// Sortiranje prema imenu koristeći IComparer
public void IspisiSortirajPoImenu()
{
porudzbine.Sort(new PorudzbinaComparer());
foreach (var p in porudzbine)
{
Console.WriteLine(p);
}
}
// IComparer za sortiranje po imenu i prezimenu
public class PorudzbinaComparer : IComparer<Porudzbina>
{
public int Compare(Porudzbina x, Porudzbina y)
{
return string.Compare(x.ImePrezime, y.ImePrezime);
}
}
// Implementacija indeksera
public Porudzbina this[int index]
{
get { return porudzbine[index]; }
set { porudzbine[index] = value; }
}
}
}
Klasa Restoran implementira metode iz interfejsa IRestoran. Metode DodajPorudzbinu, PrikaziPorudzbine, i CenaJela omogućavaju osnovne operacije nad porudžbinama, dok SortirajPoImenuIPoJelu omogućava sortiranje liste porudžbina prema imenu i jelu.
- Lista porudžbina (List<Porudzbina>): Klasa Restoran koristi listu porudzbine za čuvanje svih porudžbina koje se dodaju u restoran. Ova lista omogućava dinamičko upravljanje porudžbinama (dodavanje, pretraga, sortiranje, itd.).
- Metoda DodajPorudzbinu(Porudzbina p): Ova metoda dodaje novu porudžbinu u listu porudzbine. Pre dodavanja, proverava se da li je broj porudžbina veći od 10, i u tom slučaju baca izuzetak IzuzetakRestoran. Time se obezbeđuje ograničenje na maksimalan broj porudžbina koje restoran može da primi.
- Metoda CenaJela(): Ova metoda izračunava i prikazuje cenu za svaku porudžbinu, uzimajući u obzir način plaćanja i dostave. Ukupna cena svih porudžbina se sabira i prikazuje na kraju. Različite cene se obračunavaju na osnovu specifičnih uslova (popust za keš, dodatak za dostavu).
- Metoda PrikaziPorudzbine(): Ova metoda prikazuje sve porudžbine u restoranu koristeći metodu ToString() definisanu u klasi Porudzbina. Na ovaj način korisnik može da vidi sve informacije o trenutnim porudžbinama.
- Sortiranje: Klasa Restoran omogućava sortiranje porudžbina po imenu gosta i jelu koristeći metodu SortirajPoImenuIPoJelu(). Takođe, postoji i metoda IspisiSortirajPoImenu() koja koristi prilagođeni IComparer za sortiranje po imenu gosta.
- Indekser: Implementacija indeksera (this[int index]) omogućava pristup pojedinačnim porudžbinama koristeći indekse, slično kao kod niza. To omogućava da se porudžbine dodaju ili menjaju na određenoj poziciji.
Glavna Klasa:Program.cs
using RestoranApp;
namespace RestoranApp1
{
internal class Program
{
static void Main(string[] args)
{
Restoran restoran = new Restoran();
try
{
restoran.DodajPorudzbinu(new Porudzbina("Marko Markovic", "Pizza", "Keš", 1, true, 500));
restoran.DodajPorudzbinu(new Porudzbina("Jovan Jovanovic", "Pasta", "Kartica", 2, false,800));
restoran.DodajPorudzbinu(new Porudzbina("Ana Anic", "Salata", "Keš", 3,true,1450));
restoran.DodajPorudzbinu(new Porudzbina("Ana Anic", "Burger", "Kartica",4, true, 1500));
restoran.SortirajPoImenuIPoJelu(); // Sortiranje po imenu i jelu
restoran.PrikaziPorudzbine();
Console.WriteLine("Sortirno po imenu kupca:");
restoran.IspisiSortirajPoImenu();
restoran.CenaJela();
restoran[1] = new Porudzbina("Petar Markovic", "Bečka šnicla", "Keš", 5, true, 1800);
Console.WriteLine(restoran[1]);
restoran[6] = new Porudzbina("Tamara Sedlar", "Karađorđeva šnicla", "Kartica",6, true,1900);
Console.WriteLine(restoran[6]);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
namespace RestoranApp1
{
internal class Program
{
static void Main(string[] args)
{
Restoran restoran = new Restoran();
try
{
restoran.DodajPorudzbinu(new Porudzbina("Marko Markovic", "Pizza", "Keš", 1, true, 500));
restoran.DodajPorudzbinu(new Porudzbina("Jovan Jovanovic", "Pasta", "Kartica", 2, false,800));
restoran.DodajPorudzbinu(new Porudzbina("Ana Anic", "Salata", "Keš", 3,true,1450));
restoran.DodajPorudzbinu(new Porudzbina("Ana Anic", "Burger", "Kartica",4, true, 1500));
restoran.SortirajPoImenuIPoJelu(); // Sortiranje po imenu i jelu
restoran.PrikaziPorudzbine();
Console.WriteLine("Sortirno po imenu kupca:");
restoran.IspisiSortirajPoImenu();
restoran.CenaJela();
restoran[1] = new Porudzbina("Petar Markovic", "Bečka šnicla", "Keš", 5, true, 1800);
Console.WriteLine(restoran[1]);
restoran[6] = new Porudzbina("Tamara Sedlar", "Karađorđeva šnicla", "Kartica",6, true,1900);
Console.WriteLine(restoran[6]);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
- Kreiranje objekta Restoran: Na početku programa, kreira se objekat klase Restoran koji će se koristiti za rad sa porudžbinama. Ovaj objekat omogućava dodavanje, prikaz, i obradu porudžbina.
- Dodavanje porudžbina: Koristeći metodu DodajPorudzbinu(), u restoran se dodaju različite porudžbine. Svaka porudžbina sadrži informacije o imenu kupca, naručenom jelu, načinu plaćanja, broju porudžbine, dostavi, i ceni.
- Sortiranje porudžbina: Nakon dodavanja porudžbina, koristi se metoda SortirajPoImenuIPoJelu() da bi se porudžbine sortirale prema imenu kupca i naručenom jelu. Sortiranje omogućava lakši pregled porudžbina i bolje organizovanje podataka.
- Prikazivanje porudžbina: Metoda PrikaziPorudzbine() koristi se za prikaz svih porudžbina u restoranu. Ovo omogućava da se sve informacije o porudžbinama prikažu korisniku.
- Sortiranje po imenu: Program takođe koristi metodu IspisiSortirajPoImenu() da sortira porudžbine prema imenu kupca. Ova metoda koristi prilagođeni komparator za sortiranje.
- Izračunavanje cena: Metoda CenaJela() izračunava ukupnu cenu svih porudžbina, uzimajući u obzir način plaćanja i dostavu. Rezultat se prikazuje korisniku, što omogućava pregled troškova.
- Izmena porudžbina: Koristeći indekser, program menja postojeće porudžbine na specifičnim pozicijama u listi. Ovo omogućava fleksibilnost u radu sa porudžbinama.
- Hvatanje izuzetaka: Program koristi try-catch blok da uhvati sve potencijalne izuzetke koji se mogu javiti tokom rada sa porudžbinama, kao što je prekoračenje maksimalnog broja porudžbina. Ako se dogodi izuzetak, njegova poruka se prikazuje korisniku.
Pokretanje programa
Posle pokretanja aplikacije videće se sledeći prozor konzolne aplikacije: