Commit d304951d by Szeberényi Imre

v0

parents
#
# Makefile
#
PROG = sharks
OBJ = main.o koord.o obj.o halak.o ocean.o observer.o
HEAD = koord.h obj.h halak.h ocean.h halor.h observer.h capafigyelo.h
CXXFLAGS = -g -Wall -pedantic
all: $(PROG)
sharks: $(OBJ)
$(CXX) $(CXXFLAGS) -o $(PROG) $(OBJ)
$(OBJ): $(HEAD)
clean:
rm -f $(PROG) $(OBJ)
tar:
tar -czf $(PROG).tgz $(SRC) $(HEAD) $(TEST) $(DATA)
doc:
doxygen Doxyfile
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="SharksAndFishes" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/SharksAndFishes" 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/SharksAndFishes" 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="-Wall" />
<Add option="-fexceptions" />
</Compiler>
<Unit filename="capafigyelo.h" />
<Unit filename="halak.cpp" />
<Unit filename="halak.h" />
<Unit filename="halor.h" />
<Unit filename="koord.cpp" />
<Unit filename="koord.h" />
<Unit filename="main.cpp" />
<Unit filename="memtrace.cpp" />
<Unit filename="memtrace.h" />
<Unit filename="obj.cpp" />
<Unit filename="obj.h" />
<Unit filename="observer.cpp" />
<Unit filename="observer.h" />
<Unit filename="ocean.cpp" />
<Unit filename="ocean.h" />
<Extensions>
<code_completion />
<envvars />
<debugger />
</Extensions>
</Project>
</CodeBlocks_project_file>
<?xml version="1.0" encoding="windows-1250"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
Name="SharksAndFishes"
ProjectGUID="{FABBC104-5CF2-4641-A112-F8291F620C50}"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/SharksAndFishes.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)/SharksAndFishes.pdb"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/SharksAndFishes.exe"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\halak.cpp"
>
</File>
<File
RelativePath=".\koord.cpp"
>
</File>
<File
RelativePath=".\main.cpp"
>
</File>
<File
RelativePath=".\obj.cpp"
>
</File>
<File
RelativePath=".\observer.cpp"
>
</File>
<File
RelativePath=".\ocean.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\capafigyelo.h"
>
</File>
<File
RelativePath=".\halak.h"
>
</File>
<File
RelativePath=".\halor.h"
>
</File>
<File
RelativePath=".\koord.h"
>
</File>
<File
RelativePath=".\obj.h"
>
</File>
<File
RelativePath=".\observer.h"
>
</File>
<File
RelativePath=".\ocean.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
#ifndef CAPAFIGYELO_H
#define CAPAFIGYELO_H
/**
* file: capafigyelo.h
*
* CapaFigyelo s FigyeltCapa osztlyok deklarcija
*
* A nagy inline fggvnyeket ILLENE kln definilni,
* de gy taln jobban megrthet a megolds.
*
*/
#include <list>
#include <stdexcept>
#include "halak.h"
#include "observer.h"
/// FigyeltCapa
class FigyeltCapa :public Capa, public Subject {
Koord lastPos;
public:
/// Pozci lekrdezse
Koord getpos() const { return lastPos; }
/// Viselkedst megvalst fggvny.
/// Minden lps eltt jelez
void lep(const Koord& pos, Ocean& oc, int it) {
lastPos = pos;
notify(1); // jelez a megfigyelnek
Capa::lep(pos, oc, it);
}
};
/// CapaFigyel
/// Az egyszersg kedvrt csak egy tnyleges megfigyelnk lesz, ami
/// minden feladatot ellt, de szt lehetne szedni tbb osztlyra a feladatokat.
class CapaFigyelo : public Observer {
int kor;
int ehes;
int szapor;
std::list<Koord> utvonal;
public:
CapaFigyelo(FigyeltCapa *fc) :Observer(fc), kor(0), ehes(0), szapor(0) {}
/// Kor kiolvassa
int getkor() const { return kor; }
/// Kor kiolvassa
int getehes() const { return ehes; }
/// Hnyszor szaporodott
int getszapor() const { return szapor; }
/// Update megvalstsa az Observer szmra
void update(Subject *subj, int oka) {
// Ha az oka == 0, akkor mr ppen nincs FigyeltCapa, ezrt nem krdezhetnk le tle semmit.
if (oka != 0) {
// Tudjuk, hogy ez egy figyelt cpra mutat pointer, ezrt
// tkonvertlhatjuk. A dynamic_cast radsul ellenrzi is.
FigyeltCapa *fc = dynamic_cast<FigyeltCapa*>(subj);
// Biztonsgbl ellenrizzk a cast eredmnyt
if (fc == 0) throw std::runtime_error("bad_cast: FigyeltCapa");
// sikerlt, kibnysszuk a szksges informcikat
kor = fc->getkor();
ehes = fc->getehes();
szapor = fc->getszapor();
utvonal.push_back(fc->getpos());
}
Observer::update(subj, oka);// Alaposztly update: megsznteti a regisztrcit, ha kell
}
/// Kiirja a letrolt utat
void ut(std::ostream& os) {
for (std::list<Koord>::iterator it = utvonal.begin(); it != utvonal.end(); it++)
os << "(" << it->i << "," << it->j << ") ";
}
};
#endif
/**
* file: halak.cpp
*
* Obj leszrmazottainak megvalstsa
*
*/
#include "halak.h"
#include "memtrace.h"
/// Hal viselkedse
void Hal::lep(const Koord& pos, Ocean& oc, int it) {
if (iter >= it) return;
iter = it;
kor++;
Koord ujPos = keres(pos, oc);
if (oc.ervenyes(ujPos)) {
oc.replObj(ujPos, this); // j cellba szik
Obj* o;
if (kor > halSzapKor)
o = new Hal(*this);
else
o = new Viz;
oc.setObj(pos, o);
}
}
/// Cpa viselkedse
void Capa::lep(const Koord& pos, Ocean& oc, int it) {
if (iter >= it) return; // mr lptetk
iter = it;
kor++; // regszik
if (nemEvett++ >= capaEhenhal) {
ittaveg = true; // hen halt
nev = 'd';
return;
}
Koord ujPos = keres(pos, oc);
if (oc.ervenyes(ujPos)) {
if (oc.getObj(ujPos)->getmeret() > 0)
nemEvett = 0; // fincsi volt a kaja
oc.replObj(ujPos, this); // j cellba uszik
Obj* o;
if (kor > capaSzapKor) {
szapor++;
o = new Capa(*this); // szaporodik
} else
o = new Viz;
oc.setObj(pos, o);
}
}
#ifndef HALAK_H
#define HALAK_H
/**
* file: halak.h
*
* Obj leszrmazottai
*
*/
#include "obj.h"
#include "halor.h"
const int halSzapKor = 1; // halak szaporodsi kora
const int capaSzapKor = 5; // cpk szaporodsi kora
const int capaEhenhal = 7; // cpa hallnak kora
class Ocean;
/// Vz
class Viz :public Obj {
public:
Viz() :Obj('.') {}
};
/// Part vagy sziget
class Part :public Obj {
public:
Part() :Obj('#', 10000) {}
};
/// Hal
class Hal :public Obj, private Halor {
int kor; // kora
public:
/// 0-ra lltja a kort
Hal() :Obj('H', 10), kor(0){}
/// Msol - a kor kivtelvel mindent lemsol
Hal(const Hal& h) :Obj(h), kor(0) {}
/// Viselkedst megvalst fggvny
/// @param pos - pozici
/// @param oc - cen
/// @param it - itercis lpsszm
void lep(const Koord& pos, Ocean& oc, int it);
};
/// Cpa
class Capa :public Obj {
int kor; /// kora
int nemEvett; /// ennyi ideje nem evett
int szapor; /// ennyiszer szaporodott
public:
/// 0-ra lltja a kort
Capa() :Obj('C', 100), kor(0), nemEvett(0), szapor(0) {}
/// Msol - a kor s a szapor kivtelvel mindent lemsol
Capa(const Capa& h) :Obj(h), kor(0), nemEvett(h.nemEvett), szapor(0) {}
/// Cpa kort visszaad fggvny
int getkor() const { return kor; }
/// Mennyire hes a cpa
int getehes() const { return nemEvett; }
/// Hnyszor szaporodott
int getszapor() const { return szapor; }
/// Viselkedst megvalst fggvny
/// @param pos - pozci
/// @param oc - cen
/// @param it - itercis lpsszm
void lep(const Koord& pos, Ocean& oc, int it);
};
#endif
/**
* \file halor.h
*
* Halor osztly deklarcija
*
*/
#ifndef HALOR_H
#define HALOR_H
/// Halr (halszmll) objketum.
class Halor {
static int darab; // darabszm nyilvntartsa.
public:
/// j pldny jn ltre, nvel
Halor() { darab++; }
/// Darabszm lekrdezse
/// @return - darab
static int getDarab() { return darab; }
/// Virtulis, hogy innen is megszntethet legyen
virtual ~Halor() { darab--; }
};
#endif
/**
* file: koord.cpp
*
* Koord segdobjektum megvalstsa
*
*/
#include "koord.h"
#include "memtrace.h"
/// Adott irnynak megfelelen lpve j pozcit ad
/// @param ir - irny
/// @return j pozci
Koord Koord::lep(Irany ir) const {
switch(ir) {
case fel:
return Koord(i-1,j);
break;
case le:
return Koord(i+1,j);
break;
case balra:
return Koord(i,j-1);
break;
case jobbra:
return Koord(i,j+1);
break;
}
return *this;
}
#ifndef KOORD_H
#define KOORD_H
/**
* file: koord.h
*
* Koord segdobjektum
*
*/
/// Cellarcs koordintinak kezelshez
/// Koord osztly minden rsze publikus.
struct Koord {
public:
enum Irany { fel, jobbra, le, balra }; /// tpus az eltolshoz
int i; /// sor
int j; /// oszlop
/// Konstruktor:
/// @param i - sor index
/// @param j - oszlop index
Koord(int i = 0, int j = 0) :i(i), j(j) {}
/// sszehasonlts
/// @param k - jobb oldali operandus
/// @return true - ha mindkt koordinta azonos
bool operator==(const Koord& k) const {
return i == k.i && j == k.j;
}
/// Adott irnynak megfelen lpve j pozicit ad
/// @param ir - irny
/// @return j pozci
Koord lep(Irany ir) const;
};
#endif
/**
* file: main.cpp
*
* Program az cenmodell tesztelshez.
*
*/
#include <iostream>
#include <stdexcept>
#include <algorithm>
#include <functional>
#include <vector>
#include "memtrace.h"
#include "ocean.h"
#include "halor.h"
#include "capafigyelo.h"
using std::cout;
using std::cerr;
using std::endl;
/// Halneveket sszehasonlt fv. objektum
struct HalnevCmp {
char refnev; // referencia nv
/// Konstruktor letrolja a referencia karaktart
/// @param nev - referencianv
HalnevCmp(char nev) :refnev(nev) {}
/// Referencia sszehasonltsa
/// @param o - Obj objektum
/// @return - true, ha az objektum neve megegyezik a referencianvvel
bool operator()(const Obj* o) const {
return o->getnev() == refnev;
}
};
/// Halr statikus tag definci
int Halor::darab = 0;
int main() {
try {
Ocean atlanti;
FigyeltCapa *capeti = new FigyeltCapa;
atlanti.replObj(Koord(2,5), capeti);
atlanti.replObj(Koord(0,0), new Hal);
atlanti.replObj(Koord(5,10), new Hal);
atlanti.replObj(Koord(MaxN-1,MaxM-1), new Hal);
CapaFigyelo mester(capeti);
CapaFigyelo filmes(capeti);
CapaFigyelo biologus(capeti);
for (int i = 0; i < 54; i++) {
cout << endl << i+1 << ". iteracio elott. Allatok szama:" << Halor::getDarab();
// Halak szma
cout << " (Hal:" << (int)count_if(atlanti.begin(), atlanti.end(), HalnevCmp('H'));
// Cpk szma
cout << ", Capa:" << (int)count_if(atlanti.begin(), atlanti.end(),
HalnevCmp('C')) << ")" << endl;
cout << "Capeti ehes:" << biologus.getehes() << endl;
atlanti.rajzol(cout);
atlanti.lep();
}
cout << "Capeti kora:" << mester.getkor() << endl;
cout << "Capeti utodai:" << biologus.getszapor() << endl;
cout << "Capeti utja:";
filmes.ut(cout);
cout << endl;
} catch (std::exception &e) {
cerr << "Nem vart kivtel: " << e.what() << endl;
} // minden objektum megsznik
}
/*
* file: memcheck.h
* A memriaszivrgs detektl funkcikhoz szksges definicik
* Ezt a rszt nem fontos megrtenie
*/
#if defined(TRACE) // Ha Peregi-fle trace van
# define _CrtDumpMemoryLeaks()
# define _StartMemoryCheck()
#elif defined(_MSC_VER) // Ha Visual Studio
# define _CRTDBG_MAP_ALLOC
# include <stdlib.h>
# include <crtdbg.h>
# define _StartMemoryCheck()
#elif defined(__GNUC__) // Ha GNU C
# include <malloc.h>
namespace _memcheck {
static int uordblks; // ebben taroljuk az indulaskor lefoglalt blokkok szamat
}
# if defined(__MINGW32_VERSION)
# define _CrtDumpMemoryLeaks()
# define _StartMemoryCheck()
# elif __GLIBC__ >= 2
# include <mcheck.h>
# define _StartMemoryCheck() mcheck_pedantic(NULL); mtrace(); _memcheck::uordblks = mallinfo().uordblks;
# define _CrtDumpMemoryLeaks() mcheck_check_all(); \
if (_memcheck::uordblks != mallinfo().uordblks) fprintf(stderr, "Memory leaks!\n");
# else
# define _StartMemoryCheck()
# define _CrtDumpMemoryLeaks() { struct mallinfo m = mallinfo(); \
if (m.uordblks > 48 || m.usmblks) fprintf(stderr, "Memory leaks! %d %d\n", m.uordblks, m.usmblks); }
# endif
#else // nem tudjuk milyen fordt, nem csinlunk semmit0
# define _CrtDumpMemoryLeaks()
# define _StartMemoryCheck()
#endif
/*********************************
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*/
/**
* file: obj.cpp
*
* Obj objektum s leszrmazottainak megvalstsa
*
*/
#include "obj.h"
#include "memtrace.h"
/// Kisebb/nagyobb hal vagy vz keresse. Elszr halat keres.
/// @param pos - kezd pozci
/// @param oc - ocean
/// @param kisebb - true: kisebbet, false: nagyobbat keres
/// @return - megtallt pozcio - ha nincs, rvnytelen
Koord Obj::keres(const Koord& pos, Ocean& oc, bool kisebb) const {
const Koord noPos(-1,-1); // nem ltez pozci
Koord talalt = noPos; // nem tallt semmit
for (int i = 0; i < 4; i++) { // kihasznljuk az enum tulajdonsgt
Koord ujPos = pos.lep(Koord::Irany(i));
if (oc.ervenyes(ujPos)) {
int m = oc.getObj(ujPos)->getmeret();
if (m == 0) {
if (talalt == noPos) talalt = ujPos; // megjegyzi a vz helyt
} else if ((kisebb && m < meret) || (!kisebb && m > meret)) {
return ujPos;
}
}
}
return talalt;
}
#ifndef OBJ_H
#define OBJ_H
/**
* file: obj.h
*
* Obj Alapobjektum.
*
*/
#include "koord.h"
#include "ocean.h"
class Ocean; /// Eldeklarci. A krkrs include miatt kell
/// s objektum.
class Obj {
protected:
char nev; /// Objektum neve
int meret; /// nagyobb megeszi a kisebbet
int iter; /// Iterci szmllja
bool ittaveg; /// megsznst jelz flag
public:
/// Kontruktor:
/// @param nev - nv 1 char
/// @param meret - hal mrete (ereje)
Obj(char nev, int meret = 0)
:nev(nev), meret(meret), iter(0), ittaveg(false) {}
/// Nv lekrdezse
/// @return - nev
char getnev() const { return nev; }
/// Mret lekrdezse
/// @return - meret
char getmeret() const { return meret; }
/// ittaveg flag - ha az objektumot meg kell semmisteni
/// @return - ittaveg
bool is_vege() const { return ittaveg; }
/// Kisebb/nagyobb hal vagy vz keresse. Elszr halat keres.
/// @param pos - kezd pozci
/// @param oc - ocean
/// @param kisebb - true: kisebbet, false: nagyobbat keres
/// @return - megtallt pozci - ha nincs, rvnytelen
Koord keres(const Koord& pos, Ocean& oc, bool kisebb = true) const;
/// Viselkedst megvalst fggvny
/// Nem absztrakt, hogy ne kelljen megvalstani mindentt
/// @param pos - pozici
/// @param oc - cen
/// @param it - itercis lpsszm
virtual void lep(const Koord& pos, Ocean& oc, int it) {}
/// Destruktor:
/// Virtulis, hogy a leszrmazottaknak is meghvdjon
virtual ~Obj() {}
};
#endif
/**
* file: observer.cpp
*
* Observer osztly definicii
*
* Fontos:
* Amikor a megfigyelt osztly megsznik, a Subject osztly
* destruktora notyfy(0) zenetet kld. Ez az egyetlen zenet, amit
* a megolds fenntart bels adminisztrcis clokra.
* Ekkor a Subject-bl szrmaztatott pldny adatai mr nem lteznek,
* teht nem krdezheti le azokat a megfigyel.
*
*/
#include <set>
#include "observer.h"
#include "memtrace.h"
/// Observer bejelentkezik
/// @param os - rdekld observer
void Subject::attach(Observer *o) {
obs.insert(o);
}
/// Observer kijelentkezik
/// @param os - observer, aki mr nem kvncsi tovbb
void Subject::detach(Observer *o) {
obs.erase(obs.find(o));
}
/// Megfigyelend pldny llapota vltozott
/// @param reason - mi vltotta ki a vltozst (0- megsznt a pldny)
void Subject::notify(int reason) {
for (std::set<Observer*>::iterator it = obs.begin(); it != obs.end(); it++ )
(*it)->update(this, reason); // mindenkinek zen
}
/// Megsznik a megfigyelend
Subject::~Subject() {
notify(0); // jelzi, hogy megsznt
}
/// Konstruktor regisztrl (attach)
Observer::Observer(Subject *subj) :subj(subj){
subj->attach(this);
}
/// Megfigyelt pldny vltozott
/// @param subj - megfigyelt pldny pointere
/// @param reason - mi vltotta ki a vltozs
/// 0: megsznt, a tbbi kd szabad
void Observer::update(Subject* subj, int reason) {
if (reason == 0)
this->subj = 0; // megsznt! Nem tudjuk tovbb figyelni
}
/// Destruktor kiregisztrl (detach)
Observer::~Observer() {
if (subj != 0) // van mg kit figyelni ?
subj->detach(this);
}
#ifndef OBSERVER_H
#define OBSERVER_H
/**
* file: observer.h
*
* Observer osztly deklarcii
*
* Egy-sok kapcsolat pl fel Subject s az Observer
* osztly pldnyai kztt.
*
*/
#include <set>
class Observer; // eldeklarci
/// Subject (megfigyelend) osztly se
class Subject {
std::set<Observer*> obs; // Megfigyelk halmaza
public:
/// Observer bejelentkezik
/// @param os - rdekld observer
void attach(Observer* os);
/// Observer kijelentkezik
/// @param os - observer, aki mr nem kvncsi tovbb
void detach(Observer* os);
/// Megfigyelend pldny llapota vltozott
/// @param reason - mi vltotta ki a vltozst
/// 0: megsznt, a tbbi kd szabad
void notify(int reason);
/// Megsznik a megfigyelend
virtual ~Subject(); // Virtulis, hogy az alaposztly fell is mkdjn
};
/// Observer (megfigyel) osztly se
class Observer {
Subject *subj; // megfigyelt objektum cme
public:
/// konstruktor regisztrl (attach)
/// @param subj - megfigyelt pldny pointere
Observer(Subject* subj);
/// Megfigyelt pldny vltozott
/// @param subj - megfigyelt pldny pointere
/// @param reason - mi vltotta ki a vltozst
/// 0: megsznt, a tbbi kd szabad
virtual void update(Subject* subj, int reason);
/// destruktor kiregisztrl (detach)
virtual ~Observer();
};
#endif
/**
* file: ocean.cpp
*
* Ocean objektum megvalostsa.
*
*/
#include <stdexcept>
#include "ocean.h"
#include "halak.h"
#include "memtrace.h"
/// Minden cellt vzzel "tlt fel"
Ocean::Ocean() :iter(0) {
for (int i = 0; i < MaxN; i++)
for (int j = 0; j < MaxM; j++)
cellak[i][j] = new Viz;
}
/// Megszntet minden trolt objektumot
Ocean::~Ocean() {
for (int i = 0; i < MaxN; i++)
for (int j = 0; j < MaxM; j++)
delete cellak[i][j];
}
/// Cellban trolt pointer lekrdezse.
/// @param pos - cellapozici
/// @return objektum pointere
Obj* Ocean::getObj(Koord pos) const {
return cellak[pos.i][pos.j];
}
/// Cellban trolt pointer bersa.
/// @param pos - cellapozici
/// @param o - j objektum pointere
void Ocean::setObj(Koord pos, Obj* o) {
cellak[pos.i][pos.j] = o;
}
/// Cellban trolt pointer kicsrlse.
/// A rgi objektum felszabadul
/// @param pos - cellapozici
/// @param o - j objektum pointere
void Ocean::replObj(Koord pos, Obj* o) {
delete cellak[pos.i][pos.j];
cellak[pos.i][pos.j] = o;
}
/// Cellarcsok "kirajzolsa"
/// @param os - output steram
void Ocean::rajzol(std::ostream& os) const {
os << iter << "." << std::endl;
for (int i = 0; i < MaxN; i++) {
for (int j = 0; j < MaxM; j++)
os << cellak[i][j]->getnev();
os << std::endl;
}
}
/// Egy itercis lps
void Ocean::lep() {
iter++;
for (int i = 0; i < MaxN; i++)
for (int j = 0; j < MaxM; j++) {
Koord pos(i,j);
cellak[i][j]->lep(pos, *this, iter);
if (cellak[i][j]->is_vege())
replObj(pos, new Viz);
}
}
/// Ocean Iterator Pre inkremens
Ocean::Iterator& Ocean::Iterator::operator++() {
if (p == 0 || p == pe)
throw std::out_of_range("Iterator++");
p++;
return *this;
}
/// Ocean Iterator Post inkremens
Ocean::Iterator Ocean::Iterator::operator++(int) {
Iterator tmp = *this;
if (p == 0 || p == pe)
throw std::out_of_range("Iterator++");
p++;
return tmp;
}
/// Ocean Iterator Csillag
Obj* Ocean::Iterator::operator*() {
if (p == 0 || p == pe)
throw std::out_of_range("Iterator*");
return *p;
}
/// Ocean Iterator Nyil operator
Obj** Ocean::Iterator::operator->() {
if (p == 0 || p == pe)
throw std::out_of_range("Iterator->");
return p;
}
#ifndef OCEAN_H
#define OCEAN_H
/**
* file: ocean.h
*
* Ocean objektum deklarcija
*
*/
#include <iostream>
#include "obj.h"
/// cen mrete.
const int MaxN = 10;
const int MaxM = 40;
class Obj; // Eldeklarci. (A krkrs include miatt kell.)
/// Ocean objektum.
/// Statikus mret cellarcsot tartalmaz.
/// Minden cella egy objektum mutatjt trolja.
class Ocean {
int iter; /// Iterci szmllja
Obj *cellak[MaxN][MaxM]; /// Cellk trolja
public:
class Iterator; // eldeklarci
/// Deafult konstruktor
Ocean();
/// Eldnti egy pozicirl, hogy az rvnyes ocen pozici-e
/// @return - true, ha rvnyes
bool ervenyes(const Koord& k) const {
return k.i >= 0 && k.i < MaxN && k.j >= 0 && k.j < MaxM;
}
/// Cellban trolt pointer lekrdezse.
/// @param pos - cellapozci
/// @return objektum pointere
Obj* getObj(Koord pos) const;
/// Cellban trolt pointer bersa.
/// @param pos - cellapozci
/// @param o - j objektum pointere
void setObj(Koord pos, Obj* o);
/// Cellban trolt pointer kicserlse.
/// A rgi objektum felszabadul
/// @param pos - cellapozci
/// @param o - j objektum pointere
void replObj(Koord pos, Obj* o);
/// Cellarcsok "kirajzolsa"
/// @param os - output stream
void rajzol(std::ostream& os) const;
/// Egy itercis lps
void lep();
/// Kezdrtk
Iterator begin() { return Iterator(*this); }
/// Vgrtk
Iterator end() { return Iterator(*this, MaxN*MaxM); }
/// cen itertora
/// Az std::iterator osztlybl szrmaztatjuk, hogy hasznlhat legyen az algoritmusokban.
/// Az std::itarator valjban csak tpusokat definil, amit az algoritmusokat megvalst
/// sablonok hasznlnak.
class Iterator :public std::iterator<std::input_iterator_tag, Obj> {
Obj **p; // aktulis pointer
Obj **pe; // vgpointer
public:
/// Inicializlatlan itertor
Iterator() :p(0), pe(0) {}
/// Konstruktor a begin-hez s az end-hez
/// @param o - ocen
/// @param n - akt. index
Iterator(Ocean& o, int n = 0)
:p(&o.cellak[0][0]+n), pe(&o.cellak[0][0]+MaxN*MaxM) {}
/// !=
bool operator!=(Iterator& it) {
return p != it.p;
}
/// ==
bool operator==(Iterator& it) {
return p == it.p;
}
/// Pre inkremens
Iterator& operator++();
/// Post inkremens
Iterator operator++(int);
/// Csillag
Obj* operator*();
/// Nyil opertor
Obj** operator->();
};
~Ocean();
};
#endif
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iterator>
using std::vector;
using std::string;
using std::map;
using std::ostream_iterator;
using std::cin;
using std::cout;
using std::endl;
/*
* A standard inputról beolvasott szövegbõl kigyûjtjük a
* szavakat, és kiírjuk az elõfordulási statisztikájukat.
* Szó: whitespace-szel határolt karaktersorozat.
* Ha a szó tartalmaz szájegyet, akkor azt elhagyjuk belõle
* Kovacs12Janos -> KovacsJanos
*/
bool isDigit(char ch) { return isdigit(ch) != 0; }
int main() {
map<string, int> szamlalo; // itt tároljuk a statisztikát
string szo; // munkaváltozó a beolvasáshoz
while (cin >> szo) { // olvasunk whitespace-ig
// a számjegyekre haragszunk, ezért eldobjuk azokat
string::iterator vege =
remove_if(szo.begin(), szo.end(), isDigit);
szo.erase(vege, szo.end());
// ha maradt valami számolunk
if (!szo.empty())
szamlalo[szo] += 1;
}
// Kiírjuk a szavakat és az elõfordulási számot.
// Betesszük egy vektorba a szavakat. (A map miatt rendezett)
vector<string> szavak;
cout << "Szavak gyakorisaga:" << endl;
for (map<string, int>::iterator it = szamlalo.begin();
it != szamlalo.end(); it++) {
cout << it->first << ": " << it->second << endl;
szavak.push_back(it->first);
}
// Kiírjuk a szavakat a vektorból.
cout << "Szavak rendezve:" << endl;
ostream_iterator<string> out_it(cout, ",");
copy(szavak.begin(), szavak.end(), out_it);
// És fordítva is lerendezzük.
sort(szavak.begin(), szavak.end(), std::greater<string>());
cout << endl << "Szavak forditva:" << endl;
copy(szavak.begin(), szavak.end(), out_it);
}
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="szostatisztika" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/szostatisztika" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/szostatisztika" 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="-Wall" />
<Add option="-fexceptions" />
</Compiler>
<Unit filename="szavak.cpp" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
<?xml version="1.0" encoding="windows-1250"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="szostatisztika"
ProjectGUID="{7C0DE68A-0ED8-4798-932C-A41F3CF4EBD9}"
RootNamespace="szostatisztika"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\szavak.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="szoszamlalo" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/szoszamlalo" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/szoszamlalo" 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="-Wall" />
<Add option="-fexceptions" />
</Compiler>
<Unit filename="szoszamlalo.cpp" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
#include <iostream>
#include <string>
#include <sstream>
#include <map>
using std::string;
using std::map;
using std::cin;
using std::cout;
using std::endl;
int main() {
map<string, int> szamlalo;
string szo;
std::stringstream st;
st << "Alma Alma unom unom c++";
while (st >> szo)
szamlalo[szo] += 1;
map<string, int>::iterator it;
for (it = szamlalo.begin(); it != szamlalo.end(); ++it) {
cout << it->first << ":" << it->second << endl;
}
}
// #include <fstream>
// std::fstream inf("szoszamlalo.cpp");
/**
* \file gen_array_adapter.hpp
*
* Generikus tömb std::vector-ból
* Előadáson bemutatott kód módosított változata.
*/
#ifndef GEN_ARRAY_ADAPTER
#define GEN_ARRAY_ADAPTER
#include <vector>
#include <stdexcept>
/**
* Fix méretű generikus tömb.
* @param T - tárolt adattípus
* @param maxsiz - maximális méret
*/
template <typename T, size_t maxsiz = 6>
class Array : public std::vector<T> {
T& operator[](size_t i);
const T& operator[](size_t i) const;
public:
Array(size_t n = 0, const T& value = T())
:std::vector<T>::vector(std::min(n,maxsiz), value) {
std::vector<T>::reserve(maxsiz);
}
template <class Iter>
Array(Iter first, Iter last)
:std::vector<T>::vector(first, last) {
if (std::vector<T>::size() > maxsiz)
std::vector<T>::resize(maxsiz);
else
std::vector<T>::reserve(maxsiz);
}
T& at(size_t i) {
if (i < maxsiz && i >= std::vector<T>::size())
std::vector<T>::resize(i+1);
return std::vector<T>::at(i);
}
const T& at(size_t i) const {
return std::vector<T>::at(i);
}
}; // generikus tömb vége
#endif
/*
* \file integer.h
*/
#ifndef INTEGER_H
#define INTEGER_H
/// Integer osztály.
/// A konverziós operátorok és a C automatikus konverziós szabályai
/// miatt úgy használható mint egy int.
class Integer {
int adat;
public:
Integer(int i = 0) :adat(i) {} /// konstruktor és egyben konverziós operátor
operator int&() { return adat; }/// cast
operator int() const { return adat; } /// const cast
};
#endif // INTEGER_H
#ifndef ISCLASS_HPP
#define ISCLASS_HPP
template <class T>
struct IsClass {
template<class X> static char Test(int X::*);
template<class X> static long Test(...);
enum { Yes = sizeof(Test<T>(0)) == 1 };
enum { No = !Yes };
};
#endif // ISCLASS_HPP
#ifndef SABLONOK_HPP
#define SABLONOK_HPP
/*
* sablonok.hpp
*/
template <typename Iter>
void printEach(Iter first, Iter last, std::ostream& os = std::cout, const char *sep = ",") {
while (first != last) {
os << *first++;
if (first != last) os << sep;
else os << std::endl;
}
}
template <typename Iter>
int szamol_ha_negativ(Iter first, Iter last) {
int cnt = 0;
while (first != last)
if (*first++ < 0) cnt++;
return cnt;
}
template <typename Iter, typename Pred>
int szamol_ha(Iter first, Iter last, Pred pred) {
int cnt = 0;
while (first != last)
if (pred(*first++)) cnt++;
return cnt;
}
template <typename T>
class nagyobb_mint {
T ref;
public:
nagyobb_mint(T r) :ref(r) {}
bool operator()(const T& a) {
return a > ref;
}
};
template <class T>
void kiir(const char *txt, T& a) {
std::cout << txt << ": size=" << a.size()
<< " capacity=" << a.capacity() << std::endl;
std::cout << "\t data=";
printEach(a.begin(), a.end());
}
template <class Iter, class Sel>
Iter kivalaszt(Iter first, Iter last, Sel cmp) {
Iter tmp = first;
while(++first != last)
if (cmp(*first, *tmp)) tmp = first;
return tmp;
}
template <typename T>
struct nagyobb {
bool operator()(const T& a, const T& b) const {
return a > b;
}
};
template <typename Iter, class Func>
Func forEach(Iter first, Iter last, Func func) {
while (first != last)
func(*first++);
return func;
}
template <class T>
class ostreamFunctor {
std::ostream& os;
const char* delim;
public:
ostreamFunctor(std::ostream& os, const char* delim = "") : os(os), delim(delim) {}
void operator()(const T& d) const { os << d << delim; }
};
#endif
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="vector2gen_array_adapter" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/genarray3" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/genarray3" 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="gen_array_adapter.hpp" />
<Unit filename="integer.h" />
<Unit filename="sablonok.hpp" />
<Unit filename="vector2hgen_array_test.cpp" />
<Extensions>
<code_completion />
<debugger />
<envvars />
<DoxyBlocks>
<comment_style block="0" line="0" />
<doxyfile_project />
<doxyfile_build />
<doxyfile_warnings />
<doxyfile_output />
<doxyfile_dot />
<general />
</DoxyBlocks>
</Extensions>
</Project>
</CodeBlocks_project_file>
/**
* Egyszerű program az iterátoros generikus tömb kipróbálásához.
*/
#include <iostream>
#include <stdexcept>
#define TESTLEVEL 7
#include "integer.h"
#include "gen_array_adapter.hpp"
#if TESTLEVEL >= 3
#include "sablonok.hpp"
#endif
using std::cout;
using std::endl;
/// Összegző funktor (5. feladat)
/// TESTLEVEL == 5-höz
struct Sum {
int sum;
Sum(int s=0) :sum(s) {}
void operator()(int i) { sum += i;}
};
/// Egyszerű C tömbök, amibõl majd az adatokat vesszük
int itomb[] = { -5, 11, 13, -2, -1, 0, 1, -82, 3, 4 };
double dtomb[] = { .0, .1, .2, .3, 4.4, -12.4, 8.7 };
const char* txtomb[] = { "C#" , "C", "C++", "Java", "C++11" };
int main() {
try {
/// az int tömbbõl létrehozunk egy intarr0-át
Array<int> intarr0(itomb, itomb+10);
/// Kiírjuk az elemeket.
/// Készítsen sablont (3. feladat), és helyettesítse a kiírást a sablon hívásával pl:
/// kiir("intarr0", intarr0);
cout << "intarr0: size=" << intarr0.size()
<< " capacity=" << intarr0.capacity() << endl;
cout << "\t data=";
for (size_t i = 0; i < intarr0.size(); i++)
cout << " " << intarr0.at(i);
cout << endl;
/// --Eddig tart a kiírás
#if TESTLEVEL <= 1 // csak 1-nél, hogy máskor ne zavarjon a kivétel
/// szándékosan rosszul indexelünk
cout << intarr0.at(112);
#endif // TESTLEVEL <= 1
/// a double tömbbõl létrehozunk egy dblarr0-át
Array<double, 20> dblarr0(dtomb, dtomb+7);
/// Kiírjuk az elemeket.
/// Helyettesítse a kiírást a kiir sablon használatával (3. feladat!)
cout << "dblarr0: size=" << dblarr0.size()
<< " capacity=" << dblarr0.capacity() << endl;
cout << "\t data=";
for (size_t i = 0; i < dblarr0.size(); i++)
cout << " " << dblarr0.at(i);
cout << endl;
/// --Eddig tart a kiírás
#if TESTLEVEL >= 2
/// Ellenõrizzük az Array post-inkremens iterátorát:
Array<int>::iterator i1, i2;
i1 = i2 = intarr0.begin();
if (i1 != i2++) { cout << "** HIBAS az iterator post-inkremens operatora **\n"; }
#endif // TESTLEVEL >= 1
#if TESTLEVEL >=3
/// intarr0-ból létrehozzuk az intarr1-et
Array<int, 100> intarr1(intarr0.begin(), intarr0.end());
/// Kiírjuk az elemeket.
/// Helyettesítse a kiírást a kiir sablon használatával (3. feladat)
cout << "intarr1: size=" << intarr1.size()
<< " capacity=" << intarr1.capacity() << endl;
cout << "\t data=";
for (size_t i = 0; i < intarr1.size(); i++)
cout << " " << intarr1.at(i);
cout << endl;
/// --Eddig tart a kiírás
#endif // TESTLEVEL >= 3
#if TESTLEVEL >= 4
/// const char* tömbből létrehozzuk az txarray-t
Array<const char*> txarray(txtomb, txtomb+5);
/// Kiírjuk az elemeket az új kiíró sablonnal
kiir("\ntxarray", txarray);
/// Intarr0 kiírása újra.
kiir("intarr0", intarr0);
cout << "intarr0 5-nel nagyobb: ";
cout << szamol_ha(intarr0.begin(), intarr0.end(), nagyobb_mint<int>(5));
cout << " db\n";
#endif // TESTLEVEL >= 4
#if TESTLEVEL >= 5
Sum s = forEach(intarr1.begin(), intarr1.end(), Sum());
cout << "\nintarr0 osszegzes forEach segitsegevel: " << s.sum << endl;
#endif
#if TESTLEVEL >= 6
cout << "intarr0 kiiras forEach segtisegevel: ";
ostreamFunctor<int> out(cout, ",");
forEach(intarr1.begin(), intarr1.end(), out);
cout << endl;
#endif
#if TESTLEVEL >= 7
/// Itt valamilyen memóriaszemét lesz
cout << "\nMemoriaszemet: " << intarr1.at(12) << endl;
/// Itt meg nincs memóriaszemét. Miért?
Array<Integer,100> Ia;
cout << "Ez meg nulla: "<< Ia.at(12) << endl;
#endif
} catch (std::exception& e) { // az out_of_range, és a runtime_error is az exception
// osztályból származik. Így azok kompatibilisek
// az alaposztállyal
cout << e.what() << endl;
}
}
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