C++笔记16:C++第七阶段:机房预约系统---返回引用vector<Orders>的bug解释
0913
机房预约系统
- 1.1 系统简介
- 1.2 身份简介
- 1.3 机房简介
- 1.4 系统具体需求:
- 1.5程序代码分析:
- 1.系统管理类:class ManageSystem
- ManageSystem.h:
- ManageSystem.cpp:
- 2.Person基类:class Persons
- Person.h:
- Person.cpp:
- 3.预约记录类:class Orders
- Person.h:
- Orders.cpp:
- 4.管理员类:class Managers
- Managers.h:
- Managers.cpp:
- 5.学生类:class Students
- Students.h:
- Students.cpp:
- 6.教师类:class Teachers
- Teachers.h:
- Teachers.cpp:
- **补充:为什么Person类中的`vector& saveToVector();`返回引用就会赋值失败???**
1.1 系统简介
学校现有几个规格不同的机房,由于使用时经常出现"撞车"现象,现开发一套机房预约系统,解决这一问题。
1.2 身份简介
分别有三种身份使用该程序:
学生:申请
使用机房,可以预约未来一周内的机房使用,预约的日期为周一至周五,预约时需要选择预约时段(上午、下午);
教师:审核
学生的预约申请,依据实际情况审核预约通过或者不通过;
管理员:给学生、教师创建账号
,所有申请订单每周
由管理员负责清空
。
1.3 机房简介
机房总共有3间:
1号机房 — 最大容量20人
2号机房 — 最多容量50人
3号机房 — 最多容量100人
1.4 系统具体需求:
首先进入登录界面,可选登录身份有:
- 学生代表
- 老师
- 管理员
- 退出
每个身份都需要进行验证后,进入子菜单:
- 学生需要输入 :学号、姓名、登录密码
- 老师需要输入:职工号、姓名、登录密码
- 管理员需要输入:管理员姓名、登录密码
学生具体功能:
- 申请预约 — 预约机房
- 查看自身的预约 — 查看自己的预约状态
- 查看所有预约 — 查看全部预约信息以及预约状态
- 取消预约 — 取消自身的预约,预约成功或审核中的预约均可取消
- 注销登录 — 退出登录
教师具体功能:
- 查看所有预约 — 查看全部预约信息以及预约状态
- 审核预约 — 对学生的预约进行审核
- 注销登录 — 退出登录
管理员具体功能:
- 添加账号 — 添加学生或教师的账号,需要检测学生编号或教师职工号是否重复
- 查看账号 — 可以选择查看学生或教师的全部信息
- 查看机房 — 查看所有机房的信息
- 清空预约 — 清空所有预约记录
- 查看所有预约 — 查看全部预约信息以及预约状态
- 注销登录 — 退出登录
1.5程序代码分析:
1.系统管理类:class ManageSystem
ManageSystem.h:
#pragma once
#include"Managers.h"
#include"Students.h"
#include"Teachers.h"#define filePath_student "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\student.txt"
#define filePath_manage "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\admin.txt"
#define filePath_teacher "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\teacher.txt"class ManageSystem {public:bool flag_exit;//退出系统的标志ManageSystem();//构造函数~ManageSystem();//析构函数void showMenu();//显示菜单void controlProgress();//控制系统流程void exitSystem();//退出系统void studentModule(); //学生模块void teacherModule(); //教师模块void managerModule();//管理员模块};
补充:学生模块、教师模块、管理员模块
进入三个模块的操作界面(controlPro()
)都要进行验证登录makeSureLogIn()
,这部分在他们的父类Person类中实现;
ManageSystem.cpp:
#include"ManageSystem.h"
2.Person基类:class Persons
类中包含的内容为所有子类所共有的信息(其实就相当于三个子类的全局变量或者全局函数放到父类中,大家继承后都可以直接调用):
Person.h:
#pragma once
#include<iostream>
#include<string>
#include<fstream>
#include<sstream>
#include<vector>
#include<map>
#include"Orders.h"using namespace std;
class Persons {public:string name;//姓名string password;//登录密码string filePath_student = "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\student.txt";string filePath_manage = "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\admin.txt";string filePath_teacher = "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\teacher.txt";string filePath_comRoom = "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\computerRoom.txt";string filePath_reserveFile = "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\reserveFile.txt";Persons();~Persons();void controlPro();//学生、老师、管理员都有各自的功能和控制流程int getNum();//获取文件中的行数void showAllBooking(); //查看所有预约vector<Orders> saveToVector(string filePath);//把文件中的所有内容保存到一个vector容器中void pritnVector(vector<Orders>& v);//打印容器vector<Orders>& vvoid saveFile(vector<Orders>& v);//保存预约记录到文件中void changeStatus(int xuhao, int newStatus);//改变文件中第xuhao行记录的状态,并且保存到文件中bool makeSureLogIn(int num, string name, string password, string filePath);//登录验证---学生、教师、管理员void saveFile(int num, string name, string password, string filePath);//保存文件:管理员创建的学生/教师信息int strToInt(string str);//string->intstring outputStatus(string status);//输出预约状态
};
补充:
一、vector saveToVector(string filePath);
读取预约记录文件,把文件中的所有内容保存到一个vector容器中,有用到这个函数的地方有:
Person类中的查看所有预约函数、改变状态函数;
Managers类中的获取机房剩余容量函数;
Teachers类中的审核预约函数;
Students类中的查看我的预约、取消预约。
二、void saveFile(vector& v);
保存预约记录到文件中,
①在申请预约的时候一次只会保存一条预约记录到文件中,且不止一次调用此成员函数,所以ofs.open(filePath_reserveFile, ios::out| ios::app);
②但在修改预约状态的时候会将文件中所有预约状态保存到vector中,相当于重写整个预约状态的文件,所以ofs.open(filePath_reserveFile, ios::out );
因此在函数中先判断参数v的大小(v.size()
)是否大于1,
if (v.size() > 1) {②}else{①}
三、void changeStatus(int xuhao, int newStatus);
把文件中第xuhao行的预约记录状态改为newStatus,并且保存到文件中
修改状态包括将(审核中/已通过的)预约状态改为取消状态1->0;2->0
和 将审核中的状态改为通过/未通过1->2;1->-1;
,所以
//形参xuhao表示要修改的预约记录在文件中的第几行
//形参newStatus表示将预约状态改成什么(0取消、2通过、-1不通过)
四、bool makeSureLogIn(int num, string name, string password, string filePath);
登录验证—学生、教师、管理员:
形参分别是账号(学号、职工号)、用户名、密码、要验证的文件路径,在函数中对账号做个判断,是-1
说明是管理员,因为管理员没有账号,所以直接输入-1
五、void saveFile(int num, string name, string password, string filePath);
保存文件:管理员创建的学生/教师信息
在Managers类中的添加账号有用
到,参数里包括账号(学号、职工号)、用户名、密码、要保存到的文件路径,因为只会创建学生和教师信息,所以不涉及账号有可能为-1的情况
六、int strToInt(string str);
类型转换:string->int。读取文件时都是string类型,需要把类型转换成int型才方便使用
七、string outputStatus(string status);
输出预约状态:从文件中读到的是string型数字(0、1、2、-1),先转换成int型数字,再利用switch转换成string型预约状态(已取消、审核中、已通过、未通过)。
Person.cpp:
#include"Person.h"
3.预约记录类:class Orders
预约记录文件中保存七项内容,全部放到Orders类中:
Person.h:
#pragma once
#include<iostream>
#include<string>
#include<sstream>
#include<vector>using namespace std;class Orders {public:int xuhao; //序号int zhouji; //周几int shangwuxiawu; //上午下午int xuehao; //学号string xingming; //姓名int jifanghao; //机房号int yuyuezhuangtai; //预约状态Orders();Orders(int xuhao,int zhouji,int shangwuxiawu,int xuehao,string name,int jifanghao,int status);//~Orders();//输出单条记录void printSingleOrder();
};
void printSingleOrder();
输出单条记录函数在Students类中的查看我的预约
和Managers类中的获取机房剩余容量
中有应用到。
Orders.cpp:
#include"Orders.h"
#include"Person.h"//这个不能少,因为会用到Person类
注意:Orders.cpp文件中要包含Person类的头文件,否则会报错!!!
4.管理员类:class Managers
Managers.h:
#pragma once
#include"Person.h"class Managers :public Persons {public:bool flag_writeoff = false;//是否注销登录Managers();~Managers();//管理员界面的流程控制 void controlPro();//管理员界面的菜单显示void showMenu();//注销登录void writeoff();//添加账号void addAccount();//查看所有账号void showAllAccount();//查看机房void showAllRoom();//获取机房剩余容量void getRemnant(string jifanghao,string jifnagrongliang);//清空预约void clearAllBooking();//添加账号时按学号查重、去重bool checkRepeat(int num,string filePath);//参数是用户输入的学号/职工号};
一、void addAccount();和bool checkRepeat(int num,string filePath);
添加账号时按学号
查重、去重,参数是用户输入的学号/职工号和要查重的文件路径
二、void showAllRoom();和void getRemnant(string jifanghao,string jifnagrongliang);
查看机房容量的同时获取机房剩余容量,即要实时更新机房剩余容量,预约状态为已通过就把对应的机房容量减去一。
Managers.cpp:
#include"Managers.h"
5.学生类:class Students
Students.h:
#pragma once
#include"Person.h"using namespace std;class Students :public Persons {public:int num;//学号bool flag_writeoff;//是否注销登录Students();~Students();//学生界面的流程控制virtual void controlPro();//重写父类的虚函数//学生界面的菜单显示void showMenu();//注销登录void writeoff();//申请预约void applyBooking();//查看我的预约void showMyBooking();//查看所有预约//void showAllBooking();---写到父类中去,大家都能直接调用//取消预约void cancelBooking();
};
一、void applyBooking();//申请预约
每生成一条预约记录,就放到vector容器中进行保存。
二、void showMyBooking();//查看我的预约
遍历预约记录文件,判断每条记录的学号
是否等于当前登录的学生学号
,相等的就把单条预约记录输出。
三、void cancelBooking();//取消预约----------和Teachers类中的void checkBooking();//审核预约 相类似
编程思想:
首先遍历预约记录文件,将审核状态为1和2(审核中/已通过)且学号为当前登录的学生学号
的记录筛选出来从1开始计数(num_own
)并把此行记录输出,
并且把当前记录的新序号num_own
和原来的序号(即在文件中的行数)组成pair
放到map
容器中,
然后让用户输入要取消的记录序号,遍历map容器,将用户输入的数字
和map容器中的m.first
做比较,如果相等,就把对应的m.second
和0(取消预约)传给changeStatus(it->second, 0);
进行状态修改。
Teachers类中的void checkBooking();//审核预约
不同点有两处:审核状态为1(审核中) 的记录筛选出来,最后把m.second
和2(已通过)/-1(未通过) 传给changeStatus(it->second, 2);
进行状态修改。
Students.cpp:
#include"Students.h"
6.教师类:class Teachers
Teachers.h:
#pragma once
#include"Person.h"using namespace std;class Teachers :public Persons {public:int num;//职工号bool flag_writeoff;//是否注销登录Teachers();~Teachers();//教师界面的流程控制:void controlPro();//教师界面的菜单显示void showMenu();//注销登录void writeoff();//查看所有预约//void showAllBooking();//审核预约void checkBooking();};
void checkBooking();//审核预约
(见上面Students类的第三点void cancelBooking();//取消预约)
Teachers.cpp:
#include"Teachers.h"
补充:为什么Person类中的vector<Orders>& saveToVector();
返回引用就会赋值失败???
即:
vector& saveToVector();//赋值失败
vector saveToVector();//赋值成功
先看一个测试程序:
#include<iostream>
#include"Person.h"//这个头文件不需要有,整个测试代码都是基于整个Person类的//测试返回值为vector<Orders> v:
int main() {Persons p;//创建Person类对象pvector<Orders> v2;v2 = p.saveToVector(p.filePath_reserveFile);//cout << "容器v2的大小为 " << v2.size() << endl;p.pritnVector(v2);//打印system("pause");return 0;
}
解释:main函数中的第3行(p.saveToVector()
和p.filePath_reserveFile
)和第5行(p.pritnVector(v2)
)都是直接调用Person类中的成员变量或成员函数,所以第1行要创建Person类对象p。
其中vector Persons::saveToVector(string filePath) 的具体代码如下:
vector<Orders> Persons::saveToVector(string filePath) {//如果返回一个引用vector<Orders>&,就会赋值失败?????vector<Orders> v1;//存放文件中的所有预约记录
//①读取文件int num = 0;//文件中的人数ifstream ifs;ifs.open(filePath, ios::in);//这里可以直接写filePath_reserveFileif (!ifs.is_open()) {cout << "文件打开错误!" << endl;system("pause");system("cls");vector<Orders> v;return v;}string line;while (getline(ifs, line)) {//按行读取num++;vector<string> v;string subStr;stringstream ss;ss << line;ss.clear();//以防下面会重复利用sswhile (getline(ss, subStr, ' ')) {v.push_back(subStr);}
//②用当前行的内容构造一个Orders类对象int xuhao = strToInt(v[0]);int zhouji = strToInt(v[1]);int shangwuxiawu = strToInt(v[2]);int xuehao = strToInt(v[3]);string name = v[4];int jifanghao = strToInt(v[5]);int zhuangtai = strToInt(v[6]);Orders order1(xuhao, zhouji, shangwuxiawu, xuehao, name, jifanghao, zhuangtai);
//③把Orders类对象尾插进v1容器中v1.push_back(order1);}//cout << "文件中的预约记录数量:" << v1.size() << endl;if (num == 0)cout << "文件为空!" << endl;return v1;
}
最主要的是问题在于函数体的返回值:
vector<Orders>& saveToVector();
//赋值失败
vector<Orders> saveToVector();
//赋值成功
复习:
重新看
①C++核心编程的2、引用 + 4.2.2/4.2.3拷贝构造 + 4.3.2 this指针
②黑马程序员的C++课程P89-P94引用 + P108拷贝构造 + P115this指针
进行理解,另外在
③C++提高编程2的3.2.7 vector互换容器涉及到的匿名对象和这块内容相关。
总结:
1.先搞清楚拷贝构造和this指针:的概念和区别:
拷贝构造是构造函数的一种,函数名就是类名;
this指针是成员函数中要返回对象本身的时候return *this;
示例:
#include<iostream>
#include<string>
using namespace std;class Animals {public:string name;//姓名int age;//年龄Animals() { name = " "; age = 0; }Animals(string name, int age) {this->name = name;this->age = age;}
};class Person {public:int age;//默认构造/无参构造Person() { this->age = 0; };//有参构造Person(int age) {this->age = age;}//拷贝构造Person(const Person& p) {this->age = p.age;}//成员函数0---增加年龄void addAge0(int age) {this->age += age;}//成员函数1---增加年龄void addAge1(const Person& p) {this->age += p.age;}//成员函数2---增加年龄Person addAge2(const Person& p) {this->age += p.age;return *this;}//成员函数3---增加年龄Person& addAge3(const Person& p) {this->age += p.age;return *this;}//成员函数4---返回Animals类对象Animals saveToAnimals(string name,int age) {//这里只能是返回Animals,不能加引用,否则会报错Animals animal(name,age);return animal;}
};
main函数代码:
int main() {//默认构造Person p1;p1.age = 10; cout << "p1.age = " << p1.age << endl;//10
//有参构造Person p2(11); cout << "p2.age = " << p2.age << endl;//11
//拷贝构造Person p3(p1); cout << "p3.age = " << p3.age << endl;//10cout << endl;
//成员函数0---增加年龄p1.addAge0(10); cout << "p1.age = " << p1.age << endl;//10+10=20
//成员函数1---增加年龄p2.addAge1(p1); cout << "p2.age = " << p2.age << endl;//11+20=31cout << endl;
//成员函数2---返回对象p1.age = 10;p3.age = 0;cout << "p3的地址为 " << &p3 << endl;//p3的地址为 00B3FA14Person p5 = p3.addAge2(p1);//cout << "p?的地址为 " << &(p3.addAge2(p1)) << endl;//没办法获取到匿名对象的地址,会报错!!!cout << "p5的地址为 " << &p5 << endl;//p5的地址为 00B3FA08cout << "p3.age = " << p3.age << endl;//10cout << "p?.age = " << p3.addAge2(p1).age << endl;//20cout << "p3.age = " << p3.age << endl;//20???cout << "p?.age = " << p3.addAge2(p1).addAge2(p1).age << endl;//20+10+10+10=50cout << "p3.age = " << p3.age << endl;//30???cout << "p?.age = " << p3.addAge2(p1).addAge2(p1).addAge2(p1).age << endl;//20+10+10+10=50cout << "p3.age = " << p3.age << endl;//30???cout << endl;
//成员函数3---返回引用p1.age = 10;p2.age = 0;cout << "p2的地址为 " << (int)&p2 << endl;//p2的地址为 00B3FA20Person p6 = p2.addAge3(p1);cout << "p?的地址为 " << (int)&(p2.addAge3(p1)) << endl;//p?的地址为 00B3FA20cout << "p6的地址为 " << (int)&p6 << endl;//p6的地址为 00B3F9FCcout << "p2.age = " << p2.age << endl;//10cout << "p?.age = " << p2.addAge3(p1).age << endl;//20cout << "p2.age = " << p2.age << endl;//20???cout << "p?.age = " << p2.addAge3(p1).addAge3(p1).age << endl;//20+10+10+10=50cout << "p2.age = " << p2.age << endl;//50???cout << "p?.age = " << p2.addAge3(p1).addAge3(p1).addAge3(p1).age << endl;//20+10+10+10=50cout << "p2.age = " << p2.age << endl;//50???cout << endl;//成员函数2和3混着用---共八种情况Person p4;//222p1.age = p2.age = 10;cout << "p?.age = " << p4.addAge2(p1).addAge2(p2).addAge2(p1).age << endl;//30cout << "p4.age = " << p4.age << endl;//10//223p1.age = p2.age = 10; p4 = 0;cout << "p?.age = " << p4.addAge2(p1).addAge2(p2).addAge3(p1).age << endl;//30cout << "p4.age = " << p4.age << endl;//10//232p1.age = p2.age = 10; p4 = 0;cout << "p?.age = " << p4.addAge2(p1).addAge3(p2).addAge2(p1).age << endl;//30cout << "p4.age = " << p4.age << endl;//10//233p1.age = p2.age = 10; p4 = 0;cout << "p?.age = " << p4.addAge2(p1).addAge3(p2).addAge3(p1).age << endl;//30cout << "p4.age = " << p4.age << endl;//10cout << endl;//333p1.age = p2.age = 10; p4 = 0;cout << "p?.age = " << p4.addAge3(p1).addAge3(p2).addAge3(p1).age << endl;//30cout << "p4.age = " << p4.age << endl;//30//332p1.age = p2.age = 10; p4 = 0;cout << "p?.age = " << p4.addAge3(p1).addAge3(p2).addAge2(p1).age << endl;//30cout << "p4.age = " << p4.age << endl;//30//323p1.age = p2.age = 10; p4 = 0;cout << "p?.age = " << p4.addAge3(p1).addAge2(p2).addAge3(p1).age << endl;//30cout << "p4.age = " << p4.age << endl;//20//322p1.age = p2.age = 10; p4 = 0;cout << "p?.age = " << p4.addAge3(p1).addAge2(p2).addAge2(p1).age << endl;//30cout << "p4.age = " << p4.age << endl;//20//成员函数4---返回Animals类对象Person p8;Animals cat;cat = p8.saveToAnimals("咪咪",3);cout << "姓名:" << cat.name << "\t年龄:" << cat.age << endl;system("pause");return 0;
}
程序分析:
1、
如果返回值加了引用,那么返回的就是调用这个函数的对象本身;
如果返回值没加引用,返回的就是一个新的匿名对象。
可以通过下面的程序进行验证:
①没加引用:返回的匿名对象的地址没办法输出
//成员函数2—返回对象
p1.age = 10;
p3.age = 0;
cout << "p3的地址为 " << &p3 << endl;//p3的地址为 00B3FA14
Person p5 = p3.addAge2(p1);
//cout << "p?的地址为 " << &(p3.addAge2(p1)) << endl;//没办法获取到匿名对象的地址,会报错!!!
cout << "p5的地址为 " << &p5 << endl;//p5的地址为00B3FA08
②加了引用:返回的地址和p2的地址一模一样,说明返回的就是p2,而不是匿名对象
//成员函数3—返回引用
p1.age = 10;
p2.age = 0;
cout << "p2的地址为 " << (int)&p2 << endl;//p2的地址为 00B3FA206
Person p6 = p2.addAge3(p1);
cout << "p?的地址为 " << (int)&(p2.addAge3(p1)) << endl;//p?的地址为 00B3FA20
cout << "p6的地址为 " << (int)&p6 << endl;//p6的地址为 00B3F9FC
2、通过更直观的方式来说明加引用和不加引用的区别:
加引用3和不加引用2混着用:
加了引用就还是自己,不加引用就是新的匿名对象
(333 332 323 322):
(222 223 232 233):
3、机房预约系统中的问题
vector<Orders> saveToVector();//不能加引用,否则会报错
其实是调用Person类中的成员方法saveToVector();
,但返回的是另一个类Vector类的对象vector<Orders>
,
这和上面的程序事例Person& addAge3(const Person& p)
不一样,上面是Person类对象调用Person类成员函数addAge3(const Person& p)
,返回的也是Person类,这时可以返回一个类对象Person addAge2(){}
,也可以返回一个引用Person& addAge3(){}
。
//成员函数4—返回Animals类对象
Person p8;
Animals cat;
cat = p8.saveToAnimals(“咪咪”,3);
//调用Person类的saveToAnimals(),返回Animals类对象
cout << “姓名:” << cat.name << “\t年龄:” << cat.age << endl;
C++笔记16:C++第七阶段:机房预约系统---返回引用vector<Orders>的bug解释相关推荐
- C++ 机房预约系统
文章目录 机房预约系统 一. 系统需求 1. 系统简介 2. 身份简介 3. 机房简介 4. 申请简介 5. 系统需求 6. 创建文件 二. 创建主菜单 1. 菜单实现 2. 接口搭建 三. 退出功能 ...
- C++实现机房预约系统
相关视频--黑马程序员C++(282-314) (1-83笔记)--链接 (84-146笔记)--链接 (146-166笔记)--链接 (167-263笔记)--链接 (264-281笔记)--链接 ...
- 机房预约系统(C++)
各位读者朋友,大家好!本篇文章主要内容是将黑马程序员(C++)的机房预约系统的源代码展现给大家.原码的大部分与黑马程序员老师写的代码一致,我只是对其中的一小部分做了优化,比如用户输入自己的选择不再程序 ...
- C/C++ 机房预约系统
我们在入门C++后都会自己设计一个系统,来检验自己的c++基础是否牢固.而博主最近在某站上跟着黑马一起看视频学习c++,其中有个机房预约系统,博主也跟着敲了一下,接下来让我们一起来看看程序吧. 在设计 ...
- 机房预约系统(黑马程序员)
机房预约系统 1.机房预约系统需求 1.1 系统简介 学校现有几个规格不同的机房,由于使用时经常出现"撞车"现象,现开发一套机房预约系统,解决这一问题. 1.2 身份简介 分别有三 ...
- 黑马程序员C++ 案例四 机房预约系统
源文件 机房预约系统.cpp #include<iostream> using namespace std; #include"identity.h" #include ...
- 《Python数据分析基础教程:NumPy学习指南(第2版)》笔记16:第七章 专用函数2——金融函数
当前Numpy版本为:1.20 第七章 专用函数 7.9 金融函数 NumPy中有很多金融函数. Numpy 1.20之前的版本导入numpy,直接调用以下函数即可. (注意!Numpy 1.20之后 ...
- 【机房收费系统】——傻瓜式报表设计器制作报表模板
一.下载安装Grid++Report5.0: 1.搜索下载Grid++Report5.0并安装:(附赠哟~但是建议大家自己去下载) 云盘分享:https://yunpan.cn/c6ggtnHFDsg ...
- 【C++】C++实战项目机房预约管理系统
前言 这是C++总结性练习,主要以一个综合案例对以前学过的知识进行复习巩固,为以后编程打下基础. 1. 机房预约系统需求 1.1 系统简介 学校有几个规格不同的机房, 由于使用时经常出现"撞 ...
最新文章
- qhfl-5 redis 简单操作
- linux wc 修改文件,Linux wc命令
- 卸载python27_27. 移除元素(Python)
- css渐变颜色php,css的渐变颜色
- python:使用strip()去掉首尾空格
- ToStringBuilder用法
- 转:有关Forth语言
- java applet编程_JavaApplet编程技巧
- 旁路电容和去耦电容基础知识
- SLAM——之G2O函数库
- 世界过敏性疾病日 | 儿童过敏性鼻炎校园筛查启动
- 网卡介绍——MAC与PHY的关系分析
- 一张图看明白电信云解决方案架构
- 用spss判断正态性检验的几种方法
- Linux 命令之 addr2line
- kegg 上ko号对应的通路数据
- Python井字棋源代码
- 独秀日记:咱朋友圈的微商大佬比怨妇多,总是更好一点的,对吧
- Android开发实用小工具十——进制转换工具
- MTK 手机芯片 2014 Roadmap