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

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

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

Восстановить пароль
Повторная активизация e-mail

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

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

Здравствуйте!

Третья моя программа написана по наработкам второй(для создания электронных книг), поэтому содержит некоторые методы такого же названия например "openBookBase", что в последующих версиях будет исправлено на "openTestBase"

Программа представляет собой миникомплекс, включающий: создание, тестирование, отчёт(статистика). Версия 0.3.1 - исходник + сборки.

Скрин последней версии:


Ссылка на SourceForge.net. Код под GNU GPL v2 - OpenSource. С++(Qt).

Описание: кроссплатформенная программа для создания и редактирования тестов, с последующим тестированием.
Её могут использовать все, кому понадобиться быстро создать тест и проверить знания. Можно будет создать вопрос типа "Что показано на изображении" и использовать как в школе так и на предприятии, для сдачи квалификационных экзаменов. Все тесты хранятся в базе данных SQLite3. Это позволяет располагать файл базы на любом сервере(Windows, GNU / Linux, и т. д.), без необходимости установки сервера баз данных.

Всё находится в одном исполняемом файле. Для редактирования / тестирования, необходимо переключить соответствующий пункт из меню "Режим". Отчёт о протестировавшихся представлен статистикой.

Внутренняя архитектура: список вопросов хранится в QStringList ListQuestions, список правильных ответов в QStringList ListRightAnswer, варианты ответа при тестировании в QStringList ListCheckRightAnswer. Изображения к тесту находятся в QByteArray ListImages[100000]. Режим редактирования защищён паролем, который пока что, хранится в открытом виде.

Обсуждаем.
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 30.08.2011, 00:19   #2
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Здравствуйте!

Вот новая версия 0.3.5.

Теперь программа предоставляет возможность создавать тесты, используя 4-е новых типа вопроса: много ответов, ввод слова(предложения) с клавиатуры, ввод числа с клавиатуры, установка последовательности ответов.

Хочу обратить Ваше внимание на то, что в данной версии я сделал вот так:
Код:
         if(slotSelectTypeQuestion() == false) return;

         if(sTypeQuestion == tr("One answer")) setOneAnswerType();

         if(sTypeQuestion == tr("Many answers")) setManyAnswerType();

         if(sTypeQuestion == tr("Installation sequence")) setInstallSequenceType();

         if(sTypeQuestion == tr("Enter number")) setEnterNumberType();

         if(sTypeQuestion == tr("Enter word (sentence)")) setEnterWordType();

         slQuestionType << sTypeQuestion;
         SaveState = false;
Функция slotSelectTypeQuestion() отвечает за вывод списка, из которого можно будет выбрать соответствующий тип вопроса.
Далее идёт проверка типа и его применение - функция начинается на "set<Тип_вопроса>". Потом выбранный вариант загоняется в список типов QStringList slQuestionType. Но, здесь есть одно "но":
Код:
sTypeQuestion == tr("One answer")
- тип вопроса взят в "tr()", так что тест, составленный на русском языке не будет работать при использовании английского языка интерфейса программы и наоборот . Просьба, перед сборкой устранить эту ошибку, так как мной она будет устранена в последующий версиях .

Дабы быть уверенным в том, что файлы не побились, при закачке, я добавил текстовик с md5-контрольными суммами.
Git-репозиторий:
Цитата:
git://shelk-test.git.sourceforge.net/gitroot/shelk-test/shelk-test (read-only)
P.S. Ещё один очень важный момент: версии 0.3.5, 0.4.1, 0.4.2 - сборки являются минимальными. То есть, чтобы посмотреть на все функции, необходимо программу собрать из исходника . Это делалось для проверки аудитории пользователей на заинтересованность в программе, путем отправки мне запроса на получение исходного кода. Что было не очень удачной идеей и, с версии 0.4.3, сборки программы уже снова полнофункциональны. Прошу извинить меня за данное неудобство.
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 21.10.2011, 17:31   #3
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Для распространения программы между RPM-дистрибутивами, воспользуйтесь следующим спекфайлом:
Цитата:
Summary: On Qt-based, cross-platform software is designed for creating and editing tests, followed by tests of knowledge.

