最后一步输出时候只有数学成绩对人,其他的都不对
求指点
蚌埠住了
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct student{ //typedef定义类型*stu
int num;
char Name[15];
int Math;
int Physics;
int English;
int C;
struct student *next; //链表形式
}*stu;
stu creat(); //创建链表,以链表形式储存学生成绩信息
void sort(stu s); //按学科排名
int main()
{
stu p,q,a1,a2,a3,a4;
int r; //r用来统计学生人数
float sum; //单门学科成绩总和
p=creat(); //创建链表
a1=p;
a2=p;
a3=p;
a4=p;
stu p1;
int t1,t2;
char choice[10];
for(sum=0,r=0,p1=p;p1!=NULL;p1=p1->next)
{
sum+=p1->Math; //数学成绩总和
r++;
}
printf("数学平均分为:%.1f\n",sum/r); //数学平均分
for(sum=0,r=0,p1=p;p1!=NULL;p1=p1->next)
{
sum+=p1->Physics; //物理成绩总和
r++;
}
printf("物理平均分为:%.1f\n",sum/r); //物理平均分
for(sum=0,r=0,p1=p;p1!=NULL;p1=p1->next)
{
sum+=p1->English; //英语成绩总和
r++;
}
printf("英语平均分为:%.1f\n",sum/r); //英语平均分
for(sum=0,r=0,p1=p;p1!=NULL;p1=p1->next)
{
sum+=p1->C; //C语言成绩总和
r++;
}
printf("C语言平均分为:%.1f\n",sum/r); //C语言平均分
sort(p); //按某一门学科成绩排序
int n,m;
int max1=p->Math; //比较数学成绩最大
int max_num1[10]; //存放学生学号
max_num1[0]=p->num; //先令最大为第一个学生
char max_name1[10][10]; //存放学生姓名
for(q=p;q!=NULL;q=q->next){
if(max1<q->Math){
max1=q->Math;
}
}
for(q=p,n=0;q!=NULL;q=q->next)
{
if((q->Math)==max1){
max_num1[n]=q->num;
strcpy(max_name1[n],q->Name);
n++;
}
}
printf("数学成绩最高的为:\n");
for(m=0;m<n;m++){
printf("%d %s\n",max_num1[m],max_name1[m]);
}
int max2=a1->English; //比较英语成绩最大
int max_num2[10]; //存放学生学号
max_num2[0]=a1->num; //先令最大为第一个学生
char max_name2[10][10]; //存放学生姓名
for(q=a1;q!=NULL;q=q->next){
if(max2<q->Math){
max2=q->Math;
}
}
for(q=a1,n=0;q!=NULL;q=q->next)
{
if((q->English)==max2){
max_num2[n]=q->num;
strcpy(max_name2[n],q->Name);
n++;
}
}
printf("英语成绩最高的为:\n");
for(m=0;m<n;m++){
printf("%d %s\n",max_num2[m],max_name2[m]);
}
int max3=a2->C; //比较C语言成绩最大
int max_num3[10]; //存放学生学号
max_num3[0]=a2->num; //先令最大为第一个学生
char max_name3[10][10]; //存放学生姓名
for(q=a2;q!=NULL;q=q->next){
if(max3<q->C){
max3=q->C;
}
}
for(q=a2,n=0;q!=NULL;q=q->next)
{
if((q->C)==max3){
max_num3[n]=q->num;
strcpy(max_name3[n],q->Name);
n++;
}
}
printf("C语言成绩最高的为:\n");
for(m=0;m<n;m++){
printf("%d %s\n",max_num3[m],max_name3[m]);
}
int max4=a3->Physics; //比较物理成绩最大
int max_num4[10]; //存放学生学号
max_num4[0]=a3->num; //先令最大为第一个学生
char max_name4[10][10]; //存放学生姓名
for(q=a3;q!=NULL;q=q->next){
if(max4<q->Physics){
max4=q->Physics;
}
}
for(q=a3,n=0;q!=NULL;q=q->next)
{
if((q->Physics)==max4){
max_num4[n]=q->num;
strcpy(max_name4[n],q->Name);
n++;
}
}
printf("物理成绩最高的为:\n");
for(m=0;m<n;m++){
printf("%d %s\n",max_num4[m],max_name4[m]);
}
}
stu creat()
{
stu s;
int r,a;
stu p1,p2;
printf("请输入学生人数:");
scanf("%d",&r);
getchar(); //吸收scanf遗留的回车
s=p1=p2=(stu)malloc(sizeof(struct student)); //开辟内存
printf("请输入学生学号和姓名:");
scanf("%d %s",&p1->num,&p1->Name); //输入学生信息
getchar();
printf("输入学生数学、物理、英语、C语言成绩:");
scanf("%d %d %d %d",&p1->Math,&p1->Physics,&p1->English,&p1->C); //分别输入成绩
for(a=0;a<r-1;a++) //信息存储达到人数个数
{
p1=(stu) malloc(sizeof(struct student)); //再次开辟内存
printf("请输入学生学号和姓名:");
scanf("%d %s",&p1->num,&p1->Name); //输入信息
getchar();
printf("输入学生数学、物理、英语、C语言成绩:");
scanf("%d %d %d %d",&p1->Math,&p1->Physics,&p1->English,&p1->C); //输入成绩
getchar();
p2->next=p1; //指针后移
p2=p1;
}
p2->next=NULL; //直到表尾
return s; //返回链表的指针
}
void sort(stu s)
{
char t1[10];
int t,t2; //用于排序交换时暂时存储数字
char choice[10];
stu p=s; //p和q指向表头
stu q=s;
printf("请选择按照哪一门成绩排序:");
gets(choice); //选择要排序的学科
if(0==strcmp("Math",choice)){
while(p!=NULL)
{
q=p->next;
while(q)
{
if(p->Math<q->Math) //按数学成绩排序
{
strcpy(t1,p->Name);
strcpy(p->Name,q->Name);
strcpy(q->Name,t1);
t=p->num;
p->num=q->num;
q->num=t;
t2=p->Math;
p->Math=q->Math;
q->Math=t2;
}
q=q->next;
}
p=p->next; //指向下一个结点
}
for(p=s;p!=NULL;p=p->next)
{
printf("%s %d\n",p->Name,p->Math); //输出排名后的
}
}
else if(0==strcmp("English",choice)){
while(p!=NULL)
{
q=p->next;
while(q)
{
if(p->English<q->English) //按英语成绩排序
{
strcpy(t1,p->Name);
strcpy(p->Name,q->Name);
strcpy(q->Name,t1);
t=p->num;
p->num=q->num;
q->num=t;
t2=p->English;
p->English=q->English;
q->English=t2;
}
q=q->next;
}
p=p->next; //指向下一个结点
}
for(p=s;p!=NULL;p=p->next)
{
printf("%s %d\n",p->Name,p->English); //输出排名后的
}
}
else if(0==strcmp("C",choice)){
while(p!=NULL)
{
q=p->next;
while(q)
{
if(p->C<q->C) //按C语言成绩排序
{
strcpy(t1,p->Name);
strcpy(p->Name,q->Name);
strcpy(q->Name,t1);
t=p->num;
p->num=q->num;
q->num=t;
t2=p->C;
p->C=q->C;
q->C=t2;
}
q=q->next;
}
p=p->next; //指向下一个结点
}
for(p=s;p!=NULL;p=p->next)
{
printf("%s %d\n",p->Name,p->C); //输出排名后的
}
}
else if(0==strcmp("Physics",choice)){
while(p!=NULL)
{
q=p->next;
while(q)
{
if(p->Physics<q->Physics) //按物理成绩排序
{
strcpy(t1,p->Name);
strcpy(p->Name,q->Name);
strcpy(q->Name,t1);
t=p->num;
p->num=q->num;
q->num=t;
t2=p->Physics;
p->Physics=q->Physics;
q->Physics=t2;
}
q=q->next;
}
p=p->next; //指向下一个结点
}
for(p=s;p!=NULL;p=p->next)
{
printf("%s %d\n",p->Name,p->Physics); //输出排名后的
}
}
else printf("No subject");
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct student //typedef定义类型*stu
{
int num;
char Name[15];
int Math;
int Physics;
int English;
int C;
struct student *next; //链表形式
}*stu;
stu creat(); //创建链表,以链表形式储存学生成绩信息
void sort(stu s); //按学科排名
int main()
{
stu p,q,a0,a1,a2,a3,a4;
int r; //r用来统计学生人数
float sum; //单门学科成绩总和
p=creat();
a0=p; //创建链表
a1=p;
a2=p;
a3=p;
a4=p;
stu p1;
int t1,t2;
char choice[10];
for(sum=0,r=0,p1=p; p1!=NULL; p1=p1->next)
{
sum+=p1->Math; //数学成绩总和
r++;
}
printf("数学平均分为:%.1f\n",sum/r); //数学平均分
for(sum=0,r=0,p1=p; p1!=NULL; p1=p1->next)
{
sum+=p1->Physics; //物理成绩总和
r++;
}
printf("物理平均分为:%.1f\n",sum/r); //物理平均分
for(sum=0,r=0,p1=p; p1!=NULL; p1=p1->next)
{
sum+=p1->English; //英语成绩总和
r++;
}
printf("英语平均分为:%.1f\n",sum/r); //英语平均分
for(sum=0,r=0,p1=p; p1!=NULL; p1=p1->next)
{
sum+=p1->C; //C语言成绩总和
r++;
}
printf("C语言平均分为:%.1f\n",sum/r); //C语言平均分
sort(p); //按某一门学科成绩排序
int n,m;
int max1=p->Math; //比较数学成绩最大
int max_num1[10]; //存放学生学号
max_num1[0]=p->num; //先令最大为第一个学生
char max_name1[10][10]; //存放学生姓名
for(q=a0; q!=NULL; q=q->next)
{
if(max1<q->Math)
{
max1=q->Math;
}
}
for(q=a0,n=0; q!=NULL; q=q->next)
{
if((q->Math)==max1)
{
max_num1[n]=q->num;
strcpy(max_name1[n],q->Name);
n++;
}
}
printf("数学成绩最高的为:\n");
for(m=0; m<n; m++)
{
printf("%d %s\n",max_num1[m],max_name1[m]);
}
int max2=a1->English; //比较英语成绩最大
int max_num2[10]; //存放学生学号
max_num2[1]=a1->num; //先令最大为第一个学生
char max_name2[10][10]; //存放学生姓名
for(q=a1; q!=NULL; q=q->next)
{
if(max2<q->English)
{
max2=q->English;
}
}
for(q=a1,n=0; q!=NULL; q=q->next)
{
if((q->English)==max2)
{
max_num2[n]=q->num;
strcpy(max_name2[n],q->Name);
n++;
}
}
printf("英语成绩最高的为:\n");
for(m=0; m<n; m++)
{
printf("%d %s\n",max_num2[m],max_name2[m]);
}
int max3=a2->C; //比较C语言成绩最大
int max_num3[10]; //存放学生学号
max_num3[2]=a2->num; //先令最大为第一个学生
char max_name3[10][10]; //存放学生姓名
for(q=a2; q!=NULL; q=q->next)
{
if(max3<q->C)
{
max3=q->C;
}
}
for(q=a2,n=0; q!=NULL; q=q->next)
{
if((q->C)==max3)
{
max_num3[n]=q->num;
strcpy(max_name3[n],q->Name);
n++;
}
}
printf("C语言成绩最高的为:\n");
for(m=0; m<n; m++)
{
printf("%d %s\n",max_num3[m],max_name3[m]);
}
int max4=a3->Physics; //比较物理成绩最大
int max_num4[10]; //存放学生学号
max_num4[3]=a3->num; //先令最大为第一个学生
char max_name4[10][10]; //存放学生姓名
for(q=a3; q!=NULL; q=q->next)
{
if(max4<q->Physics)
{
max4=q->Physics;
}
}
for(q=a3,n=0; q!=NULL; q=q->next)
{
if((q->Physics)==max4)
{
max_num4[n]=q->num;
strcpy(max_name4[n],q->Name);
n++;
}
}
printf("物理成绩最高的为:\n");
for(m=0; m<n; m++)
{
printf("%d %s\n",max_num4[m],max_name4[m]);
}
}
stu creat()
{
stu s;
int r,a;
stu p1,p2;
printf("请输入学生人数:");
scanf("%d",&r);
getchar(); //吸收scanf遗留的回车
s=p1=p2=(stu)malloc(sizeof(struct student)); //开辟内存
printf("请输入学生学号和姓名:");
scanf("%d %s",&p1->num,&p1->Name); //输入学生信息
getchar();
printf("输入学生数学、物理、英语、C语言成绩:");
scanf("%d %d %d %d",&p1->Math,&p1->Physics,&p1->English,&p1->C); //分别输入成绩
for(a=0; a<r-1; a++) //信息存储达到人数个数
{
p1=(stu) malloc(sizeof(struct student)); //再次开辟内存
printf("请输入学生学号和姓名:");
scanf("%d %s",&p1->num,&p1->Name); //输入信息
getchar();
printf("输入学生数学、物理、英语、C语言成绩:");
scanf("%d %d %d %d",&p1->Math,&p1->Physics,&p1->English,&p1->C); //输入成绩
getchar();
p2->next=p1; //指针后移
p2=p1;
}
p2->next=NULL; //直到表尾
return s; //返回链表的指针
}
void sort(stu s)
{
char t1[10];
int t,t2; //用于排序交换时暂时存储数字
char choice[10];
stu p=s; //p和q指向表头
stu q=s;
printf("请选择按照哪一门成绩排序:");
gets(choice); //选择要排序的学科
if(0==strcmp("Math",choice))
{
while(p!=NULL)
{
q=p->next;
while(q)
{
if(p->Math<q->Math) //按数学成绩排序
{
strcpy(t1,p->Name);
strcpy(p->Name,q->Name);
strcpy(q->Name,t1);
t=p->num;
p->num=q->num;
q->num=t;
t2=p->Math;
p->Math=q->Math;
q->Math=t2;
}
q=q->next;
}
p=p->next; //指向下一个结点
}
for(p=s; p!=NULL; p=p->next)
{
printf("%s %d\n",p->Name,p->Math); //输出排名后的
}
}
else if(0==strcmp("English",choice))
{
stu p=s; //p和q指向表头
stu q=s;
while(p!=NULL)
{
q=p->next;
while(q)
{
if(p->English<q->English) //按英语成绩排序
{
strcpy(t1,p->Name);
strcpy(p->Name,q->Name);
strcpy(q->Name,t1);
t=p->num;
p->num=q->num;
q->num=t;
t2=p->English;
p->English=q->English;
q->English=t2;
}
q=q->next;
}
p=p->next; //指向下一个结点
}
for(p=s; p!=NULL; p=p->next)
{
printf("%s %d\n",p->Name,p->English); //输出排名后的
}
}
else if(0==strcmp("C",choice))
{
stu p=s; //p和q指向表头
stu q=s;
while(p!=NULL)
{
q=p->next;
while(q)
{
if(p->C<q->C) //按C语言成绩排序
{
strcpy(t1,p->Name);
strcpy(p->Name,q->Name);
strcpy(q->Name,t1);
t=p->num;
p->num=q->num;
q->num=t;
t2=p->C;
p->C=q->C;
q->C=t2;
}
q=q->next;
}
p=p->next; //指向下一个结点
}
for(p=s; p!=NULL; p=p->next)
{
printf("%s %d\n",p->Name,p->C); //输出排名后的
}
}
else if(0==strcmp("Physics",choice))
{
stu p=s; //p和q指向表头
stu q=s;
while(p!=NULL)
{
q=p->next;
while(q)
{
if(p->Physics<q->Physics) //按物理成绩排序
{
strcpy(t1,p->Name);
strcpy(p->Name,q->Name);
strcpy(q->Name,t1);
t=p->num;
p->num=q->num;
q->num=t;
t2=p->Physics;
p->Physics=q->Physics;
q->Physics=t2;
}
q=q->next;
}
p=p->next; //指向下一个结点
}
for(p=s; p!=NULL; p=p->next)
{
printf("%s %d\n",p->Name,p->Physics); //输出排名后的
}
}
else printf("No subject");
}
你输入成绩的时候,成绩之间加逗号了吧?
按这样输入是没问题的啊