<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文為大家分享了C語言實現火車票管理系統課程設計的具體程式碼,供大家參考,具體內容如下
這是大一剛學C語言一個學期完成的課設專案,裡面的功能還可以進一步的完善,僅供分享、參考、記錄使用,加油!
隨著社會的發展,為了滿足人們的訂車票需求,所以設計了一個車票管理系統,讓使用者可以查詢到車票的餘數,乘車時間,以及為使用者提供一個訂票和退票的平臺,同時管理員也可以借用此係統進行對車票進行操作。
1.對車票的各類資訊進行採集並錄入;
2.從磁碟檔案中讀取車輛資訊;
3.對所有車票資訊的個數進行統計
4.對車票資訊進行增加;
5.對特定的車票進行查詢
6.對所有車輛的旅程總時長進行排序;
7.乘客輸入自己的資訊訂票;
8.乘客輸入自己的資訊退票;
9.註冊賬號以及登入賬號進入系統。
採用連結串列實現系統,同時設定了密碼,使用者進入系統輸入密碼時,給密碼進行了加密操作,而且該管理系統實現了查票、訂票、退票、增加票、排序等功能。
登入功能: void enroll(),int land();
包括註冊和登入,新使用者需要先註冊登入,並且登入的時候密碼用*進行覆蓋;
車票功能:①struct node *read_inf();
從檔案中讀取資訊,在檔案中書寫好車票資訊,然後呼叫函數,將檔案中的資訊讀取並顯示出來。
②void save_inf(struct node *pHead);
將從鍵盤輸入的車票資訊儲存到檔案中,最後可以在檔案中檢視所儲存的資訊。
③struct node *add(struct node *pHead);
增加車票資訊,採用頭插法或者尾插法增加車票資訊並且顯示出所有的車票資訊。
④int listlength(struct node *pHead);
統計所以的車票資訊數,通過連結串列的遍歷的方法,用count計數,最後count的值即為車票資訊數。
⑤int inquire(struct node *pHead);
查詢所需的車票資訊,通過連結串列遍歷,查詢起點站和終點站和所需相一致的進而實現此功能。
⑥void Sort(struct node *pHead);
對車票的時長進行排序,通過連結串列的遍歷,採用氣泡排序,讓時長從短到長的排序,也可以把時長變數換成餘票數等等變數名進行排序,借用中間變數進行交換值。
⑦void output(struct node *pHead);
輸出顯示車票資訊,採用連結串列的遍歷方法,將所儲存的連結串列資訊列印顯示出來。
⑧int buy(struct node *pHead);
訂票,輸入姓名,以及所需的訂票數,查詢起始站與終點站,最後票數會得到相應的減少。
⑨int back(struct node *pHead);
退票,輸入姓名,以及所想的退票數,最後此票數會得到相應的增加。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include<ctype.h> #include<windows.h> #define n 5 int len=0; //乘客資訊 struct passenge { char name[10]; //姓名 int num; //所需票量 }lg[n]; //結構體變數名 //車票資訊 typedef struct train { char start_stat[20]; //起始站 char end_stat[20]; //終點站 char go_time[16]; //出發時間 char go_data[16]; //出發日期 char train_num[15]; //車次資訊 char all_time[16]; //旅途時間 int ticket_lea; //餘票數量 }Train; //把結構體struct train 叫做 Train typedef Train Item; //又把Train 叫做 Item,目的讓連結串列更通用 連結串列裡只有2 個東西 專案和指標 struct node { //node是一個節點 節點包括專案和指標 Item item; struct node *next; }; //註冊資訊 void enroll() { char a[100]; //註冊使用者名稱 char b[100]; //註冊密碼 char s[100]; //再次確定密碼 int len; printf("請輸入您的使用者名稱:"); scanf("%s",a); printf("請設定您的密碼:"); reset: scanf("%s",b); //用到了if goto語句 len=strlen(b); //讀取密碼長度 if(len>9) { printf("密碼長度過長,請重新設定:"); goto reset; //if goto 語句 } printf("請再次輸入您設定的密碼:"); scanf("%s",s); if(strcmp(b,s) == 0) //字串比較函數 { FILE *fp; fp=fopen("register.txt","at"); //選用追加方式,可以存多個資訊 if(fp == NULL) { printf("檔案不存在!"); exit(1); } fprintf(fp,"%s %sn",a,b); //字串寫入函數進行寫入操作 printf("nt------註冊成功------n"); fclose(fp); } else if(strcmp(b,s) != 0) { printf("您兩次輸入的密碼不一致,請重新設定密碼!n"); goto reset; //if goto 語句 } } //登陸頁面 int land() { int i=0; //i是為了判斷密碼長度 並加密 char a[10]; char b[10]; char user_name[10]; char user_passwords[10]; printf("請輸入您的使用者名稱:"); scanf("%s",user_name); printf("請輸入您的密碼:"); while(i<9 && (user_passwords[i] = getch()) && user_passwords[i] != 'r') //如果輸入超限 或者 遇到換行符就跳出迴圈 { printf("*"); //掩飾密碼 i++; } user_passwords[i]=0; //字串結束標誌 '/0' FILE *fp; fp=fopen("register.txt","rt"); //又開啟檔案 if(fp==NULL) { printf("檔案不存在!"); exit(1); } while(fscanf(fp,"%s %s",a,b)!=EOF) //讀檔案判斷賬號密碼是否正確 { if(strcmp(a,user_name)==0 && strcmp(b,user_passwords)==0) //字串比較函數,看是否正確 { printf("nt--------登陸成功--------n"); printf("t------歡迎進入系統------n"); return 0; } } if(1) { printf("n資訊輸入錯誤!n"); land(); } fclose(fp); } //將資訊儲存到檔案 void save_inf(struct node *pHead) //將連結串列中的資訊儲存到制定檔案中 { //頭指標不能移動 struct node *pTemp; //因為要一個節點移動 所以定義為pTemp移動 FILE *fp; fp=fopen("information.txt","at"); //開啟檔案 if(fp==NULL) { printf("開啟檔案失敗,檔案可能不存在!n"); exit(1); } //遍歷輸入 for(pTemp=pHead ; pTemp != NULL;pTemp=pTemp->next) //節點先指向專案,專案裡面再找成員 fprintf(fp,"%s %s %s %s %s %s %dn",pTemp->item.start_stat,pTemp->item.end_stat, pTemp->item.go_time,pTemp->item.go_data,pTemp->item.train_num,pTemp->item.all_time,pTemp->item.ticket_lea); fclose(fp); } //增加 struct node *add(struct node *pHead) { struct node *pNew; struct node *current; pNew=(struct node *)malloc(sizeof(struct node)); //再次分配結點的記憶體空間 pNew->next=pHead; //新結點指向原來的首節點 pHead=pNew; //頭指標指向新結點 //尾插法; /*current=pHead; while(current->next!=NULL) { current=current->next; } current->next=pNew; pNew->next=NULL; */ printf("n請輸入起始站:"); scanf("%s",pNew->item.start_stat); printf("請輸入終點站:"); scanf("%s",pNew->item.end_stat); printf("請輸入出發時間:"); scanf("%s",pNew->item.go_time); printf("請輸入出發日期:"); scanf("%s",pNew->item.go_data); printf("請輸入車次資訊:"); scanf("%s",pNew->item.train_num); printf("請輸入旅途時間:"); scanf( "%s",pNew->item.all_time); printf("請輸入餘票數量:"); scanf("%d",&pNew->item.ticket_lea); current=pHead; while(current!=NULL){ printf("%-10s",current->item.start_stat); printf("%-10s",current->item.end_stat); printf("%-12s",current->item.go_time); printf("%-14s",current->item.go_data); printf("%-12s",current->item.train_num); printf("%-13s",current->item.all_time); printf("%-d",current->item.ticket_lea); printf("n"); current=current->next; } return pHead; //返回頭指標 } //輸出顯示模組 void output(struct node *pHead) { struct node *pTemp; //迴圈所用的臨時指標 pTemp=pHead; //指標的到首結點的指標 printf("t******車票資訊如下******n"); printf("起始站 終點站 出發時間 出發日期 車次資訊 旅途時間 餘票量n"); while((pTemp!=NULL)) { printf("%-10s",pTemp->item.start_stat); printf("%-10s",pTemp->item.end_stat); printf("%-12s",pTemp->item.go_time); printf("%-14s",pTemp->item.go_data); printf("%-12s",pTemp->item.train_num); printf("%-13s",pTemp->item.all_time); printf("%-d",pTemp->item.ticket_lea); printf("n"); pTemp=pTemp->next; //移動臨時指標到下一個結點 } } //查詢車票資訊 int inquire(struct node *pHead) { int flag = 0; struct node *pTemp; char inquire_start[20],inquire_end[20]; //查詢選擇的起始站和終點站 printf("請輸入要查詢車票的起始站和終點站:"); scanf("%s %s",inquire_start,inquire_end); pTemp=pHead; while(pTemp!=NULL) { if((strcmp(pTemp->item.start_stat,inquire_start)==0) && (strcmp(pTemp->item.end_stat,inquire_end)==0)) { flag = 1; printf("n車票資訊結果如下:n"); printf("起始站 終點站 出發時間 出發日期 車次 旅途時間 餘票量n"); printf("%-10s",pTemp->item.start_stat); printf("%-10s",pTemp->item.end_stat); printf("%-12s",pTemp->item.go_time); printf("%-14s",pTemp->item.go_data); printf("%-12s",pTemp->item.train_num); printf("%-13s",pTemp->item.all_time); printf("%-d",pTemp->item.ticket_lea); } pTemp=pTemp->next; continue; } if(flag == 0) { printf("輸入錯誤!n"); inquire(pHead); } return 0; } //訂票 int buy(struct node *pHead) { struct node *pTemp; char choice_start[20],choice_end[20]; /*購票選擇的起始和終點站*/ int numbers; /*購買數量*/ char buy_name[10]; /*購買人姓名*/ char wy; pTemp=pHead; printf("請輸入所購買車票的起始站、終點站和票數:"); scanf("%s %s %d",choice_start,choice_end,&numbers); while(pTemp!=NULL) { if((strcmp(pTemp->item.start_stat,choice_start)==0)&&(strcmp(pTemp->item.end_stat,choice_end)==0)) /*找到起始終點均相同的站*/ { if(numbers<=pTemp->item.ticket_lea) /*若小於餘票量進行辦理*/ { printf("找到符合資訊的車次:n"); printf("起始站 終點站 出發時間 出發日期 車次 旅途時間 餘票量n"); printf("%-10s",pTemp->item.start_stat); printf("%-10s",pTemp->item.end_stat); printf("%-11s",pTemp->item.go_time); printf("%-12s",pTemp->item.go_data); printf("%-10s",pTemp->item.train_num); printf("%-13s",pTemp->item.all_time); printf("%-d",pTemp->item.ticket_lea); printf("n"); printf("請您輸入姓名:"); scanf("%s",buy_name); printf("正在辦理訂票......n"); printf("恭喜您辦理成功!n"); pTemp->item.ticket_lea=pTemp->item.ticket_lea - numbers; /*辦理成功,該車次票量減少*/ strcpy(lg[len].name,buy_name); lg[len].num=numbers; len++; return 0; /*訂票成功返回主選單*/ } else { printf("您所需要的票數超過餘票數,請問是否繼續辦理(Y/y || N/n)?n"); getchar(); scanf("%c",&wy); if(wy == 'Y' || wy == 'y') buy(pHead); else if(wy == 'N' || wy=='n' ) { printf("謝謝使用,按任意鍵返回!n"); getch(); return 0; } } } else pTemp=pTemp->next; } printf("n很遺憾,未找到您需要的車次,請重新訂票!n"); buy(pHead); return 0; } //退票 int back(struct node *pHead) { struct node *pTemp; int i; char wy; //判斷yes or no char back_name[10]; //退票人姓名 int back_num; //退票數 char back_start[20]; //退票起始站 char back_end[20]; //退票終點站 printf("請輸入要退票人姓名和退票數:"); scanf("%s%d",back_name,&back_num); printf("請輸入退票的起始站和終點站:"); scanf("%s%s",back_start,back_end); pTemp=pHead; while(pTemp!=NULL) { if((strcmp(pTemp->item.start_stat,back_start)==0)&&(strcmp(pTemp->item.end_stat,back_end)==0)) /*找到起始終點均相同的站*/ { for(i=0;i<len;i++) { if(strcmp(back_name,lg[i].name)==0) { printf("退票成功!n"); pTemp->item.ticket_lea=pTemp->item.ticket_lea + back_num; //辦理成功,該車次票數增加 return 0; } else { printf("未找到您定的票,請問您是否重輸資訊繼續進行退票(Y/y || N/n):"); getchar(); scanf("%c",&wy); if(wy=='Y' || wy =='y') back(pHead); else if(wy=='N' || wy == 'n') { printf("謝謝使用,按任意鍵返回!n"); getch(); return 0; } } } } else pTemp=pTemp->next; } printf("n很遺憾,未找到您要退票的車次,請重新退票!n"); back(pHead); return 0; } //從檔案中讀取資訊 struct node *read_inf() //從磁碟檔案中讀取資訊並存入單連結串列 { struct node *head, *r, *train; //定義結構體指標變數 struct node是型別 //head為頭結點(頭結點中有資訊),r為尾節點, train為當前節點 FILE *fp; if((fp=fopen("information.txt","rt"))==NULL) { printf("讀檔案出錯,按任意鍵退出"); getch(); exit(1); } head=(struct node *)malloc(sizeof(struct node)); //初始化 head->next=NULL; fscanf(fp,"%s %s %s %s %s %s %d",head->item.start_stat,head->item.end_stat, head->item.go_time,head->item.go_data,head->item.train_num,head->item.all_time,&head->item.ticket_lea); r=head; //r是尾節點 while(!feof(fp)) //檔案末結束 { train=(struct node *)malloc(sizeof(struct node)); //建立連結串列 fscanf(fp,"%s %s %s %s %s %s %d",train->item.start_stat,train->item.end_stat, train->item.go_time,train->item.go_data,train->item.train_num,train->item.all_time,&train->item.ticket_lea); r->next=train; //連結串列節點 r=train; } r->next=NULL; fclose(fp); printf("n檔案中資訊以正確讀出,按任意鍵返回!"); getch(); //清除緩衝區 system("cls"); return head; } //主介面 void meau() { printf("n"); printf("t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n"); printf("t☆==============歡迎使用車票管理系統==============☆n"); printf("t☆~~~~~~~~~~~~~~~1.存入車票資訊~~~~~~~~~~~~~~~~~~~☆n"); printf("t☆~~~~~~~~~~~~~~~2.顯示車票資訊~~~~~~~~~~~~~~~~~~~☆n"); printf("t☆~~~~~~~~~~~~~~~3.查詢車票資訊~~~~~~~~~~~~~~~~~~~☆n"); printf("t☆~~~~~~~~~~~~~~~4.增加車票資訊~~~~~~~~~~~~~~~~~~~☆n"); printf("t☆~~~~~~~~~~~~~~~5.統計 與 排序~~~~~~~~~~~~~~~~~~~☆n"); printf("t☆~~~~~~~~~~~~~~~6. 訂 票~~~~~~~~~~~~~~~~~~~~~☆n"); printf("t☆~~~~~~~~~~~~~~~7. 退 票~~~~~~~~~~~~~~~~~~~~~☆n"); printf("t☆~~~~~~~~~~~~~~~8.切換賬號登入~~~~~~~~~~~~~~~~~~~☆n"); printf("t☆~~~~~~~~~~~~~~~9.退出管理系統~~~~~~~~~~~~~~~~~~~☆n"); printf("t☆================================================☆n"); printf("t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n"); printf("請選擇編號(1-9)選擇功能進行相應的操作:"); } //連結串列長度,為了更好的排序 int listlength(struct node *pHead) //判斷連結串列的長度 進而知道迴圈次數 { struct node *current; int len=0; current=pHead; while(current!=NULL) { len++; //遍歷一篇 len自增 表示最後連結串列的長度 current=current->next; } return len; } //排統計序 void Sort(struct node *pHead) { int len; struct node *current; current=pHead; len=listlength(pHead); //上面一個函數的功能判斷連結串列的長度 printf("共有%d個資訊n", len); while(len>1) { //氣泡排序 while(current->next != NULL) { if(strcmp(current->item.all_time, current->next->item.all_time)>0) //比較時間 { Item temp; //定義一個交換變數 temp=current->item; current->item=current->next->item; current->next->item=temp; } current=current->next; } len--; current=pHead; //每次從頭開始遍歷 } output(pHead); //進去輸出函數 return; } //主函數 int main() { system("color 4"); printf("歡");sleep(0); printf("迎");sleep(1); system("color 3"); printf("使");sleep(0); printf("用");sleep(1); system("color 2"); printf("車");sleep(0); printf("票");sleep(1); system("color 1"); printf("管");sleep(0); printf("理");sleep(1); system("color 6"); printf("系");sleep(0); printf("統n");sleep(2); printf("tt"); printf("n"); system("color 8"); printf("ttt即將進入登陸註冊頁面請稍候....."); sleep(3); system("cls"); system("color 3"); int x; printf("tt1.登陸ttt2.註冊並登入n"); printf("請選擇序號:"); scanf("%d",&x); if(x==1) land(); else if(x==2) { enroll(); land(); } else { printf("輸入無效,即將退出系統!n"); exit(1); } int choice=8; struct node *pHead; //定義頭結點 //選擇編號 while(choice != 10) { meau(); scanf("%d",&choice); switch(choice) { case 1:system("cls"); pHead=read_inf(); break; case 2:system("cls"); output(pHead); break; case 3:system("cls"); inquire(pHead); break; case 4:system("cls"); add(pHead); save_inf(pHead); break; case 5:system("cls"); Sort(pHead); break; case 6:system("cls"); buy(pHead); break; case 7:system("cls"); back(pHead); break; case 8:land(); break; case 9:exit(1); default:printf("請輸入正確的編號!n"); break; } } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45