C语言学生管理系统增删改查

基于C语言和txt文件的增删改查

转载请注明出处

1、背景

本系统基于学生信息管理,完成了学生的信息的读取、增加、删除、修改、查询。本身意义可能不大,但是有很多学生再刚开始学习的时候,往往布置的大作业就是利用C语言实现简单的控制台管理系统,往往要求使用的结构是

  • 在内存中用链表存储数据
  • 从txt中读取信息,并可以删除写入
  • 完成信息的展示、增加、删除、修改、查询

以上就是最简单的功能,其他的功能也就是逻辑复杂一些,但是最终都会归结在这些操作上,用txt操作的意义何在?如果真的要做系统的话,应该使用数据库的,但是往往做这个系统的学生还没有学习数据库,所以数据就用简单的txt存储就行了。

2、环境

VS2015 +win10 别的编译器也可以,可以会有略微不一样

3、目的

  1. 练习和熟悉基本的语法。
  2. 理解链表这种数据结构,查找、删除等操作,以及和数组的区别
  3. 简单的容错机制、健壮性
  4. 字符串处理以及指针的理解
  5. 如果是小组合作的话,还涉及到合作分工集成,集成对新手来说是个很头疼的问题

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;
        }
    }

}

猜你喜欢

转载自blog.csdn.net/wayway0554/article/details/82748030