实现要求:
1.如果不存在初始用户数据文件则创建用户数据文件
2.实现完整的注册登录
3.实现用户数据的自动保存和读取
4.密码输入提供直接显示和隐式显示
运行结果如下:
代码如下:
#include "iostream"
#include "fstream"
#include "string"
#include <conio.h>
using namespace std;
#define SIZE 100//最大用户容量
int scount = 0;//用作储存当前已注册用户数
//用户类
class User
{
private:
string phone;//电话
string password;//密码
public:
User() {
};
void Registers();//注册
void Login();//登录
void save();//保存
void read();//读取
}us;
User user[SIZE];
//保存
void User::save()
{
ofstream ofile;
ofile.open("user.txt", ios::out);
for (int i = 0; i < scount; i++)
{
ofile << user[i].phone << endl;
ofile << user[i].password << endl;
}
ofile.close();
}
//读取
void User::read()
{
ifstream ifile;
ifile.open("user.txt", ios::in);
scount = 0;
if (!ifile.is_open())
{
//cout << "文件打开失败!" << endl;
return;
}
for (int i = 0; !ifile.eof(); i++)
{
ifile >> user[i].phone;
ifile >> user[i].password;
scount++;
}
scount--;
ifile.close();
}
//注册
void User::Registers()
{
us.read();//读取已储存用户数据
string ph;//电话
string pw1;//密码1
string pw2;//密码2
for (int i = scount; i < SIZE; i++)
{
here:
cout << "\t\t\t【系统提示】请输入手机号:";
cin >> ph;
//判断新输入的用户信息是否已存在(如果已存在则重新输入)
for (int i = 0; i < scount; i++)
{
if (ph == user[i].phone)
{
cout << "\t\t\t【系统提示】用户已存在!" << endl;
goto here;
}
}
user[i].phone = ph;
int chose = -1;
cout << endl;
cout << "\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
cout << "\t\t\t┃ 1.显示密码 2.隐藏密码 ┃\t\n";
cout << "\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
cout << "\t\t\t【系统提示】请输入你的选择:";
cin >> chose;
if (chose > 2 || chose < -1)
{
cout << "\t\t\t【系统提示】输入格式错误,请重新输入:";
cin >> chose;
}
string pword;
char ch, passwords0[20];
int x = 0;
string pword1;
char ch1, passwords1[20];
int x1 = 0;
switch (chose)
{
case 1:
cout << "\t\t\t【系统提示】请输入密码:";
cin >> pword;
user[i].password = pword;
cout << "\t\t\t【系统提示】请再次密码:";
cin >> pword1;
if (pword1 != user[i].password)
{
cout << "\t\t\t【系统提示】密码不一致!" << endl;
goto here;
}
else
{
scount++;//已注册用户加1
cout << "\t\t\t【系统提示】注册成功!" << endl;
us.save();//保存用户数据
}
break;
case 2:
cout << "\t\t\t【系统提示】请输入密码:";
while ((ch = _getch()) != '\r' && x <= 20)
{
if (ch == '\b')
{
if (x > 0)
{
x--;
cout << "\b \b";//密码支持退格的实现
}
else
putchar(7);
}
else
{
passwords0[x++] = ch;
printf("*");
}
}
passwords0[x] = '\0';
cout << endl;
user[i].password = passwords0;
cout << "\t\t\t【系统提示】请再次密码:";
while ((ch1 = _getch()) != '\r' && x1 <= 20)
{
if (ch1 == '\b')
{
if (x1 > 0)
{
x1--;
cout << "\b \b";//密码支持退格的实现
}
else
putchar(7);
}
else
{
passwords1[x1++] = ch1;
printf("*");
}
}
passwords1[x1] = '\0';
cout << endl;
//比较两次输入的密码是否统一(如果不统一则重新输入)
if (passwords1 != user[i].password)
{
cout << "\t\t\t【系统提示】密码不一致!" << endl;
goto here;
}
else
{
scount++;//已注册用户加1
cout << "\t\t\t【系统提示】注册成功!" << endl;
us.save();//保存用户数据
}
break;
}
char choice;
cout << "\t\t\t【系统提示】是否继续注册(Y/N)? :";
while (1)
{
cin >> choice;
if (choice == 'y' || choice == 'Y' || choice == 'n' || choice == 'N')
break;
else
cout << "\t\t\t【系统提示】输入格式错误,请重新输入: ";
}
if (choice == 'n' || choice == 'N')
{
break;
}
}
}
//登录
void User::Login()
{
us.read();//读取已储存用户数据
string ph;//电话
string pw;//密码
int time = 0;//统计比较次数
here:
cout << "\t\t\t【系统提示】请输入手机号:";
cin >> ph;
int chose = -1;
cout << endl;
cout << "\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
cout << "\t\t\t┃ 1.显示密码 2.隐藏密码 ┃\t\n";
cout << "\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
cout << "\t\t\t【系统提示】请输入你的选择:";
cin >> chose;
if (chose > 2 || chose < -1)
{
cout << "\t\t\t【系统提示】输入格式错误,请重新输入:";
cin >> chose;
}
string pword;
char ch, passwords0[20];
int x = 0;
switch (chose)
{
case 1:
cout << "\t\t\t【系统提示】请输入密码:";
cin >> pword;
for (int i = 0; i < scount; i++)
{
if (ph == user[i].phone && pword == user[i].password)
{
time++;
//cout << "\t\t\t【系统提示】登录成功!" << endl;
}
}
if (time == 0)
{
cout << "\t\t\t【系统提示】手机号或密码错误!" << endl;
goto here;
}
break;
case 2:
cout << "\t\t\t【系统提示】请输入密码:";
while ((ch = _getch()) != '\r' && x <= 20)
{
if (ch == '\b')
{
if (x > 0)
{
x--;
cout << "\b \b";//密码支持退格的实现
}
else
putchar(7);
}
else
{
passwords0[x++] = ch;
printf("*");
}
}
passwords0[x] = '\0';
cout << endl;
//依次比较已储存信息,比较是否匹配(如不匹配则提示错误)
for (int i = 0; i < scount; i++)
{
if (ph == user[i].phone && passwords0 == user[i].password)
{
time++;
cout << "\t\t\t【系统提示】登录成功!" << endl;
}
}
if (time == 0)
{
cout << "\t\t\t【系统提示】手机号或密码错误!" << endl;
goto here;
}
break;
}
}
int main()
{
User user;
int chose = -1;
cout << endl;
cout << "\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
cout << "\t\t\t┃ 1.注 册 2.登 录 ┃\t\n";
cout << "\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
cout << "\t\t\t【系统提示】请输入你的选择:";
cin >> chose;
if (chose > 2 || chose < -1)
{
cout << "\t\t\t【系统提示】输入格式错误,请重新输入:";
cin >> chose;
}
switch (chose)
{
case 1:user.Registers(); break;
case 2:user.Login(); break;
}
}
代码小白,仅作学习记录
文章浏览阅读94次。每隔一段时间,“读书无用论”就会在社会上广泛流传。“当初我用一麻袋的钱,买了一麻袋的书,最后把一麻袋的书卖掉,却买不起一个麻袋。”这句话生动地体现了“读书无用论”的内涵,读书不赚钱,所以读书没用。 为什么会出现这种情况呢?读书无用论,无外乎就是认为教育投资没有得到相应的回报。读书收益具有延迟性,知识技能在短时间内无法带来显著的效益,比如对于家庭条件不好的人而言,十年寒窗,学费、生活费会花掉不少钱,这还不如早点出去打工挣钱来的实在。 这就涉及一个概念:机会成本,..._“当初我用一麻袋的钱,买了一麻袋的书,最后把一麻袋的书卖掉,却买不起一个麻袋。
文章浏览阅读67次。Page.IsPostBack 是用来检查目前网页是否为第一次加载,当使用者第一次浏览这个网页时Page.IsPostBack 会传回False,不是第一次浏览这个网页时就传回True!Page_Load 事件中就可以使用ispostback来避免做一些重复的动作。主要用于对一些控件做初始化和数据绑定 有时如果不用ispostback 会发现有时出现一些莫名的错误这里我举二个例子例题一(控..._gridview不放在ispostback中 也能取值
文章浏览阅读1.7k次。 关于:va_list,va_start,va_arg的3篇文章(ZZ) 文章1:C语言中变长参数(va_list,va_start,va_arg)沉思录 转载自:http://blog.sina.com.cn/s/print_3e7df0e5010005il.html 一.引言: C语言中关于变长参数的使用很简单,无非是如下的框架。是否可以不用宏而编写处理变长参数的函数呢?答案是肯定的,本文作了一些处浅探讨,不足之处望各位批评指正。 使用宏的程序框架:#include
文章浏览阅读163次。传统组织如何转型敏捷组织 我一直在想我的客户已经成功地从基于项目/资源效率的组织转变为基于产品/流程效率的组织。 他们有以下共同点: 资深人士使经理们可以安全地进行实验。 他们创建了非常小的实验(经理或团队,或一起)。 高级经理经常问这样的问题: 您需要我什么,才能转到产品组织,我们在那儿优化产品流向客户的流程以及员工的满意度? 这是一个大问题。 这也是一个引人入胜的问..._组织转型
文章浏览阅读1k次,点赞6次,收藏9次。在Angular中,依赖注入被广泛应用于组件、服务、指令等场景,本文将详细解析Angular中的依赖注入。在Angular中,依赖注入是指将服务或值注入到组件、指令、管道等对象中,使得这些对象可以在运行时动态地获取和使用这些服务或值。依赖注入的原理主要是通过将对象的依赖关系显式地定义在一个容器中(通常是服务提供者),然后在对象被实例化时,由容器负责将这些依赖关系注入到对象中。依赖扫描:通过Angular的依赖注入系统,可以自动扫描组件、服务和指令中的依赖关系,并将其自动注入到相应的对象中。_angular依赖注入使用
文章浏览阅读329次。效果一HTML<div class="zh-loading"><ul><li></li><li></li><li></li><li></li></ul></div>CSSweb前端开发学习Q-q-u-n:784783012 ,分享学习的方法和需..._前端按钮添加缓冲样式
文章浏览阅读1.1k次。成功解决caffe 编译中出现的错误“fatal error: hdf5.h: 没有那个文件或目录”解决方法第一步:在Makefile.config文件的第85行,添加/usr/include/hdf5/serial/ 到 INCLUDE_DIRS,也就是把下面第一行代码改为第二行代码。INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include..._src/caffe/layers/hdf5_output_layer.cpp:4:10: fatal error: hdf5.h: 没有那个文
文章浏览阅读345次,点赞5次,收藏9次。当在计算与真实标签的损失时我们往往采用交叉熵的方式,因为这个时候真实标签所代表的真实概率应该是常数,所以我们。而在知识蒸馏中,因为。
文章浏览阅读140次。这里汇总了医学图像、卫星图像、语义分割、自动驾驶、图像分类、人脸、农业、打架识别等多个方向的数据集资源,均附有下载链接。
文章浏览阅读404次,点赞6次,收藏7次。天翼云全套认证薅羊毛攻略,3天拿证,你敢信???_天翼云考试怎么获得机会
文章浏览阅读1.8k次。任务描述本关任务:接收给定的购物小票字符串,计算该小票的商品总金额。相关知识在 Java 类库的 java.util 包中包含一个用于进行字符串词法分析的类 StringTokenizer,该类对字符串分解的方法进行封装,简化了应用程序设计过程中的工作量。StringTokenizer类的构造方法该类的三个构造方法如下:StringTokenizer(String str) StringTokenizer(String str,String delim) StringT_学习-java字符串之stringtokenizer类分割字符串之计算购物小票商品总
文章浏览阅读84次。高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。A:编辑B:保存C:调试D:编译。