学生档案管理系统(c语言)(最好是原创)

该系统实现对学生档案的存储和管理。学生信息包括学号、姓名、性别和生日等信息。系统
可以对学生信息进行查询、添加、删除和备份。系统进入时还包括一个密码验证的过程,也
可以对密码进行管理。

img

数组方式实现


#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define STRLEN 20
#define ARRSIZE 30

typedef struct Student
{
   char id[STRLEN];
   char name[STRLEN];
   char sex[4];
   char brithday[STRLEN];
} Student;

const char DataFile[] = "data.txt";
const char PwdFile[] = "pwd.txt";

int ReadFile(Student *stu, int n)
{
   int cnt = 0;
   FILE *fp;
   fp = fopen(DataFile, "r");
   if (fp == NULL)
      return 0;

   while (!feof(fp) && cnt < n)
   {
      fread(stu + cnt, sizeof(Student), 1, fp);
      if (strlen(stu->id) == 0)
         break;
      cnt++;
   }
   fclose(fp);
   return cnt;
}

void SaveFile(Student *stu, int count)
{
   FILE *fp;
   fp = fopen(DataFile, "w");
   if (fp == NULL)
      return;

   for (int i = 0; i < count; i++)
   {
      fwrite(stu + i, sizeof(Student), 1, fp);
   }
   fclose(fp);
}

// 输入口令
void inputPWD(char *s, int n)
{
   char ch;
   int i = 0;
   while (i < n - 1)
   {
      ch = getch();
      if (ch == '\r')
      {
         putchar('\n');
         break;
      }
      s[i++] = ch;
      putchar('*');
   }
   s[i] = '\0';
}

// 设置口令
void setPWD()
{
   char pwd1[STRLEN], pwd2[STRLEN];
   while (1)
   {
      printf("输入新密码:");
      inputPWD(pwd1, STRLEN);
      printf("再次输入新密码:");
      inputPWD(pwd2, STRLEN);
      if (strcmp(pwd1, pwd2) != 0)
         printf("两次输入密码不一致!\n");
      else
         break;
   }
   FILE *fp;
   fp = fopen(PwdFile, "w");
   fwrite(pwd1, STRLEN, 1, fp);
   fclose(fp);
   printf("密码修改成功!\n");
}

// 校验口令
int CheckPWD(char *s) // 校验密码
{
   char pwd[STRLEN] = {0};
   FILE *fp;

   fp = fopen(PwdFile, "r");
   if (fp == NULL) //
      return 1;
   fread(pwd, STRLEN, 1, fp);
   fclose(fp);
   return strcmp(s, pwd) == 0;
}

// 登录模块
void Login()
{

   char pwd[STRLEN];
   int r, i = 0;
   while (i < 3)
   {
      printf("\n\t   学生档案管理系统\n");
      printf("- - - - - - - - - - - - - - - - - - - \n");
      printf("\n请输入口令:");
      inputPWD(pwd, STRLEN);
      // puts(pwd);
      r = CheckPWD(pwd);
      if (!r)
         printf("口令错误,重新输入!\n");
      else
         break;
      i++;
   }
   if (i == 3)
   {
      printf("错误次数太多!\n");
      exit(1);
   }
}

void inputStu(Student *stu, int size, int *inx)
{
   if (size == *inx)
   {
      printf("数组已满\n");
      return;
   }
   printf("输入学号:");
   scanf("%s", stu[*inx].id);
   printf("输入姓名:");
   scanf("%s", stu[*inx].name);
   printf("输入性别:");
   scanf("%s", stu[*inx].sex);
   printf("输入出生日期:");
   scanf("%s", stu[*inx].brithday);
   (*inx)++;
}

void Show(Student *stu, int count)
{
   printf("%8s%8s%8s%10s\n", "学号", "姓名", "性别", "出生日期");
   for (int i = 0; i < count; i++)
   {
      printf("%8s%8s%8s%10s\n", stu[i].id, stu[i].name, stu[i].sex, stu[i].brithday);
   }
}

