Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Implement a city database using a Binary Search Tree (BST) to store the database

ID: 3572611 • Letter: I

Question

Implement a city database using a Binary Search Tree (BST) to store the database records. Each database record contains the name of the city (a string of arbitrary length) and the coordinates of the city expressed as integer x- and y-coordinates. The BST should be organized by city name. Your database should allow records to be inserted, deleted by name or coordinate, and searched by name or coordinate. Another operation that should be supported is to print all records within a given distance of a specified point. Write a C++ code to implement the city database.

Explanation / Answer

To Implement City Database we requir the following information;

1) City Name,a string of max length 100.

2) City'sPopulation.

3) City's yearly average temp.

4) It's coordinates,longitude in degree & latitude in degree.

In this city batabase following operations are available for user.

1) One can insert new cities.

2) one can delete a city by name or coordinator.

3) One can search & display city by its name or coordinators.

4)Print all the records within a given distance of a specified point.

#ifndef CITY_H
#define CITY_H

#include<string>

using std::string;

class CCity
{
   public:
       CCity(){}
       CCity(string Name)
       {
           aName = Name;
       }
       void Get();
       void Show() const;

       string Name();
      
       const CCity& operator= (const CCity& CityToCopy );

       bool operator==(const CCity& ComparisonCity ) const;
       bool operator==(const string& ComparisonCityName ) const;
       bool operator==(const int& Population ) const;

       bool operator!=(const CCity& ComparisonCity ) const;
       bool operator!=(const string& ComparisonCityName ) const;
      
       bool operator<(const CCity& ComparisonCity ) const;
       bool operator<(const string& ComparisonCityName ) const;
       bool operator>(const CCity& ComparisonCity ) const;
       bool operator>(const string& ComparisonCityName ) const;
      
       bool operator<=(const CCity& ComparisonCity ) const;
       bool operator<=(const string& ComparisonCityName ) const;
       bool operator>=(const CCity& ComparisonCity ) const;
       bool operator>=(const string& ComparisonCityName ) const;


       bool AtCoordinates(const CCity& ComparisonCity ) const;
       bool AtCoordinates(const long ComparisonDegreesNorth,
                               const long ComparisonDegreesWest) const;
       bool WithinRange(const long ComparisonDegreesNorth,
                              const long ComparisonDegreesWest,
                              const long Range   )const;


   private:
       string aName;
       long aDegreesNorth;
       long aDegreesWest;
       long aPopulation;
       float aAverageTemperature;
};

#endif

//Code forcity.cpp
#include "City.h"
#include <iostream>
#include <string>
#include <iomanip>
#include <math.h>

using namespace std;

void CCity::Get()
{
   const int COLUMN_WIDTH = 21;

   cout << "City Name: ";
   cin.ignore(cin.rdbuf()->in_avail(),' ');
   getline(cin,aName);
  
   cout.setf(ios::right);
  
   cout << setw(COLUMN_WIDTH) << "Degrees North: ";
   cin >> aDegreesNorth;

   cout << setw(COLUMN_WIDTH) << "Degrees West: ";
   cin >> aDegreesWest;

   cout << setw(COLUMN_WIDTH) << "aPopulation: ";
   cin >> aPopulation;

   cout << setw(COLUMN_WIDTH) << "Average Temperature: ";
   cin >> aAverageTemperature;

   cout << endl;
}

void CCity::Show() const
{
   const int COLUMN_WIDTH = 21;
  
   cout.setf(ios::right);
  
   cout << setw(COLUMN_WIDTH) <<"City Name: ";
   cout << aName << endl;

   cout << setw(COLUMN_WIDTH) << "Degrees North: ";
   cout << aDegreesNorth << endl;

   cout << setw(COLUMN_WIDTH) << "Degrees West: ";
   cout << aDegreesWest << endl;

   cout << setw(COLUMN_WIDTH) << "aPopulation: ";
   cout << aPopulation << endl;

   cout << setw(COLUMN_WIDTH) << "Average Temperature: ";
   cout << aAverageTemperature << endl;

   cout << endl;

}

string CCity::Name()
{
   return aName;
}

const CCity& CCity::operator=(const CCity& CityToCopy )
{
   aName = CityToCopy.aName;
   aDegreesNorth = CityToCopy.aDegreesNorth;
   aDegreesWest = CityToCopy.aDegreesWest;
   aPopulation = CityToCopy.aPopulation;
   aAverageTemperature = CityToCopy.aAverageTemperature;

   return *this;
}

bool CCity::operator==(const CCity& ComparisonCity ) const
{
   return (ComparisonCity.aName == aName);
}

bool CCity::operator==(const string& ComparisonCityName )const
{
   return (aName == ComparisonCityName);
}

bool CCity::operator==(const int& Population )const
{
   return (aPopulation == Population);
}

bool CCity::operator!=(const CCity& ComparisonCity ) const
{
   return (!(aName == ComparisonCity.aName));
}

bool CCity::operator!=(const string& ComparisonCityName )const
{
   return (!(aName == ComparisonCityName));
}

bool CCity::operator<(const CCity& ComparisonCity ) const
{
   return (aName < ComparisonCity.aName);
}

bool CCity::operator<(const string& ComparisonCityName ) const
{
   return (aName < ComparisonCityName);
}

bool CCity::operator>(const CCity& ComparisonCity ) const
{
   return (aName > ComparisonCity.aName);
}

bool CCity::operator>(const string& ComparisonCityName ) const
{
   return (aName > ComparisonCityName);
}

