📜 ⬆️ ⬇️

Brain Trainer Qt (learn to count in your mind or a weekend project)

I stumbled upon posts where the topic of effective mental arithmetic was very actively discussed ( one , two ). I was interested in the topic and I began to look for programs and services for training. Soon it came to the realization that it would be faster to write my own application, for my own wishes and with buttons where it is convenient for me, + the perspective of transferring to my favorite Windows Phone.

For those who are interested to see / criticize - welcome under cat.



List of classes:
')
  1. controlleri.cpp - spawns the rest of the classes, aggregates the entity and abstracts from the main View:
    Controller.cpp
    Controller::Controller() : QObject() { try { this->leftPanel = std::make_unique<LeftPanel>(); this->database = std::make_unique<Database>(); this->exercise = std::make_unique<Exercise>(this); this->settings = std::make_unique<Settings>(); this->settings.get()->init(); if(!settings->init()) { throw QString("Error open settings!"); } database.get()->getSettings(settings.get()->getVersion(), settings.get()->getCountDigiMax(), settings.get()->getUseMinus(), settings.get()->getFirstName(), settings.get()->getLastName(), settings.get()->getLastAllTime(), settings.get()->getLastExerciseCorect(), settings.get()->getLastExerciseWrong(), settings.get()->getLastExercisePassed()); this->statistict = std::make_unique<Statistic>(); this->statistict->setLastStatistic( settings->getLastAllTime(), settings->getLastExerciseCorect(), settings->getLastExerciseWrong(), settings->getLastExercisePassed()); connect(statistict.get(), SIGNAL(is_changed()), this, SLOT(statisticsChanged())); connect(settings.get(), SIGNAL(is_changed()), this, SLOT(settingsChanged())); this->timer = std::make_unique<TimerClass>(); connect(timer.get(), SIGNAL(update(QString)), this, SLOT(updateTime(QString))); } catch(char *pErr) { throw pErr; } } 

  2. Exercise.cpp - generates examples, uses random to the given digits, checks the division by NULL.

    Exercise.cpp
     Exercise::Exercise(QObject *parent) : QObject(parent) { this->random = std::make_unique<Random>(); exercise.result = 0; } Exercise::sExercise Exercise::getNewExercise( eExerciseType operation, int count_max, bool use_minus) { long a = 0, b = 0; if(count_max!=0) { exercise.lastType = operation; a = random->getRandom(count_max); b = random->getRandom(count_max); if(!use_minus) { while((a < 0) || (a==0)) { a = random->getRandom(count_max); } while((b < 0) || (b==0)) { b = random->getRandom(count_max); } } else { while((a == 0) || (b==0)) { a = random->getRandom(count_max); b = random->getRandom(count_max); } } switch(operation) { case exerc_substraction: exercise.result = (a - b); exercise.exercText = QString("%1%2%3%4").arg(a).arg(" - ").arg(b).arg("="); break; case exerc_addtion: exercise.result = (a + b); exercise.exercText = QString("%1%2%3%4").arg(a).arg(" + ").arg(b).arg("="); break; case exerc_division: while(b <= 0) { b = random->getRandom(count_max); } while(a <= b) { a = random->getRandom(count_max); } exercise.result = (a / b); exercise.exercText = QString("%1%2%3%4").arg(a).arg(" / ").arg(b).arg("="); break; case exerc_multiplication: exercise.result = (a * b); exercise.exercText = QString("%1%2%3%4").arg(a).arg(" * ").arg(b).arg("="); break; case exerc_exponentiation: while(b<0 || b==0 || b>15) { b = random->getRandom(count_max); } exercise.result = static_cast<long>(powl(a, b)); exercise.exercText = QString("<html><head/><body><p>%1<span style=\" vertical-align:super;\">%2</span> =</p></body></html>") .arg(a).arg(b); break; case exerc_root: exercise.result = static_cast<long>(sqrt(a)); exercise.exercText = QString("%1%2%3").arg(a).arg(" √ ").arg("="); break; case exerc_nothing: exercise.exercText = "[Nothing]"; break; } } return exercise; } <li>Settings.cpp -       db <spoiler title="Settings.cpp"> <source lang="cpp"> void Settings::setCountDigiMax(int count_digits) { count_digit_max = count_digits; emit is_changed(); } void Settings::setUseMinus(int use) { use_minus = static_cast<bool>(use); emit is_changed(); } void Settings::setFirstName(QString name) { first_name = name; emit is_changed(); } void Settings::setLastName(QString name) { last_name = name; emit is_changed(); } void Settings::setLastAllTime(QTime *ptime) { exercise_all_time = ptime->toString("HH:mm:ss"); } void Settings::setLastExerciseCorect(int exercise) { exercise_correct = exercise; } void Settings::setLastExerciseWrong(int exercise) { exercise_wrong = exercise; } void Settings::setLastExercisePassed(int exercise) { exercise_passed = exercise; } int& Settings::getCountDigiMax() { return count_digit_max; } bool& Settings::getUseMinus() { return use_minus; } QString& Settings::getFirstName(){ return first_name; } QString& Settings::getLastName() { return last_name; } QString& Settings::getLastAllTime() { return exercise_all_time; } QString& Settings::getVersion() { return version; } int& Settings::getLastExerciseCorect() { return exercise_correct; } int& Settings::getLastExerciseWrong() { return exercise_wrong; } int& Settings::getLastExercisePassed() { return exercise_passed; } 

  3. Statistic.cpp - just keeps storing statistics, how many examples are solved, errors, etc.
  4. Timer.cpp will listen for ordering timers
    Timer.cpp
     TimerClass::TimerClass(QObject *parent) : QObject(parent) { this->time = new QTime(0, 0, 0, 0); this->timer_one_sec = new QTimer(); connect(timer_one_sec, SIGNAL(timeout()), this, SLOT(nextTimeOneSecond())); timer_one_sec->start(1000); } QTime* TimerClass::getTime() { return time; } void TimerClass::nextTimeOneSecond() { *time = time->addSecs(1); time->fromString((time->toString("HH:mm:ss"))); emit update(time->toString("HH:mm:ss")); } 

  5. Database.cpp - database class
    Data needs to be stored somewhere.
    SQLite fits perfectly
    Database.cpp
     Database::Database(QObject *parent) : QObject(parent) { this->db = std::make_unique<QSqlDatabase>(QSqlDatabase::addDatabase("QSQLITE")); this->db.get()->setDatabaseName("./database/database"); if(!this->db.get()->open()) { throw QString("Error open database!!"); } } Database::~Database() { } QString query_get_settings("SELECT sets_id, sets_count_digits, sets_used_minus FROM settings"); QString query_set_settings("UPDATE settings SET sets_count_digits=%1, sets_used_minus = %2"); QString query_update_statistics("UPDATE statistics SET " " stats_exercise_all_time='%1', stats_excercise_correct=%2," " stats_excercise_wrong=%3, stats_excercise_all='%4'"); QString query_get_statistics("SELECT " " user_first_name, user_last_name, stats_exercise_all_time," " statistics.stats_excercise_all, statistics.stats_excercise_correct," " statistics.stats_excercise_wrong " " FROM statistics" " JOIN user ON user.user_id = statistics.stats_user_id"); QString query_get_version("SELECT * FROM version"); bool Database::getSettings(QString &version, int &count_digit_max, bool &use_minus, QString &first_name, QString &last_name, QString &exercise_all_time, int &exercise_correct, int &exercise_wrong, int &exercise_passed) { bool res = false; try { QSqlQuery query; // settings query.exec(query_get_settings); qDebug() << "Query=" << query.lastQuery(); while(query.next()) { count_digit_max = query.value(1).toInt(); use_minus = query.value(2).toBool(); } // user and statistics query.exec(query_get_statistics); qDebug() << "Query=" << query.lastQuery(); while(query.next()) { first_name = query.value(0).toString(); last_name = query.value(1).toString(); exercise_all_time = query.value(2).toString(); exercise_passed = query.value(3).toInt(); exercise_correct = query.value(4).toInt(); exercise_wrong = query.value(5).toInt(); } // version query.exec(query_get_version); qDebug() << "Query=" << query.lastQuery(); while(query.next()) { version = query.value(2).toString(); } } catch (...) { throw QString("db: error request get settings!"); } return res; } bool Database::setSettings(int count_digit_max, bool use_minus, QString first_name, QString last_name) { bool res = false; try { QSqlQuery query; // settings query.exec(QString(query_set_settings) .arg(count_digit_max) .arg(use_minus)); qDebug() << "Query=" << query.lastQuery(); res = query.result(); } catch (...) { throw QString("db: error request set settings!"); } return res; } bool Database::getStatistics(QString &exercise_all_time, int &exercise_correct, int &exercise_wrong, int &exercise_passed) { bool res = false; try { QSqlQuery query; query.exec(query_get_statistics); qDebug() << "Query=" << query.lastQuery(); while(query.next()) { exercise_all_time = query.value(2).toString(); exercise_passed = query.value(3).toInt(); exercise_correct = query.value(4).toInt(); exercise_wrong = query.value(5).toInt(); } } catch (...) { throw QString("db: error request get statistics!"); } return res; } bool Database::updateStatistics(QString exercise_all_time, int exercise_correct, int exercise_wrong, int exercise_passed) { bool res = false; try { QSqlQuery query; // settings query.exec(QString(query_update_statistics).arg(exercise_all_time) .arg(exercise_correct) .arg(exercise_wrong) .arg(exercise_passed)); qDebug() << "Query=" << query.lastQuery(); res = query.result(); } catch (...) { throw QString("db: error request update statistics"); } return res; } 







→ Link to GitHub

Source: https://habr.com/ru/post/417843/


All Articles