#include #ifndef TYPE_H_INCLUDED
#define TYPE_H_INCLUDED
#define SCR_ROW 25 /*屏幕行数*/
#define SCR_COL 80 /*屏幕列数*/
/**
*服装销售信息链结点结构
*/
typedef struct sell_node {
char clo_id[12]; /**< 分类编码*/
char name[30]; /**< 服饰名称*/
char date[12]; /**< 销售日期*/
char kehu[10]; /**< 客户名称*/
int pj; /**< 客户评价*/
struct sell_node *next; /**< 指向下一结点的指针*/
} SELL_NODE;
/**
*服装基本信息链结点结构
*/
typedef struct clo_node {
char clo_id[12]; /**< 分类编码*/
char name[30]; /**< 服装名称*/
char shiyang; /**< 式样*/
float danjia; /**< 单价*/
int num; /**< 售出件数*/
float pj; /**评价指数*/
struct sell_node *cnext; /**< 指向缴费信息支链的指针*/
struct clo_node *next; /**< 指向下一结点的指针*/
} CLO_NODE;
/**
*服装基本信息链结点结构
*/
typedef struct type_node {
char clo_id[12]; /**< 分类编码*/
char name[30]; /**< 服装名称*/
struct clo_node *snext; /**< 指向缴费信息支链的指针*/
struct type_node *next; /**< 指向下一结点的指针*/
} TYPE_NODE;
/**
*屏幕窗口信息链结点结点结构
*/
typedef struct layer_node {
char LayerNo; /**< 弹出窗口层数*/
SMALL_RECT rcArea; /**< 弹出窗口区域坐标*/
CHAR_INFO *pContent; /**< 弹出窗口区域字符单元原信息存储缓冲区*/
char *pScrAtt; /**< 弹出窗口区域字符单元原属性值存储缓冲区*/
struct layer_node *next; /**< 指向下一结点的指针*/
} LAYER_NODE;
/**
*标签束结构
*/
typedef struct labe1_bundle {
char **ppLabel; /**< 标签字符串数组首地址*/
COORD *pLoc; /**< 标签定位数组首地址*/
int num; /**< 标签个数*/
} LABEL_BUNDLE;
/**
*热区结构
*/
typedef struct hot_area {
SMALL_RECT *pArea; /**< 热区定位数组首地址*/
char *pSort; /**< 热区类别(按键、文本框、选项框)数组首地址*/
char *pTag; /**< 热区序号数组首地址*/
int num; /**< 热区个数*/
} HOT_AREA;
unsigned long num_written; /* Win 7 中使用, 该变量用于某几个控制台输出函数 */
LAYER_NODE *gp_top_layer = NULL; /*弹出窗口信息链链头*/
TYPE_NODE *gp_head = NULL; /*主链头指针*/
TYPE_NODE *findt, *pt; /*定义的外部变量,用于修改、删除、查询等等*/
CLO_NODE *findc, *pc;
SELL_NODE *finds, *ps;
char *gp_sys_name = "服装网店信息管理系统"; /*系统名称*/
char *gp_clo_info_filename = "clo.dat"; /*服装基本信息数据文件*/
char *gp_sell_info_filename = "sell.dat"; /*服装销售信息数据文件*/
char *gp_type_info_filename = "type.dat"; /*服装分类信息数据文件*/
char *gp_shiyang_code_filename = "shiyang.dat"; /*式样代码数据文件*/
char *gp_clo_type_code_filename = "clo_type.dat"; /*服装类别代码数据文件*/
char *ga_main_menu[] = {"文件(F)", /*系统主菜单名*/
"数据维护(M)",
"数据查询(Q)",
"数据统计(S)",
"帮助(H)"
};
char *ga_sub_menu[] = { /*系统子菜单名*/
"[S] 数据保存",
"[B] 数据备份",
"[R] 数据恢复",
"[X] 退出 Alt+X",
/*空串用来在弹出菜单中分隔子菜单项,下同*/
"[D] 服装分类信息",
"[P] 服装基本信息",
"[C] 服装销售基本信息",
"[D] 服装分类信息",
"[P] 服装基本信息",
"[C] 服装销售基本信息",
"[I] 服装具体销售情况",
"[T] 年销售统计",
"[C] 按客户名称统计",
"[U] 季度统计",
"[V] 式样销售情况",
"[T] 帮助主题",
"",
"[A] 关于..."
};
int ga_sub_menu_count[] = {4, 3, 3, 5, 3}; /*各主菜单项下子菜单的个数*/
int gi_sel_menu = 1; /*被选中的主菜单项号,初始为1*/
int gi_sel_sub_menu = 0; /*被选中的子菜单项号,初始为0,表示未选中*/
CHAR_INFO *gp_buff_menubar_info = NULL; /*存放菜单条屏幕区字符信息的缓冲区*/
CHAR_INFO *gp_buff_stateBar_info = NULL; /*存放状态条屏幕区字符信息的缓冲区*/
char *gp_scr_att = NULL; /*存放屏幕上字符单元属性值的缓冲区*/
char *gp_shiyang_code = NULL; /*存放式样代码表的数据缓冲区*/
char *gp_clo_type_code = NULL; /*存放服装类别代码表的数据缓冲区*/
char *gp_type_code = NULL; /*存放服装分类代码表的数据缓冲区*/
char *gp_clo_code = NULL; /*存放服装基本信息代码表的数据缓冲区*/
char *gp_sell_code = NULL; /*存放服装销售信息代码表的数据缓冲区*/
char gc_sys_state = '\0'; /*用来保存系统状态的字符*/
unsigned long gul_shiyang_code_len = 0; /*式样代码表长度*/
unsigned long gul_clo_type_code_len = 0; /*服装类别代码表长度*/
unsigned long gul_type_code_len = 0; /*服装分类代码表长度*/
unsigned long gul_sell_code_len = 0; /*服装销售代码表长度*/
unsigned long gul_clo_code_len = 0; /*服装基本信息代码表长度*/
HANDLE gh_std_out; /*标准输出设备句柄*/
HANDLE gh_std_in; /*标准输入设备句柄*/
int LoadCode(char *filename, char **ppbuffer); /*代码表加载*/
int CreatList(TYPE_NODE **pphead); /*数据链表初始化*/
void InitInterface(void); /*系统界面初始化*/
void ClearScreen(void); /*清屏*/
void ShowMenu(void); /*显示菜单栏*/
void PopMenu(int num); /*显示下拉菜单*/
void PopPrompt(int num); /*显示弹出窗口*/
int DealInput(HOT_AREA *pHotArea, int *piHot);
void PopUp(SMALL_RECT *, WORD, LABEL_BUNDLE *, HOT_AREA *); /*弹出窗口屏幕信息维护*/
void PopOff(void); /*关闭顶层弹出窗口*/
void DrawBox(SMALL_RECT *parea); /*绘制边框*/
void LocSubMenu(int num, SMALL_RECT *parea); /*主菜单下拉菜单定位*/
void ShowState(void); /*显示状态栏*/
void TagMainMenu(int num); /*标记被选中的主菜单项*/
void TagSubMenu(int num); /*标记被选中的子菜单项*/
int DealConInput(HOT_AREA *phot_area, int *pihot_num); /*控制台输入处理*/
void SetHotPoint(HOT_AREA *phot_area, int hot_num); /*设置热区*/
void RunSys(TYPE_NODE **pphd); /*系统功能模块的选择和运行*/
BOOL ExeFunction(int main_menu_num, int sub_menu_num); /*功能模块的调用*/
void CloseSys(TYPE_NODE *phd); /*退出系统*/
void gotoxy(int x, int y);
BOOL LoadData(void); /*数据加载*/
BOOL SaveData(void); /*保存数据*/
BOOL Input(void); /*数据输入*/
BOOL BackupData(void); /*备份数据*/
BOOL RestoreData(void); /*恢复数据*/
BOOL ExitSys(void); /*退出系统*/
BOOL HelpTopic(void); /*帮助主体*/
BOOL AboutDorm(void); /*关于系统*/
BOOL MaintainTypeInfo(void); /*维护服装分类信息*/
BOOL MaintainCloInfo(void); /*维护服装基本信息*/
BOOL MaintainSellInfo(void); /*维护服装销售信息*/
CLO_NODE *SeekCloNode(TYPE_NODE *hd, char *name); /*查询服装基本信息对应结点*/
BOOL QueryTypeInfo(void); /*查询服装分类信息*/
BOOL QueryCloInfo(void); /*查询服装基本信息*/
BOOL QuerySellInfo(void); /*查询服装销售信息*/
BOOL StatType(void); /*统计各类服装销售情况*/
BOOL StatYear(void); /*年销售量统计*/
BOOL StatKehu(void); /*客户信息统计*/
BOOL StatSeason(void); /*季度销售统计*/
BOOL StatAverage(void); /*按式样进行统计*/
BOOL SaveSysData(TYPE_NODE *phd); /*保存系统数据*/
BOOL BackupSysData(TYPE_NODE *phd, char *filename); /*备份系统数据*/
BOOL RestoreSysData(TYPE_NODE **pphd, char *filename); /*恢复系统数据*/
BOOL ShowModule(char **pString, int n);
void Insert(int n); /*数据插入*/
void Seek(int n,char *s); /*数据查找*/
void Dele_info(int n); /*数据删除*/
void Modify_info(int n); /*数据修改*/
void Seek_Clo_Name(TYPE_NODE *head) ; /*根据服装名称子串查询*/
void Seek_IDPrice(TYPE_NODE *head); /*根据服装分类码和单价查询*/
void Seek_Sell_Name(TYPE_NODE *head); /*根据客户名称和销售日期查询*/
void Seek_Sell_NamePj(TYPE_NODE *head); /*根据服装名称和评价指数查询*/
void State_Type(TYPE_NODE *head); /*统计各类古装销售情况*/
void State_Kehu(TYPE_NODE *head); /*客户信息统计*/
void State_Spring(TYPE_NODE *head); /*统计春季销售情况*/
void State_Summer(TYPE_NODE *head); /*统计夏季销售情况*/
void State_Autumn(TYPE_NODE *head); /*统计秋季销售情况*/
void State_Winter(TYPE_NODE *head); /*统计冬季销售情况*/
void State_Year(TYPE_NODE *head); /*年销售统计*/
void State_Shiyang(TYPE_NODE *head); /*统计各种式样销售信息*/
void CLO_PJ(TYPE_NODE *head); /*计算服装评价指数*/
#endif /**< TYPE_H_INCLUDED*/
main.c
#include "qjy.h"
int main()
{
COORD size = {SCR_COL, SCR_ROW}; /*窗口缓冲区大小*/
gh_std_out = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标准输出设备句柄*/
gh_std_in = GetStdHandle(STD_INPUT_HANDLE); /* 获取标准输入设备句柄*/
SetConsoleTitle(gp_sys_name); /*设置窗口标题*/
SetConsoleScreenBufferSize(gh_std_out, size); /*设置窗口缓冲区大小80*25*/
LoadData(); /*数据加载*/
InitInterface(); /*界面初始化*/
RunSys(&gp_head); /*系统功能模块的选择及运行*/
CloseSys(gp_head); /*退出系统*/
return 0;
}
/**
* 函数名称: ClearScreen
* 函数功能: 清除屏幕信息.
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
*
* 调用说明:
*/
void ClearScreen(void)
{
CONSOLE_SCREEN_BUFFER_INFO bInfo;
COORD home = {0, 0};
unsigned long size;
GetConsoleScreenBufferInfo( gh_std_out, &bInfo );/*取屏幕缓冲区信息*/
size = bInfo.dwSize.X * bInfo.dwSize.Y; /*计算屏幕缓冲区字符单元数*/
/*将屏幕缓冲区所有单元的字符属性设置为当前屏幕缓冲区字符属性*/
FillConsoleOutputAttribute(gh_std_out, bInfo.wAttributes, size, home, &num_written);
/*将屏幕缓冲区所有单元填充为空格字符*/
FillConsoleOutputCharacter(gh_std_out, ' ', size, home, &num_written);
return;
}
/**
* 函数名称: ShowMenu
* 函数功能: 在屏幕上显示主菜单, 并设置热区, 在主菜单第一项上置选中标记.
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
*
* 调用说明:
*/
void ShowMenu()
{
CONSOLE_SCREEN_BUFFER_INFO bInfo;
CONSOLE_CURSOR_INFO lpCur;
COORD size;
COORD pos = {0, 0};
int i, j;
int PosA = 2, PosB;
char ch;
GetConsoleScreenBufferInfo(gh_std_out, &bInfo );
size.X = bInfo.dwSize.X;
size.Y = 1;
SetConsoleCursorPosition(gh_std_out, pos);
for (i=0; i < 5; i++) /*在窗口第一行第一列处输出主菜单项*/
{
printf(" %s ", ga_main_menu[i]);
}
GetConsoleCursorInfo(gh_std_out, &lpCur);
lpCur.bVisible = TRUE;
SetConsoleCursorInfo(gh_std_out, &lpCur); /*隐藏光标*/
/*申请动态存储区作为存放菜单条屏幕区字符信息的缓冲区*/
gp_buff_menubar_info = (CHAR_INFO *)malloc(size.X * size.Y * sizeof(CHAR_INFO));
SMALL_RECT rcMenu = {0, 0, size.X-1, 0} ;
/*将窗口第一行的内容读入到存放菜单条屏幕区字符信息的缓冲区中*/
ReadConsoleOutput(gh_std_out, gp_buff_menubar_info, size, pos, &rcMenu);
/*将这一行中英文字母置为红色,其他字符单元置为白底黑字*/
for (i=0; iAttributes = BACKGROUND_BLUE | BACKGROUND_GREEN
| BACKGROUND_RED;
ch = (char)((gp_buff_menubar_info+i)->Char.AsciiChar);
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
{
(gp_buff_menubar_info+i)->Attributes |= FOREGROUND_RED;
}
}
/*修改后的菜单条字符信息回写到窗口的第一行*/
WriteConsoleOutput(gh_std_out, gp_buff_menubar_info, size, pos, &rcMenu);
COORD endPos = {0, 1};
SetConsoleCursorPosition(gh_std_out, endPos); /*将光标位置设置在第2行第1列*/
/*将菜单项置为热区,热区编号为菜单项号,热区类型为0(按钮型)*/
i = 0;
do
{
PosB = PosA + strlen(ga_main_menu[i]); /*定位第i+1号菜单项的起止位置*/
for (j=PosA; jAttributes = BACKGROUND_BLUE | BACKGROUND_GREEN
| BACKGROUND_RED;
ch = (gp_buff_menubar_info+i)->Char.AsciiChar;
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
{
(gp_buff_menubar_info+i)->Attributes |= FOREGROUND_RED;
}
}
/*在选中菜单项上做标记,黑底白字*/
for (i=PosA; iAttributes = FOREGROUND_BLUE | FOREGROUND_GREEN
| FOREGROUND_RED;
}
/*去除选中菜单项后面的菜单项选中标记*/
for (i=PosB; iAttributes = BACKGROUND_BLUE | BACKGROUND_GREEN
| BACKGROUND_RED;
ch = (char)((gp_buff_menubar_info+i)->Char.AsciiChar);
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
{
(gp_buff_menubar_info+i)->Attributes |= FOREGROUND_RED;
}
}
/*将做好标记的菜单条信息写到窗口第一行*/
SMALL_RECT rcMenu = {0, 0, size.X-1, 0};
WriteConsoleOutput(gh_std_out, gp_buff_menubar_info, size, pos, &rcMenu);
return;
}
/**
* 函数名称: LoadData
* 函数功能: 将代码表和三类基础数据从数据文件载入到内存缓冲区和十字链表中.
* 输入参数: 无
* 输出参数: 无
* 返 回 值: BOOL类型, 功能函数中除了函数ExitSys的返回值可以为FALSE外,
* 其他函数的返回值必须为TRUE.
*
* 调用说明: 为了能够以统一的方式调用各功能函数, 将这些功能函数的原型设为
* 一致, 即无参数且返回值为BOOL. 返回值为FALSE时, 结束程序运行.
*/
BOOL LoadData()
{
int Re = 0;
if (gp_shiyang_code != NULL)
{
free(gp_shiyang_code);
}
gul_shiyang_code_len = LoadCode(gp_shiyang_code_filename, &gp_shiyang_code);
if (gul_shiyang_code_len < 3)
{
printf("式样代码表加载失败!\n");
gc_sys_state &= 0xfe;
}
else
{
printf("式样代码表加载成功!\n");
gc_sys_state |= 1;
}
if (gp_clo_type_code != NULL)
{
free(gp_clo_type_code);
}
gul_clo_type_code_len = LoadCode(gp_clo_type_code_filename, &gp_clo_type_code);
if (gul_clo_type_code_len < 4)
{
printf("服装类别代码表加载失败!\n");
gc_sys_state &= ~2;