实验项目1 C++运行环境及基础语法_第1页
实验项目1 C++运行环境及基础语法_第2页
实验项目1 C++运行环境及基础语法_第3页
实验项目1 C++运行环境及基础语法_第4页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

世界因为女性的诞生,显得分夕卜美丽!只个小小的问候,却是一个浓浓的真意!女2实验项目1 C++运行环境及基础语法实验目的:熟悉C++的开发运行环境掌握C++的基本语法熟悉结构化程序设计实验内容:最简单的C++程序运行调试实验步骤:输入下面程序并运行,记录运行结果#include<iostream>usingnamespacestd;intmain(){cout<<"myfirstcppprogram,,«endl;return0;}问题:main函数的返回值有什么含义?程序中main可以定义为void类型吗?可以去掉最后的retun0语句吗?修改程序,并编译,注意屏幕提示,解释结果返回的值的意思是程序的结束标志。当返回值为VOID时,此时无须加上返回值。也可以去掉最后的0,此时的返回类型为VOIDo修改后的程序:#include<iostream>intmain(){std::cout<<,/myfirstcppprogram,/«std::endl;return0;)答:运行的结果://myfirstcppprogram//Pressanykeytocontinue程序中的usingnamespacestd;有什么作用?如果不要计算机会有和提示?修改程序,删除usingnamespacestd;并让程序能运行作用:命名空间是为了防止名字(符号)冲突而把一系列的类型、变量、函数放在一起的一种方式,命名控件要和变量作用域放在一起来理解,在作用域范围内使用命名空间就可以访问该命名空间内定义的符号。提示如下:compiling...I.cppE:\first\1.cpp(3):errorC2065:'cout':undeclaredidentifierE:\first\1.cpp(3):errorC2297:'«':illegal,rightoperandhastype'char[21]'E:\first\1.cpp(3):errorC2065:'endl':undeclaredidentifier执行cl.exe时出错.l.obj-1error(s),0warning(s)提示:使用std::coutStd::cout<<,/returntook!”〈<endl;实验内容.结构化程序设计基础下面程序是从键盘输入一个数,并求其阶乘:注意:重新建一个工程,不要在一个工程中有多个main函数出现#include<iostream>usingnamespacestd;intmain(){intn,fact;cin»"inputanum:""»n; 〃这条语句有错,应怎么改?注意cin和cout的区别for(inti=1;i<n;i++){fact=fact*i;}cout«n«"!="«fact«endl;return0;}验证:输入5,应该是120,那么20的阶乘呢?怎么解释结果?注意初始化和变量的范围提示:从变量的作用域上考虑问题:修改程序,在程序最后输出循环变量i的值注意程序中的语句:for(inti=1;i<n;i++){,和以前C程序的写法有什么区别?说明这种把变量定义在()中的含义及其局限#include<iostream>usingnamespacestd;intmain(){DOUBLEn,fact;cout<<z/inputanum”;〃改正过后结果;cin»n;fact=l;for(inti=l;i<n+l;i++){fact=fact*i;}cout<<n<<z,!=z/<<fact<<endl;return0;答:就是将FACT的初定义为1;将CIN的输入直接接要输入的变量;INT的范围在65353的范围这内因此当输入阶乘为20时它的结果远远大于它的长度此时需要修改它的类型长度即将它修改为DOUBLE类型即可。。。将INT放在括号里面的作用与在外面定义的作用是不同的INT放在里面表示它只实验内容引用和函数修改如下程序,使其能调用swap函数对参数进行交换:#include<iostream>usingnamespacestd;voidswap(inta,intb){ 〃在此将此语句改为:voidswap(int&a,int&b)intt;t=a;a=b;b=t;)intmain(){inta=1,b=6;cout«"beforeswap:\n"«"ais:"«a«"bis:"«b«endl;swap(a,b);cout«"afterswap:\n"«"ais:"«a«"bis:"«b«endl;return0;}提示:使用引用改正过后的结果是:^J*E:\first\Debuc\3.exe* 日回口befoi*eswap:ais:1bis:6afterswap:aisbisPressanykeytocontinue.实验内容函数的重载和默认参数从键盘上输入年龄(实数)和性别(用字符M和F表示),输出对应信息.要求如下键盘输入如:18.6F,则输出19yearsold,female19.4M,则输出19yearsold,male年龄采用四舍五入,如果不会,可以不实现,只取整即可编写print函数来处理(输出),要求函数可以用任意顺序的参数调用,程序结构如下intmain(){floatyear;charsex;输入print(year,sex)print(sex,year)print(); 〃这里输出0yearsold,male,即默认是。岁,malereturn0;)程序不要改变main函数结构,编写printf函数(思考需要编写几个?)提示:如何实现四舍五入?可以采用变量+0.5取整#include<iostream.h>#usingnamespacestd;#include<iostream>#include<string>usingnamespacestd;〃这里输出years和sex顺序不同,但方法体是相同的。voidprint(floatyear,charsex){inty=0;y=(int)year;if(sex==,m'|sex==,M')cout<<year<<"yearsold,male/z<<endl;elsecout<<year<<*yearsold,female“〈<endl;〃出参数顺序不同意外,其它都是相同的。voidprint(charsex,floatyear){inty=0;y=(int)year;if(sex=='m'||sex=='M')cout<〈year<<,zyearsold,malez,«endl;elsecout«year<<"yearsold,femalez,<<endl;}〃这里输出0yearsold,male,即默认是。岁,malevoidprint(){cout«*0yearsold,malez,<<endl;}intmain(){floatyear;〃变量year存放年龄变量。charsex;〃变量sex存放性别变量。charinput[20];〃存放输入字符串。charyears[20];〃存放输入字符串中年龄字符数组。chardot[20];〃存放输入字符数组中小数点以后的小数部分数组。char*p;〃存放小数点后第一位数值,用于判断是否进行四舍五入。若大于5则总体值+1。p=dot;cout<<*pleaseinputyournameandsex(.eg.22M)*«endl;cin>>input;〃输入字符数组。〃字符串数组最后一位一定是性别,首先提取出来存放在sex变量中。sex=inputEstrlen(input)-1];〃将输入数组除最后一个字符以外的字符串传入年龄数组。for(inti=0;i<strlen(input)-l;i++){years[i]=input[i];〃在年龄数组中获取小数点最近的数值,放入P中。for(intj=0;j<strlen(years);j++){if(years[j]=='.'){*p=years[j+1];::〃判断,若atoi(p)大于5,则年龄整体+1,若小于5,则年龄整体不变。if(atoi(p)>=5)year=(float)(atoi(years)+1);elseyear=(float)atoi(years);〃调用print函数。Pring函数要进行重载。print(year,sex);print(sex,year);print();〃这里输出0yearsold,male,即默认是0print();岁,malereturn0;2.3实验项目2运用类和对象进行程序设计实验目的掌握类的定义掌握对象的成员变量,成员函数的使用掌握对象成员访问控制的设定实验内容类基本语法练习#include<iostream>usingnamespacestd;classTime//定义Time类{public://数据成员为公用的inthour;intminute;intsec;intmain(){Timet1;//定义t1为Time类对象cin»t1.hour;〃输入设定的时间cin»t1.minute;cin»t1.sec;cout«t1.hourk^":"«t1.minute«^^:"«t1.sec«endl;return0:)改写程序,要求:改写后的程序:#include"stdafx.h"#include,/iostream,/usingnamespacestd;classTimepublic:Time();voidprinttime(); 〃实现输出时间函数voidsettime(int,int,int);〃实现时间的的格式设置private: 〃将成员函数改为私有的inthour;intminute;intsec;};Time::Time(){hour=minute=sec=0;)voidTime::settime(inth,intm,ints){hour=(h>=0&&h<24)?h:0;minute=(m>=0&&m<60)?m:0;sec=(s>=0&&s<60)?s:0;:voidTime::printtime(){cout«hour«":"<<minute<<":"«sec;}intmain(){inti;Timetl;tl.settime⑵8,8);cout<<”时骸?间?是?:";tl.printtime();cout«endl;cin>>i;printf("pause");return0;}〃①将数据成员改为私有的;在上面已经实现了〃②将输入和输出的功能改为由成员函数实现;在上面已经实现了〃③在类体内定义成员函数在上面已经实现了然后编译和运行程序。请分析什么成员应指定为公用的?什么成员应指定为私有的?什么函数最好放在类中定义?什么函数最好在类外定义?外部成员就应该定义为公有的,属性成员应该定义为私有的。函数声明应该放在类中,方便用户调用的函数应该放在类的外部下面程序设计了一个日期类如下,通过成员函数init来初始化,print输出classDate{inty,m,d;voidinit(){y=year;m=month;d=day;}voidprint(){cout«y«"year"«m«"month"«d«"day"«endl;)}intmain(){Dated;d.init();d.print();return0;}程序问题1:程序有3处错误,试改正提示:类定义格式,注意最后的分号在类定义完之后需要加分号init函数是否要参数需要带参数注意成员函数的访问属性,公有还是私有是公有的PUBLI改正后的程序:#include"stdafx.h"#include"iostream”usingnamespacestd;classDate{public:voidinit(int,int,int);voidprint();private:intyear,month,date;);voidDate::init(inty,intm,intd){year=y;month=m;date=d;voidDate::print(){cout<<,,date:,,<<year<<,,-0,?<<month<<,,-0//<<date<<endl;intmain(){Dated;inti;d.init(1990,8,9);d.print();cin>>i;return0;④把程序分成3个部分(文件),main函数所在的文件main,cpp,类的声明time.h,类的定义time.cpp。三个文件在同一个工程中。注意:哪些要包含头文件。⑤〃选做:(在头文件中使用头文件卫士(#ifndef……)来保护头文件可以被多次包含程序:问题2.根据上面修改的类,继续添加成员函数,要求能进行日期相减得到相差的天数,日期可以加上一个数,得到新的日期.为简化程序,设每个月都是30天.#include<iostregun>usingnamespacestd;classDate{inty,m,d;public:voidinit(intyear,intmonth,intday){y=year;m=month;d=day;)voidprint(){cout«y«*year month"<<d<<"day*«endl;}intsubDate(Date&d){intdy;intdm;intdd;if(this->y>d.y)dy=(this->y-d.y)*360; 〃把年求出并计算出它的天数elsedy=(d.y-this->y)*360;

