1.需求分析
这是一个实现学生信息管理系统,其中定义了函数实现以下功能:
该程序是一个学生信息管理系统,其需求分析可以总结为以下几点:
1.支持添加学生信息:包括学生姓名、年龄、性别和专业。
2.支持查询学生信息: 通过学生姓名查找学生信息并输出。
3.支持删除学生信息: 通过学生姓名删除学生信息。
4.支持修改学生信息:通过学生姓名查询学生信息并修改学生的年龄、性别和专业。
5.提供用户友好的菜单界面,可以让用户选择相应的操作。
6.提供退出功能,确保用户可以安全地退出该系统。
2.具体函数实现
函数add_student()用于添加新的学生信息,从控制台读取学生姓名、年龄、性别和专业,并将其插入到MySQL数据库中。
函数find_student()用于查找指定学生的信息。
函数delete_student()删除学生信息,
函数update_student()用于更新指定学生的信息,先查找学生姓名,然后提示用户输入新的学生信息,最后将更新后的信息写入数据库。
程序还包含了菜单函数menu()和退出函数tuichu()。当主函数通过一个 while 循环,不断显示菜单并等待用户输入选择。当用户选择退出程序时将调用 tuichu()函数,询问用户是否确认退出。若确认则程序结束,否则返回菜单。
3.数据库设计
此程序使用MySQL C API编写,用于学生信息管理系统。要在Ubuntu中连接数据库,需要遵循以下步骤:
1.安装MySQL客户端库:
在Ubuntu终端中运行以下命令:
sudo apt-get install libmysqlclient-dev
这将安装MySQL客户端库及其头文件,以便在代码中使用MySQL C API。
2.连接到 MySQL:
可以使用以下命令连接到MySQL:
sudo mysql
3.在MySQL shell中运行以下命令来创建一个新的数据库:
CREATE DATABASE sddatabase;
4.创建数据库表:
在MySQL shell中运行以下命令来创建一个新的students表:
USE sddatabase;
CREATE TABLE students (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
gender ENUM(‘Male’,’Female’) NOT NULL,
major VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
);
id是一个自动递增的整数,表示学生的唯一标识符。
name 和major 这两个字段是可变长度字符串类型,最大长度为 50 个字符。这是为了限制这两个字段所能容纳的字符数量,以便优化数据库的性能和空间利用率。
gender是一个枚举类型,表示学生的性别。
PRIMARY KEY (d)表示id 是主键,也就是用来唯一标识每个学生记录的字段。主键的值必须是唯一的,且不能为 NULL。
5.在终端中运行sm.c文件
gcc -o sm sm.c -lmysqlclient
这将生成一个可执行文件sm,它链接到MySQL客户端库。
6.运行程序:
在终端中运行以下命令来启动程序:
./sm
如果一切正常,程序应该连接到MySQL数据库,并显示一个菜单。现在您可以使用该程序管理学生信息。
4. 程序代码
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int t = 1;
void add_student(MYSQL *conn);
void delete_student(MYSQL *conn);
void find_student(MYSQL *conn);
void tuichu();
void menu();
//增加学生信息
void add_student(MYSQL *conn) {
char name[50], gender[10], major[50];
int age;
printf("Enter student name: ");
scanf("%s", name);
printf("Enter student age: ");
scanf("%d", &age);
printf("Enter student gender (Male/Female): ");
scanf("%s", gender);
printf("Enter student major: ");
scanf("%s", major);
char query[400];
//使用sprintf函数将一个格式化字符串存储到query数组中,字符串内容是SQL INSERT语句
sprintf(query, "INSERT INTO students (name, age, gender, major) VALUES('%s',%d,'%s','%s')",name,age,gender,major);
//若mysql_query()执行失败返回非0,则打印错误信息,并退出
if (mysql_query(conn, query)) {
printf("Error: %s\n", mysql_error(conn));
exit(1);
}
printf("Student added successfully.\n");
}
//查找学生信息
void find_student(MYSQL *conn) {
char name[50];
printf("Enter student name: ");
scanf("%s", name);
char query[100];
sprintf(query, "SELECT * FROM students WHERE name = '%s'", name);
if (mysql_query(conn, query)) {
printf("Error: %s\n", mysql_error(conn));
exit(1);
}
//mysql_use_result()从MYSQL服务器检索查询结果,返回指向结果的指针
MYSQL_RES *res = mysql_use_result(conn);
//指向结果集中一行数据指针
MYSQL_ROW row;
//将结果集第一行数据读取到row指针,判断是否为NULL
if ((row = mysql_fetch_row(res)) != NULL) {
printf("ID: %s\n", row[0]);
printf("Name: %s\n", row[1]);
printf("Age: %s\n", row[2]);
printf("Gender: %s\n", row[3]);
printf("Major: %s\n", row[4]);
} else {
printf("Student not found.\n");
}
mysql_free_result(res); //释放查询结果集所占的空间内存
}
//删除学生信息
void delete_student(MYSQL *conn) {
char name[50];
printf("Enter student name: ");
scanf("%s", name);
char query[100];
sprintf(query, "DELETE FROM students WHERE name = '%s'", name);//删除表中满足指定条件的行
if (mysql_query(conn, query)) {
printf("Error: %s\n", mysql_error(conn));
mysql_close(conn);
exit(1);
}
}
//更新学生信息
void update_student(MYSQL *conn) {
char name[50], gender[10], major[50];
int age;
printf("Enter student name to update: ");
scanf("%s", name);
char query[100];
sprintf(query, "SELECT * FROM students WHERE name = '%s'", name);
if (mysql_query(conn, query)) {
printf("Error: %s\n", mysql_error(conn));
exit(1);
}
MYSQL_RES *res = mysql_store_result(conn);
if (res == NULL) {
printf("Error: %s\n", mysql_error(conn));
exit(1);
}
MYSQL_ROW row;
if ((row = mysql_fetch_row(res)) != NULL) {
printf("Current information for student %s:\n", name);
printf("ID: %s\n", row[0]);
printf("Name: %s\n", row[1]);
printf("Age: %s\n", row[2]);
printf("Gender: %s\n", row[3]);
printf("Major: %s\n", row[4]);
printf("\nEnter updated student information:\n");
printf("Enter student age: ");
scanf("%d", &age);
printf("Enter student gender (Male/Female): ");
scanf("%s", gender);
printf("Enter student major: ");
scanf("%s", major);
char update_query[400];
sprintf(update_query, "UPDATE students SET age=%d, gender='%s', major='%s' WHERE name='%s'", age, gender, major, name);
if (mysql_query(conn, update_query)) {
printf("Error: %s\n", mysql_error(conn));
exit(1);
}
printf("Student information updated successfully.\n");
} else {
printf("Student not found.\n");
}
mysql_free_result(res);
}
void tuichu()
{
int h;//控制是否确认退出
printf("即将退出,确认请按1,取消请按0\n");
scanf("%d",&h);
if(h==1)
{
t=0;//t是main函数中while函数是否继续执行的控制条件,是一个全局变量,程序开头已经定义并且赋值为 1
printf("成功退出,感谢使用!\n");
exit(0);
}
else if(h==0)
{
printf("退出已取消!\n");
system("pause");
}
}
void menu()
{
printf("\n\n");
printf("*****************************************************\n");
printf("*--------------------- ceshi ------------------------\n");
printf("* 学生信息管理系统 *\n");
printf("*****************************************************\n");
printf("********************系统功能菜单*********************\n");
printf("---------------------- --------------------------\n");
printf("*****************************************************\n");
printf("** 1、增加学生信息 * 2、查询学生信息 **\n");
printf("*****************************************************\n");
printf("** 3、删除学生信息 * 4、修改学生信息 **\n");
printf("*****************************************************\n");
printf("** 5 、退出系统 **\n");
printf("*****************************************************\n");
}
int main()
{
int num=0;//num是菜单选项
MYSQL *conn= mysql_init(NULL);
if (conn == NULL){
printf("Error:%s\n",mysql_error(conn));
exit(1);
}
//localhost 是数据库服务器的地址,root 是用户名,password 是密码,database_name 是要连接的数据库名称。连接MYSQL服务器
if (mysql_real_connect(conn, "localhost", "root", "h", "sddatabase",0, NULL, 0) == NULL) { printf("Error: %s\n", mysql_error(conn));
mysql_close(conn);
exit(1);
}
while(t)//t为全局变量,用退出函数改变t的值来控制循环是否继续
{
menu();//输出主菜单界面
printf("您好,请输入菜单编号:");
scanf("%d",&num);
switch(num)
{
case 1: add_student(conn) ; break;
case 2: find_student(conn) ; break;
case 3: delete_student(conn) ; break;
case 4: update_student(conn) ;break;
case 5:tuichu(); break;
default:printf("输入有误,请重新输入!");
}
}
}