c语言学生管理系统
基于C语言和txt文件的增删改查
转载请注明出处
1、背景
本系统基于学生信息管理,完成了学生的信息的读取、增加、删除、修改、查询。本身意义可能不大,但是有很多学生再刚开始学习的时候,往往布置的大作业就是利用C语言实现简单的控制台管理系统,往往要求使用的结构是
以上就是最简单的功能,其他的功能也就是逻辑复杂一些,但是最终都会归结在这些操作上,用txt操作的意义何在?如果真的要做系统的话,应该使用数据库的,但是往往做这个系统的学生还没有学习数据库,所以数据就用简单的txt存储就行了。
2、环境
vs2015 +Win10 别的编译器也可以,可以会有略微不一样
3、目的
- 练习和熟悉基本的语法。
- 理解链表这种数据结构,查找、删除等操作,以及和数组的区别
- 简单的容错机制、健壮性
- 字符串处理以及指针的理解
- 如果是小组合作的话,还涉及到合作分工集成,集成对新手来说是个很头疼的问题
4、定义数据结构
/*定义一个学生类型*/
typedef struct student
{
char stuid[16];//学号
char name[16];//学生姓名
int num;//学生学号
struct student* next;//下一个学生的指针
}Stu;
Stu* students;//学生链表
char* stuInfo="test.txt";//学生信息存储的文件
int input = 0;//选择
char tempInput[64];
char tempName[64];
char tempStuid[64];
int tempNum = 0;
以上是我作为示例定义的简单数据结构,结构体中是学生的学号、姓名、学号、指向下一个结构体的指针。
students
是链表的头节点
stuInfo
存储的是学生信息txt
的路径,这里的txt
和工程或exe
放一个层级,当然可以自己改成自己的
temp...
都是用来接收一些数据用的变量
5、定义功能函数
void initFromTxt(void);//初始化读入信息
void deleteInfo(char* stuid);//删除一条信息
void rewrite(void);//将内存中的信息,写入txt
void insert2txt(Stu* stu);//插入一条信息进入文本
int addinfo(char* stuid, char* name, int num);//增加一条信息
void modify(char* stuid, char*name, int num);//修改一条信息
int checkAdd(char* stuid);//判断学号输入是否存在
void showInfo(void);//展示学生信息
Stu* findInfo(char* stuid);//查找学生信息
void view(void);//界面
int checkInput(char* input, int begin, int end);//判断输入是否再给定的范围内
6、实验结果
1、初始文本文件
2、主菜单
7、说明
本系统还不是很完善,有很多细节可以扣,尤其在容错这方面,基本都没怎么处理,只是像呈现出来这些功能罢了,展现一个基本的操作,链表查询,删除、插入,读写文件之类的。
8、代码部分
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*定义一个学生类型*/
typedef struct student
{
char stuid[16];//学号
char name[16];//学生姓名
int num;//学生学号
struct student* next;//下一个学生的指针
}Stu;
Stu* students;//学生链表
char* stuInfo="test.txt";//学生信息存储的文件
int input = 0;//选择
char tempInput[64];
char tempName[64];
char tempStuid[64];
int tempNum = 0;
void initFromTxt(void);//初始化
void deleteInfo(char* stuid);//删除信息
void reWrite(void);//重写
void insert2txt(Stu* stu);//插入文本
int addinfo(char* stuid, char* name, int num);//增加信息
void modify(char* stuid, char*name, int num);//修改信息
int checkAdd(char* stuid);//判断学号输入
void showInfo(void);//展示信息
Stu* findInfo(char* stuid);//查找信息
void view(void);//界面
int checkInput(char* input, int begin, int end);//判断输入是否再给定的范围内
void initFromTxt(void)
{
students = (Stu*)malloc(sizeof(Stu));//给链表的头节点分配内存
students->next = NULL;//指向设为空
FILE* file;
file = fopen(stuInfo, "r");//打开信息文件
if (file == NULL)
{
printf("[initFromTxt]打开文件失败!");
return;
}
Stu* s = students;//当前结点
while (1)
{
Stu* stu = (Stu*)malloc(sizeof(Stu));
//从文本读入学生信息,存进stu中
if (fscanf(file, "%s %s %d",&(stu->stuid) ,&(stu->name), &(stu->num)) == EOF)
{
//如果读入为EOF,也就说为读入为空,那么刚刚新建的stu就不要了,释放分配的内存
free(stu);
break;
}
stu->next = NULL;
s->next = stu;//将当前节点和新建的节点链接起来
s = stu;//调整当前节点为新节点
}
fclose(file);
}
void deleteInfo(char* stuid)
{
Stu* stu = students->next;//当前节点
Stu* pre = students;//当前节点的父节点
int isFound = 0;//是否找到学生
while (stu != NULL)
{
if (strcmp(stu->stuid, stuid) == 0)//判断id是否相同
{
pre->next = stu->next;
free(stu);
reWrite();//重写进文件
isFound = 1;
break;
}
pre = pre->next;
stu = stu->next;
}
if (isFound)
{
printf("删除成功!\n");
}
else
{
printf("没有找到该记录!\n");
}
}
void reWrite(void)
{
Stu* stu = students->next;
FILE* file = fopen(stuInfo, "w");//清空文件
fclose(file);
if (stu == NULL)//这个代表当前没有学生,直接返回
{
return;
}
while (stu != NULL)
{
insert2txt(stu);
stu = stu->next;
}
}
//插入一条学生信息进入文本文件
void insert2txt(Stu* stu)
{
FILE* file;
file=fopen(stuInfo,"a");
if (file == NULL)
{
printf("[insert2txt]文件写入不成功!");
return;
}
fprintf(file, "%s %s %d\n", stu->stuid,stu->name, stu->num);
fclose(file);
}
int addinfo(char* stuid, char* name,int num)
{
if (!checkAdd(stuid))
{
printf("学号重复,不能添加!\n");
return 0;
}
Stu* newinfo = (Stu*)malloc(sizeof(Stu));//新建一个新节点
newinfo->next = NULL;
//给新节点赋值
strcpy(newinfo->stuid, stuid);
strcpy(newinfo->name, name);
newinfo->num = num;
//调整p到最后一个节点
Stu* p = students;
while (p->next!=NULL)
{
p = p->next;
}
//p链接新节点
p->next = newinfo;
//插入新信息
insert2txt(newinfo);
return 1;
}
/*修改学生信息*/
void modify(char* stuid,char*name,int num)
{
//修改信息是先删除再添加
deleteInfo(stuid);
if(addinfo(stuid,name,num))
printf("修改成功!");
else
printf("修改失败!");
}
/*判断学号是否重复*/
int checkAdd(char* stuid)
{
Stu* stu = students->next;
while (stu != NULL)
{
if (strcmp(stu->stuid, stuid) == 0)
return 0;
stu = stu->next;
}
return 1;
}
/*打印所有信息*/
void showInfo(void)
{
Stu* stu = students->next;
while (stu!=NULL)
{
printf("%s %s, %d\n",stu->stuid ,stu->name, stu->num);
stu = stu->next;
}
getchar();
getchar();
}
/*根据学生信息查找学生*/
Stu* findInfo(char* stuid)
{
Stu* stu = students->next;
while (stu != NULL)
{
if (strcmp(stu->stuid, stuid) == 0)
return stu;
stu = stu->next;
}
return NULL;
}
void main(void)
{
initFromTxt();
view();
}
/*判断输入是否再范围内,用来判断*/
int checkInput(char* input,int begin,int end)
{
//如果不是一个字符,直接返回
if (strlen(input) != 1)
{
return -1;
}
//判断输入是不在范围内
if (input[0]<'0' + begin || input[0]>'0' + end)
{
return -1;
}
return input[0] - '0';
}
void view(void)
{
while (1)
{
system("cls");
printf("****************************\n");
printf("1.增加学生信息\n");
printf("2.删除学生信息\n");
printf("3.改变学生信息\n");
printf("4.查询学生信息\n");
printf("5.展示学生信息\n");
printf("6.退出\n");
printf("****************************\n");
scanf("%s", tempInput);
input = checkInput(tempInput,1,6);
switch (input)
{
case 1:
printf("请输入学号,姓名,数字(例如:20151111 张三 0)数据以空格隔开:");
scanf("%s%s%d",tempStuid,tempName,&tempNum);
addinfo(tempStuid, tempName, tempNum);
break;
case 2:
printf("请输入学号:");
scanf("%s", tempStuid);
deleteInfo(tempStuid);
break;
case 3:
printf("请输入学号:");
break;
case 4:
printf("请输入学号:");
scanf("%s", tempStuid);
Stu* stu= findInfo(tempStuid);
if (stu != NULL)
{
printf("学号:%s\n姓名:%s\n数字:%d\n", stu->stuid, stu->name, stu->num);
}
else
{
printf("学号不存在!按任意键返回");
getchar(); getchar();
}
break;
case 5:
showInfo();
break;
case 6:
return;
break;
default:
printf("输入错误!按任意键返回\n");
getchar();getchar();
break;
}
}
}
相关阅读
对于许多企业来说,他们的的目光不仅仅局限于国内市场。相应,这些企业所需要的网站就不单是中文界面了。那大家知道对于多语言需要的
一、基本概念 1.二叉排序树 二叉排序树(Binary sort tree,BST),又称为二叉查找树,或者是一棵空树;或者是具有下列性质的二叉树: (1)若
1.文件偏移 通常调用read或write每读写一个文件,就会改变文件的读写位置。在linux中同样可以使用lseek函数来修改文件偏移量,即读
链接:https://pan.baidu.com/s/1yA7nmEgpyLvDc22ENNT47Q 密码:0ezv 本书为完整版,以下为内容截图:
EditPlus3是小巧但功能强大的可处理文本、HTML和程序语言的Windows编辑器,甚至可以通过设置用户工具将其作为C,Java,Php等等语言的