您的位置:首页 > 编程语言 > C语言/C++

c++分行读取并利用数字类型文件数据

2017-07-02 12:27 411 查看
c++课程设计程序

c++ 课程设计任务书:

面向对象技术与C++课程设计任务书

题目17
大赛评分系统

班级
16060101~03

指导教师
耿军雪
姓名
学号

地点

G1-205

完成时间
2017/6/26 2017/6/30






1、目的:

(1)要求学生达到熟练掌握C++语言的基本知识和技能;

(2)基本掌握面向对象程序设计的基本思路和方法;

(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。

2、基本要求:

(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;

(2)要求在设计的过程中,建立清晰的类层次;要分析和定义各个类,每个类中要有各自的属性和方法;要求运用面向对象的机制(继承、派生及多态性)来实现系统功能。

(3)在系统的设计中,要有清晰的界面设计,同时采用文件进行读写操作。

3、创新要求:

在基本要求达到后,可进行创新设计。










参赛选手n人(n>1),评委m人(m>2),评委给每一选手打一个分数score(分数scor为小于等于10的一个正实数)。选手的最后得分lastScore计算方法 为

(1)m<9时,去掉一个最高分和一个最低分后另m-2个得分的平均值。

(2)m≥9时,去掉两个最高分和两个最低分后另m-4个得分的平均值。

其他要求附后








根据系统功能要求,可以将问题解决分为以下步骤:

(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;

(2)分析系统中的各个实体及它们之间的关系包括属性和行为;

(3)根据问题描述,设计系统的类层次;

(4)完成类层次中各个类的描述(包括属性和方法);

(5)完成类中各个成员函数的定义;

(6)完成系统的应用模块;

(7)功能调试;

(8)完成系统课程设计报告,并提交课程设计报告及软件到gjxat2012@126.com







1.封面:(格式附后)

2.课程设计任务书

3.课程设计报告:

⑴ 系统总体方案

⑵ 设计思路和主要步骤

⑶ 各功能模块和流程图

⑷ 设计代码

⑸ 心得体会和参考资料

假设事先已经建立了text型的数据文件f1.txt,其中依次记录着n个选手的编号(一个正整数)、姓名(一个字符串)以及m个评委给出的得分。

请编制程序,依次从数据文件f1.txt中读入n个选手的有关信息,而后按上述规定方法计算出每一个选手的最后得分,而且往屏幕上以及另一个text型文件f2.txt中同时输出如下形式的结果信息。

假设参赛选手人数n=5,评委人数m=7,磁盘文件f1.txt中的初始数据为:

1 zhangjin 8.8 9.3 7.9 8.7 8.9 9.7 9.2

2 lintao 8.9 8.2 8.6 8.8 8.5 9.1 9.3

3 guojian 8.9 8.4 8.7 8.6 8.6 8.4 8.6

4 maling 7.9 8.3 8.5 8.6 8.5 8.9 8.3

5 liuyifan 9.5 9.1 9.8 9.2 9.0 9.5 8.9

那么,程序执行后,屏幕显示结果以及磁盘文件f2.txt中的结果均应该为:

-----------------------------------------------------------------------

参赛号 姓 名 最高分 最低分 累积分 最后得分

-----------------------------------------------------------------------

1 zhangjin 9.7 7.9 44.9 8.98

2 lintao 9.3 8.2 43.9 8.78

3 guojian 8.9 8.4 42.9 8.58

4 maling 8.9 7.9 42.2 8.44

5 liuyifan 9.8 8.9 46.3 9.26

----------------------------------------------------------------

思考:可进一步考虑找出比赛的第1至第k名,也在屏幕以及f2.txt中同时输出相关的结果信息(k小于等于n,并规定若多个选手最后得分相同时,则有效分(即已删除原来的最高分后)中最高分高者名次优先)。

并且在完成设计之后,又新添从键盘读取数据并且存入f1文件后再次利用文件计算新增后的选手成绩。

下边我将自己的代码放在这里供大家参考,如有错误或者不当之处希望大家联系我进行改正:

#include <iostream>

#include <fstream>

#include <string>

#include<sstream>

#include"ks.h"

using namespace std;

int main()

{

score play(10);//给score类定义一个对象

double read[10];//定义一个double型数组用于读取文件中的选手成绩

double a[10];//定义一个double型数组用于存储文件中的选手成绩

double num;//定义一个double类型存储选手的编号

string str;//定义一个string字符串存储文件中选手的名字

double pp[10];

double temp1;

double qq[10];

int q=1;

int w;

char s[10];

double ss[10];

int u;

int g;

int k = 0;//f定义一个k用于计算裁判的个数

char store[1000];//定义一个store字符串用于存放从文件中读取的所有内容

cout<<"--------------------------------------------------------------"<<endl;

cout<<" "<<endl;

cout<<"1.读取并输出当前文件成绩 "<<endl;

cout<<"2.再次添加运动员及其成绩 "<<endl;

cout<<" "<<endl;

cout<<"--------------------------------------------------------------"<<endl;

cin>>w;

if(w==1)

{

cout<<"请输入读取选手成绩个数"<<endl;

cin>>g;

cout<<"编号"<<" "<<"姓名"<<" "<<"最高分"<<" "<<"最低分"<<" "<<"总分"<<" "<<"平均分"<<endl;

ifstream in("f1.txt");//以读取的形式打开文件f1

ofstream out("f2.txt");//以写入的形式打开文件f2

out<<"编号"<<" "<<"姓名"<<" "<<"最高分"<<" "<<"最低分"<<" "<<"总分"<<" "<<"平均分"<<endl;//向文件中输出这句话

int line;

for (line = 1; line<g+1; line++)//用于将文件分行读取

{

in.seekg(0,ios::beg);

for (int i = 0; i<line;i++)

{

in.getline(store, sizeof(store));//读取文件中的第line行

}

std::istringstream iss(store);//给读取的分配内存空间

iss >> num;//将文件中的数据编号进行类型转换并存入到int型的num中

iss >> str;//将文件中的数据姓名存入字符串str中

cout << num << " ";

cout << str << " ";

i=0;//由于上边运用了i并且i已经有了一个值这里需要将i重新变回0

k=0;

while (iss >> read[i])//对文件中的选手成绩进行读取并且存入read数组中

{

a[i] = read[i];//为方便对数据进行计算将所读取的数组重新复制给a数组

//cout << a[i] << " ";

i++;

k++;//每次读取数据k都将会加1从而记录成绩个数从而得到裁判的数

}

cout << " ";

double max=play.max(a,k);//用对象去调用类中的函数max从而得到数组的最大值并将它赋值给double型数据max

double min=play.min(a, k);//用对象去调用类中的函数min从而得到数组的最小值并将它赋值给double型数据min

double aver=play.aver(a,k);//用对象去调用类中的函数aver从而得到数组的平均数并将它赋值给aver

double sum=play.sum(a,k);//用对象去调用类中的函数sum从而的得函数的返回值然后赋值给sum

cout<<max<<" "<<min<<" "<<sum<<" "<<aver<<endl;

out << num << " ";//向文件中输入选手编号

out << str << " ";//向文件中输入选手姓名

out<<max<<" "<<min<<" "<<sum<<" "<<aver<<endl;//向文件中输入选手得分最大值最小值总和以及平均值

pp[line]=play.sum(a,k);//用一个double数组记录所有人的成绩

qq[line]=play.aver(a,k);//用一个数组记录所有人的平均成绩

}

for (int m = 0; m<g; m++)//成绩对数组进行排序

{

for (int n = 0; n<g-m-1; n++)

{

if (pp
>pp[n+ 1])

{

temp1 = pp
;

pp
= pp[n + 1];

pp[n + 1] = temp1;

}

}

}

for(int c=1;c<g+1;c++)//如果两人总成绩相同比较两人平均分进行判断

{

for(int d=c+1;d<g+1;d++)

if(pp[c]==pp[d])

{

cout<<"第"<<c<<"名和第"<<d<<"名总成绩相同比较平均分"<<endl;

if(qq[c]>qq[d])

cout<<"获得"<<pp[c]<<"分数的名次高于获得"<<pp[d]<<"分数的"<<endl;

else

cout<<"获得"<<pp[c]<<"分数的名次高于获得"<<pp[d]<<"分数的"<<endl;

}

}

for( q=1;q<g+1;q++)//用循环输出所有人总成绩以及名次

{

cout<<"第"<<q<<"名的成绩为"<<pp[q]<<endl;

out<<"第"<<q<<"名的成绩为"<<pp[q]<<endl;

}

in.close();//关闭读取的文件f1

out.close();//关闭读取的文件f2

}

if(w==2)

{

cout<<"请输入新增加的选手姓名"<<endl;

cin>>s;

cout<<"请依次输入选手的成绩"<<endl;

for(u=0;u<7;u++)

{

cin>>ss[u];

}

ifstream in;

ofstream out;

out.open("f1.txt",ios::app);

out<<"6"<<" ";

out<<s<<" ";

for(u=0;u<7;u++)

{

out<<ss[u]<<" ";

}

cout<<"是否计算当前所有运动员成绩";

cout<<"是请按3"<<endl;

cout<<"否则请退出"<<endl;

cin>>w;

if(w==3)

{

cout<<"请输入读取选手成绩个数"<<endl;

cin>>g;

cout<<"编号"<<" "<<"姓名"<<" "<<"最高分"<<" "<<"最低分"<<" "<<"总分"<<" "<<"平均分"<<endl;

in.open("f1.txt");//以读取的形式打开文件f1

out.open("f2.txt");//以写入的形式打开文件f2

out<<"编号"<<" "<<"姓名"<<" "<<"最高分"<<" "<<"最低分"<<" "<<"总分"<<" "<<"平均分"<<endl;//向文件中输出这句话

int line;

for (line = 1; line<g+1; line++)//用于将文件分行读取

{

in.seekg(0,ios::beg);

for (int i = 0; i<line;i++)

{

in.getline(store, sizeof(store));//读取文件中的第line行

}

std::istringstream iss(store);//给读取的分配内存空间

iss >> num;//将文件中的数据编号进行类型转换并存入到int型的num中

iss >> str;//将文件中的数据姓名存入字符串str中

cout << num << " ";

cout << str << " ";

i=0;//由于上边运用了i并且i已经有了一个值这里需要将i重新变回0

k=0;

while (iss >> read[i])//对文件中的选手成绩进行读取并且存入read数组中

{

a[i] = read[i];//为方便对数据进行计算将所读取的数组重新复制给a数组

//cout << a[i] << " ";

i++;

k++;//每次读取数据k都将会加1从而记录成绩个数从而得到裁判的数

}

cout << " ";

double max=play.max(a,k);//用对象去调用类中的函数max从而得到数组的最大值并将它赋值给double型数据max

double min=play.min(a, k);//用对象去调用类中的函数min从而得到数组的最小值并将它赋值给double型数据min

double aver=play.aver(a,k);//用对象去调用类中的函数aver从而得到数组的平均数并将它赋值给aver

double sum=play.sum(a,k);//用对象去调用类中的函数sum从而的得函数的返回值然后赋值给sum

cout<<max<<" "<<min<<" "<<sum<<" "<<aver<<endl;

out << num << " ";//向文件中输入选手编号

out << str << " ";//向文件中输入选手姓名

out<<max<<" "<<min<<" "<<sum<<" "<<aver<<endl;//向文件中输入选手得分最大值最小值总和以及平均值

pp[line]=play.sum(a,k);//用一个double数组记录所有人的成绩

qq[line]=play.aver(a,k);//用一个数组记录所有人的平均成绩

}

for (int m = 0; m<g; m++)//成绩对数组进行排序

{

for (int n = 0; n<g-m-1; n++)

{

if (pp
>pp[n+ 1])

{

temp1 = pp
;

pp
= pp[n + 1];

pp[n + 1] = temp1;

}

}

}

for(int c=1;c<g+1;c++)//如果两人总成绩相同比较两人平均分进行判断

{

for(int d=c+1;d<g+1;d++)

if(pp[c]==pp[d])

{

cout<<"第"<<c<<"名和第"<<d<<"名总成绩相同比较平均分"<<endl;

if(qq[c]>qq[d])

cout<<"获得"<<pp[c]<<"分数的名次高于获得"<<pp[d]<<"分数的"<<endl;

else

cout<<"获得"<<pp[c]<<"分数的名次高于获得"<<pp[d]<<"分数的"<<endl;

}

}

for( q=1;q<g+1;q++)//用循环输出所有人总成绩以及名次

{

cout<<"第"<<q<<"名的成绩为"<<pp[q]<<endl;

out<<"第"<<q<<"名的成绩为"<<pp[q]<<endl;

}

in.close();//关闭读取的文件f1

out.close();//关闭读取的文件f2

}

}

//ks.h

class score

{

private:

int p;

//double read[7];

//double a[7];

public:

score(int pp)//构造函数

{

p = pp;

}

double min(double a[], int k)//定义两个参数,求所读取数组的最小值,两个参数需要从主函数中获得

{

double temp;

for (int j = 0; j<k; j++)

{

for (int i = 0; i<k-j-1; i++)//对数组进行排序

{

if (a[i]>a[i + 1])

{

temp = a[i];

a[i] = a[i + 1];

a[i + 1] = temp;

}

}

}

return a[0];//该函数最终返回值为数组的最小值

}

double max(double a[],int k)//定义两个参数,求所读取数组的最大值,两个参数需要从主函数中获得

{

double temp;

for (int j = 0; j<k; j++)//对数组进行排序

{

for (int i = 0; i<k-j-1; i++)

{

if (a[i]>a[i + 1])

{

temp = a[i];

a[i] = a[i + 1];

a[i + 1] = temp;

}

}

}

return a[k-1];//该函数最终返回值为数组的最大值

}

double sum(double a[], int k)//定义两个参数,用于求该数组所有元素的和

{

int i;

double sum = 0;

if (k<9)//如果给的参数中k的值小于9则去掉一个最高一个最低

{

for (i = 1; i<k - 1; i++)

{

sum = sum + a[i];

}

}

else//如果给的参数中k的值大于9则去掉两个最高两个最低

{

for (i = 2; i<k - 2; i++)

{

sum = sum + a[i];

}

}

return sum;//该函数返回一个值为数组所有数字的和

}

double aver(double a[],int k)//定义两个参数,用于求该数组的平均值

{

double sum=0;

double aver=0;

if (k<9)//裁判数目小于9去掉一个最高一个最低

{

for (int i = 1; i<k - 1; i++)

{

sum = sum + a[i];

}

aver = sum / (k - 2);

}

else//裁判数目大于9去掉两个最高两个最低

{

for (int i = 2; i<k - 2; i++)

{

sum = sum + a[i];

}

aver = sum / (k - 4);

}

return aver;//该函数最终返回值为该数组的平均值

}

};

对于这个小程序我认为程序的难点在于将文件中的信息读取出来,并且在读取后进行类型转换将字符串中的数据,转换成可以进行计算排序的数字类型数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 新手
相关文章推荐