Code:
#include <permutieren.h>
using namespace std;
#include <string.h>
#include <sstream>
#include <complex.h>
permutieren::permutieren()
{
char pwort[26]={
'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z'};
for (int i = 0; i < 26; i++)
permwort[i] = pwort[i];
}
permutieren::~permutieren(){};
int permutieren::atoint(std::string zawo)
{
int rewer = 0;
std::istringstream b(zawo);
b >> rewer;
return rewer;
}
std::string permutieren::itoa(int number)
{
std::ostringstream buff;
buff << number;
return buff.str();
}
void permutieren::initwort(std::string *wort, std::string *bwort, int zeiza)
{
int slei, sleib;
char numchar[10] = {'0','1','2','3','4','5','6','7','8','9'};
for (slei = 1; slei <= zeiza; slei++)
*wort +=numchar[slei];
for (slei = zeiza; slei >= 1; slei--)
*bwort +=numchar[slei];
}
// Prüft String wort auf vorkommen der Zeichen in String soll, bei nichtübereinstimmung
// Rückgabewert ungleich Null sonst Null;
int permutieren::pruefestring(std::string wort, std::string soll)
{
int slei, sleib, lgeist, lgesoll, rewer;
std::string str1 ="";
std::string str2 = "";
lgeist = wort.length();
lgesoll = soll.length();
for (slei = 0; slei < lgeist; slei++)
{
//cout << endl << "vor slei=" << slei << " ";
if (rewer == lgesoll) break;
for (sleib = 0; sleib < lgesoll; sleib++)
{
str1 = wort.substr(slei, 1);
str2 = soll.substr(sleib, 1);
/// if (wort[slei] != soll[sleib])
if (str1.compare(str2) != 0)
{
++rewer;
//cout << " wort=" << wort[slei] << " soll=" << soll[sleib] << " rewer=" << rewer << endl;
}
else
{
rewer = 0;
//cout << "* wort=" << wort[slei] << " soll=" << soll[sleib] << " rewer=" << rewer << endl;
break;
}
}
//cout << " nach slei=" << slei << " \n";
}
//cout << "E-soll=" << soll<< " wort:" << wort << " rewer: " << rewer << " \n\n";
return rewer;
}
/// untersucht den String ob ein Zeichen mehr als einmal vorkommt
void permutieren::zeichendoppeltest(std::string zahlwort,int *zaehler, int zeiza)
{
int slei, sleib, dummy = 0;
std::string str1 ="";
std::string str2 = "";
//cout << "Zahlwort=" << zahlwort << "\n";
for (slei = 0; slei < zeiza; slei++)
{
for (sleib = slei + 1; sleib < zeiza; sleib++)
{
str1 = zahlwort.substr(slei, 1);
str2 = zahlwort.substr(sleib, 1);
if (str1.compare(str2) == 0)
dummy++;
//cout << "str1=" << str1 << " str2:" << str2 << " dummy: " << dummy << "\n";
}
}
*zaehler = dummy;
//cout << "dummy: " << dummy << "\n";
}
int permutieren::zaehleperm(int zeiza)
{
std::string wort, bwort, zahlwort;
int start, ende, slei, zaehler, nuze, perze;
initwort(&wort, &bwort, zeiza);
start = atoint(wort); //, 10);
ende = atoint(bwort); //, 10);
cout << "\nAnzahl der Elemente.: "<< zeiza << endl << "Start bei Zahl......: "<< start << endl << "Ende bei Zahl.......: " << ende << endl;
cout << "Startzahl als String: " << wort << endl;
cout << "Endezahl als String.: " << bwort << endl << endl;
cout << "start: " << start << endl;
cout << "ende: " << ende << endl << endl;
perze = 0; // zählt die Anzahl der dargestellten Zahlen
// Schleife von 12345 bis über 54321 weil im diesem Beispiel 5 unterschiedliche Zeichen
for (slei = start; slei <= ende; slei++)//ende
{
zahlwort = itoa(slei); // , zahlwort, 10); // wandelt ganze Zahl in String um
zeiza = zahlwort.length(); // strlen(zahlwort); // Stellt fest, wieviele Zeichen die als String dargestellte Zahl hat
zaehler = 0; // zählt, wie oft ein Zeichen im String vorkommt
// untersucht den String ob ein Zeichen mehr als einmal vorkommt
zeichendoppeltest(zahlwort, &zaehler, zeiza);
nuze = 0;
// durchsucht den String nach nicht erlaubten Zeichen
nuze = pruefestring(zahlwort, wort);
//cout << "*Permutation Nr.: " << perze << " = " << zahlwort << " nuze= " << nuze << " zaehler=" << zaehler << " ";
if ((nuze == 0) && (zaehler == 0))
{
perze++;
cout << "Permutation Nr.: " << perze << " = " << zahlwort << " ";
showperms(zahlwort, zeiza);
}
}
return perze;
}
void permutieren::showperms(std::string zahlwort, int zeiza)
{
int slei, sleia, sleib = 0;
std::string zsymbol = "123456789";
std::string str1 ="";
std::string str2 = "";
//char permwort[8] = {'A','B','C','D','E','F','G','H'};
//std::cout << "\n"; //permwort[sleib];
for (slei = 0; slei < zeiza; slei++)
{
for (sleia = 0; sleia < zeiza; sleia++)
{
str1 = zahlwort.substr(slei, 1);
str2 = zsymbol.substr(sleia, 1);
if (str1.compare(str2) == 0)
{
sleib = sleia;
//std::cout << "str1=" << str1 << " str2=" << str2 << " sleib=" << sleib <<"\n"; //permwort[sleib];
break;
}
}
std::cout << permwort[sleib];
}
std::cout << std::endl;
}
and here main.cc
Code:
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
* main.cc
* Copyright (C) 2017 Josef Wismeth, germany, upper palatinate,
*
* permutieren4 is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* permutieren4 is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "permutieren.h"
//using namespace std;
/* In C ist dies die Hauptfunktion */
int main()
{
int wastun = 9, zeiza, perze;
permutieren euler;
do
switch(wastun)
{
default:
std::cout << "Erzeugen von Permutierten Zahlenreihen" << std::endl;
std::cout << "Programm beenden.....................0" << std::endl;
std::cout << "Permutierte Zahlenreihe aufzeigen....1" << std::endl;
std::cout << "Permutierte Letterreihe aufzeigen....2" << std::endl;
std::cout << "Ihre Wahl: ";
std::cin >> wastun;
break;
case 0:
std::cout << "Programm beendet" << std::endl;
return EXIT_SUCCESS;
break;
case 3:
case 1:
if (wastun == 1)
{
std::cout << "Bitte Anzahl der Zahlen(3 bis 8) eingeben: ";
std::cin >> zeiza;
}
if ((zeiza < 3) || (zeiza > 8))
{
std::cout << "Falsche Anzahl von Elementen: "<< zeiza << std::endl;
wastun = 9;
break;
}
perze = euler.zaehleperm(zeiza);
std::cout << "Anzahl der Permutationen: " << zeiza << "! = " << perze << std::endl;
wastun = 9;
break;
case 2:
std::cout << "Bitte Wort (mindestend 3 maximal 8 Buchstaben Laenge) eingeben: ";
std::cin >> euler.permwort;
for (zeiza = 0; zeiza < 26; zeiza++)
if (euler.permwort[zeiza] == '\0'){
std::cout <<"Laenge des Wortes: " << zeiza << std::endl;
break;
}
wastun = 3;
break;
}while(wastun != 0);
return EXIT_SUCCESS;
}
Here a little manual in english: