接下来将要实现用户管理模块的相关功能,用户管理模块的主要功能包括增加用户,查找用户以及保存用户等功能,查找用户时,如果查找成功,充许对查找到用户进行更新或删除操作。如果查找不成功,则给出相应的提示信息。

打开user.c文件, 首先包含要用到的头文件,同时还需要定义一个常量用来表示存储用户信息的文件,定义一个单链表的头节点,并初试化为空。具体实现如下:

#pragma warning(disable:4996)
 
//Header Info
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //使用memset函数 memset是字符串处理函数
#include <conio.h> //使用kbhit()函数 来星号显示密码
#include "user.h"
#include <assert.h>
 
#define USER_FILE "user.dat" //表示用来存储用户信息的文件
user* first_user = NULL;  //定义一个头节点, 初始化为NULL

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

下面来实现主要的处理函数:

1.新增用户

函数名称:add_user

函数功能:新增一个用户信息,在管理员操作菜单中,选择6调用本函数,由于用户名不充许重复,所以用户输入用户名和密码后,需要在用户链表中查询用户名是否重复。

处理流程:1创建一个用户节点new_user. 2初始化new_user. 3.调用函数input_user(), 提示用户输入用户信息,为new_user赋值。4.调用函数find_user(),查找用户名是否存在,如果新增用户名不存在,则增加该用户,否则提示相应的信息。具体实现如下:

