《C++ Primer Plus》第十二章复习题和编程练习

目录

  • 一、复习题
  • 二、编程练习

一、复习题

1. 假设String类有如下私有成员:

// String 类声明
class String
{
private: char* str;int len;// ...
};

a. 下述默认构造函数有什么问题?

String::String() { }  // 默认构造函数

b. 下述构造函数有什么问题?

String::String(const char* s)  // 构造函数
{str = s;len = strlen;
}

c. 下述构造函数有什么问题?

String::String(const char* s)  // 构造函数
{strcpy(str, s);len = strlen(s);
}

答:注意:下面的代码需要包含相应的头文件和using声明。
a. 该默认函数并未进行任何操作,则成员变量str与len的值是未知的(和创建局部变量未初始化一个道理)。而String类涉及动态内存分配,所以需要给str适当初始化(一般初始化为空指针——nullptr)。
修改如下:

String::String()  // 默认构造函数
{str = nullptr;len = 0
}

b. 该构造函数中语句str = s; 只是单纯地让str和s指向同一个字符串,str只是存储了s指向的字符串的首地址,这是浅拷贝。而我们需要拷贝存储字符串的副本(深拷贝)。
修改如下:

String::String(const char* s)
{len = strlen(s);  // 存储字符串的长度,不包括空字符str = new char[len + 1];  // 申请空间,别忘了空字符'\0'strcpy(str, s);  // 拷贝字符串内容副本
}

c. 还未在堆上申请空间,str指向的地方是未知的,直接使用函数strcpy()进行内容拷贝会导致不确定的问题。
修改如下:

String::String(const char* s)
{len = strlen(s);  // 存储字符串的长度,不包括空字符str = new char[len + 1];  // 申请空间,别忘了空字符'\0'strcpy(str, s);  // 拷贝字符串内容副本
}

2. 如果你定义了一个类,其指针成员是使用new初始化的,请指出可能出现的三个问题及如何纠正这些问题?

答:
1)问题:没有定义对应的析构函数,和使用对应的delete运算符的形式。
纠正:使用new为成员指针分配空间需要对应的析构函数来释放空间,使用什么形式申请空间就需要使用什么形式释放空间,如:int * pi = new int; —— delete pi; ,int* pa = new int[5];——delete[5]pa;。而且所有构造函数只能使用上面相同的一种new形式,使之与析构函数中的delete形式对应。
2)问题:没有定义相关的复制构造函数。
纠正:如果没有定义赋值构造函数,编译器会提供默认的复制构造函数,其只能进行浅拷贝,只能复制需要拷贝的内容的地址。需要定义相关的复制构造函数进行深拷贝,为拷贝内容申请空间。
3)问题:没有重载对应的赋值运算符
纠正:和问题2一样,如果没有重载赋值运算符,编译器也会提供默认的,同样是浅拷贝。我们需要定义相关的赋值运算符,来进行深度拷贝。需要先释放前面存储的动态空间,然后根据拷贝大小申请新的空间。

3. 如果没有显示提供类方法,编译器将自动生成哪些类方法?请描述这些隐式生成的函数的行为。

答:
1)若没有提供构造函数,则编译器会提供一个默认构造函数,该函数什么都不做,但允许声明数组和未初始化的对象。
2)若没有提供析构函数,则编译器会提供一个默认析构函数,该函数什么都不做。
3)若没有提供拷贝构造函数,则编译器会提供一个默认的拷贝构造函数,该函数进行浅拷贝。
4)若没有提供赋值运算符重载,则编译器会提供默认的赋值运算符重载,该函数也进行浅拷贝。
5)若没有提供地址运算符重载,则编译器会提供默认的地址运算符重载,该函数返回调用对象的地址,也就是this指针的值。

4. 找出并改正下述类声明中的错误。

// nifty 类声明
class nifty
{// 数据char personality[];int talents;// 方法nifty();nifty(char* s);ostream& operator<<(ostream& os, nifty& n);
};nifty::nifty()
{personality = NULL;talents = 0;
}nifty::nifty(char* s)
{personality = new char[strlen(s)];personality = s;talents = 0;
}ostream& nifty::operator<<(ostream& os, nifty& n)
{os << n;
}

