学生信息管理系统(student information manage system, SIMS)

简介: 学生信息管理系统(student information manage system, SIMS)

一、前言

本项目为学生信息管理系统,使用C语言编写。


★★★项目详见本人gitee仓库,地址

https://gitee.com/omnipotent-brother/student-information-manage-system.git

★★★

二、项目介绍

开发环境

基于windows 11系统下的Visual Studio 2022开发

提供功能

  • 学生信息的查询、修改、增加、删除
  • 账户信息的查询、修改、增加、删除

登陆级别

  • 管理员级别-老师-0,可使用所有系统功能。
  • 普通 级别-学生-1,仅查询功能。

配置文件

  • configure.txt 存放登陆账户信息文件和学生信息文件的绝对路径,每个路径独占一行。
  • usrer_cfg.txt 登录账户信息,0表示管理员账户,1表示普通用户。
  • student_cfg.txt 学生信息。

注意: 配置文件要和可执行文件在同一目录下,或者在程序中fopen的时候写入配置文件路径。

用户文件和登陆账户文件格式如下

usrer_cfg.txt

账户名 密码 登陆级别

student_cfg.txt

id 姓名 课程id 成绩 课程id 成绩 课程id 成绩 ...

三、项目展示

登陆界面
首先选择身份

登录界面输入的账户名和密码应该是usrer_cfg.txt配置文件中存在的记录。

功能选择界面。

查询学生信息,查询方式选择界面。

选择0,查询所有信息。

四、项目经验分享

通过项目实战可以大大提升C语言水平,下面展示代码片段。

自定义数据结构

/* 
* 用户结构体 
*/
typedef struct user
{
  char name[NAME_LEN]; /* 用户名称 */
  char password[PASSWORD_LEN]; /* 用户密码 */
  int level; /* 权限级别 */
  struct user* next;
}user_t; 
/*
* 课程结构体
*/
typedef struct course
{
  int id; /* 课程号 */
  double score; /* 成绩,尽量使用double,float容易失真 */
}course_t;
/*
* 学生结构体
*/
typedef struct student
{
  int id;
  char name[NAME_LEN];
  course_t course[COURSE_NUM];
  struct student* next;
}student_t;
/*
* 账户级别:admin管理员账户,normal普通账户
*/
enum{ADMIN = 0, NORMAL}; 
#define LEGAL_LEVEL(level) ((ADMIN == level) || \
              (NORMAL == level))
/*
* 通过断言判定是否合法,即是否在enum枚举范围内
*/
#ifdef USE_FULL_ASSERT
void assert_failed(unsigned char* file, unsigned int line);
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((unsigned char *)__FILE__, __LINE__))
#else
#define assert_param(expr) ((void)0)
#endif

主程序

#define USE_FULL_ASSERT
#include "sims.h"
int main(char* argv[], int argc)
{
  int option = 0; /* 用于记录用户选项 */
  student_t* stu_list = NULL;
  user_t* user_list = NULL;
  user_t user;
  memset(&user, 0, sizeof(user));
  FILE* fp = fopen("E:\\project\\c\\my_sims\\configure.txt", "r"); /* 打开配置文件 */
  fseek(fp, 0, SEEK_SET); /* 文件指针移至文件首 */
  char user_path[128] = "";
  char stu_path[128] = "";
  char str[128] = "";
  /* 获取配置文件信息 */
  fgets(str, sizeof(str), fp); /* 读取一行 */
  strncpy(user_path, str, strlen(str) - 1);  /* 不拷贝换行符 */
  memset(str, 0, sizeof(str)); /* 清空str防止脏数据 */
  fgets(str, sizeof(str), fp);
  if (str[strlen(str)] == '\n')
  {
    strncpy(stu_path, str, strlen(str) - 1); /* 如果有换行符,不拷贝换行符 */
  }
  else
  {
    strncpy(stu_path, str, strlen(str)); /* 无换行符全部拷贝 */
  }
  /*  测试打印
  printf("%zd\n", strlen(str));
  printf("user_path : %s\n", user_path);
  printf("stu_path : %s\n", stu_path);*/
  /* 系统初始化 */
  system_init(&user_list, &stu_list, user_path, stu_path);
  /* 主循环 */
  while (1)
  {
    system("cls");  /* 清屏 */
    menu_init();
    printf("Please enter your number: ");
    option = getchar() - '0';  /* 获取输入的字符并转为数字 */
    if (2 == option)
    {
      system_exit();
      return 0;
    }
    else if (LEGAL_LEVEL(option))
    {
      user.level = option;
    }
    else
    {
      fflush(stdin); /* 刷新输入缓冲区 */
      printf("Input error!\n");
      assert_param(LEGAL_LEVEL(option)); /* 使用断言打印位置 */
      printf("Press any key to re-enter...");
      _getch(); /* 接受任意字符后继续运行,getch()需要按Enter键才能继续运行 */
      continue;
    }
    system("cls");
    printf("Please enter the user name and password...\n");
    printf("user name: ");
    scanf("%s", &user.name);
    printf("password : ");
    fflush(stdin);
    get_passwoed(user.password);
    if (search_user(user_list, user))
    { 
      /* 在用户文件中找到了输入用户 */
      if (ADMIN == user.level)
      {
        admin_function_select(&user_list, &stu_list, user_path, stu_path);
      }
      else if (NORMAL == user.level)
      {
        normal_function_select(stu_list);
      }
      else
      {
        printf("user level error...\n");
      }
      break;
    }
    else
    {
      printf("Not found user!\n");
      fflush(stdin);
      printf("Please enter 'y' to login re-enter, or any other key to exit...\n");
      if ('y' != _getch())
      {
        break;
      }
    }
  }
  /*system("pause");*/
  return 0;
}


相关文章
|
1月前
|
Java 数据库
基于java的汽车服务管理系统(Car Service Management System)
基于java的汽车服务管理系统(Car Service Management System)
21 0
SSM 项目 Library Manager System
SSM 项目 Library Manager System
146 0
SSM 项目 Library Manager System
PAT (Advanced Level) Practice - 1039 Course List for Student(25 分)
PAT (Advanced Level) Practice - 1039 Course List for Student(25 分)
94 0
ABAP System Tables
System Tables ADCP Person/Address assignment (central address administration) ADIRACCESS Table to store keys for TADIR objects ADR2 Telephone numbers (central address admin.
1730 0
|
.NET 开发框架 数据库
深入调研Linq to Objects Join Linq to Entity
最近工作中遇到数据库组合查询带来的一些问题,因此有必要调研一下Linq to Objects Join Linq to Entity。参考一些网友的代码案例,深入实践了一下使用EntityFramework Code First 下的组合查询。
1251 0