#include <cstdlib> Иногда нумерация дублируется вопросов.
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
system("chcp 1251>nul");
int a,A,B,C,D,E;
// const int //Размер массива
a=5;
srand(time(NULL)); //Инициализация генератора случайных чисел
int nums[a]; // Создание массива
for (int a=1;a<=5;a++){
nums[a] =1+rand()%(31);
cout<< "\t Вопрос № - "<< nums[a] <<endl;
cout<<"\n";
}
A=nums[1];
B=nums[2];
C=nums[3];
D=nums[4];
E=nums[5];
if(A==B&&C&&D&&E){ // Не работает
A=32;
}
else{
A=nums[1];
}
if(B==C&&D&&E){
B=33;
}
else{
B=nums[2];
}
if(C==D&&E){
C=34;
}
else{
C=nums[3];
}
if(D==E){
D=35;
}
else{
D=nums[4];
}
cout<<"\n"<<"\t A="<< A<<endl;
cout<<"\n"<<"\t B="<< B<<endl;
cout<<"\n"<<"\t C="<< C<<endl;
cout<<"\n"<<"\t D="<< D<<endl;
cout<<"\n"<<"\t E="<< E<<endl;
cout<<"\n"<<"\t nums="<<nums[1] <<endl;
cout<<"\n"<<"\t nums="<<nums[2] <<endl;
cout<<"\n"<<"\t nums="<<nums[3] <<endl;
cout<<"\n"<<"\t nums="<<nums[4] <<endl;
cout<<"\n"<<"\t nums="<<nums[5] <<endl;
return 0;
}
Вопрос:После запуска генератора сл.чисел выводится одинаковые числа. Чтобы
этого не происходило добавил проверку с оператором if. Однако при сравнении
в 1-ом и 2-ом оператор не работает, почему не понимаю. Программа ошибок не
находит.
Выражение A == B && C && D && E
с учётом приоритета операций (приоритет ==
выше чем приоритет &&
, который в свою очередь выше чем приоритет ||
) и с учётом ассоциативности оператора &&
(также как и у ||
— слева направо) будет эквивалентно следующему:
(((A == B) && C) && D) && E
Также здесь следует учесть что оператор &&
(как и ||
) вычисляется по сокращённой схеме (short-circuit evaluation).
Для оператора &&
это означает, что правый операнд вычисляется в том и только в том случае, если левый true
.
Для оператора ||
это означает, что правый операнд вычисляется в том и только в том случае, если левый false
.
Более того, левый операнд является упорядоченным перед правым операндом, т.е. все вычисления и побочные эффекты связанные с левым операндом выполняются до всех вычислений и побочных эффектов связанных с правым операндом.
С учётом написанного, порядок вычисления приведённого выше выражения следующий:
A == B
ложно, то дальнейшие вычисления не производятся, и выражение A == B && C && D && E
ложно, иначеC
ложно, то дальнейшие вычисления не производятся, и выражениеA == B && C && D && E
ложно, иначеD
ложно, то дальнейшие вычисления не производятся, и выражение A == B && C && D && E
ложно, иначеE
ложно, то дальнейшие вычисления не производятся, и выражение A == B && C && D && E
ложно, иначеA == B && C && D && E
истинно.В вашей программе есть несколько ошибок.
Во-первых, размер массива nums
должен быть константным выражением, т.е. переменную a
следует объявить с квалификатором const
:
const int a = 5;
Во-вторых, массивы в C++ нумеруются с нуля. Первый элемент в массиве nums
имеет индекс 0
, а последний элемент имеет индекс 4
. Попытка обращения к несуществующему пятому элементу массива — неопределённое поведение — так делать не нужно.
В-третьих, вы пытаетесь проверить, равна ли переменная A
хотя бы одной из переменных B
, C
, D
или E
, используя следующее условие:
if (A == B && C && D && E)
и это не верно. В первой части ответа я написал как вычисляется это условие.
Чтобы добиться последовательного сравнения переменной A
со всеми остальными переменными используйте логическое или, а именно бинарный оператор ||
:
if (A == B || A == C || A == D || A == E)
С учётом приоритета операторов приведённое выше выражение интерпретируется так:
if ( (A == B) || (A == C) || (A == D) || (A == E) )
а с учётом ассоциативности так:
if ( ( ( (A == B) || (A == C) ) || (A == D) ) || (A == E) )
т.е. тело if
выполнится в том и только в том случае, если A
равно хотя бы одной из переменных B
, C
, D
или E
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Нужно сравнить два числа, количество цифр которых будет равняться вплоть до 10^6 (Тип данных записан как string)Какие помимо этого способа существуют...