Commit 7bb7e184 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="CppVektor1" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/CppVektor1" 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/CppVektor1" 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-errors" />
<Add option="-pedantic" />
<Add option="-std=c++11" />
<Add option="-Wall" />
<Add option="-Werror" />
</Compiler>
<Unit filename="gtest_lite.h" />
<Unit filename="memtrace.cpp" />
<Unit filename="memtrace.h" />
<Unit filename="vektor.cpp" />
<Unit filename="vektor.h" />
<Unit filename="vektorMain.cpp" />
<Extensions>
<code_completion />
<envvars />
<debugger />
</Extensions>
</Project>
</CodeBlocks_project_file>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{AC31E472-A633-428F-AD07-FED964FD5348}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>CppVekktor1</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;MEMTRACE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="gtest_lite.h" />
<ClInclude Include="memtrace.h" />
<ClInclude Include="vektor.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="memtrace.cpp" />
<ClCompile Include="vektor.cpp" />
<ClCompile Include="vektorMain.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="gtest_lite.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="memtrace.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="vektor.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="memtrace.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="vektor.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="vektorMain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
\ No newline at end of file
#
# Makefile a CppVektor0 feladathoz
#
# MEMTRACE-hez:
CXXFLAGS = -g -Wall -DMEMTRACE
# Mpatrol-hoz:
#CXXFLAGS = -g -Wall
LIBMPATROL = -lmpatrol -lbfd
OBJS = vektor.o vektorMain.o
# Ez a default cel
.PHONY: all
all: vektorMain_mtrac
# Nincs mem ellenorzes
vektorMain: $(OBJS)
$(CXX) $(CXXFLAGS) $(OBJS) -o $@
# MPATROL valtozat
vektorMain_mpat: $(OBJS)
$(CXX) $(CXXFLAGS) $(OBJS) $(LIBMPATROL) -o $@
# MEMTRACE
vektorMain_mtrac: $(OBJS) memtrace.o
$(CXX) $(CXXFLAGS) $(OBJS) memtrace.o -o $@
#-------------
vektor.o: vektor.h vektor.cpp
clean:
rm -f *.o *.log vektorMain vektorMain_mpat vektorMain_mtrac
check: main_mpat
MPATROL_OPTIONS=LEAKTABLE ./vektorMain_mpat
Töltse le a [https://git.ik.bme.hu/Prog2/ell\_feladat/CppVektor](https://git.ik.bme.hu/Prog2/ell_feladat/CppVektor)
projektet!
Tanulmányozza a **vektor.h** állományban deklarált osztályt!
A **Vektor** osztály valós elemek tárolására szolgáló tömböt valósít meg. A tömb méretét a konstruktornak lehet megadni, ami a tároló terület a dinamikus memóriában hozza létre.
Az osztálynak a konstruktorokon és destruktoron kívül a következő tagfüggvényei vannak:
unsigned int size() const; – méret lekérdezése
static void setDefSize(unsigned int size); – alapértelmezett méret megadása
static void setDefValue(double value); – alapértelmezett érték megadása
Vektor& operator=(const Vektor&); – értékadó operátor
double& operator\[\](unsigned int); – indexoperátor (hiba esetén kivételt dob)
const double& operator\[\](unsigned int) const; – indexoperátor (hiba esetén kivételt dob)
Van egy olyan globális operátor is, ami a vektor minden elemét megszorozza a paraméterként adott valós értékkel:
Vektor operator\*(double, const Vektor&)
A függvények rövid leírását (paraméterek, elvárt működés) a *vektor.h* fájl tartalmazza.
**Valósítsa meg** a **vektor.cpp** állományban a hiányzó függvényeket (operátorok, a másoló konstruktor,
destruktor) úgy, hogy azok az elvárt módon működjenek, és a mellékelt tesztprogram (*vektorMain.cpp*) hiba nélkül fusson!
Az indexoperátor hiba esetén dobjon egy *const char\** típusú kivételt, ami Ön **Neptun**-kódját tartalmazza!
A paraméter nélküli, valamint az 1 és 2 paraméteres konstruktort a *vektor.h* fájlban inline tagfüggvényként elkészítettük. Ez nemcsak létrehozza a vektort, hanem feltölti a megadott kezdőértékkel is. A konstruktor az alapértelmezett méretet és kezdőértéket két statikus adattagból veszi, melyek definícióit ne felejtse el elkészíteni! Az értékek a **Jporta által megadottak** legyenek!
**Mielőtt** megoldását beadja, **tesztelje** azt a saját fejlesztői környezetében
a *wektorMain.cpp* tesztprogrammal! Elemezze a tesztprogramot, hogy megértse,
mit fog elvárni a Jporta, ami **ugyanezt** a programot futtatja.
**Fontos:** Legyen definiált a **MEMTRACE** makró minden fordítási egységben. Ezt a beállítást a Git tárolóból letölthető projektfájlok illetve a *Makefile* eleve tartalmazza. Amennyiben nem a letölthető projektfájlok valamelyikét használja, úgy ügyeljen a MEMTRACE projektszintű definiálására!
**Megj:** A Jporta a feltöltött megoldást lefordítja, majd úgy futtatja, hogy a standard inputon egy előre megadott adatsort ad a programnak. Ez adatsor tartalmazza, a teszteset sorszámát és a teszteset további input adatát is. Érdemes a módszert megfigyelni, mert a nagy házi feladat teszteléséhez is hasonló tesztelési metódust ajánlunk, ahol Ön töltheti fel a standard inputra kerülő adatsort is.
Igy a standard inputról olvasott adattal vezérelheti, hogy melyik teszteset fusson le.
Természetesen a feladattól függhet, hogy ez a módszer használható vagy nem, mint ahogy az is,
hogy a gtest_lite makrói használhatóak-e.
This diff is collapsed. Click to expand it.
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 VEKTOR_H
#define VEKTOR_H
/**
* \file vektor.h
*
* CppVektor Jporta feladat Vektor osztály deklarációja
*
* Az Ön feladata a hiányzó függvények megvalósítása a veltor.cpp fájlban.
*
* Ebben a fájlban nem kell módosítania semmit, ugyanakkor célszerű a megvalósítandó tagfüggvények
* deklarációi kommentekkel együtt átmásolni a vektor.ccp-be, és azokat átalakítani definíciókká.
* Másolásnál ügyeljen arra, hogy a kontextus (scope) megváltozik.
*/
#include "memtrace.h"
/**
* Dinamikus valós vektor.
* A konstruktor a statikus tagokból inicializál
*/
class Vektor {
double *pVec; // vektor elemeit tartalmazó din. memóriaterület címe
size_t nElements; // vektor elmeinek száma
static size_t defSize; // vektor alapértelmezett mérete
static double defValue; // vektor elemeinek alapértelmezett kezdőértéke
public:
/// Konstruktor.
/// Statikus adattagokból inicializál
/// @param size - vektor mérete
/// @param value - kezdőérték, amivel feltölti a vektort
Vektor(size_t size = defSize, double value = defValue) :nElements(size) {
pVec = new double[nElements];
for (size_t i = 0; i < nElements; i++)
pVec[i] = value;
}
/// Másoló konstruktor. Készítse el a vektor.cpp fájlban!
Vektor(const Vektor&);
/// Destruktor. Készítse el a vektor.cpp fájlban!
~Vektor();
/// Méret lekérdezése.
size_t size() const { return nElements; }
/// Alapértelmezett méret beállítása
/// @param size - vektor def. mérete
static void setDefSize(size_t size) { defSize = size; }
/// Alapértelmezett érték beállítása
/// @param value - def. kezdőérték, amivel feltölti a vektort
static void setDefValue(double value) { defValue = value; }
/// Értékadó operátor. Készítse el a vektor.cpp fájlban!
Vektor& operator=(const Vektor&);
/// Indexoperátorok. Készítse el a vektor.cpp fájlban!
/// Túlcímzés esetén az Ön Neptun-kódját tartalmazó const char* típusú kivételt dob!
/// @param idx - index értéke
/// @return - referencia az adott elemre
double& operator[](size_t idx);
const double& operator[](size_t idx) const;
};
/// Szorzás: Valós * Vektor. Készítse el a vektor.cpp fájlban!
/// @param val - valós érték (bal oldali operandus)
/// @param vec - vektor, aminek minden elemét megszorozzuk (jobb oldali operandus)
Vektor operator*(double val, const Vektor& vec);
#endif
/**
* \file vektorMain.cpp
*
* Tesztprogram a Vektor osztály teszteléséhez.
* Értse meg a programot és készítse el a vektor.cpp-ben a hiányzó tagfüggvényeket!
*
* Megj: A nagy házi feladat teszteléséhez is hasonló tesztelési metódust ajánlunk, azaz
* a standard inputról olvasott adat vezérelje, hogy melyik teszteset fusson le.
* Természetesen a feladattól függhet, hogy ez a módszer használható vagy nem, mint ahogy az
* is, hogy a gtest_lite makrói használhatóak-e.
*
*
*** FONTOS ***
* A MEMTRACE makró 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 <ctime>
#include <iomanip>
#include "vektor.h"
#include "gtest_lite.h" // tesztelést segítő makrók
using std::cout;
using std::endl;
using std::cin;
/// Segédfüggvény a beolvasások előtti üzenetek kiírásához
/// CPORTA-n nem kérünk ilyen kiírásokat
inline void prompt(const char *msg) {
#ifndef CPORTA
cout << msg;
#endif // CPORTA
}
// konstruktorok, kezdőértékek és indexoperátor tesztje
void test_1() {
// Konstruktorok tesztje
TEST(Vektor, konst) {
Vektor::setDefSize(10);
Vektor::setDefValue(0);
EXPECT_NO_THROW(Vektor v0);
Vektor v0;
EXPECT_EQ(10u, v0.size()); // méretre 10-et várunk
cout << "v0 merete: "<< v0.size() << endl;
Vektor v1(5, 8);
EXPECT_EQ(5u, v1.size()); // méretre 5-öt várunk
cout << "v1 merete: "<< v1.size() << endl;
} END
// kezdőértékkel való feltöltés és indexelés tesztje
TEST(Vektor, index) {
Vektor::setDefSize(10);
Vektor::setDefValue(0);
Vektor v0;
for (size_t i = 0; i < v0.size(); ++i) {
EXPECT_NO_THROW(v0[i]); // nem várunk kivételt
EXPECT_EQ(0, v0[i]) << "*** kezdoertek?"; // minden eleme 0
}
EXPECT_THROW(v0[10], const char *); // túl nagy
EXPECT_THROW(v0[11], const char *); // ez is
EXPECT_THROW(v0[-1], const char *); // túl kicsi
Vektor v1(5, 8);
for (size_t i = 0; i < v1.size(); ++i) {
EXPECT_NO_THROW(v1[i]); // nem várunk kivételt
EXPECT_EQ(8, v1[i]) << "*** kezdoertek?"; // minden eleme 8
}
EXPECT_THROW(v1[8], const char *); // túl nagy
EXPECT_THROW(v1[9], const char *); // ez is
EXPECT_THROW(v1[-1], const char *); // túl kicsi
} END
// másoló konstruktor és indexelés tesztje
TEST(Vektor, copy) {
Vektor::setDefSize(10);
Vektor::setDefValue(0);
Vektor v0, v1(5, -1), v2(6, 1);
EXPECT_NO_THROW(Vektor v3 = v2);
Vektor v3 = v2;
EXPECT_EQ(6u, v3.size());
cout << "v3 merete: "<< v3.size() << endl;
for (size_t i = 0; i < v3.size(); ++i) {
EXPECT_NO_THROW(v3[i]); // nem várunk kivételt
EXPECT_EQ(1, v3[i]) << "*** Az adat elromlott! copy ctor?"; // minden eleme 1
}
EXPECT_THROW(v3[6], const char *); // túl nagy
EXPECT_THROW(v3[7], const char *); // ez is
EXPECT_THROW(v3[-1], const char *); // túl kicsi
} END
// értékadás és indexelés tesztje
TEST(Vektor, assign) {
Vektor::setDefSize(20);
Vektor::setDefValue(0);
Vektor v0, v1(25, -1);
EXPECT_NO_THROW(v1 = v0);
EXPECT_EQ(20u, v1.size());
cout << "v1 merete: "<< v1.size() << endl;
for (size_t i = 0; i < v1.size(); ++i) {
EXPECT_NO_THROW(v1[i]); // nem várunk kivételt
EXPECT_EQ(0, v1[i]) << "*** Az adat elromlott a masolaskor";
}
EXPECT_THROW(v1[20], const char *); // túl nagy
EXPECT_THROW(v1[21], const char *); // ez is
EXPECT_THROW(v1[-3], const char *); // túl kicsi
} END
// értékadás önmagának és indexelés tesztje
TEST(Vektor, selfassign) {
Vektor::setDefSize(5);
Vektor::setDefValue(5.5);
Vektor v0, v1(25, -1);
EXPECT_NO_THROW(v0 = v0);
EXPECT_EQ(5u, v0.size());
cout << "v0 merete: "<< v0.size() << endl;
for (size_t i = 0; i < v0.size(); ++i) {
EXPECT_NO_THROW(v0[i]); // nem várunk kivételt
EXPECT_EQ(5.5, v0[i]) << "*** Az adat elromlott a masolaskor";
}
EXPECT_THROW(v0[6], const char *); // túl nagy
EXPECT_THROW(v0[7], const char *); // ez is
EXPECT_THROW(v0[-1], const char *); // túl kicsi
} END
}
// CPORTA ellenőrzi a kimenetet
void test_2() {
Vektor::setDefSize(500);
Vektor::setDefValue(-1);
Vektor v;
cout << "v merete: "<< v.size() << endl;
cout << "v[0] = " << v[0] << endl;
v[-1]; // szép kis kivételt generálunk, hogy megtudjuk a neptun kódját
}
//
void test_3() {
Vektor::setDefSize(10);
Vektor::setDefValue(0);
Vektor v0, v1(5, -1), v2(6, 2);
// konstans tagfüggvények tesztje
TEST(Vektor, const) {
const Vektor v3 = v2;
EXPECT_EQ(6u, v3.size());
cout << "v3 merete: "<< v3.size() << endl;
for (size_t i = 0; i < v3.size(); ++i) {
EXPECT_NO_THROW(v3[i]); // nem várunk kivételt
EXPECT_EQ(2, v3[i]); // minden eleme 2
}
EXPECT_THROW(v3[6], const char *); // túl nagy
EXPECT_THROW(v3[7], const char *); // ez is
EXPECT_THROW(v3[-20], const char *); // túl kicsi
// elengedünk egy kivételt a konstansra is a neptun miatt
v3[-99];
} END
}
void test_4() {
// Beolvassa n-et (egész)
prompt("vektor merete: ");
size_t n; cin >> n;
Vektor::setDefSize(n); // ez lesz a default méret
// Beolvassa a default kezdõértéket és beállítja
prompt(" kezdoerteke: ");
double val; cin >> val;
Vektor::setDefValue(val);
// Beolvas még egy egész értéket (ezzel kicsit módosít majd)
prompt(" szorzo1: ");
int mul1 = 0; cin >> mul1;
prompt(" szorzo2: ");
int mul2 = 0; cin >> mul2;
// Létrehozunk egy 5xn-es mátrixot default értékekkel;
const int m = 5;
Vektor vt[m];
// szorzás tesztje
TEST(Vektor, Mul) {
cout << std::fixed;
// minden elemet megszorzunk (mul1+i+j)-vel változtatunk
for (int i = 0; i < m; i++) {
for (size_t j = 0; j < n; j++)
vt[i][j] *= mul1 + i + j;
cout << "vt[" << i << "](" << vt[i].size() << "): ";
const Vektor v0 = vt[i];
vt[i] = mul2 * v0; // Most pedig megszorozzuk mul2-vel
for (size_t j = 0; j < n; j++) {
EXPECT_DOUBLE_EQ(val*(mul1+i+j)*mul2, vt[i][j]);
cout << std::setw(8) << std::setprecision(0) << vt[i][j];
}
cout << endl;
}
} END
}
int main() {
// alapételmezett értékek tesztelése
try
{
Vektor v0;
cout << "alapertelmezett ertekek: " << v0.size() << " " << v0[1] << endl;
}
catch (...)
{
cout << "alapertelmezett ertekkel valo letrehozas soran kivetel keletkezett." << endl;
return 1;
}
int testNr;
const char *prompt_txt = "Teszteset (1-4) (0: vege): ";
prompt(prompt_txt);
while (cin >> testNr && testNr != 0) { // * 0-ig, vagy amíg tud számot olvasni
try {
switch (testNr) {
case 1: test_1(); break;
case 2: test_2(); break;
case 3: test_3(); break;
case 4: test_4(); break;
}
cout << endl;
} catch (const char *p) {
cout << p << endl << endl;
} catch (...) {
cout << "Baj van!" << endl;
}
prompt(prompt_txt);
}
return 0;
}
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