求会的c语言大神帮我做一下 真的很急。。

学生成绩与奖学金评定系统主要实现对学生的成绩进行查询和管理。要求用结构体完成。
基本功能:
(1)学生基本数据的管理(包括学号、姓名、班级)。可以实现对学生信息的添加、删除和修改功能。
(2)成绩的管理(科目包括英语、数学和C++语言等)
(3)要求可添加、删除、查询、修改学生的信息,以及浏览学生的全部信息。
(4)总成绩统计(每个学生的总成绩、平均成绩)
(5)奖学金评定(本系统可评定两个奖项:1.“学习标兵”评定方法为:单科成绩必须达75分以上(包括75分)、总分成绩居本班第一者;2.“三好学生”评定方法为满足以下所有条件者:单科成绩必须达75分以上(包括75分)、总成绩居本班前5%、评定为“学习标兵”的学生不能参与此项评比)

采用链表实现的,自己编译运行通过。编译环境ubuntu+gcc4.8.4

如果想少输入几个人员信息看看效果,就将pernum的值修改大些,当然不要大于1

#include <stdio.h>
#define pernum 0.05
//定义结构体,该结构体被用来存储总分及平均分,为了保存函数calStuMarkByNo以及函数calStuMarkByStu的返回值
struct sumandavg
{
    int allmark;
    int avgmark;
};
//定义结构体,用以存储各科成绩
struct stumark
{
    int englishmark;
    int mathmark;
    int cppmark;
};
//定义结构体,包括学生信息以及一个各科成绩的结构体变量,以及一个Next指针
struct student
{
    char* stuno;
    char* name;
    char* classname;
    struct stumark mark;
    struct student* next;
};
//定义两个结构体指针,一个为链表头指针,一个为指向当前正在操作的结构体变量
struct student* head=NULL;
struct student* current=NULL;
//将学生变量添加到链表,参数为指向student结构体变量的指针
void addStudent(struct student* stu)
{
    if(head==NULL)
    {
        head=stu;
        current=stu;
        stu->next=NULL;
    }
    else
    {
        current->next=stu;
        current=stu;
        stu->next=NULL;
    }
}
//从链表中删除学生,参数为学生的学号,未对不存在的学号进行提示,直接忽略
void deleteStudent(char* no)
{
    struct student* ptr=head;
    while(ptr!=NULL)
    {
        if(ptr->next!=NULL && !strcmp(ptr->next->stuno,no))
        {
            ptr->next=ptr->next->next;
            return;
        }
        else if(ptr->next==NULL)
        {
            head=NULL;
            ptr=NULL;
        }
        else
        {
            ptr=ptr->next;
        }
    }
}
//通过学生学号查询学生信息,参数为学生学号
void queryStuInfo(char* no)
{
    struct student* ptr=head;
    while(ptr!=NULL)
    {
        if(!strcmp(ptr->stuno,no))
        {
            printf("student no.:%s  name:%s  class:%s  english mark:%d  math mark:%d  cpp mark:%d\n",
                   ptr->stuno,ptr->name,ptr->classname,ptr->mark.englishmark,ptr->mark.mathmark,ptr->mark.cppmark);
            return;
        }
        else
        {
            ptr=ptr->next;
        }
    }

}
//修改学生信息,参数为学生学号
void changeStudentInfo(char* no)
{
    struct student* ptr=head;
    while(ptr!=NULL)
    {
        if(!strcmp(ptr->stuno,no))
        {
            queryStuInfo(no);
            break;
        }
        else
        {
            ptr=ptr->next;
        }
    }
    int menuid;
    printf("please select the item which you want to change:\n\
          1、学号\n\
          2、姓名\n\
          3、班级\n\
          4、英语成绩\n\
          5、数学成绩\n\
          6、C++成绩\n\
          0、放弃修改\n");
    scanf("%d",&menuid);
    switch (menuid) {
    case 1:
    {
        printf("please input new student no.:\n");
        char* tmp=(char*)malloc(20*sizeof(char));;
        scanf("%s",tmp);
        ptr->stuno=tmp;
        break;
    }
    case 2:
    {
        printf("please input new student name:\n");
        char* tmp=(char*)malloc(20*sizeof(char));;
        scanf("%s",tmp);
        ptr->name=tmp;
        break;
    }
    case 3:
    {
        printf("please input new class:\n");
        char* tmp=(char*)malloc(20*sizeof(char));;
        scanf("%s",tmp);
        ptr->classname=tmp;
        break;
    }
    case 4:
    {
        printf("please input new english mark:\n");
        int tmp;
        scanf("%d",&tmp);
        ptr->mark.englishmark=tmp;
        break;
    }
    case 5:
    {
        printf("please input new math mark:\n");
        int tmp;
        scanf("%d",&tmp);
        ptr->mark.mathmark=tmp;
        break;
    }
    case 6:
    {
        printf("please input new cpp mark:\n");
        int tmp;
        scanf("%d",&tmp);
        ptr->mark.cppmark=tmp;
        break;
    }
    case 0:
    {
        return;
    }
    default:
        break;
    }
}
//计算单个学生成绩,包括总成绩及平均成绩,参数为学生学号,返回值为结构体sumandavg的指针
struct sumandavg* calStuMarkByNo(char* no)
{
    struct student* ptr=head;
    struct sumandavg tmpsamark;
    while(ptr!=NULL)
    {
        if(!strcmp(ptr->stuno,no))
        {
            tmpsamark.allmark=ptr->mark.cppmark+ptr->mark.englishmark+ptr->mark.mathmark;
            tmpsamark.avgmark=tmpsamark.allmark/3;
            return &tmpsamark;
        }
        else
        {
            ptr=ptr->next;
        }
    }
    return NULL;
}
//计算单个学生成绩,包括总成绩及平均成绩,参数为student结构体指针,返回值为sumandavg结构体的指针
struct sumandavg* calStuMarkByStu(struct student* stu)
{
    struct sumandavg tmpsamark;
    tmpsamark.allmark=stu->mark.cppmark+stu->mark.englishmark+stu->mark.mathmark;
    tmpsamark.avgmark=tmpsamark.allmark/3;
    return &tmpsamark;
}
/*获取学习标兵及三好学生,本打算通过链表排序来实现,奈何水平有限,对链表的操作不熟,只能用下面的方法了*/
void getFirstAndPer5()
{
    struct student* ptr=head;
    struct student* first=head;//用于保存最高分的信息
    int stunum=0;
//通过while循环计算出学生数量
    while(ptr!=NULL)
    {
        stunum++;
        ptr=ptr->next;
    }
//计算符合比例情况下,学习标兵以及三好学生的总数,然后malloc总数个结构体内存空间
    int threegoodstu=stunum*pernum+1;
    struct student* per5=(struct student*)malloc(threegoodstu*sizeof(struct student));

    ptr=head;
    int i=0;
//遍历链表,将符合要求的学生与first比较,比first大的替换掉first,这样first保持的就是总分最高的人,同时将所有符合要求的学生保存在分配好的内存中
    while(ptr!=NULL)
    {
        if(ptr->mark.cppmark>=75 && ptr->mark.englishmark>=75 && ptr->mark.mathmark>=75)
        {
            struct sumandavg ptrsa,firstsa;
            ptrsa.allmark=ptr->mark.cppmark+ptr->mark.mathmark+ptr->mark.englishmark;
            firstsa.allmark=first->mark.cppmark+first->mark.englishmark+first->mark.mathmark;
            if(ptrsa.allmark>firstsa.allmark)
            {
                first=ptr;
            }
            *(per5+i)=*ptr;
            i++;
        }
        ptr=ptr->next;
    }
    printf("学习标兵:%s\n",first->stuno);
    int j=0;
    for(;j<i;j++)
    {
        if(strcmp((per5+j)->stuno,first->stuno))
        {
            printf("三好学生:%s\n",(per5+j)->stuno);
        }
    }
}
int main(void)
{
    int menuid;
    while(1)
    {
        if(head==NULL)
        {
            printf("1、添加学生信息\n0、退出\n");
        }
        else
        {
        printf("1、添加学生信息\n\
2、删除学生信息\n\
3、查询学生信息\n\
4、修改学生信息\n\
5、浏览所有学生信息\n\
6、查看所有学生总成绩及平均成绩\n\
7、查看“学习标兵”及“三好学生”\n\
0、退出\n");
        }
        scanf("%d",&menuid);
        switch(menuid)
        {
            case 1:
            {
                struct student* tmpstu=(struct student*)malloc(sizeof(struct student));
                printf("please input student no.:\n");
                tmpstu->stuno=(char*)malloc(20*sizeof(char));
                scanf("%s",tmpstu->stuno);
                printf("please input the name:\n");
                tmpstu->name=(char*)malloc(20*sizeof(char));
                scanf("%s",tmpstu->name);
                printf("please input student class:\n");
                tmpstu->classname=(char*)malloc(20*sizeof(char));
                scanf("%s",tmpstu->classname);
                printf("please input the math mark:");
                scanf("%d",&tmpstu->mark.mathmark);
                printf("please input the english mark:");
                scanf("%d",&tmpstu->mark.englishmark);
                printf("please input the cpp mark:");
                scanf("%d",&tmpstu->mark.cppmark);
                addStudent(tmpstu);
                break;
            }
            case 2:
            {
                printf("please input the student no. which you want to delete:\n");
                char* tmpch=(char*)malloc(20*sizeof(char));
                scanf("%s",tmpch);
                deleteStudent(tmpch);
                break;
            }
            case 3:
            {
                printf("please input the student no. which you want to query:\n");
                char* tmpch=(char*)malloc(20*sizeof(char));
                scanf("%s",tmpch);
                queryStuInfo(tmpch);
                break;
            }
            case 4:
            {
                printf("please input the student no. which you want to change:\n");
                char* tmpch=(char*)malloc(20*sizeof(char));
                scanf("%s",tmpch);
                changeStudentInfo(tmpch);
                break;
            }
            case 5:
            {
                struct student* ptr=head;
                while(ptr!=NULL)
                {
                    printf("student no.:%s  name:%s  class:%s  english mark:%d  math mark:%d  cpp mark:%d\n",
                           ptr->stuno,ptr->name,ptr->classname,ptr->mark.englishmark,ptr->mark.mathmark,ptr->mark.cppmark);
                    ptr=ptr->next;
                }
                break;
            }
            case 6:
            {
                struct student* ptr=head;
                while(ptr!=NULL)
                {
                    struct sumandavg* tmpsa;
                    tmpsa=calStuMarkByStu(ptr);
                    printf("%s:  totalscore:%d averagescore:%d\n",ptr->stuno,tmpsa->allmark,tmpsa->avgmark);
                    ptr=ptr->next;
                }
                break;
            }
            case 7:
            {
                getFirstAndPer5();
                break;
            }
            case 0:
            {
                exit(0);
            }
            default:
                continue;
        }
    }
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-04-21
#include "stdio.h"

#include"string"

/*定义学生结构体*/

struct Student

{

     char ID[20];

     char Name[20];

     float Mark1;

     float Mark2;

     float Mark3;

     float Average;

};


/*声明学生数组及学生数量*/

struct Student students[1000];

int num=0;

 

/*求平均值*/

float Avg(struct Student stu)

{

     return (stu.Mark1+stu.Mark2+stu.Mark3)/3;

}

 

/*通过学号返回数组下标*/

int Student_SearchByIndex(char id[])

{

     int i;

     for (i=0;i<num;i++)

     {

         if (strcmp(students[i].ID,id)==0)

         {

              return i;

         }

     }

     return -1;

}

 

/*通过姓名返回数组下标*/

int Student_SearchByName(char name[])

{

     int i;

     for (i=0;i<num;i++)

     {

         if (strcmp(students[i].Name,name)==0)

         {

              return i;

         }

     }

     return -1;

}

 

/*显示单条学生记录*/

void Student_DisplaySingle(int index)

{

     printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");

     printf("-------------------------------------------------------------\n");

     printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[index].ID,students[index].Name,

              students[index].Mark1,students[index].Mark2,students[index].Mark3,students[index].Average);

}

 

/*插入学生信息*/

void Student_Insert()

{

     while(1)

     {

         printf("请输入学号:");

         scanf("%s",&students[num].ID);

         getchar();

 

         printf("请输入姓名:");

         scanf("%s",&students[num].Name);

         getchar();

 

         printf("请输入成绩:");

         scanf("%f",&students[num].Mark1);

         getchar();

 

         printf("请输入成绩:");

         scanf("%f",&students[num].Mark2);

         getchar();

 

         printf("请输入成绩:");

         scanf("%f",&students[num].Mark3);

         getchar();

 

         students[num].Average=Avg(students[num]);

         num++;

 

         printf("是否继续?(y/n)");

         if (getchar()=='n')

         {

              break;

         }

     }

 

}

 

/*修改学生信息*/

void Student_Modify()

{

     //float mark1,mark2,mark3;

     while(1)

     {

         char id[20];

         int index;

         printf("请输入要修改的学生的学号:");

         scanf("%s",&id);

         getchar();

         index=Student_SearchByIndex(id);

         if (index==-1)

         {

              printf("学生不存在!\n");

         }

         else

         {

              printf("你要修改的学生信息为:\n");

              Student_DisplaySingle(index);

              printf("-- 请输入新值--\n");


              printf("请输入学号:");

              scanf("%s",&students[index].ID);

              getchar();


              printf("请输入姓名:");

              scanf("%s",&students[index].Name);

              getchar();


              printf("请输入成绩:");

              scanf("%f",&students[index].Mark1);

              getchar();


              printf("请输入成绩:");

              scanf("%f",&students[index].Mark2);

              getchar();


              printf("请输入成绩:");

              scanf("%f",&students[index].Mark3);

              getchar();


              students[index].Average=Avg(students[index]);

         }

         printf("是否继续?(y/n)");

         if (getchar()=='n')

         {

              break;

         }

     }

}

 

