In this article, I illustrate the process of writing a simple Java program.
Let's create a program for a computer that has ten registers (0-9). Each register can hold a value of natural number >=0 and <=999. The computer will process instructions that consist of 3-digit values. These guidelines will be not be stored in the memory but handled one after another.
Following scheme is used to create or execute an instruction:
1xx means halt the execution. You can ignore the value of x
2dn means the value of register d = n
3dn means value of register d = value of register d + n
4dn means value of register d = value of register d * n
5dn means value of register d = value of register d / n
6ds means* value of register d = value of register s*
7ds means* value of register d = value of register d + value of register s*
8dx means the value of register d = sqrt (value of register d). You can ignore the value of x
9ds means* value of register d = (value of register d) S *
0xx The system cannot process any instruction that is in the form of ‘0xx’. Show an error like following:Output: Instruction code ‘065’ is not supported by the system.
Each register is initialized to 000. The contents of the memory are taken from the input and executed one after another. The result is always saved in the reduced format using a modulus of 1000.
Input
We need to take an input of all the instructions that user wants to execute. To reduce the complexity, I will accept input in the form of a long string of instructions where each instruction is separated by a single space.
Task
Our task is to read a string from the user, and repeatedly find a substring of 3 characters to decode and execute instruction until there is no other instruction to be processed.
Sample Input
275 226 373 426 692 672 100
Sample Output:
275
0:000, 1:000, 2:000, 3:000, 4:000, 5:000, 6:000, 7:005, 8:000, 9:000
226
0:000, 1:000, 2:006, 3:000, 4:000, 5:000, 6:000, 7:005, 8:000, 9:000
373
0:000, 1:000, 2:006, 3:000, 4:000, 5:000, 6:000, 7:008, 8:000, 9:000
426
0:000, 1:000, 2:036, 3:000, 4:000, 5:000, 6:000, 7:008, 8:000, 9:000
692
0:000, 1:000, 2:036, 3:000, 4:000, 5:000, 6:000, 7:008, 8:000, 9:036
672
0:000, 1:000, 2:036, 3:000, 4:000, 5:000, 6:000, 7:036, 8:000, 9:036
100
Program terminated.
Solution Diagram
I’ve designed the following diagram to assist with the better understanding of the requirements (Jarosciak, 2018a).
Jarosciak, J. (2018a) Using mathematical methods - Solution Diagram. Unpublished figure
Prerequisites
- JDK 8
- IntelliJ IDEA
Code Explained
The Initial Setup
I have created an empty console Java program in IntelliJ IDEA in a package: com.jarosciak, which contained the Main class (Jarosciak, 2018b).
Jarosciak, J. (2018b) Initial Setup. Unpublished figure
Main Class
The Main class contains String array named ‘register’ that has 0-9 registers initialized with ‘000’, and four methods:
- **main** method: comprises primary logic
- **businessLogic** method: includes all logic about processing instruction codes
- **echoRegisters** method: this method prints register outputs
- **postProcessing** method: this method allows me to post process generated values
The Main class and four methods it contains is illustrated in Jarosciak (2018c).
Jarosciak, J. (2018c) Main Class. Unpublished figure
Method: main
The main method (Jarosciak, 2018d) follows the following logic:
- First I reduce the complexity of input by asking the user to input a long string of 3 digit long instructions, where a single space separates each direction, this is achieved by using Scanner.
- Once we have the long string of instructions, I removing leading and trailing whitespace and replace 2 or more empty spaces with a single space
- Next, I split the long series of instructions by single space
- Then I do the error check, to see if any of the instruction is not precisely three digits long
Once the initial input and test are done, I continue with the following process:
- Loop through split array of instructions
- Assign instruction to 'instructionCode' string variable
- Print Header – Instruction Code one by one
- Get each letter of instruction where I use substring feature
- At last, I execute business logic by calling the **businessLogic** method
Jarosciak, J. (2018d) Method: main. Unpublished figure
Method: businessLogic
I decided to keep instruction code business logic in the method I called businessLogic (Jarosciak, 2018e), as it seemed natural to exclude the actual processing algorithm from the main method. Instead of if statements, which were my initial inclination, I decided to opt out for a switch statement, as it makes it easier to read the relatively simple logic.
Jarosciak, J. (2018e) Method: businessLogic. Unpublished figure
Method: postProcessing
The following method is called from the businessLogic method as part of the set up of each of the register arrays.
As we can see illustrated in Jarosciak (2018f), I always save the integer number passed to this method in a reduced format using a modulus of 1000 and also add the leading zeroes to integer value so it’s returned in the 3 digit format back to the register array.
Jarosciak, J. (2018f) Method: postProcessing. Unpublished figure
Method: echoRegisters
The echoRegisters method (Jarosciak, 2018g) is a method that prints the content of the registers with “, “ delimiter. To do so, I simply run through the array using for loop.
Jarosciak, J. (2018g) Method: echoRegisters. Unpublished figure
Input and Output Demo
Input and output are illustrated in the console screenshot (Jarosciak, 2018h).
Jarosciak, J. (2018h) Input and Output Demo. Unpublished figure