某马机房预约系统 C++项目(二) 完结
8.4、查看机房
8.4.1、添加机房信息
根据案例,我们还是先在computerRoom.txt中直接添加点数据
//几机房 机器数量
1 20
2 50
3 100
8.4.2、机房类创建
同样我们在头文件下新建一个computerRoom.h文件
添加如下代码:
#pragma once
#include<iostream>
using namespace std;class ComputerRoom {
public://机房idint m_ComId;//机房最大容量int m_MaxNum;
};
8.4.3、初始化机房信息并显示
在Manager管理类下,添加机房的容器,用于保存信息
//机房容器
#include "computerRoom.h"
vector<ComputerRoom> vCom;
在Manager有参构造函数中,追加如下代码,初始化机房信息
//获取机房信息
void Manager::getComputerNumber()
{// 文件名string computerFile = COMPUTER_FILE; // 替换为机房文件名ifstream ifs;ifs.open(COMPUTER_FILE, ios::in);ComputerRoom c;while (ifs>>c.m_ComId && ifs>>c.m_MaxNum){vCom.push_back(c);}cout << "当前机房数量为: " << vCom.size() << endl;ifs.close();
}
然后我们修改showComputer成员方法
void Manager::showComputer()
{cout << "机房信息如下: " << endl;for (vector<ComputerRoom>::iterator it = vCom.begin(); it != vCom.end();it++) {cout << "机房编号:" << it->m_ComId << " 机房最大容量:" << it->m_MaxNum << endl;}system("pause");system("cls");
}
效果图:
8.5、清空预约功能
接着我们来实现cleanFile成员方法
由于我们order文件中没有东西,如果需要测试可以自己添加一点
//清空预约系统
void Manager::clearFile()
{ofstream ofs(ORDER_FILE, ios::trunc);ofs.close();cout << "清空成功!" << endl;system("pause");system("cls");
}
9、学生模块
9.1、初始化信息
接下来我们对学生有参构造进行实现
student.cpp
//有参构造
Student::Student(int id, string name, string pwd)
{this->m_Id = id;this->m_Name = name;this->m_Pwd = pwd;
}
9.2、菜单实现
首先添加一个学生菜单函数,在机房预约系统.cpp中添加
void studentMenu(Indentity*& student);
然后我们来实现一下具体的步骤
void Student::studentMenu(Indentity*& student)
{while (true){//学生菜单student->operMenu();Student* stu = (Student*)student;//接受用户选项int select = 0;cin >> select;switch (select){case 1: //申请预约cout << "申请预约" << endl;stu->applyOrder();break;case 2://查看预约cout << "查看预约" << endl;stu->showMyOrder();break;case 3://查看所有预约cout << "查看所有预约" << endl;stu->showAllOrder();break;case 4://取消预约cout << "取消预约" << endl;stu->cancelOrder();break;default://注销登录//销毁掉堆区对象delete student;cout << "注销成功" << endl;system("pause");system("cls");return;}}
}
接着我们来添加一下菜单,回到student.cpp
void Student::operMenu()
{cout << "欢迎:" << this->m_Name << "同学登录!" << endl;cout << endl;cout << "-------------- 1、申请预约 -----------------" << endl;cout << endl;cout << "-------------- 2、查看预约 -----------------" << endl;cout << endl;cout << "-------------- 3、查看所有预约 -----------------" << endl;cout << endl;cout << "-------------- 4、取消预约 -----------------" << endl;cout << endl;cout << "-------------- 输入其他数字退出 -----------------" << endl;cout << "-------------------------------------------------------" << endl;cout << "请输入序号进行操作:";}
然后回到机房预约系统.cpp
在这里添加方法,测试一下
9.3、申请预约实现
然后我们也要来获取一下机房信息,在studen.h中
#include"computerRoom.h"
#include "globalFile.h"
#include<fstream>
//机房信息
vector<ComputerRoom> vCom;
回到student.cpp中的学生构造中填一下以下代码
//有参构造
Student::Student(int id, string name, string pwd)
{this->m_Id = id;this->m_Name = name;this->m_Pwd = pwd;// 文件名string computerFile = COMPUTER_FILE; // 替换为机房文件名ifstream ifs;ifs.open(COMPUTER_FILE, ios::in);ComputerRoom c;while (ifs >> c.m_ComId && ifs >> c.m_MaxNum){vCom.push_back(c);}ifs.close();
}
然后我们来实现预约功能在applyOrder()中实现
void Student::applyOrder()
{cout << "机房开放时间为周一到周五!" << endl;cout << "请输入预约时间!" << endl;cout << "1、周一!" << endl;cout << "2、周二!" << endl;cout << "3、周三!" << endl;cout << "4、周四!" << endl;cout << "5、周五!" << endl;int date = 0;int interval = 0;int room = 0;while (true){cin >> date;if (date>=1&&date<=5){break;}cout << "输入有误,请重新输入" << endl;}cout << "请输入申请预约时间段" << endl;cout << "1、上午" << endl;cout << "2、下午" << endl;while (true){cin >> interval;if (interval >= 1 && interval <= 2){break;}cout << "输入有误,请重新输入" << endl;}cout << "请选择机房:" << endl;cout << "1号机房容量:" <<vCom[0].m_MaxNum << endl;cout << "2号机房容量:" << vCom[1].m_MaxNum << endl;cout << "3号机房容量:" << vCom[2].m_MaxNum << endl;while (true){cin >> room;if (room>=1&&room<=3){break;}cout << "输入有误,请重新输入" << endl;}cout << "预约成功!等待审核" << endl;ofstream ofs(ORDER_FILE, ios::app);ofs << "data:" << date << " ";ofs << "interval:" << interval << " ";ofs << "stuId:" << this->m_Id << " ";ofs << "stuName:" << this->m_Name << " ";ofs << "roomId:" << room << " ";ofs << "status:" << 1 << endl;;ofs.close();system("pause");system("cls");
}
9.4、显示预约
接着我们来创建一个预约类,用于获取所有记录和显示,以及更新
文件名为orderFile.h 和 orderFile.cpp文件
orderFile.h
#pragma once
#include<iostream>
#include<map>
#include "globalFile.h"
#include<string>
using namespace std;class OrderFile {
public://构造函数OrderFile();//更新预约记录void updateOrder();//记录容器 key 记录条数 value -- 具体记录的键值对map<int, map<string, string>>m_orderData;//记录预约的条数int m_size;
};
orderFile.cpp
OrderFile::OrderFile()
{ifstream ifs;ifs.open(ORDER_FILE, ios::in);string date; //日期string interval; //时间段string stuId; //学生编号string stuName; //学生姓名string roomId; //机房号string status; //预约状态this->m_size = 0; //记录条数while (ifs>>date && ifs >> interval&&ifs>>stuId&&ifs>>stuName&&ifs>>roomId&&ifs>>status){map<string, string> m;insertInfo(m, date);insertInfo(m, interval);insertInfo(m, stuId);insertInfo(m, stuName);insertInfo(m, roomId);insertInfo(m, status);//将小mpa容器放到大的map容器中this->m_orderData.insert(make_pair(this->m_size, m));this->m_size++;//清空小容器m.clear();}ifs.close();//测试代码for (map<int, map<string, string>>::iterator it = m_orderData.begin(); it != m_orderData.end(); it++) {cout << "条数为:" << it->first << "value = " << endl;for (map<string, string>::iterator mit = (*it).second.begin(); mit != it->second.end(); mit++) {cout << "key = " << mit->first << " value = " << mit->second << " ";}cout << endl;}
}
//截取字符串
void OrderFile::insertInfo(map<string, string> &m,string keys) {string key;string value;int pos = keys.find(":");if (pos != -1){key = keys.substr(0, pos);value = keys.substr(pos + 1);m.insert(make_pair(key, value));}
}
9.4.1、查看自身预约
student.cpp
void Student::showMyOrder()
{OrderFile of;if (of.m_size == 0) {cout << "无预约记录!" << endl;system("pause");system("cls");return;}for (int i = 0; i < of.m_size; i++) {//找到自身预约if (this->m_Id == stoi(of.m_orderData[i]["stuId"].c_str())) {cout << "预约的日期:周" << of.m_orderData[i]["date"];cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");cout << " 机房号:" << of.m_orderData[i]["roomId"];string status = " 状态: ";//1.审核中 2.已预约 - 1 预约失败 0 取消预约if (of.m_orderData[i]["status"]=="1"){status += "审核中";}else if (of.m_orderData[i]["status"] == "2") {status += "预约成功";}else if (of.m_orderData[i]["status"] == "-1") {status += "预约失败,审核未通过";}else{status += "预约已经取消";}cout << status << endl;}}system("pause");system("cls");
}
9.4.2、显示所有预约
//查看所有预约
void Student::showAllOrder()
{OrderFile of;if (of.m_size == 0) {cout << "无预约记录!" << endl;system("pause");system("cls");return;}for (int i = 0; i < of.m_size; i++) {cout << "预约的日期:周" << of.m_orderData[i]["date"];cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");cout << " 学号:" << of.m_orderData[i]["stuId"];cout << " 姓名:" << of.m_orderData[i]["stuName"];cout << " 机房号:" << of.m_orderData[i]["roomId"];string status = " 状态: ";//1.审核中 2.已预约 - 1 预约失败 0 取消预约if (of.m_orderData[i]["status"] == "1"){status += "审核中";}else if (of.m_orderData[i]["status"] == "2") {status += "预约成功";}else if (of.m_orderData[i]["status"] == "-1") {status += "预约失败,审核未通过";}else {status += "预约已经取消";}cout << status << endl;}
}
9.5、取消预约
student.cpp
//取消预约
void Student::cancelOrder()
{OrderFile of;if (of.m_size == 0){cout << "无预约记录" << endl;system("pause");system("cls");}cout << "审核中或预约成功的记录可以取消,请输入取消的记录" << endl;vector<int> v;int index = 1;for (int i = 0; i< of.m_size; i++){if (this->m_Id == stoi(of.m_orderData[i]["stuId"])) {//再筛选状态 审核中或预约成功的if (of.m_orderData[i]["status"]=="1"||of.m_orderData[i]["Status"]=="2"){v.push_back(i);cout << index++ << "、";cout << "预约的日期:周" << of.m_orderData[i]["date"];cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");cout << " 机房号:" << of.m_orderData[i]["roomId"];string status = " 状态: ";//1.审核中 2.已预约 - 1 预约失败 0 取消预约if (of.m_orderData[i]["status"] == "1"){status += "审核中";}else if (of.m_orderData[i]["status"] == "2") {status += "预约成功";}else if (of.m_orderData[i]["status"] == "-1") {status += "预约失败,审核未通过";}else {status += "预约已经取消";}cout << status << endl;}}}cout << "请输入取消的记录,0代表返回" << endl;int select = 0;while (true){cin >> select;if (select>=0 && select<=v.size()){if (select==0){break;}else {of.m_orderData[v[select - 1]]["status"] = "0";of.updateOrder();cout << "已经取消预约" << endl;break;}}cout << "输入有误,请重新输入" << endl;}system("pause");system("cls");
}
10、教师模块
10.1、教师登录和注销
10.1.1、构造函数
- 在Teacher类的构造函数中,初始化教师信息,代码如下:
//有参构造
Teacher::Teacher(int empId, string name, string pwd)
{//初始化属性this->m_EmpId = empId;this->m_Name = name;this->m_Pwd = pwd;
}
10.1.2、教师子菜单
- 在机房预约系统.cpp中,当用户登录的是教师,添加教师菜单接口
- 将不同的分支提供出来
- 查看所有预约
- 审核预约
- 注销登录
- 实现注销功能
首先我们还是回到机房预约系统.cpp中,创建一个teacherMenu方法,同样的在LoginIn中创建类并链接此方法
//老师子菜单界面
void teacherMenu(Indentity*& teacher)
{while (true){//学生菜单teacher->operMenu();Teacher* tea = (Teacher*)teacher;//接受用户选项int select = 0;cin >> select;switch (select){case 1: //查看所有预约cout << "查看所有预约" << endl;tea->showAllOrder();break;case 2://审核预约cout << "审核预约" << endl;tea->validOrder();break;default://注销登录//销毁掉堆区对象delete teacher;cout << "注销成功" << endl;system("pause");system("cls");return;}}
}
teacher.cpp中 operMenu()
cout << "欢迎:" << this->m_Name << "老师!" << endl;cout << endl;cout << "-------------- 1、查看所有预约 -----------------" << endl;cout << endl;cout << "-------------- 2、审核预约 -----------------" << endl;cout << endl;cout << "-------------- 输入其他数字退出 -----------------" << endl;cout << "-------------------------------------------------------" << endl;cout << "请输入序号进行操作:";
10.1.2、审核预约
根据学生的申请进行审核
teacher.cpp
//审核预约
void Teacher::validOrder()
{OrderFile of;if (of.m_size == 0){cout << "无预约记录" << endl;system("pause");system("cls");}cout << "审核中或预约成功的记录可以取消,请输入取消的记录" << endl;vector<int> v;int index = 1;for (int i = 0; i < of.m_size; i++){//再筛选状态 审核中或预约成功的if (of.m_orderData[i]["status"] == "1"){v.push_back(i);cout << index++ << "、";cout << "预约的日期:周" << of.m_orderData[i]["date"];cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");cout << " 机房号:" << of.m_orderData[i]["roomId"];string status = " 状态: ";//1.审核中 2.已预约 - 1 预约失败 0 取消预约if (of.m_orderData[i]["status"] == "1"){status += "审核中";}cout << status << endl; }}cout << "请输入审核的预约记录,0代表返回" << endl;int select = 0;int ret = 0;while (true){cin >> select;if (select >= 0 && select <= v.size()){if (select == 0){break;}else {cout << "请输入审核结果" << endl;cout << "1.通过" << endl;cout << "2.不通过" << endl;cin >> ret;if (ret == 1){of.m_orderData[v[select - 1]]["status"] = "2";}else {of.m_orderData[v[select - 1]]["status"] = "-1";}of.updateOrder();cout << "审核完毕!" << endl;break;}}cout << "输入有误,请重新输入" << endl;}system("pause");system("cls");
}
相关文章:

某马机房预约系统 C++项目(二) 完结
8.4、查看机房 8.4.1、添加机房信息 根据案例,我们还是先在computerRoom.txt中直接添加点数据 //几机房 机器数量 1 20 2 50 3 1008.4.2、机房类创建 同样我们在头文件下新建一个computerRoom.h文件 添加如下代码: #pragma once #include<i…...

npm 安装到指定文件夹
创建一个文件夹,用vscode或者cmd打开, 执行 npm install --prefix ./ 路径 包名, npm install --prefix ./ 包名 , 就会将包安装在当前文件夹, 例如: npm install --prefix ./ -g oppo-minigame…...

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例
自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例 在matlab中有自带的离散傅里叶变换程序,即fft程序,但该程序是封装的,无法看到源码。为了比较清楚的了解matlab自带的实现过程,本文通过自建程序实现matlab程序&…...

Vue图片路径问题(动态引入)
vue项目中我们经常会遇到动态路径的图片无法显示的问题,以下是静态路径和动态路径的常见使用方法。 1.静态路径 在日常的开发中,图片的静态路径通过相对路径和绝对路径的方式引入。 相对路径:以.开头的,例如./、../之类的。就是…...

项目部署Linux步骤
1、最小化安装centos7-环境准备 安装epel-release 安装epel-release,因为有些rpm包在官方库中找不到。前提是保证可以联网 yum install -y epel-release 修改IP net-tools net-tool:工具包集合,包含ifconfig等命令 yum install -y net-…...

UG\NX二次开发 在资源栏(左侧面板)中添加按钮
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 apolloryd 订阅本专栏,非常感谢。 简介 UG\NX二次开发 在资源栏(左侧面板)中添加按钮,下面提供了帮助说明,在 UGOPEN 文件夹下有示例。 C++语言在UG二次…...

Proteus仿真--量程自动切换数字电压表(仿真+程序)
本文主要介绍基于51单片机的量程自动切换数字电压表Proteus仿真设计(完整仿真源文件及代码见文末链接) 简介 硬件电路主要分为单片机主控模块、AD转换模块、量程选择模块以及数码管显示模块 (1)单片机主控模块:单片…...

如何使用ArcGIS Pro制作一张地形图
01数据来源 本教程所使用的数据是从水经微图中下载的DEM数据,除了DEM数据,常见的GIS数据都可以从水经微图中下载,你可以通过关注“水经注GIS”,然后在后台回复“微图”即可获取软件下载地址,当然也可以直接在水经注…...
人工智能三要数之算法Transformer
1. 人工智能三要数之算法Transformer 人工智能的三个要素是算法、数据和计算资源。Transformer 模型作为一种机器学习算法,可以应用于人工智能系统中的数据处理和建模任务。 算法: Transformer 是一种基于自注意力机制的神经网络模型,用于处理序列数据的…...
Java ThreadPoolExecutor 线程池
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.ArrayBlockingQueue;public class ThreadPoolExample {public static void main(String[] args) {// 创建线程池对象ThreadPoolExecutor threadPool new…...

网络协议--IP选路
9.1 引言 选路是IP最重要的功能之一。图9-1是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生,也可以由其他主机产生。在后一种情况下,主机必须配置成一个路由器,否则通过网络接口接收到的数据报,如果目的地址不…...

使用udevil自动挂载U盘或者USB移动硬盘
最近在折腾用树莓派(实际上是平替香橙派orangepi zero3)搭建共享文件服务器,有一个问题很重要,如何在系统启动时自动挂载USB移动硬盘。 1 使用/etc/fstab 最开始尝试了用/etc/fstab文件下增加:"/dev/sda1 /home/orangepi/s…...

学习笔记二十二:K8s控制器Replicaset
K8s控制器Replicaset Replicaset控制器:概念、原理解读Replicaset概述Replicaset工作原理:如何管理PodReplicaset控制器三个组成部分 Replicaset资源清单文件编写技巧Replicaset使用案例:部署Guestbook留言板编写一个ReplicaSet资源清单资源清…...
2023-10-25 精神分析-领悟新技术的错误做法-持续数年的错误做法-记录与分析
摘要: 过去数年对于领悟技术, 采取的做法不能说是对达到目的毫无裨益,但是对突破技术和将技术融为自身这个目的来说, 没有达到。 而且随着时间的流逝, 过去已经熟悉的技术, 竟然会被忘掉!就像是没有涉猎过一样! 根本原因出在对技术的领悟的…...
Arrays 中的 asList()方法
public static <T> List<T> asList( T . . . a ){ return new ArrayList<>(a); } 返回由指定数组支持的固定大小的 list集合。对数组所做的更改将在返回的 l…...

基于自动化工具autox.js的抢票(猫眼)
1.看到朋友圈抢周杰伦、林俊杰演唱会票贼难信息,特研究了一段时间,用autox.js写了自动化抢票脚本,购票页面自动点击下单(仅限安卓手机)。 2.脚本运行图 3.前期准备工作 (1)autox.js社区官网:AutoX.js (2)b站上学习资料:10分钟学会AutoX.js hello world_哔哩哔哩_bi…...
Java架构师内功计算机网络
目录 1 导学2 网络功能和分类3 OSI七层模型3.1 局域网和广域网协议4 TCP/IP协议5 通信技术和交换技术5.1 通信技术5.2 交换技术5.2.1 路由技术5.2.2 传输介质6 通信方式和交换方式7 IP地址7.1 IP地址表示7.2 子网划分8 IPv69 网络规划与设计10 网络存储技术10.1 廉价磁盘几余阵…...
vue 中 mixin 和 mixins 区别
目录 前言 用法 全局Mixin 局部Mixin 代码 理解 高质量的Mixin使用 在Vue.js框架中,Mixin是一种非常重要和强大的功能,它允许开发者创建可复用的代码片段,并将其应用到一个或多个组件中。Vue提供了两种方式来使用Mixin,分别…...

reqable(小黄鸟)+雷电抓包安卓APP
x 下载证书保存到雷电模拟器根目录(安装位置) 为什么? Android7以上,系统允许每个应用可以定义自己的可信CA集,部分的应用默认只会信任系统预装的CA证书,而不会信任用户安装的证书,之前的方法安装Burp/Fiddler证书都是用户证书…...

高等数学啃书汇总重难点(七)微分方程
同济高数上册的最后一章,总的来说,这篇章内容依旧是偏记忆为主,说难不难说简单不简单: 简单的是题型比较死,基本上就是记公式,不会出现不定积分一般花样繁多的情况;然而也就是背公式并不是想的…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
【Pandas】pandas DataFrame dropna
Pandas2.2 DataFrame Missing data handling 方法描述DataFrame.fillna([value, method, axis, …])用于填充 DataFrame 中的缺失值(NaN)DataFrame.backfill(*[, axis, inplace, …])用于**使用后向填充(即“下一个有效观测值”)…...

短视频时长预估算法调研
weighted LR o d d s T p 1 − p ( 1 − p ) o d d s T p ( T p o d d s ∗ p ) o d d s p o d d s T o d d s odds \frac{Tp}{1-p} \newline (1-p)odds Tp \newline (Tp odds * p) odds \newline p \frac{odds}{T odds} \newline odds1−pTp(1−p)oddsTp(Tpodds…...