Lab Assignment 2
Picking Sides in the Editor War
&
Getting Your C++ Legs
Introduction
============
Last week's lab introduced you to the UNIX environment. The main
goal of lab 1 was to give you a chance to play with the environment.
In this lab, we will begin writing C++ code.
The first step in this process is to "Choose your weapon", namely
your text editor. The text editor is where you will spend most of
your time when programming. After all, a program is nothing but
text. There are many choices available to you in the realm of text
editing, all with varying levels of complexity. The choice of
editors is entirely up to you. I will have no way of testing which
editor produces your source files. I strongly recommend that you
use either vi or emacs as these editors come with built in
capabilities to help you format and read code. Generally,
programmers in UNIX tend to use one of these two editors. In the
guided part of lab, you will be writing two programs. For the
first, you will use vi. For the second, you will use emacs. These
instructions will guide you through the basics of using these
editors, and help you get a feel for which you prefer. After you
complete the guided section, you should be able to edit and compile
code.
After you have made your choice of emacs... er, I mean after you
have selected your text editor, it will be time to step out and
write your first program. You will be provided with a skeleton of a
procedure, but all the code and ideas will come from you. Savor
this moment, for it is the first time you will go from a blank
editor screen to a running program. To paraphrase Obi-Wan Kenobi,
you are about to take your first steps into a larger world.
Part I: Choosing Your Text Editor (Guided Lab)
===============================================
In this part of the lab, we will take a look at the major text
editors which are present on most UNIX systems. I will guide you
through the use of two editors, emacs and vi. Before that, however,
it is worth noting that these are not your only choices. So before
the lab procedure, here's a rundown of UNIX text editors.
Common Editors
--------------
* ed
ed was one of the earliest end user programs to be used on UNIX
systems. This editor was created in 1971 by Ken Thompson. This
editor contains many advanced features and went on to influence
later editors. It was designed for an era in which UNIX
terminals ran the gamut of devices. In fact, ed can be used on
a teletype machine (basically a typewriter connected to a
computer). As such, ed is not a visually interactive editor.
After all, how can you be interactive when your output is
printed on paper?
ed is a modal text editor. This means that ed's responses to
input depend on which mode you are in. There are 3 modes:
1. command - commands are entered in this mode. Example
commands are a for "append text" or e for
"edit file"
2. input - text is entered in input mode
3. view - the contents of the file are printed to the
screen. You can print out the entire file,
sections of the file, or single lines of the file.
If you are interested in learning how to use ed, you can read
its man page by typing "man ed" at the command prompt. ed is
definitely an ancient text editor, and is really only mentioned
here for historical purposes. However, you can gain some
serious geek cred if you learn ed. Few people under the age of
50 know how to use it. Those that do know how to use it have
found it useful in situations where no terminal emulation was
available.
* vi
vi is the grandchild of ed. The lineage goes ed -> ex -> vi.
The name is derived from the command which switched ex into
visual mode. vi is a screen oriented editor, meaning that it is
interactive and designed to be run on a screen, rather than on
paper. vi first appeared in 1976, though very few people still
use this version of vi directly. There are several variants of
vi available, with the most important version being vim (VI
iMproved). When you run the vi command, on most systems, you
will actually be running vim. vim first appeared in 1991, and
contains the original features of vi plus the ability to extend
and customize the editor. For more information see "man vim" or
run "vimtutor".
Like ed, vi is a modal text editor. It consists of two modes:
1. Command - commands, mostly single character, are entered
in this modes. Examples are 'i' - insert, 'a' -
append, 'j' - move down, 'k' - move up, 'h' -
move left, 'l' - move right.
2. Insert - in this mode, you are inserting text. What you
type is what is added to the file.
When vi starts, it starts in command/normal mode. You enter
insert mode by typing either 'i' or 'a' as needed. to switch
back to command mode, you press ESC. Note that all of the
commands in vi are accessible without taking your hands out of
the correct typing position. In a true coder's mind, anything
which pulls your hands off the home row keys is an error. Arrow
key usage is bad, the mouse is a catastrophe! The only thing
that is a stretch in vi is finding the ESC key, but if you go
the vi route, you'll soon be able to find that key at speed.
vi is incredibly powerful and includes features like regular
expressions, repeated commands, text buffers, and (in vim)
multiple windows.
Vim knows most programming languages, and so it provides
features like syntax highlighting and auto-indentation. This
will help you spot errors and write readable, well-formed code.
vi has a steep learning curve because most modern computer users
are not used to the modal operations. However, once you do
learn vi, you will be able to rapidly edit text and less
featureful editors will start to feel like toys. With a couple
weeks of practice, you will be a natural. The next time you
open up a different editor, you'll probably type about 20 j's at
the top before you realize that you aren't in vi. You'll also
begin to eye your classmates who chose emacs with suspicion.
* emacs
emacs came into being in 1976. It was originally written by
Richard Stallman, and was based on the TECO editor. This was
one of the first programs to become part of the GNU project. It
was written in a combination of C and lisp. emacs is a highly
extesnible editor, and can really do more for you than text
editing. You can start emacs and stay there all day as you can
read email, write email, organize your life, browse the web,
access the shell, and more from right inside emacs. Emacs is
one of the most extensible programs ever written. Its
extensions and configuration files are written in a variant of
lisp called "emacs lisp" so really, if you can program you can
make emacs do whatever you please.
Unlike the line of ed, emacs is not a modal text editor. The
idiom it uses for input is sequences of key chords. A key chord
is when you press 1 or more keys at the same time. Generally
emacs key chords are 2 key presses and center around the Ctrl
and Meta keys. On most keyboards, the meta key is the ALT key.
Like vi, emacs key chords are written so you don't have to
remove your fingers from the home row keys. Also, because it
usually does not use ESC, people tend to be able to enter
commands quite quickly.
When you look at emacs commands on a cheat sheet and in the
documentation, you will see things like this: C-x C-s This means
hold down control, press x, release. Hold down ctrl, press s,
release. In other words, when you see a dash, you push both
keys simultaneously, and when you see a space, you release the
keys before going on to the next. A common mistake is to try to
push Ctrl, x, and s at the same time, which is difficult and
does nothing. If you have a senquence of commands using the
control key (or the alt key) you can continue to hold the ctrl
throughout the command. For instance, the above example could
be executed by holding Ctrl, tapping x, tapping s, then
releasing control.
Emacs is auto-documenting, and anytime you need help you can
press M-x and then type "help" followed by enter. (M-x means
Alt and x). This is the number 1 goto to get help with emacs.
Also, pressing M-x and then typing "info" will give you access
to an extended manual system from which you can learn about
emacs, as well as most of the system.
Emacs knows most programming language, and so it provides
features like syntax highlighting and auto-indentation. This
will help you spot errors, and write readable well-formed code.
Emacs can have a steep learning curve, mainly because it has an
overwhelming number of features. However, with just a week or
two of practice, it will become second nature to you. You'll
probably start locking up other editors when you hit the key
chords that they don't understand. Fortunately, you can use
emacs for everything, so you can stick with what you know. In
time, you will take a look at the vi users and think that they
are suspicious of you. They are, of course, right. Emacs users
are plotting against them. In fact, we've even implemented vi
in emacs-lisp, and that editor is called viper! (M-x viper-mode)
* nano
nano is about as close to notepad as your going to get on a
UNIX system. It is designed to be easy to use, though it does
this at the expense of features. Nano is a re-implementation of
a program called pico, which is part of the pine email program.
nano is not modal, and it only has single stroke commands. All
nano commands start with control. When you see these written
out they will be things like ^x, meaning "press Ctrl x", which
is the most useful nano command (exit).
Nano generally has a low estimation of its user's memory
capacity, and so it constantly takes up the bottom two lines of
the screen explaining how to use nano. Nano has virtually no
advanced features, though it can do some rudimentary syntax
highlighting.
Nano is for normal people who want to send email and write text
files. It is well suited for that purpose because it is easy
for normal people to use. While it is very easy to learn nano
itself, it's lack of programming features will make your life
harder if you try to code in it. Also, other computer
scientists will giggle behind your back if you use nano to code.
It's there if you refuse the other editors, but I do not think
it a very wise choice, though you are welcome to use it.
* cat > file
Ok, this is not really an editor, but I thought I would mention
it as being the most minimalist way to enter text. cat reads a
file and prints it to the screen. If you call cat with no
argument, it will just repeat whatever you type in stdin to
stdout. If you redirect this to a file, as in the above case,
it will allow you to type text which the system will then save
to a file. Pressing C-d will exit the program.
The major drawback here is that you have no way to change text.
Even text entered on the same line cannot be changed. If you're
the sort of person who does everything perfectly the first time,
then cat is your "editor" of choice!
I mention it here for one reason. Back in my undergrad days, we
used to compete with each other by seeing who could write the
most elaborate program using only cat. This involved writing
the code in our heads, and then simply entering it into cat. We
usually played this game with a time limit of 15 minutes for
text entry. I would like to see this tradition continue.
Enjoy!
Procedure
---------
In order to explore which text editor is right for you, we will now
try them on. This procedure should be carried out on a UNIX system. So
after you have logged in, follow along!
VI
--
1. Create a directory to store this lab. Name it lab2-1. Refer to
your lab sheet from last week if you don't remember how to do
this.
2. Change into the lab2-1 directory which you have just created.
3. We will start off with vi. As luck would have it, vim has a
built in tutorial. To access it, type "vimtutor" at the command
line and press enter. This will launch vim with a text file
loaded containing several lessons on the use of vim. Follow the
directions as listed. Note that when directed to save the file,
you should save it as "TEST-VI" just so it stands out as being
from vi. This file should contain your edits and will be
submitted at the end of the lab for a grade. Finish the entire
tutorial before moving on to the next step.
Normally, starting vim can be done by simply typing "vim" or
"vi" followed by the filename. This will launche the terminal
version of vim. If you prefer a GUI, you can try "gvim" or
select it from the application menu.
4. Using what you learned in step 3, use vi to create a file named
hello-vi.cpp. To do this, type "vi hello-vi.cpp".
5. Now we are going to enter your first program. Traditionally,
this is the hello world program. We are going to enter this
program, compile, and then run it. You should know how to enter
the program using the lessons you learned in step 3. So enter
the following code before continuing.
#include <iostream>
using namesapce std;
int main(void)
{
cout << "Hello, world!" << endl;
return 0;
}
6. Save the file and exit vi.
7. Compile the program for execution. We do this by invoking
g++. There are two ways to do this. The simplest way is to
execute:
g++ hello-vi.cpp
This will result in an executable file named a.out. Go ahead
and run this command and then do an ls to see that a.out was
created. If g++ returns an error, open the file back up and
try to fix the error.
8. You can execute the program by typing ./a.out. Go ahead and try
that.
9. Now, usually we don't want to create programs named a.out. We
could use mv to rename the file, but a more elegant solution is
to have g++ generate the file of our choice. We do that with
the -o option. Go ahead and try that out:
g++ hello-vi.cpp -o hello-vi
Now do an ls. Notice the hello-vi file? Try running it!
NOTE: Be very careful with this. A common mistake would be to
type something like "g++ hello-vi.cpp -o hello-vi.cpp". DON'T
do this! What will happen is g++ will overwrite your source
file with the binary. You'll be able to run your program, but
your source code will go into the bit bucket from whence it can
never be retrieved.
10. Now we are going to edit hello-vi.cpp. Add a line of code under
the line which prints "Hello, world" to print "VI rocks!".
HINT: This is a cout line. Also, this line must be before the
return 0.
11. Compile and execute your modified program.
Emacs
-----
11. Now we are going to move on to trying out emacs. Fire up emacs
by typing "emacs -nw" and pressing enter. Press q to get past the
welcome screen. Then type M-x (that's Alt + x) followed by
"help" and press enter. When prompted for the topic, press t to
begin the tutorial. This is pretty much the same thing as what
vimtutor did, though it will take you through a bit more
information about emacs. Be sure to save the tutorial file
before you exit. Name this file TUTORIAL-EMACS. It should
include your edits and it will be submitted at the end of the
lab for credit. Finish the entire tutorial before proceeding.
Emacs, just like vim, has a GUI available. To access it, just
type "emacs" instead of "emacs -nw" at the command line. The
"-nw" literally stands for "no window".
12. Now we are going to write some code with emacs. Create a file
called "hello-emacs.cpp". If you are still in emacs, you can do
this with "C-x C-f hello-emacs.cpp" If you are not in emacs any
longer, you can do this from the command line by typing "emacs
hello-emacs.cpp" and pressing enter.
13. Enter the same program we entered in step 5.
14. Compile this code giving the executable the name "hello-emacs".
Refer to earlier steps if you need help compiling the code.
15. Open the source file up again. Before we alter it, I want you
to see how you can run the shell from within emacs. The emacs
tutorial showed you how to suspend and resume emacs, but there
is an even better way. Once emacs is open, and you are looking
at your beautiful hello world example, type "M-x shell". This
will open the shell in an emacs buffer. Now, switch back to
your hello-emacs.cpp buffer.
16. Alter the program by adding a message after the hello world
message. This is a lot like what you did in the vi section,
except this time you'll print out "Emacs rocks!". (Both
statements are true. Both of these editors give you phenomenal
power!)
17. Switch back to the shell buffer, and then compile the code. Run
your program in the shell buffer. Note how nice it is to switch
back and forth!
Next Steps
----------
18. Now, take a moment to reflect on these two editors. Which
seemed right for you? If you can't decide now you can always switch
back and forth. Your source code files are the same regardless
of what you chose to create them with. Not to sway your choice
or anything, but try these things out in emacs:
M-x snake
M-x zone
M-x dunnet
The key to learning these editors is a matter of exploration.
For vi information, see the vim homepage
http://www.vim.org, for
emacs, see the help pages as well as the emacs wiki
http://www.emacswiki.org.
If you want to really get your edit-fu going, you are going to
want to learn regular expressions. A good starting point on
this path is to do a quick web search for "A Tao of Regular
Expressions". Both vi and emacs support using regex to really
empower your editing. You don't have to learn it right now, but
if you are bored and curious, have a look!
Turn in the Guided Lab
======================
1. Start a script file named lab2-1.txt
2. List your current directory.
3. Display the contents of both your cpp files.
4. Compile both versions of the program.
5. Run both versions of the program.
6. End the script and submit it to the lab2-1 assignment on The Tartan.
That's it for the guided part. Now on to the code which you will
write yourself!
Part II - Barometers are Falling!
=================================
PROBLEM
-------
A physics professor asked one of his students, "How could
we determine the height of a building using a barometer?" The
student replied, "I could tie a string to the barometer and lower
it to the ground from the top. Then I could measure the string."
The physics professor chuckled and said, "I want a more physics
based solution." The student then said "Ok, I could drop the
barometer from the top of the building and then time its decent and
then calculate the height using the formula d=(1/2)*g*t^2. That's
brilliant!" Much to the professor's horror, before he could
correct his student the boy snatched the professor's prized
barometer and raced to the stairs.
Now, we know the professor is going to lose his barometer, so the
least we can do is to help him make the most of it. We are going
to design and implement a program which will measure the height of
the building in terms of barometric catastrophe. A sample run of
this program might be:
---- begin sample run ----
Drop your barometer.
How long was it until you heard a crashing sound (in seconds)? 2.5
Your building is 30.65 meters tall.
Now, you do realize that barometers are filled with mercury,
right? Call the EPA NOW!
---- end sample run ----
Procedure
---------
1. Write out your pseudocode for how you are going to implement
this program. Your pseuedocode should include a listing of the
program's inputs, outputs, and the steps it performs. Also,
during this part of the program, you'll want to identify the
proper variable types for your inputs and outputs.
2. Set out a series of test cases (at least 5). Test cases should
include a series of example inputs and the expected
outputs. (see hints for how to do the math)
3. Using your favorite text editor, type out your pseudocode and
test cases into a text file named "lab2-2-test". Now, run
~relowe/turnin
You have no program yet, so just type exit when prompted for the
compile. This is lab2-2-pseudocode.
4. Write your program in c++. Compile it, test it. Once it all
works, create a script file (lab2-2.txt) which contains the
following:
- A listing of your program (cat your .cpp files)
- A listing of your pseudocode. (cat your txt file)
- Compile your program.
- Test runs of your program.
Submit your script file to The Tartan under lab 2-2.
HINTS
-----
- We want to make the program give output in meters. Therefore, our
gravitational acceleration constant is g = 9.81 m/s^2. I would
recommend creating a constant for g.
- C does not have an exponent operator, therefore t^2 should be
written as t*t.
- The above example was computed as follows (in algebra, not C++):
d = (1/2) * 9.81 * 2.5^2
= (1/2) * 9.81 * 6.25
= 30.65625
END NOTE: This document was completely typed using emacs. It is a
plain text document, and so it should be readable on virtually every
computational device known to man!
Copyright (C) 2014 Robert Lowe
This work is distributed under a Creative Commons
Attribution-ShareAlike 3.0 Unported License (CC BY-SA 3.0)
For more information, see
http://creativecommons.org