//新增用户信息
void add_user()
{
    char try_again = 'Y';
    user* p = NULL;
    user* new_user= (user*)malloc(sizeof(user));
    assert(new_user != NULL);
    while(try_again == 'Y' || try_again == 'y')
    {
        memset(new_user,0,sizeof(user));
        printf(">增加用户信息...\n");
        input_user(&(new_user->ui));
        //对比用户名是否已存在
        p = find_user(new_user->ui.username);
        if(NULL == p)
        {
            p = get_last_user();
            p->next = new_user;
            break;
        }
 
        printf(">用户[ %s ]已存在.重新输入?(y or n ):",new_user->ui.username);
        fflush(stdin);
        try_again = getchar();
        if(try_again !='y' && try_again !='Y')
        {
            free(new_user);
        }
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

2.查找用户

函数名称:search_user

函数功能:查找用户信息,在管理员操作菜单中选择7调用本函数,提示用户输入要查询的用户名,在用户链表中进行查找,如果查找成功,显示该用户信息,并提示按d/D键删除该用户信息,按u/U键更新该用户信息。如果查找不成功,则给出提示信息。

处理流程:1提示用户输入要查询的用户名,根据用户名进行查找。2调用函数find_user()查找输入的用户名信息,若存在,则将用户信息赋值给节点p。3如果没有找到,则给出提示信息,如果找到了则调用show_user()函数,显示该用户信息,并提示用户可以对该用户信息进行删除或更新操作。具体实现如下:

void search_user()
{
    char input_char = 'Y';
    char username[MAX_USERNAME] = {0};
    user* p = NULL;
    while(input_char == 'Y' || input_char == 'y')
    {
        printf(">查找用户信息...\n");
        printf(">请输入用户名(最大长度为 %d):",MAX_USERNAME);
        fflush(stdin);
        scanf("%s",username);
        p = find_user(username);
        if(p == NULL)
        {
            printf(">未找到用户:%s的信息.继续查找?(y or n)",username);
            fflush(stdin);
            input_char = getchar();
            continue;
        }
        show_user(&(p->ui));
        printf(">查找成功!按d/D键删除该用户,按u/U键更新该用户信息,按其它键返回!");
        fflush(stdin);
        input_char = getchar();
        if(input_char == 'd'||input_char == 'D')
        {
            delete_user(p);
        }else if(input_char =='U' || input_char == 'u')
        {
            update_user(p);
        }
        printf(">继续查找其它用户吗?(y or n):");
        fflush(stdin);
        input_char = getchar();
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

3.删除用户信息

函数名称:delete_user

函数功能:管理员在查找到用户成功时,充许对其找到的用户信息进行删除操作。

处理流程:提示用户是否确认要删除该用户信息,如果输入"y"或"Y", 则删除该用户信息,否则继续查找。具体实现如下:

void delete_user(user* p)
{
    char input_char = 'N';
    user* previous = NULL;
    printf(">确认要删除用户 [%s] 吗?(y or n):",p->ui.username);
    fflush(stdin);
    input_char = getchar();
    if(input_char == 'y' || input_char == 'Y')
    {
        previous = get_previous_user(p);
        previous->next = p->next;
        free(p);
        p = NULL;
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

4.更新用户信息

函数名称:update_user

函数功能:管理员在查找到用户成功时,充许对找到的用户信息进行更新操作。

处理流程:1创建一个用户信息new_p, 2调用函数input_user()往new_p中输入用户信息。3在用户链表中查找该用户是否存在,如果输入的用户名已存在,并且这个用户名不是原来的p,系统给出相关提示信息,等待下一步操作,否则进行更新操作。具体实现如下:

//更新用户信息
void update_user(user* p)
{
    char input = 'y';
    user* exist_p = NULL;
    user_info* new_p = (user_info*)malloc(sizeof(user_info));
    assert(new_p != NULL);
    while(input == 'y'|| input == 'Y')
    {
        memset(new_p,0,sizeof(user_info));
        input_user(new_p);
        //查找当前更新时输入的用户名是否已经存在
        exist_p = find_user(new_p->username);
        //如果单链表中存在这个用户名,且新更新的用户名和刚才被更新的用户名不相等
        //则表示不能进行更新
        if(exist_p != NULL && exist_p != p)
        {
            printf(">用户[%s] 已存在.请选用其它用户名.\n",exist_p->ui.username);
            printf(">重新输入?(y or n):");
            fflush(stdin);
            input = getchar();
        }else{
            strcpy(p->ui.username,new_p->username);
            strcpy(p->ui.password,new_p->password);
            p->ui.user_type = new_p->user_type;
            break;
        }
    }
    free(new_p);
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

5.保存用户信息

1.函数名称:save_users

函数功能:管理员操作菜单中选择8调用本函数,用来保存用户信息,函数中通过调用save_users_to_file()函数将用户信息保存到文件中,并给出提示信息,具体实现如下:

void save_users()
{
    save_users_to_file();
    printf(">保存成功!按任意键返回...");
    fflush(stdin);
    getchar();
}

2.保存用户信息到文件

函数名称:save_users_to_file
函数功能:将用户信息保存到文件。具体实现如下:
void save_users_to_file()
{
    FILE* fp = fopen(USER_FILE,"wb");
    user* p = first_user;
    while(p != NULL)
    {
        fwrite(&(p->ui),sizeof(user_info),1,fp);
        fseek(fp,0,SEEK_END);
        p = p->next;
    }
 
    fclose(fp);
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

上面完成了用户管理模块的主要功能函数,但是还需要一些辅助函数才能完整的实现用户管理模块的功能,这些辅助函数实现如下:

1.用户模块初始化

函数名称:init_user

函数功能:设定默认的用户名为admin, 密码为123,权限为管理员,如果存储用户信息的文件不存在则创建一个,如果创建失败则给出提示信息。具体实现如下:

void init_user()
{
    FILE* fp = NULL;
    user_info default_admin;
    strcpy(default_admin.username,"admin");
    strcpy(default_admin.password,"123");
    default_admin.user_type = ADMIN;
    fp = fopen(USER_FILE,"r");
    if(NULL == fp)
    {
        fp = fopen(USER_FILE, "wb");
        fwrite(&default_admin,sizeof(user_info),1,fp);
    }
    fclose(fp);
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

2.加载用户信息

函数名称:load_users

函数功能:从用户文件中将用户信息加载到用户链表中。具体实现如下:

void load_users()
{
    user* u = NULL;
    user* last = NULL;
    FILE* fp = NULL;
    int count = 0; 
    u = (user*)malloc(sizeof(user));
    memset(u,0,sizeof(user));
    u->next = NULL;
    //以只读方式打开二进制文件USER_FILE
    fp = fopen(USER_FILE , "rb");
    //将文件指针置为文件开始处
    fseek(fp,0,SEEK_SET);
    //从文件中逐个读取用户信息,并把它们存放到用户链表中
    while(fread(&(u->ui),sizeof(user_info),1,fp) == 1)
    {
        if(first_user == NULL)
        {
            first_user = u;
        }else{
            last = get_last_user();
            last->next = u;
        }
        count++;
        //以user_info长度为单位相对文件开始位置
        //偏移文件指针的位置
        fseek(fp,count*sizeof(user_info),SEEK_SET);
        u = (user*)malloc(sizeof(user));
        memset(u,0,sizeof(user));
        u->next = NULL;
    }
    free(u);
    u = NULL;
    fclose(fp);
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

3.判断用户类型

函数名称:login

函数功能:用户登录功能,如果输入正确,返回用户类型。

处理流程:1.提示输入登录名和密码,2.在用户链表中查找是否存在该登录名,若不存在,则给出提示信息,否则继续判断密码是否匹配,如果匹配成功,则返回用户权限类型,否则给出提示信息。具体实现如下:

USER_TYPE login()
{
    char username[MAX_USERNAME] = {0};
    char password[MAX_PASSWORD] = {0};
    int j = 0;
    char try_again = 'Y';
    user* p = NULL;
    while(try_again == 'y' || try_again == 'Y')
    {
        printf("请输入用户名:");
        fflush(stdin);
        scanf("%s",username);
        printf("  请输入密码:");
        fflush(stdin);
        //scanf("%s",password);
        //密码输入处理:输入一个字符,回显一个星号
        getLine(password,MAX_PASSWORD);
        //printf("\n");
        p = find_user(username);
        if(p == NULL)
        {
            printf("\n用户名输入有误.请重试!\n");
        }else if(strcmp(p->ui.password,password) != 0)
        {
            printf("\n密码输入有误.请重试!按任意键继续...\n");
        }else{
            return p->ui.user_type;
        }
        printf(">重新输入吗?按其它键退出系统(y or Y 继续):");
        fflush(stdin);
        try_again = getchar();
    }
    exit(0);
}
 
//密码输入处理,输入一个字符就回显一个星号
char *getLine(char *buf,int len)
{
    int i = 0;
    char ch;
    
    fflush(stdin);
    /*while(i<len-1 && '\n' !=(ch = kbhit()))*/
    while(i<len-1)
    {
        //ch 第一次接收到一个字符之后, 以后一直存在这个字符,所以输入失效
        /*if('\0' != ch){*/
        if(0 != kbhit()){
            //kbhit()只能检测到键盘是否有键位按下,如果有则返回非零值,否则返回零
            //返回的这个非零值并非代码键位的ASCII值,所以返回值不能用
            //getchar()用来接收输入的字符串,输入一个就回显一个直到遇到空格或回车
            //才停止接收输入
            //ch = getchar();
            ch = getch();
            //c中 \r 才是代表 回车符
            if(ch == '\r') break;
            putchar('*');
            buf[i] = ch;
            ++i;
        }
    }
    buf[i] = '\0';
    return buf;
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

4.清除用户链表

函数名称:clear_users

函数功能:从内存中清除用户链表中的内容。具体实现如下:

void clear_users()
{
    user* p = NULL;
    //从头节点往后一个个清空
    while(first_user != NULL)
    {    
        if(first_user->next != NULL)
        {
            p = first_user;
            first_user = first_user->next;
            free(p);
            p = NULL;
        }else{
            free(first_user);
            first_user = NULL;
        }
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

5.取用户链表中的最后一个节点

函数名称:get_last_user

函数功能:取得用户链表中的最后一个节点并返回该节点指针。具体实现如下:

user* get_last_user()
{
    user* p = first_user;
    while((NULL != p) &&(p->next != NULL))
    {
        p = p->next;
    }
    return p;
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

6.取某节点的前驱节点

函数名称:get_previous_user

函数功能:取得节点p的前驱节点并返回该节点的指针。具体实现如下:

user* get_previous_user(user* p)
{
    user* previous = first_user;
    while(previous != NULL)
    {
        if(previous->next == p)
        {
            break;
        }
        previous = previous->next;
    }
    return previous;
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

7.显示用户信息

函数名称:show_user

函数功能:显示用户信息。具体实现如下:

void show_user(user_info* info)
{
    printf("------------------------------------------\n");
    printf("  用户名:%s\n",info->username);
    printf("    密码:%s\n",info->password);
    printf("用户类型:%s\n",info->user_type == ADMIN ? "admin" : "user");
    printf("\n");
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

8.输入用户信息

函数名称:input_user

函数功能:提示用户输入用户相关信息,具体实现如下:

void input_user(user_info* info)
{
    printf(">请输入用户名(最大长度为 %d):",MAX_USERNAME);
    fflush(stdin);
    scanf("%s",info->username);
    printf(">请输入密码(最大长度为 %d):",MAX_PASSWORD);
    fflush(stdin);
    scanf("%s",info->password);
    printf(">请输入用户类型(%d 是管理员,%d 是普通用户):",ADMIN,USER);
    fflush(stdin);
    scanf("%d",&(info->user_type));
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

9查找一个用户

函数名称:find_user

函数功能:从用户链表中查找指定的用户名是否存在,若存在则返回该用户节点指针,否则返回NULL。具体实现如下:

user* find_user(char* name)
{
    user* p = first_user;
    int is_found = 0;
    while(p != NULL)
    {
        //字段比对,如果相同则strcmp返回0
        if(strcmp(p->ui.username,name) == 0)
        {
            is_found = 1;
            break;
        }
        p = p->next;
    }
    if(is_found)
    {
        return p;
    }
    return NULL;
}

到此为止,图书管理系统的三大功能模块:登录管理模块,图书信息管理模块和用户信息管理模块已基本实现完毕,接下来是系统操作过程分析,具体情况请转入:<< C项目实践--图书管理系统(4)>>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

C项目实践--图书管理系统(3)的更多相关文章

  1. C项目实践--图书管理系统(1)

    1.功能需求分析 图书管理系统主要用于对大量的图书信息,包括书名.作者.出版社.出版日期.ISBN(书号)等进行增.删.改.查以及保存等操作.同时也包括对用户的管理,用户包括管理员和普通用户两种权限, ...

  2. C项目实践--图书管理系统(2)

    前面在<<C项目实践-图书管理系统(1)>>中把系统中的三大功能模块中可能涉及到的常量,结构体及相关函数进行了声明定义,下来就来实现它们. 执行系统首先从登录到系统开始,所以首 ...

  3. C项目实践--图书管理系统(4)

    前面已经把图书管理系统的所有功能模块都已实现完毕了,下面通过运行来分析该系统的操作流程并检验是否符合逻辑设计要求. 3.系统操作过程 F5 运行 1.登录系统 系统运行之后,提示输入用户名和密码,系统 ...

  4. javaWeb项目之图书管理系统(附视频讲解)

    视频播放地址:javaWeb图书系统 本系统为"Swing项目之图书管理系统"(此源码已共享)的Web版,网页框架用采用EasyUI 数据库为MysqL,写Web项目摒弃了火狐浏览 ...

  5. 新建Django项目示例--图书管理系统

    知识点: Django 1. 安装 1. Django版本 1.11.xx 2. 安装方式 1. 命令行 --> Python环境(双版本,pip的使用) 2. PyCharm安装 2. 创建D ...

  6. Java小项目迷你图书管理系统

    package 迷你图书管理系统; import java.util.Scanner; public class BookMgr { public static void main(String[] ...

  7. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(3) - 使用Conductor切换页面

    前两章中, 我们已经实现了这个图书管理系统的登录窗口, 并实施了完善的单元测试. 该是时候回过头来关注我们的主窗口了. 一个功能丰富的系统一般会有多个页面, 我们图书管理系统虽然是"简易&q ...

  8. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(1)

    .NET Core 3.0已经发布了,除了一大堆令人激动的功能以外,也增加了对WPF的正式支持, 那么WPF在.NET Core 3.0下的开发体验如何呢? 本文利用了Stylet框架开发.NET C ...

  9. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(4) - 图书列表界面

    在前三章中我们完成了登录窗口, 并掌握了使用Conductor来切换窗口, 但这些其实都是在为我们的系统打基础. 而本章中我们就要开始开发系统的核心功能, 即图书管理功能了. 通过本章, 我们会接触到 ...

随机推荐

  1. AutoItLibrary之键盘操作(send)

    最近有人问到我键盘操作用什么库?用到库里面的哪个方法?我在这里总结一下,第一次写,有片面的地方还请指出,一块进步.1.首先,用到的库是AutoItLibrary,用到的方法是send:按F5可用看到 ...

  2. sqlserver建dblink

    --建立连接exec sp_addlinkedserver'ITSV' ,'' , 'SQLOLEDB' ,'IP地址不加端口' exec sp_addlinkedsrvlogin'ITSV' ,'f ...

  3. Hadoop异常总结

    版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处:http://www.cnblogs.com/sxt-zkys/QQ技术交流群:299142667 Hadoop异常总结 had ...

  4. HDU 5487 Difference of Languages

    Difference of Languages Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. ...

  5. 在C#代码中应用Log4Net系列教程(附源代码)地址

    在博客园看到一篇关于Log4Net使用教程,比较详细,感谢这位热心的博主 博客园地址:http://www.cnblogs.com/kissazi2/archive/2013/10/29/339359 ...

  6. 成为七牛云 Contributor -如何贡献 logkit 代码

    logkit 是 Pandora 开源的一个通用的日志收集工具,可以将不同数据源的数据方便的发送到 Pandora 进行数据分析.除了基本的数据发送功能,logkit 还有容错.并发.监控.删除等功能 ...

  7. MTK GPIO 新增变量配置

    主要涉及的文件: 1.需要配置preloader ,lk ,kernel vendor GPIO_YuSu.cmp文件增加IO别名: 2.需要配置preloader ,lk ,kernel vendo ...

  8. 两行代码搞定UI主流框架

    XCNavTab XCNavTab适用于快速搭建NavigationController和TabBarController相结合的框架 https://github.com/xiaocaiabc/XC ...

  9. Java多线程干货系列—(四)volatile关键字

    原文地址:http://tengj.top/2016/05/06/threadvolatile4/ <h1 id="前言"><a href="#前言&q ...

  10. linux service命令解析(重要)

    我们平时都会用service xxx start来启动某个进程,那么它背后究竟执行了什么? 其实service的绝对路径为/sbin/service ,打开这个文件cat /sbin/service, ...