【C语言项目实战8——数据库】

工资管理系统问题

项目功能需求

题目描述:本系统用于管理企业的员工工资发放记录,需要两张表:员工表和工资表。员工表存储员工的个人信息,属性有员工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.

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值