Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2012, 02:38   #11
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

0.4.4. Исправлено 15 ошибок(!). Появились 2-е структуры:
Код:
//Структура файла свойств
struct sFileSettings
{
     bool gRegimeViewing,//true - Режим просмотра, false - Режим редактирования
  LanguageProgram,//Язык программы
  bStandardPanel,//Состояние показа стандартной панели
  bEditPanel,//Состояние показа панели редактирования
  bFormatPanel,//Состояние показа панели форматирования
  bTimePanel,//Состояние показа панели времени
  bPointPanel,//Состояние показа панели баллов
  bLimitTime,//Ограничение времени
  bAutoStartTest;//Автоматический запуск
     QString RegimePassword;//Пароль режима
};

//Структура теста
struct sShelkTestVar
{
     QString sNameTest,//Название теста
     sAllPoint,//Все баллы строкой
     sMidPoint,//Средний балл строкой
     sCurrentPoint,//Текущий балл строкой
     sTypeQuestion,//Тип вопроса
     TestPassword,//Пароль теста
     StatNameTest,//Имя пользователя в статистике
     sQuestion,//Текст вопроса
     sTimeStart;//Время начала

 int CountQuestion,//Количество вопросов
 iNumberQuestion,//Номер вопроса
 iNumberTest,//Номер теста
 AllPoint,//Общий балл
 MidPoint,//Средний балл
 CurrentPoint,//Текущий балл
 AllPointCheck,//Общий балл для проверки
 AllTime,//Общее время
 MidTime,//Среднее время
 CurrentTime,//Текущее время
 i5First;//Номер прошлого выделенного ответа (установка последовательности)

     QVector<double> *iRangeFirst,//Начальное значение диапазона (ввод числа)
                     *iRangeLast;//Конечное значение диапазона (ввод числа)

     QStringList ListQuestions,//Список вопросов
                 slTableNumber,//Список номеров таблиц в базе тестов
                 slQuestionType,//Список типов вопросов
                 slPoint,//Список баллов
                 slTime;//Список времени

     QVector<QVariant> *ListRightAnswer,//Список правильных ответов
                       *ListCheckRightAnswer;//Список правильных ответов для проверки

     QVector<QStringList> *ListAnswers;//Список ответов
     QVector<QByteArray> *ListImages;//Список изображений
     QVector<QFont> *ListFonts;//Список шрифтов
     QSqlDatabase db;//База данных тестов

     QTimer TimerTest,
            TimerTestLabel;
     QTime TimeTestCurrent,
           TimeTestAll;
};
Их было решено использовать сразу, после выхода кроссворда за предел стека
Введение вектора типа QVariant позволило функцию проверки ответов максимально упростить и вынести отдельно:
Код:
bool ShelkTest::MakeCheckRightAnswer(int iIndex)
{
    int iTypeR;
    QString str1, str2;
    QByteArray ba1, ba2;

    iTypeR = vShelkTestVar->ListRightAnswer->at(iIndex).type();

        if(iTypeR == QVariant::Int)
            {
                if(vShelkTestVar->ListRightAnswer->at(iIndex).toInt()
                    == vShelkTestVar->ListCheckRightAnswer->at(iIndex).toInt())
                    return true;
                else return false;
            }

        if(iTypeR == QVariant::Double)
            {
                if(vShelkTestVar->ListRightAnswer->at(iIndex).toDouble()
                    == vShelkTestVar->ListCheckRightAnswer->at(iIndex).toDouble())
                    return true;
                else return false;
            }

        if(iTypeR == QVariant::String)
            {
                if(vShelkTestVar->ListRightAnswer->at(iIndex).toString()
                    == vShelkTestVar->ListCheckRightAnswer->at(iIndex).toString())
                    return true;
                else return false;
            }

        if(iTypeR == QVariant::ByteArray)
            {
                ba1.append(vShelkTestVar->ListRightAnswer->at(iIndex).toByteArray());
                ba2.append(vShelkTestVar->ListCheckRightAnswer->at(iIndex).toByteArray());
                str1.append(vShelkTestVar->ListRightAnswer->at(iIndex).toByteArray());
                str2.append(vShelkTestVar->ListCheckRightAnswer->at(iIndex).toByteArray());

                if(vShelkTestVar->ListRightAnswer->at(iIndex).toByteArray()
                    == vShelkTestVar->ListCheckRightAnswer->at(iIndex).toByteArray())
                    return true;
                else return false;
            }

        if(iTypeR == QVariant::StringList)
            {
                if(vShelkTestVar->ListRightAnswer->at(iIndex).toStringList()
                    == vShelkTestVar->ListCheckRightAnswer->at(iIndex).toStringList())
                    return true;
                else return false;
            }
        return false;
}
Несмотря на то, что QVariant не рекомендуется использовать из за большого потребления памяти, так как он позволяет хранить даже контейнеры(!), я решил сделать это. Использование один раз в масштабах простой программы для создания тестов показала свою рентабельность.
Скачать
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 14.02.2012, 23:52   #12
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Хорошо

