From 3fc2c5f411f7bcd62365944679996b3f468df543 Mon Sep 17 00:00:00 2001 From: lizichao <1010635424@qq.com> Date: Mon, 15 Jul 2024 18:56:00 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.vscode/settings.json" | 44 ++++++ .../Chapter10/10-1/10-1.cpp" | 51 +++++++ .../Chapter10/10-8/10-8-list.cpp" | 25 ++++ .../Chapter10/10-8/10-8-list.h" | 14 ++ .../Chapter10/10-8/10-8-main.cpp" | 19 +++ .../Chapter11/11-4/mytime3.cpp" | 66 +++++++++ .../Chapter11/11-4/mytime3.h" | 27 ++++ .../Chapter11/11-4/usetime3.cpp" | 22 +++ .../Chapter11/11-7/11-7-1.cpp" | 35 +++++ .../Chapter11/11-7/11-7-complex0.h" | 19 +++ .../Chapter11/11-7/11-7-main .cpp" | 22 +++ .../Chapter12/12-1/cow.cpp" | 57 ++++++++ .../Chapter12/12-1/cow.h" | 13 ++ .../Chapter12/12-1/main.cpp" | 13 ++ .../Chapter12/12-2/main.cpp" | 40 ++++++ .../Chapter12/12-2/string2.cpp" | 134 ++++++++++++++++++ .../Chapter12/12-2/string2.h" | 43 ++++++ .../Chapter13/13-1/cd.cpp" | 95 +++++++++++++ .../Chapter13/13-1/cd.h" | 28 ++++ .../Chapter13/13-1/main.cpp" | 37 +++++ .../Chapter13/13-4/port.cpp" | 98 +++++++++++++ .../Chapter13/13-4/port.h" | 39 +++++ .../Chapter7/.vscode/launch.json" | 31 ++++ .../Chapter7/.vscode/tasks.json" | 84 +++++++++++ .../Chapter7/Makefile" | 99 +++++++++++++ .../Chapter7/src/main.cpp" | 6 + .../Chapter9/9-1/9-1-golf.cpp" | 37 +++++ .../Chapter9/9-1/9-1-main.cpp" | 17 +++ .../Chapter9/9-1/golf.h" | 26 ++++ .../Chapter9/9-4/9-4-1.cpp" | 64 +++++++++ .../Chapter9/9-4/9-4-2.cpp" | 17 +++ .../Chapter9/9-4/9-4-sales.h" | 26 ++++ 32 files changed, 1348 insertions(+) create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/.vscode/settings.json" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-1/10-1.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-list.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-list.h" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-main.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/mytime3.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/mytime3.h" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/usetime3.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-1.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-complex0.h" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-main .cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-1/cow.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-1/cow.h" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-1/main.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/main.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/string2.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/string2.h" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-1/cd.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-1/cd.h" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-1/main.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-4/port.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-4/port.h" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/.vscode/launch.json" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/.vscode/tasks.json" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/Makefile" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/src/main.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/9-1-golf.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/9-1-main.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/golf.h" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-1.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-2.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-sales.h" diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/.vscode/settings.json" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/.vscode/settings.json" new file mode 100644 index 0000000..24dd5a1 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/.vscode/settings.json" @@ -0,0 +1,44 @@ +{ + "files.associations": { + "iostream": "cpp", + "ostream": "cpp", + "array": "cpp", + "atomic": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "optional": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "typeinfo": "cpp" + } +} \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-1/10-1.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-1/10-1.cpp" new file mode 100644 index 0000000..937229d --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-1/10-1.cpp" @@ -0,0 +1,51 @@ +#include +#include +using namespace std; +class BankAccount { +private: + string name; + string account; + int money; +public: + BankAccount(const string& n="",const string& a="",const int &m=0); + void show() const; + void save(const int& m); + void withdraw(const int& m); +}; + +BankAccount::BankAccount(const string & n, const string & a, const int & m):name(n),account(a),money(m) +{ +} + +void BankAccount::show() const +{ + cout << "BanAccount:" << endl; + cout << "name:" << name << endl; + cout << "account:" << account << endl; + cout << "money:" << money << endl; + cout << endl; +} + +void BankAccount::save(const int& m) +{ + money += m; +} + +void BankAccount::withdraw(const int& m) +{ + if (money < m) + cout << "money no enough" << endl << endl; + else + money -= m; +} +int main() +{ + BankAccount test("lzc", "135", 100); + test.show(); + test.save(50); + test.show(); + test.withdraw(200); + test.withdraw(120); + test.show(); + +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-list.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-list.cpp" new file mode 100644 index 0000000..4fd0d43 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-list.cpp" @@ -0,0 +1,25 @@ +#include "10-8-list.h" +#include +List::List() +{ + count = 0; +}; +void List::add(const Item&item) { + if (isFull()) + std::cout << "the list is full!" << std::endl; + else { + list[count++] = item; + } + +}; +bool List::isEmpty()const { + return count == 0; +}; + +bool List::isFull() const { + return count == MAX_SIZE; +}; +void List::visit(void(*pf)(Item &)) { + for (int i = 0; i < count; i++) + pf(list[i]); +}; diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-list.h" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-list.h" new file mode 100644 index 0000000..64acb0a --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-list.h" @@ -0,0 +1,14 @@ +#pragma once +typedef int Item; +class List { +private: + enum {MAX_SIZE = 10}; + Item list[MAX_SIZE]; + int count; +public: + List(); + void add(const Item&item); + bool isEmpty() const; + bool isFull() const; + void visit(void (*pf)(Item &)); +}; \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-main.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-main.cpp" new file mode 100644 index 0000000..40e8014 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter10/10-8/10-8-main.cpp" @@ -0,0 +1,19 @@ +#include +#include "10-8-list.h" +void show(Item &item) { + std::cout << item << std::endl; +} +void add(Item &item) { + item++; +} +int main() +{ + List test; + test.add(10); + test.add(20); + test.add(30); + + test.visit(show); + test.visit(add); + test.visit(show); +} \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/mytime3.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/mytime3.cpp" new file mode 100644 index 0000000..3176770 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/mytime3.cpp" @@ -0,0 +1,66 @@ +#include "mytime3.h" + +Time::Time() +{ + hours = minutes = 0; +} + +Time::Time(int h, int m) +{ + hours = h; + minutes = m; +} + +void Time::AddMin(int m) +{ + minutes += m; + hours += minutes / 60; + minutes %= 60; +} + +void Time::AddHr(int h) +{ + hours += h; +} + +void Time::Reset(int h, int m) +{ + hours = h; + minutes = m; +} + + +Time operator+(const Time &t1, const Time &t2) +{ + Time sum; + sum.minutes = t1.minutes + t2.minutes; + sum.hours = t1.hours + t2.hours + sum.minutes / 60; + sum.minutes %= 60; + return sum; +} + +Time operator-(const Time &t1, const Time &t2) +{ + Time diff; + int tot1, tot2; + tot1 = t2.minutes + 60 * t2.hours; + tot2 = t1.minutes + 60 * t1.hours; + diff.minutes = (tot2 - tot1) % 60; + diff.hours = (tot2 - tot1) / 60; + return diff; +} + +Time operator*(const Time &t, double m) +{ + Time result; + long totalminutes = t.hours * m * 60 + t.minutes * m; + result.hours = totalminutes / 60; + result.minutes = totalminutes % 60; + return result; +} + +std::ostream &operator<<(std::ostream &os, const Time &t) +{ + os << t.hours << " hours, " << t.minutes << " minutes"; + return os; +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/mytime3.h" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/mytime3.h" new file mode 100644 index 0000000..7873c28 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/mytime3.h" @@ -0,0 +1,27 @@ +// mytime3.h -- Time class with friends +#ifndef MYTIME3_H_ +#define MYTIME3_H_ +#include + +class Time +{ +private: + int hours; + int minutes; +public: + Time(); + Time(int h, int m = 0); + void AddMin(int m); + void AddHr(int h); + void Reset(int h = 0, int m = 0); + friend Time operator+(const Time & t1,const Time & t2); + friend Time operator-(const Time & t1,const Time & t2); + friend Time operator*(const Time & t,double n); + friend Time operator*(double m, const Time & t) + { + return t * m; + } + friend std::ostream & operator<<(std::ostream & os, const Time & t); +}; + +#endif diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/usetime3.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/usetime3.cpp" new file mode 100644 index 0000000..9b939e8 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-4/usetime3.cpp" @@ -0,0 +1,22 @@ +// usetime3.cpp -- using the fourth draft of the Time class +// compile usetime3.cpp and mytime3.cpp together +#include +#include "mytime3.h" + +int main() +{ + + Time aida(3, 35); + Time tosca(2, 48); + Time temp; + + std::cout << "Aida and Tosca:\n"; + std::cout << aida << "; " << tosca << std::endl; + temp = aida + tosca; // operator+() + std::cout << "Aida + Tosca: " << temp << std::endl; + temp = aida * 1.17; // member operator*() + std::cout << "Aida * 1.17: " << temp << std::endl; + std::cout << "10.0 * Tosca: " << 10.0 * tosca << std::endl; + + return 0; +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-1.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-1.cpp" new file mode 100644 index 0000000..43c427e --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-1.cpp" @@ -0,0 +1,35 @@ +#include +#include "11-7-complex0.h" +using std::cin; +using std::cout; +using std::endl; +complex complex::operator+(const complex& c) { + return complex(this->realnum+c.realnum, this->imagnum+c.imagnum); +} +complex complex::operator-(const complex& c) { + return complex(this->realnum - c.realnum, this->imagnum - c.imagnum); +} +complex complex::operator*(const complex& c) { + double a = this->realnum*c.realnum - this->imagnum*c.imagnum; + double b = this->realnum*c.imagnum + this->imagnum*c.realnum; + return complex(a, b); +} +complex complex::operator*(const double& x) { + return complex(this->realnum*x, this->imagnum*x); +} + +complex operator*( const double& x, const complex& c) { + return complex(x*c.realnum, x*c.imagnum); +} +ostream& operator<<(ostream& os, const complex& c) { + os << c.realnum << "+" << c.imagnum << "i" << endl; + return os; +} + +istream& operator>>(istream& is, complex& c) { + cout << "read:"; + is >> c.realnum; + cout << "imaginary:"; + is>> c.imagnum; + return is; +} \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-complex0.h" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-complex0.h" new file mode 100644 index 0000000..f1c7d47 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-complex0.h" @@ -0,0 +1,19 @@ +#pragma once +#include +using std::ostream; +using std::istream; +class complex { +private: + double realnum; + double imagnum; +public: + complex() :realnum(0.0), imagnum(0.0) {}; + complex(const double& a, const double& b) :realnum(a), imagnum(b) {}; + complex operator+(const complex& c); + complex operator-(const complex& c); + complex operator*(const complex& c); + complex operator*(const double& x); + friend complex operator*(const double& x, const complex& c); + friend ostream& operator<<( ostream&os, const complex& c); + friend istream& operator>>( istream&is, complex& c); +}; diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-main .cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-main .cpp" new file mode 100644 index 0000000..21760f5 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter11/11-7/11-7-main .cpp" @@ -0,0 +1,22 @@ +#include +using namespace std; +#include "11-7-complex0.h" // to avoid confusion with complex.h +int main() +{ + complex a(3.0, 4.0); // initialize to (3, 4i) + complex c; + cout << "Enter a complex number (q to quit):\n"; + while (cin >> c) + { + cout << "c is " << c << '\n'; + //cout << "complex conjugate is " << ~c << '\n'; + cout << "a is " << a << '\n'; + cout << "a + c is " << a + c << '\n'; + cout << "a - c is " << a - c << '\n'; + cout << "a * c is " << a * c << '\n'; + cout << "2 * c is " << 2 * c << '\n'; + cout << "Enter a complex number (q to quit):\n"; + } + cout << "Done!\n"; + return 0; +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-1/cow.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-1/cow.cpp" new file mode 100644 index 0000000..c1b7a07 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-1/cow.cpp" @@ -0,0 +1,57 @@ +#include "cow.h" +#include +#include + +Cow::Cow() +{ + name[0]='\0'; + hobby=new char[1]; + hobby[0]='\0'; + weight=0.0; +} + +Cow::Cow(const char *nm, const char *ho, double wt) +{ + + strncpy(name,nm,19); + name[19]='\0'; + hobby=new char[strlen(ho)+1]; + strcpy(hobby,ho); + weight=wt; +} + +Cow &Cow::operator=(const Cow &c) +{ + if(this==&c) + return *this; + strncpy(name,c.name,19); + delete[] hobby; + hobby=new char[strlen(c.hobby)+1]; + strcpy(hobby,c.hobby); + weight=c.weight; + return *this; +} + +Cow::Cow(const Cow &c) +{ + strncpy(name, c.name, 19); + name[19] = '\0'; + hobby = new char[strlen(c.hobby) + 1]; + strcpy(hobby, c.hobby); + weight = c.weight; +} + +Cow::~Cow() +{ + delete []hobby; +} + + + +void Cow::ShowCow() const +{ + std::cout<<"cow message:"< +#include "cow.h" +int main(int argc, char *argv[]) +{ + Cow cow1; + Cow cow2("777","ball",80); + cow1.ShowCow(); + cow2.ShowCow(); + cow1=cow2; + cow1.ShowCow(); + Cow cow3=cow2; + cow3.ShowCow(); +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/main.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/main.cpp" new file mode 100644 index 0000000..b484808 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/main.cpp" @@ -0,0 +1,40 @@ +// pel2_2.cpp +#include +#include "string2.h" + +int main() { + String s1(" and I am a C++ student."); + String s2 = "Please enter your name: "; + String s3; + + std::cout << s2; // overloaded << operator + std::cin >> s3; // overloaded >> operator + s2 = "My name is " + s3; // overloaded =, + operators + std::cout << s2 << ".\n"; + s2 = s2 + s1; + s2.stringup(); // converts string to uppercase + std::cout << "The string\n" << s2 << "\ncontains " << s2.has('A') + << " 'A' characters in it.\n"; + s1 = "red"; // String(const char *), then String & operator=(const String&) + String rgb[3] = { String(s1), String("green"), String("blue") }; + std::cout << "Enter the name of a primary color for mixing light: "; + String ans; + bool success = false; + while (std::cin >> ans) { + ans.stringlow(); // converts string to lowercase + for (int i = 0; i < 3; i++) { + if (ans == rgb[i]) // overloaded == operator + { + std::cout << "That's right!\n"; + success = true; + break; + } + } + if (success) + break; + else + std::cout << "Try again!\n"; + } + std::cout << "Bye\n"; + return 0; +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/string2.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/string2.cpp" new file mode 100644 index 0000000..010afe9 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/string2.cpp" @@ -0,0 +1,134 @@ +// string1.cpp -- String class methods +#include // string.h for some +#include "string2.h" +#include // includes + +// initializing static class member +int String::num_strings = 0; + +// static method +int String::HowMany() { + return num_strings; +} + +// class methods +String::String(const char * s) { // construct String from C string + len = std::strlen(s); // set size + str = new char[len + 1]; // allot storage + std::strcpy(str, s); // initialize pointer + num_strings++; // set object count +} + +String::String() { // default constructor + len = 4; + str = new char[1]; + str[0] = '\0'; // default string + num_strings++; +} + +String::String(const String & st) { // copy constructor + num_strings++; // handle static member update + len = st.len; // same length + str = new char[len + 1]; // allot space + std::strcpy(str, st.str); // copy string to new location +} + +String::~String() { // necessary destructor + --num_strings; // required + delete[] str; // required +} + +void String::stringup() +{ + for(int i=0;i(const String &st1, const String &st2) { + return st2 < st1; +} + +bool operator==(const String &st1, const String &st2) { + return (std::strcmp(st1.str, st2.str) == 0); +} + +String operator+(const String &st1, const String &st2) +{ + String res; + res.len=st1.len+st2.len; + res.str=new char[res.len+1]; + strcpy(res.str,st1.str); + strcat(res.str,st2.str); + return res; + +} + +// simple String output +ostream & operator<<(ostream & os, const String & st) { + os << st.str; + return os; +} + +// quick and dirty String input +istream & operator>>(istream & is, String & st) { + char temp[String::CINLIM]; + is.get(temp, String::CINLIM); + if (is) + st = temp; + while (is && is.get() != '\n') + continue; + return is; +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/string2.h" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/string2.h" new file mode 100644 index 0000000..99fd932 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter12/12-2/string2.h" @@ -0,0 +1,43 @@ +#ifndef STRING1_H_ +#define STRING1_H_ +#include +using std::ostream; +using std::istream; + +class String { +private: + char * str; // pointer to string + int len; // length of string + static int num_strings; // number of objects + static const int CINLIM = 80; // cin input limit + +public: + // constructors and other methods + String(const char * s); // constructor + String(); // default constructor + String(const String &); // copy constructor + ~String(); // destructor + int length() const { return len; } + void stringup();// converts string to uppercase + void stringlow(); // converts string to lowercase + int has(const char ch) const; + + // overloaded operator methods + String & operator=(const String &); + String & operator=(const char *); + char & operator[](int i); + const char & operator[](int i) const; + + // overloaded operator friends + friend bool operator<(const String &st, const String &st2); + friend bool operator>(const String &st1, const String &st2); + friend bool operator==(const String &st, const String &st2); + friend String operator+(const String &st1,const String &st2); + friend ostream & operator<<(ostream & os, const String & st); + friend istream & operator>>(istream & is, String & st); + + // static function + static int HowMany(); +}; + +#endif diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-1/cd.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-1/cd.cpp" new file mode 100644 index 0000000..a18e61f --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-1/cd.cpp" @@ -0,0 +1,95 @@ +#include "cd.h" +#include +#include + +Cd::Cd(char *s1, char *s2, int n, double x) +{ + strncpy(performers,s1,49); + performers[49]='\0'; + strncpy(label,s2,19); + label[19]='\0'; + selections=n; + playtime=x; +} + +Cd::Cd(const Cd &d) +{ + strcpy(performers,d.performers); + strcpy(label,d.label); + selections=d.selections; + playtime=d.playtime; +} + +Cd::Cd() +{ + performers[0]='\0'; + label[0]='\0'; + selections=0; + playtime=0; +} + +Cd::~Cd() +{ +} + +void Cd::Report() const +{ + std::cout<<"performers:"< +#include "cd.h" // which will contain #include cd.h + +void Bravo(const Cd & disk); + +int main() +{ + Cd c1("Beatles", "Capitol", 14, 35.5); + Classic c2 = Classic("Piano Sonata in B flat, Fantasia in C", "Alfred Brendel", "Philips", 2, 57.17); + + Cd *pcd = &c1; + + std::cout << "Using object directly:\n"; + c1.Report(); // use Cd method + c2.Report(); // use Classic method + + std::cout << "Using type cd * pointer to objects:\n"; + pcd->Report(); // use Cd method for cd object + pcd = &c2; + pcd->Report(); // use Classic method for classic object + + std::cout << "Calling a function with a Cd reference argument:\n"; + Bravo(c1); + Bravo(c2); + + std::cout << "Testing assignment: "; + Classic copy; + copy = c2; + copy.Report(); + + return 0; +} + +void Bravo(const Cd & disk) +{ + disk.Report(); +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-4/port.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-4/port.cpp" new file mode 100644 index 0000000..cc17fe7 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter13/13-4/port.cpp" @@ -0,0 +1,98 @@ +#include "port.h" +#include +#include +using namespace std; +Port::Port() +{ + brand=new char[1]; + brand[0]='\0'; + style[0]='\0'; + bottles=0; +} +Port::Port(const char *br, const char *st, int b) +{ + brand=new char[strlen(br)+1]; + strcpy(brand,br); + strcpy(style,st); + bottles=b; +} + +Port::Port(const Port &p) +{ + brand=new char[strlen(p.brand)+1]; + strcpy(brand,p.brand); + strcpy(style,p.style); + bottles=p.bottles; +} + +Port &Port::operator=(const Port &p) +{ + if(this==&p) + return *this; + delete []brand; + brand=new char[strlen(p.brand)+1]; + strcpy(brand,p.brand); + strcpy(style,p.style); + bottles=p.bottles; + return *this; +} + +Port &Port::operator+=(int b) +{ + bottles+=b; + return *this; +} + +Port &Port::operator-=(int b) +{ + bottles-=b; + return *this; +} + +void Port::Show() const +{ + cout<<"Brand:"< +using namespace std; + +class Port +{ +private: + char * brand; + char style[20]; // i.e., tawny, ruby, vintage + int bottles; + +public: + Port(); + Port(const char * br , const char * st , int b); + Port(const Port & p); // copy constructor + virtual ~Port() { delete [] brand; } + Port & operator=(const Port & p); + Port & operator+=(int b); // adds b to bottles + Port & operator-=(int b); // subtracts b from bottles, if available + int BottleCount() const { return bottles; } + virtual void Show() const; + friend ostream & operator<<(ostream & os, const Port & p); +}; + + +class VintagePort : public Port // style necessarily = "vintage" +{ +private: + char * nickname; // i.e., "The Noble" or "Old Velvet", etc. + int year; // vintage year + +public: + VintagePort(); + VintagePort(const char * br, int b, const char * nn, int y); + VintagePort(const VintagePort & vp); + ~VintagePort() { delete [] nickname; } + VintagePort & operator=(const VintagePort & vp); + void Show() const; + friend ostream & operator<<(ostream & os, const VintagePort & vp); +}; diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/.vscode/launch.json" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/.vscode/launch.json" new file mode 100644 index 0000000..87d9011 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/.vscode/launch.json" @@ -0,0 +1,31 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "linux": { + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "program": "${workspaceFolder}/output/main" + }, + "osx": { + "MIMode": "lldb", + "miDebuggerPath": "lldb-mi", + "program": "${workspaceFolder}/output/main" + }, + "windows": { + "MIMode": "gdb", + "miDebuggerPath": "gdb.exe", + "program": "${workspaceFolder}/output/main.exe" + }, + "preLaunchTask": "build" + } + ] +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/.vscode/tasks.json" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/.vscode/tasks.json" new file mode 100644 index 0000000..a367b6d --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/.vscode/tasks.json" @@ -0,0 +1,84 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "group": { + "kind": "build", + "isDefault": true + }, + "windows": { + "command": "powershell", + "args": [ + "-c", + "mingw32-make" + ] + }, + "linux": { + "command": "bash", + "args": [ + "-c", + "make" + ] + }, + "osx": { + "command": "bash", + "args": [ + "-c", + "make" + ] + } + }, + { + "label": "build & run", + "type": "shell", + "windows": { + "command": "powershell", + "args": [ + "-c", + "'mingw32-make run'" + ] + }, + "linux": { + "command": "bash", + "args": [ + "-c", + "'make run'" + ] + }, + "osx": { + "command": "bash", + "args": [ + "-c", + "'make run'" + ] + } + }, + { + "label": "clean", + "type": "shell", + "windows": { + "command": "powershell", + "args": [ + "-c", + "'mingw32-make clean'" + ] + }, + "linux": { + "command": "bash", + "args": [ + "-c", + "'make clean'" + ] + }, + "osx": { + "command": "bash", + "args": [ + "-c", + "'make clean'" + ] + } + } + ] +} \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/Makefile" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/Makefile" new file mode 100644 index 0000000..227f3ba --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/Makefile" @@ -0,0 +1,99 @@ +# +# 'make' build executable file 'main' +# 'make clean' removes all .o and executable files +# + +# define the Cpp compiler to use +CXX = g++ + +# define any compile-time flags +CXXFLAGS := -std=c++17 -Wall -Wextra -g + +# define library paths in addition to /usr/lib +# if I wanted to include libraries not in /usr/lib I'd specify +# their path using -Lpath, something like: +LFLAGS = + +# define output directory +OUTPUT := output + +# define source directory +SRC := src + +# define include directory +INCLUDE := include + +# define lib directory +LIB := lib + +ifeq ($(OS),Windows_NT) +MAIN := main.exe +SOURCEDIRS := $(SRC) +INCLUDEDIRS := $(INCLUDE) +LIBDIRS := $(LIB) +FIXPATH = $(subst /,\,$1) +RM := del /q /f +MD := mkdir +else +MAIN := main +SOURCEDIRS := $(shell find $(SRC) -type d) +INCLUDEDIRS := $(shell find $(INCLUDE) -type d) +LIBDIRS := $(shell find $(LIB) -type d) +FIXPATH = $1 +RM = rm -f +MD := mkdir -p +endif + +# define any directories containing header files other than /usr/include +INCLUDES := $(patsubst %,-I%, $(INCLUDEDIRS:%/=%)) + +# define the C libs +LIBS := $(patsubst %,-L%, $(LIBDIRS:%/=%)) + +# define the C source files +SOURCES := $(wildcard $(patsubst %,%/*.cpp, $(SOURCEDIRS))) + +# define the C object files +OBJECTS := $(SOURCES:.cpp=.o) + +# define the dependency output files +DEPS := $(OBJECTS:.o=.d) + +# +# The following part of the makefile is generic; it can be used to +# build any executable just by changing the definitions above and by +# deleting dependencies appended to the file from 'make depend' +# + +OUTPUTMAIN := $(call FIXPATH,$(OUTPUT)/$(MAIN)) + +all: $(OUTPUT) $(MAIN) + @echo Executing 'all' complete! + +$(OUTPUT): + $(MD) $(OUTPUT) + +$(MAIN): $(OBJECTS) + $(CXX) $(CXXFLAGS) $(INCLUDES) -o $(OUTPUTMAIN) $(OBJECTS) $(LFLAGS) $(LIBS) + +# include all .d files +-include $(DEPS) + +# this is a suffix replacement rule for building .o's and .d's from .c's +# it uses automatic variables $<: the name of the prerequisite of +# the rule(a .c file) and $@: the name of the target of the rule (a .o file) +# -MMD generates dependency output files same name as the .o file +# (see the gnu make manual section about automatic variables) +.cpp.o: + $(CXX) $(CXXFLAGS) $(INCLUDES) -c -MMD $< -o $@ + +.PHONY: clean +clean: + $(RM) $(OUTPUTMAIN) + $(RM) $(call FIXPATH,$(OBJECTS)) + $(RM) $(call FIXPATH,$(DEPS)) + @echo Cleanup complete! + +run: all + ./$(OUTPUTMAIN) + @echo Executing 'run: all' complete! diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/src/main.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/src/main.cpp" new file mode 100644 index 0000000..5b2bd96 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter7/src/main.cpp" @@ -0,0 +1,6 @@ +#include + +int main(int argc, char *argv[]) +{ + std::cout << "Hello world!" << std::endl; +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/9-1-golf.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/9-1-golf.cpp" new file mode 100644 index 0000000..098fc1e --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/9-1-golf.cpp" @@ -0,0 +1,37 @@ +#include "golf.h" +#include +#include +#include +void setGolf(golf & g, const char * name, int hc) +{ + strncpy_s(g.fullname, name,Len-1); + g.fullname[Len - 1] = '\0'; + g.handicap = hc; +} + +int setGolf(golf & g) +{ + std::cout << "Enter fullname: "; + std::cin.getline(g.fullname, Len); + if (strlen(g.fullname) == 0) { + return 0; + std::cout << "no name" << std::endl; + } + std::cout << "Enter handicap: "; + std::cin >> g.handicap; + std::cin.ignore(); + return 1; +} + +void handicap(golf & g, int hc) +{ + g.handicap = hc; +} + +void showGolf(const golf & g) +{ + std::cout << "golf message:" << std::endl; + std::cout << "fullname:" << g.fullname << std::endl; + std::cout << "handicap:" << g.handicap << std::endl; +} + diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/9-1-main.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/9-1-main.cpp" new file mode 100644 index 0000000..df18c3f --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/9-1-main.cpp" @@ -0,0 +1,17 @@ +#include +#include "golf.h" +int main() +{ + golf garray[5]; + int size = 0; + for (int i = 0; i < 5; i++) { + if (setGolf(garray[i])) { + size++; + std::cout << "next input:" << std::endl; + } + else break; + } + for (int i = 0; i < size; i++) { + showGolf(garray[i]); + } +} \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/golf.h" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/golf.h" new file mode 100644 index 0000000..b1be5b2 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-1/golf.h" @@ -0,0 +1,26 @@ +// golf.h -- for pe9-1.cpp + +const int Len = 40; +struct golf +{ + char fullname[Len]; + int handicap; +}; + +// non-interactive version: +// function sets golf structure to provided name, handicap +// using values passed as arguments to the function +void setGolf(golf & g, const char * name, int hc); + +// interactive version: +// function solicits name and handicap from user +// and sets the members of g to the values entered +// returns 1 if name is entered, 0 if name is empty string +int setGolf(golf & g); + +// function resets handicap to new value +void handicap(golf & g, int hc); + +// function displays contents of golf structure +void showGolf(const golf & g); +#pragma once diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-1.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-1.cpp" new file mode 100644 index 0000000..77aa207 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-1.cpp" @@ -0,0 +1,64 @@ +#include "9-4-sales.h" +#include +using std::cin; +using std::cout; +using std::endl; +namespace SALES +{ + void setSales(Sales & s, const double ar[], int n) + { + double sum = 0.0; + s.max = ar[0]; + s.min = ar[0]; + for (int i = 0; i < QUARTERS; i++) { + if (i < n) { + s.sales[i] = ar[i]; + sum += ar[i]; + s.max = s.max > ar[i] ? s.max : ar[i]; + s.min = s.min < ar[i] ? s.min : ar[i]; + } + else { + s.sales[i] = 0.0; + } + s.average = sum / QUARTERS; + } + } + + + void setSales(Sales & s) + { + double total = 0.0; + std::cout << "Enter sales for 4 quarters" << endl; + for (int i = 0; i < QUARTERS; i++) + { + std::cout << "Quarter " << (i + 1) << ": "; + std::cin >> s.sales[i]; + total += s.sales[i]; + + if (i == 0) + { + s.max = s.min = s.sales[i]; + } + else + { + if (s.sales[i] > s.max) + s.max = s.sales[i]; + if (s.sales[i] < s.min) + s.min = s.sales[i]; + } + } + + s.average = total / QUARTERS; + } + + void showSales(const Sales & s) + { + cout << "Sales:" << endl; + for (int i = 0; i < 4; i++) { + cout << "Quarter" << i + 1 << ":" << s.sales[i] << endl; + } + cout << "max:" << s.max << endl; + cout << "min:" << s.min << endl; + cout << "average:" << s.average << endl; + } +} \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-2.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-2.cpp" new file mode 100644 index 0000000..daeefe8 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-2.cpp" @@ -0,0 +1,17 @@ +#include +#include "9-4-sales.h" +using namespace SALES; +using std::cin; +using std::cout; +using std::endl; +int main() +{ + Sales s1; + Sales s2; + const double arr[3] = { 2.1,3.2,6.5 }; + setSales(s1, arr, 3); + showSales(s1); + setSales(s2); + showSales(s2); + +} \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-sales.h" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-sales.h" new file mode 100644 index 0000000..66e3269 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/C++PrimerPlus\350\257\276\345\220\216\344\271\240\351\242\230/Chapter9/9-4/9-4-sales.h" @@ -0,0 +1,26 @@ +#pragma once +namespace SALES +{ + const int QUARTERS = 4; + struct Sales + { + double sales[QUARTERS]; + double average; + double max; + double min; + }; + + // copies the lesser of 4 or n items from the array ar + // to the sales member of s and computes and stores the + // average, maximum, and minimum values of the entered items; + // remaining elements of sales, if any, set to 0 + void setSales(Sales & s, const double ar[], int n); + + // gathers sales for 4 quarters interactively, stores them + // in the sales member of s and computes and stores the + // average, maximum, and minimum values + void setSales(Sales & s); + + // display all information in structure s + void showSales(const Sales & s); +} -- Gitee From 926ff072fc0f7a9ecd3b70e82708214131da6f3c Mon Sep 17 00:00:00 2001 From: lizichao <1010635424@qq.com> Date: Wed, 24 Jul 2024 15:56:15 +0800 Subject: [PATCH 2/4] Astar --- "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar" | 1 + 1 file changed, 1 insertion(+) create mode 160000 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar" diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar" new file mode 160000 index 0000000..ff7d51c --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar" @@ -0,0 +1 @@ +Subproject commit ff7d51cebd4fd95987d09822c72227dc9078827c -- Gitee From 1580de89cefbf7e21449becc5a735c61ace072f0 Mon Sep 17 00:00:00 2001 From: lizichao <10224969+lizichaoy@user.noreply.gitee.com> Date: Wed, 24 Jul 2024 08:02:59 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AD=90=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=20C++/codes/2024-07/=E6=9D=8E=E5=AD=90=E8=B6=85/Astar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar" | 1 - 1 file changed, 1 deletion(-) delete mode 160000 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar" diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar" deleted file mode 160000 index ff7d51c..0000000 --- "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar" +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ff7d51cebd4fd95987d09822c72227dc9078827c -- Gitee From 1c8432834116bb2195653f7907cedfbff005f9af Mon Sep 17 00:00:00 2001 From: lizichao <1010635424@qq.com> Date: Thu, 25 Jul 2024 10:12:15 +0800 Subject: [PATCH 4/4] AStar --- .../Astar/.clang-format" | 24 ++ .../Astar/.clang-tidy" | 6 + .../.github/ISSUE_TEMPLATE/bug_report.md" | 33 ++ .../Astar/.github/ISSUE_TEMPLATE/custom.md" | 10 + .../ISSUE_TEMPLATE/feature_request.md" | 25 ++ .../Astar/.github/workflows/macos.yml" | 53 +++ .../Astar/.github/workflows/release.yml" | 189 +++++++++ .../Astar/.github/workflows/ubuntu.yml" | 55 +++ .../Astar/.github/workflows/windows.yml" | 53 +++ .../Astar/.gitignore" | 368 ++++++++++++++++++ .../Astar/CMakeLists.txt" | 363 +++++++++++++++++ .../Astar/Dockerfile" | 52 +++ .../Astar/LICENSE" | 25 ++ .../Astar/Makefile" | 63 +++ .../Astar/README.md" | 179 +++++++++ .../Astar/cmake/AstarConfig.cmake.in" | 9 + .../Astar/cmake/CompilerWarnings.cmake" | 99 +++++ .../Astar/cmake/Conan.cmake" | 46 +++ .../Astar/cmake/Doxygen.cmake" | 11 + .../Astar/cmake/SourcesAndHeaders.cmake" | 20 + .../Astar/cmake/StandardSettings.cmake" | 95 +++++ .../Astar/cmake/StaticAnalyzers.cmake" | 20 + .../Astar/cmake/Utils.cmake" | 40 ++ .../Astar/cmake/Vcpkg.cmake" | 20 + .../Astar/cmake/version.hpp.in" | 11 + .../Astar/codecov.yaml" | 5 + .../Astar/images/input1.png" | Bin 0 -> 13114 bytes .../Astar/images/input2.png" | Bin 0 -> 13535 bytes .../Astar/images/output1.png" | Bin 0 -> 9428 bytes .../Astar/images/output2.png" | Bin 0 -> 3908 bytes .../Astar/images/question.png" | Bin 0 -> 183675 bytes .../Astar/include/Astar/Astar.hpp" | 48 +++ .../Astar/include/Astar/Map.hpp" | 44 +++ .../Astar/include/Astar/Point.hpp" | 43 ++ .../Astar/src/Astar.cpp" | 132 +++++++ .../Astar/src/Map.cpp" | 88 +++++ .../Astar/src/Point.cpp" | 71 ++++ .../Astar/test/CMakeLists.txt" | 84 ++++ .../Astar/test/src/tmp_test.cpp" | 50 +++ 39 files changed, 2434 insertions(+) create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.clang-format" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.clang-tidy" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/bug_report.md" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/custom.md" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/feature_request.md" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/macos.yml" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/release.yml" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/ubuntu.yml" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/windows.yml" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.gitignore" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/CMakeLists.txt" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/Dockerfile" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/LICENSE" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/Makefile" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/README.md" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/AstarConfig.cmake.in" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/CompilerWarnings.cmake" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Conan.cmake" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Doxygen.cmake" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/SourcesAndHeaders.cmake" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/StandardSettings.cmake" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/StaticAnalyzers.cmake" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Utils.cmake" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Vcpkg.cmake" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/version.hpp.in" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/codecov.yaml" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/input1.png" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/input2.png" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/output1.png" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/output2.png" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/question.png" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Astar.hpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Map.hpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Point.hpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Astar.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Map.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Point.cpp" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/test/CMakeLists.txt" create mode 100644 "C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/test/src/tmp_test.cpp" diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.clang-format" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.clang-format" new file mode 100644 index 0000000..8d70915 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.clang-format" @@ -0,0 +1,24 @@ +--- +BasedOnStyle: Google +AlignAfterOpenBracket: 'AlwaysBreak' +AllowAllConstructorInitializersOnNextLine: 'false' +AllowAllParametersOfDeclarationOnNextLine: 'false' +AlignConsecutiveMacros: 'true' +AllowShortCaseLabelsOnASingleLine: 'true' +AllowShortFunctionsOnASingleLine: 'None' +AllowShortIfStatementsOnASingleLine: 'Never' +AllowShortLoopsOnASingleLine: 'false' +BreakBeforeBraces: Allman +BinPackArguments: 'false' +BinPackParameters: 'false' +Cpp11BracedListStyle: 'false' +ColumnLimit: 125 +NamespaceIndentation: All +SpaceAfterTemplateKeyword: 'false' +SpaceBeforeCtorInitializerColon: 'true' +SpaceBeforeInheritanceColon: 'true' +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: 'true' +SpaceInEmptyBlock: true +Standard: 'Latest' +... diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.clang-tidy" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.clang-tidy" new file mode 100644 index 0000000..d85b250 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.clang-tidy" @@ -0,0 +1,6 @@ +--- +Checks: '*,-fuchsia-*,-google-*,-zircon-*,-abseil-*,-modernize-use-trailing-return-type,-llvm-*,-llvmlibc-*' +CheckOptions: [{ key: misc-non-private-member-variables-in-classes, value: IgnoreClassesWithAllMemberVariablesBeingPublic }] +WarningsAsErrors: '*' +HeaderFilterRegex: '' +FormatStyle: none diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/bug_report.md" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/bug_report.md" new file mode 100644 index 0000000..7532789 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/bug_report.md" @@ -0,0 +1,33 @@ +--- +name: Bug report +about: Create a report to help me improve +title: "[BUG]" +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + +* OS: [e.g. Windows] +* Version [e.g. 10] + +**Additional context** +Add any other context about the problem here. diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/custom.md" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/custom.md" new file mode 100644 index 0000000..48d5f81 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/custom.md" @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/feature_request.md" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/feature_request.md" new file mode 100644 index 0000000..e75a04b --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/ISSUE_TEMPLATE/feature_request.md" @@ -0,0 +1,25 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[FEATURE]" +labels: enhancement +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated +when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Provide usage examples** +A few examples of how the feature should be used. Please make sure they are clear +and concise. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/macos.yml" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/macos.yml" new file mode 100644 index 0000000..e20fc40 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/macos.yml" @@ -0,0 +1,53 @@ +name: MacOS + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +env: + BUILD_TYPE: Release + INSTALL_LOCATION: .local + +jobs: + build: + + runs-on: macos-latest + if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')" + + steps: + - uses: actions/checkout@v2 + + - name: cache dependencies + uses: actions/cache@v2 + id: cache + with: + path: ${{ github.workspace }}/${{ env.INSTALL_LOCATION }} + key: ${{ runner.os }}-dependencies + + - name: install GoogleTest + if: ${{ steps.cache.output.cache-hit != 'true' }} + run: | + cd .. + git clone https://github.com/google/googletest.git --branch release-1.10.0 + cd googletest + cmake -Bbuild -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/$INSTALL_LOCATION + cmake --build build --config Release + cmake --build build --target install --config Release + cd ../modern-cpp-template + + - name: configure + run: cmake -Bbuild -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/$INSTALL_LOCATION + + - name: build + run: cmake --build build --config $BUILD_TYPE -j4 + + - name: run tests + run: | + cd build + ctest -C $BUILD_TYPE -VV + + - name: install project + run: cmake --build build --target install --config Release + diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/release.yml" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/release.yml" new file mode 100644 index 0000000..433c451 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/release.yml" @@ -0,0 +1,189 @@ +name: Release + +on: + push: + tags: + - 'v*' + +env: + PROJECT_NAME: "modern-cpp-template" + BUILD_TYPE: Release + +jobs: + build: + name: ${{ matrix.config.name }} + runs-on: ${{ matrix.config.os }} + strategy: + fail-fast: false + matrix: + config: + - { + name: "Windows Latest MSVC", + artifact_ext: '.zip', + os: windows-latest, + cc: "cl", + cxx: "cl", + environment_script: "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat", + } + - { + name: "Ubuntu Latest GCC", + artifact_ext: '.tar.gz', + os: ubuntu-latest, + cc: "gcc", + cxx: "g++", + } + - { + name: "macOS Latest Clang", + artifact_ext: '.tar.gz', + os: macos-latest, + cc: "clang", + cxx: "clang++", + } + + steps: + - name: set version name (Windows) + id: version_win + if: ${{ runner.os == 'Windows' }} + run: | + $TAG = (${env:GITHUB_REF} -replace 'refs/tags/', '') + echo "::set-output name=name::$TAG" + + - name: set version name + id: version + if: ${{ runner.os != 'Windows' }} + run: echo ::set-output name=name::${GITHUB_REF#refs/tags/} + + - name: Checkout + uses: actions/checkout@v2 + with: + submodules: recursive + + - name: cache dependencies + uses: actions/cache@v2 + id: cache + with: + path: ${{ github.HOME }}/.local + key: ${{ runner.os }}-dependencies + + - name: install GoogleTest + if: ${{ steps.cache.output.cache-hit != 'true' }} + run: | + cd .. + git clone https://github.com/google/googletest.git --branch release-1.10.0 + cd googletest + cmake -Bbuild -DCMAKE_INSTALL_PREFIX="$HOME/.local" -Dgtest_force_shared_crt=1 + cmake --build build --config Release + cmake --build build --target install --config Release + cd ../modern-cpp-template + + - name: configure + run: cmake -Bbuild -DCMAKE_INSTALL_PREFIX="$HOME/.local" + + - name: build + run: cmake --build build --config "$env:BUILD_TYPE" -j4 + + - name: run tests + run: | + cd build + ctest -C "$env:BUILD_TYPE" -VV + + # for a release not containing directly the source code, replace the files archived + # with the actual files needed (i.e. *.lib/*.a and *.h(pp)) + + - name: generate archive (Windows) + if: ${{ runner.os == 'Windows' }} + run: | + rmdir -r -fo build + 7z a -tzip $HOME/artifact.zip * + + + - name: generate archive + if: ${{ runner.os != 'Windows' }} + run: | + rm -rf build + tar -cvzf $HOME/artifact.tar.gz . + + - name: upload artifacts + uses: actions/upload-artifact@v2 + if: ${{ runner.os == 'Windows' }} + with: + name: ${{ runner.os }}-${{ steps.version_win.outputs.name }} + path: '~/artifact.*' + + - name: upload artifacts + uses: actions/upload-artifact@v2 + if: ${{ runner.os != 'Windows' }} + with: + name: ${{ runner.os }}-${{ steps.version.outputs.name }} + path: '~/artifact.*' + + release: + if: contains(github.ref, 'tags/v') + runs-on: ubuntu-latest + needs: build + + steps: + - name: set version name + id: version + run: echo ::set-output name=name::${GITHUB_REF#refs/tags/} + + - name: create release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ steps.version.outputs.name }} + # if needed, you can set the release body here + #body: "Release notes" + draft: false + prerelease: false + + - name: download artifact + uses: actions/download-artifact@v2 + with: + name: "Linux-${{ steps.version.outputs.name }}" + path: ./ + + - name: upload ubuntu release asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: "artifact.tar.gz" + asset_name: "${{ env.PROJECT_NAME }}-Linux-${{ steps.version.outputs.name }}.tar.gz" + asset_content_type: application/x-tar + + - name: download artifact + uses: actions/download-artifact@v2 + with: + name: "Windows-${{ steps.version.outputs.name }}" + path: ./ + + - name: upload windows release asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: "artifact.zip" + asset_name: "${{ env.PROJECT_NAME }}-Windows-${{ steps.version.outputs.name }}.zip" + asset_content_type: application/zip + + - name: download artifact + uses: actions/download-artifact@v2 + with: + name: "macOS-${{ steps.version.outputs.name }}" + path: ./ + + - name: upload macos release asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: "./artifact.tar.gz" + asset_name: "${{ env.PROJECT_NAME }}-macOS-${{ steps.version.outputs.name }}.tar.gz" + asset_content_type: application/x-tar diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/ubuntu.yml" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/ubuntu.yml" new file mode 100644 index 0000000..2aa8542 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/ubuntu.yml" @@ -0,0 +1,55 @@ +name: Ubuntu + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +env: + BUILD_TYPE: Release + INSTALL_LOCATION: .local + +jobs: + build: + + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')" + + steps: + - uses: actions/checkout@v2 + + - name: cache dependencies + uses: actions/cache@v2 + id: cache + with: + path: ${{ github.workspace }}/${{ env.INSTALL_LOCATION }} + key: ${{ runner.os }}-dependencies + + - name: install GoogleTest + if: ${{ steps.cache.output.cache-hit != 'true' }} + run: | + cd .. + git clone https://github.com/google/googletest.git --branch release-1.10.0 + cd googletest + cmake -Bbuild -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/$INSTALL_LOCATION + cmake --build build --config Release + cmake --build build --target install --config Release + + - name: configure + run: cmake -Bbuild -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/$INSTALL_LOCATION -DProject_ENABLE_CODE_COVERAGE=1 + + - name: build + run: cmake --build build --config $BUILD_TYPE -j4 + + - name: run tests + run: | + cd build + ctest -C $BUILD_TYPE -VV + + - name: Code coverage using Codecov + run: bash <(curl -s https://codecov.io/bash) + + - name: install project + run: cmake --build build --target install --config Release + diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/windows.yml" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/windows.yml" new file mode 100644 index 0000000..d2da574 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.github/workflows/windows.yml" @@ -0,0 +1,53 @@ +name: Windows + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +env: + BUILD_TYPE: Release + INSTALL_LOCATION: ".local" + +jobs: + build: + + runs-on: windows-latest + if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')" + + steps: + - uses: actions/checkout@v2 + + - name: cache dependencies + uses: actions/cache@v2 + id: cache + with: + path: ${{env.INSTALL_LOCATION}} + key: ${{runner.os}}-dependencies + + - name: install GoogleTest + if: ${{steps.cache.output.cache-hit != 'true'}} + run: | + cd .. + git clone https://github.com/google/googletest.git --branch release-1.10.0 + cd googletest + cmake -Bbuild -DCMAKE_INSTALL_PREFIX="$HOME/$env:INSTALL_LOCATION" -Dgtest_force_shared_crt=1 + cmake --build build --config Release + cmake --build build --target install --config Release + cd ../modern-cpp-template + + - name: configure + run: cmake -Bbuild -DCMAKE_INSTALL_PREFIX="$HOME/$env:INSTALL_LOCATION" + + - name: build + run: cmake --build build --config "$env:BUILD_TYPE" -j4 + + - name: run tests + run: | + cd build + ctest -C "$env:BUILD_TYPE" -VV + + - name: install project + run: cmake --build build --target install --config Release + diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.gitignore" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.gitignore" new file mode 100644 index 0000000..101c97f --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/.gitignore" @@ -0,0 +1,368 @@ +[Bb]uild/* +[Dd]ocs/* +CMakeCache.* +CMakeFiles/* +[Tt]esting/* + +### VisualStudioCode ### +.vscode/* +.vscode/settings.json +.vscode/tasks.json +.vscode/launch.json +.vscode/extensions.json + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +#KDevelop +*.kdev4 +.kdev4/* + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/CMakeLists.txt" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/CMakeLists.txt" new file mode 100644 index 0000000..0e9fd93 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/CMakeLists.txt" @@ -0,0 +1,363 @@ +cmake_minimum_required(VERSION 3.15) + +# +# Project details +# + +project( + "Astar" + VERSION 0.1.0 + LANGUAGES CXX +) + +# +# Set project options +# + +include(cmake/StandardSettings.cmake) +include(cmake/StaticAnalyzers.cmake) +include(cmake/Utils.cmake) +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Debug") +endif() +message(STATUS "Started CMake for ${PROJECT_NAME} v${PROJECT_VERSION}...\n") + +if (UNIX) + add_compile_options("$<$:-D_DEBUG>") #this will allow to use same _DEBUG macro available in both Linux as well as Windows - MSCV environment. Easy to put Debug specific code. +endif (UNIX) + + +# +# Setup alternative names +# + +if(${PROJECT_NAME}_USE_ALT_NAMES) + string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWERCASE) + string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPERCASE) +else() + set(PROJECT_NAME_LOWERCASE ${PROJECT_NAME}) + set(PROJECT_NAME_UPPERCASE ${PROJECT_NAME}) +endif() + +# +# Prevent building in the source directory +# + +if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR) + message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there.\n") +endif() + +# +# Enable package managers +# + +include(cmake/Conan.cmake) +include(cmake/Vcpkg.cmake) + +# +# Create library, setup header and source files +# + +# Find all headers and implementation files +include(cmake/SourcesAndHeaders.cmake) + +if(${PROJECT_NAME}_BUILD_EXECUTABLE) + add_executable(${PROJECT_NAME} ${exe_sources}) + + if(${PROJECT_NAME}_VERBOSE_OUTPUT) + verbose_message("Found the following sources:") + foreach(source IN LISTS exe_sources) + verbose_message("* ${source}") + endforeach() + endif() + + if(${PROJECT_NAME}_ENABLE_UNIT_TESTING) + add_library(${PROJECT_NAME}_LIB ${headers} ${sources}) + + if(${PROJECT_NAME}_VERBOSE_OUTPUT) + verbose_message("Found the following headers:") + foreach(header IN LISTS headers) + verbose_message("* ${header}") + endforeach() + endif() + endif() +elseif(${PROJECT_NAME}_BUILD_HEADERS_ONLY) + add_library(${PROJECT_NAME} INTERFACE) + + if(${PROJECT_NAME}_VERBOSE_OUTPUT) + verbose_message("Found the following headers:") + foreach(header IN LIST headers) + verbose_message("* ${header}") + endforeach() + endif() +else() + add_library( + ${PROJECT_NAME} + ${headers} + ${sources} + ) + + if(${PROJECT_NAME}_VERBOSE_OUTPUT) + verbose_message("Found the following sources:") + foreach(source IN LISTS sources) + verbose_message("* ${source}") + endforeach() + verbose_message("Found the following headers:") + foreach(header IN LISTS headers) + verbose_message("* ${header}") + endforeach() + endif() +endif() + +set_target_properties( + ${PROJECT_NAME} + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE}" +) +if(${PROJECT_NAME}_BUILD_EXECUTABLE AND ${PROJECT_NAME}_ENABLE_UNIT_TESTING) + set_target_properties( + ${PROJECT_NAME}_LIB + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}" + OUTPUT_NAME ${PROJECT_NAME} + ) +endif() + +message(STATUS "Added all header and implementation files.\n") + +# +# Set the project standard and warnings +# + +if(${PROJECT_NAME}_BUILD_HEADERS_ONLY) + target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_17) +else() + target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17) + + if(${PROJECT_NAME}_BUILD_EXECUTABLE AND ${PROJECT_NAME}_ENABLE_UNIT_TESTING) + target_compile_features(${PROJECT_NAME}_LIB PUBLIC cxx_std_17) + endif() +endif() +include(cmake/CompilerWarnings.cmake) +set_project_warnings(${PROJECT_NAME}) + +verbose_message("Applied compiler warnings. Using standard ${CMAKE_CXX_STANDARD}.\n") + +# +# Enable Doxygen +# + +include(cmake/Doxygen.cmake) + +# +# Model project dependencies +# + +# Identify and link with the specific "packages" the project uses +#find_package(package_name package_version REQUIRED package_type [other_options]) +#target_link_libraries( +# ${PROJECT_NAME} +# PUBLIC +# dependency1 ... +# PRIVATE +# dependency2 ... +# ${PROJECT_NAME}_PROJECT_OPTIONS +# ${PROJECT_NAME}_PROJECT_WARNINGS +#) +#if(${PROJECT_NAME}_BUILD_EXECUTABLE AND ${PROJECT_NAME}_ENABLE_UNIT_TESTING) +# target_link_libraries( +# ${PROJECT_NAME}_LIB +# PUBLIC +# dependency1 ... +# ) +#endif() + +# For Windows, it is necessary to link with the MultiThreaded library. +# Depending on how the rest of the project's dependencies are linked, it might be necessary +# to change the line to statically link with the library. +# +# This is done as follows: +# +# set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +# +# On Linux and Mac this variable is ignored. If any issues rise from it, try commenting it out +# and letting CMake decide how to link with it. +set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") + +verbose_message("Successfully added all dependencies and linked against them.") + +# +# Set the build/user include directories +# + +# Allow usage of header files in the `src` directory, but only for utilities +if(${PROJECT_NAME}_BUILD_HEADERS_ONLY) + target_include_directories( + ${PROJECT_NAME} + INTERFACE + $ + $ + ) +else() + target_include_directories( + ${PROJECT_NAME} + PUBLIC + $ + $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src + ) + if(${PROJECT_NAME}_BUILD_EXECUTABLE AND ${PROJECT_NAME}_ENABLE_UNIT_TESTING) + target_include_directories( + ${PROJECT_NAME}_LIB + PUBLIC + $ + $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src + ) + endif() +endif() + +message(STATUS "Finished setting up include directories.") + +# +# Provide alias to library for +# + +if(${PROJECT_NAME}_BUILD_EXECUTABLE) + add_executable(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) +else() + add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) +endif() + +verbose_message("Project is now aliased as ${PROJECT_NAME}::${PROJECT_NAME}.\n") + +# +# Format the project using the `clang-format` target (i.e: cmake --build build --target clang-format) +# + +add_clang_format_target() + +# +# Install library for easy downstream inclusion +# + +include(GNUInstallDirs) +install( + TARGETS + ${PROJECT_NAME} + EXPORT + ${PROJECT_NAME}Targets + LIBRARY DESTINATION + ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION + ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION + ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION + include + PUBLIC_HEADER DESTINATION + include +) + +install( + EXPORT + ${PROJECT_NAME}Targets + FILE + ${PROJECT_NAME}Targets.cmake + NAMESPACE + ${PROJECT_NAME}:: + DESTINATION + ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) + +# +# Add version header +# + +configure_file( + ${CMAKE_CURRENT_LIST_DIR}/cmake/version.hpp.in + include/${PROJECT_NAME_LOWERCASE}/version.hpp + @ONLY +) + +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/include/${PROJECT_NAME_LOWERCASE}/version.hpp + DESTINATION + include/${PROJECT_NAME_LOWERCASE} +) + +# +# Install the `include` directory +# + +install( + DIRECTORY + include/${PROJECT_NAME_LOWERCASE} + DESTINATION + include +) + +verbose_message("Install targets successfully built. Install with `cmake --build --target install --config `.") + +# +# Quick `ConfigVersion.cmake` creation +# + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + ${PROJECT_NAME}ConfigVersion.cmake + VERSION + ${PROJECT_VERSION} + COMPATIBILITY + SameMajorVersion +) + +configure_package_config_file( + ${CMAKE_CURRENT_LIST_DIR}/cmake/${PROJECT_NAME}Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + INSTALL_DESTINATION + ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) + +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + DESTINATION + ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) + +# +# Generate export header if specified +# + +if(${PROJECT_NAME}_GENERATE_EXPORT_HEADER) + include(GenerateExportHeader) + generate_export_header(${PROJECT_NAME}) + install( + FILES + ${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWERCASE}_export.h + DESTINATION + include + ) + + message(STATUS "Generated the export header `${PROJECT_NAME_LOWERCASE}_export.h` and installed it.") +endif() + +message(STATUS "Finished building requirements for installing the package.\n") + +# +# Unit testing setup +# + +if(${PROJECT_NAME}_ENABLE_UNIT_TESTING) + enable_testing() + message(STATUS "Build unit tests for the project. Tests should always be found in the test folder\n") + add_subdirectory(test) +endif() diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/Dockerfile" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/Dockerfile" new file mode 100644 index 0000000..44076e5 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/Dockerfile" @@ -0,0 +1,52 @@ +FROM ubuntu:18.04 + +RUN echo "Updating Ubuntu" +RUN apt-get update && apt-get upgrade -y + +RUN echo "Installing dependencies..." +RUN apt install -y \ + ccache \ + clang \ + clang-format \ + clang-tidy \ + cppcheck \ + curl \ + doxygen \ + gcc \ + git \ + graphviz \ + make \ + ninja-build \ + python3 \ + python3-pip \ + tar \ + unzip \ + vim + +RUN echo "Installing dependencies not found in the package repos..." + +RUN apt install -y wget tar build-essential libssl-dev && \ + wget https://github.com/Kitware/CMake/releases/download/v3.15.0/cmake-3.15.0.tar.gz && \ + tar -zxvf cmake-3.15.0.tar.gz && \ + cd cmake-3.15.0 && \ + ./bootstrap && \ + make && \ + make install + +RUN pip3 install conan + +RUN git clone https://github.com/catchorg/Catch2.git && \ + cd Catch2 && \ + cmake -Bbuild -H. -DBUILD_TESTING=OFF && \ + cmake --build build/ --target install + +# Disabled pthread support for GTest due to linking errors +RUN git clone https://github.com/google/googletest.git --branch release-1.10.0 && \ + cd googletest && \ + cmake -Bbuild -Dgtest_disable_pthreads=1 && \ + cmake --build build --config Release && \ + cmake --build build --target install --config Release + +RUN git clone https://github.com/microsoft/vcpkg -b 2020.06 && \ + cd vcpkg && \ + ./bootstrap-vcpkg.sh -disableMetrics -useSystemBinaries diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/LICENSE" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/LICENSE" new file mode 100644 index 0000000..471f09f --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/LICENSE" @@ -0,0 +1,25 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to + diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/Makefile" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/Makefile" new file mode 100644 index 0000000..d2bdaef --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/Makefile" @@ -0,0 +1,63 @@ +.PHONY: install coverage test docs help +.DEFAULT_GOAL := help + +define BROWSER_PYSCRIPT +import os, webbrowser, sys + +try: + from urllib import pathname2url +except: + from urllib.request import pathname2url + +webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1]))) +endef +export BROWSER_PYSCRIPT + +define PRINT_HELP_PYSCRIPT +import re, sys + +for line in sys.stdin: + match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line) + if match: + target, help = match.groups() + print("%-20s %s" % (target, help)) +endef +export PRINT_HELP_PYSCRIPT + +BROWSER := python -c "$$BROWSER_PYSCRIPT" +INSTALL_LOCATION := ~/.local + +help: + @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) + +test: ## run tests quickly with ctest + rm -rf build/ + cmake -Bbuild -DCMAKE_INSTALL_PREFIX=$(INSTALL_LOCATION) -Dmodern-cpp-template_ENABLE_UNIT_TESTING=1 -DCMAKE_BUILD_TYPE="Release" + cmake --build build --config Release + cd build/ && ctest -C Release -VV + +coverage: ## check code coverage quickly GCC + rm -rf build/ + cmake -Bbuild -DCMAKE_INSTALL_PREFIX=$(INSTALL_LOCATION) -Dmodern-cpp-template_ENABLE_CODE_COVERAGE=1 + cmake --build build --config Release + cd build/ && ctest -C Release -VV + cd .. && (bash -c "find . -type f -name '*.gcno' -exec gcov -pb {} +" || true) + +docs: ## generate Doxygen HTML documentation, including API docs + rm -rf docs/ + rm -rf build/ + cmake -Bbuild -DCMAKE_INSTALL_PREFIX=$(INSTALL_LOCATION) -DProject_ENABLE_DOXYGEN=1 + cmake --build build --config Release + cmake --build build --target doxygen-docs + $(BROWSER) docs/html/index.html + +install: ## install the package to the `INSTALL_LOCATION` + rm -rf build/ + cmake -Bbuild -DCMAKE_INSTALL_PREFIX=$(INSTALL_LOCATION) + cmake --build build --config Release + cmake --build build --target install --config Release + +format: ## format the project sources + rm -rf build/ + cmake -Bbuild -DCMAKE_INSTALL_PREFIX=$(INSTALL_LOCATION) + cmake --build build --target clang-format diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/README.md" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/README.md" new file mode 100644 index 0000000..4b3de39 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/README.md" @@ -0,0 +1,179 @@ +# 题目 +## 题目描述 +![](./images/question.png) + +# 数据结构设计 +## 1. Point类 + +**Point类表示地图上的一个点,并包含以下私有成员和公有方法:** + +#### 私有成员: + +* _x 和 _y:表示点的坐标。 +* _F:该点的 F 值,即 G 值和 H 值的和,用于 A* 算法中的优先级判断。 +* _G:从起点到该点的代价。 +* _H:从该点到终点的估计代价。 +* _parent:指向该点的父节点的指针,用于路径回溯。 +#### 公有方法: +* 各种 getter 和 setter 函数:用于获取和修改私有成员的值。 +* operator==:重载运算符以便比较两个点是否相同。 +## 2. Map类 + +**Map类表示搜索空间,用于封装地图,并包含地图的长度、宽度等信息** + +#### 私有成员: +* _length: 表示地图的长度。 +* _width:表示地图的宽度。 +* _graph:表示地图的实际网格,用一个二维向量存储。(其中0表示可通过,1表示障碍)。 +* _dir:表示移动方向的数组,用于找到相邻点 + +#### 公有方法: + +* 构造函数:用于初始化地图; +* 各种 getter 和 setter 函数:用于获取和修改私有成员的值。 +* visitGraph:访问地图上的某个点。 +* showMap:打印地图。 +* randomizeGraph:随机生成地图。 + +## 3. Astar类 + +**Astar 类实现了 AStar 算法,并包含以下成员变量和方法:** + + +#### 私有成员: + +* _openList:打开列表,用于存储待检查的点,按 F 值排序。 +* _closeList:关闭列表,用于存储已检查的点。 + +#### 公有方法: + +* findPath:主函数,用于找到从起点到终点的路径。 +* calcF、calcG 和 calcH:用于计算 F、G 和 H 值的辅助函数。 +* isUseful:判断某点是否可用。 +* isInOpenList 和 isInCloseList:判断某点是否在打开列表或关闭列表中。 +* findSurround:找到当前点的所有相邻点。 +* showPath:打印找到的路径。 +# 输入和输出描述 +## 输入流程: +``` +//初始化起点和终点: +Point *start=new Point(0, 0); +Point *end=new Point(9, 9); + +//初始化地图 +Map map(10, 10); //生成包含10*10大小的二维数组的Map对象,表示地图 +map.randomizeGraph(); //随机初始化地图上每个点可通过或不可通过; + + +//调用A*算法,得到路径 +//Astar astar; +auto path=astar.findPath(start,end,map); +``` +## 输出流程: +``` +auto path=astar.findPath(start, end,map); +for (auto p : path){ + cout << p->getX() << " " << p->getY() << endl; +} + +system("pause"); +``` + + +## 输入和输出样例: +#### 1. 样例1 + +![](./images/input1.png) +![](./images/output1.png) +#### 2. 样例2 + +![](./images/input2.png) +![](./images/output2.png) + + +# 主要算法思想 +## 描述: + A*(A-star)算法是一种启发式搜索算法, + 用于在图中找到从起点到终点的最短路径。 + 结合了 Dijkstra 算法的优点(最短路径, + 贪婪最佳优先搜索的优点(启发式搜索), + 以有效地找到最优路径。 + +## 算法流程: +``` +function Astar(start, end, map): + openList ← new PriorityQueue + closedList ← new Set + openList.push(start) + start.G ← 0 + start.H ← heuristic(start, end) + start.F ← start.G + start.H + + while not openList.isEmpty(): + current ← openList.pop() + if current == end: + return reconstruct_path(current) + + closedList.add(current) + + for neighbor in current.neighbors(): + if neighbor in closedList: + continue + + tentative_g = current.G + distance(current, neighbor) + + if neighbor not in openList: + openList.push(neighbor) + else if tentative_g >= neighbor.G: + continue + + neighbor.parent = current + neighbor.G = tentative_g + neighbor.H = heuristic(neighbor, end) + neighbor.F = neighbor.G + neighbor.H + + return failure +``` + +# 总结: +### 关于数据结构的选择: +在算法中,openlist列表要存放待选择的节点、判断节点是否在列表中,且需要弹出列表中F值最小的节点并返回。刚开始选择list,但是每次都要手动遍历一遍找到f值最小的元素,时间复杂度较高; +后面考虑使用能自动保存最小值的数据结构,multiset和priorityqueue;但是priorityqueue基于堆实现,不支持遍历, +很难判断节点是否在列表中。而multiset基于红黑树实现,可以高效查找元素,最后采用了multiset作为openlist的数据结构。 +### 遇到的问题: +定义std::multiset openlist时,不能直接在 Point 类中定义比较运算符,原因是multiset 存储的是指向 Point 对象的指针, +而不是 Point 对象本身。 +因此,需要一个函数对象(或函数指针)来比较这些指针所指向的对象,而不是比较指针本身。 +需要为 std::multiset 定义比较函数对象: +``` +struct ComparePoints { + bool operator()(const Point* p1, const Point* p2) const { + return p1->getF() < p2->getF(); + } +}; + +std::multiset _openList; + +``` +### 使用的C++新特性: +- lambda表达式 +``` +bool Astar::isInOpenList(Point * now) +{ + //使用lambda表达式 + return std::any_of(_openList.begin(), _openList.end(), [now](Point* point) { + return point->getX() == now->getX() && point->getY() == now->getY(); + }); +} +``` + +- 智能指针 +``` +bool Astar::isUseful(int x, int y, Map &map) +{ + //使用 std::unique_ptr 代替裸指针,以避免手动管理内存。 + auto point = std::make_unique(x, y); + return !(x < 0 || x >= map.getLength() || y < 0 || y >= map.getWidth() || map.visitGraph(x, y) == 1 || isInCloseList(point.get())); +} +``` +- 区间for循环 diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/AstarConfig.cmake.in" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/AstarConfig.cmake.in" new file mode 100644 index 0000000..2ac739c --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/AstarConfig.cmake.in" @@ -0,0 +1,9 @@ +set(@PROJECT_NAME@_VERSION @PROJECT_VERSION@) + +@PACKAGE_INIT@ + +set_and_check(@PROJECT_NAME@_INCLUDE_DIR "@CMAKE_INSTALL_FULL_INCLUDEDIR@") + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") + +check_required_components(@PROJECT_NAME@) diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/CompilerWarnings.cmake" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/CompilerWarnings.cmake" new file mode 100644 index 0000000..2b5d58e --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/CompilerWarnings.cmake" @@ -0,0 +1,99 @@ +# from here: +# +# https://github.com/lefticus/cppbestpractices/blob/master/02-Use_the_Tools_Avai +# lable.md +# Courtesy of Jason Turner + +function(set_project_warnings project_name) + set(MSVC_WARNINGS + /W4 # Baseline reasonable warnings + /w14242 # 'identifier': conversion from 'type1' to 'type1', possible loss + # of data + /w14254 # 'operator': conversion from 'type1:field_bits' to + # 'type2:field_bits', possible loss of data + /w14263 # 'function': member function does not override any base class + # virtual member function + /w14265 # 'classname': class has virtual functions, but destructor is not + # virtual instances of this class may not be destructed correctly + /w14287 # 'operator': unsigned/negative constant mismatch + /we4289 # nonstandard extension used: 'variable': loop control variable + # declared in the for-loop is used outside the for-loop scope + /w14296 # 'operator': expression is always 'boolean_value' + /w14311 # 'variable': pointer truncation from 'type1' to 'type2' + /w14545 # expression before comma evaluates to a function which is missing + # an argument list + /w14546 # function call before comma missing argument list + /w14547 # 'operator': operator before comma has no effect; expected + # operator with side-effect + /w14549 # 'operator': operator before comma has no effect; did you intend + # 'operator'? + /w14555 # expression has no effect; expected expression with side- effect + /w14619 # pragma warning: there is no warning number 'number' + /w14640 # Enable warning on thread un-safe static member initialization + /w14826 # Conversion from 'type1' to 'type_2' is sign-extended. This may + # cause unexpected runtime behavior. + /w14905 # wide string literal cast to 'LPSTR' + /w14906 # string literal cast to 'LPWSTR' + /w14928 # illegal copy-initialization; more than one user-defined + # conversion has been implicitly applied + /permissive- # standards conformance mode for MSVC compiler. + ) + + set(CLANG_WARNINGS + -Wall + -Wextra # reasonable and standard + -Wshadow # warn the user if a variable declaration shadows one from a + # parent context + -Wnon-virtual-dtor # warn the user if a class with virtual functions has a + # non-virtual destructor. This helps catch hard to + # track down memory errors + -Wold-style-cast # warn for c-style casts + -Wcast-align # warn for potential performance problem casts + -Wunused # warn on anything being unused + -Woverloaded-virtual # warn if you overload (not override) a virtual + # function + -Wpedantic # warn if non-standard C++ is used + -Wconversion # warn on type conversions that may lose data + -Wsign-conversion # warn on sign conversions + -Wnull-dereference # warn if a null dereference is detected + -Wdouble-promotion # warn if float is implicit promoted to double + -Wformat=2 # warn on security issues around functions that format output + # (ie printf) + ) + + if (${PROJECT_NAME}_WARNINGS_AS_ERRORS) + set(CLANG_WARNINGS ${CLANG_WARNINGS} -Werror) + set(MSVC_WARNINGS ${MSVC_WARNINGS} /WX) + endif() + + set(GCC_WARNINGS + ${CLANG_WARNINGS} + -Wmisleading-indentation # warn if indentation implies blocks where blocks + # do not exist + -Wduplicated-cond # warn if if / else chain has duplicated conditions + -Wduplicated-branches # warn if if / else branches have duplicated code + -Wlogical-op # warn about logical operations being used where bitwise were + # probably wanted + -Wuseless-cast # warn if you perform a cast to the same type + ) + + if(MSVC) + set(PROJECT_WARNINGS ${MSVC_WARNINGS}) + elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") + set(PROJECT_WARNINGS ${CLANG_WARNINGS}) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(PROJECT_WARNINGS ${GCC_WARNINGS}) + else() + message(AUTHOR_WARNING "No compiler warnings set for '${CMAKE_CXX_COMPILER_ID}' compiler.") + endif() + + if(${PROJECT_NAME}_BUILD_HEADERS_ONLY) + target_compile_options(${project_name} INTERFACE ${PROJECT_WARNINGS}) + else() + target_compile_options(${project_name} PUBLIC ${PROJECT_WARNINGS}) + endif() + + if(NOT TARGET ${project_name}) + message(AUTHOR_WARNING "${project_name} is not a target, thus no compiler warning were added.") + endif() +endfunction() diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Conan.cmake" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Conan.cmake" new file mode 100644 index 0000000..b844e2a --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Conan.cmake" @@ -0,0 +1,46 @@ +if(${PROJECT_NAME}_ENABLE_CONAN) + # + # Setup Conan requires and options here: + # + + set(${PROJECT_NAME}_CONAN_REQUIRES "") + set(${PROJECT_NAME}_CONAN_OPTIONS "") + + # + # If `conan.cmake` (from https://github.com/conan-io/cmake-conan) does not exist, download it. + # + if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake") + message( + STATUS + "Downloading conan.cmake from https://github.com/conan-io/cmake-conan..." + ) + file( + DOWNLOAD "https://github.com/conan-io/cmake-conan/raw/v0.15/conan.cmake" + "${CMAKE_BINARY_DIR}/conan.cmake" + ) + message(STATUS "Cmake-Conan downloaded succesfully.") + endif() + + include(${CMAKE_BINARY_DIR}/conan.cmake) + + conan_add_remote( + NAME bincrafters + URL + https://api.bintray.com/conan/bincrafters/public-conan + ) + + conan_cmake_run( + REQUIRES + ${${PROJECT_NAME}_CONAN_REQUIRES} + OPTIONS + ${${PROJECT_NAME}_CONAN_OPTIONS} + BASIC_SETUP + CMAKE_TARGETS # Individual targets to link to + BUILD + missing + ) + + conan_basic_setup() + + verbose_message("Conan is setup and all requires have been installed.") +endif() diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Doxygen.cmake" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Doxygen.cmake" new file mode 100644 index 0000000..bd6fe45 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Doxygen.cmake" @@ -0,0 +1,11 @@ +if(${PROJECT_NAME}_ENABLE_DOXYGEN) + set(DOXYGEN_CALLER_GRAPH YES) + set(DOXYGEN_CALL_GRAPH YES) + set(DOXYGEN_EXTRACT_ALL YES) + set(DOXYGEN_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/docs) + + find_package(Doxygen REQUIRED dot) + doxygen_add_docs(doxygen-docs ${PROJECT_SOURCE_DIR}) + + verbose_message("Doxygen has been setup and documentation is now available.") +endif() diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/SourcesAndHeaders.cmake" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/SourcesAndHeaders.cmake" new file mode 100644 index 0000000..d83214d --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/SourcesAndHeaders.cmake" @@ -0,0 +1,20 @@ +set(sources + src/Astar.cpp + src/Map.cpp + src/Point.cpp +) + +set(exe_sources + src/main.cpp + ${sources} +) + +set(headers + include/Astar/Astar.hpp + include/Astar/Map.hpp + include/Astar/Point.hpp +) + +set(test_sources + src/tmp_test.cpp +) diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/StandardSettings.cmake" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/StandardSettings.cmake" new file mode 100644 index 0000000..fd77929 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/StandardSettings.cmake" @@ -0,0 +1,95 @@ +# +# Project settings +# + +option(${PROJECT_NAME}_BUILD_EXECUTABLE "Build the project as an executable, rather than a library." OFF) +option(${PROJECT_NAME}_BUILD_HEADERS_ONLY "Build the project as a header-only library." OFF) +option(${PROJECT_NAME}_USE_ALT_NAMES "Use alternative names for the project, such as naming the include directory all lowercase." ON) + +# +# Compiler options +# + +option(${PROJECT_NAME}_WARNINGS_AS_ERRORS "Treat compiler warnings as errors." OFF) + +# +# Package managers +# +# Currently supporting: Conan, Vcpkg. + +option(${PROJECT_NAME}_ENABLE_CONAN "Enable the Conan package manager for this project." OFF) +option(${PROJECT_NAME}_ENABLE_VCPKG "Enable the Vcpkg package manager for this project." OFF) + +# +# Unit testing +# +# Currently supporting: GoogleTest, Catch2. + +option(${PROJECT_NAME}_ENABLE_UNIT_TESTING "Enable unit tests for the projects (from the `test` subfolder)." ON) + +option(${PROJECT_NAME}_USE_GTEST "Use the GoogleTest project for creating unit tests." ON) +option(${PROJECT_NAME}_USE_GOOGLE_MOCK "Use the GoogleMock project for extending the unit tests." OFF) + +option(${PROJECT_NAME}_USE_CATCH2 "Use the Catch2 project for creating unit tests." OFF) + +# +# Static analyzers +# +# Currently supporting: Clang-Tidy, Cppcheck. + +option(${PROJECT_NAME}_ENABLE_CLANG_TIDY "Enable static analysis with Clang-Tidy." OFF) +option(${PROJECT_NAME}_ENABLE_CPPCHECK "Enable static analysis with Cppcheck." OFF) + +# +# Code coverage +# + +option(${PROJECT_NAME}_ENABLE_CODE_COVERAGE "Enable code coverage through GCC." OFF) + +# +# Doxygen +# + +option(${PROJECT_NAME}_ENABLE_DOXYGEN "Enable Doxygen documentation builds of source." OFF) + +# +# Miscelanious options +# + +# Generate compile_commands.json for clang based tools +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +option(${PROJECT_NAME}_VERBOSE_OUTPUT "Enable verbose output, allowing for a better understanding of each step taken." ON) +option(${PROJECT_NAME}_GENERATE_EXPORT_HEADER "Create a `project_export.h` file containing all exported symbols." OFF) + +# Export all symbols when building a shared library +if(BUILD_SHARED_LIBS) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS OFF) + set(CMAKE_CXX_VISIBILITY_PRESET hidden) + set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) +endif() + +option(${PROJECT_NAME}_ENABLE_LTO "Enable Interprocedural Optimization, aka Link Time Optimization (LTO)." OFF) +if(${PROJECT_NAME}_ENABLE_LTO) + include(CheckIPOSupported) + check_ipo_supported(RESULT result OUTPUT output) + if(result) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + else() + message(SEND_ERROR "IPO is not supported: ${output}.") + endif() +endif() + + +option(${PROJECT_NAME}_ENABLE_CCACHE "Enable the usage of Ccache, in order to speed up rebuild times." ON) +find_program(CCACHE_FOUND ccache) +if(CCACHE_FOUND) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) + set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) +endif() + +option(${PROJECT_NAME}_ENABLE_ASAN "Enable Address Sanitize to detect memory error." OFF) +if(${PROJECT_NAME}_ENABLE_ASAN) + add_compile_options(-fsanitize=address) + add_link_options(-fsanitize=address) +endif() diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/StaticAnalyzers.cmake" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/StaticAnalyzers.cmake" new file mode 100644 index 0000000..10e4da4 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/StaticAnalyzers.cmake" @@ -0,0 +1,20 @@ +if(${PROJECT_NAME}_ENABLE_CLANG_TIDY) + find_program(CLANGTIDY clang-tidy) + if(CLANGTIDY) + set(CMAKE_CXX_CLANG_TIDY ${CLANGTIDY} -extra-arg=-Wno-unknown-warning-option) + message("Clang-Tidy finished setting up.") + else() + message(SEND_ERROR "Clang-Tidy requested but executable not found.") + endif() +endif() + +if(${PROJECT_NAME}_ENABLE_CPPCHECK) + find_program(CPPCHECK cppcheck) + if(CPPCHECK) + set(CMAKE_CXX_CPPCHECK ${CPPCHECK} --suppress=missingInclude --enable=all + --inline-suppr --inconclusive -i ${CMAKE_SOURCE_DIR}/imgui/lib) + message("Cppcheck finished setting up.") + else() + message(SEND_ERROR "Cppcheck requested but executable not found.") + endif() +endif() diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Utils.cmake" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Utils.cmake" new file mode 100644 index 0000000..754c7cd --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Utils.cmake" @@ -0,0 +1,40 @@ +# +# Print a message only if the `VERBOSE_OUTPUT` option is on +# + +function(verbose_message content) + if(${PROJECT_NAME}_VERBOSE_OUTPUT) + message(STATUS ${content}) + endif() +endfunction() + +# +# Add a target for formating the project using `clang-format` (i.e: cmake --build build --target clang-format) +# + +function(add_clang_format_target) + if(NOT ${PROJECT_NAME}_CLANG_FORMAT_BINARY) + find_program(${PROJECT_NAME}_CLANG_FORMAT_BINARY clang-format) + endif() + + if(${PROJECT_NAME}_CLANG_FORMAT_BINARY) + if(${PROJECT_NAME}_BUILD_EXECUTABLE) + add_custom_target(clang-format + COMMAND ${${PROJECT_NAME}_CLANG_FORMAT_BINARY} + -i ${exe_sources} ${headers} + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + elseif(${PROJECT_NAME}_BUILD_HEADERS_ONLY) + add_custom_target(clang-format + COMMAND ${${PROJECT_NAME}_CLANG_FORMAT_BINARY} + -i ${headers} + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + else() + add_custom_target(clang-format + COMMAND ${${PROJECT_NAME}_CLANG_FORMAT_BINARY} + -i ${sources} ${headers} + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + endif() + + message(STATUS "Format the project using the `clang-format` target (i.e: cmake --build build --target clang-format).\n") + endif() +endfunction() diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Vcpkg.cmake" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Vcpkg.cmake" new file mode 100644 index 0000000..1c13e38 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/Vcpkg.cmake" @@ -0,0 +1,20 @@ +if(${PROJECT_NAME}_ENABLE_VCPKG) + # + # If `vcpkg.cmake` (from https://github.com/microsoft/vcpkg) does not exist, download it. + # + if(NOT EXISTS "${CMAKE_BINARY_DIR}/vcpkg.cmake") + message( + STATUS + "Downloading `vcpkg.cmake` from https://github.com/microsoft/vcpkg..." + ) + file(DOWNLOAD "https://github.com/microsoft/vcpkg/raw/master/scripts/buildsystems/vcpkg.cmake" + "${CMAKE_BINARY_DIR}/vcpkg.cmake" + ) + message(STATUS "Vcpkg config downloaded succesfully.") + endif() + + if(${PROJECT_NAME}_VERBOSE_OUTPUT) + set(VCPKG_VERBOSE ON) + endif() + set(CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" "${CMAKE_BINARY_DIR}/vcpkg.cmake") +endif() diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/version.hpp.in" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/version.hpp.in" new file mode 100644 index 0000000..985bad6 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/cmake/version.hpp.in" @@ -0,0 +1,11 @@ +#ifndef @PROJECT_NAME_UPPERCASE@_VERSION_H_ +#define @PROJECT_NAME_UPPERCASE@_VERSION_H_ + +#define @PROJECT_NAME_UPPERCASE@_VERSION "@PROJECT_VERSION@" + +#define @PROJECT_NAME_UPPERCASE@_MAJOR_VERSION @PROJECT_VERSION_MAJOR@ +#define @PROJECT_NAME_UPPERCASE@_MINOR_VERSION @PROJECT_VERSION_MINOR@ +#define @PROJECT_NAME_UPPERCASE@_PATCH_VERSION @PROJECT_VERSION_PATCH@ + +#endif // @PROJECT_NAME_UPPERCASE@_VERSION_H_ + diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/codecov.yaml" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/codecov.yaml" new file mode 100644 index 0000000..b2c991f --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/codecov.yaml" @@ -0,0 +1,5 @@ +ignore: + - "test" + +comment: + require_changes: true diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/input1.png" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/input1.png" new file mode 100644 index 0000000000000000000000000000000000000000..3cee38b251eaaaea8e6ecb1a04264d0f1f464e1c GIT binary patch literal 13114 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 literal 0 HcmV?d00001 diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/input2.png" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/input2.png" new file mode 100644 index 0000000000000000000000000000000000000000..25b5d0b985c223ddd155ba3ec54387b2935ea477 GIT binary patch literal 13535 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 Kv_RGR+5ZFOO*>8i literal 0 HcmV?d00001 diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/output1.png" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/output1.png" new file mode 100644 index 0000000000000000000000000000000000000000..4c0e3f69078e3191e43de94eafc6649f43f7306a GIT binary patch literal 9428 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 G+J6EYoQAgm literal 0 HcmV?d00001 diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/output2.png" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/images/output2.png" new file mode 100644 index 0000000000000000000000000000000000000000..201d80ee659327f46a58074b5b74f72b03ccab3a GIT binary patch literal 3908 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%0D5YiXG3E<<<|x7k4Zw-DIF=)hpF3&pHCc-S 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 IIVCg!0I+)@c>n+a literal 0 HcmV?d00001 diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Astar.hpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Astar.hpp" new file mode 100644 index 0000000..7951443 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Astar.hpp" @@ -0,0 +1,48 @@ +/** + * @file Astar.hpp + * @author lizichao () + * @brief Header file for the A* algorithm class declarations. + * @version 0.1 + * @date 2024-07-24 + * + * @copyright Copyright (c) 2024 + * + */ +#ifndef ASTAR_H_ +#define ASTAR_H_ + +#include "Astar/Point.hpp" +#include "Astar/Map.hpp" +#include +#include +#include + +const int kCost1 = 10; +const int kCost2 = 14; + +struct ComparePoints { + bool operator()(const Point* p1, const Point* p2) const { + return p1->getF() < p2->getF(); + } +}; + +class Astar { +public: + std::list findPath(Point* start, Point* end, Map& map); + +private: + int calcF(Point* now) const; + int calcG(Point* temp_start, Point* point); + int calcH(Point* now, Point* end) const; + bool isUseful(int x, int y, Map& map); + bool isInOpenList(Point* now); + bool isInCloseList(Point* now); + std::vector findSurround(Point* now, Map& map); + std::list showPath() const; + +private: + std::multiset _openList; + std::list _closeList; +}; + +#endif // ASTAR_H_ \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Map.hpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Map.hpp" new file mode 100644 index 0000000..831c663 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Map.hpp" @@ -0,0 +1,44 @@ +/** + * @file Map.hpp + * @author lizichao () + * @brief Header file for the Map class declarations, used in the A* algorithm. + * @version 0.1 + * @date 2024-07-24 + * + * @copyright Copyright (c) 2024 + * + */ +#ifndef MAP_H_ +#define MAP_H_ + +#include +#include +#include +#include +#include "Astar/Point.hpp" + +class Map { +public: + Map() : _length(0), _width(0) {} + Map(int length, int weight): _length(length), _width(weight), _graph(static_cast::size_type>(length), std::vector(static_cast::size_type>(weight))) {} + Map(int length, int weight, std::vector> g) : _length(length), _width(weight), _graph(g) {} + + int getDir(int i, int j); + int getLength() const; + void setLength(int length); + int getWidth() const; + void setWidth(int weight); + void setGraph(std::vector> g); + int visitGraph(int i, int j); + void showMap() const; + void showPath(std::list path); + void randomizeGraph(); + +private: + int _dir[8][2] = { {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}, {-1, -1}, {-1, 0}, {-1, 1} }; + int _length; + int _width; + std::vector> _graph; +}; + +#endif // MAP_H_ \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Point.hpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Point.hpp" new file mode 100644 index 0000000..4258e08 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/include/Astar/Point.hpp" @@ -0,0 +1,43 @@ +/** + * @file Point.hpp + * @brief Header file for the Point class declarations, representing points in the map. + * @version 0.1 + * @date 2024-07-24 + * + * @copyright Copyright (c) 2024 + * + */ +#ifndef POINT_H_ +#define POINT_H_ + +class Point { +public: + Point(int x, int y) : _x(x), _y(y), _F(0), _G(0), _H(0), _parent(nullptr) {} + + int getX() const; + void setX(int x); + int getY() const; + void setY(int y); + int getF() const; + void setF(int F); + int getG() const; + void setG(int G); + int getH() const; + void setH(int H); + Point* getParent() const; + void setParent(Point* parent); + + bool operator==(const Point& other) const { + return _x == other._x && _y == other._y; + } + +private: + int _x; + int _y; + int _F; + int _G; + int _H; + Point* _parent; +}; + +#endif // POINT_H_ \ No newline at end of file diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Astar.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Astar.cpp" new file mode 100644 index 0000000..0af1121 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Astar.cpp" @@ -0,0 +1,132 @@ +/** + * @file Astar.cpp + * @author lizichao () + * @brief Implementation file for the A* algorithm. + * @version 0.1 + * @date 2024-07-24 + * + * @copyright Copyright (c) 2024 + * + */ +#include "Astar/Astar.hpp" +#include +#include +#include +#include + +int Astar::calcF(Point * now) const +{ + return now->getG() + now->getH(); +} + +int Astar::calcG(Point *temp_start, Point *point) +{ + int extraG = (abs(point->getX() - temp_start->getX()) + abs(point->getY() - temp_start->getY())) == 1 ? kCost1 : kCost2; + int parentG = point->getParent() == NULL ? 0 : point->getParent()->getG(); + return parentG + extraG; +} +int Astar::calcH(Point * now, Point * end) const +{ + int dx = end->getX() - now->getX(); + int dy = end->getY() - now->getY(); + return static_cast(sqrt(dx * dx + dy * dy) * kCost1); +} + + +bool Astar::isUseful(int x, int y, Map &map) +{ + //ʹ�� std::unique_ptr ������ָ�룬�Ա����ֶ������ڴ档 + auto point = std::make_unique(x, y); + return !(x < 0 || x >= map.getLength() || y < 0 || y >= map.getWidth() || map.visitGraph(x, y) == 1 || isInCloseList(point.get())); +} + +bool Astar::isInOpenList(Point * now) +{ + //ʹ��lambda����ʽ + return std::any_of(_openList.begin(), _openList.end(), [now](Point* point) { + return point->getX() == now->getX() && point->getY() == now->getY(); + }); +} + +bool Astar::isInCloseList(Point * now) +{ + return std::any_of(_closeList.begin(), _closeList.end(), [now](Point* point) { + return point->getX() == now->getX() && point->getY() == now->getY(); + }); +} + +std::vector Astar::findSurround(Point * now, Map &map) +{ + std::vector surroundings; + int newx=0,newy = 0; + for (int i = 0; i < 8; i++) { + newx = now->getX() + map.getDir(i,0); + newy = now->getY() + map.getDir(i,1); + if (isUseful(newx, newy,map)) { + surroundings.push_back(new Point(newx, newy)); + } + + } + return surroundings; +} + +std::list Astar::findPath(Point * start, Point * end, Map &map) +{ + _openList.insert(start); + while (!_openList.empty()) { + auto it = _openList.begin(); + Point* now = *it; + _openList.erase(it); + _closeList.push_back(now); + auto surrounds = findSurround(now, map); + + for (auto &target : surrounds) { + if (!isInOpenList(target)) { + target->setParent(now); + target->setG(calcG(now, target)); + target->setH(calcH(target, end)); + target->setF(calcF(target)); + _openList.insert(target); + } + else { + int tempG = calcG(now, target); + if (tempG < target->getG()) { + target->setParent(now); + target->setG(tempG); + target->setF(calcF(target)); + } + } + } + if (isInCloseList(end)) { + auto List = showPath(); + map.showPath(List); + return List; + } + } + std::cout << "path no found" << std::endl; + return std::list(); +} + +std::list Astar::showPath() const +{ + std::list showlist; + auto end = _closeList.back(); + while (end != nullptr) { + showlist.push_front(end); + end = end->getParent(); + } + std::cout << "the path is:" << std::endl; + + for (const auto& point : showlist) { + if (point != showlist.back()) { + std::cout << "(" << point->getX() << "," << point->getY() << ") -> "; + } + else { + std::cout << "(" << point->getX() << "," << point->getY() << ")"; + } + } + std::cout << std::endl << std::endl; + return showlist;; +} + + diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Map.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Map.cpp" new file mode 100644 index 0000000..746b155 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Map.cpp" @@ -0,0 +1,88 @@ +/** + * @file Map.cpp + * @author lizichao () + * @brief Implementation file for the Map class. + * @version 0.1 + * @date 2024-07-24 + * + * @copyright Copyright (c) 2024 + * + */ +#include "Astar/Map.hpp" + +int Map::getDir(int i, int j) +{ + return _dir[i][j]; +} + +int Map::getLength() const +{ + return this->_length; +} + +void Map::setLength(int length) +{ + this->_length = length; +} + +int Map::getWidth() const +{ + return this->_width; +} + +void Map::setWidth(int weight) +{ + this->_width = weight; +} + +void Map::setGraph(std::vector> g) +{ + _graph = g; +} + + + +int Map::visitGraph(int i, int j) +{ + return _graph[i][j]; +} + +void Map::showMap() const +{ + for (int i = 0; i < _length; i++) { + for (int j = 0; j < _width; j++) { + if (_graph[i][j] == 0) std::cout << "o"<<" "; + else std::cout << "x"<<" "; + } + std::cout << std::endl<< std::endl; + } +} + +void Map::showPath(std::list path) +{ + std::vector> result_graph = _graph; + for (auto it : path) { + result_graph[it->getX()][it->getY()] = 2; + } + for (int i = 0; i < _length; i++) { + for (int j = 0; j < _width; j++) { + if (result_graph[i][j] == 0) std::cout << "o" << " "; + else if (result_graph[i][j] == 1) std::cout << "x" << " "; + else std::cout << "#" << " "; + } + std::cout << std::endl << std::endl; + } +} + +void Map::randomizeGraph() +{ + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> dis(0, 1); + + for (auto& row : _graph) { + for (auto& elem : row) { + elem = dis(gen); + } + } +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Point.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Point.cpp" new file mode 100644 index 0000000..c97bd30 --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/src/Point.cpp" @@ -0,0 +1,71 @@ +/** + * @file Point.cpp + * @author lizichao () + * @brief Implementation file for the Point class. + * @version 0.1 + * @date 2024-07-24 + * + * @copyright Copyright (c) 2024 + * + */ +#include "Astar/Point.hpp" + +int Point::getX() const +{ + return this->_x; +} + +void Point::setX(int x) +{ + this->_x = x; +} + +int Point::getY() const +{ + return this->_y; +} + +void Point::setY(int y) +{ + this->_y = y; +} + +int Point::getF() const +{ + return this->_F; +} + +void Point::setF(int F) +{ + this->_F =F; +} + +int Point::getG() const +{ + return this->_G; +} + +void Point::setG(int G) +{ + this->_G = G; +} + +int Point::getH() const +{ + return this->_H; +} + +void Point::setH(int H) +{ + this->_H = H; +} + +Point* Point::getParent() const +{ + return this->_parent; +} + +void Point::setParent(Point * parent) +{ + this->_parent = parent; +} diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/test/CMakeLists.txt" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/test/CMakeLists.txt" new file mode 100644 index 0000000..71f07af --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/test/CMakeLists.txt" @@ -0,0 +1,84 @@ +cmake_minimum_required(VERSION 3.15) + +# +# Project details +# + +project( + ${CMAKE_PROJECT_NAME}Tests + LANGUAGES CXX +) + +verbose_message("Adding tests under ${CMAKE_PROJECT_NAME}Tests...") + +foreach(file ${test_sources}) + string(REGEX REPLACE "(.*/)([a-zA-Z0-9_ ]+)(\.cpp)" "\\2" test_name ${file}) + add_executable(${test_name}_Tests ${file}) + + # + # Set the compiler standard + # + + target_compile_features(${test_name}_Tests PUBLIC cxx_std_17) + + # + # Setup code coverage if enabled + # + + if (${CMAKE_PROJECT_NAME}_ENABLE_CODE_COVERAGE) + target_compile_options(${CMAKE_PROJECT_NAME} PUBLIC -O0 -g -fprofile-arcs -ftest-coverage) + target_link_options(${CMAKE_PROJECT_NAME} PUBLIC -fprofile-arcs -ftest-coverage) + verbose_message("Code coverage is enabled and provided with GCC.") + endif() + + # + # Load the desired unit testing framework + # + # Currently supported: GoogleTest (and GoogleMock), Catch2. + + if(${CMAKE_PROJECT_NAME}_BUILD_EXECUTABLE) + set(${CMAKE_PROJECT_NAME}_TEST_LIB ${CMAKE_PROJECT_NAME}_LIB) + else() + set(${CMAKE_PROJECT_NAME}_TEST_LIB ${CMAKE_PROJECT_NAME}) + endif() + + if(${CMAKE_PROJECT_NAME}_USE_GTEST) + find_package(GTest REQUIRED) + + if(${CMAKE_PROJECT_NAME}_USE_GOOGLE_MOCK) + set(GOOGLE_MOCK_LIBRARIES GTest::gmock GTest::gmock_main) + endif() + + target_link_libraries( + ${test_name}_Tests + PUBLIC + GTest::GTest + GTest::Main + ${GOOGLE_MOCK_LIBRARIES} + ${${CMAKE_PROJECT_NAME}_TEST_LIB} + ) + elseif(${CMAKE_PROJECT_NAME}_USE_CATCH2) + find_package(Catch2 REQUIRED) + target_link_libraries( + ${test_name}_Tests + PUBLIC + Catch2::Catch2 + ${${CMAKE_PROJECT_NAME}_TEST_LIB} + ) + else() + message(FATAL_ERROR "Unknown testing library. Please setup your desired unit testing library by using `target_link_libraries`.") + endif() + + # + # Add the unit tests + # + + add_test( + NAME + ${test_name} + COMMAND + ${test_name}_Tests + ) +endforeach() + +verbose_message("Finished adding unit tests for ${CMAKE_PROJECT_NAME}.") diff --git "a/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/test/src/tmp_test.cpp" "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/test/src/tmp_test.cpp" new file mode 100644 index 0000000..1efa87d --- /dev/null +++ "b/C++/codes/2024-07/\346\235\216\345\255\220\350\266\205/Astar/test/src/tmp_test.cpp" @@ -0,0 +1,50 @@ +#include "Astar/Astar.hpp" +#include "Astar/Point.hpp" +#include +#include +#include + + +TEST(AstarTest, CheckPath) { + + std::vector> g = { + {0,0,0,0,1,1,1,1}, + {0,0,0,0,0,1,1,1}, + {1,1,0,1,1,0,0,0}, + {1,0,0,0,0,0,0,0}, + }; + Map map(4, 8, g); + map.showMap(); + + Astar astar; + // 设置起始和结束点 + Point *start = new Point(0, 0); + Point *end = new Point(3, 7); + + // A*算法 + auto path=astar.findPath(start, end, map); + std::list resultpath; + resultpath.push_back(new Point(0,0)); + resultpath.push_back(new Point(0,1)); + resultpath.push_back(new Point(1,2)); + resultpath.push_back(new Point(1,3)); + resultpath.push_back(new Point(1,4)); + resultpath.push_back(new Point(2,5)); + resultpath.push_back(new Point(2,6)); + resultpath.push_back(new Point(3,7)); + + auto it1 = path.begin(); + auto it2 = resultpath.begin(); + + for (; it1 != path.end() && it2 != resultpath.end(); ++it1, ++it2) { + EXPECT_EQ((*it1)->getX(),(*it2)->getX()); + EXPECT_EQ((*it1)->getY(),(*it2)->getY()); + } + + system("pause"); +} + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} -- Gitee