Kategori C

Überladen von Operatoren

Freitag, Februar 8th, 2008

Bei meinen Prüfungsvorbereitungen bin ich auf ein c++ Kapitalmittel gestoßen, dass ich noch nie zuvor gesehen habe. Mann braucht ein paar Minuten um es erst mal zu verstehen was dort geschieht. Aber beim zweiten hinsehen versteht man, was man mit der Methode bool operator == (const Uvo& op2) const; machen kann.

#include <iostream>

using namespace std;

//Überladen Von Operatoren
class Uvo
{
public:
    int wert1, wert2;
    Uvo();
    bool operator == (const Uvo& op2) const;
};

Uvo::Uvo()
{
    wert1 = wert2 = 0;
}

bool Uvo::operator == (const Uvo& op2) const
{
    if(wert1 == op2.wert1 && wert2 == op2.wert2)
         return true;
    return false;
}

int main()
{
    Uvo *oop1 = new Uvo();
    Uvo *oop2 = new Uvo();

    oop1->wert1 = 10;
    oop1->wert2 = 20;

    if (*oop1 == *oop2)
        cout << "Die Werte sind gleich\n";
    else
        cout << "Die Werte sind unterschiedlich\n";

    oop2->wert1 = 10;
    oop2->wert2 = 20;

    if (*oop1 == *oop2)
        cout << "Die Werte sind gleich\n";
    else
        cout << "Die Werte sind unterschiedlich\n";

    return 0;
}

Quelle: cpp-tutor.de

GIP 11

Montag, Dezember 17th, 2007
#include 

using namespace std;

void datumEinlesen(short &tag, short &monat, short &jahr);

short codewertMonat(short monat, short jahr);

bool schaltjahr(short jahr);

string ermittleWochentag(short ergebnis);


int main(void)
{
	short tag, monat, jahr;
	double ret;

	datumEinlesen( tag, monat, jahr );

	ret = jahr + (int)(jahr / 4);
		
	ret = ret + codewertMonat( monat, jahr ) + tag;
	ret = (int)ret%7;

	cout << "Dieser Tag war ein " << ermittleWochentag(ret) << endl << endl;

	return 0;
}

void datumEinlesen(short &tag, short &monat, short &jahr)
{
	int tage[] = { 	31, 28, 31, 30, 31, 30, 
					31, 31, 30, 31, 30, 31 };
	if( schaltjahr(jahr) )
	{
		tage[1] = tage[1] + 1;
	}

	do 
	{
		cout << "Datum eingeben:\nTag   = ? ";
		cin >> tag;
	
		cout << "Monat = ? ";
		cin >> monat;
	
		cout << "Jahr  = ? ";
		cin >> jahr;

		if(jahr <= 99 && jahr >= 1)
			if( monat <= 12 && monat >= 1 )	
				if(tag <= tage[monat - 1] && tag >= 1)
					break;
	} 
	while(true);		
}

short codewertMonat(short monat, short jahr)
{
	// Codewert des Monats 
	// Juni                0 Mai                     4
	// September, Dezember 1 August                  5
	// April, Juli         2 Februar, März, November 6
	// Januar, Oktober     3
	int cwm[] = {3,6,6,2,4,0,2,5,1,3,6,1};
	
	if( schaltjahr(jahr) )
	{
		cwm[0] = cwm[0] -1;
		cwm[1] = cwm[1] -1;
	}
	 
	return cwm[monat - 1];
}

bool schaltjahr(short jahr)
{
	if(jahr%4 == 0 && jahr%100 != 0)
	{
		return true;
	}
	return false;
}

string ermittleWochentag(short ergebnis)
{
	// Donnerstag 0
	// Freitag    1
	// Samstag    2
	// Sonntag    3
	// Montag     4
	// Dienstag   5
	// Mittwoch   6

	string wochentag[] = {	"Donnerstag", "Freitag", "Samstag", "Sonntag", 
						 	"Montag", "Dienstag", "Mittwoch" };
	return wochentag[ergebnis];
}

GIP 10

Montag, Dezember 10th, 2007
#include 

using namespace std;

const int anfangsbestand = 13;

int rehe_i(int jahr)
{
	int reh = anfangsbestand;

	for(int i=1; i <= jahr ; i++)
	{
		cout << reh << " -> ";

		reh = ((reh * 3) - 10);
		if(reh > 40)
			reh = reh - (reh * 0.6);

		cout << reh << endl;
	}

	return reh;
}

int rehe_r(int jahr, int reh=anfangsbestand)
{
	cout << reh << " -> ";
	
	reh = ((reh * 3) - 10);
	if(reh > 40)
		reh = (reh - (reh * 0.6));

	cout << reh << endl;

	if(jahr <= 1)
		return reh;
	return rehe_r(--jahr, reh);
}


int main ()
{
	cout << "Iterativ: Ende des 3. Jahres: " << rehe_i(3) << " Rehe\n";
	cout << "Rekursiv: Ende des 3. Jahres: " << rehe_r(3) << " Rehe\n";
	return 0;
}

GIP 9

Montag, Dezember 3rd, 2007
#include 
#include 

using namespace std;

int power_of(int basis, int exponent=2)
{
	long int retur = basis; 

	if(basis == 0)
		return false;
	
	for( int i=1; i <= exponent; i++ )
		retur = retur * basis;

	return retur;
}

int biner(int zahl)
{
	const short binerstellen = 8;
	int max = power_of( 2, binerstellen );
	//cout << max << endl;	
	long int bin = 0;

	for( int i=binerstellen; i>=0; i-- )
	{
		if(zahl >= max)
		{
			bin = bin + power_of(10, i);			
		}
		cout << bin << " -> " << i << endl;
		
		max = max / 2;
	}
	return bin;
}

int oktal(int zahl)
{
	//string oktalziffer[8]={"0","1","2","3","4","5","6","7"};
	return 0;	
}

int main(void)
{
	int zahl;

	cout << "Dezimalzahl = ? ";
	cin >> zahl;
	cout << "Umrechnung einer ganzzahligen, positiven Dezimalzahl in" << endl << 
			"- eine Dualzahl nach der Potenzenmethode : Dualzahl    = " << biner(zahl) << endl <<
			"- eine Oktalzahl nach der Restwertmethode: Oktalzahl   = " << oktal(zahl) << endl;
	return 0;
}

GIP 8

Mittwoch, November 28th, 2007
#include 
#include 

using namespace std;

void zahlen(short int z, string &zt);

int main()
{
    short int zahl;
    string zahlentext;

    while(true)
	{
    	cout << "Zahl = ? ";
        cin >> zahl;
        zahlen(zahl, zahlentext);
        cout << zahl << " = " << zahlentext << endl;
	}
    return 0;
}

void zahlen(short z, string &zt)
{
     string einer[9] = {"ein", "zwei", "drei",
                        "vier", "fuenf",
                        "sechs", "sieben",
                        "acht", "neun"};
     string zehner [2] = {"zwanzig", "dreissig"};
     if(z== 20)
          zt = zehner[0];
     else if(z==30)
          zt = zehner[1];
     else if(z>=21 && z<=39)
          zt = einer[(z%10)-1] + "und" + zehner[(z/10)-2];
     else
          zt = "unbekannt";
     //return zt;
}