Lab09 is our first experience with C++. We'll see how working with C++ differs from working with MATLAB—and, more generally, how working with a "compiler" is different from working with a language that has an interpreter
Details:
A special note should be made about the use of the words script file in this lab.
When working with MATLAB, the word script file refers to a special kind of M-file, namely one that just contains a sequence of MATLAB commands to be carried out in order to solve a problem. We distinguish script files from the M-files that define functions.
We talk about diary files as the files where we keep a record of what we did in a particular MATLAB session
However, when we work with C++, when we refer to a script file, we are talking about a record of our work, i.e. the same thing we call a diary file when working with MATLAB.
Please make a note of this!
C
and another called +
. However, it is only necessary to show that you can access one of these to get full credit for the lab.
Before starting this lab:
Create a new subdirectory ~/cisc106/lab09, and make that your working directory.
If you are not sure how to do this, then review the instructions from lab03, steps 1a through 1d.
The files for this week's lab are
/www/htdocs/CIS/106/pconrad/06F/labs/lab09
See lab04, step 1b and/or lab08 step 1b if you need instructions on how to copy those into your lab09 directory.
C++ Programming assignments in CISC106 (and later courses that electrical and computer engineers takes, such as CISC181, CISC220) are done on a computer called strauss. Strauss runs the Unix operating system. You access strauss through a terminal session.
To get a terminal session from a PC at home or in your dorm, you get to strauss using a terminal program such as the "Secure Shell Client" (that's what Dr. Conrad uses on his laptop in lecture.) On the Sun Rays, you use a program called "XTerm"
To open an XTerm terminal session on strauss, go to the upper left hand corner of the screen, select the "Applications" menu, then the submenu "Programming", then the option "Xterm on strauss". In this window, you'll be able to do all the Unix commands you've learned in lecture, and most of the ones that are mentioned in Unix textbooks.
An XTerm looks like this:
Note that if you accidentally select the Xterm option on the Applications menu that just says "Xterm" (plain old "Xterm", not "Xterm on Strauss"), you'll end up with an Xterm that is running on the SunRay servers (either Vivaldi, Haydn or Schubert.)
If you open an XTerm on Vivaldi, Haydn and Schubert, this will allow you to use the Unix commands that work with files. But, only the computer called strauss has the tools like emacs and the C++ compiler that you need to do C++ programming. Strauss is also the only computer with the MATLAB programming environment.
You'll very likely run into difficulty if you try to do your programming here; either the compiler wont be there at all (you'll get messages like "cc: command not found") or you might pick up some off-brand version of the compiler that works differently from what you are used to, confusing you no end. So, make sure you are programming on strauss, and no where else.
To check if you are on strauss, type hostname at the Unix prompt. If it doesn't come back with "strauss.udel.edu", you'll know you have an Xterm on the wrong machine.
Emacs is a text editor you can use to create files on a Unix system. So far, when using MATLAB on the SunRays, we've used the MATLAB editor—this editor is "built-in" to the MATLAB programming environment.
Emacs, by contrast, is a "general purpose" text editor. You can use Emacs to create files in any computer language, including C++, Java, JavaScript, FORTRAN, Perl, PHP, etc—as well as MATLAB files, for that matter.
In fact, if you do MATLAB assignments on strauss from home using the SSH Secure Shell Terminal program, Emacs is the editor that you use. I also typically use Emacs when showing MATLAB programming examples in lecture.
You can also use Emacs to create HTML files for the web, plain text files containing data, and for many other purposes. It is a kind of "swiss army knife" for dealing with files, and a very useful thing to know.
Yes. Basic proficiency with emacs is one of the learning outcomes for this course. There may be some basic questions about emacs on the next two exams. (You may substitute answers from vi, but that is the only acceptable substitution.)
If you've already used emacs, you may skip directly to step 4 of this lab.
vi
, is that ok?Note also that if, for whatever reason, you know already know the editor known as vi
, you may use vi
instead of emacs.
Otherwise, you should learn emacs
.
To start, open an XTerm on strauss (see step2 above).
strauss.udel.edu
. It does not have to be done on a SunRay. At the Unix prompt, type xemacs
. For more instructions on what to do next, open the following link in a new web browser window:
http://copland.udel.edu/~pconrad/UnixAtUD/EmacsTips.html
Once you are familiar with emacs, go ahead and use emacs to create a text file called lab09.txt
by typing emacs lab09.txt
at the Unix prompt, and then typing in information like that shown below.
When you type in this information, put each item on a separate line, and include
For example, Prof. Conrad's file would look like this (don't type in this information—type in your own!)
Phill Conrad Wilmington, DE Arizona pconrad
Be sure that your file ends with a blank line.
When you are finished, send the file to the printer in Willard 009 (the room where you have your labs) with the following Unix command:
qpr -q whlps lab09.txt
Or, if you are working closer to Smith Hall, you can use this command:
qpr -q smips lab09.txt
Note that it is not necessary to be logged into the Sun Rays to use these printing commands—you can type them from anywhere. Of course, you have to go to Willard or Smith to pick up your printout.
Unlike printing from Windows, for which there is a charge after a certain number of pages, printing from Unix is still free as of November 2006. As long as folks don't abuse this privilege, it will remain free.
Yes—use the following command:
kpr lab09.txt
As far as I know, this ONLY works from the SSH Secure File Terminal program on Windows. However, some TAs that require printouts may still require a printout from the qpr command, so that the cover sheet with your userid and the date is attached. Ask your TA what he/she requires.
xemacs
and emacs
are Unix commands to bring up the Emacs text editor. xemacs
tends to look a little nicer, and offer more options for things you can do with the mouse. xemacs
and emacs
can be used from a Windows machine at home or in a computer lab, by accessing strauss.udel.edu
using the SSH Secure Shell Terminal program. On the SunRays, bring up a web browser.
Now, access the web page: http://www.udel.edu/network. On that page, type in your UDelNet username and password.
You should see a screen that looks something like the following.
Click where it says "Change your Unix Default Group". That should take you to the following screen:
On the example screen above, you will see one of the items on this page is listed as CISC181010-18, which means CISC181, sections 010 through 018. What you should on your screen is the following:
2013 CISC106010-017
That is the group you should choose if you are in Prof. Conrad's CISC106 sections for Fall 2006. (If you are in a different class that is using Prof. Conrad's lab files, your instructor will guide you as to which group to choose.) The dollar amount listed might be something like $300 (in my case, it is $54,000, which is the total for everyone in the course.) We'll talk about the "money" in a minute; for now, just know this: it's not real money. It's just pretend money used to track computer usage. You wont get a bill for it. Ever.
In the drop down box shown, select "2013" and hit submit. You are now done with this step, which you should only have to do once per semester.
Let's come back to that $54,000. Because this example is from the instructor account, the "dollar amount" is huge. Your dollar amount as a student will be much smaller, but that's ok. The dollar amount will go down throughout the semester as you use strauss. It should not get below $50. If it does, contact your instructor immediately: he/she can request more "dollars" for your account. You can track your dollar amounts remaining by typing chdgrp
when you are logged into strauss.
Now we need to change your default login shell. Click where it says "return to the main page". Then click on the option for "Change your Unix Login Shell". That should take you to the following screen:
If your current Unix Default shell is csh, you should change it to tcsh by selecting /bin/tcsh from the drop down box, and clicking submit. You can then logout of the UDel Network page. This gives you command line editing (the ability to recall commands with the up and down arrows), as well as nifty things like file name completion (all of which your instructor will demonstrate in lecture.)
If your current Unix Default shell is tcsh, you don't need to do anything; you can log out of the UDel network page.
If your current Unix Default shell is bash, then you are probably already a confirmed "bash" user. The following paragraph is for you. Everyone else can ignore it.
Prof. Conrad writes: it is my intention to eventually migrate this course to "bash" rather that "tcsh". I acknowledge that "bash" is a better shell to teach. That being said, you might be better off using tcsh. The reason has to do with the "path" variable you need to get to the compilers. We've tested the commands to access them from tcsh, but not yet from bash. So consider switching your default login shell to tcsh, or "typing in" tcsh after you login to strauss each time. The remainder of this lab, and all further labs (until future notice) will assume tcsh. Until I figure out the new environment as it relates to bash, if you use bash (or any other shell other than tcsh), and your commands don't work, you are on your own to fix it.
If your current Unix Default shell is anything else, then read the paragraph above about bash, because it applies to you as well. Please considering switching to tcsh for the time being.
There is nothing to hand in for this step; your TA can check that you've switched your default login shell by using a script that checks this directly (via the finger command.) We'll also include some steps in a script later on to verify that you completed this step successfully.
Open a terminal window on strauss. In that windows, type the following:
> echo $PATH
You should see output such as the following. Yours wont' match the following exactly, but it will be in the same form:
> echo $PATH /opt/sfw/bin:/opt/tex/bin:/opt/texutils/bin:/opt/bin:/opt/SUNWspro/bin:/usr/open win/bin:/usr/bin:/usr/ccs/bin:/usr/ucb:/opt/X11R5/bin >
The command echo $PATH
tells the shell to print the value of a so-called environment variable called PATH
. This variable contains a "colon-separated" list of directory locations where Unix will look for executable programs when you type in a command. (Windows has a similar concept, and I imagine Mac OS X probably does as well.)
It is important for your path to contain the right list of directories so that you can access the compilers we will use in this course. The locations of the compilers change periodically as the compilers are upgraded to newer versions (to fix bugs, and to incorporate new features into the C and C++ languages). If your account was set up a while back, it may not have an up-to-date path.
There are several files that you can customize in your directory in order to modify your path. These files are typically stored in your home directory on unix (the one you are in when you first login, and the one you return to if you type cd
at the Unix command prompt.) These files have names that start with a period, which is how Unix implements the concept of "hidden files"; files that start with a period (e.g. .cshrc, .bashrc, .localenv, .emacs) do not typically show up in directory listings unless you specifically request to show hidden files.)
To list the files in your directory including hidden files, use the following command. Note that there is a space between ls
and -al
:
> ls -al -rw------- 1 pconrad 1173 3391 Oct 19 09:42 %backup%~ drwx--x--x 36 pconrad 4000 8192 Feb 8 20:51 . drwxr-xr-x 226 root other 8192 Feb 8 04:08 .. -rw------- 1 pconrad 4000 2090 Dec 7 10:39 .ICEauthority -rw------- 1 pconrad 0376 2401 Feb 7 16:40 .TTauthority drwx------ 2 pconrad 2265 4096 Mar 11 2004 .Trash -rw------- 1 pconrad 0376 13100 Feb 7 18:05 .Xauthority -rw------- 1 pconrad 4000 814 Jun 11 1996 .ab_library -rw------- 1 pconrad 1173 1894 Nov 9 15:21 .acrorc -rw------- 1 pconrad 1173 237 Nov 9 15:21 .acrosrch -rw------- 1 pconrad 4000 303 Feb 12 1998 .addressbook -rw------- 1 pconrad 4000 2399 Feb 12 1998 .addressbook.lu -rw------- 1 pconrad 4000 3071 Sep 20 1995 .article etc....
The file we are most interested is the file .localenv
. Type the command:
> emacs .localenv
You are going to add the following lines to your .localenv
file. Be sure to type them carefully; if you are off by even one character, this will not work:
if -d /opt/sfw/bin then setenv NEWPATH /opt/sfw/bin:$NEWPATH setenv MANPATH /opt/sfw/man:$MANPATH setenv LD_LIBRARY_PATH /opt/sfw/lib:$LD_LIBRARY_PATH endif if -d /opt/SUNWspro then setenv NEWPATH /opt/SUNWspro/bin:$NEWPATH setenv MANPATH /opt/SUNWspro/man:$MANPATH setenv LD_LIBRARY_PATH /opt/SUNWspro/lib:$LD_LIBRARY_PATH endif # make sure file ends with a blank line
Note: when you type in this file, it is important that the file be input exactly as shown here; follow all the punctuation, spacing, and upper vs. lowercase exactly.
In addition, it is important to add a blank line at the end of the file. If you fail to do so, you may get an error such as the following
then: then/endif not found.
In this case, one compiler or the other will likely not work.
(Full disclosure: to be precise, a blank line is not strictly necessary, but the file must end in a newline character. It may be difficult for a Unix beginner to know for sure if the file ends in a newline. Making sure that there is a blank line—or better yet, two or three blank lines—is one easy way to ensure that the file ends with a newline character.)
The .localenv file is a startup script for your shell written in the "C shell command language". If you are interested in learning more, this language is documented in the later chapters of the Andersen "Just Enough Unix" text used in CISC181. Here is a brief explanation that can suffice for the time being:
The first line, if -d /opt/sfw/bin then
tests whether the directory /opt/sfw/bin
exists or not; this directory contains files for the GNU C and C++ compilers known as gcc (for C programming) and g++ (for C++ programming.) The GNU compilers are "open source" compilers, written by volunteer programmers. If /opt/sfw/bin
exists, three setenv commands are y sused to set the values of three environment variables called NEWPATH
, MANPATH
and LD_LIBRARY_PATH
. These three variables control the path for executables, manual pages, and load libraries respectively (you'll learn more about all three of these over the course of the semester.)
The next few lines do exactly the same thing but for the directory /opt/SUNWspro
which contains the latest version of Sun's C and C++ compilers. These compilers are produced commercially by Sun Microsystems, the manufacturer of the strauss computer system. Until recently, these were closed source, proprietary compilers (they cost money). I don't know if that is still true or not; that may have changed. In any case, the development history of these two compilers is quite different. Although correctly written programs should produce the same results from both compilers, incorrectly written programs can produce very different error messages or error behavior. Comparing the results from both compilers can be very helpful in debugging, so it is important to be able to use both.
Once you have made the changes in the .localenv file, save the file and logout, then log back in.
You should then be able to do the following commands, and get exactly the results shown. These results indicate that you are able to use the correct versions of both the GNU and Sun compilers for both C and C++. If your output does not match that in the box below, review the .localenv file and try again, and/or ask your TA or instructor for assistance before proceeding.
> which gcc /opt/sfw/bin/gcc > which g++ /opt/sfw/bin/g++ > which cc /opt/SUNWspro/bin/cc > which CC /opt/SUNWspro/bin/CC >
The which
command tells you the full path of the file that gets executed if you type in a particular command. For example, in the script above, you see that if you type in gcc
, the actual file that gets executed is /opt/sfw/bin/cc
. You'll include the commands above in a script later in this lab; for now, once you are successful in getting the output above, you are done with this step.
cd
by itself. cd
stands for "change directory". If you type cd
by itself, this command will always return you to what is called your "home directory". When you type in the command, there will not be any output; it will appear that "nothing happened". But if you now type pwd
on the command line (which stands for "print working directory"), you will see the name of your home directory. On the composers (strauss, copland, etc.) the name of your home directory will be some series of letters and numbers, such as /home/usra/d9/55560
.ls
to list the files in your home directory. Notice what files are listed. You should already see the cisc106 directory that we created earlier in the semester.cd cisc106
. If you then type pwd
, you will see that you have moved into the cisc106
subdirectory. If you now type ls, you'll see all of the subdirectories for the labs we created earlier in the semester (e.g. lab09, lab02, etc.)cd
again, and then pwd
, and ls
. You will see that you have moved back up to your home directory. cd cisc106/lab09
to again move down into your lab09 subdirectory
In this step, you will enter the traditional "first C++ program" just to make sure that you understand how to create a C++ program, compile it, run it, and script it.
~/cisc106/lab09
with the command:cd ~/cisc106/lab09
lab09a.cc
that contains the following (except substitute your name and Unix user id for those of Jane Doe, and use today's date.) // lab09a.cc Jane Doe doej@udel.edu 09/01/04 CISC106 section 099
// traditional first program (Anderson, p. 383)
#include <iostream>
using namespace std;
int main(void)
{
cout << "Hello, world!" << endl;
return 0;
}
Once you've created this program, use the following command to compile it (compile means: translate from C++ into machine language, or it cannot be translated because of errors, report the errors) with one of the following commands. At this point in the semester, you may use either one (later on, I may tell you to use one or the other.) Note that the first command is CAPITAL CC, not lowercase cc.
CC lab09a.cc
OR
g++ lab09a.cc
The first command (CC) is a commercial compiler, supplied by Sun Microsystems. The second command, g++ is an open source compiler, supplied by the GNU project, which is staffed by volunteer programmers. From time to time, we may discover differences, but for now, I don't care which one you use. Sometimes if you have a tricky syntax error it is useful to try both, because sometimes one gives you more useful error messages than the other.
In both cases, a new file is produced called a.out
. To execute this file (run your program, type the following:
./a.out
You might be able to get away with just typing a.out
without the leading ./
, or you might not; it all depends on how your account is set up. (It has to do with the Unix concept of the "path"; we'll talk about this in lecture.)
If all goes well, you should see something like the following:
> CC lab09a.cc
> ./a.out Hello, world! >
You are now ready to use the script
command to make a record of your work.
Note that you must be careful when using the script command. The script command will wipe out your work if you are not careful!
The thing to remember is: on the command line, type script
followed by the name of a .txt file; for example:
script lab09a.txt |
This is correct!!!! |
Never put script
followed by the name of a .cc file. It will wipe out your .cc file!
script lab09a.cc |
WRONG!!! WRONG !!!! WRONG!!!! |
Ok, now that we have that out of the way...
Type script lab09a.txt. Then go through the following steps:
cat lab09a.cc
to do this.)CC lab09a.cc
or g++ lab09a.cc
to do this)./a.out
)exit
).more lab09a.txt
to make sure your script looks ok, and use the following command to print your .txt file. You'll be submitting this to your TA when you hand in this lab: qpr -q whlps lab09a.txt
And finally, you are done with Goal 4! We'll return the file lab09a.txt and lab09a.cc files in the final step of this lab, where you'll submit those to WebCT along with the files you create in Goal 5:
If you are not already there, change directory into ~/cisc106/lab09
with the command:
cd ~/cisc106/lab09
pwd
command to be sure that you are in the ~/cisc106/lab09
subdirectory. Then, use the following command to copy a program from Prof. Conrad's directory into your current working directory. BEFORE YOU TYPE THIS COMMAND, look over it carefully. You will notice that there is a space between the cp
and the /www
near the start of the command, and there is a space between the lab09b.cc
and a period ( .
) which is at the end of the command. Those spaces are very important, and the period at the end is especially important. Be sure you type the command exactly as it appears here:cp /www/htdocs/CIS/106/pconrad/06F/labs/lab09/lab09b.cc .
The cp
command in Unix is used to copy a
file. The file is copied from a directory under Prof. Conrad's
home directory. Note that ~
by itself refers to
your home directory, but ~pconrad
refers to
"pconrad's home directory". Similar, you can refer
to any user's home directory on strauss if you know that
user's login name; e.g. jsample's home directory can be
accessed via ls ~jsample
. pwd
(print working directory). So, since the current working directory is ~/cisc106/lab09
, we could also have done the same copy command using the following: cp /www/htdocs/CIS/106/pconrad/06F/labs/lab09/lab09b.cc ~/cisc106/lab09
.
is a nice shortcut.ls
command, and you should see the lab09b.cc file in your directory. Your next step is to list the contents of the file, then compile the program, and run the program. Before you look at the list of commands below (which do those three steps), see if you can figure out what you would type to accomplish this. Then scroll down and see if you were right.cat lab09b.cc
g++ lab09b.cc
./a.out
Did you get it right? Note: you could also have done more lab09b.cc
in the first step (if the file is too large to fit on the screen all at once), and CC lab09b.cc
for the second step. more
program: note that you should never use more
inside a script file; only use cat
inside a script file. The more
program is only for when you are looking at the file in "real time", not for scripts that you are going to print or submit electronically.emacs lab09b.cc
or vi lab09b.cc
) so that it converts, instead, from Celsius to Fahrenheit.
echo $PATH
which g++
which CC
cat ~/.localenv
cd ~/cisc106/lab09
pwd
ls
cat lab09b.cc
CC lab09b.cc
g++ lab09b.ccrepeat this step with several different inputs
./a.out
exit
to end the script
qpr -q whlps lab09b.txt
whlps
to smips
to print in the basement of Smith Hall, or prsps
to print at the Pearson Hall computing site. For the final version that you submit to the TA, you should always print in one of these places, not on your home printer.) Be sure that for your paper submission, all your pages are in the correct order (put your script lab09a.txt on top, and your script lab09b.txt on bottom), staple everything together, and write your name, email address, and (IMPORTANT!) your section number on the first page. These "submission details" are worth 10 points.
If you don't know your section number, at least write down what time your lab starts; your TA can figure it out from that. But LEARN YOUR SECTION NUMBER! You'll lose points if you don't put it on your labs.