if(this->m>d.m)dm=(this->m-d.m)*30; 〃取出它的月份并用天数表示elsedm=(d.m-this->m)*30;if(this->d>d.d)dd=(this->d-d.d); 〃取出它的天数elsedd=(d.d-this->d)*1;returndy+dm+dd;}DateaddNum(intnum){intdy,dm,dd;dy=num/360;的年份dm=(num-(360*dy))/30;的月份dd=(num-dy*360-dm*30)/I;的天数this->y=this->y+dy;this->m=this->m+dm;this->d=this->d+dd;〃传递一个数并计算出它〃传递一个数并计算出它〃传递一个数并计算出它〃传递一个数并计算出它〃传递一个数并计算出它〃当前年与它进行相加〃当前月与它进行相加〃当前日对它进行相加);intmain(){Datedl,d2,d3;dl.init(1900,2,1);d2.init(1900,1,1);cout«*thedatetotal:*«dl.subDate(d2)«endl;〃输出计算后的天数d3=dl.addNum(5);〃计算出它加后的年月日d3.print();return0;)提示:增加成员函数intsubDate(Dated){ 返回一个值DateaddNum(intnum){ 〃/返回在main函数中验证如下Dated1,d2,d3;d1.init(1900,2,1);d2.init(1900,1,1);cout«d1.subDate(d2); 〃结果为30d3=d1.add(5);d3.print(); //d1是1900,2,6思考:addNum(int 函数的返回值是否可以定义为void?即这样使用:d1.add(5);d1.print();d1自身的日期加5,如果要这么做,addNum函数要如何修改?提示:注意区分当前对象,如果需要返回当前对象自己,可以使用return*this;this是指向当前对象的指针,*this表示当前对象改正过后的程序:#include<iostream>usingnamespacestd;classDate{inty,m,d;public:voidinit(intyear,intmonth,intday){if(month>12||day>30){cout«,,dataerror/,«endl;exit(0);}else{y=year;m=month;d=day;}}voidprint(){cout<<y<<z/year month day”〈〈endl;〃传递一个数并计算〃传递一个数并计算〃传递一个数并计算〃传递一个数并计算〃当前年与它进行相〃当前月与它进行相〃当前日对它进行相DateaddNum(intnum){intdy,dm,dd;dy=num/360;出它的年份dm=(num-(360*dy))/30;出它的月份dd=(num-dy*360-dm*30)/1;出它的天数this->y=this->y+dy;加this->m=this->m+dm;加this->d=this->d+dd;加return*this;intsubDate(Date&d){intdata=(this->y*12*30+(this->m-l)*30+this->d)-(d.y*12*30+(d.m-l)*30+d.d);returndata;}};intmain(){Datedl,d2,d3;dl.init(1900,25,1);d2.init(1900,1,1);cout<<,,thedatetotal:z/«dl.subDate(d2)<<endl;〃输出计算后的天数d3=dl.addNum(5);〃计算出它加后的年月日d3.print();d3.print();return0;iJ程序:问题3.修改前面的程序,初始化一个错误的日期,如Datedl;dl.init(1900,13,45);程序可以运行么?怎么修改程序保证程序不会输出一个错误的日期voiderror(){if(y>24|y<0|m>60|m<0|d>60||d<0){cout<<"Timeerrorz/<<endl;exit(0);}提示:如果初始化出错了后面的就没必要运行下去了,可以用函数exit(0)结束程序通过这个例子程序思考对象的安全性,如何保证对象是正常的,能不能把日期的年月EJ开放给使用者等程序:问题4:(选作)使用下面公式增加求星期几的成员函数计算星期可以用蔡勒(Zeller)公式(只适合于1582年10月15日之后的情形)w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1公式中的符号含义如下:c:世纪(年的高两位数);y:年(年的低两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2005年1月1日要看作2004年的13月1日来计算);d:日;[]代表取整,即只要整数部分可以考虑增加如下一个weekDay()函数weekDay(){〃下面的y,m,d分别代表年月日y=y%100;if(m==1){m=13;y=y-1;}elseif(m==2){m=14;y=y-1;}intweek=(26*(m+1)/10+y+y/4-2*y/100+y/400+d-1)%7;//week是一个整数,1表示是星期一,2是星期二,……0则是星期天)算算今天星期几,看看公式是否准确程序:问题5.参照日期类,自己设计一个时间类,能初始化,可以输出,进行时间相减等操作说明:时间的表示可以自行拟定,一般是“时分秒”形式,可以增加毫秒,采用12或24小时制都可以。设计好了后大家可以互相交换“使用”一下,看看谁设计的类最好用2.3.2实验内容运算符重载问题1:以下有类Point,请添加适当成员函数以便Point对象可以进行运算classPoint{intx,y;public:voidinit(inta,intb){x=a;y=b;}voiddisp(){cout«x«>,"«y«endl;));intmain(){Pointa,b,c;a.init(1,2); b.init(3,4)c=a+b;c.disp();}#include<iostream>#include<math.h>usingnamespacestd;classPoint{intx,y;

〃初始化public:〃初始化voidinit(intaintb){x=a;y=b;)Pointoperator+(constPoint&a){〃实现两个复数相加的运算符重载函数的方法Points;s.x=this->x+a.x;s.y=this->y+ay;returns;}voiddisp(){cout<<"twocomplexrealizedrealaddis:"<<x<<endl;cout<<"twocomplexrealizedimageaddis:"<<y<<endl;}};intmain(){Pointa,bfc;ainit(1,2);b.init(3z4);c=a+b;〃调用运算符重载函数c.dispO;return0;}采用2种方式重载+运算符:成员函数和全局函数方式提不:成员函数方式Pointoperator+(constPoint&a)全局函数方式Pointoperator+(constPoint&a,constPoint&b)全局函数方式下要注意成员访问限制,可以使用友元或其他方式思考:这两种方式你更喜欢用哪一种?有什么优缺点?#include<iostream>usingnamespacestd;classPoint{public:intx,y;//x,?y是?坐?标括?public:voidinit(inta,intb){x=a;y=b;}voiddisp(){cout<<,zxArray:〃z/<<,zyArray:/z<<y<<endl;}Pointadd(Pointp){PointtempPoint;tempPoint.init(x+p.x,y+p.y);returntempPoint;)Pointoperator+(constPoint&a){Pointtemp;temp,x=x+a.x;temp.y=y+a.y;returntemp;}思考:后面的答案:#include<iostream.h>#includemath.h>classPoint{private:intx;inty;public:voidinit(inta,intb)〃初始化x=a;y=b;}friendPointoperator+(constPoint&a,constPoint&b){Points;s.x=a.x+b.x;s.y=a.y+byreturns;)voiddisp(){cout<<"twocomplexrealizedrealaddis:"<<x<<endl;cout<<"twocomplexrealizedimageaddis:"<<y<<endl;intmain(){Pointab,c;ainit(1,2);b.init(3f4);c=a+b;〃调用运算符重载函数c.dispO;return0;}问题2:设计一个复数类Complex,能进行复数的减法和输出,在main函数中的应用如下intmain(){Complexc1,c2,c3;intr,i;cout«Aninputfirst,randi:"cin»r»i;c1.init(r,i);cout«n\ninputsecond/andi:"cin»r»l;c2.init(r,i);c3=c2-c1;cout«c3;return0;}Changedtheforomasfollows:includeiostream.h>includemath.h>classComplex{intre;intim;public:voidinit(inta,intb)〃初始化re=a;im=b;}friendComplex operator-(Complexc1,Complexc2){Complexd;d.re=c1.re-c2.re;d.im=c1.im-c2.im;returnd;}voiddisp(){cout<<"twocomplexrealizedrealsubis:"<<re<<endl;cout<<"twocomplexrealizedimagesubis:"<<im<<endl;intmain(){Complexc1zc2zc3; 〃创建三个对象intrj; 〃实部虚部的值cout<<"\ninputfirst/andi:"<<endl;//cin>>r>>i;c1.init(7,7);〃当前对象来调用cout<<"\ninputsecond/andi:"<<endl;//cin>>r;c2.init(8,9);c3=c1-c2;c3.disp();return0;提示:重载・运算符不能使用成员函数形式2.3.3实验内容构造和析构函数设计日期类Date,满足如下要求生成对象可以不带参数.如Datea,默认日期是1900-1-1可以带亚洲日期格式参数.如Datea(1990,l,l)可以带欧洲日期格式参数.如 Datea(l,1,1990) 月,日,年格式可以输出,如cout«a;按年月日输出说明:为简化程序,规定字符串的月日必须用2位表示提示:欧洲亚洲旧期格式可以使用if语句判断,比如年小于12则表示月在main函数中验证是否正确Datea(l990,1,1),b(3,5,l990),c;cout«a«b«c;看结果是否正确问题1:修改设计的日期类,增加“时间“成员,要求时间成员是类对象。如下:classTime{inthour;public:Time(inth){hour=h;));classDate{Timet;);提示:此问题是解决“类中包含其他对象成员”的问题,需要注意的是Date类构造函数的写法,Date类构造函数应该有4个参数,如何把时间传递给其Time成员,必须使用构造参数表的形式才可以。如下面形式:Date(inty, ):year(y), t(time){…}问题2:修改Time类的构造函数,使其有默认参数,则Date类构造函数可以不用构造参数表形式思考:构造参数表有什么作用?什么时候需要问题3:选做:a)重载Date的<(小于)运算符,比较日期.自己定义比较规则b)从键盘读入若干个日期,放入到数组或向量vector中c)用对日期排序输出#include<iostream>usingnamespacestd;classTime{private:inthour;public:Time(){}Time(inth){hour=h;}voidsetTime(inth){hour=h;}intgetTime(){returnhour;)};classDate{private:inty,m,d;Timet;public:Date(Timetim):t(tim){ 〃构1造i函一数篦加6上?参?数篦列表括?)Date(intyear,intmonth,intday){y=year;m=month;d=day;)voidsetTime(inth){t.setTime(h);}voidprint(){cout<<y<<zz:zz<<m<<zz:zz<<d<<zz:〃<<t.getTime()<<endl;});intmain(){Dateb(1900,1,1);b.setTime(1);b.print();return0;提示:如果使用数组,则解决方法同c语言(自己编写排序函数);如果使用向量,则可以如下解决:向量定义vector<Date>vecDate;放入到向量用push_back(...)重载<运算符后,不需要指定比较函数,直接使用C++提供的sort排序(或者自己编写排序函数),如sort(v.begin(),v.end());使用sort函数要带头文件〈algorithm〉2.3.4实验内容I/O流和文件操作.编程:从键盘输入若干个数,以0结束,把这些数字写入到磁盘文件data,dat中提示:注意循环条件的写法,此处没有指定循环次数,可以用while循环,并注意变量的初始值文件操作需要有头文件fstream,注意文件的打开方式.从文件data.dat中读出数据,并把其中的素数显示在屏幕上,并统计输出有多少个素数。#include/zfstream.h〃#include"math.boolprime(intx);voiddatainput();voidmain(){intx;intnum;ifstreammyfile; 〃定"义?文?件t对?象6datainput();myfile.open(z/data,dat”,ios::binary);〃文?件t打洙?开anum=O;if(myfile){cout<<〃当獭?前。的?素?数篦为a:毗,z<<endl;while(myfile.good()) //good()是?ifstream中D的?函一数篦,?判口别健是?否?到?文?件t末?尾2(myfile.read((char*)&x,sizeofx);if(prime(x)){cout<<x<<endl;num++;}}cout«/z素?数篦个?数籥为a:毗zz<<num<<endl;else(cout<</zopenerr/z<<endl;boolprime(intx)(inti,j;if(x<=l)returnfalse;j=int(sqrt(x));for(i=2;i<=j;i++){if(x%i==0)returnfalse;returntrue;voiddatainput()(intx;ofstreamofs("data.dat〃,ios::binary);x=l;cout<<〃请?输?入?数筋据Y,?0结竦?。£z/«endl;while(x){cin>>x;ofs.write((char*)&x,sizeofx);)ofs.close();2.4实验项目3面向对象程序设计综合应用实验目的掌握面向对象的设计方法掌握面向对象中的继承多态的概念掌握面向对象的异常概念及使用了解模板,学会使用标准类实验内容多态与虚函数基本概念.有一个汽车类Vehicle,将它作为基类派生出小车类Car、卡车为类Truck和轮船类Boat,定义message函数用来显示各类信息。1)在基类汽车类Vehicle类中,定义一个虚函数message(),用来显示信息;(2)在各个派生类中,重新定义message()函数,以显示各自的信息;(3)在测试函数中,定义基类指针ptr,当它指向不同的对象时,则执行不同对象所对应类的成员函数message()。#include<iostream.h>classVehicle〃车辆类Vehicle定义所有车辆共有的属性是“车轮数”,“重量”{public:virtualvoidmessage(){cout«"Vehiclemessage\n";}private:intwheels;floatweigth;};〃汽车类Car定义classCar:publicVehicle{public:voidmessage(){cout«"Carmessage\n";}private:intpassengerjoad;};〃卡车类Truck定义classTruck:publicVehicle{public:voidmessage(){cout«"Truckmessage\n";}private:intpassengerjoad;floatpayload;};〃轮船类Boat定义classBoat:参考Truck补充完整voidmain(){Vehiclevehicle,*ptr;〃定义一个基类Vehicle对象vehicle和基类指针ptrCarcar;〃定义一个Car类对象carTrucktruck;〃定义一个Truck类对象truckBoatboat;〃定义一个Boat类对象boatptr=&vehicle;〃将指针ptr指向基类对象ptr->message();〃调用基类成员函数ptr=&car;〃将指针ptr指向Car类对象ptr->message();〃调用Car类成员函数ptr=&truck;〃将指针ptr指向Truck类对象ptr->message();〃调用Truck类成员函数ptr=&boat;〃将指针ptr指向boat类对象ptr->messag();〃调用Boat类成员函数)如果把基类的message不定义为virtual,结果是一样么?实际试一下,并说明为什么Sinclude<iostream.h>classVehicle〃车辆类Vehicle定义所有车辆共有的属性是〃车轮数〃,〃重量〃{public:virtualvoidmessage(){cout〈〈“Vehiclemessage\n/z;}private:intwheels;floatweigth;);〃汽车类Car定义classCar:publicVehicle{public:voidmessage(){cout<<,zCarmessage\nz,;}private:intpassengerload;);〃卡车类Truck定义classTruck:publicVehicle{public:voidmessage(){cout〈〈“Truckmessage\nz,;}private:intpassenger_load;floatpayload;};///////////////////〃轮船类Boat定义classBoat:publicVehicle{//参考Truck补充完整private:public:voidmessage(){cout<<,zBoatmessage\nz/;}private:intsize;intweight;);voidmain()(Vehiclevehicle,*ptr;〃定义一个基类Vehicle对象vehicle和基类指针ptrCarcar;〃定义一个Car类对象carTrucktruck;〃定义一个Truck类对象truckBoatboat;〃定义一个Boat类对象boatptr=&vehicle;〃将指针ptr指向基类对象ptr->message();〃调用基类成员函数ptr=&car;〃将指针ptr指向Car类对象ptr->message();〃调用Car类成员函数ptr=fetruck;〃将指针ptr指向Truck类对象ptr->message();〃调用Truck类成员函数ptr=&boat;〃将指针ptr指向boat类对象ptr->message();〃调用Boat类成员函数)2.从基类的图形类中派生出两个类。一个派生类是立方体类,在该类中,基类的x,y做作矩形的长和宽;另一个派生类是圆类,在该类中,新添加了成员是半径radius,半径的值等于x,y的坐标到原点的距离。#include<iostream.h>#include<math.h>classGraph〃定义一个图形基类{floatx,y;public:Graph(floatxx,floatyy){x=xx;y=yy;)floatarea(){return0;}};classRect:publicGraph〃由图形类派生出立方体{floatlength,width,high;public:Rect——补充构造函数{……}floatarea(){returnlength*width;}};classCircle:publicGraph〃由图形类派生出圆类{doubleradius;public:Circle——补充构造函数doublearea(){return3.1416*radius*radius;}};intmain(){Graphs0(10,10);Rects1(10,10);Circles2(10,10);coutvv"原面积="vvs0.area()«endl;〃调用基类的area()coutvv"矩形面积="<<s1.area()«endl;〃调用矩形的area()coutvv”圆的面积="<<s2.area()«endl;〃调用圆类的area()coutvv"面积="vvs2.Graph::area()vvendl;〃调用基类的area()return0;)提示:派生类构造函数因为需要初始化基类对象,需要使用构造参数表形式问题:修改程序,把基类的area改为纯虚函数,并增加一个纯虚函数display,用它来显示面积。并结合本题目说明纯虚函数的作用。#include<iostream.h>#include<math.h>classGraph〃定义一个图形基类{floatx,y;public:Graph(floatxx,floatyy){X二XX;y=yy;floatarea(){return0;}floatvolvm(){return0;});classRect:publicGraph〃由图形类派生出立方体{floatx,y,h;public://Rect 补充构造函数Rect(floatxx,floatyy,floathh):Graph(xx,yy){x=xx;y=yy;h二hh;}virtualfloatarea(){returnx*y;}virtualfloatvolvm(){returnx*y*h;}};classCircle:publicGraph〃由图形类派生出圆类{doubleradius;//doublex,y;public://Circle 补充构造函数Circle(double xx,doubleyy):Graph(xx,yy){radius=sqrt(xx*xx+yy*yy);}virtualdoublearea(){return3.14*radius*radius;}virtualdoublevolvm(){return4/3*radius*radius*radius;});intmain(){GraphsO(10,10);Rectsl(2,3,5);Circles2(3,4);cout原面积=〃<<sO.area()<<endl;//调用基类的area()cout<<〃原体积=〃<<sO.volvm()<<endl;〃调用基类的volvm()cout 矩形面积=〃<<sl.area()<<endl;〃调用矩形的area()cout<<“原体积=〃<<si.volvm()<<endl;〃调用基类的volvm()cout<<”圆的面积=〃<<s2.area()<<endl;〃调用圆类的area()cout原体积=〃<<s2.volvm()<<endl;〃调用基类的volvm()cout<</z面积="<<s2.Graph::area()<<endl;〃调用基类的area()cout<〈〃原体积=〃<<s2.Graph::volvm()<<endl;〃调用基类的volvm()return0;2.4.2实验内容多态的综合应用现在有一数据文件data,dat,其中存放了立方体、圆柱体、球形的若干数据,如下形式:Cube256Cylinder37Sphere5Cylinder49Cube348Cube123文件数据说明:立方体cube的长宽高数据,圆柱体cylinder的底面半径、和高的数据,球形sphere的半径,可以自己增加一些数据。现在要从文件中读出数据,并输出相应形态的体积(立方体的体积公式:长X宽X高;圆柱体体积:底面积X高;球体积:4/3*圆周率*半径的立方)提示:考虑通用性,即数据文件可能有很多记录,此题需要使用循环读取数据为了能让程序更具扩展性,可以使用多态来解决(比如,以后如果数据文件中加入了圆锥体、正方体等的数据,那么你的程序能适用吗?)参考的程序结构如下classVolume{体积虚函数或纯虚函数};classCube:publicVolume{覆盖虚函数);classCylinder:publicVolume{覆盖虚函数};classSpherepublicVolume{覆盖虚函数};floatcalVol(Volume*v){计算体积)intmain(){定义数组或向量(注意类型应该是指针或引用)打开文件读入数据创建对象存放到数组或向量中遍历数组或向量,调用calVol函数求出体积)SimpleprogramCodeasfollows:#include/zstdafx.h〃ttinclude^iostream^#include<math.h>usingnamespacestd;classVolume//体?积y虚存函一数麓或6纯?虚6函~数篦protected:floatx,y,z;public:Volume(floatxx=0,floatyy=0,floatzz=0){}virtualfloatCalVolume()=0;virtualvoidDisplay()=0;};〃立i?方?体?类;t?classCube:publicVolume〃覆2盖?虚6函一数解(private:floatlength,width,high;public:Cube(floatxx,floatyy,floatzz):Volume(xx,yy,zz)(length=xx;width=yy;high=zz;}floatCalVolume()(returnlength*width*high;}voidDisplay(){cout«z,立i?方?体?体?积y:,,<<CalVolume()<<endl;〃圆2柱体?类;t?classCylinder:publicVolume〃覆2盖?虚。函一数篦(private:floatradius,high;public:Cylinder(floatrr,floathh)radius=rr;high=hh;floatCalVolume()(return3.1416*radius*radius*high;}voidDisplay(){cout«z,圆2柱0体?体?积y:,z<<CalVolume()<<endl;)};〃球6体?体?积yclassSphere:publicVolume〃覆2盖?虚6函一数解{private:floatr;public:Sphere(floatrr)r=rr;floatCalVolume()return(4/3)*3.1416*r*r*r;voidDisplay()cout<<”球。体?体?积y:,z<<CalVolume()<<endl;intmain(){inta;Volume*ptr;Cubevl(10,10,10);Cylinderv2(2,4);Spherev3(3);ptr=&vl;ptr->Display();ptr=&v2;ptr->Display();ptr=&v3;ptr->Display();cin>>a;return0;}Thecomplexcodearelistedasfollows:#include"fstream.h"#include"math.h"#include"stdlib.h"#definePAI3.1415926#include"string.h"classVol(public:virtualdoublecalVol(Vbl*v)=0;);classcube:publicVol{doublelength,width,high;public:cube(double1,doublew,doubleh)(length=l;width=w;high=h;)-cube()1)doublecalVol(Vol*v););classCylinder:publicVol{doubleradius,high;public:Cylinder(doubler,doubleh)radius=r;high=h;)doublecalVbl(Vol*v););classSphere:publicVol(doubleradius;public:Sphere(doubler)(radius=r;)doublecalVol(Vol*v););doublecube::calVbl(Vol*v)(doublevol;cube*point;vol=point->length*point->width*point->high;returnvol;)doubleCylinder::calVol(Vol*v){doublevol;Cylinder*point;point=(Cylinder*)v;vol=point->radius*point->radius*PAI*point->high;returnvol;)doubleSphere::calVol(Vol*v){doublevol;Sphere*point;point=(Sphere*)v;vol=(4*point->radius*point->radius*point->radius*PAI)/3;returnvol;)structlinkllinkl*next;);structlink2{Cylinder*point;link2*next;);structlink3{Sphere*point;link3*next;);voidmain(){doublelength,width,high,radius;link1*pointl,*ptl,*head1=NULL;//Cube;link2*point2,*pt2,*head2=NULL;//Cylinder;link3*point3,*pt3,*head3=NULL;//Sphere;Cylinder*c2;Sphere*c3;charbuf[20];ifstreammfs("data.dat");if(mfs)(while(mfs.good())(mfs.getline(buf,20,'');if(strcmp(buf,"Cube")==O){mfs.getline(buf,2O,'');length=atof(buf);mfs.getline(buf,2O,'');width=atof(buf);mfs.getline(buf,20);high=atof(buf);cl=newcube(length,width,high);〃建立链表if(headl==NULL)head1=newlinkl;headl->point=cl;head1->next=NULL;pointl=head1;)else{pointl=head1;while(pointl)(ptl=pointl;point1=point1->next;)pointl=newlinkl;pointl->point=cl;point1->next=NULL;ptl->next=pointl;if(strcmp(buf,"Cylinder")==O)mfs.getline(buf,20,'');radius=atof(buf);mfs.getline(buf,20);high=atof(buf);c2=newCylinder(radius,high);〃建立链表if(head2==NULL){head2=newlink2;head2->point=c2;head2->next=NULL;point2=head2;)elsepoint2=head2;while(point2)point2=point2->next;point2=newlink2;point2->point=c2;point2->next=NULL;pt2->next=point2;if(strcmp(buf,"Sphere")==O)mfs.getline(buf,20);radius=atof(buf);c3=newSphere(radius);〃建立链表if(head3==NULL)head3=newlink3;head3->point=c3;head3->next=NULL;point3=head3;elsepoint3=head3;while(point3)(pt3=point3;point3=point3->next;)point3=newlink3;point3->point=c3;point3->next=NULL;pt3->next=point3;elsecout«"openerr"«endl;)inti=0;point1=head1;〃遍历链表while(pointl)|i++;cl=pointl->point;cout«i«"CubeVd1="«cl->calVol(c1)«endl;point1-pointl->next;}i=0;point2-head2;〃遍历链表while(point2)(i++;c2-point2->point;cout«i«"CylinderVol="«c2->calVol(c2)«endl;point2=point2->next;i=0;point3=head3;〃遍历链表while(point3)(i++;c3=point3->point;cout«i«"SphereVol="«c3->calVol(c3)«endl;point3=point3->next;5实验项目4小型综合程序设计(选做)从以下两个题目中选择一个.编写C++程序模拟一个流水账记录系统假设商店经销的各种类型的电视,记录电视销售情况,每天盘点时可以给出统计结果一种方案:从键盘输入售出的电视型号和价格等信息,最后输入end,把销售信息输出到文件保存,并输出统计结果扩展需求:假设商店经营范围扩大,还经营其他的电器,对你的程序进行扩展,看能不能适应新的改变。要求尽量少的改变以前代码。假设对数据统计的要求提高,如可以根据电视的价格范围进行统计,电视销售数量进行统计等,再对程序进行扩展,看能否适应改变2.职员管理系统要求:职员分为若干类:总经理,部门经理,普通员工,临时工等。职员管理系统在这里主要解决他们的工资发放问题,每类员工的工资计算方法不一样。职员的数据(自己设计,但应包括姓名,工号,实发工资等基本信息),存放在文本文件中,格式自定.可以从键盘输入职工信息,添加到磁盘的文本文件中.可以根据职工的姓名查找.可以排序输出.可以指定删除某个职工信息做完后可以根据你所知道的公司实际情况想一想程序是否可行,以后如果要修改应如何着手?如果要做一个“稍微实际”一点的职员管理系统,还需要考虑什么?附录:编辑器vi的使用:注意命令都需要在命令模式下输入移动光标类命令h:光标左移一个字符1:光标右移一个字符space:光标右移一个字符Backspace:光标左移一个字符k或Ctrl+p:光标上移一行j或Ctrl+n:光标下移一行Enter:光标下移一行w或W:光标右移一个字至字首b或B:光标左移一个字至字首e或E:光标右移一个字j至字尾):光标移至句尾(:光标移至句首):光标移至段落开头(:光标移至段落结尾gg:到文件开头nG:光标移至第n行首G:gg:到文件开头n+:光标下移n行n-:光标上移n行n$:光标移至第n行尾H:光标移至屏幕顶行M:光标移至屏幕中间行L:光标移至屏幕最后行0:(注意是数字零)光标移至当前行首$:光标移至当前行尾屏幕翻滚类命令Ctrl+u:向文件首翻半屏Ctrl+d:向文件尾翻半屏Ctrl+f:向文件尾翻一屏Ctrl+b;向文件首翻一屏插入文本类命令i:在光标前I:在当前行首a:光标后A:在当前行尾o:在当前行之下新开一行0:在当前行之上新开一行r:替换当前字符R:替换当前字符及其后的字符,直至按ESC键S:从当前光标位置处开始,以输入的文本替代指定数目的字符S:删除指定数目的行,并以所输入文本代替之new或nCW:修改指定数目的字n:表示一个数字nCC:修改指定数目的行删除命令(以下命令的n表示数字)ndw或ndW:删除光标处开始及其后的n-1个字do:删至行首d$:删至行尾ndd:删除当前行及其后n-1行dd:删除当前行x或X:删除一个字符,x删除光标后的,而X删除光标前的Ctrl+u:删除输入方式下所输入的文本u:撤销操作搜索及替换命令(pattem指要搜索的字符串):/pattern:从光标开始处向文件尾搜索pattern?pattern:从光标开始处向文件首搜索patternn:在同一方向重复上一次搜索命令N:在反方向上重复上一次搜索命令:s/pl/p2/g:将当前行中所有pl均用p2替代:nl,n2s/pl/p2/g:将第nl至n2行中所有pl均用p2替代:g/pl/s〃p2/g:将文件中所有pl均用p2替换最后行方式命令(指命令行显示在vi的最下面,以下的nl、n2、n3表示数字):nl,n2con3:将nl行到n2行之间的内容拷贝到第n3行下:nl,n2mn3:将nl行到n2行之间的内容移至到第n3行下:nl,n2d:将nl行到n2行之间的内容删除:w:保存当前文件:efilename:打开文件filename进行编辑:x:保存当前文件并退出:q:退出vi:q!:不保存文件并退出vi:!command:执行shell命令command:nl,n2w!command:将文件中nl行至n2行的内容作为command的输入并执行之,若不指定nl,n2,则表示将整个文件内容作为command的输入:r[command:将命令command的输出结果放到当前行。复制粘贴命令:拷贝另外一个文件到当前文件::r文件名在纯文本终端下:选定文本块,使用v(按v后,进入到可视模式,即可以使用光标键选择文本:命令模式输入“v”(小写)来按字符选定,输入“V”(大写)来按行选定,或输入“Ctrl-V”来按方块选定)复制选定块到缓冲区,使用y复制整行,用yy在同一编辑窗打开第二个文件,用:sp[filename]在多个编辑文件之间切换,用CTRL+ww剪切块,用d剪切整行用dd粘贴缓冲区中的内容,用P命令前面加数字表示重复次数,加字母表示使用的缓冲区名称。获取帮助,用:help[内容或命令]设置vim语法高亮显示和自动缩进vi在编辑c文件时,可以通过设置vim的配置文件来进行语法高亮和缩进,这样看的更清楚,vi还有很多插件,可以方便C++的编译运行,如自动补全等,需要的可在vim网站下载1、配置文件的位置在目录/etc/下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:".vimrc”(Linux下以.开头的文件表示是隐藏文件,需要使用Is-a可以看见)。例如,/root目录下,通常已经存在一个.vimrc文件,用户xiaoli的配置文件在/home/xiaoli下,没有可以自己建。2、设置语法高亮显示1)打开vimrc(当然可以用vi),添加以下语句来使得语法高亮显示:syntaxon2)如果此时语法还是没有高亮显示,那么在/etc目录下的profile文件中添加以下语句:exportTERM=xterm-color3、设置Windows风格的C/C++自动缩进(添加以下set语句到vimrc中)1)设置(软)制表符宽度为4:settabstop=4setsofttabstop=42)设置缩进的空格数为4setshiftwidth=43)设置自动缩进:即每行的缩进值与上一行相等;使用noautoindent取消设置:setautoindent4)设置使用C/C++语言的自动缩进方式:setcindent5)如果想在左侧显示文本的行号,可以用以下语句:setnu使用g++编译C++程序多个源文件生成可执行程序如果多于一个的源码文件在g++命令中指定,它们都将被编译并被链接成一个单一的可执行文件。下面是一个名为speak.h的头文件;它包含一个仅含有一个函数的类的定义:/*speak.h*/#include<iostream>classSpeak(public:voidsayHello(constchar*);下面列出的是文件speak.cpp的内容:包含sayHello()函数的函数体:/*speak.cpp*/#include"speak.h"voidSpeak::sayHello(constchar*str)(std::cout«"Hello"«str«"\n";I文件hellospeak.cpp内是一个使用Speak类的程序:/*hellospeak.cpp*/#include"speak.h"intmain(intargc,char*argv[])Speakspeak;speak.sayHello("world");return(O);)下面这条命令将上述两个源码文件编译链接成一个单一的可执行程序:$g++hellospeak.cppspeak.cpp-ohellospeak这里说一下为什么在命令中没有提到“speak.h”该文件(原因是:在“speak.cpp”中包含有"#include"speak.h"”这句代码,它的意思是搜索系统头文件目录之前将先在当前目录中搜索文件“speak.h"。而,,speak.h"正在该目录中,不用再在命令中指定了)源文件生成对象文件选项-c用来告诉编译器编译源代码但不要执行链接,输出结果为对象文件。文件默认名与源码文件名相同,只是将其后缀变为.。。例如,下面的命令将编译源码文件hellospeak.cpp并生成对象文件hellospeak.o:$g++-chellospeak.cpp命令g++也能识别.o文件并将其作为输入文件传递给链接器。下列命令将编译源码文件为对象文件并将其链接成单一的可执行程序:$g++-chellospeak.cpp$g++-cspeak.cpp$g++hellospeak.ospeak.o-ohellospeak选项-o不仅仅能用来命名可执行文件。它也用来命名编译器输出的其他文件。例如:除了中间的对象文件有不同的名字外,下列命令生将生成和上面完全相同的可执行文件:$g++-chellospeak.cpp-ohspkl.o$g++-cspeak.cpp-ohspk2.o$g++hspkl.ohspk2.o-ohellospeak使用gdb调试程序以下内容部分转自http://blog./haoel/archive/2003/07/02/2879.aspxGDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能:.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。.可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式).当程序被停住时,可以检查此时你的程序中所发生的事

.动态的改变你程序的执行环境。从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。一个调试示例IOeB§io.h>intfunc(intn)tintsum=0,i:.,ior(i=1;i<=h;i++){sum+=i;returnsum;使用GDB使用GDB调试:编译生成执行文件:注意:要带-g参数一Wall表示显示注意:要带-g参数一Wall表示显示所有警告信息启动GDBSoftwareFoundation,Inc.

version3orlaterarefreetochangeandredistributeit.totheextentpermittedbylaw.Typew.con血品匿机%86-linux-gnu”…ireadldbObrary yov/liDthreagjdb.sp.._/一至一 ——二.一J命令箱当于list,从第一仃开始列出源码。#include<stdio.h>intfunc(intn)intsum==0,i;..for(i=1;i<=n;i++)1 sum+=i;igdb)}etumsu里;土一工z।、八人人 苴接回车表不,重复上一次命令realomtrealintmain()nti;lt.蝴第图OS;i++)80483b2:filetst.c,I量断点,在源程序第16行处。断点,在函数func()入口oint2at0x804837a:filetst.c,nobreakDispEnbZV1—w1oinomMe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论