Summary(ru): Кроссплатформенная программа для создания и редактирования тестов, с последующим тестированием. Основана на Qt.

%define version 0.3.5

Group: Education

Name: shelk-test

BuildRequires: gcc-c++, libqt4-sql-sqlite >= 4.4.3, libqtgui4 >= 4.4.3, libqt4-core >= 4.4.3
BuildArch: %ix86

Provides: shelk-test

Release: alt1

Source: shelk-test-%{version}.tar.gz

Url: http://labfreetech.org/index_e.html

Version: %{version}

License: GPLv2

Packager: LabFreeTech.org admin@labfreetech.org

%description
On Qt-based, cross-platform software is designed for creating and editing tests, followed by tests of knowledge.
Supported features: - Creation of a test; - Editing of the test; - Testing; - Adding / removing tests from the database; - Rich editing the test of the tests; - Password protection regime editing;

%description -l ru
Кроссплатформенная программа для создания и редактирования тестов, с последующим тестированием. Основана на Qt.
Поддерживаемые функции: - Создание теста; - Редактирование теста; - Тестирование; - Добавление / удаление тестов из базы данных; - Расширенное редактирование текста вопросов теста; - Защита паролем режима редактирования;

%prep

%setup -q

%build
%make_build

%install

cp -Rv shelk/ %buildroot/

%clean

rm -rf $RPM_BUILD_ROOT

%files

/usr/bin/*
/usr/share/*

%post

test -e /usr/bin/xwts-0.3.5 || ln -s /usr/bin/xwts-0.3.5 /usr/bin/shelk-test-0.3.5

if (test -d $HOME/Desktop) then
test -e $HOME/Desktop/xwts.desktop || cp -r /usr/share/applications/xwts.desktop $HOME/Desktop/shelk-test.desktop
else
echo "Use command \"/usr/bin/xwts-0.3.5\""
fi

%postun

test -L /usr/bin/shelk-test-0.3.5 && rm -r /usr/bin/shelk-test-0.3.5
test -e $HOME/Desktop/shelk-test.desktop && rm -r $HOME/Desktop/shelk-test.desktop
Но, в нём есть небольшая ошибка или, даже скорей недочёт:
Цитата:
BuildRequires: gcc-c++, libqt4-sql-sqlite >= 4.4.3, libqtgui4 >= 4.4.3, libqt4-core >= 4.4.3
Непонятно почему при установке собранного пакета с этим спекфайлом, происходит игнорирование выделенной библиотеки , но libqt4-sql устанавливается, хотя явного указания её нет. Кто знает причину, прошу ответить.
Этот спекфайл находится в архиве shelk-test-0.3.5-rpm, расположенный по ссылке в предыдущем посте. Там же находится архив исходного кода и для дитрибутивов GNU / Linux Debian(/Ubuntu), с пометкой "deb".
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 07.11.2011, 01:52   #4
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Продолжаем знакомиться с кодом. Версия 0.4.1 Включает в себя следующие изменения:
Цитата:
- Исправлена ошибка в реализации типа вопроса "Ввод числа";
- Исправлена ошибка в реализации типа вопроса "Установка последовательности";
- Добавлена возможность вставки изображения в вопрос теста;
- Добавлены горячие клавиши;
- Добавлена возможность использования баллов;
- Добавлена возможность ввода имени тестируемого;
- Добавлена статистика.
Статистика - это первый вариант журнала отчёта о протестировавшихся студентах, представлена обычным html-файлом:
Код:
            QFile file("/tmp/shelk-test-0.4.1/Stat.html");
            QDataStream sfile(&file);
            if(!file.exists())
            {
                file.open(QIODevice::WriteOnly);
                strStat.clear();
                strStat.append("<HTML>\n"
                               " <BODY>\n"
                               "  <TABLE border=\"3\">\n"
                               "   <TR>\n"
                               "    <TD> " + tr("User name") + " </TD>\n"
                               "    <TD> " + tr("Name test") + " </TD>\n"
                               "    <TD> " + tr("Total questions") + " </TD>\n"
                               "    <TD> " + tr("Correct answers") + " </TD>\n"
                               "    <TD> " + tr("Wrong answers") + " </TD>\n"
                               "    <TD> % </TD>\n"
                               "    <TD> " + tr("Total points:") + "  </TD>\n"
                               "    <TD> " + tr("Date") + "  </TD>\n"
                               "    <TD> " + tr("Time end") + "  </TD>\n"
                               "   </TR>\n"
                               "   <TR>\n"
                               "    <TD>" + UserName + "</TD>\n"
                               "    <TD>" + StatNameTest + "</TD>\n"
                               "    <TD>" + sTotalQuestions + "</TD>\n"
                               "    <TD>" + sCorrectAnswer + "</TD>\n"
                               "    <TD>" + sWrongAnswer + "</TD>\n"
                               "    <TD>" + strPercent + "</TD>\n"
                               "    <TD>" + sAllPoint + "</TD>\n"
                               "    <TD>" + strDate + "</TD>\n"
                               "    <TD>" + strTime + "</TD>\n"
                               "   </TR>\n"
                               "  </TABLE>\n"
                               " </BODY>\n"
                               "</HTML>\n");
                sfile << strStat;
                file.close();
                FormStat.StatLabel->setText(strStat);
            }
Есть что-нибудь проще или для начала сойдёт?
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 22.11.2011, 23:26   #5
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Здравствуйте! Программа продолжает совершенствоваться и версия 0.4.2 включает 25 изменений. Было изменено отображение картинки в тесте. Теперь используется рисование непосредственно на виджите:
Код:
//WidgetImage.cpp

//Передаётся в конструктор вторым параметром путь к загружаемому изображению
WidgetImage::WidgetImage(QWidget* pwgt/*=0*/, QString sFileName) : QWidget(pwgt)
{
//Копирование пути в глобальную переменную, 
//для использования в обработчике события рисования
    str1 = sFileName;
}


