实验四输入输出流实验课程名:面向对象程序设计(C++)专业班级:学号:姓名:实验时间:实验地点:指导教师:一、实验目的和要求(1)理解类和对象的概念,掌握声明类和定义对象的方法。(2)掌握构造函数和析构函数的实现方法。(3)初步掌握使用类和对象编制C++程序。(4)掌握对象数组、对象指针和string类的使用方法。(5)掌握使用对象、对象指针和对象引用作为函数参数的方法。(6)掌握类对象作为成员的使用方法。(7)掌握静态数据成员和静态成员函数的使用方法。(8)理解友元的概念和掌握友元的使用方法。二、实验内容1.定义描述职工工资的类Laborage,数据成员为职工号(No)、姓名(Name[8])、应发工资(Ssalary)、社保金(Security)、实发工资(Fsalary)。定义公有成员函数Input(),在Input()函数内输入职工号、姓名、应发工资、社保金,实发工资由公式:Fsalary=Ssalary-Security计算。定义输出职工工资的成员函数Show()。在显示函数Show()中,职工号、姓名的输出域宽为8、左对齐,其余数据的输出域宽为10、右对齐、保留小数点后两位,输出格式均用预定义格式控制函数设置。在主函数中用Laborage类定义职工对象数组a[3]。用Input()输入职工工资,用Show()显示每个职工的工资。(提示:用getline输入姓名后,必须用回车结束姓名输入)实验数据:1001ZhouZhi30002001002ChenHua40004001003WangFan5000500实验代码:#includeiostream#includeiomanip#includefstreamusingnamespacestd;classLaborage{public:Laborage(){}voidinput();voiddisplay();private:intnum;charname[10];floatSsalary;floatSecurity;floatFsalary;};voidLaborage::input(){cinnum;cin.get(name,10,'\n');cinSsalary;cinSecurity;Fsalary=Ssalary-Security;}voidLaborage::display(){coutresetiosflags(ios::right)setw(8)setiosflags(ios::left)num;coutsetw(8)setiosflags(ios::left)name;coutsetw(10)setiosflags(ios::right)setiosflags(ios::fixed)setprecision(2)Ssalary;coutsetw(10)setiosflags(ios::right)setiosflags(ios::fixed)setprecision(2)Security;coutsetw(10)setiosflags(ios::right)setiosflags(ios::fixed)setprecision(2)Fsalary;coutendl;}intmain(void){Laboragelab[3];inti;for(i=0;i3;i++){cout请输入第i+1个职员的信息为:;lab[i].input();}for(i=0;i3;i++){lab[i].display();}return0;}实验结果:代码分析:1)在输入时调用getline()以换行符作为输入姓名时的结束标志,已达到输入空格的目的2)输出时采用resetiosflags(ios::right)实现结束向左对齐,用setw(8)实现输出域宽为8,使用一系列的格式控制字符来实现输出格式的控制。2.重载运算符“”和“”,使其能够输入一件商品的信息和输出这件商品的信息。商品的信息由编号、商品名和价格。假如商品类Merchandise的框架如下:classmerchandise{public:Merchandiss();~Merchandiss();friendistream&operator(istream&in,Merchandiss&s);friendostream&operator(ostream&out,Merchandiss&s);private:intno;char*name;doubleprice;};要求实现该类,并编写以下的main函数对该类进行操作。intmain(){Merchandisemer;cinmer;coutmer;return0;}实验代码:#includeiostreamusingnamespacestd;classmerchandise{public:merchandise(){no=0;name[0]='\0';price=1;}~merchandise(){}friendistream&operator(istream&in,merchandise&s);friendostream&operator(ostream&out,merchandise&s);private:intno;charname[100];doubleprice;};istream&operator(istream&in,merchandise&s){cout请输入商品信息(编号、名称、价格):;ins.no;in.getline(s.name,100,'\n');ins.price;returnin;}ostream&operator(ostream&out,merchandise&s){cout商品信息显示如下:endl;outs.no''s.name''s.priceendl;returnout;}intmain(){merchandisemer;cinmer;coutmer;return0;}实验结果:实验分析:先定义一个商品的类,构造函数定义为无参函数在函数体中将name置为空,其他为0.在重载时使用getline函数,输入name以’\n’作为结束标记重载时直接输出。在主函数中调用这些函数实现输入输出的功能。3.将一个源文件复制为两个不同名目的文件,源文件与目的文件均用构造函数打开,使用成员函数get与put复制第一个目的文件,使用getline与插入运算符复制第二个目的文件。(提示:用get函数将输入文件流对象的指针指向文件尾后,无法将该指针移到文件首位置。所以只能定义两个输入文件流对象打开同一源文件,用于两种方式的文件复制。)实验数据:源文件:e:\ex\a.txt,文件内容为soucefile目的文件1:e:\ex\b.txt目的文件2:e:\ex\c.txt实验代码:#includeiostream#includefstream#includestringusingnamespacestd;voidcreatefile(){ofstreamoutfile(a.txt);if(!outfile){cerropena.txterror!endl;exit(1);}charstr[100];cin.getline(str,100,'\n');outfilestr;outfile.close();}voidcopyfile_b(){ofstreamoutfile(b.txt);if(!outfile){cerropenb.txterror!endl;exit(1);}ifstreaminfile(a.txt);if(!infile){cerropena.txterror!endl;exit(1);}charch;while(infile.get(ch)){outfilech;}outfile.close();infile.close();}voidcopyfile_c(){ofstreamoutfile(c.txt);if(!outfile){cerropenc.txterror!endl;exit(1);}ifstreaminfile(a.txt);if(!infile){cerropena.txterror!endl;exit(1);}charch;while(infile.get(ch)){outfilech;}outfile.close();infile.close();}voiddisplay(char*filename){ifstreaminfile(filename);if(!infile){cerropenthefileerror!endl;exit(1);}charch;while(infile.get(ch)){cout.put(ch);}coutendl;infile.close();}intmain(){createfile();copyfile_b();copyfile_c();couta文?件t中D的Ì?内¨²容¨Y为a:êo;display(a.txt);coutb文?件t中D的Ì?内¨²容¨Y为a:êo;display(b.txt);coutc文?件t中D的Ì?内¨²容¨Y为a:êo;display(c.txt);return0;}实验结果:定义几个函数分别实现:创建文件、复制文件、读取文件中的内容到显示器在主函数中调用创建函数,创建一个文件a,调用复制文件的函数将a中的内容复制到文件b,c中在调用读取文件的函数将a、b、c中的内容输出到显示器中。4.将存放在源文件(e:\ex\array1.txt)中学生成绩读入二维整型数组a[3][5]中,数组a的第0列存放学号,第4列存放平均成绩。计算出每个学生的平均成绩,用擂台法对数组a按平均成绩升序排序后,存放在目的文件(e:\ex\array2.txt)中。学生的学号与成绩如实验数据所示。编写程序实现上述要求。实验数据:源文件:e:\ex\array1.txt,内容如下:100190858001002807060010038580750目的文件:e:\ex\array2.txt实验代码:#includeiostream#includefstreamusingnamespacestd;voidcreatefile(){ofstreamoutfile(array1.txt);inta[3][4];inti,j;for(i=0;i3;i++){cout请?输º?入¨?第̨²i+1个?学¡ì生¦¨²的Ì?信?息¡é:êo;for(j=0;j4;j++){cina[i][j];}}for(i=0;i3;i++){for(j=0;j4;j++){outfilea[i][j];outfile'';}outfile'\n';}}//创ä¡ä建¡§文?件tarray1voidsort()//排?序¨°并¡é创ä¡ä建¡§文?件tarray2{ifstreaminfile(array1.txt);inta[3][5];inti,j,t;doubles=0;for(i=0;i3;i++){for(j=0;j4;j++){infilea[i][j];s=s+a[i][j];}s=(s-a[i][0])/3;a[i][4]=s;s=0;}for(j=0;j2;j++){for(i=0;i2-j;i++){if(a[i][4]a[i+1][4]){for(t=0;t5;t++){s=a[i][t];a[i][t]=a[i+1][t];a[i+1][t]=s;}}}}ofstreamoutfile(a