#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#define MAX_TICKETS 1000
#define FILENAME "tickets.dat"
typedef struct {
char name[50];
char license_num[20];
} Driver;
typedef struct {
char plate_num[15];
char vehicle_type[20];
} Vehicle;
typedef struct {
int ticket_id;
Driver driver;
Vehicle vehicle;
char violation[50];
float fine;
int points;
time_t date;
} Ticket;
Ticket tickets[MAX_TICKETS];
int ticket_count = 0;
// 函数声明
void load_tickets();
void save_tickets();
void add_ticket();
void search_ticket();
void delete_ticket();
void statistics();
void display_menu();
void display_ticket(Ticket t);
int validate_date(int y, int m, int d);
int main() {
load_tickets();
int choice;
do {
display_menu();
printf("请输入选项: ");
scanf("%d", &choice);
getchar(); // 清除输入缓冲区
switch(choice) {
case 1: add_ticket(); break;
case 2: search_ticket(); break;
case 3: delete_ticket(); break;
case 4: statistics(); break;
case 5: printf("系统退出...\n"); break;
default: printf("无效选项!\n");
}
} while(choice != 5);
save_tickets();
return 0;
}
void load_tickets() {
FILE *file = fopen(FILENAME, "rb");
if (file == NULL) {
printf("未找到数据文件,将创建新文件\n");
return;
}
ticket_count = fread(tickets, sizeof(Ticket), MAX_TICKETS, file);
fclose(file);
printf("已加载 %d 条罚单记录\n", ticket_count);
}
void save_tickets() {
FILE *file = fopen(FILENAME, "wb");
if (file == NULL) {
printf("无法保存数据文件!\n");
return;
}
fwrite(tickets, sizeof(Ticket), ticket_count, file);
fclose(file);
printf("数据已保存\n");
}
void add_ticket() {
if (ticket_count >= MAX_TICKETS) {
printf("罚单数量已达上限!\n");
return;
}
Ticket new_ticket;
printf("\n--- 添加新罚单 ---\n");
// 驾驶员信息
printf("驾驶员姓名: ");
fgets(new_ticket.driver.name, 50, stdin);
new_ticket.driver.name[strcspn(new_ticket.driver.name, "\n")] = '\0';
printf("驾照号码: ");
fgets(new_ticket.driver.license_num, 20, stdin);
new_ticket.driver.license_num[strcspn(new_ticket.driver.license_num, "\n")] = '\0';
// 车辆信息
printf("车牌号: ");
fgets(new_ticket.vehicle.plate_num, 15, stdin);
new_ticket.vehicle.plate_num[strcspn(new_ticket.vehicle.plate_num, "\n")] = '\0';
printf("车型: ");
fgets(new_ticket.vehicle.vehicle_type, 20, stdin);
new_ticket.vehicle.vehicle_type[strcspn(new_ticket.vehicle.vehicle_type, "\n")] = '\0';
// 违法行为
printf("违法行为: ");
fgets(new_ticket.violation, 50, stdin);
new_ticket.violation[strcspn(new_ticket.violation, "\n")] = '\0';
// 处罚金额
printf("处罚金额: ");
while(scanf("%f", &new_ticket.fine) != 1 || new_ticket.fine <= 0) {
printf("请输入有效金额: ");
while(getchar() != '\n'); // 清除无效输入
}
// 扣分
printf("扣分数: ");
while(scanf("%d", &new_ticket.points) != 1 || new_ticket.points < 0) {
printf("请输入有效扣分数: ");
while(getchar() != '\n');
}
getchar(); // 清除输入缓冲区
// 日期处理
int year, month, day;
printf("请输入日期(YYYY MM DD): ");
while(scanf("%d %d %d", &year, &month, &day) != 3 || !validate_date(year, month, day)) {
printf("日期无效,请重新输入(YYYY MM DD): ");
while(getchar() != '\n');
}
getchar();
struct tm tm = {0};
tm.tm_year = year - 1900;
tm.tm_mon = month - 1;
tm.tm_mday = day;
new_ticket.date = mktime(&tm);
// 生成罚单ID
new_ticket.ticket_id = (ticket_count == 0) ? 1001 : tickets[ticket_count-1].ticket_id + 1;
tickets[ticket_count++] = new_ticket;
printf("罚单添加成功! 罚单号: %d\n", new_ticket.ticket_id);
}
void search_ticket() {
if (ticket_count == 0) {
printf("当前没有罚单记录!\n");
return;
}
int choice;
printf("\n--- 查询罚单 ---\n");
printf("1. 按驾照号码查询\n");
printf("2. 按车牌号查询\n");
printf("选择查询方式: ");
scanf("%d", &choice);
getchar();
char search_term[50];
int found = 0;
switch(choice) {
case 1:
printf("请输入驾照号码: ");
fgets(search_term, 20, stdin);
search_term[strcspn(search_term, "\n")] = '\0';
for(int i = 0; i < ticket_count; i++) {
if(strcmp(tickets[i].driver.license_num, search_term) == 0) {
display_ticket(tickets[i]);
found++;
}
}
break;
case 2:
printf("请输入车牌号: ");
fgets(search_term, 15, stdin);
search_term[strcspn(search_term, "\n")] = '\0';
for(int i = 0; i < ticket_count; i++) {
if(strcmp(tickets[i].vehicle.plate_num, search_term) == 0) {
display_ticket(tickets[i]);
found++;
}
}
break;
default:
printf("无效选项!\n");
return;
}
if(!found) {
printf("未找到匹配的罚单记录\n");
}
}
void delete_ticket() {
if (ticket_count == 0) {
printf("当前没有罚单记录!\n");
return;
}
int id, found = -1;
printf("\n--- 删除罚单 ---\n");
printf("请输入要删除的罚单号: ");
scanf("%d", &id);
getchar();
for(int i = 0; i < ticket_count; i++) {
if(tickets[i].ticket_id == id) {
found = i;
break;
}
}
if(found == -1) {
printf("未找到该罚单号!\n");
return;
}
printf("确定要删除以下罚单吗?(y/n)\n");
display_ticket(tickets[found]);
char confirm;
scanf("%c", &confirm);
getchar();
if(tolower(confirm) == 'y') {
for(int i = found; i < ticket_count - 1; i++) {
tickets[i] = tickets[i+1];
}
ticket_count--;
printf("罚单已删除\n");
} else {
printf("取消删除操作\n");
}
}
void statistics() {
if (ticket_count == 0) {
printf("当前没有罚单记录!\n");
return;
}
int choice;
printf("\n--- 统计功能 ---\n");
printf("1. 按时间段统计\n");
printf("2. 按违法行为统计\n");
printf("选择统计方式: ");
scanf("%d", &choice);
getchar();
switch(choice) {
case 1: {
int start_year, start_month, end_year, end_month;
printf("请输入开始年月(YYYY MM): ");
while(scanf("%d %d", &start_year, &start_month) != 2 ||
!validate_date(start_year, start_month, 1)) {
printf("日期无效,请重新输入(YYYY MM): ");
while(getchar() != '\n');
}
getchar();
printf("请输入结束年月(YYYY MM): ");
while(scanf("%d %d", &end_year, &end_month) != 2 ||
!validate_date(end_year, end_month, 1)) {
printf("日期无效,请重新输入(YYYY MM): ");
while(getchar() != '\n');
}
getchar();
struct tm start_tm = {0};
start_tm.tm_year = start_year - 1900;
start_tm.tm_mon = start_month - 1;
start_tm.tm_mday = 1;
time_t start_time = mktime(&start_tm);
struct tm end_tm = {0};
end_tm.tm_year = end_year - 1900;
end_tm.tm_mon = end_month;
end_tm.tm_mday = 1;
time_t end_time = mktime(&end_tm);
int count = 0;
float total_fine = 0;
for(int i = 0; i < ticket_count; i++) {
if(tickets[i].date >= start_time && tickets[i].date < end_time) {
count++;
total_fine += tickets[i].fine;
}
}
printf("\n统计结果 (%d/%d 至 %d/%d):\n",
start_year, start_month, end_year, end_month);
printf("罚单总数: %d\n", count);
printf("总罚款金额: %.2f\n", total_fine);
break;
}
case 2: {
char violation[50];
printf("请输入违法行为: ");
fgets(violation, 50, stdin);
violation[strcspn(violation, "\n")] = '\0';
int count = 0;
for(int i = 0; i < ticket_count; i++) {
if(strcmp(tickets[i].violation, violation) == 0) {
count++;
}
}
printf("\n违法行为 '%s' 的统计结果:\n", violation);
printf("罚单数量: %d\n", count);
break;
}
default:
printf("无效选项!\n");
}
}
void display_menu() {
printf("\n=== 交通罚单管理系统 ===\n");
printf("1. 添加罚单\n");
printf("2. 查询罚单\n");
printf("3. 删除罚单\n");
printf("4. 统计功能\n");
printf("5. 退出系统\n");
}
void display_ticket(Ticket t) {
char date_str[20];
strftime(date_str, 20, "%Y-%m-%d", localtime(&t.date));
printf("\n罚单号: %d\n", t.ticket_id);
printf("驾驶员: %s (驾照: %s)\n", t.driver.name, t.driver.license_num);
printf("车辆: %s (%s)\n", t.vehicle.plate_num, t.vehicle.vehicle_type);
printf("违法行为: %s\n", t.violation);
printf("处罚金额: %.2f\n", t.fine);
printf("扣分数: %d\n", t.points);
printf("日期: %s\n", date_str);
}
int validate_date(int y, int m, int d) {
if(y < 1900 || y > 2100) return 0;
if(m < 1 || m > 12) return 0;
if(d < 1 || d > 31) return 0;
// 简单验证月份天数
if((m == 4 || m == 6 || m == 9 || m == 11) && d > 30) return 0;
if(m == 2) {
int leap = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
if(leap && d > 29) return 0;
if(!leap && d > 28) return 0;
}
return 1;
}
生成这个程序的NS流程图
最新发布