Difference between revisions of "Numerology"

From CompSciWiki
Jump to: navigation, search
Line 73: Line 73:
 
There is a proper series of steps to follow before actually writing the code to create the conversion program. Some questions to think about for coming up with a correct solution to the program are:
 
There is a proper series of steps to follow before actually writing the code to create the conversion program. Some questions to think about for coming up with a correct solution to the program are:
  
:*How many methods are required?
+
:*'''How many methods and variables are required?'''
 
::-Should everything go in the main method or should it be broken down into multiple methods and code blocks for readability and reuse?
 
::-Should everything go in the main method or should it be broken down into multiple methods and code blocks for readability and reuse?
:*Where should if/else and else if statements be used?
+
::-What type of variables are needed and what should they be initialized too?
::-Where does the use of conditional statements make sense to use?
+
:*'''What parameters do I need to pass to the methods, and should there be a return value?'''
:*When should the code be documented?
+
::-What variables are needed from outside the method that should not be passed globally?
::-Should documentation be preformed during or after I have written the program?
+
::-What variable from inside the method is manipulated and needed by other methods?
 +
:*'''Where should loops and conditional statements be used?'''
 +
::-Where does it make sense to use if/else if/else, for and while within the program??
 +
:*'''When should the code be commented and what should it include?'''
 +
::-Should documentation be performed before, during or after I have written the program?
 +
<br />
 +
'''Make sure your code complies with the [http://courses.cs.umanitoba.ca/index.asp?sec=3394&too=30&eve=1&ppa=5178 COMP 1010 coding standards].''' Following proper coding standards allows for an easier understanding of your code and the future as well as the present. Remember markers as well as other programmers may have to modify or understand your methods in the future. The more practice you have in proper documentation and code syntax, the easier it will be in the future to follow your company's required coding guidelines:
  
'''Make sure your code complies with the COMP 1010 coding standards.''' Following proper coding standards allows for an easier understanding of your code and the future as well as the present. Remember markers as well as other programmers may have to modify or understand your methods in the future. The more practice you have in proper documentation and code syntax, the easier it will be in the future to follow your company's required coding guidelines:
+
===Standard Method Separation===
 +
As a rule of thumb, methods should generally not be longer then the screen width (40-50 lines). Separate methods are used when a protocol of steps or an algorithm will be used repetitively, or serves a different purpose then the current method. Remember, programmers are lazy and never want to have to write duplicate code. After reading this particular problem we can break down the protocol into a couple of simple methods. The protocol for this problem can be broken up as follows:
 +
:# Create a input dialog box and prompt the user for a name to be converted.
 +
:#Calculate the running sum of the name by converting each character value into it's corresponding numeric value.
 +
:#Calculate the collapsed digit from the total of the running sum.
 +
:#Using the collapsed digit, print the destiny number and associated characteristics to output.
 +
<br />
 +
From the protocol steps it is apparent that there are (at least) four appropriate methods needed to properly implement the problem.
 +
:*A main method to prompt the user for a name as well as call the other methods appropriately.
 +
:*A method to convert each letter from the name into a corresponding number and calculate the running sum.
 +
:*A method to calculate the collapsed digit from the total running sum.
 +
:*A method to print the name's destiny number and associated characteristics.
  
==Proper Method Separation==
+
===Efficient Parameters and Return Values===
As a rule of thumb, methods should generally not be longer then the screen width (40-50 lines). Separate methods are used when a protocol of steps or an algorithm will be used repetitively, or serves a different purpose then the current method. Remember, programmers are lazy and never want to have to write duplicate code. After reading this particular problem we notice that the protocol can be broken down into a couple of basic sections . The protocol for this problem is as follows:
+
'''Parameters''' are a tricky concept to understand at first. The correct number of parameters as well as what needs to be a parameter can determine a properly implemented method from a poor one. The idea with parameters is that you want to pass only variables need by the method, and no more! At the same time a variable that is not passed and should have been, can create an incorrect result or a poorly implemented method (which falls under bad coding standards). Remember that global variables should only be used in rare cases. Making all your variables global and having no parameters for any methods is not a good approach to any programming problem.
:# Prompt the user for a name
+
 
:# Calculate the "running sum" of the name by converting each character value into it's corresponding numeric value.
+
'''Return Values''' are used to return a variable value that has been (most likely) manipulated inside the method. Java only allows for at most one value to be returned for each method so take this into consideration when creating methods. Methods with too much variable manipulation and functionality can usually be broken down into smaller simpler methods that allows for better readability and usability. Void methods have no return value and for this reason referred to as procedures which perform some functionality but usually do not manipulate variables. Void methods can still use parameters if required (and usually do). An example of a void method would be to print a specific message from a list to output depending on the parameter values passed in.
 +
Eg. a name and corresponding message from their destiny number.
 +
 
 +
===Consistent use of Loops and Conditional Statements===
 +
Loops and conditional statements should be used throughout the program as extensively as possible. There use is essential to the general usability of any programming language. Without these statements it would be very difficult to perform some of the simple functionality we take advantage of them for. More exclusively:
 +
:*For loops should be used anywhere the number of looping cycles is known.
 +
::Eg: Converting each character of a name (where the length is known) to its corresponding digit.
 +
:*While loops should be used where the number of looping cycles in unknown and only stops when condition is met.
 +
::Eg: Adding each digit of the collapsing sum (which is on an unknown length) to discover its destiny number.
 +
:*If/else and else if statements should be used where there is a number of potential solutions and only one is met depending on the variables value.
 +
::Eg: Depending on a characters value/letter a numeric value is associated with it.
 +
 
 +
===Proper Documentation===
 +
As unenjoyable as it can be, good documentation of your code is very important. Documentation may seem unnecessary as the program is very simple and the code is readable, but that is not the point. By applying documentation to all code, whether it be Microsoft Office or a simple numerology program the purpose is still the same; a quick understanding of each methods purpose, what it does and how it is used, as well as its parameters and return variable.
  
:# A main method to run the program and pass the name into conversion methods as well as calculate the sum.
 
:# A method to convert each letter into a corresponding number.
 
:# A method to print the name's destiny number and associated characteristics.
 
  
 
===Separate the Statements===
 
===Separate the Statements===
Line 109: Line 136:
  
 
===Separate Statements into Code Blocks===
 
===Separate Statements into Code Blocks===
 +
 
