国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言階段小項目(火車購票系統(tǒng))

這篇具有很好參考價值的文章主要介紹了C語言階段小項目(火車購票系統(tǒng))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?鐵路售票管理系統(tǒng)?? ?
程序中傳遞的有信息有:票務(wù)信息(包括車次,出發(fā)站、到達(dá)站、出發(fā)時間日期,歷時、票數(shù),票價)個人購票信息(姓名,身份信息,車次,出發(fā)時間日期,座位號,票價)

?票務(wù)瀏覽 ? ? ? ?(對票務(wù)系統(tǒng)中的所有票務(wù)信息進(jìn)行瀏覽,獲取不同時間日期的票務(wù)信息。)
購票 ? ? ? ? ? ? 當(dāng)乘客購票成功后,為乘客構(gòu)建購票信息,用于存儲該乘客所有的購票信息,
?? ? ? ? ? ? ? ? ? ? 以便乘客查詢,同時減少票務(wù)系統(tǒng)中的相關(guān)票數(shù)。
退票 ? ? ? ? ? ? 當(dāng)乘客退票成功后,將相關(guān)的購票信息從為乘客構(gòu)建的購票信息系統(tǒng)中刪除,
?? ? ? ? ? ? ? ? ? ? 同時增加票務(wù)系統(tǒng)中的相關(guān)票數(shù)。
信息查看 ? ? ? ? 乘客可隨時查看票務(wù)系統(tǒng)中所有的票務(wù)信息,同時也可提供UI,用于查看個人的所有購票信息。?
?

?c語言火車票售票管理系統(tǒng),練習(xí)題,c語言,鏈表,開發(fā)語言

?c語言火車票售票管理系統(tǒng),練習(xí)題,c語言,鏈表,開發(fā)語言

用戶界面

c語言火車票售票管理系統(tǒng),練習(xí)題,c語言,鏈表,開發(fā)語言?c語言火車票售票管理系統(tǒng),練習(xí)題,c語言,鏈表,開發(fā)語言

管理員界面

?c語言火車票售票管理系統(tǒng),練習(xí)題,c語言,鏈表,開發(fā)語言c語言火車票售票管理系統(tǒng),練習(xí)題,c語言,鏈表,開發(fā)語言

?1.查看票務(wù)

c語言火車票售票管理系統(tǒng),練習(xí)題,c語言,鏈表,開發(fā)語言

?2.管理票務(wù)

?c語言火車票售票管理系統(tǒng),練習(xí)題,c語言,鏈表,開發(fā)語言

?

(詳細(xì)操作暫不展示)

...

main.c文件

#include "slist.h"
#include "menu.h"
#include "file.h"
#include <stdio.h>


int main(void)
{
    tNODE*  head  = NULL; //存放火車信息的鏈表
    uNODE*  head1 = NULL;  //存放乘客信息的鏈表
    NODE*   head2 = NULL;  //存放用戶賬號密碼的鏈表

    Welcome();  //歡迎界面
    
    load(&head, &head1);  //文件操作
    load1(&head2);    


    while(MainMenu(&head, &head1,&head2));  //主菜單

    slist_freeT(&head);  //釋放鏈表
    slist_freeU(&head1);
    slist_free(&head2);
    return 0;   
}

文件操作

file.h

//file.c文件的頭文件
#ifndef __FILE_H
#define __FILE_H
#include"slist.h"

int load(tNODE** , uNODE**);
int load1(NODE**);

int saveT(tNODE*);
int saveU(uNODE*);
int save(NODE*);

#endif

file.c

#include"file.h"
#include"slist.h"
#include<stdio.h>

int load(tNODE** head, uNODE** head1) //打開車票,與乘客的文件
{
	FILE* fp = fopen("ticket.dat", "r");//以只讀方式打開
	FILE* fp1 = fopen("user.dat", "r");
	if (!fp)
	{
		puts("ticket.dat打開失敗");
		return -1;
	}
	if (!fp1)
	{
		puts("user.dat打開失敗");
		return -1;
	}
	Ticket		data = { 0 };
	User         data1 = { 0 };
	while (fread((&data), sizeof(Ticket), 1, fp))//將文件中的信息讀取到鏈表中
	{
		slist_addTicket(head, data);//頭插法,將每次讀取到的信息插入
	}
	while (fread((&data1), sizeof(User), 1, fp1))
	{
		slist_addUser(head1, data1);
	}
	fclose(fp);
	fclose(fp1);
	return 0;
}
int load1(NODE** head2)
{
	FILE *fp = fopen("account.dat","r");//賬號密碼文件
	if(!fp )
	{
		puts("account.dat加載失敗");
		return -1;
	}       
          
	Useract          data2 = {0};
	while(fread((&data2),sizeof(Useract),1,fp))
	{
		slist_user(head2,data2);
	}
	fclose(fp);
	return 0;
}

/*將鏈表中的信息保存到對應(yīng)的鏈表中*/
int saveT(tNODE* head)
{
	FILE* fp = fopen("ticket.dat", "w");

	if (!fp)
	{
		puts("ticket.dat打開失敗");
		return -1;
	}
	
	tNODE* p = head;
	while (p)
	{
		fwrite(&(p->data), sizeof(Ticket), 1, fp);
		p = p->next;
	}

	fclose(fp);

	return 0;
}
int saveU(uNODE* head1)
{
	FILE* fp = fopen("user.dat", "w");

	if (!fp)
	{
		puts("user.dat打開失敗");
		return -1;
	}
	
	uNODE* p = head1;
	while (p)
	{
		fwrite(&(p->data), sizeof(User), 1, fp);
		p = p->next;
	}

	fclose(fp);

	return 0;
}
int save(NODE* head2)
{
	FILE* fp = fopen("account.dat", "w");

	if (!fp)
	{
		puts("account.dat打開失敗");
		return -1;
	}

	NODE* p = head2;
	while (p)
	{
		fwrite(&(p->data), sizeof(Useract), 1, fp);
		p = p->next;
	}
	fclose(fp);

	return 0;
}

