• 4.5 Informal Code Analysis
    • What IS informal code analysis?
  • 4.5 Hacks
  • U4 | Iteration


    4.1 while Loops


    • A while loop is a fundamental control structure in programming used for repeated execution of a block of code as long as a condition is true.
    • The loop starts by evaluating the condition. If the condition is true, the code inside the loop is executed.
    • After each iteration, the condition is re-evaluated, and if it’s still true, the loop continues. If the condition is false initially, the loop code is never executed.
    • While loops are used when you don’t know in advance how many times the loop needs to execute.
    • There’s a risk of infinite loops if the condition never becomes false, so be cautious. You can use variables and complex expressions as loop conditions.
    • It’s essential to update the loop control variable within the loop to prevent infinite loops.
    • While loops are typically used for tasks such as iterating over collections or waiting for a specific condition to be met.
    • You can always break out of a while loop prematurely using the break statement.

    Example of While Loops

    public class PyramidPattern {
        public static void main(String[] args) {
            int height = 5;
            int row = 1;
    
            while (row <= height) {
                int spaces = height - row;
                int stars = 2 * row - 1;
    
                // Print spaces
                int spaceCount = spaces;
                while (spaceCount > 0) {
                    System.out.print(" ");
                    spaceCount--;
                }
    
                // Print stars
                int starCount = stars;
                while (starCount > 0) {
                    System.out.print("*");
                    starCount--;
                }
    
                System.out.println(); // Move to the next line for the next row
                row++;
            }
        }
    }
    
    PyramidPattern.main(null)
    
        *
       ***
      *****
     *******
    *********
    

    4.2 for Loops


    • Iterative statement that checks for condition
    • Repeatedly execute a a block of code as long as the condition is met
    • Condition specifies amount of times

    for Loops vs. while Loops

    • while Loops: use when number of iterations is unknown
    • for Loops: use when number of iterations is known
    int i = 0;
    while (i < 5) {
        System.out.println(i);
        i++;
    }
    
    0
    1
    2
    3
    4
    
    for (int i = 0; i < 5; i++) {
        System.out.println(i);
    }
    
    0
    1
    2
    3
    4
    
    • Three parts in for loop header: variable initialization, Boolean (conditional) expression, and increment/decrement statement

    Question: Which part is which?

    • variable initialization (int i=0): sets variable before loop starts
    • Boolean (conditional) expression (i < 5): defines condition for loop to run, in this case, the loop continues as long as i is less than 5, so loops 5 times i 05
    • increment/decrement statement (i++): increases variable each time code block in the loop is executed, in this case it increases by 1
    • variable can be used in the code block for other various reasons besides specifying how many times the loop will repeat
    • Boolean (conditional) expression and increment/decrement statement together determine how many times the loop will repeat

    4.3 Developing Algorithms Using Strings


    LEARNING OBJECTIVES: For algorithms in the context of a particular specification that involves String objects:

    • identify standard algorithms
    • modify standard algorithms
    • develop an algorithm

    Java has many methods that are helpful when working with strings:

    • String .substring –> retrieves portion of a string
    • String .equals –> compares two strings
    • String .length –> returns length of a string
    • for Loop –> iterating through characters of a string



    Finding a substring within a string

    We can use the “window” method:

    A “window” is created the same length as the substring. We then iterate through the main string in sections and compare to the substring

    For example:

    I T E R A T E

    with substring “ERA”




    public class StringFinder {
        public static void main(String[] args) {
            String word = "iterate";
            String sub = "era";
            boolean found = false; // will be set to true once substring is found
    
            for (int i = 0; i < word.length(); i++) { //iterating forwards: starting at first index (0) and going to the length of the word.. let's try word.length
            
            int range = i + sub.length(); 
            
            if (range > word.length()) { // if the substring is longer than the remaining portion of the word, stop looking
                range = word.length();
            }
            
            String portion = word.substring(i, range);
                if (portion.equals(sub)) // make sure you use .equals!!
                    found = true;
            }
    
            if (found)
                System.out.println("substring is found within string!");
            else
                System.out.println("substring is NOT within string");
        }
    
        }
    
        StringFinder.main(null);
    
    substring is found within string!
    
    public class StringFinder {
        public static void main(String[] args) {
            String word = "iterate";
            String sub = "rate";
            boolean found = false; // will be set to true once substring is found
    
            for (int i = 0; i < word.length(); i++) { //iterating forwards: starting at first index (0) and going to the length of the word.. let's try word.length
            
            int range = i + sub.length(); 
            
            if (range > word.length()) { // if the substring is longer than the remaining portion of the word, stop looking
                range = word.length();
            }
            
            String portion = word.substring(i, range);
                if (portion.equals(sub)) // make sure you use .equals!!
                    found = true;
            }
    
            if (found)
                System.out.println("substring is found within string!");
            else
                System.out.println("substring is NOT within string");
        }
    
        }
    
        StringFinder.main(null);
    
    substring is found within string!
    

    POPCORN HACK: Run the code.. what happened? How can we fix it?

    Tell us below!


    There was a string out of bounds error when the string was iterated through which in this case is the word iterate. For every one iteration of the loop the code looks at the iterator count plus the length of the string to determine whether the word was in that range and stop when it has been determined. However as the substring was not located and on the fifth iteration it attempted to add the value of the iterator 5 to the length of the string which was three characters long to create a range from 5-8 to locate the substring which was not possible as the string was only 7 characters long. To fix this we can add another condition to loop to stop when the iterator count plus the length of the substring is greater than the length of the string and set it the length of the string.

    Another issue:

    I T E R A T E

    What if our substring was the word “RATE”? Note that RATE is at the end of the whole string. With the current solution the substring would be located within the string however with the solution discussed in class there is an issue with the method discussed as the loop terminates early as the last value is being subtracted.



    HACKS

    Create a algorithm similar to the one above. Except this time, use iteration to count the number of vowels within the main string.

    HINT: Use the boolean expressions we have learned in previous lessons. Which would you use when comparing your “window” with multiple options of substrings?

    // Hack response
    
    public class VowelFinder {
        public static void main(String[] args) {
            String word = "there were cookies in the jar";
            String vowels = "aeiou";
            int vowelCount = 0;
    
            for (int i = 0; i < word.length(); i++) {
                String letter = word.substring(i, i + 1);
                if (vowels.contains(letter)) {
                    vowelCount++;
                }
            }
    
            System.out.println("There are " + vowelCount + " vowels in the word \n" + word);
        }
    }
    
    VowelFinder.main(null);
    
    There are 11 vowels in the word 
    there were cookies in the jar
    

    4.4 Nested Iteration

    nested iteration

    occurs when we have a loop inside of another loop, similar to nested conditional statements in unit 3

    When you have one loop inside another, the inner loop has to finish all its rounds before the outer loop moves to the next round. If the inner loop has a “stop” command, it only stops for that round of the outer loop. The next time the outer loop starts a new round, the inner loop starts over.

    If you have two nested loops without stops, and the outer one runs n times while the inner one runs m times each time the outer one goes around, the inner loop will run m times n times, which is m * n times in total. This rule also applies if you have more than two nested loops. To find the total number of times the innermost loop runs, just multiply how many times each loop runs per round.

    public class NestedLoopsDemo {
        public static void main(String[] args) {
            int n = 3; //numb of times the outside loop runs
            int m = 2; //numb of times the inside loop runs
    
            //the nested loops
            for (int i = 1; i <= n; i++) {
                System.out.println("Outer loop iteration: " + i);
                for (int j = 1; j <= m; j++) {
                    System.out.println("Inner loop iteration: " + j);
                }
            }
        }
    }
    NestedLoopsDemo.main(null)
    

    Break Statement

    break statement

    is used to exit a loop prematurely, typically when a certain condition is met. In the case of nested loops, it can be used to break out of the innermost loop.
    public class BreakExample {
        public static void main(String[] args) {
            for (int i = 1; i <= 3; i++) {
                System.out.println("Outer loop iteration " + i);
    
                for (int j = 1; j <= 3; j++) {
                    System.out.println("Inner loop iteration " + j);
    
                    if (i == 2 && j == 2) {
                        System.out.println("Breaking inner loop");
                        break; //break out of the inside loop when i is 2 and j is 2.
                    }
                }
            }
        }
    }
    BreakExample.main(null)
    

    Popcorn HACK

    When the targetNumber is found, you can print a message and use the break statement to exit the loop. When it’s not found, you can print a message indicating that the number was not found.

    public class BreakHack {
        public static void main(String[] args) {
            int targetNumber = 42; //numb we want
            int[] numbers = {10, 20, 30, 40, 50, 60, 70}; //numb array
    
            for (int number : numbers) {
                if (number == targetNumber) {
                    System.out.println("Number found!");
                    break;
                    //if numb is found
                    //print message to break out loop
                }
            }
            System.out.println("Number not found!");
            //if numb isnt found
            //print message showing numb wasnt found if you want
        }
    }
    BreakHack.main(null)
    
    Number not found!
    

    Continue Statement

    continue statement

    is used to skip the current iteration of a loop and move to the next iteration. In the case of nested loops, it applies to the innermost loop.
    public class ContinueExample {
        public static void main(String[] args) {
            for (int i = 1; i <= 3; i++) {
                System.out.println("Outer loop iteration " + i);
    
                for (int j = 1; j <= 3; j++) {
                    if (i == 2 && j == 2) {
                        System.out.println("Skipping inner loop iteration " + j);
                        continue; //skip the iteration when i is 2 and j is 2.
                    }
                    System.out.println("Inner loop iteration " + j);
                }
            }
        }
    }
    ContinueExample.main(null)
    
    Outer loop iteration 1
    Inner loop iteration 1
    Inner loop iteration 2
    Inner loop iteration 3
    Outer loop iteration 2
    Inner loop iteration 1
    Skipping inner loop iteration 2
    Inner loop iteration 3
    Outer loop iteration 3
    Inner loop iteration 1
    Inner loop iteration 2
    Inner loop iteration 3
    

    Patterns and Shapes

    import java.util.Scanner;
    
    public class InteractivePyramid {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.print("Enter the symbol you want to use: ");
            char symbol = scanner.next().charAt(0);
    
            System.out.print("Enter the number of rows for the pyramid: ");
            int numRows = scanner.nextInt();
    
            for (int i = 1; i <= numRows; i++) {
                //print space before the symbol
                for (int j = 1; j <= numRows - i; j++) {
                    System.out.print(" ");
                }
    
                //print
                for (int k = 1; k <= 2 * i - 1; k++) {
                    System.out.print(symbol);
                }
    
                System.out.println(); //next line
            }
            scanner.close();
        }
    }
    InteractivePyramid.main(null)
    
    Enter the symbol you want to use: Enter the number of rows for the pyramid:  l
    lll
    

    Hacks

    1. Modify pyramid code:
    • Create different patterns (other then pyramid) by modifying nested loop structure
    1. Questions
    • What is a nested iteration, continue statement, and break statement (in your own words)?
      • Nested iteration is when there is a loop within another loop, a continue statement is when the loop skips the current iteration and moves to the next iteration, and a break statement is when the loop exits prematurely.
    • Create a simple example of a continue statement or break statement
    // Hack Question 1
    
    import java.util.Scanner;
    
    public class SquarePattern {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.print("Enter the symbol you want to use: ");
            char symbol = scanner.next().charAt(0);
    
            System.out.print("Enter the size of the square: \n");
            int size = scanner.nextInt();
    
            for (int i = 1; i <= size; i++) {
                for (int j = 1; j <= size; j++) {
                    System.out.print(symbol);
                }
                System.out.println();
            }
            
            scanner.close();
        }
    }
    
    SquarePattern.main(null)
    
    Enter the symbol you want to use: 
    
    Enter the size of the square: 
    55555
    55555
    55555
    55555
    55555
    
    // Hack Question 2
    import java.util.Scanner;
    
    public class BreakDemo{
        public static void main(String[] args){
            Scanner scanner = new Scanner(System.in);
            while(true){
                System.out.print("Enter an age: ");
    
                if (scanner.hasNextInt()){
                    int age = scanner.nextInt();
                    if (age >= 0 && age <= 120){
                        System.out.println("Age is valid");
                        break;
                    }
                    else{
                        System.out.println("Age is invalid");
                    }
                }
                else{
                    System.out.println("Age is invalid");
                    scanner.next();
                }
            }
        }
    }
    
    BreakDemo.main(null)
    
    Enter an age: Age is valid
    

    4.5 Informal Code Analysis

    Learning objective: Compute statement execution counts & informal run-time comparison of iterative statements

    Essential Knowledge: A statement execution count indicates the number of times a statement is executed by the program

    What IS informal code analysis?

    Answer: Informal code analysis is examining the informal run time based on how many time a statement is executed.

    // CODE EXAMPLE #1 (for loop)
    public class InformalCodeAnalysis {
        public static void main(String[] args) {
            int count = 0;
            for (int k = 0; k < 30; k++)
            {
                if (k % 3 == 0) // statement 1
                {
                    count++; // statement 2
                }
            }
        }
    }
    
    InformalCodeAnalysis.main(null)
    

    How many times will statement 1 execute?

    Answer: 30

    How many times will statement 2 execute?

    Answer: 9

    // CODE EXAMPLE #2 (for loop)
    public class InformalCodeAnalysis {
        public static void main(String[] args) {
            int count = 0;
            for (int k = 4; k < 30; k+=3)
            {
                count++; // statement 3
            }
        }
    }
    

    How many times will statement 3 execute?

    Answer: 8

    // Rewrite the code segment below to have a faster run-time based on statement execution counts
    for (int k = 0; k < 135; k++)
    {
        if (k % 5 == 0)
        {
            System.out.println(k);
        }
    }
    
    
    0
    5
    10
    15
    20
    25
    30
    35
    40
    45
    50
    55
    60
    65
    70
    75
    80
    85
    90
    95
    100
    105
    110
    115
    120
    125
    130
    
    // Rewritten code segment
    
    for (int k = 0; k < 135; k += 5)
    {
        System.out.println(k);
    }
    
    
    0
    5
    10
    15
    20
    25
    30
    35
    40
    45
    50
    55
    60
    65
    70
    75
    80
    85
    90
    95
    100
    105
    110
    115
    120
    125
    130
    
    // CODE EXAMPLE #3 (while loop)
    
    int num = (int)(Math.random() * 10);
    while (num % 2 != 0)
    {
        num = (int)(Math.random() * 10); // statement 4
    }
    

    What is the min/max number of times statement 4 will execute?

    Answer:

    • minimum: 0 times as the number generated may be even
    • maximum: 1 time if the number generated is odd
    // CODE EXAMPLE #4 (nested loop)
    
    for (int outer = 0; outer < 3; outer++)
    {
        for (int inner = 0; inner < 4; inner++)
        {
            // statement #5
        }
    }
    

    How many times will statement #5 execute?

    Answer: 12 times as the outer loop will execute the inner loop 3 times and the inner loop will execute the statement 4 times per loop and 3*4 is 12.

    // CODE EXAMPLE #5 (nested loop)
    
    int k = 0;
    while (k < 5)
    {
        int x = (int)(Math.random() * 6) + 1;
        while (x != 6)
        {
            // statement #6
            x = (int)(Math.random() * 6) + 1;
        }
        k++;
    }
    

    How many times will statement #6 execute?

    Answer: The statement can execute an undeterminable amount of times as there is random involved.

    4.5 Hacks

    #1 How many times will statement #1 and statement #2 execute in the code segments below?

    for (int k = 0; k < 1000; k++)
    {
        // statement #1 will execute 1000 times
    }
    
    for (int k = 6; k < 50; k++)
    {
        // statement #2 will execute 44 times
    }
    

    #2 How many times will statement #3 execute for the code segment below?

    int k = 1;
    while (k <=7)
    {
        for (int z = 0; z < 4; z++)
        {
            // statement #3 will execute 28 times as the outer loop 
            // will execute the inner loop 7 times executing the statement
            // within 4 times per loop for a total of 28 times. 
        }
        k++;
    }
    

    #3 Create 3 seperate code segments that execute a statement 10 times using:

    (a) a for loop

    (b) a while loop

    (c) a nested loop

    // 3a code
    for (int i = 0; i < 10; i++)
    {
        System.out.println(i);
    }
    
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    // 3b code
    int i = 0;
    while(i < 10)
    {
        System.out.println(i);
        i++;
    }
    
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    // 3c code
    for(int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            System.out.println(j);
        }
    }
    
    0
    1
    0
    1
    0
    1
    0
    1
    0
    1
    
    // Calculate and print the sum of all even numbers from 1 to a given positive integer ‘n’ (user input n)
    
    import java.util.Scanner;
    
    public class SumOfEvenNumbers {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            
            // Ask the user to enter a positive integer 'n'
            System.out.print("Enter a positive integer 'n': ");
            int n = scanner.nextInt();
            
            // Validate that 'n' is positive
            if (n <= 0) {
                System.out.println("Please enter a positive integer.");
            } else {
                int sum = 0;
    
                // Iterate through numbers from 1 to 'n'
                for (int i = 1; i <= n; i++) {
                    if (i % 2 == 0) {
                        sum += i;
                    }
                }
    
                // Print the sum of even numbers
                System.out.println("\nSum of even numbers from 1 to " + n + " is: " + sum);
            }
            
            scanner.close();
        }
    }
    
    SumOfEvenNumbers.main(null)
    
    Enter a positive integer 'n': 
    
    
    Sum of even numbers from 1 to 12 is: 42