int FindbyName(Student *stu, int count, char *name)
{
   for (int i = 0; i < count; i++)
   {
      if (strcmp(stu[i].name, name) == 0)
         return i;
   }
   return -1;
}

void Find(Student *stu, int count)
{
   int i;
   char name[STRLEN];
   printf("输入要查询的姓名:");
   scanf("%s", name);

   i = FindbyName(stu, count, name);
   if (i == -1)
      printf("不存在!\n");
   else
      printf("%8s%8s%4s%8s\n", stu[i].id, stu[i].name, stu[i].sex, stu[i].brithday);
}

void Edit(Student *stu, int count)
{
   int i;
   char name[STRLEN];
   printf("输入要修改的姓名:");
   scanf("%s", name);
   i = FindbyName(stu, count, name);
   if (i == -1)
   {
      printf("不存在!\n");
      return;
   }
   printf("%8s%8s%4s%8s\n", stu[i].id, stu[i].name, stu[i].sex, stu[i].brithday);
   inputStu(stu, ARRSIZE, &i);
   SaveFile(stu, count);
   printf("修改成功!\n");
}

void Del(Student *stu, int *count)
{
   int i;
   char name[STRLEN];
   printf("输入要删除的姓名:");
   scanf("%s", name);
   i = FindbyName(stu, *count, name);
   if (i == -1)
   {
      printf("不存在!\n");
      return;
   }
   printf("%8s%8s%4s%8s\n", stu[i].id, stu[i].name, stu[i].sex, stu[i].brithday);
   for (int j = i; j < *count - 1; j++)
   {
      stu[j] = stu[j + 1];
   }
   (*count)--;
   SaveFile(stu, *count);
   printf("删除成功!\n");
}

void Backup()
{
   char bakname[100] = "backup.txt";
   FILE *fp1, *fp2;
   fp1 = fopen(DataFile, "r");
   fp2 = fopen(bakname, "w");
   char ch;
   while (!feof(fp1))
   {
      ch = fgetc(fp1);
      fputc(ch, fp2);
   }
   fclose(fp1);
   fclose(fp2);
   printf("备份完毕!\n");
}

int Menu()
{
   int n;
   printf("\n\n\t   学生档案管理系统\n");
   printf("- - - - - - - - - - - - - - - - - - - \n");
   printf(" 1 输入数据         |    5 删除数据\n");
   printf(" 2 显示数据         |    6 备份数据\n");
   printf(" 3 查询数据         |    7 设置口令\n");
   printf(" 4 修改数据         |    0 退出\n");
   printf("- - - - - - - - - - - - - - - - - - - \n");
   printf("\n请选择:");
   fflush(stdin);
   scanf("%d", &n);
   return n;
}

int main()
{
   Student stu[ARRSIZE] = {0};
   int sel, run = 1;
   Login();
   int count = ReadFile(stu, ARRSIZE);
   while (run)
   {
      sel = Menu();
      switch (sel)
      {
      case 1:
         inputStu(stu, ARRSIZE, &count);
         SaveFile(stu, count);
         break;
      case 2:
         Show(stu, count);
         break;
      case 3:
         Find(stu, count);
         break;
      case 4:
         Edit(stu, count);
         break;
      case 5:
         Del(stu, &count);
         break;
      case 6:
         Backup();
         break;
      case 7:
         setPWD();
         break;
      case 0:
         run = 0;
         break;

      default:
         printf("输入错误,重新输入!\n");
         break;
      }
   }

   return 0;
}

下面是一个使用 C 语言实现学生档案管理系统的框架:

定义学生信息结构体,包括学号、姓名、性别、生日等信息。

定义学生信息链表,用于存储多个学生信息。

定义函数用于读取学生信息,并将信息添加到学生信息链表中。

