initial commit

This commit is contained in:
Iurii Tatishchev 2024-06-13 17:23:30 -07:00
commit 1f19d82e22
Signed by: CaZzzer
GPG Key ID: 28BE602058C08557
27 changed files with 652 additions and 0 deletions

117
.gitignore vendored Normal file
View File

@ -0,0 +1,117 @@
# Created by https://www.toptal.com/developers/gitignore/api/clion
# Edit at https://www.toptal.com/developers/gitignore?templates=clion
### CLion ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
**/.idea/**/workspace.xml
**/.idea/**/tasks.xml
**/.idea/**/usage.statistics.xml
**/.idea/**/dictionaries
**/.idea/**/shelf
# AWS User-specific
**/.idea/**/aws.xml
# Generated files
**/.idea/**/contentModel.xml
# Sensitive or high-churn files
**/.idea/**/dataSources/
**/.idea/**/dataSources.ids
**/.idea/**/dataSources.local.xml
**/.idea/**/sqlDataSources.xml
**/.idea/**/dynamic.xml
**/.idea/**/uiDesigner.xml
**/.idea/**/dbnavigator.xml
# Gradle
**/.idea/**/gradle.xml
**/.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
**/cmake-build-*/
# Mongo Explorer plugin
**/.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
**/out/
# mpeltonen/sbt-idea plugin
**/.idea_modules/
# JIRA plugin
**/atlassian-ide-plugin.xml
# Cursive Clojure plugin
**/.idea/replstate.xml
# SonarLint plugin
**/.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
**/com_crashlytics_export_strings.xml
**/crashlytics.properties
**/crashlytics-build.properties
**/fabric.properties
# Editor-based Rest Client
**/.idea/httpRequests
# Android studio 3.1+ serialized cache file
**/.idea/caches/build_file_checksums.ser
### CLion Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr
# Sonarlint plugin
# https://plugins.jetbrains.com/plugin/7973-sonarlint
**/.idea/**/sonarlint/
# SonarQube Plugin
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
**/.idea/**/sonarIssues.xml
# Markdown Navigator plugin
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
**/.idea/**/markdown-navigator.xml
**/.idea/**/markdown-navigator-enh.xml
**/.idea/**/markdown-navigator/
# Cache file creation bug
# See https://youtrack.jetbrains.com/issue/JBR-2257
**/.idea/$CACHE_FILE$
# CodeStream plugin
# https://plugins.jetbrains.com/plugin/12206-codestream
**/.idea/codestream.xml
# Azure Toolkit for IntelliJ plugin
# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
**/.idea/**/azureSettings.xml
# End of https://www.toptal.com/developers/gitignore/api/clion

8
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

1
.idea/.name generated Normal file
View File

@ -0,0 +1 @@
08_team_project

2
.idea/08-team-project.iml generated Normal file
View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CMake" type="CPP_MODULE" version="4" />

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>

4
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/08-team-project.iml" filepath="$PROJECT_DIR$/.idea/08-team-project.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

1
BinarySearchTree.cpp Normal file
View File

@ -0,0 +1 @@
#include "BinarySearchTree.h"

22
BinarySearchTree.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef INC_08_TEAM_PROJECT_BINARYSEARCHTREE_H
#define INC_08_TEAM_PROJECT_BINARYSEARCHTREE_H
#include "BinaryTree.h"
template<typename T>
class BinarySearchTree: public BinaryTree<T> {
private:
public:
BinarySearchTree() : BinaryTree<T>() {};
~BinarySearchTree() { throw std::logic_error("Not implemented: ~BinarySearchTree()"); };
void insert(const T &item) { throw std::logic_error("Not implemented: BinarySearchTree.insert()"); };
void remove(const T &item) { throw std::logic_error("Not implemented: BinarySearchTree.remove()"); };
BinaryTreeNode<T> *search(const T &item) { return _search(this->root, item); };
};
#endif //INC_08_TEAM_PROJECT_BINARYSEARCHTREE_H

1
BinaryTree.cpp Normal file
View File

@ -0,0 +1 @@
#include "BinaryTree.h"

