工资管理系统问题
项目功能需求
题目描述:本系统用于管理企业的员工工资发放记录,需要两张表:员工表和工资表。员工表存储员工的个人信息,属性有员工ID、员工姓名、员工所属部门;工资表存放发放工资的记录,属性有员工ID、工资、发放工资日期。
要求:
①在界面中要有维护员工表和工资表的功能,并且连接数据库实现。
②信息录入时,所以必须先有员工,然后才能给员工发工资。
③程序可以查询员工信息和工资发放信息。
④可以按时间段统计工资发放总额。
运行效果:
- 【信息录入】
为便于后续删除后仍然有信息可查询,我们录入ID号为12345和123456的两个员工;
这里仅展示第一个员工的录入情况。
- 【2】信息删除
- 【3】信息修改
- 【4】信息查询
- MYSQL中表的显示
知识点分析
(1)程序需要调用MySQL数据库的访问接口。需要掌握一些MySQL相关结构体和指针的应用方式,以及一些MySQL相关函数的调用方式。
(2)需要掌握MySQL的日常管理方法和知识,在MySQL数据库中选择一个数据库,在数据库中创建一个表,对表进行数据的增加、修改。需要学习基本的SQL语句语法。
(3)需要掌握菜单编程技术,特别是二级菜单,通过全局变量保存菜单的选择项。
算法思想
1.首先在mysql中建立两张表,命名为tbl_worker和tbl_salary
2.在程序中连接和使用数据库
3.程序以主菜单方式,选择子菜单进行对于操作
系统流程图
图2 工资管理系统流程图
项目实现
#include<windows.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
//#include"mysql.h"
#pragma comment(lib,"libmysql.lib")
//#pragma warning(disable:4996)//
//宏定义
#define IDLen 15
#define NameLen 15
#define DepLen 15
//结构体
struct Salary
{
float sal;
char time[20];
};
typedef struct St
{
char id[IDLen];
char name[NameLen];
char dep[DepLen];
struct Salary salary;
}Table;
Table stu;//存储员工信息的结构体
static char szSqlText[1000];//SQL语句
static char sortField[100];
static MYSQL* conn;//MySQL链接指针
//
static void DisplayMainMenu();//主菜单
//信息插入
static void Mysqlm1();//子菜单
static bool InputTable1(int mode, bool OnlyID);
static bool ExistsTable1(char* id);
static void InsertTable1();
static bool InputTable2(int mode, bool OnlyID);
static int ExistsTable(char* id);
static bool ExistsTable2(char* id);
static void InsertTable2();
//信息删除
static void DeleteTable();
static void DeleteSal();
//信息更新
static void UpdateWorS();//子菜单
static void UpdateTable1();
static void UpdateTable2();
//信息查询
static void OutputM();
static void OutputTable();
static void OutputTable_One();
static void OutputWorker(char* id);
static void OutputSalary(char* id);
static void OutputTable_time();
#define _CRT_SECURE_NO_WARNINGS
//
void Payroll()
{
system("cls");
printf("\n---------------工资管理系统---------------\n\n");
char host[] = "localhost";//Mysql主机名
char szTargetDSN[] = "payrollsystem";//数据库名
const char username[] = "root";//链接数据库的合法用户名
const char password[] = "200310073220lxr";//密码
unsigned int port = 3306;//链接端口,默认为3306
if ((conn = mysql_init((MYSQL*)0)) && (mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk") == 0)
&& mysql_real_connect(conn, host, username, password, szTargetDSN, port, NULL, 0))
{
printf("\n数据库连接成功!\n");
printf("\n按任意键继续\n");
_getch();
DisplayMainMenu();
}
else
{
printf("\n连接数据库失败。\n");
mysql_close(conn);
printf("\n按任意键退出。\n");
_getch();
return;
}
mysql_close(conn);
return;
}
static void DisplayMainMenu()
{
int i;
while (1)
{
system("cls");
printf("----------------------------\n");
printf("系统主菜单,请选择:\n");
printf("----------------------------\n");
printf("(1)信息录入\n");
printf("(2)信息删除\n");
printf("(3)信息修改\n");
printf("(4)信息查询\n");
printf("(0)退出程序\n");
printf("----------------------------\n");
scanf_s("%d", &i);
getchar();
switch (i)
{
case 1:
Mysqlm1();
break;
case 2:
if (InputTable1(1, true))
DeleteTable();
break;
case 3:
UpdateWorS();
break;
case 4:
OutputM();
break;
case 0:
return;
default:
printf("\n请选择正确的操作!");
break;
}
}
}
void Mysqlm1()
{
int i;
while (1)
{
system("cls");
printf("\n信息录入子菜单,请选择:\n");
printf("---------------------------\n");
printf("(1) 员工信息录入\n");
printf("(2) 员工工资信息录入\n");
printf("(0) 返回主菜单\n");
printf("---------------------------\n");
scanf_s("%d", &i);
getchar();
switch (i)
{
case 1: if (InputTable1(2, false))
InsertTable1();
break;
case 2: if (InputTable2(2, false))
InsertTable2();
break;
case 0:
return;
default:
printf("\n请选择正确的操作!");
break;
}
system("pause");
}
}
bool InputTable1(int mode, bool OnlyID)
{
bool b;
if (OnlyID == false)
printf("\n请输入员工信息:");
printf("\n-------------------------------------\n");
do
{
printf("员工ID(12个字符以内,输入@表示放弃本次操作):\t");
scanf_s("%s", stu.id, 15);
stu.id[IDLen - 1] = 0;
if (strcmp(stu.id, "@") == 0)
return false;
b = ExistsTable1(stu.id);
if (mode == 1 && b == false)
printf("员工ID%s不存在,重新输入\n", stu.id);
else if (mode == 2 && b == true)
printf("员工ID%s存在,重新输入\n", stu.id);
else
break;
} while (1);
if (OnlyID)
return true;
printf("姓名(10个字符以内):\t");
scanf_s("%s", stu.name, 15);
stu.name[NameLen - 1] = 0;
printf("员工部门(15个字符以内):\t");
scanf_s("%s", stu.dep, 15);
stu.dep[DepLen - 1] = 0;
printf("--------------------------------------\n");
return true;
}
bool ExistsTable1(char* id)
{
int i = 0;
MYSQL_RES* res;
sprintf_s(szSqlText, 1000, "select id from tbl_worker where id='%s'", id);
if (mysql_query(conn, szSqlText))
{
printf("select failed.\n");
return false;
}
else
{
res = mysql_store_result(conn);
i = (int)mysql_num_rows(res);
mysql_free_result(res);
}
return i > 0;
}
bool InputTable2(int mode, bool OnlyID)
{
bool b;
int i;
if (OnlyID == false)
printf("\n请输入员工工资信息:");
printf("\n-------------------------------------\n");
do
{
printf("员工ID(12个字符以内,输入@表示放弃本次操作):\t");
scanf_s("%s", stu.id, 15);
stu.id[IDLen - 1] = 0;
if (strcmp(stu.id, "@") == 0)
return false;
i = ExistsTable(stu.id);
if (i == 0)
{
printf("员工表中没有该员工ID,请重新输入\n");
continue;
}
b = ExistsTable2(stu.id);
if (mode == 1 && b == false)
printf("员工ID%s不存在,重新输入\n", stu.id);
else
break;
} while (1);
if (OnlyID)
return true;
printf("工资(数字):\t");
scanf_s("%f", &stu.salary.sal);
printf("工资日期(如2001-01-01):\t");
scanf_s("%s", stu.salary.time, 20);
stu.salary.time[19] = 0;
printf("--------------------------------------\n");
return true;
}
bool ExistsTable2(char* id)
{
int i = 0;
MYSQL_RES* res;
sprintf_s(szSqlText, 1000, "select id from tbl_salary where id='%s'", id);
if (mysql_query(conn, szSqlText))
{
printf("select failed.\n");
return false;
}
else
{
res = mysql_store_result(conn);
i = (int)mysql_num_rows(res);
mysql_free_result(res);
}
return i > 0;
}
int ExistsTable(char* id)
{
int i = 0;
MYSQL_RES* res;
sprintf_s(szSqlText, 1000, "select id from tbl_worker where id='%s'", id);
if (mysql_query(conn, szSqlText))
{
printf("select failed.\n");
return false;
}
else
{
res = mysql_store_result(conn);
i = (int)mysql_num_rows(res);
mysql_free_result(res);
}
return i;
}
void InsertTable1()
{
sprintf_s(szSqlText, 1000, "insert into tbl_worker(id,name,department)values ('%s','%s','%s')", stu.id, stu.name, stu.dep);
//printf("%s\n", szSqlText);
if (mysql_query(conn, szSqlText))
{
printf("inserted failed.\n");
}
}
void InsertTable2()
{
sprintf_s(szSqlText, 1000, "insert into tbl_salary(id,salary,time)values ('%s',%f,'%s') ", stu.id, stu.salary.sal, stu.salary.time);
if (mysql_query(conn, szSqlText))
{
printf("inserted failed.\n");
}
}
void OutputM()
{
int i;
while (1)
{
system("cls");
printf("\n信息查询子菜单,请选择:\n");
printf("---------------------------\n");
printf("(1) 员工信息查询\n");
printf("(2) 员工工资信息查询\n");
printf("(3) 员工信息\n");
printf("(0) 返回主菜单\n");
printf("---------------------------\n");
scanf_s("%d", &i);
printf("\n");
switch (i)
{
case 1:
OutputTable_One();
break;
case 2:
OutputTable_time();
break;
case 3:
OutputTable();
break;
case 0:
return;
default:
printf("\n请选择正确的操作!");
break;
}
}
}
void OutputTable_One()
{
system("cls");
MYSQL_RES* res;
MYSQL_ROW row;
printf("员工信息查询\n");
printf("员工ID(12个字符以内):\t");
scanf_s("%s", stu.id, 15);
printf("\n");
OutputWorker(stu.id);
OutputSalary(stu.id);
system("pause");
}
void OutputWorker(char* id)
{
MYSQL_RES* res;
MYSQL_ROW row;
sprintf_s(szSqlText, 1000, "select * from tbl_worker where id='%s'", id);
if (mysql_query(conn, szSqlText))
{
mysql_close(conn);
printf("select failed.\n");
return;
}
else
{
printf("------------------------------------------------\n");
printf("员工ID\t\t姓名\t\t部门\n");
printf("------------------------------------------------\n");
res = mysql_store_result(conn);
while (1)
{
row = mysql_fetch_row(res);
if (row == NULL)
break;
printf(" %s\t\t%s\t\t%s\n", row[0], row[1], row[2]);
}
}
mysql_free_result(res);
printf("------------------------------------------------\n");
}
void OutputSalary(char* id)
{
MYSQL_RES* res;
MYSQL_ROW row;
sprintf_s(szSqlText, 1000, "select * from tbl_salary where id='%s'", id);
if (mysql_query(conn, szSqlText))
{
mysql_close(conn);
printf("select failed.\n");
return;
}
else
{
printf("\t\t工资\t\t发放时间\n");
printf("------------------------------------------------\n");
res = mysql_store_result(conn);
while (1)
{
row = mysql_fetch_row(res);
if (row == NULL)
break;
printf("\t\t%s\t\t%s\n", row[1], row[2]);
}
}
mysql_free_result(res);
printf("------------------------------------------------\n");
}
void OutputTable()
{
system("cls");
int i;
MYSQL_RES* res;
MYSQL_ROW row;
sprintf_s(szSqlText, 1000, "select * from tbl_worker inner join tbl_salary on tbl_worker.id=tbl_salary.id ");
if (mysql_query(conn, szSqlText))
{
mysql_close(conn);
printf("select failed.\n");
return;
}
else
{
printf("所有员工信息:\n");
printf("------------------------------------------------------------------------------\n");
printf("员工ID\t\t姓名\t\t部门\t\t工资\t\t发放时间\n");
printf("------------------------------------------------------------------------------\n");
res = mysql_store_result(conn);
i = (int)mysql_num_rows(res);
if (i > 0)
{
while (1)
{
row = mysql_fetch_row(res);
if (row == NULL)
break;
printf(" %s\t\t%s\t\t%s\t\t%s\t\t%s\n", row[0], row[1], row[2], row[4], row[5]);
}
}
}
printf("-------------------------------------------------------------------------------\n");
system("pause");
}
void OutputTable_time()
{
system("cls");
printf("员工工资信息查询\n");
int i, j = 0, sum = 0, a[100];
char time[2][20];
MYSQL_RES* res;
MYSQL_ROW row;
printf("员工ID(12个字符以内):\t");
scanf_s("%s", stu.id, 15);
char* id = stu.id;
printf("请输入时间段起始时间:\t");
scanf_s("%s", time[0], 20);
printf("请输入时间段结束时间:\t");
scanf_s("%s", time[1], 20);
char* time1 = time[0];
char* time2 = time[1];
sprintf_s(szSqlText, 1000, "select * from tbl_salary where id='%s' and time > '%s'&&time<'%s'", id, time1, time2);
if (mysql_query(conn, szSqlText))
{
mysql_close(conn);
printf("select failed.\n");
return;
}
else
{
res = mysql_store_result(conn);
i = (int)mysql_num_rows(res);
printf("------------------------------------------------\n");
printf("员工ID\t\t发放工资\t发放时间\n");
printf("------------------------------------------------\n");
if (i > 0)
{
while (1)
{
row = mysql_fetch_row(res);
if (row == NULL)
break;
a[j++] = atof(row[1]);
printf(" %s\t\t%s\t\t%s\n", row[0], row[1], row[2]);
printf("------------------------------------------------\n");
}
}
for (j; j > 0; j--)
{
sum = sum + a[j - 1];
}
if (sum == 0)
{
printf("\n在该时间段内没有该员工工资信息\n");
}
else
printf("\n在该时间段内总工资为:%d\n", sum);
}
mysql_free_result(res);
system("pause");
}
void UpdateWorS()//信息修改菜单
{
int i;
while (1)
{
system("cls");
printf("\n信息修改子菜单,请选择:\n");
printf("---------------------------\n");
printf("(1) 员工基本信息修改\n");
printf("(2) 员工工资信息修改\n");
printf("(0) 返回主菜单\n");
printf("---------------------------\n");
scanf_s("%d", &i);
switch (i)
{
case 1:
if (InputTable1(1, false))
UpdateTable1();
break;
case 2:
if (InputTable2(1, false))
UpdateTable2();
break;
case 0:
return;
default:
printf("\n请选择正确的操作!");
break;
}
}
}
void UpdateTable1()
{
sprintf_s(szSqlText, 1000, "update tbl_worker set name='%s',department='%s' where id='%s'", stu.name, stu.dep, stu.id);
if (mysql_query(conn, szSqlText))
{
printf("inserted failed.\n");
}
else
printf("该员工信息修改成功\n");
system("pause");
}
void UpdateTable2()
{
//printf("%s\n", szSqlText);
sprintf_s(szSqlText, 1000, "update tbl_salary set salary=%f,time='%s' where id='%s'", stu.salary.sal, stu.salary.time, stu.id);
if (mysql_query(conn, szSqlText))
{
printf("inserted failed.\n");
}
else
printf("该员工工资信息修改成功\n");
system("pause");
}
void DeleteTable()
{
char i;
sprintf_s(szSqlText, 1000, "delete from tbl_worker where id = '%s'", stu.id);
if (mysql_query(conn, szSqlText))
{
printf("inserted failed.\n");
}
else
printf("该记录删除成功\n");
printf("\n是否删除相应工资表信息(y/n):");
i = _getche();
if (i == 'y')
{
DeleteSal();
}
else
system("pause");
}
void DeleteSal()
{
sprintf_s(szSqlText, 1000, "delete from tbl_salary where id = '%s'", stu.id);
if (mysql_query(conn, szSqlText))
{
printf("inserted failed.\n");
}
else
printf("\n该记录删除成功\n");
system("pause");
}
//#define _CRT_SECURE_NO_WARNINGS
//#pragma warning(disable:4996)
#define IDLen 13 //学号字段长度
#define NameLen 11 //姓名字段长度
#define SexLen 5 //性别字段长度
struct Score
{
int cp; //c语言
int en; //英语
int math; //高数
};
typedef struct Stu
{
char id[IDLen]; // 学号
char name[NameLen]; //姓名
char sex[SexLen]; //性别
int age; //年龄
double avg; //平均分
struct Score score; //存储成绩的结构体
}Student;
MYSQL* conn;
static char szSqlText[1000];//SQL语句
static char sortField[100];//
Student stu;
//访问MYSQL的数据库表tbl_student,打印输出所有学生信息
static void OutputStudent()
{
int i;
MYSQL_RES* res;
MYSQL_ROW row; //行变量
sprintf_s(szSqlText, 1000, "select id,name,sex,age,score_cp,score_en,score_math from tbl_student order by ");
strcat_s(szSqlText, 1000, sortField); //添加排序方式
if (mysql_query(conn, szSqlText))
{
printf("select failed.\n");
return;
}
else
{
res = mysql_store_result(conn);
i = (int)mysql_num_rows(res);
if (i > 0) //如果有学生信息
{
printf("\n 共有%d个学生信息:\n============================================================\n", i);
printf("学号 姓名 性别 年龄 C语言 英语 高数 平均分\n");
printf("-------------------------------------------------------------------------\n");
while (1)
{
row = mysql_fetch_row(res);
if (row == NULL)
break;
printf("%-15s%-14s%-7s%-7s", row[0], row[1], row[2], row[3]);
printf("%-7s%-7s%-7s%-7.1f\n", row[4], row[5], row[6], (double)((atoi(row[4]) + atoi(row[5]) + atoi(row[6])) / 3));
}
}
else
printf("\n没有学生信息!\n============================================================\n");
mysql_free_result(res);
}
printf("-------------------------------------------------------------------------\n");
}
//判断学号id是否在数据库中已经存在
//返回:ture:已经存在 ,false:不存在
static bool ExistsStudent(char* id)
{
int i = 0;
MYSQL_RES* res;
sprintf_s(szSqlText, 100, "select id from tbl_student where id='%s'", id);
if (mysql_query(conn, szSqlText))
{
printf("select failed.\n");
return false;
}
else
{
res = mysql_store_result(conn);
i = (int)mysql_num_rows(res);
mysql_free_result(res);
}
return i > 0;
}
//增加学生,插入全局变量stu代表的学生
static void InsertStudent()
{
sprintf_s(szSqlText, 1000, "insert into tbl_student (id,name,sex,age,score_cp,score_en,score_math) values ('%s','%s','%s',%d,%d,%d,%d)", stu.id, stu.name, stu.sex, stu.age, stu.score.cp, stu.score.en, stu.score.math);
//printf("%s\n", szSqlText);
if (mysql_query(conn, szSqlText))
{
printf("inserted failed!\n");
}
}
//修改学生,修改由全局变量stu代表的学生
static void UpdateStudent()
{
sprintf_s(szSqlText, 1000, "update tbl_student set name='%s',sex='%s',age=%d,score_cp=%d,score_en=%d,score_math=%d where id = '%s'", stu.name, stu.sex, stu.age, stu.score.cp, stu.score.en, stu.score.math, stu.id);
if (mysql_query(conn, szSqlText))
{
printf("inserted fdiled.\n");
}
}
//删除学生,删除由全局变量stu.id代表的学生
static void DeleteStudent()
{
sprintf_s(szSqlText, 1000, "delete from tbl_student where id='%s'", stu.id);
if (mysql_query(conn, szSqlText))
printf("inserted failed!\n");
else
printf("删除成功\n");
}
/*功能:输入一个学生信息
输入参数:
mode=1:输入的学号必须存在
mode=2:输入的学号必须不存在
OnlyID :ture: 代表只输入学号,false代表输入所有信息
输出:
返回值:ture表示输入了完整的信息,返回false代表放弃了本次操作
当返回ture时,输入的信息存放在全局变量stu中
*/
static bool InputStudent(int mode, bool OnlyID)
{
bool b;
//如果是输入所有信息,而不只是学号,才需要下面的文字
if (OnlyID == false)
printf("\n请输入学生信息:\n");
printf("\n------------------------------------------\n");
do
{
printf("学号(12个字符以内,q!表示放弃本次操作):\t");
gets_s(stu.id);
fflush(stdin);
stu.id[IDLen - 1] = 0; //最后一个字符串强行加一个结束符
if (strcmp(stu.id, "q!") == 0)
return false;
b = ExistsStudent(stu.id);
//如果要求学号必须存在,但数据库中不存在学号
if (mode == 1 && b == false)
printf("学号%s存在,重新输入学号,\n", stu.id);
else
if (mode == 2 && b == true)
printf("学号%s存在,重新输入学号,\n", stu.id);
else
break;
} while (1);
if (OnlyID) //如果只输入学号,就到此为止
return true;
printf("姓名(10个字符以内):\t");
fflush(stdin);
scanf_s("%s", stu.name, 11);
getchar();
stu.name[NameLen - 1] = 0; //最后一个字符串强行加一个结束符
printf("性别(4个字符以内):\t");
scanf_s("%s", stu.sex, 5);
getchar();
stu.sex[SexLen - 1] = 0; //最后一个字符串强行加一个结束符
printf("年龄(整数):\t");
scanf_s("%d", &stu.age);
getchar();
printf("《C语言》成绩(整数):\t");
scanf_s("%d", &stu.score.cp);
printf("《英语》成绩(整数):\t");
scanf_s("%d", &stu.score.en);
printf("《高数》成绩(整数):\t");
scanf_s("%d", &stu.score.math);
stu.avg = (stu.score.cp + stu.score.en + stu.score.math) / 3.0;
printf("\n---------------------------------------------------------\n");
return true;
}
//显示排序菜单
//用户选择的内容,存放在全局变量sortField中
static void DisplaySortMenu()
{
int i;
//首先选择要排序的字段
do
{
printf("\n 请选择排序字段:\n");
printf("-------------------------------------------------------\n");
printf("\n(1)学号\t(2)姓名\t(3)性别\t(4)年龄");
printf("\n(5)C语言\t(6)英语\t(7)高数\t(8)平均分 \n");
printf("-------------------------------------------------------\n");
scanf_s("%d", &i);
strcpy_s(sortField, "");
switch (i)
{
case 1: //学号
strcpy_s(sortField, "id");
break;
case 2: //姓名
strcpy_s(sortField, "name");
break;
case 3: //性别
strcpy_s(sortField, "sex");
break;
case 4: //年龄
strcpy_s(sortField, "age");
break;
case 5: //C语言
strcpy_s(sortField, "score_cp");
break;
case 6: //英语
strcpy_s(sortField, "score_en");
break;
case 7: //高数
strcpy_s(sortField, "score_math");
break;
case 8: //平均分
strcpy_s(sortField, "score_cp+score_en+score_math");
break;
}
} while (i < 1 || i>8);
//期次选择排序方向
do
{
printf("\n请选择排序方向:\n");
printf("---------------------------------------\n");
printf("(1)升序\t (2)降序\t\n");
printf("---------------------------------------\n");
scanf_s("%d", &i);
switch (i)
{
case 1: //升序,缺省就是升序,因此不需要加上文字
break;
case 2: //降序
//在字段后面加上desc表示降序
strcat_s(sortField, 100, "desc");
break;
default:
printf("\n请选择正确的操作!");
break;
}
} while (i < 1 || i>2);
}
//显示主菜单
static void DisplayMainMnue()
{
int i;
while (1)
{
fflush(stdin); //清屏
printf("\n请选择操作:\n");
printf("==================================================================\n");
printf("(1)增加学生信息\n");
printf("(2)删除学生信息\n");
printf("(3)修改学生信息\n");
printf("(4)显示所有记录\n");
printf("(0)退出程序\n");
printf("==================================================================\n");
scanf_s("%d", &i);
getchar();
switch (i)
{
case 1: // 增加学生及成绩
//2表示必须要求数据库汇总不存在新输入的学号
if (InputStudent(2, false))
//false表示输入所有字段信息
InsertStudent();
break;
case 2: //删除学生就成绩
//1表示必须要求数据库中必须存在输入的学号
if (InputStudent(1, true))
//ture表示只输入学号
DeleteStudent();
break;
case 3: // 修改学生及成绩
//1 表示必须要求数据库中必须存在输入的学号
if (InputStudent(1, false))
//false表示输入所有字段信息
UpdateStudent();
break;
case 4: //显示所有记录
DisplaySortMenu();
OutputStudent();
break;
case 0:
return;
default:
printf("\n请选择正确的操作!");
break;
}
}
}
int studentsData()
{
char host[] = "localhost"; //MYSQL主机名
char dbname[] = "studentdata"; //数据库名
const char username[] = "root"; //用户名
const char password[] = "200310073220lxr"; //密码
unsigned int port = 3306;
if (//初始化mysql
(conn = mysql_init((MYSQL*)0))
&&
//Windows系统运行时,要选择gbk字符集,以显示中文
(mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk") == 0)
&&
//开始连接mysql
mysql_real_connect(conn, host, username, password,
dbname, port, NULL, 0)
)
{
//如果连接成功
DisplayMainMnue(); //显示菜单
}
else
{
printf("\n连接数据库失败.\n");
mysql_close(conn);
return false;
}
mysql_close(conn);
return true;
}
程序说明-核心数据结构:
void BookManagemet();//核心函数
其他解释:
见代码注释
项目扩展
对于程序代码不使用数组,而是使用链表实现程序;上述代码即实现
项目小结
文件名:文件路径+文件名主干+文件后缀,文件路径分为绝对路径和相对路径,两者怎么区分?
绝对路径:以盘符或者根目录开头的如C/D:
相对路径:以.或者…开头的,但是前提是你必须在当前目录下才能谈及相对路径。
以.\开头的表示当前路径,.以…\开头的表示当前路径的上一层路径。
参考文献
叶安胜, 鄢涛. C语言综合项目实战[M]. 科学出版社, 2015.