C语言初学者版学生信息管理系统-附带文件

C程序实现了一个功能齐全的学生信息管理系统,支持增删改查、排序和文件操作,以及密码验证。
摘要由CSDN通过智能技术生成
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
typedef struct Student {
	char id[15];
	char name[20];
	int sex;
	int age;
	int grade;
	struct Student *next;
	struct Student *head;//头指针
	struct Student *end;//尾指针
	int length;//信息链表长度(不包括头空间)
	struct Student *thisP;//当前位置(记录在头空间里的 )
} Stu;
Stu* head;
char passwd[20];//密码 
int writeStu();//写入信息函数
int addStu();//添加学生信息到链表
int deleStu();//从链表中将学生信息删除
int modifyStu();//修改链表中的学生信息
int findStu();//查询链表中的学生信息
int sort();//将链表中的信息按照学生成绩排序
void menu();//菜单函数
Stu* init();//初始化函数
void error(int event);//报错函数
int creatSpace();//创建链表函数
void select();//分支选择函数
int printStu();//打印信息
int deleStu();//删除信息
void judgeSex(Stu *p);//性别输出函数
int readFile();//文件导入函数
int saveFile();//信息保存函数
int password();
Stu* init() {
	head = (Stu*)malloc(sizeof(Stu));
	head->length = 0;
	head->end = head;
	head->next = NULL;
	head->thisP = NULL;
	error(password());
	return head;
}
void error(int event) {
	switch(event) {
		case 0:
			printf("\t\t\t\t创建链表失败(错误代码0)");
			break;
		case 1:
			break;
		case -1:
			printf("\t\t\t\t新建学生信息失败(错误代码-1)");
			break;
		case -2:
			printf("\t\t\t\t删除学生信息失败(错误代码-2)");
			break;
		case -3:
			printf("\t\t\t\t修改学生信息失败(错误代码-3)");
			break;
		case -4:
			printf("\t\t\t\t查询学生信息失败(错误代码-4)");
			break;
		case -5:
			printf("\t\t\t\t学生信息排序失败(错误代码-5)");
			break;
		case -6:
			printf("\t\t\t\t文件保存失败(错误代码-6)");
			break;
		case -7:
			printf("\t\t\t\t文件读取失败(错误代码-7)");
			break;
		case -8:
			printf("\t\t\t\t密码修改失败(错误代码-8)");
			break;
		case -9:
			printf("\t\t\t\t写入信息失败(错误代码-9)");
			break;
		case -10:
			printf("\t\t\t\t信息显示失败(错误代码-10)");
			break;
		case -11:
			printf("\t\t\t\t密码错误");
			break;
		default:
			printf("\t\t\t\t未知错误");
	}

}
int writeStu() {
	Stu *p;
	p = head->thisP;
	if(head->thisP!=NULL) {
		printf("\t\t\t\t请您输入学生的学号:");
		scanf("%s",p->id);
		printf("\t\t\t\t请您输入学生的姓名:");
		scanf("%s",p->name);
		printf("\t\t\t\t请您输入学生的性别(用数字表示,1位男、0为女)");
		scanf("%d",&p->sex);
		printf("\t\t\t\t请您输入学生的年龄:");
		scanf("%d",&p->age);
		printf("\t\t\t\t请您输入学生的分数:");
		scanf("%d",&p->grade);
	} else
		return -9;
	return 1;
}
int creatSpace() {
	Stu *p = head->end; //获取当前链表末尾位置
	Stu *q = (Stu*)malloc(sizeof(Stu));
	q->next = NULL;
	p->next = q;
	head->length ++ ;
	head->end = q;
	if(head->end==NULL)
		return 0;
	return 1;
}
int addStu() {//添加信息
	if(head!=NULL) {
		error(creatSpace());
		head->thisP = head->end;
		error(writeStu());
	} else
		return -1;
	return 1;
}
void judgeSex(Stu *p) {
	if(p->sex==1)
		printf("\n\t\t\t\t性别:男");
	else
		printf("\n\t\t\t\t性别:女");
}
int printStu() {//打印信息
	if(head->thisP!=NULL) {
		Stu *p = head->thisP;
		printf("\t\t\t\t学号:%s",p->id);
		printf("\n\t\t\t\t姓名:%s",p->name);
		judgeSex(p);
		printf("\n\t\t\t\t年龄:%d",p->age);
		printf("\n\t\t\t\t成绩:%d\n",p->grade);
	} else {
		printf("\t\t\t\t暂无学生数据\n");
		return -10;
	}
	return 1;
}
int findStu() {
	char id[5];
	printf("\t\t\t\t请输入您查询信息的学号");
	scanf("%s",id);
	head->thisP = head->next;
	for(int i=0; i<head->length; i++) {
		if(strcmp(id,head->thisP->id)==0) {
			error(printStu());
			break;
		} else if(i==head->length&&strcmp(id,head->thisP->id)!=0) {
			printf("\t\t\t\t未查询到该学生信息\n");
		} else
			head->thisP=head->thisP->next;
	}

	if(head->thisP==NULL)
		return -4;
	return 1;
}
int deleStu() {
	Stu *p;
	Stu *q;
	p = head->next;
	q = head;
	int a;
	error(findStu());
	printf("\n\t\t\t\t是否删除?(按1删除,其他任意键取消)");
	scanf("%d",&a);
	if(a == 1) {
		while(p!=NULL) {
			if(strcmp(head->thisP->id,p->id) == 0) {
				q->next = p->next;
				free(p);
				head->length--;
				break;
			} else {
				p = p->next;
				q = q->next;
			}
		}
		if(p==NULL)
			return -2;
	}
	return 1;
}
int modifyStu() {
	int a;
	error(findStu());
	printf("\n\t\t\t\t是否修改?(按1开始修改,其他任意键取消)");
	scanf("%d",&a);
	if(a==1) {
		if(head->thisP!=NULL) {
			error(writeStu());
		} else
			return -3;
	}

	return 1;
}
int sort() {
	int temp;
	if(head->length>2) {
		Stu *p;
		Stu *q;
		Stu *m;
		for(int i = 0; i<head->length; i++) {
			p = head->next;
			q = p->next;
			m = head;
			for(int j=0; j<head->length-i-1; j++) {
				if(p->grade<q->grade) {
					m->next = q;
					p->next = q->next;
					q->next = p;
					p = m->next;
					q = p->next;
				}
				p=p->next;
				q=q->next;
				m=m->next;
			}
			head->end = q;
		}
	} else if(head->length<0)
		return -5;
	printf("\t\t\t\t排序完成\n");
	return 1;
}
int saveFile() {
	FILE *fq;
	fq = fopen("data.txt","w");
	if(fq==NULL)
		return -6;
	head->thisP = head;
	fprintf(fq,"%d\n",head->length);
	for(int i=0; i<head->length; i++) {
		head->thisP = head->thisP->next;
		fprintf(fq,"%s %s %d %d %d\n",head->thisP->id,head->thisP->name,head->thisP->sex,head->thisP->age,head->thisP->grade);
	}
	printf("\t\t\t\t保存完毕!");
	fclose(fq);
	return 1;
}
int readFile() {
	FILE *fq;
	fq = fopen("data.txt","r");
	if(fq==NULL)
		return -7;
	fscanf(fq,"%d",&head->length);
	int leng = head->length;
	head->length = 0;
	for(int i=0; i<leng; i++) {
		error(creatSpace());
		fscanf(fq,"%s %s %d %d %d\n",head->end->id,head->end->name,&head->end->sex,&head->end->age,&head->end->grade);
	}
	printf("\t\t\t\t导入信息完成!");
	fclose(fq);
	return 1;
}
int password() {
	FILE *fq;
	char str[20];
	fq = fopen("password.txt","r");
	if(fq==NULL) {
		printf("您是新用户,请设置密码(6位):");
		for(int i=0; i<6; i++) {
			scanf("%c",&passwd[i]);
		}
		fq = fopen("password.txt","w");
		fprintf(fq,"%s",passwd);
		printf("密码设置完成!即将跳转!");
		return 1;
	}
	fscanf(fq,"%s",passwd);
	for(int i=1; i<4; i++) {
		printf("请输入您的密码(%d/3):",i);
		scanf("%s",str);
		if(strcmp(str,passwd)==0) {
			printf("密码正确!即将跳转!");
			fclose(fq);
			return 1;
		} else {
			if(i==3) {
				printf("密码错误3次,已自动退出");
				exit(-1);
			} else
				printf("密码输入错误!请重新输入\n");
		}
	}
	return 1;
}
int passwdmodif(){
	char str[20]; 
	char passwor[20];
	FILE *fq;
	for(int i=1; i<4; i++) {
		printf("请输入您的原密码(%d/3):",i);
		scanf("%s",str);
		if(strcmp(str,passwd)==0) {
			printf("请输入你修改后的密码(6位):");
			getchar();//清除键盘缓冲区 
			for(int i=0; i<6; i++) {
			scanf("%c",&passwor[i]);
		}
			fq = fopen("password.txt","w");
			if(fq == NULL){
				return -8;
			}
			printf("%s",passwor);
			fprintf(fq,"%s",passwor);
			strcpy(passwd,passwor);
			printf("密码修改成功"); 
			fclose(fq);
			return 1;
		} else {
			if(i==3) {
				printf("密码错误3次,已自动退出");
				exit(-1);
			} else
				printf("密码输入错误!请重新输入\n");
		}
	}
	return 1;

}
void menu() {
	system("cls");
	puts("\n");
	puts("\t\t\t\t                 学生信息管理系统                 \n");
	puts("\t\t\t\t*************************************************\n");
	puts("\t\t\t\t(1)学生信息新增\t\t\t(2)学生信息浏览\t");
	puts("\t\t\t\t(3)学生信息查询\t\t\t(4)学生信息排序\t");
	puts("\t\t\t\t(5)学生信息删除\t\t\t(6)学生信息修改\t");
	puts("\t\t\t\t(7)学生信息导入\t\t\t(8)学生信息保存\t");
	puts("\t\t\t\t(9)系统密码修改\t\t\t(0)退出图书系统\t");
	puts("\n\t\t\t\t*************************************************\n");
}
void select() {
	int a;
	while(1) {
		menu();
		printf("\t\t\t\t请输入您选择的序号:");
		scanf("\t\t\t\t%d",&a);
		switch(a) {
			case 1:
				addStu();
				break;
			case 2:
				head->thisP = head;
				for(int i=0; i<head->length; i++) {
					head->thisP=head->thisP->next;
					error(printStu());
				}
				break;
			case 3:
				int a;
				for(int i=0; i<head->length; i++) {
					if(a = findStu()==1)
						break;
					else
						error(a);
				}
				break;
			case 4:
				error(sort());
				break;
			case 5:
				error(deleStu());
				break;
			case 6:
				error(modifyStu());
				break;
			case 7:
				error(readFile());
				break;
			case 8:
				error(saveFile());
				break;
			case 9:
				error(passwdmodif());
				break;
			case 0:
				Stu *q=head;
				Stu *p;
				while (q) {
					p = q;
					q = q->next;
					free(p);
				}
				exit(-1);
				break;
		}
		system("pause");
	}
}

int main() {
	init();
	select();
	return 0;
}

随时欢迎学习交流

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值