答:首先,类声明中一般成员变量为私有成员(private),而成员函数为公有成员(public)。不显式声明时,类(class)默认为private,而结构(struct)默认为public。所以需要将成员函数声明为public。在默认构造函数中,personality是数组名也是指向第一个元素的char指针,但是其指向不能改变,可以使用strcpy()函数将其初始化为空字符串,参数s最好声明为const。在第二个提供一个参数的构造函数中,也是同样的问题。最后一个重载运算符(<<)函数需要被声明为友元函数,且该函数定义完全就是狗屁,我们都还没定义,你就用上了成品。根据上述问题,我们通过把变量personality修改为char指针,然后添加析构函数进行重写代码。(当然拷贝构造函数和赋值运算符重载也是需要的,读者可以自行编写)

下面是正确的代码:

// nifty 类声明
class nifty
{
private:// 数据char* personality;int talents;
public:// 方法nifty();nifty(const char* s);~nifty();friend ostream& operator<<(ostream& os, const nifty& n);
};// 类方法定义
nifty::nifty()  // 默认构造函数
{personality = nullptr;talents = 0;
}nifty::nifty(const char* s)  // 构造函数
{int len = strlen(s);personality = new char[len+1];strcpy(personality, s);talents = 0;
}nifty::~nifty()  // 析构函数
{if (personality != nullptr)delete[]personality;
}ostream& operator<<(ostream& os, const nifty& n)  // 运算符(<<)重载
{os << "Personality: " << personality << endl;os << "Talents: " << talents << endl;return os;
}

5. 对于下面的类声明,回答下面的问题。

// Golfer 类声明
class Golfer
{
private:char* fullname;  // 指向包含高尔夫的名称的字符串int games;  // 保存玩的高尔夫游戏的个数int* scores;  // 指向高尔夫分数数组的第一个元素
public:Golfer();Golfer(const char* name, int g = 0);Golfer(const Golfer& g);~Golfer();
};

a. 下列各条语句将调用哪些类方法?
1 Golfer nancy;
2 Golfer lulu(“Little Lulu”);
3 Golfer roy(“Roy Hobbs”, 12);
4 Golfer *par = new Golfer;
5 Golfer next = lulu;
6 Golfer hazzard = “Weed Thwacker”;
7 *par = nancy;
8 nancy = “Nancy Putter”;
b. 很明显,类需要有另外几个方法才能更有用,但是类需要哪些方法才能防止数据被损坏呢?

答:
a.

  1. 调用默认构造函数。
  2. 调用一个参数的构造函数。
  3. 调用两个参数的构造函数。
  4. 调用默认构造函数。
  5. 调用编译器提供的默认的复制构造函数。
  6. 先调用一个参数的构造函数创建临时对象,然后调用编译器提供的默认复制构造函数。
  7. 调用编译器提供的默认的赋值运算符重载函数。
  8. 先调用一个参数的构造函数创建临时对象,然后调用编译器提供的默认的赋值运算符重载函数。

b. 由于编译器提供的默认的复制构造函数和赋值运算符重载函数都是浅拷贝,所以需要用户自己定义复制构造函数和赋值运算符重载函数来对对象实行深度拷贝,避免程序出现问题。

二、编程练习

1. 对于下面的类声明,为这个类提供实现,并编写一个使用所有成员函数的小程序。

// Cow 类声明
class Cow
{
private:char name[20];char* hobby;double weight;
public:Cow();  // 默认构造函数Cow(const char* nm, const char* ho, double wt);Cow(const Cow& c);  // 复制构造函数~Cow();  // 析构函数Cow& operator=(const Cow& c);  // 赋值运算符重载void ShowCow() const;  // 显示所有有关于奶牛的数据
};

答:三个文件。

Cow.h头文件

#pragma once// 头文件
#include <iostream>// Cow 类声明
class Cow
{
private:char name[20];char* hobby;double weight;
public:Cow();  // 默认构造函数Cow(const char* nm, const char* ho, double wt);Cow(const Cow& c);  // 复制构造函数~Cow();  // 析构函数Cow& operator=(const Cow& c);  // 赋值运算符重载void ShowCow() const;  // 显示所有有关于奶牛的数据
};

main.cpp测试文件

// 头文件
#include "Cow.h"// using 声明
using std::cout;
using std::endl;int main()
{// 默认构造函数Cow cow1;cow1.ShowCow();cout << endl;// 三个参数的构造函数Cow cow2("若雪", "干饭", 888.8);cow2.ShowCow();cout << endl;// 复制构造函数Cow cow3(cow2);cow3.ShowCow();cout << endl;// 赋值运算符cow3 = cow1;cow3.ShowCow();cout << endl;return 0;
}

