8 位同学按照成 绩由高到低排序,输出成绩第二高的同学的信息

1.(20 分)有 8 个学生,有如下信息:名字,年龄,成绩。请从键盘输入 8 位
同学的信息,存入文件 cs.txt,再从文件中读取出数据,并对 8 位同学按照成
绩由高到低排序,输出成绩第二高的同学的信息。
2.代码

#include <stdio.h>
#include <stdlib.h>
#include<Windows.h>
#include<iostream>
using namespace std;

typedef struct student//typedef
{
    
    char    name[20];//char数组
    char    age[10];//char数组
    int     score;
    struct  student *next;//链表
}student;
 
 void getSecond(student *s[],int sn);//结构体数组
void sort(student *s[],int sn);

int main()
{
//8个学生 申请空间存放
	int flag = 0;
    int sn = 8;//读取前面十个学生的信息
    student* s[8];


for(;flag<sn;flag++)
    {
        s[flag] = (student *) malloc(sizeof(student));
    }



//打开文件
 FILE* fd;
    if((fd = fopen("E:\\p.txt","w"))==NULL)
    {
        printf("文件打开失败.\n");
		Sleep(80000);
        return 0;
 
    }
	
    printf("文件打开写入成功.\n");
//输入信息
	SetConsoleOutputCP(65001);
	for( flag = 0; flag < sn; flag++)
    {
		
		
		cin>>s[flag]->name;
		cin>>s[flag]->age;
		cin>>s[flag]->score;

       cout<<endl;
   
        
    }
//写入文件
	for( flag = 0; flag < sn; flag++)
    {
		

        fprintf(fd,"%s%s%d",s[flag]->name,s[flag]->age,
                             s[flag]->score);
         
    }
 //关闭文件
    fclose(fd);

printf("\n");
 printf("\n");

 SetConsoleOutputCP(936);
 
  printf("输出第二学生信息: ");
  SetConsoleOutputCP(65001);
    getSecond(s,sn);//777777输出成绩第二的学生信息

   printf("\n");
   printf("\n");
	SetConsoleOutputCP(936);
	 printf("按照分数高低输出所有学生信息: ");
	 SetConsoleOutputCP(65001);
    sort(s,sn);//777777按照分数高低输出所有学生信息
 
 
 
    return 0;
 
}


void getSecond(student *s[],int sn)
{
	int ranking=1;//第一名 0- sn-1  //第二名1--sn-1
	int i,j;
	for(i=0;i<sn;i++)
	{
	  for(j=0;j<sn;j++)
	  {
	  
	    if(s[i]->score > s[j]->score) ranking++;
	  
	  }
	
	 if(ranking == sn-1 ) break;//sn-1表示次高分数标志
        else ranking = 1;
	}

printf("\n");
	
  SetConsoleOutputCP(936);
  //输出第二高成绩学生信息
    printf("%s%s%d\n",s[i]->name,s[i]->age,
                                  s[i]->score);
}


void sort(student *s[], int sn)
{
	student * temp;
	int i=0;
	int j=0;

	 SetConsoleOutputCP(65001);
	 //通过交换实现排序
	  for( ;i<sn-1; i++)//前sn-1个数,不包括最后一位
    {
        for(j = i; j<sn; j++)//
        {
            if(s[i]->score < s[j]->score)
            {
                temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
        }
 
    }
	    printf("\n");




//把结果写入文件

//打开文件
		 FILE* fp1;
	if((fp1=fopen("E:\\e.txt","w"))==NULL)
	{
	 printf("File open erroe!\n");
	 exit(0);
	
	}

	//打印排序后信息
	  //输出所有排序后学生的信息
	 SetConsoleOutputCP(936);
    for(i=0;i<sn;i++)
    {
       printf("%s%s%d\n",s[i]->name,s[i]->age,
                                   s[i]->score);
	}
	//写入文件中
	 for(i=0;i<sn;i++)
    {
		SetConsoleOutputCP(936);
       fprintf(fp1,"%s%s%d\n",s[i]->name,s[i]->age,
                                   s[i]->score);
	}
	 //关闭文件
	 if(fclose(fp1))
	{
	printf("Cant not close the file! \n");
	exit(0);
	}


 Sleep(10000000);

}














  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值