bool CCity::operator<=(const CCity& ComparisonCity ) const
{
   return (aName <= ComparisonCity.aName);
}

bool CCity::operator<=(const string& ComparisonCityName ) const
{
   return (aName <= ComparisonCityName);
}

bool CCity::operator>=(const CCity& ComparisonCity ) const
{
   return (aName >= ComparisonCity.aName);
}

bool CCity::operator>=(const string& ComparisonCityName ) const
{
   return (aName >= ComparisonCityName);
}

bool CCity::AtCoordinates(const CCity& ComparisonCity ) const
{
   return (AtCoordinates(ComparisonCity.aDegreesNorth, ComparisonCity.aDegreesNorth));
}

bool CCity::AtCoordinates(const long ComparisonDegreesNorth,
                               const long ComparisonDegreesWest) const
{
   bool SameCoordinates = false;

   if (aDegreesNorth == ComparisonDegreesNorth &&
       aDegreesWest == ComparisonDegreesWest)
   {
       SameCoordinates = true;
   }

   return SameCoordinates;
}

bool CCity::WithinRange(const long ComparisonDegreesNorth,
                      const long ComparisonDegreesWest,
                      const long Range   ) const
{
   bool InRange = false;

   if (abs(aDegreesNorth - ComparisonDegreesNorth) <= Range &&
       abs(aDegreesWest - ComparisonDegreesWest) <= Range)
   {
       InRange = true;
   }

   return InRange;
}

//code for main.cpp
#include <iostream>
#include <string>
#include "City.h"
#include "BinarySearchTree.h"

using namespace std;

BST<CCity> Cities;

string SearchName;
long SearchDegreesNorth;
long SearchDegreesWest;
long SearchRange;
bool SearchSucceeded;

//Get Search Criteria functions
void GetSearchName();
void GetSearchCoordinates();
void GetSearchRange();

//menu command functions
void InsertNewCity();
void ShowWithMatchingName();
void ShowWithMatchingCoordinates();
void ShowWithinRange();
void DeleteByName();
void DeleteByCoordinates();

//visit funcitons
void Show(CCity& City);
void SetSearchCityNameByCoordinates(CCity& City);
void ShowWithMatchingCoordinates(CCity& City);
void ShowWithinRange(CCity& City);

void main()
{
   InsertNewCity();
   InsertNewCity();
   //InsertNewCity();

   Cities.InorderTraverse(Show);

   CCity Item;

   string name = "1";
   if(Cities.Retrieve(name, Item))
   {
       cout << "found it" << endl;
   }
}

void InsertNewCity()
{
   CCity City;
  
   cout << "New City: " << endl;

   City.Get();
   Cities.Insert( City );
   cout << SearchName << " successfully entered. " << endl;
}

void DeleteByName()
{
   GetSearchName();
  
   try
   {
       Cities.Delete( SearchName );
   }
   catch(TreeException e)
   {
       cout << e.what();
   }
}

void DeleteByCoordinates()
{
   cout << "Please enter the Search Criteria:" << endl;
   GetSearchCoordinates();

   SearchSucceeded = false;
   Cities.PostorderTraverse( SetSearchCityNameByCoordinates );

   if ( SearchSucceeded )
   {
       Cities.Delete( SearchName );
   }
   else
   {
       cout << "Unable to delete, no city at given coordinates. " << endl;
   }
}

void ShowWithMatchingCoordinates()
{
   SearchSucceeded = false;

   cout << "Please enter the Search Criteria:" << endl;
   GetSearchCoordinates();

   Cities.PostorderTraverse( ShowWithMatchingCoordinates );

   if ( !SearchSucceeded )
   {
       cout << "Unable to find city matching given coordinates. " << endl;
   }
}

void ShowWithinRange()
{
   SearchSucceeded = false;

   cout << "Please enter the Search Criteria:" << endl;
   GetSearchCoordinates();
   GetSearchRange();

   Cities.PostorderTraverse( ShowWithinRange );

   if ( !SearchSucceeded )
   {
       cout << "Unable to find any cities matching given coordinates and range. " << endl;
   }
}

void GetSearchName()
{
   cout << "City Name? ";
   cin.ignore(cin.rdbuf()->in_avail(),' ');
   getline(cin,SearchName);
}

void GetSearchCoordinates()
{
   cout << "Degrees North? ";
   cin >> SearchDegreesNorth;

   cout << "Degrees West? ";
   cin >> SearchDegreesWest;
}

void GetSearchRange()
{
   cout << "Range? ";
   cin >> SearchRange;
}

void Show(CCity& City)
{
   City.Show();
}

void ShowWithMatchingName()
{
   CCity City;
  
   GetSearchName();

   if ( Cities.Retrieve( SearchName, City ))
   {
       City.Show();
   }
   else
   {
       cout << "Unable to find " << SearchName << "." << endl;
   }
}

void ShowWithMatchingCoordinates(CCity& City)
{
   if ( City.AtCoordinates(SearchDegreesNorth, SearchDegreesWest ) )
   {
       City.Show();
       SearchSucceeded = true;
   }
}

void ShowWithinRange(CCity& City)
{
   if ( City.WithinRange(SearchDegreesNorth, SearchDegreesWest, SearchRange ) )
   {
       City.Show();
       SearchSucceeded = true;
   }
}

void SetSearchCityNameByCoordinates(CCity& City)
{
   if ( City.AtCoordinates(SearchDegreesNorth, SearchDegreesWest ) )
   {
       SearchName = City.Name();
       SearchSucceeded = true;
   }
}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote