Ⅰ C語言:車輛交通違章管理程序
一個一模一樣的,我COPY過來,勿怪...實在是一樣
//注釋刪除掉 以及 中文用不了之外
其他是一樣的,那邊也是要求C語言編,的確一樣. 
//VC++6.0下調試通過 
#include <stdio.h> 
#include <stdlib.h> 
#include <malloc.h> 
#include <string.h> 
#include <time.h> 
typedef enum {s_park=1, s_speed, s_signal, s_other} SheetType; 
typedef enum {f_id, f_car, f_driver, f_police} FindType; 
typedef struct Sheet 
{ 
signed long id;//罰單號 
char carNo[20];//車牌號 
char driver[20];//司機名 
char police[20];//警察編號 
SheetType type;//罰單類型 
tm time;//出單日期 
}Sheet; 
typedef struct Node 
{ 
Sheet data; 
Node* next; 
}Node; 
static Node* begin=NULL;//哨兵結點 
static signed long len=0;//鏈表長度 
void printMenu();//列印菜單 
void printBye();//列印退出界面 
void printList(Node* bg);//列印所有罰單信息 
void printNode(Sheet sheet);//列印單條罰單 
Node* lookupSheet(void* pInfo, signed short* n, 
FindType type=f_id);//根據類型查詢罰單。成功返回結點。失敗NULL 
int addNode(Node* bg, Sheet sheet);//添加罰單。成功返回鏈表長度。內存分配失敗0 
int deleteNode(signed short stid);//根據罰單號刪除罰單。 
int total(char* driver, tm date1, tm date2, signed short* icar, 
signed short* ispeed, signed short* isignal, signed short* iother);//統計 
int getListlen(Node* bg); 
void freeList(Node* bg);//釋放鏈表 
void main() 
{ 
//初始化鏈表。 
begin=(Node*)malloc(sizeof(Node)); 
begin->next=NULL; 
printf("----------------------------------------------------------------------------\n"); 
printf("--- 《交通罰單管理系統》 ---\n"); 
printf("--- 沙支誇依 2007-12-24 ---\n"); 
printf("----------------------------------------------------------------------------\n"); 
printf("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n"); 
printMenu(); 
while (1) 
{ 
fflush(stdin); 
char cmd=getchar(); 
Sheet sheet; 
memset(&sheet, 0, sizeof(Sheet)); 
switch (cmd) 
{ 
case '1': 
printf("---添加交通處罰單信息。(車牌號為 0 結束)\n"); 
while (1) 
{ 
printf("請輸入違章車輛號: "); 
fflush(stdin); 
gets(sheet.carNo); 
if (!strcmp(sheet.carNo,"0")) 
break; 
printf("請輸入違章司機姓名: "); 
fflush(stdin); 
gets(sheet.driver); 
printf("請輸入開單交警編號: "); 
fflush(stdin); 
gets(sheet.police); 
printf("請選擇違章類型(1-違章停車 2-超速 3-不按信號燈行使 4-其它):"); 
scanf("%d", &sheet.type); 
printf("請輸入開單日期(例 2007-12-24): "); 
scanf("%d-%d-%d", &sheet.time.tm_year, &sheet.time.tm_mon, &sheet.time.tm_mday); 
int succ=addNode(begin, sheet); 
if (!succ) 
{ 
printf("內存錯誤!請重新輸入!\n"); 
} 
else 
printf("添加成功!當前記錄�?%d\n", len); 
printf("\n"); 
} 
printMenu(); 
break; 
case '2': 
printf("---刪除交通處罰單信息。(罰單號為 0 結束)\n"); 
while (1) 
{ 
signed short stid=0; 
printf("請輸入要刪除的罰單號:"); 
scanf("%d", &stid); 
if (!stid) 
break; 
Node* delNode=lookupSheet(&stid, NULL); 
if (!delNode) 
printf("對不起!你要刪除的記錄不存在。\n"); 
else 
{ 
printNode(delNode->data); 
printf("您確定要刪除這條記錄嗎?(任意鍵刪除/ n 取消)\n"); 
fflush(stdin); 
char cDelete=getchar(); 
if ('n'==cDelete) 
continue; 
printf("刪除成功!剩餘記錄數: %d\n",deleteNode(stid)); 
} 
printf("\n"); 
} 
printMenu(); 
break; 
case '3': 
printf("---查詢交通處罰單信息。(輸入 0 結束)\n"); 
while (1) 
{ 
printf("請選擇查詢類型: 1-車輛號 2-司機 3-交警 4-退出\n>>>"); 
Node* findNode=NULL; 
int findtype=0; 
scanf("%d", &findtype); 
if (4==findtype) 
break; 
char findInfo[20]; 
signed short findcout=0; 
switch (findtype) 
{ 
case 1: 
printf("請輸入車輛號: "); 
fflush(stdin); 
gets(findInfo); 
findNode=lookupSheet(findInfo, &findcout, f_car); 
if (getListlen(findNode)>=5) 
{ 
printf("---該車輛違章超過5次。建議重罰。\n"); 
} 
break; 
case 2: 
printf("請輸入司機姓名: "); 
fflush(stdin); 
gets(findInfo); 
findNode=lookupSheet(findInfo, &findcout, f_driver); 
if (getListlen(findNode)>=5) 
{ 
printf("---該司機違章超過5次。建議重罰。\n"); 
} 
break; 
case 3: 
default: 
printf("請輸入交警編號: "); 
fflush(stdin); 
gets(findInfo); 
findNode=lookupSheet(findInfo, &findcout, f_police); 
} 
if (!findNode) 
printf("對不起!你要查詢的記錄不存在。\n"); 
else 
{ 
printList(findNode); 
freeList(findNode); 
} 
printf("\n"); 
} 
printMenu(); 
break; 
case '4': 
printf("---統計司機處罰單信息。(輸入 0 結束)\n"); 
while (1) 
{ 
printf("請輸入司機姓名: "); 
char driver[20]; 
fflush(stdin); 
gets(driver); 
if (!strcmp(driver, "0")) 
break; 
printf("請輸入起始日期(如 2007-12-24): "); 
tm date1; 
memset(&date1, 0, sizeof(tm)); 
scanf("%d-%d-%d", &date1.tm_year, &date1.tm_mon, &date1.tm_mday); 
printf("請輸入終止日期(如 2007-12-24): "); 
tm date2; 
memset(&date2, 0, sizeof(tm)); 
scanf("%d-%d-%d", &date2.tm_year, &date2.tm_mon, &date2.tm_mday); 
signed short car, speed, signal, other; 
int sum=total(driver, date1, date2, &car, &speed, &signal, &other); 
printf("司機姓名:%-10s 違章停車:%2d 超速:%2d 不按信號燈行使:%2d 其它:%2d 共計:%2d\n", 
driver, car, speed, signal, other, car+speed+signal+other); 
printf("\n"); 
} 
printMenu(); 
break; 
case '5': 
printList(begin); 
printMenu(); 
break; 
case '6': 
printf("---修改交通處罰單信息。(輸入 0 結束)\n"); 
while (1) 
{ 
signed short stid=0; 
printf("請輸入要修改的交通處罰單號:"); 
fflush(stdin); 
scanf("%d", &stid); 
if (!stid) 
break; 
Node* updataNode=lookupSheet(&stid, NULL); 
if (!updataNode) 
printf("對不起!你要修改的記錄不存在。\n"); 
else 
{ 
printNode(updataNode->data); 
memset(&sheet, 0, sizeof(Sheet)); 
sheet.id=stid; 
printf("請修改違章車輛號: "); 
fflush(stdin); 
gets(sheet.carNo); 
printf("請修改違章司機姓名: "); 
fflush(stdin); 
gets(sheet.driver); 
printf("請修改開單交警編號: "); 
fflush(stdin); 
gets(sheet.police); 
printf("請修改違章類型(1-違章停車 2-超速 3-不按信號燈行使 4-其它):"); 
scanf("%d", &sheet.type); 
printf("請修改開單日期(例 2007-12-24): "); 
scanf("%d-%d-%d", &sheet.time.tm_year, &sheet.time.tm_mon, &sheet.time.tm_mday); 
updataNode->data=sheet; 
printNode(updataNode->data); 
} 
printf("\n"); 
} 
printMenu(); 
break; 
case '7': 
printBye(); 
freeList(begin); 
exit(0); 
break; 
default: 
printMenu(); 
} 
} 
} 
void printMenu() 
{ 
printf("----------------------------------------------------------------------------\n"); 
printf("--- 1、添加交通處罰單信息。 2、刪除交通處罰單信息。 ---\n"); 
printf("--- 3、查詢交通處罰單信息。 4、統計司機處罰單信息。 ---\n"); 
printf("--- 5、瀏覽交通處罰單信息。 6、修改交通處罰單信息。 ---\n"); 
printf("--- 7、退出。 ---\n"); 
printf("----------------------------------------------------------------------------\n"); 
printf(">>>"); 
} 
void printBye() 
{ 
printf("----------------------------------------------------------------------------\n"); 
printf(" 感謝您使用交通罰單管理系統 \n"); 
printf(" 再 見 \n"); 
printf("----------------------------------------------------------------------------\n"); 
} 
void printNode(Sheet sheet) 
{ 
char* type=NULL; 
switch (sheet.type) 
{ 
case s_park: 
type="違章停車"; 
break; 
case s_speed: 
type="超速"; 
break; 
case s_signal: 
type="不按信號燈行使"; 
break; 
case s_other: 
default: 
type="其它"; 
} 
printf("罰單號:%-6d 車牌號:%-10s 司機名:%-10s 交警名:%-10s\n" 
"罰單類型:%-15s 開單日期:%d-%d-%d\n", 
sheet.id, sheet.carNo, sheet.driver, sheet.police, 
type, sheet.time.tm_year, sheet.time.tm_mon, sheet.time.tm_mday); 
printf("--------------------------------------------------------------------------\n"); 
} 
void printList(Node* bg) 
{ 
Node* temp=bg->next; 
if (!temp) 
{ 
printf("暫時無記錄可供瀏覽!\n"); 
} 
while (temp) 
{ 
printNode(temp->data); 
temp=temp->next; 
} 
} 
Node* lookupSheet(void* pInfo, signed short* n, FindType type) 
{ 
Node* result=NULL; 
if (type) 
{ 
result=(Node*)malloc(sizeof(Node)); 
result->next=NULL; 
*n=0; 
} 
Node* temp=begin->next; 
switch (type) 
{ 
case f_id: 
while (temp) 
{ 
if (temp->data.id==*(signed long*)pInfo) 
{ 
if (n) 
*n=1; 
return temp; 
} 
temp=temp->next; 
} 
break; 
case f_car: 
while (temp) 
{ 
if (!strcmp(temp->data.carNo,(char*)pInfo)) 
{ 
addNode(result, temp->data); 
(*n)++; 
} 
temp=temp->next; 
} 
break; 
case f_driver: 
while (temp) 
{ 
if (!strcmp(temp->data.driver,(char*)pInfo)) 
{ 
addNode(result, temp->data); 
(*n)++; 
} 
temp=temp->next; 
} 
break; 
case f_police: 
while (temp) 
{ 
if (!strcmp(temp->data.police,(char*)pInfo)) 
{ 
addNode(result, temp->data); 
(*n)++; 
} 
temp=temp->next; 
} 
break; 
} 
return result; 
} 
int addNode(Node* bg, Sheet sheet) 
{ 
Node* temp=(Node*)malloc(sizeof(Node)); 
if (!temp) 
return 0; 
if (bg==begin) 
{ 
if (bg->next) 
{ 
sheet.id=bg->next->data.id+1; 
} 
else 
sheet.id=1; 
} 
temp->data=sheet; 
temp->next=bg->next; 
bg->next=temp; 
return ++len; 
} 
int deleteNode(signed short stid) 
{ 
Node* temp=begin; 
Node* pos=NULL; 
while (temp->next) 
{ 
if (temp->next->data.id==stid) 
{ 
pos=temp->next; 
temp->next=pos->next; 
free(pos); 
return --len; 
} 
temp=temp->next; 
} 
return -1; 
} 
int getListlen(Node* bg) 
{ 
Node* temp=bg; 
int i=0; 
while (temp->next) 
{ 
i++; 
temp=temp->next; 
} 
return i; 
} 
void freeList(Node* bg) 
{ 
Node* temp=NULL; 
while (bg) 
{ 
temp=bg->next; 
free(bg); 
bg=temp; 
} 
} 
int total(char* driver, tm date1, tm date2, signed short* icar, 
signed short* ispeed, signed short* isignal, signed short* iother) 
{ 
signed short result=0; 
*icar=0; 
*ispeed=0; 
*isignal=0; 
*iother=0; 
Node* findNode=lookupSheet(driver, &result, f_driver); 
if (!findNode) 
{ 
free(findNode); 
return 0; 
} 
time_t o,n,nw; 
date1.tm_year-=1900; 
date2.tm_year-=1900; 
o=mktime(&date1); 
n=mktime(&date2); 
if (o<n) 
{ 
time_t tp=o; 
o=n; 
n=tp; 
} 
Node* temp=findNode->next; 
while (temp) 
{ 
tm t=temp->data.time; 
t.tm_year-=1900; 
nw=mktime(&t); 
if (nw>o||nw<n) 
{ 
temp=temp->next; 
continue; 
} 
switch (temp->data.type) 
{ 
case 1: 
(*icar)++; 
break; 
case 2: 
(*ispeed)++; 
break; 
case 3: 
(*isignal)++; 
break; 
case 4: 
default: 
(*iother)++; 
} 
temp=temp->next; 
} 
freeList(findNode); 
return result; 
}
