Member 12569032 Ответов: 0

Инвариант цикла для цикла 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

Инвариант не является единственным средством доказательства и не всегда применим...
—СА

0 Ответов