定义函数用于查询学生信息,可以根据学号或姓名进行查询。

定义函数用于删除学生信息,可以根据学号或姓名进行删除。

定义函数用于备份学生信息,将学生信息写入文件中。

定义函数用于对密码进行管理,可以修改密码。

在系统进入时,使用函数进行密码验证。

使用循环语句实现主程序的菜单界面,用户可以选择对学生信息进行查询、添加、删除、备份或管理密码。
源码如下:


```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN 100  // 定义字符串的最大长度

// 定义学生信息结构体
struct Student {
  char id[MAX_LEN];  // 学号
  char name[MAX_LEN];  // 姓名
  char gender[MAX_LEN];  // 性别
  char birth[MAX_LEN];  // 生日
};

// 定义学生信息链表结点
struct Node {
  struct Student student;  // 学生信息
  struct Node *next;  // 指向下一个结点的指针
};

// 定义头结点
struct Node *head = NULL;

// 定义函数,读取学生信息并将信息添加到学生信息链表中
void add_student() {
  struct Node *new_node = (struct Node*)malloc(sizeof(struct Node));  // 创建新的结点
  printf("请输入学生信息(学号 姓名 性别 生日):");
  scanf("%s%s%s%s", new_node->student.id, new_node->student.name, new_node->student.gender, new_node->student.birth);
  new_node->next = NULL;  // 将新结点的 next 指针设为 NULL
  if (head == NULL) {  // 如果学生信息链表为空
    head = new_node;  // 将新结点设为头结点
  } else {  // 否则(学生信息链表不为空)
    struct Node *p = head;  // 定义指针 p 指向头结点
    while (p->next != NULL) {  // 遍历链表
      p = p->next;  // p 指向下一个结点
    }
    p->next = new_node;  // 将新结点添加到链表末尾
}
}

// 定义函数,查询学生信息
void find_student() {
char id[MAX_LEN]; // 定义变量,用于存储学号
printf("请输入学号:");
scanf("%s", id);
struct Node *p = head; // 定义指针 p 指向头结点
while (p != NULL) { // 遍历链表
if (strcmp(p->student.id, id) == 0) { // 如果找到了学生信息
printf("学号:%s\n", p->student.id);
printf("姓名:%s\n", p->student.name);
printf("性别:%s\n", p->student.gender);
printf("生日:%s\n", p->student.birth);
return; // 结束函数
}
p = p->next; // p 指向下一个结点
}
printf("未找到学生信息\n"); // 如果遍历完链表还未找到学生信息,则输出提示信息
}

// 定义函数,删除学生信息
void delete_student() {
char id[MAX_LEN]; // 定义变量,用于存储学号
printf("请输入学号:");
scanf("%s", id);
struct Node *p = head; // 定义指针 p 指向头结点
if (p != NULL && strcmp(p->student.id, id) == 0) { // 如果要删除的是头结点
head = p->next; // 将头结点设为下一个结点
free(p); // 释放空间
return; // 结束函数
}
while (p->next != NULL) { // 遍历链表
if (strcmp(p->next->student.id, id) == 0) { // 如果找到了学生信息
struct Node *temp = p->next; // 定义指针 temp 指向要删除的结点
p->next = temp->next; // 将 p 的 next 指针设为 temp 的 next 指针
free(temp); // 释放空间
return; // 结束函数
}
p = p->next; // p 指向下一个结点
}
printf("未找到学生信息\n"); // 如果遍历完链表还未找到学生信息,则输出提示信息
}

// 定义函数,备份学生信息
void backup_student() {
char filename[MAX_LEN]; // 定义变量,用于存储文件名
printf("请输入文件名:");
scanf("%s", filename);
FILE *fp = fopen(filename, "w"); // 以写的方式打开文件
if (fp == NULL) { // 如果文件打开失败
printf("文件打开失败\n");
return; // 结束函数
}
struct Node *p = head; // 定义指针 p 指向头结点
while (p != NULL) { // 遍历链表
fprintf(fp, "%s %s %s %s\n", p->student.id, p->student.name, p->student.gender, p->student.birth); // 将学生信息写入文件
p = p->next; // p 指向下一个结点
}
fclose(fp); // 关闭文件
printf("备份成功\n");
}

// 定义函数,管理密码
void manage_password() {
char password[MAX_LEN]; // 定义变量,用于存储密码
printf("请输入旧密码:");
scanf("%s", password);
if (strcmp(password, "123456") != 0) { // 如果输入的密码不正确
printf("密码错误\n");
return; // 结束函数
}
printf("请输入新密码:");
scanf("%s", password);
printf("修改成功\n");
}

int main() {
while (1) { // 使用循环语句实现菜单界面
printf("\n请选择操作:\n");
printf("1. 添加学生信息\n");
printf("2. 查询学生信息\n");
printf("3. 删除学生信息\n");
printf("4. 备份学生信息\n");
printf("5. 管理密码\n");
printf("6. 退出系统\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
add_student();
break;
case 2:
find_student();
break;
case 3:
delete_student();
break;
case 4:
backup_student();
break;
case 5:
manage_password();
break;
case 6:
exit(0); // 退出程序
default:
printf("输入错误,请重新输入\n");
break;
}
}
return 0;
}




```