Once the [[Your First Java Program#Statements|statements]] are readable, the next step would be to organize them into code blocks as stated in [http://courses.cs.umanitoba.ca/index.asp?sec=3394&too=30&eve=1&ppa=5178 COMP 1010 Coding Standards]. Continuing with our previous example, the functionality of the code can be broken into two distinct code blocks.
 
Once the [[Your First Java Program#Statements|statements]] are readable, the next step would be to organize them into code blocks as stated in [http://courses.cs.umanitoba.ca/index.asp?sec=3394&too=30&eve=1&ppa=5178 COMP 1010 Coding Standards]. Continuing with our previous example, the functionality of the code can be broken into two distinct code blocks.
 
<pre>
 
<pre>

Revision as of 00:40, 30 March 2011

Back to the Case Studies homepage

Problem

Write a complete Java program that will convert a name into an integer using the pseudo-mathematics (otherwise known as “malarkey”) of numerology. This is just an introduction on the use of numerology in field of Computer Science. Numerology is most commonly used in Computer Science for cryptography and to implement hashing functions. For good programming practices follow the COMP 1010 coding standards.

Your Java program will prompt a user for a name as follows:

Numerology Calc.png


For each alphabetic character in the name, you will add a value to a running sum based upon the following table:

123456789
ABCDEFGHI
JKLMNOPQR
STUVWXYZ


For example, if the name entered is “Alan Turing”, the running sum would ultimately be equal to:

1 + 3 + 1 + 5 + 2 + 3 + 9 + 9 + 5 + 7 = 45

This sum needs to be “collapsed” by adding all its digits together. Thus 45 becomes 4 + 5 = 9. This collapsing process needs to continue until the final result is a single digit (obviously between 1 and 9). This single digit is known as the “destiny number” and is used to assign certain characteristics to the name as follows:

1 – is ambitious, independent, and self-sufficient 
2 – is supportive, diplomatic, and analytical 
3 – is enthusiastic, optimistic, and fun-loving 
4 – is practical, traditional, and serious 
5 – is adventurous, mercurial, and sensual 
6 – is responsible, careful, and domestic 
7 – is spiritual, eccentric, and a bit of a loner 
8 – is money-oriented, decisive, and stern 
9 – is multi-talented, compassionate, and global

Assuming the input of “Alan Turing”, your program will generate output of:

 Alan Turing (9) is multi-talented, compassionate, and global

Output need only be generated by System.out.


Submit
1.) your source code
2.) output from one run of your program where the name is:

  1. John von Neumann
  2. Edsger Dijkstra
  3. one of your choosing
 

Intro to Numerology

KYLE PICTURE

Solution

How to Approach the Problem

There is a proper series of steps to follow before actually writing the code to create the conversion program. Some questions to think about for coming up with a correct solution to the program are:

  • How many methods and variables are required?
-Should everything go in the main method or should it be broken down into multiple methods and code blocks for readability and reuse?
-What type of variables are needed and what should they be initialized too?
  • What parameters do I need to pass to the methods, and should there be a return value?
-What variables are needed from outside the method that should not be passed globally?
-What variable from inside the method is manipulated and needed by other methods?
  • Where should loops and conditional statements be used?
-Where does it make sense to use if/else if/else, for and while within the program??
  • When should the code be commented and what should it include?
-Should documentation be performed before, during or after I have written the program?


Make sure your code complies with the COMP 1010 coding standards. Following proper coding standards allows for an easier understanding of your code and the future as well as the present. Remember markers as well as other programmers may have to modify or understand your methods in the future. The more practice you have in proper documentation and code syntax, the easier it will be in the future to follow your company's required coding guidelines:

Standard Method Separation

As a rule of thumb, methods should generally not be longer then the screen width (40-50 lines). Separate methods are used when a protocol of steps or an algorithm will be used repetitively, or serves a different purpose then the current method. Remember, programmers are lazy and never want to have to write duplicate code. After reading this particular problem we can break down the protocol into a couple of simple methods. The protocol for this problem can be broken up as follows:

  1. Create a input dialog box and prompt the user for a name to be converted.
  2. Calculate the running sum of the name by converting each character value into it's corresponding numeric value.
  3. Calculate the collapsed digit from the total of the running sum.
  4. Using the collapsed digit, print the destiny number and associated characteristics to output.


From the protocol steps it is apparent that there are (at least) four appropriate methods needed to properly implement the problem.

  • A main method to prompt the user for a name as well as call the other methods appropriately.
  • A method to convert each letter from the name into a corresponding number and calculate the running sum.
  • A method to calculate the collapsed digit from the total running sum.
  • A method to print the name's destiny number and associated characteristics.

Efficient Parameters and Return Values

Parameters are a tricky concept to understand at first. The correct number of parameters as well as what needs to be a parameter can determine a properly implemented method from a poor one. The idea with parameters is that you want to pass only variables need by the method, and no more! At the same time a variable that is not passed and should have been, can create an incorrect result or a poorly implemented method (which falls under bad coding standards). Remember that global variables should only be used in rare cases. Making all your variables global and having no parameters for any methods is not a good approach to any programming problem.

Return Values are used to return a variable value that has been (most likely) manipulated inside the method. Java only allows for at most one value to be returned for each method so take this into consideration when creating methods. Methods with too much variable manipulation and functionality can usually be broken down into smaller simpler methods that allows for better readability and usability. Void methods have no return value and for this reason referred to as procedures which perform some functionality but usually do not manipulate variables. Void methods can still use parameters if required (and usually do). An example of a void method would be to print a specific message from a list to output depending on the parameter values passed in. Eg. a name and corresponding message from their destiny number.

Consistent use of Loops and Conditional Statements

Loops and conditional statements should be used throughout the program as extensively as possible. There use is essential to the general usability of any programming language. Without these statements it would be very difficult to perform some of the simple functionality we take advantage of them for. More exclusively:

  • For loops should be used anywhere the number of looping cycles is known.
Eg: Converting each character of a name (where the length is known) to its corresponding digit.
  • While loops should be used where the number of looping cycles in unknown and only stops when condition is met.
Eg: Adding each digit of the collapsing sum (which is on an unknown length) to discover its destiny number.
  • If/else and else if statements should be used where there is a number of potential solutions and only one is met depending on the variables value.
Eg: Depending on a characters value/letter a numeric value is associated with it.

Proper Documentation

As unenjoyable as it can be, good documentation of your code is very important. Documentation may seem unnecessary as the program is very simple and the code is readable, but that is not the point. By applying documentation to all code, whether it be Microsoft Office or a simple numerology program the purpose is still the same; a quick understanding of each methods purpose, what it does and how it is used, as well as its parameters and return variable.


Separate the Statements

The code file contains more than one statements on each line.

int digit1 = (isbn % 10);int total = digit1 * 9;isbn = isbn / 10;
int digit2 = (isbn % 10);total = total + digit2 * 8;isbn = isbn / 10;

Each of the above lines of code performs a similar function. Each line can be interpretted as a block of code. By placing each statements on a separate line and grouping the statements into appropriate code blocks, the result should look something like the following:

int digit1 = (isbn % 10);
int total = digit1 * 9;
isbn = isbn / 10;
int digit2 = (isbn % 10);
total = total + digit2 * 8;
isbn = isbn / 10;

By placing each of the statements on a separate line, the readability of the code increases dramatically.

Separate Statements into Code Blocks

Once the statements are readable, the next step would be to organize them into code blocks as stated in COMP 1010 Coding Standards. Continuing with our previous example, the functionality of the code can be broken into two distinct code blocks.

int digit1 = (isbn % 10);
int total = digit1 * 9;
isbn = isbn / 10;

int digit2 = (isbn % 10);
total = total + digit2 * 8;
isbn = isbn / 10;

Almost each line of code in the messy code file can be considered a separate code block. Take the time to read the code and understand how everything works together before deciding which statements should be grouped together.

One of the code blocks that should be added is a variable declaration code block at the beginning of the main method. Throughout the messy code, integers are declared. All of the declaration statements should be placed at the beginning of the main method to ensure the code stays organized. Going to the previous example, two declaration statements can be moved to the top as depicted below.

int digit1;
int digit2;

digit1 = (isbn % 10);
int total = digit1 * 9;
isbn = isbn / 10;

digit2 = (isbn % 10);
total = total + digit2 * 8;
isbn = isbn / 10;

Add Comments to Explain the Code

The COMP 1010 coding standards, or the Funky Books Inc. coding standards, make numerous points concerning comments in code. To be specific, statements 1, 2, 4, and 7 can be applied to the code file for this case study. All major code blocks should be identified by now. Look over each code block and briefly explain what it does in a comment. Since all declaration statements have been moved to the top of the the main method , make sure to apply coding standard 7 from the COMP 1010 Coding Standards.

Optimize the Code by Removing Unnecessary Variables

At the top of the main method, there should now be a number of variables declared. Notice that there are nine different "digit" variables which are only used once to store the same calculation.

int digit1;
int digit2;

digit1 = (isbn % 10);
int total = digit1 * 9;
isbn = isbn / 10;

digit2 = (isbn % 10);
total = total + digit2 * 8;
isbn = isbn / 10;

The code sample from above shows two of the nine digit variables. These two variables can be replaced with a single one as follows:

int digit;

digit = (isbn % 10);
int total = digit * 9;
isbn = isbn / 10;

digit = (isbn % 10);
total = total + digit * 8;
isbn = isbn / 10;

Fix the Errors in the Code

The messy code contained a total of eight different coding errors. Each error presented in this section is ordered as it appears in the code from the case study.

Error One

String temp = JOptionPane.showInputDialog("")

Technically, the above code does not break the functionality of the application as the method call still makes the input dialog appear to take input from the user. Although, from a usability standpoint the code does cause an error. The user who is running the application needs to know what to enter as input into the input dialog. Without a proper message, the user cannot be expected to know what the application is expecting as input. An example of a proper message is as follows:

temp = JOptionPane.showInputDialog("Enter the first 9 digits of a 10-digit ISBN number.");

Error Two

int isbn = Temp;

There are two problems with the above code sample. The first problem being that the variable "Temp" is of type string and not of the primitive type int. The second problem is the name of the variable "Temp". The variable was originally declared as "temp" and Java is a case sensitive language. Both programs are repaired by replacing the code with the line below.

isbn = Integer.parseInt(temp);

Error Three

isbn = isbn // 10;

An extra front slash changes the division operation into a comment which also comments out the semi-colon required at the end of every statement. Remove the extra front slash to correct the error.

isbn = isbn / 10;

Error Four

digit = (isbn % 10) 

The statement above is missing the semi-colon at the end of the line. Add the semi-colon to fix the error.

digit = (isbn % 10);

Error Five

total = total + digit + 6;

This error is known as a run time error. A run time error does not cause a compilation error, but it causes the program to produce incorrect results. In the explaination of the ISBN check digit, the sixth ISBN number should be multiplied by six, not added. This error is fixed by changing the second addition operation to a multiplication operation.

total = total + digit * 6;

Error Six

digit = (isbn / 10);

Just like error five, the above statement causes a run time error. To isolate the last digit in the ISBN number, the ISBN must have the modulus operator applied, not the division operator. The above statement is fixed by replacing the division operator with the modulus operator.

digit = (isbn % 10);

Error Seven

digit = (isbn * 10);

The above statement is almost identical to #Error Six. The multiplication operator should be replaced with the modulus operator.

digit = (isbn % 10);

Error Eight

total = total + digit - 1;

The error in the code above is error five almost identical to #Error Five. Replace the subtraction operator with the multiplication operator to remedy this error.

total = total + digit * 1;

Add Code to Output Progress Reports as the Program Executes

To add progress reports to the program, three things need to be addressed:

  • Where to place the progress reports
  • What progress should be reported
  • Adding the code to report progress

By adding code to report on the status of the application, the user and yourself know what is happening behind the scenes when the program is executing. For a small application like this case study it may seem trivial. It is a good practice to get into as in larger programs consisting of many files each with many methods, it can be difficult to locate a run-time error in your code if the program does not explicitly say what it is currently doing.

Location

By now the code file should be broken up into multiple code blocks, as done earlier in this solution. Each code block should represent a major code segment in the program. Each code block can be considered a potential point for a progress report. Read over the code and decide which are vital points in the execution of the program.

Report Content

The next step is to decide what should be outputted to describe the progress of the program. This output can be the current value of a variable, an output statement saying that the program has reached a certain point in the code, or potentially a combination of both. A progress report should output data on the program that is relevant to its execution. For this case study, each calculation performed on the ISBN is vital to determining the check digit, therefore a progress report should output the value of each calculation.

Adding Output Code

The best way to add output to the program is by adding System.out statements to the appropriate code blocks. When adding the code, make sure the message that will be outputted is unique in comparison to the other progress report statements. Each statement should be unique as they are meant to identify the section of code being executed. If the statements are not unique, then there will be no way of telling which progress report has been outputted. Here is an example of the code before adding a System.out statement.

//isolate last digit and multiply by 9
digit = (isbn % 10);
total = digit * 9;
isbn = isbn / 10;

After the output statement is added, the code will look like the following:

//isolate last digit and multiply by 9
digit = (isbn % 10);
total = digit * 9;
isbn = isbn / 10;
System.out.println (digit + " * " + 9 + " for a running total of " + total);

When the program is executing, the following output will appear in the progress window. The ISBN number used as input for the example below is 1-2345-6789.

9 * 9 for a running total of 81

Now the you will know what part of the code is being executed along with the status of the current calculation.

Remember that this is not the only "correct" progress report. There can be many different progress reports based on how the vital points of the program were interpreted. Although, in this case study the calculations are exceptionally important points to the correct execution of the program.

Code

Solution Code

Back to the Case Studies homepage