Cow.cpp方法定义文件

// 头文件
#include "Cow.h"
#include <cstring>// using 声明
using std::cout;
using std::endl;Cow::Cow()  // 默认构造函数
{strcpy(name, "小雪");// 申请空间hobby = new char[strlen("吃草") + 1];strcpy(hobby, "吃草");weight = 888.0;
}Cow::Cow(const char* nm, const char* ho, double wt)
{strcpy(name, nm);// 申请空间hobby = new char[strlen(ho) + 1];strcpy(hobby, ho);weight = wt;
}Cow::Cow(const Cow& c)  // 复制构造函数
{strcpy(name, c.name);// 申请空间hobby = new char[strlen(c.hobby) + 1];strcpy(hobby, c.hobby);weight = c.weight;
}Cow::~Cow()  // 析构函数
{// 释放空间delete[]hobby;  // 与申请的格式对应
}Cow& Cow::operator=(const Cow& c)  // 赋值运算符重载
{if (this == &c)  // 检查是否给自己赋值{return *this;}else{strcpy(name, c.name);// 释放原来的空间delete[]hobby;// 申请新的空间hobby = new char[strlen(c.hobby) + 1];strcpy(hobby, c.hobby);weight = c.weight;return *this;}
}void Cow::ShowCow() const  // 显示所有有关于奶牛的数据
{cout << "Name: " << name << endl;cout << "Hobby: " << hobby << endl;cout << "Weight: " << weight << endl;
}

2. 通过完成下面的工作来改进String类的声明(即将String1.h升级为String2.h)。
a. 对+运算符进行重载,使之可以将两个字符串合并成一个。
b. 提供一个Stringlow()成员函数,将字符串中所有的字母字符转换为小写(注意cctype系列的字符函数)
c. 提供String()成员函数,将字符串中所有字母字符转换为大写。
d. 提供一个这样的成员函数,它接受一个char参数,返回该字符在字符串中出现的次数。使用下面的程序来测试你的工作。

// 头文件
#include "String2.h"// using 声明
using std::cin;
using std::cout;
using std::endl;int main()
{String s1(" and I am a C++ student.");String s2 = "Please enter your name: ";String s3;cout << s2;cin >> s3;s2 = "My name is " + s3;cout << s2 << endl;s2 = s2 + s1;s2.Stringupper();cout << "The string\n" << s2 << "\ncontains " << s2.ch_times('A')<< " 'A' characters in it.\n";s1 = "red";String rgb[3] = { String(s1), String("green"), String("blue") };cout << "Enter the name of a primary color for mixing light: ";String ans;bool success = false;while (cin >> ans){ans.Stringlow();for (int i = 0; i < 3; ++i){if (ans == rgb[i]){cout << "That's right!\n";success = true;break;}}if (success)break;elsecout << "Try again!\n";}cout << "Bye\n";return 0;
}

输出应于下面相似。
Please enter your name: Fretta Farbo
My name is Fretta Farbo.
The string
My NAME IS FRETTA FARBO AND I AM A C++ STUDENT.
contains 6 ‘A’ characters in it.
Enter the name of a primary color for misxing light: yellow
Try again!
BLUE
That’s right!
Bye

答:两个文件。

String2.h头文件

#pragma once// 头文件
#include <iostream>// String 类声明
class String
{
private:char* str;  int len;  // 字符串长度static int num_strings;  // 目前有多少个String对象static const int CINLIM = 80;  // 输入的限制
public:String();  // 默认构造函数String(const char* s);String(const String& s);  // 复制构造函数~String();  // 析构函数int lenth() const { return len; }  // 返回字符串长度int ch_times(char key) const;  // 返回字符key在字符串中出现的次数void Stringlow();void Stringupper();String& operator=(const char* s);String& operator=(const String& s);char& operator[](int i);const char& operator[](int i) const;String operator+(const String& s) const;// 关系运算符重载friend bool operator<(const String& s1, const String& s2);friend bool operator>(const String& s1, const String& s2);friend bool operator==(const String& s1, const String& s2);friend String operator+(const char* s, const String& str);friend std::ostream& operator<<(std::ostream& os, const String& s);friend std::istream& operator>>(std::istream& is, String& s);// 静态成员函数static int HowMany();
};

