Iteration

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

4.1: WHILE LOOPS

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)

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
}
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++;
}

Infinite loop

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

This code is an infinite loop, it will never end eventually crashing the system.

Do While loop

What will this code block output?

Quite Shrimple.

// 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.

For 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?”

5 times

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

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.

Enhanced for 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 

Break and Continue

In java there are breaks, but there are also continues.

Break

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?”

5 times

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

Continue

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

4.3: Developing Algorithms Using Strings

Learning Objective: For algorithms in the context of a particular specification that involves String objects:

Methods in Java that help to MANIPULATE STRINGS

  • String.substring - Retrieves a particular portion of a String
  • String.equals - Comparees the content of two strings
  • String.length - Returns the length of a String
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 Method: The main method is the main entry point of the Java program. It’s a special method that gets executed when you run the program. In this method, the following actions are performed:

Two strings, string1 and string2, are defined with some sample text.

The minLength variable is calculated as the minimum length between string1 and string2. This is done using the Math.min method to ensure that we don’t attempt to access characters beyond the length of the shorter string.

A for loop is used to iterate from i = 0 to i = minLength - 1.

Inside the loop, two substrings, subString1 and subString2, are created by taking a substring of the original strings from index 0 to i + 1. An if condition checks if subString1 and subString2 are equal (i.e., they have a common prefix). If they are equal, it prints a message indicating the common prefix.

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);

The Number of vowels in "supercalifragilisticexpialidocious" is 16

What does word.length() do and how do we use it above?

It is used to determine the legnth of the String word. We use it here in the for loop as a loop variable

What Boolean Operator is used? false

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

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);

4.4: Nested Iteration

Learning Objective: Represent nested iteration processes

Essential Knowledge:

  • Nested iteration is when an iteration statement appears inside the body of another iteration statement
  • The inner loop must complete all of its iterations before the outer loop can continue.

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 inner = 1; inner < 3; inner++) {

            for (int outer = 1; outer < 5; outer++) {
                System.out.print(inner + " ");
            }

            System.out.println();

        }

    }
}

NestedLoops.main(null)
1 1 1 1 
2 2 2 2 

What will the output of the code above be if we switch the loop headers (the stuff inside of the for loop)?

1 1 1 1

2 2 2 2

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?

It changed the organization of the output, first it was a 4 by 2 not it is a 2 by 4

4.5: Informal Code Analysis

Essential Knowledge:

  • A statement exectution count indicates the number of times a statement is executed by the program
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? 12

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? 6

for (int k = 0; k < 135; k++){
    if (k % 5 == 0){ // Statement #1
        System.out.print(k); // Statement #2
    }
}

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); // Statement #2
}

In this optimized code, the loop will start at 0 and increment k by 5 in each iteration, ensuring that k takes values 0, 5, 10, 15, and so on, up to 135. This reduces the number of iterations from 135 to 27 while still achieving the same result as the original code.

HACKS

These hacks will be due on Monday (October 16th) before class

Hacks

  • Finish the popcorn hacks (0.2) - Completed
  • Rewrite the for loop (0.25) - Completed
  • Complete the Ceaser Cipher Code (0.45)- Completed

ALSO DID EXTRA CREDIT (0.1+) - Completed

Overall: 1/1

for (int k = 0; k < 40; k++){
    if (k % 4 == 0){
        System.out.println(k); 
    }
}
0
4
8
12
16
20
24
28
32
36

Rewrite the code above 3 different times

  • Your code should be more efficient based execution count
  • Your code should use 3 different types of loops that you learned above (Hint: You may need to use a list)
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

All three versions will produce the same result, printing values at 0, 4, 8, 12, and so on, up to 36, while minimizing the execution count by incrementing k by 4 in each iteration.

Ceaser Cipher Hacks

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 String encrypt(String message, int shift) {
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < message.length(); i++) {
            char ch = message.charAt(i);

            if (Character.isLetter(ch)) {
                char base = Character.isLowerCase(ch) ? 'a' : 'A';
                ch = (char) (base + (ch - base + shift) % 26);
            }

            result.append(ch);
        }

        return result.toString();
    }

    public static void main(String[] args) {
        String message1 = "Kfzb gly!";
        String message2 = "zlab zlab zlab";
        String message3 = "prmbozxifcoxdfifpqfzbumfxifalzflrp";

        int shift = 3; 

        String encryptedMessage1 = encrypt(message1, shift);
        String encryptedMessage2 = encrypt(message2, shift);
        String encryptedMessage3 = encrypt(message3, shift);

        System.out.println("Encoded Message 1: " + encryptedMessage1);
        System.out.println("Encoded Message 2: " + encryptedMessage2);
        System.out.println("Encoded Message 3: " + encryptedMessage3);

        
    }
}

CaesarCipher.main(null)

Encoded Message 1: Nice job!
Encoded Message 2: code code code
Encoded Message 3: supercalifragilisticexpialidocious

This program defines an encrypt method that takes a message and a shift value as arguments to perform the Caesar cipher encryption or decryption. It handles both uppercase and lowercase letters, and you can use it to encode and decode messages with a specified shift value.

Extra Credit NFL Simulation Java Iteration Program that Utilizes do while loops and for loops with if statements

import java.util.Scanner;

public class NFLGameSimulation {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("NFL Game Simulation");

        int team1Score, team2Score;
        String team1Name, team2Name;

        System.out.print("Enter the name of Team 1: ");
        team1Name = scanner.nextLine();
        System.out.print("Enter the score of Team 1: ");
        team1Score = scanner.nextInt();
        scanner.nextLine(); 

        System.out.print("Enter the name of Team 2: ");
        team2Name = scanner.nextLine();
        System.out.print("Enter the score of Team 2: ");
        team2Score = scanner.nextInt();

        if (team1Score > team2Score) {
            System.out.println(team1Name + " wins the game!");
        } else if (team2Score > team1Score) {
            System.out.println(team2Name + " wins the game!");
        } else {
            System.out.println("It's a tie game!");
        }

        System.out.println("Simulating an overtime scenario...");
        int overtime = 0;
        do {
            if (overtime > 0) {
                System.out.println("Still tied! Going to overtime #" + overtime);
            }
            int team1Overtime, team2Overtime;
            System.out.print("Enter the overtime score of Team 1: ");
            team1Overtime = scanner.nextInt();
            System.out.print("Enter the overtime score of Team 2: ");
            team2Overtime = scanner.nextInt();

            team1Score += team1Overtime;
            team2Score += team2Overtime;

            if (team1Score > team2Score) {
                System.out.println(team1Name + " wins in overtime!");
            } else if (team2Score > team1Score) {
                System.out.println(team2Name + " wins in overtime!");
            } else {
                System.out.println("Overtime ends in a tie!");
            }

            overtime++;
        } while (team1Score == team2Score);

        scanner.close();
    }
}

NFLGameSimulation.main(null)

NFL Game Simulation
Enter the name of Team 1: Enter the score of Team 1: Enter the name of Team 2: Enter the score of Team 2: It's a tie game!
Simulating an overtime scenario...
Enter the overtime score of Team 1: Enter the overtime score of Team 2: Bills wins in overtime!

In this program, you can input the names and scores of two NFL teams, and it will determine the game outcome and simulate overtime scenarios if the game is tied. It uses do-while for the overtime simulation and if statements to check the game result.