iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言实现简单学生信息管理系统
  • 621
分享到

C语言实现简单学生信息管理系统

2024-04-02 19:04:59 621人浏览 独家记忆
摘要

学生信息管理系统的功能有,也可以自己增加或者改进一些函数功能。 在main函数里调用这8个函数 学生信息包含姓名、年龄、学号、成绩,需要定义一个结构体(结构体是全局变量,所以需要全

学生信息管理系统的功能有,也可以自己增加或者改进一些函数功能。

在main函数里调用这8个函数

学生信息包含姓名、年龄、学号、成绩,需要定义一个结构体(结构体是全局变量,所以需要全局声明):

typedef struct _student{
    char name[20];
    int age;
    int stuNum;
    int score;
}student;

需要有一个存储数据的空间,所以使用单链表存储,定义如下:

typedef struct _node{
    student stu1;
    struct _Node* pNext;
}Node;

此时需要给链表一个头:

Node *g_head=NULL;

录入学生信息:

1)创建一个新节点,结点里包括结构体数据,和下一个指针。
2)需要判断头结点是不是空的,如果是空的,则此时需要将新节点付给头结点,如果不是空的,那么该结点的下一个指针=头结点(头插法,能用就行)。
3)然后就输入数据scanf("%s",&p->stu1.age);
4)最后提示一下该学生信息输入完毕!
5)现在只输入了一个学生信息,此时只需要在主函数里写一个循环就可以无限调用该函数进行数据录入。

void input(){
    printf("请输入学生信息\t\n");
    Node *pNewNode=(Node*)malloc(sizeof(Node));//创建一个新节点。
    pNewNode->pNext=NULL;
    
    if(g_head==NULL){
        g_head=pNewNode;
    }
    else{
        pNewNode->pNext=g_head;
        g_head=pNewNode;
    }
    printf("请输入姓名: ");
    scanf("%s",pNewNode->stu1.name);
    printf("请输入年龄: ");
    scanf("%d",&pNewNode->stu1.age);
    printf("请输入学号 : ");
    scanf("%d",&pNewNode->stu1.stuNum);
    printf("请输入成绩 : ");
    scanf("%d",&pNewNode->stu1.score);
printf("该学生信息输入完毕!\n\n");
}

查看信息:

1)需要对链表进行遍历然后printf;
2)新建一个结点指针然后 Node* p=g_head; while(p!=NULL){ printf p=p->next}(注:以上代码只是功能的描述)

代码:

void printdate(){
    Node* p=g_head;
    printf("\t姓名\t年龄\t学号\t成绩\n");
    while(p!=NULL)
    {
        printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
        p=p->pNext;
    }
}

保存信息:

1)先用文件指针指向一个要使用的文件,
2)便利所有链表的数据,将遍历的数据写入文件指针指向的文件里

void save(){
    FILE *fp=fopen("E:\\stu.data","w");
    if(fp==NULL){
        printf("文件打开失败");
        return;
    }
    Node* p=g_head;
    while(p!=NULL){
        fwrite(&p->stu1,1,sizeof(student),fp);
        p=p->pNext;
    }
    fclose(fp);
    printf("文件保存成功!\n");
}

文件读取:

1)先用文件指针指向一个使用的文件,
2)这里需要开辟链表来将读取到的数据写入链表里的数据里的结构体里,
3)需要判断一下是否读取到了数据,将文件里的数据先读到结构体数组
4)然后while循环里 ,,将结构体数组里的数据复制给链表,
5)需要将每一个节点排好队列,这里用头插法,每复制一个就会开辟一个结点,

代码:

void rs(){
    FILE* fp=fopen("E:\\stu.data","r");
    if(fp==NULL){
        printf("文件打开失败");
    }
    printf("文件读取成功!\n 查看文件请按2\n");
    student stu;
    
    while(fread(&stu,1,sizeof(student),fp)){
        Node* pNewNode=(Node*)malloc(sizeof(Node));
        pNewNode->pNext=NULL;

        memcpy(pNewNode,&stu,sizeof(student));

        if(g_head==NULL){
            g_head=pNewNode;

        }
        else{
            pNewNode->pNext=g_head;
            g_head=pNewNode;

        }
    }
    }

统计人数:

1)遍历链表的时候定义一个整型数组自加最后输出

void count(){
    int a=0;
    FILE* fp=fopen("E:\\stu.data","r");
    if(fp==NULL){
        printf("文件打开失败");
        return;
    }
    Node* p=g_head;
    while(p!=NULL){
        p=p->pNext;
        a++;
    }
    printf("总人数%d",a);
}

查找学生:

1)定义整型数据,输入学号,先遍历再if判断输入的学号和p->stu1.num是否相等,相等的话输出:

void find(){
    int num;
    printf("请输入要查找的学生学号: \n");
    scanf("%d",&num);
    Node* p=g_head;
    while(p!=NULL){
        if(p->stu1.stuNum==num){
            printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
        }
        p=p->pNext;
    }
printf("无该学生信息");
}

修改信息:

1)定义整型数据,输入学号,先遍历再if判断输入的学号和p->stu1.num是否相等,相等的话重新输入:

void change(){
    int num;
    printf("请输入要修改的学生的学号: ");
    scanf("%d",&num);
    Node* p=g_head;
    while(p!=NULL){

        if(p->stu1.stuNum==num){
            printf("请输入姓名: \n");
            scanf("%s",p->stu1.name);
            printf("请输入年龄: \n");
            scanf("%d",&p->stu1.age);
            printf("请输入学号: \n");
            scanf("%d",&p->stu1.stuNum);
            printf("请输入成绩: \n");
            scanf("%d",&p->stu1.score);
            printf("信息更改完毕!");
        }

        p=p->pNext;
    }
    if(p==NULL){
        printf("该学生不存在!\n");
    }

}

删除信息:

1)思路是先遍历,找到了free就可以了,
2)需要定义两个节点指针,如果找到了是头结点直接将头结点付给定义的节点,然后free,
如果不是头结点,将该节点付给定义的节点,p->next=p->next->next;
然后free

void del(){
    int num;

    printf("请输入要删除的学号");
    scanf("%d",&num);
    Node* p=g_head;
    Node*p1,*p2;
    if(p->stu1.stuNum==num){
        p1=p->pNext;

        free(p1);

    }
    if(p->pNext!=NULL){
        p2=p->pNext;
        p->pNext=p->pNext->pNext;
        free(p2);
    }
printf("学号为%d的信息删除成功!\n",num);

}

下面是完整代码:

#include<stdio.h>
#include<coNIO.h>
#include<stdlib.h>
#include<string.h>
typedef struct _student{
    char name[20];
    int age;
    int stuNum;
    int score;
}student;

typedef struct _Node{
    student stu1;
    struct _Node* pNext;
}Node;

Node *g_head=NULL;
void menu(){
    printf("------------------\n");
    printf("- 1录入信息-\n");
    printf("- 2查看信息-\n");
    printf("- 3保存信息-\n");
    printf("- 4读取信息-\n");    
    printf("- 5统计人数-\n");
    printf("- 6查找信息-\n");
    printf("- 7修改信息-\n");
    printf("- 8删除信息-\n");
    printf("- 0退出-\n");
    printf("退出不要直接点叉,请按0退出!\n查看文件之前请先读取文件!\n");
}
void input(){
    printf("请输入学生信息\t\n");
    Node *pNewNode=(Node*)malloc(sizeof(Node));//创建一个新节点。
    pNewNode->pNext=NULL;
    
    if(g_head==NULL){
        g_head=pNewNode;
    }
    else{
        pNewNode->pNext=g_head;
        g_head=pNewNode;
    }
    printf("请输入姓名: ");
    scanf("%s",pNewNode->stu1.name);
    printf("请输入年龄: ");
    scanf("%d",&pNewNode->stu1.age);
    printf("请输入学号 : ");
    scanf("%d",&pNewNode->stu1.stuNum);
    printf("请输入成绩 : ");
    scanf("%d",&pNewNode->stu1.score);
printf("该学生信息输入完毕!\n\n");
}

void printdate(){
    Node* p=g_head;
    printf("\t姓名\t年龄\t学号\t成绩\n");
    while(p!=NULL)
    {
        printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
        p=p->pNext;
    }
}


void save(){
    
    FILE *fp=fopen("E:\\stu.data","w");
    if(fp==NULL){
        printf("文件打开失败");
        return;
    }
    Node* p=g_head;
    while(p!=NULL){
        fwrite(&p->stu1,1,sizeof(student),fp);
        p=p->pNext;

    }
    fclose(fp);
    printf("文件保存成功!\n");
}


void rs(){
    FILE* fp=fopen("E:\\stu.data","r");
    if(fp==NULL){
        printf("文件打开失败");
    }
    printf("文件读取成功!\n 查看文件请按2\n");
    student stu;
    
    while(fread(&stu,1,sizeof(student),fp)){
        Node* pNewNode=(Node*)malloc(sizeof(Node));
        pNewNode->pNext=NULL;

        memcpy(pNewNode,&stu,sizeof(student));

        if(g_head==NULL){
            g_head=pNewNode;

        }
        else{
            pNewNode->pNext=g_head;
            g_head=pNewNode;

        }
    }
    }

void count(){
    int a=0;
    FILE* fp=fopen("E:\\stu.data","r");
    if(fp==NULL){
        printf("文件打开失败");
        return;
    }
    Node* p=g_head;
    while(p!=NULL){
        p=p->pNext;
        a++;
    }
    printf("总人数%d",a);
}


void find(){
    int num;
    printf("请输入要查找的学生学号: \n");
    scanf("%d",&num);
    Node* p=g_head;
    while(p!=NULL){
        if(p->stu1.stuNum==num){
            printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
        }
        p=p->pNext;
    }
printf("have not");
}

void change(){
    int num;
    printf("请输入要修改的学生的学号: ");
    scanf("%d",&num);
    Node* p=g_head;
    while(p!=NULL){

        if(p->stu1.stuNum==num){
            printf("请输入姓名: \n");
            scanf("%s",p->stu1.name);
            printf("请输入年龄: \n");
            scanf("%d",&p->stu1.age);
            printf("请输入学号: \n");
            scanf("%d",&p->stu1.stuNum);
            printf("请输入成绩: \n");
            scanf("%d",&p->stu1.score);
            printf("信息更改完毕!");
        }

        p=p->pNext;
    }
    if(p==NULL){
        printf("该学生不存在!\n");
    }

}

void del(){
    int num;

    printf("请输入要删除的学号");
    scanf("%d",&num);
    Node* p=g_head;
    Node*p1,*p2;
    if(p->stu1.stuNum==num){
        p1=p->pNext;

        free(p1);

    }
    if(p->pNext!=NULL){
        p2=p->pNext;
        p->pNext=p->pNext->pNext;
        free(p2);
    }
printf("学号为%d的信息删除成功!\n",num);

}

int main()
{
    menu();
    while(1)
    {
        char ch=getch();
        switch(ch){
        case '1':input();break;
        case '2':printdate();break;
        case '3':save();break;
        case '4':rs();break;


        case '5':count();break;
        case '6':find();break;
        case '7':change();break;
        case '8':del();break;

        case '0':exit(0);
        
        }
    }

return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C语言实现简单学生信息管理系统

本文链接: https://www.lsjlt.com/news/165101.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作