Post: Systems Development Engineer for R&D team
Salary: 16K upwards dependant on ability and experience
Company: SIMS Education Services Limited
Address: Priory Business Park, Cardington Bedford, MK44-3SG, UK.
Phone:
Contact: Andy McGowan or Declan Brennan
Phone: 01234-838080
Email:100116....@compuserve.com
Introduction
------------
The post is described in the section below. It is a systems development
opportunity of a type that is rare in the U.K. We would typically expect
this post to be filled by a new graduate. However a degree is not
essential.
Only ability matters. If the post is of interest, please take the time to
attempt some or all of the test below and email your solutions to us, along
with your C.V. Feel free to include other small samples of your code of
which
you are proud (provided this code is not confidential).
Description
-----------
SIMS, which is part of Capita Group PLC, is a company that produces a large
range of Education Management Software on DOS networks and unix platforms.
It is the foremost in this field in the United Kingdom and also supplies
its products abroad.
The company has produced a Rapid Application Development environment in C++
that facilitates the easy production of database applications for Microsoft
Windows operating systems. This environment is currently being used
internally,
but may be marketed externally in the future.
The post entails continuing work on this development environment in a
relaxed
friendly team. This work is exciting and rewarding, but also very
challenging.
The following skills are essential:
* Highly motivated and able to work under pressure.
* Interest in Systems development.
* Able to work in a team but also good at self-organisation.
* Good knowledge of C++ and Object Oriented Design.
* Excellent problem solving abilities and familiarity with standard
data structures.
* Knowledge of Windows API (16 or 32) or at least some other GUI
environment.
The following skills would be useful:
* Knowledge of Relational Database concepts
* Knowledge of a Client/Server database
* SQL
* Degree in a Science or Engineering Discipline.
* Experience with Visual C++
If you have the talent, commitment and energy to succeed, SIMS can offer a
substantial package, which comprises attractive salary, pension and private
medical cover.
SIMS offers good pay and conditions according to experience and skill
levels
and hence there are opportunities to progress in the technical side of the
IT industry. If you want to talk more, please give me a ring on the number
above or ask for Declan Brennan, who like me, would be delighted to talk to
anyone who feels that they have got what it takes to join us.
Programming Test
----------------
Note: This test is also available in printed form with better diagrams.
This can be faxed to you on request. Please email us if you require this.
Please attempt to answer all of the following questions. Give a brief
description of the algorithm used in each case and follow this with
outline code preferably written in C++ (or alternatively C or Pascal).
For questions 1 and 2, avoid calling too many string manipulation functions
for performance reasons. Question 5 is a database question for which a
short descriptive answer will suffice. Don't worry if you can't answer all
the questions or if you feel you have not answered some questions
completely.
This test is intended to assess how you approach problem solving in a
programming sense and so even partial answers are useful.
(1) Word Wrapping
Write a program to do word wrapping. The program should take two
parameters:
the name of the input file and the name of the output file. The input file
is a text file that has line feeds at the end of each paragraph. The output
file should be a text file with a line feed at the end of each line. Lines
should not exceed 78 characters in length and line breaks should only occur
between words. (You should assume that a monospace font is used to display
the text so every character is the same width.)
(2) A String Iterator
There is often a requirement to break up a string into its component parts.
Assume we have a string that is delimited by tabs:
char st[]= "This\tString\tIs\tDelimited";
Write an iterator that will return each part of the string in turn. On the
first call it should return "This", on the second call it should return
"String" and so on. Feel free to implement this iterator a simple function
or a class whichever is more appropriate.
(3) Sets
Assume a mathematical set is being represented by a 16 bit integer. The
presence of a particular element in the set is indicated by the appropriate
bit being set. Thus the set [2,7,13] would be represented by the integer:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 = 2^2+2^7+2^13= 8324
Define a C++ class to implement such a set. Its constructor should take a
single parameter, which is a string representation of the set for example
"[13,2,7]". Functions should be available to provide the union of two sets,
the intersection of two sets and the complement of a set (with the
universal set [0..15]). Ideally these functions should be implemented by
overloading operators such as '*' '+' and '~'.
If you want to show off provide an insertion operator to allow sets to be
send to ostreams. A further demonstration of programming prowess could be
achieved by extending the set class to cope with variable length sets,
perhaps by having an array of integers for the sets and an additional int
indicating how many elements are occupied (Note: complementing variable
length sets is not a trivial problem).
(4) Graphics using Box characters.
On an IBM-PC compatible's text mode display, box graphic characters are
represented by the following ASCII codes:
194 196 Top Left Corner 218
218 |----------|-----------------| 191 Bottom Left Corner 192
| | | Top Right Corner 191
| | 197 | Bottom Right Corner 217
195 |----------|-----------------| 180 Left Tee 195
| | | Top Tee 194
| | | 179 Bottom Tee 193
| | | Right Tee 180
| | | Cross 197
|----------|-----------------| 217 Horizontal Line 196
192 193 Vertical Line 191
(Don't be confused by limitiations due to this version of our test
being in simple ascii text format. We have represented the top left corner
as the character pair '|-' in our diagram. But on the screen this is a
single character 218. )
Each character position on the text screen is represented by a two byte
word. The character code is stored in the low byte and the display
attribute in the high byte (this is 7 for white on black). A screen of 25
lines by 80 characters is represented in memory by a continuous sequence of
2000 words, starting with the first line. Thus if the first line begins at
address: word* screen, the second line will start at address
word* screen+80.
You may assume that a pointer to the beginning of screen memory has already
been set up. Your task is to implement a box function. This function should
take 4 parameters corresponding to the top-left and bottom-right
co-ordinates of the box to be drawn.
Start by assuming the screen has been cleared to spaces, before box() is
called initially. How can your function be elaborated so that
intersections are handled correctly if box() is called a second time with
co-ordinates that overlap the first box ?
|-----------------| |---------------|
| | | |
| |---------|---------| | 195|----------|
| | |197 | | | |
| 197| | | | | |
|-------|---------| | |---------------|----------|
| | 193
| |
|-------------------|
These are two examples of overlapping boxes with four intersections in
total. To pick one: when a vertical line is drawn on top of a horizontal
line, we would expect a cross to result. Of course there are many
intersection possibilities and we don't want to limit ourselves to just two
boxes.
Ideally the boxes should be drawn by direct memory access to screen memory.
However if you are uncomfortable with pointer arithmetic, you can assume
the existence of functions for reading and writing to the screen.
typedef unsigned int word;
word getScreenWord(int line,int col);
void setScreenWord(int line,int col,word value);
(5) Implementing a hierarchy in a database table
Consider the issues involved in the implementation of a file and directory
browser. When invoked on a hard disk with four sub-directories in its root
directory, the list box in Figure 1 would be presented to the user.
C: C: C:
|--- APPS |--- APPS |--- APPS
|--- DOS | |--- EXCELL | |--- WWDOCS
|--- WINDOWS | |--- HG4W | | |--- JAN93
|--- WORD | |--- PM3 | | |--- FEB93
| |--- WWDOCS | | |--- MAR96
| | |--- TEST.DOC
| | |----ZEBEDEE.DOC
Figure 1. Figure 2. Figure 3.
If APPS is selected in Figure 1, the contents of the list box are replaced
as shown in Figure 2. In figure 2, if C is selected the listbox returns to
figure 1. If on the other hand WWDOCS is selected the listbox appears as
shown in Figure 3.
You may assume that you have available a function that will create a disk
based table (e.g. an xBase table or even a simple text file) with
appropriate fields (for example FILENAME and EXTENSION) and load it with
records reflecting the directory structure on the hard disk.
Please consider the implementation of a function: browseDirs(). This
function would take one parameter to indicate the initial default file. If
for example the default file was ZEBEDEE.DOC, we would expect browseDirs()
to present the listbox in Figure 3 with ZEBEDEE.DOC highlighted.
Describe the fields that would be required in the table in order to drive
this function.
One purpose of this tool might be to allow the renaming of files and
directories. Please consider the impact this might have on the structure of
the table and the browseDirs() algorithm.
Conclusion
----------
Thanks for taking the time to answer this test. We realise that a non
trivial amount of effort was required. However we have found that only with
a test such as this can we fairly assess applicants skills. We look forward
to hearing from you.