C语言实现的飞机票系统解析

news2024/12/23 7:23:56

前言

操作系统:Windows下运行。如果需要在Linux运行(单机版),则需要修改删除conio.h,自己写个头文件获取键盘输入。我已经写好了getch.h文件,需要将其导入使用。

开发环境:CodeBlocks || VS Code ( gcc编译 )

开发语言:C

实现功能:登录,订票,退票

数据存储:文本读写

这几个信息文件不能少!!! 少了程序跑不了!!!

相关图片(仅供参考):程序是没有涉及旅行社的

ps:图片由PowerDesigner绘制而成

ER图:


数据库:


类图:


用例图:


订票顺序图:


订票状态图:


登录活动图:


以上图片仅供参考,请自行斟酌

程序主界面


 进入子功能需要账号和密码,存储在passenger.txt文件中

ps:文件数据的顺序就是结构体的顺序

typedef struct Flight
{
    char fid[20];       //航班号
	char fname[20];	    //航班名称
    char start[10];     //起点
    char end[10];       //终点
    int fnum;	        //票数
}Flight;
 
typedef struct Passenger
{
    char pid[20];	    //身份证
    char pname[10];	    //姓名
    char password[20];	//密码
	char tell[20];	    //电话
}Passenger;
 
typedef struct Order
{
    char pid[20];	//身份证
    char fid[20];	//航班号
	int num;	    //票数
}Order;

单机版(win)

注意头文件使用的conio.h,此版本为windows,linux参考前面的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
//#include "getch.h"
#include <conio.h>
 
#define MAX_Flight 50   // 最大航班数
#define MAX_Passenger 20    // 单航班最多乘客数
#define MAX_Order 50    // 最大订票数
 
typedef struct Flight
{
    char fid[20];       //航班号
	char fname[20];	    //航班名称
    char start[10];     //起点
    char end[10];       //终点
    int fnum;	        //票数
}Flight;
 
typedef struct Passenger
{
    char pid[20];	    //身份证
    char pname[10];	    //姓名
    char password[20];	//密码
	char tell[20];	    //电话
}Passenger;
 
typedef struct Order
{
    char pid[20];	//身份证
    char fid[20];	//航班号
	int num;	    //票数
}Order;
 
Flight *FLI;    // 定义全局变量
Passenger *PAS;
Order *ORD;
 
char start[10]; //起点
char end[10];   //终点
char search_fid[50][20];    //符合条件的航班号
int search_fnum[50];        //符合条件的航班票数
int online = 0;             //是否登录的变量
char online_pid[20];        //在线用户的身份证
int search_num = 0;         //符合条件的航班数
 
void init_sys(void);	    // 系统初始化
void show_flight(void);	    // 显示航班表
void start_sys(void);	    // 系统开始运行
void exit_sys(void);	    // 退出系统
void menu(void);		    // 生成主菜单
void login(void);           // 登录
void logout(void);          //用户登出
void passenger_info(void);  //查询旅客信息
bool change_pas_info(void); //修改旅客信息
void search_start(void);	// 生成查询页面
bool search(void);	        // 查询航班
void order_list(void);	    // 生成订单表
void del_order(void);	    // 退票
void clear_stdin(void);	    // 清除输入缓冲区
char* get_str(char* str,size_t len);  // 获取字符串
char get_cmd(char start,char end);	  // 获取cmd命令
 
// 主函数
int main()
{
	init_sys();     // 系统初始化
	start_sys();    // 系统开始运行
	exit_sys();     // 系统结束
	return 0;
}
 
