用C语言编程实现一个简单的学生成绩管理系统 100

1、原始数据输入和结果输出要求使用文件存放。2、计算没门学生三门课的平均分,并按平均分排名名次,若平均分相同则名次并列;结果写入文件。3、统计全班每门课程的平均分,并计算... 1、原始数据输入和结果输出要求使用文件存放。
2、计算没门学生三门课的平均分,并按平均分排名名次,若平均分相同则名次并列;结果写入文件。3、统计全班每门课程的平均分,并计算各分数段(60以下,60~69,70~79,80~89,90以上)的学生人数;结果写入文件。
4、按格式在屏幕上打印每名学生成绩条。
5、在屏幕上打印出所有不及格学生的下列信息:学号,姓名,不及格的课程名,该不及格课程成绩。
6、在屏幕打印优等生名单(学号,姓名,三门课程成绩,平均成绩,名次),优等生必须满足下列条件:
1)平均成绩大于90分;或平均分大于85分且至少有一门功课为100分;或者平均分大于85分且至少两门课程成绩为95分以上;
2)名次在前三名;
3)每门功课及格以上。
展开
 我来答
百度网友fc027fc
推荐于2017-12-15 · TA获得超过1.1万个赞
知道大有可为答主
回答量:3160
采纳率:83%
帮助的人:766万
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<memory.h>

typedef struct student
{
char num[16];
char name[20];
float score[4];
struct student *next;
} stu;

stu *head;         // 链头指针

stu* create() // 创建链表,从文件读取信息 
{
    printf("Reading student information:\n");
stu *p=NULL; // 指针,指向个待插入的结点
stu *q=NULL; // 指针,用于在其后插入结点
head = NULL; // 一开始链表为空
FILE * r =fopen("input.dat","r"); 
p = (stu*)malloc(sizeof(stu));
while(fscanf(r,"%s%s%f%f%f",p->num,p->name,&p->score[0],&p->score[1],&p->score[2])!=EOF)
{
        p->score[3]=(p->score[0]+p->score[1]+p->score[2])/3.0;
        fprintf(stdout,"%s\t%s\t%g\t%g\t%g\t%.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3]);
        p->next=NULL;
if (head == NULL) // head为空,要插入第一个
        {
    head = p;
        }        // 结点,让头指针指向结点p
else
        { // 否则不是头结点,应将p结点
q->next = p; // 插入到q结点的后面
}
        q = p; // q指向当前最后一个结点
        p = (stu*)malloc(sizeof(stu));
}
    fclose(r);
if (head != NULL)
    {
    q->next = NULL; // 让q所指的最后一个结点的指针域为空说明这已是链尾了
}
    return head; // 返回头指针
}




 
void sort(stu **head,int n)      
{
    FILE *w=NULL;
    if(n==0)
    {
       w = fopen("sortByMath.dat","w");
    }
    else if(n==1)
    {
       w = fopen("sortByEnglish.dat","w");
    }
    else if(n==2)
    {
       w = fopen("sortByComputer.dat","w");
    }
    else if(n==3)
    {
       w = fopen("sortByAvg.dat","w");
    }
    stu *q,*t,*p;    
    stu * new_head = new stu;
    new_head->next=*head;
    p=new_head;
    t=NULL;
    while(t!=new_head->next)
    {
        p=new_head;
        q=p->next;
        while(q->next!=t)   
        {
            if((p->next->score[n]) < (q->next->score[n])) 
            {
                p->next=q->next;    
                q->next=q->next->next;    
                p->next->next=q;    
            }
            p=p->next;
            q=p->next;
        }
        t=q;
    }
    *head = new_head->next;
    
    
    p = *head;
    q = p->next;
    printf("学号\t姓名\t数学\t英语\t计算机\t平均成绩\n");
    int grade = 1; 
    while(p!=NULL)
    {
        fprintf(w,"%s\t%s\t%g\t%g\t%g\t%.2f\t%d\n",
        p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],grade);
        fprintf(stdout,"%s\t%s\t%g\t%g\t%g\t%.2f\t%d\n",
        p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],grade);
        if(q!=NULL && q->score[3] < p->score[3]) grade += 1;
        p=p->next;
        if(q!=NULL) q=q->next;
    }
    printf("\n");
    fclose(w);


void count(stu* head)
{
    float cnt[4][8];
    int i,j;
    for(i=0;i<4;i++)
    {
        for(j=0;j<8;j++)
        {
            if(j!=2)cnt[i][j]=0;
            else cnt[i][j]=100;
        }
    }
    stu* r=head;
    while(r!=NULL)
    {
        r=r->next;
    }
}
int  main( ) 
{
   head=create();
   printf("Sorting by average score:\n");
   sort(&head,3);
   
   system("pause");
   return 0;
}


追问
哈喽……刚刚看到你回复我的问题了 
先谢谢了~
但是能不能请大神帮忙再补充一下在屏幕上打印出所有不及格学生的下列信息:学号,姓名,不及格的课程名,该不及格课程成绩。
阔以的话加QQ说好了…具体看私信阔以么~?
追答
你可调用第一个函数,读取数据存入链表,然后遍历链表就可以了,剩下的都不难。你自己写着看吧。
溺水的鱼_117
2015-06-29 · TA获得超过299个赞
知道小有建树答主
回答量:403
采纳率:0%
帮助的人:176万
展开全部
帮做课程设计,价格白菜,需要的话,回复我
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式