Commit 5f7de901 by Szeberényi Imre

v0

parents
## Makefile a Nem_OO feladat forditasahoz
# gnumake valtozat
# Linuxokon es ural2-n is elerheto
#
PROG = nem_oo_teszt # a program neve (ezt allitjuk elo)
PROG_O = nem_oo_teszt.o nem_oo.o # program object fajljai
PROG_H = nem_oo.h # program header fajljai
PROG_L = # program libjei
MTRACE_O = memtrace.o # memtrace object fajl
MTRACE_H = memtrace.h # memtrace header fajlja
CXX = g++ # a C fordito neve
#CXX = clang++ # clang-ot (llvm) is erdemes kiprobalni
CXXFLAGS = -pedantic -Wall -Werror# kapcsolok: legyen bobeszedu es pedans
CXXFLAGS += -g # es legyeb debug info is
CXXFLAGS += -DMEMTRACE -std=c++98
LDFLAGS = -g # debug a linkelesnel
# osszes object, osszes header osszes lib
OBJS = $(PROG_O) $(MTRACE_O)
HEADS = $(PROG_H) $(MTRACE_H)
LIBS = $(PROG_L)
# alapertelmezett cel: program
.PHONY: all
all: $(PROG)
$(PROG): $(OBJS)
$(CXX) $(LDFLAGS) $(OBJS) -o $@ $(LIBS)
# feltetelezzuk, hogy az osszes obj fugg az osszes headertol
$(OBJS): $(HEADS)
# takaritas igeny szerint
.PHONY: clean
clean:
rm -f $(OBJS) $(PROG)
Ebben a feladatban 3 függvényt és egy sablont kell elkészítenie a specifikációknak megfelelően.
Töltse le a feladathoz előkészítet teljes könyvtárat a Git tárolóból kliens használatával, vagy akár
más eszközzel a [https://git.ik.bme.hu/Prog2/ell_feladat/Nem_OO](https://git.ik.bme.hu/Prog2/ell_feladat/Nem_OO) címről!
*Feladatok:*
1. Valósítsa meg a _nem\_oo.h_ állományban deklarált függvényeket (_atoi()_, _strcat()_, _unique()_), melyek hasonlóan működnek, mint az azonos nevű szabványos függvények, de nem pontosan ugyanúgy. A függvények paramétereit és elvárt működését a _nem\_oo.h_ fájlban adtuk meg.
2. A _max.hpp_ fájlban valósítson meg a _Sajat_ névtéren belül egy olyan sablont, ami alaptípusok esetén a paraméterként kapott érték közül a nagyobbat adja.
3. Specializálja a sablont a _nem\_oo.h_ állományban deklarált _Komplex_ típusra úgy, hogy a nagyobb abszolút értékű Komplex számot adja vissza!
4. Ellenőrizze a megvalósított függvények és sablonok működését a _nem\_oo\_test.cpp_ tesztprogrammal!
Csak az elkészített **nem\_oo.cpp** és **max.hpp** fájlokat kell feltöltenie a portálra.
A _memtrace.h_ és _memtrace.cpp_ fájlok a memóriakezelés teszteléséhez szükségesek. Nem kell megértenie a működésüket!
*Javaslat:*
- Fontos, hogy a megvalósítandó függvényeket a megfelelő **névtérben** definiálja.
- Az _atoi()_ megvalósításakor ügyeljen arra, hogy csak helyes számot fogadjon el!
- Helyes számjegysorozat végét white space, vagy sztring vége ('\0') jelzi. Minden más karakter előfordulása hiba.
- Szintén hiba, ha a számjegysorozatban olyan számjegy, vagy betű fordul elő, ami nem érvényes az adott számrendszerben. B számrendszerben a B számjegy már nem fordulhat elő!
- **Hiba** esetén dobjon **const char*** típusú kivételt, melynek értéke az Ön **Neptun azonosítója** legyen!
- Használja a [Horner-elrendezést](https://hu.wikipedia.org/wiki/Polinom) a szám (polinom helyettesítési)
értékének kiszámításához. Így elkerülheti a pow() használatát és n db szorzással és összeadással kiszámíthatja az értéket!
#ifndef _MAX_HPP
#define _MAX_HPP
/**
* file max.hpp
* (UTF-8 kodolasu fajl. Allitsa at a megjenetes kodolasat,
* ha a tovabbi kommentek nem olvashatok helyesen!)
*
*
* A C++ nem OO bvtseinek gyakorlshoz.
*
*
* FELADATOK:
* 2. Valstson meg EBBEN a fjlban, a Sajat nvtren bell egy olyan sablont, ami
* alaptpusok esetn a paramterknt kapott rtk kzl a nagyobbat adja.
* 3. Specializlja a sablont a nem_oo.h llomnyban deklarlt Komplex tpusra
* gy hogy a nagyobb abszolt rtk Komplex szmot adja vissza!
*
* gyeljen a helyes nvtr hasznlatra!
* Tipp: Hasznlja a scope opertort, vagy nyisson nvteret!
*/
#include "nem_oo.h"
#endif // _MAX_HPP
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: Szebernyi Imre, 2015.,
mem_dump: 2016.
inclue-ok: 2017., 2018.
*********************************/
#ifndef MEMTRACE_H
#define MEMTRACE_H
#if defined(MEMTRACE)
/*ha definilva van, akkor a hibakat ebbe a fajlba rja, egybkent 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 deklarci vltozatai
#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 rgebbi
#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 gyjtjk a nemtrace-vel sszeakad headereket, hogy elbb legyenek */
#include <fstream> // VS 2013 headerjben van deleted definici
#include <sstream>
#include <vector>
#include <algorithm>
#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 = stdout);
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 hklis, hogy nincs megfelel delete, br senki sem hasznlja */
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*/
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="nem_oo" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/nem_oo" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-pedantic-errors" />
<Add option="-std=c++11" />
<Add option="-Wfatal-errors" />
<Add option="-Wall" />
<Add option="-g" />
<Add option="-D_DEBUG" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/nem_oo" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
<Add option="-std=c++98" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-DMEMTRACE" />
</Compiler>
<Unit filename="max.hpp" />
<Unit filename="memtrace.cpp" />
<Unit filename="memtrace.h" />
<Unit filename="nem_oo.cpp" />
<Unit filename="nem_oo.h" />
<Unit filename="nem_oo_teszt.cpp" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<DoxyBlocks>
<comment_style block="0" line="0" />
<doxyfile_project />
<doxyfile_build />
<doxyfile_warnings />
<doxyfile_output />
<doxyfile_dot />
<general />
</DoxyBlocks>
</Extensions>
</Project>
</CodeBlocks_project_file>
#include <cstring>
#include <cctype>
#include "nem_oo.h"
#include "max.hpp"
/**
* \file nem_oo_teszt.cpp
* (UTF-8 kodolasu fajl. Allitsa at a kodolast,
* ha a tovabbi kommentek nem olvashatok helyesen!)
*
* FELADATOK:
* 1. Ebben a fájlban valósítsa meg a nem_oo.h állományban deklarált függvényeket!
*
* Ügyeljen a helyes névtér használatra!
* Tipp: Használja a scope operátort, vagy nyisson névteret!
*/
#ifndef NEM_OO_H
#define NEM_OO_H
/**
* \file nem_oo.h
* (UTF-8 kodolasu fajl. Allitsa at a megjenetes kodolasat,
* ha a tovabbi kommentek nem olvashatok helyesen!)
*
* A C++ nem OO bővítéseinek gyakorlásához.
*
*/
#include <cmath>
#include <iostream>
#include "memtrace.h"
namespace sajat { /// saját névtér
/**
* Saját atoi.
* Számjegyeket tartalmazó karaktersorozat átalakítása int-re.
* Helyes számjegysorozat végét white space, vagy sztring vége ('\0') jelzi.
* Ha a számjegysorozatban olyan számjegy, vagy betű fordul elő,
* ami nem érvényes az adott számrendszerben, az hiba.
* Pl. hármas számrendszerben nem fordulhat elő a 3-as számjegy, de az A betű sem.
* Hiba esetén egy const char* típusú kivételt kell dobni, melynek értéke
* az Ön neptun azonosítója!
* @param p - pointer a sztringre
* @param base - számrendszer alapja (0-10)
* @return - base számrendszerben értelmezett szám
*/
int atoi(const char *p, int base = 10);
/**
* Sajat strcat.
* Két C stílusú sztring (nullával lezárt karaktersorozat) összefűzése
* A függvény dinamikusan foglal helyet az eredménynek.
* @param p1 - pointer az első sztringre
* @param p2 - pointer az másik sztringre
* @return - dinamikusan foglalt terület címe, ahova az eredmény kerül (hívónak kell felszabadítania)
*/
char *strcat(const char *p1, const char *p2);
/**
* unique
* A paraméterként kapott két pointer közötti karaktersorozatból kihagyja az egymás után ismétlődő
* karaktereket (char). A sorozatot az eredeti helyén hagyja!
* @param first - pointer az adatok kezdetére
* @param last - pointer, ami az utolsó adat után mutat
* @return - pointer, ami az új sorozat utolsó adata után mutat (a kihagyással rövidült a sorozat)
*/
char *unique(char *first, char *last);
/**
* Az alább megvalósított adatstruktúra és a hozzá tartózó függvények
* A max sablonnal kapcsolatos feladat megvalósításához kellenek.
*
* Értse meg a működésüket!
* A feladat részletes leírását a max.hpp fájlban találja.
* A kapcsolódó feladatot a max.hhp-ben oldja meg, azaz
* abban valósítsa meg a várt sablont és annak specializációját!
*/
/**
* Adatstruktúra komplex szám tárolásához
*/
struct Komplex {
double re; // valós rész
double im; // képzetes rész
};
/**
* Komplex szám abszolút értéke
* @param k - komplex szám
* @return valós - a komplex szám abszolút értéke
*/
inline double absKomplex(const Komplex& k) {
return sqrt(k.re*k.re + k.im*k.im);
}
/**
* Komplex szám kiírása egy ostream típusú adatfolyamra
* @param os - ostream típusú objektum
* @param k - komplex szám
* @return os
*/
inline std::ostream& operator<<(std::ostream& os, const Komplex& k) {
os << "(" << k.re << "," << k.im << "j)";
return os;
}
}/// ---------- névtér vége ---------------
#endif
<?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>
<ItemGroup>
<ClCompile Include="nem_oo.cpp" />
<ClCompile Include="nem_oo_teszt.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="nem_oo.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{45DA0C9C-8626-43DE-B7F0-301B612CD05A}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>strinng1</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;%(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>
<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>
<ClCompile Include="nem_oo.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="nem_oo_teszt.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="nem_oo.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
\ No newline at end of file
/**
* \file nem_oo_teszt.cpp
* (UTF-8 kodolasu fajl. Allitsa at a megjenetes kodolasat,
* ha a tovabbi kommentek nem olvashatok helyesen!)
*
* A C++ nem OO bővítéseinek gyakorlásához.
*
* Ékezetes kiírásokat csak a szorgalmi feladat tartalmaz.
* Ha másutt is szeretne, akkor használja nem_oo_teszt.cpp fájlt.
*
* FELADATOK:
* 1. Valósítsa meg a nem_oo.h állományban deklarált függvényeket!
* 2. Valósítson meg a max.hpp fájlban, a Sajat névtéren belül egy olyan sablont, ami
* alaptípusok esetén a paraméterként kapott érték közül a nagyobbat adja.
* 3. Specializálja a sablont a nem_oo.h állományban deklarált Komplex típusra
* úgy hogy a nagyobb abszolút értékű Komplex számot adja vissza!
* 4. Ellenőrizze a megvalósított függvények és sablonok működését az alábbi
* tesztprogrammal! Értse meg a tesztprogramot! Segít a hibakeresésben!
* Most nem használjuk a gtest_lite makrókat, csupán egy-két programozott
* ellenőrzést végzünk. A kiírások helyességét Önnek kell ellenőriznie!
* (Ugye mennyivel macerásabb, mint programozottan ellenőrizni?)
* 5. Szorgalmi feladat, ld. a fájl végén
*
*/
#include <iostream>
#include <cstring>
#include <locale>
// Segédmakró, hogy windows-e
#define WINX defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
// Ha Windows, akkor a karakterkészlet állítás miatt (szorgalmi feladatban) kell a windows.h
#if WINX
#include <windows.h>
#endif // WINX
#include "nem_oo.h"
#include "max.hpp"
#define SORHOSSZ 1000
using std::cout;
using std::cin;
using std::endl;
void ekezetes();
/* Ezt a tesztprogramot futtatja a JPORTA úgy, hogy a CPORTA definiált
* Fordítsa le úgy is a programot és futtassa. */
//#define CPORTA
/* A szorgalmi feladathoz definiálja a SZORGALMI makrót */
//#define SZORGALMI
int main() {
#ifndef CPORTA
void setDefLang();/// alapértelmezett nyelvi környezet beállítása
setDefLang();
#endif
#if !defined(CPORTA) && defined(SZORGALMI)
ekezetes_io(); /// szorgalmi feladat függvénye, JPORTA-n nem futtatjuk
#endif
try { /// Minden egy nagy try-catch blokkban van a tesztelés miatt.
#ifndef CPORTA
cout << "\nSajat atoi proba.\n\"100\" 10-es, 8-as, és 2-es szamrendszerben:" << endl;
#endif // CPORTA
cout << sajat::atoi("100") << endl; /// KIÍRÁS: 10-es számrendszerben: 100
cout << sajat::atoi("100", 8) << endl; /// KIÍRÁS: 8-asban: 64
cout << sajat::atoi("100", 2) << endl; /// KIÍRÁS: 2-esben: 4
/// kipróbáljuk az strcat-ot:
#ifndef CPORTA
cout << "\nSajat strcat proba:" << endl;
#endif // CPORTA
char *str = sajat::strcat("Ez egy mondat.", " Ez kicsit hosszabb mondat.\n");
cout << str; /// KIÍRÁS: Ez egy mondat. Ez kicsit hosszabb mondat.
delete[] str; /// Nekünk kell felszabadítani!
/// kipróbáljuk a max-ot
#ifndef CPORTA
cout << "\nSajat max proba:" << endl;
#endif // CPORTA
int i1 = 10;
int i2 = 200;
#ifndef CPORTA
cout << "max(" << i1 << ", " << i1 <<")= "; /// KIÍRÁS: max(10, 200)=
#endif // CPORTA
cout << sajat::max(i1, i2) << endl; /// KIÍRÁS: 200
double d1 = 123.5;
double d2 = -34.4;
#ifndef CPORTA
cout << "max(" << d1 << ", " << d2 <<")= "; /// KIÍRÁS: max(123.5, -34.4)=
#endif // CPORTA
cout << sajat::max(d1, d2) << endl; /// KIÍRÁS: 123.5
sajat::Komplex k1 = { 1, -3};
sajat::Komplex k2 = { -40, 100 };
#ifndef CPORTA
cout << "max(" << k1 << ", " << k2 <<")= "; /// KIÍRÁS: max((1,-3j), (-40,100j))=
#endif // CPORTA
cout << sajat::max(k1, k2) << endl;/// KIÍRÁS: (-40,100j)
/// kipróbáljuk a unique-ot
char test[] = "ssszia C+++++ + !"; /// sok ismétlődő kar.
#ifndef CPORTA
cout << "\ntest tomb tartalma a uniq hivasa elott\n";
memtrace::mem_dump(&test, sizeof(test));
#endif // CPORTA
cout << test << endl;
char *p = sajat::unique(test, test+strlen(test));
#ifndef CPORTA
cout << "\nuniq hivasa utan p: " << (void*)p << endl;
memtrace::mem_dump(&test, sizeof(test)); /// Segit megfigyelni a memóriatartalmat
#endif // CPORTA
*p = 0; /// p az új sorozat végére mutat
cout << test << endl;; /// KIÍRÁS: szia C+ + !
#ifndef CPORTA
if (strcmp(test, "szia C+ + !") != 0)
cout << "*** Hibás a unique ****" << endl;
if (p != test + 11)
cout << "*** Hibas unique: nem jo a visszateresi ertek ***" << endl;
char test2[19] = "sss\0zia C+++++ + !"; /// lezáró nullával együtt 19 byte hossz=18
p = sajat::unique(test2, test2+18);
*p = '#';
if (memcmp(test2, "s\0zia C+ + !#", 13) != 0) {
cout << "*** Hibas unique: \\0 végjelet keres, vagy nem jó visszatérési értéket ad. ***" << endl;
memtrace::mem_dump(&test2, 19);
}
#endif // CPORTA
#ifndef CPORTA
cout << "Addig olvasunk, amig hibas szam nem jon:" << endl;
#endif // CPORTA
int base = 9; /// ebben a számrendszerben várjuk az első sort
#ifndef CPORTA
cout << "Szamot varunk (base: " << base << "):";
#endif // CPORTA
char buf1[SORHOSSZ];
while (cin.getline(buf1, SORHOSSZ)) { /// amíg van adat
char buf2[SORHOSSZ];
buf2[0] = 0;
#ifndef CPORTA
cout << "Tetszoleges szoveget varunk: ";
#endif // CPORTA
if (!cin.getline(buf2, SORHOSSZ))
break; /// váratlanul fáj vége jött
str = sajat::strcat(buf1, buf2); /// két soronként összefűzzük az inputot
#ifndef CPORTA
cout << "A ket sor osszefuzve: ";
#endif // CPORTA
cout << str << endl; /// kiírjuk
#ifndef CPORTA
cout << "Unique utan:";
#endif // CPORTA
p = sajat::unique(str, str+strlen(str));
*p = 0;
cout << str << endl;
delete[] str; /// nem kell tovább a string
#ifndef CPORTA
cout << "A beolvasott szam atalakitva: ";
#endif // CPORTA
int val = sajat::atoi(buf1, base); /// átalakítás base rendszerből
cout << val << endl; /// kiírjuk
base = val % 9 + 2; /// ebben a számrendszerben várjuk legközelebb
#ifndef CPORTA
cout << "Szamot varunk (base: " << base << "):";
#endif // CPORTA
}
cout << "Nem dobott kivetelt!" << endl;
} catch (const char *p) {
cout << "const char* kivetel jott: " << p << endl;
} catch (...) {
cout << "Baj van: Nem vart kivetel jott" << endl;
}
return 0;
}
/**
* Ellenőrizzük, hogy valóban készített-e max sablont:
* Specializáljuk, ha tudjuk, akkor tényleg sablon.
*/
namespace sajat {
template<>
bool max(bool a, bool b) { return 0;} /// Nem használjuk, csak trükk:
/// Ha itt fordítási hibát kap, akkor nem sablonnal oldotta meg a max függvényt!
}
/**
* SZORGALMI FELADAT:
*
* megoldásához definiája a SZORGALMI makrót.
*
* Az ekezetes_io() függvény egy lehetőséget mutat az ékezetes karakterek C++ kódból való kiírására/kezelésére.
* Elemezze, értse meg a kódrészletet.
* A karakterkódolás gyötrelmeit jól összefoglalja Czirkos Zoltán anyaga:
* https://infoc.eet.bme.hu/karakterkodolas/
*
* Egy magyar nyelvűre állított Windows általában Windows-1250 karakterkódolást használ,
* ami lényegében megfelel a Latin-2 kódolásnak.
* Annak ellenére, hogy az UTF-8 széles körben támogatott, a pár soros programokban, akár még a
* házi feladatokban is a sztringek kezeléséhez a Latin-2 kódolás használatát javaslom,
* mert 1 betűt mindig 1 karakteren kódol, így a tároláshoz szükséges bájtok száma megegyezik
* a betűk számával.
* Bonyolultabb, valós használatra készült programokban pedig el kell rejteni a kódolás részleteit
* megfelelő osztályok használatával.
*
* Egy szövegfájl kódolásának megváltoztatására számos módszer van pl:
* 1. Megnyitás notepad++ segítségével, mentés a kívánt kólással
* 2. Konvertálás a CodeBlocks editorában: Edit->File encoding
* 3. iconv konverter használata (https://www.gnu.org/software/libiconv)
*
* A CodeBlocks alapértelmezett kódolási módja a
* Settings -> Editor -> Other settings -> Encoding menüben állítható
*
*/
void ekezetes_io() {
cout << "Árvíztűrő tükörfúrógép" << endl;
cout << "Írj be egy szöveget: ";
char buf1[SORHOSSZ];
cin.getline(buf1, SORHOSSZ);
cout << "Ezt írtad: " << buf1 << endl;
}
/**
* A futtató környezetnek megfelelő alapértelmezett nyelvi környezetet állít be
* WinX esetén kódlapot is állít
*/
void setDefLang() {
/// Operációs rendszer szinten alapértelmezett nyelvi környezet beállítása.
char *p = setlocale(LC_ALL, "");
/// Ha ennek a fájlnak a karakterkódolása nem egyezik meg az alapértelmezett kódolással,
/// akkor az ékezetes kiírások nem jól látszanak.
/// Alapértelmezett kódolásra váltás CodeBlocks-ban: Edit->File encoding -> System default
#if WINX
if (strstr(p, ".1250") != NULL) { /// Windows-1250-es kódolást használ.
SetConsoleCP(1250);
SetConsoleOutputCP(1250);
} else { /// esetleg UTF-8 ?
SetConsoleCP(65001);
SetConsoleOutputCP(65001);
}
#endif
cout << "\nA beállított nyelvi környezet: " << p << endl;
}
/**
* \file nem_oo_teszt_ekezetes.cpp
* (UTF-8 kodolasu fajl. Allitsa at a megjenetes kodolasat,
* ha a tovabbi kommentek nem olvashatok helyesen!)
*
* A C++ nem OO bővítéseinek gyakorlásához.
*
* FELADATOK:
* 1. Valósítsa meg a nem_oo.h állományban deklarált függvényeket!
* 2. Valósítson meg a max.hpp fájlban, a Sajat névtéren belül egy olyan sablont, ami
* alaptípusok esetén a paraméterként kapott érték közül a nagyobbat adja.
* 3. Specializálja a sablont a nem_oo.h állományban deklarált Komplex típusra
* úgy hogy a nagyobb abszolút értékű Komplex számot adja vissza!
* 4. Ellenőrizze a megvalósított függvények és sablonok működését az alábbi
* tesztprogrammal! Értse meg a tesztprogramot! Segít a hibakeresésben!
* Most nem használjuk a gtest_lite makrókat, csupán egy-két programozott
* ellenőrzést végzünk. A kiírások helyességét Önnek kell ellenőriznie!
* (Ugye mennyivel macerásabb, mint programozottan ellenőrizni?)
* 5. Szorgalmi feladat, ld. a fájl végén
*
*/
#include <iostream>
#include <cstring>
#include <locale>
// Segédmakró, hogy windows-e
#define WINX defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
// Ha Windows, akkor a karakterkészlet állítás miatt (szorgalmi feladatban) kell a windows.h
#if WINX
#include <windows.h>
#endif // WINX
#include "nem_oo.h"
#include "max.hpp"
#define SORHOSSZ 1000
using std::cout;
using std::cin;
using std::endl;
void ekezetes();
/* Ezt a tesztprogramot futtatja a JPORTA úgy, hogy a CPORTA definiált
* Fordítsa le úgy is a programot és futtassa. */
//#define CPORTA
/* A szorgalmi feladathoz definiálja a SZORGALMI makrót */
//#define SZORGALMI
int main() {
#ifndef CPORTA
void setDefLang();/// alapértelmezett nyelvi környezet beállítása
setDefLang();
#endif
#if !defined(CPORTA) && defined(SZORGALMI)
ekezetes_io(); /// szorgalmi feladat függvénye, JPORTA-n nem futtatjuk
#endif
try { /// Minden egy nagy try-catch blokkban van a tesztelés miatt.
#ifndef CPORTA
cout << "\nSaját atoi próba.\n\"100\" 10-es, 8-as, és 2-es számrendszerben:" << endl;
#endif // CPORTA
cout << sajat::atoi("100") << endl; /// KIÍRÁS: 10-es számrendszerben: 100
cout << sajat::atoi("100", 8) << endl; /// KIÍRÁS: 8-asban: 64
cout << sajat::atoi("100", 2) << endl; /// KIÍRÁS: 2-esben: 4
/// kipróbáljuk az strcat-ot:
#ifndef CPORTA
cout << "\nSaját strcat próba:" << endl;
#endif // CPORTA
char *str = sajat::strcat("Ez egy mondat.", " Ez kicsit hosszabb mondat.\n");
cout << str; /// KIÍRÁS: Ez egy mondat. Ez kicsit hosszabb mondat.
delete[] str; /// Nekünk kell felszabadítani!
/// kipróbáljuk a max-ot
#ifndef CPORTA
cout << "\nSaját max próba:" << endl;
#endif // CPORTA
int i1 = 10;
int i2 = 200;
#ifndef CPORTA
cout << "max(" << i1 << ", " << i1 <<")= "; /// KIÍRÁS: max(10, 200)=
#endif // CPORTA
cout << sajat::max(i1, i2) << endl; /// KIÍRÁS: 200
double d1 = 123.5;
double d2 = -34.4;
#ifndef CPORTA
cout << "max(" << d1 << ", " << d2 <<")= "; /// KIÍRÁS: max(123.5, -34.4)=
#endif // CPORTA
cout << sajat::max(d1, d2) << endl; /// KIÍRÁS: 123.5
sajat::Komplex k1 = { 1, -3};
sajat::Komplex k2 = { -40, 100 };
#ifndef CPORTA
cout << "max(" << k1 << ", " << k2 <<")= "; /// KIÍRÁS: max((1,-3j), (-40,100j))=
#endif // CPORTA
cout << sajat::max(k1, k2) << endl;/// KIÍRÁS: (-40,100j)
/// kipróbáljuk a unique-ot
char test[] = "ssszia C+++++ + !"; /// sok ismétlődő kar.
#ifndef CPORTA
cout << "\ntest tömb tartalma a uniq hívása elõtt\n";
memtrace::mem_dump(&test, sizeof(test));
#endif // CPORTA
cout << test << endl;
char *p = sajat::unique(test, test+strlen(test));
#ifndef CPORTA
cout << "\nuniq hívása után p: " << (void*)p << endl;
memtrace::mem_dump(&test, sizeof(test)); /// Segít megfigyelni a memóriatartalmat
#endif // CPORTA
*p = 0; /// p az új sorozat végére mutat
cout << test << endl;; /// KIÍRÁS: szia C+ + !
#ifndef CPORTA
if (strcmp(test, "szia C+ + !") != 0)
cout << "*** Hibás a unique ****" << endl;
if (p != test + 11)
cout << "*** Hibás unique: nem jó a visszatérési érték ***" << endl;
char test2[19] = "sss\0zia C+++++ + !"; /// lezáró nullával együtt 19 byte hossz=18
p = sajat::unique(test2, test2+18);
*p = '#';
if (memcmp(test2, "s\0zia C+ + !#", 13) != 0) {
cout << "*** Hibás unique: \\0 végjelet keres, vagy nem jó visszatérési értéket ad. ***" << endl;
memtrace::mem_dump(&test2, 19);
}
#endif // CPORTA
#ifndef CPORTA
cout << "Addig olvasunk, amíg hibás szám nem jön:" << endl;
#endif // CPORTA
int base = 9; /// ebben a számrendszerben várjuk az első sort
#ifndef CPORTA
cout << "Számot várunk (base: " << base << "):";
#endif // CPORTA
char buf1[SORHOSSZ];
while (cin.getline(buf1, SORHOSSZ)) { /// amíg van adat
char buf2[SORHOSSZ];
buf2[0] = 0;
#ifndef CPORTA
cout << "Tetszőleges szöveget várunk: ";
#endif // CPORTA
if (!cin.getline(buf2, SORHOSSZ))
break; /// váratlanul fáj vége jött
str = sajat::strcat(buf1, buf2); /// két soronként összefűzzük az inputot
#ifndef CPORTA
cout << "A két sor összefűzve: ";
#endif // CPORTA
cout << str << endl; /// kiírjuk
#ifndef CPORTA
cout << "Unique után:";
#endif // CPORTA
p = sajat::unique(str, str+strlen(str));
*p = 0;
cout << str << endl;
delete[] str; /// nem kell tovább a string
#ifndef CPORTA
cout << "A beolvasott szám átalakítva: ";
#endif // CPORTA
int val = sajat::atoi(buf1, base); /// átalakítás base rendszerből
cout << val << endl; /// kiírjuk
base = val % 9 + 2; /// ebben a számrendszerben várjuk legközelebb
#ifndef CPORTA
cout << "Számot várunk (base: " << base << "):";
#endif // CPORTA
}
cout << "Nem dobott kivételt!" << endl;
} catch (const char *p) {
cout << "const char* kivétel jött: " << p << endl;
} catch (...) {
cout << "Baj van: Nem várt kivétel jött" << endl;
}
return 0;
}
/**
* Ellenőrizzük, hogy valóban készített-e max sablont:
* Specializáljuk, ha tudjuk, akkor tényleg sablon.
*/
namespace sajat {
template<>
bool max(bool a, bool b) { return 0;} /// Nem használjuk, csak trükk:
/// Ha itt fordítási hibát kap, akkor nem sablonnal oldotta meg a max függvényt!
}
/**
* SZORGALMI FELADAT:
*
* megoldásához definiája a SZORGALMI makrót.
*
* Az ekezetes_io() függvény egy lehetőséget mutat az ékezetes karakterek C++ kódból való kiírására/kezelésére.
* Elemezze, értse meg a kódrészletet.
* A karakterkódolás gyötrelmeit jól összefoglalja Czirkos Zoltán anyaga:
* https://infoc.eet.bme.hu/karakterkodolas/
*
* Egy magyar nyelvűre állított Windows általában Windows-1250 karakterkódolást használ,
* ami lényegében megfelel a Latin-2 kódolásnak.
* Annak ellenére, hogy az UTF-8 széles körben támogatott, a pár soros programokban, akár még a
* házi feladatokban is a sztringek kezeléséhez a Latin-2 kódolás használatát javaslom,
* mert 1 betűt mindig 1 karakteren kódol, így a tároláshoz szükséges bájtok száma megegyezik
* a betűk számával.
* Bonyolultabb, valós használatra készült programokban pedig el kell rejteni a kódolás részleteit
* megfelelő osztályok használatával.
*
* Egy szövegfájl kódolásának megváltoztatására számos módszer van pl:
* 1. Megnyitás notepad++ segítségével, mentés a kívánt kólással
* 2. Konvertálás a CodeBlocks editorában: Edit->File encoding
* 3. iconv konverter használata (https://www.gnu.org/software/libiconv)
*
* A CodeBlocks alapértelmezett kódolási módja a
* Settings -> Editor -> Other settings -> Encoding menüben állítható
*
*/
void ekezetes_io() {
cout << "Árvíztűrő tükörfúrógép" << endl;
cout << "Írj be egy szöveget: ";
char buf1[SORHOSSZ];
cin.getline(buf1, SORHOSSZ);
cout << "Ezt írtad: " << buf1 << endl;
}
/**
* A futtató környezetnek megfelelő alapértelmezett nyelvi környezetet állít be
* WinX esetén kódlapot is állít
*/
void setDefLang() {
/// Operációs rendszer szinten alapértelmezett nyelvi környezet beállítása.
char *p = setlocale(LC_ALL, "");
/// Ha ennek a fájlnak a karakterkódolása nem egyezik meg az alapértelmezett kódolással,
/// akkor az ékezetes kiírások nem jól látszanak.
/// Alapértelmezett kódolásra váltás CodeBlocks-ban: Edit->File encoding -> System default
#if WINX
if (strstr(p, ".1250") != NULL) { /// Windows-1250-es kódolást használ.
SetConsoleCP(1250);
SetConsoleOutputCP(1250);
} else { /// esetleg UTF-8 ?
SetConsoleCP(65001);
SetConsoleOutputCP(65001);
}
#endif
cout << "\nA beállított nyelvi környezet: " << p << 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