Programming Expert Only

profileJim_Ak
prog3.pdf

ECS 40 Program #3 (50 points, my time 1.5 hours) Spring 2015

Due: Wednesday, April 29th at 11:59pm using handin to p3 directory of cs40a.

New concepts: iostream, fstream, new, delete, and C++ . Name of executable: simulator.out

File names: Makefile, main.cpp, city.cpp, city.h, vector.cpp, vector.h, authors.txt.

For this assignment, you will 1) adapt your code to data files that have more than one city with the same name, 2)

converting your C code of p2 to C++, and 3) you will add the ability to list all of the traffic from a specific airport.

Adapting to the duplicated city names, should only involve readAirports(), readAirport(), and isEqual(), and is fairly

straightforward for each (total 5 minutes). Converting to C++ will involve: 1) replacing stdio.h function calls with

iostream and fstream function calls; 2) replacing malloc and free with new and delete; 3) removing #include of stdio.h,

and replace #includes of other C header files with their C++ counterparts; 4) changing the Vector struct to a Vector class;

and 5) changing the City struct to a City class. Listing airport traffic involves adding a getChoic() function to main.cpp

and a new method to Vector.

You may use either your own p1 code, or my p1 code from ~ssdavis/40/p1/SeansSrc (available Thursday morning) as

your starting point for the assignment. There is no problem with plagiarism if you use my code. You will find my

executable, and the two data files in ~ssdavis/40/p3. As usual, the format and values of your program must match mine.

To get traffic value into a more reasonable range you will now divide by 2500000000U instead of 250000000U.

Here is a road map to making the transitions. After each of the five steps your program should compile with no

warnings, and run perfectly. The road map is based on my own program, so you may wish to have my program handy

even if you are modifying your own p1.

1. Replacing stdio.h function calls with iostream and fstream function calls. (10 minutes) 1.1. Replace printf with cout statements. 1.2. Replace scanf with cin statements. 1.3. Replace FILE* declarations and assignments with ifstream declarations.

1.3.1. An ifstream may only be passed by reference. 1.4. Replace fgets with getline. Note that getline does not place the '\n' in the array. 1.5. Don't forget to add "using namespace std;" to any files with C++ header files.

2. Replacing malloc and free with new and delete. (5 minutes) 2.1. Remember to use delete [] to deallocate arrays.

3. Change all input/output to C++, and update standard header file #includes to C++ format. (15 minutes) 3.1. Remove stdio.h #includes, and add iostream and fstream includes only where appropriate. 3.2. Remember to add “using namespace std;” below the #include lists. 3.3. Change fopen() to an ifstream constructor, printf() to cout <<, scanf to cin >>, and fgets() to getline(). 3.4. Change all remaining #includes involving < > from <filename.h> to <cfilename>, e.g. <string.h> to <cstring>.

4. Changing the Vector struct to a Vector class (10 minutes.) 4.1. In vector.h

4.1.1. Change the typedef struct declaration to a class, and move the closing "};" until the line after the last function prototype in the file.

4.1.2. Remove the Vector* parameters from the function parameter lists. If it is "const Vector *" (e.g. in findDistance), then the whole function should be made const, by adding "const" after the closing ")" of the

parameter list.

4.1.3. Add "public:" to the class just below the variable declarations. Move the prototypes of any function(s) that are only called from Vector functions above “public” because they should be private.

4.1.4. Make initialize() the constructor for the class. 4.1.5. Make deallocate() the destructor for the class.

4.2. In vector.cpp 4.2.1. Remove the Vector* parameters from the function parameter lists, and make functions const that are listed

as such in vector.h.

4.2.2. Make each function a member of the Vector class using the scope operator, "::". 4.2.3. Make initialize() the constructor. Note that constructors have no return value. 4.2.4. Make deallocate() the destructor for the class. Note that destructors have no return value. 4.2.5. Delete all "cities->", or whatever you used for the Vector pointer identifier. This can be a simple search

and replace!

4.2.6. You will need to add just “::” in front of the call to City calcDistance() from Vector calcDistance() so that the compiler does not raise errors trying to make it a recursive call.

