编写一段程序录入 N 个学生的信息包括姓名、性别、年龄和成绩;要求:1.按照成绩由小到大的顺序输出,如果成绩相同则按学号由小到大的顺序输出;2.计算 N 个学生成绩的平均值;

 题目和要求:

编写一段程序录入 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"); 

        
  }   

实验结果:

 好了这就没了

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个示例程序,实现了链表存储学生信息,并按照平均分由大到小进行插入排序。具体实现中,每个节点表示一个学生,包含学号姓名成绩三个字段。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> struct student { char id[20]; // 学号 char name[30]; // 姓名 float score; // 成绩 struct student *next; // 下一个节点指针 }; // 插入一个节点到链表中,按照平均分由大到小排序 void insert(struct student **head, struct student *node) { struct student *prev = NULL; struct student *curr = *head; while (curr != NULL && curr->score > node->score) { prev = curr; curr = curr->next; } if (prev == NULL) { node->next = *head; *head = node; } else { prev->next = node; node->next = curr; } } // 打印链表中的所有节点 void print_list(struct student *head) { struct student *curr = head; while (curr != NULL) { printf("%s %s %.2f\n", curr->id, curr->name, curr->score); curr = curr->next; } } int main() { struct student *head = NULL; char id[20], name[30]; float score; int n; printf("请输入学生人数:"); scanf("%d", &n); for (int i = 0; i < n; i++) { printf("请输入第%d个学生学号姓名成绩:", i + 1); scanf("%s %s %f", id, name, &score); struct student *node = (struct student *)malloc(sizeof(struct student)); strcpy(node->id, id); strcpy(node->name, name); node->score = score; node->next = NULL; insert(&head, node); } printf("按照平均分由大到小排名结果如下:\n"); print_list(head); return 0; } ``` 注意,这里的链表插入排序是按照平均分由大到小进行排序的,而不是按照某个字段的字典序或数值大小进行排序。如果需要按照其他字段排序,可以在 `insert` 函数中对比相应的字段并进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值