33
BinaryTree.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef INC_08_TEAM_PROJECT_BINARYTREE_H
#define INC_08_TEAM_PROJECT_BINARYTREE_H
#include "BinaryTreeNode.h"
template<typename T>
class BinaryTree {
private:
BinaryTreeNode<T> *root;
int size;
public:
BinaryTree() : root(nullptr), size(0) {};
~BinaryTree() { throw std::logic_error("Not implemented: ~BinaryTree()"); };
[[nodiscard]] bool isEmpty() const { return size == 0; };
[[nodiscard]] int getSize() const { return size; };
void clear() { throw std::logic_error("Not implemented: BinaryTree.clear()"); };
void preOrder(void visit(const T &)) { throw std::logic_error("Not implemented: BinaryTree.preOrder()"); };
void postOrder(void visit(const T &)) { throw std::logic_error("Not implemented: BinaryTree.postOrder()"); };
void inOrder(void visit(const T &)) { throw std::logic_error("Not implemented: BinaryTree.inOrder()"); };
void printIndented(void visit(const T &, int)) { throw std::logic_error("Not implemented: BinaryTree.printIndented()"); };
};
#endif //INC_08_TEAM_PROJECT_BINARYTREE_H

11
BinaryTreeNode.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef INC_08_TEAM_PROJECT_BINARYTREENODE_H
#define INC_08_TEAM_PROJECT_BINARYTREENODE_H
#include <stdexcept>
template<typename T>
class BinaryTreeNode {
};
#endif //INC_08_TEAM_PROJECT_BINARYTREENODE_H

24
CMakeLists.txt Normal file
View File

@ -0,0 +1,24 @@
cmake_minimum_required(VERSION 3.28)
project(08_team_project)
set(CMAKE_CXX_STANDARD 20)
add_executable(08_team_project main.cpp
utils.h
utils.cpp
BinaryTreeNode.h
BinaryTree.cpp
BinaryTree.h
BinarySearchTree.cpp
BinarySearchTree.h
HashNode.cpp
HashNode.h
HashTable.cpp
HashTable.h
# CPU.cpp
CPU.h
Stack.cpp
Stack.h
StackNode.cpp
StackNode.h
)

1
CPU.cpp Normal file
View File

@ -0,0 +1 @@
#include "CPU.h"

65
CPU.h Normal file
View File

@ -0,0 +1,65 @@
#ifndef INC_08_TEAM_PROJECT_CPU_H
#define INC_08_TEAM_PROJECT_CPU_H
#include <string>
class CPU {
private:
std::string cpuId;
int releaseYear;
int coreCount;
std::string architecture;
double baseClock;
public:
CPU(std::string id, int year, int cores, std::string arch, double clock) :
cpuId(std::move(id)),
releaseYear(year),
coreCount(cores),
architecture(std::move(arch)),
baseClock(clock) {};
std::string getCpuId() const;
int getReleaseYear() const;
int getCoreCount() const;
std::string getArchitecture() const;
double getBaseClock() const;
void setCpuId(std::string id);
void setReleaseYear(int year);
void setCoreCount(int cores);
void setArchitecture(std::string arch);
void setBaseClock(double clock);
// Operator overloads
bool operator<(const CPU &rhs) const;
bool operator>(const CPU &rhs) const;
bool operator==(const CPU &rhs) const;
// Friend function declarations
friend void display(const CPU &cpu);
friend void iDisplay(const CPU &cpu, int level);
friend std::ostream &operator<<(std::ostream &os, const CPU &cpu);
friend int key_to_index(const CPU &key, int size);
};
int key_to_index(const CPU &key, int size) {
// TODO
return key.coreCount % size;
};
#endif //INC_08_TEAM_PROJECT_CPU_H

1
HashNode.cpp Normal file
View File

@ -0,0 +1 @@
#include "HashNode.h"

10
HashNode.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef INC_08_TEAM_PROJECT_HASHNODE_H
#define INC_08_TEAM_PROJECT_HASHNODE_H
template<typename T>
class HashNode {
};
#endif //INC_08_TEAM_PROJECT_HASHNODE_H

1
HashTable.cpp Normal file
View File

@ -0,0 +1 @@
#include "HashTable.h"

42
HashTable.h Normal file
View File

@ -0,0 +1,42 @@
#ifndef INC_08_TEAM_PROJECT_HASHTABLE_H
#define INC_08_TEAM_PROJECT_HASHTABLE_H
#include <stdexcept>
#include "HashNode.h"
template<typename T>
class HashTable {
private:
int hashSize;
int count;
HashNode<T> *hashAry;
public:
HashTable() : hashSize(97), count(0) {
hashAry = new HashNode<T>[hashSize];
};
~HashTable() { delete[] hashAry; };
[[nodiscard]] int getCount() const { return count; };
[[nodiscard]] int getHashSize() const { return hashSize; };
bool isEmpty() const { return count == 0; };
bool isFull() const { return count == hashSize; };
double getLoadFactor() const { throw std::logic_error("Not implemented: HashTable.getLoadFactor()"); };
bool insert(const T &item, int h(const T&, int)) { throw std::logic_error("Not implemented: HashTable.insert()"); };
bool remove(const T &item, int h(const T&), int) { throw std::logic_error("Not implemented: HashTable.remove()"); };
bool search(const T &item, int h(const T&), int) { throw std::logic_error("Not implemented: HashTable.search()"); };
int getTotalCollisions() const { throw std::logic_error("Not implemented: HashTable.getTotalCollisions()"); };
int getMaxCollisions() const { throw std::logic_error("Not implemented: HashTable.getMaxCollisions()"); };
};
#endif //INC_08_TEAM_PROJECT_HASHTABLE_H