Здравствуйте! Представляю новую версию программы 0.4.7. Добавился файл с константами:
Код:
//const.h
//Определение путей констант, в соответствии с системой
#if defined(Q_WS_WIN)

    #define PATH_TMP_SET QApplication::applicationDirPath() + "/settings.xwst"
    #define PATH_SHARE_DOC QApplication::applicationDirPath()
    #define PATH_SHARE_APP QApplication::applicationDirPath()
    #define PATH_TMP QApplication::applicationDirPath()


#elif defined(Q_WS_X11)

    #define PATH_TMP_SET "/tmp/shelk-test-0.4.7/settings.xwst"
    #define PATH_SHARE_DOC "/usr/share/doc/shelk-test-0.4.7"
    #define PATH_SHARE_APP "/usr/share/shelk-test-0.4.7"
    #define PATH_TMP "/tmp/shelk-test-0.4.7"

#elif defined(Q_WS_MAC)

    #define PATH_TMP_SET QApplication::applicationDirPath() + "/settings.xwst"
    #define PATH_SHARE_DOC QApplication::applicationDirPath()
    #define PATH_SHARE_APP QApplication::applicationDirPath()
    #define PATH_TMP QApplication::applicationDirPath()


#endif

#define MODE_VIEW true
#define MODE_EDIT false

#define LANGUAGE_RUSSIAN true
#define LANGUAGE_ENGLISH false

#define TOOLBAR_SHOW true
#define TOOLBAR_HIDE false

#define STATISTICS_FIELD_SHOW true
#define STATISTICS_FIELD_HIDE false

#define VIEW_RUSSIAN 0
#define VIEW_ENGLISH 1
#define EDIT_RUSSIAN 2
#define EDIT_ENGLISH 3

//Типы вопросов
#define TYPE_ONE_ANSWER "1"
#define TYPE_MANY_ANSWERS "2"
#define TYPE_ENTER_WORD "3"
#define TYPE_ENTER_NUMBER "4"
#define TYPE_INSTALLATION_SEQUENCE "5"
Добавилась новая структура, но в коде она пока не задействована:
Код:
//Структура показа полей статистики
struct TStateFieldStatistics
{
     bool bUserName,//Имя пользователя
          bNameTest,//Название теста
          bTotalQuestions,//Всего вопросов
          bCorrectAnswers,//Правильных ответов
          bWrongAnswers,//Неправильных ответов
          bTotalPoints,//Всего баллов
          bScore,//Оценка
          bDate,//Дата
          bTimeBegin,//Время начала
          bTimeEnd,//Время окончания
          bElapsedTime;//Прошедшее время
};
Оптимизирована функция изменения шрифта(была 195 строк):
Код:
        bool Accept;
        QFont TextFont;
        TextFont = TextQuestion->textCursor().charFormat().font();
        TextFont = QFontDialog::getFont(&Accept, TextFont);

        if(Accept)
        {
            QTextCharFormat tcf;
            tcf.setFont(TextFont);
            TextQuestion->textCursor().setCharFormat(tcf);
            cbFont.setCurrentFont(TextFont);
        }
        else return 1;
Скачать
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 19.02.2012, 02:34   #13
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Хорошо

Новая и последняя на данный момент версия 1.0.0. Здесь я постарался конкретно. Изменения:
Цитата:
- Добавились новые возможности: проверка наличия новой версии через интернет; печать теста; печать статистики; экспорт тестов в HTML, RTF, PDF, PostScript, простой текстовый формат;
- Добавлено использование системных временных каталогов для размещения временных файлов;
- Изменилось расположение файла статистики по-умолчанию на домашний каталог пользователя;
- Изменилась кодировка файла статистики на UTF-8:
- Изменилась кодировка импортируемого текстового файла на UTF-8;
Код:
//Новые константы
//Типы вопросов для определения содержимого переменной QVariant
#define V_TYPE_ONE_ANSWER QVariant::Int
#define V_TYPE_MANY_ANSWERS QVariant::ByteArray
#define V_TYPE_ENTER_WORD QVariant::String
#define V_TYPE_ENTER_NUMBER QVariant::Double
#define V_TYPE_INSTALLATION_SEQUENCE QVariant::StringList

