CS51A - Spring 2022 - Class 5

Example code in this lecture

   while.py

Lecture notes

  • admin
       - assignment 2

  • prime numbers
       - what is a prime number?
          - a number that is only divisible by 1 and itself
       - what are the first 10 prime numbers?
          - the first 100?
          - the first 1000?
       - How could we write a program that figured this out?
       - To start with, how can we tell if a number is prime?
          - try and divide it by all of the numbers between 1 and the number
          - if none of them divide evenly, then it's prime, otherwise it's not
       - A few questions:
          - do we need to check all of the numbers up to that number?
             - just need to check up to sqrt(number) (inclusive)
          - how can we check to see if a number divides evenly?
             - use the remainder/modulo operator and see if it equals 0 (i.e. no remainder)
          - how can we check all of the numbers?
             - use a for loop

  • look at isprime function in while.py code
       - for loop starting at 2 up to the sqrt of the number
          - there are multiple versions of the range function
             - range with a simple parameter starts counting at 0 up to but not including the specified number
             - range with 2 parameters starts counting at the first number up to, but not including, the second number

                for i in range(10, 20):
                   print i

                would print out the numbers from 10 - 19 (but not 20)

          - the if statement checks to see if the number is divisible by i
          - if we find this we can stop early!
             - the minute we find this, we know it's not prime so we can return False
          - what does "return True" do?
             - if we've checked all of the numbers and none of them were divisible (otherwise we would have exited the function with the return False), so return True
       - we can use this to see if a number is prime

          >>> isprime(5)
          True
          >>> isprime(6)
          False
          >>> isprime(100)
          False
          >>> isprime(101)
          True

  • import math
       - A second way to import: import module_name
       - To reference a function within that module, you then say module_name.function_name
       - Why might we use this option, i.e. when would we use:
          from math import *

          vs.

          import math

          - Use the first if you're going to be using the functions a lot and it's clear that they come from that module
          - Use the second to be extra clear where the functions are coming from and to avoid naming conflicts

  • how could we use isprime to print out the first 10 (100, 1000, etc) prime numbers?
       - like to do some sort of loop
       - will a for loop work?
          - we don't know when we're going to stop
          - we'd like to keep a count of how many we've seen and only stop when we've reached the number we want

  • while loop
       - another way to do repetition

       while <bool expression>:
          statement1
          statement2
          ...

       statement3

       as long as the <bool expression> evaluates to True, it continues to repeat the statements, when it becomes False, it then continues on and executes statement3, etc.

       - specifically:
          evaluates the boolean expression
             - if it's False
                - it "exits" the loop and goes on to statement3 and continues there
             - if it's True
                - executes statement1, statement2, ... (all statements inside the "block" of the loop, just like a for loop)
             - go back to beginning and repeat
       
       - how could we use a while loop for our prime numbers problem?
          - keep a count of how many primes we've found (initially starts at 0)
          - start count from 1 and work our way up
          - check each number
          - if it's prime
             - print it out
             - increment the counter of how many primes we've found
          - keep repeating this as long as (while) the number of primes we've printed is less than the number we want

  • can you emulate a for loop with a while loop?
       - yes!

       for i in range(10):
          ...

       is equivalent to writing:

       i = 0

       while i < 10:
          ...
          i = i + 1

  • look at firstprimes function in while.py code
       - current += 1 every time through the loop we increment the number we're examining
       - if that current number happens to be prime, we increment count
       - the loop continues "while" count < num, that is as long as the number we've found is less than the number we're looking for

  • infinite loops
       - what would the following code do?

       while True:
          print("hello")

       - will never stop
          - in this case you should see some output
          - sometimes, it will look like the program just froze if you're not actually printing anything out
       - you can stop this by selecting "reset shell"
       - be careful about these with your program. They're called an infinite loop.
       - if you think you might have an infinite loop
          - put in some print statements to debug
          - think about when the boolean expression will become False and make sure that is going to happen in your loop