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

1、原始数据输入和结果输出要求使用文件存放。
2、计算没门学生三门课的平均分,并按平均分排名名次,若平均分相同则名次并列;结果写入文件。3、统计全班每门课程的平均分,并计算各分数段(60以下,60~69,70~79,80~89,90以上)的学生人数;结果写入文件。
4、按格式在屏幕上打印每名学生成绩条。
5、在屏幕上打印出所有不及格学生的下列信息:学号,姓名,不及格的课程名,该不及格课程成绩。
6、在屏幕打印优等生名单(学号,姓名,三门课程成绩,平均成绩,名次),优等生必须满足下列条件:
1)平均成绩大于90分;或平均分大于85分且至少有一门功课为100分;或者平均分大于85分且至少两门课程成绩为95分以上;
2)名次在前三名;
3)每门功课及格以上。

#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说好了…具体看私信阔以么~?

追答

你可调用第一个函数,读取数据存入链表,然后遍历链表就可以了,剩下的都不难。你自己写着看吧。

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-06-29
帮做课程设计,价格白菜,需要的话,回复我
相似回答