c语言学生信息管理系统解析

求解答一些大一c语言中遇到的一些问题,关于学生信息管理系统的。例如下列代码的解析


struct Student *modify()
{
    struct Student *p;
    p = Stu;
    int number;
    int i = 0;
    int isbd = 1;
    int j;
    printf("请选择你要修改学生的学号\n");
    scanf("%d", &number);
    while (p[i].id != number && i < count)
    {
        i++;
        p++;
    }
    if (number == p[i].id)
    {
        while (isbd)
        {
            printf("\n1.修改学号  2.修改姓名   3.修改性别  4.修改年龄   5.修改成绩  0.退出修改");
            scanf("%d", &j);
            switch (j)
            {
                case 1:
                    printf("请输入修改后的学号\n");
                    scanf("%d", &p->id);
                    break;
                case 2:
                    printf("请输入修改后的姓名\n");
                    scanf("%s", p->name);
                    break;
                case 3:
                    printf("请输入修改后的性别\n");
                    scanf("%s", p->gender);
                    break;
                case 4:
                    printf("请输入修改后的年龄\n");
                    scanf("%d", &p->age);
                    break;
                case 5:
                    printf("请输入修改后的成绩\n");
                    scanf("%f", &p->score);
                    break;
                case 0:
                    printf("退出成功\n");
                    isbd=0;
                    break;
            }
        }
    }
    return Stu;
};

