Инвариант цикла для цикла while
Привет,
Я пишу программу калькулятора Post Fix, но у меня возникли проблемы с определением инварианта цикла. Я пробовал искать примеры в интернете и на Youtube, но большинство примеров предназначены для простых функций, которые обычно не включают в себя много if-операторов.
Алгоритм толкает некоторое число, взятое у пользователя, в стек, а затем выталкивает последние два числа в стеке, если пользователь вводит арифметический оператор и толкает результат обратно в стек.
Я очень ценю любые намеки на то, каким должен быть инвариант цикла для этого алгоритма. Кроме того, любые известные вам ресурсы (интернет, книги, электронные книги), которые дают объяснение инварианта цикла, а также примеры более сложных алгоритмов, которые включают в себя if-операторы и принимают входные данные от пользователя, приветствуются!
public static void main(String [] args){ Scanner keyboard = new Scanner(System.in);//to read input from the user Stack stack = new Stack(); //to push user input into the stack if it is a number String input = ""; //to save user input into a variable int tempVar = 0; //to save a poped number for calculation System.out.println("\nWelcome To The Postfix Calculator!");//printing message for the user do{ //ask user to enter a value System.out.print("\nEnter a number or an arthmetic operator, or 0 to display the result: "); input = keyboard.nextLine(); //put user input into a variable /*If input is "+" the last two elements in the stack are poped and their addition * is pushed into the stack*/ if(input.equals("+")){ tempVar = (int)stack.pop(); tempVar = (int)stack.pop() + tempVar; stack.push(tempVar); } /*If input is "-" the last two elements in the stack are poped and their subctraction * is pushed into the stack*/ else if(input.equals("-")){ tempVar = (int)stack.pop(); tempVar = (int)stack.pop() - tempVar; stack.push(tempVar); } /*If input is "*" the last two elements in the stack are poped and their multiplication * is pushed into the stack*/ else if(input.equals("*")){ tempVar = (int)stack.pop(); tempVar = (int)stack.pop() * tempVar; stack.push(tempVar); } /*If input is "/" the last two elements in the stack are poped and their division * is pushed into the stack*/ else if(input.equals("/")){ tempVar = (int)stack.pop(); tempVar = (int)stack.pop() / tempVar; stack.push(tempVar); } /*If input is none of these and not "0" then the number is parsed and pushed into the * stack*/ else if(!input.equals("0")) stack.push(Integer.parseInt(input)); } while(!input.equals("0")); if(stack.empty()) System.out.println("\nYou haven't entered any value, please try again."); else System.out.println("\nFinal Value: " + stack.pop()); }
Что я уже пробовал:
Я попытался изучить некоторые примеры инварианта цикла, но не смог найти примеров для более сложных алгоритмов
Sergey Alexandrovich Kryukov
Зачем вам такие примеры? Вы понимаете, что это значит-инвариант цикла? Если вы это сделаете, то сможете построить необходимый вам инвариант. Я не понимаю, чем" легкие "образцы отличаются от" сложных " и почему они важны.
Может быть, весь ваш подход неправильный или, скорее, искусственный. Считаете ли вы, что инвариант - это то, что вы должны найти? Нет, это исходит из алгоритма. Вероятно, ваша ошибка заключается в понятии "инвариант должен быть для этого алгоритма". Нет, ничего "не должно". Инвариант - это всего лишь один из математических и алгоритмических методов, которые могут быть полезны, а могут и не быть. Я понятия не имею, что заставляет вас думать, что это "должно быть" там, в данном конкретном случае.
Другими словами, ваша цель и мотивация совершенно неясны.
—СА
Member 12569032
Моя цель-найти все инварианты цикла, необходимые для формального доказательства того, что алгоритм делает то, для чего он создан, используя индукцию. Предполагается, что пользовательский ввод является правильным, и мне нужно доказать только частичную коррекцию (доказательство завершения не требуется).
Sergey Alexandrovich Kryukov
Инвариант не является единственным средством доказательства и не всегда применим...
—СА