adding cs142 code
This commit is contained in:
parent
552d456d53
commit
8e52ce1982
31
cs142/final/Makefile
Normal file
31
cs142/final/Makefile
Normal file
@ -0,0 +1,31 @@
|
||||
CXXFLAGS= -Wall -g
|
||||
OBJECTS=main.o employee.o hourly.o salaried.o administrator.o faculty.o util.o campus.o
|
||||
EXE=main
|
||||
|
||||
all: $(EXE)
|
||||
|
||||
|
||||
$(EXE): main.o
|
||||
$(CXX) $(CXXFLAGS) $(OBJECTS) -o $@
|
||||
|
||||
main.o: main.cpp employee.o hourly.o salaried.o administrator.o faculty.o util.o campus.o
|
||||
employee.o: employee.h employee.cpp
|
||||
hourly.o: hourly.cpp hourly.h employee.h
|
||||
salaried.o: salaried.h salaried.cpp employee.h
|
||||
administrator.o: administrator.cpp administrator.h employee.h
|
||||
faculty.o: faculty.cpp faculty.h employee.h
|
||||
util.o: util.h util.cpp
|
||||
campus.o: campus.cpp campus.h
|
||||
|
||||
run: $(EXE)
|
||||
@./$(EXE)
|
||||
|
||||
clean:
|
||||
@rm -vf *.o
|
||||
@rm -vf $(EXE)
|
||||
|
||||
debug: $(EXE)
|
||||
gdb ./$(EXE)
|
||||
|
||||
valgrind: $(EXE)
|
||||
valgrind --tool=memcheck --leak-check=yes ./$(EXE)
|
14
cs142/final/administrator.cpp
Normal file
14
cs142/final/administrator.cpp
Normal file
@ -0,0 +1,14 @@
|
||||
#include "administrator.h"
|
||||
#include "employee.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
administrator::administrator(string name, double pay_rate, int hours, string type) :
|
||||
employee(name, pay_rate, hours, type) {}
|
||||
|
||||
int administrator::get_salary() {
|
||||
if(hours > 170) {
|
||||
pay_rate += pay_rate * .1;
|
||||
}
|
||||
return pay_rate;
|
||||
}
|
15
cs142/final/administrator.h
Normal file
15
cs142/final/administrator.h
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef __ADMINISTRATOR_H__
|
||||
#define __ADMINISTRATOR_H__
|
||||
|
||||
#include <iostream>
|
||||
#include "employee.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class administrator : public employee {
|
||||
public:
|
||||
administrator(string name, double pay_rate, int hours, string type);
|
||||
int get_salary();
|
||||
};
|
||||
|
||||
#endif
|
263
cs142/final/campus.cpp
Normal file
263
cs142/final/campus.cpp
Normal file
@ -0,0 +1,263 @@
|
||||
#include "campus.h"
|
||||
#include "salaried.h"
|
||||
#include "hourly.h"
|
||||
#include "faculty.h"
|
||||
#include "administrator.h"
|
||||
#include "util.h"
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <cstdlib>
|
||||
#include <fstream>
|
||||
|
||||
bool campus::contains(string name) { //function used to verify if the string is already included
|
||||
employee * f = NULL;
|
||||
for(unsigned int i = 0; i < workers.size(); i++) {
|
||||
f = dynamic_cast<employee *>(workers[i]);
|
||||
if(f->get_name() == name) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void campus::add_worker_from_parse(string name, string type, double pay_rate) { //add worker for parsed input
|
||||
bool passed = false;
|
||||
employee * h = NULL;
|
||||
int hours = 0;
|
||||
if(type == "H") {
|
||||
h = new hourly(name, pay_rate, hours, type);
|
||||
passed = true;
|
||||
}
|
||||
else if(type == "S") {
|
||||
h = new salaried(name, pay_rate, hours, type);
|
||||
passed = true;
|
||||
}
|
||||
else if(type == "F") {
|
||||
h = new faculty(name, pay_rate, hours, type);
|
||||
passed = true;
|
||||
}
|
||||
else if(type == "A") {
|
||||
h = new administrator(name, pay_rate, hours, type);
|
||||
passed = true;
|
||||
}
|
||||
if(passed == true) {
|
||||
workers.push_back(h);
|
||||
}
|
||||
}
|
||||
|
||||
void campus::add_worker() { //general add worker function which it gets the input
|
||||
employee * h = NULL;
|
||||
bool passed;
|
||||
string info;
|
||||
string name, type;
|
||||
int hours = 0;
|
||||
double pay_rate = 0;
|
||||
cout << "Enter info in following format" << endl;
|
||||
cout << "type pay_rate name" << endl;;
|
||||
getline(cin, info);
|
||||
passed = parse_n_load(info, name, type, pay_rate);
|
||||
if(contains(name) == true) {
|
||||
cout << "already exists" << endl;
|
||||
return;
|
||||
}
|
||||
if(passed == false) {
|
||||
cout << "incorrect entry" << endl;
|
||||
}
|
||||
if(info[0] == ' ') {
|
||||
cout << "incorrect entry" << endl;
|
||||
passed = false;
|
||||
}
|
||||
else if(type == "H") {
|
||||
h = new hourly(name, pay_rate, hours, type);
|
||||
}
|
||||
else if(type == "S") {
|
||||
h = new salaried(name, pay_rate, hours, type);
|
||||
}
|
||||
else if(type == "F") {
|
||||
h = new faculty(name, pay_rate, hours, type);
|
||||
}
|
||||
else if(type == "A") {
|
||||
h = new administrator(name, pay_rate, hours, type);
|
||||
}
|
||||
if(passed == true) {
|
||||
workers.push_back(h);
|
||||
}
|
||||
}
|
||||
void campus::delete_worker() {
|
||||
string name;
|
||||
employee * h = NULL;
|
||||
cout << "Enter name of worker to delete" << endl;
|
||||
getline(cin, name);
|
||||
for(unsigned int i = 0; i < workers.size(); i++) {
|
||||
h = dynamic_cast<employee *>(workers[i]);
|
||||
if(h->get_name() == name) {
|
||||
delete h;
|
||||
workers.erase(workers.begin() + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void campus::display_worker() { //allows for display of all employees or selected
|
||||
string input;
|
||||
employee * h = NULL;
|
||||
cout << "(a)ll workers or (o)ne worker?" << endl;
|
||||
cin >> input;
|
||||
cin.ignore();
|
||||
cout << "type // payrate // name // hours // salary" << endl;
|
||||
if(input == "a") {
|
||||
for(unsigned int i = 0; i < workers.size(); i++){
|
||||
h = dynamic_cast<employee *>(workers[i]);
|
||||
cout << *workers[i] << " $" << h->get_salary() << endl;
|
||||
}
|
||||
}
|
||||
if(input == "o") {
|
||||
cout << "name: ";
|
||||
employee * h = NULL;
|
||||
getline(cin, input);
|
||||
for(unsigned int i = 0; i < workers.size(); i++) {
|
||||
h = dynamic_cast<employee *>(workers[i]);
|
||||
if(h->get_name() == input) {
|
||||
cout << *h << " $" << h->get_salary() << endl;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void campus::sort_name() {
|
||||
bool ready = true;
|
||||
employee * h = NULL;
|
||||
employee * j = NULL;
|
||||
while(ready) {
|
||||
for(unsigned int i = 0; i < workers.size() -1; i++) {
|
||||
h = dynamic_cast<employee *>(workers[i]);
|
||||
j = dynamic_cast<employee *>(workers[i+1]);
|
||||
ready = false;
|
||||
if(h->get_name() > j->get_name()) {
|
||||
workers.push_back(workers[i]);
|
||||
workers[i] = workers[i+1];
|
||||
workers[i+1] = workers[workers.size()-1];
|
||||
workers.pop_back();
|
||||
ready = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void campus::sort_pay() {
|
||||
bool ready = true;
|
||||
employee * h = NULL;
|
||||
employee * j = NULL;
|
||||
while(ready) {
|
||||
for(unsigned int i = 0; i < workers.size() -1; i++) {
|
||||
h = dynamic_cast<employee *>(workers[i]);
|
||||
j = dynamic_cast<employee *>(workers[i+1]);
|
||||
ready = false;
|
||||
if(h->get_payrate() > j->get_payrate()) {
|
||||
workers.push_back(workers[i]);
|
||||
workers[i] = workers[i+1];
|
||||
workers[i+1] = workers[workers.size()-1];
|
||||
workers.pop_back();
|
||||
ready = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void campus::sort_worker() { //allows for either sort by name or by pay
|
||||
string input;
|
||||
cout << "sort by (n)ame or by (p)ay?" << endl;
|
||||
cin >> input;
|
||||
if(input == "n") {
|
||||
sort_name();
|
||||
}
|
||||
if(input == "p") {
|
||||
sort_pay();
|
||||
}
|
||||
}
|
||||
|
||||
void campus::advance_month() {
|
||||
employee * h = NULL;
|
||||
for(unsigned int i = 0; i < workers.size(); i++) {
|
||||
h = dynamic_cast<employee *>(workers[i]);
|
||||
h->reset_hours();
|
||||
}
|
||||
}
|
||||
|
||||
void campus::set_hours() {
|
||||
string name;
|
||||
employee * h = NULL;
|
||||
cout << "enter name of employee" << endl;
|
||||
getline(cin, name);
|
||||
for(unsigned int i = 0; i < workers.size(); i++) {
|
||||
h = dynamic_cast<employee *>(workers[i]);
|
||||
if(h->get_name() == name) {
|
||||
int input;
|
||||
cout << "enter hours" << endl;
|
||||
cin >> input;
|
||||
cin.ignore();
|
||||
h->set_hours(input);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void campus::add_files(campus c) { //function for i/o. can either write to a file or take a file in
|
||||
string add_or_write;
|
||||
cout << "(a)dd or (w)rite to file?" << endl;
|
||||
cin >> add_or_write;
|
||||
cin.ignore();
|
||||
if(add_or_write == "a") {
|
||||
bool file_correct = false;
|
||||
string input, input_file_name;
|
||||
while(!file_correct) {
|
||||
cout << "please enter file name: ";
|
||||
getline(cin, input);
|
||||
ifstream inputs(input.c_str());
|
||||
if(inputs.good()) {
|
||||
input_file_name = input;
|
||||
file_correct = true;
|
||||
string lineread;
|
||||
while(getline(inputs, lineread)) {
|
||||
bool worked;
|
||||
string name, type;
|
||||
double pay_rate;
|
||||
worked = parse_n_load(lineread, name, type, pay_rate);
|
||||
if(worked == true) {
|
||||
add_worker_from_parse(name, type, pay_rate);
|
||||
}
|
||||
lineread = "";
|
||||
}
|
||||
}
|
||||
else {
|
||||
cerr << "incorrect file name" << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(add_or_write == "w") {
|
||||
bool file_correct = false;
|
||||
string input, input_file_name;
|
||||
string output_file_name;
|
||||
file_correct = false;
|
||||
while(!file_correct) {
|
||||
cout << "please enter file name: ";
|
||||
getline(cin, output_file_name);
|
||||
ofstream out(output_file_name.c_str());
|
||||
if(out.good()) {
|
||||
out << c;
|
||||
file_correct = true;
|
||||
}
|
||||
else {
|
||||
cerr << "incorrect file name" << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ostream & operator<<(ostream & os, campus & t) { //makes writing out to files much easier
|
||||
employee * h = NULL;
|
||||
for(unsigned int i = 0; i < t.workers.size(); i++) {
|
||||
h = dynamic_cast<employee *>(t.workers[i]);
|
||||
os << h->get_type() << " " << h->get_payrate() << " " << h->get_name() << "\n";
|
||||
}
|
||||
return os;
|
||||
}
|
27
cs142/final/campus.h
Normal file
27
cs142/final/campus.h
Normal file
@ -0,0 +1,27 @@
|
||||
#ifndef __CAMPUS_H__
|
||||
#define __CAMPUS_H__
|
||||
|
||||
#include "employee.h"
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class campus {
|
||||
private:
|
||||
vector<employee*> workers;
|
||||
public:
|
||||
void add_worker();
|
||||
void add_worker_from_parse(string name, string type, double pay_rate);
|
||||
void delete_worker();
|
||||
void display_worker();
|
||||
void sort_worker();
|
||||
void advance_month();
|
||||
void set_hours();
|
||||
void add_files(campus c);
|
||||
void sort_name();
|
||||
void sort_pay();
|
||||
bool contains(string name);
|
||||
friend ostream & operator<<(ostream & os, campus & t);
|
||||
};
|
||||
|
||||
#endif
|
35
cs142/final/employee.cpp
Normal file
35
cs142/final/employee.cpp
Normal file
@ -0,0 +1,35 @@
|
||||
#include "employee.h"
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
employee::employee(string name, double pay_rate, int hours, string type) :
|
||||
name(name), pay_rate(pay_rate), hours(hours), type(type) {}
|
||||
|
||||
string employee::get_name(){
|
||||
return name;
|
||||
}
|
||||
|
||||
double employee::get_payrate() {
|
||||
return pay_rate;
|
||||
}
|
||||
|
||||
int employee::get_hours() {
|
||||
return hours;
|
||||
}
|
||||
|
||||
string employee::get_type() {
|
||||
return type;
|
||||
}
|
||||
|
||||
void employee::reset_hours() {
|
||||
hours = 0;
|
||||
}
|
||||
|
||||
void employee::set_hours(int input) {
|
||||
hours += input;
|
||||
}
|
||||
|
||||
ostream & operator<<(ostream & os, employee & t){ //makes printing out employee easy
|
||||
os << t.type << " " << t.pay_rate << " " << t.name << " " << t.hours;
|
||||
return os;
|
||||
}
|
27
cs142/final/employee.h
Normal file
27
cs142/final/employee.h
Normal file
@ -0,0 +1,27 @@
|
||||
#ifndef __EMPLOYEE_H__
|
||||
#define __EMPLOYEE_H__
|
||||
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class employee {
|
||||
private:
|
||||
string name;
|
||||
protected:
|
||||
string type;
|
||||
double pay_rate;
|
||||
int hours;
|
||||
public:
|
||||
employee(string name, double pay_rate, int hours, string type);
|
||||
string get_name();
|
||||
double get_payrate();
|
||||
string get_type();
|
||||
int get_hours();
|
||||
void set_hours(int input);
|
||||
void reset_hours();
|
||||
virtual int get_salary() = 0;
|
||||
friend ostream & operator<<(ostream & os, employee & t);
|
||||
};
|
||||
|
||||
#endif
|
32
cs142/final/faculty.cpp
Normal file
32
cs142/final/faculty.cpp
Normal file
@ -0,0 +1,32 @@
|
||||
#include "faculty.h"
|
||||
#include "employee.h"
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
faculty::faculty(string name, double pay_rate, int hours, string type) : employee(name, pay_rate, hours, type),
|
||||
grad_students(set_grad_students()) {}
|
||||
|
||||
int faculty::get_salary() {
|
||||
double pay_rate_return = 0;
|
||||
if(grad_students > 0){
|
||||
double percent;
|
||||
pay_rate_return = pay_rate;
|
||||
for(int i = 0; i < grad_students; i++){
|
||||
percent += 0.05;
|
||||
}
|
||||
pay_rate_return += pay_rate*percent;
|
||||
return pay_rate_return;
|
||||
}
|
||||
return pay_rate;
|
||||
}
|
||||
|
||||
int faculty::get_grad_students() {
|
||||
return grad_students;
|
||||
}
|
||||
int faculty::set_grad_students() { //gets random number of grad students for faculty
|
||||
srand(time(NULL));
|
||||
int students = rand() % 5;
|
||||
return students;
|
||||
}
|
19
cs142/final/faculty.h
Normal file
19
cs142/final/faculty.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef __FACULTY_H__
|
||||
#define __FACULTY_H__
|
||||
|
||||
#include <iostream>
|
||||
#include "employee.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class faculty : public employee {
|
||||
private:
|
||||
int grad_students;
|
||||
public:
|
||||
faculty(string name, double pay_rate, int hours, string type);
|
||||
int get_grad_students();
|
||||
int set_grad_students();
|
||||
int get_salary();
|
||||
};
|
||||
|
||||
#endif
|
19
cs142/final/hourly.cpp
Normal file
19
cs142/final/hourly.cpp
Normal file
@ -0,0 +1,19 @@
|
||||
#include "hourly.h"
|
||||
#include "employee.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
hourly::hourly(string name, double pay_rate, int hours, string type) : employee(name, pay_rate, hours, type) {}
|
||||
|
||||
int hourly::get_salary() {
|
||||
int salary;
|
||||
int overtime;
|
||||
if((hours - 170) > 0) {
|
||||
overtime = (hours - 170);
|
||||
salary = 170 * pay_rate;
|
||||
salary += overtime * (pay_rate * 1.5);
|
||||
return salary;
|
||||
}
|
||||
salary = hours * pay_rate;
|
||||
return salary;
|
||||
}
|
15
cs142/final/hourly.h
Normal file
15
cs142/final/hourly.h
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef __HOURLY_H__
|
||||
#define __HOURLY_H__
|
||||
|
||||
#include <iostream>
|
||||
#include "employee.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class hourly : public employee {
|
||||
public:
|
||||
hourly(string name, double pay_rate, int hours, string type);
|
||||
int get_salary();
|
||||
};
|
||||
|
||||
#endif
|
48
cs142/final/main.cpp
Normal file
48
cs142/final/main.cpp
Normal file
@ -0,0 +1,48 @@
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include "employee.h"
|
||||
#include "salaried.h"
|
||||
#include "hourly.h"
|
||||
#include "faculty.h"
|
||||
#include "administrator.h"
|
||||
#include "util.h"
|
||||
#include "campus.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
int main() { //driver for program
|
||||
campus c = campus();
|
||||
bool keep_going = true;
|
||||
while(keep_going) {
|
||||
string input;
|
||||
cout << "(a)dd worker, (r)emove worker, (d)isplay worker, add (h)ours, \n";
|
||||
cout << " (s)ort workers, advance (m)onth, add (f)ile, (q)uit" << endl;
|
||||
cin >> input;
|
||||
cin.ignore();
|
||||
if(input == "a") {
|
||||
c.add_worker();
|
||||
}
|
||||
if(input == "r") {
|
||||
c.delete_worker();
|
||||
}
|
||||
if(input == "h") {
|
||||
c.set_hours();
|
||||
}
|
||||
if(input == "d") {
|
||||
c.display_worker();
|
||||
}
|
||||
if(input == "s") {
|
||||
c.sort_worker();
|
||||
}
|
||||
if(input == "m") {
|
||||
c.advance_month();
|
||||
}
|
||||
if(input == "f") {
|
||||
c.add_files(c); //will either take in a file or write out to one
|
||||
}
|
||||
if(input == "q") {
|
||||
keep_going = false;
|
||||
}
|
||||
}
|
||||
}
|
13
cs142/final/salaried.cpp
Normal file
13
cs142/final/salaried.cpp
Normal file
@ -0,0 +1,13 @@
|
||||
#include "salaried.h"
|
||||
#include "employee.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
salaried::salaried(string name, double pay_rate, int hours, string type) : employee(name, pay_rate, hours, type) {}
|
||||
|
||||
int salaried::get_salary() {
|
||||
if(hours > 170/2) {
|
||||
return pay_rate;
|
||||
}
|
||||
return 0;
|
||||
}
|
15
cs142/final/salaried.h
Normal file
15
cs142/final/salaried.h
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef __SALARIED_H__
|
||||
#define __SALARIED_H__
|
||||
|
||||
#include <iostream>
|
||||
#include "employee.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class salaried : public employee {
|
||||
public:
|
||||
salaried(string name, double pay_rate, int hours, string type);
|
||||
int get_salary();
|
||||
};
|
||||
|
||||
#endif
|
46
cs142/final/tags
Normal file
46
cs142/final/tags
Normal file
@ -0,0 +1,46 @@
|
||||
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
|
||||
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
|
||||
!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
|
||||
!_TAG_PROGRAM_NAME Exuberant Ctags //
|
||||
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
|
||||
!_TAG_PROGRAM_VERSION 5.9~svn20110310 //
|
||||
CXXFLAGS Makefile /^CXXFLAGS= -Wall -g$/;" m
|
||||
EXE Makefile /^EXE=main$/;" m
|
||||
OBJECTS Makefile /^OBJECTS=main.o employee.o hourly.o salaried.o administrator.o faculty.o util.o$/;" m
|
||||
__ADMINISTRATOR_H__ administrator.h 2;" d
|
||||
__EMPLOYEE_H__ employee.h 2;" d
|
||||
__FACULTY_H__ faculty.h 2;" d
|
||||
__HOURLY_H__ hourly.h 2;" d
|
||||
__SALARIED_H__ salaried.h 2;" d
|
||||
__UTIL_H__ util.h 2;" d
|
||||
administrator administrator.cpp /^administrator::administrator(string name, double pay_rate, int hours) : employee(name, pay_rate, hours) {}$/;" f class:administrator
|
||||
administrator administrator.h /^class administrator : public employee {$/;" c
|
||||
employee employee.cpp /^employee::employee(string name, double pay_rate, int hours) :$/;" f class:employee
|
||||
employee employee.h /^class employee {$/;" c
|
||||
faculty faculty.cpp /^faculty::faculty(string name, double pay_rate, int hours) : employee(name, pay_rate, hours),$/;" f class:faculty
|
||||
faculty faculty.h /^class faculty : public employee {$/;" c
|
||||
get_grad_students faculty.cpp /^int faculty::get_grad_students() {$/;" f class:faculty
|
||||
get_hours employee.cpp /^int employee::get_hours() {$/;" f class:employee
|
||||
get_name employee.cpp /^string employee::get_name(){$/;" f class:employee
|
||||
get_payrate employee.cpp /^double employee::get_payrate() {$/;" f class:employee
|
||||
get_salary administrator.cpp /^int administrator::get_salary() {$/;" f class:administrator
|
||||
get_salary faculty.cpp /^int faculty::get_salary() {$/;" f class:faculty
|
||||
get_salary hourly.cpp /^int hourly::get_salary() {$/;" f class:hourly
|
||||
get_salary salaried.cpp /^int salaried::get_salary() {$/;" f class:salaried
|
||||
grad_students faculty.h /^ int grad_students;$/;" m class:faculty
|
||||
hourly hourly.cpp /^hourly::hourly(string name, double pay_rate, int hours) : employee(name, pay_rate, hours) {}$/;" f class:hourly
|
||||
hourly hourly.h /^class hourly : public employee {$/;" c
|
||||
hours employee.h /^ int hours;$/;" m class:employee
|
||||
main main.cpp /^int main() {$/;" f
|
||||
name employee.h /^ string name;$/;" m class:employee
|
||||
parse_n_load util.cpp /^bool parse_n_load(const string & input, string & name, string & type,$/;" f
|
||||
pay_rate employee.h /^ double pay_rate;$/;" m class:employee
|
||||
salaried salaried.cpp /^salaried::salaried(string name, double pay_rate, int hours) : employee(name, pay_rate, hours) {}$/;" f class:salaried
|
||||
salaried salaried.h /^class salaried : public employee {$/;" c
|
||||
set_grad_students faculty.cpp /^int faculty::set_grad_students() {$/;" f class:faculty
|
||||
test_admin main.cpp /^void test_admin() {$/;" f
|
||||
test_faculty main.cpp /^void test_faculty() {$/;" f
|
||||
test_hourly main.cpp /^void test_hourly() {$/;" f
|
||||
test_salaried main.cpp /^void test_salaried() {$/;" f
|
||||
test_util main.cpp /^void test_util() {$/;" f
|
||||
tokenize util.cpp /^vector<string> tokenize(const string & str, const string & delimiters) {$/;" f
|
4
cs142/final/test.txt
Normal file
4
cs142/final/test.txt
Normal file
@ -0,0 +1,4 @@
|
||||
A 10.5 zombie
|
||||
alka alkjsa
|
||||
F 152 stephen is awesome
|
||||
H 15.243 cremeballs. creame
|
46
cs142/final/util.cpp
Normal file
46
cs142/final/util.cpp
Normal file
@ -0,0 +1,46 @@
|
||||
#include <vector>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
#include <cstdlib>
|
||||
#include "util.h"
|
||||
#include <iostream>
|
||||
|
||||
vector<string> tokenize(const string & str, const string & delimiters) {
|
||||
//tokenizes a string by the delimiter passed in
|
||||
vector<string> tokens;
|
||||
string::size_type lastPos = str.find_first_not_of(delimiters, 0);
|
||||
string::size_type pos = str.find_first_of(delimiters, lastPos);
|
||||
while (string::npos != pos or string::npos != lastPos)
|
||||
{
|
||||
tokens.push_back(str.substr(lastPos, pos - lastPos));
|
||||
lastPos = str.find_first_not_of(delimiters, pos);
|
||||
pos = str.find_first_of(delimiters, lastPos);
|
||||
}
|
||||
return tokens;
|
||||
}
|
||||
|
||||
bool parse_n_load(const string & input, string & name, string & type,
|
||||
double & pay_rate) {
|
||||
vector<string> tokens = tokenize(input);
|
||||
if(tokens.size() == 0) {
|
||||
return false;
|
||||
}
|
||||
type = tokens[0];
|
||||
if (not ( type == "A"
|
||||
or type == "F"
|
||||
or type == "H"
|
||||
or type == "S")) {
|
||||
return false;
|
||||
}
|
||||
pay_rate = atof(tokens[1].c_str());
|
||||
if(pay_rate == 0) {
|
||||
return false;
|
||||
}
|
||||
for(unsigned int i = 2; i < tokens.size(); i++) {
|
||||
name += tokens[i];
|
||||
if(i < tokens.size() - 1) {
|
||||
name += " ";
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
14
cs142/final/util.h
Normal file
14
cs142/final/util.h
Normal file
@ -0,0 +1,14 @@
|
||||
#ifndef __UTIL_H__
|
||||
#define __UTIL_H__
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void print(const string & in);
|
||||
vector<string> tokenize(const string & str, const string & delimiters=" ");
|
||||
bool parse_n_load(const string & input, string & name, string & type,
|
||||
double & pay_rate);
|
||||
|
||||
#endif
|
6
cs142/lab00/Makefile
Normal file
6
cs142/lab00/Makefile
Normal file
@ -0,0 +1,6 @@
|
||||
CPPFLAGS=-Wall -g -std=c++0x
|
||||
|
||||
all: hello_world
|
||||
|
||||
clean:
|
||||
rm -rv hello_world
|
10
cs142/lab00/hello_world.cpp
Normal file
10
cs142/lab00/hello_world.cpp
Normal file
@ -0,0 +1,10 @@
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
|
||||
cout << "Hello, world! My name is Derek McQuay."<< endl;
|
||||
cin.get();
|
||||
return 0;
|
||||
}
|
17
cs142/lab01/byu.cpp
Normal file
17
cs142/lab01/byu.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
|
||||
|
||||
cout << " Basic BYU Trivia\n" << endl;
|
||||
cout << " Questions Answers \n" << endl;
|
||||
cout << "What was the original name of BYU? Brigham Young Academy" << endl;
|
||||
cout << "When was BYA established? 1875" << endl;
|
||||
cout << "Who was the first \"permanent\" principal of BYA? Karl G. Maeser" << endl;
|
||||
cout << "When did BYA become BYU? 1903" << endl;
|
||||
cout << "To what sports conference do we belong? Mountain West Conference(MWC)" << endl;
|
||||
cout << "When did BYU win the national football title? 1984" << endl;
|
||||
cout << "Who won the Heisman Trophy in 1990? Ty Detmer" << endl;
|
||||
}
|
22
cs142/lab01/quiz.txt
Normal file
22
cs142/lab01/quiz.txt
Normal file
@ -0,0 +1,22 @@
|
||||
A
|
||||
D
|
||||
B
|
||||
A
|
||||
B
|
||||
C
|
||||
B
|
||||
B
|
||||
B
|
||||
B
|
||||
D
|
||||
B
|
||||
B
|
||||
C
|
||||
A
|
||||
C
|
||||
D
|
||||
A,C
|
||||
B
|
||||
B
|
||||
A,B,C,D
|
||||
so we can learn by doing rather than let someone else learn.
|
10
cs142/lab02/Makefile
Normal file
10
cs142/lab02/Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
CPPFLAGS=-Wall -g -std=c++0x
|
||||
|
||||
all: timer temperature binary
|
||||
|
||||
binary: binary.cpp
|
||||
temperature: temperature.cpp
|
||||
timer: timer.cpp
|
||||
|
||||
clean:
|
||||
rm -rv timer temperature binary
|
57
cs142/lab02/binary.cpp
Normal file
57
cs142/lab02/binary.cpp
Normal file
@ -0,0 +1,57 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
|
||||
int value;
|
||||
int first, second, third, fourth, fifth;
|
||||
vector<int> final;
|
||||
|
||||
cout << "please insert your number between 0 and 31" << endl;
|
||||
cin >> value;
|
||||
int prin = value%2;
|
||||
value = value/2;
|
||||
if(prin >=1)
|
||||
first = 1;
|
||||
else
|
||||
first = 0;
|
||||
final.push_back(first);
|
||||
prin = value%2;
|
||||
value = value/2;
|
||||
if(prin >=1)
|
||||
second = 1;
|
||||
else
|
||||
second = 0;
|
||||
final.push_back(second);
|
||||
prin = value%2;
|
||||
value = value/2;
|
||||
if(prin >= 1)
|
||||
third = 1;
|
||||
else
|
||||
third = 0;
|
||||
final.push_back(third);
|
||||
prin = value%2;
|
||||
value = value/2;
|
||||
if(prin >= 1)
|
||||
fourth = 1;
|
||||
else
|
||||
fourth = 0;
|
||||
final.push_back(fourth);
|
||||
prin = value%2;
|
||||
value = value/2;
|
||||
if(prin >= 1)
|
||||
fifth = 1;
|
||||
else
|
||||
fifth = 0;
|
||||
final.push_back(fifth);
|
||||
|
||||
cout <<fifth<<fourth<<third<<second<<first << endl;
|
||||
// for(unsigned int i = 0 ; i<final.size();i++) {
|
||||
|
||||
// cout << final[i];
|
||||
// }
|
||||
cout << "\n";
|
||||
|
||||
}
|
20
cs142/lab02/temperature.cpp
Normal file
20
cs142/lab02/temperature.cpp
Normal file
@ -0,0 +1,20 @@
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
|
||||
double temperature;
|
||||
cout << "please enter a temperature in degress Fahrenheit:" << endl;
|
||||
cin >> temperature;
|
||||
double celsius = (temperature-32) * 5/9;
|
||||
cout << "This is Fahrenheit as an int:" << endl;
|
||||
cout << (int) temperature << endl;
|
||||
cout << "This is Celsius as a double:" << endl;
|
||||
cout << celsius << endl;
|
||||
cout << "This is Celsius as an int:" << endl;
|
||||
cout << (int) celsius << endl;
|
||||
|
||||
|
||||
|
||||
}
|
30
cs142/lab02/timer.cpp
Normal file
30
cs142/lab02/timer.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void calculate (int a) {
|
||||
|
||||
int hours, minutes, seconds;
|
||||
|
||||
hours = (a / 3600);
|
||||
minutes = (a / 60) - (hours * 60);
|
||||
seconds = a % 60;
|
||||
|
||||
cout << "hours: " << hours << " minutes: " << minutes << " seconds: " << seconds << endl;
|
||||
|
||||
};
|
||||
|
||||
|
||||
int main() {
|
||||
|
||||
int time;
|
||||
cout << "please enter a number of seconds" << endl;
|
||||
cin >> time;
|
||||
cout << time << endl;
|
||||
cout << "absolute value of input " << abs (time) << endl;
|
||||
calculate(time);
|
||||
cout << "now with sqrt: " << endl;
|
||||
calculate(sqrt(time));
|
||||
}
|
||||
|
4
cs142/lab03/Makefile
Normal file
4
cs142/lab03/Makefile
Normal file
@ -0,0 +1,4 @@
|
||||
CXXFLAGS=-Wall -g -std=c++0x
|
||||
all: grade
|
||||
clean:
|
||||
rm -vf grade
|
13
cs142/lab03/class/main.cpp
Normal file
13
cs142/lab03/class/main.cpp
Normal file
@ -0,0 +1,13 @@
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "person.h"
|
||||
|
||||
#pragma once
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
|
||||
person p;
|
||||
p.get_grades();
|
||||
}
|
60
cs142/lab03/class/person.cpp
Normal file
60
cs142/lab03/class/person.cpp
Normal file
@ -0,0 +1,60 @@
|
||||
using namespace std;
|
||||
|
||||
#include "person.h"
|
||||
|
||||
#pragma once
|
||||
|
||||
void person::get_latedays() {
|
||||
|
||||
cout << "Please enter if it was turned in earlier or late (earlier with a negative number): " << endl;
|
||||
cin >> late_days;
|
||||
total_latedays = total_latedays + late_days;
|
||||
}
|
||||
|
||||
void person::get_exam_latedays(){
|
||||
cout << "Please enter if it was turned in in late (number of late days): " << endl;
|
||||
cin >> late_days_exam;
|
||||
late_days_exam = abs(late_days_exam);
|
||||
total_latedays_exam = total_latedays_exam + late_days_exam;
|
||||
}
|
||||
|
||||
void person::calculate_grade() {
|
||||
|
||||
grade = lab1 + lab2 + lab3 + lab4 + lab5 + lab6 + lab7 + lab8 + lab9 + lab10 + lab11 + exam1 + exam2 + final;
|
||||
}
|
||||
|
||||
|
||||
void person::get_grades(){
|
||||
|
||||
cout << "please enter the name of the student: " << endl;
|
||||
cout << "now we are going to enter the following grades for the student: " << endl;
|
||||
cout << "Grade for lab 01: " << endl;
|
||||
cin >> lab1;
|
||||
cout << "Grade for lab 02; " << endl;
|
||||
cin >> lab2;
|
||||
cout << "Grade for lab 03; " << endl;
|
||||
cin >> lab3;
|
||||
cout << "Grade for lab 04; " << endl;
|
||||
cin >> lab4;
|
||||
cout << "Grade for lab 05; " << endl;
|
||||
cin >> lab5;
|
||||
cout << "Grade for lab 06; " << endl;
|
||||
cin >> lab6;
|
||||
cout << "Grade for lab 07; " << endl;
|
||||
cin >> lab7;
|
||||
cout << "Grade for lab 08; " << endl;
|
||||
cin >> lab8;
|
||||
cout << "Grade for lab 09; " << endl;
|
||||
cin >> lab9;
|
||||
cout << "Grade for lab 10; " << endl;
|
||||
cin >> lab10;
|
||||
cout << "Grade for lab 11; " << endl;
|
||||
cin >> lab11;
|
||||
cout << "Grade for exam 1: " << endl;
|
||||
cin >> exam1;
|
||||
cout << "Grade for exam 2: " << endl;
|
||||
cin >> exam2;
|
||||
cout << "Grade for final: " << endl;
|
||||
cin >> final;
|
||||
cout << "Please enter how many days late the final was: " << endl;
|
||||
}
|
24
cs142/lab03/class/person.h
Normal file
24
cs142/lab03/class/person.h
Normal file
@ -0,0 +1,24 @@
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class person
|
||||
{
|
||||
|
||||
|
||||
private:
|
||||
string person_name;
|
||||
int lab1, lab2, lab3, lab4, lab5, lab6, lab7, lab8, lab9, lab10, lab11, exam1, exam2, final;
|
||||
int late_days, total_latedays, late_days_exam, total_latedays_exam;
|
||||
int grade;
|
||||
|
||||
public:
|
||||
|
||||
person(){};
|
||||
void get_latedays();
|
||||
void get_exam_latedays();
|
||||
void calculate_grade();
|
||||
void get_grades();
|
||||
|
||||
};
|
304
cs142/lab03/grade.cpp
Normal file
304
cs142/lab03/grade.cpp
Normal file
@ -0,0 +1,304 @@
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
struct student {
|
||||
string name;
|
||||
int grade;
|
||||
string letter_grade;
|
||||
|
||||
};
|
||||
|
||||
int main() {
|
||||
// this is incorrect: typedef struct student1;
|
||||
struct student student1;
|
||||
struct student student2;
|
||||
int lab1, lab2, lab3, lab4, lab5, lab6, lab7, lab8, lab9, lab10, lab11;
|
||||
int exam1, exam2, final;
|
||||
int late_days;
|
||||
int late_daytotal = 0;
|
||||
int exam_late_days;
|
||||
int exam_late_days_total = 0;
|
||||
string name;
|
||||
|
||||
for(int i = 1; i<3; i++){
|
||||
cout << "Please enter name of student: " << endl;
|
||||
cin >> name;
|
||||
cout << "Please enter grade for lab 1: " << endl;
|
||||
cin >> lab1;
|
||||
if(lab1 >20 or lab1 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-2 or late_days > 2){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter grade for lab 2: " << endl;
|
||||
cin >> lab2;
|
||||
if(lab2 >20 or lab2 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-2 or late_days > 2){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter grade for lab 3: " << endl;
|
||||
cin >> lab3;
|
||||
if(lab3 >30 or lab3 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-3 or late_days > 3){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter grade for lab 4: " << endl;
|
||||
cin >> lab4;
|
||||
if(lab4 >30 or lab4 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-3 or late_days > 3){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter grade for lab 5: " << endl;
|
||||
cin >> lab5;
|
||||
if(lab5 >30 or lab5 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-3 or late_days > 3){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter grade for lab 6: " << endl;
|
||||
cin >> lab6;
|
||||
if(lab6 >30 or lab6 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-3 or late_days > 3){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter grade for lab 7: " << endl;
|
||||
cin >> lab7;
|
||||
if(lab7 >30 or lab7 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-3 or late_days > 3){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter grade for lab 8: " << endl;
|
||||
cin >> lab8;
|
||||
if(lab8 >30 or lab8 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-3 or late_days > 3){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter grade for lab 9: " << endl;
|
||||
cin >> lab9;
|
||||
if(lab9 >20 or lab9 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-2 or late_days > 2){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter grade for lab 10: " << endl;
|
||||
cin >> lab10;
|
||||
if(lab10 >20 or lab10 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-2 or late_days > 2){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter grade for lab 11: " << endl;
|
||||
cin >> lab11;
|
||||
if(lab11 >40 or lab11 < 0){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?: (indicate early days by negative number, late days by positive" << endl;
|
||||
cin >> late_days;
|
||||
if(late_days <-4 or late_days > 4){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
late_daytotal = late_daytotal + late_days;
|
||||
cout << "Please enter exam 1 score: " << endl;
|
||||
cin >> exam1;
|
||||
if(exam1 < 0 or exam1 > 100){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?" << endl;
|
||||
cin >> exam_late_days;
|
||||
if(exam_late_days < 0 or exam_late_days > 3){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
exam_late_days_total = exam_late_days_total + exam_late_days;
|
||||
cout << "Please enter exam 2 score: " << endl;
|
||||
cin >> exam2;
|
||||
if(exam2 < 0 or exam2 > 100){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?" << endl;
|
||||
cin >> exam_late_days;
|
||||
if(exam_late_days < 0 or exam_late_days > 3){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
exam_late_days_total = exam_late_days_total + exam_late_days;
|
||||
cout << "Please enter final score: " << endl;
|
||||
cin >> final;
|
||||
if(final < 0 or final > 100){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
cout << "Were there late days/early days?" << endl;
|
||||
cin >> exam_late_days;
|
||||
if(exam_late_days < 0 or exam_late_days > 3){
|
||||
cout << "This is not in the range!" << endl;
|
||||
return 0;
|
||||
}
|
||||
exam_late_days_total = exam_late_days_total + exam_late_days;
|
||||
|
||||
int total_labs = lab1+lab2+lab3+lab4+lab5+lab6+lab7+lab8+lab9+lab10+lab11;
|
||||
int total_exam = exam1 + exam2 + final;
|
||||
int final_grade = total_labs + total_exam;
|
||||
if(late_daytotal < 0){
|
||||
final_grade = final_grade + abs(late_daytotal);
|
||||
}
|
||||
else{
|
||||
final_grade = final_grade - late_daytotal;
|
||||
}
|
||||
final_grade = final_grade - exam_late_days_total*20;
|
||||
string letter_grade;
|
||||
if(final_grade >= 570)
|
||||
letter_grade = "A";
|
||||
if(final_grade <570 && final_grade >=540)
|
||||
letter_grade = "A-";
|
||||
if(final_grade < 540 && final_grade >= 522)
|
||||
letter_grade = "B+";
|
||||
if(final_grade < 522 && final_grade >= 498)
|
||||
letter_grade = "B";
|
||||
if(final_grade < 498 && final_grade >= 480)
|
||||
letter_grade = "B-";
|
||||
if(final_grade < 480 && final_grade >= 462)
|
||||
letter_grade = "C+";
|
||||
if(final_grade < 462 && final_grade >= 438)
|
||||
letter_grade = "C";
|
||||
if(final_grade < 438 && final_grade >= 420)
|
||||
letter_grade = "C-";
|
||||
if(final_grade < 420 && final_grade >= 402)
|
||||
letter_grade = "D+";
|
||||
if(final_grade < 402 && final_grade >= 378)
|
||||
letter_grade = "D";
|
||||
if(final_grade < 378 && final_grade >= 360)
|
||||
letter_grade = "D-";
|
||||
if(final_grade < 360)
|
||||
letter_grade = "E";
|
||||
|
||||
// something looks iffy here: (check your warnings (read all the words (even 'assignment')))
|
||||
if (i == 1) {
|
||||
student1.name = name;
|
||||
student1.grade = final_grade;
|
||||
student1.letter_grade = letter_grade;
|
||||
}
|
||||
else {
|
||||
student2.name = name;
|
||||
student2.grade = final_grade;
|
||||
student2.letter_grade = letter_grade;
|
||||
}
|
||||
}
|
||||
int order = 0;
|
||||
cout << "Please enter what order you want to see the students: " << endl;
|
||||
cout << "enter 1 for alphabetical or 2 for highest score first: " << endl;
|
||||
cin >> order;
|
||||
if(order > 2 or order < 1) {
|
||||
cout << "out of range" <<endl;
|
||||
return 0;
|
||||
}
|
||||
if(order == 1){
|
||||
if(student1.name < student2.name) {
|
||||
cout << "name " << student1.name << endl;
|
||||
cout << "points " << student1.grade << endl;
|
||||
cout << "letter grade " << student1.letter_grade << endl;
|
||||
cout << "name " << student2.name << endl;
|
||||
cout << "points " << student2.grade << endl;
|
||||
cout << "letter grade " << student2.letter_grade << endl;
|
||||
}
|
||||
else {
|
||||
cout << "name " << student2.name << endl;
|
||||
cout << "points " << student2.grade << endl;
|
||||
cout << "letter grade " << student2.letter_grade << endl;
|
||||
cout << "name " << student1.name << endl;
|
||||
cout << "points " << student1.grade << endl;
|
||||
cout << "letter grade " << student1.letter_grade << endl;
|
||||
}
|
||||
}
|
||||
if(order == 2){
|
||||
if(student1.grade > student2.grade){
|
||||
cout << "name " << student1.name << endl;
|
||||
cout << "points " << student1.grade << endl;
|
||||
cout << "letter grade " << student1.letter_grade << endl;
|
||||
cout << "name " << student2.name << endl;
|
||||
cout << "points " << student2.grade << endl;
|
||||
cout << "letter grade " << student2.letter_grade << endl;
|
||||
}
|
||||
else {
|
||||
cout << "name " << student2.name << endl;
|
||||
cout << "points " << student2.grade << endl;
|
||||
cout << "letter grade " << student2.letter_grade << endl;
|
||||
cout << "name " << student1.name << endl;
|
||||
cout << "points " << student1.grade << endl;
|
||||
cout << "letter grade " << student1.letter_grade << endl;
|
||||
}
|
||||
}
|
||||
}
|
16
cs142/lab03/quick.cpp
Normal file
16
cs142/lab03/quick.cpp
Normal file
@ -0,0 +1,16 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main () {
|
||||
|
||||
string a, b;
|
||||
cin >> a;
|
||||
cin >> b;
|
||||
|
||||
if(a<b)
|
||||
cout << "first is before last" << endl;
|
||||
else
|
||||
cout << "Second is before first" << endl;
|
||||
}
|
59
cs142/lab03/test.txt
Normal file
59
cs142/lab03/test.txt
Normal file
@ -0,0 +1,59 @@
|
||||
derek
|
||||
20
|
||||
-2
|
||||
20
|
||||
-2
|
||||
30
|
||||
-2
|
||||
30
|
||||
-2
|
||||
30
|
||||
-2
|
||||
30
|
||||
-2
|
||||
30
|
||||
-2
|
||||
30
|
||||
0
|
||||
20
|
||||
0
|
||||
20
|
||||
0
|
||||
40
|
||||
0
|
||||
100
|
||||
2
|
||||
0
|
||||
0
|
||||
100
|
||||
0
|
||||
alex
|
||||
20
|
||||
-2
|
||||
20
|
||||
1
|
||||
30
|
||||
1
|
||||
30
|
||||
1
|
||||
30
|
||||
1
|
||||
30
|
||||
1
|
||||
30
|
||||
0
|
||||
30
|
||||
0
|
||||
20
|
||||
0
|
||||
20
|
||||
0
|
||||
40
|
||||
0
|
||||
100
|
||||
0
|
||||
100
|
||||
0
|
||||
100
|
||||
1
|
||||
1
|
7
cs142/lab04/Makefile
Normal file
7
cs142/lab04/Makefile
Normal file
@ -0,0 +1,7 @@
|
||||
CXXFLAGS=-Wall -g -std=c++0x
|
||||
all: number
|
||||
clean:
|
||||
rm -vf number
|
||||
|
||||
test: all
|
||||
./number
|
53
cs142/lab04/loops.py
Normal file
53
cs142/lab04/loops.py
Normal file
@ -0,0 +1,53 @@
|
||||
import random
|
||||
import time
|
||||
|
||||
|
||||
def get_numbers(pow2, compliment):
|
||||
numbers = []
|
||||
constant = compliment
|
||||
for i in (0, 1):
|
||||
for j in (0, 1):
|
||||
for k in (0, 1):
|
||||
for l in (0, 1):
|
||||
if pow2 == 0:
|
||||
cur_digits = (i, j, k, l, constant)
|
||||
if pow2 == 1:
|
||||
cur_digits = (i, j, k, constant, l)
|
||||
if pow2 == 2:
|
||||
cur_digits = (i, j, constant, k, l)
|
||||
if pow2 == 3:
|
||||
cur_digits = (i, constant, j, k, l)
|
||||
if pow2 == 4:
|
||||
cur_digits = (constant, i, j, k, l)
|
||||
numbers.append(cur_digits)
|
||||
return numbers
|
||||
|
||||
print "example of how to use randomness to determine compliment"
|
||||
a_few_tries = xrange(3)
|
||||
for i in a_few_tries:
|
||||
compliment = random.randint(0, 3026) % 2
|
||||
for i in get_numbers(pow2=0, compliment=compliment):
|
||||
print i
|
||||
|
||||
print "for loop to print out all numbers from 2^0 to 2^5"
|
||||
for i in (0, 1):
|
||||
for j in (0, 1):
|
||||
for k in (0, 1):
|
||||
for l in (0, 1):
|
||||
for m in (0, 1):
|
||||
for n in (0, 1):
|
||||
print i, j, k, l, m
|
||||
|
||||
print "example function to convert a string in binary to integers: (see source)"
|
||||
def bin2int(s):
|
||||
total = 0
|
||||
for i in xrange(len(s)):
|
||||
if s[i] == '1':
|
||||
total += 2**(len(s) - i - 1)
|
||||
return total
|
||||
|
||||
|
||||
print "here I test out the bin2int func defined above:"
|
||||
test_cases = ('1010', '1011', '0100', '1000', '0111')
|
||||
for test in test_cases:
|
||||
print test, bin2int(test), int(test, 2)
|
111
cs142/lab04/number.cpp
Normal file
111
cs142/lab04/number.cpp
Normal file
@ -0,0 +1,111 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <cstdlib>
|
||||
#include <time.h>
|
||||
#include <sstream>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int bit2dec(string s);
|
||||
|
||||
vector<int> get_numbers(int pow, int compliment) {
|
||||
string store;
|
||||
vector<int> numbers;
|
||||
int constant = compliment;
|
||||
for(int i = 0; i < 2; i++){
|
||||
for(int j = 0; j < 2; j++){
|
||||
for(int k = 0; k < 2; k++){
|
||||
for(int l = 0; l < 2; l++){
|
||||
ostringstream stream;
|
||||
if(pow == 0){
|
||||
stream << i << j << k << l << constant;
|
||||
}
|
||||
else if(pow == 1){
|
||||
stream << i << j << k << constant << l;
|
||||
}
|
||||
else if(pow == 2){
|
||||
stream << i << j << constant << k << l;
|
||||
}
|
||||
else if(pow == 3){
|
||||
stream << i << constant << j << k << l;
|
||||
}
|
||||
else if(pow == 4){
|
||||
stream << constant << i << j << k << l;
|
||||
}
|
||||
store = stream.str();
|
||||
numbers.push_back(bit2dec(store));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return numbers;
|
||||
}
|
||||
|
||||
|
||||
ostream & operator<<(ostream & os, const vector<int> & nums) {
|
||||
for(unsigned int i = 0; i < nums.size(); i++){
|
||||
if(i % 4 == 0){
|
||||
os << endl;
|
||||
}
|
||||
os << nums[i] << " ";
|
||||
}
|
||||
return os;
|
||||
}
|
||||
|
||||
int bit2dec(string s) {
|
||||
|
||||
int total = 0;
|
||||
int power = 0;
|
||||
for(int i = s.size() - 1; i >= 0; i--) {
|
||||
if(s[i] == '1') {
|
||||
total += pow(2,power);
|
||||
}
|
||||
power++;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
|
||||
srand (time(NULL));
|
||||
int keep_playing = 0;
|
||||
while(keep_playing == 0){
|
||||
ostringstream answer;
|
||||
for(unsigned int i = 0; i < 5 ; i++) {
|
||||
int switcher = rand() % 2;
|
||||
string check;
|
||||
cout << "Is your number in this list? enter y for yes n for no" << endl;
|
||||
cout << get_numbers(i, switcher) << endl;
|
||||
cin >> check;
|
||||
if(switcher == 0){
|
||||
if(check == "y") {
|
||||
answer << '0';
|
||||
}
|
||||
else {
|
||||
answer << '1';
|
||||
}
|
||||
}
|
||||
if(switcher == 1) {
|
||||
if(check == "y") {
|
||||
answer << '1';
|
||||
}
|
||||
else {
|
||||
answer << '0';
|
||||
}
|
||||
}
|
||||
}
|
||||
string final = answer.str();
|
||||
reverse (final.begin(), final.end());
|
||||
cout << bit2dec(final) << endl;
|
||||
cout << "Do you want to keep playing? enter y for yes, n for no" << endl;
|
||||
string check;
|
||||
cin >> check;
|
||||
if(check == "n"){
|
||||
keep_playing++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
17
cs142/lab04/quick.cpp
Normal file
17
cs142/lab04/quick.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
|
||||
vector<int> numbers;
|
||||
|
||||
numbers.push_back(0);
|
||||
numbers.push_back(1);
|
||||
numbers.push_back(0);
|
||||
numbers.push_back(1);
|
||||
numbers.push_back(0);
|
||||
|
||||
cout << numbers[0] << numbers[1]<< numbers[2]<<numbers[3] << numbers[4] <<endl;
|
||||
}
|
10
cs142/lab05/Makefile
Normal file
10
cs142/lab05/Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
CXXFLAGS=-Wall -g -std=c++0x
|
||||
all: monopoly
|
||||
clean:
|
||||
rm -vf monopoly
|
||||
|
||||
test: all
|
||||
./monopoly
|
||||
|
||||
debug: all
|
||||
gdb monopoly
|
10
cs142/lab05/game/Makefile
Normal file
10
cs142/lab05/game/Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
CXXFLAGS=-Wall -g -std=c++0x
|
||||
all: monopoly
|
||||
clean:
|
||||
rm -vf monopoly
|
||||
|
||||
test: all
|
||||
./monopoly
|
||||
|
||||
debug: all
|
||||
gdb monopoly
|
18
cs142/lab05/game/game.cpp
Normal file
18
cs142/lab05/game/game.cpp
Normal file
@ -0,0 +1,18 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
struct property {
|
||||
string name;
|
||||
int value;
|
||||
}
|
||||
void create_board(vector<property> & board) {
|
||||
board.push_back(property{"mediterranean Avenue", 60}
|
||||
}
|
||||
|
||||
int main() {
|
||||
vector<property> board;
|
||||
cout << board.name << endl;
|
||||
|
||||
}
|
175
cs142/lab05/game/monopoly.cpp
Normal file
175
cs142/lab05/game/monopoly.cpp
Normal file
@ -0,0 +1,175 @@
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <time.h>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
struct property{
|
||||
string name;
|
||||
int value;
|
||||
};
|
||||
|
||||
void roll_the_dice() {
|
||||
srand(time(NULL));
|
||||
int roll = rand() % 6 +1;
|
||||
int roll2 = rand() % 6 +1;
|
||||
cout << roll << " + "<< roll2 << " equals " << roll +roll2 << endl;
|
||||
}
|
||||
|
||||
void report_current_money(int & current_money) {
|
||||
cout << "this is your current money" << endl;
|
||||
cout << current_money << endl;
|
||||
}
|
||||
|
||||
void add_money(int & current_money) {
|
||||
cout << "how much money would you like to add? " << endl;
|
||||
int add;
|
||||
cin >> add;
|
||||
if(add < 0){
|
||||
cout << "please enter a positive number" << endl;
|
||||
add_money(current_money);
|
||||
}
|
||||
else {
|
||||
current_money += add;
|
||||
cout << current_money << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void spend_money(int & current_money) {
|
||||
cout << "how much money would you like to spend? " << endl;
|
||||
int minus;
|
||||
cin >> minus;
|
||||
if(current_money - minus < 0) {
|
||||
cout << "This would result in a negative number!" << endl;
|
||||
}
|
||||
else {
|
||||
current_money -= minus;
|
||||
cout << current_money << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void pass_go(int & current_money) {
|
||||
cout << "you passed go, collect 200 dollars!" << endl;
|
||||
current_money += 200;
|
||||
}
|
||||
|
||||
bool has_property(vector<property> & props, string name) {
|
||||
bool has_prop = false;
|
||||
for(unsigned int i = 0; i < props.size(); i++) {
|
||||
if(name == props[i].name) {
|
||||
has_prop = true;
|
||||
}
|
||||
}
|
||||
return has_prop;
|
||||
}
|
||||
|
||||
void buy_property(vector<property> & properties, int & current_money) {
|
||||
bool success = false;
|
||||
int property_value = 0;
|
||||
string input_name;
|
||||
|
||||
|
||||
while(!success) {
|
||||
cout << "please enter property name: ";
|
||||
cin >> input_name;
|
||||
if (not has_property(properties, input_name) ){
|
||||
cout << "What is the value of your property?" << endl;
|
||||
cin >> property_value;
|
||||
while(property_value < 0) {
|
||||
cout << "incorrect property value. Please try again." << endl;
|
||||
cin >> property_value;
|
||||
}
|
||||
if(current_money - property_value < 0) {
|
||||
cout << "you dont have enough money to purchase this." << endl;
|
||||
break;
|
||||
}
|
||||
current_money -= property_value;
|
||||
properties.push_back(property{input_name, property_value});
|
||||
success = true;
|
||||
}
|
||||
else {
|
||||
cerr << "you already have that property" << endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void sell_property(vector<property> & properties, int & current_money) {
|
||||
string property_to_sell;
|
||||
cout << "please enter the property name you would like to sell: " << endl;
|
||||
cin >> property_to_sell;
|
||||
if(has_property(properties, property_to_sell)) {
|
||||
for(unsigned int i = 0; i < properties.size(); i++) {
|
||||
if(properties[i].name == property_to_sell) {
|
||||
current_money += properties[i].value;
|
||||
properties.erase(properties.begin()+i);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout << "you dont own that property to be able to sell it" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void quit_game() {
|
||||
cout << "thanks for playing!" << endl;
|
||||
exit (0);
|
||||
}
|
||||
|
||||
ostream & operator<<(ostream & os, const property & prop) {
|
||||
os << "{name: '" << prop.name
|
||||
<< "', value: " << prop.value
|
||||
<< "}";
|
||||
return os;
|
||||
}
|
||||
|
||||
void display_properties(vector<property> & properties) {
|
||||
cout << "found the following "
|
||||
<< properties.size() << " properties:" << endl;
|
||||
for(unsigned int i = 0; i < properties.size(); i++) {
|
||||
cout << properties[i] << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void play_game(vector<property> & properties, int & current_money) {
|
||||
|
||||
bool keep_playing = true;
|
||||
while(keep_playing){
|
||||
int choice;
|
||||
cout << "Welcome to Monopoly" << endl;
|
||||
cout << "please enter a number correspoding to what function you would like to run" << endl;
|
||||
cout << "1) Roll the dice\n2) Report the player's current money\n3) Add money\n4) Spend money" << endl;
|
||||
cout << "5) Pass GO\n6) Buy Property\n7)Sell Property\n8)Display owned properties\n9) Quit the program" << endl;
|
||||
cin >> choice;
|
||||
if(choice == 1)
|
||||
roll_the_dice();
|
||||
else if(choice == 2)
|
||||
report_current_money(current_money);
|
||||
else if(choice == 3)
|
||||
add_money(current_money);
|
||||
else if(choice == 4)
|
||||
spend_money(current_money);
|
||||
else if(choice == 5)
|
||||
pass_go(current_money);
|
||||
else if(choice == 6)
|
||||
buy_property(properties, current_money);
|
||||
else if(choice == 7)
|
||||
sell_property(properties, current_money);
|
||||
else if(choice == 8)
|
||||
display_properties(properties);
|
||||
else if(choice == 9)
|
||||
quit_game();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main() {
|
||||
int current_money = 1500;
|
||||
vector<property> properties;
|
||||
play_game(properties, current_money);
|
||||
|
||||
return 0;
|
||||
}
|
40
cs142/lab05/game/properties/properties_in_order.txt
Normal file
40
cs142/lab05/game/properties/properties_in_order.txt
Normal file
@ -0,0 +1,40 @@
|
||||
Mediterranean Avenue -60
|
||||
Community Chest
|
||||
Baltic Avenue - 60
|
||||
Income Tax
|
||||
Reading Railroad - 200
|
||||
Oriental Avenue - 100
|
||||
Chance
|
||||
Vermont Avenue - 100
|
||||
Connecticut Avenue - 120
|
||||
Jail
|
||||
St. Charles Place - 140
|
||||
Electric Company - 150
|
||||
States Avenue - 140
|
||||
Virginia Avenue - 160
|
||||
Pennsylvania Railroad - 200
|
||||
St. James Place - 180
|
||||
Community Chest
|
||||
Tennessee Avenue - 180
|
||||
New York Avenue - 200
|
||||
Free parking
|
||||
Kentucky Avenue - 220
|
||||
Chance
|
||||
Indiana Avenue - 220
|
||||
Illinois Avenue - 240
|
||||
B&O Railroad - 200
|
||||
Atlantic Avenue - 260
|
||||
Ventnor Avenue - 260
|
||||
Water Works - 150
|
||||
Marvin Gardens - 280
|
||||
Go to jail
|
||||
Pacific avenue - 300
|
||||
North Carolina Avenue - 300
|
||||
Community chest
|
||||
Pennsylvania Avenue - 320
|
||||
Short line - 200
|
||||
Chance
|
||||
Park Place - 350
|
||||
Luxury tax
|
||||
Boardwalk - 400
|
||||
Go
|
182
cs142/lab05/monopoly.cpp
Normal file
182
cs142/lab05/monopoly.cpp
Normal file
@ -0,0 +1,182 @@
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
struct property{
|
||||
string name;
|
||||
int value;
|
||||
};
|
||||
|
||||
void roll_the_dice() {
|
||||
srand(time(NULL));
|
||||
int roll = rand() % 6 +1;
|
||||
int roll2 = rand() % 6 +1;
|
||||
cout << roll << " + "<< roll2 << " equals " << roll +roll2 << endl;
|
||||
}
|
||||
|
||||
void report_current_money(int & current_money) {
|
||||
cout << "this is your current money" << endl;
|
||||
cout << current_money << endl;
|
||||
}
|
||||
|
||||
void add_money(int & current_money) {
|
||||
cout << "how much money would you like to add? " << endl;
|
||||
int add;
|
||||
cin >> add;
|
||||
if(add < 0){
|
||||
cout << "please enter a positive number" << endl;
|
||||
add_money(current_money);
|
||||
}
|
||||
else {
|
||||
current_money += add;
|
||||
cout << current_money << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void spend_money(int & current_money) {
|
||||
cout << "how much money would you like to spend? " << endl;
|
||||
int minus;
|
||||
cin >> minus;
|
||||
if(current_money - minus < 0) {
|
||||
cout << "This would result in a negative number!" << endl;
|
||||
}
|
||||
else {
|
||||
current_money -= minus;
|
||||
cout << current_money << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void pass_go(int & current_money) {
|
||||
cout << "you passed go, collect 200 dollars!" << endl;
|
||||
current_money += 200;
|
||||
}
|
||||
|
||||
bool has_property(vector<property> & props, string name) {
|
||||
bool has_prop = false;
|
||||
for(unsigned int i = 0; i < props.size(); i++) {
|
||||
if(name == props[i].name) {
|
||||
has_prop = true;
|
||||
}
|
||||
}
|
||||
return has_prop;
|
||||
}
|
||||
|
||||
void buy_property(vector<property> & properties, int & current_money) {
|
||||
bool success = false;
|
||||
int property_value = 0;
|
||||
string input_name;
|
||||
|
||||
|
||||
while(!success) {
|
||||
cout << "please enter property name: ";
|
||||
cin >> input_name;
|
||||
if (not has_property(properties, input_name) ){
|
||||
cout << "What is the value of your property?" << endl;
|
||||
cin >> property_value;
|
||||
while(property_value < 0) {
|
||||
cout << "incorrect property value. Please try again." << endl;
|
||||
cin >> property_value;
|
||||
}
|
||||
if(current_money - property_value < 0) {
|
||||
cout << "you dont have enough money to purchase this." << endl;
|
||||
break;
|
||||
}
|
||||
current_money -= property_value;
|
||||
properties.push_back(property{input_name, property_value});
|
||||
success = true;
|
||||
}
|
||||
else {
|
||||
cerr << "you already have that property" << endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void sell_property(vector<property> & properties, int & current_money) {
|
||||
string property_to_sell;
|
||||
cout << "please enter the property name you would like to sell: " << endl;
|
||||
cin >> property_to_sell;
|
||||
if(has_property(properties, property_to_sell)) {
|
||||
for(unsigned int i = 0; i < properties.size(); i++) {
|
||||
if(properties[i].name == property_to_sell) {
|
||||
cout << "enter value for sale" << endl;
|
||||
int sale;
|
||||
cin >> sale;
|
||||
if(sale < 0){
|
||||
cout << "can't be nagative" << endl;
|
||||
break;
|
||||
}
|
||||
properties[i].value = sale;
|
||||
current_money += properties[i].value;
|
||||
properties.erase(properties.begin()+i);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout << "you dont own that property to be able to sell it" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void quit_game() {
|
||||
cout << "thanks for playing!" << endl;
|
||||
exit (0);
|
||||
}
|
||||
|
||||
ostream & operator<<(ostream & os, const property & prop) {
|
||||
os << "{name: '" << prop.name
|
||||
<< "', value: " << prop.value
|
||||
<< "}";
|
||||
return os;
|
||||
}
|
||||
|
||||
void display_properties(vector<property> & properties) {
|
||||
cout << "found the following "
|
||||
<< properties.size() << " properties:" << endl;
|
||||
for(unsigned int i = 0; i < properties.size(); i++) {
|
||||
cout << properties[i] << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void play_game(vector<property> & properties, int & current_money) {
|
||||
|
||||
bool keep_playing = true;
|
||||
while(keep_playing){
|
||||
int choice;
|
||||
cout << "Welcome to Monopoly" << endl;
|
||||
cout << "please enter a number correspoding to what function you would like to run" << endl;
|
||||
cout << "1) Roll the dice\n2) Report the player's current money\n3) Add money\n4) Spend money" << endl;
|
||||
cout << "5) Pass GO\n6) Buy Property\n7)Sell Property\n8)Display owned properties\n9) Quit the program" << endl;
|
||||
cin >> choice;
|
||||
if(choice == 1)
|
||||
roll_the_dice();
|
||||
else if(choice == 2)
|
||||
report_current_money(current_money);
|
||||
else if(choice == 3)
|
||||
add_money(current_money);
|
||||
else if(choice == 4)
|
||||
spend_money(current_money);
|
||||
else if(choice == 5)
|
||||
pass_go(current_money);
|
||||
else if(choice == 6)
|
||||
buy_property(properties, current_money);
|
||||
else if(choice == 7)
|
||||
sell_property(properties, current_money);
|
||||
else if(choice == 8)
|
||||
display_properties(properties);
|
||||
else if(choice == 9)
|
||||
quit_game();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main() {
|
||||
int current_money = 1500;
|
||||
vector<property> properties;
|
||||
play_game(properties, current_money);
|
||||
|
||||
return 0;
|
||||
}
|
6
cs142/lab06/Makefile
Normal file
6
cs142/lab06/Makefile
Normal file
@ -0,0 +1,6 @@
|
||||
CXXFLAGS=-Wall -g -std=c++0x
|
||||
all: add-display
|
||||
clean:
|
||||
rm -vf add-display
|
||||
test: all
|
||||
./add-display
|
211
cs142/lab06/add-display.cpp
Normal file
211
cs142/lab06/add-display.cpp
Normal file
@ -0,0 +1,211 @@
|
||||
#include <iostream>
|
||||
#include <array>
|
||||
#include <time.h>
|
||||
#include <ctime>
|
||||
#include <functional>
|
||||
#include <cstdlib>
|
||||
#include <algorithm>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void display_all_restaurants(array<string, 16> & restaurants, int & current_size) {
|
||||
for(int i = 0; i <= current_size - 1; i++) {
|
||||
if(i == current_size - 1) {
|
||||
cout << i << "-" << restaurants[i] << endl;
|
||||
}
|
||||
else {
|
||||
cout << i << "-" << restaurants[i] << ", ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void add_a_restaurant(array<string, 16> & restaurants, int & current_size) {
|
||||
string name;
|
||||
bool correct_entry = true;
|
||||
cout << "please enter name of restaurant: " << endl;
|
||||
cin.ignore();
|
||||
getline(cin, name);
|
||||
if(current_size >= 16) {
|
||||
cout << "The array already has 16 restaurants and you can't add anymore." << endl;
|
||||
}
|
||||
else {
|
||||
for(int i = 0; i <= current_size - 1; i++) {
|
||||
if(restaurants[i] == name) {
|
||||
correct_entry = false;
|
||||
}
|
||||
}
|
||||
if(correct_entry == true) {
|
||||
restaurants[current_size] = name;
|
||||
current_size++;
|
||||
cout << "you added the restaurant " << name << endl;
|
||||
}
|
||||
else {
|
||||
cout << "this restaurant is already existant" << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void remove_a_restaurant(array<string, 16> & restaurants, int & current_size) {
|
||||
string name;
|
||||
bool correct_entry = false;
|
||||
cout << "Please enter name of restaurant you would like to remove: " << endl;
|
||||
cin.ignore();
|
||||
getline(cin, name);
|
||||
for(int i = 0; i <= current_size -1; i++) {
|
||||
if(i == current_size && restaurants[i] == name) {
|
||||
current_size--;
|
||||
cout << name << " has been removed" << endl;
|
||||
}
|
||||
if(restaurants[i] == name) {
|
||||
restaurants[i] = restaurants[current_size -1];
|
||||
current_size--;
|
||||
correct_entry = true;
|
||||
cout << name << " has been removed" << endl;
|
||||
}
|
||||
}
|
||||
if(correct_entry == false) {
|
||||
cout << "restaurant does not exist" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void shuffle_array(array<string, 16> & restaurants, int current_size) {
|
||||
random_shuffle (&restaurants[0], &restaurants[current_size]);
|
||||
}
|
||||
|
||||
int round_counter(int current_size) {
|
||||
int round;
|
||||
if(current_size == 16) {
|
||||
round = 4;
|
||||
}
|
||||
else if(current_size == 8) {
|
||||
round = 3;
|
||||
}
|
||||
else if(current_size == 4) {
|
||||
round = 2;
|
||||
}
|
||||
else if(current_size == 2) {
|
||||
round =1;
|
||||
}
|
||||
return round;
|
||||
}
|
||||
|
||||
int match_counter(int current_size) {
|
||||
int match;
|
||||
if(current_size == 16) {
|
||||
match = 8;
|
||||
}
|
||||
else if(current_size == 8) {
|
||||
match = 4;
|
||||
}
|
||||
else if(current_size == 4) {
|
||||
match = 2;
|
||||
}
|
||||
else if(current_size == 2) {
|
||||
match =1;
|
||||
}
|
||||
return match;
|
||||
}
|
||||
|
||||
void begin_tournament(array<string, 16> & restaurants, int & current_size) {
|
||||
bool temp_bool = true;
|
||||
bool tourn_running = true;
|
||||
cin.ignore();
|
||||
string name;
|
||||
int match = match_counter(current_size);
|
||||
int round = round_counter(current_size);
|
||||
int current_round = 1;
|
||||
array<string,8> temp_array;
|
||||
while(tourn_running == true) {
|
||||
int current_match = 1;
|
||||
int place = 0;
|
||||
temp_bool = true;
|
||||
cin.ignore();
|
||||
for(int i = 0; i < current_size; i += 2) {
|
||||
while(temp_bool == true) {
|
||||
cout << "which restaurant: " << restaurants[i] << " or " << restaurants[i + 1] << endl;
|
||||
cout << "match " << current_match << "/" << match << " Round "
|
||||
<< current_round << "/" << round << endl;
|
||||
getline(cin, name);
|
||||
if(name == restaurants[i] or name == restaurants[i + 1]) {
|
||||
if(name == restaurants[i]) {
|
||||
temp_array[place] = name;
|
||||
}
|
||||
else {
|
||||
temp_array[place] = name;
|
||||
}
|
||||
place ++;
|
||||
temp_bool = false;
|
||||
current_match++;
|
||||
}
|
||||
else {
|
||||
cout << "invalid response " << name << endl;
|
||||
}
|
||||
}
|
||||
temp_bool = true;
|
||||
}
|
||||
while(temp_bool == true) {
|
||||
for(int i = 0; i < place; i++) {
|
||||
restaurants[i] = temp_array[i];
|
||||
}
|
||||
current_size = current_size/2;
|
||||
if(current_size == 1) {
|
||||
cout << "this is the winner " << restaurants[0] << endl;
|
||||
exit(0);
|
||||
}
|
||||
else {
|
||||
cout << "next round of tournament" << endl;
|
||||
temp_bool = false;
|
||||
}
|
||||
}
|
||||
match = match/2;
|
||||
current_round++;
|
||||
}
|
||||
}
|
||||
|
||||
void test_size(array<string,16> & restaurants, int & current_size) {
|
||||
if(current_size ==2 or current_size ==4 or current_size ==8 or current_size == 16) {
|
||||
cout << "you have 2^n" << endl;
|
||||
begin_tournament(restaurants, current_size);
|
||||
}
|
||||
else {
|
||||
cout << "you dont have 2^n number of restaurants, please remove or enter more" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
array<string,16> restaurants = {{
|
||||
"cafe rio",
|
||||
"india palace",
|
||||
"panda express",
|
||||
"subway",
|
||||
"quiznos",
|
||||
"olive garden",
|
||||
"jimmy johns",
|
||||
"cougareat",
|
||||
}};
|
||||
bool temp = true;
|
||||
int current_size = 8;
|
||||
srand(time(NULL));
|
||||
while(temp == true) {
|
||||
int input;
|
||||
cout << "pick a function" << endl;
|
||||
cout << "1)Display all restaurants\n2)Add a restaurant\n3)Remove a restaurant" << endl;
|
||||
cout << "4)Shufflle the array\n5)Begin the tournament" << endl;
|
||||
cin >> input;
|
||||
if(input == 1){
|
||||
display_all_restaurants(restaurants, current_size);
|
||||
}
|
||||
if(input == 2){
|
||||
add_a_restaurant(restaurants, current_size);
|
||||
}
|
||||
if(input == 3){
|
||||
remove_a_restaurant(restaurants, current_size);
|
||||
}
|
||||
if(input == 4){
|
||||
shuffle_array(restaurants, current_size);
|
||||
}
|
||||
if(input == 5){
|
||||
test_size(restaurants, current_size);
|
||||
}
|
||||
}
|
||||
}
|
42
cs142/lab06/array.cpp
Normal file
42
cs142/lab06/array.cpp
Normal file
@ -0,0 +1,42 @@
|
||||
#include <iostream>
|
||||
#include <array>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
array<string,16> test;
|
||||
for(unsigned int i = 0; i < test.size(); i++) {
|
||||
string a;
|
||||
cout << i << " enter name" << endl;
|
||||
cin >> a;
|
||||
test[i] = a;
|
||||
|
||||
}
|
||||
int a = 0;
|
||||
cout << "i++" << endl;
|
||||
for(unsigned int i = 0; i < test.size(); i++) {
|
||||
cout << test[i] << "-" << i << " /";
|
||||
}
|
||||
cout << "" << endl;
|
||||
cout << "i--" << endl;
|
||||
for(unsigned int i = 15; i > 0; i--) {
|
||||
cout << test[i] << "-" << i << " /";
|
||||
}
|
||||
cout << "" << endl;
|
||||
cout << test.size() << " size of thing" << endl;
|
||||
cout << "" << endl;
|
||||
for(unsigned int i = 0; i < test.size(); i++) {
|
||||
if(test[i] == "derek") {
|
||||
a = i;
|
||||
}
|
||||
}
|
||||
for(a; a < test.size(); a++) {
|
||||
int b = a;
|
||||
test[a] = test[b++];
|
||||
}
|
||||
cout << "something happening here" << a << " is where derek is" << endl;
|
||||
for(unsigned int i = 0; i < test.size(); i++) {
|
||||
cout << test[i] << "-" << i << " /";
|
||||
}
|
||||
cout << "" << endl;
|
||||
}
|
10
cs142/lab06/test.txt
Normal file
10
cs142/lab06/test.txt
Normal file
@ -0,0 +1,10 @@
|
||||
derek
|
||||
colleen
|
||||
adeline
|
||||
sylas
|
||||
emmett
|
||||
stephen
|
||||
vanessa
|
||||
mardson
|
||||
4
|
||||
1
|
29
cs142/lab07/Makefile
Normal file
29
cs142/lab07/Makefile
Normal file
@ -0,0 +1,29 @@
|
||||
CXX=g++
|
||||
CPPFLAGS=-Wall -g -std=c++0x
|
||||
SOURCES=cookies.cpp
|
||||
OBJECTS=$(SOURCES:.cpp=.o)
|
||||
EXE=cookie
|
||||
|
||||
all: $(EXE)
|
||||
|
||||
$(EXE): $(OBJECTS)
|
||||
$(CXX) $(LDFLAGS) $(OBJECTS) -o $@
|
||||
|
||||
|
||||
clean:
|
||||
@rm -vf *.o
|
||||
@rm -rvf *.dSYM
|
||||
@rm -vf $(EXE)
|
||||
|
||||
|
||||
run: $(EXE)
|
||||
./$(EXE)
|
||||
|
||||
debug: $(EXE)
|
||||
gdb $(EXE)
|
||||
|
||||
valgrind: $(EXE)
|
||||
valgrind --tool=memcheck --leak-check=yes ./$(EXE)
|
||||
|
||||
autov: $(EXE)
|
||||
valgrind --tool=memcheck --leak-check=yes ./$(EXE) < test.txt
|
250
cs142/lab07/cookies.cpp
Normal file
250
cs142/lab07/cookies.cpp
Normal file
@ -0,0 +1,250 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
string * findOrder(string * cookies[], int * size, string name);
|
||||
void addOrder(string * cookies[], int * size, string new_name);
|
||||
int deliverOrder(string * cookies[], int * size, string name);
|
||||
bool modifyOrder(string * cookies[], int * size, string original_name, string new_name);
|
||||
string displayOrders(string * cookies[], int * size);
|
||||
//-------------------------------------------------------------------------------------
|
||||
/*
|
||||
findOrder
|
||||
|
||||
Returns a memory address found in the given array that references a string with the same data
|
||||
as the given string. Returns null if no such string is found.
|
||||
|
||||
It is recommended that you use this function within your other functions. If you do not, you
|
||||
must still complete this function as described above.
|
||||
*/
|
||||
string * findOrder(string * cookies[], int * size, string name)
|
||||
{
|
||||
string * r = NULL;
|
||||
for(int i = 0; i < *size; i++) {
|
||||
if(*cookies[i] == name) {
|
||||
r = cookies[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------
|
||||
/*
|
||||
addOrder
|
||||
|
||||
Adds the memory address of a new string to the given array. The new string should have the
|
||||
same data as that of the given string.
|
||||
|
||||
A string may already exist containing the same data as the given string (ie, the string
|
||||
passed to this function as a parameter) and whose memory address is already stored within
|
||||
the given array. In this situation, add to the array the memory address of the string that
|
||||
already exists rather than creating a new string.
|
||||
|
||||
Update the reference of size appropriately.
|
||||
*/
|
||||
void addOrder(string * cookies[], int * size, string new_name) {
|
||||
string * found = findOrder(cookies, size, new_name);
|
||||
if(found == NULL) {
|
||||
cookies[*size] = new string(new_name);
|
||||
}
|
||||
else {
|
||||
cookies[*size] = found;
|
||||
}
|
||||
(*size)++;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------
|
||||
/*
|
||||
deliverOrder
|
||||
|
||||
Removes all references to strings containing the same data as the given string and reports
|
||||
the number of string references removed. The overall order of the list is unchanged.
|
||||
|
||||
Update the reference of size appropriately.
|
||||
*/
|
||||
int deliverOrder(string * cookies[], int * size, string name)
|
||||
{
|
||||
int removes = 0;
|
||||
for(int i = 0; i < *size; i++) {
|
||||
if(*cookies[i] == name) {
|
||||
for(int j = i; j < *size; j++) {
|
||||
cookies[j] = cookies[j+1];
|
||||
}
|
||||
*size = *size -1;
|
||||
removes++;
|
||||
i--;
|
||||
}
|
||||
}
|
||||
return removes;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------
|
||||
/*
|
||||
modifyOrder
|
||||
|
||||
Searches the given array for a memory address to a string that contains the same data as the
|
||||
first given string.
|
||||
|
||||
If found, the data of the found string is changed to match the data of the second given string,
|
||||
and the function returns true. If not found, the function returns false.
|
||||
*/
|
||||
bool modifyOrder(string * cookies[], int * size, string original_name, string new_name)
|
||||
{
|
||||
bool result = false;
|
||||
for(int i = 0; i < *size; i++) {
|
||||
if(*cookies[i] == original_name) {
|
||||
*cookies[i] = new_name;
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------
|
||||
/*
|
||||
displayOrders
|
||||
|
||||
Returns a string containing a list of names referred to in the given array.
|
||||
Each index in the array represents a particular box of cookies, and there may be more than
|
||||
one box for each customer. Therefore, this function's output may include the same name
|
||||
multiple times.
|
||||
*/
|
||||
string displayOrders(string * cookies[], int * size)
|
||||
{
|
||||
string r = "";
|
||||
for(int i = 0; i < *size; i++) {
|
||||
r += *cookies[i] + ", ";
|
||||
}
|
||||
return r;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
int getOption(int range);
|
||||
string getName(string message);
|
||||
//-------------------------------------------------------------------------------------
|
||||
int main()
|
||||
{
|
||||
const int MAXIMUM_SIZE = 10;
|
||||
string * cookies [MAXIMUM_SIZE] = {};
|
||||
int x = 0;
|
||||
int * size = &(x);
|
||||
|
||||
bool done = false;
|
||||
while(!done)
|
||||
{
|
||||
//Get menu option
|
||||
cout << "MENU:" << endl;
|
||||
cout << "\t1. Add an order\n\t2. Deliver an order\n\t3. Modify an order\n\t4. Quit\n" << endl;
|
||||
int option = getOption(4);
|
||||
|
||||
//Adding
|
||||
if(option==1)
|
||||
{
|
||||
if((*size) >= MAXIMUM_SIZE)
|
||||
{
|
||||
cout << "The car is full; cannot add more orders" << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
string new_name = getName("Please enter the customer's name for the new order:");
|
||||
addOrder(cookies, size, new_name);
|
||||
cout << "Cookies added for costumer [" << new_name << "]" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
//Delivering
|
||||
else if(option==2)
|
||||
{
|
||||
string name = getName("Please enter the customer's name for the delivery:");
|
||||
int delivered = deliverOrder(cookies, size, name);
|
||||
cout << "Delivered " << delivered << " boxes of cookies to [" << name << "]" << endl;
|
||||
}
|
||||
|
||||
//Modifying
|
||||
else if(option==3)
|
||||
{
|
||||
string original_name = getName("Please enter the original customer's name:");
|
||||
string new_name = getName("Please enter the new customer's name:");
|
||||
bool changed = modifyOrder(cookies,size,original_name,new_name);
|
||||
if(changed)
|
||||
{
|
||||
cout << "Changed name from [" << original_name << "] to [" << new_name << "]" << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
cout << "Could not find a customer with the name: [" << original_name << "]" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
//Quitting
|
||||
else if(option==4)
|
||||
{
|
||||
done = true;
|
||||
}
|
||||
|
||||
|
||||
cout << displayOrders(cookies, size) << endl;
|
||||
}
|
||||
|
||||
cout << "Thank you for using the cookie tracker!" << endl;
|
||||
//The following line may not work on all systems; therefore, you may change this line as needed
|
||||
// system("pause");
|
||||
return 0;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------
|
||||
int getOption(int range)
|
||||
{
|
||||
int input = 0;
|
||||
bool done = false;
|
||||
while(!done)
|
||||
{
|
||||
cout << "Please select an option:" << endl;
|
||||
input = 0;
|
||||
cin >> input;
|
||||
cin.ignore(1000,'\n');
|
||||
if(cin.fail())
|
||||
{
|
||||
cin.clear();
|
||||
cin.ignore(1000,'\n');
|
||||
cout << "Error: Invalid option" << endl;
|
||||
}
|
||||
else if(input < 1 || input > range)
|
||||
{
|
||||
cout << "Error: Invalid option number" << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
done = true;
|
||||
}
|
||||
}
|
||||
return input;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------
|
||||
string getName(string message)
|
||||
{
|
||||
string input = "";
|
||||
bool done = false;
|
||||
while(!done)
|
||||
{
|
||||
cout << message << endl;
|
||||
input = "";
|
||||
getline(cin, input);
|
||||
if(cin.fail())
|
||||
{
|
||||
cin.clear();
|
||||
cin.ignore(1000,'\n');
|
||||
cout << "Error: Invalid name" << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
done = true;
|
||||
}
|
||||
}
|
||||
return input;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------
|
18
cs142/lab07/test.txt
Normal file
18
cs142/lab07/test.txt
Normal file
@ -0,0 +1,18 @@
|
||||
1
|
||||
stephen
|
||||
1
|
||||
michael
|
||||
1
|
||||
michael
|
||||
1
|
||||
stephen
|
||||
1
|
||||
derek
|
||||
3
|
||||
stephen
|
||||
Stephen Mardson McQuay
|
||||
2
|
||||
michael
|
||||
2
|
||||
derek
|
||||
4
|
18
cs142/lab08/Makefile
Normal file
18
cs142/lab08/Makefile
Normal file
@ -0,0 +1,18 @@
|
||||
CXX=g++
|
||||
CPPFLAGS=-Wall -g -std=c++0x
|
||||
|
||||
all: people
|
||||
|
||||
people: main.o person.o
|
||||
g++ $(CPPFLAGS) person.o main.o -o people
|
||||
|
||||
main.o: main.cpp person.o person.h
|
||||
person.o: person.cpp person.h
|
||||
test: people
|
||||
./people < test.txt
|
||||
|
||||
clean:
|
||||
rm -fv people *.o
|
||||
|
||||
debug: people
|
||||
gdb people
|
106
cs142/lab08/main.cpp
Normal file
106
cs142/lab08/main.cpp
Normal file
@ -0,0 +1,106 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "person.h"
|
||||
|
||||
void display_list_of_friends(vector<person> & p) {
|
||||
for(unsigned int i = 0; i < p.size(); i++) {
|
||||
cout << p[i].name << endl;
|
||||
cout << "\t" << p[i].fav_food << endl;
|
||||
cout << "\tlist of friends: " << endl;
|
||||
for(unsigned int j = 0; j < p[i].friends.size(); j++) {
|
||||
cout << "\t\t" << p[i].friends[j] << endl;;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int get_person(vector<person> & p, string name) {
|
||||
int position = -1;
|
||||
for(unsigned int i = 0; i < p.size(); i++) {
|
||||
if(p[i].name == name) {
|
||||
position = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return position;
|
||||
}
|
||||
|
||||
int main() {
|
||||
vector<person> people;
|
||||
string selection;
|
||||
while(1) {
|
||||
cout << "1)add person\n2)display all people\n3)add friend\n4)remove friend" << endl;
|
||||
cout << "5)modify food\n6)display friends/food" << endl;
|
||||
cin >> selection;
|
||||
if(selection[0] == '1') { //optimized
|
||||
string name, food;
|
||||
cout << "what is the persons name followed by favorite food on a new line " << endl;
|
||||
cin.ignore();
|
||||
getline(cin, name);
|
||||
getline(cin, food);
|
||||
person p = person(name, food);
|
||||
int p1 = get_person(people, p.name);
|
||||
if(p1 == -1) {
|
||||
people.push_back(p);
|
||||
}
|
||||
}
|
||||
else if(selection[0] == '2') { //optimized
|
||||
display_list_of_friends(people);
|
||||
}
|
||||
else if(selection[0] == '3') { //optimized
|
||||
cout << "which relationship do you want to start (enter two names, seperated by newlines)?" << endl;
|
||||
string first, second;
|
||||
cin.ignore();
|
||||
getline(cin, first);
|
||||
getline(cin, second);
|
||||
int p1 = get_person(people, first);
|
||||
int p2 = get_person(people, second);
|
||||
if(p1 != -1 and p2 != -1 and first!= second) {
|
||||
people[p1].add_friend(second);
|
||||
people[p2].add_friend(first);
|
||||
}
|
||||
}
|
||||
else if(selection[0] == '4') { //optimized
|
||||
cout << "which relationship do you want to end (enter two names, seperated by newlines)?" << endl;
|
||||
string first, second;
|
||||
cin.ignore();
|
||||
getline(cin, first);
|
||||
getline(cin, second);
|
||||
int p1 = get_person(people, first);
|
||||
int p2 = get_person(people, second);
|
||||
if (p1 != -1 and p2 != -1) {
|
||||
people[p1].delete_friend(people[p2].name);
|
||||
people[p2].delete_friend(people[p1].name);
|
||||
}
|
||||
}
|
||||
else if(selection[0] == '5') { //optimized
|
||||
string name;
|
||||
cout << "what is the name of the person to whom you would like to modify fav food?" << endl;
|
||||
cin.ignore();
|
||||
getline(cin, name);
|
||||
int p1 = get_person(people, name);
|
||||
if(p1 != -1) {
|
||||
string new_food;
|
||||
cout << "what food do you want to add?" << endl;
|
||||
getline(cin, new_food);
|
||||
people[p1].modify_food(new_food);
|
||||
}
|
||||
}
|
||||
else if(selection[0] == '6') {
|
||||
cout << "What is the name of the person to whom you would like to view friends with same food?" << endl;
|
||||
string name;
|
||||
cin.ignore();
|
||||
getline(cin, name);
|
||||
int p1 = get_person(people, name);
|
||||
if(p1 != -1) {
|
||||
people[p1].display_person(people);
|
||||
}
|
||||
}
|
||||
else if(selection[0] == 'q') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
47
cs142/lab08/person.cpp
Normal file
47
cs142/lab08/person.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "person.h"
|
||||
|
||||
void person::modify_food(string new_food) {
|
||||
fav_food = new_food;
|
||||
}
|
||||
|
||||
void person::display_person(vector<person> & p) {
|
||||
for(unsigned int i = 0; i < friends.size(); i++) {
|
||||
for(unsigned int j = 0; j < p.size(); j++) {
|
||||
if(p[j].name == friends[i] and p[j].fav_food == fav_food) {
|
||||
cout << p[j].name << " also likes " << fav_food << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void person::add_friend(string name) {
|
||||
if(not already_friends(name)) {
|
||||
friends.push_back(name);
|
||||
}
|
||||
}
|
||||
|
||||
bool person::already_friends(string name) {
|
||||
for(unsigned int i = 0; i < friends.size(); i++) {
|
||||
if(friends[i] == name) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void person::delete_friend(string name) {
|
||||
for(unsigned int i = 0; i < friends.size(); i++) {
|
||||
if(friends[i] == name) {
|
||||
friends.erase((friends.begin())+i);
|
||||
break;
|
||||
}
|
||||
else {
|
||||
cerr << "this person does not exist" << endl;
|
||||
}
|
||||
}
|
||||
}
|
24
cs142/lab08/person.h
Normal file
24
cs142/lab08/person.h
Normal file
@ -0,0 +1,24 @@
|
||||
#ifndef __PERSON_H__
|
||||
#define __PERSON_H__
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class person {
|
||||
public:
|
||||
string name;
|
||||
string fav_food;
|
||||
vector<string> friends;
|
||||
person(string new_name, string food) {
|
||||
name = new_name;
|
||||
fav_food = food;
|
||||
};
|
||||
void modify_food(string new_food);
|
||||
void display_person(vector<person> & p);
|
||||
void add_friend(string name);
|
||||
bool already_friends(string name);
|
||||
void delete_friend(string name);
|
||||
};
|
||||
|
||||
#endif
|
43
cs142/lab08/test.cc
Normal file
43
cs142/lab08/test.cc
Normal file
@ -0,0 +1,43 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
using namespace std;
|
||||
|
||||
ostream & operator<<(ostream & os, vector<string> & v) {
|
||||
os << "[";
|
||||
for(auto &i: v) {
|
||||
os << i << ", ";
|
||||
}
|
||||
os << "]";
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
vector<string> people = {
|
||||
"bilbo",
|
||||
"frodo",
|
||||
"samwise",
|
||||
"gandalf",
|
||||
"aragorn",
|
||||
"aowen",
|
||||
"gollum",
|
||||
"gimli",
|
||||
"legalos",
|
||||
};
|
||||
|
||||
cout << people << endl;
|
||||
vector<string>::iterator it = find(people.begin(), people.end(), "gandalf");
|
||||
if(it != people.end())
|
||||
people.erase(it);
|
||||
cout << people << endl;
|
||||
it = find(people.begin(), people.end(), "frodo");
|
||||
if(it != people.end())
|
||||
people.erase(it);
|
||||
cout << people << endl;
|
||||
it = find(people.begin(), people.end(), "Lord Voldemort");
|
||||
if(it != people.end())
|
||||
people.erase(it);
|
||||
cout << people << endl;
|
||||
}
|
21
cs142/lab08/test.txt
Normal file
21
cs142/lab08/test.txt
Normal file
@ -0,0 +1,21 @@
|
||||
2
|
||||
1
|
||||
stephen
|
||||
apples
|
||||
1
|
||||
derek
|
||||
panda
|
||||
2
|
||||
3
|
||||
stephen
|
||||
derek
|
||||
2
|
||||
1
|
||||
colleen
|
||||
bananna
|
||||
2
|
||||
3
|
||||
colleen
|
||||
derek
|
||||
2
|
||||
q
|
29
cs142/lab09/Makefile
Normal file
29
cs142/lab09/Makefile
Normal file
@ -0,0 +1,29 @@
|
||||
CXXFLAGS=-Wall -g -std=c++0x -Ijsoncpp -DJSON_IS_AMALGAMATION
|
||||
all: app iotest
|
||||
|
||||
app: main.o tournament.o restaurant.o json.o io.o
|
||||
$(CXX) $(CXXFLAGS) main.o restaurant.o tournament.o io.o json.o -o $@
|
||||
|
||||
main.o: main.cpp
|
||||
restaurant.o: restaurant.cpp restaurant.h
|
||||
tournament.o: tournament.cpp tournament.h
|
||||
io.o: io.h io.cpp
|
||||
json.o: jsoncpp/jsoncpp.cpp
|
||||
$(CXX) $(CXXFLAGS) $< -c -o $@
|
||||
|
||||
iotest: iotest.cpp io.o json.o restaurant.o
|
||||
|
||||
clean:
|
||||
@rm -vf *.o
|
||||
@rm -vf app
|
||||
@rm -vf iotest
|
||||
@rm -rvf *.dSYM
|
||||
|
||||
test: all
|
||||
@./app
|
||||
|
||||
io: iotest
|
||||
@./iotest restaurants.db
|
||||
|
||||
debug: all
|
||||
gdb rest
|
30
cs142/lab09/io.cpp
Normal file
30
cs142/lab09/io.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <streambuf>
|
||||
#include <stdexcept>
|
||||
using namespace std;
|
||||
|
||||
#include "jsoncpp/json/json.h"
|
||||
#include "io.h"
|
||||
#include "restaurant.h"
|
||||
|
||||
vector<restaurant> parse_file(string filename) {
|
||||
vector<restaurant> restaurants;
|
||||
ifstream infile(filename.c_str());
|
||||
string file_contents((istreambuf_iterator<char>(infile)),
|
||||
istreambuf_iterator<char>());
|
||||
Json::Value root;
|
||||
Json::Reader reader;
|
||||
bool good_parse = reader.parse(file_contents, root);
|
||||
if(not good_parse) {
|
||||
throw runtime_error(reader.getFormattedErrorMessages());
|
||||
}
|
||||
for(unsigned int i = 0; i < root.size(); i++) {
|
||||
string name = root[i]["name"].asString();
|
||||
int score = root[i]["score"].asInt();
|
||||
restaurant r(name, score);
|
||||
restaurants.push_back(r);
|
||||
}
|
||||
|
||||
return restaurants;
|
||||
}
|
11
cs142/lab09/io.h
Normal file
11
cs142/lab09/io.h
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef __IO_H__
|
||||
#define __IO_H__
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
#include "restaurant.h"
|
||||
|
||||
vector<restaurant> parse_file(string filename);
|
||||
|
||||
#endif
|
27
cs142/lab09/iotest.cpp
Normal file
27
cs142/lab09/iotest.cpp
Normal file
@ -0,0 +1,27 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <stdexcept>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "io.h"
|
||||
#include "restaurant.h"
|
||||
|
||||
const string usage = "usage: iotest <input json file>";
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
if (argc != 2) {
|
||||
cerr << usage << endl;
|
||||
return 1;
|
||||
}
|
||||
try {
|
||||
vector<restaurant> v = parse_file(argv[1]);
|
||||
for(auto r: v) {
|
||||
cout << r << endl;
|
||||
}
|
||||
}
|
||||
catch(runtime_error e) {
|
||||
cerr << e.what() << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
249
cs142/lab09/jsoncpp/json/json-forwards.h
Normal file
249
cs142/lab09/jsoncpp/json/json-forwards.h
Normal file
@ -0,0 +1,249 @@
|
||||
/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/).
|
||||
/// It is intented to be used with #include <json/json-forwards.h>
|
||||
/// This header provides forward declaration for all JsonCpp types.
|
||||
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
// Beginning of content of file: LICENSE
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
The JsonCpp library's source code, including accompanying documentation,
|
||||
tests and demonstration applications, are licensed under the following
|
||||
conditions...
|
||||
|
||||
The author (Baptiste Lepilleur) explicitly disclaims copyright in all
|
||||
jurisdictions which recognize such a disclaimer. In such jurisdictions,
|
||||
this software is released into the Public Domain.
|
||||
|
||||
In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
|
||||
2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
|
||||
released under the terms of the MIT License (see below).
|
||||
|
||||
In jurisdictions which recognize Public Domain property, the user of this
|
||||
software may choose to accept it either as 1) Public Domain, 2) under the
|
||||
conditions of the MIT License (see below), or 3) under the terms of dual
|
||||
Public Domain/MIT License conditions described here, as they choose.
|
||||
|
||||
The MIT License is about as close to Public Domain as a license can get, and is
|
||||
described in clear, concise terms at:
|
||||
|
||||
http://en.wikipedia.org/wiki/MIT_License
|
||||
|
||||
The full text of the MIT License follows:
|
||||
|
||||
========================================================================
|
||||
Copyright (c) 2007-2010 Baptiste Lepilleur
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use, copy,
|
||||
modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
========================================================================
|
||||
(END LICENSE TEXT)
|
||||
|
||||
The MIT license is compatible with both the GPL and commercial
|
||||
software, affording one all of the rights of Public Domain with the
|
||||
minor nuisance of being required to keep the above copyright notice
|
||||
and license text in the source code. Note also that by accepting the
|
||||
Public Domain "license" you can re-license your copy using whatever
|
||||
license you like.
|
||||
|
||||
*/
|
||||
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
// End of content of file: LICENSE
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef JSON_FORWARD_AMALGATED_H_INCLUDED
|
||||
# define JSON_FORWARD_AMALGATED_H_INCLUDED
|
||||
/// If defined, indicates that the source file is amalgated
|
||||
/// to prevent private header inclusion.
|
||||
#define JSON_IS_AMALGATED
|
||||
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
// Beginning of content of file: include/json/config.h
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Copyright 2007-2010 Baptiste Lepilleur
|
||||
// Distributed under MIT license, or public domain if desired and
|
||||
// recognized in your jurisdiction.
|
||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||
|
||||
#ifndef JSON_CONFIG_H_INCLUDED
|
||||
# define JSON_CONFIG_H_INCLUDED
|
||||
|
||||
/// If defined, indicates that json library is embedded in CppTL library.
|
||||
//# define JSON_IN_CPPTL 1
|
||||
|
||||
/// If defined, indicates that json may leverage CppTL library
|
||||
//# define JSON_USE_CPPTL 1
|
||||
/// If defined, indicates that cpptl vector based map should be used instead of std::map
|
||||
/// as Value container.
|
||||
//# define JSON_USE_CPPTL_SMALLMAP 1
|
||||
/// If defined, indicates that Json specific container should be used
|
||||
/// (hash table & simple deque container with customizable allocator).
|
||||
/// THIS FEATURE IS STILL EXPERIMENTAL! There is know bugs: See #3177332
|
||||
//# define JSON_VALUE_USE_INTERNAL_MAP 1
|
||||
/// Force usage of standard new/malloc based allocator instead of memory pool based allocator.
|
||||
/// The memory pools allocator used optimization (initializing Value and ValueInternalLink
|
||||
/// as if it was a POD) that may cause some validation tool to report errors.
|
||||
/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined.
|
||||
//# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1
|
||||
|
||||
/// If defined, indicates that Json use exception to report invalid type manipulation
|
||||
/// instead of C assert macro.
|
||||
# define JSON_USE_EXCEPTION 1
|
||||
|
||||
/// If defined, indicates that the source file is amalgated
|
||||
/// to prevent private header inclusion.
|
||||
/// Remarks: it is automatically defined in the generated amalgated header.
|
||||
// #define JSON_IS_AMALGAMATION
|
||||
|
||||
|
||||
# ifdef JSON_IN_CPPTL
|
||||
# include <cpptl/config.h>
|
||||
# ifndef JSON_USE_CPPTL
|
||||
# define JSON_USE_CPPTL 1
|
||||
# endif
|
||||
# endif
|
||||
|
||||
# ifdef JSON_IN_CPPTL
|
||||
# define JSON_API CPPTL_API
|
||||
# elif defined(JSON_DLL_BUILD)
|
||||
# define JSON_API __declspec(dllexport)
|
||||
# elif defined(JSON_DLL)
|
||||
# define JSON_API __declspec(dllimport)
|
||||
# else
|
||||
# define JSON_API
|
||||
# endif
|
||||
|
||||
// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for integer
|
||||
// Storages, and 64 bits integer support is disabled.
|
||||
// #define JSON_NO_INT64 1
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6
|
||||
// Microsoft Visual Studio 6 only support conversion from __int64 to double
|
||||
// (no conversion from unsigned __int64).
|
||||
#define JSON_USE_INT64_DOUBLE_CONVERSION 1
|
||||
#endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008
|
||||
/// Indicates that the following function is deprecated.
|
||||
# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
|
||||
#endif
|
||||
|
||||
#if !defined(JSONCPP_DEPRECATED)
|
||||
# define JSONCPP_DEPRECATED(message)
|
||||
#endif // if !defined(JSONCPP_DEPRECATED)
|
||||
|
||||
namespace Json {
|
||||
typedef int Int;
|
||||
typedef unsigned int UInt;
|
||||
# if defined(JSON_NO_INT64)
|
||||
typedef int LargestInt;
|
||||
typedef unsigned int LargestUInt;
|
||||
# undef JSON_HAS_INT64
|
||||
# else // if defined(JSON_NO_INT64)
|
||||
// For Microsoft Visual use specific types as long long is not supported
|
||||
# if defined(_MSC_VER) // Microsoft Visual Studio
|
||||
typedef __int64 Int64;
|
||||
typedef unsigned __int64 UInt64;
|
||||
# else // if defined(_MSC_VER) // Other platforms, use long long
|
||||
typedef long long int Int64;
|
||||
typedef unsigned long long int UInt64;
|
||||
# endif // if defined(_MSC_VER)
|
||||
typedef Int64 LargestInt;
|
||||
typedef UInt64 LargestUInt;
|
||||
# define JSON_HAS_INT64
|
||||
# endif // if defined(JSON_NO_INT64)
|
||||
} // end namespace Json
|
||||
|
||||
|
||||
#endif // JSON_CONFIG_H_INCLUDED
|
||||
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
// End of content of file: include/json/config.h
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
// Beginning of content of file: include/json/forwards.h
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Copyright 2007-2010 Baptiste Lepilleur
|
||||
// Distributed under MIT license, or public domain if desired and
|
||||
// recognized in your jurisdiction.
|
||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||
|
||||
#ifndef JSON_FORWARDS_H_INCLUDED
|
||||
# define JSON_FORWARDS_H_INCLUDED
|
||||
|
||||
#if !defined(JSON_IS_AMALGAMATION)
|
||||
# include "config.h"
|
||||
#endif // if !defined(JSON_IS_AMALGAMATION)
|
||||
|
||||
namespace Json {
|
||||
|
||||
// writer.h
|
||||
class FastWriter;
|
||||
class StyledWriter;
|
||||
|
||||
// reader.h
|
||||
class Reader;
|
||||
|
||||
// features.h
|
||||
class Features;
|
||||
|
||||
// value.h
|
||||
typedef unsigned int ArrayIndex;
|
||||
class StaticString;
|
||||
class Path;
|
||||
class PathArgument;
|
||||
class Value;
|
||||
class ValueIteratorBase;
|
||||
class ValueIterator;
|
||||
class ValueConstIterator;
|
||||
#ifdef JSON_VALUE_USE_INTERNAL_MAP
|
||||
class ValueMapAllocator;
|
||||
class ValueInternalLink;
|
||||
class ValueInternalArray;
|
||||
class ValueInternalMap;
|
||||
#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
|
||||
|
||||
} // namespace Json
|
||||
|
||||
|
||||
#endif // JSON_FORWARDS_H_INCLUDED
|
||||
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
// End of content of file: include/json/forwards.h
|
||||
// //////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED
|
1855
cs142/lab09/jsoncpp/json/json.h
Normal file
1855
cs142/lab09/jsoncpp/json/json.h
Normal file
File diff suppressed because it is too large
Load Diff
4230
cs142/lab09/jsoncpp/jsoncpp.cpp
Normal file
4230
cs142/lab09/jsoncpp/jsoncpp.cpp
Normal file
File diff suppressed because it is too large
Load Diff
75
cs142/lab09/main.cpp
Normal file
75
cs142/lab09/main.cpp
Normal file
@ -0,0 +1,75 @@
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <stdexcept>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "restaurant.h"
|
||||
#include "tournament.h"
|
||||
#include "io.h"
|
||||
|
||||
int main() {
|
||||
tournament t;
|
||||
bool keep_going = true;
|
||||
bool file_correct = false;
|
||||
string input, input_file_name;
|
||||
const string usage = "usage: iotest <input json file>";
|
||||
while(!file_correct) {
|
||||
cout << "please enter file name: ";
|
||||
getline(cin, input);
|
||||
ifstream inputs(input.c_str());
|
||||
if(inputs.good()) {
|
||||
input_file_name = input;
|
||||
file_correct = true;
|
||||
}
|
||||
else {
|
||||
cerr << "incorrect file name" << endl;
|
||||
}
|
||||
}
|
||||
t.populate_restaurants(input_file_name);
|
||||
bool succeful_pop = false;
|
||||
while(keep_going) {
|
||||
cout << "1)Display all restaurants\n2)Add a restaurant\n3)Remove a restaurant" << endl;
|
||||
cout << "4)Shufflle the array\n5)Begin the tournament" << endl;
|
||||
cin >> input;
|
||||
if(input[0] == '1'){
|
||||
cout << t << endl;
|
||||
}
|
||||
else if(input[0] == '2'){
|
||||
t.add_restaurants();
|
||||
}
|
||||
else if(input[0] == '3'){
|
||||
t.remove_restaurants();
|
||||
}
|
||||
else if(input[0] == '4'){
|
||||
t.shuffle();
|
||||
}
|
||||
else if(input[0] == '5'){
|
||||
if(t.verify_size()) {
|
||||
keep_going = false;
|
||||
succeful_pop = true;
|
||||
}
|
||||
}
|
||||
else if(input[0] == '0'){
|
||||
keep_going = false;
|
||||
}
|
||||
}
|
||||
if(succeful_pop) {
|
||||
t.start_tournament();
|
||||
string output_file_name;
|
||||
file_correct = false;
|
||||
while(!file_correct) {
|
||||
cout << "please enter file name: ";
|
||||
getline(cin, output_file_name);
|
||||
ofstream out(output_file_name.c_str());
|
||||
if(out.good()) {
|
||||
out << t;
|
||||
file_correct = true;
|
||||
}
|
||||
else {
|
||||
cerr << "incorrect file name" << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
8
cs142/lab09/restaurant.cpp
Normal file
8
cs142/lab09/restaurant.cpp
Normal file
@ -0,0 +1,8 @@
|
||||
#include "restaurant.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
ostream & operator<<(ostream & os, restaurant & r) {
|
||||
os << "{\"name\": \"" << r.name << "\", \"score\": " << r.score << "}";
|
||||
return os;
|
||||
}
|
16
cs142/lab09/restaurant.h
Normal file
16
cs142/lab09/restaurant.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef __RESTAURANT_H__
|
||||
#define __RESTAURANT_H__
|
||||
|
||||
#include <string>
|
||||
#include <ostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class restaurant {
|
||||
public:
|
||||
string name;
|
||||
int score;
|
||||
restaurant(string name, int score): name(name), score(score) {}
|
||||
friend ostream & operator<<(ostream & os, restaurant & r);
|
||||
};
|
||||
#endif
|
5
cs142/lab09/test.json
Normal file
5
cs142/lab09/test.json
Normal file
@ -0,0 +1,5 @@
|
||||
[
|
||||
{"name": "Italian Stallion", "score": 0},
|
||||
{"name": "Pizza Planet", "score": 20},
|
||||
{"name": "Gousteau's", "score": 500}
|
||||
]
|
196
cs142/lab09/tournament.cpp
Normal file
196
cs142/lab09/tournament.cpp
Normal file
@ -0,0 +1,196 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <stdexcept>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "tournament.h"
|
||||
#include "restaurant.h"
|
||||
#include "io.h"
|
||||
|
||||
ostream & operator<<(ostream & os, vector<restaurant> & v) {
|
||||
for(auto i: v) {
|
||||
os << i << endl;
|
||||
}
|
||||
return os;
|
||||
}
|
||||
|
||||
ostream & operator<<(ostream & os, tournament & t){
|
||||
os << "[";
|
||||
for(unsigned int i = 0; i < t.restaurants.size(); i++) {
|
||||
if(i == t.restaurants.size() - 1) {
|
||||
os << t.restaurants[i];
|
||||
}
|
||||
else {
|
||||
os << t.restaurants[i]<< " ,";
|
||||
}
|
||||
}
|
||||
os << "]";
|
||||
return os;
|
||||
}
|
||||
|
||||
bool tournament::populate_restaurants(string filename) {
|
||||
try {
|
||||
restaurants = parse_file(filename);
|
||||
return true;
|
||||
}
|
||||
catch(runtime_error e) {
|
||||
cerr << e.what() << endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool tournament::already_in(string name) {
|
||||
for(unsigned int i = 0; i < restaurants.size(); i++) {
|
||||
if(restaurants[i].name == name) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void tournament::add_restaurants() {
|
||||
string name;
|
||||
int score = 0;
|
||||
cout << "name" << endl;
|
||||
cin.ignore();
|
||||
getline(cin, name);
|
||||
if(not already_in(name)) {
|
||||
restaurants.push_back(restaurant(name, score));
|
||||
}
|
||||
}
|
||||
|
||||
void tournament::remove_restaurants() {
|
||||
string name;
|
||||
cout << "name" << endl;
|
||||
cin.ignore();
|
||||
getline(cin, name);
|
||||
if(already_in(name)) {
|
||||
for(unsigned int i = 0; i < restaurants.size(); i++) {
|
||||
if(restaurants[i].name == name){
|
||||
restaurants.erase(restaurants.begin() + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void tournament::shuffle() {
|
||||
random_shuffle(restaurants.begin(), restaurants.end());
|
||||
}
|
||||
|
||||
int round_counter(int current_size) {
|
||||
int round;
|
||||
if(current_size == 32) {
|
||||
round = 5;
|
||||
}
|
||||
if(current_size == 16) {
|
||||
round = 4;
|
||||
}
|
||||
else if(current_size == 8) {
|
||||
round = 3;
|
||||
}
|
||||
else if(current_size == 4) {
|
||||
round = 2;
|
||||
}
|
||||
else if(current_size == 2) {
|
||||
round =1;
|
||||
}
|
||||
return round;
|
||||
}
|
||||
|
||||
int match_counter(int current_size) {
|
||||
int match;
|
||||
if(current_size == 32) {
|
||||
match = 16;
|
||||
}
|
||||
if(current_size == 16) {
|
||||
match = 8;
|
||||
}
|
||||
else if(current_size == 8) {
|
||||
match = 4;
|
||||
}
|
||||
else if(current_size == 4) {
|
||||
match = 2;
|
||||
}
|
||||
else if(current_size == 2) {
|
||||
match =1;
|
||||
}
|
||||
return match;
|
||||
}
|
||||
|
||||
bool tournament::start_tournament(){
|
||||
if(not verify_size()) {
|
||||
cout << "not 2^n" << endl;
|
||||
return false;
|
||||
}
|
||||
bool temp_bool = true;
|
||||
bool tourn_running = true;
|
||||
cin.ignore();
|
||||
string name;
|
||||
int match = match_counter(restaurants.size());
|
||||
int round = round_counter(restaurants.size());
|
||||
int current_round = 1;
|
||||
vector<restaurant> temp_array;
|
||||
while(tourn_running == true) {
|
||||
int current_match = 1;
|
||||
temp_bool = true;
|
||||
cin.ignore();
|
||||
for(unsigned int i = 0; i < restaurants.size(); i += 2) {
|
||||
while(temp_bool == true) {
|
||||
cout << "which restaurant: " << restaurants[i] << " or " << restaurants[i + 1] << endl;
|
||||
cout << "match " << current_match << "/" << match << " Round "
|
||||
<< current_round << "/" << round << endl;
|
||||
getline(cin, name);
|
||||
if(name == restaurants[i].name or name == restaurants[i + 1].name) {
|
||||
if(name == restaurants[i].name) {
|
||||
restaurants[i].score++;
|
||||
temp_array.push_back(restaurants[i]);
|
||||
losers.push_back(restaurants[i+1]);
|
||||
}
|
||||
else {
|
||||
restaurants[i+1].score++;
|
||||
temp_array.push_back(restaurants[i + 1]);
|
||||
losers.push_back(restaurants[i]);
|
||||
}
|
||||
temp_bool = false;
|
||||
current_match++;
|
||||
}
|
||||
else {
|
||||
cout << "invalid response " << name << endl;
|
||||
}
|
||||
}
|
||||
temp_bool = true;
|
||||
}
|
||||
while(temp_bool == true) {
|
||||
for(unsigned int i = 0; i < temp_array.size(); i++) {
|
||||
restaurants[i] = temp_array[i];
|
||||
}
|
||||
for(unsigned int i = 0; i < temp_array.size(); i++){
|
||||
restaurants.pop_back();
|
||||
}
|
||||
if(restaurants.size() == 1) {
|
||||
losers.push_back(restaurants[0]);
|
||||
cout << "this is the winner " << restaurants[0] << endl;
|
||||
restaurants = losers;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
cout << "next round of tournament" << endl;
|
||||
temp_bool = false;
|
||||
}
|
||||
}
|
||||
temp_array.clear();
|
||||
match = match/2;
|
||||
current_round++;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool tournament::verify_size() {
|
||||
int r = restaurants.size();
|
||||
if(r == 2 or r == 4 or r == 8 or r == 16 or r == 32 or r == 64) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
25
cs142/lab09/tournament.h
Normal file
25
cs142/lab09/tournament.h
Normal file
@ -0,0 +1,25 @@
|
||||
#ifndef __TOURNAMENT_H__
|
||||
#define __TOURNAMENT_H__
|
||||
#include <vector>
|
||||
#include "restaurant.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class tournament {
|
||||
private:
|
||||
vector<restaurant> restaurants;
|
||||
vector<restaurant> losers;
|
||||
public:
|
||||
tournament(){};
|
||||
void display_restaurant();
|
||||
bool populate_restaurants(string filename);
|
||||
bool already_in(string name);
|
||||
void add_restaurants();
|
||||
void remove_restaurants();
|
||||
void shuffle();
|
||||
bool start_tournament();
|
||||
bool verify_size();
|
||||
friend ostream & operator<<(ostream & os, tournament & t);
|
||||
};
|
||||
|
||||
#endif
|
56
cs142/lab10/ArenaInterface.h
Normal file
56
cs142/lab10/ArenaInterface.h
Normal file
@ -0,0 +1,56 @@
|
||||
#pragma once
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "FighterInterface.h"
|
||||
using namespace std;
|
||||
|
||||
/*
|
||||
WARNING: It is expressly forbidden to modify any part of this document, including its name
|
||||
*/
|
||||
class ArenaInterface
|
||||
{
|
||||
public:
|
||||
ArenaInterface(){}
|
||||
virtual ~ArenaInterface(){}
|
||||
|
||||
/*
|
||||
addFighter(string)
|
||||
|
||||
Adds a new fighter to the collection of fighters in the arena. Do not allow
|
||||
duplicate names. Reject any string that does not adhere to the format
|
||||
outlined in the lab specs.
|
||||
|
||||
Return true if a new fighter was added; false otherwise.
|
||||
*/
|
||||
virtual bool addFighter(string info) = 0;
|
||||
|
||||
/*
|
||||
removeFighter(string)
|
||||
|
||||
Removes the fighter whose name is equal to the given name. Does nothing if
|
||||
no fighter is found with the given name.
|
||||
|
||||
Return true if a fighter is removed; false otherwise.
|
||||
*/
|
||||
virtual bool removeFighter(string name) = 0;
|
||||
|
||||
/*
|
||||
getFighter(string)
|
||||
|
||||
Returns the memory address of a fighter whose name is equal to the given
|
||||
name. Returns NULL if no fighter is found with the given name.
|
||||
|
||||
Return a memory address if a fighter is found; NULL otherwise.
|
||||
*/
|
||||
virtual FighterInterface* getFighter(string name) = 0;
|
||||
|
||||
/*
|
||||
getSize()
|
||||
|
||||
Returns the number of fighters in the arena.
|
||||
|
||||
Return a non-negative integer.
|
||||
*/
|
||||
virtual int getSize() = 0;
|
||||
};
|
176
cs142/lab10/Battle.h
Normal file
176
cs142/lab10/Battle.h
Normal file
@ -0,0 +1,176 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <cstdio>
|
||||
#include "FighterInterface.h"
|
||||
using namespace std;
|
||||
|
||||
/*
|
||||
WARNING: It is expressly forbidden to modify any part of this document, including its name
|
||||
*/
|
||||
//=======================================================================================
|
||||
FighterInterface* fight(FighterInterface*, FighterInterface*, bool);
|
||||
void takeTurn(FighterInterface*, FighterInterface*, bool);
|
||||
void speak(string);
|
||||
//=======================================================================================
|
||||
/*
|
||||
fight(FighterInterface, FighterInterface, bool)
|
||||
|
||||
Runs through the fighting algorithm for the two given fighters.
|
||||
|
||||
Each fighter takes a turn using its special ability, attacking, and regenerating. If
|
||||
the other fighter's current hit points falls to or drops below 0, then the other
|
||||
fighter has lost. This process repeats until one fighter has fallen or 100 rounds
|
||||
have occurred with neither fighter falling.
|
||||
|
||||
If the given bool is true, this function will print a great deal of information
|
||||
during the battle. This can be useful for testing.
|
||||
|
||||
Returns the winner of the fight; null if the fight ends in a draw.
|
||||
*/
|
||||
FighterInterface* fight(FighterInterface* c1, FighterInterface* c2, bool verbose)
|
||||
{
|
||||
if(verbose)
|
||||
{
|
||||
stringstream stream;
|
||||
stream << "----------";
|
||||
stream << c1->getName();
|
||||
stream << " vs ";
|
||||
stream << c2->getName();
|
||||
stream << "----------";
|
||||
speak(stream.str());
|
||||
}
|
||||
|
||||
c1->reset();
|
||||
c2->reset();
|
||||
|
||||
for(int i=0; i<100; i++)
|
||||
{
|
||||
//C1's turn
|
||||
takeTurn(c1, c2, verbose);
|
||||
if(c2->getCurrentHP() <= 0)
|
||||
{
|
||||
if(verbose)
|
||||
{
|
||||
stringstream stream;
|
||||
stream << c1->getName();
|
||||
stream << " wins! (";
|
||||
stream << c1->getCurrentHP();
|
||||
stream << "/";
|
||||
stream << c1->getMaximumHP();
|
||||
stream << " HP left)";
|
||||
speak(stream.str());
|
||||
}
|
||||
return c1;
|
||||
}
|
||||
|
||||
//C2's turn
|
||||
takeTurn(c2, c1, verbose);
|
||||
if(c1->getCurrentHP() <= 0)
|
||||
{
|
||||
if(verbose)
|
||||
{
|
||||
stringstream stream;
|
||||
stream << c2->getName();
|
||||
stream << " wins! (";
|
||||
stream << c2->getCurrentHP();
|
||||
stream << "/";
|
||||
stream << c2->getMaximumHP();
|
||||
stream << " HP left)";
|
||||
speak(stream.str());
|
||||
}
|
||||
return c2;
|
||||
}
|
||||
}
|
||||
if(verbose)
|
||||
{
|
||||
speak("After 100 rounds, neither fighter has fallen. It's a draw!");
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
//=======================================================================================
|
||||
/*
|
||||
takeTurn(FighterInterface*, FighterInterface*, bool)
|
||||
|
||||
Runs through a single turn for [attacker] attacking [defender]. Each turn consists of
|
||||
[attacker] trying to use its special ability, attacking [defender], and regenerating.
|
||||
*/
|
||||
void takeTurn(FighterInterface* attacker, FighterInterface* defender, bool verbose)
|
||||
{
|
||||
//Header
|
||||
if(verbose)
|
||||
{
|
||||
stringstream stream;
|
||||
stream << "It's ";
|
||||
stream << attacker->getName();
|
||||
stream << "'s turn! (";
|
||||
stream << attacker->getCurrentHP();
|
||||
stream << "/";
|
||||
stream << attacker->getMaximumHP();
|
||||
stream << " HP).";
|
||||
speak(stream.str());
|
||||
}
|
||||
|
||||
//Use Ability
|
||||
if(!attacker->isSimplified())
|
||||
{
|
||||
bool ability = attacker->useAbility();
|
||||
if(ability && verbose)
|
||||
{
|
||||
stringstream stream;
|
||||
stream << "\t";
|
||||
stream << attacker->getName();
|
||||
stream << " uses a special ability!";
|
||||
speak(stream.str());
|
||||
}
|
||||
}
|
||||
|
||||
//Attack
|
||||
int damage = attacker->getDamage();
|
||||
int before_attack = defender->getCurrentHP();
|
||||
defender->takeDamage(damage);
|
||||
int after_attack = defender->getCurrentHP();
|
||||
if(verbose)
|
||||
{
|
||||
stringstream stream;
|
||||
stream << "\t";
|
||||
stream << attacker->getName();
|
||||
stream << " attacks with ";
|
||||
stream << damage;
|
||||
stream << " damage, and ";
|
||||
stream << defender->getName();
|
||||
stream << " takes ";
|
||||
stream << (before_attack-after_attack);
|
||||
stream << " damage.";
|
||||
speak(stream.str());
|
||||
}
|
||||
|
||||
//Regenerate
|
||||
if(!attacker->isSimplified())
|
||||
{
|
||||
int before_regen = attacker->getCurrentHP();
|
||||
attacker->regenerate();
|
||||
int after_regen = attacker->getCurrentHP();
|
||||
if(verbose)
|
||||
{
|
||||
stringstream stream;
|
||||
stream << "\t";
|
||||
stream << attacker->getName();
|
||||
stream << " regenerates ";
|
||||
stream << (after_regen-before_regen);
|
||||
stream << " HP.";
|
||||
speak(stream.str());
|
||||
}
|
||||
}
|
||||
}
|
||||
//=======================================================================================
|
||||
/*
|
||||
speak(string)
|
||||
|
||||
Displays a given message.
|
||||
*/
|
||||
void speak(string message)
|
||||
{
|
||||
printf("%s\n", message.c_str());
|
||||
}
|
||||
//=======================================================================================
|
7
cs142/lab10/Factory.cpp
Normal file
7
cs142/lab10/Factory.cpp
Normal file
@ -0,0 +1,7 @@
|
||||
#include "Factory.h"
|
||||
#include "arena.h"
|
||||
|
||||
ArenaInterface* Factory::createArena()
|
||||
{
|
||||
return new arena();
|
||||
}
|
21
cs142/lab10/Factory.h
Normal file
21
cs142/lab10/Factory.h
Normal file
@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
#include "ArenaInterface.h"
|
||||
/*
|
||||
WARNING: It is expressly forbidden to modify any part of this document, including its name
|
||||
*/
|
||||
//=======================================================================================
|
||||
/*
|
||||
createArena()
|
||||
|
||||
Creates and returns an object whose class extends ArenaInterface.
|
||||
This should be an object of a class you have created.
|
||||
|
||||
Example: If you made a class called "Arena", you might say, "return new Arena();".
|
||||
*/
|
||||
class Factory
|
||||
{
|
||||
public:
|
||||
static ArenaInterface* createArena();
|
||||
};
|
||||
|
||||
//=======================================================================================
|
200
cs142/lab10/FighterInterface.h
Normal file
200
cs142/lab10/FighterInterface.h
Normal file
@ -0,0 +1,200 @@
|
||||
#pragma once
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
|
||||
/*
|
||||
WARNING: It is expressly forbidden to modify any part of this document, including its name
|
||||
*/
|
||||
|
||||
/*
|
||||
This class specifies the methods for a fighter.
|
||||
|
||||
All fighters have the following attributes:
|
||||
Name - The fighter's name.
|
||||
Hit Points - The amount of health the fighter has, with a specified maximum. Reaching 0 is equivalent to death.
|
||||
Strength - Physical power, used to determine hit point regeneration.
|
||||
Speed - Dexterity and physical movement, used to reduce damage when being attacked.
|
||||
Magic - Magical prowess, used for some special abilities.
|
||||
|
||||
The three fighter types have unique abilities:
|
||||
Robot - Relies on strength to deal damage. Also can use stored electricity to temporarily increase damage (max electricity equal to 2*magic).
|
||||
Archer - Relies on speed to deal damage. Also can increase its speed for the remainder of the battle (no max bonus speed).
|
||||
Cleric - Relies on magic to deal damage. Also can heal itself using mana, restoring hit points (max mana equal to 5*magic).
|
||||
|
||||
More details about how stats are used and how abilities work can be found in the comments below.
|
||||
*/
|
||||
|
||||
/*
|
||||
ROBOT_ABILITY_COST
|
||||
The amount of energy a Robot needs to perform its special ability.
|
||||
*/
|
||||
const int ROBOT_ABILITY_COST = 5;
|
||||
|
||||
/*
|
||||
CLERIC_ABILITY_COST
|
||||
The amount of mana a Cleric needs to perform its special ability.
|
||||
*/
|
||||
const int CLERIC_ABILITY_COST = 25;
|
||||
|
||||
class FighterInterface
|
||||
{
|
||||
public:
|
||||
FighterInterface(){}
|
||||
virtual ~FighterInterface(){}
|
||||
|
||||
/*
|
||||
getName()
|
||||
|
||||
Returns the name of this fighter.
|
||||
*/
|
||||
virtual string getName() = 0;
|
||||
|
||||
/*
|
||||
getMaximumHP()
|
||||
|
||||
Returns the maximum hit points of this fighter.
|
||||
*/
|
||||
virtual int getMaximumHP() = 0;
|
||||
|
||||
/*
|
||||
getCurrentHP()
|
||||
|
||||
Returns the current hit points of this fighter.
|
||||
*/
|
||||
virtual int getCurrentHP() = 0;
|
||||
|
||||
/*
|
||||
getStrength()
|
||||
|
||||
Returns the strength stat of this fighter.
|
||||
*/
|
||||
virtual int getStrength() = 0;
|
||||
|
||||
/*
|
||||
getSpeed()
|
||||
|
||||
Returns the speed stat of this fighter.
|
||||
*/
|
||||
virtual int getSpeed() = 0;
|
||||
|
||||
/*
|
||||
getMagic()
|
||||
|
||||
Returns the magic stat of this fighter.
|
||||
*/
|
||||
virtual int getMagic() = 0;
|
||||
|
||||
/*
|
||||
getDamage()
|
||||
|
||||
Returns the amount of damage a fighter will deal.
|
||||
|
||||
Robot:
|
||||
This value is equal to the Robot's strength plus any additional damage added for having just used its special ability.
|
||||
|
||||
Archer:
|
||||
This value is equal to the Archer's speed.
|
||||
|
||||
Cleric:
|
||||
This value is equal to the Cleric's magic.
|
||||
*/
|
||||
virtual int getDamage() = 0;
|
||||
|
||||
/*
|
||||
takeDamage(int)
|
||||
|
||||
Reduces the fighter's current hit points by an amount equal to the given
|
||||
damage minus one fourth of the fighter's speed. This method must reduce
|
||||
the fighter's current hit points by at least one. It is acceptable for
|
||||
this method to give the fighter negative current hit points.
|
||||
|
||||
Examples:
|
||||
damage=10, speed=7 => damage_taken=9
|
||||
damage=10, speed=9 => damage_taken=8
|
||||
damage=10, speed=50 => damage_taken=1
|
||||
*/
|
||||
virtual void takeDamage(int damage) = 0;
|
||||
|
||||
/*
|
||||
reset()
|
||||
|
||||
Restores a fighter's current hit points to its maximum hit points.
|
||||
|
||||
Robot:
|
||||
Also restores a Robot's current energy to its maximum value (which is 2 times its magic).
|
||||
Also resets a Robot's bonus damage to 0.
|
||||
|
||||
Archer:
|
||||
Also resets an Archer's current speed to its original value.
|
||||
|
||||
Cleric:
|
||||
Also restores a Cleric's current mana to its maximum value (which is 5 times its magic).
|
||||
*/
|
||||
virtual void reset() = 0;
|
||||
|
||||
/*
|
||||
regenerate()
|
||||
|
||||
Increases the fighter's current hit points by an amount equal to one sixth of
|
||||
the fighter's strength. This method must increase the fighter's current hit
|
||||
points by at least one. Do not allow the current hit points to exceed the
|
||||
maximum hit points.
|
||||
|
||||
Cleric:
|
||||
Also increases a Cleric's current mana by an amount equal to one fifth of the
|
||||
Cleric's magic. This method must increase the Cleric's current mana by at
|
||||
least one. Do not allow the current mana to exceed the maximum mana.
|
||||
*/
|
||||
virtual void regenerate() = 0;
|
||||
|
||||
/*
|
||||
useAbility()
|
||||
|
||||
Attempts to perform a special ability based on the type of fighter. The
|
||||
fighter will attempt to use this special ability just prior to attacking
|
||||
every turn.
|
||||
|
||||
Robot: Shockwave Punch
|
||||
Adds bonus damage to the Robot's next attack (and only its next attack) equal to (strength * ((current_energy/maximum_energy)^4)).
|
||||
Can only be used if the Robot has at least [ROBOT_ABILITY_COST] energy.
|
||||
Decreases the Robot's current energy by [ROBOT_ABILITY_COST] (after calculating the additional damage) when used.
|
||||
Examples:
|
||||
strength=20, current_energy=20, maximum_energy=20 => bonus_damage=20
|
||||
strength=20, current_energy=15, maximum_energy=20 => bonus_damage=6
|
||||
strength=20, current_energy=10, maximum_energy=20 => bonus_damage=1
|
||||
strength=20, current_energy=5, maximum_energy=20 => bonus_damage=0
|
||||
Robot Note:
|
||||
The bonus damage formula should be computed using double arithmetic, and only
|
||||
the final result should be cast into an integer.
|
||||
|
||||
Archer: Quickstep
|
||||
Increases the Archer's speed by one point each time the ability is used.
|
||||
This bonus lasts until the reset() method is used.
|
||||
This ability always works; there is no maximum bonus speed.
|
||||
|
||||
Cleric: Healing Light
|
||||
Increases the Cleric's current hit points by an amount equal to one third of its magic.
|
||||
Can only be used if the Cleric has at least [CLERIC_ABILITY_COST] mana.
|
||||
Will be used even if the Cleric's current HP is equal to their maximum HP
|
||||
Decreases the Cleric's current mana by [CLERIC_ABILITY_COST] when used.
|
||||
Cleric Note:
|
||||
This ability, when successful, must increase the Cleric's current hit points
|
||||
by at least one. Do not allow the current hit points to exceed the maximum
|
||||
hit points.
|
||||
|
||||
Return true if the ability was used; false otherwise.
|
||||
*/
|
||||
virtual bool useAbility() = 0;
|
||||
|
||||
/*
|
||||
isSimplified()
|
||||
|
||||
Returns true if you have not completed the useAbility() and/or the regenerate()
|
||||
methods for this type of fighter. This allows the test driver to award points
|
||||
for Part 3 even if Part 4 is incomplete.
|
||||
|
||||
Return true if the testing is to be simplified; false otherwise.
|
||||
*/
|
||||
virtual bool isSimplified() = 0;
|
||||
};
|
33
cs142/lab10/Makefile
Normal file
33
cs142/lab10/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
CXXFLAGS= -Wall -g
|
||||
OBJECTS=main.o arena.o Factory.o archer.o fighter.o util.o cleric.o robot.o
|
||||
EXE=main
|
||||
|
||||
all: $(EXE)
|
||||
|
||||
|
||||
$(EXE): main.o
|
||||
$(CXX) $(CXXFLAGS) $(OBJECTS) -o $@
|
||||
|
||||
main.o: main.cpp Factory.o arena.o fighter.o archer.o util.o cleric.o robot.o
|
||||
|
||||
Factory.o: Factory.cpp Factory.h
|
||||
|
||||
arena.o: arena.cpp arena.h
|
||||
fighter.o: fighter.cpp fighter.h
|
||||
archer.o: archer.cpp archer.h fighter.h
|
||||
cleric.o: cleric.cpp cleric.h fighter.h
|
||||
robot.o: robot.cpp robot.h fighter.h
|
||||
util.o: util.cpp util.h
|
||||
|
||||
run: $(EXE)
|
||||
@./$(EXE)
|
||||
|
||||
clean:
|
||||
@rm -vf *.o
|
||||
@rm -vf $(EXE)
|
||||
|
||||
debug: $(EXE)
|
||||
gdb ./$(EXE)
|
||||
|
||||
valgrind: $(EXE)
|
||||
valgrind --tool=memcheck --leak-check=yes ./$(EXE)
|
21
cs142/lab10/archer.cpp
Normal file
21
cs142/lab10/archer.cpp
Normal file
@ -0,0 +1,21 @@
|
||||
#include "archer.h"
|
||||
archer::archer(string name, int max_hp, int strength, int speed, int magic) :
|
||||
fighter(name, max_hp, strength, speed, magic), original_speed(speed) {}
|
||||
|
||||
int archer::getDamage() {
|
||||
return speed;
|
||||
}
|
||||
|
||||
void archer::reset() {
|
||||
hp = max_hp;
|
||||
speed = original_speed;
|
||||
}
|
||||
|
||||
bool archer::useAbility() {
|
||||
speed++;
|
||||
return true;
|
||||
}
|
||||
|
||||
int archer::get_original_speed() {
|
||||
return original_speed;
|
||||
}
|
21
cs142/lab10/archer.h
Normal file
21
cs142/lab10/archer.h
Normal file
@ -0,0 +1,21 @@
|
||||
#ifndef __ARCHER_H__
|
||||
#define __ARCHER_H__
|
||||
|
||||
#include "fighter.h"
|
||||
|
||||
class archer : public fighter {
|
||||
private:
|
||||
int original_speed;
|
||||
public:
|
||||
archer(string, int, int, int, int);
|
||||
|
||||
string get_type() { return "A"; };
|
||||
|
||||
int getDamage();
|
||||
void reset();
|
||||
bool useAbility();
|
||||
|
||||
int get_original_speed();
|
||||
};
|
||||
|
||||
#endif
|
111
cs142/lab10/arena.cpp
Normal file
111
cs142/lab10/arena.cpp
Normal file
@ -0,0 +1,111 @@
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
|
||||
#include "arena.h"
|
||||
#include "fighter.h"
|
||||
#include "archer.h"
|
||||
#include "cleric.h"
|
||||
#include "robot.h"
|
||||
#include "util.h"
|
||||
|
||||
arena::~arena() {
|
||||
fighter * f = NULL;
|
||||
for(vector<FighterInterface *>::iterator it = fighters.begin();
|
||||
it != fighters.end();
|
||||
it++) {
|
||||
f = dynamic_cast<fighter *>(*it);
|
||||
delete f;
|
||||
}
|
||||
}
|
||||
|
||||
bool arena::contains(string name) {
|
||||
fighter * f = NULL;
|
||||
for(unsigned int i = 0; i < fighters.size(); i++) {
|
||||
f = dynamic_cast<fighter *>(fighters[i]);
|
||||
if(f->getName() == name) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool arena::addFighter(string info) {
|
||||
fighter * f = NULL;
|
||||
|
||||
string name;
|
||||
string type;
|
||||
int max_hp;
|
||||
int strength;
|
||||
int speed;
|
||||
int magic;
|
||||
|
||||
bool worked;
|
||||
worked = parse_n_load(info, name, type, max_hp, strength, speed, magic);
|
||||
if(not worked) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(contains(name)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(type == "A") {
|
||||
f = new archer(name, max_hp, strength, speed, magic);
|
||||
}
|
||||
else if(type == "C") {
|
||||
f = new cleric(name, max_hp, strength, speed, magic);
|
||||
}
|
||||
else if(type == "R") {
|
||||
f = new robot(name, max_hp, strength, speed, magic);
|
||||
}
|
||||
|
||||
fighters.push_back(f);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool arena::removeFighter(string name) {
|
||||
fighter * f = NULL;
|
||||
for(vector<FighterInterface *>::iterator it = fighters.begin();
|
||||
it != fighters.end();
|
||||
it++) {
|
||||
f = dynamic_cast<fighter *>(*it);
|
||||
if(f->getName() == name) {
|
||||
delete f;
|
||||
fighters.erase(it);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
FighterInterface * arena::getFighter(string name) {
|
||||
fighter * f = NULL;
|
||||
for(vector<FighterInterface *>::iterator it = fighters.begin();
|
||||
it != fighters.end();
|
||||
it++) {
|
||||
f = dynamic_cast<fighter *>(*it);
|
||||
if(f->getName() == name) {
|
||||
return dynamic_cast<FighterInterface *>(f);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int arena::getSize() {
|
||||
return fighters.size();
|
||||
}
|
||||
|
||||
ostream & operator<<(ostream & os, arena & a) {
|
||||
os << "[";
|
||||
for(vector<FighterInterface * >::iterator it = a.fighters.begin();
|
||||
it != a.fighters.end();
|
||||
it++) {
|
||||
os << *(dynamic_cast<fighter *>( *it));
|
||||
if (it != a.fighters.end() - 1) {
|
||||
os << ", ";
|
||||
}
|
||||
}
|
||||
os << "]";
|
||||
return os;
|
||||
}
|
23
cs142/lab10/arena.h
Normal file
23
cs142/lab10/arena.h
Normal file
@ -0,0 +1,23 @@
|
||||
#ifndef __ARENA_H__
|
||||
#define __ARENA_H__
|
||||
|
||||
#include <vector>
|
||||
#include "ArenaInterface.h"
|
||||
|
||||
class arena : public ArenaInterface {
|
||||
private:
|
||||
std::vector<FighterInterface *> fighters;
|
||||
bool contains(string name);
|
||||
public:
|
||||
arena(){}
|
||||
~arena();
|
||||
bool addFighter(string info);
|
||||
bool removeFighter(string name);
|
||||
FighterInterface * getFighter(string name);
|
||||
int getSize();
|
||||
|
||||
friend ostream & operator<<(ostream &, arena &);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
59
cs142/lab10/cleric.cpp
Normal file
59
cs142/lab10/cleric.cpp
Normal file
@ -0,0 +1,59 @@
|
||||
#include "FighterInterface.h"
|
||||
#include "cleric.h"
|
||||
|
||||
cleric::cleric(string name, int max_hp, int strength, int speed, int magic) :
|
||||
fighter(name, max_hp, strength, speed, magic), mana(5*magic) {}
|
||||
|
||||
int cleric::getDamage() {
|
||||
return magic;
|
||||
}
|
||||
|
||||
void cleric::reset() {
|
||||
hp = max_hp;
|
||||
mana = 5 * magic;
|
||||
}
|
||||
|
||||
void cleric::regenerate() {
|
||||
fighter::regenerate();
|
||||
|
||||
int increase = magic / 5;
|
||||
|
||||
if(increase < 0) {
|
||||
increase = 0;
|
||||
}
|
||||
else if(increase == 0) {
|
||||
increase = 1;
|
||||
}
|
||||
if(mana + increase < magic * 5) {
|
||||
mana += increase;
|
||||
}
|
||||
else {
|
||||
mana = 5 * magic;
|
||||
}
|
||||
}
|
||||
|
||||
bool cleric::useAbility() {
|
||||
// a.k.a. Healing light
|
||||
if(mana - CLERIC_ABILITY_COST >= 0) {
|
||||
int increase = magic / 3;
|
||||
if(increase < 0) {
|
||||
increase = 0;
|
||||
}
|
||||
else if(increase == 0) {
|
||||
increase = 1;
|
||||
}
|
||||
if(hp + increase < max_hp) {
|
||||
hp += increase;
|
||||
}
|
||||
else {
|
||||
hp = max_hp;
|
||||
}
|
||||
mana -= CLERIC_ABILITY_COST;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int cleric::get_mana() {
|
||||
return mana;
|
||||
}
|
24
cs142/lab10/cleric.h
Normal file
24
cs142/lab10/cleric.h
Normal file
@ -0,0 +1,24 @@
|
||||
#ifndef __CLERIC_H__
|
||||
#define __CLERIC_H__
|
||||
|
||||
#include "fighter.h"
|
||||
|
||||
class cleric : public fighter {
|
||||
private:
|
||||
int original_speed;
|
||||
int mana;
|
||||
public:
|
||||
cleric(string, int, int, int, int);
|
||||
|
||||
string get_type() { return "A"; };
|
||||
|
||||
int getDamage();
|
||||
void reset();
|
||||
bool useAbility();
|
||||
void regenerate();
|
||||
|
||||
int get_original_speed();
|
||||
int get_mana();
|
||||
};
|
||||
|
||||
#endif
|
72
cs142/lab10/fighter.cpp
Normal file
72
cs142/lab10/fighter.cpp
Normal file
@ -0,0 +1,72 @@
|
||||
#include "fighter.h"
|
||||
|
||||
fighter::fighter(string name, int max_hp, int strength, int speed, int magic) :
|
||||
name(name), max_hp(max_hp), hp(max_hp), strength(strength),
|
||||
speed(speed), magic(magic) {}
|
||||
|
||||
string fighter::getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
int fighter::getMaximumHP() {
|
||||
return max_hp;
|
||||
}
|
||||
|
||||
int fighter::getCurrentHP() {
|
||||
return hp;
|
||||
}
|
||||
|
||||
int fighter::getStrength() {
|
||||
return strength;
|
||||
}
|
||||
|
||||
int fighter::getSpeed() {
|
||||
return speed;
|
||||
}
|
||||
|
||||
int fighter::getMagic() {
|
||||
return magic;
|
||||
}
|
||||
|
||||
void fighter::regenerate() {
|
||||
int increase = strength / 6;
|
||||
|
||||
if(increase < 0) {
|
||||
increase = 0;
|
||||
}
|
||||
else if(increase == 0) {
|
||||
increase = 1;
|
||||
}
|
||||
|
||||
if(hp + increase <= max_hp) {
|
||||
hp += increase;
|
||||
}
|
||||
else {
|
||||
hp = max_hp;
|
||||
}
|
||||
}
|
||||
|
||||
void fighter::takeDamage(int damage) {
|
||||
int hurt = damage - (speed / 4);
|
||||
if (hurt <= 0) {
|
||||
hurt = 1;
|
||||
}
|
||||
hp -= hurt;
|
||||
}
|
||||
|
||||
bool fighter::isSimplified() {
|
||||
return false;
|
||||
}
|
||||
|
||||
ostream & operator<<(ostream & os, fighter & f) {
|
||||
os << "{\n"
|
||||
<< " \"name\": \"" << f.name << "\",\n"
|
||||
<< " \"type\": \"" << f.get_type() << "\",\n"
|
||||
<< " \"hp\": " << f.hp << ",\n"
|
||||
<< " \"max hp\": " << f.max_hp << ",\n"
|
||||
<< " \"strength\": " << f.strength << ",\n"
|
||||
<< " \"speed\": " << f.speed << ",\n"
|
||||
<< " \"magic\": " << f.magic << ",\n"
|
||||
<< "}";
|
||||
return os;
|
||||
}
|
44
cs142/lab10/fighter.h
Normal file
44
cs142/lab10/fighter.h
Normal file
@ -0,0 +1,44 @@
|
||||
#ifndef __FIGHTER_H__
|
||||
#define __FIGHTER_H__
|
||||
|
||||
#include <ostream>
|
||||
#include "FighterInterface.h"
|
||||
|
||||
class fighter : public FighterInterface
|
||||
{
|
||||
private:
|
||||
string name;
|
||||
|
||||
protected:
|
||||
int max_hp;
|
||||
int hp;
|
||||
int strength;
|
||||
int speed;
|
||||
int magic;
|
||||
|
||||
public:
|
||||
fighter(string, int, int, int, int);
|
||||
// virtual ~fighter();
|
||||
|
||||
string getName();
|
||||
|
||||
int getMaximumHP();
|
||||
int getCurrentHP();
|
||||
int getStrength();
|
||||
int getSpeed();
|
||||
int getMagic();
|
||||
|
||||
virtual string get_type() = 0;
|
||||
|
||||
virtual int getDamage() = 0;
|
||||
void takeDamage(int damage);
|
||||
virtual void reset() = 0;
|
||||
virtual void regenerate();
|
||||
virtual bool useAbility() = 0;
|
||||
|
||||
bool isSimplified();
|
||||
|
||||
friend ostream & operator<<(ostream & os, fighter & a);
|
||||
};
|
||||
|
||||
#endif
|
205
cs142/lab10/main.cpp
Normal file
205
cs142/lab10/main.cpp
Normal file
@ -0,0 +1,205 @@
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "Battle.h"
|
||||
#include "Factory.h"
|
||||
#include "arena.h"
|
||||
#include "archer.h"
|
||||
#include "cleric.h"
|
||||
#include "robot.h"
|
||||
|
||||
void test_fighter() {
|
||||
archer a = archer("bilbo", 100, 60, 1, 5);
|
||||
a.takeDamage(90);
|
||||
a.regenerate();
|
||||
assert(a.getCurrentHP() == 20);
|
||||
archer b = archer("frodo", 100, 0, 1, 5);
|
||||
b.takeDamage(90);
|
||||
b.regenerate();
|
||||
}
|
||||
|
||||
void test_archer() {
|
||||
archer a("stephen", 666, 66, 6, 0);
|
||||
a.takeDamage(100);
|
||||
assert(a.getCurrentHP() == 567);
|
||||
assert(a.get_original_speed() == 6);
|
||||
assert(a.getSpeed() == 6);
|
||||
}
|
||||
|
||||
void test_cleric() {
|
||||
cleric a("Derek", 666, 66, 6, 20);
|
||||
assert(a.getDamage() == 20);
|
||||
assert(a.get_mana() == 100);
|
||||
a.takeDamage(100);
|
||||
assert(a.getCurrentHP() == 567);
|
||||
a.reset();
|
||||
assert(a.getCurrentHP() == 666);
|
||||
|
||||
cleric b("SaintColleen", 100, 90, 4, 60);
|
||||
b.takeDamage(100);
|
||||
b.useAbility();
|
||||
assert(b.getCurrentHP() == 21);
|
||||
|
||||
cleric c("Vanessa", 100, 90, 4, 1);
|
||||
c.takeDamage(100);
|
||||
c.useAbility();
|
||||
assert(c.getCurrentHP() == 1);
|
||||
|
||||
cleric d("Vanessa", 100, 90, 4, 5);
|
||||
d.takeDamage(100);
|
||||
d.useAbility();
|
||||
assert(d.getCurrentHP() == 2);
|
||||
}
|
||||
|
||||
void test_robot() {
|
||||
robot a("Derek", 100, 20, 10, 10);
|
||||
assert(a.getDamage() == 20);
|
||||
a.useAbility();
|
||||
assert(a.getDamage() == 40);
|
||||
assert(a.getDamage() == 20);
|
||||
a.useAbility();
|
||||
assert(a.getDamage() == 26);
|
||||
a.takeDamage(100);
|
||||
assert(a.getCurrentHP() == 2);
|
||||
a.reset();
|
||||
assert(a.getCurrentHP() == 100);
|
||||
}
|
||||
|
||||
void test_input_parser() {
|
||||
ArenaInterface * A = Factory::createArena();
|
||||
arena * a = dynamic_cast<arena *>(A);
|
||||
|
||||
string input = "Xephos A 200 13 21 10";
|
||||
assert(a->addFighter(input));
|
||||
|
||||
input = "Stephen A 200 13 21 10";
|
||||
assert(a->addFighter(input));
|
||||
|
||||
input = "Billy Bob Thorton A 0 13 21 10";
|
||||
assert(not a->addFighter(input));
|
||||
|
||||
input = "Xephos a 200 13 21 10";
|
||||
assert(not a->addFighter(input));
|
||||
|
||||
input = "Derek A 200 13 21 a10";
|
||||
assert(not a->addFighter(input));
|
||||
|
||||
input = "Derek A 200 13 stupid21 10";
|
||||
assert(not a->addFighter(input));
|
||||
|
||||
delete A;
|
||||
}
|
||||
|
||||
void test_add() {
|
||||
ArenaInterface * A = Factory::createArena();
|
||||
arena * a = dynamic_cast<arena *>(A);
|
||||
|
||||
string input = "Xephos A 200 13 21 10";
|
||||
assert(a->addFighter(input));
|
||||
|
||||
input = "Stephen A 200 13 21 10";
|
||||
assert(a->addFighter(input));
|
||||
|
||||
// do not allow for duplicate fighers
|
||||
input = "Xephos A 200 13 21 10";
|
||||
bool double_add = a->addFighter(input);
|
||||
assert(not double_add);
|
||||
|
||||
input = "Stephen A 0 13 21 10";
|
||||
assert(not a->addFighter(input));
|
||||
|
||||
input = "Derek A 200 13 21 10";
|
||||
assert(a->addFighter(input));
|
||||
|
||||
// another attempt for not allowing duplicate fighters
|
||||
input = "Stephen A 200 13 21 10";
|
||||
assert(not a->addFighter(input));
|
||||
delete A;
|
||||
}
|
||||
|
||||
void test_remove() {
|
||||
ArenaInterface * A = Factory::createArena();
|
||||
arena * a = dynamic_cast<arena *>(A);
|
||||
|
||||
string input = "Michael A 200 13 21 10";
|
||||
a->addFighter(input);
|
||||
input = "Derek A 200 13 21 10";
|
||||
a->addFighter(input);
|
||||
input = "Bryan A 200 13 21 10";
|
||||
a->addFighter(input);
|
||||
|
||||
assert(not a->removeFighter("Zaphodbeblebrox"));
|
||||
|
||||
bool remove_non_existant = a->removeFighter("Stephen");
|
||||
assert(not remove_non_existant);
|
||||
assert(a->getSize() == 3);
|
||||
|
||||
bool remove_fighter = a->removeFighter("Michael");
|
||||
assert(remove_fighter);
|
||||
assert(a->getSize() == 2);
|
||||
|
||||
a->removeFighter("Derek");
|
||||
a->removeFighter("Bryan");
|
||||
assert(a->getSize() == 0);
|
||||
delete a;
|
||||
}
|
||||
|
||||
void test_find() {
|
||||
ArenaInterface * A = Factory::createArena();
|
||||
arena * a = dynamic_cast<arena *>(A);
|
||||
|
||||
string input = "Michael A 200 13 21 10";
|
||||
a->addFighter(input);
|
||||
input = "Derek A 200 13 21 10";
|
||||
a->addFighter(input);
|
||||
input = "Bryan A 200 13 21 10";
|
||||
a->addFighter(input);
|
||||
|
||||
fighter * f;
|
||||
f = dynamic_cast<fighter *>(a->getFighter("Stephen"));
|
||||
assert(not f);
|
||||
f = dynamic_cast<fighter *>(a->getFighter("Derek"));
|
||||
assert(f);
|
||||
|
||||
delete a;
|
||||
}
|
||||
|
||||
void test_archer_reset() {
|
||||
archer a("stephen", 666, 66, 6, 0);
|
||||
a.takeDamage(100);
|
||||
assert(a.getCurrentHP() == 567);
|
||||
a.reset();
|
||||
assert(a.getCurrentHP() == a.getMaximumHP());
|
||||
assert(a.getSpeed() == a.get_original_speed());
|
||||
assert(a.getSpeed() == 6);
|
||||
assert(a.get_original_speed() == 6);
|
||||
}
|
||||
|
||||
void test_archer_usability() {
|
||||
archer a("stephen", 666, 66, 6, 0);
|
||||
assert(a.getSpeed() == 6);
|
||||
a.useAbility();
|
||||
assert(a.getSpeed() == 7);
|
||||
}
|
||||
|
||||
void test_battle() {
|
||||
archer a("stephen", 200, 66, 60, 100);
|
||||
robot b("derek", 1000, 20, 15, 200);
|
||||
fight(&a, &b, true);
|
||||
}
|
||||
|
||||
int main() {
|
||||
test_fighter();
|
||||
test_archer();
|
||||
test_cleric();
|
||||
test_robot();
|
||||
test_input_parser();
|
||||
test_add();
|
||||
test_remove();
|
||||
test_find();
|
||||
test_archer_reset();
|
||||
test_archer_usability();
|
||||
test_battle();
|
||||
}
|
30
cs142/lab10/robot.cpp
Normal file
30
cs142/lab10/robot.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
#include <cmath>
|
||||
#include "FighterInterface.h"
|
||||
#include "robot.h"
|
||||
|
||||
robot::robot(string name, int max_hp, int strength, int speed, int magic) :
|
||||
fighter(name, max_hp, strength, speed, magic),
|
||||
max_energy(2 * magic), cur_energy(2 * magic), extra_damage(0) {}
|
||||
|
||||
int robot::getDamage() {
|
||||
int damage = strength + extra_damage;
|
||||
extra_damage = 0;
|
||||
return damage;
|
||||
}
|
||||
|
||||
void robot::reset() {
|
||||
hp = max_hp;
|
||||
cur_energy = max_energy;
|
||||
}
|
||||
|
||||
bool robot::useAbility() {
|
||||
if(cur_energy - ROBOT_ABILITY_COST >= 0) {
|
||||
double a = cur_energy/double(max_energy);
|
||||
double b = pow(a, 4.0);
|
||||
double increase = strength * b;
|
||||
extra_damage = int(increase);
|
||||
cur_energy -= ROBOT_ABILITY_COST;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
23
cs142/lab10/robot.h
Normal file
23
cs142/lab10/robot.h
Normal file
@ -0,0 +1,23 @@
|
||||
#ifndef __ROBOT_H__
|
||||
#define __ROBOT_H__
|
||||
|
||||
#include "fighter.h"
|
||||
|
||||
class robot : public fighter {
|
||||
private:
|
||||
int max_energy;
|
||||
int cur_energy;
|
||||
int extra_damage;
|
||||
public:
|
||||
robot(string, int, int, int, int);
|
||||
|
||||
string get_type() { return "A"; };
|
||||
|
||||
int getDamage();
|
||||
void reset();
|
||||
bool useAbility();
|
||||
|
||||
int get_original_speed();
|
||||
};
|
||||
|
||||
#endif
|
60
cs142/lab10/util.cpp
Normal file
60
cs142/lab10/util.cpp
Normal file
@ -0,0 +1,60 @@
|
||||
#include <vector>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
#include <cstdlib>
|
||||
#include "util.h"
|
||||
|
||||
vector<string> tokenize(const string & str, const string & delimiters) {
|
||||
vector<string> tokens;
|
||||
string::size_type lastPos = str.find_first_not_of(delimiters, 0);
|
||||
string::size_type pos = str.find_first_of(delimiters, lastPos);
|
||||
while (string::npos != pos || string::npos != lastPos)
|
||||
{
|
||||
tokens.push_back(str.substr(lastPos, pos - lastPos));
|
||||
lastPos = str.find_first_not_of(delimiters, pos);
|
||||
pos = str.find_first_of(delimiters, lastPos);
|
||||
}
|
||||
return tokens;
|
||||
}
|
||||
|
||||
bool parse_n_load(const string & input, string & name, string & type,
|
||||
int & max_hp, int & strength, int & speed, int & magic) {
|
||||
vector<string> tokens = tokenize(input);
|
||||
vector<string> tokens2 = tokenize(input, ".");
|
||||
|
||||
if (tokens.size() != 6 or tokens2.size() > 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
name = tokens[0];
|
||||
|
||||
string parsed_type = tokens[1];
|
||||
if(parsed_type.size() != 1) {
|
||||
return false;
|
||||
}
|
||||
if (not ( parsed_type == "A"
|
||||
or parsed_type == "C"
|
||||
or parsed_type == "R")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
type = parsed_type;
|
||||
|
||||
|
||||
int parsed_max_hp = atoi(tokens[2].c_str());
|
||||
int parsed_strength = atoi(tokens[3].c_str());
|
||||
int parsed_speed = atoi(tokens[4].c_str());
|
||||
int parsed_magic = atoi(tokens[5].c_str());
|
||||
|
||||
if (parsed_max_hp == 0 or parsed_strength == 0 or parsed_speed == 0 or
|
||||
parsed_magic == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
max_hp = parsed_max_hp;
|
||||
strength = parsed_strength;
|
||||
speed = parsed_speed;
|
||||
magic = parsed_magic;
|
||||
|
||||
return true;
|
||||
}
|
14
cs142/lab10/util.h
Normal file
14
cs142/lab10/util.h
Normal file
@ -0,0 +1,14 @@
|
||||
#ifndef __UTIL_H__
|
||||
#define __UTIL_H__
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void print(const string & in);
|
||||
vector<string> tokenize(const string & str, const string & delimiters=" ");
|
||||
bool parse_n_load(const string & input, string & name, string & type,
|
||||
int & max_hp, int & strength, int & speed, int & magic);
|
||||
|
||||
#endif
|
14
cs142/smcquay/cootie/Makefile
Normal file
14
cs142/smcquay/cootie/Makefile
Normal file
@ -0,0 +1,14 @@
|
||||
CPPFLAGS=-Wall -g -std=c++0x
|
||||
|
||||
all: cootie
|
||||
|
||||
cootie: cootie.cc dice.o player.o
|
||||
|
||||
dice.o: dice.cc dice.h
|
||||
player.o: player.cc player.h
|
||||
|
||||
test: all
|
||||
./cootie 4
|
||||
|
||||
clean:
|
||||
@rm -rvf cootie cootie.dSYM *.o
|
42
cs142/smcquay/cootie/cootie.cc
Normal file
42
cs142/smcquay/cootie/cootie.cc
Normal file
@ -0,0 +1,42 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <cstdlib>
|
||||
#include "dice.h"
|
||||
#include "player.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
const string usage = "usage: cootie <number of players>";
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
if(argc < 2) {
|
||||
cerr << usage << endl;;
|
||||
return 1;
|
||||
}
|
||||
|
||||
random_init();
|
||||
|
||||
int number_of_players = int(atof(argv[1]));
|
||||
vector<player> players;
|
||||
for(int i=0; i < number_of_players; i++) {
|
||||
players.push_back(player(i));
|
||||
}
|
||||
|
||||
auto keep_playing = true;
|
||||
while(keep_playing) {
|
||||
for(player & p : players) {
|
||||
// cout << p << endl;
|
||||
p.turn();
|
||||
if(p.won()) {
|
||||
keep_playing = false;
|
||||
cout << "player " << p.id << " wins!!" << endl;
|
||||
cout << p << endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cout << "total rolls: " << get_roll_count() << endl;
|
||||
cout << "thanks for playing" << endl;
|
||||
return 0;
|
||||
}
|
25
cs142/smcquay/cootie/dice.cc
Normal file
25
cs142/smcquay/cootie/dice.cc
Normal file
@ -0,0 +1,25 @@
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "dice.h"
|
||||
|
||||
static int roll_count = 0;
|
||||
|
||||
void random_init() {
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, NULL);
|
||||
pid_t pid = getpid();
|
||||
srand(tv.tv_usec + pid);
|
||||
}
|
||||
|
||||
int roll() {
|
||||
roll_count++;
|
||||
int compliment = rand() % 6;
|
||||
return compliment + 1;
|
||||
}
|
||||
|
||||
int get_roll_count() {
|
||||
return roll_count;
|
||||
}
|
8
cs142/smcquay/cootie/dice.h
Normal file
8
cs142/smcquay/cootie/dice.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef __DICE_H__
|
||||
#define __DICE_H__
|
||||
|
||||
void random_init();
|
||||
int roll();
|
||||
int get_roll_count();
|
||||
|
||||
#endif
|
67
cs142/smcquay/cootie/player.cc
Normal file
67
cs142/smcquay/cootie/player.cc
Normal file
@ -0,0 +1,67 @@
|
||||
#include "dice.h"
|
||||
#include "player.h"
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
player::player(int id) : id(id), head(false), body(false),
|
||||
hat(false), eyes(false), mouth(false), legs(0) {}
|
||||
|
||||
ostream & operator<<(ostream & os, const player & e) {
|
||||
os << "{id: " << e.id
|
||||
<< ", body: " << e.body
|
||||
<< ", head: " << e.head
|
||||
<< ", hat: " << e.hat
|
||||
<< ", eyes: " << e.eyes
|
||||
<< ", mouth: " << e.mouth
|
||||
<< ", legs: " << e.legs
|
||||
<< "}";
|
||||
return os;
|
||||
}
|
||||
|
||||
void player::turn() {
|
||||
bool turn_finished = false;
|
||||
while(not turn_finished) {
|
||||
int cur_roll = roll();
|
||||
turn_finished = true;
|
||||
if(cur_roll == 1) {
|
||||
if(not body) {
|
||||
turn_finished = false;
|
||||
body = true;
|
||||
}
|
||||
}
|
||||
else if(body and cur_roll == 2) {
|
||||
if(not head) {
|
||||
turn_finished = false;
|
||||
head = true;
|
||||
}
|
||||
}
|
||||
else if(body and head) {
|
||||
if (cur_roll == 3) {
|
||||
turn_finished = false;
|
||||
hat = true;
|
||||
}
|
||||
else if (cur_roll == 4) {
|
||||
turn_finished = false;
|
||||
eyes = true;
|
||||
}
|
||||
else if (cur_roll == 5) {
|
||||
turn_finished = false;
|
||||
mouth = true;
|
||||
}
|
||||
else if (cur_roll == 6) {
|
||||
if (not (legs >= 6)) {
|
||||
turn_finished = false;
|
||||
legs++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool player::won() {
|
||||
if(head and body and hat and eyes and mouth and legs == 6)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
24
cs142/smcquay/cootie/player.h
Normal file
24
cs142/smcquay/cootie/player.h
Normal file
@ -0,0 +1,24 @@
|
||||
#ifndef __PLAYER_H__
|
||||
#define __PLAYER_H__
|
||||
|
||||
#include <ostream>
|
||||
using namespace std;
|
||||
|
||||
class player {
|
||||
public:
|
||||
int id;
|
||||
bool head;
|
||||
bool body;
|
||||
bool hat;
|
||||
bool eyes;
|
||||
bool mouth;
|
||||
int legs;
|
||||
|
||||
player(int);
|
||||
friend ostream & operator<<(ostream &, const player &);
|
||||
|
||||
void turn();
|
||||
bool won();
|
||||
};
|
||||
|
||||
#endif
|
9
cs142/smcquay/fun_with_formatting/Makefile
Normal file
9
cs142/smcquay/fun_with_formatting/Makefile
Normal file
@ -0,0 +1,9 @@
|
||||
CPPFLAGS=-Wall -g -std=c++0x
|
||||
|
||||
all: main
|
||||
|
||||
test: all
|
||||
./main
|
||||
|
||||
clean:
|
||||
@rm -rfv main.o main
|
34
cs142/smcquay/fun_with_formatting/main.cc
Normal file
34
cs142/smcquay/fun_with_formatting/main.cc
Normal file
@ -0,0 +1,34 @@
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <cstdio>
|
||||
#include <cmath>
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
float a = 12.123456;
|
||||
float b = 12.125100;
|
||||
|
||||
cout << a << " " << b << " " << endl;
|
||||
cout << setiosflags(ios::fixed) << setprecision(2) << a << " " << b << " " << endl;
|
||||
|
||||
printf("%0.2f %0.2f\n", a, b);
|
||||
fprintf(stdout, "%0.2f %0.2f\n", a, b);
|
||||
fprintf(stderr, "%0.2f %0.2f\n", a, b);
|
||||
|
||||
double input;
|
||||
cin >> input;
|
||||
double intpart = 0;
|
||||
double fracpart = modf(input, &intpart);
|
||||
printf("%f %f\n", intpart, fracpart);
|
||||
|
||||
if (fracpart == 0.5) {
|
||||
cout << "exactly 0.5" << endl;
|
||||
}
|
||||
else {
|
||||
cout << "not exactly 0.5" << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
7
cs142/smcquay/go/lab00/Makefile
Normal file
7
cs142/smcquay/go/lab00/Makefile
Normal file
@ -0,0 +1,7 @@
|
||||
include $(GOROOT)/src/Make.inc
|
||||
|
||||
TARG=hello
|
||||
GOFILES=\
|
||||
hello.go
|
||||
|
||||
include $(GOROOT)/src/Make.cmd
|
7
cs142/smcquay/go/lab00/hello.go
Normal file
7
cs142/smcquay/go/lab00/hello.go
Normal file
@ -0,0 +1,7 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
fmt.Println("hello world! My name is Stephen McQuay.")
|
||||
}
|
7
cs142/smcquay/go/lab01/Makefile
Normal file
7
cs142/smcquay/go/lab01/Makefile
Normal file
@ -0,0 +1,7 @@
|
||||
include $(GOROOT)/src/Make.inc
|
||||
|
||||
TARG=trivia
|
||||
GOFILES=\
|
||||
trivia.go
|
||||
|
||||
include $(GOROOT)/src/Make.cmd
|
29
cs142/smcquay/go/lab01/trivia.go
Normal file
29
cs142/smcquay/go/lab01/trivia.go
Normal file
@ -0,0 +1,29 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type QA struct {
|
||||
question string
|
||||
answer string
|
||||
}
|
||||
|
||||
func main() {
|
||||
fmt.Printf("%48s\n", "Basic BYU Trivia")
|
||||
fmt.Printf("%25s %38s\n\n", "Questions", "Answers")
|
||||
|
||||
qas := []QA{
|
||||
{"What was the original name of BYU?", "Brigham Young Academy"},
|
||||
{"When was BYU established?", "1875"},
|
||||
{"Who was the first \"permanent\" principal of BYA?",
|
||||
"Karl G. Maeser"},
|
||||
{"When did BYA become BYU?", "1903"},
|
||||
{"To what sports conference do we belong?",
|
||||
"Mountain West Conference (MWC)"},
|
||||
{"WHen did BYU win the national football title?", "1984"},
|
||||
{"Who won the Heisman Trophy in 1990?", "Ty Detmer"},
|
||||
}
|
||||
|
||||
for _, v := range qas {
|
||||
fmt.Printf("%-48s %s\n", v.question, v.answer)
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user