Nelson Speaker Series 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 application-specific design rules automatically into static and dynamic checkers. Monica Lam, Stanford 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. ESA’s Ariane 5 rocket 6/4/96
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Nelson Speaker Series
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 application-specific design rules automatically into static and dynamic checkers.
Monica Lam, Stanford
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.
ESA’s Ariane 5 rocket 6/4/96
• HW 14 (1 problem) M/T sections
W/Th sections
due Sunday, 12/5 at midnight
due Monday, 12/6 at midnightRecitation -- Friday @ 8am
• Final project: a movie database (inspired by www.imdb.com )
CS 5 Today
Software Engineering:
Human vs. Computer views of the same
information…
Building from Hw 12: CS5App class
Choose an option from the following menu:
0 Display All Directors 1 Display All Films 2 Display Films by Title (or piece) 3 Display Films by Director 4 Display Films by Year 5 Display Films by Rating (G, PG, PG-13, R, NC-17, UC) 6 Display Films by Review (0 to 10) 7 Add a New Film
8 Save database to file 9 Read database from file
42 Quit
start with Hw14Pr1.zip
Methodsclass FilmDB
class DirectorDB
class Film
class Director
public FilmDB(int capacity) public boolean isFull() public void addFilm(Film f) public void displayAllFilms()public void saveAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public void displayFilmsByReview(double minreview)public boolean checkForFilm(String fulltitle) public int getCount() public int getCapacity()
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()
others are OK, too
public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()
public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()
private Film[] films;private int count;private int capacity;
private String title;private int year;private String rating;private double review;private Director dir;
private Director[] dirs;private int count;private int capacity;
class CS5App public static void main(String[] args) static void printMenu() static void saveDB(String filePart)static void readFilmEntry() static void readDB(String filePart)
static FilmDB F;static DirectorDB D;
A film database: “Human” view
1002Lord of the Rings: Return of the KingJacksonPeter2003PG-139.0GigliBrestMartin2003R2.2
this is in the file twofilms.txt
A film database: “Human” view
1002Lord of the Rings: Return of the KingJacksonPeter2003PG-139.0GigliBrestMartin2003R2.2
capacity of database
count of Films that follow
titleL
nameF nameyearrating
review
the same sequence of data for each Film object
this is in the file twofilms.txt
use H.nl() to input Strings!
class Director
class FilmString titleint year
String ratingdouble review
Director dirDirector
dir
String fname
String lname
FilmDB filmDB FilmDBfilmDB
class FilmDBint count
Film[] filmsFilm[]films
films[0] films[1]
class DirectorDBint count
Director[] dirs Director[]dirs
dirs[0] dirs[1]
objects:
D
d
f
F
A film database: “Computer” view
class Director
class FilmString titleint year
String ratingdouble review
Director dirDirector
dir
String fname
String lname
FilmDB filmDB FilmDBfilmDB
class FilmDBint count
Film[] filmsFilm[]films
films[0] films[1]
class DirectorDBint count
Director[] dirs Director[]dirs
dirs[0] dirs[1]
A film database: “Computer” view
relationships among data…
Never send a human to do a machine’s job- Agent Smith, The Matrix
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
Human Computer translation code in Hw14Pr1.zip
public static void saveDB(String fileNamePart){ String fullFileName = "../" + fileNamePart + ".txt"; H.pl("Saving to the file " + fullFileName); H.outputToFile(fullFileName); H.pl(F.getCapacity()); H.pl(F.getCount()); F.saveAllFilms(); H.outputToConsole(); }
if (F.isFull()) H.pl(“Sorry! Buy me more memory!”);
in main(option 7)
in FilmDB
public boolean isFull(){
Film Film Film Film Film
FilmDB class
Getters / Setters
int year
String title
DirectordirFilm
f
if (f.getYear() == 2006) H.pl(“That movie hasn’t come out yet!”);
else where
in Film
public int getYear(){
String rating
double review
Director dir
Film class
Retrieving information All films of a certain year...
public void displayFilmsByYear(int year){
in FilmDB
int countFilm[] films
Film[]films films[0] films[1] films[2] films[3]
Film Film Film
FilmDBF
FilmDB class
Displaying/Saving a film…
int year
String title
DirectordirFilm
f
f.display(); // prints contents of f to the screen f.save(); // prints contents of f to a file
else where
in Film
public void save() // the formatting is crucial!{
String rating
double review
Director dir
Film class
A film database: “Human” view
1002Lord of the Rings: Return of the KingJacksonPeter2003PG-139.0GigliBrestMartin2003R2.2
this is in the file twofilms.txt
Quiz Recursive Movies
public void displayFilmsByYear(int year, int x){
}
For extra credit this week, use recursion for display, finding, & adding films and directors.
in the FilmDB class
Use recursion to display all of the films that match the input year. Assume that x starts at
0.
(Hw14 ExCr)
Quiz, p.2
public boolean checkForFilm(String title, int x){
}
Write the checkForFilm method that returns true if a film with the input title is
already in the database, and false otherwise.
in the FilmDB class
Use recursion,if you like; assume that x starts at 0.
Methodsclass FilmDB
class DirectorDB
class Film
class Director
public FilmDB(int capacity) public boolean isFull() public void addFilm(Film f) public void displayAllFilms()public void saveAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public void displayFilmsByReview(double minreview)public boolean checkForFilm(String fulltitle) public int getCount() public int getCapacity()
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()
others are OK, too
public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()
public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()
private Film[] films;private int count;private int capacity;
private String title;private int year;private String rating;private double review;private Director dir;
private Director[] dirs;private int count;private int capacity;
class CS5App public static void main(String[] args) static void printMenu() static void saveDB(String filePart)static void readFilmEntry() static void readDB(String filePart)
static FilmDB F;static DirectorDB D;
Methodsclass FilmDB
class DirectorDB
class Film
class Director
public FilmDB(int capacity) public boolean isFull() public void addFilm(Film f) public void displayAllFilms()public void saveAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public void displayFilmsByReview(double minreview)public boolean checkForFilm(String fulltitle) public int getCount() public int getCapacity()
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()
others are OK, too
public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()
public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()
private Film[] films;private int count;private int capacity;
private String title;private int year;private String rating;private double review;private Director dir;
private Director[] dirs;private int count;private int capacity;
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”) is 4 s.indexOf(“art”) is 2 s.indexOf(“wart”) is -1
-1 if the input is NOT a substring at all. Use this to decide which films to
display…
Returns the index of the location of the substring.
Parting Wisdom
There is a difference between knowing the path and walking the path.
Lab this week (optional):
You may (will) want to start early on this one…
- Morpheus, The Matrix
Other notes
• 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”) is 4 s.indexOf(“art”) is 2 s.indexOf(“wart”) is -1
Negative if the input is NOT contained as a substring. Use this to determine which ones
to display…
• 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}
A film database:
class Director
class FilmString titleint year
String ratingdouble review
Director dirDirector
dir
String fname
String lname
FilmDB filmDB FilmDBfilmDB
class FilmDBint count
Film[] filmsFilm[]films
films[0] films[1]
class DirectorDBint count
Director[] dirs Director[]dirs
dirs[0] dirs[1]
Adding to the Database(s)
Goal: output films in alphabetical order
int countFilm[] films
Film[]films films[0] films[1]
Film f
films[2] films[3] films[4]
String title (“LordOfTheRings”)
int year (2001)methods & other data…
Film Film Film
a brand new Film
TitanicStar WarsJ. Park
Other hints
• When finding a film name, allow the user to inputa part of the name to look up -- use indexOf():
String s = “startrek”;
s.indexOf(“trek”) is 4 s.indexOf(“art”) is 2
s.indexOf(“wart”) is -1
useful for checking if a string contains a
particular substring!
CS 5 Today
• HW 14 (1 problem) M/T sections
W/Th sections
due Sunday, 12/7 at midnight
due Monday, 12/8 at midnightRecitation -- Friday @ 8am
• The complexity of programs
We can sort a list of 5 elements, how about one of 500,000 ?
• HW problem problems? Let me know!
or, the need for speed...
vs. problems we don’t know how to do at all! (Next week)
80 10 42 7 73L H
public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()
Methodsclass FilmDB
class DirectorDB
class Film
class Director
public FilmDB(int capacity) public boolean isFull() public int getCount() public void addFilm(Film f) public Film findFilmByTitle(String title) public void displayAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public 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 DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()
Methodsclass FilmDB
class DirectorDB
class Film
class Director
public FilmDB(int capacity) public boolean isFull() public int getCount() public void addFilm(Film f) public boolean checkForFilm(String fulltitle) public void displayAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public 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()
others are OK, too
public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()
public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()
private Film[] films;private int count;private int capacity;
private String title;private int year;private String rating;private double review;private Director dir;
private Director[] dirs;private int count;private int capacity;
public FilmDB(int capacity) public boolean isFull() public int getCount() public void addFilm(Film f) public void displayAllFilms()public void saveAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public void displayFilmsByReview(double minreview)public boolean checkForFilm(String fulltitle)
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()
others are OK, too
public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()
public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()
private Film[] films;private int count;private int capacity;
private String title;private int year;private String rating;private double review;private Director dir;
private Director[] dirs;private int count;private int capacity;
class CS5App public static void main(String[] args) static void printMenu() static void saveDB(String filePart)static void readFilmEntry() static void readDB(String filePart)
static FilmDB F;static DirectorDB D;
Sorting recursively
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 }