1
Stack.cpp Normal file
View File

@ -0,0 +1 @@
#include "Stack.h"

29
Stack.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef INC_08_TEAM_PROJECT_STACK_H
#define INC_08_TEAM_PROJECT_STACK_H
#include <stdexcept>
#include "StackNode.h"
template<typename T>
class Stack {
private:
StackNode<T> *top;
int count;
public:
Stack() : top(nullptr), count(0) {};
~Stack() { throw std::logic_error("Not implemented: ~Stack()"); };
[[nodiscard]] bool isEmpty() const { return count == 0; };
[[nodiscard]] int getCount() const { return count; };
void push(const T &data) { throw std::logic_error("Not implemented: Stack.push()"); };
T pop() { throw std::logic_error("Not implemented: Stack.pop()"); };
T peek() { throw std::logic_error("Not implemented: Stack.peek()"); };
};
#endif //INC_08_TEAM_PROJECT_STACK_H

1
StackNode.cpp Normal file
View File

@ -0,0 +1 @@
#include "StackNode.h"

10
StackNode.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef INC_08_TEAM_PROJECT_STACKNODE_H
#define INC_08_TEAM_PROJECT_STACKNODE_H
template<typename T>
class StackNode {
};
#endif //INC_08_TEAM_PROJECT_STACKNODE_H

164
main.cpp Normal file
View File

@ -0,0 +1,164 @@
// # Project Requirements
//
// Begin by displaying some general information about the project, the names and tasks of the developers.
// Processing is to be menu-driven with the following options:
//
// - Add a new data item.
// - Add data from an input file (get the name of the input file from the user). (does it overwrite?)
// - Delete data (one item).
// - Find and display one element using the primary key.
// - List data sorted by the primary key.
// - Hidden print option (do not show it in the menu: details are given in Team Project- Part2).
// - display the indented tree
// - Write data to a file.
// - Statistics (details are given in Team Project-Part2)
// - load factor
// - number of collisions (total)
// - longest collision path
// - Hidden option (do not show it in the menu): when selected, display the names of the team members.
// - Help to show the menu. Show the menu once, before the loop, then show the menu upon request: “Enter an option (H for help): ”
// - Exit
//
// At the end of the program, the data are to be automatically written to a file.
// This is in addition to the menu write file option.
// The output file name does not have to be the same as the input file name,
// but the file format must be the same so that it can be read back into the program.
#include <iostream>
#include <string>
#include <vector>
#include "utils.h"
#include "CPU.h"
#include "HashTable.h"
#include "BinarySearchTree.h"
#include "Stack.h"
using std::cin, std::cout, std::string, std::vector;
void printHelp() {
static const vector<int> helpWidths = {5, 40};
static const vector<vector<string>> helpData = {
{"Key", "Command"},
{"H", "Help"},
{"I", "Insert a new record"},
{"F", "File input: add data from a file"},
{"D", "Delete one record"},
{"U", "Undo delete"},
{"L", "List all CPUs sorted by primary key"},
{"S", "Search for a CPU by the primary key"},
{"W", "Write data to a file"},
{"T", "Hashtable statistics"},
{"Q", "Quit"},
{"P", "Hidden print option (do not show it in the menu: print indented tree)"},
{"Z", "Hidden option (do not show it in the menu: display names of team members)"},
};
printTable(helpWidths, helpData);
}
void printTeam() {
static const vector<int> teamWidths = {40};
static const vector<vector<string>> teamData = {
{"Team Members"},
{"Kevin Cremin"},
{"Kevin Galvan Serrano"},
{"Joshiro Lawrence"},
{"Tuhin Mondal"},
{"Iurii Tatishchev"},
};
printTable(teamWidths, teamData);
}
void processInput(char command, HashTable<CPU>& table, BinarySearchTree<CPU>& tree, Stack<CPU>& stack);
CPU readCPUInfo();
int main() {
// Print help table for commands
printHelp();
HashTable<CPU> cpuTable;
BinarySearchTree<CPU> cpuTree;
Stack<CPU> undoStack;
char command = ' ';
while (command != 'Q') {
cout << "Enter an option (H - for help): ";
cin >> command;
// Temporary try catch block to handle unimplemented commands
try {
processInput(toupper(command, std::locale()), cpuTable, cpuTree, undoStack);
} catch (std::logic_error& e) {
cout << e.what() << '\n';
}
}
// Quit command received
// TODO: Write data to a file
cout << "Exiting program...\n";
return 0;
}
void insertCPU(HashTable<CPU> &hashTable, BinarySearchTree<CPU> &tree);
void processInput(char command, HashTable<CPU> &cpuTable, BinarySearchTree<CPU> &cpuTree, Stack<CPU> &undoStack) {
switch (command) {
case 'H':
printHelp();
break;
case 'I': // Insert a new record
insertCPU(cpuTable, cpuTree);
break;
case 'F': // File input: add data from a file
throw std::logic_error("Not yet implemented: File input: add data from a file");
break;
case 'D': // Delete one record
throw std::logic_error("Not yet implemented: Delete one record");
break;
case 'U': // Undo delete
throw std::logic_error("Not yet implemented: Undo delete");
break;
case 'L': // List all CPUs sorted by primary key
throw std::logic_error("Not yet implemented: List all CPUs sorted by primary key");
break;
case 'S': // Search for a CPU by the primary key
throw std::logic_error("Not yet implemented: Search for a CPU by the primary key");
break;
case 'W': // Write data to a file
throw std::logic_error("Not yet implemented: Write data to a file");
break;
case 'T': // Hashtable statistics
throw std::logic_error("Not yet implemented: Hashtable statistics");
break;
case 'P': // Print indented tree
throw std::logic_error("Not yet implemented: Print indented tree");
break;
case 'Z': // Display names of team members
printTeam();
break;
case 'Q': // Quit
break;
default:
cout << "Invalid command. Press 'H' to view available commands.\n";
}
}
void insertCPU(HashTable<CPU> &hashTable, BinarySearchTree<CPU> &tree) {
string cpuId;
int releaseYear, coreCount;
string architecture;
double baseClock;
cout << "Enter CPU ID: ";
cin >> cpuId;
cout << "Enter release year: ";
cin >> releaseYear;
cout << "Enter core count: ";
cin >> coreCount;
cout << "Enter architecture: ";
cin >> architecture;
cout << "Enter base clock: ";
cin >> baseClock;
CPU cpu(cpuId, releaseYear, coreCount, architecture, baseClock);
hashTable.insert(cpu, key_to_index);
tree.insert(cpu);
}

