Как говорится в этой строке:
В компьютерных науках предикат, который, если он истинен, будет оставаться верным в течение определенной последовательности операций, называется () инвариантным к этой последовательности.
Чтобы лучше понять эту надежду, этот пример в C ++ помогает.
Рассмотрим сценарий, в котором необходимо получить некоторые значения и получить их общее количество в переменной с именем count
и добавить их в переменную с именем sum
.
Инвариант (опять же, это больше похоже на концепцию):
// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades
Код для вышеупомянутого будет что-то вроде этого,
int count=0;
double sum=0,x=0;
while (cin >> x) {
++count;
sum+=x;
}
Что делает вышеуказанный код?
1) Считывает ввод из cin
и помещает их в x
2) После одного успешного чтения увеличиваем count
и sum = sum + x
3) Повторите 1-2, пока чтение не остановится (т.е. ctrl + D)
Инвариант петли:
Инвариант должен быть True ВСЕГДА . Итак, изначально вы начинаете свой код только с этого
while(cin>>x){
}
Этот цикл читает данные со стандартного ввода и сохраняет их в x. Ну и хорошо. Но инвариант становится ложным, потому что первая часть нашего инварианта не была соблюдена (или оставалась верной).
// we have read count grades so far, and
Как сохранить инвариант истинным?
Simple! счетчик приращений.
Так что ++count;
будет хорошо! Теперь наш код становится примерно таким:
while(cin>>x){
++count;
}
Но
Даже сейчас наш инвариант (концепция, которая должна быть ИСТИНА) является ложным, потому что теперь мы не удовлетворили вторую часть нашего инварианта.
// sum is the sum of the first count grades
Так что же теперь делать?
Добавьте x
к sum
и сохраните его в sum
(sum+=x
) и в следующий раз
cin>>x
будет читать новое значение в x.
Теперь наш код становится примерно таким,
while(cin>>x){
++count;
sum+=x;
}
Давайте проверим
Соответствует ли код нашему инварианту
// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades
код:
while(cin>>x){
++count;
sum+=x;
}
Ах !. Теперь инвариант цикла - True всегда , и код работает нормально.
Приведенный выше пример был взят и изменен из книги Ускоренный C ++ Эндрю-Кенингом и Барбарой-E