According to CollegeBoard, Iteration is a way to simplify code that would otherwise be repeated many times in succession. Using loops, we can finally implement complex algorithms and solutions to common problems that we weren’t able to before.
Iteration is repeating sequences to simplify code of advanced algorithms
Iteration accounts for 17.5%-22.5% of the APCSA AP Exam.
Learning Objective: Represent Iterative Processes using a while
loop
Question: What is a loop and what are some real life examples of this (Setting a Song to repeat on your music player)
A loop is something that repeats itself over and over until its told to stop. A real life example of a loop is a tiktok video where it keeps looping forever.
You know the i
variable that you use for while/for loops? It actually has a name, loop control variable
int i = 0; // initialize loop control variable
while (i < 10) // checks the loop control variable
{
System.out.println("Doing some code");
i++; // update the loop control variable
}
// Popcorn Hack: Simplify the code segment below
int i = 0;
System.out.println(i);
i++;
System.out.println(i);
i++;
System.out.println(i);
i++;
System.out.println(i);
i++;
System.out.println(i);
i++;
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
0
1
2
3
4
int i = 0;
while (i < 5) { System.out.println(i);
i++;
}
0
1
2
3
4
An infinite loop is when a while loop always evaluates to true. avoid this when you can because it’s probably not good for your computer. if this happens by accident, I recommend copying all code in the block and deleting the block. After you delete the code block, close and reopen the tab that the code block was in.
What’s wrong with this code block?
while (true)
{
System.out.print("CONTROL ");
}
// DO NOT RUN THE CODE
The code contains an infinite loop that will continuously print “CONTROL “ without stopping. THE FIX:
int count = 0;
while (count < 10)
{
System.out.print("CONTROL ");
count++;
}
CONTROL CONTROL CONTROL CONTROL CONTROL CONTROL CONTROL CONTROL CONTROL CONTROL
What will this code block output?
// Quite shrimple
int i = 0;
do
{
System.out.print("Quite shrimple. ");
i++;
}
while (i < -5);
Quite shrimple.
In a do while loop, it will run the “do” once before it reaches the “while”, and at that point it will start to act like a while loop.
this is the standard structure of a for loop
for (initialization; Boolean expression; update)
{
System.out.println("Doing some code");
}
Initialization will run at the start of the loop, boolean expression will get checked with every loop, and update runs after every loop.
How many times will this code print “Doing some code?”
for (int num = 1; num <= 5; num++)
{
System.out.println("Doing some code");
}
Doing some code
Doing some code
Doing some code
Doing some code
Doing some code
5 Times
In this code, it creates the variable num at the start of the loop, it checks if num is less than or equal to 5 after each loop, and it adds 1 to num after each loop.
this is essentially a javascript for loop, as it will iterate through a list and run code in the loop to each variable inside the list
int[] list = {1, 4, 6, 2};
for (int j : list)
{
System.out.print(j);
System.out.print(" ");
}
1 4 6 2
In java there are breaks, but there are also continues.
Breaks, as you likely already know, end a loop. They tend to be used with an if statement
How many times will this code print “Big guy?”
int i = 0;
while (i < 10)
{
System.out.println("Big guy");
i++;
if (i == 5) {
break;
}
}
Big guy
Big guy
Big guy
Big guy
Big guy
5 Times
Continue will skip code for an iteration, but will still keep the loop running
int i = 0;
while (i < 10)
{
if (i == 5) {
i++; // don't forget this, it creates an error similar to an infinite loop
System.out.println("");
continue;
}
System.out.println(i);
i++;
}
0
1
2
3
4
6
7
8
9
Learning Objective: For algorithms in the context of a particular specification that involves String
objects:
public class Compare {
public static void main(String[] args) {
String string1 = "Coding is cool!";
String string2 = "Coding is coding!";
int minLength = Math.min(string1.length(), string2.length());
for (int i = 0; i < minLength; i++) {
String subString1 = string1.substring(0, i + 1);
String subString2 = string2.substring(0, i + 1);
if (subString1.equals(subString2)) {
System.out.println("Common Prefix: " + subString2);
}
}
}
}
Compare.main(null)
Common Prefix: C
Common Prefix: Co
Common Prefix: Cod
Common Prefix: Codi
Common Prefix: Codin
Common Prefix: Coding
Common Prefix: Coding
Common Prefix: Coding i
Common Prefix: Coding is
Common Prefix: Coding is
Common Prefix: Coding is c
Common Prefix: Coding is co
Where are the 3 methods in the above Java Cell and how do they contribute to the program’s functionality?
main: This is the entry point of the program. It initializes two strings and determines the minimum length between them. It then compares the prefixes of the strings using a loop.
Math.min: This method returns the smaller of the two provided integers. In this program, it’s used to determine the smaller length between the two strings to avoid out-of-bounds errors during comparison.
substring: This method, called on a String object, returns a substring of the original string. In this program, it’s used to extract prefixes of the two strings for comparison purposes.
String word = "supercalifragilisticexpialidocious";
int count = 0;
for (int i = 0; i < word.length(); i++) {
char letter = word.charAt(i);
if (letter == 'a' || letter == 'e' || letter == 'i' || letter == 'o' || letter == 'u') {
count++;
}
}
System.out.println("The Number of vowels in \"" + word + "\" is " + count);
What does word.length() do and how do we use it above?
What Boolean Operator is used?
word.length() returns the number of characters in the string word. In the code above, it’s used to determine the number of iterations for the loop, ensuring each character in the string is examined.
The Boolean Operator used is | , which stands for “OR”. |
public class Main {
public static void main(String[] args) {
String word = "Scooby Doo";
String sub = "Doo";
boolean found = false;
for (int i = 0; i <= word.length() - sub.length(); i++) {
String portion = word.substring(i, i + sub.length());
if (portion.equals(sub)) {
found = true;
}
}
if (found) {
System.out.println("We found the Smaller String!");
} else {
System.out.println("We did not find the Smaller String! \t Ruh Roh!");
}
}
}
Main.main(null)
We found the Smaller String!
String concatenation is when you want to add to strings together
String original = "String";
String reversed = "";
for (int i = 0; i < original.length(); i++)
{
String single = original.substring(i,i+1);
reversed = single + reversed;
}
System.out.println("Original String: " + original);
System.out.println("Reversed String: " + reversed);
Original String: String
Reversed String: gnirtS
Learning Objective: Represent nested iteration processes
Essential Knowledge:
Before uncommenting the code, guess what the output will look like:
1 2
1 2
1 2
1 2
public class NestedLoops{
public static void main(String[] args){
for (int outer = 1; outer < 5; outer++){
for (int inner = 1; inner < 3; inner++){
System.out.print(inner + " ");
}
System.out.println();
}
}
}
NestedLoops.main(null)
1 2
1 2
1 2
1 2
public class NestedLoops{
public static void main(String[] args){
for (int inner = 1; inner < 3; inner++){
for (int outer = 1; outer < 5; outer++){
System.out.print(outer + " ");
}
System.out.println();
}
}
}
NestedLoops.main(null)
1 2 3 4
1 2 3 4
What will the output of the code above be if we switch the loop headers (the stuff inside of the for loop)?
1 2 3 4
1 2 3 4
After making a prediction actually switch the loop headers for yourself. What do you notice about the output compared to the output before the change?
Comparing the two outputs, the original code printed 1 2 four times (one for each iteration of the outer loop), while the switched code prints the numbers 1 through 4 two times (one for each iteration of the new outer loop).
Essential Knowledge:
for (int outer = 0; outer < 3; outer++){
for (int inner = 0; inner < 4; inner++){
// statement #1
}
}
In the code above, how many times will the inner loop execute when outer = 0? 4
In the code above, how many times will the inner loop execute when outer = 1? 4
In the code above, how many times will the inner loop execute when outer = 2? 4
In the code above, how many times will the inner loop execute in total? 12
for (int outer = 5; outer > 0; outer--){
for (int inner = 0; inner < outer; inner++){
// statement #1
}
}
In the code above, how many times will the inner loop execute when outer = 5? 5
In the code above, how many times will the inner loop execute when outer = 4? 4
In the code above, how many times will the inner loop execute when outer = 3? 3
In the code above, how many times will the inner loop execute in total? 15
int k = 0;
while (k < 5){
int x = (int)(Math.random()*6) + 1;
while (x != 6){
//statement #1
x = (int)(Math.random()*6) + 1;
}
k++;
}
In the code above, how many times will the statement #1 execute? Random and can not be determined
for (int k = 0; k < 135; k++){
if (k % 5 == 0){ // Statement #1
System.out.print(k); // Statement #2
}
}
05101520253035404550556065707580859095100105110115120125130
In the code above, how many times will the statement #1 execute? 135
In the code above, how many times will the statement #2 execute? 27
Rewrite the code above to be more effecient based on execution count.
for (int k = 0; k < 135; k += 5){
System.out.print(k);
}
05101520253035404550556065707580859095100105110115120125130
These hacks will be due on Monday (October 16th) before class
for (int k = 0; k < 40; k++){
if (k % 4 == 0){
System.out.println(k);
}
}
Rewrite the code above 3 different times
for (int k = 0; k < 40; k += 4){
System.out.println(k);
}
0
4
8
12
16
20
24
28
32
36
int k = 0;
while (k < 40) {
System.out.println(k);
k += 4;
}
0
4
8
12
16
20
24
28
32
36
int k = 0;
do {
System.out.println(k);
k += 4;
} while (k < 40);
0
4
8
12
16
20
24
28
32
36
Try to write a cipher program that shifts each letter in a message 3 letters forward. Use any of the methods you learned today. Use it to decode the 3 messages we’ve given you!
public class CaesarCipher {
public static void main(String[] args) {
String[] letters = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
String message1 = "Kfzb gly!";
String message2 = "zlab zlab zlab";
String message3 = "prmbozxifcoxdfifpqfzbumfxifalzflrp";
}
}
public class CaesarCipher {
public static void main(String[] args) {
String[] letters = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
String message1 = "Kfzb gly!";
String message2 = "zlab zlab zlab";
String message3 = "prmbozxifcoxdfifpqfzbumfxifalzflrp";
System.out.println(decodeMessage(message1, letters));
System.out.println(decodeMessage(message2, letters));
System.out.println(decodeMessage(message3, letters));
}
public static String decodeMessage(String message, String[] letters) {
StringBuilder decoded = new StringBuilder();
for (int i = 0; i < message.length(); i++) {
String character = String.valueOf(message.charAt(i)).toLowerCase();
int index = -1;
for (int j = 0; j < letters.length; j++) {
if (letters[j].equals(character)) {
index = j;
break;
}
}
if (index != -1) {
int decodedIndex = (index - 3 + 26) % 26;
if (Character.isUpperCase(message.charAt(i))) {
decoded.append(letters[decodedIndex].toUpperCase());
} else {
decoded.append(letters[decodedIndex]);
}
} else {
decoded.append(message.charAt(i));
}
}
return decoded.toString();
}
}
CaesarCipher.main(null)
Hcwy div!
wixy wixy wixy
mojylwufczluacfcmncwyrjcufcxiwciom
( interactive and advanced Ceaser Cipher)
import java.util.Scanner;
public class InteractiveCaesarCipher {
private static final char[] letters = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("Choose an option:");
System.out.println("1. Encode a message");
System.out.println("2. Decode a message");
System.out.println("3. Exit");
int choice = scanner.nextInt();
scanner.nextLine(); // consume newline
switch (choice) {
case 1:
System.out.println("Enter the message to encode:");
String messageToEncode = scanner.nextLine();
System.out.println("Enter the shift value (positive integer):");
int shiftForEncoding = scanner.nextInt();
System.out.println("Encoded message: " + transformMessage(messageToEncode, shiftForEncoding));
break;
case 2:
System.out.println("Enter the message to decode:");
String messageToDecode = scanner.nextLine();
System.out.println("Enter the shift value (positive integer):");
int shiftForDecoding = scanner.nextInt();
System.out.println("Decoded message: " + transformMessage(messageToDecode, -shiftForDecoding)); // negative shift for decoding
break;
case 3:
System.out.println("Exiting...");
scanner.close();
return;
default:
System.out.println("Invalid choice. Please try again.");
}
}
}
private static String transformMessage(String message, int shift) {
StringBuilder transformed = new StringBuilder();
for (int i = 0; i < message.length(); i++) {
char character = message.charAt(i);
int index = -1;
for (int j = 0; j < letters.length; j++) {
if (letters[j] == Character.toLowerCase(character)) {
index = j;
break;
}
}
if (index != -1) {
int transformedIndex = (index + shift + 26) % 26; // +26 to handle negative indices
if (Character.isUpperCase(character)) {
transformed.append(Character.toUpperCase(letters[transformedIndex]));
} else {
transformed.append(letters[transformedIndex]);
}
} else {
transformed.append(character);
}
}
return transformed.toString();
}
}
InteractiveCaesarCipher.main(null)
Choose an option:
1. Encode a message
2. Decode a message
3. Exit
Enter the message to encode:
Enter the shift value (positive integer):
Encoded message: X axzt sdcjih
Choose an option:
1. Encode a message
2. Decode a message
3. Exit
Exiting...