A Webbased Introduction To Programming Essential Algorithms Syntax And Control Structures Using Php Html And Mariadbmysql 4th Mike Okane download
A Webbased Introduction To Programming Essential Algorithms Syntax And Control Structures Using Php Html And Mariadbmysql 4th Mike Okane download
https://ebookbell.com/product/crystal-programming-a-projectbased-
introduction-to-building-efficient-safe-and-readable-web-and-cli-
applications-george-dietrich-47661790
https://ebookbell.com/product/crystal-programming-a-projectbased-
introduction-to-building-efficient-safe-and-readable-web-and-cli-
applications-1st-edition-george-dietrich-48199106
https://ebookbell.com/product/a-webbased-approach-to-measure-skill-
mismatches-and-skills-profiles-for-a-developing-country-the-case-of-
colombia-jeisson-arley-crdenas-rubio-54746500
https://ebookbell.com/product/satveg-a-webbased-tool-for-
visualization-of-modis-vegetation-indices-in-t-south-america-jlio-
csar-dalla-mora-esquerdoa-23506924
Unemployed But Moving On Smart Job Searching In A Webbased World And A
Sucky Economy Cheryl Butler Long
https://ebookbell.com/product/unemployed-but-moving-on-smart-job-
searching-in-a-webbased-world-and-a-sucky-economy-cheryl-butler-
long-46411648
https://ebookbell.com/product/theplete-emerce-booksign-build-and-
maintain-a-successful-web-based-business-2nd-edition-janice-
reynolds-1304934
https://ebookbell.com/product/how-to-open-operate-a-financially-
successful-webbased-business-1st-edition-beth-williams-48777848
https://ebookbell.com/product/a-web-of-new-words-a-corpusbased-study-
of-the-conventionalization-process-of-english-neologisms-1st-edition-
daphn-kerremans-5220028
https://ebookbell.com/product/advances-in-webbased-learning-
icwl-2019-18th-international-conference-magdeburg-germany-
september-2325-2019-proceedings-1st-ed-2019-michael-a-herzog-10801642
A Web-Based Introduction
to Programming
2
A Web-Based Introduction
to Programming
3
Essential Algorithms, Syntax,
and Control Structures Using PHP, HTML,
and MariaDB/MySQL
Fourth Edition
Mike O'Kane
4
Copyright © 2017
Mike O'Kane
All Rights Reserved.
eISBN 978-1-53100-707-2
www.cap-press.com
No part of this publication may be reproduced, stored in a retrieval system, or transmitted in any form or by any
means, electronic, mechanical, recording or otherwise, without the prior written permission of the author.
Please note: The information in this book is provided for instructional value and distributed on an “as is” basis,
without warranty. While every precaution has been taken in the preparation of the book, neither the author nor
Carolina Academic Press shall have any liability to any person or entity with respect to any loss or damage caused
by or alleged to be caused, directly or indirectly, by the instructions contained in this book or by the programs or
applications that are listed in, or provided as supplements to, this book.
Macintosh®, Mac OS®, Safari, and iOS® are registered trademarks of Apple, Inc. in the United States and other
countries. Windows® and Windows Mobile® are registered trademarks of Microsoft Corporation in the United
States and other countries. Linux® is the registered trademark of Linus Torvalds in the United States and other
countries. MySQL® is a registered trademark of Oracle Corporation and/or its affiliates. MariaDB® is a registered
trademark of MariaDB Corporation Ab. Mozilla® and Firefox® are registered trademarks of the Mozilla
Foundation. Joomla!® is trademarked by Open Source Matters. Apache® is a trademark of the Apache Software
Foundation. XAMPP and Apache Friends are registered trademarks of BitRock. The WordPress® trademark is
owned by the WordPress Foundation. Android® and Google Chrome® are trademarks of Google Inc. The Drupal®
trademark is owned and controlled by Dries Buytaert. BlackBerry® is a trademark of Blackberry. All product
names identified in this book are trademarks or registered trademarks, and are the properties of their respective
companies. We have used these names in an editorial fashion only, and to the benefit of the owner, with no
5
intention of infringing the trademark.
6
To my dear mother and father,
thank you for the love and light that you bestowed on us.
7
Contents
Preface
Acknowledgments
About the Author
8
Creating an Interactive HTML and PHP Program
Summary
Chapter 2 Review Questions
Chapter 2 Code Exercises
9
Summary
Chapter 4 Review Questions
Chapter 4 Code Exercises
10
PHP Functions to Parse a Delimited Character String
Processing a File with Multiple Records
Appending Records to a File
Working with Multiple Files
Summary
Chapter 6 Review Questions
Chapter 6 Code Exercises
11
Chapter 8 Code Exercises
12
Chapter 11 · Structured Data — Working with Arrays
Introduction
What Is an Array?
Working with Array Elements
Extending an Array
Displaying Array Values
Receiving Scores into an Array from an HTML Form
Arrays of Strings
How Large Is the Array?
Why Do Array Indices Begin with 0 and Not 1?
Using FOR Loops with Arrays
Using the sizeof() Function to Control a FOR Loop
Summing and Averaging the Values in an Array
Counting Selected Values in an Array
Multiple Operations on an Array
Reading Data from a File into an Array
Reading Data into an Array from a File of Unknown Length
Using [] with no Index Value
Reading Selected Data from a File into an Array
Reading Data from a File into Multiple Arrays
Reading Selected Data from a File of Records into an Array
More About the explode() and list() Functions
A Special Loop for Processing Arrays — FOREACH
Multi-Dimensional Arrays
Summary
Chapter 11 Review Questions
Chapter 11 Code Exercises
13
Chapter 12 Code Exercises
14
Performing JOIN Operations on Multiple Tables
Using INSERT to Add Records to a Table
Using UPDATE to Modify a Record
Removing a Record
Storing MySQL Connection Data in an Include File
Creating, Dropping, and Altering Databases and Tables
Summary
Chapter 14 Review Questions
Chapter 14 Code Exercises
15
Graphical User Interfaces and Interface Design
Web Design and Content Management
Database Programming and SQL
In Summary: Follow Your Heart!
16
Appendix E · More about HTML and CSS
Useful HTML References
Useful CSS References
Inline Styles and Internal Style Sheets
Deprecated HTML Tags
Frequently Asked Questions Regarding HTML Tags
Index
17
Preface
The problem I have tried to solve with this textbook is, quite simply, how to effectively introduce general
programming concepts to students who have never programmed before. Perhaps like me, you have found yourself
frustrated by textbooks that try to cover too much too fast, make inappropriate assumptions about what a student
already knows, or take sudden leaps in complexity when providing examples and exercises.
I believe that the purpose of an introductory programming course is to help students gain confidence and
develop their understanding of basic logic, syntax, and problem-solving. They do not need to learn all aspects of a
language or even learn best practices—these are topics for the next course level. The question is: how to provide
the kind of hands-on experience that supports active learning without overwhelming the beginning student with
too much syntactical and programmatic detail?
I have tried many approaches over the years before settling on a Web-based approach, using PHP, CSS, and
HTML code to develop small, interactive Web applications. This approach has proved very successful. Many
students report how much they enjoy the course, how much they have learned, and how well the material has
served them in subsequent courses and in their professional life. I also hear from many students who tell me that
the course positively changed their opinion of programming as a career or subject of interest, which is most
gratifying.
Some instructors may have concerns that my coverage of the PHP and HTML is insufficient. The book uses a
small number of HTML tags, CSS rules, and PHP functions, and employs some arbitrary conventions to simplify
the code and keep the focus on basic concepts common to most languages. For example, PHP print statements
are used rather than echo statements, and these statements always include parentheses and double quotes so that
the syntax is more consistent with the output statements of most other languages. The last chapter (“Where to Go
From Here”) clarifies which practices are standard and which are particular to the textbook.
18
Intended Audience
The book is designed to serve:
Instructors teaching introductory programming, programming logic and design, or Web programming
courses, who want a textbook that engages students and provides a solid preparation for subsequent courses,
but avoids overwhelming beginners with too much syntactical detail or program complexity.
Traditional and online students taking a first course in programming, programming logic and design, or
Web programming.
Web designers, graphic artists, technical communicators, and others who find that their work increasingly
requires some degree of programming expertise, and need an effective, hands-on introduction.
Others who wish to learn the basics of programming, either for personal interest, or to explore the
possibility of a career in this field.
Note that solutions to quizzes and exercises are only available to verified course instructors.
19
Approach
The book takes a fairly novel approach, allowing students to learn program logic and design by developing a large
number of small Web-based applications. Students love working with the Web, and this approach has other
important benefits:
Important concepts such as client/server design, server-side processing, and interface-driven code modules
can be introduced in the form of working applications, and then applied in hands-on exercises.
Students not only learn the essential control structures and syntax of a programming language, but also learn
to use a markup language (and associated style sheets), and a database query language to access and query a
database. This makes sense in today's programming environment where these languages are routinely used
in combination to develop a networked application.
The material is relevant to students across a range of disciplines: Computer Science, Information Systems,
Technical Communications, Network Systems, Digital Media, Web Technologies, Mobile Applications,
Database Programming, and other technology-related fields.
The focus on hands-on problem-solving and fundamental structures prepare students for next-level,
language-specific courses such as PHP, Python, Java or C++, as well as Web design and database courses,
without replicating a great deal of material, while the syntax covered here is generally consistent with these
and other languages.
The book makes use of a programming language (PHP), a scripting language (HTML), a style sheet language
(CSS), and a database query language (MariaDB or MySQL), but does not attempt to provide a complete
overview of these languages. Instead, students learn sufficient syntax to convert requirements into working
applications using basic programming structures, arithmetic and logical expressions, user interfaces, functions,
data files, and SQL queries. The focus remains on basic concepts, logic and design, algorithm development, and
common programming procedures. The book provides context throughout, explaining why each topic is
important, and referring students to related career paths.
Although the book focuses on Web-based applications, there is NO requirement for a network-based
programming environment. The book uses a fully functional but standalone Apache Web server (the open source
xampp distribution provided by the Apache Friends group) that students can install on a USB drive or home
computer simply by unzipping a file. Students can begin programming in HTML, PHP and MariaDB or
MySQL in literally minutes.
20
Features
Each chapter begins with clearly stated learning outcomes. Each topic is introduced using examples of simple
program requirements that are first developed as algorithms and interfaces and then realized in working code.
Code statements and control structures are explained step by step.
Different programming topics are treated in separate chapters. Even topics that are commonly combined, such
as counting loops and event-controlled loops, have their own chapters so that students have the chance to develop
and apply their understanding of each separately.
Each chapter includes quizzes that have been carefully developed to test the student's understanding of the
chapter's learning outcomes. The questions have been tested extensively in the classroom.
Three different types of coding exercise are provided at the end of each chapter:
Fixit exercises provide small programs that include a single error of some kind. These exercises help students
improve their problem-solving ability, test their understanding of key concepts, and develop tracing and
debugging skills.
Modify exercises provide working programs that must be modified to perform a somewhat different or
additional function. These exercises help students determine how and where to add new code, and test their
ability to read and understand existing code.
Code completion exercises allow students to apply concepts and tools covered in the chapter by developing
new applications. These exercises test the student's ability to: understand requirements, develop algorithms,
and produce working code. The code completion exercises follow consistent themes that are developed
throughout the book, so that students can more readily appreciate the value of new functionalities that they
learn in each chapter.
Templates for each exercise contain partially completed code so students don't waste time typing (and debugging)
code that is not relevant to the problem at hand. The templates also help instructors to streamline the grading
process.
The textbook comes with a standalone Web server that can be installed on a fixed or portable drive simply by
unzipping a file (so students can bring the software with them to work on computers at any location).
The server installation includes textbook folders that contain all code samples and exercise templates. Students
can complete the exercises simply by opening, editing, and saving the appropriate files. Assignments can be turned
in simply by zipping and submitting the appropriate chapter folder.
The textbook appendices provide additional learning resources designed to: (a) help individual students with
particular needs or interests (for example file/folder management, additional references, and help debugging
code); and (b) deliver useful topics not included in the chapters (for example data representation, additional
control structures, and multi-dimensional arrays).
21
Textbook Web Site
The textbook Web site ensures that both students and instructors have access to the most current resources
associated with this textbook. The Web site includes: everything you need to install and use the Web server; slide
presentations; and hints and help for students working through each chapter. The Web site also provides support
for verified instructors, including additional exercises, test banks, slide presentations, quiz solutions, code
solutions, and other instructional resources. The Web site can be found at:
http://www.mikeokane.com/textbooks/WebTech/
22
Changes to the Fourth Edition
In addition to minor corrections and improvements, this fourth edition of the book includes: a new install of the
xampp Apache Web server distribution with installation instructions for Windows, Mac OS, and Linux; revised
file naming conventions that are more standard for current web development; a hopefully improved redesign of
Chapters 7 and 8; additional materials and improvements to Chapter 13 (functions); references to both MySQL
and MariaDB in Chapter 14 (the actual code and descriptions are identical); a new Chapter 15 that introduces
Object-Oriented Programming.
23
Chapter Overview
Chapter 1: Introducing Computer Programming. Students learn the relationship between machine language
and high-level languages, and review common tasks that computer programs typically perform. The work of a
programmer is described, and the software development cycle is explained. The chapter highlights and briefly
summarizes design approaches such as algorithm development, interface design, client/server design and object-
oriented programming. Different programming languages are identified, and the distinction is made between
interpreted and compiled languages, and between markup and programming languages. Standalone and network
applications are also contrasted.
Chapter 2: Client/Server Applications—Getting Started. This chapter prepares students for the hands-on
work they will perform in subsequent chapters. File types and local and Internet addressing schemes are explained.
Instructions are provided to install, run, and test the required software. Students are shown how to create, store,
and run a number of sample applications in order to become familiar with the process of using a text editor,
saving files, running the Web server, and viewing the results in a Web browser.
Chapter 3: Program Design—from Requirements to Algorithms. The general characteristics and
requirements of effective instructions are explored, using human and program examples. Students walk through
the process of reviewing simple requirements, creating input, processing, and output (IPO) charts, designing the
interface, and developing solution algorithms. The chapter introduces sequence, selection and control structures,
variables and assignment operations, and arithmetic and logical expressions.
Chapter 4: Basics of Markup—Creating a User Interface with HTML. This chapter explains the significance
of data rendering, and provides a brief overview and history of Hypertext Markup Language (HTML).
Commonly used HTML tags are explained, and the student is shown how to apply these to create and organize
simple Web pages. Cascading style sheets are introduced. Students are shown how to create HTML forms to
obtain user input as a first step in developing interactive Web applications. HTML Tables are used to perform
simple form layout.
Chapter 5: Creating a Working Program—Basics of PHP. This chapter teaches sufficient PHP language
syntax to process user input received from HTML forms, perform simple arithmetic, and produce formatted
output. In the process, students learn to code arithmetic expressions, use standard operators and functions, create
and work with variables, and identify and fix both syntax and logical errors.
Chapter 6: Persistence—Saving and Retrieving Data. This chapter explains the difference between persistent
and transient data, and introduces text file processing as well as basic database concepts. Students learn to: open,
read, write, and close text files; work with multiple files; parse lines of data that contain multiple values separated
by some kind of delimiter.
Chapter 7: Programs that Choose—Introducing Selection Structures. This chapter introduces selection
control structures and demonstrates the use of algorithms to solve problems requiring simple selection. Students
learn to use IF and IF..ELSE structures, Boolean expressions, relational operators, truth tables, simple string
comparisons, and testing procedures.
Chapter 8: Multiple Selection, Nesting, ANDs and ORs. This chapter develops examples from Chapter 7 to
handle problems associated with input validation and more complex requirements. Students explore the use of
compound Boolean expressions, nested selection structures, chained IF..ELSEIF..ELSE selection structures, and
multiple but independent selection structures.
Chapter 9: Programs that Count—Harnessing the Power of Repetition. This chapter introduces loop
structures with a focus on count-controlled FOR loops. Students learn how to refer to the counting variable
within the loop, and how to use loops to generate tables, crunch numbers, accumulate totals, find highest and
lowest values in a series, select values from a file of records, and display bar charts.
Chapter 10: “While NOT End-Of-File”—Introducing Event-Controlled Loops. This chapter introduces
WHILE loops and demonstrates the use of the priming read and the standard algorithm to process files of
unknown length. The student is shown how WHILE loops can be used to perform various operations on a list of
24
data values, and how a file of records can be processed and searched for specific records or field values.
Chapter 11: Structured Data—Working with Arrays. This chapter introduces numerically-indexed arrays,
and shows how arrays can be used to store, access, and update multiple-related values. The use of the FOR loop
to process arrays is explained, and various array-processing algorithms are demonstrated.
Chapter 12: Associative Arrays. This chapter introduces associative arrays. Students learn how to use
associative arrays as lookups, and gain a better understanding of the $_POST array and the way that data is
received from HTML forms. Web sessions are introduced, and students learn how to use the $_SESSION array
to maintain session data between applications.
Chapter 13: Program Modularity—Working with Functions. This chapter demonstrates the importance of
program modularity and introduces functions, include files and objects. Students learn to write their own
functions, to build libraries of related functions, and to call functions from different applications as needed.
Chapter 14: Connecting to a Database—Working with MySQL. This chapter introduces databases queries
as an important application tool. The relationship between relational databases and SQL is explained, along with
the purpose and syntax of common queries (SELECT, INSERT, UPDATE and DELETE). Students learn to
write code to open and close database connections, submit queries, handle errors, perform simple joins, and
process results.
Chapter 15: Introduction to Object-Oriented Programming. This chapter introduces Object-Oriented
Programming. Examples show how simple object classes are designed, how class variables are encapsulated and
accessed by class methods, how objects are instantiated and used in applications, and how classes can be inherited
by other classes. An overview of basic OO terminology is provided.
Chapter 16: Where to Go From Here. This last chapter provides a short overview of key concepts and
technologies that the students may want to explore after completing this textbook, along with clarification of
some of the conventions followed in the book.
The textbook also includes a number of useful appendices as follows:
Appendix A introduces data representation, and shows how binary values can store data for a wide range of
purposes.
Appendix B provides an introduction to overview of file and folder management, file addressing schemes
(including relative and absolute addresses), and the use of the command line with a list of common DOS and
Unix command equivalents.
Appendix C provides help for students wishing to use different Web server installations.
Appendix D provides debugging help for students having trouble identifying and resolving PHP code errors.
Appendix E provides additional material and references for students wishing to learn more about HTML and
style sheets.
Appendix F provides additional information regarding PHP data types, and provides a list of common PHP
functions not covered in the book.
Appendix G provides additional coverage of common PHP operators and structures that were omitted from
the chapters to avoid overwhelming the beginning student (for example, shortcut operators, the SWITCH
statement, DO..WHILE loops, and multi-dimensional arrays).
25
Acknowledgments
This textbook could not have been created without the generous help and support of many others. In particular I
want to thank my dear wife Constance Humphries for her invaluable technical advice, proof-reading,
development of video tutorials, and daily encouragement and patience! My sincere thanks to Scott Sipe, Beth
Hall, Sara Hjelt, and all at Carolina Academic Press for their supportive style, professionalism and experience.
Thanks to all my fellow instructors at A-B Tech (Asheville-Buncombe Technical Community College), especially
to Charlie Wallin and Fred Smartt who field-tested the first edition, and provided invaluable suggestions and
corrections. And thanks to all of those students who have learned with me and sometimes in spite of me as this
book evolved in the classroom. A particular thank you to A-B Tech students Uma Benson, Jean-Jacques Maury,
and Kenneth Stanley, who all voluntarily provided me with carefully compiled lists of corrections that were
incorporated into the fourth edition. Their engagement with the material and concern for future students is
greatly appreciated. Any remaining errors or inconsistencies are of course my own.
Lastly, a huge thank you to Kai ‘Oswald’ Seidler, Kay Vogelgesang, and all those who have contributed to the
Apache Friends Project, and who continue to deliver and support the XAMPP distribution. So many of us owe
you our great appreciation for your generosity of spirit!
26
About the Author
Mike O'Kane holds a master's degree in Systems Science (specializing in Advanced Technology) from
Binghamton University. He has over eighteen years' experience teaching computer science courses, most recently
at Asheville-Buncombe Technical Community College in North Carolina. He also has extensive practical
experience in the use of technology for learning, having worked at IBM as a short-course developer, NC State
University as an Instructional Coordinator, and the University of North Carolina system as the first Executive
Director of the UNC Teaching and Learning with Technology Collaborative. He has a passion for developing
effective instructional content, and learning environments that promote rather than hinder student learning.
27
Chapter 1
28
Introduction
Welcome! If you have never programmed before, this book is for you. By the time you complete the chapters and
exercises, you will have a good grasp of the basic logic and design of computer programs. The book is designed to
teach common programming syntax and control structures in a manner that will prepare you for further study in
this field, and provide you with sufficient expertise to develop small, interactive Web applications, using a
combination of the HTML markup language and PHP programming language. You will also be introduced to
the CSS stylesheet language, and the MariaDB and MySQL database languages.
To get started, in this first chapter we will explore the general process of programming and define some
important term and practices. For a book that is supposed to be hands-on this chapter is mostly descriptive! Don't
be too concerned if some of the topics don't make complete sense yet. Your understanding will deepen as you
work through the chapters and develop your own applications.
29
What Is a Computer Program?
A computer is a programmable machine. Computers can perform any number of tasks by reading and executing
computer programs, or software. Each computer program contains instructions to direct the computer's
operating system and hardware for a specific purpose. The ability to read and execute programs is achievable
because each computer contains a microprocessor which includes the computer's instruction set. The instruction
set defines all of the basic commands that the computer can execute. These basic commands are very low-level
activities such as adding numbers, moving a piece of data from one location to another, or comparing values. The
commands that make up the instruction set constitute the computer's machine language. Your programs work
with the computer's operating system to issue commands to the microprocessor, so a computer program is
essentially a set of instructions that tell the microprocessor to execute machine language commands in a particular
sequence in order to provide a game, a Web browser, a business application, an email program, or some other
useful service. If you've ever wondered why some programs run on one computer but not another, it is because
different computers have different microprocessors and different operating systems.
Although different computer programs serve quite different purposes, all programs share some important
characteristics. Here are some common tasks that any computer program might typically perform:
Provide interactive environments for users: programs may use text-based input/output or Graphical
User Interfaces (GUI's) to interact with users. Interfaces may include graphics, animations, audio,
video, and other multimedia features.
Read and write data: programs may access, create, modify or delete data that is stored in files and
databases.
Perform numerical calculations: programs can add, subtract, multiply, divide, and compare numbers,
and can combine these operations to perform much more complex calculations.
Perform text-processing operations: programs can validate, convert, search, sort, compare, and replace
text, and can construct reports, messages or documents such as this textbook.
Communicate with other programs and devices: programs may exchange data with other programs,
cameras, scanners, Web browsers, satellites, cell phones, ATM machines, etc.
Control hardware: programs can control robots, satellites, aircraft, automobiles, printers, and other
computers.
A single computer program may perform any combination of these operations. For example a computer game
may look up player and game information in a file or database, provide an interactive multimedia environment
for the player to play the game, perform numerical calculations, and communicate with programs running on
other computers to allow multi-user play over the Internet. Similarly a payroll program may perform text-
processing operations (such as validation and conversion), query and modify a database, perform numerical
calculations, and send checks to a printer. What this means is that, as a programmer, you will want to know how
to write programs that might include any or all of these operations.
30
What Do Programmers Do?
Programmers write program code, right? Well, actually programmers do a lot more than write code, and many
programmers actually write very little code. One of the things that makes programming an attractive career for
many men and women is that this work requires an appealing combination of right-brain (creative, problem-
solving, brain-storming) and left-brain (logical, linear, sequential) activities. Another appeal is that there are a
variety of career paths within the field, so if you have a general aptitude you have a good chance of finding work
suited to your personal interests. For example if you like to work with people you may find yourself drawn to
software design, interface development, usability, or training. If you prefer to work with data, you may prefer
server-side application development, object design, or database administration.
Let's walk through the major stages in software development. This will clearly demonstrate the range of skills
that programmers need in order to be successful in their work. Here we will simply summarize these steps so
don't be concerned if this appears a little abstract right now. We will learn how to apply these steps to develop a
working application in Chapter 3.
1. Evaluation of Requirements
In order to develop an effective software application we first need to determine the program's requirements. This
usually requires careful reading and listening, asking questions, and careful documentation. Understanding and
documenting requirements takes time and skill. A common mistake that beginning (and not just beginning)
programmers make is to rush this important step in order to begin coding. Rushing the requirements phase can
actually be very costly in terms of time, money and even professional relationships. So learn to go slowly and
carefully when you are presented with a requirements document or when you first meet with a client. The more
time you spend analyzing your program requirements (and asking questions if you are unsure about anything),
the more easily the solution will appear. Remember: the most important skills a programmer needs at this phase
are to listen, read, ask questions, document carefully, and communicate effectively with clients, managers, and
other programmers.
2. Software Design
Once you have a good idea of the software requirements, it's time to develop the design of your application. This
may be a one-person job in the case of a small application or may involve a design team. Software design can
actually become a career path and some (often the most experienced) programmers spend most of their time
evaluating requirements and designing applications that other programmers will then code.
Unless your requirements are quite simple, your application design will most likely consist of multiple code
segments or modules, each of which can be developed separately. There are many advantages to a modular
approach to software. Each module can be developed and tested separately, often by different programmers or
programming teams. The modules can be developed concurrently which speeds up development time. This
approach also allows each module to be developed by different programmers with the most suitable skills. And a
modular approach promotes reusability: once they have been developed, some of the more useful modules can be
shared by many different applications. Modular design includes the development of testing procedures to test that
each module will perform as expected when it is coded.
Client/server design is an essential feature of Web-based application development. A client application, such as
a Web browser, provides an interface to the user and waits for the user to request a service, for example by
clicking on a link, submitting a URL, or typing a URL. The client application then calls a server application to
process the request and send back a response. When the client application receives the response this is presented
to the user and the process repeats. You participate in a client/server interaction every time you use your Web
browser.
For example, Figure 1-1 shows the screens for a very simple client/server application to calculate an employee's
pay based on their hours worked and hourly wage. This example provides the user with two Web pages. When
31
you type the URL to request the first page, the Web browser sends a request to the appropriate Web server, which
sends back the data to display the page. The first page contains a form. When the user clicks the “Get Your Wage
Report Now” button, the Web browser sends a second request to the Web server that includes the data that the
user has entered into the form. The server executes a program that has been developed especially to process this
data. This program generates the content for the second page, which the server sends back to the browser for
display to the user.
In this book you will develop many small client/server applications similar to the example described above.
Object-Oriented Programming (OOP) provides another modular design approach that is extremely
important for modern application development. OOP allows programmers to share and reuse code very
effectively and to design applications in a very structured and logical fashion, reducing costs and simplifying long
term maintenance. Chapter 15 provides an introduction to this important topic.
Whether your programs are simple or complex, it helps greatly to stay away from a computer in the early
phases of application design! Explore your design ideas using a pen and paper, sticky notes, a white board, even
the backs of napkins! If you go to work as a programmer, you will find that this is how software design teams
usually work. The reason is simple: using disposable materials prevents you from becoming too invested in any
particular approach too quickly and encourages brainstorming and creativity. You will find that sketching out
ideas on paper before you start coding will help you think things through and save you time in the long run.
Once you have a clear idea of what to do you will be ready to develop your algorithms and application structure.
Important skills for software designers are creative thinking, organization, familiarity with data structures, a
background in object-oriented programming, writing documentation, and experience with client-server
programming and interface design.
3. Algorithm Development
Once you have a general design for your application, it is time to develop algorithms for each code module that
the application will need. An algorithm is simply a set of clearly written, unambiguous instructions that have been
developed to perform a task of any kind. Algorithms are a critical component of software design, often written in
pseudocode, a mix of English and programming language syntax that programmers can easily understand. You
will learn to develop algorithms using pseudocode in Chapter 3. The actual work of coding an application is
ideally a fairly straightforward process of converting a carefully developed algorithm into a specific programming
language.
The skills required for these activities include careful attention to detail, logical thinking, documentation
(writing), and general programming experience.
4. Application Coding
This is the activity that is usually associated with programming! The algorithm for each program module is coded
into a programming language. Each module is then carefully tested before the modules are assembled to produce
the complete application. The most important skill required for coding is knowledge of the appropriate
32
programming language, but programmers are expected to also have the experience to develop code efficiently, test
thoroughly, find and fix errors (debugging) and document the code so that other programmers can refer to the
documentation as needed.
Coding, testing, debugging and documenting require patience, thoroughness, and careful attention to detail.
5. Application Testing
Once the application has been assembled, it is time for thorough testing. While the development team may
perform many tests for correctness, it is also important to test for usability. A development team may produce a
terrific application that has been thoroughly tested and debugged but turns out to be a disaster when provided to
end users. Why? Because the end users find the interface confusing and cannot easily perform the tasks that are
most important for their purposes. Usability testing brings the users into the development process and ensures
that the needs and concerns of the user are taken into account before the product is distributed. In the case of
larger applications, usability testing is often undertaken by usability experts who may observe users working with
the product to determine where improvements can be made. In smaller applications, the programmer may simply
work with the client to find problems and get feedback.
Testing takes a great deal of patience, attention to detail, and thoroughness. Usability testing requires good
listening skills, careful observation, and (if you are the programmer) humility! It's very easy for any programmer
to be so focused on his or her own design that the needs of the user become secondary. If you notice yourself
getting impatient with a user who cannot figure out how to use your product, or who wants the software to
perform differently, then it's probably time to step back, pay attention to the user's concerns, and reconsider your
own design assumptions.
33
The Software Development Life Cycle
Taken together these activities constitute the software development life cycle:
Evaluation of requirements
Application design
Algorithm development
Application coding
Application testing
User support, training, software maintenance
This is not a precise list—in reality these various stages may not be so neat and sequential, and you will see
somewhat different versions of this process in every programming textbook and in every workplace. Development
teams may implement these various stages differently. But no matter how these stages are defined, no part of the
development cycle should be treated carelessly. As you gain experience as a programmer you will more fully
appreciate the special characteristics and importance of every step. And perhaps you can already see how the field
of software design attracts people who are both creative and logical, who enjoy using both the left and right sides
of their brain equally.
34
The Importance of Writing and Communicating
Documentation and writing are frequently mentioned as important skills for programmers. Documentation is
critical to software development and wherever your own career path takes you in the field of software design and
development, you will need to be able to write carefully and communicate effectively. Clients, designers and
managers must refer to well-written documents that clearly define requirements, design and code specifications.
Everyone involved in the development process must listen carefully and communicate effectively. Programmers
must document their working code so that other programmers can easily read and modify it (often the
programmer who develops a piece of code will not be the programmer who is asked to make changes for the next
version). Programmers must often give presentations to clients or to their team. The testing phase also requires
extensive documentation that indicates what tests were applied, the results of these tests, and how problems were
resolved. Software users will need course manuals and training materials. Lastly all maintenance procedures must
be documented so that a complete record is always available regarding the current state and history of the
software.
35
What Are Programming Languages?
Earlier we explored what a computer program is, and what programmers do, but what about programming
languages? What is a programming language and why are there so many different languages?
As we have seen, a computer program is a sequence of instructions that direct the computer's microprocessor to
execute commands that are available in the microprocessor's instruction set. These low level commands are
expressed in machine language and are very basic, for example to add numbers, or copy a value from one
memory location to another. It would be extremely time-consuming to write instructions in the 0s and 1s of
machine language, and this code would be very error-prone and difficult to debug, maintain, or modify.
Instead of using machine language directly, we develop programs using high-level programming languages.
Examples of current high-level languages are C++, C#, Java, PHP, Python, and Ruby. Examples of older high-
level languages are C, Ada, BASIC, COBOL, Fortran, Pascal, and perl (older does not necessarily mean no longer
used—many applications written in older languages are still in widespread use, and programmers are still needed
to maintain and even update these programs).
A high-level programming language consists of a set of special words, symbols and operators that a programmer
uses to write program instructions. These instructions are often referred to as the program's source code and the
process of writing source code is often simply called coding. High-level languages are quite easy for programmers
to learn, and applications written in these languages can be developed very quickly and efficiently. However the
computer can only understand machine language, so once a program has been written in a high-level language,
the code must then be translated into machine language instructions. There are actually two approaches to
translating high-level code to machine language, either by compiling the code or by interpreting the code. The
approach depends on the programming language that you are using.
36
Compilers and Interpreters
Some programming languages are compiling languages. This means that the entire source code for a program is
converted (or compiled) into an executable file by special software known as a compiler. The executable file that is
produced by the compiler contains the necessary machine language instructions to perform the required task.
Once a program has been compiled into an executable file, the source code is no longer required to run the
program. End users of the program simply receive the executable file. Of course, the programmers keep the source
code in order to perform updates and produce new versions. Usually when you purchase standalone software from
a store you are buying an executable program that has been compiled. Two advantages of compiled programs are:
Since a compiler generates an executable file containing the machine language instructions for a specific
microprocessor and operating system, the source code must be compiled separately for different platforms
(Windows, Macintosh, Linux, etc). Also, each time the source code is modified, the new version must be
compiled again to produce a new executable file. The new executable file must then be distributed to the end
users.
Other programming languages are interpreted languages. Execution of programs written in interpreted
languages is dependent on a special program known as an interpreter. An interpreter reads through the source
code, converting the instructions into machine language and executing them as it does so. Because of this, both
the interpreter and the source code are needed every time that the program is executed since no executable file is
created for later use. One advantage of this approach is that the same source code can be used on any computer:
computers running Windows, Macintosh or Linux operating systems can each use their own language interpreter
to translate the source code into their own specific machine language.
A disadvantage of using an interpreter is that in most cases we do not want to deliver the actual source code to
the end user of the software. But this approach works very well for network-based programs, such as Web
applications, since these programs are not distributed to end users. In these cases, the source code is located on a
Web server and executed each time a request is submitted by a client application, such as a Web browser. The
source code can be modified quickly and easily on the Web server with no need to recompile and redistribute the
software every time a change is made. PHP is an example of an interpreted programming language that is widely
used to develop server-based Web applications.
Some languages provide both compiling and interpreting options, and some languages actually combine
compiling with interpreting stages to achieve greater efficiency and platform independence. A notable example is
the Java language. Java applications are compiled “up to a point” to produce an “almost executable” version in the
form of byte code that incorporates many of the efficiencies of the compilation process, and then Java interpreters
are provided for different platforms so that the same byte code can be distributed for execution on any machine
(Windows, Macintosh, Linux, etc.) in order to achieve platform independence.
37
So Many Languages!
As computer technology evolves, new programming languages are continually developed to take advantage of the
latest hardware and software design strategies. For example new languages were developed to implement the
functionality of object-oriented programming, while others have been developed to facilitate client/server
application development. There are literally thousands of different programming languages and often a computer
programmer is expert in only a few of these. While each programming language has its own special syntax and
characteristics, most languages are very similar in their overall characteristics and functionality, and use the same
basic logical structures to write instructions. We will learn about these common characteristics as we work
through this book. A programmer who is familiar with the general logic of programming, and who has experience
coding in one or two languages can usually learn new languages quite quickly.
38
Standalone and Network Applications
Computer programs can be designed for use on individual machines (as standalone applications), or across
networks (as network applications).
A standalone application is designed to provide a complete service on the local computer, usually the
computer sitting on the user's desk. Standalone applications do not require any network connectivity, interacting
only with the computer's operating system and other utility software on the local machine. If a new version of
the application becomes available, or if updates are required, these must be also installed on every user's computer.
Examples of standalone software are traditional word-processing and spreadsheet applications, image-processing
software, many games, etc. At this time, most of the programs that you install on your local computer are
standalone applications.
Network applications are programs that run partly or entirely on remote computers, linked to the user across a
network of some kind. The more traditional network application was simply installed on a single host computer
and then accessed by many users remotely. Each user that signs on to the host computer is provided a user
interface to work with the application. An increasingly important type of network application is a client/server
application which consists of any number of component programs that work together across a network. Some
components of a client/server application can be installed on a local computer, and perform as client programs.
Other components of a network application are installed on network servers and perform as server programs. The
server-based components respond to requests from client components of the application as needed. At the
minimum the client component usually provides the user interface that allows the user to submit information and
view the results, while the server component does most of the processing.
You are using a client/server application whenever you use your Web browser. The Web browser performs as a
local client component, providing your user interface and allowing you to send requests to server programs all
over the world. So you are using a client/server application whenever you use your Web browser to obtain
information, shop online, or play an online game. Other common examples of client/server applications are
ATM's and e-mail programs.
Client/server applications are becoming more and more common because they allow us to obtain services and
perform tasks without need for special software on our local computer. We can expect to make increasing use of
Web-based client/server applications as bandwidth increases since these require only a local Web browser and an
Internet connection, rather than software that must be installed locally and continually updated. For example we
are now seeing networked versions of word-processing and spreadsheet applications.
39
Markup Languages
So far we have discussed the purpose of programming languages. As you now know, the purpose of a
programming language is to allow a programmer to write instructions that process data. In other words,
programming languages are used to perform operations that read or modify existing data or generate new data for
some purpose (for example to calculate wages, convert temperatures, or keep track of a game player's score).
Another type of language is a markup language. Markup languages are often used in conjunction with
programming languages, but have a very distinct purpose. The purpose of a markup language is to provide
markup instructions (usually in the form of tags) that simply describe data or indicate how data is to be
formatted, or rendered (for example to define how data should be displayed on a Web page, or printed in a
document). Markup languages are defined for a wide range of purposes. For example, your word-processing
program uses a markup language to save formatting instructions with your document as you type a report or
letter.
The markup language that is used to render data for display in Web browsers is Hypertext Markup Language
(HTML). We will learn the basics of HTML in order to format our Web-based applications.
40
Combining Markup and Programming Languages
In this course, you will learn the basics of programming by developing small, Web-based client/server applications
using a programming language known as PHP, one of the most widely used programming languages for this type
of application. Since you will use a Web browser to display your program output, you will also learn the basics of
the HTML markup language to format your application input and output for display in your browser window.
41
Summary
A computer is a programmable machine. The computer's microprocessor includes the computer's instruction set
which defines all of the basic commands that the computer can execute.
Commands to the microprocessor must be issued using the computer's machine language. A computer
program is a set of machine language instructions that execute a sequence of commands to perform a useful task.
Different programs combine common components to achieve their purpose: interactive environments;
read/write operations; numerical operations; text-processing, communication with other programs; control of
hardware.
A software designer/developer requires a range of skills that combine creative problem-solving and logical
processing. Documentation is an important part of the software process so writing and communication are
important skills that are often not associated with this field.
Software development includes a number of stages: evaluation of requirements; application design; algorithm
development; application coding; application testing; user support, training, software maintenance.
Programs are written in programming languages which may be compiled or interpreted. The code containing
the program instructions written in a specific language is known as source code. If the language is a compiler-
based language the source code must be converted into an executable version which is then distributed for use. If
the language is an interpreted language, the source code itself is distributed and this is then executed one line at a
time by a language interpreter.
Some programs are designed to function as standalone applications, which means that they are installed locally
and do not need access to other networks. A copy of a standalone application is required for every user. Network
applications run over networks. A single network application can be installed on one computer and accessed
across a network by many users.
An increasingly important type of network application is a client/server application, where client programs on
local computers send requests to server programs on remote computers. These requests are processed and results
returned to the client. A common example is a Web-based client/server application where a user's Web browser
performs as a client to request services from server applications throughout the world.
Markup languages are not the same as programming languages. Programming languages provide instructions to
process data. Markup languages provide tags to describe or format (render) data.
In this course you will learn to develop simple Web applications using the PHP programming language and
HTML markup language.
42
Chapter 1 Review Questions
1. A web application is an example of:
a. Object-Oriented Programming
b. Client/server design
c. A microprocessor
d. A standalone application
2. A program that requires the source code each time that it executes is using which method to convert the
source code to machine language?
a. A compiler
b. An interpreter
3. Which approach is better when evaluating software requirements?
a. Determine the requirements as quickly as possible in order to move on to the design and coding
phases.
b. Take time to analyze and clarify the application requirements.
4. What kind of thinking activities are most associated with the work of a programmer?
a. Left brain activities
b. Right brain activities
c. Both left AND right brain activities
d. Neither left NOR right brain activities
5. What language is often used to write algorithms?
a. Markup language
b. Pseudocode
c. High-level programming language
d. Machine language
6. Which language does the computer actually understand when it executes instructions for a program?
a. Markup language
b. High-level programming language
c. Pseudocode
d. Machine language
7. What is the computer's instruction set?
a. The set of all programming languages that a computer can understand
b. The set of all software that is currently available on the computer
c. The basic set of commands that a computer can execute
d. The rules for using a high-level programming language
8. What is source code?
a. Programming instructions written in a programming language
b. Program instructions that have been compiled into machine language
c. The code used to identify text characters from languages all over the world
d. The code used to identify memory addresses
9. What does an executable file contain?
a. Programming instructions written in a programming language
b. Program instructions that have been compiled into machine language.
c. Formatted text
d. An audio image
10. Which term applies to an application model where one program calls another program in order to have
some task performed?
a. Client/server
b. Standalone program
c. Instruction set
d. An algorithm
43
11. What does an interpreter do?
a. Reads and executes source code, one line at a time
b. Converts source code into an executable file.
c. Sends data from one program to another
d. Converts and displays text that has been marked up
12. What does a compiler do?
a. Reads and executes source code, one line at a time
b. Converts source code into an executable file
c. Sends data from one program to another
d. Converts and displays text that has been marked up
13. When you use your Web browser to access information you are working with
a. A client/server application
b. A standalone application
14. What is an algorithm?
a. A set of instructions to meet a requirement of some kind
b. An executable file
c. Program instructions that have been compiled into machine language
d. Programming instructions written in a programming language
15. Which of the following is not a feature of modular application design?
a. Concurrent development of each module
b. Reusable code
c. Separate testing of each module
d. Less time needed to evaluate requirements
16. What category of language is used to describe or format data?
a. Markup language
b. High-level programming language
c. Pseudocode
d. Machine language
17. What languages will you learn in this course?
a. C++ and HTML
b. XML and Java
c. PHP and FORTRAN
d. PHP and HTML
18. Which is the correct order for these stages in the software development life cycle?
a. Application coding, application design, algorithm development
b. Application design, algorithm development, application coding
c. Algorithm development, application design, application coding
d. Algorithm development, application coding, application design
19. Is a Web browser a client application or a server application?
a. Client
b. Server
20. What type of application runs entirely on your own computer?
a. Client/server
b. Networked
c. Web-based
d. Standalone
44
Chapter 2
Client/Server
Applications—Getting
Started
45
Introduction
This chapter will prepare you for the hands-on activities that you will perform as you work through the
subsequent chapters of this book. First we will review client/server design with a focus on Web-based
applications. Next we will look at how files and folders are organized and located, using local addresses based on
disk drives, and Internet addresses based on domain names. This is important since you will need to be careful
to save files to the correct locations on your disk drive, and then open these files in your Web browser using the
correct Internet address.
You will also install the server software that you need to work through the textbook and complete the exercises.
This is a very straightforward procedure and you will be able to test that your server is running correctly by
running some sample programs.
Once the server has been installed you will have the option to install a text editor, then you will be asked to
type in a few small programs, save them, and run them using your Web browser. The code for these programs is
provided. The idea is not to learn to develop programs (that comes later), but to simply learn the general process
of using an editor to create code, saving your files to the correct location under your Web server, running the
server, and then testing that your programs work correctly.
46
Client/Server Design in Web Applications
In a client/server design, client programs send requests to server programs to perform a task of some kind, just as
you might ask someone else to do something for you. The server receives the request from the client and responds
appropriately. The server program resides on a networked computer and can respond to hundreds, thousands, or
millions of client requests; consider an online shopping site that receives requests from customers all over the
world every minute. An important advantage of client/server design is that software updates are applied on the
servers without requiring any changes on the client computers.
Client/server applications are delivered world-wide across the Internet, and are also used to provide services to
users of private networks (known as intranets) within an organization or company.
A Web application is a familiar example of an Internet-based client/server design. In the case of Web
applications, the client program is a Web browser. The Web browser runs on a user's personal or office computer.
Each time the user enters a URL, or clicks on a link on a Web page, or clicks a Submit button after entering data
into a Web form, the browser sends the user's request. The request is transmitted across the Internet to the
appropriate Web server. The Web server receives and processes the request, then sends back a response for the
browser to display to the user. Web servers may be located anywhere on the Internet and can accept requests from
any client that has Internet access (Figure 2-1). In order to process each request, the server program may
communicate with other programs or access databases or files. This is a very efficient design since it allows the
user to obtain all kinds of useful services without installing special software on their local computer. Instead the
user uses their Web browser to execute programs that are located on remote servers.
In order to develop Web-based applications we must create files that contain the necessary instructions for our
Web pages and programs, and store these files on a Web server. The server can then process the files as needed in
response to requests.
In this course you will run a Web server on your local computer so that you can develop applications without
having to connect to a server located on the Internet. In other words, your Web server will actually be located on
the same computer as your Web browser, but it will behave exactly like a Web server running on the Internet.
This approach allows you to keep all your work on your local computer or USB drive, and saves you the expense
of setting up an account with an Internet Service Provider (ISP). Note that, if you prefer, you can also do all the
work in this book using an Internet-based Web server; in that case you will need to transfer your files to and from
the server in order to edit them.
Even though your Web server will run on your local computer, it will still function as though it were running
on the Internet. You will need to be careful to save your files to the correct folder locations so that your Web
server can find them, and you will also need to provide the correct Web addresses (URLs) for these files when you
wish to view them in your Web browser. Web addresses are quite different from the addresses used in Windows
so let's review how files and folders are organized on disks, and then learn how files can be located using the
47
Windows and Internet addressing schemes.
48
Working with Files and Folders
Files are used to store data, all kinds of data. A file may contain text, images, videos, word-processing documents,
programs, etc., but each file may only contain one type of data. The file extension usually indicates the format of
the data that is stored in the file. This is very useful since the format indicates what type of program is needed to
process the file. For example, a file with a .jpg extension contains image data stored using the jpeg image format,
and can be opened by any image-viewing or image-processing program that can read this format. A file with an
.mp3 extension contains an MP3 audio file that can be handled by any MP3 player. A file with a .zip extension
contains data that has been compressed using the ZIP compression scheme. To create zip files, or extract data
from these files, you will need zip utility software.
Text files contain plain text (characters that can be typed on your keyboard). Text files can be viewed and
edited using any text editing software. Files that contain plain text are often saved with a .txt extension. Often
however, text files are given special extensions to indicate the specific purpose of the text that is stored in the file.
In this course you will use a number of different extensions for your text files, as follows:
Plain text files, using a .txt or .dat extension, will be used to store simple data for use by your programs. For
example you might create a file named scores.txt that contains a list of student scores.
HTML files, using an .html extension, will be used to store the markup instructions for Web pages. Our
Web pages will include forms to allow the user to enter information that will be submitted for processing by
our programs. For example you might create a file named wages.html that contains a Web page with a form
for the user to submit their hours worked and hourly wage.
CSS files, using a .css extension, will be used to store style sheet specifications that define how our HTML
code is to be rendered on the Web page.
PHP files, using a .php extension, will be used to store the source code for PHP programs. Our PHP
programs will usually receive information from the user or look up data in files in order to perform useful
processing operations and generate output. For example you might create a file named wages.php that
contains the source code to receive wage information from a Web page, then calculate and display the pay.
Since these are all text files we can create and modify the content using any text editor. However since these files
contain text to serve different purposes, the file extension indicates what software is required to process the
content of each file. A file with an .html extension is usually opened by a Web browser, since Web browsers are
designed to interpret .html files and display the contents as Web pages. A file with a .php extension can only be
executed as a set of PHP instructions if it is opened by a PHP code processor. A PHP code processor is included
with the Web server that you will install as you work through this chapter.
Files are usually organized into folders for ease of management, and files and folders are stored on portable or
fixed disks that are accessed through disk drives connected to computers. You can access files on disks located in
local drives that are attached to your personal computer. You can also access files on disks in remote disk drives,
attached to computers that are connected to your computer through a network such as the Internet. No matter
where the drive is located, in order to locate a specific file on a disk, you need to be able to refer to it using some
kind of file addressing scheme.
49
Locating Files and Folders on Computers
Running a Windows Operating System
Most often when we want to locate a file or folder using a Windows operating system, we open File Explorer and
point and click our way to the file that we wish to work with. As a programmer, it is important to know that we
can also reference a file by providing its unique file path or address. Every file and folder on a computer has a
unique address that is based on its folder location and disk drive specification. Take a look at Figure 2-2, which
displays a screen containing a list of four folders.
Note that the address box shows the root address of these folders. They are located on the D:\ drive of the local
computer. The address of the folder named CourseMaterial is therefore D:\CourseMaterial.
Folders can contain any combination of other folders and data files. Let's look inside CourseMaterial by double-
clicking this folder (Figure 2-3).
Notice the address in the address box is now D:\CourseMaterial, indicating that we have shifted our location to
the CourseMaterial folder. This folder contains three folders (CourseWork, ReferenceMaterials and Samples)
and two data files (notes.txt and myImage.bmp). The file extensions indicate the type of data stored in these two
files: notes.txt contains plain text, while myImage.bmp contains a bitmap image. The complete address of the
file named notes.txt is D:\CourseMaterial\notes.txt and the address of the folder named Coursework is
D:\CourseMaterial\Coursework.
50
Exploring the Variety of Random
Documents with Different Content
detail all the proofs and arguments adduced by our able writers, at
least in English, in support of the papal supremacy and the
eucharistic sacrifice. Unless they do this, they will not be entitled to
any notice at our hands.
So far as Dr. Harwood merely describes the doctrine we hold
respecting the papal supremacy, he is almost entirely correct, and so
eloquent that the effect produced in his mind by its grandeur, in
spite of his inward reluctance, is visible. Of argument against it there
is hardly the semblance, a point we note not to the author's
disadvantage, but merely as a reason for not arguing in its favor.
One passing objection he does throw, as he goes by, at the title
supreme pontiff or pontifex maximus. This word appears to alarm
him, and no doubt alarmed all the excellent ladies and other worthy
persons in his audience, who are easily alarmed by words. "He is
regarded as the pontifex maximus of the whole church of Christ.
Pontifex maximus! The very word brings up memories of the
imperial city before it became Christian. Julius Cæsar was pontifex
maximus—the office was held by all the Cæsars—it was held while
the disciples of Jesus Christ, worshipping their Lord in the
catacombs, or dying in the amphitheatre 'to make a Roman holiday,'
associated the office with all cruelty and impiety." If this passage is
any thing more than a rhetorical flourish, it means that the name
and office of supreme pontiff are bad, unchristian things, because
the heathen had them. We ought, then, to carry this principle out to
its fullest extent. The heathen had an order of men specially devoted
to religion, public prayers, holy days, temples, religious hymns, etc.,
therefore we should have none of these. The surplice which Dr.
Harwood wears is derived through the Jews, from the ancient
Egyptian priests; his prayer-book is full of observances derived from
the Roman Church. He preaches sermons and observes a fast of
forty days, like the Mohammedans, all of which is very wrong, and
reminds us painfully of Pharaoh, and the fires of Smithfield, and the
cruel persecutions of the Turks against the Christians. The Jews had
a high priest appointed by Almighty God. Our Lord is a high-priest,
pontifex maximus. Heathen perversions or travesties of divine things
make no argument against the things themselves. Neither is there
any reason why names, forms, observances, used by heathen, if
they are good and suitable, should not be adopted by Christians, just
as we appropriate heathen architecture, take possession of heathen
temples, and employ heathen philosophy in the service of religion.
We have no doubt that Moses imitated the civil and religious
customs of the Egyptians to a very great extent in the prescriptions
of his law. Parallelisms between the Catholic religion and various
false religions may easily enough be pointed out. We laugh at such
an argument as not worthy of being seriously refuted. The greater
the number of analogies that can be pointed out, the stronger is the
proof that the principles of our religion are derived from the origin of
the race, universal, and in accordance with human nature. Rome
was not all bad before it was converted. Whatever in it was good did
not need to be abolished, but only sanctified. Our Lord drove out
Jupiter, the angels and saints supplanted the imaginary divinities of
Olympus, the successor of Peter took the place of the successor of
Cæsar. The glorious temples of the gods became Christian churches,
and Roman polity became an organizing power over all Christendom.
In this was only fulfilled the prophecy of St. Paul, "The God of peace
shall bruise Satan under your feet shortly."[60] This kind of play
upon words with pontifex maximus will, therefore, help Dr. Harwood
very little unless he can disprove the existence of the thing they
represent—a human priesthood with a supreme head over it,
possessing power delegated by Jesus Christ.
The lecturer is not precisely accurate in what he says of the
definition of the immaculate conception. The judgment of the
Catholic bishops and doctors had been for ages manifested, and was
taken anew in the most formal manner, before Pius IX. proclaimed
his definition. Those few persons among the prelates and
theologians who were opposed to the definition, did not merely
submit outwardly by keeping silence, but inwardly by an interior
submission of the mind, precisely as a good Christian would have
submitted to St. Peter himself in a similar case. If Dr. Harwood
admits the doctrinal infallibility of the New Testament, he can easily
understand that, if the meaning of any passage in it about which he
had previously doubted should be made clear to him, he would have
to give his interior assent to it, even though he must change an
opinion he had held all his life long. Precisely so with us. An infallible
judgment makes known to us with the certainty of faith the true
sense of the divine revelation, which we receive accordingly as
equally certain and obligatory on the conscience with every other
revealed truth. Whoever does not give this inward assent becomes a
heretic, and therefore Pius IX., in his Bull Ineffabilis, pronounces that
every one who does not believe the immaculate conception as a
revealed truth has suffered shipwreck of the faith.
In his account of the Catholic doctrine of the sacrifice of the mass
the author of the lecture is less successful, and misrepresents it
seriously; not intentionally, or through wilful carelessness, but
through a misunderstanding of Catholic phraseology. Because the
church calls it the same sacrifice with the sacrifice of the cross, he
appears to think that our Lord is believed to have redeemed the
world by the oblation of himself at the institution of the eucharist,
and to be continually repeating this act of redemption in the sacrifice
offered daily on our altars. Dr. Seabury, the first Protestant bishop of
Connecticut, did actually teach that our Lord offered himself in the
eucharist as a sacrifice, and not on the cross. This strange notion of
the founder of his own diocese, Dr. Harwood incorrectly ascribes to
the Catholic Church.
The church teaches that our Lord redeemed the world by his death
and the shedding of his blood upon the cross. He did not redeem it
by the oblation of himself in the Last Supper, nor does he do so by
the sacrifice of the altar; the sacrifice of redemption having been
offered once for all upon the cross, and not needing to be repeated.
The church does not mean by "same sacrifice" that the oblation in
the eucharist is a similar act of redemption, propitiatory in the
divided sense, or merely as containing the body and blood of Christ,
and presenting them before God. The sacrifice is the same, because
the victim is the same, the priest is the same, and all the value or
merit contained and applied in the sacrifice of the altar is derived
from the bloody sacrifice of the cross. There is thus a moral unity
binding together the innumerable acts of consecration and oblation
which take place on the Christian altars with each other and with the
sacrifice of the cross, in one whole, just as the innumerable acts of
obedience performed by our Lord during his earthly life make one
integral act of obedience with the final and consummating act of his
oblation on Mount Calvary. No doubt the intrinsic excellence of the
sacrifice of the eucharist is infinite, and therefore sufficient for the
redemption of this world or a thousand others, if there were others
needing redemption. The merit of the circumcision, the fasting, the
prayer, the preaching, the poverty and humiliation, the labors and
tears of our Blessed Lord was infinite, and fully adequate to the
redemption of mankind, without the sacrifice of the cross. Every act
of love to God the Father proceeding from the sacred heart of Jesus
Christ in heaven is simply infinite in its intrinsic value. Yet no Catholic
theologian maintains that the meritorious acts of our Lord performed
while he was a wayfarer on the earth redeemed mankind apart from
his death, or that he has merited any additional grace for men since
his sacrifice was completed. The sacrifice which our Lord offered in
the Last Supper did not, therefore, constitute that act of expiation to
which, in the divine decree, the remission of original and actual sin
was annexed; and much less is there any such distinct, expiatory
merit in the sacrifice which he perpetually makes of himself in the
eucharist, since his meritorious work has been consummated. He
offered himself once for all as a bloody sacrifice upon the cross,
meriting thereby an eternal redemption. At the Last Supper he
offered up himself to the Father as the Lamb who was to be slain
the next day, presenting by anticipation the merit which he would
gain by his cruel and ignominious death, as an act of adoration,
thanksgiving, expiation, and impetration in behalf of all those who
were included either generally or specially in his intention.
Doubtless, he frequently in prayer had presented these same merits
to his Father; and from the time of Adam's sin these same merits
had constituted the only ground on which pardon or grace had been
conferred, thus verifying the appellation applied to our Lord in the
Scripture of "the Lamb slain from the foundation of the world." In
the sacrifice now offered by the priests of the new law, Christ is
presented before the Eternal Father as the Lamb who has been
slain. And although, as a sacrifice, the eucharist is equally an
oblation of the body and blood of the Lamb of God with the sacrifice
of the cross, differing only in the manner of offering, yet as this
manner of offering upon the cross by pain, blood-shedding, and
death constituted the precise act which expiated sin and redeemed
the world, the sacrificial nature of the eucharistic action which it has
in common with the crucifixion does not derogate from the exclusive
attribute belonging to the latter as the redemptive expiation or the
sacrifice of ransom, blotting out the curse of the fall, and reopening
the gates of heaven to our lost race. A sacrifice of expiation
including all ages, all men, and all sins having been once offered,
there is no need and no place for another, which is precisely what St.
Paul proves in the Epistle to the Hebrews. Dr. Harwood fancies that
we have a dread of that epistle. It is not long since we went through
that epistle carefully with a theological class without being aware of
any sentiments of repugnance to its doctrine arising in our minds. It
is very true that the unlearned and unstable may wrest this, as they
do the other epistles of St. Paul and the Scriptures generally, to a
sense in contradiction to the Catholic faith. To one, however, who is
sufficiently learned to understand the real scope and intent of the
apostle, or sufficiently docile to receive the instruction of competent
interpreters, it presents no difficulty. St. Paul is not speaking of the
eucharist or of the Christian priesthood at all, but is confronting the
priesthood and sacrifices of Jesus Christ in the work of redemption
with the priesthood and sacrifices of the old law, as these were
understood by unbelieving or heterodox Jews. The point to be
established was, that Jesus Christ would never give up his
priesthood to a successor, or offer up another sacrifice similar to the
one offered on the cross. It needs no reasoning to show that
Catholic priests do not pretend to be in the place of Jesus Christ, but
simply his instruments. The perpetuity of his priesthood is therefore
not in the slightest degree incompatible with ours, which is in a
different line, but rather requires it. Neither is it necessary to prove
that we do not pretend to offer a sacrifice which expiates sins or
atones for persons not included in the sacrifice of the cross. The
doctor misunderstands the phrase "propitiatory sacrifice." The
church does not mean that a new sacrifice is offered for persons
whose sins were unatoned for on the cross, or who have fallen a
second time under the curse and need a new ransom. The word
"propitiatory" merely denotes that in the sacrifice of the altar an
application is made of the merits of Christ's death to individuals for
the remission of temporal penalties due to the justice of God. The
redemption was made on the cross; the application of the grace of
remission is made in the sacrament of penance; the remission of
temporal penalties, both for the living and the dead, is obtained
through the sacrifice of the altar. All the efficacy of the divine
eucharist, whether as a sacrifice or a sacrament, is derived from the
merits of Jesus Christ, which were consummated in his death. It is,
therefore, by the application of the merit of the sacrifice of the cross
that the sacrifice of the mass becomes efficacious to salvation. The
Lamb of God is presented before the Father with the merit acquired
by his death upon Mount Calvary, and this presentation is an act of
supreme adoration, of thanksgiving, of impetration, and of
satisfaction for the debt due to the divine justice, made in a sensible,
visible manner, with mystic rites and ceremonies; which is enough to
constitute a sacrifice in the strict and proper sense, whatever
difference of opinion there may be concerning the essence of the
sacrificial act in the eucharist. Although, therefore, there are many
priests and many sacrifices numerically, it is one act performed by
one person which is exhibited and applied in all, so that there is truly
but one sacrifice and one priest. The reverend doctor might have
seen this for himself if he had reflected more carefully on the words
of the Council of Trent which he has himself quoted, Cujus quidem
oblationis cruentæ, inquam, fructus per hanc uberrime percipiuntur
—"The fruits of which bloody oblation, indeed, are by this most
abundantly partaken of."
The words of the lecturer following his exposition of the doctrine are
not at first sight intelligible. "We may be pardoned, then, if we ask
what then is our Lord to us personally?" It is very difficult to see how
the hidden presence of our Lord under the sacramental veils is any
obstruction to our personal relation to him as our Saviour. How does
this presence derogate from the fact that he died for each of us on
the cross, and is ever living in heaven to make intercession for us?
Our adoration of his sacred body and precious blood under the forms
of bread and wine does not hinder our meditating upon his passion
and death upon the cross, or raising our mental eye to his glorious
form at the right hand of God. The author appears to imagine that
his sacramental presence must destroy his natural mode of existence
and reduce him to a passive, helpless state of being in the host. But
this is only because he fails to conceive the Catholic doctrine that
our Lord is present both in heaven and also in the host at the same
time, though in two different modes. He says, "He is present with
us, we adore that presence, but he is passive and lifeless in the
hands of a priesthood. No sign or word comes from the pix. When
the church is in travail over a new doctrine, recluse and learned men
busy themselves in vast libraries in order to catch the consensus of
Catholic tradition. A believer may be excused, if, like Mary, he cries
out, 'They have taken away the Lord, and I know not where they
have laid him!'" Strange language this from a member of the
communion of Andrewes, Hooker, Taylor, Pusey, and Hobart! Has the
author ever read their glowing words respecting this same theme? Is
he familiar with the doctrinal books of his own church? Taken away
the Lord, when he remains perpetually in our tabernacles awaiting
the visits of those true believers who pass hours in sweet
communion at the foot of the altar, conversing with him as with the
friend and spouse of their souls? When he is given to them in
communion and his sacred body rests in their bosoms, kindling there
the flames of a sacred love often equal to that which glows in the
seraphim? Let the reverend doctor read the lives of the saints, and
ask them if the Lord is silent when they converse with him in the
blessed sacrament, or let him even ask the ordinary pious Catholic
that question. He does not indeed break the silence of his hidden
state by words audible to the bodily ear, but he speaks far more
efficaciously to the heart in a way which is unintelligible to cold
rationalism, but perfectly well known to faith inflamed by love. The
divine eucharist was not instituted as a medium for communicating
light to the church concerning revealed truths. Christ teaches and
rules the church by the Holy Spirit, and not by his human voice. It is
his will that study, meditation, and counsel should be the means by
which the prelates and doctors of the church obtain the light and
assistance of this divine Spirit. Dr. Harwood is not pleased with this
arrangement; but as the Lord appears to have determined definitely
that it must be so, we are afraid that his suggestions will not be
attended to. At all events, he may console himself with the reflection
that he has discovered an entirely new objection to the Catholic
doctrine.
We have unwittingly passed over one other objection, namely, that
the doctrine of the eucharistic sacrifice destroys the idea of
communion. The eucharist does not cease to be a sacrament by
being a sacrifice. If there is communion among Episcopalians
through a reception of bread and wine, it would seem that there
might be also communion among Catholics in receiving the true
body and blood of Christ. If the Protestant Episcopal liturgy is a
common prayer, certainly the Catholic liturgy is equally one, though
it is also a sacrifice. Moreover, there is, in the strictest sense,
communion in the very act of offering the sacrifice. The priest,
though consecrated by a heavenly grace and commissioned by the
divine authority of our Lord, is consecrated to minister for the
people, in their name and as their representative. He offers up the
sacrifice for the people, and they offer sacrifice to God through him,
which is signified in the mass by the action of the deacon, who, as
the representative of the laity, holds the pixis in his hand at the
offertory, and placing his right hand on the foot of the chalice,
recites with the priest the prayer, Offerimus tibi, Domine, calicem,
etc. We will not attempt to prove the truth of the Catholic doctrine of
the mass, since the author does not directly attempt to disprove it,
but will drop the subject here, and proceed to notice what method
he proposes to follow in refuting the two grand Catholic doctrines of
the papacy and the mass.
The reverend doctor takes a review of the condition of Protestantism
as in contrast with that of the Catholic Church, in which we are
happy to be able to concur with him as well as to commend the
graphic power of his description. He then briefly indicates three ways
of proceeding: one by tradition, one by tradition and Scripture
together, and one by Scripture alone, which he selects, reserving the
right to appeal to tradition when it is convenient. We will let his
language speak for itself:
II.
On the evening of a day in the beginning of April, 1809, all the
lovers of art in Vienna were assembled in the theatre to witness the
performance of the oratorio of The Creation. The entertainment had
been given in honor of the composer of that noble work—the
illustrious Haydn—by his numerous friends and admirers. He had
been enticed from Gumpendorf, his retreat in the suburbs, the
cottage surrounded by a little garden which he had purchased after
his retirement from the Esterhazy service, and where he was
spending the last years of his life. Three hundred musicians assisted
at the performance. The audience rose en masse and greeted with
rapturous applause the white-haired man, who, led forward by the
most distinguished nobles in the city, was conducted to the place of
honor. There, seated with princesses at his right hand, beauty
smiling upon him, the centre of a circle of nobility, the observed and
admired of all, the object of the acclamations of thousands—who
would not have said that Haydn had reached the summit of human
greatness, had more than realized the proudest visions of his youth?
His serene countenance, his clear eye, his air of dignified self-
possession, showed that prosperity had not overcome him, but that
amid the smiles of fortune he had not forgotten the true excellence
of man.
"I can see plainly," remarked one of Haydn's friends, whom we will
call Manuel, "that he will write no more."
"He has done enough; and now we are ready for the farewell of
Haydn," said another.
"The farewell?"
"Did you never hear the story? I have heard him tell it often myself.
It concerns one of his most celebrated symphonies. The occasion
was this: Among the musicians attached to the service of Prince
Esterhazy, were several who, during his sojourn upon his estates,
were obliged to leave their wives at Vienna. At one time his highness
prolonged his stay at Esterhazy castle considerably beyond the usual
period. The disconsolate husbands entreated Haydn to become the
interpreter of their wishes. Thus the idea came to him of composing
a symphony in which each instrument ceased, one after another. He
added at the close of every part the direction, 'Here the light is
extinguished.' Each musician, in his turn, rose, put out his candle,
rolled up his notes, and went away. This pantomime had the desired
effect; the next morning the prince gave orders for their return to
the capital.
"He used to tell us a somewhat similar story of the origin of his
Turkish or military symphony. You know the high appreciation he
met with in his visits to England; but notwithstanding the praise and
homage he received, he could not prevent the enthusiastic audience
from falling asleep during the performance of his compositions. It
occurred to him to devise a kind of ingenious revenge. In this piece,
while the current is gliding softly, and slumber beginning to steal
over the senses of his audience, a sudden and unexpected burst of
martial music, tremendous as a thunder-peal, startles the surprised
sleepers into active attention. I would have liked to see the lethargic
islanders, with their eyes and mouths thrown open by such an
unlooked-for shock!"
A stop was suddenly put to the conversation by the commencement
of the performance. The Creation, the first of Haydn's oratorios, was
regarded as his greatest work, and had often elicited the most
heartfelt applause. Now that the aged and honored composer was
present, probably for the last time, to hear it, an emotion too deep
for utterance seemed to pervade the vast audience. The feeling was
too reverential to be expressed by the ordinary tokens of pleasure. It
seemed as if every eye in the assembly were fixed on the calm,
noble face of the venerated artist; as if every heart beat with love
for him. Then came, like a succession of heavenly melodies, the
music of The Creation, and the listeners felt as if transported back to
the infancy of the world. At the words, "Let there be light, and there
was light," when all the instruments were united in one full burst of
gorgeous harmony, emotion seemed to shake the whole frame of
the aged artist. His pale face crimsoned; his bosom heaved
convulsively; he raised his eyes, streaming with tears, toward
heaven, and, lifting upward his trembling hands, exclaimed, his voice
audible in the pause of the music, "Not unto me—not unto me—but
unto thy name be all the glory, O Lord!"
From this moment Haydn lost the calmness and serenity that had
marked the expression of his countenance. The very depths of his
heart had been stirred, and ill could his wasted strength sustain the
tide of feeling. When the superb chorus at the close of the second
part announced the completion of the work of creation, he could
bear the excitement no longer. Assisted by the prince's physician and
several of his friends, he was carried from the theatre, pausing to
give one last look of gratitude, expressed in his tearful eyes, to the
orchestra who had so nobly executed his conception, and followed
by the lengthened plaudits of the spectators, who felt that they were
never to look upon his face again.
Some weeks after this occurrence, his friend Manuel, who had sent
to inquire after his health, received from him a card on which he had
written, to notes of music, the words, "Meine kraft ist dahin," "My
strength is gone." Haydn was in the habit of sending about these
cards, but his increased feebleness was evident in the handwriting of
this; and Manuel lost no time in hastening to him There, in his quiet
cottage, around which rolled the thunders of war, terrifying others
but not him, sat the venerable composer. His desk stood on one
side, on the other his piano; he smiled, and held out his hand to
greet his friend.
"Many a time," he murmured, "you have cheered my solitude, and
now you have come to see the old man die."
"Speak not thus, my dear friend," cried Manuel, grieved to the heart;
"you will recover."
"Not here," answered Haydn, and pointed upward.
He then made a sign to one of his attendants to open the desk, and
reach him a roll of papers. From these he took one and gave it to his
friend. It was inscribed in his own hand, "Catalogue of all my musical
compositions, which I can remember, since my eighteenth year.
Vienna, 4th December, 1805." Manuel, as he read it, understood the
mute pressure of his friend's hand, and sighed deeply. That hand
would never trace another note.
"Better thus," said Haydn softly, "than a lingering old age of care,
disease, perhaps of poverty! No; I am happy. I have lived not in
vain. I have accomplished my destiny; I have done good. I am ready
for thy call, O Master!"
His spiritual adviser and guide was with him the next hour, and
administered the last consolations of religion. The aged man was
wrapped in devotion. At length he asked to be supported to his
piano; it was opened, and as his trembling fingers touched the keys,
an expression of rapture was kindled in his eyes. The music that
answered his touch seemed the music of inspiration. But it gradually
faded away; the flush gave place to a deadly pallor; and while his
fingers still rested on the keys, he sank back into the arms of his
friend, and gently breathed out his parting spirit. It passed as in a
happy strain of melody!
Prince Esterhazy did honor to the memory of his departed friend by
the pageant of funeral ceremonies. His remains were transported to
Eisenstadt, in Hungary, and placed in the Franciscan vault. The
prince also purchased, at a high price, all his books and manuscripts,
and the numerous medals he had obtained. But his fame belongs to
the world; and in all hearts sensible to the music of truth and nature
is consecrated the memory of Haydn.
PRAYER.
If men but knew—a wise priest gravely said,
His Roman doctor's cap upon his head—
If men but knew what they had won by prayer
Aside from all their worldly thrift and care,
They might be tempted, in a literal sense,
"Always to pray," and with just toil dispense.
THE IMMUTABILITY OF THE
SPECIES.
II.
Of the several circumstances which led to the conception of the
theory here advanced, the first and most important was the
recognition of the fact that variation was left unaccounted for upon
the hypothesis of evolution. Here, if anywhere, we conceived, was to
be found the vulnerable part of Darwinism. It occurred to us that the
probabilities were that a theory was false when it had for its data
phenomena which conform to no law. Our subsequent inquiries
furnished us with nothing by which to rebut this presumption; but
with much to confirm it. Our suspicion at last strengthened into
conviction, and we became confident that contemplation of the
subject of the cause of variation alone could furnish us with a
solution of the whole question.
It is of laws alone of which we speak in these articles. All the facts
adduced by Darwin we accept, and use them merely as illustrations.
We have nothing in common with those who contend that the
refutation of Darwinism lies solely with mere compilers of facts—
fanciers, florists, and breeders. Darwin has heretofore anticipated
nothing but a joinder of issue upon facts. He has apparently never
contemplated being met by a demurrer. He has endeavored to
confound his opponents by a vast multitude of facts; and, owing to
his reverence for whatever has the sanction of antiquity, it has never
entered his mind that any one would be so presumptuous as to
demur to the time-honored conception of new growth, upon which
these facts are based. Of this presumption we are guilty when we
deny the very existence of organic evolution.
In the preceding article we directly intimated, on several occasions,
that no theory other than that of reversion can afford a solution of
the mystery of the appearance of favorable modifications. As some
little diversity of opinion exists respecting Darwin's views on the
subject of the cause of variation, it may be well for us to dwell
awhile on this question, and to furnish some evidence substantiating
our statement.
Darwin, in his Origin of Species, candidly and frankly admits that he
can assign no satisfactory reason for the appearance of favorable
modifications. He ascribes them to "spontaneous variability," and
assures us that "our ignorance of the laws of variation is profound."
We might adduce a number of other expressions equally declaratory
of his inability to assign the cause of variation; but as the Duke of
Argyll has taken such pains to direct attention to this hiatus in
Darwin's evidence, we cannot refrain from quoting from his The
Reign of Law:
"It has not, I think, been sufficiently observed that the theory of
Mr. Darwin does not address itself to the same question, (the
introduction of new forms of life,) and does not even profess to
trace the origin of new forms to any definite law. His theory
gives an explanation, not of the processes by which new forms
first appear, but only of the processes by which, when they have
appeared, they acquire a preference over others, and thus
become established in the world. A new species is, indeed,
according to his theory, as well as with the older theories of
development, simply an unusual birth. The bond of connection
between allied specific and generic forms is, in his view, simply
the bond of inheritance. But Mr. Darwin does not pretend to
have discovered any law or rule according to which new forms
have been born from old forms. He does not hold that outward
conditions, however changed, are sufficient to account for them.
Still less does he connect them with the effort or aspirations of
any organisms after new faculties and powers. He frankly
confesses that 'our ignorance of the laws of variation is
Welcome to our website – the perfect destination for book lovers and
knowledge seekers. We believe that every book holds a new world,
offering opportunities for learning, discovery, and personal growth.
That’s why we are dedicated to bringing you a diverse collection of
books, ranging from classic literature and specialized publications to
self-development guides and children's books.
ebookbell.com