学生管理系统

花了好长时间终于知道 网页上的代码格式怎么写⊙﹏⊙b汗
#include
  
  
   
   
#include 
   
   
    
    
#include 
    
    
     
     

typedef struct student
{
    int num;
    char name[20];
    struct student *next;
}STU;
/**********************
函数:menu()
功能:打印首页面
**********************/
void menu()
{
     printf("*****学生管理系统******\n");
    printf("请选择操作\n");
    printf("1 : 打印所有信息\n");
    printf("2 : 添加新的信息\n");
    printf("3 : 删除信息\n");
    printf("4 : 保存修改\n");
    printf("5 : 退出系统\n");
    printf("***********************\n");

}
/**************************************
函数:read_data();
功能:读取文件中存储以链表形式存在的内容
返回值:head
***************************************/
STU *read_data()
{
    STU *head = NULL;
    STU *p = NULL;
    int num;                             /* 定义同 结构体中相同的类型 通过这几个变量 输出内容*/
    char iname[20];
    FILE *fp = fopen("file.txt", "r");   /*以 r 形式打开文件  即可*/
    if (NULL == fp)                      /*是否打开文件失败*/
    {
        perror("em.");
        exit(0);

    }

    if (fscanf(fp, "%d%s", &num, iname) == EOF)   /*是否文件为空*/
    {
        return NULL;
    }

    head = p = malloc(sizeof(STU));                /*不为空的前提下 开辟结构体类型空间*/
    if (head == NULL)
    {
        perror("empty.");
        exit(0);
    }
    head->num = num;                               /*先将第一个结点的数据 赋给本此函数定义的变量 */
    strncpy(head->name, iname, 19);
    head->next = NULL;

    while (fscanf(fp, "%d%s", &num, iname) != EOF)  /*判断每次取完结点 是否为文件的结尾*/
    {
        p->next = malloc(sizeof(STU));              /*给下一个结点开辟空间*/
        if (p->next == NULL)
        {
            perror("empty");
            exit(0);
        }
        p->next->num = num;                        /*如第一个结点一样 将下来的结点内容赋给变量*/
        strncpy(p->next->name, iname, 19);
        p->next->next = NULL;

        p = p->next;                                /*移动指针*/
    }
    return head;                                    /*指针返回*/
}
/***********************
函数:print_node()
功能:打印所有结点
返回值:空
***********************/
void print_node(STU *p)
{
    if (p == NULL)
    {
        printf("empty.\n");
        return;
    }
    while(p != NULL)
    {
        printf("%d  %s\n", p->num, p->name);
        p = p->next;                                   /*移动指针 输出所有的*/
    }
}
/**********************
函数:add_node()
功能:添加新的结点
返回值:head 返回头结点
**********************/
STU *add_node(STU *p)

{
    STU *head = p;
    STU *new = NULL;

    new = malloc(sizeof(STU));                   /*需要添加的结点 先开辟新的空间*/
    if (new == NULL)
    {
        perror("empty");
        exit(0);
    }
    printf("please add a number:\n");
    scanf("%d", &new->num);
    printf("please add the name:\n");
    scanf("%s",new->name);               /*getchar()可接受一个字符,直到按回车才返回,但是第一个字符作为函数的返回值*/
    getchar();                              /*读入的所有操作 只取一个字符 回车 也是个字符 故在此加*/
    new->next = NULL;                  /*新开辟的空间 一定加上本身指针的指向*/
/*从特殊到一般的情况考虑*/
    if (p == NULL)
    {
        return new;
    }

    if (new->num < head->num)
    {
        new->next = head;
        return new;
    }

/*判断下面两个条件 从左至右*/
    while ((p->next != NULL) && (p->next->num < new->num))
    {
        p = p->next;                                   /*移动指针*/
    }
    new->next = p->next;              /*while  语句循环结束 退出  即定位添加位置*/
    p->next = new;

    return head;
}
/**********************
函数:delete_node()
功能:删除结点
返回值:head 返回头结点
***********************/

STU *delete_node(STU *p)
{
    int number = 0;             /*从键盘上获得的参数 存入地址*/
    STU *head = p;              /*固定 头结点*/
    STU *temp = NULL;           /*在找到需删除的结点时  用此指针固定该结点 则可释放该结点*/

    if (p == NULL)
    {
        printf("empty~!\n");
        return head;
    }

    printf("please input a number to delete:\n");
    scanf("%d",&number);
    getchar();                 /*输入的字符送入缓冲区 再从缓冲区读取  注意加getchar()*/

    if (p->num == number)
    {
        head = p->next;
        free(p);
        return head;
    }

    while((p->next != NULL) && (p->next->num != number))

   {
        p = p->next;
    }

    if (p->next == NULL)
    {
        printf("no match.\n");
        return head;
    }
    temp = p->next;
    p->next = p->next->next;
    free(temp);
    return head;
}

/******************************
函数:save_link()
功能:将链表保存到文件
******************************/
void save_link(STU *p)
{
    FILE *fp = fopen("file.txt", "w");
    if (fp == NULL)
    {
        perror("null");
        exit(0);
    }
    while(p != NULL)
    {
        fprintf(fp, "%d   %s\n", p->num, p->name);
        p = p->next;
    }

    fclose(fp);
}

int main(int argc, const char *argv[])
{
    char choice = 0;
    int flag = 1;
    STU *head = NULL;

    head = read_data();

    while (flag != 0)
    {
        menu();
        choice = getchar();
        getchar();
        switch(choice)
        {
            case '1' : print_node(head); break;
            case '2' : head = add_node(head); break;
            case '3' : head = delete_node(head); break;
            case '4' : save_link(head); break;
            case '5' : flag = 0; printf("thank you for using~!\n");; break;
            default : printf("Sorry, no this function~!\n");break;
        }
    }
    return 0;
}


    
    
   
   
  
  

望广大人民给予意见谢谢~!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘 要 伴随着人才教学的关注度越来越高,对于人才的培养也是当今社会发展的最为重要的问题之一。为了进一步的进行人才的培养关工作,许多的学校或者是教育的机构逐步的开展了网络信息化的教学和和管理工作,通过信息化的手段和技术实现网络信息化的教育及管理模式,通过网络信息化的手段实现在线答题在线考试和学生信息在线的管理等操作。这样更加的快捷解决了人才培养之中的问题,也在进一步的促进了网络信息化教学方式的快速的发展工作。相较于之前的人才教育和培养工作之中,存在这许多的问题和局限性。在学生信息管理方面通过线下管理的形式进行学生信息的管理工作,在此过程之中存在着一定的局限性和低效性,往往一些突发的问题导致其中工作出现错误。导致相关的教育工作受到了一定的阻碍。在学生信息和学生成绩的管理方面,往常的教育模式之下都是采用的是人工线下的进行管理和整理工作,在这一过程之中存在这一定的不安全和低效性,面对与学生基数的越来越大,学生的信息管理也在面领着巨大的挑战,管理人员面领着巨大的学生信息的信息量,运用之前的信息管理方式往往会在统计和登记上出现错误的情况的产生,为后续的管理工作造成了一定的困难。然而通过信息化的管理方式进行对学生信息的管理不仅可以避免这些错误情况的产生还可以进一步的简化学生信息管理工作的流程,节约了大量的人力和物力的之处。在线答题系统的实现不仅给学生的信息管理工作和在线考试带来了方便也进一步的促进了教育事业信息化的发展,从而实现高效化的教学工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值