//Перевод слов в rtf-unicode
QString ShelkTest::WordToUnicode(QString sWord)
{
    QString sTemp,
            sNum;
    sTemp.clear();
    for (int i = 0; i < sWord.length(); i++)
    {
        sNum.setNum(sWord.at(i).unicode());
        sTemp.append("\\u" + sNum + "?");
    }
    return sTemp;
}
Далее, задействовал webkit:
Код:
private: QWebView *wvUpdate;//Для обновления и печати :)
, так как QTextEdit и QTextBrowser не могут отображать элементы ввода(текст, переключатель, флажок), для формирования правильной html-ки. Раз уж было принято решение добавить новую зависимость от библиотеки QtWebkit, то на его же основе я сделал проверку наличия новой версии через интернет, смотрим:
Код:
void ShelkTest::slotCheckForUpdates()
{
    connect(wvUpdate, SIGNAL(loadFinished(bool)), SLOT(slotMakeCheckUpdates(bool)));
    wvUpdate->load(QUrl("http://labfreetech.org/shelk_1.0.0.html"));
}

void ShelkTest::slotMakeCheckUpdates(bool bError)
{
    if (bError && wvUpdate->page()->findText("new_version")) 
        QMessageBox::information(0, tr("Information"), tr("On the official website available a new version!"));
    else QMessageBox::information(0, tr("Information"), tr("You have the latest version!"));
    disconnect(wvUpdate, SIGNAL(loadFinished(bool)), 0, 0);
}
Как видно - всё просто. Если текст "new_version" найден в загруженной html-ке, то есть новая версия
Чтобы сделать всё так, как я задумал - пришлось использовать новый метод disconnect, который я ранее не использовал и всё получилось.

Теперь за кодом можно наблюдать не дожидаясь релиза. В git создана новая ветка current. Скачать.
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 31.07.2012, 23:29   #14
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Хорошо

Очередная версия программы 1.5.1. Часть переменных сгруппирована и выделена в отдельные классы:
TAnswer,//Ответ
TQuestion,//Вопрос
TTest,//Тест
TDepository,//Хранилище
TFileOptions//файл свойств
Код:
...
    QString s_NameTest;//Название теста
    QByteArray ba_TestPassword;//Пароль теста

public:

    QVector<TQuestion> vListQuestions;//Список вопросов
    QVector<TAnswer> vListAnswers;//Список ответов

    QTimer TimerTest;
    QTimer TimerTestLabel;
    QTime TimeTestCurrent;
    QTime TimeTestAll;

    TTest();
    ~TTest();

    int countQuestions() const;//Получить количество вопросов
    void setCountQuestions(int iCountQuestions);//Задать количество вопросов ...
Всё работает нормально, но память очищается не вся. Вектора списков вопросов и ответов, при вызове стандартного метода clear(), возможно неполностью очищают своё содержимое. Сделал так:
Код:
    for (int i = 0; i < TestDepository->Test->vListQuestions.count(); i++)
    {
        TestDepository->paTemp[i].clear();//Указатель на TestDepository->Test->vListAnswers
        TestDepository->pqTemp[i].clear();//Указатель на TestDepository->Test->vListQuestions
    }

    TestDepository->Test->vListAnswers.clear();
    TestDepository->Test->vListQuestions.clear();
всё равно после недолгой работы(открытий / закрытий тестов) с программой. Остаётся, при закрытии ~3 МБ не выгружено. Пока, что это мелочь, но ...

Изменения:
Цитата:
- Оптимизация процесса сохранения теста(~10 раз(!)) в базу хранилища;
- Декомпозиция программы на отдельные классы, с занесением части переменных в секцию private;
- Добавлена возможность использовать дифференцированную или недифференцированную систему оценивания;
- Добавлены возможности: удалённого расположения файла свойств программы; ограничивать время для всего теста; пропуска вопросов, при тестировании; перемешивания вопросов; настраиваемого показа полей статистики; запоминать последнюю открытую базу хранилища; не показывать результаты тестируемому; ограничивать количество задаваемых вопросов из общего числа;
Скачать
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 02.08.2012, 15:41   #15
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Скачал, а где экзешник-то? Вот хотел в бета-тестеры записаться, а как запустить и проверить?

----ДОБАВЛЕНО----
Нашел

Теперь тест.
1. В списке тестов имена столбцов таблицы по английски.
2. Кнопка ОК при вводе ответов мелковата - я не сразу понял, что нужно делать. Можно по-крупней ну или как вариант выделить ее цветом, чтобы отличалась от остального серого фона.
3. В нижнем левом углу написано Тестирования и я и номер группы. Что значит Тестирования?
4. Для ввода олимпийских колец предлагается по умолчанию ввод дробного числа
5. При просчете итогов - время не считалось.
6. При старте пауза около 3-х секунд, затем видно как мелькает основное окно, сворачивается и спрашивает имя и группу. Че-то не нравится такая анимация. Сделай чтобы изначально основное окно было невидимым, чтобы ничего не мельтешило.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 03.08.2012 в 08:01.
Utkin вне форума Ответить с цитированием
Старый 14.08.2012, 08:06   #16
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Utkin Посмотреть сообщение
Скачал, а где экзешник-то? Вот хотел в бета-тестеры записаться, а как запустить и проверить?...
Засчитано
Цитата:
Сообщение от Utkin Посмотреть сообщение
Теперь тест.
1. В списке тестов имена столбцов таблицы по английски.
2. Кнопка ОК при вводе ответов мелковата - я не сразу понял, что нужно делать. Можно по-крупней ну или как вариант выделить ее цветом, чтобы отличалась от остального серого фона.
3. В нижнем левом углу написано Тестирования и я и номер группы. Что значит Тестирования?
4. Для ввода олимпийских колец предлагается по умолчанию ввод дробного числа
5. При просчете итогов - время не считалось.
6. При старте пауза около 3-х секунд, затем видно как мелькает основное окно, сворачивается и спрашивает имя и группу. Че-то не нравится такая анимация. Сделай чтобы изначально основное окно было невидимым, чтобы ничего не мельтешило.
1. Это похоже никак не исправляется. Несколько раз думал об этом. Там используется интервью(модель-представление) и без наследования ничего не получится, так как это настоящие имена полей sql-таблицы.
2. Шкурки мной официально поддерживаться не будут. Только тупо нужные функции и всё.
3. В случае фразы "Режим тестирования" всё звучит верно. Когда "тестирования" остаётся отдельно, возможно, будет правильней изменить на "тестирование".
4. Согласен. С ним я буду заниматься после добавления всего базового функционала в программу. Там можно будет и суффиксы менять типа "10 км".
5. В свойствах не стоит, значит, галочка "Ограничивать время".
6. Подумаю, что можно сделать.
Благодарю.
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook

Последний раз редактировалось xwicked; 14.08.2012 в 16:56.
xwicked вне форума Ответить с цитированием
Старый 14.08.2012, 08:16   #17
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

1. Надо исправить. Смотрится а-ля 90-е, как будто недоруссифицированно.
2. Да не надо шкурку. Нужно просто допилить кнопку. Сделать так чтобы ее было видно сразу и все.
3. Ну так и меняйте . Кто разработчик? Я что ли?
5. ОК, это значит я не доглядел.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 17.11.2012, 19:08   #18
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Хорошо 1.5.2

1.5.2 - скачать
Цитата:
- Теперь сохранение свойств программы происходит при каждом их изменении;
- Убрана чувствительность регистра ответа в вопросе типа "Ввод слова(предложения)";
- Исправлена ошибка ограничения количества вопросов в режиме редактирования;
- Добавлено новое поле статистики "Количество заданных вопросов из общего числа";
- Исправлена ошибка, когда нельзя было ввести вариант ответа, при увеличении и обратном уменьшении изображения, в вопросе "Ввод слова(предложения)";
- Изменено и отлажено автоматическое определение пропущенных вопросов, при тестировании;
- Добавлена дополнительная детализация к статистике протестировавшихся;
В следующей версии я хочу прикрутить веб-интерфейс тестируемого. Собираюсь использовать JavaScript(или Java? а возможно C++?) + свой простейший веб-сервер(на C++ для AJAX). Какие вопросы / проблемы меня могут поджидать?

Благодарю за ответы!
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook

Последний раз редактировалось xwicked; 17.11.2012 в 21:58.
xwicked вне форума Ответить с цитированием
Старый 19.11.2012, 13:00   #19
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Цитата:
ввод слова(предложения) с клавиатуры
Как проверяете правильность ответа?
Цитата:
В следующей версии я хочу прикрутить веб-интерфейс тестируемого. Собираюсь использовать JavaScript(или Java? а возможно C++?) + свой простейший веб-сервер(на C++ для AJAX). Какие вопросы / проблемы меня могут поджидать?
С сервером на C++ никаких, куча готовых библиотек есть.
А вот:
Цитата:
прикрутить веб-интерфейс тестируемого. Собираюсь использовать JavaScript(или Java? а возможно C++?)
Как это? HTML, CSS, JS этого будет достаточно.
Kostia вне форума Ответить с цитированием
Старый 19.11.2012, 15:06   #20
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Сообщение

Цитата:
Сообщение от Kostia Посмотреть сообщение
Как проверяете правильность ответа?

С сервером на C++ никаких, куча готовых библиотек есть.
А вот:

Как это? HTML, CSS, JS этого будет достаточно.
Код:
bool TDepository::makeCheckRightAnswer(int iIndex)
{
    int iTypeR;
    QString str1, str2;
    QByteArray ba1, ba2;

    iTypeR = Test->vListAnswers.at(iIndex).rightAnswer().type();

    if(iTypeR == V_TYPE_ONE_ANSWER)
    {
        if(Test->vListAnswers.at(iIndex).rightAnswer().toInt() == Test->vListAnswers.at(iIndex).currentAnswer().toInt())
            return true;
        else
            return false;
    }

    if(iTypeR == V_TYPE_ENTER_NUMBER)
    {
        if (Test->vListAnswers.at(iIndex).rightAnswer().toDouble() == Test->vListAnswers.at(iIndex).currentAnswer().toDouble())
            return true;
        else
            return false;
    }
//-----------------------------------------------------------------------------------------
    if(iTypeR == V_TYPE_ENTER_WORD)
    {
//Простое сравнение
        if(Test->vListAnswers.at(iIndex).rightAnswer().toString() == Test->vListAnswers.at(iIndex).currentAnswer().toString())
            return true;
        else
            return false;
    }
//-----------------------------------------------------------------------------------------
    if(iTypeR == V_TYPE_MANY_ANSWERS)
    {
        ba1.append(Test->vListAnswers.at(iIndex).rightAnswer().toByteArray());
        ba2.append(Test->vListAnswers.at(iIndex).currentAnswer().toByteArray());
        str1.append(Test->vListAnswers.at(iIndex).rightAnswer().toByteArray());
        str2.append(Test->vListAnswers.at(iIndex).currentAnswer().toByteArray());

        if(Test->vListAnswers.at(iIndex).rightAnswer().toByteArray() == Test->vListAnswers.at(iIndex).currentAnswer().toByteArray())
            return true;
        else
            return false;
    }

    if(iTypeR == V_TYPE_INSTALLATION_SEQUENCE)
    {
        if(Test->vListAnswers.at(iIndex).rightAnswer().toStringList() == Test->vListAnswers.at(iIndex).currentAnswer().toStringList())
            return true;
        else
            return false;
    }

    return false;
}
Код:
        if(TestDepository->Test->vListQuestions.at(TestDepository->Test->numberQuestion() - 1).type() == TYPE_ENTER_WORD)
        {
//А сохраняю так
            if(ui->teAnswer->toPlainText() != "")
            {
                if (FileOptions->isModeWork() == TFileOptions::MODE_EDITING)
                    TestDepository->paTemp[TestDepository->Test->numberQuestion() - 1].setRightAnswer(ui->teAnswer->toPlainText().toLower());//Преобразую к нижнему регистру
                else
                    TestDepository->paTemp[TestDepository->Test->numberQuestion() - 1].setCurrentAnswer(ui->teAnswer->toPlainText().toLower());
            }
        }
Если с сервером проблем никаких, то тогда на остальных форумах походу подумали, что я стебаюсь...
Если я буду использовать AJAX, для подгрузки обычного HTML4 кода, будут ли у меня проблемы с отображением содержимого страницы на разных платформах / браузерах?
Про C++, я имел в виду, что если у Apache cgi-модуль поддерживает исполнение C++ - бинарников, то хотел узнать реализовано такое в браузерах или нет?
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для создания тестов и их использования в Delphi vasyavasyavasy Общие вопросы Delphi 9 09.02.2015 21:31
Оболочка для создания тестов fojia C++ Builder 1 28.04.2012 14:15
Программа для создания тестов[версия 0.4.4.] xwicked Софт 0 07.06.2011 15:42
Прога для создания и проведения тестов на C# senokos Общие вопросы .NET 5 03.02.2011 17:57
Программа для проведения тестов. Kroops Свободное общение 5 29.07.2009 09:08