鏈表操作

slist.h

#ifndef  __SLIST_H
#define  __SLIST_H

typedef  struct
{
   char		num[10];    // 車次
   char 	start[30];//出發(fā)站
   char 	end[30];//到達(dá)站
   char  	date[20];//出發(fā)日期
   char time[10];//出發(fā)時間
   float	take;//歷時
   int		count;//票數(shù)
   float	price;//票價
}Ticket;

typedef struct node
{
   Ticket         data;
   struct node  *next;
}tNODE;

typedef	struct
{
    char          name[30];// 姓名
    char	  id[20];//身份
    char	  num[10];//車次
    char	  date[20];//出發(fā)日期
	char time[10];//出發(fā)時間
    char	  seat[20];//座位號
    float	  price;//票價
}User;

typedef struct
{
	char name[20];//用戶名
	char password[20];//密碼
	char issue[20];//密保問題
	char answer[20];//密保答案
	int num;//0為用戶,1為管理員
}Useract;

typedef struct node_u
{
	Useract	        data;
	struct node_u*  next;
}NODE;


typedef	struct unode
{
	User		data;
	struct unode	*next;
}uNODE;

int  slist_addTicket(tNODE**, Ticket);//插入函數(shù)
int  slist_addUser(uNODE**,User);
int  slist_deleteTicket(tNODE**,User);//刪除函數(shù)
int  slist_deleteUser(uNODE**,User);
int  slist_user(NODE**, Useract); //添加
void  slist_printT(const tNODE*); //遍歷
void  slist_printU(const uNODE*);
void  slist_freeT(tNODE**); //釋放鏈表
void  slist_freeU(uNODE**);
void  slist_free(NODE**);

#endif

slist.c

#include"slist.h"
#include<stdio.h>
#include<stdlib.h>


int  slist_addTicket(tNODE** head, Ticket data)
{
    tNODE* pNew = (tNODE*)malloc(sizeof(tNODE));
    if(!pNew)
    {
        puts("數(shù)據(jù)插入失敗!");
        return -1;
    }
    pNew -> data  = data;
    pNew -> next  = *head;
    *head = pNew;

    return 0;
}

int  slist_addUser(uNODE** head1, User data1)
{
    uNODE* pNew = (uNODE*)malloc(sizeof(uNODE));
    if(!pNew)
    {
        puts("數(shù)據(jù)插入失敗!");
        return -1;
    }
    pNew -> data  = data1;
    pNew -> next  = *head1;
    *head1 = pNew;
    return 0;
}

int slist_user(NODE** head2, Useract data2)
{
	NODE* pNew = (NODE*) malloc (sizeof(NODE));
	if(!pNew)
	{
		puts("注冊失敗!");
		return -1;
	}
	pNew -> data = data2;
	pNew -> next = *head2;
	*head2 = pNew;
	return 0;
}

void  slist_printT(const tNODE* head)
{
     const  tNODE* p  = head;
     printf("=============================================================================\n\n");
     printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "車次", "出發(fā)站", "到達(dá)站", "出發(fā)日期", "出發(fā)時間", "歷時", "票數(shù)", "票價");  
     while(p)
     {
         printf("%s\t%s\t%s\t%s\t%s\t\t%.2f\t%d\t%.2f\n", p->data.num, p->data.start, p->data.end, p->data.date, p->data.time, p->data.take, p->data.count, p->data.price);
        p = p -> next;
     }
     printf("=============================================================================\n\n");

}

void  slist_printU(const uNODE* head1)
{
       const  uNODE* p  = head1;
       printf("=============================================================================\n\n");
       printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間", "座位號", "票價");
 
       while(p)
       {  
           printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
           p = p -> next;
       }
       printf("=============================================================================\n\n");
}

void  slist_freeT(tNODE** head)
{
   tNODE* p  = *head,*q = NULL;
   
   while(p)
   {
       q =  p;
       p =  p -> next;
       free(q);
   }
}

void  slist_freeU(uNODE** head1)
{
   uNODE* p  = *head1,*q = NULL;
   
   while(p)
   {
       q =  p;
       p =  p -> next;
       free(q);
   }
}

void slist_free(NODE** head2)
{
	NODE* p = *head2, *q = NULL;
	while(p)
	{
		q = p;
		p = p -> next;
		free(q);
	}
}

菜單文件

menu.h

#ifndef __MENU_H
#define __MENU_H

#include"slist.h"
#include"file.h"
void Welcome(void);
int MainMenu(tNODE**,uNODE**, NODE**);
int tMenu(tNODE**, uNODE**,NODE**);
int tmenu(tNODE**, uNODE**,NODE**);
int uMenu(tNODE**, uNODE**,NODE**);
int umenu(tNODE**, uNODE**,NODE**);
int Manage(tNODE**, uNODE**);


#endif

menu.c

#include"menu.h"
#include<string.h>
#include"function.h"
#include<stdio.h>
#include"slist.h"

void Welcome(void)
{
   printf("\n\n");
   puts("|============================|");
   puts("|	       		     |");
   puts("|*** 歡迎使用鐵路購票系統(tǒng) ***|");
   puts("|			     |"); 
   puts("|============================|");
   puts("\n");
   puts(" =======按任意鍵繼續(xù)======");
   
   getchar();
}


int MainMenu(tNODE** head, uNODE** head1, NODE** head2)
{
   puts("======================");
   puts("----1.  管理員模式----");
   puts("----2.  用戶模式------");
   puts("----0.  退出程序------");
   puts("======================");

   printf("\n請選擇:");

   int i  = 0;
   scanf("%d",&i);

   switch(i)
   {
      case  0:
            break;
      case  1:
            while(tmenu(head, head1, head2));
            break;
      case  2:
            while(umenu(head, head1, head2));
            break;
      default:
           puts("選擇有誤,請重新選擇");
           break;
   }

   return i;
}