//初始密码为123456
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "malloc.h"
#define OP sizeof(stu) 
typedef struct student
{
    char nam[10];
    int num;
    char sex[4];
    char age[4];
    char remark[200];
    struct student *next;
}stu;

stu *head=NULL;

void cin (stu *p1)
{
    printf("输入姓名:");
    scanf("%s",&p1->nam);
    printf("\n输入学号:");
    scanf("%d",&p1->num);
    printf("\n输入性别:");
    scanf("%s",&p1->sex);
    printf("\n输入年龄:");
    scanf("%s",&p1->age);
    printf("\n输入备注:");
    scanf("%s",&p1->remark); 
}

stu *cindata()
{
    stu *p1,*p2;
    int i=1;
    char ch;
    p1=(stu *)malloc(OP);
    head->next=p1;
    while(i)
    {
        cin(p1);
        printf("是否继续,输入'n'或'N'可退出,输入其他任意键则继续输入");
        ch=getchar();
        ch=getchar();
        if(ch=='n'||ch=='N')
            {
                i=0;
                p1->next=NULL;
            }
            else{
                p2=p1;
                p1=(stu *)malloc(OP);
                p2->next=p1;
            }
    }
return(p1->next);
}

stu *lookdata(stu *p1)
{
    while(p1!=NULL)
    {
        printf("学号:%d\t",p1->num);
        printf("姓名:%s\t",p1->nam);
        printf("性别:%s\t",p1->sex);
        printf("年龄:%s\t",p1->age);
        printf("备注:%s\t",p1->remark);
        printf("\n");
        p1=p1->next;
    }
    return p1;
}

