CS 211 Programming Practicum Spring 2018

Similar documents
CS 211 Programming Practicum Spring 2017

CS 211 Programming Practicum Fall 2018

CS 211. Project 5 Infix Expression Evaluation

CSCI 204 Introduction to Computer Science II. Lab 6: Stack ADT

STACKS. A stack is defined in terms of its behavior. The common operations associated with a stack are as follows:

SimpleCalc. which can be entered into a TI calculator, like the one on the right, like this:

Project 1: Implementation of the Stack ADT and Its Application

Stack Abstract Data Type

CS211 Programming Practicum Fall 2017

Stacks. stacks of dishes or trays in a cafeteria. Last In First Out discipline (LIFO)

Lab 7 1 Due Thu., 6 Apr. 2017

March 13/2003 Jayakanth Srinivasan,

Stacks. Chapter 5. Copyright 2012 by Pearson Education, Inc. All rights reserved

CMPS 390 Data Structures

Data Structure using C++ Lecture 04. Data Structures and algorithm analysis in C++ Chapter , 3.2, 3.2.1

Some Applications of Stack. Spring Semester 2007 Programming and Data Structure 1

Stacks Fall 2018 Margaret Reid-Miller

infix expressions (review)

09 STACK APPLICATION DATA STRUCTURES AND ALGORITHMS REVERSE POLISH NOTATION

Stacks. Chapter 5. Copyright 2012 by Pearson Education, Inc. All rights reserved

STACKS AND QUEUES. Problem Solving with Computers-II

CSCI 200 Lab 4 Evaluating infix arithmetic expressions

Stacks. Revised based on textbook author s notes.

Stack Applications. Lecture 27 Sections Robb T. Koether. Hampden-Sydney College. Wed, Mar 29, 2017

Data Structure using C++ Lecture 04. Data Structures and algorithm analysis in C++ Chapter , 3.2, 3.2.1

-The Hacker's Dictionary. Friedrich L. Bauer German computer scientist who proposed "stack method of expression evaluation" in 1955.

Operators. Java operators are classified into three categories:

Stack. 4. In Stack all Operations such as Insertion and Deletion are permitted at only one end. Size of the Stack 6. Maximum Value of Stack Top 5

IV. Stacks. A. Introduction 1. Consider the 4 problems on pp (1) Model the discard pile in a card game. (2) Model a railroad switching yard

ADT Stack. Inserting and deleting elements occurs at the top of Stack S. top. bottom. Stack S

Project 3: RPN Calculator

Stack and Its Implementation

Stacks (Section 2) By: Pramod Parajuli, Department of Computer Science, St. Xavier s College, Nepal.

Data Structures Week #3. Stacks

Linear Data Structure

CE204 Data Structures and Algorithms Part 2

Stacks II. Adventures in Notation. stacks2 1

CISC-235. At this point we fnally turned our atention to a data structure: the stack

Assignment 5. Introduction

15-122: Principles of Imperative Computation, Fall 2015

Top of the Stack. Stack ADT

Assignment 4 Publication date: 27/12/2015 Submission date: 17/01/ :59 People in-charge: R. Mairon and Y. Twitto

The Stack and Queue Types

Stacks and their Applications

Postfix Notation is a notation in which the operator follows its operands in the expression (e.g ).

Top of the Stack. Stack ADT

Advanced Java Concepts Unit 3: Stacks and Queues

CMPSCI 187 / Spring 2015 Postfix Expression Evaluator

Lecture 12 ADTs and Stacks

Stacks, Queues (cont d)

CS Introduction to Data Structures How to Parse Arithmetic Expressions

VTU NOTES QUESTION PAPERS NEWS RESULTS FORUMS THE STACK

EECS 311: Data Structures and Data Management Program 1 Assigned: 10/21/10 Checkpoint: 11/2/10; Due: 11/9/10

Chapter 2 - Introduction to C Programming

Stack ADT. ! push(x) puts the element x on top of the stack! pop removes the topmost element from the stack.

Data Structures and Algorithms

10/26/2017 CHAPTER 3 & 4. Stacks & Queues. The Collection Framework

CompSci 105 S2 C - ASSIGNMENT TWO -

1.00/ Introduction to Computers and Engineering Problem Solving. Final / December 13, 2004

EC8393FUNDAMENTALS OF DATA STRUCTURES IN C Unit 3

Lecture 4: Stack Applications CS2504/CS4092 Algorithms and Linear Data Structures. Parentheses and Mathematical Expressions

C: How to Program. Week /Mar/05

// The next 4 functions return true on success, false on failure

Operators & Expressions

Stacks Calculator Application. Alexandra Stefan

Data Structures and Algorithms

CISC

Introduction to Programming Using Java (98-388)

Programming, Data Structures and Algorithms Prof. Hema A Murthy Department of Computer Science and Engineering Indian Institute of Technology, Madras

} Evaluate the following expressions: 1. int x = 5 / 2 + 2; 2. int x = / 2; 3. int x = 5 / ; 4. double x = 5 / 2.

Lecture 8: Simple Calculator Application

Chapter 2: Using Data

[CS302-Data Structures] Homework 2: Stacks