int tmenu(tNODE** head, uNODE** head1, NODE** head2)
{
    	puts("======================");
     	puts("1. 管理員注冊");
      	puts("2. 管理員登陸");
		puts("3. 修改密碼");
		puts("4. 找回密碼");
       	puts("0. 返回上一級");
	puts("======================");
    	int n = 0;
	printf("\n請選擇:");
        scanf("%d", &n);
	switch(n)
	{
		case 0:
			return n;
		case 1:
			{
				Useract data = {0};
				puts("請輸入用戶名:");
				scanf("%s", data.name);
				
				puts("請輸入密碼");
				printf("\033[8m");
				scanf("%s", data.password);
				printf("\033[0m");	

				puts("請輸入密保問題:");
				scanf("%s", data.issue);

				puts("請輸入答案:");
				scanf("%s", data.answer);
				data.num = 1;
				NODE* p = *head2;
				while(p)
				{
					if(strcmp( data.name, p->data.name) == 0)
					{
						puts("用戶名已存在!");
						return n;
					}
					p = p -> next;

				}
				puts("注冊成功");
				slist_user(head2,data);
				save(*head2);
				return n;
			}
			break;
		case 2:
			{
				char name[20] = { 0 };
				char password[20] = { 0 };
				NODE* p = NULL;
				int count = 0;
				while (1)
				{
					p = *head2;
					printf("用戶名:");
					scanf("%s", name);
					printf("密碼:");
					printf("\033[8m");
					scanf("%s", password);
					printf("\033[0m");
					count++;
					while (p)
					{
						if ((strcmp(name, p->data.name) == 0) && (strcmp(password, p->data.password) == 0))
						{
							if (p->data.num == 1)
							{
								printf("\n");
								puts("登陸中,請稍后... ...");
								sleep(2);
								printf("\n");
								puts("登陸成功!");
								while (tMenu(head, head1, head2));
								return n;
							}

						}
						p = p->next;
					}
					if (count == 3)
					{
						printf("\n");
						puts("登陸失敗!");
						printf("\n");
						break;
					}
					printf("\n");
					puts("用戶名或密碼錯誤請重新輸入");
					printf("\n");
				}
			}
			break;
		case 3:
			change_password(head2);
			break;
		case 4:
			find_password(*head2);
			break;
		default:
			puts("選擇有誤,請重新選擇");
             		break;
	}
	return n;
}
int tMenu(tNODE** head, uNODE** head1, NODE** head2)
{
   puts("======================");
   puts("----1.  查看票務(wù)------");
   puts("----2.  管理票務(wù)------");
   puts("----0.  返回上一層----");
   puts("======================");
   printf("\n請選擇:");

   int i  = 0;
   scanf("%d", &i);
   switch(i)
   {
      case  0:
            break;
      case  1:
            while(find(*head, *head1));
            break;
      case  2:
            while(Manage(head, head1));
            break;
      default:
           puts("選擇有誤,請重新選擇");
           break;
   }
   return i;

}

int umenu(tNODE** head, uNODE** head1,NODE** head2)
{
         puts("======================");
         puts("1. 用戶注冊");
         puts("2. 用戶登陸");
		 puts("3. 修改密碼");
		 puts("4. 找回密碼");
         puts("0. 返回上一級");
         puts("======================");
         int n = 0;
         printf("\n請選擇:");
         scanf("%d", &n);
         switch(n)
         {
                 case 0:
                         break;
                 case 1:
                         {
                                 Useract data = {0};
                                 puts("請輸入用戶名:");
                                 scanf("%s", data.name);
 
                                 puts("請輸入密碼");
								 printf("\033[8m");
								 scanf("%s", data.password);
								 printf("\033[0m");

								 puts("請輸入密保問題:");
								 scanf("%s", data.issue);

								 puts("請輸入答案:");
								 scanf("%s", data.answer);

								 data.num = 0;

                                 NODE* p = *head2;
                                 while(p)
                                 {
				 						  if(strcmp( p -> data.name, data.name) == 0)
                                         {
                                                 puts("用戶名已存在!");
												return n;                                              
                                         }
                                         p = p -> next; 
                                 }
                                 puts("注冊成功");
                                 slist_user(head2,data);
                                 save(*head2);
                         }
                         break;
                 case 2:
				 {
					 char name[20] = { 0 };
					 char password[20] = { 0 };
					 NODE* p = NULL;
					 int count = 0;
					 while (1)
					 {
						 p = *head2;
						 printf("用戶名:");
						 scanf("%s", name);
						 printf("密碼:");
						 printf("\033[8m");
						 scanf("%s", password);
						 printf("\033[0m");
						 count++;
						 while (p)
						 {
							 if ((strcmp(name, p->data.name) == 0) && (strcmp(password, p->data.password) == 0))
							 {
								 if (p->data.num == 0)
								 {
									 printf("\n");
									 puts("登陸中,請稍后... ...");
									 sleep(2);
									 printf("\n");
									 puts("登陸成功!");
									 printf("\n");
									 while (uMenu(head, head1, head2));
									 return n;
								 }
							 }
							 p = p->next;
						 }
						 if (count == 3)
						 {
							 printf("\n");
							 puts("登陸失??!");
							 printf("\n");
							 break;
						 }
						 printf("\n");
						 puts("用戶名或密碼錯誤請重新輸入");
						 printf("\n");
					 }
				 }
					 break;
				 case 3:
					 change_password(head2);
					 break;
				 case 4:
					 find_password(*head2);
					 break;
				default:
					 puts("輸入錯誤請重新輸入");
					 break;
	 }
	 return n;
			 
}

