📄 kecheng.txt
字号:
#include<stdio.h>
#include<malloc.h>
#define m 4 //课程数
#define NULL 0
typedef struct stnode //学生结点类型
{
int id; //学号
char name[16]; //姓名
int subject[m]; //课程数据组
float ave; //个人课程平均分
struct stnode *next; //指针域
}students;
students *head; //head为学生链表的头指针
int n;
void order()
{
int j; //课程序号
students *p,*q,*r,*h;
printf("请输入需排序的功课序号(1~~4):\n");
scanf("%d",&j);
q=head->next->next;
head->next->next=NULL;
p=q;
while(p)
{
q=q->next;
h=head;
r=h->next; //r指向首元结点
if(p->subject[j-1]>r->subject[j-1])
{
p->next=r;
h->next=p;
}
else //否则插入r结点的后面
{
while((p->subject[j-1]<r->subject[j-1])&&r); //继续在r后面查找插入p结点的合适位置
{
h=r;
r=r->next;
}
if(r) //找到比p结点小的结点,将p结点插在它前面
{
p->next=r;
h->next=p;
h=p;
}
else //没找到比p结点小的结点,将p结点插在head链表末
{
p->next=NULL;
h->next=p;
r=p;
}
}
p=q; //继续对其他结点进行排序
}
printf("所有学生功课 %d 的顺序是:\n",j);
p=head->next;
while(p) //输出按课程j-1成绩排名的所有学生姓名和课程j-1的成绩
{
printf("姓名:%s 成绩:%d\n",p->name,p->subject[j-1]);
p=p->next;
}
}
void average()
{
int i,j;
float sum,aver;
students *p;
printf("Subject Average result\n");
printf("*******Subject******Subject Average******\n");
for(i=0;i<m;i++) //统计课程的平均成绩
{
j=0;
sum=0;
p=head->next;
while(p)
{
sum=sum+p->subject[i];
p=p->next;
j++;
}
aver=sum/j;
printf(" Subject %d %16.2f/n",i+1,aver);
}
printf("*****************************\n\n");
}
void nopass() //查找所有课程当中有成绩不及格的学生,并输出其姓名、学号及所有成绩
{
int i;
students *p;
p=head->next;
printf("NO Pass result\n");
printf("**********ID*********Name***********Subject****************Average***\n");
while(p)
{
i=0; //从课程1开始查找
while(i<m)
{
if(p->subject[i]<60) //如果不及格,则输出学生所有信息
{
printf("%8d%10s",p->id,p->name);
for(i=0;i<m;i++)
printf("%6d",p->subject[i]);
printf("%8.2f\n",p->ave);
break; //学生只要有一门课程不及格就查找成功,不再比较其他课程,跳出循环
}
else
i++; //查找下一门课程
}
p=p->next;
}
printf("*******************************************\n\n");
}
void over90()
{
students *p;
int k=0;
p=head->next;
while(p->next) //从首元结点开始查找
{
if(p->ave>=90.0)
{
printf("\n");
printf("average over 90 its id is %d\n",p->id);
p=p->next;
k=1;
}
else
p=p->next;
}if(!k)
printf("没有平均分超过90分的学生\n");
}
void main()
{
students *p,*q;
int i,j,select,flag=1;
float sum;
head=(students *)malloc(sizeof(students)); //生成一个头结点
printf("please student num!\n");
scanf("%d",&n);
head->next=(students *)malloc(sizeof(students));
q=head->next;
for(i=0;i<n;i++) //输入n学生的姓名、学号、所有课程的成绩
{
printf("input student %d its ID,name\n",i+1);
p=q;
scanf("%d\n",&p->id); //输入学号
scanf("%s",&p->name);
printf("\n");
printf("input student %i its score of 4 subject\n",i+1);
for(j=0;j<m;j++) //输入一个学生的所有各门课程的成绩
scanf("%d",&p->subject[j]);
q=(students *)malloc(sizeof(students));
q->next=NULL;
p->next=q;
}
p=head->next;
for(i=0;i<n-1;i++) //查找链表最后的空结点
p=p->next;
p->next=NULL;
p=head->next;
while(p) //求每个学生的个人平均成绩
{
sum=0;
for(j=0;j<m;j++)
sum=sum+p->subject[j];
p->ave=sum/m;
p=p->next;
}
while(flag)
{
printf("********************************************\n");
printf("1----求每门课程的平均成绩\n");
printf("2----输出有课程不及格功的学生情况\n");
printf("3----输出个人平均分超过90分的学生学号\n");
printf("4----所有学生对指定课程排名\n");
printf("5----退出\n");
printf("\n");
printf("请选择(1-5):");
scanf("%d",&select);
switch(select)
{
case 1: average();break;
case 2: nopass();break;
case 3: over90();break;
case 4: order();break;
case 5: flag=0;break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -