NickAndNick

Тест по электронике

Nov 28th, 2021
896
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <string>
  3. #include <array>
  4. #include <vector>
  5. #include <random>
  6.  
  7. using namespace std;
  8.  
  9. class Question {
  10. public:
  11.     Question() {
  12.         random_device device;
  13.         gen.seed(device());
  14.     }
  15.     Question(const pair<string, array<string, 4U>>& box)
  16.         : options(box.second), question(box.first), answer(options.front()) {
  17.         random_device device;
  18.         gen.seed(device());
  19.     }
  20.     string show() {
  21.         shuffle(options.begin(), options.end(), gen);
  22.         cout << " " << question << "\n\n";
  23.         int n = 0;
  24.         for (const auto& option : options) {
  25.             cout << ++n << ". " << option << '\n';
  26.         }
  27.         cout << "\nВыберите номер правильного ответа и нажмите Enter: ";
  28.         int choice;
  29.         cin >> choice;
  30.         cin.ignore(cin.rdbuf()->in_avail());
  31.         system("cls");
  32.         --choice;
  33.         return choice < 0 || choice >= int(options.size()) ? "" : options[choice];
  34.     }
  35.     int attempt(const string& value)const {
  36.         return value == answer;
  37.     }
  38. private:
  39.     mt19937 gen;
  40.     array<string, 4U> options;
  41.     string question;
  42.     string answer;
  43. };
  44.  
  45. class Electronics {
  46. public:
  47.     inline static string title{ "электронике" };
  48.     Electronics(array<Question, 5U> questions) : questions(questions) {
  49.         random_device device;
  50.         gen.seed(device());
  51.         shuffle(questions.begin(), questions.end(), gen);
  52.     }
  53.     pair<string, int> test(const string& name) {
  54.         pair<string, int> box{ name, 0 };
  55.         for (auto& question : questions) {
  56.             if (question.attempt(question.show())) {
  57.                 ++box.second;
  58.             }
  59.         }
  60.         return box;
  61.     }
  62. private:
  63.     mt19937 gen;
  64.     array<Question, 5U> questions;
  65. };
  66.  
  67. class Query {
  68. public:
  69.     Query() {
  70.         random_device device;
  71.         gen.seed(device());
  72.     }
  73.     array<Question, 5U> get() {
  74.         shuffle(box.begin(), box.end(), gen);
  75.         array<Question, 5U> questions;
  76.         copy(box.begin(), box.begin() + 5U, questions.begin());
  77.         return questions;
  78.     }
  79. private:
  80.     mt19937 gen;
  81.     inline static vector<Question> box{
  82.         { { "Полупроводниковый резистор, электрическое сопротивление (проводимость)\nкоторого нелинейно зависит от приложенного напряжения",
  83.         { "Варистор", "Переменный резистор", "Подстроечный резистор", "Фоторезистор" } } },
  84.         { { "Электронный прибор, в котором пьезоэлектрический эффект и явление\nмеханического резонанса используются для построения высокодобротного\nрезонансного элемента электронной схемы",
  85.         { "Кварцевый резонатор", "Мемристор", "Бареттер", "Самовосстанавливающийся предохранитель" } } },
  86.         { { "Электрический конденсатор, ёмкость которого нелинейно изменяется\nв широких пределах в зависимости от напряжения, приложенного к его обкладкам",
  87.         { "Вариконд", "Стабилитрон", "Переменный конденсатор", "Варикап" } } },
  88.         { { "Полупроводниковый прибор с тремя электродами и одним p-n переходом",
  89.         { "Однопереходный транзистор", "Полевой транзистор", "Биполярный транзистор", "Составной транзистор" } } },
  90.         { { "Интегральная схема, в которой наряду с элементами, неразъёмно связанными\nна поверхности или в объёме подложки, используются навесные\nмикроминиатюрные элементы",
  91.         { "Гибридная микросхема", "Цифровая интегральная схема", "Аналоговая интегральная схема", "Аналого-цифровая интегральная схема" } } },
  92.         { { "Электронный прибор, состоящий из излучателя света и фотоприёмника,\nсвязанных оптическим каналом и, как правило, объединённых в общем корпусе",
  93.         { "Оптрон", "Фототиристор", "Фоторезистор", "Фотодиод" } } },
  94.         { { "Ионный прибор, в котором при помощи одного или нескольких управляющих\nэлектродов обеспечивается управление моментом возникновения разряда",
  95.         { "Тиратрон", "Кенотрон", "Игнитрон", "Клистрон" } } },
  96.         { { "Электромеханический бистабильный знакосинтезирующий индикатор с матричным\nпринципом формирования изображения",
  97.         { "Блинкерное табло", "Семисегментный индикатор", "Матричный индикатор", "Газоразрядный индикатор" } } },
  98.         { { "Резистор, сопротивление которого изменяется в зависимости от его деформации",
  99.         { "Тензорезистор", "Фоторезистор", "Стабистор", "Подстроечный резистор" } } },
  100.         { { "Что не входит в цепь колебательного контура?",
  101.         { "Резистор", "Катушка индуктивности", "Конденсатор", "Источник электрической энергии" } } }
  102.     };
  103. };
  104.  
  105. void test_electronics() {
  106.     Query query;
  107.     while (true) {
  108.         auto test = query.get();
  109.         Electronics electronics(test);
  110.         cout << "Введите Ф.И.О.: ";
  111.         string person;
  112.         getline(cin, person);
  113.         auto [name, result] = electronics.test(person);
  114.         cout
  115.             << "Студент " << name
  116.             << " сдал test по " << electronics.title
  117.             << " на оценку " << result << '\n';
  118.         system("pause");
  119.         system("cls");
  120.     }
  121. }
  122.  
  123. int main() {
  124.     system("chcp 1251 > nul");
  125.     test_electronics();
  126.     system("pause > nul");
  127. }
RAW Paste Data