int uMenu(tNODE** head, uNODE** head1, NODE** head2)
{
	puts("=======================");
	puts("----1.    購票------------");
	puts("----2.    退票------------");
	puts("----3.    改簽------------");
	puts("----4.   查看信息------");
	puts("----5.	查看票務(wù)------");
	puts("----0.    返回上一級---");
	puts("=======================");
	printf("\n請選擇:");

	int i = 0;
	scanf("%d", &i);
	
		switch(i)
		{
			case 0:
				break;
			case 1:
				while(buyTicket(head, head1));
				break;
			case 2:
				while(refundTicket(head,head1));
				break;
			case 3:
				while (change_ticket(head, head1));
				break;
			case 4:
				while(findInform(*head1));
				break;
			case 5:
				slist_printT(*head);
				break;
			default:
				puts("輸入有誤請重新輸入!");
				break;
		}
		return i;
}

int Manage(tNODE** head, uNODE** head1)
{
	puts("=====================");
	puts("----1.  增加票務(wù)-----");
	puts("----2.  刪除票務(wù)-----");
	puts("----3.	修改票務(wù)----");
	puts("----4.  售票-----");
	puts("----5.  退票-----");
	puts("----6.  改簽-----");
	puts("----0.  返回上一級---");
	puts("=====================");
	printf("\n請選擇:");

	int i = 0;
	scanf("%d", &i);

	switch (i)
	{
	case 0:
		break;
	case 1:
		while (addTicket(head));
		break;
	case 2:
		while (deletTicket(head));
		break;
	case 3:
		while (change(head));
		break;
	case 4:
		while (buyTicket(head,head1));
		break;
	case 5:
		while (deletUser(head1, head));
		break;
	case 6:
		while (change_ticket(head, head1));
		break;
	default:
		puts("選擇有誤請重新選擇");
		break;
	}
	return i;
}

工程文件

function.h

#ifndef __FUNCTION_H
#define __FUNCTION_H
#include"slist.h"
int change_password(NODE**);
int addTicket(tNODE**);

int deletUser(uNODE**, tNODE**);
int deletTicket(tNODE**);
int buyTicket(tNODE**, uNODE**);
int refundTicket(tNODE**,uNODE**);
int findInform(uNODE*);
int find(tNODE*, uNODE*);
int change_ticket(tNODE**, uNODE**);
int find_password(NODE*);
int change(tNODE**);
#endif

function.c文章來源地址http://www.zghlxwxcb.cn/news/detail-519275.html

#include"function.h"
#include"slist.h"
#include"file.h"
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

static int ticket_print(tNODE*  head);
static int user_print(uNODE* head1);

int addTicket(tNODE** head)
{
	Ticket tri = {0};
	char ch ='\0';
	tNODE* p = NULL;
	do
	{
		p = *head;
		puts("請輸入車次");
		scanf("%s", tri.num);

		while (p)
		{
			if (strcmp(p->data.num, tri.num) == 0 )
			{
				puts("該車次已存在,請勿重復(fù)添加!");
				return 0;
			}
			p = p->next;
		}

		puts("請輸入起始站");
		scanf("%s", tri.start);

		puts("請輸入終點站");
		scanf("%s", tri.end);
		
		puts("請輸入出發(fā)日期(例如2022/11/11)");
		scanf("%s", tri.date);

		puts("請輸入出發(fā)時間(例如12:15)");
		scanf("%s", tri.time);

		puts("請輸入歷時");
    		scanf("%f", &tri.take);
	
		puts("請輸入票數(shù)");
    		scanf("%d", &tri.count);
	
		puts("請輸入票價");
   	 	scanf("%f", &tri.price);
	
		slist_addTicket(head,tri);

		puts("是否繼續(xù)添加(Y/N)");
		while(getchar() != '\n');

		ch = getchar();

	}while(ch == 'y' || ch == 'Y');

	slist_printT(*head);
	saveT(*head);

	return 0;
}