/*virtual*/ void WidgetImage::paintEvent(QPaintEvent*)
{
    QImage   img(str1);//Загрузка изображения
    QPainter painter;

    painter.begin(this);
//На img2 рисуется изображение из img масштабируемо по высоте
    QImage img2 = img.scaledToHeight(height());
    painter.drawImage(0, 0, img2);//Отрисовка на виджите
    painter.end();
}

//TestSystem.cpp
TestSystem::TestSystem(QMainWindow *pwgt /* = 0*/): QMainWindow(pwgt)
{
    setupUi(this);
...
    QSplitter* splitEditHV;//Объявление разделителя
...
    splitEditHV = new QSplitter(Qt::Vertical);//Создание разделителя вертикально
...
//Создание виджита в разделителе с передачей загружаемого изображения
    widgetImage = new WidgetImage(splitEditHV, "/tmp/shelk-test-0.4.2/temp/tempimage");
    widgetImage->resize(300, 300);//Изменение размера виджета
...
}
Как я предполагаю, что есть проще и правильнее способ, но времени найти его нет прошу помочь.

Ещё интересует вопрос по отлавливанию ошибок try catch. Это первая реализация. Что кроме вынесения в один метод обработчиков, во избежании наличия копированного кода, там можно сделать? Благодарю!

Ещё изменения:
Цитата:
- Добавлен учёт времени тестируемого;
- Добавилась возможность ручного запуска теста, по нажатию на клавишу;
- Добавлена возможность остановки теста, с занесением информации о тестируемом в статистику;
- Добавилась возможность экспорта в файл XWT;
- Добавилась возможность импорта из файла XWT;
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook

Последний раз редактировалось xwicked; 23.11.2011 в 02:34.
xwicked вне форума Ответить с цитированием
Старый 26.01.2012, 21:14   #6
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

0.4.3 - это новая версия программы.

Здравствуйте!

