Program je rozdelený do tried kalkulacka, menu, parsing, vypocet, opakovat.
Dám sem samotné súbory:
menu.h
Kód:
#ifndef _MENU_H
#define _MENU_H
#include <iostream>
#include <cstdarg>
#include <cstdlib>
using namespace std;
/* Vytvorí menu */
class menu {
public:
/** Vytvorí menu na základe počtu poloiek menu a samotných poloek
* @param počet poloiek, poloky typu string
* @return void
*/
void mojeMenu(const int pocetArgumentov, ...);
/** Vyberie číslo poloky a vráti ho
* @param počet poloiek
* @return číslo poloky
*/
int vyberZMenu(const int pocetPoloziek);
menu();
~menu();
private:
};
#endif /* _MENU_H */
menu.cpp
Kód:
#include "menu.h"
menu::menu() {}
menu::~menu() {}
void menu::mojeMenu(const int pocetArgumentov, ...)
{
int i = -1;
char *polozka;
va_list argumenty;
polozka = (char *) malloc(50);
va_start(argumenty, pocetArgumentov);
while((++i) ^ pocetArgumentov) {
polozka = va_arg(argumenty, char*);
cout << i + 1 << ". " << polozka << endl;
}
va_end(argumenty);
}
int menu::vyberZMenu(const int pocetPoloziek)
{
int volba;
bool spravne = true;
while (spravne) {
cout << endl << "Vaa vožba: ";
cin >> volba;
spravne = (volba > 0 && volba <= pocetPoloziek) ? false : true;
if (spravne)
cout << "Výber mimo rozsah!" << endl;
}
return volba;
}
parsing.h
Kód:
#ifndef PARSING_H
#define PARSING_H
#include <iostream>
#include <sstream>
#include <cassert>
//#define TESTY // pri zakomentovaní budú testy odstavené
using namespace std;
class prevody
{
public:
/** Zmení zadaný string na float a vráti ho
* @param číslo zadané ako string
* @return float
*/
float stringToFloat(string cislo);
prevody();
~prevody();
protected:
private:
};
#endif // PARSING_H
parsing.cpp
Kód:
#include "parsing.h"
prevody::prevody() {}
prevody::~prevody() {}
float prevody::stringToFloat(string cislo)
{
float a;
stringstream *stream = 0;
char c;
do {
delete stream;
stream = new stringstream(cislo);
*stream >> a;
} while(stream->fail() || stream->get(c));
delete stream;
return a;
}
#ifdef TESTY
#define TESTY
int main(void)
{
prevody _prevody;
string cislo = "1235456";
//cislo = "123";
assert(_prevody.stringToFloat("123654.1526"));
assert(_prevody.stringToFloat(cislo));
cout << "Testy presli\n";
return 0;
}
#endif // TESTY
vypocet.h
Kód:
#ifndef _VYPOCET_H
#define _VYPOCET_H
#include <iostream>
using namespace std;
/** vypočíta matematickú oparácie */
class vypocet {
public:
/** Vypočíta zadanú matematickú operáciu a vráti výsledok
* @param poradové číslo oparácie
* @param dve čísla typu float na výpočet
* @retrn float
*/
float vypocitaj(const int operacia, const float a, const float b);
vypocet();
~vypocet();
private:
};
#endif /* _VYPOCET_H */
vypocet.cpp
Kód:
#include "vypocet.h"
vypocet::vypocet() {}
vypocet::~vypocet() {}
float vypocet::vypocitaj(const int operacia, const float a, const float b)
{
float vysledok = 0;
switch (operacia) {
case 1:
vysledok = a + b;
break;
case 2:
vysledok = a - b;
break;
case 3:
vysledok = a * b;
break;
case 4:
vysledok = a / b;
break;
}
return vysledok;
}
opakovat.h
Kód:
#ifndef _OPAKOVAT_H
#define _OPAKOVAT_H
#include <iostream>
#include <cstdio>
#include <cstdlib>
/** Zabezpečí opakovanie podža vožby uívateža */
class opakovat {
public:
/** Vyzve uívateža či chce opakova, vráti 1 ak chce, inakie 0
* @param void
* @return 1 alebo 0
*/
int znova(void);
opakovat();
~opakovat();
private:
};
#endif /* _OPAKOVAT_H */
opakovat.cpp
Kód:
#include "opakovat.h"
opakovat::opakovat() {}
opakovat::~opakovat() {}
int opakovat::znova(void)
{
char c;
int i = 0;
bool platnaVolba = false;
while (!platnaVolba) {
std::cout << "Ďalí príklad? [a/n]" << std::endl;
while (getchar() != '\n') ;
c = getchar();
while (getchar() != '\n') ;
switch (tolower(c)) {
case 'a':
platnaVolba = true;
i = 0;
break;
case 'n':
std::cout << "Ďakujeme za pouitie kalkulačky." << std::endl;
platnaVolba = true;
i = 1;
break;
default:
std::cout << "Neplatná vožba!" << std::endl;
i = 0;
break;
}
}
return i;
}
kalkulacka.h
Kód:
#ifndef _KALKULACKA_H
#define _KALKULACKA_H
#include "menu.h"
#include "opakovat.h"
#include "vypocet.h"
#include "parsing.h"
/** Spojí všetky postupy do celku */
class kalkulacka {
public:
/** Spojí všetky postupy do celku
* @param void
* @return void
*/
void pocitanie();
kalkulacka();
~kalkulacka();
private:
};
#endif /* _KALKULACKA_H */
kalkulacka.cpp
Kód:
#include "kalkulacka.h"
kalkulacka::kalkulacka() {}
kalkulacka::~kalkulacka() {}
void kalkulacka::pocitanie()
{
menu _menu;
opakovat _opakovat;
vypocet _vypocet;
prevody _prevody;
float prveCislo, druheCislo;
string str;
while (true) {
_menu.mojeMenu(4, "Sčítanie", "Odčítanie", "Násobenie", "Delenie");
int vyber = _menu.vyberZMenu(4);
cout << "Zadajte prve cislo: ";
cin >> str;
prveCislo = _prevody.stringToFloat(str);
cout << "Zadajte druhe cislo: ";
cin >> str;
druheCislo = _prevody.stringToFloat(str);
cout << "výsledok je " << _vypocet.vypocitaj(vyber, prveCislo, druheCislo) << '.' << endl;
if (_opakovat.znova() == 1)
break;
}
}
a nakoniec main.cpp
Kód:
#include "kalkulacka.h"
int main(void)
{
cout << "Vitajte v kalkulačke" << endl << endl;
kalkulacka _kalkulacka;
_kalkulacka.pocitanie();
return 0;
}
_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na
libcosenior@gmail.com. To mám v mobile a stále po ruke.