int deletUser(uNODE** head1, tNODE** head)
{
	slist_printU(*head1);
	
	char name[20] = {0};
	puts("請輸入要刪除的乘員姓名:");
	scanf("%s", name);
	
	char id[20] = {0};
	puts("請輸入要刪除的乘員id:");
	while (1)
	{
		scanf("%s", id);
		if (strlen(id) == 18)
			break;
		puts("id錯誤請重新輸入");
	}

	uNODE* p = *head1, *q = NULL;
	tNODE* t = *head;
	if(!p)
		return -1;
	if ((strcmp(p->data.name, name) == 0) && (strcmp(p->data.id, id) == 0))
	{
		while (t)
		{
			if (strcmp(p->data.num, t->data.num) == 0)
			{
				(t->data.count)++;
				break;
			}
			t = t->next;
		}
		*head1 = p->next;
		free(p);
		saveU(*head1);
		puts("退票成功!");
		slist_printU(*head1);
		slist_printT(*head);
		return 0;
	}
	while (p)
	{
		if ((strcmp(p->data.name, name) == 0) && (strcmp(p->data.id, id) == 0))
		{
			while (t)
			{
				if (strcmp(p->data.num, t->data.num) == 0)
				{
					(t->data.count)++;
					break;
				}
				t = t->next;
			}
			q->next = p->next;
			free(p);
			saveU(*head1);
			puts("退票成功!");
			slist_printU(*head1);
			slist_printT(*head);
			return 0;
		}
		q = p;
		p = p->next;
	}
	puts("未找到要退票的成員信息");
	return 0;
}
int deletTicket(tNODE** head)
{
	  slist_printT(*head);
 	 
	  char num[20] = {0};
 	  puts("請輸入要刪除的車次:");
 	  scanf("%s", num);

 	  tNODE* p = *head, *q = NULL;
 	  if(!p)
 		  return -1;
  
          if(strcmp(num, p -> data.num) == 0)       
 		{
                 *head = p -> next;
                 free(p);
				 puts("刪除成功!");
				 saveT(*head);
				 slist_printT(*head);
                 return 0;
         }
         while(p)
         {
                 if(strcmp(num, p -> data.num) == 0 )
                 {
                         q -> next = p -> next;
                         free(p);
						 puts("刪除成功!");
                         saveT(*head);
						 slist_printT(*head);
                         return 0;
                 }
                 q = p;
                 p = p -> next;
         }   
		 printf("\n");
	 puts("未找到要刪除的車次");
	 slist_printT(*head);
	 return 0;
}
int refundTicket(tNODE** head, uNODE** head1)
{
           char name[20] = {0};
           puts("請輸入要刪除的姓名:");
           scanf("%s", name);
 
           char id[30] = {0};
           puts("請輸入要刪除的id:");
		   while (1)
		   {
			   scanf("%s", id);
			   if (strlen(id) == 18)
				   break;
			   puts("id錯誤請重新輸入");
		   }
 
           uNODE* p = *head1, *q = NULL;
		   tNODE* t = *head;
           if(!p)
                   return -1;
 
           if((strcmp(name, p -> data.name) == 0 )&& (strcmp(id, p -> data.id) == 0))
           {
			   while (q)
			   {
				   if (strcmp(p->data.num, t->data.num) == 0)
				   {
					   (t->data.count)++;
					   break;
				   }
				   t = t->next;
			   }
                  *head1 = p -> next;
                  free(p);
                  saveU(*head1);
				  puts("刪除成功!");
				  slist_printT(*head);
                  return 0;
          }
          while(p)
          {
                  if((strcmp(name, p -> data.name) == 0) && (strcmp(id, p -> data.id) == 0))
                  {
					  while (q)
					  {
						  if (strcmp(p->data.num, t->data.num) == 0)
						  {
							  (t->data.count)++;
							  break;
						  }
						  t = t->next;
					  }
                          q -> next = p -> next;
                          free(p);
						  puts("退票成功!");
						  slist_printT(*head);
                          saveU(*head1);
                          return 0;
                  }
                  q = p;
                  p = p -> next;
          }
          puts("未找到要刪除的乘員");
		  return 0;
}
int buyTicket(tNODE** head,uNODE** head1 )
{
	if(*head == NULL)
	{
		puts("當(dāng)前暫無可購買車票!");
		return -1;
	}
	slist_printT(*head);
	
	char ch = '\0';
	User user = {0};
	tNODE* p = NULL;
	uNODE* q = NULL;
	do
	{		
		puts("請輸入要購買的車次");
		scanf("%s", user.num);
		
		p = *head;
		q = *head1;
		int flag = 0;
		while(p)
		{
			if(strcmp(p -> data.num, user.num) == 0)
			{
				puts("是否為學(xué)生(y/n)");
				while (getchar() != '\n');
				ch = getchar();
				if (ch == 'y' || ch == 'Y')
				{
					user.price = (p->data.price) * 0.69;
				}
				else
					user.price = p->data.price;
				strcpy( user.date, p->data.date);
				strcpy(user.time, p->data.time);
				(p -> data.count)--;
				flag = 1;
				break;
			}
			p = p -> next;
		}

		if (flag == 0)
		{
			puts("該車次未運(yùn)行");
			return 0;
		}

		puts("請輸入姓名:");
		scanf("%s", user.name);

		puts("請輸入身份證號:");
		while (1)
		{
			scanf("%s", user.id );
			if (strlen(user.id) == 18)
				break;
			puts("身份證輸入錯誤,請重新輸入");
		}

		puts("請輸入座位號:");
		scanf("%s", user.seat);
		while(q)
		{
			if(strcmp(q -> data.name, user.name) == 0 && strcmp( q -> data.num, user.num) == 0)
			{
				puts("購票失敗,請勿重復(fù)購買");
				return -1;

			}
			q = q -> next;
		}

		puts("購票成功!");
		printf("=============================================================================\n\n");
		printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間 ", "座位號", "票價");
		printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", user.name, user.id, user.num, user.date, user.time, user.seat, user.price);
		printf("=============================================================================\n\n");
       		slist_addUser(head1, user);
       		saveU(*head1);
		saveT(*head);
		puts("是否繼續(xù)添加(Y/N)");

		while(getchar() != '\n');
 
		ch = getchar(); 

	}while(ch == 'y' || ch == 'Y');
	slist_printT(*head);
	return 0;
}
int findInform(uNODE* head1)
{
	uNODE* p = NULL;
	char ch;
	do
	{
		p = head1;
		char name[30] = { 0 };
		puts("請輸入要查詢的乘客姓名:");
		scanf("%s", name);

		char id[20] = { 0 };
		puts("請輸入要查詢的乘客id");
		while (1)
		{
			scanf("%s", id);
			if (strlen(id) == 18)
				break;
			puts("id錯誤請重新輸入");
		}

		int flag = 0;
		while (p)
		{
			if ((strcmp(p->data.name, name) == 0) && (strcmp(p->data.id, id) == 0))
			{
				puts("信息如下:");
				printf("=============================================================================\n\n");
				printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間 ", "座位號", "票價");
				printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
				printf("=============================================================================\n\n");
				flag = 1;
			}
			p = p->next;
		}
		if (flag == 0)
		{
			puts("未找到乘客信息!");
		}
		puts("是否繼續(xù)查找(Y/N)");
		while (getchar() != '\n');
		ch = getchar();
	} while (ch == 'Y' || ch == 'y');

	return 0;
}
int find(tNODE* head, uNODE* head1)
{
	puts("===========================");
	puts("1.	查詢車次信息");
	puts("2.	售票信息");
	puts("0.	返回上一級");
	puts("===========================");
	printf("\n");
	int i = 0;
	printf("請選擇:");
	scanf("%d", &i);
	
	switch(i)
	{
		case 0:
			break;
		case 1:
			while (ticket_print(head));
			break;
		case 2:
			while (user_print(head1));
			break;
		default :
			puts("輸入錯誤請重新輸入!");
			break;
	}
	return i;
}