71
utils.cpp Normal file
View File

@ -0,0 +1,71 @@
#include <iostream>
#include "utils.h"
using std::cout;
void printRow(const vector<int> &widths, const vector<string>& row) {
cout << '|';
for (int i = 0; i < widths.size(); i++) {
cout << ' ';
cout.width(widths[i] - 1);
cout << std::left << row[i];
cout << '|';
}
cout << '\n';
};
/*
* Print ascii/unicode table with given column widths and data. For example:
*
* | Col1 | Col2 | Col3 | Numeric Column |
* +========================================+==========+========================+================+
* | Value 1 | Value 2 | 123 | 10.0 |
* | Separate | cols | with a tab or 4 spaces | -2,027.1 |
* | This is a row with only one cell | | | |
*
*/
void printTable(const vector<int>& widths, const vector<vector<string>>& data) {
// Print top border
cout << "";
for (int width : widths) {
for (int i = 0; i < width; i++) {
cout << "";
}
cout << "";
}
cout << "\b\n";
// Print header
cout << '|';
for (int i = 0; i < widths.size(); i++) {
cout << ' ';
cout.width(widths[i] - 1);
cout << std::left << data[0][i];
cout << '|';
}
cout << '\n';
// Print middle border
cout << '+';
for (int width : widths) {
for (int i = 0; i < width; i++) {
cout << '=';
}
cout << '+';
}
cout << '\n';
// Print data
for (int i = 1; i < data.size(); i++) {
printRow(widths, data[i]);
}
// Print bottom border
cout << "";
for (int width : widths) {
for (int i = 0; i < width; i++) {
cout << "";
}
cout << "";
}
cout << "\b\n";
}

12
utils.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef INC_08_TEAM_PROJECT_UTILS_H
#define INC_08_TEAM_PROJECT_UTILS_H
#include <vector>
#include <string>
using std::vector, std::string;
void printRow(const vector<int> &widths, const vector<string>& row);
void printTable(const vector<int>& widths, const vector<vector<string>>& data);
#endif //INC_08_TEAM_PROJECT_UTILS_H