C++程序设计实验报告(二十二)

本文介绍了一个使用C++结构体实现的成绩单排序程序。该程序从文件中读取学生数据,包括姓名、学号及三门课程的成绩,并按总成绩对学生进行排序,最后输出排序结果及奖学金获得者名单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第17周报告
实验目的:理解结构体概念
实验内容:从文件中读入数据,利用结构体,作出成绩单。
* 程序头部注释开始
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:      成绩单                     
* 作    者:           刘镇                 
* 完成日期:       2011  年     12  月   15    日
* 版本号:         1.019

* 对任务及求解方法的描述部分
* 输入描述:文件score.txt
* 问题描述:从文件score.txt中读入30名同学成绩(c++,高数,英语),按照总成绩排序,将排序后的结果在屏幕上输出,将30名同学中能活奖学金的输出。
* 程序输出:总成绩排序
* 程序头部的注释结束

#include<fstream>

#include<iomanip>

#include<string>

#include<iostream>

using namespace std;

struct student
{
 char num[12];
 string name;
 float grade[3];
 float score;
};
student stu[180];

int main()
{
 int i, j;
 student t;
 
 ifstream infile( "score.txt", ios::in );
 
 if(!infile)
 {
  cerr << "open error" << endl;
  
  exit(1);
 }
 
 for(i = 0; i < 180; i++)
 {
  
  infile >> stu[i].num >> stu[i].name>> stu[i].grade[0]
   >> stu[i].grade[1] >> stu[i].grade[2] ;
  
  stu[i].score = stu[i].grade[0] + stu[i].grade[1] + stu[i].grade[2];
  
 }
 
 infile.close();
 
 for(j = 0; j < 179; j++)
  
  for( i = 0; i < 179-j; i++)
  {
   
   if(stu[i].score < stu[i+1].score)
   {
    
    t = stu[i];
    
    stu[i] = stu[i+1];
    
    stu[i+1]= t;
    
   }
  }
  
  for(i = 0; i < 180; i++)
  {
   cout << stu[i].num << '\t' << stu[i].name <<'\t' <<stu[i].grade[0]
    <<'\t'<<stu[i].grade[1]  <<'\t'<< stu[i].grade[2] <<'\t'<< stu[i].score << endl;
  }
  
  cout << endl <<"获得奖学金的同学名单:" << endl;
  
  for(i = 0; i < 180; i++)
  {
   static array = 0;
   
   if(array >= 30)
   {
    break;
   }
   
   if(stu[i].grade[0] >= 60 && stu[i].grade[1] >= 60 && stu[i].grade[2] >= 60  )
   {
    cout << stu[i].name << '\t' ;
    array ++;
   }
   
   if( (i+1) % 5 == 0 )
   {
    cout << endl ;
   }
  }
  
return 0;
}

运行结果:


经验积累:
1.结构体本身并不复杂,可以向往常一样进行运算,替换,而真正的难点在于结构体内部数据的处理。

2.此次做题,被输入奖学金名单难住了,原因在于30名同学与执行循环体中的矛盾。再一个是对于总成绩的排序,只是想着将总成绩排序,却总是没法把所有数据都进行排序。

3.在输入文件内容较多时,可以仅取其中的几个值但要覆盖面广,从而检验算法的正误。

上机感言:确实花了时间,而且还不少,对输出结果的对齐,尤其是长人名处理还是,不能解决。在以后还要将此算法简化,用多个自己定义函数计算,思路现在还是不十分清晰。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值