Functions on Arrays and Reading Files – 70 course points
The purpose of this assignment is to practice array manipulation and traversals while reading and writing to files.
Refer to our Programming Assignments FAQ for instructions on how to install VScode, how to use the command line and how to submit your assignments.
Programming
Write 2 programs and submit on Autolab.
- We provide a zip file (find it under FruitCosts on Autolab) containing FruitCosts.java and CharacterCounter.java.
- For each problem UPDATE and SUBMIT the corresponding file.
Observe the following rules:
- DO NOT add any import statements
- DO NOT add the project statement
- DO NOT change the class name
- DO NOT change the headers of ANY of the given methods
- DO NOT add any new class fields
- DO NOT use System.exit()
- ONLY print the result as specified by each problem. Observe the examples’ output, display only what the problem is asking for.
- DO NOT print other messages, follow the examples for each problem.
- ONLY print the result as specified by each problem. Observe the examples’ output and display only what the problem is asking for.
- DO NOT print other messages; follow the examples for each problem.
1. Fruit Costs (35 points)
This assignment is designed to help you practice working with 1D parallel arrays and reading from an input file using the StdIn library. You are expected to write a program that reads in from a file a list of fruits and their costs, then prints out the names and costs of the two lowest-cost fruits, and their total cost.Overview
Picture this: it’s a sunny day, and you’re craving a refreshing fruit smoothie to start off your day. As a college student, you’re mindful of your budget, so you want to find the two cheapest fruits to make your smoothie without overspending. Using real fruit prices (https://catalog.data.gov/dataset/fruit-and-vegetable-prices), you’ll be creating a program to assist you in making sure you get your fruits without breaking the bank. The program will process a list of fruits and their corresponding costs (read from a file), identify the two fruits with the lowest costs, and calculate their combined total. This way, you can enjoy your smoothie without worrying about the price. As you work on this task, you’ll get to practice using arrays, loops, and basic arithmetic operations in Java, all while ensuring you make the most out of every dollar you spend on fruits.Programming
Your task is to complete themain
method in the FruitCosts
class. The program should do the following:
- Read the input file specified in the command-line argument.
- Read the number of fruits from the input file.
- Create two parallel arrays: one for fruit names and one for their costs.
- Read the fruit names and costs from the input file and store them in the respective arrays.
- Find the two fruits with the lowest costs.
- Print the names and costs of the two lowest-cost fruits.
- Calculate and print the total cost of these two fruits.
[Lowest cost fruit name] [Lowest cost]
[Second lowest cost fruit name] [Second lowest cost]
Total [Sum of the two lowest costs]
Note: In the case that multiple fruits have the same cost, maintain the order in which they appear in the input file.
Executing and Debugging
First navigate to the directory/folder containing FruitCosts.java
- to compile: javac FruitCosts.java
- to execute: java FruitCosts FrozenFruit.txt
- By Srimathi Vadivel and Sarah Benedicto
2. Character Counter (35 points)
This assignment is designed to help you practice working with 1D arrays, reading from a file and writing to a file using StdIn and StdOut libraries.
You will use an array to keep track of number of times each character appears in a file.
Overview
The ASCII (American Standard Code for Information Interchange) has a decimal value/representation for encoding 128 different letters, punctuation and other characters. In the age where millions of bytes of data are stored and sent across networks with a single click, it’s important to optimize the memory and time of the computers that carry out these tasks.
Huffman Coding is a method of data compression that counts the occurrences of each character and maps them to a certain bit string based on their frequency for optimized space.
You do not need to understand Huffman Coding for this assignment. Here are two resources if you are interested in learning more about it.
- Video about Huffman Coding Method
- More reading about Huffman
In this assignment, you will be implementing your own program that will keep track of the number of occurrences of these 128 characters. This is equivalent to the first part of the Huffman Coding algorithm.
Programming
- You will use a 1D integer array to keep track of the number of times each of the 128 characters appears in the input file.
- Then, once the entire file has been read and each character has been accounted for, you will print (only from index 32 to 126 inclusive) to the output file in the following format:
[character],[ascii value],[occurrences],[frequency]
- NO SPACE before or after the comma.
- character: is the character itself (e.g. A, r, …).
- ascii value: is the decimal value of the character (e.g. 65, 114, …).
- occurrences: number of times the character appears in the file.
- frequency: is a percentage computed by (occurrences) / (total number of characters in the file) * 100
How to read one character at a time from the input file?
The first argument, args[0]
will be the input file.
- Use
StdIn.setFile(args[0])
to set the input file. - Read characters while there are characters to be read from the file.
StdIn.hasNextChar()
returns true if there are characters to be read. - To read one character use
StdIn.readChar()
How to keep track of the number of times a character appears in the input file?
Use a 1D integer array (size 128) to keep track of the number of times each character appears in the input file.
If you look at the ASCII table you will notice that:
- The first 32 characters (0 through 31) cannot be printed and ARE NOT of interest to this assignment.
- Character 32 through 126 (inclusive) ARE the characters of interest to this assignment.
- Notice that each character has a decimal value. The decimal value (represents the character) is the value stored in the computer.
- The character ‘A’ has decimal value 65.
- When you cast a
char
as anint
, the value is the character’s decimal value. - The println() below will print 65 when the two lines of code are executed. Try it!
char c = 'A';
System.out.println( (int) c);
Once a character is read from the file, use the character as the array index (cast the character as an integer).
- If you read an ‘A’ , index 65 is expected to be incremented.
- If, for example, you read ‘4’, then index 52 is expected to be incremented.
This way you will be able to keep track of the number of times each character appears in the file.
How to write to the output file?
The second argument, args[1]
will be the output file.
- Use
StdOut.setFile(args[1])
to set the output file. - Then use
StdOut.println()
to write to the file.
Once the entire file has been read. Print to the output file (only from index 32 to 126 inclusive) in the following format:
[character],[ascii value],[occurrences],[frequency]
NO SPACE before or after the comma.
Notes:
- Only modify the main method, no helper methods necessary.
- Keep track of the number of times the character appears for all characters in the file, but only print out char values of 32 to 126 inclusive to the output file.
Executing and Debugging
First navigate to CharacterCounter directory/folder
- to compile:
javac CharacterCounter.java
- to execute:
java CharacterCounter HuffmanCoding.txt output.out
By Mary Buist and Anna Lu
Before submission
Collaboration policy. Read our collaboration policy here.
Submitting the assignment
Submit FruitCosts.java and CharacterCounter.java separately via the web submission system called Autolab. To do this, click the Assignments link from the course website; click the Submit link for that assignment.
Getting help
If anything is unclear, don’t hesitate to drop by office hours or post a question on Piazza.
- Find instructors office hours here
- Find tutors office hours on Canvas -> Tutoring
- Find head TAs office hours here
- In addition to office hours we have the Coding and Social Lounge (CSL) , a community space staffed with lab assistants which are undergraduate students further along the CS major to answer questions.