Цитата:
- Добавлено шифрование и сжатие экспортируемого файла теста в формате xwt;
- Исправлена ошибка, когда пароль режима программы хранился и проверялся в открытом виде;
- Добавлена возможность работать с несколькими хранилищами тестов;
- Добавлена возможность резервировать хранилище тестов(со сжатием до 5-ти раз(!));
- Добавлена возможность запроса на сохранение теста, при его закрытии;
Код:
    QString RegimePassword;//Пароль режима
    QByteArray  baPassword;//Хеш пароля;
    RegimePassword = "Password";
    baPassword.append(RegimePassword);
    baPassword = baPassword.toBase64();
    baPassword = qCompress(baPassword, 9);
    baPassword = baPassword.toBase64();
    baPassword = qCompress(baPassword, 9);
    baPassword = baPassword.toBase64();
    RegimePassword.clear();
    RegimePassword.append(baPassword);
Для шифрования используется алгоритм Base64, для сжатия функция qCompress. Этот код может быть реверсирован и получен изначальный пароль фактически в 100%-ом виде. В будущем он будет заменён на md5 хеш или похожий.

А вот следующая проблема - это шифрование самого теста. Алгоритмы те же. При наличии у студента(/пользователя) кода все тесты предстают в абсолютно первозданном виде .
Шифрование по ключу думаю будет слишком хорошая защита, которую мне одному не реализовать. Найти другой вариант за ~2-а месяца у меня не получилось.

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

Последний раз редактировалось xwicked; 26.01.2012 в 21:22.
xwicked вне форума Ответить с цитированием
Старый 26.01.2012, 21:49   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Пусть твой файл имеет header в котором записаны смещения куда был добавлен левый код или защифрованный текст(Болк банарного размером N x N просто защифрован).

пример:
Есть строка:
aaaa
бббб
вввв

Добавим нулей и шифра:
1?3+4|2?2-3(8)?c|3?1-4dx2|
ааа0000а //1 - строка. С третьего символа добавлено 4 знака
бQQQQQQQQб //2 строка c 2 по 3 знак, включительно, зашибровано размером в 8 знаков
вввввввв // 3 стока, с 1 по 4 знак, все символы удвоились.

Запись: header пишется слева на право запись от начала файла.
Чтение: header читается справа на лево и файл с конца.

вот такую простую, но хитро задуманную, штуку я придумал за 5 минут.



З.Ы, с какоо перепугу там 12 метров? О_О

Последний раз редактировалось Человек_Борща; 26.01.2012 в 21:51.
Человек_Борща вне форума Ответить с цитированием
Старый 26.01.2012, 22:38   #8
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
... Запись: header пишется слева на право запись от начала файла.
Чтение: header читается справа на лево и файл с конца.
вот такую простую, но хитро задуманную, штуку я придумал за 5 минут. ...
З.Ы, с какоо перепугу там 12 метров? О_О
Если всё так просто, то если я смогу прочитать, то и другой сможет Нужно что-то другое.
12 метров - это толстый BitRock InstallBuilder(+5МБ).
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 26.01.2012, 22:54   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Если всё так просто, то если я смогу прочитать, то и другой сможет Нужно что-то другое.
12 метров - это толстый BitRock InstallBuilder(+5МБ).
Не думаю. Если бы я не расшифровал на примере, что я ниписал, вы бы не поняли как это разобрать и декодировать.
При желании и header иожно своим алгоритмом криптануть. Я предложил вариант не шифровать весь файл, а замусорить его, закриптоать некоторые блоки.... и расшифровка займет не менее 2 дней точно.

Выкиньте этот инсталятор(+5 мб о_0 чего там на 5 мб??). Smart Install Maker - русский, хороший и шустрый.
Человек_Борща вне форума Ответить с цитированием
Старый 26.01.2012, 23:39   #10
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
По умолчанию

Qt сейчас в кругах школьников тоже толстая библиотека, однако программы получаются ничуть не хуже, но даже лучше других, порой даже на порядок.
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