int change_ticket(tNODE** head, uNODE** head1)
{
	char ch;
	int flag = 0;
	uNODE* p = *head1;
	tNODE* q = *head, * t = *head;
	char name[20] = { 0 };
	char num[10] = { 0 };
	char new_num[10] = { 0 };

	puts("請輸入乘客姓名:");
	scanf("%s", name);
	puts("請輸入的車次:");
	scanf("%s", num);
	while (p)
	{
		if ((strcmp(name, p->data.name) == 0) && (strcmp(num, p -> data.num) == 0))
		{
			flag = 1;
			break;
		}
		p = p->next;
	}
	if (flag == 0)
	{
		puts("未找到該乘客信息");
		return 0;
	}
	slist_printT(*head);
	while (q)
	{
		if (strcmp(num, q->data.num) == 0)
		{
			(q->data.count)++;
			saveT(*head);
			break;
		}
		q = q->next;
	}
	puts("請輸入要改簽的車次:");
	scanf("%s", new_num);

	while (t)
	{
		if (strcmp(new_num, t->data.num) == 0)
		{
			strcpy(p->data.num, new_num);
			strcpy(p->data.date, t->data.date);
			strcpy(p->data.time, t->data.time);
			puts("是否為學(xué)生(y/n)");
			while (getchar() != '\n');
			ch = getchar();
			if (ch == 'y' || ch == 'Y')
			{
				p->data.price = (t->data.price) * 0.69;
			}
			else
				p->data.price = t->data.price;
			(t->data.count)--;
			puts("請稍后... ...");
			sleep(2);
			puts("改簽成功!");
			printf("=============================================================================\n\n");
			printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間 ", "座位號", "票價");
			printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
			printf("=============================================================================\n\n");
			saveT(*head);
			saveU(*head1);
			return 0;
		}
		t = t->next;
	}
	puts("改簽失敗");
	return 0;
}
int find_password(NODE* head2)
{
	Useract data = { 0 };
	puts("請輸入用戶名:");
	scanf("%s", data.name);
	NODE* p = head2;
	while (p)
	{
		if (strcmp( p->data.name, data.name) == 0)
		{
			printf("%s\n", p->data.issue);
			puts("請輸入答案:");
			scanf("%s", data.answer );
			if (strcmp( data.answer, p->data.answer) == 0)
			{
				printf("您所查詢的密碼為:%s\n", p->data.password);
				return 0;
			}
			else
			{
				puts("答案錯誤,查詢失?。?);
				return -1;
			}
		}
		p = p->next;
	}
	puts("查無此人!");
	return -1;
}
int change_password(NODE** head2)
{
	Useract data = { 0 };
	puts("請輸入用戶名:");
	scanf("%s", data.name);
	puts("請輸入密碼:");
	printf("\033[8m");
	scanf("%s", data.password);
	printf("\033[0m");	
	NODE* p = *head2;
	while (p)
	{
		if ((strcmp( data.name, p->data.name) == 0) && (strcmp( data.password, p->data.password) == 0))
		{
			puts("請輸入要修改的密碼:");
			printf("\033[8m");
			scanf("%s", p->data.password);
			printf("\033[0m");
			puts("修改成功");
			save(*head2);
			return 0;
		}
		p = p->next;
	}
	puts("用戶或密碼錯誤!");
	return -1;
}

static int ticket_print(tNODE* head)
{
	puts("===========================");
	puts("1.	查看全部");
	puts("2.	按日期查詢");
	puts("3.	按終點站查詢");
	puts("0.	返回上一級");
	puts("===========================");
	printf("\n");
	
	int i = 0;
	printf("請選擇:");
	scanf("%d", &i);

	switch (i)
	{
	case 0:
		return i;
	case 1:
		slist_printT(head);
		break;

	case 2:
	{
		char date[30] = { 0 };
		printf("請輸入要查詢的日期:");
		scanf("%s", date);
		tNODE* p = head;
		printf("=============================================================================\n\n");
		printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "車次", "出發(fā)站", "到達(dá)站", "出發(fā)日期","出發(fā)時間", "歷時", "票數(shù)", "票價");
		while (p)
		{
			if (strcmp(p->data.date, date) == 0)
			{
				printf("%s\t%s\t%s\t%s\t%s\t\t%.2f\t%d\t%.2f\n", p->data.num, p->data.start, p->data.end, p->data.date, p-> data.time , p->data.take, p->data.count, p->data.price);
			}
			p = p->next;
		}
		printf("=============================================================================\n\n");
	}
	break;
	case 3:
	{
		char end[30] = { 0 };
		printf("請輸入要查詢的終點站:");
		scanf("%s", end);
		tNODE* p = head;
		printf("=============================================================================\n\n");
		printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "車次", "出發(fā)站", "到達(dá)站", "出發(fā)日期", "出發(fā)時間", "歷時", "票數(shù)", "票價");
		while (p)
		{
			if (strcmp(p->data.end, end) == 0)
			{
				printf("%s\t%s\t%s\t%s\t%s\t\t%.2f\t%d\t%.2f\n", p->data.num, p->data.start, p->data.end, p->data.date, p->data.time, p->data.take, p->data.count, p->data.price);
			}
			p = p->next;
		}
		printf("=============================================================================\n\n");
	}
	break;
	default:
		puts("輸入錯誤請重新輸入!");
		break;
	}
	return i;
}

static int user_print(uNODE* head1)
{
	puts("===========================");
	puts("1.	查看全部");
	puts("2.	按車次查詢");
	puts("3.	按日期查詢");
	puts("4.	按姓名查詢");
	puts("0.	返回上一級");
	puts("===========================");
	printf("\n");

	int i = 0;
	printf("請選擇:");
	scanf("%d", &i);

	switch (i)
	{
	case 0:
		return i;
	case 1:
		slist_printU(head1);
		break;
	case 2:
	{
		char num[30] = { 0 };
		printf("請輸入要查詢的車次:");
		scanf("%s", num);
		uNODE* p = head1;
		printf("=============================================================================\n\n");
		printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間", "座位號", "票價");
		while (p)
		{
			if (strcmp(p->data.num, num) == 0)
			{
				printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
			}
			p = p->next;
		}
		printf("=============================================================================\n\n");
	}
	break;
	case 3:
	{
		char date[30] = { 0 };
		printf("請輸入要查詢的日期:");
		scanf("%s", date);
		uNODE* p = head1;
		printf("=============================================================================\n\n");
		printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間", "座位號", "票價");
		while (p)
		{
			if (strcmp(p->data.date, date) == 0)
			{		
				printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
			}
			p = p->next;
		}
		printf("=============================================================================\n\n");
	}
	break;
	case 4:
	{
		char name[30] = { 0 };
		printf("請輸入要查詢的名字:");
		scanf("%s", name);
		uNODE* p = head1;
		printf("=============================================================================\n\n");
		printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間", "座位號", "票價");
		while (p)
		{
			if (strcmp(p->data.name, name) == 0)
			{
				printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
			}
			p = p->next;
		}
		printf("=============================================================================\n\n");
	}

		break;
	default:
		puts("輸入錯誤請重新輸入!");
		break;
	}
	return i;
}

int change(tNODE** head)
{
	slist_printT(*head);
	char num[20] = { 0 };
	puts("請輸入要修改的車次:");
	scanf("%s", num);
	tNODE* p = *head, * q = *head;
	while (p)
	{
		if (strcmp(p->data.num, num) == 0)
		{
			char new_num[20] = { 0 };
			puts("請輸入修改后的車次:");
			scanf("%s", new_num);
			while (q)
			{
				if (strcmp(new_num, q->data.num) == 0)
				{
					puts("車次已存在,修改失?。?);
					return 0;
				}
				q = q->next;
			}
			strcpy( p->data.num, new_num);
			puts("請輸入修改后的起始站");
			scanf("%s", p->data.start);

			puts("請輸入修改后的終點站");
			scanf("%s", p->data.end);

			puts("請輸入修改后的出發(fā)日期(例如2022/11/11)");
			scanf("%s", p->data.date);

			puts("請輸入修改后的出發(fā)時間(例如12:15)");
			scanf("%s", p->data.time);

			float take = 0, price = 0;
			int count = 0;
			puts("請輸入修改后的歷時");
			scanf("%f", &take);
			p->data.take = take;

			puts("請輸入修改后的票數(shù)");
			scanf("%d", &count);
			p->data.count = count;

			puts("請輸入修改后的票價");
			scanf("%f", &price);
			p->data.price = price;
			saveT(*head);
			puts("請稍后... ...");
			sleep(1);
			puts("修改成功!");
			printf("=============================================================================\n\n");
			printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "車次", "出發(fā)站", "到達(dá)站", "出發(fā)日期", "出發(fā)時間", "歷時", "票數(shù)", "票價");
			printf("%s\t%s\t%s\t%s\t%s\t\t%.2f\t%d\t%.2f\n", p->data.num, p->data.start, p->data.end, p->data.date, p->data.time, p->data.take, p->data.count, p->data.price);
			printf("=============================================================================\n\n");
			return 0;
		}
		p = p->next;
	}

		puts("未找到該車次");
		return 0;

}

