Professional Documents
Culture Documents
Solutions Manual
Visit to download the full and correct content document:
https://testbankdeal.com/download/absolute-c-5th-edition-savitch-solutions-manual/
Savitch, Absolute C++ 5/e: Chapter 7, Instructor’s Manual
Chapter 7
Constructors and Other Tools
Key Terms
constructor
initialization section
default constructor
constant parameter
const with member functions
inline function
static variable
initializing static member variables
nested class
local class
vector
declaring a vector variable
template class
v[i]
push_back
size
size unsigned int
capacity
Brief Outline
7.1 Constructors
Constructor Definitions
Explicit Constructor Calls
Class Type Member Variables
7.2 More Tools
The const Parameter Modifier
Inline Functions
Static Members
Nested and Local Class Definitions
7.3 Vectors – A Preview of the Standard Template Library
Vector Basics
Efficiency Issues.
connected to the class rather than being connected to specific object. The chapter ends with a
brief introduction to the vector container and a preview of the STL.
Students should immediately see the comparison of vectors to arrays and note how it is generally
much easier to work with vectors. In particular, the ability to grow and shrink makes it a much
easier dynamic data structure while the use of generics allows vectors to store arbitrary data
types. If you have given assignments or examples with traditional arrays then it may be
instructive to re-do those same programs with vectors instead.
2. Key Points
Constructor Definitions. A constructor is a member function having the same name as the
class. The purpose of a class constructor is automatic allocation and initialization of resources
involved in the definition of class objects. Constructors are called automatically at definition of
class objects. Special declarator syntax for constructors uses the class name followed by a
parameter list but there is no return type.
Class Type Member Variables. A class may be used like any other type, including as a type of
a member of another class. This is one of places where you must use the initializer list to do
initialization.
The const Parameter Modifier. Reference parameters that are declared const provide
automatic error checking against changing the caller’s argument. All uses of the const modifier
make a promise to the compiler that you will not change something and a request for the
compiler to hold you to your promise. The text points out that the use of a call-by-value
parameter protects the caller’s argument against change. Call-by-value copies the caller’s
argument, hence for a large type can consume undesirable amounts of memory. Call-by-
reference, on the other hand, passes only the address of the caller’s argument, so consumes little
space. However, call-by-reference entails the danger of an undesired change in the caller’s
argument. A const call-by-reference parameter provides a space efficient, read-only parameter
passing mechanism.
A const call-by-value parameter mechanism, while legal, provides little more than an annoyance
to the programmer.
The const modifier appended to the declaration of a member function in a class definition is a
promise not to write code in the implementation that will change the state of the class. Note that
the const modifier on the function member is part of the signature of a class member function
and is required in both declaration and definition if it is used in either.
The const modifier applied to a return type is a promise not to do anything the returned object to
change it. If the returned type is a const reference, the programmer is promising not to use the
call as an l-value. If the returned type is a const class type, the programmer is promising not to
apply any non-const member function to the returned object.
Inline Functions. Placing the keyword inline before the declaration of a function is a hint to the
compiler to put body of the function in the code stream at the place of the call (with arguments
appropriately substituted for the parameters). The compiler may or may not do this, and some
compilers have strong restrictions on what function bodies will be placed inline.
Static Members. The keyword static is used in several contexts. C used the keyword static
with an otherwise global declaration to restrict visibility of the declaration from within other
files. This use is deprecated in the C++ Standard.. In Chapter 11, we will see that unnamed
namespaces replace this use of static.
In a function, a local variable that has been declared with the keyword static is allocated once
and initialized once, unlike other local variables that are allocated and initialized (on the system
stack) once per invocation. Any initialization is executed only once, at the time the execution
stream reaches the initialization. Subsequently, the initialization is skipped and the variable
retains its value from the previous invocation.
The third use of static is the one where a class member variable or function is declared with the
static keyword. The definition of a member as static parallels the use of static for function local
variables. There is only one member, associated with the class (not replicated for each object).
Nested and Local Classes. A class may be defined inside another class. Such a class is in the
scope of the outer class and is intended for local use. This can be useful with data structures
covered in Chapter 17.
Vectors. The STL vector container is a generalization of array. A vector is a container that is
able to grow (and shrink) during program execution. A container is an object that can contain
other objects. The STL vector container is implemented using a template class (Chapter 16). The
text’s approach is to define some vector objects and use them prior to dealing with templates and
the STL in detail (Chapter 19). Unlike arrays, vector objects can be assigned, and the behavior is
what you want. Similar to an array, you can declare a vector to have a 10 elements initialized
with the default constructor by writing
vector<baseType> v(10);
Like arrays, objects stored in a vector object can be accessed for use as an l-value or as an r-
value using indexing.
v[2] = 3;
x = v[0];
Unlike arrays, however, you cannot (legally) index into a vector, say v[i], to fetch a value or to
assign a value unless an element has already been inserted at every index position up to and
including index position i. The push_back(elem) function can be used to add an element to
the end of a vector.
Efficiency Issues for Vectors. Most implementations of vector have an array that holds its
elements. The array is divided into that used for elements that have been inserted, and the rest is
called reserve. There is a member function that can be used to adjust the reserve up or down.
Implementations vary with regard to whether the reserve member can decrease the capacity of a
vector below the current capacity.
3. Tips
Invoking constructors. You cannot call a constructor as if it were a member function, but
frequently it is useful to invoke a constructor explicitly. In fact this declaration of class A in
object u :
A u(3);
is short hand for
A u = A(3);
Here, we have explicitly invoked the class A constructor that can take an int argument. When we
need to build a class object for return from a function, we can explicitly invoke a constructor.
A f()
{
int i;
// compute a value for i
return A(i);
}
Always Include a Default Constructor. A default constructor will automatically be created for
you if you do not define one, but it will not do anything. However, if your class definition
includes one or more constructors of any kind, no constructor is generated automatically.
Static member variables must be initialized outside the class definition. Static variables may
be initialized only once, and they must be initialized outside the class definition.. The text points
out that the class author is expected to do the initializations, typically in the same file where the
class definition appears.
Example:
class A
{
public:
A();
. . .
private:
static int a;
int b;
};
int A::a = 0; // initialization
A static member is intended to reduce the need for global variables by providing alternatives that
are local to a class. A static member function or variable acts as a global for members of its class
without being available to, or clashing with, global variables or functions or names of members
of other classes.
A static member function is not supplied with the implicit “this” pointer that points to the
instance of a class. Consequently, a static member function can only use nested types,
enumerators, and static members directly. To access a non-static member of its class, a static
member function must use the . or the -> operator with some instance (presumably passed to
the static member function via a parameter).
4. Pitfalls
Attempting to invoke a constructor like a member function. We cannot call a constructor for
a class as if it were a member of the class.
Constructors with No Arguments. It is important not to use any parentheses when you declare
a class variable and want the constructor invoked with no arguments, e.g.
MyClass obj;
instead of
MyClass obj();
Otherwise, the compiler sees it as a prototype declaration of a function that has no parameters
and a return type of MyClass.
Inconsistent Use of const. If you use const for one parameter of a particular type, then you
should use it for every other parameter that has that type and is not changed by the function call.
Attempt to access non-static variables from static functions. Non-static class instance
variables are only created when an object has been created and is therefore out of the scope of a
static function. Static functions should only access static class variables. However, non-static
functions can access static class variables.
Declaring An Array of class objects Requires a Default Constructor. When an array of class
objects is defined, the default constructor is called for each element of the array, in increasing
index order. You cannot declare an array of class objects if the class does not provide a default
constructor.
input function (from keyboard) that sets month from 1st 3 letters of month name
input function (from keyboard) that sets month from int value : 1 for Jan etc
output function that outputs (to screen) month as 1st 3 letters in the name of the month (C-
string?)
output function that outputs (to screen) month as number, 1 for Jan etc.
member function that returns the next month as a value of type Month.
//file: ch7prb1.cpp
//Title: Month
//To create and test a month ADT
#include <iostream>
#include <cstdlib> // for exit()
#include <cctype> // for tolower()
class Month
{
public:
//constructor to set month based on first 3 chars of the month name
Month(char c1, char c2, char c3); // done, debugged
//a constructor to set month base on month number, 1 = January etc.
Month( int monthNumber); // done, debugged
//a default constructor (what does it do? nothing)
Month(); // done, no debugging to do
//an input function to set the month based on the month number
void getMonthByNumber(istream&); // done, debugged
//input function to set the month based on a three character input
void getMonthByName(istream&); // done, debugged
//an output function that outputs the month as an integer,
void outputMonthNumber(ostream&); // done, debugged
//an output function that outputs the month as the letters.
void outputMonthName(ostream&); // done, debugged
//a function that returns the next month as a month object
Month nextMonth(); //
//NB: each input and output function have a single formal parameter
//for the stream
int monthNumber();
private:
int mnth;
};
//added
int Month::monthNumber()
{
return mnth;
}
Month Month::nextMonth()
{
int nextMonth = mnth + 1;
if (nextMonth == 13)
nextMonth = 1;
return Month(nextMonth);
}
{
cout << endl << n << " is not a month number. Exiting" << endl;
exit(1);
}
void Month::getMonthByNumber(istream& in)
{
in >> mnth; // int Month::mnth;
}
// use of an array and linear search could help this implementation.
void Month::getMonthByName(istream& in)
{
// Calls error(...) which exits, if the month name is wrong.
// An enhancement would be to allow the user to fix this.
char c1, c2, c3;
in >> c1 >> c2 >> c3;
c1 = tolower(c1); //force to lower case so any case
c2 = tolower(c2); //the user enters is acceptable
c3 = tolower(c3);
if('j' == c1)
if('a' == c2)
mnth = 1; // jan
else
if ('u' == c2)
if('n' == c3)
mnth = 6; // jun
else if ('l' == c3)
mnth = 7; // jul
else error(c1, c2, c3); // ju, not n or
else error(c1, c2, c3); // j, not a or u
else
if('f' == c1)
if('e' == c2)
if('b' == c3)
mnth = 2; // feb
else error(c1, c2, c3); // fe, not b
else error(c1, c2, c3); // f, not e
else
if('m' == c1)
if('a' == c2)
if('y' == c3)
mnth = 5; // may
else
if('r' == c3)
mnth = 3; // mar
else error(c1, c2, c3); // ma not a, r
else error(c1,c2,c3); // m not a or r
else
if('a' == c1)
if('p' == c2)
if('r' == c3)
mnth = 4; // apr
else error(c1, c2, c3 ); // ap not r
else
if('u' == c2)
if('g' == c3)
mnth = 8; // aug
mnth = 5; // may
else
if('r' == c3)
mnth = 3; // mar
else error(c1, c2, c3); // ma not a, r
else error(c1,c2,c3); // m not a or r
else
if('a' == c1)
if('p' == c2)
if('r' == c3)
mnth = 4; // apr
else error(c1, c2, c3 ); // ap not r
else
if('u' == c2)
if('g' == c3)
mnth = 8; // aug
else error(c1,c2,c3); // au not g
else error(c1,c2,c3); // a not u or p
else
if('s' == c1)
if('e' == c2)
if('p' == c3)
mnth = 9; // sep
else error(c1, c2, c3); // se, not p
else error(c1, c2, c3); // s, not e
else
if('o' == c1)
if('c' == c2)
if('t' == c3)
mnth = 10; // oct
else error(c1, c2, c3); // oc, not t
else error(c1, c2, c3); // o, not c
else
if('n' == c1)
if('o' == c2)
if('v' == c3)
mnth = 11; // nov
else error(c1, c2, c3); // no, not v
else error(c1, c2, c3); // n, not o
else
if('d' == c1)
if('e' == c2)
if('c' == c3)
mnth = 12; // dec
else error(c1, c2, c3); // de, not c
else error(c1, c2, c3); // d, not e
else error(c1, c2, c3);//c1 not j,f,m,a,s,o,n,or d
}
Month::Month()
{
// body deliberately empty
}
int main()
{
cout << "testing constructor Month(char, char, char)" << endl;
Month m;
m = Month( 'j', 'a', 'n');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 'f', 'e', 'b');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 'm', 'a', 'r');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 'a', 'p', 'r');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 'm', 'a', 'y');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 'j', 'u', 'n');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 'j', 'u', 'l');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 'a', 'u', 'g');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 's', 'e', 'p');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 'o', 'c', 't');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 'n', 'o', 'v');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
m = Month( 'd', 'e', 'c');
m.outputMonthNumber( cout ); cout << " ";
m.outputMonthName(cout); cout << endl;
cout << endl << "Testing Month(int) constructor" << endl;
int i = 1;
while (i <= 12)
{
Month mm(i);
mm.outputMonthNumber( cout ); cout << " ";
mm.outputMonthName(cout); cout << endl;
i = i+1;
}
cout << endl
<< "Testing the getMonthByName and outputMonth* \n";
i = 1;
Month mm;
while (i <= 12)
{
mm.getMonthByName(cin);
mm.outputMonthNumber( cout ); cout << " ";
mm.outputMonthName(cout); cout << endl;
i = i+1;
}
/*
A partial testing run follows:
$a.out
testing constructor Month(char, char, char)
1 Jan
2 Feb
3 Mar
4 Apr
5 May
6 Jun
7 Jul
8 Aug
9 Sep
10 Oct
11 Nov
12 Dec
Testing Month(int) constructor
1 Jan
You will probably need to adjust the PAUSE_CONSTANT for your machine, otherwise the
pause can be so short as to be useless, or irritatingly long.
//Ch7prg3.cpp
//
//Simulate a counter with a button for each digit.
//Keys a for units
// s for tens, follow with digit 1-9
// d for hundreds, follow with digit 1-9
// f for thousands, follow with digit 1-9
// o for overflow report.
//
//Test thoroughly
//
//class Counter
//
// default constructor that initializes the counter to 0
// and overflowFlag to 0
// member functions:
// reset() sets count to 0 and overflowFlag to false
#include <iostream>
using namespace std;
class Counter
{
public:
Counter();
//mutators
void reset();
void incr1();
void incr10();
void incr100();
void incr1000();
//accessors
void displayUnits();
void displayTens();
void displayHundreds();
void displayThousands();
int currentCount();
void display();
bool overflow();
private:
int units;
int tens;
int hundreds;
int thousands;
bool overflowFlag;
};
int main()
{
int i;
int j; // digit to follow "asdf"
char ch;
Counter c;
int k = 100;
while(k-- > 0)
{
system("cls");
//system("clear");
if(c.overflow())
cout << "ALERT: OVERFLOW HAS OCCURRED. RESULTS "
<< "ARE NOT RELIABLE. Press Q to quit.\n";
if(ch == 'o')
{ cout << "Overflow test requested\n";
if(c.overflow())
{
cout << "OVERFLOW HAS OCCURRED. RESULTS "
<< "ARE NOT RELIABLE. Press Q to quit.\n";
}
pause();
continue; //restart loop
}
cout << "Character entered not one of a, s, d, f, or o.\n";
pause();
continue; //restart loop.
}
cin >> j;
// vet value of j
if( !(0 < j && j <= 9))
{
cout << "Digit must be between 1 and 9\n";
continue;
}
switch(ch)
{
return 0;
}
// Implementations
void pause()
{
cout << "Pausing for you to read . . .\n";
for(int X = 0; X < PAUSE_CONSTANT; X++)
{
X++; X--;
}
}
void Counter::displayUnits()
{
cout << units;
}
void Counter::displayTens()
{
cout << tens;
}
void Counter::displayHundreds()
{
cout << hundreds;
}
void Counter::displayThousands()
{
cout << thousands;
}
void Counter::reset()
{
void Counter::display()
{
cout << thousands << hundreds
<< tens << units ;
}
bool Counter::overflow()
{
return overflowFlag;
}
void Counter::incr1()
{
if(units < 9)
units++;
else
{
units = 0;
if(tens < 9)
tens++;
else
{
tens = 0;
if(hundreds < 9)
hundreds++;
else
{
hundreds = 0;
if(thousands < 9)
thousands++;
else
overflowFlag = true;
}
}
}
}
void Counter::incr10()
{
if(tens < 9)
tens++;
else
{
tens = 0;
if(hundreds < 9)
hundreds++;
else
{
hundreds = 0;
if(thousands < 9)
thousands++;
else
overflowFlag = true;
}
}
}
void Counter::incr100()
{
if(hundreds < 9)
hundreds++;
else
{
hundreds = 0;
if(thousands < 9)
thousands++;
else
overflowFlag = true;
}
}
void Counter::incr1000()
{
if(thousands < 9)
thousands++;
else
{
thousands = 0;
overflowFlag = true;
}
}
4. Hot Dogs
You operate several hot dog stands distributed throughout town. Definite a class named
HotDogStand that has a member variable for the hot dog stand's ID number and a member
variable for how many hot dogs the stand has sold that day. Create a constructor that allows a
user of the class to initialize both values.
Also create a method named "JustSold" that increments the number of hot dogs the stand has
sold by one. The idea is that this method will be invoked each time the stand sells a hot dog so
that we can track the total number of hot dogs sold by the stand. Add another method that
returns the number of hot dogs sold.
Finally, add a static variable that tracks the total number of hotdogs sold by all hot dog stands
and a static method that returns the value in this variable.
Write a main method to test your class with at least three hot dog stands that each sell a variety
of hot dogs.
CodeMate Hint: Recall that static variables must be initialized outside of the class definition.
//hotdogs.cpp
//This program defines a class for tracking hot dog sales.
//
//It tracks the stand's ID number, hot dogs sold at each stand,
// and hot dogs sold at all stands.
#include <iostream>
#include <cstdlib>
class HotDogStand
{
public:
HotDogStand();
HotDogStand(int newID, int newNnumSold);
int GetID();
void SetID(int newID);
void JustSold();
int GetNumSold();
static int GetTotalSold();
private:
static int totalSold;
int numSold;
int ID;
};
int HotDogStand::totalSold = 0;
// --------------------------------
// ----- ENTER YOUR CODE HERE -----
// --------------------------------
// ======================
// HotDogStand::HotDogStand
// The default constructor initializes the ID and num sold to zero.
// ======================
HotDogStand::HotDogStand()
{
numSold = 0;
ID = 0;
}
// ======================
// HotDogStand::HotDogStand
// This constructor initializes the ID and num sold.
// ======================
HotDogStand::HotDogStand(int newID, int newNumSold)
{
numSold = newNumSold;
ID = newID;
}
// ======================
// HotDogStand::GetID
// Returns the ID number of this stand.
// ======================
int HotDogStand::GetID()
{
return ID;
}
// ======================
// HotDogStand::SetID
// Sets the ID number of this stand.
// ======================
void HotDogStand::SetID(int newID)
{
ID = newID;
}
// ======================
// HotDogStand::JustSold
// Increments the number of hotdogs this stand
// has sold by one.
// ======================
void HotDogStand::JustSold()
{
numSold++; // increment number sold at this stand
totalSold++; // increment number sold across all stands
}
// ======================
// HotDogStand::GetNumSold
// Returns the number of hotdogs this stand has sold.
// ======================
int HotDogStand::GetNumSold()
{
return numSold;
}
// ======================
// HotDogStand::GeTotalSold
// Returns the number of hotdogs sold by all stands
// ======================
int HotDogStand::GetTotalSold()
{
return totalSold;
}
//
// --------------------------------
// --------- END USER CODE --------
// --------------------------------
// ======================
// main function
// ======================
int main()
{
// Test our code with three hot dog stands
HotDogStand s1(1,0),s2(2,0),s3(3,0);
// Sold at stand 1, 2
s1.JustSold();
s2.JustSold();
s1.JustSold();
cout << "Stand " << s1.GetID() << " sold " << s1.GetNumSold() << endl;
cout << "Stand " << s2.GetID() << " sold " << s2.GetNumSold() << endl;
cout << "Stand " << s3.GetID() << " sold " << s3.GetNumSold() << endl;
cout << "Total sold = " << s1.GetTotalSold() << endl;
cout << endl;
cout << "Stand " << s1.GetID() << " sold " << s1.GetNumSold() << endl;
cout << "Stand " << s2.GetID() << " sold " << s2.GetNumSold() << endl;
cout << "Stand " << s3.GetID() << " sold " << s3.GetNumSold() << endl;
cout << "Total sold = " << s1.GetTotalSold() << endl;
cout << endl;
return 0;
}
5. Suitors
In an ancient land, the beautiful princess Eve had many suitors. She decided on the following
procedure to determine which suitor she would marry. First, all of the suitors would be lined up
one after the other and assigned numbers. The first suitor would be number 1, the second
number 2, and so on up to the last suitor, number n. Starting at the first suitor she would then
count three suitors down the line (because of the three letters in her name) and the third suitor
would be eliminated from winning her hand and removed from the line. Eve would then
continue, counting three more suitors, and eliminating every third suitor. When she reached the
end of the line she would continue counting from the beginning.
For example, if there were 6 suitors then the elimination process would proceed as follows:
Write a program that uses a vector to determine which position you should stand in to marry the
princess if there are n suitors. You will find the following method from the Vector class useful:
v.erase(iter);
// Removes element at position iter
For example, to use this method to erase the 4th element from the beginning of a vector variable
named theVector use:
theVector.erase(theVector.begin() + 3);
The number 3 is used since the first element in the vector is at index position 0.
CodeMate Hint: Use a vector of size n and a loop that continues to eliminate the next suitor until
the size of the vector includes only one element.
//suitors.cpp
//
//This program determines where to stand in line if you would
// like to win the hand of the princess. The princess eliminates
// every third suitor and loops back to the beginning of the line upon
// reaching the end.
//
//This program uses a vector to store the list of suitors and removes
// each one in turn.
#include <iostream>
#include <cstdlib>
#include <vector>
// ======================
// main function
// ======================
int main()
{
// Variable declarations
int i;
int current;
int numSuitors;
vector<int> suitors(numSuitors);
// --------------------------------
// ----- ENTER YOUR CODE HERE -----
// --------------------------------
if (numSuitors <=0)
{
cout << "Not enough suitors." << endl;
}
else if (numSuitors == 1)
{
cout << "You would stand first in line." << endl;
}
else
{
current=0; // Current suitor the princess will examine
// Eliminate a suitor as long as there is at least one
while (suitors.size() > 1)
{
// Count three people ahead, or go two people down
// since we include the current person in the count
for (i=0; i<2; i++)
{
current++;
// If we reached the end, go back to the front
if (current == suitors.size())
{
current=0;
}
}
// Eliminate contestant current
suitors.erase(suitors.begin() + current);
// If we were at the last suitor, go to the first one
if (current == suitors.size())
{
current=0;
}
}
cout << "To win the princess, you should stand in position " <<
suitors[0] << endl;
}
// --------------------------------
// --------- END USER CODE --------
// --------------------------------
return 0;
}
6. More Pizza
This Programming Project requires you to first complete Programming Project 7 from Chapter 5,
which is an implementation of a Pizza class. Add an Order class that contains a private vector
of type Pizza. This class represents a customer’s entire order, where the order may consist of
multiple pizzas. Include appropriate functions so that a user of the Order class can add pizzas to
the order (type is deep dish, hand tossed, or pan; size is small, medium, or large; number of
pepperoni or cheese toppings). You can use constants to represent the type and size. Also write
a function that outputs everything in the order along with the total price. Write a suitable test
program that adds multiple pizzas to an order(s).
Notes: The following solution uses the pizza.h and pizza.cpp classes from Programming Project
7 of Chapter 5.
// order.h
//
// Interface file for the Pizza ordering class.
#include "pizza.h"
#include <vector>
#include <iostream>
using namespace std;
class Order
{
public:
Order();
~Order() {};
void addPizza(Pizza p);
void outputOrder();
private:
vector<Pizza> orders;
};
// order.cpp
//
// Implementation file for the Pizza ordering class.
#include "order.h"
#include <vector>
#include <iostream>
using namespace std;
Order::Order()
{
}
// --------------------------------
// ----- ENTER YOUR CODE HERE -----
// --------------------------------
void Order::addPizza(Pizza p)
{
orders.push_back(p);
}
void Order::outputOrder()
{
double total = 0;
cout << "There are " << orders.size() <<
" pizzas in the order." << endl;
for (int i=0; i<orders.size(); i++)
{
orders[i].outputDescription();
total += orders[i].computePrice();
}
cout << "The total price is $" << total << endl;
}
// --------------------------------
// --------- END USER CODE --------
// --------------------------------
// ======================
// main function
// ======================
int main()
{
// Variable declarations
Order myOrder;
Pizza cheesy;
Pizza pepperoni;
pepperoni.setSize(LARGE);
pepperoni.setPepperoniToppings(2);
pepperoni.setType(PAN);
// Output order
myOrder.outputOrder();
7. Money Constructor
Do Programming Project 6.8, the definition of a Money class, except create a default constructor
that sets the monetary amount to 0 dollars and 0 cents, and create a second constructor with input
parameters for the amount of the dollars and cents variables. Modify your test code to invoke the
constructors.
#include <iostream>
using namespace std;
class Money
{
public:
// Constructors
Money();
Money(int initialDollars, int initialCents);
// Functions
int getDollars();
int getCents();
void setDollars(int d);
void setCents(int c);
double getAmount();
private:
int dollars;
int cents;
};
Money::Money()
{
dollars = 0;
cents = 0;
}
int Money::getDollars()
{
return dollars;
}
int Money::getCents()
{
return cents;
}
void Money::setDollars(int d)
{
dollars = d;
}
void Money::setCents(int c)
{
cents = c;
}
double Money::getAmount()
{
return static_cast<double>(dollars) +
static_cast<double>(cents) / 100;
}
int main( )
{
Money m1(20, 35), m2(0, 98);
8. Histogram of Grades
Write a program that outputs a histogram of grades for an assignment given to a class of
students. The program should input each student’s grade as an integer and store the grade in a
vector. Grades should be entered until the user enters -1 for a grade. The program should then
scan through the vector and compute the histogram. In computing the histogram the minimum
value of a grade is 0 but your program should determine the maximum value entered by the user.
Output the histogram to the console. See Programming Project 5.7 for information on how to
compute a histogram.
#include <iostream>
#include <vector>
int main()
{
vector<int> grades;
int max = -1;
int score;
int i;
{
histogram[grades[i]]++;
}
// Output histogram
for (i=0; i<=max; i++)
{
cout << histogram[i] << " grade(s) of " << i << endl;
}
cout << endl;
For this program we will represent the bar code as a string of digits. The digit 1 represents a
long bar and the digit 0 represents a short bar. Therefore, the bar code above would be
represented in our program as:
110100101000101011000010011
The first and last digits of the bar code are always 1. Removing these leave 25 digits. If these 25
digits are split into groups of five digits each then we have:
Next, consider each group of five digits. There will always be exactly two 1’s in each group of
digits. Each digit stands for a number. From left to right the digits encode the values 7, 4, 2, 1,
and 0. Multiply the corresponding value with the digit and compute the sum to get the final
encoded digit for the zip code. The table below shows the encoding for 10100.
Bar Code 1 0 1 0 0
Digits
Value 7 4 2 1 0
Product of 7 0 2 0 0
Digit * Value
Zip Code Digit = 7 + 0 + 2 + 0 + 0 = 9
Repeat this for each group of five digits and concatenate to get the complete zip code. There is
one special value. If the sum of a group of five digits is 11, then this represents the digit 0 (this
is necessary because with two digits per group it is not possible to represent zero). The zip code
for the sample bar code decodes to 99504. While the POSTNET scheme may seem
unnecessarily complex, its design allows machines to detect if errors have been made in scanning
the zip code.
Write a zip code class that encodes and decodes five digit bar codes used by the US Postal
Service on envelopes. The class should have two constructors. The first constructor should
input the zip code as an integer and the second constructor should input the zip code as a bar
code string consisting of 0’s and 1’s as described above. Although you have two ways to input
the zip code, internally the class should only store the zip code using one format (you may
choose to store it as a bar code string or as a zip code number.) The class should also have at
least two public member functions, one to return the zip code as an integer, and the other to
return the zip code in bar code format as a string. All helper functions should be declared
private. Embed your class definition in a suitable test program.
#include <iostream>
#include <string>
using namespace std;
class ZipCode
{
public:
ZipCode(int zip);
// Constructs a ZipCode from an integer zip code value
ZipCode(string code);
// Constructs a ZipCode from a string of 1's and 0's
string get_bar_code();
// Returns the zip code in bar form
int get_zip_code();
// Returns the zip code in numeric form
private:
int zip;
int parse_bar_code(string code);
// Returns an integer, parsed from the given bar code.
// If the code is not valid, this function will print
// an error message and then exit.
};
if (((code.length() - 2) % 5) != 0)
{
cout << "ERROR: '" << code << "' has invalid length " << endl
<< " (Length must be 5*n+2, where n is the number of"
<< endl
<< " digits in the zip code)" << endl;
return -1;
}
else if ((code[0] != '1') || (code[code.length() - 1] != '1'))
{
cout << "ERROR: '" << code << "' must begin and end with '1'" << endl;
return -1;
}
else
{
int digits = (code.length() - 2)/5;
if (digit == 11)
{
digit = 0;
}
z = zip;
numDigits = 0;
numDigits++;
}
// MAIN FUNCTION
int main()
{
ZipCode zip(99504),
zip2("100101010011100001100110001"),
zip3(12345),
zip4(67890);
int BAD_ZIP_COUNT = 5;
string bad_zips[][2] = {
{ "10010101001110000110011001", "bad length" },
{ "000101010011100001100110001", "bad start/end character" },
{ "100101010011100001100110000", "bad start/end character" },
{ "100101010011100001100110021", "bad digit" },
{ "100101010011100001100111001", "bad sequence" }
};
cout.width(3);
cout << (i + 1) << ": ";
cout.width(5);
cout << z2.get_zip_code() << " has code '"
<< z1_code << "'";
You would like to throw in a free recipe flyer for salsa verde if the box contains tomatillos.
However, there are only 5 recipe flyers. Add a static member variable to the BoxOfProduce class
that counts the number of recipe flyers remaining and initialize it to 5. Also add a member
variable that indicates whether or not the box contains a recipe flyer and modify the output
function to also print "salsa verde recipe" if the box contains a recipe flyer. Finally, add logic
inside the class so that if the box contains at least one order of tomatillos then it automatically gets
a recipe flyer until all of the recipe flyers are gone. Note that a box should only get one recipe flyer
even if there are multiple orders of tomatillos.
Test your class by creating boxes with tomatillos from your menu until all of the flyers are gone.
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
class BoxOfProduce
{
private:
int numBundles;
string bundle[MAX_BUNDLES];
bool hasSalsaFlyer;
void tomatilloCheck();
static int numSalsaFlyers;
public:
BoxOfProduce();
void initialize();
void addBundle(string b);
string getBundle(int index);
void setBundle(string b, int index);
string boxContents();
};
BoxOfProduce::BoxOfProduce()
{
initialize();
}
void BoxOfProduce::initialize()
{
numBundles = 0;
hasSalsaFlyer = false;
}
void BoxOfProduce::addBundle(string b)
{
if (numBundles < MAX_BUNDLES)
{
bundle[numBundles] = b;
numBundles++;
}
// Check if we should add a salsa flyer
tomatilloCheck();
}
string BoxOfProduce::boxContents()
{
string s = "The box contains: ";
for (int i = 0; i < numBundles; i++)
s = s + " (" + char('0'+i+1) + ")" + bundle[i];
if (hasSalsaFlyer)
s = s + ". Bonus - Salsa Verde Recipe Flyer";
return s;
}
int main()
{
char addMoreBoxes;
do
{
// Create a Box
BoxOfProduce box;
box.initialize();
srand(time(NULL));
// Pick three random numbers from 0 to 4 for the 5 possible food
choices
int num1, num2, num3;
num1 = rand() % 5;
num2 = rand() % 5;
num3 = rand() % 5;
int lineRead = 0;
ifstream inputStream;
inputStream.open("produce.txt");
string food;
while (inputStream >> food)
{
if (lineRead == num1)
box.addBundle(food);
if (lineRead == num2)
box.addBundle(food);
if (lineRead == num3)
box.addBundle(food);
lineRead++;
}
inputStream.close();
1. Tellina crassa.
2. Chama squamosa.
3. Turritella imbricataria.
4. Fusus asper.
5. Pleurotoma colon.
6. Murex tubifer.
7. Aporhais pes-pelicani.
8. Voluta luctator (or luctatrix).
9. Trochus monolifer: the necklace trochus.
10. Venericardia cor-avium.
11. Fusus bulbiformis: the bulb fusus.
These fossils we obtained from the neighbourhood of
Christchurch; and as these sheets were being written, we received
from Dr. Mantell’s “Geological Excursions in the Isle of Wight,” the
following appropriate description of them: “The numerous marine
fossil shells which are obtained from this part of the coast of
Hampshire, are generally known as Hordwell fossils; but it is
scarcely necessary to remark, that they almost entirely belong to the
London clay strata, and are procured from Barton cliffs. These fossils
are most conveniently obtained from the low cliff near Beacon
Bunny, and occur in greatest abundance in the upper part of the dark
green sandy clay. There are generally blocks of the indurated
portions of the strata on the beach, from which fossils may be
extracted. A collection of Hordwell fossils, consisting of the teeth of
several species of sharks and rays, bones of turtles, and a great
variety of shells, may be purchased at a reasonable price of Jane
Webber, dealer in fossils, Barton cliff, near Christchurch.”—(P. 124.)
Before leaving the Eocene, or rather the London clay of the
Eocene, we will give a drawing of a fossil in our possession. The
drawing opposite represents a piece of fossil wood, pierced through
and through by Teredinæ, a boring mollusk allied to the Teredo,
which still proves so destructive to our vessels. Although the wood is
converted into a stony mass, and in some parts covered by calcareous
matter, the same as is found in the septaria, so common in these
beds, to which we shall presently direct attention, still the grain and
woody texture are most distinct. This wood was once probably
floating down what we now call the Thames, when these piercing,
boring mollusks seized hold upon it, penetrated its soft texture, and
lived, moved, and had their being down at the bottom of the river in
their self-constructed chambers. Time rolled on, and the log of wood
is floated upon the shore, and there it lies to harden and to dry; again
the log is drifted away, and, buried in some soft bed of clay, is
preserved from rotting. In process of time it again sees the light; but
now saturated by argillaceous material, and when hardened by the
sun, becomes the petrifaction such as we see it.
WOOD PERFORATED RY TEREDINA PERSONATA, LONDON
CLAY.
Here let us refer to the septaria, of which we have just spoken; two
specimens lie before us, which we will briefly describe. In one (1) the
clay is in distinct lozenge-shaped masses of a blue colour, while veins
of calcareous spar or crystallized carbonate of lime surround these,
which are capable of a beautiful marble-like polish; in the other (2)
the clay is of the same colour, only in larger proportions, and the
spar is of a deep brown colour, while here and there portions of iron
pyrites may be seen; they become beautiful ornaments in a room
when cut and polished. It should be added, that the septaria are not
without their economic uses, being extensively used as cement after
being stamped and burnt.
SEPTARIA
Here we may leave this brief sketch of the Eocene, or lowest beds
of the Tertiary. A new creation has been introduced to our view; and
although we still wait for the coming of man—the lord and
interpreter of all—the contemplation of these successive acts and
centres of creation fills our minds with renewed admiration and
reverence of Him for whom, and by whom, and to whom are all
things. Thus “even Geology, while it has exhumed and revivified long
buried worlds, peopled with strange forms in which we can feel little
more than a speculative interest, and compared with which the most
savage dweller in the wilderness of the modern period—jackal,
hyæna, or obscene vulture—is as a cherished pet and bosom friend,
has made for us new bonds of connexion between remote regions of
the earth as it is, on account of which we owe it a proportionate share
of gratitude.”[117]
No. II.—The Miocene.
We shall briefly pass over this period. At Bordeaux, Piedmont, and
in Lisbon, this formation is seen; as well as in various other parts of
the Continent of Europe. The supposition of Geology is, that during
this period “whole regions of volcanoes burst forth, whose lofty but
now tranquil cones can be seen in Catalonia, in Spain, in France,
Switzerland, Asia, and in America. The Alps, the Carpathian
Mountains, and other lofty ranges were at this period partially
upheaved. The researches of Sir Robert Murchison have established
this fact, by his finding deep beds of limestone, characteristic of the
Tertiary period, on the summit of one of the loftiest of the Alps, fully
ten thousand feet above the level of the sea.”
No. III.—The Pliocene Period.
This term has already been explained. We shall only detain the
reader by a few words respecting the organic remains that
characterize this formation. In England it is confined to the eastern
part of the county of Suffolk, where it is called “Crag.” This is a mere
provincial name, given particularly to those masses of shelly sand
which are used to fertilize lands deficient in calcareous matter. The
geological name given to this strata is the “Red or Coralline Crag;”
and it is so called on account of the deep ferruginous colour its fossils
have through extensive oxidization of iron. We give drawings of the
fossils of the Red Crag, obtained from the neighbourhood of Ipswich.
FOSSILS FROM THE RED
CRAG, NEAR IPSWICH.
1. Venericardia senilis.
2. Turritella.
3. Patella æqualis.
4. Cyprea.
5. Paludina lenta.
6. Pectunculus variabilis.
7. Murex.
8. Fusus contrarius.
9. Buccinum elongata.
10. Venericardia scalaris.
11. Voluta lamberti.
12. Fusus asper.
13. Pectunculus pilosus.
But these are not the only fossils of this period; it is here we meet,
and that for the first time, with the highest form of animal life with
which the researches of geology have made us acquainted. We have
traced life in various forms in the different rocks that have passed
under our rapid survey, and in all we have seen a wondrous and most
orderly gradation. We began with the coral zoophytes, and from
them proceeded to the mollusks and crustacea of the hypogene
rocks; ascending, we discovered “fish with glittering scales,”
associated with the crinoids and cryptogamous plants of the
secondary series of rocks; and then we arrive where we are now,
among the true dicotyledonous and exogenous plants and trees, with
the strange birds and gigantic quadrupeds of the tertiary period. But
the student must not imagine that even the fossils of this epoch bring
him up to the modern era, or the reign of man; for even in the
tertiary system numberless species lived and flourished, which in
their turn became extinct, to be succeeded by others long before
man, the chief of animals and something more, made his
appearance, to hold dominion over these manifold productions of
creative skill and power. But amidst these creations,
“God was everywhere, the God who framed
Mankind to be one mighty human family,
Himself their Father, and the world their home.”
All the animals of this period are called theroid animals: from
therion, a wild beast; and looking at the skeletons as they have been
arranged from the few existing fossils, or from nearly complete
materials—a matter not of guess-work, but of the most rigid
application of the principles of comparative anatomy—we stand
astounded at the prodigious sizes of these mammoths of the tertiary
era. There is the deinotherium, or fierce wild beast; the
palæotherium, or ancient wild beast; the anoplotherium, or
unarmed wild beast, and others. We give above a drawing of the well-
known megatherium, or great wild beast, to be seen in the British
Museum, and add the following from Mantell’s Guide to the Fossils
of the British Museum:—“This stupendous extinct animal of the sloth
tribe was first made known to European naturalists by a skeleton,
almost entire, dug up in 1789, on the banks of a river in South
America, named the Luxon, about three miles south-east of Buenos
Ayres. The specimen was sent to Madrid, and fixed up in the
Museum, in the form represented in numerous works on natural
history. A second skeleton was exhumed at Lima, in 1795; and of late
years Sir Woodbine Parish, Mr. Darwin, and other naturalists have
sent bones of the megatherium, and other allied genera, to England.
The model of the megatherium has been constructed with great care
from the original bones, in the Wall-cases 9, 10, and in the Hunterian
Museum. The attitude given to the skeleton, with the right arm
clasping a tree, is, of course, hypothetical; and the position of the
hinder toes and feet does not appear to be natural. Altogether,
however, the construction is highly satisfactory; and a better idea of
the colossal proportions of the original is conveyed by this model,
than could otherwise be obtained.”[119]
“By Him were all things created, that are in heaven, and that are in earth,
visible and invisible, whether they be thrones, or dominions, or
principalities, or powers; all things were created by Him, and for Him;
and He is before all things, and by Him all things consist.”—Paul.
To the reader let me first say, that while I do not wish to appear
before him as an advocate, as if I held a brief or had a retaining fee
on behalf of Moses, I nevertheless feel rather keenly that the
“reverend” put before my name may give something like this aspect
to all my remarks. It may be thought, and that honestly enough, that
because mine is the clerical profession, I am bound, per fas aut
nefas, to contend for the authority of Scripture. It may be thought—
in fact, it is daily alleged against us—that the particular “stand-point”
we occupy is an unfair one, inasmuch as a preacher is bound to “stick
to the Bible;” and indeed that he always comes to it with certain à
priori conclusions, that to a great extent invalidate his reasonings,
and destroy the morality of his arguments.
Possibly there may be more truth in this than any of us dream of:
fas est ab hoste doceri. I therefore make no professions of honesty,
and appeal to no one’s feelings; let us go and look at the Bible, and at
the earth’s crust, and be guided by our independent researches.
Should this happen to be read by any one whose mind is out of joint
with Scripture; who no longer reposes with satisfaction on the old
book of his childhood and his youth; who has begun to fear,—
perhaps to think that it is only a collection of “cunningly devised”
fables; and who is on the verge of giving up Christianity and all “that
sort of thing;” to such an one I shall speak, supposing him to be as
honest in his doubts as I am in my convictions. I cannot deal with
man as if he had no right to doubt; I have never yet “pooh-poohed”
any one’s unbelief; but I have always striven to regard all doubts
expressed in courteous phrase, as the result of investigation, even
though it may be partial, as the fruit of study, although it may have
been misguided, and as the painful conclusions of a thinking mind,
and not cherished for the sake of “having a fling” at moral truth or a
righteous life, or at the mothers and sisters whose life “remote from
public haunt” has saved them from ever doubting the truth of
revelation.
Doubting and scorning are very opposite phases of mind: we here
address the doubter; with the scorner we have nothing to do; if
ridicule is his substitute for argument, by all means let him enjoy it;
and if calling names is his substitute for patient investigation, let
him enjoy that pastime also—hard words break no bones; but for the
doubter, for the man who has his honest difficulties, and finds large
stumbling-blocks in the path of unresisting acquiescence in
household faiths, for such an one I have much to say in this chapter,
if he will read it,—to him I stretch forth my hand in cordial greeting,
and invite him to examine evidence, and consider facts; and then,
whatever may be the result, whether I shake his doubts or he shake
my faith, we shall at least have acted a manly and a straightforward
part. At any rate, we ought ever to meet as friends, and to be candid
and forbearing, as men liable to err through manifold besetments
and biasses.
Having thus thrown myself upon my reader’s candour, by a clear
avowal of the spirit in which such controversies ought to be
conducted, let us together proceed to the purpose of this chapter.
Between Geology and Scripture interpretation there are apparent
and great contradictions—that all admit: on the very threshold of our
future remarks, let us allow most readily that between the usually
recognised interpretations of Scripture and the well-ascertained facts
of Geological science, there are most appalling contradictions; and
the questions arising thence are very important, both in a scientific
and in a theological point of view. Is there any method of
reconciliation, by which the harmony of the facts of science with the
statements of the Bible can be shown? Where is the real solution to
be found? Are we mistaken in our interpretations, or are we
mistaken in our discoveries? Have we to begin religion again de
novo, or may the Bible and the Book of Nature remain just as we
have been accustomed to regard them; both as equally inspired
books of God, waiting only the service and worship of man, their
priest and interpreter?
These are questions surely of no common importance. Neither the
Christian nor the doubter act a consistent part in ignoring them.
Should the Christian say, “I want no teachings of science: I want no
learned phrases and learned researches to assist me in
understanding my Bible: for aught I care, all the ‘ologies’ in the world
may perish as carnal literature: I know the Book is true, and decline
any controversy with the mere intellectual disputant;” and if the
Christian should go on to add, as probably he would in such a state of
mind, and as, alas! too many have done to the lasting disgust and
alienation of the thoughtful and intelligent: “These are the doubts of
a ‘philosophy falsely so called:’ science has nothing to do with
Revelation: they have separate paths to pursue; let them each go
their own way: and should there come a collision between the two,
we are prepared to give up all science once and for ever, whatever it
may teach, rather than have our views upon Revelation disturbed:”—
now, if the Christian talks like that, he is acting a most unwise part.
He is doing in his limited sphere of influence what the Prussian
Government intended to have done when Strauss’ “Life of Christ”
appeared. It was the heaviest blow that unbelief had ever struck
against Christianity, and the Government of Prussia with several
theological professors were disposed to prosecute its author, and
forbid the sale of the book. But the great Neander deprecated this
course, as calculated to give the work a spurious celebrity, and as
wearing the aspect of a confession that the book was unanswerable.
He advised that it should be met, not by authority, but by argument,
believing that the truth had nothing to fear in such a conflict. His
counsel prevailed, and the event has shown that he was right.
If, on the other hand, the doubter should say, “The intelligence of
the day has outgrown our household faiths; men are no longer to be
held in trammels of weakness and superstition, or to be dragooned
into Religion;—the old story about the Bible, why, you know we can’t
receive that, and look upon those compilations that pass by that
name as divinely inspired Books; we have long since been compelled
to abandon the thought that Christianity has any historic basis, or
that its Books have any claim upon the reverence or faith of the
nineteenth century, as of supernatural origin.”
To such an one I should say, that this begging of the question, this
petitio principii, is no argument; these are statements that require
every one of them a thorough demonstration before they are
admitted; you deny the Christian one single postulate: you deny him
the liberty of taking anything for granted; and then begin yourself
with demanding his assent unquestioned to so large a postulate as
your very first utterance involves, “that the intelligence of the age has
outgrown our household faiths.” Before you proceed you must prove
that; and we must know what is meant by those terms, before we can
stand upon common ground, and hold anything like argument upon
these debated points.
From such general observations let us come to the precise objects
before us: Geology and Scripture are supposed to be at variance
specially on three points. The age of the earth: the introduction of
death: and the Noachian Deluge. These apparent contradictions are
the most prominent difficulties, and cause the most startling doubts
among those who imagine Science to be antagonistic to Christian
revelation. I propose to devote a little attention to each of these
questions, while I endeavour honestly to show how, in my opinion,
apparent contradictions may be reconciled. The questions are these,
to state them in a popular form: 1. Is the world more than 6,000
years old? and if it is, how are the statements of Scripture and
Geology to be reconciled? 2. Was death introduced into the world
before the fall of man? and if it was, how are the truths of Scripture
on this question to be explained? and, 3. What was the character of
the Noachian Deluge? was it partial or universal? and what are the
apparent discrepancies in this case, between science and the Bible?
Perhaps before I proceed a step further I ought to add that, in my
belief, the age of the earth, so far as its material fabric, i.e. its crust, is
concerned, dates back to a period so remote, and so incalculable, that
the epoch of the earth’s creation is wholly unascertained and
unascertainable by our human arithmetic; whether this is
contradicted in the Scripture, is another question.
With regard to the introduction of death, I believe that death upon
a most extensive scale prevailed upon the earth, and in the waters
that are under the earth, ages, yea countless ages, before the creation
of man—before the sin of any human being had been witnessed; that
is what Geology teaches most indisputably: whether the Scriptures
contradict this statement, is another question.
With regard to the Noachian Deluge, I believe that it was quite
partial in its character, and very temporary in its duration; that it
destroyed only those animals that were found in those parts of the
earth then inhabited by man; and that it has not left one single shell,
or fossil, or any drift or other remains that can be traced to its action.
Whether the Scriptures teach any other doctrine, is another question.
By this time the ground between us is narrowed, and I may
probably anticipate that I shall have objections to answer, or
misapprehensions to remove, quite as much on the part of those who
devoutly believe, as on the part of those who honestly doubt the
Christian Scriptures.
First then,
I. How old is the world? How many years is it since it was called
into being, as one of the planets? How many centuries have elapsed
since its first particle of matter was created?
The answer comes from a thousand voices, “How old? why, 6,000
years, and no more, or closely thereabouts! Every child knows that;—
talk about the age of the world at this time of day, when the Bible
clearly reveals it!”
Now I ask, Where does the Bible reveal it? Where is the chapter
and the verse in which its age is recorded? I have read my Bible
somewhat, and feel a deepening reverence for it, but as yet I have
never read that. I see the age of man recorded there; I see the
revelation that says the human species is not much more than 6,000
years old; and geology says this testimony is true, for no remains of
man have been found even in the tertiary system, the latest of all the
geological formations. “The Bible, the writings of Moses,” says Dr.
Chalmers, “do not fix the antiquity of the globe; if they fix any thing
at all, it is only the antiquity of the species.”
It may be said that the Bible does not dogmatically teach this
doctrine of the antiquity of the globe; and we reply, Very true; but
how have we got the idea that the Bible was to teach us all physical
science, as well as theology. Turretin went to the Bible for
Astronomy: Turretin was a distinguished professor of theology in his
day, and has left behind him large proofs of scholarship and piety.
Well, Turretin went to the Bible, determined to find his system of
astronomy in it; and of course he found it. “The sun,” he says, “is not
fixed in the heavens, but moves through the heavens, and is said in
Scripture to rise and to set, and by a miracle to have stood still in the
time of Joshua; if the sun did not move, how could birds, which
often fly off through an hour’s circuit, be able to return to their
nests, for in the mean time the earth would move 450 miles?” And if
it be said in reply, that Scripture speaks according to common
opinion, then says Turretin, “We answer, that the Spirit of God best
understands natural things, and is not the author of any error.”
We smile at such “ecclesiastical drum” noise now, and we can well
afford to do so: but when people go to the Bible, determined to find
there, not a central truth, but the truths of physics, in every
department of natural science, are we to be surprised that they come
away disappointed and angry? As Michaelis says, (quoted by Dr.
Harris, in his “Man Primeval,” p. 12,) “Should a stickler for
Copernicus and the true system of the world carry his zeal so far as to
say, that the city of Berlin sets at such an hour, instead of making
use of the common expression, that the sun sets at Berlin at such an
hour, he speaks the truth, to be sure, but his manner of speaking it is
pedantry.”
Now, this is just the way to make thoughtful men unbelievers: and
we will not adopt that plan, because it is not honest, neither is it