20250304-Rain

1. 查找和替换

/*
*5. 查找与替换
文本编辑器通常都拥有查找/替换的功能, 该功能的快捷键是ctrl+f.
现在 需要你设计一个替换功能, 输入原文S 以及A,B两个子串, 用B替换掉S中的A
输入:
第一行: 字符串S
第二行: 子串A
第三行: 子串B
(S长度<100, A,B长度<10)
样例输入:
把你的心 我的心 串一串

鸡翅
样例输出:
把你的鸡翅 我的鸡翅 串一串
*/

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
  string S;
  cout << "Please input 'S': ";
  getline(cin, S);

  string A;
  cout << "Please input 'A': ";
  getline(cin, A);

  string B;
  cout << "Please input 'B': ";
  getline(cin, B);

  // find(): 返回找到的下标
  // 如果有多个, 返回最后一个;
  // 如果没有, 返回string::npos
  while (S.find(A) != string::npos)
  {
    // replace(): 将S中的 下标 S.find(A) 处开始的 A.length() 个字符 替换成 B
    S.replace(S.find(A), A.length(), B);
  }
  cout << S;
  return 0;
}

2. 登录

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstring>
using namespace std;

/*
已有全局变量如下。
其中 每个下标对应一套用户数据(id, 名称, 密码)
如下标[1]: 对应10002, 李四, bbbbb
*/
int ids[5] = {10001, 10002, 10003, 10004};
char names[5][10] = {"张三", "李四", "王五", "赵六"};
char passwords[5][16] = {"aaaaa", "bbbbb", "ccccc", "ddddd"};
int uNum = 4;

/*
功能: 根据id 查询用户是否存在, 如果存在返回用户名,  如果不存在返回空
参数:
uid: 用户id
返回值:
如果用户存在, 返回用户名.
如果用户不存在, 返回NULL
 */
char *selectUserById(int uid);

/*
功能: 根据id 查询用户密码, 如果存在返回用户密码,  如果不存在返回空
参数:
uid: 用户id
返回值:
如果密码存在, 返回密码.
如果密码不存在, 返回NULL
*/
char *selectPassById(int uid);

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
/*
功能: 传入用户id和密码, 根据上面两个函数(selectUserById, selectPassById)来获取相应用
户数据, 并判断是否登录成功
传入用户id 查询用户名是否存在, 并获取用户密码
如果用户存在  则判断密码是否正确
参数:
uid: 用户账户
password: 用户密码
返回值:
如果账号不存在, 返回1
如果密码错误, 返回2
如果登录成功, 返回0
*/
int login(int uid, char *password);

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
/*
功能: 提示用户输入账号密码, 根据login函数判断是否登录成功,
如果登录成功提示正在进入首页
如果登录失败
密码错误: 提示密码错误, 并让用户重新登录
账号不存在: 提示账号不存在, 并提示正在进入注册界面
参数: 无
返回值: 无
*/
void showLoginPage(void);

int main(void)
{
  showLoginPage();
  return 0;
}

char *selectUserById(int uid)
{
  for (int i = 0; i < uNum; i++)
  {
    if (ids[i] == uid)
    {
      return names[i];
    }
  }
  return NULL;
}

char *selectPassById(int uid)
{
  for (int i = 0; i < uNum; i++)
  {
    if (ids[i] == uid)
    {
      return passwords[i];
    }
  }
  return NULL;
}

int login(int uid, char *password)
{
  int r_val;
  if (selectUserById(uid) == NULL)
  {
    r_val = 1;
  }
  else if (strcmp(selectPassById(uid), password) == 0)
  {
    r_val = 0;
  }
  else
  {
    r_val = 2;
  }
  return r_val;
}

void showLoginPage(void)
{
  int uid;
  cout << "Please input uid: ";
  cin >> uid;

  char *pwd = new char[20];
  cout << "Please input pwd: ";
  cin >> pwd;

  int r_val = login(uid, pwd);
  if (r_val == 0)
  {
    cout << "登录成功, 正在进入首页!" << endl;
  }
  else if (r_val == 2)
  {
    cout << "密码错误, 请重新登录!" << endl;
  }
  else if (r_val == 1)
  {
    cout << "账号不存在, 正在进入注册界面!" << endl;
  }
  delete[] pwd;
  return;
}