void search(stu *p) 
{
    
    int t;
    printf("通过学号查询,请输入1\n");
    printf("通过姓名查询,请输入2\n");
    printf("通过性别查询,请输入3\n");
    printf("通过年龄查询,请输入4\n");
    printf("退出,请输入5\n");
    scanf("%d",&t);
    switch(t)
    {
    case 1:
    {
    int number;
    printf("请输入需查询的学号:\n");
    scanf("%d",&number);
    while(p!=NULL)
    {
        if(number==p->num)
        {
            printf("姓名 学号 性别 年龄 备注\n");
            printf(" %s   %d   %s   %s   %s\n",p->nam,p->num,p->sex,p->age,p->remark);
            printf("已找到\n"); 
            return;
        }
        p=p->next; 
        }
        printf("未找到学号为%d的学生\n",number);
    }
     break;
    case 2:
        { 
            int flag=0;
            char name[100];
            printf("请输入需查询的姓名:\n");
            scanf("%s",name);
            while(p!=NULL)
            {
                if(!strcmp(name,p->nam))
                {
                printf("姓名 学号 性别 年龄 备注\n");    
                printf(" %s    %d   %s   %s   %s\n",p->nam,p->num,p->sex,p->age,p->remark);
                flag=1;
                }
        p=p->next; 
        }
        if(flag==1)
        {
            printf("已找到\n");
        }    
     
     else{
         printf("未找到学姓名为%s的学生\n",name);
     }
}
        break;
    case 3:
        {   
            int flag=0;
            char sexy[4];
            printf("请输入需查询的性别:\n");
            scanf("%s",sexy);
            while(p!=NULL)
            {
                if(!strcmp(sexy,p->sex))
                {
                printf("姓名 学号 性别 年龄 备注\n");
                printf(" %s   %d   %s   %s   %s\n",p->nam,p->num,p->sex,p->age,p->remark);
                flag=1;
                    }
        p=p->next; 
        }
        if(flag==1)
        {
            printf("已找到\n");
        }
     
     else{
         printf("未找到性别为%s的学生\n",sexy);
     }
}
        break;
    case 4:    
        {
            int flag=0;
            char nother_age[4];
            printf("请输入需查询的年龄:\n");
            scanf("%s",nother_age);
            while(p!=NULL)
            {
                if(!strcmp(nother_age,p->age))
                {
                printf("姓名 学号 性别 年龄 备注\n");
                printf(" %s   %d   %s   %s   %s\n",p->nam,p->num,p->sex,p->age,p->remark);
                flag=1;
                    }
        p=p->next; 
        }
        if(flag==1)
        {
            printf("已找到\n");
        }    
     else{
         printf("未找到年龄为%s的学生\n",nother_age);
     }
}
        break;
        default:
        break;
    }
}

void sort(stu *head)
{
    stu *q,*pt,*p=head;
    printf("排序后的学生信息如下\n");
    printf("学号 姓名 年龄 性别 备注");
    if(p==NULL)
        return;
    while(p->next!=NULL)
    {
        q=p->next;                 
        while(q->next!=NULL)
            if(p->next->num>q->next->num)
            {
                pt=p->next;
                p->next=q->next;
                q->next=q->next->next;
                p->next->next=pt;
            }
            else
              q=q->next;
        p=p->next;                                   
    }
    p=head->next;
    while(p!=NULL)
    {
        printf("\n  %d   %s   %s   %s   %s",p->num,p->nam,p->age,p->sex,p->remark);
        p=p->next;
    }
}

void save(stu * p2)
{ 
    FILE *fp;
    char file[10];
    printf("输入文件名");
    scanf("%s",file);
    fp=fopen(file,"w");
    while(p2!=NULL)
    {
        fprintf(fp,"%s",p2->nam);
        fprintf(fp,"%d",p2->num);
        fprintf(fp,"%s",p2->age);
        fprintf(fp,"%s",p2->sex);
        fprintf(fp,"%s",p2->remark);
        p2=p2->next;
     } 
     fclose(fp);     
}

char password[7]="123456";

main()
{
    stu *p2;
    char s[8];
    int flag=0,i;
    int n=3;
    head=(stu*)malloc(OP);
    memset(head,0,OP);
    do
    {
        printf("请输入密码:\n");
        scanf("%s",s);
        if(!strcmp(s,password))
        {
            printf("通过验证\n"); 
            flag=1;
            break;
            }
            else
            {
                printf("密码错误\n");
                n--;
            }
        }while(n>0);
        if(!flag)
        {
            printf("输错次数已超过三次");
            exit(0);
        }
    while(1)
    {
    printf("\n\t\t\t\t\t班级档案管理系统      \n余思荷   计算机1705\n");
    printf("<1>输入数据\t");
    printf("<2>查看数据\t");
    printf("<3>数据查询\t");
    printf("<4>数据保存\t"); 
    printf("<5>数据排序\t");
    printf("<6>退出\t\n");
        printf("请从1到6中选择一个数字\n");
        scanf("%d",&i);
        system("cls");
        if(i<1||i>6)    
            exit(1);  
         switch(i)
         {  
            case 1:
                p2=cindata();
                break;
            case 2:
                p2=lookdata(head->next);
                break;
             case 3:
                 search(head->next);
                 break;
             case 4:
                 save(head->next);
                 break;
             case 5:
                 sort(head);
                 break;
             case 6:
                exit(1);
                break;
         }
    } 
}