到了這里,關(guān)于C語言階段小項目(火車購票系統(tǒng))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【課程設(shè)計】數(shù)據(jù)庫:火車票管理系統(tǒng)

    【課程設(shè)計】數(shù)據(jù)庫:火車票管理系統(tǒng)

    摘要:本文主要介紹了火車票管理系統(tǒng),其中包括其選題功能概述,對該系統(tǒng)的方案方法設(shè)計,以及過程實現(xiàn)等內(nèi)容。由于系統(tǒng)的代碼量較大,因此將會較為抽象地對思想進(jìn)行介紹,在必要時會舉出一些實例,還會附上成果展示以及安裝方法。最后補(bǔ)充一下這次團(tuán)伙作案的心

    2024年02月08日
    瀏覽(23)
  • 設(shè)計一個億級高并發(fā)系統(tǒng)架構(gòu) - 12306火車票核心場景DDD領(lǐng)域建模

    設(shè)計一個億級高并發(fā)系統(tǒng)架構(gòu) - 12306火車票核心場景DDD領(lǐng)域建模

    “ 架設(shè)一個億級高并發(fā)系統(tǒng),是多數(shù)程序員、架構(gòu)師的工作目標(biāo)。 許多的技術(shù)從業(yè)人員甚至有時會降薪去尋找這樣的機(jī)會。但并不是所有人都有機(jī)會主導(dǎo),甚至參與這樣一個系統(tǒng)。今天我們用12306火車票購票這樣一個業(yè)務(wù)場景來做DDD領(lǐng)域建模?!?要實現(xiàn)軟件設(shè)計、軟件開發(fā)

    2024年02月03日
    瀏覽(44)
  • 火車票車票查詢-Python

    火車票車票查詢-Python

    一、相關(guān)代碼 二、結(jié)果 三、注意12306城市對應(yīng)縮寫city.json的獲取 1.相關(guān)鏈接:12306城市名對應(yīng)字母縮寫 - 悟透 - 博客園 (cnblogs.com) 2.在桌面創(chuàng)建文本文件,復(fù)制內(nèi)容到文本文件中,保存后,更改后綴為.json,放到與代碼同級的目錄中 四、過程請查看代碼注釋 ?

    2024年01月24日
    瀏覽(26)
  • [附源碼]計算機(jī)畢業(yè)設(shè)計-JAVA火車票訂票管理系統(tǒng)-springboot-論-文-ppt

    [附源碼]計算機(jī)畢業(yè)設(shè)計-JAVA火車票訂票管理系統(tǒng)-springboot-論-文-ppt

    PPT+論文 本論文主要論述了如何使用JAVA語言開發(fā)一個火車訂票管理系統(tǒng) ,本系統(tǒng)將嚴(yán)格按照軟件開發(fā)流程進(jìn)行各個階段的工作,采用B/S架構(gòu),面向?qū)ο缶幊趟枷脒M(jìn)行項目開發(fā)。在引言中,作者將論述火車訂票管理系統(tǒng)的當(dāng)前背景以及系統(tǒng)開發(fā)的目的,后續(xù)章節(jié)將嚴(yán)格按照軟件

    2024年02月12日
    瀏覽(21)
  • 手把手教你用python一鍵搶12306火車票(附代碼)

    手把手教你用python一鍵搶12306火車票(附代碼)

    哈嘍,哈嘍~,一年一度的搶火車票大戰(zhàn)正式拉開序幕… 然餓大多數(shù)人碰到的是這種情況:當(dāng)你滿心期待摩拳擦掌準(zhǔn)備搶票的時候,你會發(fā)現(xiàn)一票難求!想回趟家真難! 那么作為程序猿的你,當(dāng)然要用程序猿的方式來搶票!下面分享用python來搶票! 城市cookie可根據(jù)具體需求自

    2024年02月15日
    瀏覽(98)
  • 自動化測試、爬蟲、秒殺搶購、數(shù)據(jù)獲取新方案,利用docker鏡像運(yùn)行安卓云手機(jī),同時模擬運(yùn)行多個手機(jī)進(jìn)行數(shù)據(jù)抓取,可實現(xiàn)火車票、演唱會門票、茅臺、直播、iPhone手機(jī)自動下單等各種多任務(wù)

    自動化測試、爬蟲、秒殺搶購、數(shù)據(jù)獲取新方案,利用docker鏡像運(yùn)行安卓云手機(jī),同時模擬運(yùn)行多個手機(jī)進(jìn)行數(shù)據(jù)抓取,可實現(xiàn)火車票、演唱會門票、茅臺、直播、iPhone手機(jī)自動下單等各種多任務(wù)

    自動化測試、爬蟲、秒殺搶購、數(shù)據(jù)獲取新方案,利用docker鏡像運(yùn)行安卓云手機(jī),同時模擬運(yùn)行多個手機(jī)進(jìn)行數(shù)據(jù)抓取,可實現(xiàn)火車票、演唱會門票、茅臺、直播、iPhone手機(jī)自動下單等各種多任務(wù)。 這里選擇的是Redroid,ReDroid(Re mote an Droid)是一個 GPU 加速的 AIC(Android In

    2024年02月03日
    瀏覽(31)
  • Unity用爬蟲做一個火車購票系統(tǒng)

    Unity用爬蟲做一個火車購票系統(tǒng)

    實現(xiàn)思路: ????????1.去找個大怨種網(wǎng)站,抓包找到其查詢地址。 ?????????2.查詢地址找到后,解析網(wǎng)頁內(nèi)容,獲取車票信息 ?????????3.購票直接跳轉(zhuǎn)到網(wǎng)頁(沒辦法繞過登錄) 看起來應(yīng)該很簡單,按步驟執(zhí)行: 第一步: 百度搜了個網(wǎng)站: 獲得查詢車票信息地址:

    2023年04月11日
    瀏覽(18)
  • vb火車站售票管理系統(tǒng)設(shè)計與實現(xiàn)

    一個大型的計算機(jī)管理系統(tǒng)必須有一個正確的設(shè)計指導(dǎo)思想,通過合理的選擇數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng)以及開發(fā)環(huán)境,構(gòu)成一個完善的網(wǎng)絡(luò)系統(tǒng),才能充分發(fā)揮計算機(jī)信息管理優(yōu)勢?,F(xiàn)代化的車站售票是集預(yù)定車票、售票 、退票、車次查詢、報表及其他各種服務(wù),車站售票組織龐

    2024年02月09日
    瀏覽(21)
  • 基于JSP微信小程序汽車票訂票售票系統(tǒng)設(shè)計與實現(xiàn)

    基于JSP微信小程序汽車票訂票售票系統(tǒng)設(shè)計與實現(xiàn)

    第1步(數(shù)據(jù)庫操作): ? ? 導(dǎo)入sql數(shù)據(jù)庫 第2步(網(wǎng)站發(fā)布): ? ? 使用ideal導(dǎo)入管理系統(tǒng) ? ? 設(shè)置根目錄下 conn.jsp的數(shù)據(jù)庫連接 和 網(wǎng)址地址(小程序使用) ? ? 運(yùn)行站點,登錄后臺測試 第3步(小程序發(fā)布): ? ? 導(dǎo)入小程序 ? ? 設(shè)置app.js后臺管理系統(tǒng)的網(wǎng)址 ? ? 微信

    2024年02月11日
    瀏覽(19)
  • 基于Java(SpringBoot框架)畢業(yè)設(shè)計作品成品(07)在線選座電影售票購票系統(tǒng)設(shè)計與實現(xiàn)

    基于Java(SpringBoot框架)畢業(yè)設(shè)計作品成品(07)在線選座電影售票購票系統(tǒng)設(shè)計與實現(xiàn)

    博主介紹 :《Vue.js入門與商城開發(fā)實戰(zhàn)》《微信小程序商城開發(fā)》圖書作者,CSDN博客專家,在線教育專家,CSDN鉆石講師;專注大學(xué)生畢業(yè)設(shè)計教育和輔導(dǎo)。 所有項目都配有從入門到精通的基礎(chǔ)知識視頻課程,免費(fèi) 項目配有對應(yīng)開發(fā)文檔、開題報告、任務(wù)書、PPT、論文模版

    2024年02月08日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包