Building C++ Program ##################### .. include:: /header.inc Now, some of you, who might have programmed in a language like C++ before, might think these is nothing in this lecture that will be of interest to you. You will just head off to some :term:`IDE` and type away. You are very wrong. We will work through a complete project, starting with nothing but a few basic tools, and end up with a program that demonstrates all of the basic skills you need to master to call yourself a programmer. Some of what you work through in this lecture will definitely be new, so pay attention! .. note:: We will use a number of tools for this exercise. I will not explain everything you need to know about those tools in this lecture. Instead, I will show you only those features you absolutely need to know to build this project. .. note:: If you are new to C++, do not worry. We will go over all of this in much more detail as we learn that language. The Problem *********** We are going to create a program that adds up a bunch of numbers stored in a file. Just to make it interesting, I only want to add up every other number from the file! We will work through this problem as though it is an important project. Maybe even one you get to set up during a job interview! Step 1: Open up a Command Prompt Window *************************************** How you manage to get a term:`command line`` window depends on your system: On a PC, you do this by launching a program called ``cmd.exe``. You can find it on a Windows 10 machine by typing in "cmd" in the search box at the lower left of your screen. You can also find it by scrolling through the list of applications on your system, under ``Windows System -> Command Prompt``. Once you launch this program, right-click on the new icon on the "Task Bar" which is probably at the bottom of your screen. Select "Pin to taskbar" and this icon will remain on the screen. You can simply click on it to launch the program again. On a Mac, you launch the "Terminal.app" application, which is hiding in the "Applications/Utilities" folder. When you right-click on the icon on a Mac, look under ``Options->Keep in Dock`` On Linux, launch the "Terminal" program. On Ubuntu, right-click on the desktop, and select "Open Terminal". Once again, you can right-click on the icon on the left side of the screen and select ``Add to Favorites`` Customize the Window ==================== I do not know what you like to look at, but I find the black background on these windows painful. On some systems, the font is too small to read comfortably. You can set things up to suite your tastes by doing the following: PC Command Prompt ----------------- Right-click on the title bar at the top of the window. Select ``Properties``. The tabs at the top of the window that appears let you tune things so the window looks the way you prefer. I usually tweak the font size and the colors so I end up with a light background, and dark letters. Since I often project my desktop windows in class, I tend to overdo this sometimes. You get to decide! You will be staring at this window a lot in this class. Mac Terminal Window ------------------- On the Mac, select ``Terminal->Preferences``. There are many settings you can play with here, but I usually just set up the font under the ``Text`` tab. Again, you should look around and tune this window to suit your style. Linux Terminal -------------- On Ubuntu Linus, select ``Edit Preferences`` to get to the place where you set things up. I usually tweak the font, and use a pre-defined color scheme. Uncheck the ``Use colorsfrom system theme`` and select one of the themes to see how it looks. I use ``Solrized light`` on my Mac systems. Where am I? =========== Hopefully, you understand how the file system on your machine is set up. On a PC, there is a file system on every drive on your machine, and each drive is identified with a single letter. The ``C`` drive is normally where you will work. .. warning:: If you use a lab machine, you will be working on your ``H`` drive. We will discuss that in class. On Linux/Mac machines there is no drive letter to deal with. All systems use a single letter, called a :term:`path seperator` to show you where something is located on your system. The separator on Linux/Mac is a forward slash, on a PC it is a backward slash. After we get going in this project, I will be using Linux/Mac notation. File System Paths ----------------- Your file system is made up of directories and files. .. note:: Microsoft insists that we call a directory a :term:`folder`. Their thinking is simple, most people are familiar with the filing system found in an office, so why not use that termnology. I flop between the two terms a lot. The :term:`root directory`` is the top most directory on your system. It is named with just that :term:`path seperator` character. Inside that directory you will find other directories and files, each with a unique name. Inside each of those sub-directories, you will find yet more folders, and possible more simple files of some sort. The :term:`path` to any directory or file on your system is made up of a series of directory names, possible ending in a file name, with the term:`path seperator` character between each part. .. warning:: Linux and Mac systems are case-sensitive. You must use proper case for each name for it to be recognized. The PC could care less. Do yourself a favor, and pay attention ot case no matter what system you use! Once you have the window looking the way you like, it is time to look at this command line`` and see what it tells us. Home Directories ---------------- By default, you are ready to work in your :term:`home directory`. That place is named with your user account name. Supposedly, you are supposed to store all personal files insife of this directory. However, you probably own the machine you are using, so you can put things in other places. We will pat attention to where we put things as we start working! Here are the standard locations for the :term:`Home Directory`: * PC: ``C:\Users\account_name`` * Mac: ``/Users/account_name`` * Linux: ``/home/accountname`` Looking Around ============== Let's fire up a simple command and see what is currently in our :term:`Home Directory`: PC Systems ---------- .. code-block:: bash C:\Users\rblack> dir COlume in Drive C is OS Volumw Serial NUmber is B497-D1BE Directory of C:\Users\rblack 12/07/2018 11:01 AM . 12/07/2018 11:01 AM .. 11/18/2018 07:19 AM Contacts 11/18/2018 07:19 AM Documents 11/18/2018 07:19 AM Downloads 11/18/2018 07:19 AM Pictures I left off a bunch of other entries. Notice that we see the time and date when this particular entry was created. We also see a marker ("") indicating that this entry is a directory. Then we see the name of that entry. Notice also the first two lines in this listing. The "dot" and "dot-dot" names are special on all systems. "dot" is an alias for the current directory (the one you are working in). "dot-dot" is an alias for the directory above this one. These aliases help in forming the path to a file or folder you want to work with in commands. Linux/Mac Systems ----------------- .. code-block:: bash rblack@MacTex ~ -> 03:46 PM Fri Jan 18$ ls Applications Dropbox Public Desktop Downloads Pictures VirtualBox VMs acc Again, I left off some entries from my system. I have customized my "prompt" so I can see useful information, and give me more room to enter commands. The actual prompt is on two lines. The first shows where I am at the moment (this is called the :term:`current working directory`). The second line shows the current time and date, which is useful when I capture this display for my notes, for example. The last character on the second line is the actual prompt character on these systems, the dollar character. .. note:: From here on out, I will shorten the entire thing to just that single dollas character. I will only show PC examples where things are different. Hidden Entries -------------- Where are those two entries with the funny names? Linux/Mac systems hide entries with names that start with a dot. They are there, but we need a different command to see them: .. code-block:: bash $ ls -a On a PC, you need to do this to see all the hidden entries: .. code-block:: bash C:\Users\rblach dir /a Detailed Directory Listings --------------------------- Finally, there is a longer form of the ``ls`` command on Mac/Linux. The result looks more like that seen on the PC and has more useful information. Here is a partial result from my system: .. code-block:: bash $ ls -al total 512 drwxr-xr-x+ 72 rblack staff 2304 Jan 18 14:28 . drwxr-xr-x 7 root admin 224 Jan 9 20:44 .. -rw-r--r-- 1 rblack staff 857 Dec 12 05:11 .bash_aliases -rw------- 1 rblack staff 7036 Jan 18 13:09 .bash_history -rw-r--r-- 1 rblack staff 164 Nov 10 07:17 .bash_id -rw-r--r-- 1 rblack staff 696 Aug 8 16:20 .bash_profile -rw-r--r-- 1 rblack staff 115 Oct 23 18:24 .bashrc drwx------ 8 rblack staff 256 Dec 11 08:49 .ssh -rw-r--r-- 1 rblack staff 308 Dec 8 06:49 .vimrc drwx------@ 3 rblack staff 96 Jan 3 16:35 Applications drwxr-xr-x@ 4 rblack staff 128 May 21 2018 Books drwx------+ 7 rblack staff 224 Jan 12 15:29 Desktop drwx------+ 17 rblack staff 544 Jan 17 08:53 Documents That pile of characters at the start of each line tells you a lot of important information. If the first character is a "d, the entry is a directory name. If it is a dash, it is a normal file. The next 9 characters are permission indicators. These characters are in three groups: "owner", "group", and "other". The "owner" of the entry, the one who created it. The "group" is a special list of other users of this system with permission to access this entry. Many folks create groups when they set up a team for a project. (We will not get into that here.) The owner and group names are shown after this set of permission bits. The "other" permissions define the permissions for any other user of this system. The three characters define "read", "Write", and "execute" permissions. The last items on each line identify the size of the entry in bytes, the date and time when it was created, and the name of the entry. Phew! Creating a directory ==================== We need a place to store all work for this class. Yes, you can put things anywhere you like, even on that "desktop", but you really need to start managing your system intelligently. Let's create a folder for this class and store everything we do for the class in that directory! .. code-block:: bash $ mkdir cosc2325 We also need to set up a folder for each project we create for this class. Each project needs a decent name, so let's call this first project ``OddSummer``. (Sounds catchy enough!) .. warning:: You absolutely must create separate folders for each project. You should never trash a project to build another one. You will be very happy you can still get to an old project and see how things were done later in your work. In this class, each project you want to have graded must be in an appropriate directory, with a name I specify on the assignment. .. code-block:: bash $ cd cosc2325 $ mkdir OddSummer $ cd OddSummer Changing Directories ==================== The ``cd`` command changes your :term:`current working directory`` to the new directory you name after this command. On a PC, if you run ``cd`` by itself, you will see the full :term:`path` to the :term:`current working directory`. On Linux/Mac, typing "cd" as a command will return you to your :term:`home directory`. If you provide a new directory name (or a path) to the new directory you want to work in, the system will move you to that directory. Your prompt will change to show you where your are. This is where the "dot" and "dot-dot" aliases are helpful. On my system, I have directories for each class I teach. If I am in the ``cosc2325`` directory, and want to move to the ``cosc1337`` directory, which sits beside the current one, I would use this command: .. code-block:: bash $ cd ../cosc1337 The "dot-dot" says go up one level, then down into ``cosc1337``. Neat! .. note:: You can always use the full path to a new directory, starting with the :term:path seperator` character (not the drive letter though! On a PC, if you want to move to another drive, just type in the drive letter followed by a colon. Ready to Code? ============== Not quite. Let's see if all the needed development tools are ready for use. Try this (after you go through the tool setup process we discussed in class!) You should see output similar to that shown below. (Your output will surely be longer) .. code-block:: bash $ g++ --version Apple LLVM version 10.0.0 (clang-1000.11.45.5) If you get a response like this: .. code-block:: bash $ g-- -bash: g--: command not found This means you either have not installed this tool (there is no such "g--" tool), or the program is installed, but the program file cannot be found in the :term:`system PATH``. Go back to the tool installation notes and make sure you followed them correctly. Continuing: .. code-block:: bash $ make --version GNU Make 3.81 $ git --version git version 2.17.2 (Apple Git-113)