m0_73485625 2022-12-10 17:59 采纳率: 60%
浏览 154
已结题

解答我的问题,C语言。

img


解答这些问题,如何用结构体等方式来解答,C语言,其他语言不行。

  • 写回答

1条回答 默认 最新

  • yy64ll826 2022-12-10 19:39
    关注

    C语言编写成绩管理系统
    如有帮助,望采纳

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    //学生结构体 
    struct Student
    {
        char Name[10];
        int Num;
        float Computer;
        float Math;
        float English;
        float Total;
        float Ave;
    };
    //结点 
    typedef struct Node
    {
        struct Student st;//数据域
        struct node *pnext;//指针域
    }node, *pnode;//*node等价于struct Student st,pnode等价于struct Node *pNext 
    
    //函数
    pnode Input();//录入学生信息
    void Show(pnode phead);//显示学生信息
    void Add(pnode phead);//增加学生信息
    void Delete(pnode phead);//删除学生信息
    void Change(pnode phead);//修改学生信息
    void Search(pnode phead);//查找学生信息
    void Sort(pnode phead);//总分排序 
     
    void main()
    {
        system("cls");
        printf("\n\n");
        printf("\t\t\t============================================\n");
        printf("\t\t\t|                                          |\n");
        printf("\t\t\t|          欢迎来到学生成绩管理系统        |\n");
        printf("\t\t\t|                                          |\n");
        printf("\t\t\t|==========================================|\n");
        printf("\t\t\t|            请选择要操作的命令            |\n");
        printf("\t\t\t|------------------------------------------|\n");
        printf("\t\t\t|                                          |\n");
        printf("\t\t\t|              1.录入学生信息              |\n");
        printf("\t\t\t|              2.显示学生信息              |\n");
        printf("\t\t\t|              3.增加学生信息              |\n");
        printf("\t\t\t|              4.删除学生信息              |\n");
        printf("\t\t\t|              5.修改学生信息              |\n");
        printf("\t\t\t|              6.查找学生信息              |\n");
        printf("\t\t\t|              7.按总分排序                |\n");
        printf("\t\t\t|                                          |\n");
        printf("\t\t\t============================================\n");
        int Item;//保存操作命令
        pnode phead=NULL;//定义一个指针
        while(1)
        {
            printf("请选择操作命令:");
            scanf("%d",&Item);
            system("cls");//清屏
            switch(Item)
            {
                case 1://录入学生信息
                {
                    phead=Input();
                }
                break;
                case 2://显示学生信息
                {
                    Show(phead);
                }
                break;
                case 3://增加学生信息
                {
                    Add(phead);
                }
                break;
                case 4://删除学生信息
                {
                    Delete(phead);
                }
                break;
                case 5://修改学生信息
                {
                    Change(phead);
                }
                break;
                case 6://查找学生信息
                {
                    Search(phead);
                }
                break;
                case 7://总分排序
                {
                    Sort(phead);
                    Show(phead);
                }
                break;
                default:
                break;
            }
        }
        system("pause");
    }
    //录入学生信息
    pnode Input()
    {
        int num;//学生的人数
        node stu;//学生结构
        pnode phead=(pnode)malloc(sizeof(node));//定义一个头结点并且为头结点分配内存
        //判断内存是否为空
        if(NULL==phead)
        {
            printf("内存分配失败,程序终止!\n");
            exit(-1);
        }
        pnode ptail=phead;//定义一个指向头结点的指针
        ptail->pnext=NULL;//清空指针域
        printf("请输入学生的人数:");
        scanf("%d",&num);
        int i;
        for(i=0;i<num;i++)
        {
            printf("请输入第%d个学生的姓名:",i+1);
            scanf("%s",stu.st.Name);
            printf("请输入第%d个学生的学号:",i+1);
            scanf("%d",&stu.st.Num);
            printf("请输入第%d个学生的计算机成绩:",i+1);
            scanf("%f",&stu.st.Computer);
            printf("请输入第%d个学生的高数成绩:",i+1);
            scanf("%f",&stu.st.Math);
            printf("请输入第%d个学生的大英成绩:",i+1);
            scanf("%f",&stu.st.English);
            stu.st.Total=stu.st.Computer+stu.st.Math+stu.st.English;//计算总分
            stu.st.Ave=stu.st.Total/3.0f;//计算平均分
            pnode pnew=(pnode)malloc(sizeof(node));//为新节点分配内存
            //判断内存是否为空
            if(NULL==pnew)
            {
                printf("内存分配失败,程序终止!\n");
                exit(-1);
            }
            pnew->st=stu.st;//初始化结点的数据域
            ptail->pnext=pnew;//将新结点挂到老结点后
            pnew->pnext=NULL;//清空新结点的指针域
            ptail=pnew;//将ptail移到新结点上
        }
        return phead;
    }
    //显示学生信息
    void Show(pnode phead)
    {
        //定义一个指针用于遍历学生信息
        pnode p=phead->pnext;
        printf("姓名  学号 计算机 高数  大英 总分 平均分\n");
        while(NULL!=p)
        {
            printf("%s    %d    %g    %g    %g   %g    %g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
            p=p->pnext;
        }
    }
    //增加学生信息
    void Add(pnode phead)
    {
        pnode p=phead;
        int i=0;
        struct Student stu;//学生结构体 
        int loc;//插入结点的位置
        printf("请输入插入学生的位置:");
        scanf("%d",&loc);
        while(NULL!=p&&i<loc-1)
        {
            p=p->pnext;
            i++;
        }
        if(NULL==p||i>loc)
        {
            printf("插入结点的位置不存在!\n");
            return;
        }
        printf("你将在第%d个学生后面插入一个学生\n",loc-1);
        printf("请输入第%d个学生的姓名:",loc);
        scanf("%s",stu.Name);
        printf("请输入第%d个学生的学号:",loc);
        scanf("%d",&stu.Num);
        printf("请输入第%d个学生的计算机成绩:",loc);
        scanf("%f",&stu.Computer);
        printf("请输入第%d个学生的高数成绩:",loc);
        scanf("%f",&stu.Math);
        printf("请输入第%d个学生的大英成绩:",loc);
        scanf("%f",&stu.English);
        stu.Total=stu.Computer+stu.Math+stu.English;//计算总分
        stu.Ave=stu.Total/3.0f;//计算平均分
        pnode pnew=(pnode)malloc(sizeof(node));
        if(NULL==pnew)
        {
            printf("动态内存分配失败,程序终止!\n");
            exit(-1);
        }
        pnew->st=stu;
        pnode q=p->pnext;
        p->pnext=pnew;
        pnew->pnext=q;
    }
    //删除学生信息
    void Delete(pnode pHead)
    {
        pnode p = pHead;
        int i = 0;
        int loc;
        printf("请输入你需要删除的学生的编号:");
        scanf("%d",&loc);
        while(NULL!=p->pnext&&i<loc-1)
        {
            p=p->pnext;
            i++;
        }
        if(NULL==p->pnext||i>loc-1)
        {
            printf("没找到需要删除的学生的编号!\n");
            return;
        }
        pnode q=p->pnext;
        p->pnext=q->pnext;
        free(q);
        q==NULL;
        printf("你已经成功删除了第%d个学生的信息!\n",loc);
    }
    //修改学生信息
    void Change(pnode phead)
    {
        char Name[10];
        printf("请输入你需要修改的学生的姓名:");
        scanf("%s",&Name);
        pnode p=phead->pnext;//定义一个指针用于遍历学生信息
        while(NULL!=p)
        {
            if(0==strcmp(Name,p->st.Name))
            {
                printf("姓名  学号 计算机 高数  大英 总分 平均分\n");
                printf("修改前的学生信息!\n");
                printf("%s    %d    %g    %g    %g   %g    %g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
                system("pause");
                system("cls");//清屏
                printf("请输入新的学生姓名:");
                scanf("%s",p->st.Name);
                printf("请输入新的学生学号:");
                scanf("%d",&p->st.Num);
                printf("请输入新的学生的计算机成绩:");
                scanf("%f",&p->st.Computer);
                printf("请输入新的学生的高数成绩:");
                scanf("%f",&p->st.Math);
                printf("请输入新的学生的大英成绩:");
                scanf("%f",&p->st.English);
                p->st.Total=p->st.Computer+p->st.Math+p->st.English;//计算总分
                p->st.Ave=p->st.Total/3.0f;//计算平均分
                 break;
            }
            p=p->pnext;
        }
    }
    //查找学生信息
    void Search(pnode pHead)
    {
        char Name[10];
        printf("请输入你需要查找的学生的姓名:");
        scanf("%s",Name);
        pnode p=pHead->pnext;
        printf("姓名  学号 计算机 高数  大英 总分 平均分\n"); 
        while(NULL!=p)
        {
            if(0==strcmp(Name,p->st.Name))
            {
                printf("%s    %d    %g    %g    %g   %g    %g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
            }
             p=p->pnext;
        }
    }
    //总分排序
    void Sort(pnode phead)
    {
        pnode p, q;//定义两个指针
        node temp;
        for(p=phead->pnext;NULL!=p;p=p->pnext)
        {
            for(q=p->pnext;NULL!=q;q=q->pnext)
              {
                if(p->st.Total<q->st.Total)//当前一个学生的总分小于后一个学生的总分时
                   {
                    temp.st=p->st;//交换学生的位置
                    p->st=q->st;
                    q->st=temp.st;
                }
            }
        }
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月15日
  • 创建了问题 12月10日