CS1: Lecture 26 – Looping Patterns
Dear students,
So far we’ve used loops to traverse 1D spaces: the number line, files, and a sequence of random events like coin flipping. Today we bust out into 2D spaces, traversing images and other Cartesian grids.
Nesting Loops
To transition to our next concept, let’s write a program to mimic the activity we see in this video:
If we consistently apply the ideas we’ve been talking about, we can write a program that produces this table of numbers with just five lines of code. The trick is to loop our loop.
We’ll use nested loops and get some practice with the BufferedImage
class using these exercises:
- Flip an image vertically, making the top become the bottom and the bottom become the top.
- Rearrange the color channels of an image.
- Combine the left half of one image with the right half of another.
- Generate an XOR texture.
- Invert an image.
- Rotate an image 90 degrees.
TODO
Here’s your TODO list to complete before we meet again:
- Today’s the last day for resubmission. When you submit your code to Kattis, leave out the
package
line. - Work on homework 4. Think about the regret you will feel in a week’s time. Avoid that regret.
See you next class!
Sincerely,
P.S. It’s time for a haiku!
A ghost on its beat
For each avenue, each street
Ding dong, trick-or-treat
P.P.S. Here’s the code we wrote together in class…
Flipping.java
package lecture1101.cs145;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Flipping {
public static void main(String[] args) throws IOException {
BufferedImage image = ImageIO.read(new File("/Users/johnch/Desktop/uhoh.png"));
for (int r = 0; r < image.getHeight() / 2; r++) {
int rComplement = image.getHeight() - 1 - r;
for (int c = 0; c < image.getWidth(); c++) {
int thatPixel = image.getRGB(c, rComplement);
int thisPixel = image.getRGB(c, r);
image.setRGB(c, rComplement, thisPixel);
image.setRGB(c, r, thatPixel);
}
}
ImageIO.write(image, "png", new File("/Users/johnch/Desktop/uhohuhoh.png"));
}
}
Video.java
package lecture1101.cs145;
public class Video {
public static void main(String[] args) {
for (int r = 1; r <= 8; r++) {
// for (int c = r; c <= r * 8; c += r) {
// System.out.printf("%3d", c);
// }
for (int c = 1; c <= 8; c++) {
System.out.printf("%3d", c * r);
}
System.out.println();
}
// for (int i = 2; i <= 16; i += 2) {
// System.out.printf("%3d", i);
// }
// System.out.println();
//
//
// for (int i = 3; i <= 24; i += 3) {
// System.out.printf("%3d", i);
// }
// System.out.println();
}
}
Flip.java
package lecture1101.cs148;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Flip {
public static void main(String[] args) throws IOException {
BufferedImage image = ImageIO.read(new File("/Users/johnch/Desktop/uhoh.png"));
for (int r = 0; r < image.getHeight() / 2; ++r) {
for (int c = 0; c < image.getWidth(); ++c) {
int rComplement = image.getHeight() - 1 - r;
int thisPixel = image.getRGB(c, r);
int thatPixel = image.getRGB(c, rComplement);
image.setRGB(c, r, thatPixel);
image.setRGB(c, rComplement, thisPixel);
}
}
ImageIO.write(image, "png", new File("/Users/johnch/Desktop/uhohuhoh.png"));
}
}
Grid.java
package lecture1101.cs148;
public class Grid {
public static void main(String[] args) {
for (int r = 1; r <= 8; r++) {
for (int c = 1; c <= 8; c++) {
System.out.printf("%3d", c * r);
}
System.out.println();
}
}
}
Recursion.java
package lecture1101.cs148;
public class Recursion {
public static void main(String[] args) {
System.out.println(has("Joe Mama", '!'));
}
public static boolean has(String haystack, char needle) {
if (haystack.isEmpty()) {
return false;
} else if (haystack.charAt(0) == needle) {
return true;
} else {
return has(haystack.substring(1), needle);
}
}
}