//基本上80%符合了,最后一个管理库存函数没写,不知道是什么意思
//libh
#ifndef LIB_H
#define LIB_H
#include <string>
#include <map>
#include <vector>
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;
struct User;
class Library{
public:
Library(string lib_file);
void proceedLoadingData(const string &file);
void popMenu(string user_name = string());
void proceedOPtions(int option, string &user_name);
User findUser(const string &user_name);
void userRegister();
void userLogin();
void lookUpBorrowedBook(const string &user_name);
void lookUpBorrowedHistory(const string &user_name);
void addBorrowingBook(const string &user_name);
void deleteBorrowedBook(const string &user_name);
void modifiedUserPassword(const string &user_name);
void manageLibrary();
void saveAndExit();
static int max_user;
private:
string data_file;
User m_user;
int m_userSize;
User m_loginUser;
};
struct User{
User();
string name;
int number;
string password;
int borrowed;
string history;
string book_isbn;
};
#endif
//libcpp
#include "libh"
#include <functional>
int Library::max_user = 40;
Library::Library(string lib_file)
:data_file(lib_file), m_loginUser(NULL){
proceedLoadingData(lib_file);
if(m_userSize == 0){
m_user = new User[40];
m_user[0]name = "Admin";
m_user[0]password = "Admin";
m_user[0]number = 0;
m_user[0]borrowed = 0;
m_user[0]book_isbn = "null";
m_user[0]history = "null";
m_userSize++;
}
}
void Library::proceedLoadingData(const string &file){
ifstream fin;
finopen(filec_str());
if(!fin)
return;
int num_user = 0;
while(finpeek() != EOF){
string line;
getline(fin, line);
num_user++;
}
finclear();
finseekg(0);
m_user = new User[40];
num_user = 0;
while(finpeek() != EOF){
string line;
getline(fin, line);
stringstream s_line(line);
s_line >> m_user[num_user]name >> m_user[num_user]password
>> m_user[num_user]number >> m_user[num_user]borrowed
>> m_user[num_user]book_isbn >> m_user[num_user]history;
num_user++;
if(num_user == Library::max_user)
break;
}
m_userSize = num_user;
finclose();
}
void Library::popMenu(string user_name){
const string menu1 = "==========书屋管理系统============\n1。添加新用户\n2。登录用户\n3。退出\n";
const string menu2 = "==========书屋管理系统============\n1。查看借书记录\n2。查看已借书本\n3。添加借书\n4。注销借书\n5。修改密码\n6。退出\n";
const string menu3 = "==========书屋管理系统============\n1。管理书屋库存\n2。退出\n";
cinsync();
cinclear();
if(user_nameempty())
cout << menu1;
else if (user_name == "Admin")
cout << menu3;
else
cout << menu2;
cout << "请选择:";
int option;
cin >> option;
proceedOPtions(option, user_name);
}
void Library::proceedOPtions(int option, string &user_name){
switch(option){
case 1:
{
if(user_nameempty())
userRegister();
else if (user_name == "Admin")
manageLibrary();
else
lookUpBorrowedHistory(user_name);
break;
}
case 2:
{
if(user_nameempty())
userLogin();
else if(user_name == "Admin")
saveAndExit();
else
lookUpBorrowedBook(user_name);
break;
}
case 3:
{
if(user_nameempty())
saveAndExit();
else if(user_name == "Admin")
cout << "选择错误!" << endl;
else
addBorrowingBook(user_name);
break;
}
case 4:
{
if(user_nameempty() || user_name == "Admin")
cout << "选择错误!" << endl;
else
deleteBorrowedBook(user_name);
break;
}
case 5:
{
if(user_nameempty() || user_name == "Admin")
cout << "选择错误!" << endl;
else
modifiedUserPassword(user_name);
break;
}
case 6:
{
if(user_nameempty() || user_name == "Admin")
cout << "选择错误!" << endl;
else
saveAndExit();
break;
}
default:
cout << "选择错误!" << endl;
}
if(m_loginUser)
user_name = m_loginUser->name;
popMenu(user_name);
}
void Library::userRegister(){
if (m_userSize >= max_user)
{
cout << "用户数已经达到最大!" << endl;
return;
}
string user_name, user_password;
while(true){
cout << "请输入用户名:";
cin >> user_name;
for (int i = 0; i < m_userSize; i++)
{
if(m_user[i]name == user_name){
cout << "用户名已存在!" << endl;
continue;
}
}
break;
}
cout << "请输入密码:";
cin >> user_password;
m_user[m_userSize]name = user_name;
m_user[m_userSize]password = user_password;
m_user[m_userSize]number = m_userSize;
m_user[m_userSize]borrowed = 0;
m_user[m_userSize]book_isbn = "null";
m_user[m_userSize]history = "null";
m_userSize++;
cout << "注册成功!" << endl;
}
void Library::userLogin(){
string user_name;
cout << "请输入用户名:";
cin >> user_name;
for(int i = 0; i < m_userSize; i++){
if(m_user[i]name == user_name){
string password;
while(true){
cout << "请输入密码:";
cin >> password;
if(password != m_user[i]password)
cout << "密码错误!" << endl;
else
break;
}
m_loginUser = &m_user[i];
cout << "登陆成功!" << endl;
return;
}
}
cout << "没有此用户!" << endl;
return;
}
void Library::lookUpBorrowedBook(const string &user_name){
User user = findUser(user_name);
cout << user->book_isbn << endl;
}
void Library::lookUpBorrowedHistory(const string &user_name){
User user = findUser(user_name);
cout << user->history << endl;
}
void Library::deleteBorrowedBook(const string &user_name){
User user = findUser(user_name);
string delete_isbn;
while(true){
cout << "请输入要删除的书本编号:";
cin >> delete_isbn;
if (user->book_isbnfind(delete_isbn) == string::npos)
cout << "没有此书本编号!" << endl;
else{
user->book_isbnreplace(user->book_isbnfind(delete_isbn), delete_isbnsize(), "");
user->borrowed--;
cout << "删除成功!" << endl;
break;
}
}
}
void Library::addBorrowingBook(const string &user_name){
User user = findUser(user_name);
if(((user->number>=1 && user->number<=9) && user->borrowed>=5) ||
((user->number>=10 && user->number<=39) && user->borrowed>=3)){
cout << "已到达最大借书量!" << endl;
return;
}
string book_isbn;
cout << "请输入要借的书本编号:";
cin >> book_isbn;
user->book_isbn == "null" user->book_isbn = book_isbn : user->book_isbnappend("," + book_isbn);
user->history == "null" user->history = book_isbn : user->historyappend("," + book_isbn);
user->borrowed++;
}
void Library::modifiedUserPassword(const string &user_name){
User user = findUser(user_name);
string passowrd;
while(true){
cout << "请输入旧密码:";
cin >> passowrd;
if (passowrd != user->password)
cout << "密码不正确!" << endl;
else
break;
}
string check_password;
do{
cout << "请输入新密码:";
cin >> passowrd;
cout << "请再次输入新密码:";
cin >> check_password;
}while(passowrd != check_password);
user->password = passowrd;
cout << "修改成功!" << endl;
}
User Library::findUser(const string &user_name){
for (int i = 0; i < m_userSize; i++)
{
if(m_user[i]name == user_name)
return &m_user[i];
}
cerr << "寻找用户出现异常!程序终止!" << endl;
return NULL;
}
void Library::manageLibrary(){
}
void Library::saveAndExit(){
ofstream fout;
foutopen(data_filec_str(), ios::out|ios::trunc);
for(int i = 0; i < m_userSize; i++){
fout << m_user[i]name << " " << m_user[i]password << " "
<< m_user[i]number << " " << m_user[i]borrowed << " "
<< m_user[i]book_isbn << " " << m_user[i]history << endl;
}
foutclose();
exit(0);
}
User::User(){
number = 0;
password = "user";
}
//maincpp
#include "libh"
#include <iostream>
int main(){
string file_path = "libtxt";
fstream fin;
finopen(file_pathc_str());
if(!fin){
cout << "默认路径不正确,请手动输入载入数据路径:";
cin >> file_path;
}
Library library = new Library(file_path);
library->popMenu();
return 0;
}
父进程在什么情况下可以相同
Liunx *** 作 - Record14—父子进程中的相同与不同 - 恋蛩音的博客 - CSDN博客
2020年2月16日进程共享 fork后: 父子相同处 全局变量、data、text、栈、堆、环境变量、用户ID、宿主
CSDN博客
父子进程 - 龙宇在天 - 博客园
2020年12月18日不同处:1进程ID 2fork返回值 3父进程ID 4进程运行时间 5闹钟(定时器) 6未决信号集 父子进程相同处和不同处是在只读情况下成立,
博客园
父子进程同步 - Fitz1318的博客 - CSDN博客 - 父进程和子进程是同步的
1 如果子进程还未结束,父进程阻塞等待
2 如果子进程已经结束,其终止状态字SIGCHILD放在指定位置等待父进程提取,这时,父进程可立即得到终止状态字并返回
3 如果没有子进程,父进程立即错误返回。
CSDN博客
Linux8 - fork父子进程逻辑地址相同、进程的逻辑地址与物理地址、fork相
1 正常释放结束子进程: 1、进程实体已经被释放; 2、PID内部的exit_code = 0; //进程的退出码,将PID内部的退出码置零; 3
2 非正常流程、僵死状态:没有获取退出码
CSDN博客
大家还在搜
父进程和子进程共享虚拟地址空间
父进程与子进程之间的关系
父子进程共享
并发指的是什么
父进程和子进程相同和不同
父进程如何创建子进程
父进程和子进程具有相同的
父子进程可以并发执行
变量地址相同——虚拟内存 - Ethan - Code的博客 - CSDN博客 - 父进程
5月6日会完全复制父进程的栈空间,包括页表,但没有复制物理页面,所以这时虚拟地址相同,物理地
CSDN博客
父进程在创建子进程之后,哪些东西共享,哪些东西不共享
1 父进程等待子进程完成。在这种情况下,父进程无须对其描述符做任何处理。当子进程终止之后,它曾进行过读、写的人一个共享描述符的文件偏移量
2 父、子进程各自执行不同的程序段。这种情况下,在fork之后,多宝父、子进程各自关闭它们不需使用的文件描述符,这样就不会干扰对方使用的文件描述符
CSDN博客
fork之后父子进程虚拟地址(逻辑地址)相同的问题 - 飞雪一刀的博客 - CS
2014年11月7日可以看到,两个进程中实例的虚拟地址都是一样的,但是实际上指向的是两个不同的变量(物理地
CSDN博客
父子进程folk后的相同点不同点以及进程共享知识点 - 一头特立独行的驴
2020年11月11日父子进程之间在刚fork 后: 相同点:全局变量、data、text、栈、堆、环境变量、用户 ID、宿主目录、进程工作目录、信号处理方式…
CSDN博客
父子进程共享 - 一只小苹果的博客 - CSDN博客 - 父子进程共享
2020年12月3日父子进程不同(重点): 进程id 返回值 各自的父进程 进程创建的时间 闹钟 未决信号集 父子进程共享(重点): 1文件描述符(fd) 2mmap映射区
CSDN博客
大家还在搜
子进程和父进程的理解
父进程和子进程哪些是共享的
父子进程可以同名吗
关于子进程和父进程的说法
用户级线程有没有线程控制块
一个进程可以没有父进程
以下关于父进程和子进程的叙述中
子进程会继承父进程的哪些内容
下一页
父进程在什么情况下可以相同
百度Liunx *** 作 - Record14—父子进程中的相同与不同 - 恋蛩音的博客 - CSDN博客
2020年2月16日进程共享 fork后: 父子相同处 全局变量、data、text、栈、堆、环境变量、用户ID、宿主
CSDN博客
父子进程 - 龙宇在天 - 博客园
2020年12月18日不同处:1进程ID 2fork返回值 3父进程ID 4进程运行时间 5闹钟(定时器) 6未决信号集 父子进程相同处和不同处是在只读情况下成立,
博客园
父子进程同步 - Fitz1318的博客 - CSDN博客 - 父进程和子进程是同步的
1 如果子进程还未结束,父进程阻塞等待
2 如果子进程已经结束,其终止状态字SIGCHILD放在指定位置等待父进程提取,这时,父进程可立即得到终止状态字并返回
3 如果没有子进程,父进程立即错误返回。
CSDN博客
Linux8 - fork父子进程逻辑地址相同、进程的逻辑地址与物理地址、fork相
1 正常释放结束子进程: 1、进程实体已经被释放; 2、PID内部的exit_code = 0; //进程的退出码,将PID内部的退出码置零; 3
2 非正常流程、僵死状态:没有获取退出码
CSDN博客
大家还在搜
父进程和子进程共享虚拟地址空间
父进程与子进程之间的关系
父子进程共享
并发指的是什么
父进程和子进程相同和不同
父进程如何创建子进程
父进程和子进程具有相同的
父子进程可以并发执行
变量地址相同——虚拟内存 - Ethan - Code的博客 - CSDN博客 - 父进程
5月6日会完全复制父进程的栈空间,包括页表,但没有复制物理页面,所以这时虚拟地址相同,物理地
CSDN博客
父进程在创建子进程之后,哪些东西共享,哪些东西不共享
1 父进程等待子进程完成。在这种情况下,父进程无须对其描述符做任何处理。当子进程终止之后,它曾进行过读、写的人一个共享描述符的文件偏移量
2 父、子进程各自执行不同的程序段。这种情况下,在fork之后,多宝父、子进程各自关闭它们不需使用的文件描述符,这样就不会干扰对方使用的文件描述符
CSDN博客
fork之后父子进程虚拟地址(逻辑地址)相同的问题 - 飞雪一刀的博客 - CS
2014年11月7日可以看到,两个进程中实例的虚拟地址都是一样的,但是实际上指向的是两个不同的变量(物理地
CSDN博客
父子进程folk后的相同点不同点以及进程共享知识点 - 一头特立独行的驴
2020年11月11日父子进程之间在刚fork 后: 相同点:全局变量、data、text、栈、堆、环境变量、用户 ID、宿主目录、进程工作目录、信号处理方式…
CSDN博客
父子进程共享 - 一只小苹果的博客 - CSDN博客 - 父子进程共享
2020年12月3日父子进程不同(重点): 进程id 返回值 各自的父进程 进程创建的时间 闹钟 未决信号集 父子进程共享(重点): 1文件描述符(fd) 2mmap映射区
CSDN博客
大家还在搜
子进程和父进程的理解
父进程和子进程哪些是共享的
父子进程可以同名吗
关于子进程和父进程的说法
用户级线程有没有线程控制块
一个进程可以没有父进程
以下关于父进程和子进程的叙述中
子进程会继承父进程的哪些内容
下一页
父进程在什么情况下可以相同
百度
第一,网站要做的正规可查。对于绝大多数互联网产品而言,用户在产生购买欲望后,都会通过互联网来查询产品的来源渠道及产商信息,那么产品网站就成了信息交互的重要渠道。因此网站的建设至关重要,好的网站能让用户一眼看到其中包含的重要信息,增加产品的权威信和真实性。而且还能彰显企业的实力和知名度,让网站为产品背书,以此赢得消费者的信赖。
第二,互联网产品网站要做到真实可信,切勿虚假夸大。对于网站而言,它代表的是一个企业的官方形象和企业信誉,所以在网站建设过程中,对于所售卖的产品要保证真实有效,不能虚假夸大其功能和作用。如果该产品网站存在过度宣传及夸大等行为,会让用户产生反感心理,进而影响购买行为的产生。
第三,网站页面要尽可能的干净整洁,重要内容前置。对于用户而言,当他们在互联网上检索产品网站时,就是为了印证相关的信息,如产品厂家、可靠性、是否有技术背书等等,如果网站做的营销性过强,影响客户的正常浏览,那么就会对客户造成一些不好的体验,这样会影响用户的购买行为。所以互联网产品网站在建站的时候,首页要保持大气、干净、有主次等特点,让用户一眼能看到企业及产品的相关信息,增强用户黏性。
第四,要持续优化并推出新功能。对于互联网产品网站而言,要随时保持与用户的黏性,想要与客户产生深度沟通,那就要在网站上下功夫。不能仅仅局限于网站的普通功能,在抓住用户眼球后,更要深入研发一些新的功能,让用户在使用过程中产生新奇感,培养用户的长期使用习惯。
以上就是关于C++程序 要求:1.书屋有40个有效用户,普通用户编号从1-39,1-9号用户能借阅的最大书本数量为5,10-39号用全部的内容,包括:C++程序 要求:1.书屋有40个有效用户,普通用户编号从1-39,1-9号用户能借阅的最大书本数量为5,10-39号用、父进程在什么情况下可以相同、互联网产品取得用户对网站的信任,有什么基本原则和有效方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)