三层架构

  1. UI(表现层): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。

  2. BLL:(业务逻辑层): UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。

  3. DAL:(数据访问层): 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)

上面

  • 属于 UI 的接口是 showLoginPage()

    • 提示用户输入,做一些简单的检查

    • 然后显示用户需要的数据

  • 属于 BLL 的接口是 login()

    • 提供验证服务,接触用户的输入 与 数据库查找

    • 连接 UI 接口和 DAL 接口

  • 属于 DAL 的接口是 selectUserById(), selectPassById()

    • 直接与全局变量接触,这里进行查找操作

    • 查找结果返回给 BLL

3. 注册

/*
2. 上面有用虚线将函数划分为3种,  这三种函数有哪些区别(可以百度查询"三层架构").  根据这种思路
实现一套注册功能.
*/
#include <iostream>
#include <string.h>

using namespace std;

int ids[5] = {10001, 10002, 10003, 10004};
char names[5][10] = {"张三", "李四", "王五", "赵六"};
char passwords[5][16] = {"aaaaa", "bbbbb", "ccccc", "ddddd"};
int uNum = 4;
// DAL-----------------------------------------------------
/*
  参数:用户名、密码

  1. 查找数据,根据已给的用户名,查找有无重复。

  2. 如果没有重复,修改全局变量(uid, username,pwd)。
  3. 如果有重复,返回失败
*/
bool isRepeat(char *input_name)
{
  bool r_val = false;
  for (int i = 0; i < uNum; i++)
  {
    if (strcmp(names[i], input_name) == 0)
    {
      r_val = true;
    }
  }
  return r_val;
}

int addData(char *input_name, char *input_password)
{
  uNum++;
  ids[uNum - 1] = ids[uNum - 2] + 1;
  strcpy(names[uNum - 1], input_name);
  strcpy(passwords[uNum - 1], input_password);
  return ids[uNum - 1];
}
// DAL-----------------------------------------------------

// BLL-----------------------------------------------------
/*
  接受DAL返回的数据,告诉UI层成功或失败
  1. 检查有无重复,重复则返回失败
  2. 不重复则调用 DAL 修改数据,并返回uid
*/
int register_fun(char *input_name, char *input_password)
{
  if (!isRepeat)
  {
    int uid = addData(input_name, input_password);
    return uid;
  }
  return 0;
}

// BLL-----------------------------------------------------

// UI------------------------------------------------------
/*
  接受用户输入,告诉用户结果。
  1. 用户名无重复,注册成功
  2. 用户名重复,注册失败
*/
void register_page(void)
{
  char *input_name = new char[20];
  char *input_password = new char[20];
  cout << "输入注册用户名: ";
  cin >> input_name;
  cout << "输入注册密码: ";
  cin >> input_password;

  int res = register_fun(input_name, input_password);
  if (res == 0)
  {
    cout << "用户名重复" << endl;
  }
  else
  {
    cout << "注册成功" << endl;
    cout << "你的用户id是: " << res << endl;
    cout << "你的用户名是: " << input_name << endl;
  }
}
// UI------------------------------------------------------

int main(void)
{
  register_page();
  return 0;
}

综合代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstring>
using namespace std;

/*
已有全局变量如下。
其中 每个下标对应一套用户数据(id, 名称, 密码)
如下标[1]: 对应10002, 李四, bbbbb
*/
int ids[5] = {10001, 10002, 10003, 10004};
char names[5][10] = {"张三", "李四", "王五", "赵六"};
char passwords[5][16] = {"aaaaa", "bbbbb", "ccccc", "ddddd"};
int uNum = 4;

// DAL-----------------------------------------------------
/*
功能: 根据id 查询用户是否存在, 如果存在返回用户名,  如果不存在返回空
参数:
uid: 用户id
返回值:
如果用户存在, 返回用户名.
如果用户不存在, 返回NULL
 */
char *selectUserById(int uid);

/*
功能: 根据id 查询用户密码, 如果存在返回用户密码,  如果不存在返回空
参数:
uid: 用户id
返回值:
如果密码存在, 返回密码.
如果密码不存在, 返回NULL
*/
char *selectPassById(int uid);

/*
  参数:用户名、密码

  1. 查找数据,根据已给的用户名,查找有无重复。

  2. 如果没有重复,修改全局变量(uid, username,pwd)。
  3. 如果有重复,返回失败
*/
bool isRepeat(char *input_name);

int addData(char *input_name, char *input_password);
// DAL-----------------------------------------------------

// BLL-----------------------------------------------------
/*
功能: 传入用户id和密码, 根据上面两个函数(selectUserById, selectPassById)来获取相应用
户数据, 并判断是否登录成功
传入用户id 查询用户名是否存在, 并获取用户密码
如果用户存在  则判断密码是否正确
参数:
uid: 用户账户
password: 用户密码
返回值:
如果账号不存在, 返回1
如果密码错误, 返回2
如果登录成功, 返回0
*/
int login(int uid, char *password);

/*
  接受DAL返回的数据,告诉UI层成功或失败
  1. 检查有无重复,重复则返回失败
  2. 不重复则调用 DAL 修改数据,并返回uid
*/
int registerFun(char *input_name, char *input_password);
// BLL-----------------------------------------------------

// UI------------------------------------------------------

/*
功能: 提示用户输入账号密码, 根据login函数判断是否登录成功,
如果登录成功提示正在进入首页
如果登录失败
密码错误: 提示密码错误, 并让用户重新登录
账号不存在: 提示账号不存在, 并提示正在进入注册界面
参数: 无
返回值: 无
*/
void showLoginPage(void);

/*
  接受用户输入,告诉用户结果。
  1. 用户名无重复,注册成功
  2. 用户名重复,注册失败
*/
void registerPage(void);
// UI------------------------------------------------------
int main(void)
{
  showLoginPage();
  return 0;
}

char *selectUserById(int uid)
{
  for (int i = 0; i < uNum; i++)
  {
    if (ids[i] == uid)
    {
      return names[i];
    }
  }
  return NULL;
}

char *selectPassById(int uid)
{
  for (int i = 0; i < uNum; i++)
  {
    if (ids[i] == uid)
    {
      return passwords[i];
    }
  }
  return NULL;
}

bool isRepeat(char *input_name)
{
  bool r_val = false;
  for (int i = 0; i < uNum; i++)
  {
    if (strcmp(names[i], input_name) == 0)
    {
      r_val = true;
    }
  }
  return r_val;
}

int addData(char *input_name, char *input_password)
{
  uNum++;
  ids[uNum - 1] = ids[uNum - 2] + 1;
  strcpy(names[uNum - 1], input_name);
  strcpy(passwords[uNum - 1], input_password);
  return ids[uNum - 1];
}

int login(int uid, char *password)
{
  int r_val;
  if (selectUserById(uid) == NULL)
  {
    r_val = 1;
  }
  else if (strcmp(selectPassById(uid), password) == 0)
  {
    r_val = 0;
  }
  else
  {
    r_val = 2;
  }
  return r_val;
}

int registerFun(char *input_name, char *input_password)
{
  if (!isRepeat)
  {
    int uid = addData(input_name, input_password);
    return uid;
  }
  return 0;
}

void showLoginPage(void)
{
  int uid;
  cout << "Please input uid: ";
  cin >> uid;

  char *pwd = new char[20];
  cout << "Please input pwd: ";
  cin >> pwd;

  int r_val = login(uid, pwd);
  if (r_val == 0)
  {
    cout << "登录成功, 正在进入首页!" << endl;
    homePage();
  }
  else if (r_val == 2)
  {
    cout << "密码错误, 请重新登录!" << endl;
  }
  else if (r_val == 1)
  {
    cout << "账号不存在, 正在进入注册界面!" << endl;
    registerPage();
  }
  delete[] pwd;
  return;
}

void registerPage(void)
{
  char *input_name = new char[20];
  char *input_password = new char[20];
  cout << "输入注册用户名: ";
  cin >> input_name;
  cout << "输入注册密码: ";
  cin >> input_password;

  int res = registerFun(input_name, input_password);
  if (res == 0)
  {
    cout << "用户名重复" << endl;
  }
  else
  {
    cout << "注册成功" << endl;
    cout << "你的用户id是: " << res << endl;
    cout << "你的用户名是: " << input_name << endl;
  }
}

void homePage(void)
{
  cout << "欢迎来到首页";
}

写到这才发现原来一直写的都是C式的C++...原本可以将几个属性合起来称为对象的。然后对对象进行相关操作。这次就先这样写了,下次不会局限在C了...

Last updated