Сначала немного теории. Тут у нас импликация(если..то...), комбинированная с конъюнкцией(и). Таблица истинности импликации(стрелочки): 0 0 1 0 1 1 1 0 0 1 1 1 Общее правило: если a<=b, тогда правда Таблица истинности конъюнкции(/\): 0 0 0 0 1 0 1 0 0 1 1 1 Общее правило: если есть одна ложь-всё ложь Теперь о примере: Просто подставляем вместо x варианты. Так как между двумя скобочками с Если... То... стоит И, нам нужен вариант, где оба Если... То... являются правдой. Рассмотрим подробно 1 вариант: 21<25 - это правда 21<23 - это правда Таким образом, в первых скобочках правда, это доказывает таблица истинности, приведённая выше. 21<22 - это правда 21>21 - это ложь В этих скобочках-ложь. А так как ложь и правда в И являются ложью, нам не подходит данный вариант 2 вариант-верный ответ, т.к.: 22<25 - это правда 22<23 - это правда В первых скобочках правда 22<22 - это ложь 22>21 - это правда И в этих скобках правда. Как можно убедится, снова взглянув в таблицу истинности для конъюнкции, всё выражение является правдой. 3 и 4 посмотрите сами и убедитесь что это ложь.
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
void fillVector(std::vector<int>&, int lowerBound, int upperBound);
void print(const std::vector<int>&);
int main() {
std::vector<int> vec { };
std::size_t size { 0 };
std::cout
<< "Please, enter the number of elements: ";
std::cin
>> size;
if (size < 1 || size > 1000) {
std::cerr
<< "The size must be in the range [1; 1000]" << std::endl;
return 1;
}
vec.resize(size);
fillVector(vec, 0, 100);
print(vec);
std::size_t changes { 0 };
for (std::size_t i { 0 }; i < vec.size() - 1; ++i) {
int tempValue { 0 };
for (std::size_t j { i + 1 }; j < vec.size(); ++j) {
if (vec.at(i) > vec.at(j)) {
tempValue = vec.at(i);
vec.at(i) = vec.at(j);
vec.at(j) = tempValue;
++changes;
}
}
}
print(vec);
std::cout
<< "Number of changes: " << changes << std::endl;
return 0;
}
void fillVector(std::vector<int>& vec, int lowerBound, int upperBound) {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(lowerBound, upperBound);
int randomValue { };
for (auto& value : vec) {
while (true) {
randomValue = dist(gen);
if ( std::find( vec.begin(), vec.end(), randomValue) == vec.end() ){
value = randomValue;
break;
}
}
}
}
void print(const std::vector<int>& vec) {
for (const auto value : vec) {
std::cout
<< value << " ";
}
std::cout
<< std::endl;
}
Тут у нас импликация(если..то...), комбинированная с конъюнкцией(и).
Таблица истинности импликации(стрелочки):
0 0 1
0 1 1
1 0 0
1 1 1
Общее правило: если a<=b, тогда правда
Таблица истинности конъюнкции(/\):
0 0 0
0 1 0
1 0 0
1 1 1
Общее правило: если есть одна ложь-всё ложь
Теперь о примере:
Просто подставляем вместо x варианты. Так как между двумя скобочками с Если... То... стоит И, нам нужен вариант, где оба Если... То... являются правдой.
Рассмотрим подробно 1 вариант:
21<25 - это правда
21<23 - это правда
Таким образом, в первых скобочках правда, это доказывает таблица истинности, приведённая выше.
21<22 - это правда
21>21 - это ложь
В этих скобочках-ложь.
А так как ложь и правда в И являются ложью, нам не подходит данный вариант
2 вариант-верный ответ, т.к.:
22<25 - это правда
22<23 - это правда
В первых скобочках правда
22<22 - это ложь
22>21 - это правда
И в этих скобках правда.
Как можно убедится, снова взглянув в таблицу истинности для конъюнкции, всё выражение является правдой.
3 и 4 посмотрите сами и убедитесь что это ложь.