什么问题?总的思想就是定义一个指针p并让其指向Stu结构体,表示将要修改Stu中的元素。用户自己输入学号,会通过循环找到对应的学生信息。找到以后就让用户选择要修改哪个方面的信息。循环会一直进行,直到用户选择退出修改。在循环中,每当用户选择修改某个方面的信息时,函数会提示用户输入新的信息,并将其赋值给对应的学生信息。最后,函数返回指向Stu的指针。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7805242
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:关于学习c编程中调用函数时遇到的些许问题
  • 同时,你还可以查看手册:c语言-内存模型与数据竞争 中的内容
  • 除此之外, 这篇博客: C语言链表学习--学生信息管理系统中的 最近学习了下C语言的链表,为了更加熟悉链表,就随意写了个学生信息管理系统(写的很垃圾,大佬勿喷) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 本人最近刚好有点时间,就去看了看c语言的链表,看到网上各种c语言的学生信息管理代码,确实都是现成的东西,我也没必要去自己再写,但是本萌新是带着学习的态度好吧(内心真实想法:我就是闲的蛋疼好吧 ),决定自己尝试去写一段这个代码,毕竟只有自己会写才是真理,你看的代码再多,你看的时候觉得你会了,其实不然,说到这里很多人就不信了,这么个简单的代码wo还不会了,那好,你把代码关掉,当场给我写。(暴躁老哥,在线GAY人)。好啦,其实我想说的是,别人的代码写的再好,那也是别人的,始终不是你的,所以,everbody,跟着我一起快乐的撸代码吧。最后由于本人能力有限,代码之处可能存在不少BUG,如有发现,请当场给我两个耳刮子,让我长长记性,学习学习(说着玩的,不要真的抽我好吧)。
    备注:因为只是想深入了解下链表,此处所做的信息管理系统,没有很好的完善界面和选择功能,只是将各个功能都体现出来,后续如有时间可以尝试弄下。(我就是没时间,就是不弄,来打我啊!
    快来干我啊,顺着网线过来戳死我。

    // 该代码实现学生数据库管理系统
    // 所实现的功能为:1.创建学生信息库 2.增加和删除学生信息 3.显示所有学生信息 4.保存所有学生信息
    // 代码完成时间:2019/8/16
    // 代码版本:V1.0
    // 完成人:wangming
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <string.h>
    #include <malloc.h>
    struct stu
        {
            char name[20];
            int score;
            char qq[10];
            char from[15];
            struct stu *next;
        };
    struct stu *head;
    // 函数声明
    void creat();                                   // 创建学生信息库函数
    void sprint(struct stu *u);                     // 打印显示所有学生信息函数
    void add(struct stu *head);                     // 增加学生信息函数
    void save(struct stu *head);                    // 保存学生信息函数
    void read();                                    // 从文件中读取学生信息函数
    void delete(struct stu *head);                  // 删除学生信息函数
    // 主函数,里面的功能全部用各个函数封装起来
    int main()
    {   
        struct stu *p;
        creat();
        sprint(head);
        add(head);
        sprint(head);
        save(head);
        read();
        delete(head);
        sprint(head);
    }
    
    void add(struct stu *head)
    {
        struct stu *p,*p1,*p2,*p3;
        p = head;
        char name[20];
        printf("please input the name of you want to add:");
        scanf("%s",&name);
        p1 = (struct stu *)malloc(sizeof(struct stu));
        while(p!=NULL)
        {
            if(strcmp(p->name,name)==0)
            {   
                p2 = p;
                break;
            }
            p = p->next;
        }
        if(p==NULL)
        {
            printf("not find this student's name\n");
        }
        else
        {
            printf("find this student's name\n");
            printf("-----------------------------------");
            printf("please input student's info\n");
            printf("please input name:");
            scanf("%s",&p1->name);
            printf("please input score:");
            scanf("%d",&p1->score);
            printf("please input qq:");
            scanf("%s",&p1->qq);
            printf("please input from:");
            scanf("%s",&p1->from);
            printf("--------------------------------------\n");
            p3 = p2->next;
            p2->next = p1;
            p1->next = p3;
        }
    }
    
    void creat()
    {
        struct stu *p1,*p2;
        head = NULL;
        p2 = p1 = (struct stu *)malloc(sizeof(struct stu));
        // printf("please input info:");
        head = p1;
        // scanf("%s",&p1->name);
        int flag;
        flag = 1;
        while(flag)
        {   
            printf("please input name info:");
            //head = p1;
            scanf("%s",&p1->name);
            if(strcmp("ok",p1->name)==0)
            {
                flag = 0;
                p2->next = NULL;
                printf("input success\n");
            }
            else
            {
                printf("please input score:");
                scanf("%d",&p1->score);
                printf("please input qq:");
                scanf("%s",&p1->qq);
                printf("please input from:");
                scanf("%s",&p1->from);
                printf("--------------------------------------\n");
                p2 = p1;
                p1 = (struct stu *)malloc(sizeof(struct stu));
                if(p1 == NULL)
                {
                    printf("failed get memery\n");
                }
                p2->next = p1;
            }
        }
    }
    
    void sprint(struct stu *u)
    {   
        struct stu *p;
        p = head;
        while(p!=NULL)
        {   
            printf("--------------------------------------\n");
            printf("name:%s\n",p->name);
            printf("name:%d\n",p->score);
            printf("name:%s\n",p->qq);
            printf("name:%s\n",p->from);
            printf("--------------------------------------\n");
            p = p->next;
        }
    }
    
    void save(struct stu *p)
    {
        FILE *fp;
        fp = fopen("D:\\student.txt","w");
        while(p!=NULL)
        {   
            fprintf(fp,"--------------------------------------\n");
            fprintf(fp,"%s\n",p->name);
            fprintf(fp,"name:%d\n",p->score);
            fprintf(fp,"name:%s\n",p->qq);
            fprintf(fp,"name:%s\n",p->from);
            fprintf(fp,"--------------------------------------\n");
            p = p->next;
        }
        return ;
    }
    
    void read()
    {
        FILE *fp;
        char ch;
        fp = fopen("D:\\student.txt","r");
        while(ch = fgetc(fp)!=EOF)
        {
            putchar(ch);
        }
        return ;
    }
    
    void delete(struct stu *u)
    {
        struct stu *p,*p1;
        char name[20];
        p = u;
        printf("(delete)please input name:");
        scanf("%s",&name);
        if(strcmp(u->name,name)==0)      // 如果链表的头部就是需要删除的信息,那就将头部信息的地址更换为head->next
        {
            head = u->next;
            return ;
        }
        while(p!=NULL)                      // 如果不是链表的头部信息,那就通过遍历链表查询,删除掉需要删除的信息
        {
            if(strcmp(p->name,name)==0)
            {
                printf("find this name\n");
                p = p->next;
                break;
            }
            p1 = p;
            p = p->next;
        }
        if(p==NULL)
            {
                printf("not find\n");
            }
        p1->next = p;
        return ;
    }
    

    如有错误,请各位大哥大姐不吝自己的意见,批判提出,大家共同进步。哈哈哈哈哈哈。

  • 您还可以看一下 CSDN讲师老师的C语言精髓之编译过程视频教程课程中的 计算机的组成部分,栈内存的特点;画出内存图,引入指针的概念小节, 巩固相关知识点

下面是代码的逐行解释:
1、struct Student *modify():定义了一个返回指向Student结构体的指针的函数modify,该函数接受两个参数,即Stu和count。
2、{:大括号表示函数modify的开始。
3、struct Student *p:声明了一个指向Student结构体的指针变量p。
4、p = Stu;:将Stu赋值给p,使其指向整个学生数组。
5、int number:声明了一个整型变量number,用于存储要修改的学生学号。
6、int i = 0;:声明并初始化一个整型变量i,用于跟踪要修改的学生在数组中的位置。
7、int isbd = 1;:声明并初始化一个整型变量isbd,表示是否继续修改。
8、int j;:声明了一个整型变量j,用于存储用户选择的选项。
9、printf("请选择你要修改学生的学号\n");:输出提示信息,要求用户输入要修改的学生学号。
10、scanf("%d", &number);:从标准输入中读取一个整数值,将其存储在number变量中。
11、while (p[i].id != number && i < count) {:当要修改的学生学号与用户输入的不匹配或未找到该学生时,执行循环体。
12、i++;:将i的值增加1。
13、p++;:将p指向下一个学生。
14、if (number == p[i].id):判断要修改的学生是否找到了。
15、{:如果找到了要修改的学生,则执行括号中的代码。
16、while (isbd):当用户选择继续修改时,执行循环体。
17、{:开始内部循环,用于显示修改选项并读取用户输入。
18、printf("\n1.修改学号 2.修改姓名 3.修改性别 4.修改年龄 5.修改成绩 0.退出修改");:输出提示信息,显示可用的选项。
19、scanf("%d", &j);:从标准输入中读取一个整数值,将其存储在j变量中。
20、switch (j):根据用户选择的选项执行相应的代码。
21、case 1::如果用户选择了修改学号。
22、printf("请输入修改后的学号\n");:输出提示信息,要求用户输入修改后的学号。
23、scanf("%d", &p->id);:从标准输入中读取一个整数值,将其存储在p->id(即选中学生的学号)中。
24、break;:跳出switch结构。
25、case 2::如果用户选择了修改姓名。
26、printf("请输入修改后的姓名\n");:输出提示信息,要求用户输入修改后的姓名。
27、scanf("%s", p->name);:从标准输入中读取一个字符串,将其存储在p->name(即选中学生的姓名)中。
28、break;:跳出switch结构。
29、以此类推,一直到所有选项对应的代码都写好。
30、default::如果用户选择的选项不在以上所有情况中,则执行这里的代码。
31、默认为啥也不做,直接跳出switch结构。
32、}:内部循环结束,即用户选择完选项后执行的相关代码结束。
33、isbd = 0;:将isbd的值设为0,表示用户已选择退出修改。
34、break;:跳出外部循环,即查找学生结束后的操作。
35、}:内部循环结束,即修改学生信息的相关代码结束。
36、return Stu;:返回指向修改后学生的指针。
37、}:函数modify的结束。