You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kverbos/kverbos/kverbosuser.cpp

265 lines
7.2 KiB

/***************************************************************************
kverbosuser.cpp - description
-------------------
begin : Tue Dec 18 2001
copyright : (C) 2001 by Arnold Kraschinski
email : arnold.k67@gmx.de
***************************************************************************/
/***************************************************************************
* *
* This program 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 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "kverbosuser.h"
#include <cstdlib>
#include <tqfile.h>
#include <tqdatetime.h>
#include <kstandarddirs.h>
bool eintrag::operator== (const eintrag& e) const
{
return (verb == e.verb);
}
KVerbosUser::KVerbosUser(spanishVerbList* pL, TQString n/*=DEFAULTUSER*/)
: name(n), auswahl(""), sessions(0)
{
// try to read the user-information if there is one.
int pos;
while ((pos = n.find(' ')) != -1)
n.replace(pos, 1, "_");
TQFile file(locateLocal("data", "/kverbos/data/"+name+".kverbos"));
if ( file.open(IO_ReadOnly) )
{
TQString s;
TQTextStream t( &file );
name = t.readLine();
s = t.readLine(); sessions = s.toInt();
for (int i=0; i<MAX_RESULTS; i++)
{
date[i] = t.readLine();
s = t.readLine(); result[i][0] = s.toInt();
s = t.readLine(); result[i][1] = s.toInt();
};
while (!file.atEnd())
{
eintrag e;
e.verb = t.readLine();
s = t.readLine(); e.status = s.toInt();
s = t.readLine(); e.right = s.toInt();
s = t.readLine(); e.wrong = s.toInt();
if (e.status == 1)
e.counter = STAY_IN_R_LIST;
else
e.counter = 0;
e.used = false;
it = liste.find(e);
if (liste.end() == it)
liste.append(e);
};
file.close();
}
else
for (int i=0; i<MAX_RESULTS; i++)
{
date[i] = "";
result[i][0] = result[i][1] = 0;
};
fillList(pL);
it = liste.begin();
sessions = (sessions + 1) & 1073741823;
}
KVerbosUser::~KVerbosUser()
{
}
// used zeigt an, ob dieses Verb in der Verbenliste des Hauptprogrammes vorkommt.
// Hier werden die Verben des Hauptprogrammes bertragen, deshalb bekommen alle Elemente
// used = true. Es k<>nen aus der Benutzerinformation aber schon Verben in der Liste sein,
// die nicht in der Verbendatei des Hauptprogrammes vorkommen. Diese Verben erhalten alle
// used=false am Anfang. Wird ein Verb also in der Liste gefunden, dann muss zur Sicherheiet
// used=true gesetzt werden.
void KVerbosUser::fillList(spanishVerbList* pL)
{
deaktivieren();
for (spanishVerbList::Iterator it2 = pL->begin(); it2 != pL->end(); ++it2)
{
eintrag elem;
elem.verb = (*it2).getSpanish();
elem.right = elem.wrong = elem.counter = elem.status = 0;
elem.used = true;
it = liste.find(elem);
if (liste.end() == it)
liste.append(elem);
else
(*it).used = true;
};
}
// alle Verben werden auf nicht genutzt gesetzt.
void KVerbosUser::deaktivieren()
{
verbenListe::Iterator zeig;
for (zeig=liste.begin(); zeig!=liste.end(); ++zeig)
(*zeig).used = false;
}
// tests if verbs that have status RICHTIGGEMACHT have to get the status UNGELERNT.
// And calculates the kumulus of the verbs that have status UNGELERNT and FEFHLERHAFT.
// Der kumulus ist ein gewichteter Z<>ler fr die Auswahl des Verbes. Fehlerhafte Verben
// haben ein gr<67>eres Gewicht und kommen deshalb eher wieder an die Reihe.
void KVerbosUser::updateKumulus()
{
int k = 0;
kumulus = 0;
verbenListe::Iterator zeig;
for (zeig=liste.begin(); zeig!=liste.end(); ++zeig)
{
if ((*zeig).status == RICHTIGGEMACHT)
{
if ((*zeig).used && ((*zeig).counter>1))
(*zeig).counter--;
else
(*zeig).status--;
};
if ((*zeig).used && ((*zeig).status < RICHTIGGEMACHT))
{
kumulus = k;
if ((*zeig).status == UNGELERNT)
k = ((*zeig).right < (*zeig).wrong) ? k+2 : k+1;
else
k += ((*zeig).wrong) * FALSCHGEWICHT;
(*zeig).counter = k;
};
};
}
// selects a verb out of the verbs that are in the U and F list. That means a
// verb that hasn't been studied yet or one that was wrong.
TQString KVerbosUser::suggestVerb()
{
auswahl = "";
it = liste.end();
updateKumulus();
if ((kumulus == 0) && !liste.isEmpty())
{
verbenListe::Iterator zeig;
for (zeig=liste.begin(); zeig!=liste.end(); ++zeig)
(*zeig).status = 0;
// rekursiver Aufruf. Es ist kein Problem, weil die Liste nicht leer ist und alle
// Elemente den status 0 bekommen haben, also kann eine Auswahl stattfinden.
auswahl = suggestVerb();
};
if (kumulus != 0)
{
// RAND_MAX ist auf meinem System 231;
int i = rand() % kumulus;
verbenListe::Iterator zeig = liste.begin();
while ((zeig != liste.end()) && (((*zeig).status==RICHTIGGEMACHT)||((*zeig).counter < i)))
zeig++;
auswahl = (*zeig).verb;
it = zeig;
};
return auswahl;
}
// The solution for the suggested verb was right. Now the verb should be deleted from
// the list of unstudied verbs but added to the list with the right verbs.
void KVerbosUser::right()
{
if (!auswahl.isEmpty())
{
(*it).right = ((*it).right+1) & MAX_WERT;
if ((*it).wrong > 0)
(*it).wrong--;
if ((*it).status < RICHTIGGEMACHT)
(*it).status++;
if ((*it).status == RICHTIGGEMACHT)
(*it).counter = STAY_IN_R_LIST;
};
}
// The opposite function to the above one. The solution was wrong and the verb has to
// be moved to the list with the wrong verbs.
void KVerbosUser::wrong()
{
if (!auswahl.isEmpty())
{
(*it).wrong = ((*it).wrong+1) & MAX_WERT;
if ((*it).right > 0)
(*it).right--;
if ((*it).status > FEHLERHAFT)
(*it).status--;
};
}
// Saves all the user information to the $TDEHOME/apps/kverbos/data/username.kverbos file
bool KVerbosUser::saveUser(const int& res, const int& num)
{
bool re = false;
if (name != DEFAULTUSER)
{
int pos;
while ((pos = name.find(' ')) != -1)
name.replace(pos, 1, "_");
TQFile file(locateLocal("data", "/kverbos/data/"+name+".kverbos"));
if ( file.open(IO_WriteOnly) )
{
TQTextStream t( &file );
t << name << endl;
sessions = (num == 0) ? sessions - 1 : sessions;
t << sessions << endl;
int j = (num == 0) ? 0 : 1;
for (int i=j; i<MAX_RESULTS; i++)
{
t << date[i] << endl;
t << result[i][0] << endl;
t << result[i][1] << endl;
};
if (j == 1)
{
TQDate d = TQDate::tqcurrentDate();
t << d.toString() << endl;
t << res << endl;
t << num << endl;
};
for (it=liste.begin(); it!=liste.end(); ++it)
{
if ((*it).status != UNGELERNT)
{
t << (*it).verb << endl;
t << (*it).status << endl << (*it).right << endl << (*it).wrong << endl;
};
};
re = true;
file.close();
};
};
return re;
}
bool KVerbosUser::getResults(int& s, TQString d[], int r[][2])
{
s = sessions;
for (int i=0; i<MAX_RESULTS; i++)
{
d[i] = date[i];
for (int j=0; j<2; j++)
r[i][j] = result[i][j];
};
return true;
}