The Stack ADT. Stacks. The Stack ADT. The Stack ADT. Set of objects in which the location an item is inserted and deleted is prespecified.

CS 112 Introduction to Computing II. Wayne Snyder Computer Science Department Boston University

Problem with Scanning an Infix Expression

A LISP Interpreter in ML

Basic Operations jgrasp debugger Writing Programs & Checkstyle

Queues Fall 2018 Margaret Reid-Miller

Stating the obvious, people and computers do not speak the same language.

Data Structure. Recitation IV

Formal Languages and Automata Theory, SS Project (due Week 14)

CS 315 Software Design Homework 3 Preconditions, Postconditions, Invariants Due: Sept. 29, 11:30 PM

Stack Applications. Lecture 25 Sections Robb T. Koether. Hampden-Sydney College. Mon, Mar 30, 2015

Data Types and Variables in C language

1.00/ Introduction to Computers and Engineering Problem Solving. Final / December 13, 2004

An Introduction to Trees

CS2383 Programming Assignment 3

ECE 122 Engineering Problem Solving with Java

Containers: Stack. Jordi Cortadella and Jordi Petit Department of Computer Science

CSIS 10B Lab 2 Bags and Stacks

Lecture 4 Stack and Queue

Two Types of Types. Primitive Types in Java. Using Primitive Variables. Class #07: Java Primitives. Integer types.

Department of Computer Science & Engineering Indian Institute of Technology Kharagpur. Practice Sheet #13

STACKS 3.1 INTRODUCTION 3.2 DEFINITION

Lists are great, but. Stacks 2

Introduction to C Programming. Chih-Wei Tang ( 唐之瑋 ) Department of Communication Engineering National Central University JhongLi, Taiwan

Infix to Postfix Conversion

Containers: Stack. The Stack ADT. The Stack ADT. The Stack ADT

Special Section: Building Your Own Compiler

Transcription:

Due: Thursday, 4/5/18 at 11:59 pm Infix Expression Evaluator Programming Project 5 For this lab, write a C++ program that will evaluate an infix expression. The algorithm REQUIRED for this program will use two stacks, an operator stack and a value stack. Both stacks MUST be implemented using a dynamic array class (not struct) that you write. The commands used by this system are listed below and are to come from standard input. Your program is to prompt the user for input and display error messages for unknown commands. The code in proj5base.cpp already does this for you. You are expected to use that code as the base for your project. Command Description q Quit the program.? List the commands used by this program and a brief description of how to use each one. <infixexpression> Evaluate the given infix expression and display its result. The <infixexpression> will only use the operators of addition, subtraction, multiplication, division and the parentheses. It will also only contain unsigned (i.e. positive) integer values. We obviously could allow for more operators and more types of values, but the purpose of this assignment is to focus on writing classes and not on complicated arithmetic expressions. Infix Expression are when the operators of addition, subtraction, multiplication and division are listed IN between the values. Infix Expressions require the use of parentheses to express nonstandard precedence. Examples of Infix Expressions are: 42 + 64 60 + 43 * 18 + 57 (60 + 43) * (18 + 57) 18 12 3 18 (12 3) The simplest algorithm to evaluate an Infix Expression includes a translation from an Infix expression to a Postfix Expression and then evaluating the Postfix Expression. The algorithm that we will use combines the translation and evaluation into a single algorithm. So the following short discussion of Postfix expression may be useful in understanding our algorithm. Note that all of these algorithms requires the use of stacks; hence, the reason for the stack class. Postfix Expressions are when the operators of addition, subtraction, multiplication and division are list AFTER (i.e. post ) the values. Postfix Expression never require the use of parentheses to express non-standard precedence. The fact that postfix expressions do not need parentheses makes them much easier to evaluate than infix expressions. In fact, most computers first convert infix expression to a postfix expression and then evaluate that postfix expression.

A postfix expression is evaluated using a stack. When a value is encountered, it is pushed onto the stack. When an operator is encountered, two values are popped from the stack. Those values are evaluated using the operation implied by the operator. Then the result is pushed back onto the stack. When the end of a postfix expression is encountered, the value on the top of the stack is the result of the expression. There should only be one value on the stack when the end of the postfix expression is encountered. Examples of Postfix Expressions are: 42 64 + 60 43 18 * + 57 + 60 43 + 18 57 + * 18 12 3 18 12 3 Both the algorithm to convert an infix expression to a postfix expression and the algorithm to evaluate a postfix expression require the use of stacks. Note that the conversion algorithm requires a stack of operators, while the evaluation algorithm requires a stack of values. For this program, you are to write the following methods for the dynamic array stack class: void init( ); // initialize the stack for use THIS MAY BE A CONSTRUCTOR boolean isempty ( ); // return true if the stack has no members void push (data); // add the data to the top of stack; grow dynamic array if needed data top ( ); // return the data value on the top of the stack void pop ( ); // remove the data value from the top of the stack void reset ( ); // clear the stack to remove any values it contains For this program, your dynamic array MUST start with 2 positions in the array. When the array needs to grow, it size MUST grow by 2 additional positions each time (note the array to grow in size from 2 to 4 to 6 to 8 to 10 to...). Note the init( ) method to set up the stack should really be a constructor (but could be a normal method). You can also write a toppop( ) method that combine both the top and pop operations in a single method. Also, note that since the values from the infix expressions will all be integer values (we will only do integer division), and since the operators can all be represented as characters (which is a sub-class of integers), you are more than welcome to write a single stack class which store integers to be used for both stacks. The instance/variable containing for each stack MUST be declared as a local variable to some method (it may be as a local variable to a method other than main( ) ). It may NOT be global. Each operation performed on the stack MUST be done in its own method. ALL data members of the stack class MUST use access modifier of private.

