Запись теста в БД с проверками
This commit is contained in:
parent
978f6c1cc1
commit
74b33f455c
BIN
data/database.db
BIN
data/database.db
Binary file not shown.
|
@ -1,11 +1,11 @@
|
||||||
# Двоичная система. Двоичная арифметика
|
# Двоичная система. Двоичная арифметика
|
||||||
? Двоичная системой счисления является
|
? Двоичная системой счисления является
|
||||||
- Унарная система счисления
|
- Унарная система счисления
|
||||||
- Непозиционная система счисления
|
+ Непозиционная система счисления
|
||||||
- Позиционная система счисления
|
- Позиционная система счисления
|
||||||
? Для записи в двоичной системе счисления используют только две цифры. Какие?
|
? Для записи в двоичной системе счисления используют только две цифры. Какие?
|
||||||
- 2 и 3
|
- 2 и 3
|
||||||
- 2 и 10
|
+ 2 и 10
|
||||||
- 0 и 1
|
- 0 и 1
|
||||||
? Переведите число 1010100 из двоичной системы в десятичную
|
? Переведите число 1010100 из двоичной системы в десятичную
|
||||||
- 84
|
- 84
|
||||||
|
@ -19,8 +19,6 @@
|
||||||
- 110101
|
- 110101
|
||||||
? Вычислите 11001 - 1111 =
|
? Вычислите 11001 - 1111 =
|
||||||
- 1010
|
- 1010
|
||||||
- 1110
|
+ 1110
|
||||||
- 1011
|
- 1011
|
||||||
- 0110
|
- 0110
|
||||||
? Вычислите 11001 - 1111 =
|
|
||||||
- 1010
|
|
||||||
|
|
97
source/app.d
97
source/app.d
|
@ -4,6 +4,7 @@ import core.stdc.stdlib : exit, EXIT_SUCCESS, EXIT_FAILURE;
|
||||||
import std.stdio, std.conv, std.path, std.file, std.format, std.regex, std.array, std.algorithm;
|
import std.stdio, std.conv, std.path, std.file, std.format, std.regex, std.array, std.algorithm;
|
||||||
|
|
||||||
import source.database;
|
import source.database;
|
||||||
|
import source.sql;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
GROUP_THEME = 2,
|
GROUP_THEME = 2,
|
||||||
|
@ -51,29 +52,45 @@ int main(string[] args)
|
||||||
auto regular = regex(pattern, "m");
|
auto regular = regex(pattern, "m");
|
||||||
|
|
||||||
struct Answer {
|
struct Answer {
|
||||||
|
int number;
|
||||||
string text;
|
string text;
|
||||||
bool right;
|
bool truth;
|
||||||
|
|
||||||
// ToDo
|
bool addToDB(int question_id) {
|
||||||
bool addToDB() {
|
int id = sqlAddNewAnswer(question_id, this.number, this.text, this.truth);
|
||||||
|
|
||||||
|
if (!id)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Question {
|
struct Question {
|
||||||
|
int number;
|
||||||
string text;
|
string text;
|
||||||
Answer[int] answers;
|
Answer[int] answers;
|
||||||
|
|
||||||
ulong getCount() {
|
ulong count() {
|
||||||
return answers.length;
|
return answers.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValid() {
|
bool isValid() {
|
||||||
return answers.length > 1;
|
return answers.length > 1;
|
||||||
}
|
}
|
||||||
// ToDo
|
|
||||||
bool addToDB() {
|
bool addToDB(int topic_id) {
|
||||||
|
int id = sqlAddNewQuestion(topic_id, this.number, this.text);
|
||||||
|
|
||||||
|
if (!id)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
foreach (answer; answers.byKeyValue.array.sort!((a, b) => a.key < b.key)) {
|
||||||
|
if (!answer.value.addToDB(id))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +98,7 @@ int main(string[] args)
|
||||||
string text;
|
string text;
|
||||||
Question[int] questions;
|
Question[int] questions;
|
||||||
|
|
||||||
ulong getCount() {
|
ulong count() {
|
||||||
return questions.length;
|
return questions.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,25 +106,69 @@ int main(string[] args)
|
||||||
return questions.length > 1;
|
return questions.length > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDo
|
|
||||||
bool addToDB() {
|
bool addToDB() {
|
||||||
|
if (!check())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int id = sqlAddNewTheme(this.text);
|
||||||
|
|
||||||
|
if (!id)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
foreach (question; this.questions.byKeyValue.array.sort!((a, b) => a.key < b.key)) {
|
||||||
|
if (!question.value.addToDB(id))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void print() {
|
void print() {
|
||||||
writeln("Количество вопросов: %s".format(this.getCount()));
|
writeln("Количество вопросов: %s".format(this.count()));
|
||||||
|
|
||||||
foreach (question; this.questions.byKeyValue.array.sort!((a, b) => a.key < b.key)) {
|
foreach (question; this.questions.byKeyValue.array.sort!((a, b) => a.key < b.key)) {
|
||||||
writeln("\tВопрос №%d: %s".format(question.key, question.value.text));
|
writeln("\tВопрос №%d: %s".format(question.key, question.value.text));
|
||||||
writeln("\tКоличество ответов: %d".format(question.value.getCount()));
|
writeln("\tКоличество ответов: %d".format(question.value.count()));
|
||||||
if (question.value.isValid())
|
|
||||||
foreach (answer; question.value.answers.byKeyValue.array.sort!((a, b) => a.key < b.key)) {
|
foreach (answer; question.value.answers.byKeyValue.array.sort!((a, b) => a.key < b.key)) {
|
||||||
writeln("\t\tОтвет №%d: %s".format(answer.key, answer.value.text));
|
writeln("\t\tОтвет №%d: %s".format(answer.key, answer.value.text));
|
||||||
}
|
}
|
||||||
else
|
|
||||||
writeln("\t\tНедостаточно количества ответов");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool check() {
|
||||||
|
bool error = false;
|
||||||
|
|
||||||
|
if (!this.isValid()) {
|
||||||
|
writeln("Недостаточное количество вопросов: %d".format(this.count()));
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!error) {
|
||||||
|
foreach (question; this.questions.byKeyValue.array.sort!((a, b) => a.key < b.key)) {
|
||||||
|
if (!question.value.isValid()) {
|
||||||
|
writeln("Вопрос №%d \"%s\" содержит недостаточное количество ответов: %d".format(
|
||||||
|
question.key, question.value.text, question.value.count()
|
||||||
|
));
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int truth;
|
||||||
|
|
||||||
|
foreach (answer; question.value.answers) {
|
||||||
|
if (answer.truth)
|
||||||
|
++truth;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (truth > 1) {
|
||||||
|
writeln("Вопрос №%d \"%s\" содержит более одного правильного ответа".format(
|
||||||
|
question.key, question.value.text
|
||||||
|
));
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return !error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Theme theme;
|
Theme theme;
|
||||||
|
@ -132,24 +193,26 @@ int main(string[] args)
|
||||||
if (match[GROUP_QUESTION].length)
|
if (match[GROUP_QUESTION].length)
|
||||||
{
|
{
|
||||||
numAnswer = 0;
|
numAnswer = 0;
|
||||||
theme.questions[++numQuestion] = Question(match[GROUP_QUESTION_TEXT]);
|
theme.questions[++numQuestion] = Question(numQuestion, match[GROUP_QUESTION_TEXT]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (match[GROUP_ANSWER].length)
|
if (match[GROUP_ANSWER].length)
|
||||||
{
|
{
|
||||||
theme.questions[numQuestion].answers[++numAnswer] = Answer(match[GROUP_ANSWER_TEXT], false);
|
theme.questions[numQuestion].answers[++numAnswer] = Answer(numAnswer, match[GROUP_ANSWER_TEXT], false);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (match[GROUP_ANSWER_RIGHT].length)
|
if (match[GROUP_ANSWER_RIGHT].length)
|
||||||
{
|
{
|
||||||
theme.questions[numQuestion].answers[++numAnswer] = Answer(match[GROUP_ANSWER_RIGHT_TEXT], true);
|
theme.questions[numQuestion].answers[++numAnswer] = Answer(numAnswer, match[GROUP_ANSWER_RIGHT_TEXT], true);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
theme.print();
|
// theme.print();
|
||||||
|
// theme.check();
|
||||||
|
theme.addToDB();
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
module source.sql;
|
||||||
|
|
||||||
|
import singlog;
|
||||||
|
import std.conv;
|
||||||
|
|
||||||
|
import source.dblite;
|
||||||
|
|
||||||
|
int sqlAddNewTheme(string topic) {
|
||||||
|
try {
|
||||||
|
auto queryResult = dblite.sql(
|
||||||
|
"insert into topics (name) values (?) returning id",
|
||||||
|
topic
|
||||||
|
);
|
||||||
|
if (!queryResult.empty())
|
||||||
|
return queryResult.front()["id"].to!int;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.e("Не удалось выполнить запрос к БД. " ~ e.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sqlAddNewQuestion(int topic_id, int question_number, string question_text) {
|
||||||
|
try {
|
||||||
|
auto queryResult = dblite.sql(
|
||||||
|
"insert into questions (topic_id, number, text) values (?, ?, ?) returning id",
|
||||||
|
topic_id, question_number, question_text
|
||||||
|
);
|
||||||
|
if (!queryResult.empty())
|
||||||
|
return queryResult.front()["id"].to!int;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.e("Не удалось выполнить запрос к БД. " ~ e.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sqlAddNewAnswer(int question_id, int answer_number, string answer_text, int answer_truth) {
|
||||||
|
try {
|
||||||
|
auto queryResult = dblite.sql(
|
||||||
|
"insert into answers (question_id, number, text, truth) values (?, ?, ?, ?) returning id",
|
||||||
|
question_id, answer_number, answer_text, answer_truth
|
||||||
|
);
|
||||||
|
if (!queryResult.empty())
|
||||||
|
return queryResult.front()["id"].to!int;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.e("Не удалось выполнить запрос к БД. " ~ e.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue