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;
}
三层架构
UI(表现层): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。
BLL:(业务逻辑层): UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。
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