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

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

第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.在输入文件内容较多时,可以仅取其中的几个值但要覆盖面广,从而检验算法的正误。

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


为了方便,把代码放在Word里面了,每次上机实验的题目代码都在。 第一次: 对如下多项式编写类定义: + + +…+ 其中,n为多项式的次数。完成如下功能: (1) 可存储任意大的多项式(提示:可用动态数组实现)。 (2) 定义构造函数、析构函数、拷贝构造函数。 (3) 包含一个static成员存储定义的多项式的数量。 (4) 定义一个成员函数输出多项式。(可参照-x^4-6x^3+5格式输出) (5) 定义一个成员函数计算多项式的值。 (6) 写main函数测试类的功能。 (7) 采用多文件实现。 考虑:哪些成员函数可以声明为const. 第二次: (8) 重载“+”运算符,实现两个多项式相加。 (9) 重载“-”运算符,实现两个多项式相减。 (10) 重载“*”运算符,实现两个多项式相乘。 (11) 重载“=”运算符,实现两个多项式的赋值运算。 考虑:把其中某个运算符重载为友元函数。 第三次: C++的一般编译器都定义和封装了字符串功能,请模仿定义string类的实现,可以实现并支持如下功能: (1)string s = “吉林大学”; (2)string t = s; (3)string m; m = t; (4)m.legnth() 函数测量字符串的长度 (5)m.cat(string const &)连接字符串 第四次: 我公司为仪器生产企业,目前生产摄像机和行车记录仪两种产品,分别销售给用户。 摄像机包含摄像、图像质量设定、编码算法等属性。 将摄像机增加相应芯片(具有操作菜单、自动拍摄、车速传感器、源代码等功能)后,形成一个行车记录仪。 要求: 设计摄像机类,并请根据下列不同的功能要求,采用不同的继承方式,设计行车记录仪类,并添加测试代码,体验不同继承方式下的成员访问属性。(类设计时可根据需要自行添加数据成员和其他成员函数。) (1) 行车记录仪的芯片可以使用摄像机的摄像、图像质量设定功能。 行车记录仪用户可以操作行车记录仪的操作菜单和摄像机的摄像功能。 (2)行车记录仪的芯片可以使用摄像机的拍摄、图像质量设定功能。 行车记录仪用户仅仅可以操作行车记录仪的操作菜单。 (3) 行车记录仪的芯片可以使用摄像机的拍摄、图像质量设定功能。 行车记录仪用户仅仅可以操作行车记录仪的操作菜单 同时其他公司购买行车记录仪,因该公司也用于销售,不得泄露其全部内容 课后: (1)采用组合方式设计行车记录仪类,增加相应测试代码,体验继承和组合的关系。 (2)分别为继承和组合方式下为各类添加构造函数、析构函数,增加相应测试代码,体验对象的初始化和构造顺序。 (3)将摄像机类和行车记录仪类功能相近的函数(如拍摄、编码等功能函数)设为同名函数,增加相应测试代码,体验同名函数覆盖。 (4)为我公司建立一个多态的产品类层次结构,使用抽象类,测试时,创建一个基类指针的容器,通过基类指针调用虚函数,体验多态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值