change some style

This commit is contained in:
gameloader 2022-10-12 12:43:19 +08:00
parent fca46062d7
commit c8ebc260f5

View File

@ -9,9 +9,8 @@ author = "Logic"
1. str大小为指针的大小即8字节p的大小也为指针的大小即8字节。因为C++传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。创建一个数组,数组名实际为一指针变量,指向该数组的起始地址。
2. 运行测试的结果为段错误。这是因为p是形参p相当于str指针的复制在函数内部new申请新内存后将内存地址赋给p并不会改变str指针的值。故str指针仍为NULL则在将数据复制到str指针指向的地址时会段错误。
3. 运行结果为一串未知字符这是因为函数内部申请的变量为局部变量其作用域仅限于函数执行过程中在函数执行结束后局部变量即这里的p指向的栈空间中的内存区域就会被释放返回值只是p指针的拷贝指向原来p指向的地址。此时返回的指针指向的地址中的数据是不确定的故可能会打印出一串未知字符或出现错误。
4. 会正常打印出“你好世界”。
5. 会打印出“世界”因为使用new在堆上分配了内存后str指向分配的这片内存即str保存了这片内存的起始地址而使用delete清理这片内存只是回收了这片内存空间并没有将str指针重置。str仍然指向这片内存空间则str并非空指针strcpy可以正常的复制字符串printf也可以正常打印输出。
3. 运行结果为一串未知字符这是因为函数内部申请的变量为局部变量其作用域仅限于函数执行过程中在函数执行结束后局部变量即这里的p指向的栈空间中的内存区域就会被释放返回值只是p指针的拷贝指向原来p指向的地址。此时返回的指针指向的地址中的数据是不确定的故可能会打印出一串未知字符或出现错误。 4. 会正常打印出“你好世界”。
4. 会打印出“世界”因为使用new在堆上分配了内存后str指向分配的这片内存即str保存了这片内存的起始地址而使用delete清理这片内存只是回收了这片内存空间并没有将str指针重置。str仍然指向这片内存空间则str并非空指针strcpy可以正常的复制字符串printf也可以正常打印输出。
## 第三次作业 {#第三次作业}
@ -33,11 +32,14 @@ author = "Logic"
```
编译运行如下
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1004jRF7OH.png)
查看文件内容如下
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1004TxWH43.png)
1. **声明一个dog类包含体重合年龄两个成员变量及相应的成员两数声明一个实例dog1.体重为5年龄为10使用I/O流把dog1的状态写入磁盘文件再声明另一个实例dog2通过读文件把dog1的状态赋给dog2。分别使用文本方式和二进制方式操作文件看看有何不同再看看磁盘文件的ASCI码有何不同。**
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1004jRF7OH.png" >}}
查看文件内容如下
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1004TxWH43.png" >}}
2. **声明一个dog类包含体重合年龄两个成员变量及相应的成员两数声明一个实例dog1.体重为5年龄为10使用I/O流把dog1的状态写入磁盘文件再声明另一个实例dog2通过读文件把dog1的状态赋给dog2。分别使用文本方式和二进制方式操作文件看看有何不同再看看磁盘文件的ASCI码有何不同。**
这个题只是在第一个题的基础上结合面向对象编程,简单的声明一个类并构造两个成员函数,一个用于修改对象的信息,一个用于打印对象的信息。在打开文件流的时候用两种不同的方式打开文件流即可。
@ -107,12 +109,16 @@ int main() {
```
运行结果为
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1007fXhkIJ.png)
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1007fXhkIJ.png" >}}
用文本编辑器打开test2.txt和test3.txt得
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1007LKkmym.png)
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1007LKkmym.png" >}}
这里并没有显示出什么差异主要是因为对于可见字符来说使用二进制方式和文本方式差异不大但是对于一些不可见字符如文件的文件头等二进制读取方式会将数据原封不动的读取出来而文本则会处理为文本后读取因为txt文件除了编码类型外无文件头所以二者没什么区别但对于其他有格式文件来说可能就会存在区别另外以文本方式打开时遇到结束符CTRLZ(0x1A)就认为文件已经结束。所以,若使用文本方式打开二进制文件,就很容易出现文件读不完整,或內容不对的错误。即使是用文本方式打开文本文件,也要谨慎使用,比如复制文件,就不应该使用文本方式。
1. **编写程序提示用户输入一个十进制整数.分别用十进制、八进制、和十六进制形式输出。**
3. **编写程序提示用户输入一个十进制整数.分别用十进制、八进制、和十六进制形式输出。**
对进制进行转换可以使用短除反取余的方式除对应进制数然后反向取余数即可。但是如果用int 或者long int类型存储输入的十进制数并进行转换能转换的数字大小是有限的在考虑可能有大整数的情况下使用字符串存储并进行大整数的模数运算从而实现了大整数的进制转换。该程序可以输入任意大的整数都可以完成进制转换。
@ -236,9 +242,10 @@ int main(int argc, char *argv[]) {
```
运行结果图如下
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1011Jy1fbS.png)
1. **编写程序实现如下功能:打开指定的一个文木文件,在每一个行前加行号。**
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1011Jy1fbS.png" >}}
4. **编写程序实现如下功能:打开指定的一个文木文件,在每一个行前加行号。**
本题考察C++基本的文件IO和文件指针比较方便的做法是用一个中间文件首先读取原文件的内容每读取一行加一个行号并写入到中间文件中最后将加了行号的中间文件内容再写入原文件并删除中间文件。
@ -291,12 +298,16 @@ int main() {
```
效果如下,原文件内容为
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1011AbNMl5.png)
运行程序后,文件内容为
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1011d5ZAut.png)
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1011FgrC32.png)
1. **定义一个保存学生信息的结构体STUDENT包含的学生信息有学号、姓名、专业和平均分。其中学号和平均分使用整型姓名和专业使用宁符数组。使用动态数组存储学生信息并编写菜单实现学生信息的录入、删除和显示功能。由手录入学生的数量未知因此要使用new运算符实现动态内存的分配、使用delete运算符实现动态内存的回收。另外使用标准流对象cin和cout完𢦓数据的输入输出使用函数重载(例如添加学生到数组时可以采用不同的参数列表、显示学生信息时可以指定成绩区间等)、默认形参、引用变量;以上功能实现在自定义的名字空间中(建议使用学号做名字空间)。**
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1011AbNMl5.png" >}}
运行程序后,文件内容为
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1011d5ZAut.png" >}}
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1011FgrC32.png" >}}
5. **定义一个保存学生信息的结构体STUDENT包含的学生信息有学号、姓名、专业和平均分。其中学号和平均分使用整型姓名和专业使用宁符数组。使用动态数组存储学生信息并编写菜单实现学生信息的录入、删除和显示功能。由手录入学生的数量未知因此要使用new运算符实现动态内存的分配、使用delete运算符实现动态内存的回收。另外使用标准流对象cin和cout完𢦓数据的输入输出使用函数重载(例如添加学生到数组时可以采用不同的参数列表、显示学生信息时可以指定成绩区间等)、默认形参、引用变量;以上功能实现在自定义的名字空间中(建议使用学号做名字空间)。**
定义命名空间为zqy19281235定义STUDENT结构体定义添加学生函数使用默认形参和引用变量。考虑到学号的唯一性使用map模板来存储学生信息。并将map通过引用传入函数通过学号删除学生信息并释放申请的内存重载显示学生信息的函数当不输入指定的成绩区间时默认全部显示当输入指定成绩区间时可以仅指定最大值或者最小值另一个使用默认形参进行处理。代码如下
@ -433,10 +444,17 @@ int main() {
功能展示如下:
- 添加学生
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1012YB8d7l.png)
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1012YB8d7l.png" >}}
- 显示学生信息(无限制)
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1012NSCVin.png)
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1012NSCVin.png" >}}
- 显示学生信息(有限制)
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1012JkQKxs.png)
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1012JkQKxs.png" >}}
- 删除学生信息
![](https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1012uB9SkP.png)
{{< figure src="https://gcore.jsdelivr.net/gh/game-loader/picbase@master/uPic/1012uB9SkP.png" >}}