Commit ea5f48d9 by Szeberényi Imre

v0

parents
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="CppBolt" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/CppBolt" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
<Add option="-DMEMTRACE" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/CppBolt" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-pedantic" />
<Add option="-Wall" />
<Add option="-Werror" />
</Compiler>
<Unit filename="aru.h" />
<Unit filename="boltMain.cpp" />
<Unit filename="datum.cpp" />
<Unit filename="datum.h" />
<Unit filename="gtest_lite.h" />
<Unit filename="kassza.cpp" />
<Unit filename="kassza.h" />
<Unit filename="memtrace.cpp" />
<Unit filename="memtrace.h" />
<Unit filename="tej.h" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
<DoxyBlocks>
<comment_style block="0" line="0" />
<doxyfile_project />
<doxyfile_build />
<doxyfile_warnings />
<doxyfile_output />
<doxyfile_dot />
<general />
</DoxyBlocks>
</Extensions>
</Project>
</CodeBlocks_project_file>
#
#
# Makefile a CppBolt eloallitasahoz
# kihazsnalja, hogy gmake
#
PROG = boltMain
SRCS = boltMain.cpp datum.cpp kassza.cpp memtrace.cpp
HDRS = aru.h datum.h gtest_lite.h kassza.h memtrace.h tej.h
OBJS = $(SRCS:.cpp=.o)
CXXFLAGS = -ggdb -pedantic -Wall -Werror -DMEMTRACE
$(PROG): $(OBJS)
$(CXX) -o $(PROG) $(OBJS)
.PHONY:
clean:
rm -f $(OBJS) $(PROG)
# Egyszerusites: Minden .o fugg minden header-tol, es meg a Makefile-tol is
$(OBJS): $(HDRS) Makefile
Egy bolt **pénztárgépét** szeretnénk modellezni. A pénztáros megadja az eladott mennyiséget és az **árut**.
A gép nyilvántartást vezet az **eladásokról**. Nyilván kell tartani az eladás *dátumát*, eladott áru *mennyiségét*,
*értékét*, *egységárát*, és *minden jellemzőjét*. A nyilvántartásból lekérdezhető az összes eladás adata,
ami szűrhető egy adott napra is. Lekérdezhető továbbá egy adott nap árbevétele. OO tervezési mintát
követve meghatároztuk a
**szereplőket:**
- **Kassza** - a pénztárgép (tároló jellegű valami)
- **Tetel** - eladáskor keletkező pénztári bejegyzés (ez tárolja az eladás adatait)
- **Aru** - bolt által forgalmazott áruk
Miután számtalan áru (Aru) lehet, melynek a jellemzői előre nem ismertek, olyan megoldást
kell választani, ami könnyen bővíthető tetszőleges áruval. Heterogén kollekció alkalmazása mellett
döntöttünk. Ennek tipikus mintája, hogy a tárolóban valamilyen alaposztályra mutató pointert tárolunk
(ld. előadás eseménynapló). Ez viszont azt jelentené, hogy ebben az alaposztályban kellene tárolni
az eladás adatait, és ebből kellene származtatni az árukat. Az áruknak azonban semmi köze az eladási
adatokhoz, ezért zavaró lenne ebből származtatni azokat. A probléma feloldásához bevezettünk egy
közbenső osztályt (Tetel), amit a pénztárgépben (Kassza) tárolunk, és ez hivatkozik az áruk alaposztályára.
Elkészítettük a vázolt megoldás objektummodelljét:
![Osztálydiagram](https://git.ik.bme.hu/Prog2/ell_feladat/CppBolt/raw/master/cppbolt.png)
Ezt követően elkészítettük a modell C++ megvalósítását és egy egyszerű tesztprogramot (boltMain)
A DoxyGen program segítségével pedig legeneráltuk a megoldás
[dokumentációját is.](http://svn.iit.bme.hu/proga2/cporta_peldak/CppBolt/doxygen/html/index.html)
Nem minden osztályt és funkciót valósítottunk meg hiánytalanul. Ennek pótlása az Ön feladata.
**Feladatok:**
1. Töltse le az előkészített projektet a Git tárolóból! [https://git.ik.bme.hu/Prog2/ell_feladat/CppBolt](https://git.ik.bme.hu/Prog2/ell_feladat/CppBolt)
2. Adja hozzá a projekthez az 5. hét laborgyakorlatán kötelező feladatként elkészített *String* osztályt (*string5.h*, *string5.cpp*)!
3. Fordítsa le és futtassa a programot! Hibás működést fog tapasztalni, mert nincs minden funkció pontosan megvalósítva.
4. Módosítsa a **kassza.cpp** fájlt, hogy az *elad()* tagfüggvény dobjon kivételt, amikor a tároló megtelik.
5. Egészítse ki a *list(std::ostream&, const Datum&)*, valamint a *napiOsszeg(const Datum&)* függvényeket, hogy azok az elvárásoknak megfelelően működjenek!
6. Futtassa, tesztelje a programot.
7. Készítse el **Kifli** osztályt a *kifli.h* fájlban!
8. Definiálja projekt szinten a KIFLI\_IS\_VAN makrót, fordítson és futtasson.
9. Amennyiben a tesztek nem mutatnak hibát, töltse fel a *JPorta* feladatbeadó rendszerbe a **kifli.h** és a **kassza.cpp** fájlokat!
**Megjegzések:**
1. A feladat leírása hosszú, de a megoldás meglehetősen egyszerű.
2. A fenti osztálydiagramon helytakarékosság végett a *const* minősítőket nem jelöltük.
3. A DoxyGen programmal generált UML ábrák nem mindenben felelnek meg az UML jelölési rendszerének, illetve helyenként hiányosak.
\ No newline at end of file
#ifndef ARU_H
#define ARU_H
/**
* \file aru.h
*
* Aru osztály deklarációja és globális függvényei
*/
#include <iostream>
#include "string5.h"
/// Aru osztály.
///
class Aru {
protected:
String megnevezes; ///< áru megnevezése
String egyseg; ///< áru mennyiségi egysége (db, liter, kg, ...)
double ar; ///< áru egységára
public:
/// Konstruktor beállítja az attribútumokat
/// @param nev - áru megnevezése
/// @param egység - áru mennyiségi egysége szövegesen (db, liter, kg, ...)
/// @param ar - áru egységára
Aru(const char *nev, const char *egyseg, double ar)
:megnevezes(nev), egyseg(egyseg), ar(ar) {}
/// Megnevezés lekérdezése
/// @return - megnevezés
String getNev() const { return megnevezes; }
/// Mennyiségi egység lekérdezése
/// @return - mennyiségi egység
String getEgys() const { return egyseg; }
/// Egységár lekérdezése
/// @return - egységár
double getAr() const { return ar; }
/// Attribútumok kiírása egy stream-re
/// @param os - output stream referencia
/// @return output stream referencia
virtual std::ostream& print(std::ostream& os) const {
return os << megnevezes << ": " << ar << "/" << egyseg;
}
/// Virtuális destruktor
virtual ~Aru() {}
};
/// Globális inserter
/// @param os - output stream referencia
/// @param s - Aru referencia
/// @return output stream referencia
inline std::ostream& operator<<(std::ostream& os, const Aru& a) {
return a.print(os);
}
#endif // ARU_H
/**
* \file boltMain.cpp
* Tesztprogram a Kassza, Aru, Tej, Kifli osztályok teszteléséhez.
*
* \par Demonstrációs cél:
* 1. Heterogén kollekció demonstrálása.
* A Kassza osztályban tárolt tétel Aru POINTER-t tárol. Így minden
* áruból származó új áru tárolására alkalmas.
*
* 2. Az öröklés adta egyik lehetőség a bővíthetőség demonstrálása
*
*** FONTOS ***
* A MEMTRACE makrónak minden fordítási egységben definiált kell, hogy legyen!
* Ezt legkényelmesebben projekt szintű beállítással tudja elérni.
* (Projekt->Build options->#defines)
*
*/
#include <iostream>
#include <sstream>
#include "memtrace.h"
#include "gtest_lite.h"
#include "kassza.h"
#include "tej.h"
#ifdef KIFLI_IS_VAN
# include "kifli.h"
#endif
using std::cout;
using std::endl;
using std::cin;
int main() {
#ifdef KILI_IS_VAN
/// Az első két teszteset a Kifli objektum kiírási formátumát teszteli.
TEST(kifli, print1) {
Kifli tejeskifli(29, "tejes");
std::stringstream ss;
tejeskifli.print(ss); // stringstream az output, amit
EXPECT_STREQ("Kifli tejes; 29Ft/db", ss.str().c_str()); // C sztringgé konvertálunk és összehasonlítjuk
} ENDM
TEST(kifli, print2) {
Kifli sajtoskifli(72, "sajtos");
std::stringstream ss;
ss << sajtoskifli; // inserternek is mennie kell
EXPECT_STREQ("Kifli sajtos; 72Ft/db", ss.str().c_str());
} ENDM
#endif
/// Most felveszünk néhány árufajtát a boltba
const Tej tej15(1.5, 230);
const Tej tej15lm(1.5, 310, "laktozmentes");
const Tej tej28(2.8, 270);
#ifdef KIFLI_IS_VAN
const Kifli sajtoskifli(70, "sajtos");
const Kifli tejeskifli(29, "tejes");
#endif
#if 0
/// Kivétel dobásának ellenőrzése: Tudjuk, hogy a kasszába 20 tétel fér
TEST(Kassza, kivetel) {
Kassza p2;
for (int i = 0; i < 20; i++)
EXPECT_NO_THROW(p2.elad(3, tej28));
EXPECT_ANY_THROW(p2.elad(3, tej28));
} ENDM
#endif
/// Eladunk ezekből a p1 kasszánál
/// Az első két eladási mennyiséget a standard bemenetről olvassuk be
Kassza p1;
int ennyi_tejet;
cout << "Mennyi tej kell? ";
cin >> ennyi_tejet;
p1.elad(ennyi_tejet, tej15);
#ifdef KIFLI_IS_VAN
int ennyi_kiflit;
cout << "Mennyi kifli kell? ";
cin >> ennyi_kiflit;
p1.elad(ennyi_kiflit, sajtoskifli);
#endif
/// Itt pedig csalunk: előredátumozzuk az eladásokat
p1.elad(2, tej15, Datum(3000, 4, 1));
p1.elad(2, tej15lm, Datum(3000, 4, 1));
#ifdef KIFLI_IS_VAN
p1.elad(10, sajtoskifli, Datum(3000, 4, 1));
/// Kell még két kifli?
if (ennyi_kiflit % 2 == 1)
p1.elad(2, tejeskifli, Datum(3000, 4, 1));
#endif
p1.elad(3, tej28); /// még három liter tejet is eladunk ma
/// teljes litsta
cout << "\nOsszes eladas:" << endl;
p1.list(cout);
/// Eladások 3000. 4. 1-jén
cout << "\nEladasok (" << Datum(3000, 4,1 ) << "): " << endl;
p1.list(cout, Datum(3000, 4, 1));
/// Gyenge ellenőrzés: csak a sorok számát ellenőrizzük
TEST(Kassza, sorok_szama_3000_ben) {
std::stringstream ss;
p1.list(ss, Datum(3000, 4, 1)); // stringstrem-be listázunk
std::string s = ss.str(); // átalakítjuk std::string-gé
int cnt = std::count(s.begin(), s.end(), '\n'); // megszámoljuk benne a '\n' karaktereket
int elvart = 2; // tudjuk, hogy 2 tej
#ifdef KIFLI_IS_VAN
elvart += 1; // és 1 kifli
if (ennyi_kiflit % 2 == 1)
elvart +=1; // + 1, ha kellett még kifli
#endif
EXPECT_EQ(elvart, cnt) << "! ** Ketparameteres list: nem megfelelo szamu sort irt ki!" << endl;
} ENDM
/// Napi összeg
double sum = p1.napiOsszeg();
cout << "\nMai szumma: " << sum << "Ft" << endl;
/// megnézzük, hogy jól számolt-e
TEST(Kassza, mai_szumma) {
double s = 3 * tej28.getAr();
s += ennyi_tejet * tej15.getAr();
#ifdef KIFLI_IS_VAN
s += ennyi_kiflit * sajtoskifli.getAr(); // szerintunk ennyi
#endif
EXPECT_DOUBLE_EQ(s, sum) << "! ** napiOsszeg() nem jol mukodik!" << endl;
} ENDM
return 0;
}
cppbolt.png

29.5 KB

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="14.2">
<help_text>// Uncomment the following line to change the fontsize and font:
fontsize=12
// fontfamily=SansSerif //possible: SansSerif,Serif,Monospaced
//////////////////////////////////////////////////////////////////////////////////////////////
// Welcome to UMLet!
//
// Double-click on elements to add them to the diagram, or to copy them
// Edit elements by modifying the text in this panel
// Hold Ctrl to select multiple elements
// Use Ctrl+mouse to select via lasso
//
// Use +/- or Ctrl+mouse wheel to zoom
// Drag a whole relation at its central square icon
//
// Press Ctrl+C to copy the whole diagram to the system clipboard (then just paste it to, eg, Word)
// Edit the files in the "palettes" directory to create your own element palettes
//
// Select "Custom Elements &gt; New..." to create new element types
//////////////////////////////////////////////////////////////////////////////////////////////
// This text will be stored with each diagram; use it for notes.</help_text>
<zoom_level>12</zoom_level>
<element>
<id>UMLClass</id>
<coordinates>
<x>324</x>
<y>216</y>
<w>300</w>
<h>180</h>
</coordinates>
<panel_attributes>Aru
--
#megnevezes: String
#egyseg: String
#ar: double
--
+Aru(nev: char*, egyseg: char* ar: double)
+getNev(): String
+getEgys(): String
+print(os: ostream&amp;): ostream&amp; virtual
~Aru(): virtual </panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>540</x>
<y>444</y>
<w>228</w>
<h>96</h>
</coordinates>
<panel_attributes>Kifli
--
-spec: String
--
+Kifli(ar: double, spec: char* = "")
+print(os: ostream&amp;): ostream&amp;</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>528</x>
<y>384</y>
<w>144</w>
<h>84</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>10.0;10.0;100.0;50.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>648</x>
<y>12</y>
<w>300</w>
<h>132</h>
</coordinates>
<panel_attributes>Tetel
--
+mennyiseg: double
+aru: Aru*
+datum: Datum
--
+Tetel()
+Tetel(Mennyi: double, aru: Aru*, d: datum)
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>648</x>
<y>216</y>
<w>300</w>
<h>204</h>
</coordinates>
<panel_attributes>Kassza
--
-db: size_t
_-maxdb: size_t = 20_
-tetelek: Tetel[maxdb]
--
+Kassza()
+elad(mennyi: double, mit: Aru&amp;,
mikor: Datum&amp; = Datum()): void
+list(os: ostream&amp;): void
+list(os: ostream&amp;, mikor: Datum&amp;): void
+napiOsszeg(mikor: Datum&amp;): double</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>780</x>
<y>132</y>
<w>60</w>
<h>108</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;&lt;&lt;&lt;-
m2=0..20</panel_attributes>
<additional_attributes>10.0;70.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>588</x>
<y>72</y>
<w>84</w>
<h>168</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;&lt;&lt;&lt;-
m2=1</panel_attributes>
<additional_attributes>50.0;10.0;10.0;10.0;10.0;120.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>540</x>
<y>36</y>
<w>132</w>
<h>60</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;&lt;&lt;&lt;-
m2=1
</panel_attributes>
<additional_attributes>90.0;20.0;10.0;20.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>324</x>
<y>12</y>
<w>228</w>
<h>192</h>
</coordinates>
<panel_attributes>Datum
--
-ev: int
-ho: int
-nap: int
--
+Datum()
+Datum(ev: int, ho: int, nap: int)
+getEv(): int
+getHo(): int
+getNap(): int
+operator==(d: Datum&amp;): bool
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>288</x>
<y>444</y>
<w>228</w>
<h>132</h>
</coordinates>
<panel_attributes>Tej
--
-zsir: double
-spec: String
--
+Tej(zsir: double, ar: double,
spec: char* = "")
+print(os: ostream&amp;): ostream&amp;</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>372</x>
<y>384</y>
<w>120</w>
<h>84</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>80.0;10.0;10.0;50.0</additional_attributes>
</element>
</diagram>
/**
* \file datum.h
*
* Datum osztály tagfüggvényinek megvalósítása (definíciója)
*/
#include <iostream>
#include <sstream>
#include <ctime>
#include <iomanip>
#include "memtrace.h"
#include "datum.h"
using std::setw;
using std::setfill;
/// Paraméter nélkül hívható konstruktor.
/// Mai napot állítja be
Datum::Datum() {
time_t tim;
tim = time(NULL); // lekérdezzük a jelenlegi időt
struct tm *tp = localtime(&tim); // átalakítjuk
ev = tp->tm_year+1900;
ho = tp->tm_mon+1;
nap = tp->tm_mday;
}
/// Globális inserter eeee-hh-nn formában
/// @param os - output stream referencia
/// @param s - Datum referencia
/// @return output stream referencia
std::ostream& operator<<(std::ostream& os, const Datum& d) {
return os << setw(4) << d.getEv() << "-"
<< setw(2) << setfill('0') << d.getHo() << "-"
<< setw(2) << d.getNap();
}
#ifndef DATUM_H
#define DATUM_H
/**
* \file datum.h
*
* Datum osztály deklarációja és globális függvényei
*/
#include <iostream>
class Datum {
int ev; ///< év
int ho; ///< hónap
int nap; ///< nap
public:
/// Paraméter nélkül hívható konstruktor.
/// Mai napot állítja be
Datum();
/// Adott napot beállító konstruktor
/// @param ev - év
/// @param hó - hónap
/// @param nap - nap
Datum(int ev, int ho, int nap) :ev(ev), ho(ho), nap(nap) {}
/// Év lekérdezése
/// @return ev
int getEv() const { return ev;}
/// Hónap lekérdezése
/// @return honap
int getHo() const { return ho;}
/// Nap lekérdezése
/// @return nap
int getNap() const { return nap;}
/// Két dátum egyezőségét vizsgálja
/// @param d - jobb oldali operandus
/// @return true, ha egyezik a két dátum
bool operator==(const Datum& d) const {
return ev == d.ev && ho == d.ho && nap == d.nap;
}
};
/// Globális inserter
/// @param os - output stream referencia
/// @param s - Datum referencia
/// @return output stream referencia
std::ostream& operator<<(std::ostream& os, const Datum& d);
#endif // DATUM_H
This source diff could not be displayed because it is too large. You can view the blob instead.
warning: The selected output language "hungarian" has not been updated
since release 1.4.6. As a result some sentences may appear in English.
C:/Users/szebi/Desktop/ELOADAS_ELOADAS/PROGA/SVN_WORK/cporta_peldak/CppBolt/string5.h:4: warning: the name `string2_kesz.h' supplied as the second argument in the \file statement is not an input file
C:/Users/szebi/Desktop/ELOADAS_ELOADAS/PROGA/SVN_WORK/cporta_peldak/CppBolt/aru.h:22: warning: argument 'egység' of command @param is not found in the argument list of Aru::Aru(const char *nev, const char *egyseg, double ar)
C:/Users/szebi/Desktop/ELOADAS_ELOADAS/PROGA/SVN_WORK/cporta_peldak/CppBolt/aru.h:26: warning: The following parameters of Aru::Aru(const char *nev, const char *egyseg, double ar) are not documented:
parameter 'egyseg'
C:/Users/szebi/Desktop/ELOADAS_ELOADAS/PROGA/SVN_WORK/cporta_peldak/CppBolt/datum.h:21: warning: argument 'hó' of command @param is not found in the argument list of Datum::Datum(int ev, int ho, int nap)
C:/Users/szebi/Desktop/ELOADAS_ELOADAS/PROGA/SVN_WORK/cporta_peldak/CppBolt/datum.h:25: warning: The following parameters of Datum::Datum(int ev, int ho, int nap) are not documented:
parameter 'ho'
982e104e36f5b0f03305dec85be0fcab
\ No newline at end of file
3236a2143e09d8b5dc98461503e87902
\ No newline at end of file
0c96157182ff36a1640c67ace9504d6f
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed. Click to expand it.
/**
* \file kassza.cpp
*
* Kassza osztály tagfüggvényeinek megvalósítása (definíciója)
*/
#include <iostream>
#include <iomanip>
#include "memtrace.h"
#include "kassza.h"
using std::setw;
/// Eladás.
/// @param mennyi - eladott mennyiség
/// @param mit - referencia az eladott árura (Kompatibilitás kihasználása)
/// @param mikor - eladás dátuma
/// @return kivételt dob, ha nem fér be
void Kassza::elad(double mennyi, const Aru& mit, const Datum& mikor) {
tetelek[db++] = Tetel(mennyi, &mit, mikor);
}
/// Kassza tartalmának kilistázása
/// @param os - output stream
void Kassza::list(std::ostream& os) const {
for (size_t i = 0; i < db; i++) {
os << tetelek[i].datum << ": "
<< setw(4) << tetelek[i].mennyiseg * tetelek[i].aru->getAr() << "Ft" << " -- "
<< tetelek[i].mennyiseg << " "
<< tetelek[i].aru->getEgys() << " "
<< *tetelek[i].aru << std::endl;
}
}
/// Eladások listázása egy adott napon
/// @param os - output stream
/// @param mikor - melyik nap
void Kassza::list(std::ostream& os, const Datum& mikor) const {
}
/// Eladások összege egy adott napra
/// @param mikor - melyik nap
/// @return - összeg
double Kassza::napiOsszeg(const Datum& mikor) {
return 0;
}
#ifndef KASSZA_H
#define KASSZA_H
/**
* \file kassza.h
*
* Kassza osztály deklarációja és inline függvényei
*/
#include "aru.h"
#include "datum.h"
/// Tetel publikus osztály: Kassza ilyen tételeket tárol.
/// Kassza belső osztálya is lehetne, de talán így jobban olvasható
struct Tetel {
double mennyiseg; ///< eladott áru mennyisége
const Aru* aru; ///< eladott áru. POINTER az ős osztályra!
Datum datum; ///< eladás dátuma
Tetel() :mennyiseg(0), aru(NULL) {}
Tetel(double mennyi, const Aru* aru, const Datum& d
)
:mennyiseg(mennyi), aru(aru), datum(d) { }
};
/// Kassza osztály.
/// Fix darabszámú Tetel tárolására képes.
/// Ha betelik, const char* kivételt dob
class Kassza {
size_t db; ///< tarolt darabszám
static const size_t maxdb = 20; ///< méret
Tetel tetelek[maxdb]; /// taroló. Tetel-eket tárol
public:
/// Üres kassza
Kassza() :db(0) {}
/// Eladás.
/// @param mennyi - eladott mennyiség
/// @param mit - referencia az eladott árura (Kompatibilitás kihasználása)
/// @param mikor - eladás dátuma
/// @return kivételt dob, ha nem fér be
void elad(double mennyi, const Aru& mit, const Datum& mikor = Datum());
/// Kassza tartalmának kilistázása
/// @param os - output stream
void list(std::ostream& os) const;
/// Eladások listázása egy adott napon
/// @param os - output stream
/// @param mikor - melyik nap
void list(std::ostream& os, const Datum& mikor) const;
/// Eladások összege egy adott napra
/// @param mikor - melyik nap
/// @return - összeg
double napiOsszeg(const Datum& mikor = Datum());
};
#endif // KASSZA_H
This diff is collapsed. Click to expand it.
/*********************************
Memoriaszivargas-detektor
Keszitette: Peregi Tamas, BME IIT, 2011
petamas@iit.bme.hu
Kanari: Szeberenyi Imre, 2013.,
VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016.
inclue-ok: 2017., 2018. 2019.
*********************************/
#ifndef MEMTRACE_H
#define MEMTRACE_H
#if defined(MEMTRACE)
/*ha definiálva van, akkor a hibakat ebbe a fajlba írja, egyébkent stderr-re*/
/*#define MEMTRACE_ERRFILE MEMTRACE.ERR*/
/*ha definialva van, akkor futas kozben lancolt listat epit. Javasolt a hasznalata*/
#define MEMTRACE_TO_MEMORY
/*ha definialva van, akkor futas kozben fajlba irja a foglalasokat*/
/*ekkor nincs ellenorzes, csak naplozas*/
/*#define MEMTRACE_TO_FILE*/
/*ha definialva van, akkor a megallaskor automatikus riport keszul */
#define MEMTRACE_AUTO
/*ha definialva van, akkor malloc()/calloc()/realloc()/free() kovetve lesz*/
#define MEMTRACE_C
#ifdef MEMTRACE_C
/*ha definialva van, akkor free(NULL) nem okoz hibat*/
#define ALLOW_FREE_NULL
#endif
#ifdef __cplusplus
/*ha definialva van, akkor new/delete/new[]/delete[] kovetve lesz*/
#define MEMTRACE_CPP
#endif
#if defined(__cplusplus) && defined(MEMTRACE_TO_MEMORY)
/*ha definialva van, akkor atexit helyett objektumot hasznal*/
/*ajanlott bekapcsolni*/
#define USE_ATEXIT_OBJECT
#endif
/******************************************/
/* INNEN NE MODOSITSD */
/******************************************/
#ifdef NO_MEMTRACE_TO_FILE
#undef MEMTRACE_TO_FILE
#endif
#ifdef NO_MEMTRACE_TO_MEMORY
#undef MEMTRACE_TO_MEMORY
#endif
#ifndef MEMTRACE_AUTO
#undef USE_ATEXIT_OBJECT
#endif
#ifdef __cplusplus
#define START_NAMESPACE namespace memtrace {
#define END_NAMESPACE } /*namespace*/
#define TRACEC(func) memtrace::func
#include <new>
#else
#define START_NAMESPACE
#define END_NAMESPACE
#define TRACEC(func) func
#endif
// THROW deklaráció változatai
#if defined(_MSC_VER)
// VS rosszul kezeli az __cplusplus makrot
#if _MSC_VER < 1900
// * nem biztos, hogy jó így *
#define THROW_BADALLOC
#define THROW_NOTHING
#else
// C++11 vagy újabb
#define THROW_BADALLOC noexcept(false)
#define THROW_NOTHING noexcept
#endif
#else
#if __cplusplus < 201103L
// C++2003 vagy régebbi
#define THROW_BADALLOC throw (std::bad_alloc)
#define THROW_NOTHING throw ()
#else
// C++11 vagy újabb
#define THROW_BADALLOC noexcept(false)
#define THROW_NOTHING noexcept
#endif
#endif
START_NAMESPACE
int allocated_blocks();
END_NAMESPACE
#if defined(MEMTRACE_TO_MEMORY)
START_NAMESPACE
int mem_check(void);
END_NAMESPACE
#endif
#if defined(MEMTRACE_TO_MEMORY) && defined(USE_ATEXIT_OBJECT)
#include <cstdio>
START_NAMESPACE
class atexit_class {
private:
static int counter;
static int err;
public:
atexit_class() {
#if defined(CPORTA) && !defined(CPORTA_NOSETBUF)
if (counter == 0) {
setbuf(stdout, 0);
setbuf(stderr, 0);
}
#endif
counter++;
}
int check() {
if(--counter == 0)
err = mem_check();
return err;
}
~atexit_class() {
check();
}
};
static atexit_class atexit_obj;
END_NAMESPACE
#endif/*MEMTRACE_TO_MEMORY && USE_ATEXIT_OBJECT*/
/*Innentol csak a "normal" include eseten kell, kulonben osszezavarja a mukodest*/
#ifndef FROM_MEMTRACE_CPP
#include <stdlib.h>
#ifdef __cplusplus
#include <iostream>
/* ide gyűjtjük a nemtrace-vel összeakadó headereket, hogy előbb legyenek */
#include <fstream> // VS 2013 headerjében van deleted definició
#include <sstream>
#include <vector>
#include <list>
#include <map>
#include <algorithm>
#include <functional>
#endif
#ifdef MEMTRACE_CPP
namespace std {
typedef void (*new_handler)();
}
#endif
#ifdef MEMTRACE_C
START_NAMESPACE
#undef malloc
#define malloc(size) TRACEC(traced_malloc)(size,#size,__LINE__,__FILE__)
void * traced_malloc(size_t size, const char *size_txt, int line, const char * file);
#undef calloc
#define calloc(count,size) TRACEC(traced_calloc)(count, size, #count","#size,__LINE__,__FILE__)
void * traced_calloc(size_t count, size_t size, const char *size_txt, int line, const char * file);
#undef free
#define free(p) TRACEC(traced_free)(p, #p,__LINE__,__FILE__)
void traced_free(void * p, const char *size_txt, int line, const char * file);
#undef realloc
#define realloc(old,size) TRACEC(traced_realloc)(old,size,#size,__LINE__,__FILE__)
void * traced_realloc(void * old, size_t size, const char *size_txt, int line, const char * file);
void mem_dump(void const *mem, size_t size, FILE* fp);
END_NAMESPACE
#endif/*MEMTRACE_C*/
#ifdef MEMTRACE_CPP
START_NAMESPACE
#undef set_new_handler
#define set_new_handler(f) TRACEC(_set_new_handler)(f)
void _set_new_handler(std::new_handler h);
void set_delete_call(int line, const char * file);
END_NAMESPACE
void * operator new(size_t size, int line, const char * file) THROW_BADALLOC;
void * operator new[](size_t size, int line, const char * file) THROW_BADALLOC;
void * operator new(size_t size) THROW_BADALLOC;
void * operator new[](size_t size) THROW_BADALLOC;
void operator delete(void * p) THROW_NOTHING;
void operator delete[](void * p) THROW_NOTHING;
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void *p, int, const char *) THROW_NOTHING;
void operator delete[](void *p, int, const char *) THROW_NOTHING;
#define new new(__LINE__, __FILE__)
#define delete memtrace::set_delete_call(__LINE__, __FILE__),delete
#ifdef CPORTA
#define system(...) // system(__VA_ARGS__)
#endif
#endif /*MEMTRACE_CPP*/
#endif /*FROM_MEMTRACE_CPP*/
#endif /*MEMCHECK*/
#endif /*MEMTRACE_H*/
#ifndef TEJ_H
#define TEJ_H
/**
* \file tej.h
*
* Tej osztály deklarációja és inline függvényei
*/
#include "aru.h"
/// Tej osztály.
/// spec attribútuma a tej fajtája, és szírtartalma
class Tej :public Aru {
double zsir; ///< tej zsírtartalma %%)
String spec; ///< tej fajtája
public:
/// Konstruktor beállítja az attribútumokat (ősosztályét is)
/// @param zsir - tej zsírtartalma
/// @param ar - tej egységára
/// @param spec - tej fajtája
Tej(double zsir, double ar, const char *spec = "")
:Aru("Tej", "liter", ar), zsir(zsir), spec(spec) {}
/// Attribútumok kiírása egy stream-re
/// @param os - output stream referencia
/// @return output stream referencia
std::ostream& print(std::ostream& os) const {
return os << megnevezes << " "
<< zsir << "% " << spec << "; "
<< ar << "Ft/" << egyseg;
}
};
#endif // TEJ_H
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment