Commit 73cd2481 by Szeberényi Imre

v0

parents
2. előadás példái
=================
Katalógusok:
------------
template:
- Sablonos példák egybegyúrva
- A USE_STRCOL és a MAX_SEC makrókkal szabályozható, hogy melyik változat legyen (ld. kommentek).
predicate:
- Predikátumos példák kiegészítve
fordit:
- Egész számokat olvas fájl végéig, illetve amíg egész szám jön, majd fordított sorrendben kiírja.
- egyszerű listaépítés példa
mem_allic:
- Memória allokációs hiba kezelését bemutató példa
Letöltés:
- Git klienssel
- Download gombbal (zip, tar, ... formátumban)
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="fordit" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/fordit" 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/fordit" 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="fordit_main.cpp" />
<Unit filename="szimpla_lanc.h" />
<Unit filename="szinpla_lanc.cpp" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
/**
* \file frodit_main.cpp
*
* Egész számokat olvas fájl végéig, illetve amíg egész szám jön,
* majd fordított sorrendben kiírja.
*/
#include <iostream>
#include "szimpla_lanc.h"
using std::cout;
using std::cin;
using std::endl;
int main() {
int i;
Lanc_elem* kezdo = NULL; // üres a lista
while (cin >> i) { // addig olvas amíg jön szám
kezdo = lanc_epit(kezdo, i);
}
cout << "Adatok forditott sorrendben:" << endl;
lanc_kiir(cout, kezdo); cout << endl;
cout << "Adatok forditott sorrendben inserterrel:" << endl;
cout << *kezdo << endl;
lanc_felszabadit(kezdo);
return 0;
}
#ifndef _SZIMPLA_LANC_H
#define _SZIMPLA_LANC_H
/**
* \file szimla_lanc.h
*
* Egyszerű, egész elemeket tartalmazó láncolt lista definiciói
* Nincs strázsa
*/
#include <iostream>
/**
* Lánc elem struktúra
*/
struct Lanc_elem {
int adat; // adat
Lanc_elem* kov; // C++-ban a struktúra név típussá vált
};
/**
* lanc_epit - láncolt lista elejére fűzi az új adatot
* @param p - lista elejére mutató pointer
* @param i - új adat
* @return lista új eleje
*/
Lanc_elem* lanc_epit(Lanc_elem* p, int i);
/**
* lanc_kiir - láncolt lista elemeit (adatait) stream-re írja
* @param os - output stream
* @param p - lista elejére mutató pointer
*/
void lanc_kiir(std::ostream& os, const Lanc_elem* p);
/**
* lanc_felszabadít - láncolt lista elemeit felszabadítja
* @param os - output stream
* @param p - lista elejére mutató pointer
*/
void lanc_felszabadit(Lanc_elem* p);
/**
* inserter a listához.
* @param os - output stream
* @param p - lista elejére mutató pointer
*/
std::ostream& operator<<(std::ostream& os, const Lanc_elem& l);
#endif // _SZIMPLA_LANC_H
/**
* \file szimla_lanc.cpp
*
* Egyszerű, egész elemeket tartalmazó láncolt lista megvalósítása
* Nincs strázsa
*/
#include "szimpla_lanc.h"
/**
* lanc_epit - láncolt lista elejére fűzi az új adatot
* @param p - lista elejére mutató pointer
* @param i - új adat
* @return lista új eleje
*/
Lanc_elem* lanc_epit(Lanc_elem* p, int a) {
Lanc_elem *uj = new Lanc_elem;
uj->adat = a;
uj->kov = p;
return uj;
}
/**
* lanc_kiir - láncolt lista elemeit (adatait) stream-re írja
* @param os - output stream
* @param p - lista elejére mutató pointer
*/
void lanc_kiir(std::ostream& os, const Lanc_elem* p) {
while (p != NULL) {
os << p->adat << ' ';
p = p->kov;
}
}
/**
* lanc_felszabadít - láncolt lista elemeit felszabadítja
* @param os - output stream
* @param p - lista elejére mutató pointer
*/
void lanc_felszabadit(Lanc_elem *p) {
while (p != NULL) {
Lanc_elem *tmp = p->kov;
delete p;
p = tmp;
}
}
/**
* inserter a listához.
* @param os - output stream
* @param p - lista elejére mutató pointer
*/
std::ostream& operator<<(std::ostream& os, const Lanc_elem& l) {
lanc_kiir(os, &l);
return os;
}
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="mem_alloc" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/mem_alloc" 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/mem_alloc" 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="mem_alloc.cpp" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
/*
* Kivetelkezeles proba a memoriafoglalashoz.
* Forditas:
* g++ -static mem_alloc.cpp -o mem_alloc
* a mem_hendler vltozathoz:
* g++ -static -DHANDLER mem_alloc.cpp -o mem_alloc
* a NULL pointeres vltozathoz (nem dob kivtelt)
* g++ -static -DNOTHROW mem_alloc.cpp -o mem_alloc
* Futattas:
* (ulimit -d 24; ./mem_alloc; )
*
* Windows XP alatt nem erdemes kiprobalni,
* mert felzabalja a teljes memoriat, s lelassul a rendsszer!
* win 8.1 alatt megy.
* win 7 alatt: ?
*
*/
#include <iostream>
#include <cstdlib>
using std::cerr;
using std::endl;
void outOfMem() {
cerr << "Nagy a baj" << endl;
exit(1);
}
int main() {
#ifdef HANDLER
std::set_new_handler(outOfMem);
#endif
long db = 0;
try {
while(true) {
#ifndef NOTHROW
double *p = new double[1022]; // ez kb 8Kb az uaral2-n
#else
double *p = new (std::nothrow) double[1022]; // ez kb 8Kb az uaral2-n
if (p == NULL) break;
#endif
db++;
}
} catch (std::bad_alloc) {
cerr << "Gaz van" << endl;
}
cerr << "Ennyi new sikerult:" << db << endl;
return(0);
}
#ifndef _LEG_HPP
#define _LEG_HPP
/**
* \file leg.hpp
*
* második előadás sablonjai
* Sablonokat tartalamazó header fájloknak .hpp kiterjesztést szokás adni.
*/
/**
* legElem függvénysablon
* A paraméterként kapott tömb adott tulajdonságú elemét választja ki
* A tulajdonságot a sel predikátumfüggvény határozza meg.
* A sel(T, T) predikátumtól elvárjuk, hogy logikai környezetben
* kiértékelhető legyen, és működjön a T típusra.
* T-nek kell, hogy legyen másoló konstruktora és működjön az értékadás
*/
template <typename T, typename S>
T legElem(T a[], int n, S sel) {
T tmp = a[0];
for (int i = 1; i < n; ++i)
if (sel(a[i], tmp)) tmp = a[i];
return tmp;
}
/**
* nagyobb_e függvénysablon
* A függvény igaz értéket ad, ha az első paraméter nagyobb mint a második
* A paraméterek között értelmezettnek kell lennie a > operátornak.
* T-nek kell, hogy legyen másoló konstruktora
*/
template <typename T>
bool nagyobb_e(T a, T b) {
return a > b;
}
/**
* kisebb_e függvénysablon
* A függvény igaz értéket ad, ha az első paraméter kisebb mint a második
* A paraméterek között értelmezettnek kell lennie a < operátornak.
* T-nek kell, hogy legyen másoló konstruktora
*/
template <typename T>
bool kisebb_e(T a, T b) {
return a < b;
}
#endif // _LEG_HPP
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="predicate" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/predicate" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-std=c++11" />
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/predicate" 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" />
</Compiler>
<Unit filename="leg.hpp" />
<Unit filename="predicate.cpp" />
<Unit filename="printm.h" />
<Extensions>
<DoxyBlocks>
<comment_style block="0" line="0" />
<doxyfile_project />
<doxyfile_build />
<doxyfile_warnings />
<doxyfile_output />
<doxyfile_dot />
<general />
</DoxyBlocks>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
/**
* \file predicate.cpp
*
* Első előadás predikátumos példája kiegészítve
*/
#include <iostream>
#include <iomanip>
#include "printm.h"
#include "leg.hpp"
using std::cout;
using std::endl;
int main() {
__(int it[] = { 1, 3, 4, 80, -21 });
_(cout << legElem(it, 5, nagyobb_e<int>) << endl);
_(cout << legElem(it, 5, kisebb_e<int>) << endl);
___
__(double dt[] = { 9.0, 3.4, 55.4, 9.80, -223.10 });
_(cout << legElem(dt, 5, nagyobb_e<double>) << endl);
_(cout << legElem(dt, 5, kisebb_e<double>) << endl);
}
#ifndef _PRINTM_H
#define _PRINTM_H
/**
* \file printm.h
*
* Kiírást segítő makrók
*/
/**
* Kicsit trükkös makró ami végrehajtás előtt kiírja a paramétereit.
* A végrehajtott kód eredményét C kommentként jeleníti meg.
* mellékhatás: tartósan balra igazítást állít.
*/
#define _(...) std::cout << std::setiosflags(std::ios::left) << std::setw(50) << \
#__VA_ARGS__";" << "// "; __VA_ARGS__
/**
* _() hívása után soremelést ír;
*/
#define __(...) _(__VA_ARGS__); std::cout << std::endl;
/**
* soremelést ír;
*/
#define ___ std::cout << std::endl;
#endif // _PRINTM_H
#ifndef _PRINTM_H
#define _PRINTM_H
/**
* \file printm.h
*
* Kiírást segítő makrók
*/
/**
* Kicsit trükkös makró ami végrehajtás előtt kiírja a paramétereit.
* A végrehajtott kód eredményét C kommentként jeleníti meg.
*
* mellékhatás: tartósan balra igazítást állít.
*/
#define _(...) std::cout << std::setiosflags(std::ios::left) << std::setw(50) << \
#__VA_ARGS__";" << "// "; __VA_ARGS__
/**
* _() hívása után soremelést ír;
*/
#define __(...) _(__VA_ARGS__); std::cout << std::endl;
/**
* soremelést ír;
*/
#define ___ std::cout << std::endl;
#endif // _PRINTM_H
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="template" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/template" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-pedantic" />
<Add option="-Wfatal-errors" />
<Add option="-Wall" />
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/template" 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="-std=c++11" />
<Add option="-Wall" />
<Add option="-fexceptions" />
</Compiler>
<Unit filename="printm.h" />
<Unit filename="template.cpp" />
<Unit filename="template.hpp" />
<Extensions>
<DoxyBlocks>
<comment_style block="0" line="0" />
<doxyfile_project />
<doxyfile_build />
<doxyfile_warnings />
<doxyfile_output />
<doxyfile_dot />
<general />
</DoxyBlocks>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
/**
* \file template.cpp
*
* Els elads sablonos pldi egybegyrva
*
* A USE_STRCOL s a MAX_SEC makrkkal szablyozhat, hogy
* melyik vltozat legyen (ld. kommentek).
*/
#include <iostream>
#include <iomanip>
#include <cstring>
#include <locale>
// Segdmakr, hogy windows-e
#define WINX defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
// Ha Windows, akkor a karakterkszlet llts miatt kell a windows.h
#if WINX
#include <windows.h>
#endif // WINX
#include "printm.h"
#include "template.hpp"
using std::cout;
using std::endl;
// Ezzel a makrval szablyozhat, hogy legyen-e specializci const char*-ra.
//#define MAX_SPEC
// Ezzel a makrval szablyozhat, hogy strcoll-t, vagy strcmp-t hasznljon.
#define USE_STRCOLL
#ifdef MAX_SPEC
template <>
const char* max(const char* a, const char* b) {
#ifdef USE_STRCOLL
return strcoll(a, b) < 0 ? b : a;
#else
return strcmp(a, b) < 0 ? b : a;
#endif
}
#endif
bool strLess(const char *s1, const char *s2) {
#ifdef USE_STRCOLL
return strcoll(s1, s2) < 0;
#else
return strcmp(s1, s2) < 0;
#endif
}
int main() {
setlocale(LC_ALL, ""); // remlhetleg a nyelvi alapbellts hu_HU.UTF-8
#if WINX
SetConsoleCP(1250); // winx-en ez is kell
SetConsoleOutputCP(1250);
#endif
#ifdef MAX_SPEC
cout << "max-ot specializaljuk const char *-ra" << endl;
#else
cout << "Nincs specializci" << endl;
#endif // MAX_SPEC
#ifdef USE_STRCOLL
cout << "strcoll-t hasznlunk" << endl;
#else
cout << "strcmp-t hasznlunk" << endl;
#endif // USE_STRCOLL
_(cout << max<long>(2, 10) << endl);
_(cout << max<double>(1, 3.14) << endl);
_(cout << max(40, 50) << endl);
_(cout << max("alma", "korte", strLess) << endl);
_(cout << max("alma", "korte") << endl);
_(cout << max("dm", "Bla") << endl);
_(cout << max("dm", "Bla", strLess) << endl);
}
#ifndef _TEMPLATE_HPP
#define _TEMPLATE_HPP
/**
* \file template.hpp
*
* második előadás sablonjai
* Sablonokat tartalamazó header fájloknak .hpp kiterjesztést szokás adni.
*/
/**
* max függvénysablon
* Két paraméter közül a nagyobbat adja
* A paraméterek között értelmezettnek kell lennie a < operátornak.
* T-nek kell, hogy legyen másoló konstruktora.
*/
template <typename T>
T max(T a, T b) {
return a < b ? b : a;
}
/**
* max függvénysablon (túlterhelt változat)
* Két paraméter közül a nagyobbat adja
* A paramétereket a két paraméteres cmp függvénnyel hasonlítja össze.
* A cmp(T, T) predikátumtól elvárjuk, hogy logikai környezetben
* kiértékelhető legyen, és működjön a T típusra.
* T-nek kell, hogy legyen másoló konstruktora.
*/
template <typename T, typename C>
T max(T a, T b, C cmp) {
return cmp(a, b) ? b : a;
}
#endif // _TEMPLATE_HPP
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