- 博客(50)
- 资源 (4)
- 收藏
- 关注
原创 编译原理实验二 语法分析
直接上代码 #include <iostream> #include <stdlib.h> using namespace std; #define STACKSIZE 50 #define STACKINCREMENT 10 char ch; int i=0;//记录位置 char str[80]; typedef struct { char *base; char *top; int stacksize; }SqStack; int InitStack(S
2022-05-22 20:05:13
1027
原创 编译原理实验一 词法分析
直接上代码 #include <stdio.h> #include <stdlib.h> #include <string.h> char *KT[32]={"auto","break","case","char","const","continue","default","do", "double","else","enum","extern","float","for","goto","if", "int","long","register","return","
2022-05-22 20:04:02
360
原创 数据结构实验五
STL的栈stack类 程序的功能:STL的栈stack类 (1)实现STL的栈stacke类。 (2)栈stacke类的简单应用。 输入的形式和输入值的范围:对于不同的功能函数输入形式不一样,可以按功能分为整型数字,与字符串等数据类型,本程序选取栈的进制转换作为应用,故为整型数据。 输出的形式:输出入栈过程及转化后的结果 测试数据:符合要求的十进制整数 /*模拟栈的基本实现*/ #include<iostream> #include<cstdlib> #inclu..
2021-09-23 19:11:16
323
原创 数据结构实验四
三阶B-树应用 程序的功能:应用3阶B-树,对图书馆的图书进行简单管理。采用3阶B-树存储结构,以书号为关键字,完成图书的入库、出库和查询操作。程序从文本文件中读取图书的书号,在完成入库出库操作后退出系统时可以把书号再保存到文本文件中。 输入的形式和输入值的范围:书号为整型数据,输入大于0的正整数。 输出的形式:进行入库、出库、查询操作时会输出操作结果或查询结果,如“添加成功”。 测试数据:对原文件中已有的书号进行删除,原文件中没有的书号进行添加,再入库出库过程中进行查询操作以验证操作是否正确执行,
2021-09-23 19:10:33
455
原创 数据结构实验三
图遍历生成树演示 程序的功能: 通过对连通图和非连通图的遍历,可以访问图中全部结点。可以输出该图的邻接矩阵以及该图的邻接表,可以进行广度优先遍历或深度优先遍历生成树。可以实现删除一个结点的操作。 输入的形式和输入值的范围:输入顶点个数以及边的个数,每条边的权值默认为1,每个都是整型变量,即int型变量。 输出的形式: 1.如果输出邻接矩阵,是等于顶点个数的行数与列数,如果权值不存在即输出0 2.如果输出的是邻接表,即用箭头指向,边表指向与顶点存在边的顶点 3.广度与深度优先输出的是一行整型数字,并
2021-09-23 19:09:28
514
原创 数据结构实验二
迷宫问题 程序的功能:有一个M×N的迷宫,以0和1分别表示通道和障碍。实现求从入口到出口的任意通道和最佳路径。操作者可以输入一个符合要求的迷宫,程序界面会以图形的形式显示出迷宫的样式,可以对该迷宫进行求解,并输出所有从起点到达终点的简单路径以及所花步数最少的路径即最优路径,当有多个步数相同的最优路径时能同输出所有最优路径。 输入的形式和输入值的范围:输入迷宫的行数和列数,范围在4-10之间,输入对应的迷宫,以0和1分别表示通道和障碍。 输出的形式:路径上每点的坐标,最优路径的序号。 测试数据:符合.
2021-09-23 19:07:45
320
原创 数据结构实验一 线性表的应用
程序的功能:设计一个简单的复数四则运算计算器,可以实现复数的加法减法和乘法运算,并可以在上一步运算结果的基础上进行进一步运算或退出本次运算。 输入的形式和输入值的范围:输入符合a+bi形式的复数(其中实部a与虚部b均为绝对值小于1000的int型整数),输入字符串选择运算方式(加、减、乘)。 输出的形式:符合a+bi形式的复数。 测试数据:包括一般复数和只有实部或虚部的复数,进行多步运算检验结果的正确性。 抽象数据类型的定义:采用链表数据结构存储输入的复数,其中数据域包括复数的实部和虚部。 主.
2021-08-23 10:12:17
1463
原创 C++异常处理
若有异常则通过throw操作创建一个异常对象并抛掷。 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。 catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。 如果匹配的处理器未找到,则运行库函数terminate将被自动调用,其缺省功能是调用abort终
2021-08-08 13:19:07
134
原创 C++流类库与输入输出
I/O流的概念 当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象。 流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。 程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。 读操作在流数据抽象中被称为(从流中)提取,写操作被称为(向流中)插入。 预先定义的输出流对象:cout 标准输出 cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出。 clog 类似于cer
2021-08-07 16:58:43
333
原创 C++实验四
实验要求: 1.定义Point类,有坐标_x,_y两个成员变量;对Point类重载“++”(自增)、“――”(自减)运算符,实现对坐标值的改变。 2.定义一个车(vehiele)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。观察虚函数的作用。 题目一 编写程序定义Point类,在类中定义整型的私有成员变量_x、_y,定义成员函数Po
2021-08-07 10:42:37
3700
原创 C++实验三
实验要求: 1.定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程尝试,并在本次报告的心得中说明对该问题的理解。 2.定义一个基类BaseClass,有整型变量Number,构造其派生类DerivedClass(其中派生类有一基类BaseClass对象的私有成员,即 ),观察构造函数和析构函数的执行情况(在构造函数和析构函数中用cou...
2021-08-07 10:08:10
4363
原创 C++模板
函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。 声明方法: template <typename 标识符> 函数声明 例:求绝对值的函数模板 #include<iostream> using namespace std; template<typename T> T abs(T x) { return x<0?-x:x; } int main() { int n=-5; double d.
2021-07-31 15:16:44
116
原创 运行时类型识别
运行时类型识别 允许在运行时通过基类指针(或引用)辨别对象所属的具体派生类; 只对多态类型适用; 比虚函数动态绑定的开销更大,因此应仅对虚函数无法解决的问题使用。 运行时类型识别的方式 用dynamic_cast做类型转换的尝试; 用typeid直接获取类型信息。 dynamic_cast的使用: 语法形式 dynamic_cast<目的类型>(表达式) 功能 将基类指针转换为派生类指针,将基类引用转换为派生类引用; 转换是有条件的 如果指针(或引用)所指对象的实际类型与转换的目
2021-07-29 13:28:23
256
原创 C++抽象类
带有纯虚函数的类称为抽象类: class 类名 { virtual 类型 函数名(参数表)=0; //纯虚函数 ... } 作用:抽象类为抽象和设计的目的而声明,将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为。 对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。 注意:抽象类只能作为基类来使用。 不能声明抽象类的对象。 构造函数不能是虚函数,析构函数可以是虚函数。...
2021-07-29 12:19:02
367
原创 C++虚函数
虚函数是动态绑定的基础,是非静态的成员函数。 在类的声明中,在函数原型之前写virtual。 virtual 只用来说明类声明中的原型,不能用在函数实现时。 具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。 本质:不是重载声明而是覆盖。 调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。 例; #include <iostream> using namespace std; class Base1 { //基类Base1定.
2021-07-29 10:26:53
197
原创 C++运算符重载
运算符重载是对已有的运算符赋予多重含义 必要性 C++中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类) 实现机制 将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。 编译系统对重载运算符的选择,遵循函数重载的选择原则。 可以重载C++中除下列运算符外的所有运算符: . .* :: ?: 只能重载C++语言中已有的运算符,不可臆造新的。 不改变原运算符的优先级和结合性。 不能改变操作数个数。 经重载的运算符,其操作数中至少应该有一个...
2021-07-29 10:21:27
281
原创 C++二义性问题
在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性)——采用虚函数或同名隐藏规则来解决。 当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性——采用虚基类来解决。 问题举例: class A { public: void f(); }; class B { public: void f(); void g() }; class C: public A, piblic B { public: void g();
2021-07-28 16:35:23
1068
原创 C++多继承
多继承时派生类的声明: class 派生类名:继承方式1 基类名1, 继承方式2 基类名2,... { 成员声明; } 例: class A { public: void setA(int); void showA() const; private: int a; }; class B { public: void setB(int); void showB() const; private: int b; }; class C : public A, private...
2021-07-28 10:47:54
211
原创 C++浅拷贝和深拷贝
浅拷贝 实现对象间数据元素的一一对应复制。 深拷贝 当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制。
2021-07-27 15:01:09
74
原创 C++类型兼容
一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。 具体表现在: 派生类的对象可以隐含转换为基类对象。 派生类的对象可以初始化基类的引用。 派生类的指针可以隐含转换为基类的指针。 通过基类对象名、指针只能使用从基类继承的成员。 例: #include <iostream> using namespace std; class Base1 { //基类Base1定义 public: void display() const { cout << "Base1:
2021-07-27 14:57:33
206
原创 C++类的继承与派生
派生类的声明 class 派生类名:继承方式 基类名 { 成员声明; } 不同继承方式的影响主要体现在: 派生类成员对基类成员的访问权限 通过派生类对象对基类成员的访问权限 三种继承方式: 公有继承 私有继承 保护继承 公有继承(public): 基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。 派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。 ...
2021-07-27 13:37:03
185
原创 C++实验二
题目一 编写矩阵转置函数,输入参数为3*3整形数组,使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入、输出。 #include <iostream> using namespace std; int main() { int a[3][3],i,j; for(i=0;i<3;i++)for(j=0;j<3;j++)cin>>a[i][j]; for(j=0;j<3;j++){f.
2021-07-27 12:26:02
3980
1
原创 C++ getline函数
输入整行字符串 用cin的>>操作符输入字符串,会以空格作为分隔符,空格后的内容会在下一回输入时被读取 用string头文件中的getline可以输入整行字符串,例如: getline(cin, s2); 以其它字符作为分隔符输入字符串 输入字符串时,可以使用其它分隔符作为字符串结束的标志(例如逗号、分号) 把分隔符作为getline的第3个参数即可,例如: getline(cin, s2, ','); 例: include <iostream> #include &l
2021-07-26 17:20:47
1218
2
原创 C++动态存储分配
动态申请内存操作符 new new 类型名T(初始化参数列表) 功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。 结果值:成功:T类型的指针,指向新分配的内存;失败:抛出异常。 释放内存操作符delete delete 指针p 功能:释放指针p所指向的内存。p必须是new操作的返回值。 例: #include <iostream> using namespace std; class Point { public: Point() : x(0),.
2021-07-26 16:26:28
342
原创 C++this指针
隐含于每一个类的成员函数中的特殊指针。 明确地指出了成员函数当前所操作的数据所属的对象。 当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。 例如:Point类的getX函数中的语句: return x; 相当于: return this->x; ...
2021-07-26 15:45:03
155
原创 C++对象数组
声明: 类名 数组名[元素个数]; 访问方法: 通过下标访问 数组名[下标].成员名 对象数组初始化: 数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。 通过初始化列表赋值。 例: Point A[2]={Point(1,2),Point(3,4)}; 如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)。 数组元素所属类的构造函数: 不声明构造函数,则采用默认构造函数。 各元素对象的初值要求为相同的值时,可...
2021-07-26 11:56:43
332
原创 C++数组作为函数参数
数组元素作实参,与单个变量一样。 数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。 例:主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。 #include <iostream> using namespace std; void rowSum(int a[][4], int nRow) { for (int i = 0; i
2021-07-26 11:12:29
668
原创 C++常类型
常类型的对象必须进行初始化,而且不能被更新。 常引用:被引用的对象不能被更新。 const 类型说明符 &引用名 常对象:必须进行初始化,不能被更新。 类名 const 对象名 常数组:数组元素不能被更新。 类型说明符 const 数组名[大小] 常指针:指向常量的指针 例:常引用作形参 #include<iostream.h> void display(const double& r); int main() { double d(9.5); ...
2021-07-25 14:57:11
253
原创 C++友元
友元是C++提供的一种破坏数据封装和数据隐藏的机制。 通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。 可以使用友元函数和友元类。 为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。 友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问 private 和 protected成员 作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。 访问对象中的成员必须通过对象名。 友元函数举例: #in
2021-07-25 14:47:13
98
原创 C++静态成员
静态数据成员: 用关键字static声明 该类的所有对象维护该成员的同一个拷贝 必须在类外定义和初始化,用(::)来指明所属的类。 静态成员函数: 类外代码可以使用类名和作用域操作符来调用静态成员函数。 静态成员函数可以直接引用属于该类的静态数据成员或静态成员函数。 而访问非静态成员,必须通过对象名。 例:具有静态数据、函数成员的 Point类 #include <iostream.h> class Point //Point类声明 {public: //外部接口 Poin
2021-07-25 14:36:45
132
原创 C++对象的生存期
对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。 静态生存期: 这种生存期与程序的运行期相同。 在文件作用域中声明的对象具有这种生存期。 在函数内部声明静态生存期对象,要冠以关键字static 。 动态生存期: 块作用域中声明的,没有用static修是的对象是动态生存期的对象(习惯称局部生存期对象)。 开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。 ...
2021-07-25 14:28:52
524
原创 C++位域
位域的声明形式 数据类型说明符 成员名 : 位数; 位域的作用 通过“打包”,使类的不同成员共享相同的字节,从而节省存储空间。 注意事项 具体的打包方式,因编译器而异; 只有bool、char、int和枚举类型的成员,允许定义为位域; 节省空间,但可能增加时间开销。 例:设计一个结构体存储学生的成绩信息,需要包括学号、年级和成绩三项内容,学号的范围是0到99,999,999,年级分为freshman、sophomore、junior、senior四种,成绩包括A、B、C、D四个等级。 ..
2021-07-24 20:29:11
1237
原创 C++类组合
类中的成员数据是另一个类的对象。 可以在已有抽象的基础上实现更复杂的抽象。 类组合的构造函数设计 原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。 声明形式: 类名::类名(对象成员所需的形参,本类成员形参) :对象1(参数),对象2(参数),...... { 本类初始化 } 构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的构造函数。(析构函数的调用顺序相反) 初始化列表中未出现的内嵌对象,用默认构...
2021-07-24 20:26:04
605
原创 C++拷贝构造函数应用场景
1.当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。 int main() { Point a(1,2); Point b = a; //拷贝构造函数被调用 cout << b.getX() << endl; } 2.若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。 例如: void fun1(Point p) { cout << p.getX() << endl; ...
2021-07-24 20:03:23
420
原创 C++重载函数的声明与使用
C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。 例: 形参类型不同: int add(int x, int y); float add(float x, float y); 形参个数不同: int add(int x, int y); int add(int x, int y, int z); 重载函数的形参必须不同:个数不同或类型不同。 编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。 编译器不以形参名、返回值来区分。
2021-07-23 19:51:03
3039
原创 C++带缺省形参值的函数
函数在声明时可以预先给出缺省的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的缺省形参值。 例如: int add(int x = 5,int y = 6) { return x + y; } int main() { add(10,20);//10+20 add(10); //10+6 add(); //5+6 } 有缺省参数的形参必须在形参列表的最后,也就是说缺省形参值的右面不能有无缺省值的参数。因为调用时实参与形参的结合...
2021-07-23 19:44:43
2897
原创 C++内联函数声明与使用
声明时使用关键字 inline。 编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。 注意: 内联函数体内不能有循环语句和switch语句。 内联函数的声明必须出现在内联函数第一次被调用之前。 对内联函数不能进行异常接口声明。 例: #include <iostream> using namespace std; const double PI = 3.14159265358979; inline double calArea(double radius) {
2021-07-23 19:33:58
892
原创 C++引用作形参
引用(&)是标识符的别名,例如: int i, j; int &ri = i; //建立一个int型的引用ri,并将其 初始化为变量i的一个别名 j = 10; ri = j;//相当于 i = j; 声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。 一旦一个引用被初始化后,就不能改为指向其它对象。 引用可以作为形参,例: #include<iostream> using namespace std; void swap(int& ..
2021-07-23 19:30:34
2880
原创 投骰子的随机游戏
#include <iostream> #include <cstdlib> using namespace std; //投骰子、计算和数、输出和数 int rollDice() { int die1 = 1 + rand() % 6; int die2 = 1 + rand() % 6; int sum = die1 + die2; cout << "player rolled " << die1 << " + " <<..
2021-07-23 19:23:01
383
1
原创 C++类型转换
一、隐式类型转换 1.当参与运算的操作数必须是bool型时,如果操作数是其它类型,编译系统会自动将非0数据转换为true,0转换为false。 2.位运算的操作数必须是整数,当二元位运算的操作数是不同类型的整数时,也会自动进行类型转换。 3.赋值运算要求左值与右值的类型相同,若类型不同,编译系统会自动将右值转换为左值的类型。 二、显式类型转换 语法形式: 1.类型说明符(表达式) 2.(类型说明符)表达式 3.类型转换操作符<类型说明符>(表达式) 例:int(z), (int
2021-07-22 19:04:25
144
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人