题目和要求:
编写一段程序录入 N 个学生的信息包括姓名、性别、年龄和成绩;
要求:1.按照成绩由小到大的顺序输出,如果成绩相同则按年龄由小到大的顺序 输出;
2.计算 N 个学生成绩的平均值;
注:1.输入的第一行是一个整数 N,表示 N 个学生;接下来 N 行每行描述一个 学生的姓名、性别、年龄和成绩。
样例:
例子 1:
3
Alice female 18 98
Bob male 19 90
Miller male 17 92
结果: Bob male 19 90
Miller male 17 92
Alice female 18 98
average = 93.33
例子 2:
10
student1 female 14 98
student2 female 15 78
student3 female 11 88
student4 male 17 84
student5 female 19 78
student6 female 12 88
student7 male 16 90
student8 male 13 64
student9 male 20 90
student10 female 18 84
结果:
student8 male 13 64
student2 female 15 78
student5 female 19 78
student4 male 17 84
student10 female 18 84
student3 female 11 88
student6 female 12 88
student7 male 16 90
student9 male 20 90
student1 female 14 98
average = 84.2
考察内容:结构体+链表+冒泡排序
话不多说上程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node { char name[10];
char sex[7] ;
int age;
int score;
struct node *next; } Node;
//这里是定义的学生的结构体
Node *Create_1() //正序建立单链表
{ int n;
Node *head,*tail,*p;
head= (Node*)malloc(sizeof(Node)); //申请头结点
if(head==NULL) exit(0);
head->next = NULL;
tail=head;
printf("输入学生人数: \n");
scanf("%d",&n);
printf("输入姓名 性别 年龄 成绩:\n");
while(n)
{ p= (Node*)malloc(sizeof(Node));
if(!p) exit(0);//如果申请失败,则退出程序
//数据的输入
scanf("%s %s %d %d",p->name,p->sex,&p->age, &p->score );
p->next=NULL;
tail->next=p;
tail=p;
n--;
}
return head;
}
//按照成绩的排序
void Sort(Node *head)
{ Node *pi,*pj,*pk;
char tmp1[10]; int tmp2; int tmp3;
pi=head->next;
while(pi!=NULL)
{ pk=pi;
for(pj=pi->next; pj; pj=pj->next)
if(pj->score < pk->score) pk=pj;
//pk记录较小的成绩的结构体 ,同时也是后一个
if(pi!=pk)
{
strcpy(tmp1, pi->name);strcpy(pi->name,pk->name);
strcpy(pk->name,tmp1);
strcpy(tmp1, pi->sex);strcpy(pi->sex,pk->sex);
strcpy(pk->sex,tmp1);
tmp2=pi->age; pi->age=pk->age; pk->age=tmp2;
tmp3=pi->score; pi->score=pk->score; pk->score=tmp3;
}
pi=pi->next;
}
}
//对按照成绩排过序的链表再次按照年龄排序
void Sort2(Node *head)
{ Node *pi,*pj,*pk;
char tmp1[10]; int tmp2; int tmp3;
pi=head->next;
while(pi!=NULL)
{ pk=pi;
for(pj=pi->next; pj; pj=pj->next)
if(pj->score == pk->score) pk=pj;
//pk记录相邻的成绩相同的同学的指针
if(pi!=pk)
{
if(pi->age >pk->age)//如果成绩相等,但年龄不是由小到大
{
strcpy(tmp1, pi->name);strcpy(pi->name,pk->name);
strcpy(pk->name,tmp1);
strcpy(tmp1, pi->sex);strcpy(pi->sex,pk->sex);
strcpy(pk->sex,tmp1);
tmp2=pi->age; pi->age=pk->age; pk->age=tmp2;
tmp3=pi->score; pi->score=pk->score; pk->score=tmp3;
}
}
pi=pi->next;
}
}
void Print(Node* head) //遍历
{
Node *p;
int num=0;
float average=0;
p= head->next ; //跳过头结点,得到第1个结点的地址
while(p)
{
printf("%s ", p->name);
printf("%s ", p->sex);
printf("%d ", p->age );
printf("%d\n", p->score );
average =average+p->score;
num++;
p = p->next ;
}
average=average/num;
printf("average= %f\n",average);
}
int main()
{ int tt;
Node *Head;
Head=Create_1();//建立链表
printf("\n结果:\n");
Sort(Head);
Sort2(Head);
Print(Head);
printf("\n\n");
}
实验结果:
好了这就没了