// 系统初始化
void init_sys(void)
{
	// 申请堆内存、加载数据
	FLI = calloc(MAX_Flight,sizeof(Flight));
	PAS = calloc(MAX_Passenger,sizeof(Passenger));
	ORD = calloc(MAX_Order,sizeof(Order));
	printf("system_init...\n");
 
    // 以只读方式打开 order.txt,如果文件不存在则打开失败,返回值为空。
	FILE* ofrp = fopen("order.txt","r");
    if(NULL == ofrp)    // 打开失败直接退出
    {
        printf("order.txt open failed!\n");
        exit(0);
    }
 
    int i = 0;
	for(i = 0; i < MAX_Order; i++)	//读取文本中的数据到内存,全局变量ORD中
	{	
        int num = 0;
		num = fscanf(ofrp,"%s %s %d\n", ORD[i].pid, ORD[i].fid, &ORD[i].num);
	}
 
	FILE* ffrp = fopen("flight.txt","r");
    if(NULL == ffrp)
    {
        printf("flight.txt open failed!\n");
        exit(0);
    }
	for(i = 0; i < MAX_Flight; i++)
	{
		int num = 0;
		num = fscanf(ffrp,"%s %s %s %s %d\n", FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, &FLI[i].fnum);
	}
 
	FILE* pfrp = fopen("passenger.txt","r");
    if(NULL == pfrp)
    {
        printf("passenger.txt open failed!\n");
        exit(0);
    }
	for(i = 0; i < MAX_Passenger; i++)
	{
		int num = 0;
		num = fscanf(pfrp,"%s %s %s %s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
	}
}
 
// 显示航班表
void show_flight(void)
{
    int i = 0;
	for(i = 0; i < MAX_Flight; i++)
	{
		if(strlen(FLI[i].fid) != 0)
		{
			printf("id:%s name:%s start:%s end:%s fnum:%d\n", FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, 
                FLI[i].fnum);
		}
	}
}
 
// 系统开始运行
void start_sys(void)
{
	// 进入系统的业务流程控制
	//printf("系统开始运行...\n");
	//show_flight();
	while(true)
	{
		menu();
		switch(get_cmd('0','7')) // 获取键盘输入
		{
			case '1': search_start(); break;
			case '2': order_list(); break;
			case '3': del_order(); break;
			case '4': passenger_info(); break;
			case '5': change_pas_info(); break;
			case '6': login(); break;
			case '7': logout(); break;
			case '0': return;
		}
	}
}
 
// 系统结束
void exit_sys(void)
{
    printf("data insert...\n");
	FILE* ofwp = fopen("order.txt","w");
	printf("ready insert order.txt\n");
	int i= 0;
	for(i = 0; i < MAX_Order; i++)	//数据存储回本地
	{
	    int num = 0;
		if(strlen(ORD[i].pid) != 0)
		{
			num = fprintf(ofwp,"%s %s %d\n", ORD[i].pid, ORD[i].fid, ORD[i].num);
			//printf("insert order.txt success\n");
		}
	}
 
    // 以只写方式打开文件flight.txt,如果文件不存在则创建,如果文件存在则把内容清空。
	FILE* ffwp = fopen("flight.txt","w");
	printf("insert flight.txt\n");
	for(i = 0; i < MAX_Flight; i++)
	{
		int num = 0;
		if(strlen(FLI[i].fid) != 0)
		{
			num = fprintf(ffwp,"%s %s %s %s %d\n", FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, FLI[i].fnum);
			//printf("insert flight.txt success\n");
		}
	}
 
	FILE* pfwp = fopen("passenger.txt","w");
	printf("insert passenger.txt\n");
	for(i = 0; i < MAX_Passenger; i++)
	{
		int num = 0;
		if(strlen(PAS[i].pid) != 0)
		{
			num = fprintf(pfwp,"%s %s %s %s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
			//printf("insert passenger.txt success\n");
		}
	}
	// 释放内存、保存数据
	free(FLI);
	free(PAS);
	free(ORD);
	printf("exit...\n");
}
 
// 生成主菜单
void menu(void)
{
    printf("\n");
    printf("********************************\n");
    printf("|                              |\n");
	printf("|      flight order system     |\n");
	printf("*      1.search_flight         *\n");  //查询航班
	printf("|      2.order_list            |\n");   //查询订票信息
	printf("*      3.del_order             *\n");    //退订
	printf("|      4.passenger_info        |\n");   //查询旅客信息
	printf("*      5.change_pas_info       *\n");  //修改旅客信息
	printf("|      6.login                 |\n");  //用户登录
	printf("*      7.logout                *\n");    //用户登出
	printf("|      0.exit_sys              |\n");   //退出系统
	printf("|                              |\n");
	printf("********************************\n");
	//printf("\n");
}
 
// 登录
void login(void)
{
    if(online == 0)	//如果没有登录
    {
        int i=0;
        int time = 0;
        while(time < 3)
        {
            char entry_pid[20]; //临时变量身份证
            char entry_pw[20];  //临时变量密码
            printf("please login!\n");
            printf("please entry pid:");
            get_str(entry_pid, 20);
            printf("please entry password:");
            get_str(entry_pw, 20);
            // 遍历所有乘客
            for(i = 0; i < MAX_Passenger; i++)
            {
                // 数据长度校验
                if(strlen(entry_pid) == 0 || strlen(entry_pw) == 0)
                {
                    printf("pid or password can't be empty\n");
                    time++;
                    break;
                }
                // 成功匹配账号密码
                else if(strcmp(PAS[i].pid, entry_pid) == 0 && strcmp(PAS[i].password, entry_pw) == 0)
                {
                    printf("login success!\n");
                    strncpy(online_pid, entry_pid, 20);
                    online = 1;
                    return;
                }
                else if(i == MAX_Passenger-1)
                {
                    printf("pid or password error\n");
                    time++;
                }
            }
        }
        online = -1;
        printf("you have been locked,you can use this system now\n");
    }
    else if(online ==1)
    {
        printf("you have been login\n");
    }
    else
    {
        printf("you have been locked,you can use this system now\n");
    }
 
}
 
// 用户登出
void logout(void)
{
    if(online == 1)	//如果已经登录
    {
        online = 0;
        printf("logout success\n");
    }
    else if(online == -1)
    {
        printf("you have been locked,you can use this system now\n");
    }
    else
    {
        printf("you have not login\n");
    }
}
 
// 查询旅客信息
void passenger_info(void)
{
    if(online == 1)	//如果已经登录
    {
        //printf("online_pid:");
        //puts(online_pid);
        int i = 0;
        for(i = 0; i < MAX_Passenger; i++)
        {
            if(strcmp(online_pid, PAS[i].pid) == 0)
            {
                printf("pid:%s, pname:%s, password:%s, tell:%s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
                break;
            }
        }
    }
    else if(online == -1)
    {
        printf("you have been locked,you can use this system now\n");
    }
    else
    {
        printf("you have not login\n");
    }
}
 
//修改旅客信息
bool change_pas_info(void)
{
    if(online == 1)	//如果已经登录
    {
        printf("your old info:\n");
        int i = 0;
        for(i = 0; i < MAX_Passenger; i++)
        {
            if(strcmp(online_pid, PAS[i].pid) == 0)
            {
                printf("pid:%s, pname:%s\npassword:%s, tell:%s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
                break;
            }
        }
        char new_pid[20] = {0};
        char new_pname[10] = {0};
        char new_password[20] = {0};
        char new_tell[20] = {0};
        printf("please entry new pid:");
        get_str(new_pid, 20);
        printf("please entry new pname:");
        get_str(new_pname, 10);
        printf("please entry new password:");
        get_str(new_password, 20);
        printf("please entry new tell:");
        get_str(new_tell, 20);
        strncpy(PAS[i].pid, new_pid, 20);
        strncpy(PAS[i].pname, new_pname, 20);
        strncpy(PAS[i].password, new_password, 20);
        strncpy(PAS[i].tell, new_tell, 20);
        printf("change success\n");
    }
    else if(online == -1)
    {
        printf("you have been locked,you can use this system now\n");
    }
    else
    {
        printf("you have not login\n");
    }
}
 
// 开始查询航班
void search_start(void)
{
	if(search())
	{
		printf("1.order\n");
		printf("0.back\n");
		char cmd = get_cmd('0', '1');
		if(cmd == '0')
		{
		    return;
			//start_sys();
		}
		else
		{
		    char fid[20];   // 选择的航班号
            if(online == 1) // 如果已经登录
            {
                printf("please entry fid:");
                get_str(fid, 20);
				if(0 == strlen(fid))
				{
					printf("fid is empty\n");
				}
                int i = 0;
                for(i = 0; i < search_num; i++)
                {
                    //printf("fid:%s s_fid:%s num:%d\n",fid,search_fid[i],search_fnum[i]);
                    if(strcmp(fid,search_fid[i]) == 0 && search_fnum[i] > 0)    //查询到对应航班
                    {
                        printf("order success\n");
                        int j = 0;
                        for(j = 0; j < MAX_Flight; j++) // 遍历航班表
                        {
                            if(strcmp(fid, FLI[j].fid) == 0)
                            {
                                FLI[j].fnum--;	//票数减1
                                break;
                            }
                        }
 
                        int k = 0;
                        for(k = 0; k < MAX_Order; k++)  // 遍历订票表
                        {
                            //printf("ready insert...\n");
                            if(strlen(ORD[k].pid) == 0) // 在空位置插入数据
                            {
                                strcpy(ORD[k].pid, online_pid);  // 插入当前用户身份证
                                strcpy(ORD[k].fid, search_fid[i]);   // 插入当前选择的航班号
                                ORD[k].num = 1;
                                printf("insert_to_order success\n");
                                break;
                            }
                        }
                        return;
                    }
                    else if(strcmp(fid,search_fid[i]) == 0 && search_fnum[i] == 0)
                    {
                        printf("no ticket\n");
                        search_start();
                    }
                    else if(i == MAX_Flight-1)
                    {
                        printf("don't have this fid\n");
                        search_start();
                    }
                }
            }
            else if(online == -1)
            {
                printf("you have been locked,you can use this system now\n");
            }
            else
            {
                login();
            }
		}
	}
}
 
// 查询航班
bool search(void)
{
    printf("start: \n");
	get_str(start,10);
	printf("end: \n");
	get_str(end,10);
	int i = 0;
	search_num = 0;
    // 遍历所有航班
	for(i = 0; i < MAX_Flight; i++)
	{
	    if(strlen(start) == 0 || strlen(end) == 0)
		{
			printf("start or end can't be empty\n");
			return false;
		}
		if(strcmp(FLI[i].start, start) == 0 && strcmp(FLI[i].end, end) == 0)
		{
			printf("fid:%s, ticket_num:%d\n", FLI[i].fid, FLI[i].fnum);
			strncpy(search_fid[search_num], FLI[i].fid, 20);
			search_fnum[search_num] = FLI[i].fnum;
			//printf("search_fid[%d]:%s, search_fun[%d]:%d\n",search_num,search_fid[search_num],search_num,search_fnum[search_num]);
			++search_num;
		}
		if(0 == search_num && i == MAX_Flight-1)
		{
			printf("no flight\n");
			return false;
		}
		if(search_num > 0 && i == MAX_Flight-1)
		{
			//show_flight();
			return true;
		}
	}
}
 
// 输出订单信息
void order_list(void)
{
    if(online == 1)
    {
        int i = 0;
        for(i = 0; i < MAX_Order; i++)
        {
            if(strcmp(online_pid, ORD[i].pid) == 0)
            {
                //printf("online_pid:%s\n",online_pid);
                printf("fid:%s, pid:%s, ticket:%d\n", ORD[i].fid, ORD[i].pid, ORD[i].num);
            }
        }
    }
    else if(online == -1)
    {
        printf("you have been locked,you can use this system now\n");
    }
    else
    {
        login();
    }
}
 
// 删除订单
void del_order(void)
{
    if(online == 1)
    {
        char fid[20];
        printf("order_list:\n");
        order_list();
        printf("please entry del_order fid:");
        get_str(fid, 20);
        int i = 0;
        // 遍历所有订单
        for(i = 0; i < MAX_Order; i++)
        {
            if(strlen(fid) == 0)  //判空
            {
                printf("del_order fid can't be empty\n");
                return;
            }
            if(strcmp(fid, ORD[i].fid) == 0)
            {
                memset(ORD[i].pid, '\0', sizeof(ORD[i].pid));
                int j = 0;
                for(j = 0; j < MAX_Flight; j++)
                {
                    if(strcmp(fid, FLI[j].fid) == 0)
                    {
                        FLI[j].fnum++;  // 返还飞机票
                        break;
                    }
                }
                printf("delete success\n");
                return;
            }
        }
    }
    else if(online == -1)
    {
        printf("you have been locked,you can use this system now\n");
    }
    else
    {
        login();
    }
 
}
 
// 清理输入缓冲区
/*void clear_stdin(void)
{
	stdin->_IO_read_ptr = stdin->_IO_read_end;//清理输入缓冲区
}
*/
 
// 读取输入字符串
char* get_str(char* str, size_t len)
{
	if(NULL == str)
	{
		puts("empty ptr!");
		return NULL;
	}
 
	char *in = fgets(str, len, stdin);
 
	size_t cnt = strlen(str);
	if('\n' == str[cnt-1])
	{
		str[cnt-1] = '\0';
	}
	else
	{
		scanf("%*[^\n]");
		scanf("%*c");
	}
	
	//clear_stdin();
 
	return str;
}
 
// 获取cmd命令
char get_cmd(char start, char end)
{
	//clear_stdin();
 
	printf("please entry cmd:");
	while(true)
	{
		char val = getch();
		if(val >= start && val <= end)
		{
			printf("%c\n",val);
			return val;
		}
	}
}

TCP联网版(win)

先运行服务端,再运行客户端

因为懒,阉割了联网版的旅客信息修改功能。

编译参考 

gcc server.c -lwsock32 -o server

效果如下:

client.c

同理这里也是Windows版本,使用winsock实现tcp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
//#include "getch.h"
#include <conio.h>
#include <WinSock2.h>
 
#pragma comment(lib,"ws2_32.lib")
 
void start_sys(void);       // 系统开始运行
char *send_cmd_recv_val(char* cmd); // 发送命令,接收返回
void show_flight(void);	    // 显示航班表
void exit_sys(void);	    // 退出系统
void menu(void);		    // 生成主菜单
void login(void);           // 登录
void logout(void);          // 用户登出
void passenger_info(void);  // 查询旅客信息
void search_start(void);	// 生成查询页面
char* search(void);	        // 查询航班
void order_list(void);	    // 生成订单表
void del_order(void);	    // 退票
char* get_str(char* str,size_t len);  // 获取字符串
char get_cmd(char start,char end);	  // 获取cmd命令
 
int main(int argv, char* argc[])
{
    system("chcp 65001");
    printf("编码转换完毕\n");
 
    start_sys();
    exit_sys();
 
	return 0;
}
 
// 发送命令,接收返回
char *send_cmd_recv_val(char* cmd)
{
    //初始化
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
 
	//创建套接字
	SOCKET clntSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
	//向服务器发送消息
	struct sockaddr_in sockAddr;
	memset(&sockAddr, 0, sizeof(sockAddr));			//每个字节都用0填充
	sockAddr.sin_family = PF_INET;
	sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	sockAddr.sin_port = htons(8888);
	connect(clntSock, (SOCKADDR*)& sockAddr, sizeof(SOCKADDR));
	
    static char buf[10240] = {0};
 
    // buf置0
    memset(buf, 0, sizeof(buf));
 
    send(clntSock, cmd, strlen(cmd) + sizeof(char), 0);
    recv(clntSock, buf, 10240, 0);
	
	//关闭套接字
	closesocket(clntSock);
 
	//终止dll
	WSACleanup();
 
    return buf;
}
 
// 显示航班表
void show_flight(void)
{
    printf("%s\n", send_cmd_recv_val("show_flight"));
}
 
// 系统开始运行
void start_sys(void)
{
	// 进入系统的业务流程控制
	//printf("系统开始运行...\n");
	//show_flight();
	while(true)
	{
		menu();
		switch(get_cmd('0','6')) // 获取键盘输入
		{
			case '1': search_start(); break;
			case '2': order_list(); break;
			case '3': del_order(); break;
			case '4': passenger_info(); break;
			case '5': login(); break;
			case '6': logout(); break;
			case '0': return;
		}
	}
}
 
// 系统结束
void exit_sys(void)
{
    printf("%s\n", send_cmd_recv_val("exit_sys"));
}
 
// 生成主菜单
void menu(void)
{
    printf("\n");
    printf("*********************************\n");
    printf("|                               |\n");
	printf("|      飞机订票系统             |\n");
	printf("*      1.查询航班               *\n");  //查询航班
	printf("|      2.查询订票信息           |\n");   //查询订票信息
	printf("*      3.退订                   *\n");    //退订
	printf("|      4.查询旅客信息           |\n");   //查询旅客信息
	printf("|      5.用户登录               |\n");  //用户登录
	printf("*      6.用户登出               *\n");    //用户登出
	printf("|      0.退出系统               |\n");   //退出系统
	printf("|                               |\n");
	printf("*********************************\n");
	//printf("\n");
}
 
// 登录
void login(void)
{
    char entry_pid[20]; //临时变量身份证
    char entry_pw[20];  //临时变量密码
    printf("请登录!\n");
    printf("请输入pid:");
    get_str(entry_pid, 20);
    printf("请输入密码:");
    get_str(entry_pw, 20);
 
    char buf[1024] = {0};
 
    snprintf(buf, 1024, "login pid:%s pw:%s", entry_pid, entry_pw);
    
    printf("%s\n", send_cmd_recv_val(buf));
}
 
// 用户登出
void logout(void)
{
    printf("%s\n", send_cmd_recv_val("logout"));
}
 
// 查询旅客信息
void passenger_info(void)
{
    printf("%s\n", send_cmd_recv_val("passenger_info"));
}
 
// 开始查询航班
void search_start(void)
{
    char buf[10240] = {0};
    snprintf(buf, 10240, "%s", search());
	if(strncmp(buf, "起始地 或 目的地 不能为空\n", 50) != 0 && strncmp(buf, "没有航班\n", 50) != 0)
	{
		printf("1.订票\n");
		printf("0.返回\n");
		char cmd = get_cmd('0', '1');
 
        memset(buf, 0, sizeof(buf));
 
		if(cmd == '0')
		{
            snprintf(buf, 10240, "%s", send_cmd_recv_val("0.返回"));
            printf("%s", buf);
            return;
			//start_sys();
		}
		else
		{
            snprintf(buf, 10240, "%s", send_cmd_recv_val("1.订票"));
		    char fid[20];   // 选择的航班号
            printf("请输入fid:");
            get_str(fid, 20);
 
            snprintf(buf, 1024, "order_ticket fid:%s", fid);
            
            printf("%s\n", send_cmd_recv_val(buf));
		}
	}
}
 
// 查询航班
char* search(void)
{
    char start[10] = {0};
    char end[10] = {0};
    printf("起始地: \n");
	get_str(start, 10);
	printf("目的地: \n");
	get_str(end, 10);
	
    char buf[1024] = {0};
    static char buf2[10240] = {0};
    memset(buf2, 0, sizeof(buf2));
 
    snprintf(buf, 1024, "search start:%s end:%s", start, end);
    
    snprintf(buf2, 10240, "%s", send_cmd_recv_val(buf));
 
    printf("%s", buf2);
    
    return buf2;
}
 
// 输出订单信息
void order_list(void)
{
    printf("%s\n", send_cmd_recv_val("order_list"));
}
 
// 删除订单
void del_order(void)
{
    printf("%s\n", send_cmd_recv_val("order_list"));
    char fid[20];
    printf("请输入要删除的fid:");
    get_str(fid, 20);
 
    char buf[1024] = {0};
    snprintf(buf, 1024, "del_order fid:%s", fid);
    
    printf("%s\n", send_cmd_recv_val(buf));
}
 
// 读取输入字符串
char* get_str(char* str, size_t len)
{
	if(NULL == str)
	{
		puts("空指针!");
		return NULL;
	}
 
	char *in = fgets(str, len, stdin);
 
	size_t cnt = strlen(str);
	if('\n' == str[cnt-1])
	{
		str[cnt-1] = '\0';
	}
	else
	{
		scanf("%*[^\n]");
		scanf("%*c");
	}
	
	//clear_stdin();
 
	return str;
}
 
// 获取cmd命令
char get_cmd(char start, char end)
{
	//clear_stdin();
 
	printf("请输入命令:");
	while(true)
	{
		char val = getch();
		if(val >= start && val <= end)
		{
			printf("%c\n",val);
			return val;
		}
	}
}

 server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
//#include "getch.h"
#include <conio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")		//加载ws2_32.dll
 
#define MAX_Flight 50   // 最大航班数
#define MAX_Passenger 20    // 单航班最多乘客数
#define MAX_Order 50    // 最大订票数
 
typedef struct Flight
{
    char fid[20];       //航班号
	char fname[20];	    //航班名称
    char start[10];     //起点
    char end[10];       //终点
    int fnum;	        //票数
}Flight;
 
typedef struct Passenger
{
    char pid[20];	    //身份证
    char pname[10];	    //姓名
    char password[20];	//密码
	char tell[20];	    //电话
}Passenger;
 
typedef struct Order
{
    char pid[20];	//身份证
    char fid[20];	//航班号
	int num;	    //票数
}Order;
 
Flight *FLI;    // 定义全局变量
Passenger *PAS;
Order *ORD;
 
char search_fid[50][20];    // 符合条件的航班号
int search_fnum[50];        // 符合条件的航班票数
int online = 0;             // 是否登录的变量
char online_pid[20];        // 在线用户的身份证
int search_num = 0;         // 符合条件的航班数
 
char *get_request_content(char *src, char *content, int max_len); // 解析请求的内容
void init_sys(void);	     // 系统初始化
char* show_flight(void);	 // 显示航班表
void exit_sys(void);	     // 退出系统
char* login(char* pid, char* pw);           // 登录
char* logout(void);          // 用户登出
char* passenger_info(void);  // 查询旅客信息
char* order_ticket(char* fid);	 // 生成查询页面
char* search(char* start, char* end);	         // 查询航班
char* order_list(void);	     // 生成订单表
char* del_order(char* fid);	     // 退票
char* get_str(char* str,size_t len);  // 获取字符串
char get_cmd(char start,char end);	  // 获取cmd命令
 
// 主函数
int main(int argv, char* argc[])
{
    system("chcp 65001");
    printf("编码转换完毕\n");
    // 系统初始化
    init_sys();
 
	// 初始化
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
 
	//创建套接字
	SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
	//绑定套接字
	struct sockaddr_in sockAddr;
	memset(&sockAddr, 0, sizeof(sockAddr));		//每个字节用0填充
	sockAddr.sin_family = PF_INET;				//使用ipv4
	sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	sockAddr.sin_port = htons(8888);			//端口
	bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
 
	//进入监听状态
	listen(servSock, 20);
 
    char cmd[1024] = {0};
    char buf[10240] = {0};
 
    for(;;)
    {
        // 接收客户端消息
        SOCKADDR clntAddr;
        int nSize = sizeof(SOCKADDR);
        SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
 
        memset(cmd, 0, sizeof(cmd));
        memset(buf, 0, sizeof(buf));
 
        printf("收到客户端命令:");
        recv(clntSock, cmd, 1024, 0);
        printf("%s\n", cmd);
        if(NULL != strstr(cmd, "exit_sys"))
        {
            //关闭套接字
	        closesocket(clntSock);
            break;
        }
        else if(NULL != strstr(cmd, "search"))
        {
            char* start = get_request_content(cmd, "start:", 20);
            char* end = get_request_content(cmd, "end:", 20);
 
            snprintf(buf, 10240, "%s", search(start, end));
            send(clntSock, buf, strlen(buf) + sizeof(char), 0);
        }
        else if(0 == strncmp(cmd, "1.订票", 10))
        {
            snprintf(buf, 1024, "订票...\n");
            send(clntSock, buf, strlen(buf) + sizeof(char), 0);
        }
        else if(0 == strncmp(cmd, "0.返回", 10))
        {
            snprintf(buf, 1024, "返回...\n");
            send(clntSock, buf, strlen(buf) + sizeof(char), 0);
        }
        else if(NULL != strstr(cmd, "order_ticket"))
        {
            char* fid = get_request_content(cmd, "fid:", 20);
            snprintf(buf, 1024, "%s", order_ticket(fid));
            send(clntSock, buf, strlen(buf) + sizeof(char), 0);
        }
        else if(NULL != strstr(cmd, "order_list"))
        {
            snprintf(buf, 10240, "%s", order_list());
            send(clntSock, buf, strlen(buf) + sizeof(char), 0);
        }
        else if(NULL != strstr(cmd, "del_order"))
        {
            char* fid = get_request_content(cmd, "fid:", 20);
            snprintf(buf, 10240, "%s", del_order(fid));
        }
        else if(NULL != strstr(cmd, "passenger_info"))
        {
            snprintf(buf, 10240, "%s", passenger_info());
            send(clntSock, buf, strlen(buf) + sizeof(char), 0);
        }
        else if(NULL != strstr(cmd, "login"))
        {
            char* pid = get_request_content(cmd, "pid:", 20);
            char* pw = get_request_content(cmd, "pw:", 20);
            snprintf(buf, 10240, "%s", login(pid, pw));
            send(clntSock, buf, strlen(buf) + sizeof(char), 0);
        }
        else if(NULL != strstr(cmd, "logout"))
        {
            snprintf(buf, 10240, "%s", logout());
            send(clntSock, buf, strlen(buf) + sizeof(char), 0);
        }
        else
        {
            snprintf(buf, 20, "错误命令!");
            send(clntSock, buf, strlen(buf) + sizeof(char), 0);
        }
        //关闭套接字
	    closesocket(clntSock);
    }
 
	//关闭套接字
	closesocket(servSock);
 
	//终止dll使用
	WSACleanup();
 
    exit_sys();	    // 退出系统
 
	return 0;
}
 
// 解析请求的内容
char *get_request_content(char *src, char *content, int max_len)
{
	char *result = (char *)malloc((max_len) * sizeof(char));
	memset(result, 0, max_len);
	int i = 0;
	char *temp = NULL;
	temp = strstr(src, content);
	if (temp == NULL)
	{
		return NULL;
	}
	temp += strlen(content);
	while (1)
	{
		if (max_len == i)
			break;
		if (temp[i] != ' ')
		{
			result[i] = temp[i];
			i++;
		}
		else
		{
			break;
		}
	}
	return result;
}
 
// 系统初始化
void init_sys(void)
{
	// 申请堆内存、加载数据
	FLI = calloc(MAX_Flight,sizeof(Flight));
	PAS = calloc(MAX_Passenger,sizeof(Passenger));
	ORD = calloc(MAX_Order,sizeof(Order));
	printf("系统初始化中...\n");
 
    // 以只读方式打开 order.txt,如果文件不存在则打开失败,返回值为空。
	FILE* ofrp = fopen("order.txt","r");
    if(NULL == ofrp)    // 打开失败直接退出
    {
        printf("order.txt 打开失败!\n");
        exit(0);
    }
 
    int i = 0;
	for(i = 0; i < MAX_Order; i++)	//读取文本中的数据到内存,全局变量ORD中
	{	
        int num = 0;
		num = fscanf(ofrp,"%s %s %d\n", ORD[i].pid, ORD[i].fid, &ORD[i].num);
	}
 
	FILE* ffrp = fopen("flight.txt","r");
    if(NULL == ffrp)
    {
        printf("flight.txt 打开失败!\n");
        exit(0);
    }
	for(i = 0; i < MAX_Flight; i++)
	{
		int num = 0;
		num = fscanf(ffrp,"%s %s %s %s %d\n", FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, &FLI[i].fnum);
	}
 
	FILE* pfrp = fopen("passenger.txt","r");
    if(NULL == pfrp)
    {
        printf("passenger.txt 打开失败!\n");
        exit(0);
    }
	for(i = 0; i < MAX_Passenger; i++)
	{
		int num = 0;
		num = fscanf(pfrp,"%s %s %s %s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
	}
 
    printf("系统初始化完毕!\n");
}
 
// 显示航班表
char* show_flight(void)
{
    static char buf[10240] = {0};
    memset(buf, 0, sizeof(buf));
    int i = 0;
	for(i = 0; i < MAX_Flight; i++)
	{
		if(strlen(FLI[i].fid) != 0)
		{
			snprintf(buf, 10240, "%sid:%s name:%s start:%s end:%s fnum:%d\n", buf, FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, 
                FLI[i].fnum);
		}
	}
 
    return buf;
}
 
// 系统结束
void exit_sys(void)
{
    printf("数据插入中...\n");
	FILE* ofwp = fopen("order.txt","w");
	printf("准备插入 order.txt\n");
	int i= 0;
	for(i = 0; i < MAX_Order; i++)	//数据存储回本地
	{
	    int num = 0;
		if(strlen(ORD[i].pid) != 0)
		{
			num = fprintf(ofwp,"%s %s %d\n", ORD[i].pid, ORD[i].fid, ORD[i].num);
			//printf("insert order.txt success\n");
		}
	}
 
    // 以只写方式打开文件flight.txt,如果文件不存在则创建,如果文件存在则把内容清空。
	FILE* ffwp = fopen("flight.txt","w");
	printf("准备插入 flight.txt\n");
	for(i = 0; i < MAX_Flight; i++)
	{
		int num = 0;
		if(strlen(FLI[i].fid) != 0)
		{
			num = fprintf(ffwp,"%s %s %s %s %d\n", FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, FLI[i].fnum);
			//printf("insert flight.txt success\n");
		}
	}
 
	FILE* pfwp = fopen("passenger.txt","w");
	printf("准备插入 passenger.txt\n");
	for(i = 0; i < MAX_Passenger; i++)
	{
		int num = 0;
		if(strlen(PAS[i].pid) != 0)
		{
			num = fprintf(pfwp,"%s %s %s %s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
			//printf("insert passenger.txt success\n");
		}
	}
	// 释放内存、保存数据
	free(FLI);
	free(PAS);
	free(ORD);
	printf("程序退出\n");
}
 
// 登录
char* login(char* pid, char* pw)
{
    static char buf[100] = {0};
    memset(buf, 0, sizeof(buf));
    if(online == 0)	//如果没有登录
    {
        int i = 0;
        int time = 0;
        // 遍历所有乘客
        for(i = 0; i < MAX_Passenger; i++)
        {
            // 数据长度校验
            if(strlen(pid) == 0 || strlen(pw) == 0)
            {
                printf("pid 或 password 不能为空\n");
                time++;
                break;
            }
            // 成功匹配账号密码
            else if(strcmp(PAS[i].pid, pid) == 0 && strcmp(PAS[i].password, pw) == 0)
            {
                snprintf(buf , 100, "登录成功!\n");
                strncpy(online_pid, pid, 20);
                online = 1;
                return buf;
            }
            else if(i == MAX_Passenger-1)
            {
                snprintf(buf , 100, "pid 或 password 错误\n");
                return buf;
            }
        }
        
    }
    else if(online == 1)
    {
        snprintf(buf , 100, "你还没登录呢\n");
        return buf;
    }
    else
    {
        snprintf(buf , 100, "你已被锁定,禁止使用此系统\n");
        return buf;
    }
 
}
 
// 用户登出
char* logout(void)
{
    static char buf[100] = {0};
    memset(buf, 0, sizeof(buf));
    if(online == 1)	//如果已经登录
    {
        online = 0;
        snprintf(buf, 100, "登录成功\n");
    }
    else if(online == -1)
    {
        snprintf(buf, 100, "你已被锁定,禁止使用此系统\n");
    }
    else
    {
        snprintf(buf, 100, "你还没有登录呢\n");
    }
    
    return buf;
}
 
// 查询旅客信息
char* passenger_info(void)
{
    static char buf[100] = {0};
    memset(buf, 0, sizeof(buf));
    if(online == 1)	//如果已经登录
    {
        //printf("online_pid:");
        //puts(online_pid);
        int i = 0;
        for(i = 0; i < MAX_Passenger; i++)
        {
            if(strcmp(online_pid, PAS[i].pid) == 0)
            {
                snprintf(buf, 100, "pid:%s, pname:%s, password:%s, tell:%s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
                break;
            }
        }
    }
    else if(online == -1)
    {
        snprintf(buf, 100, "你已被锁定,禁止使用此系统\n");
    }
    else
    {
        snprintf(buf, 100, "你还没有登录呢\n");
    }
 
    return buf;
}
 
// 订票
char* order_ticket(char* fid)
{
    static char buf[100] = {0};
    memset(buf, 0, sizeof(buf));
    if(online == 1) // 如果已经登录
    {
        if(0 == strlen(fid))
        {
            snprintf(buf, 100, "fid 为空\n");
            return buf;
        }
        int i = 0;
        for(i = 0; i < search_num; i++)
        {
            //printf("fid:%s s_fid:%s num:%d\n",fid,search_fid[i],search_fnum[i]);
            if(strcmp(fid,search_fid[i]) == 0 && search_fnum[i] > 0)    //查询到对应航班
            {
                snprintf(buf, 100, "订票成功\n");
                int j = 0;
                for(j = 0; j < MAX_Flight; j++) // 遍历航班表
                {
                    if(strcmp(fid, FLI[j].fid) == 0)
                    {
                        FLI[j].fnum--;	//票数减1
                        break;
                    }
                }
 
                int k = 0;
                for(k = 0; k < MAX_Order; k++)  // 遍历订票表
                {
                    //printf("ready insert...\n");
                    if(strlen(ORD[k].pid) == 0) // 在空位置插入数据
                    {
                        strcpy(ORD[k].pid, online_pid);  // 插入当前用户身份证
                        strcpy(ORD[k].fid, search_fid[i]);   // 插入当前选择的航班号
                        ORD[k].num = 1;
                        printf("插入订票信息成功\n");
                        break;
                    }
                }
                return buf;
            }
            else if(strcmp(fid,search_fid[i]) == 0 && search_fnum[i] == 0)
            {
                snprintf(buf, 100, "无票\n");
                return buf;
            }
            else if(i == MAX_Flight-1)
            {
                snprintf(buf, 100, "不存在此fid\n");
                return buf;
            }
        }
    }
    else if(online == -1)
    {
        snprintf(buf, 100, "你已被锁定,禁止使用此系统\n");
        return buf;
    }
    else
    {
        snprintf(buf, 100, "请登录!\n");
        return buf;
    }
}
 
// 查询航班
char* search(char* start, char* end)
{
    printf("[函数()] 进入 search(%s, %s)\n", start, end);
    static char buf[10240] = {0};
    memset(buf, 0, sizeof(buf));
	int i = 0;
	search_num = 0;
    // 遍历所有航班
	for(i = 0; i < MAX_Flight; i++)
	{
	    if(strlen(start) == 0 || strlen(end) == 0)
		{
			snprintf(buf, 10240, "start 或 end 不能为空\n");
            printf("%s", buf);
			return buf;
		}
		if(strcmp(FLI[i].start, start) == 0 && strcmp(FLI[i].end, end) == 0)
		{
			snprintf(buf, 10240, "%sfid:%s, 票数:%d\n", buf, FLI[i].fid, FLI[i].fnum);
			strncpy(search_fid[search_num], FLI[i].fid, 20);
			search_fnum[search_num] = FLI[i].fnum;
			//printf("search_fid[%d]:%s, search_fun[%d]:%d\n",search_num,search_fid[search_num],search_num,search_fnum[search_num]);
			++search_num;
		}
		if(0 == search_num && i == MAX_Flight-1)
		{
            snprintf(buf, 10240, "没有航班\n");
            printf("%s", buf);
			return buf;
		}
		if(search_num > 0 && i == MAX_Flight-1)
		{
            printf("%s", buf);
			return buf;
		}
	}
 
    return buf;
}
 
// 输出订单信息
char* order_list(void)
{
    static char buf[10240] = {0};
    memset(buf, 0, sizeof(buf));
    if(online == 1)
    {
        int i = 0;
        for(i = 0; i < MAX_Order; i++)
        {
            if(strcmp(online_pid, ORD[i].pid) == 0)
            {
                //printf("online_pid:%s\n",online_pid);
                snprintf(buf, 10240, "%sfid:%s, pid:%s, ticket:%d\n", buf, ORD[i].fid, ORD[i].pid, ORD[i].num);
            }
        }
    }
    else if(online == -1)
    {
        snprintf(buf, 100, "你已被锁定,禁止使用此系统\n");
    }
    else
    {
        snprintf(buf, 100, "请登录!\n");
    }
 
    return buf;
}
 
// 删除订单
char* del_order(char* fid)
{
    printf("[函数()] 进入 del_order(%s)\n", fid);
    static char buf[100] = {0};
    memset(buf, 0, sizeof(buf));
    if(online == 1)
    {
        int i = 0;
        // 遍历所有订单
        for(i = 0; i < MAX_Order; i++)
        {
            if(strlen(fid) == 0)  //判空
            {
                snprintf(buf, 100, "del_order 的 fid 不能为空\n");
                return buf;
            }
            if(strcmp(fid, ORD[i].fid) == 0)
            {
                memset(ORD[i].pid, '\0', sizeof(ORD[i].pid));
                int j = 0;
                for(j = 0; j < MAX_Flight; j++)
                {
                    if(strcmp(fid, FLI[j].fid) == 0)
                    {
                        FLI[j].fnum++;  // 返还飞机票
                        break;
                    }
                }
                snprintf(buf, 100, "删除成功\n");
                return buf;
            }
        }
    }
    else if(online == -1)
    {
        snprintf(buf, 100, "你已被锁定,禁止使用此系统\n");
    }
    else
    {
        snprintf(buf, 100, "请登录!\n");
    }
 
    printf("%s", buf);
    return buf;
}
 
// 清理输入缓冲区
/*void clear_stdin(void)
{
	stdin->_IO_read_ptr = stdin->_IO_read_end;//清理输入缓冲区
}
*/
 
// 读取输入字符串
char* get_str(char* str, size_t len)
{
	if(NULL == str)
	{
		puts("空指针!");
		return NULL;
	}
 
	char *in = fgets(str, len, stdin);
 
	size_t cnt = strlen(str);
	if('\n' == str[cnt-1])
	{
		str[cnt-1] = '\0';
	}
	else
	{
		scanf("%*[^\n]");
		scanf("%*c");
	}
	
	//clear_stdin();
 
	return str;
}
 
// 获取cmd命令
char get_cmd(char start, char end)
{
	//clear_stdin();
 
	printf("请输入命令:");
	while(true)
	{
		char val = getch();
		if(val >= start && val <= end)
		{
			printf("%c\n",val);
			return val;
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1860625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

界面组件DevExpress WinForms v24.1 - 支持DateOnly TimeOnly类型

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

嘀嗒出行项目管理专家和项目管理负责人王禹华受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 嘀嗒出行项目管理专家和项目管理负责人王禹华女士受邀为第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“AI时代项目经理挑战机会和个人成长”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; AI时代对互…

Pyecharts入门

数据可视化 Pyecharts简介 Apache ECharts 是一个由百度开源的数据可视化&#xff0c;凭借着良好的交互性&#xff0c;精巧的图表设计&#xff0c;得到了众多开发者的认可。而 Python 是一门富有表达力的语言&#xff0c;很适合用于数据处理。当数据分析遇上数据可视化时&#…

Vue下载接口返回流的处理

1.下载接口返回流如下&#xff1a; 2.可以写公共方法处理 excelDownload(obj, name Date.now(), suffix xlsx) {//Date.now()获取当前日期const url window.URL.createObjectURL(//Blob是二进制大对象new Blob([obj], { type: application/vnd.ms-excel }))const aDOM docu…

【一竞技LCK】夏季赛:HLE强势横扫2比0击败KT!

北京时间6月24日&#xff0c;LCK夏季赛在昨天结束了第二周最后一个比赛日的比赛。昨天第二场比赛是HLE战队迎战DK战队&#xff0c;本赛季DK战队的状态可以说是相当的低迷&#xff0c;在首轮比赛是被KDF战队给2比0横扫&#xff0c;昨天面对实力不俗的HLE战队也是落了下风&#x…

工程化视角的 Kotlin Multiplatform核心解读及优化

本篇为KMP技术的技术及实践系列文章的第二篇。在这篇技术文章中我们会以百人移动研发团队的工程化视角&#xff0c;探讨Kotlin Multiplatform的核心技术及优化。 Kotlin: 语言与编译 人们在用自然语言沟通时&#xff0c;内容可以不明确&#xff0c;甚至小的错误&#xff0c;而听…

【数学建模】—【Python库】—【Numpy】—【学习】

目录 ​编辑 1. NumPy安装 2. ndarray对象 1. 创建ndarray 1.从列表或元组创建&#xff1a; 2.使用内置函数创建&#xff1a; 2. ndarray属性 3. 数组运算 1. 基本运算 2. 数学函数 3.统计函数 4. 数组索引与切片 1. 一维数组索引与切片 2.多维数组索引与切片 5.…

Excel 宏录制与VBA编程 —— 16、InputBox函数的使用方式

Input函数基本操作 InputBox函数的Type参数使用技巧&#xff08;输入类型限制&#xff0c;若输入类型不符系统提示&#xff09; 关注 笔者 - jxd

山东大学-科技文献阅读与翻译(期末复习)(选择题+翻译)

目录 选择题 Chapter1 1.which of the following is not categorized as scientific literature 2.Which of the followings is defined as tertiary(三级文献) literature? 3.Which type of the following international conferences is listed as Number one conference…

【Redis】数据持久化

https://www.bilibili.com/video/BV1cr4y1671t?p96 https://blog.csdn.net/weixin_54232666/article/details/128821360 单点redis问题&#xff1a; 数据丢失问题&#xff1a;实现Redis数据持久化并发能力问题&#xff1a;搭建主从集群&#xff0c;实现读写分离故障恢复问题&…

jeecg导入excel 含图片(嵌入式,浮动式)

jeecgboot的excel导入 含图片&#xff08;嵌入式&#xff0c;浮动式&#xff09; 一、啰嗦二、准备三、 代码1、代码&#xff08;修改覆写的ExcelImportServer&#xff09;2、代码&#xff08;修改覆写的PoiPublicUtil&#xff09;3、代码&#xff08;新增类SAXParserHandler&a…

算法设计与分析:并查集法求图论桥问题

目录 一、实验目的 二、问题描述 三、实验要求 四、算法思想 1. 基准算法 1.1 算法思想 1.2 代码 1.3 时间复杂度 2. 使用并查集的高效算法 2.1 算法思想 2.2 代码&#xff1a; 2.3 时间复杂度&#xff1a; 五、实验结果 一、实验目的 1. 掌握图的连通性。 2. 掌…

《代码大模型安全风险防范能力要求及评估方法》正式发布

​代码大模型在代码生成、代码翻译、代码补全、错误定位与修复、自动化测试等方面为研发人员带来了极大便利的同时&#xff0c;也带来了对安全风险防范能力的挑战。基于此&#xff0c;中国信通院依托中国人工智能产业发展联盟&#xff08;AIIA&#xff09;&#xff0c;联合开源…

干货分享 | TSMaster 的 CAN UDS 诊断操作指南(下)

上期&#xff0c;我们主要介绍了 UDS 诊断模块的创建以及TSMaster 基础诊断配置。很多客户表示意犹未尽。因此我们将继续带来《TSMaster 的 CAN UDS 诊断操作指南&#xff08;下&#xff09;》的精彩内容&#xff0c;为您带来UDS on CAN/CAN FD 的功能以及详细的使用操作。 本文…

深入浅出:npm常用命令详解与实践

简介 在现代的软件开发中&#xff0c;特别是在 JavaScript 生态系统中&#xff0c;npm&#xff08;Node Package Manager&#xff09;是一个核心工具。它不仅仅是 Node.js 的包管理器&#xff0c;还扮演着项目依赖管理、脚本执行、项目发布等多重角色。理解 npm 的常用命令不仅…

【数据结构】线性表之《队列》超详细实现

队列 一.队列的概念及结构二.顺序队列与链队列1.顺序队列2.链队列 三.链队列的实现1.创建队列2.初始化队列3.入队4.出队5.获取队头元素6.获取队尾元素7.队列的大小8.队列的判空9.清空队列10.销毁队列 四.队列的盲区五.模块化源代码1.Queue.h2.Queue.c3.test.c 六.栈和队列必做O…

小白上手AIGC-基于FC部署stable-diffusion

AIGC AIGC&#xff08;人工智能创造内容&#xff09;作为一种基于人工智能技术生成内容的新型创作模式。打破了过去大家对于AI的理解都是说只能涉足部分领域而无法涉足艺术或者是其他的创作领域的定律&#xff0c;现在的AIGC也能够创作内容了&#xff0c;而不再只是单纯的返回…

MAC Address

文章目录 1. 前言2. MAC Address2.1 MAC 地址格式2.2 Locally Administered MAC Address2.3 MAC 单播 和 多播 3. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. MAC Address 2.1 MA…

Java集合框架深度解析:Hashtable、HashMap与TreeMap的较量,哪个更适合你的项目?

引言 在Java编程世界中&#xff0c;集合是编程语言的重要组成部分。它们负责存储、组织和操作数据集合&#xff0c;是开发过程中不可或缺的工具。Java集合框架提供了丰富且功能强大的数据结构&#xff0c;而其中的Hashtable、HashMap和TreeMap是使用频率极高的三种实现。 本篇文…

2024年希望杯数学竞赛各年级100道练习题及答案

链接里面有无答案版本链接&#xff1a;https://pan.baidu.com/s/1nTIVJrTEWUzb0LJNo4mI_Q 提取码&#xff1a;0548 –来自百度网盘超级会员V7的分享 一年级 二年级 三年级 四年级 五年级 六年级 七年级 八年级