/*删除学生信息*/

void Student_Delete()

{

     int i;

     while(1)

     {

         char id[20];

         int index;

         printf("请输入要删除的学生的学号:");

         scanf("%s",&id);

         getchar();

         index=Student_SearchByIndex(id);

         if (index==-1)

         {

              printf("学生不存在!\n");

         }

         else

         {

              printf("你要删除的学生信息为:\n");

              Student_DisplaySingle(index);

              printf("是否真的要删除?(y/n)");

              if (getchar()=='y')

              {

                   for (i=index;i<num-1;i++)

                   {

                       students[i]=students[i+1];//把后边的对象都向前移动

                   }

                   num--;

              }

              getchar();

         }

         printf("是否继续?(y/n)");

         if (getchar()=='n')

         {

              break;

         }

     }

}

 

/*按姓名查询*/

void Student_Select()

{

     while(1)

     {

         char name[20];

         int index;

         printf("请输入要查询的学生的姓名:");

         scanf("%s",&name);

         getchar();

         index=Student_SearchByName(name);

         if (index==-1)

         {

              printf("学生不存在!\n");

         }

         else

         {

              printf("你要查询的学生信息为:\n");

              Student_DisplaySingle(index);

         }

         printf("是否继续?(y/n)");

         if (getchar()=='n')

         {

              break;

         }

     }

}

 