C 语言实现学生档案存储和管理系统的一些建议:

1.定义结构体:为学生信息定义一个结构体,包括学号、姓名、性别、生日等信息。

struct Student {
  int id;
  char name[20];
  char gender;
  char birthday[20];
};


2.定义学生数组:创建一个数组,用来存储所有学生的信息。

struct Student students[100];


3.读入学生信息:编写函数来读入学生信息,并将信息存储到学生数组中。

void input_student(struct Student* student) {
  printf("请输入学号:");
  scanf("%d", &student->id);
  printf("请输入姓名:");
  scanf("%s", student->name);
  printf("请输入性别:");
  scanf("%s", &student->gender);
  printf("请输入生日:");
  scanf("%s", student->birthday);
}


4.查询学生信息:编写函数来查询学生信息。可以根据学号或姓名查询。

void search_student(int id) {
  for (int i = 0; i < 100; i++) {
    if (students[i].id == id) {
      printf("学号:%d\n", students[i].id);


5.添加学生信息:编写函数来添加新的学生信息。

void add_student(struct Student student) {
  for (int i = 0; i < 100; i++) {
    if (students[i].id == 0) {
      students[i] = student;
      break;
    }
  }
}


6.删除学生信息:编写函数来删除学生信息。

void delete_student(int id) {
  for (int i = 0; i < 100; i++) {
    if (students[i].id == id) {
      students[i].id = 0;
      break;
    }
  }
}


7.备份学生信息:编写函数来将学生信息备份到文件中。

void backup_students(char* filename) {
  FILE* fp = fopen(filename, "w");
  if (fp == NULL) {
    printf("打开文件失败\n");
    return;
  }

  for (int i = 0; i < 100; i++) {
    if (students[i].id == 0) continue;
    fprintf(fp, "%d,%s,%c,%s\n", students[i].id, students[i].name, students[i].gender, students[i].birthday);
  }

  fclose(fp);
}


8.密码验证:在系统进入时进行密码验证,如果密码不正确,则给出提示并退出程序。

void verify_password(char* password) {
  char correct_password[20];
  // 从文件中读取密码
  FILE* fp = fopen("password.txt", "r");
  fscanf(fp, "%s", correct_password);
  fclose(fp);

  if (strcmp(password, correct_password) != 0) {
    printf("密码错误,程序退出\n");
    exit(1);
  }
}


9.密码管理:编写函数来修改或重置密码。

void manage_password(char* password) {
  // 将新密码写入文件
  FILE* fp = fopen("password.txt", "w");
  fprintf(fp, "%s", password);
  fclose(fp);
}


10.用户界面:使用 C 语言中的图形界面库(例如 GTK+ 或 Qt)来为系统创建友好的用户界面,方便用户进行操作。
11.数据库存储:使用 C 语言中的数据库连接库(例如 MySQL 或 SQLite)来将学生信息存储到数据库中,使系统的数据更加安全。
12.文件存储:使用 C 语言中的文件读写函数来将学生信息存储到文件中,方便用户备份和恢复。

可参考

原创可以找我写,不过要加米

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

https://so.csdn.net/so/search?q=%E5%AD%A6%E7%94%9F%E6%A1%A3%E6%A1%88%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F&t=ask&u=