| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 876 人关注过本帖, 1 人收藏
标题:c语言用结构体编的学生成绩管理系统,有问题
只看楼主 加入收藏
渭北春天树gh
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-5-1
收藏(1)
 问题点数:0 回复次数:6 
c语言用结构体编的学生成绩管理系统,有问题
每一条记录包含一个学生的学号、姓名、5门成绩、平均成绩、名次
一次可以完成若干条记录的输入
完成全部学生信息的显示
完成按学号或者姓名查找学生信息并显示
按学生的平均成绩排序
------------------------------
求救 我想加个名次  这个好难啊  怎么办 我加了一个rank 就不知道怎么办了
------------------------------
#include<stdio.h>/*标准输入输出函数库*/
#include<malloc.h>//分配动态内存
#include<stdlib.h>/*标准函数库*/
#include<string.h>/*字符串函数库*/

typedef struct info//命名一个新的类型代表结构体类型
{
    char studentNumber[10];
    char studentName[20];
    char className[20];
    float grade1;
    float grade2;
    float grade3;
    float grade4;
    float grade5;
    float sum;
    float rank;
}info;//info为变量名

typedef struct STUDENT//命名一个新的类型代表结构体类型
{
    info stu;
    struct STUDENT *next;//*next可以指向 struct STUDENT 类型的变量或数组元素
}STUDENT;


STUDENT *headLink;//全局变量
/*以下是函数声明 */
void DisplayMenu(void);
void CreateHeadLink(void);//建立链表表头
STUDENT *MallocNode(void);
void GetInformation(STUDENT *t);//输入信息
void DisplayInfoBystudentName(void);//输入姓名显示学生信息
void DisplayInfoBystudentNumber(void);//输入学号显示学生信息
void DisplayOneNode(STUDENT *t);//显示节点信息
void InsertOneNode(STUDENT *t);//在链表结尾加入新节点
void DeleteNodeBystudentNumber(void);//按学号删除学生信息
void Print();//显示
int choose;/*用语接收用户的选择*///全局变量


/*主函数*/
void main()
{
    CreateHeadLink();//链表
    DisplayMenu();//显示菜单
}

void Print()//显示所有学生信息
{
    STUDENT *t;
    t=headLink->next;
    while(t)
    {
        printf("学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\名次\n\n");
        DisplayOneNode(t);//调用
        t=t->next;

    }
    return;
}

/*排序*/
void Sort()/*递减排序函数:入口参数:链表的头指针,为次链表中的排序函数*/
{
    STUDENT *p,*q;
    STUDENT temp;
    p=q=(STUDENT*)malloc(sizeof(STUDENT));
    p=headLink->next;
    for(;p!=NULL;p=p->next)//类似冒泡法
    {
        for(q=p->next;q!=NULL;q=q->next)
        {
            if(p->stu.sum<q->stu.sum)
            {
                temp.stu=q->stu;
                q->stu=p->stu;
                p->stu=temp.stu;
            }
        }
    }
    Print();
    return;
}






//函数功能,显示菜单
void DisplayMenu(void)
{
    STUDENT *p;
    printf("\t\t-----请选择相应选项-----\n\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 0 退出|\n");
    scanf("%d",&choose);/*取得用户的选择*/
    switch(choose)
    {
    case 1:
        Print();/*显示所有学生的信息*/
        break;
    case 2:
        DisplayInfoBystudentName();
        break;
    case 3:
        DisplayInfoBystudentNumber();
        break;
    case 4:
        p=MallocNode();/*先申请一个新的节点*/
        GetInformation(p);/*要求用户输入信息到新的节点中*/
        InsertOneNode(p);/*将新节点加到链表中*/
        break;
    case 5:
        DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
        break;
    case 6:
        Sort();break;
    case 0:
        exit(1);
    default:
        printf("请重新输入!\n");
        break;
    }
    DisplayMenu();//递归调用
}


/*函数功能 建立链表表头*/
void CreateHeadLink(void)
{
    STUDENT *p;
    p=(STUDENT*)malloc(sizeof(STUDENT));//分配内存空间
    headLink=p;
    p->next=NULL;

}



//函数功能申请一个新节点
STUDENT *MallocNode(void)
{
    STUDENT *p;
    int i;
    p=(STUDENT*)malloc(sizeof(STUDENT));
    if(p==NULL)
        return NULL;
    for(i=0;i<10;i++)
        p->stu.studentNumber[i]='\0';
    for(i=0;i<20;i++)
        p->stu.studentName[i]='\0';
    for(i=0;i<20;i++)
        p->stu.className[i]='\0';
    p->stu.grade1=0.0;
    p->stu.grade2=0.0;
    p->stu.grade3=0.0;
    p->stu.grade4=0.0;
    p->stu.grade5=0.0;
    p->stu.sum=0.0;
    p->stu.rank=0.0;
    p->next=NULL;
    return p;
}



