Code Journal
Code Journal
is a free, biweekly newsletter on programming and computer science
provided jointly by Cprogramming.com
and AI Horizon. There is
also an archive
of all past issues on both websites.
This is the January
8th Issue
CODE JOURNAL:
Your Guide to Programming
January 22, 2002
In This Edition:
- Welcome to the Code Journal
- Standardized Article
- The Tower of Babel
- Common Questions
- Programming Challenge
- Errata
Welcome to Code Journal, a joint venture between
Cprogramming.com
(http://www.cprogramming.com)
and AI Horizon (http://www.aihorizon.com)
that aims to provide insightful articles on both C++ and algorithmic
programming. Code Journal is helpware: in return for reading it,
you
are asked to help someone else out with their own programming problems.
Good luck, and quick compiling.
---------------------------------------------------------
C/C++ Programming by Alex Allain
---------------------------------------------------------
Templates in C++
What's better
than having several classes that do the same thing to
different datatypes? One class that lets you choose which datatype
it acts on.
Templates
are a way of making your classes more abstract by letting
you define the behavior of the class without actually knowing what
datatype will be handled by the operations of the class. In essence,
this is what is known as generic programming;
this term is a useful
way to think about templates because it helps remind the programmer
that a templated class does not depend on the datatype (or types)
it
deals with. To a large degree, a templated class is more focused
on
the algorithmic thought rather than the specfic nuances of a single
datatype. Templates can be used in conjunction with abstract datatypes
in order to allow them to handle any type of data. For example,
you
could make a templated stack class that can handle a stack of any
datatype,
rather than having to create a stack class for every different datatype
for
which you want the stack to function. The ability to have a single
class
that can handle several different datatypes means the code is easier
to
maintain, and it makes classes more reusable.
The basic syntax
for declaring a templated class is as follows:
template <class
a_type> class a_class {...};
The keyword 'class' above simply means that the identifier a_type
will
stand for a datatype. NB: a_type is not a keyword; it is an identifier
that during the execution of the program will represent a single
datatype.
For example, you could, when defining variables in the class, use
the
following line:
a_type a_var;
and when the programmer
defines which datatype 'a_type' is to be when the
program instantiates a particular instance of a_class, a_var will
be of that
type.
When defining
a function as a member of a templated class, it is necessary
to define it as a templated function:
template<class
a_type> void a_class<a_type>::a_function(){...}
When declaring an instance of a templated class, the syntax is as
follows:
a_class<int>
an_example_class;
An instantiated object of a templated class is called a specialization;
the
term specialization is useful to remember because it reminds us
that the
original class is a generic class, whereas a specific instantiation
of a
class is specialized for a single datatype (although it is possible
to
template multiple types).
Usually when writing
code it is easiest to precede from concrete to abstract;
therefore, it is easier to write a class for a specific datatype
and then
procede to a templated - generic - class. For that brevity is the
soul of
wit, this example will be brief and therefore of little practical
application.
We will define
the first class to act only on integers.
class calc
{
public:
int multiply(int x, int y);
int add(int x, int y);
};
int calc::multiply(int x, int y)
{
return x*y;
}
int calc::add(int x, int y)
{
return x+y;
}
We now have a
perfectly harmless little class that functions perfectly well
for integers; but what if we decided we wanted a generic class that
would
work equally well for floating point numbers? We would use a template.
template <class
A_Type> class calc
{
public:
Type multiply(A_Type x, A_Type y);
Type add(A_Type x, A_Type y);
};
template <class A_Type> A_Type calc<A_Type>::multiply(A_Type
x, A_Type y)
{
return x*y;
}
template <class A_Type> A_Type calc<A_Type>::add(A_Type
x, A_Type y)
{
return x+y;
}
To understand
the templated class, just think about replacing the identifier A_Type
everywhere it appears, except as part of the template or class definition,
with the
keyword int. It would be the same as the above class; now when you
instantiate an
object of class calc you can choose which datatype the class will
handle.
calc <double>
a_calc_class;
Templates are
handy for making your programs more generic and allowing your code
to be reused later.
********************
Alexander Allain is the webmaster of http://www.cprogramming.com.
Contact him at webmaster@cprogramming.com
---------------------------------------------------------
Algorithms and Programming by Eric Suh
---------------------------------------------------------
The Tower of
Babel
The programming
community has tons and tons of languages to choose from,
but what's the difference? Why have tons of languages? Why can't
we all
settle down and choose just one?
These days, programming
languages are becomming more and more general and
all-purpose, but they still have their specializations, and each
language
has its disadvantages and advantages.
C++
is well-suited for large projects because it has an object-oriented
structure. People can collaborate on one program by breaking it
up into
parts and having a small group or even one individual work on each
part.
The object-oriented structure also allows code to be reused a lot,
which
cuts down development time by a significant amount. C++ is also
a fairly
efficient language - although many C programmers will disagree.
C
is used a lot, especially in game programming, because it doesn't
have
the extra packaging of the object-oriented C++. Programmers use
C because
it makes programs slightly faster and smaller than programs written
in C++.
You have to wonder, however, whether it's really worth giving up
the ease
and reuseability of C++ to get the small increase in performance
with C.
Pascal
is still mostly a teaching language, and not many industrial
programs are written in Pascal. Pascal uses keywords a lot instead
of
C-style braces and symbols, so it is a bit easier for beginners
to
understand than languages like C++. Still, not all people think
Pascal is
just for the schools. Borland, the huge compiler software company,
has
been pushing Delphi as an industrial strength programming language.
Delphi
is an object-oriented version of Pascal, and currently, only Borland
compilers use it.
Fortran
is a number-crunching program, and it is still used a lot by
scientists because the language allows variables of any size up
to the
memory limit of the machine. Fortran is especially convenient for
engineers,
who have to mathematically model and compute many different variables
to
large precisions. Fortran, however, isn't nearly the flexible language
that C++ or C is. Programming in Fortran is rigid, with strict rules
on
whitespace and formatting, which sometimes makes reading Fortran
programs
difficult.
Java
is a multi-platform language that is especially useful in networking.
Of course, the most famous usage of Java is on the Web, with Java
applets,
but Java is also used to build cross-platform programs that stand
alone.
Since it resembles C++ in syntax and structure, learning Java is
usually
quite easy for most programmers.
Perl
was originally a file management language for Unix, but it has become
famous as a CGI language. CGI (Common
Gateway Interface) is a term for
programs that web servers can execute to allow web pages additional
capabilities. Perl is great with Regular Expression Pattern Matching,
which
is a method (or tool) for searching text. So, Perl can be used for
databases
and other useful server functions, and because it is a scripting
language,
it is pretty easy to learn. Web Hosting Services prefer Perl over
C++ as
a CGI language because the Web Hosts can inspect Perl script files,
since
they're just text files, while C++ is compiled, so it can't be inspected
for potentially dangerous code.
LISP
is used mostly in Computer Science research. LISP is especially
handy
in programming abstract ideas because LISP is able to process a
data
structure called lists. Lists are like arrays, except lists have
no index
numbers. The syntax for lists is very simple, and so LISP programmers
can
manipulate these lists easily to implement complex structures easily.
Of course, there
are still many, many languages I still haven't covered,
(Prolog, Scheme, Tcl, Python, COBOL, Smalltalk, C#, etc.) but those
are
generally related or similar to the programming languages I have
described
above. You get the idea, however. Programming languages still have
their
advantages and disadvantages, so picking the appropriate language
for the
task is often an important step in the process of developing an
application
or program.
Now, if only I
had enough time to learn them all...
************************************
Eric Suh is the webmaster of AI Horizon (http://www.aihorizon.com/),
a site
devoted to Artificial Intelligence and Computer Science programming.
Contact him at webmaster@aihorizon.com
---------------------------------------------------------
Questions and Answers on Programming
---------------------------------------------------------
In response to the numerous emails Cprogramming.com receives, I
have
written an article on common programming mistakes. Due to its length,
it is available only online. Read it at
http://www.cprogramming.com/tutorial/common.html.
---------------------------------------------------------
Code Challenge
---------------------------------------------------------
At the end of
every issue we will issue a programming challenge and ask
people to submit their solutions within two weeks. The best solutions
will be published the next issue, along with a new challenge.
We only received
three responses to the challenge last week: congratulations
to Niels Voigt, James Turk, and Matthew Costuros for their quick
responses.
Source code available
at
http://www.cprogramming.com/source/nvxor.c
http://www.cprogramming.com/source/jtxor.cpp
http://www.cprogramming.com/source/mcxor.cpp
This week's challenge:
As towers seem
to be a theme this week, write a program to solve the Towers of
Hanoi problem.
Description of
the Towers of Hanoi:
The Towers of Hanoi is an old game, and the solution is a relatively
simple
algorithm to work out and program. In the game, there is a pyramidally
shaped
stack of disks placed onto a single shaft. There are two other shafts,
each
empty. The challenge is to move all of the disks from the first
shaft to the
third shaft.
Each disk is successively
smaller, and disks can only be placed on top
of larger disks. You are free to place any disk on an unoccupied
peg, but
after the first disk has been placed, only smaller disks can be
placed on it.
-|- | |
--|-- | |
---|--- | |
----|---- | |
Move these here
Particulars:
The program must be able to handle any height of disks up to eight;
the program should be able to output the intermediate steps as the
solution is
worked out;
the program should use some form of ASCII output for the representation.
Send your solution's source code to codejournal@cprogramming.com,
and you may
find it published (Note: due to length of code, solutions will be
downloadable
from the web rather than printed). Please include either your name
or an
identifying username so that we may attribute the solution to you
in the next
newsletter. If you wish, you may ask us to withhold your name.
---------------------------------------------------------
Errata to previous issue
---------------------------------------------------------
In the previous
issue we made two major mistakes:
Eric wrote that the fiftieth element of an array is accessed by
typing
employees[50];
He should have
written
employees[49];
As well, Alexander
wrote that C++ has no Exclusive-Or operator. It does,
however. ^ is the symbol for bitwise exclusive-or. Eg,
A^B;
We apologize for
these mistakes, and if we have made any errors in this
issue, please inform us.
---------------------------------------------------------
Suggestions and comments on this newsletter should be sent to codejournal@cprogramming.com
or codejournal@aihorizon.com.
Editors:
Eric Suh, webmaster@aihorizon.com
Alexander Allain, webmaster@cprogramming.com
To unsubscribe from this journal, send a blank email to codejournal-unsubscribe@mlm.cprogramming.com.
-----
Interested in advertising
with us?
Please read our privacy
policy.
Copyright © 1997-2005
Cprogramming.com. All rights reserved.