4.3. In main.cpp 4.3.1. Remove the Vector parameters from function calls of the Vector class, use the Vector object to call the

functions instead, e.g. readCities(&cities) becomes cities.readCities();

4.3.2. Eliminate the calls to initialize() and deallocate(). They will be called implicitly. 5. Changing the City struct to a City class. (25 minutes)

5.1. In city.h, follow the same steps as vector.h for the Vector class change. 5.1.1. Note that you should only remove the first City parameter from functions with two City parameters. 5.1.2. You will have to retain the deallocate() function for readAirports(), but make a copy of it for the destructor. 5.1.3. In order for "temp[i] = cityArray[i];" to work properly, you will need to have an overloaded assignment

operator for the City class.

5.2. In city.cpp, follow the same steps as vector.cpp for the Vector class change. 5.2.1. Note that when a parameter has the same name as a City data member you will have to change the name of

the parameter.

5.2.2. You will need to add the operator= code. 5.3. In vector.cpp, follow the same steps as main.cpp for the Vector class change.

5.3.1. There is no longer a need for the destructor to explicitly call City::deallocate because the City destructor will be called automatically.

5.3.2. There is no longer a need to call initialize(), since the constructor is called automatically. 5.3.3. The “::” in front of the call to City::calcDistance() should be replaced with “cityArray[index1].” 5.3.4. Note that your overloaded operator= should eliminate the need for cleanCities() to call deallocate().

6. Adding the ability to list all of the traffic from a specific airport. (25 minutes) 6.1. Add a function, getChoice(), to print a menu, and range checks the user's answer to main.cpp. You should use

cin.ignore(…) after you read their choice to eat up the '\n' that remains in the keyboard buffer.

6.2. run() will now need to call specific functions to deal with the two searching tasks. 6.3. Write Vector::calcAirportTraffic(). 6.4. Note that the order of the cities need not match mine, but number of cities, and their passenger volume must.

[@lect1 p3]$ simulator.out

Flight Simulator Menu

0. Done.

1. Determine distance and passengers between two airports.

2. Determine all traffic from one airport.

Your choice (0 - 2): 3

Your choice must be between 0 and 2. Please try again.

Flight Simulator Menu

0. Done.

1. Determine distance and passengers between two airports.

2. Determine all traffic from one airport.

Your choice (0 - 2): -1

Your choice must be between 0 and 2. Please try again.

Flight Simulator Menu

0. Done.

1. Determine distance and passengers between two airports.

2. Determine all traffic from one airport.

Your choice (0 - 2): 1

Please enter two airport abbreviations (XXX XXX): SFO ECS

ECS is not a valid airport

Flight Simulator Menu

0. Done.

1. Determine distance and passengers between two airports.

2. Determine all traffic from one airport.

Your choice (0 - 2): 1

Please enter two airport abbreviations (XXX XXX): SFO NYC

2531 passengers fly the 2570 miles from

San Francisco, California to New York City, New York.

Flight Simulator Menu

0. Done.

1. Determine distance and passengers between two

airports.

2. Determine all traffic from one airport.

Your choice (0 - 2): 2

Please enter an airport abbreviation (XXX): ECS

ECS is not a valid airport

Flight Simulator Menu

0. Done.

1. Determine distance and passengers between two

airports.

2. Determine all traffic from one airport.

Your choice (0 - 2): 2

Please enter an airport abbreviation (XXX): SFO

New York City, New York: 2531

Los Angeles, California: 1173

Chicago, Illinois: 867

Houston, Texas: 675

Phoenix, Arizona: 474

Philadelphia, Pennsylvania: 443

San Antonio, Texas: 406

San Diego, California: 387

Dallas, Texas: 379

// edited by Sean

Rockford, Illinois: 47

Dayton, Ohio: 47

Springfield, Missouri: 47

Palmdale, California: 43

Salem, Oregon: 46

Sioux Falls, South Dakota: 46

Torrance, California: 43

Eugene, Oregon: 45

Lancaster, California: 43

Total passengers: 18885

Flight Simulator Menu

0. Done.

1. Determine distance and passengers between two airports.

2. Determine all traffic from one airport.

Your choice (0 - 2): 0

[@lect1 p3]$