/*按平均值排序*/

void Student_SortByAverage()

{

     int i,j;

     struct Student tmp;

     for (i=0;i<num;i++)

     {

         for (j=1;j<num-i;j++)

         {

              if (students[j-1].Average<students[j].Average)

              {

                   tmp=students[j-1];

                   students[j-1]=students[j];

                   students[j]=tmp;

              }

         }

     }

}

 

/*显示学生信息*/

void Student_Display()

{

     int i;

     printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");

     printf("-------------------------------------------------------------\n");

     for (i=0;i<num;i++)

     {

         printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[i].ID,students[i].Name,

              students[i].Mark1,students[i].Mark2,students[i].Mark3,students[i].Average);

     }

}

 

/*将学生信息从文件读出*/

void IO_ReadInfo()

{

     FILE *fp;

     int i;

     if ((fp=fopen("Database.txt","rb"))==NULL)

     {

         printf("不能打开文件!\n");

         return;

     }

     if (fread(&num,sizeof(int),1,fp)!=1)

     {

         num=-1;

     }

     else

     {

         for(i=0;i<num;i++)

         {

              fread(&students[i],sizeof(struct Student),1,fp);

         }

     }

     fclose(fp);

}

 

/*将学生信息写入文件*/

void IO_WriteInfo()

{

     FILE *fp;

     int i;

     if ((fp=fopen("Database.txt","wb"))==NULL)

     {

         printf("不能打开文件!\n");

         return;

     }

     if (fwrite(&num,sizeof(int),1,fp)!=1)

     {

         printf("写入文件错误!\n");

     }

     for (i=0;i<num;i++)

     {

         if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1)

         {

              printf("写入文件错误!\n");

         }

     }    

     fclose(fp);

}

 

 

/*主程序*/

void main()

{

     int choice;

     IO_ReadInfo();

     while(1)

     {

         /*主菜单*/

         printf("\n------ 学生成绩管理系统------\n");

         printf("1. 增加学生记录\n");

         printf("2. 修改学生记录\n");

         printf("3. 删除学生记录\n");

         printf("4. 按姓名查询学生记录\n");

         printf("5. 按平均成绩排序\n");

         printf("6. 退出\n");

         printf("请选择(1-6):");

         scanf("%d",&choice);

         getchar();

         switch(choice)

         {

         case 1:

              Student_Insert();

              break;

         case 2:

              Student_Modify();

              break;

         case 3:

              Student_Delete();

              break;

         case 4:

              Student_Select();

              break;

         case 5:

              Student_SortByAverage();

              Student_Display();

              break;

         case 6:

              exit(0);

              break;

         }

         IO_WriteInfo();

     }

}
</span>

本回答被网友采纳
相似回答