Title: Postcondition: Moe, Larry, Curly, and Shemp totals hav
1The Software System Life Cycle
2Specification Example
- Produce a program which will
- Request four values from the user, representing
the popularity of the four stooges (Moe, Larry,
Curly, and Shemp), based upon a recent survey. - Compute the percentage popularity for each
stooge. - Display the result in a pie chart composed of
ASCII characters, with a different character used
for each stooge. - Display a character legend indicating which
character is associated with which stooge.
3Design Example
4Risk Analysis Example
- Time Risks
- Having an interactive session instead of just
reading the survey data from a file might delay
the production of the pie chart.
- Ethical Risks
- Displaying these survey results might be
considered an invasion of privacy by one or more
of the stooges. - No information about the validity of the survey
results is being provided.
- Economic Risks
- Having an interactive session instead of just
reading the survey from a file might waste the
users time. - To adequately present the pie chart and legend
information, more expensive display equipment
might be necessary. - Training users to correctly input the survey
data, and to correctly interpret the output
results, could prove expensive.
- Health Risks
- Moe might poke the software development team in
the eyes if he doesnt like the survey results. - Curly might mistake the pie chart for a real pie
and tossing the computer monitor into someones
face. - More seriously, the choice of ASCII characters
used in the pie chart might create
headache-inducing patterns.
5Verification Example
- Calculating Popularity Percentages
- Convert survey total for specified stooge into a
double value. - Divide stooges total by the total number of
people surveyed. - The result is the fraction of people surveyed who
prefer the specified stooge. - To obtain actual percentage, this value must be
multiplied by 100.
- Calculating Pie-Chart Angles
- Preset an angle-so-far value to zero it
represents the amount of the circular pie which
has already been traversed (i.e., the angle at
which the current stooges pie wedge begins). - Add the product of 2?. and the specified stooges
popularity percentage to obtain the angle at
which the current stooges pie wedge ends. - Reset the angle-so-far to the newly computed
value, in preparation for the the next stooges
calculation. - All angles are measured in radians to facilitate
the use of the angle operations defined in math.h.
- Determining Stooge Character at Position (x,y)
- The pie chart is being mapped to a square grid
of ASCII characters, indexed from -MAXRADIUS to
MAXRADIUS (for some hard-coded value of
MAXRADIUS, the radius of the circular pie chart). - For each (x,y) position, compute the pie-chart
angle of this position by using arctan(x/y). - Angles between zero and Moes maximum angle will
cause the position to be filled with Moes ASCII
character angles between Moes maximum and
Larrys maximum will result in the Larry
character angles between Larrys maximum and
Curlys maximum will result in the Curly
character and angles greater than Curlys
maximum will result in Shemps character.
6Coding Example
//////////////////////////////////////////////////
//////////////////////////////// // This program
requests four values from the user, representing
survey results // // from a poll which was taken
to determine people's favorite Three Stooges
// // character Moe, Larry, Curly, or Shemp.
Percentages are computed and the // // results
are displayed in a pie chart composed entirely of
characters. // ////////////////////////////
//////////////////////////////////////////////////
//// include ltiostreamgt include
ltiomanipgt include ltcmathgt using namespace
std void queryUser(int total, int
stgTot) void calculate(int tot, int stgTot,
double pct, double ang) void outputPie(double
angle) void outputLegend(double
percent) const int MAXRADIUS 6
// Pie chart radius (in characters) const double
PI 3.141592653589793 // Extremely precise
approximation const char MOECHAR '',
// Pie chart character for Moe
LARRYCHAR '', // " " "
" Larry CURLYCHAR 'O', //
" " " " Curly
SHEMPCHAR '\\' // " " "
" Shemp
7Coding Example (Continued)
void main() int surveyTotal4 // The
survey results for the four stooges, indicating
// how many
respondents selected each character as
// their favorite stooge 0 is
Moe, 1 is Larry,
// 2 is Curly, 3 is Shemp. int stoogeTotal
// The total number of survey respondents
(i.e., the // sum of
the four surveyTotal values). double
surveyPercent4 // The percentage of the
survey results allocated to
// each stooge 0 is Moe, 1 is Larry, 2
is Curly, // 3 is
Shemp. double surveyAngle4 // The angle
(in radians) encompassed by each section
// of the pie chart. Thus,
Moe's section goes from 0
// to surveyAngle0, Larry's from
surveyAngle0 to //
surveyAngle1, etc. int i
// Loop iteration variable.
queryUser(surveyTotal, stoogeTotal) for (i
0 i lt 3 i) calculate(surveyTotali,
stoogeTotal, surveyPercenti, surveyAnglei)
outputPie(surveyAngle) outputLegend(surveyPer
cent) return
8Coding Example (Continued)
//////////////////////////////////////////////////
////////////////////////// // Query the user for
the survey results, compute percentages and
angles. // ///////////////////////////////////////
///////////////////////////////////// void
queryUser(int total, int stgTot) int i
// Loop iteration variable. cout ltlt "How many
people surveyed chose Moe as their favorite
Stooge? " cin gtgt total0 cout ltlt "How many
people surveyed chose Larry as their favorite
Stooge? " cin gtgt total1 cout ltlt "How many
people surveyed chose Curly as their favorite
Stooge? " cin gtgt total2 cout ltlt "How many
people surveyed chose Shemp as their favorite
Stooge? " cin gtgt total3 stgTot 0 for (i
0 i lt 3 i) stgTot totali return
9Coding Example (Continued)
//////////////////////////////////////////////////
//////////////////////// // Calculate the
popularity percentage and maximum pie-chart angle
for // // the designated stooge, using a running
tally of the pie-chart angle // // that has
already been traversed by previous stooge
calculations. // /////////////////////////////
///////////////////////////////////////////// void
calculate(int tot, int stgTot, double pct,
double ang) static double angleSoFar 0.0
// This static variable tallies the
// total of all of the
angles for //
the previously computed stooges. pct
double(tot) / stgTot ang angleSoFar 2 PI
pct angleSoFar ang return
10Coding Example (Continued)
//////////////////////////////////////////////////
//////////////////////// // Cycle point by point
through the character positions. For any char-
// // acter within the pie chart's boundaries,
determine which stooge's // // pie wedge it
lies within, and insert the appropriate
character. // ///////////////////////////////
/////////////////////////////////////////// void
outputPie(double angle) int x,
// The horizontal and vertical
coordinates y // of
the pie chart point being considered. double
distanceFromCenter // The distance (in
characters) from the
// pie chart's center to the point which
// is currently being
considered. double currentAngle //
The angle (in radians) formed by the three
// points the point at
the top of the pie
// chart, the center of the pie chart, and the
// point which is
currently being considered.
11Coding Example (Continued)
cout ltlt endl for (y MAXRADIUS y gt
-MAXRADIUS y--) cout ltlt '\t'
for (x -MAXRADIUS x lt MAXRADIUS x)
distanceFromCenter sqrt(x x y
y) if (distanceFromCenter gt MAXRADIUS)
cout ltlt ' ' else
currentAngle atan2(x, y) // Library
function atan2 returns arctan if
(currentAngle lt 0) // of x/y (adjusting if
y0) 2PI may be currentAngle
2 PI // added to yield angles betw 0 and
2PI. if (currentAngle lt angle0)
cout ltlt MOECHAR else if
(currentAngle lt angle1) cout ltlt
LARRYCHAR else if (currentAngle lt
angle2) cout ltlt CURLYCHAR
else cout ltlt SHEMPCHAR
cout ltlt endl return
12Coding Example (Continued)
//////////////////////////////////////////////////
//////////// // A small legend is added below the
pie chart to indicate // // which character is
associated with which of the stooges.
// ///////////////////////////////////////////////
/////////////// void outputLegend(double
percent) cout.setf(iosfixed) cout ltlt
setprecision(3) cout ltlt "\t\t\t\t" ltlt MOECHAR
ltlt " - Moe " ltlt (percent0 100) ltlt
"\n" cout ltlt "\t\t\t\t" ltlt LARRYCHAR ltlt " -
Larry " ltlt (percent1 100) ltlt "\n" cout
ltlt "\t\t\t\t" ltlt CURLYCHAR ltlt " - Curly " ltlt
(percent2 100) ltlt "\n" cout ltlt "\t\t\t\t"
ltlt SHEMPCHAR ltlt " - Shemp " ltlt (percent3
100) ltlt "\n" cout ltlt endl return
13Testing Example
14Refinement Example
REFINEMENT Since displayed characters are 50
taller than they are wide, change output
algorithm to print 50 more characters on each
line, making pie chart look more circular.
for (y MAXRADIUS y gt -MAXRADIUS y--)
cout ltlt '\t' for (x
int(-1.5MAXRADIUS) x lt int(1.5MAXRADIUS)
x) distanceFromCenter
sqrt((2.0x/3.0) (2.0x/3.0) y y)
if (distanceFromCenter gt MAXRADIUS)
cout ltlt ' ' else
currentAngle atan2(2.0x/3.0, y) // atan2
returns arctan of 2x/3y if
(currentAngle lt 0) // (adjusting if
y0) 2PI may be currentAngle
2 PI // added to yield angles in
0,2PI. if (currentAngle lt
angle0) cout ltlt MOECHAR
else if (currentAngle lt angle1)
cout ltlt LARRYCHAR else if
(currentAngle lt angle2) cout ltlt
CURLYCHAR else cout ltlt SHEMPCHAR
cout ltlt endl
Modified Loop
Modified Output
15Production Example
16Maintenance Example
17Procedural Abstraction Information Hiding
To simplify the implementation of each module,
functional specifications should be hidden from
public view, i.e., other modules should not be
aware of the specifications of a separate module.
Does any module besides queryUser need to know
how the survey values are set?
Does any module besides outputPie need to know
how the wedges on the pie are printed?
Does any module besides calculate need to know
how the angles are calculated?
Does the outputLegend module need to know
anything besides the survey result values?
Does the queryUser module need to accept the
stooge total parmeter as a call-by-reference
parameter?
18Object-Oriented Design
- By viewing programming from an object-oriented
perspective instead of a procedural perspective,
additional mechanisms for hiding information (and
thus safeguarding our programs) have been
developed - Encapsulation
- Place the specific implementation details inside
the object being manipulated (e.g., how a list
object is searched or sorted, how a string object
is output). - Inheritance
- An object class that shares major features with a
previously defined object class can just
inherit those features from the old class
without having them rewritten (e.g., a credit
card account class could inherit from a more
generic bank account class). - Polymorphism
- Operators can be overloaded to mean different
things, depending on what class of object is
using them (e.g., the addition operator for
integers might be very different than the
addition operator for bank accounts, but both
would use the symbol to denote addition). - Well examine these mechanisms in further detail
as we proceed into the concept of C classes.
19Advantages of Modularity
- Simplifies the construction of a program
- Writing various small functions is simpler than
orchestrating a huge single-unit program. - Simplifies the debugging of a program
- Isolating errors to particular modules is made
possible, and testing individual functions is
easier than debugging a massive piece of code. - Improves the readability of a program
- Its easy to get lost in a huge program, but
separating functionality into self-contained
modules makes it easier to follow the logic of
whats happening in the code (especially, if the
functions are well named and documented). - Enables a program to be easily modified
- Modifications to algorithms are isolated to a
small set of modules, if each module has been set
up to perform a single cohesive task. - Eliminates redundant code
- Similar functionality occurring in various
locations in the program can be implemented as a
generic function instead of repetitive code. - Enables a programmer to reuse code segments in
other programs - Well-written generic modules can be cut and
pasted into other programs, rather than rewriting
them from scratch.
20Modifiability Guidelines
- Using functions
- Writing every simple task relegated to a separate
module makes it much easier to determine what
code segments must be altered when execution
details are being modified. - Named constants
- Declaring a constant value at the beginning of
the program (e.g., the size of an array, a
default value for certain types of variables) and
using that constants name in the body of the
program, greatly simplifies later modifications
(e.g., using the code with an array of a
different size, using the code with a different
type of variable). For example, using - const char HORIZ_BAR _
- can be easily replaced with
- const char HORIZ_BAR -
- Type definitions
- Declaring a generic type definition at the
beginning of a program (using a typedef
statement) can eliminate the need to alter
parameter and local variable types when
modifications are needed. For example, using - typedef int number
- can be easily replaced with
- typedef long unsigned int number
21Improving I/O
- Interactive sessions with the user should be
clear and concise - The user should be prompted for any input.
- Good
- Enter a Social Security Number of the form
-- - Bad
- SSN
- The input should be echoed back to the user as
validation and for clarity. - Good
- Enter the current number of goldfish 27
- Specify the average age of the 27 goldfish (in
months) 3 - Specified 27 goldfish with an average age of 3
months. - Bad
- Enter the current number of goldfish 27
- Specify the average age of the goldfish (in
months) 3 - Invalid input should be detected and corrected by
the user (if possible). - Good
- Enter your current age (in years) 1975
- INVALID NUMBER - TOO LARGE. PLEASE TRY AGAIN.
- Enter your current age (in years)
22Dos and Donts of Programming Style
1. DO use functions extensively every
non-trivial task in the program should have its
own function. 2. DO call by value (or by
constant-reference - well see that later) when
passing parameters that should not be modified in
the subroutine. 3. DO use valued functions when
the function is producing a single value to be
returned use reference arguments if multiple
values are being produced. 4. DO check for
invalid input values and use assert statements
whenever other logical errors might be easily
detected. 5. DO include explanatory comments at
the beginning of the program, summarizing the
programs purpose, at the beginning of each
function, specifying the functions task, and
internal to the code, whenever the algorithm
being used is particularly complicated. 6. DO
name variables, constants, and functions in a
meaningful way.
1. DONT use global variables ever (although
global constants are okay). 2. DONT use goto
statements ever. Loops and conditional
statements should be used whenever flow control
is desired.