学生信息管理

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("输入有误,请重新输入!");
        }
     
    }
}