Algorithm for Infix to Postfix Conversation and Postfix Evaluation When getting the input for an infix expression, the program proj5base.cpp breaks everything down into tokens. There are 3 types of tokens we are mostly concerned with: an OPERATOR token, a VALUE token and the EndOfLine token. The code in the function processexpression() already checks for these token but you will need to add the code how to interact with the stacks. First step: Empty both the OperatorStack and the ValueStack Second Step: While (the current token is not the EndOfLine Token) if ( the current token is a VALUE ) push the value onto the ValueStack if ( the current token is an OPERATOR ) if ( the current operator is an Open Parenthesis ) push the Open Parenthesis onto the OperatorStack if ( the current operator is + or - ) while ( the OperatorStack is not Empty && the top of the OperatorStack is +, -, * or / ) push the current operator on the OperatorStack if ( the current operator is * or / ) while ( the OperatorStack is not Empty && the top of the OperatorStack is * or / ) push the current operator on the OperatorStack if ( the current operator is a Closing Parenthesis ) while ( the Operator Stack is not Empty && the top of the OperatorStack is not an Open Parenthesis ) if (the OperatorStack is Empty ) print an error message else pop the Open Parenthesis from the OperatorStack get the next token from the input Third Step: Once the EndOfLine token is encountered while (the OperatorStack is not Empty ) Print out the top of the ValueStack at the result of the expression Popping the ValueStack should make it empty, print error if not empty The error statements in the above algorithm should only occur if an invalid infix expression is given as input. You are not required to check for any other errors in the input.

The above algorithm calls another alogorithm called which is shown below. This algorithm plays a critical role in the overall Evaluation of our expressions. op = top (OperatorStack) pop (OperatorStack) v2 = top (ValueStack) pop (ValueStack) v1 = top (ValueStack) pop (ValueStack) v3 = eval ( v1, op, v2 ) push (ValueStack, v3) To keep some of the error handling/recovery simple for this project, if you are trying to perform a top operation on an empty ValueStack, print out an error message and return the value of -999. If the operator op for eval ( ) is not one of *, /, + or -, print out and error message and return the value of -999. Command Line Argument: Debug Mode Your program is to be able to take one optional command line argument, the -d flag. When this flag is given, your program is to run in "debug" mode. When in this mode, your program should display the operators and values as they are encountered in the input. The printf statements for these are already included in the program proj5base.cpp, so you just need to make them print only if the d flag is given. When the flag is not given, this debugging information should not be displayed. One simple way to set up a "debugging" mode is to use a boolean variable which is set to true when debugging mode is turned on but false otherwise. This variable may be a global variable. Then using a simple if statement controls whether information should be output or not. if ( debugmode == TRUE ) printf (" Debugging Information \n"); Provided Code for the User Inteface The code given in proj5base.cpp should properly provide for the user interface for this program including all command error checking. This program has no code for the stacks. It is your job to write the methods for the specified operations and make the appropriate calls. Most of the changes to the existing program need to be made in the processexpression ( ) method. Look for the comments of: // add code to perform this operation here Note: the instances containing the operator stack and value stack are required to be a local variable in a function. The function processexpression() is strongly suggested as the function in which to declared the instances of these stacks.

Use of Existing C++ Libraries You are responsible to write the code for the dynamic array stacks yourself! This is the primary purpose of this project. Since the C++ Standard Template Libraries already contain a class called Stack, you should name your class something like MyStack to avoid confusion. You are not allowed to use any of the classes from the C++ Standard Template Libraries in this program. These classes include ArrayList, Vector, LinkedList, List, Set, Stack, HashMap, etc. If you need such a class, you are to write it yourself. These are sometimes called the C++ Standard Container Library. A full listing of the C++ Standard Template Libraries can be found at: http://www.cplusplus.com/reference/stl/ MULTIPLE SOURCE CODE FILES Your program is to be written using at least two source code files. All of the storage structure code (the stack code) is to be in one source code file. While the other file (or files if you wish to have more than two source code files) would contain the remainder of the program. You are to include a makefile that creates an executable called proj5. Program Submission You are to submit the programs for this lab via the Assignments Page in Blackboard. To help the TA, name the file containing the main( ) method that starts your program with your net-id and the assignment name, like: ptroy1proj5.cpp Also, make sure you replace ptroy1 with your own Net-ID! Since we are to have multiple source code files, please zip all of your java code files together into a file name with your net-id and the assignment name, like: ptroy1proj5.zip Again, please replace Ptroy1 with your own Net-ID!