commit 8ebd58a11b4ccc6e10d995d504398109d40926ab Author: Enoch Date: Mon Aug 5 23:12:46 2024 +0800 Save diff --git a/3-33.html b/3-33.html new file mode 100644 index 0000000..455b317 --- /dev/null +++ b/3-33.html @@ -0,0 +1,50 @@ + + + + + CSS属性border-collapse的应用 + + + +

CSS属性border-collapse的应用

+
+ + + + + + + + + + + +
+ 双线边框效果 +
年份第一季度第二季度第三季度
2014100200300
2015150250350
2016200300400
+
+ + + + + + + + + + + + + +
+ 折叠边框效果 +
年份第一季度第二季度第三季度
2014100200300
2015150250350
2016200300400
+ + \ No newline at end of file diff --git a/6.5.cpp b/6.5.cpp new file mode 100644 index 0000000..6ecf4ca --- /dev/null +++ b/6.5.cpp @@ -0,0 +1,21 @@ +#include +// 修正模板的定义 +template +T max(T x, T y) +{ + // 删除无效的赋值语句 + return (x > y) ? x : y; +} +int main() +{ + char c = 0; + int i = 1; + + // 调用模板函数时需要指定模板类型 + int result = max((int)c,i); + + // 输出结果 + std::cout << "Max: " << result << std::endl; + + return 0; +} diff --git a/all.cpp b/all.cpp new file mode 100644 index 0000000..f485f38 --- /dev/null +++ b/all.cpp @@ -0,0 +1,90 @@ +#include +#include + +// 基类(父类) +class Animal { +public: + // 虚函数,用于实现多态 + virtual void makeSound() { + std::cout << "Some generic animal sound" << std::endl; + } + + // 公共方法 + void eat() { + std::cout << "Eating..." << std::endl; + } +}; + +// 派生类(子类) +class Dog : public Animal { +private: + std::string name; + int age; + +public: + // 构造函数 + Dog(std::string n, int a) : name(n), age(a) {} + + // 重载虚函数,实现多态 + void makeSound() override { + std::cout << "Woof!" << std::endl; + } + + // 设置名字(封装) + void setName(std::string n) { + name = n; + } + + // 获取名字(封装) + std::string getName() { + return name; + } + + // 设置年龄(封装) + void setAge(int a) { + age = a; + } + + // 获取年龄(封装) + int getAge() { + return age; + } +}; + +// 另一个派生类(子类) +class Cat : public Animal { +public: + // 重载虚函数,实现多态 + void makeSound() override { + std::cout << "Meow!" << std::endl; + } +}; + +int main() { + // 创建Dog对象 + Dog myDog("Buddy", 3); + myDog.eat(); // 输出: Eating... + myDog.makeSound(); // 输出: Woof! + + // 使用封装方法设置和获取属性 + myDog.setName("Max"); + std::cout << "Dog's name: " << myDog.getName() << std::endl; // 输出: Dog's name: Max + myDog.setAge(4); + std::cout << "Dog's age: " << myDog.getAge() << std::endl; // 输出: Dog's age: 4 + + // 创建Cat对象 + Cat myCat; + myCat.eat(); // 输出: Eating... + myCat.makeSound(); // 输出: Meow! + + // 多态演示 + Animal* animals[2]; + animals[0] = &myDog; + animals[1] = &myCat; + + for (int i = 0; i < 2; i++) { + animals[i]->makeSound(); // 输出: Woof! 和 Meow! + } + + return 0; +} diff --git a/build/Debug/6.5.o b/build/Debug/6.5.o new file mode 100644 index 0000000..76fcb9a Binary files /dev/null and b/build/Debug/6.5.o differ diff --git a/build/Debug/all.o b/build/Debug/all.o new file mode 100644 index 0000000..47f1d98 Binary files /dev/null and b/build/Debug/all.o differ diff --git a/build/Debug/c++上机1.o b/build/Debug/c++上机1.o new file mode 100644 index 0000000..5f91bc7 Binary files /dev/null and b/build/Debug/c++上机1.o differ diff --git a/build/Debug/c++上机2.o b/build/Debug/c++上机2.o new file mode 100644 index 0000000..e184a87 Binary files /dev/null and b/build/Debug/c++上机2.o differ diff --git a/build/Debug/c++上机3.o b/build/Debug/c++上机3.o new file mode 100644 index 0000000..f8d00b4 Binary files /dev/null and b/build/Debug/c++上机3.o differ diff --git a/build/Debug/c++上机4.o b/build/Debug/c++上机4.o new file mode 100644 index 0000000..4bb6edf Binary files /dev/null and b/build/Debug/c++上机4.o differ diff --git a/build/Debug/c++上机4(附加题).o b/build/Debug/c++上机4(附加题).o new file mode 100644 index 0000000..aec892f Binary files /dev/null and b/build/Debug/c++上机4(附加题).o differ diff --git a/build/Debug/c++上机思考题1.o b/build/Debug/c++上机思考题1.o new file mode 100644 index 0000000..1cf8f74 Binary files /dev/null and b/build/Debug/c++上机思考题1.o differ diff --git a/build/Debug/c++上机思考题4.o b/build/Debug/c++上机思考题4.o new file mode 100644 index 0000000..9ddb965 Binary files /dev/null and b/build/Debug/c++上机思考题4.o differ diff --git a/build/Debug/outDebug b/build/Debug/outDebug new file mode 100755 index 0000000..1ad0a7c Binary files /dev/null and b/build/Debug/outDebug differ diff --git a/c++上机1.cpp b/c++上机1.cpp new file mode 100644 index 0000000..dd85afa --- /dev/null +++ b/c++上机1.cpp @@ -0,0 +1,140 @@ +#include +#include + +class CTString { +private: + char *m_pData; // 用于保存字符数据 + int m_nLen; // 记录字符长度 + +public: + // 构造函数和析构函数 + CTString(); + CTString(const char *); + CTString(const CTString&); + ~CTString(); + + // 其它成员函数 + CTString* Copy(CTString*); + CTString* Connect(CTString*); + int Find(CTString*); + int Find(char) const; + void Print() const; + + // 获取字符数据的公有函数 + const char* GetData() const { + return m_pData; + } + + // 查找子串 + int FindSubstring(CTString*); +}; + +// 构造函数 +CTString::CTString() { + m_nLen = 0; + m_pData = new char[1]; + *m_pData = '\0'; +} + +CTString::CTString(const char *pData) { + m_nLen = strlen(pData); + m_pData = new char[m_nLen + 1]; + strcpy(m_pData, pData); +} + +// 拷贝构造函数 +CTString::CTString(const CTString& str) { + m_nLen = str.m_nLen; + m_pData = new char[m_nLen + 1]; + strcpy(m_pData, str.m_pData); +} + +// 析构函数 +CTString::~CTString() { + delete [] m_pData; +} + +// 拷贝函数 +CTString* CTString::Copy(CTString *str) { + *str = *this; + return str; +} + +// 连接函数 +CTString* CTString::Connect(CTString *str) { + CTString *temp = new CTString; + temp->m_nLen = m_nLen + str->m_nLen; + temp->m_pData = new char[temp->m_nLen + 2]; // 加上一个空格的长度 + strcpy(temp->m_pData, m_pData); + strcat(temp->m_pData, " "); // 添加一个空格 + strcat(temp->m_pData, str->m_pData); + return temp; +} + +// 查找子串 +int CTString::FindSubstring(CTString *str) { + char *ptr = strstr(m_pData, str->m_pData); + if (ptr) { + // 计算子串在主串中的位置,考虑到额外的空格 + int pos = ptr - m_pData; + return pos - 1; // 减去额外的空格 + } else { + return -1; // 未找到 + } +} + +// 查找字符 +int CTString::Find(char ch) const { + char *ptr = strchr(m_pData, ch); + if (ptr) { + // 计算字符在字符串中的位置,考虑到额外的空格 + int pos = ptr - m_pData; + return pos - 1; // 减去额外的空格 + } else { + return -1; // 未找到 + } +} + +// 打印输出字符串内容 +void CTString::Print() const { + std::cout << "字符串内容:" << m_pData << std::endl; +} + +int main() { + char strInput1[100], strInput2[100], charToFind; + + std::cout << "请输入第一个字符串: "; + std::cin.getline(strInput1, 100); + + std::cout << "请输入第二个字符串: "; + std::cin.getline(strInput2, 100); + + std::cout << "请输入要查找的字符: "; + std::cin >> charToFind; + + CTString str1(strInput1); + CTString str2(strInput2); + CTString str3(str1); + CTString *str4 = new CTString; + + str3.Copy(str4); + CTString *str5 = str4->Connect(&str2); + + str1.Print(); + str3.Print(); + str5->Print(); + + const char *data = str5->GetData(); + int subStrPos = str5->FindSubstring(&str2); + if (subStrPos >= 0) + std::cout << "子串位置: " << subStrPos << std::endl; + + int charPos = str5->Find(charToFind); + if (charPos >= 0) + std::cout << "字符位置: " << charPos << std::endl; + + delete str4; + delete str5; + + return 0; +} diff --git a/c++上机2.cpp b/c++上机2.cpp new file mode 100644 index 0000000..8d51317 --- /dev/null +++ b/c++上机2.cpp @@ -0,0 +1,128 @@ +#include +#include +#include +using namespace std; +class CEmployee { +private: + char *m_pName; // 姓名 + int m_nAge; // 年龄 + float m_fSalary; // 薪水 +public: + // 构造函数和析构函数 + CEmployee(char *pName = NULL, int age = 0, float salary = 0.0) : m_nAge(age), m_fSalary(salary) { + if (pName != NULL) { + m_pName = new char[strlen(pName) + 1]; + strcpy(m_pName, pName); + } else { + m_pName = NULL; + } + } + CEmployee(const CEmployee &emp) { + m_pName = new char[strlen(emp.m_pName) + 1]; + strcpy(m_pName, emp.m_pName); + m_nAge = emp.m_nAge; + m_fSalary = emp.m_fSalary; + } + ~CEmployee() { + if (m_pName != NULL) { + delete[] m_pName; + } + } + // 其它成员函数 + void SetName(char *name) { + if (m_pName != NULL) { + delete[] m_pName; + } + m_pName = new char[strlen(name) + 1]; + strcpy(m_pName, name); + } + char *GetName() { + return m_pName; + } + void SetAge(int age) { + m_nAge = age; + } + int GetAge() { + return m_nAge; + } + void SetSalary(float salary) { + m_fSalary = salary; + } + float GetSalary() { + return m_fSalary; + } + void Print() { + cout << "姓名:" << m_pName << ",年龄:" << m_nAge << ",薪水:" << m_fSalary << endl; + } +}; +class CManager : public CEmployee { +private: + int m_nLevel; // 级别 +public: + // 构造函数和析构函数 + CManager(char *pName = NULL, int age = 0, float salary = 0.0, int nLevel = 0) : CEmployee(pName, age, salary), m_nLevel(nLevel) {} + CManager(const CEmployee &emp, int level) : CEmployee(emp), m_nLevel(level) {} + ~CManager() {} + // 其它成员函数 + void SetLevel(int level) { + m_nLevel = level; + } + int GetLevel() { + return m_nLevel; + } + void Print() { + CEmployee::Print(); + cout << "级别:" << m_nLevel << endl; + } +}; +int main() { + vector + employees; + vector managers; + char name[50]; + int age; + float salary; + int level; + int numEmployees; + // 输入雇员数量 + cout << "请输入雇员数量:"; + cin >> numEmployees; + cin.ignore(); // 忽略输入缓冲区中的换行符 + // 输入雇员信息 + for (int i = 0; i < numEmployees; ++i) { + cout << "请输入雇员姓名:"; + cin.getline(name, 50); + cout << "请输入雇员年龄:"; + cin >> age; + cout << "请输入雇员薪水:"; + cin >> salary; + cin.ignore(); // 忽略输入缓冲区中的换行符 + // 创建雇员对象 + CEmployee emp(name, age, salary); + employees.push_back(emp); + } + // 输入管理者信息 + cout << "请输入经理姓名:"; + cin.getline(name, 50); + cout << "请输入经理年龄:"; + cin >> age; + cout << "请输入经理薪水:"; + cin >> salary; + cout << "请输入经理级别:"; + cin >> level; + cin.ignore(); // 忽略输入缓冲区中的换行符 + // 创建经理对象 + CManager manager(name, age, salary, level); + managers.push_back(manager); + // 输出所有雇员信息 + cout << "雇员信息:" << endl; + for (int i = 0; i < employees.size(); ++i) { + employees[i].Print(); + } + // 输出所有经理信息 + cout << "经理信息:" << endl; + for (int i = 0; i < managers.size(); ++i) { + managers[i].Print(); + } + return 0; +} \ No newline at end of file diff --git a/c++上机3.cpp b/c++上机3.cpp new file mode 100644 index 0000000..0e1bfbd --- /dev/null +++ b/c++上机3.cpp @@ -0,0 +1,104 @@ +#include +class CComplex { +private: + float real; + float imag; +public: + // 构造函数 + CComplex(float r = 0.0, float i = 0.0) : real(r), imag(i) {} + // 拷贝构造函数 + CComplex(const CComplex& other) : real(other.real), imag(other.imag) {} + // 赋值运算符重载 + CComplex& operator=(const CComplex& other) { + real = other.real; + imag = other.imag; + return *this; + } + // 加法运算符重载 + CComplex operator+(const CComplex& other) const { + return CComplex(real + other.real, imag + other.imag); + } + // 减法运算符重载 + CComplex operator-(const CComplex& other) const { + return CComplex(real - other.real, imag - other.imag); + } + // 乘法运算符重载 + CComplex operator*(const CComplex& other) const { + return CComplex(real * other.real - imag * other.imag, real * other.imag + imag * other.real); + } + // 除法运算符重载 + CComplex operator/(const CComplex& other) const { + float denominator = other.real * other.real + other.imag * other.imag; + if (denominator == 0.0) { + std::cerr << "错误:除数为零!" << std::endl; + return CComplex(); + } + return CComplex((real * other.real + imag * other.imag) / denominator, (imag * other.real - real * other.imag) / denominator); + } + // 相等运算符重载 + bool operator==(const CComplex& other) const { + return (real == other.real) && (imag == other.imag); + } + // 不等运算符重载 + bool operator!=(const CComplex& other) const { + return !(*this == other); + } + // 下标运算符重载 + float operator[](int index) const { + if (index == 0) return real; + else if (index == 1) return imag; + else { + std::cerr << "错误:下标越界!" << std::endl; + return 0.0; + } + } + // 打印复数 + void print() const { + std::cout << "(" << real << " + " << imag << "i)"; + } + // 虚析构函数 + virtual ~CComplex() {} +}; +int main() { + float real1, imag1, real2, imag2; + // 输入第一个复数 + std::cout << "请输入第一个复数的实部:"; + std::cin >> real1; + std::cout << "请输入第一个复数的虚部:"; + std::cin >> imag1; + // 输入第二个复数 + std::cout << "请输入第二个复数的实部:"; + std::cin >> real2; + std::cout << "请输入第二个复数的虚部:"; + std::cin >> imag2; + // 创建两个复数对象 + CComplex a(real1, imag1); + CComplex b(real2, imag2); + // 测试运算符重载 + CComplex c = a + b; + std::cout << "a + b = "; + c.print(); + std::cout << std::endl; + c = a - b; + std::cout << "a - b = "; + c.print(); + std::cout << std::endl; + c = a * b; + std::cout << "a * b = "; + c.print(); + std::cout << std::endl; + c = a / b; + std::cout << "a / b = "; + c.print(); + std::cout << std::endl; + // 测试相等和不等运算符重载 + if (a == b) { + std::cout << "a 等于 b。" << std::endl; + } else { + std::cout << "a 不等于 b。" << std::endl; + } + // 测试下标运算符重载 + std::cout << "a 的实部:" << a[0] << std::endl; + std::cout << "a 的虚部:" << a[1] << std::endl; + return 0; +} \ No newline at end of file diff --git a/c++上机4.cpp b/c++上机4.cpp new file mode 100644 index 0000000..c4c181d --- /dev/null +++ b/c++上机4.cpp @@ -0,0 +1,93 @@ +#include + +// 节点结构 +template +struct Node { + T data; + Node* next; + Node(const T& data) : data(data), next(nullptr) {} +}; + +// 链栈类模板 +template +class LinkStack { +private: + Node* top; // 栈顶指针 + size_t size; // 栈大小 + +public: + // 构造函数 + LinkStack() : top(nullptr), size(0) {} + + // 析构函数 + ~LinkStack() { + while (!isEmpty()) { + pop(); + } + } + + // 判断栈是否为空 + bool isEmpty() const { + return top == nullptr; + } + + // 获取栈的大小 + size_t getSize() const { + return size; + } + + // 入栈操作 + void push(const T& data) { + Node* newNode = new Node(data); + newNode->next = top; + top = newNode; + ++size; + } + + // 出栈操作 + void pop() { + if (isEmpty()) { + std::cout << "Stack is empty, cannot pop.\n"; + return; + } + Node* temp = top; + top = top->next; + delete temp; + --size; + } + + // 获取栈顶元素 + T peek() const { + if (isEmpty()) { + throw std::runtime_error("Stack is empty, cannot peek."); + } + return top->data; + } +}; + +int main() { + LinkStack stack; + + // 测试入栈操作 + stack.push(10); + stack.push(20); + stack.push(30); + + // 打印栈顶元素 + std::cout << "Top element: " << stack.peek() << std::endl; + + // 测试出栈操作 + stack.pop(); + std::cout << "Top element after pop: " << stack.peek() << std::endl; + + // 测试栈大小 + std::cout << "Stack size: " << stack.getSize() << std::endl; + + // 清空栈 + while (!stack.isEmpty()) { + std::cout << "Popping: " << stack.peek() << std::endl; + stack.pop(); + } + + return 0; +} \ No newline at end of file diff --git a/c++上机4(附加题).cpp b/c++上机4(附加题).cpp new file mode 100644 index 0000000..0e940d6 --- /dev/null +++ b/c++上机4(附加题).cpp @@ -0,0 +1,44 @@ +#include +#include +#include +// 基类 CTimer +class CTimer { +protected: + unsigned long timerID; +public: + CTimer(unsigned long id) : timerID(id) {} + virtual ~CTimer() {} + // 纯虚函数,子类必须重载 + virtual std::string GetTimeZone() const = 0; + unsigned long GetTimerID() const { + return timerID; + } +}; +// 子类 CBeijingTimer +class CBeijingTimer : public CTimer { +public: + CBeijingTimer(unsigned long id) : CTimer(id) {} + virtual ~CBeijingTimer() {} + // 重载基类的虚函数 + virtual std::string GetTimeZone() const { + return "Beijing Time"; + } +}; +int main() { + std::vector timerList; + // 创建一个北京时间的定时器并添加到列表中 + CTimer* beijingTimer = new CBeijingTimer(1); + timerList.push_back(beijingTimer); + // 查询当前所有创建的Timer并打印信息 + std::cout << "Timer List:" << std::endl; + for (std::vector::iterator it = timerList.begin(); it != timerList.end(); ++it) { + std::cout << "Timer ID: " << (*it)->GetTimerID() << ", Time Zone: " << (*it)->GetTimeZone() << std::endl; + } + // 清理内存 + for (std::vector::iterator it = timerList.begin(); it != timerList.end(); ++it) { + delete *it; + } + timerList.clear(); + + return 0; +} \ No newline at end of file diff --git a/c++上机思考题1.cpp b/c++上机思考题1.cpp new file mode 100644 index 0000000..a581709 --- /dev/null +++ b/c++上机思考题1.cpp @@ -0,0 +1,49 @@ +#include +#include +class CTString { +private: + char *str; + static int objectCount; // 静态成员变量,用于记录对象个数 +public: + CTString() { + str = NULL; // or str = 0; + objectCount++; // 增加对象计数 + } +CTString(const char *s) { + str = new char[strlen(s) + 1]; + strcpy(str, s); + objectCount++; + } +~CTString() { + objectCount--; // 先减少对象计数 + delete[] str; // 释放字符串内存 + } +void Print() { + if (str) + std::cout << str << std::endl; + else + std::cout << "空字符串" << std::endl; + } +void Copy(const char *s) { + delete[] str; + str = new char[strlen(s) + 1]; + strcpy(str, s); + } +static int getObjectCount() { + return objectCount; + } +}; +int CTString::objectCount = 0; // 静态成员变量初始化 +int main() { + CTString *pstr; + pstr = new CTString; + pstr->Print(); + pstr->Copy("hello"); + pstr->Print(); +std::cout << "总共创建的对象数量: " << CTString::getObjectCount() << std::endl; +delete pstr; +// 等待用户按下任意键后再退出 + std::cin.get(); +return 0; +} + diff --git a/c++上机思考题4.cpp b/c++上机思考题4.cpp new file mode 100644 index 0000000..ea99bf7 --- /dev/null +++ b/c++上机思考题4.cpp @@ -0,0 +1,57 @@ +//定义一个数组类模版,然后以它为基类模板,如何定义一个派生类模板? +#include +#include +// 基类模板:数组类模板 +template +class Array { +protected: + std::vector data; +public: + Array(int size) : data(size) {} + void set(int index, const T& value) { + data[index] = value; + } + T get(int index) const { + return data[index]; + } + int size() const { + return data.size(); + } +}; +// 派生类模板:增强数组类模板 +template +class EnhancedArray : public Array { +public: + EnhancedArray(int size) : Array(size) {} + // 新增函数:求和 + T sum() const { + T sum = 0; + for (const auto& element : this->data) { + sum += element; + } + return sum; + } + + // 新增函数:平均值 + double average() const { + if (this->data.empty()) { + return 0.0; + } + T sum = this->sum(); + return static_cast(sum) / this->data.size(); + } +}; +int main() { + EnhancedArray arr(5); + for (int i = 0; i < 5; ++i) { + arr.set(i, i + 1); + } + std::cout << "Array elements: "; + for (int i = 0; i < arr.size(); ++i) { + std::cout << arr.get(i) << " "; + } + std::cout << std::endl; + std::cout << "Sum: " << arr.sum() << std::endl; + std::cout << "Average: " << arr.average() << std::endl; + return 0; +} \ No newline at end of file