//函数功能  取得学生信息
void GetInformation(STUDENT *t)
{
    printf("请输入学生学号:\n");
    scanf("%s",t->stu.studentNumber);
    printf("请输入学生的姓名:\n");
    scanf("%s",t->stu.studentName);
    printf("请输入学生的班级:\n");
    scanf("%s",t->stu.className);
    printf("请输入第一门成绩:\n");
    scanf("%f",&(t->stu.grade1));
    printf("请输入第二门成绩:\n");
    scanf("%f",&(t->stu.grade2));
    printf("请输入第三门成绩:\n");
    scanf("%f",&(t->stu.grade3));
    printf("请输入第四门成绩:\n");
    scanf("%f",&(t->stu.grade4));
    printf("请输入第五门成绩:\n");
    scanf("%f",&(t->stu.grade5));
    t->stu.sum=t->stu.grade1+t->stu.grade2+t->stu.grade3+t->stu.grade4+t->stu.grade5;
}



//在链表的结尾处加一个节点
void InsertOneNode(STUDENT *t)
{
    STUDENT *p;
    p=headLink;
    while(p->next)
    {
        p=p->next;
    }
    p->next=t;
}



//函数的功能 根据用户输入的学生姓名显示该学生信息
void DisplayInfoBystudentName(void)
{
    STUDENT *p;
    char studentName[20];
    char flag=0;
    p=headLink->next;
    printf("请输入学生的姓名;\n");
    scanf("%s",studentName);
    while(p)
    {
        if(strcmp(p->stu.studentName,studentName)==0)
        {
            printf("学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
            DisplayOneNode(p);
            flag=1;
            break;
        }
        p=p->next;
    }
    if(!flag)
        printf("对不起,不存在姓名为%s 的学生\n",studentName);
}


//根据用户输入的学号显示该学生的信息
void DisplayInfoBystudentNumber(void)
{
    STUDENT *p;
    char studentNumber[10];
    char flag=0;
    p=headLink->next;
    printf("请输入学生的学号\n");
    scanf("%s",studentNumber);
    while(p)
    {
        if(strcmp(p->stu.studentNumber,studentNumber)==0)
        {
            printf("学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
            DisplayOneNode(p);
            flag=1;
            break;
        }
        p=p->next;
    }
    if(!flag)
        printf("对不起,不存在学号为%s 的学生\n",studentNumber);
}




//输出一个节点的信息
void DisplayOneNode(STUDENT *t)
{
    printf("%s\t",t->stu.studentNumber);
    printf("%s\t",t->stu.studentName);
    printf("%s\t",t->stu.className);
    printf("%.2f\t",t->stu.grade1);
    printf("%.2f\t",t->stu.grade2);
    printf("%.2f\t",t->stu.grade3);
    printf("%.2f\t",t->stu.grade4);
    printf("%.2f\t",t->stu.grade5);
    printf("%.2f\t",t->stu.sum);
    printf("%.2f\t\n",(t->stu.sum)/5);
}


//根据用户输入的学号删除该学生
void DeleteNodeBystudentNumber(void)
{
    char studentNumber[10];
    STUDENT *p,*q;
    char flag=0;
    printf("请输入你要删除的学号;");
    scanf("%s",studentNumber);
    p=headLink;
    q=headLink->next;
    while(q)
    {
        if(strcmp(q->stu.studentNumber,studentNumber)==0)
        {
            p->next=q->next;
            free(q);
            flag=1;
            break;
        }
        p=p->next;
        q=q->next;
    }
    if(!flag)
    {
        printf("不存在该学生");
        return;
    }
    printf("成功删除\n");
}
搜索更多相关主题的帖子: 管理系统 include 结构体 字符串 c语言 
2015-07-11 17:38
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
坛里一堆类似的帖子,搜索一下

梦想拥有一台龙芯3A-4000
2015-07-11 20:10
渭北春天树gh
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-5-1
收藏
得分:0 
就加一个名次  大神们  求救啊
2015-07-11 21:02
T_MACC
Rank: 4
等 级:业余侠客
威 望:8
帖 子:99
专家分:211
注 册:2015-4-14
收藏
得分:0 
哪有错呢
2015-07-12 12:50
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
名次为什么要用float呢?还有第1.5名吗?

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2015-07-12 13:52
渭北春天树gh
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-5-1
收藏
得分:0 
这些都是小事啊   怎么加排名呢
2015-07-12 16:00
悦梧
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-12-3
收藏
得分:0 
排名不放结构体中,不进行存储,只显示。
2016-12-05 09:09
快速回复:c语言用结构体编的学生成绩管理系统,有问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012733 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved