Nelson Speaker Series Monica Lam, Stanford

advertisement
Nelson Speaker Series
Monica Lam, Stanford
Wed., Dec. 1, 7:00 pm in Galileo
Today's software is riddled with errors that can
lead to catastrophic failures and vulnerabilities
that compromise system integrity. This talk
argues that we can greatly improve software
reliability by capturing the "design rules" that
govern a program and automatically preventing
violations of such rules in the code. We have
demonstrated the usefulness of this paradigm by
developing concrete programming tools that can
detect memory leaks statically, find root causes
of complex errors, and translate applicationspecific design rules automatically into static
and dynamic checkers.
ESA’s Ariane 5 rocket
The Ariane problem was due to a type error: a cast
from a long integer to a short integer, which should
only have been applied to a number less than 32768,
was erroneously applied to a larger number that
represented the "horizontal bias" of the flight. There
was no code to handle the error, so it followed the
usual fate of such exceptions and crashed the entire
software, the on-board computers, and the mission.
6/4/96
CS 5 Today
• Final project: a movie database (inspired by
• HW 14 (1 problem)
Recitation -- Friday @ 8am
www.imdb.com )
due Sunday, 12/5 at midnight
due Monday, 12/6 at midnight
Software Engineering:
M/T sections
W/Th sections
Human vs. Computer views of
the same information…
Building from Hw 12: CS5App class
Choose an option from the following menu:
0
1
2
3
4
5
6
7
Display All Directors
Display All Films
Display Films by Title (or piece)
Display Films by Director
Display Films by Year
Display Films by Rating (G, PG, PG-13, R, NC-17, UC)
Display Films by Review (0 to 10)
Add a New Film
8 Save database to file
9 Read database from file
42 Quit
start with Hw14Pr1.zip
class FilmDB
private Film[] films;
private int count;
private int capacity;
class Film
private
private
private
private
private
String title;
int year;
String rating;
double review;
Director dir;
class DirectorDB
private Director[] dirs;
private int count;
private int capacity;
class
Director
private String fname;
private String lname;
private FilmDB filmDB;
class
CS5App
static FilmDB F;
static
DirectorDB D;
public
public
public
public
public
public
public
public
public
public
public
FilmDB(int capacity)
boolean isFull()
void addFilm(Film f)
void displayAllFilms()
void saveAllFilms()
others are OK, too
void displayFilmsByTitle(String titlepiece)
void displayFilmsByYear(int year)
void displayFilmsByRating(String rating)
void displayFilmsByReview(double minreview)
boolean checkForFilm(String fulltitle)
int getCount()
public int getCapacity()
Methods
public Film(String title, int year, String rating,
double review, Director dir)
public String getTitle()
public int getYear();
public String getRating()
public double getReview()
public void display()
public void save()
public
public
public
public
public
public
DirectorDB(int capacity)
void displayAllDirectors()
void displayFilmsByDirector(String fname, String lname)
Director findDirectorByName(String fname, String lname)
void addDirector(Director dir)
int getCount()
public boolean isFull()
public Director(String fname, String lname, int capacity)
public String getFullName()
public String getLName()
public FilmDB getFilmDB()
public String getFName()
public static void main(String[] args)
static void printMenu()
static void saveDB(String filePart)
static void readFilmEntry()
static void readDB(String filePart)
A film database: “Human” view
100
2
Lord of the Rings: Return of the King
Jackson
Peter
2003
PG-13
9.0
Gigli
Brest
Martin
2003
R
2.2
this is in the file twofilms.txt
A film database: “Human” view
capacity of database
title
L name
F name
year
rating
review
100
count of Films that follow
2
Lord of the Rings: Return of the King
Jackson
Peter
use H.nl() to input Strings!
2003
PG-13
9.0
Gigli
Brest
the same sequence of data
Martin
for each Film object
2003
R
2.2
this is in the file twofilms.txt
A film database: “Computer” view
objects:
class DirectorDB
int count
Director[] dirs
Director[]
dirs
dirs[0]
dirs[1]
D
class Director
String fname
FilmDB filmDB
String lname
class Film
String title
int year
String rating
double review
Director dir
FilmDB
filmDB
Director
dir
d
f
class FilmDB
int count
Film[] films
Film[]
films
films[0]
films[1]
F
A film database: “Computer” view
class DirectorDB
int count
Director[] dirs
Director[]
dirs
dirs[0]
dirs[1]
relationships
among data…
class Director
String fname
FilmDB filmDB
String lname
class Film
String title
int year
String rating
double review
Director dir
FilmDB
filmDB
Director
dir
class FilmDB
int count
Film[] films
Film[]
films
films[0]
films[1]
Never send a human to do a machine’s job
- Agent Smith, The Matrix
Human
Computer translation
code in Hw14Pr1.zip
public static void saveDB(String fileNamePart)
{
String fullFileName = "../" + fileNamePart + ".txt";
H.pl("Saving the database's contents to the file " + fullFileName);
H.outputToFile(fullFileName);
// redirect the output to a file
H.pl(F.getCapacity());
// print the capacity (length of the array)
H.pl(F.getCount());
// print the count
(# of actual films)
F.saveAllFilms();
// print all film data to the file
H.outputToConsole();
// redirect subsequent output to the console
}
public static void readDB(String fileNamePart)
{
String fullFileName = "../" + fileNamePart + ".txt";
H.pl("Loading database contents from file " + fullFileName);
H.inputFromFile(fullFileName);
// redirect input to come from the file
int capacity = H.ni(“Capacity:”);
// reads in the capacity, an int
F = new FilmDB(capacity);
// trashes old F and creates a new one
D = new DirectorDB(capacity);
// trashes old D and creates a new one
int count = H.ni(“Count:”);
// reads in the count, an int
for (int i = 0; i < count; i++)
// for each film listed (up to count)...
{
readFilmEntry();
// read that film's entry into F
}
H.inputFromConsole();
// take subsequent input from the console
}
public static void readFilmEntry()
// method to read 1 film entry
Saving the database
code in Hw14Pr1.zip
public static void saveDB(String fileNamePart)
{
String fullFileName = "../" + fileNamePart + ".txt";
H.pl("Saving to the file " + fullFileName);
H.outputToFile(fullFileName);
100
H.pl(F.getCapacity());
2
LOTR: ROTK
H.pl(F.getCount());
Jackson
Peter
F.saveAllFilms();
2003
PG-13
H.outputToConsole();
9.0
}
Gigli
Brest
Martin
2003
R
file 2.2
Reading the database
code in Hw14Pr1.zip
public static void readDB(String fileNamePart)
{
String fullFileName = "../" + fileNamePart + ".txt";
H.pl("Loading DB from file " + fullFileName);
H.inputFromFile(fullFileName);
int capacity = H.ni(“Capacity:”);
100
2
F = new FilmDB(capacity);
LOTR: ROTK
D = new DirectorDB(capacity);
Jackson
Peter
int count = H.ni(“Count:”);
2003
for (int i = 0; i < count; i++)
PG-13
{
9.0
readFilmEntry();
Gigli
}
Brest
Martin
H.inputFromConsole();
2003
}
R
file 2.2
FilmDB data
private Film[] films;
private int count;
Constructors
• create an object F of type FilmDB
private static FilmDB F;
in
CS5App
// outside of main
public static void main(String[] args) {
F = new FilmDB(100); // capacity == 100
public FilmDB(int capacity)
in
FilmDB
• same thing for the object D of type DirectorDB
Option 7: readFilmEntry
Be sure to find/create/add all of the objects needed…
checkForFilm
1) Prompt for the title
* Make sure that title is not yet in F
findDirectorByName
2) Prompt for the director: LName, FName
* Check to see if that director is already in D
Create and add the director to D, if necessary
3) Get the year, rating
(G, PG),
and review
(0.0 - 10.0)
4) Create and add the film to F
5) Add the film to the director’s personal FilmDB
Director data
Constructors
private FilmDB filmDB;
private String fname;
private String lname;
• when adding a film… create a Director (if necessary)
in
readFilmEntry
in
CS5App
// prompt for the director’s last and first names
Director d = D.findDirectorByName(LN, FN);
if (d == null)
d = new Director(FN,LN,F.getCapacity());
public Director(String FN, String LN, int capacity)
in
Director
• create a Film
Film f = new Film(…)
null: the nonexistent object
a reference pointing to nothing!
Film f;
Film f = null;
Film
f
equivalent
statements
Any object (or array) can be set to null.
All objects (and arrays) are initially set to null.
Don’t try to call a method
on a null reference!
The new operator creates a real (non-null) object.
Film f = new Film(…);
String title
Film
f
int year
String rating
…
methods & data
The database(s)
FilmDB
class
FilmDB
F
int count
Film[] films
Film[]
films
films[0]
films[1]
films[2]
films[3]
films[4]
What is the count vs. the capacity of a FilmDB ?
Count vs. capacity
FilmDB
class
FilmDB
F
in main
(option 7)
int count
Film[] films
Film[]
films
Film
films[0]
Film
Film
Film
Film
films[1]
films[2]
films[3]
films[4]
if (F.isFull())
H.pl(“Sorry! Buy me more memory!”);
public boolean isFull()
{
in
FilmDB
Getters / Setters
Film
class
String title
String rating
int year
double review
Film
f
else
where
Director
dir
if (f.getYear() == 2006)
H.pl(“That movie hasn’t come out yet!”);
public int getYear()
{
in Film
Director dir
Retrieving information
FilmDB
class
FilmDB
F
Film[] films
int count
Film[]
films
Film
films[0]
Film
films[1]
All films of a
certain year...
Film
films[2]
films[3]
public void displayFilmsByYear(int year)
{
in
FilmDB
Displaying/Saving a film…
Film
class
String title
String rating
int year
double review
Film
f
else
where
f.display();
f.save();
Director
dir
// prints contents of f to the screen
// prints contents of f to a file
public void save()
{
in Film
Director dir
// the formatting is crucial!
A film database: “Human” view
100
2
Lord of the Rings: Return of the King
Jackson
Peter
2003
PG-13
9.0
Gigli
Brest
Martin
2003
R
2.2
this is in the file twofilms.txt
Quiz
Recursive Movies
Use recursion to display all of the films that match
the input year. Assume that x starts at 0.
(Hw14 ExCr)
For extra credit this week, use
recursion for display, finding,
& adding films and directors.
public void displayFilmsByYear(int year, int x)
{
in the
FilmDB
class
}
Quiz, p.2
Write the checkForFilm method that returns
true if a film with the input title is already in
the database, and false otherwise.
Use recursion,if you like; assume that x starts at 0.
public boolean checkForFilm(String title, int x)
{
}
in the
FilmDB
class
class FilmDB
private Film[] films;
private int count;
private int capacity;
class Film
private
private
private
private
private
String title;
int year;
String rating;
double review;
Director dir;
class DirectorDB
private Director[] dirs;
private int count;
private int capacity;
class
Director
private String fname;
private String lname;
private FilmDB filmDB;
class
CS5App
static FilmDB F;
static
DirectorDB D;
public
public
public
public
public
public
public
public
public
public
public
FilmDB(int capacity)
boolean isFull()
void addFilm(Film f)
void displayAllFilms()
void saveAllFilms()
others are OK, too
void displayFilmsByTitle(String titlepiece)
void displayFilmsByYear(int year)
void displayFilmsByRating(String rating)
void displayFilmsByReview(double minreview)
boolean checkForFilm(String fulltitle)
int getCount()
public int getCapacity()
Methods
public Film(String title, int year, String rating,
double review, Director dir)
public String getTitle()
public int getYear();
public String getRating()
public double getReview()
public void display()
public void save()
public
public
public
public
public
public
DirectorDB(int capacity)
void displayAllDirectors()
void displayFilmsByDirector(String fname, String lname)
Director findDirectorByName(String fname, String lname)
void addDirector(Director dir)
int getCount()
public boolean isFull()
public Director(String fname, String lname, int capacity)
public String getFullName()
public String getLName()
public FilmDB getFilmDB()
public String getFName()
public static void main(String[] args)
static void printMenu()
static void saveDB(String filePart)
static void readFilmEntry()
static void readDB(String filePart)
class FilmDB
private Film[] films;
private int count;
private int capacity;
class Film
private
private
private
private
private
String title;
int year;
String rating;
double review;
Director dir;
class DirectorDB
private Director[] dirs;
private int count;
private int capacity;
class
Director
private String fname;
private String lname;
private FilmDB filmDB;
class
CS5App
static FilmDB F;
static
DirectorDB D;
public
public
public
public
public
public
public
public
public
public
public
FilmDB(int capacity)
boolean isFull()
void addFilm(Film f)
void displayAllFilms()
void saveAllFilms()
others are OK, too
void displayFilmsByTitle(String titlepiece)
void displayFilmsByYear(int year)
void displayFilmsByRating(String rating)
void displayFilmsByReview(double minreview)
boolean checkForFilm(String fulltitle)
int getCount()
public int getCapacity()
Methods
public Film(String title, int year, String rating,
double review, Director dir)
public String getTitle()
public int getYear();
public String getRating()
public double getReview()
public void display()
public void save()
public
public
public
public
public
public
DirectorDB(int capacity)
void displayAllDirectors()
void displayFilmsByDirector(String fname, String lname)
Director findDirectorByName(String fname, String lname)
void addDirector(Director dir)
int getCount()
public boolean isFull()
public Director(String fname, String lname, int capacity)
public String getFullName()
public String getLName()
public FilmDB getFilmDB()
public String getFName()
public static void main(String[] args)
static void printMenu()
static void saveDB(String filePart)
static void readFilmEntry()
static void readDB(String filePart)
Adding to the Database(s)
Film[] films
int count
Film[]
films
H. P.
S. W.
?
Film
Film
Film
films[0]
films[1]
films[2]
films[3]
a Film to be added to our database…
String title (“LOTR: ROTK”)
Film f
int year (2003)
…
methods & other data
Goal: output films in alphabetical order
films[4]
Imposing order
(Method 1)
Add the new film at the end and call sort
Da Hip Hop Witch
From Justin
to Kelly
The World
of Batwoman
Gigli
films[0]
films[1]
films[2]
films[3]
films[4]
films[5]
Keeping order
(Method 2) Travel down the list, moving films over to find
the right place for the new film
Lord of the
Rings: ROTK
Shawshank
Redemption
Seven
Samurai
films[0]
films[1]
films[2]
films[3]
films[4]
films[5]
Keeping order
(2) Travel down the list, moving films over to find
the right place for the new film
Lord of the
Rings: ROTK
Shawshank
Redemption
Godfather
Seven
Samurai
films[0]
films[1]
films[2]
films[3]
start
films[4]
films[5]
Keeping order
(2) Travel down the list, moving films over to find
the right place for the new film
compare
Shawshank
Redemption
Godfather
Lord of the
Rings: ROTK
Seven
Samurai
films[0]
films[1]
films[2]
films[3]
start
films[4]
films[5]
Keeping order
(2) Travel down the list, moving films over to find
the right place for the new film
Shawshank
Redemption
Godfather
move over
Seven
Samurai
films[0]
Lord of the
Rings: ROTK
films[1]
films[2]
next up
films[3]
films[4]
films[5]
Keeping order
(2) Travel down the list, moving films over to find
the right place for the new film
Shawshank
Redemption
Godfather
compare
Seven
Samurai
films[0]
Lord of the
Rings: ROTK
films[1]
films[2]
next up
films[3]
films[4]
films[5]
Keeping order
(2) Travel down the list, moving films over to find
the right place for the new film
Shawshank
Redemption
Godfather
Seven
Samurai
films[0]
Lord of the
Rings: ROTK
films[1]
next up
move over
films[2]
films[3]
films[4]
films[5]
Keeping order
(2) Travel down the list, moving films over to find
the right place for the new film
compare
Lord of the
Rings: ROTK
Shawshank
Redemption
Godfather
Seven
Samurai
films[0]
films[1]
next up
films[2]
films[3]
films[4]
films[5]
Keeping order
(2) Travel down the list, moving films over to find
the right place for the new film
Lord of the
Rings: ROTK
Shawshank
Redemption
Godfather
place
Seven
Samurai
films[0]
films[1]
films[2]
films[3]
DONE!
films[4]
films[5]
Keeping order
(2) Travel down the list, moving films over to find
the right place for the new film
or, equivalently...
Godfather
Seven
Samurai
Shawshank
Redemption
Lord of the
Rings: ROTK
films[0]
films[1]
films[2]
films[3]
films[4]
films[5]
compareTo method
String s = “startrek”;
01234567
s.compareTo(“starwars”)
is
< 0
s.compareTo(“starman”)
is
> 0
s.compareTo(“startrek”)
is == 0
s.compareToIgnoreCase(…)
works the same way, but without
considering upper/lower case distinctions
Keeping order
public void addFilm(Film f)
{
(in FilmDB)
Other notes: indexOf
• When printing out all films that match a certain title,
allow matches to any part of the title… use indexOf():
String s = “startrek”;
s.indexOf(“trek”)
s.indexOf(“art”)
s.indexOf(“wart”)
Returns the index of the
location of the substring.
is 4
is 2
is -1
-1 if the input is NOT a substring at all.
Use this to decide which films to display…
Parting Wisdom
There is a difference between knowing
the path and walking the path.
- Morpheus, The Matrix
Lab this week (optional):
You may (will) want to start early on this one…
Other notes
• When finding a director, look through the list for matches
and return null if not yet in the database...
public
{
//
//
//
}
Director findDirByName(String LN, String FN)
loop through all of the directors
if both names match, return that director object
if nothing matches, return null
• When printing out all films that match a certain title,
allow matches to any part of the title… use indexOf():
String s = “startrek”;
s.indexOf(“trek”)
s.indexOf(“art”)
s.indexOf(“wart”)
is 4
is 2
is -1
Negative if the input is
NOT contained as a
substring. Use this to
determine which ones to
display…
A film database:
class DirectorDB
int count
Director[] dirs
Director[]
dirs
dirs[0]
dirs[1]
class Director
String fname
FilmDB filmDB
String lname
class Film
String title
int year
String rating
double review
Director dir
FilmDB
filmDB
Director
dir
class FilmDB
int count
Film[] films
Film[]
films
films[0]
films[1]
Adding to the Database(s)
Film[] films J. Park
int count
Film
Film[]
films
films[0]
Star Wars Titanic
Film
films[1]
Film
films[2]
films[3]
films[4]
a brand new Film
String title (“LordOfTheRings”)
Film f
int year (2001)
…
methods & other data
Goal: output films in alphabetical order
Other hints
• When finding a film name, allow the user to input
a part of the name to look up -- use indexOf():
String s = “startrek”;
s.indexOf(“trek”)
s.indexOf(“art”)
is 4
is 2
s.indexOf(“wart”)
is -1
useful for checking if a
string contains a
particular substring!
CS 5 Today
• The complexity of programs or, the need for speed...
We can sort a list of 5 elements, how about one of 500,000 ?
80
10
42
7
L
73
H
vs. problems we don’t know how to do at all! (Next week)
• HW problem problems? Let me know!
• HW 14 (1 problem)
Recitation -- Friday @ 8am
due Sunday, 12/7 at midnight
due Monday, 12/8 at midnight
M/T sections
W/Th sections
class FilmDB
class Film
class DirectorDB
class Director
public
public
public
public
public
public
public
public
public
public
Methods
FilmDB(int capacity)
boolean isFull()
int getCount()
void addFilm(Film f)
Film findFilmByTitle(String title)
void displayAllFilms()
void displayFilmsByTitle(String titlepiece)
void displayFilmsByYear(int year)
void displayFilmsByRating(String rating)
void displayFilmsByReview(double minreview)
public Film(String title, int year, String rating,
double review, Director dir)
public String getTitle()
public int getYear()
public String getRating()
public double getReview()
public void display()
public
public
public
public
public
public
public
DirectorDB(int capacity)
void displayAllDirectors()
void displayFilmsByDirector(String fname, String lname)
Director findDirectorByName(String fname, String lname)
void addDirector(Director dir)
int getCount()
boolean isFull()
public Director(String fname, String lname, int capacity)
public String getFullName()
public String getLName()
public FilmDB getFilmDB()
public String getFName()
class FilmDB
private Film[] films;
private int count;
private int capacity;
class Film
private
private
private
private
private
String title;
int year;
String rating;
double review;
Director dir;
class DirectorDB
private Director[] dirs;
private int count;
private int capacity;
class
Director
private String fname;
private String lname;
private FilmDB filmDB;
public
public
public
public
public
public
public
public
public
public
Methods
FilmDB(int capacity)
boolean isFull()
int getCount()
void addFilm(Film f)
others are OK, too
boolean checkForFilm(String fulltitle)
void displayAllFilms()
void displayFilmsByTitle(String titlepiece)
void displayFilmsByYear(int year)
void displayFilmsByRating(String rating)
void displayFilmsByReview(double minreview)
public Film(String title, int year, String rating,
double review, Director dir)
public String getTitle()
public int getYear()
public String getRating()
public double getReview()
public void display()
public
public
public
public
public
public
public
DirectorDB(int capacity)
void displayAllDirectors()
void displayFilmsByDirector(String fname, String lname)
Director findDirectorByName(String fname, String lname)
void addDirector(Director dir)
int getCount()
boolean isFull()
public Director(String fname, String lname, int capacity)
public String getFullName()
public String getLName()
public FilmDB getFilmDB()
public String getFName()
class FilmDB
private Film[] films;
private int count;
private int capacity;
class Film
private
private
private
private
private
String title;
int year;
String rating;
double review;
Director dir;
class DirectorDB
private Director[] dirs;
private int count;
private int capacity;
class
Director
private String fname;
private String lname;
private FilmDB filmDB;
class
CS5App
static FilmDB F;
static
DirectorDB D;
public
public
public
public
public
public
public
public
public
public
public
FilmDB(int capacity)
boolean isFull()
int getCount()
void addFilm(Film f)
void displayAllFilms()
void saveAllFilms()
void displayFilmsByTitle(String titlepiece)
void displayFilmsByYear(int year)
void displayFilmsByRating(String rating)
void displayFilmsByReview(double minreview)
boolean checkForFilm(String fulltitle)
Methods
others are OK, too
public Film(String title, int year, String rating,
double review, Director dir)
public String getTitle()
public int getYear()
public String getRating()
public double getReview()
public void display()
public void save()
public
public
public
public
public
public
public
DirectorDB(int capacity)
void displayAllDirectors()
void displayFilmsByDirector(String fname, String lname)
Director findDirectorByName(String fname, String lname)
void addDirector(Director dir)
int getCount()
boolean isFull()
public Director(String fname, String lname, int capacity)
public String getFullName()
public String getLName()
public FilmDB getFilmDB()
public String getFName()
public static void main(String[] args)
static void printMenu()
static void saveDB(String filePart)
static void readFilmEntry()
static void readDB(String filePart)
Sorting recursively
A
80
L
10
42
7
73
U
void moveMinToLeft(double[] A, int L, int U)
{
if (L == U) return;
if (A[L] > A[U])
// should we swap the last?
{
double x = A[L], y = A[U]; A[L] = y; A[U] = x;
}
moveMinToLeft(A,L,U-1);
// need to swap the rest…
}
void sort(double[] A, int L, int U)
{
if (L >= U) return;
moveMinToLeft(A,L,U);
// sort the first element
sort(A,L+1,U);
// sort the rest of them
}
Download