String2.cpp方法定义文件

// 头文件
#include "String2.h"
#include <cctype>
#include <cstring>// using 声明
using std::endl;// 静态成员变量初始化
int String::num_strings = 0;String::String()  // 默认构造函数
{str = nullptr;len = 0;++num_strings;
}String::String(const char* s)
{len = strlen(s);// 申请空间str = new char[len + 1];strcpy(str, s);++num_strings;
}String::String(const String& s)  // 复制构造函数
{len = s.len;// 申请空间str = new char[len + 1];strcpy(str, s.str);++num_strings;}String::~String()  // 析构函数
{// 释放空间if (str != nullptr)delete[]str;
}int String::ch_times(char key) const  // 返回字符key在字符串中出现的次数
{int times = 0;for (int i = 0; i < len; ++i){if (str[i] == key)++times;}return times;
}void String::Stringlow()
{for (int i = 0; i < len; ++i){str[i] = tolower(str[i]);}
}void String::Stringupper()
{for (int i = 0; i < len; ++i){str[i] = toupper(str[i]);}
}String& String::operator=(const char* s)
{len = strlen(s);// 释放之前的空间delete[]str;// 申请新的空间str = new char[len + 1];strcpy(str, s);return *this;
}String& String::operator=(const String& s)
{len = s.len;// 释放之前的空间delete[]str;// 申请新的空间str = new char[len + 1];strcpy(str, s.str);return *this;
}char& String::operator[](int i)
{return str[i];
}const char& String::operator[](int i) const
{return str[i];
}String String::operator+(const String& s) const
{int total = len + s.len;// 申请空间char* result = new char[total + 1];strcpy(result, str);strcat(result, s.str);String tmp(result);// 释放空间delete[]result;return tmp;
}String operator+(const char* s, const String& str)
{int total = strlen(s) + str.len;// 申请空间char* result = new char[total + 1];strcpy(result, s);strcat(result, str.str);String tmp(result);// 释放空间delete[]result;return tmp;
}// 关系运算符重载
bool operator<(const String& s1, const String& s2)
{return (strcmp(s1.str, s2.str) < 0);
}bool operator>(const String& s1, const String& s2)
{return s2 < s1;
}bool operator==(const String& s1, const String& s2)
{return !strcmp(s1.str, s2.str);
}std::ostream& operator<<(std::ostream& os, const String& s)
{if (s.str != nullptr){os << s.str;}return os;
}std::istream& operator>>(std::istream& is, String& s)
{char tmp[String::CINLIM];is.getline(tmp, String::CINLIM);if (!is){is.clear();while (is.get() != '\n')continue;return is;}s = tmp;return is;
}// 静态成员函数
int String::HowMany()
{return num_strings;
}

运行结果
在这里插入图片描述

3. 重写程序清单10.7和程序清单10.8描述的Stock类,使之使用动态分配的内存,而不是string类对象来存储股票名称。另外,使用重载的operator<<()定义代替show()成员函数。再使用程序清单10.9测试新的程序。

答:使用动态内存分配,可以使用char*指针,也可以使用指向string类的指针。在构造函数中申请空间,在析构函数中释放空间,申请和释放的形式需要匹配。

Stock.h头文件

#pragma once// 头文件
#include <iostream>// Stock 类声明
class Stock
{
private:char* company;  // 股票公司名称int shares;  // 股票数量double share_val;  // 每份股票double total_val;  // 总值void set_tot() { total_val = share_val * shares; }  // 设置总值
public:Stock();  // 默认构造函数Stock(const char* co, int n, double pr);~Stock();  // 析构函数void buy(int num, double pr);  // 买进void sell(int num, double pr);  // 卖出void update(double pr);  // 更新价格// 运算符(<<)重载friend std::ostream& operator<<(std::ostream& os, const Stock& s);const Stock& topval(const Stock& s) const;  // 返回总值大的对象
};

main3.cpp测试文件

// 头文件
#include "Stock.h"// using 声明
using std::cin;
using std::cout;
using std::endl;// 符号常量声明
const int STKS = 4;int main()
{Stock stocks[STKS] = {Stock("NanoSmart", 12, 20.0),Stock("Boffo Objects", 200, 2.0),Stock("Monolithic Obelisks", 130, 3.25),Stock("Fleep Enterprises", 60, 6.5)};// 显示所有股票cout << "Stock holdings:\n";for (int i = 0; i < STKS; ++i)cout << stocks[i];// 找出总值最大的股票const Stock* top = &stocks[0];for (int i = 1; i < STKS; ++i)top = &top->topval(stocks[i]);cout << "\nMost valuable holding:\n";cout << *top << endl;return 0;
}

Stock.cpp方法定义文件

// 头文件
#include "Stock.h"
#include <cstring>// using 声明
using std::cout;
using std::endl;Stock::Stock()  // 默认构造函数
{company = nullptr;shares = 0;share_val = 0;set_tot();
}Stock::Stock(const char* co, int n, double pr)
{// 申请空间,拷贝公司名称int len = (int)strlen(co);company = new char[len + 1];strcpy(company, co);// 赋值其他成员shares = n;share_val = pr;set_tot();
}Stock::~Stock()  // 析构函数
{// 释放申请空间if (company != nullptr)delete[]company;
}void Stock::buy(int num, double pr)  // 买进
{if (num > 0){shares += num;share_val = pr;set_tot();}else{cout << "买进股票的数量不能为负";}
}void Stock::sell(int num, double pr)  // 卖出
{if (num < 0){cout << "卖出股票的数量不能为负";}else if (num > shares){cout << "卖出股票的数量不能超过自身拥有的股票数量";}else{shares -= num;share_val = pr;set_tot();}
}void Stock::update(double pr)  // 更新价格
{share_val = pr;
}// 运算符(<<)重载
std::ostream& operator<<(std::ostream& os, const Stock& s)
{os << "Company: " << s.company;os << " Shares: " << s.shares << endl;os << "  Share Price: $" << s.share_val;os << " Total Worth: $" << s.total_val << endl;return os;
}const Stock& Stock::topval(const Stock& s) const  // 返回总值大的对象
{if (total_val > s.total_val)return *this;elsereturn s;
}

4. 请看程序清单10.10定义的Stack类的变量。

#pragma once// 头文件
#include <iostream>// 类型声明
typedef unsigned long Item;// Stack 类声明
class Stack
{
private:enum { MAX = 10 };Item* pitems;int size;int top;
public:Stack(int n = MAX);Stack(const Stack& st);~Stack();bool isempty() const;bool isfull() const;bool push(const Item& item);bool pop(Item& item);Stack& operator=(const Stack& st);void get_info() const;
};

正如私有成员表明的,这个类使用动态分配的数组来保存栈中的项。请重新编写方法,以适应这种新的表示方法,并编写一个程序来演示所有的方法,包括复制构造函数和赋值运算符。

答:头文件上面有,这里就提供测试文件和方法定义文件。

main4.cpp测试文件

// 头文件
#include "Stack.h"// using 声明
using std::cout;
using std::endl;int main()
{// 默认构造函数Stack stack1;for (int i = 0; i < 5; ++i){stack1.push(i);}stack1.get_info();cout << endl;// 复制构造函数Stack stack2(stack1);stack2.get_info();cout << endl;Item tmp;stack2.pop(tmp);stack2.pop(tmp);stack2.get_info();cout << endl;// 赋值运算符stack1 = stack2;stack1.get_info();return 0;
}

Stack.cpp方法定义文件

// 头文件
#include "Stack.h"// using 声明
using std::cout;
using std::endl;Stack::Stack(int n)
{if (n > MAX){size = MAX;}else if (n > 0){size = n;}else{cout << "栈的大小不能为非正整数\n";size = top = 0;pitems = nullptr;return;}// 申请空间pitems = new Item[size];top = 0;
}Stack::Stack(const Stack& st)
{size = st.size;// 申请空间pitems = new Item[size];top = st.top;// 复制每个元素for (int i = 0; i < top; ++i)pitems[i] = st.pitems[i];
}Stack::~Stack()
{// 释放空间if (pitems != nullptr)delete pitems;
}bool Stack::isempty() const
{return top == 0;
}bool Stack::isfull() const
{return top == size;
}bool Stack::push(const Item& item)
{if (!isfull()){pitems[top++] = item;return true;}else{return false;}
}bool Stack::pop(Item& item)
{if (!isempty()){item = pitems[--top];return true;}else{return false;}
}Stack& Stack::operator=(const Stack& st)
{if (&st == this){return *this;}else{// 释放之前的空间delete[]pitems;// 申请新的空间size = st.size;pitems = new Item[size];// 赋值内容top = st.top;for (int i = 0; i < top; ++i){pitems[i] = st.pitems[i];}return *this;}
}void Stack::get_info() const
{if (pitems != nullptr){for (int i = 0; i < top; ++i){cout << pitems[i] << " ";}}
}

后面两题的答案作者没写,因为目前不是很懂,这些编程练习的答案都是我自己写的,然后运行验证的。作者今天就不加班了,偷个懒,明天早上把这两道题补上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VirtualBox+Ubuntu22.10+Docker+ROS2

Docker 拉取ros2镜像 docker pull osrf/ros:foxy-desktop 运行 docker run -it --nameros2 -p 50022:22 osrf/ros:foxy-desktop 进入容器安装组件 apt-get update apt-get install vim apt-get install git apt-get install net-tools # 安装ssh apt-get install openssh…

centos下给es7.12.1设置密码

安装可参考&#xff1a; centos7下安装elasticsearch7.8.1并配置远程连接_在一台服务器centos7上安装和配置elasticsearch。-CSDN博客 1、先停掉es进程 2、设置输入密码后访问配置 cd /home/soft/elasticsearch-7.12.1/config vim elasticsearch.yml 3、启动es服务 cd /home/…

香橙派 AIpro开发板初上手

一、香橙派 AIpro开箱 最近拿到了香橙派 AIpro&#xff08;OrangePi AIpro&#xff09;&#xff0c;下面就是里面的板子和相关的配件。包含主板、散热组件、电源适配器、双C口电源线、32GB SD卡。我手上的这个是8G LPDDR4X运存的版本。 OrangePi AIpro开发板是一款由香橙派与华…

在Python中实现限定抽奖次数的机制

目录 一、引言 二、需求分析 三、设计思路 四、代码实现 4.1 使用字典存储用户抽奖次数 4.2 使用数据库存储用户抽奖次数 五、扩展与优化 六、总结 一、引言 在当今互联网应用中&#xff0c;抽奖系统作为吸引用户、提高用户参与度和活跃度的重要手段&#xff0c;已经被…

为什么配置了安全组还是有攻击进来?

面对DDoS攻击&#xff0c;即使配置了安全组规则来限制入站流量&#xff0c;攻击者仍可能找到绕过这些基本防护措施的方法&#xff0c;尤其是当攻击流量巨大时。这是因为安全组主要工作在网络层和传输层&#xff0c;它们依据IP地址、协议和端口号来过滤流量&#xff0c;对于应用…

Android14 WMS-窗口添加流程(一)-Client端

窗口布局在onCreate方法中通过setContentView(R.layout.xxx)加载&#xff0c;但窗口的显示并不是在wm_on_create_called中, 而是在wm_on_resume_called后&#xff0c;也就是说应用onResume时此窗口是不可见的&#xff0c;真正可见是当此window窗口的mDrawState变化状态从NO_SUR…

Raven2掠夺者2渡鸦2游戏预约注册教程 账号注册教程

《渡鸦2》是一款源自韩国的创新力作&#xff0c;作为《Raven》系列的最新续篇&#xff0c;这款游戏在MMORPG手游领域内再度扩展了其标志性的暗黑奇幻宇宙&#xff0c;融入了大量革新的游戏设计与丰富内容。定档于2024年5月29日开启公测的《渡鸦2》&#xff0c;正处在紧张刺激的…

blender复制uv贴图

1、新建两个猴头 2、点击其中一个进入uv编辑模式 3、在uv编辑中打开一个图像 4、新建一个材质球&#xff0c;将图像渲染到模型上 打开图像纹理 选择刚才打开的图像 切换到材质预览模式后&#xff0c;就可以看到贴图了 5、选择一个孤岛 6、然后选择拼排孤岛 可以看到该模型展开…

【全开源】JAVA人力资源招聘社会校招类型招聘系统校园招聘PC端

塑造企业高效招聘新体验 一、源码简介 招聘PC端源码&#xff0c;一款面向企业的招聘管理系统解决方案。它拥有完整的招聘流程管理功能&#xff0c;从职位发布到候选人管理&#xff0c;再到面试安排与结果反馈&#xff0c;所有环节都通过直观易用的界面进行展现&#xff0c;大…

Vivado打开之前项目仿真过的波形文件

第一步&#xff1a;顶部菜单 点击&#xff1a;Open Static Simulation 然后在弹出的窗口找到.sim结尾的文件夹&#xff0c;在里面找到wdb结尾的文件&#xff0c;点击ok 第二步&#xff1a;依次点击下方红圈 找到wcfg结尾的文件&#xff0c;点击ok即可

第十三届蓝桥杯国赛大学B组填空题(c++)

A.2022 动态规划 AC; #include<iostream> #define int long long using namespace std; int dp[2050][15]; //dp[i][j]:把数字i分解为j个不同的数的方法数 signed main(){dp[0][0]1;for(int i1;i<2022;i){for(int j1;j<10;j){//一种是已经分成j个数,这时只需每一个…

坦克飞机大战项目详解:从包结构到测试发布

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、项目初始化与包结构构建 代码案例&#xff1a; 二、资源文件与配置文件管理 代码案例…

MySQL简单测试和安装

MySQL 的特点 1、MySQL 性能卓越、服务稳定&#xff0c;很少出现异常宕机。 2、MySQL开放源代码且无版权制约&#xff0c;自主性及使用成本低。 3、MySQL历史悠久(版本众多)&#xff0c;用户使用活跃&#xff0c;遇到问题可以寻求帮助。 4、MySQL体积小(相对大型关系型数据库)…

linux安装mysql后,配置mysql,并连接navicate软件

Xshell连接登陆服务器 输入全局命令 mysql -u root -p 回车后&#xff0c;输入密码&#xff0c;不显示输入的密码 注意mysql服务状态&#xff0c;是否运行等 修改配置文件my.cnf&#xff0c;这里没找到就找my.ini&#xff0c;指定有一个是对的 find / -name my.cnf 接下…

【Web】浏览器指纹:追踪用户的新技术

目录 什么是浏览器指纹&#xff1f;浏览器指纹的原理浏览器指纹的应用使用JavaScript获取浏览器指纹总结 在这个数字化时代&#xff0c;用户隐私和网络安全成为了人们日益关注的话题。而浏览器指纹作为一种追踪用户的新技术&#xff0c;正逐渐受到人们的关注。本文将详细介绍浏…

26计算机操作系统408考研--操作系统处理机调度篇章(五)

文章目录 一、调度简介死锁一、调度简介 计算机系统中,处理器和内存资源会出现供不应求的情况,特别是多个I/O设备与主机交互,作业不断进入系统,或者是多个批处理作业在磁盘的后备队列中等待进入内存的情况。操作系统在管理有限的资源的同时,需要考虑如何选取进入内存的作…

IS-IS开销值和协议优先级

原理概述 IS-IS 协议为路由器的每个 IS-IS 接口定义并维护了一个 Level-1开销值和一个 Level-2开销值。开销值可以在接口上或者全局上手动配置&#xff0c;也可以使用 Auto-Cost 自动计算确定。开销值的优先顺序为&#xff1a;接口上手动配置的开销值&#xff0c;全局上手动配置…

热门项目朋友聚会喝酒热场小游戏小程序源码系统 带完整的安装代码包以及搭建教程

系统概述 朋友聚会喝酒热场小游戏小程序源码系统是一款专门为朋友聚会场景设计的互动娱乐工具。它旨在为用户提供一系列有趣的小游戏&#xff0c;帮助提升聚会的氛围和趣味性&#xff0c;让朋友们在轻松愉快的环境中度过美好时光。本系统采用先进的技术架构&#xff0c;具备高…

TensorRT部署模型基本步骤(C++)

TensorRT部署模型基本步骤&#xff08;C&#xff09; 文章目录 TensorRT部署模型基本步骤&#xff08;C&#xff09;前言一、onnx模型转engine1.基于C代码生成engine2.基于trtexec.exe命令行生成 二、读取本地模型三、创建推理引擎四、创建推理上下文五、创建GPU显存缓冲区六、…

惯性测量单元M-G370系列广泛用于工业系统各个领域

爱普生现已推出型号为M-G370系列的高稳定性、高精度及极小尺寸封装的惯性测量单元(IMU)&#xff0c;可广泛应用于工业系统的各个领域。 为了节省PCB的面积和产品空间&#xff0c;M-G370系列性测量单元设计精巧&#xff0c;且具有6个自由度:三轴角速率和三轴线性加速度&…