该系统实现对学生档案的存储和管理。学生信息包括学号、姓名、性别和生日等信息。系统
可以对学生信息进行查询、添加、删除和备份。系统进入时还包括一个密码验证的过程,也
可以对密码进行管理。
数组方式实现
#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 语言中的文件读写函数来将学生信息存储到文件中,方便用户备份和恢复。
原创可以找我写,不过要加米
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!