版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
./实验一C++基础1.1实验目的1.了解并熟悉开发环境,学会调试程序;2.熟悉C++中简单的标准输入输出函数的使用方法;3.理解const修饰符的作用并学会应用;4.理解内联函数的优缺点并学会其使用场合;5.理解并学会函数重载;6.理解并熟练掌握使用new和delete来分配内存;7.理解并熟练掌握引用的使用方法.1.2实验内容1.2.1程序阅读1.理解下面的程序并运行,然后回答问题.#include<iostream.h>intmax_def<intx,inty>{ return<x>y?x:y>;}intmax_def<intx,inty,intz>{ inttemp=0; return<temp=<x>y?x:y>>>z?temp:z;}doublemax_def<doublex,doubley>{ return<x>y?x:y>;}intmain<>{ intx1=0; intx2=0; doubled1=0.0; doubled2=0.0; x1=max_def<5,6>; x2=max_def<2,3,4>; d1=max_def<2.1,5.6>; d2=max_def<12.3,3.4,7.8>;① cout<<"x1="<<x1<<endl; cout<<"x2="<<x2<<endl; cout<<"d1="<<d1<<endl; cout<<"d2="<<d2<<endl;② return1;}问题一:上述程序的输出结果是什么?问题二:用的是哪个函数?答:调用的函数是intmax_def<intx,inty,intz>{ inttemp=0; return<temp=<x>y?x:y>>>z?temp:z;}问题三:②处的输出结果为什么是d2=12,而不是d2=12.3?答:因为①处调用的是整型函数,d2在此函数中被转换为整型,小数点后面被删除.2.理解下面的程序并运行,然后回答问题.#include<iostream.h>intmain<>{ int*p1=newint;① int*p2=newint<0>;② char*p3=newchar[10];③ return1;}问题一:①、②、③处动态申请内存分别代表什么意思?答:①new动态分配存放一个整数的内存空间,并将其首地址赋给指针变量p1;②new动态分配存放一个整数的内存空间,并对其初始化赋值为0,并将其首地址赋给指针变量p2;③new动态分配存放10个字符型数组元素的内存空间,并将其首地址赋给指针变量p3.问题二:该程序存在什么不合理的地方?.答:程序结束时没有将分配的空间释放,应该使用delete函数释放内存.3.理解下面的程序并运行,然后回答问题.#include<iostream.h>voidswap<inta,intb>{ inttemp=a; a=b; b=temp;}voidswap<int*a,int*b>{ inttemp=*a; *a=*b; *b=temp;}intmain<>{ inti=5; intj=10; cout<<"Beforeswap:i="<<i<<",j="<<j<<endl; swap<i,j>;① cout<<"Afterthefirstswap:i="<<i<<",j="<<j<<endl; swap<&i,&j>;② cout<<"Afterthesecondswap:i="<<i<<",j="<<j<<endl; return1;}问题一:输出结果是什么?问题二:①处函数调用不能实现两个数的交换,而②可以,原因是什么?答:①处调用的函数只是交换了局部变量a和b,并没有改变i和j的值;②处调用的函数使用了引用形参,i和j的值随着此处调用的函数中a和b的对换而对换.问题三:②处调用的是哪个函数?答:调用的函数是voidswap<inta,intb>{ inttemp=a; a=b; b=temp;}1.2.2程序设计1.定义两个重名函数,分别求出两点间平面距离和空间距离.#include<iostream>#include<cmath>usingnamespacestd;intdistance<intx1,inty1,intx2,inty2>{doubledis;dis=sqrt<<x1-x2>*<x1-x2>+<y1-y2>*<y1-y2>>;cout<<dis<<endl;returndis;}intdistance<intx1,inty1,intx2,inty2,intz1,intz2>{doubledis;dis=sqrt<<x1-x2>*<x1-x2>+<y1-y2>*<y1-y2>+<z1-z2>*<z1-z2>>;cout<<dis<<endl;returndis;}voidmain<>{int a;inti,j,k,l,q,w,e,r,t,y;cout<<"请输入平面两点坐标:"<<endl;cin>>i>>j>>k>>l;a=distance<i,j,k,l>;cout<<"请输入空间两点坐标"<<endl;cin>>q>>w>>e>>r>>t>>y;a=distance<q,w,e,r,t,y>;}设计一个函数:exch<>,当调用exch<a,b,c>时,将a赋值给b,b赋值给c,c赋值给a,要求采用引用的方式来实现.#include<iostream>#include<cmath>usingnamespacestd;voidexch<int&m,int&n,int&p>{ inttemp=p; p=n; n=m; m=temp;}intmain<>{ inta=1,b=2,c=3; cout<<"a="<<a<<"b="<<b<<"c="<<c<<endl; exch<a,b,c>; cout<<"a="<<a<<"b="<<b<<"c="<<c<<endl; return0;}1.3思考题自己设计一个程序,测试指向常量的指针,常指针,指向常量的常指针之间的区别.#include<iostream>usingnamespacestd;voidmain<>{ inta=10; intconst*p=&a; cout<<a<<endl; cout<<*p<<endl; intb=20;}我们可以改变指针变量p所指向的内容,而不能改变p的地址空间,如添加上p=&b;我们就会发现编译错误!指向常量的指针const——int*p,特点是指针所保存的地址可以改变,然而指针所指向的值却不可以改变.同理,当添加*p=b时,会发生编译错误!指向常量的常指针constintconst*p特点是指针所保存的地址不可变,指针所指向的数值也不可变.编写一个函数,实现两个字符串变量的交换.#include<iostream>usingnamespacestd;voidExchg2<char*m,char*n>{chartmp=*m;*m=*n;*n=tmp;}voidmain<>{chara='q';charb='p'; cout<<"a="<<a<<"b="<<b<<endl;Exchg2<&a,&b>;cout<<"a="<<a<<"b="<<b<<endl;}实验三类和对象—构造函数与析构函数3.1实验目的1.理解this指针的作用和用法;2.掌握构造函数的定义和作用;3.掌握构造函数的使用;4.掌握拷贝构造函数的定义和使用;5.掌握构造函数的重载;6.掌握析构函数的定义和使用.3.2实验内容3.2.1程序阅读1.理解下面的程序并运行,然后回答后面的问题.#include<iostream.h>classCPoint{public: voidSet<intx,inty>; voidPrint<>;private: intx; inty;};voidCPoint::Set<intx,inty>{ x=x; y=y;}voidCPoint::Print<>{ cout<<"x="<<x<<",y="<<y<<endl;}voidmain<>{ CPointpt; pt.Set<10,20>; pt.Print<>;}问题一:以上程序编译能通过吗?如果不能,原因是什么?能通过编译.问题二:以上程序的运行结构是否正确,如果不正确,分析为什么,如何改正?结果不正确,因为Set函数中的形参与类中的相同产生错误,改为voidCPoint::Set<intm,intn>.2.理解下面的程序并运行,然后回答后面的问题.#include<iostream.h>classCPerson{public: voidPrint<>;private: CPerson<>;private: intage; char*name;};CPerson::CPerson<>{}voidCPerson::Print<>{ cout<<"name="<<name<<",age="<<age<<endl;}voidmain<>{ CPersonps<23,"张三">; ps.Print<>;}问题一:以上程序存在三个错误,在不改变主函数内容的前提下,试改正该程序.#include<iostream>#include<string>usingnamespacestd;classCPerson{public: voidPrint<>; CPerson<intm,stringn> { age=m; name=n; }private: intage; stringname;};voidCPerson::Print<>{ cout<<"name="<<name<<",age="<<age<<endl;}voidmain<>{ CPersonps<23,"张三">; ps.Print<>;}3.2.2程序设计1.设计实现一个CPoint类,满足以下要求: a.该类包含两个整型成员变量x〔横坐标和y〔纵坐标,以及一个输出函数Print<>用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量; b.可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值0; c.可以采用直接输入参数的方式来初始化该类的成员变量;#include<iostream>#include<ioamanip>usingnamespacestd;classCPoint{public: voidprint<>; CPoint<>{x=0;y=0;} point<intx1,inty1>; intGetX<>{returnx;} intGetY<>{returny;}private: intx; inty;};voidCPoint::print<>{ cout<<x<<setw<6><<y<<endl;}CPoint::point<intx1,inty1>{ x=x1; y=y1;}voidmain<>{CPointp; CPoint<>;p.print<>; p.point<1,2>; p.print<>; p.GetX<>; p.GetX<>;}3.3思考题1.设计一个CStudent〔学生类,并使CStudent类具有以下特点: a.有学生姓名、学号、程序设计、信号处理、数据结构三门课程的成绩; b.全部信息由键盘输入; c.通过成员函数统计学生平均成绩,当课程数量增加时,成员函数无须修改仍可以求取平均成绩; d.输出学生的基本信息、各科成绩与平均成绩; e.学生对象用链表存储; f.统计不及格学生人数.#include<iostream.h>#include<iomanip.h>#include<string.h>#defineN3#defineM3classCStudent{public: voidsetstudent<char*name,char*sn,floatscore[N]>; voidshowstudent<>;private: charSname[10]; charSno[8]; floatScore[3]; floatAvg; floatSum; intcount;};voidCStudent::setstudent<char*name,char*sn,floatscore[N]>{ inti; floatSum=0.0; intcount=0; strcpy<Sname,name>; strcpy<Sno,sn>; for<i=0;i<N;i++> { Score[i]=score[i]; count++; } for<i=0;i<3;i++> { Sum=Sum+Score[i]; } Avg=Sum/count;}voidCStudent::showstudent<>{ inti; cout<<Sname<<setw<16><<Sno<<setw<10>; for<i=0;i<3;i++> cout<<Score[i]<<setw<10>; cout<<setw<12><<Avg<<endl;}voidmain<>{ inti,j,k=0; charname[10],no[8]; floatscore[N]; for<j=1;j<=M;j++> {cout<<"pleaseinputstudent["<<j<<"]name"<<setw<6>; cin>>name; cout<<"pleaseinputstudent["<<j<<"]no"<<setw<6>; cin>>no; cout<<"pleaseinputstudent["<<j<<"]score"; for<i=0;i<N;i++> cin>>score[i]; CStudentS1; cout<<"student["<<j<<"]name"<<setw<6><<"no"; cout<<setw<15><<"程序设计"<<setw<10><<"信号处理"<<setw<10><<"数据结构"<<setw<10><<"avg"<<endl;S1.setstudent<name,no,score>; S1.showstudent<>;if<score[i]<60> k++; }cout<<"不及格人数:"<<k<<endl;}实验五派生与继承—单基派生5.1实验目的1.理解继承的概念;2.理解公有派生、私有派生和保护派生;3.理解单基派生类中构造函数和析构函数的执行顺序.5.2实验内容5.2.1程序阅读1.理解下面的程序并运行,然后回答后面的问题.#include"iostream.h"classCBase{public: CBase<inta> :a<a> { }protected: voidprint<> { cout<<"a="<<a<<endl; }private: inta;};classCDerive:publicCBase{public: voidprint<> { CBase::print<>; cout<<"b="<<b<<endl; }private: intb;};voidmain<>{ CDerived; d.print<>; CBaseb; b.print<>;}问题一:以上程序有两个错误,试指出来,并改正之.答:派生类CDerive中没有定义CDerive〔,主函数中没有给d,b对象赋值.#include"iostream.h"classCBase{public: CBase<inta> :a<a> { } voidprint<> { cout<<"a="<<a<<endl; }private: inta;};classCDerive:publicCBase{public: CDerive<inta,intc> :CBase<a> { b=c; } voidprint<> { CBase::print<>; cout<<"b="<<b<<endl; }private: intb;};voidmain<>{ CDerived<1,3>; d.print<>; CBaseb<2>; b.print<>;}2.理解下面的程序并运行,然后回答后面的问题.#include"iostream.h"classCBase{public: CBase<inta> :a<a> { cout<<"basestructure"<<endl; } ~CBase<> { cout<<"basedestructure"<<endl; } voidprint<> { cout<<"a="<<a<<endl; }protected: inta;};classCDerive:publicCBase{public: CDerive<inta,intb,intc> :CBase<a>,b<b>,c<c> { cout<<"derivestructure"<<endl; } ~CDerive<> { cout<<"derivedestructure"<<endl; } voidprint<> { CBase::print<>; cout<<"b.a="<<b.a<<endl; cout<<"c="<<c<<endl; }private: CBaseb; intc;};voidmain<>{ CDerived<1,2,3>;① d.print<>;}问题一:以上程序的输出结果是什么,为什么?答:程序错误,不能输出结果."cout<<"b.a="<<b.a<<endl;"这个语句中调用了基类中的保护参数a.问题二:①处语句执行完后,d.b.a的值为多少?答:b.a=2.实验七多态性—函数与运算符重载7.1实验目的1.理解静态联编和动态联编的概念;2.掌握成员函数方式运算符重载;3.掌握友元函数方式运算符重载;4.掌握++、--、=运算符的重载.7.2实验内容7.2.1程序阅读1.理解下面的程序并运行,然后回答后面的问题.#include"iostream.h"classCComplex{public: CComplex<> { real=0; imag=0; } CComplex<intx,inty> { real=x; imag=y; } intreal; intimag; CComplexoperator+<CComplexobj1>① { CComplexobj2<real+obj1.real,imag+obj1.imag>; returnobj2; }};voidmain<>{ CComplexobj1<100,30>; CComplexobj2<20,30>; CComplexobj; obj=obj1+obj2;② cout<<obj.real<<endl; cout<<obj.imag<<endl;}问题一:①处的运算符重载,为什么该函数的返回值要设计成CComplex类型?答:运算符重载函数的返回值与其操作类的类型相同.问题二:②处的运算符重载函数调用就相当于"obj=operator+<obj1,obj2>;",请问CComplex类中的运算符重载函数为什么只有一个参数?答:因为另一个参数是隐含调用,是CComplex类的当前对象.它通过this指针隐含地进行传递.2.理解下面的程序并运行,然后回答后面的问题.#include"iostream.h"classCComplex{public: CComplex<> { real=0.0; imag=0.0; } CComplex<floatx,floaty> { real=x; imag=y; } CComplexoperator+<CComplex&obj1,CComplex&obj2> { CComplexobj3<obj1.real+obj2.real,obj1.imag+obj2.imag>; returnobj3; } CComplex&operator++<CComplex&obj> { obj.real+=1; obj.imag+=1; returnobj; } voidprint<> { cout<<real<<"+"<<imag<<"i"<<endl; }private: floatreal; floatimag;};CComplex&operator--<CComplex&x>{ x.real-=1; x.imag-=1; returnx;}voidmain<>{ CComplexobj1<2.1,3.2>; CComplexobj2<3.6,2.5>; cout<<"obj1="; obj1.print<>; cout<<"obj2="; obj2.print<>; CComplexobj3=obj1+obj2; cout<<"befor++,obj3="; obj3.print<>; ++obj3; cout<<"after++,obj3="; obj3.print<>; --obj3; cout<<"after--,obj3="; obj3.print<>; CComplexobj4=++obj3; cout<<"obj4="; obj4.print<>;}问题一:以上程序中的三个运算符重载都有错误,试改正并分析输出结果.#include"iostream.h"classCComplex{public: CComplex<> { real=0.0; imag=0.0; } CComplex<floatx,floaty> { real=x; imag=y; } CComplexoperator+<CComplex&obj1> { CComplexobj2<real+obj1.real,imag+obj1.imag>; returnobj2; } friendCComplexoperator++<CComplex&obj> { obj.real+=1; obj.imag+=1; returnobj; } CComplexoperator--<>; voidprint<> { cout<<real<<"+"<<imag<<"i"<<endl; }private: floatreal; floatimag;};CComplexCComplex::operator--<>{ real-=1; imag-=1; return<*this>;}voidmain<>{ CComplexobj1<2.1,3.2>; CComplexobj2<3.6,2.5>; cout<<"obj1="; obj1.print<>; cout<<"obj2="; obj2.print<>; CComplexobj3=obj1+obj2; cout<<"befor++,obj3="; obj3.print<>; ++obj3; cout<<"after++,obj3="; obj3.print<>; --obj3; cout<<"after--,obj3="; obj3.print<>; CComplexobj4=++obj3; cout<<"obj4="; CComplexobj4.print<>;}结果:obj1=2.1+3.2;obj2=3.1+2.5;obj3=5.7+5.7;after++obj3=1.7+1.7;after--obj3=5.7+5.7;obj4=1.7+1.7;7.2.2程序设计把7.2.1中第一道题的程序改造成采取友元函数重载方式来实现"+"运算符,并采取友元函数重载方式增加前置和后置"++"以及"--"运算符重载,并设计主函数来验证重载运算符的用法.#include<iostream>usingnamespacestd;{ public: CComplex<> { real
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年销售会议现场互动游戏策划合同2篇
- 2025版双方行政行为执行与评估协议3篇
- 2025年度园艺用品及技术支持合作协议4篇
- 苗木价格波动风险共担2025年度合同3篇
- 2025年度共享办公空间租赁合同示范文本4篇
- 2025版门窗加工车间安全生产责任管理与保险合同4篇
- 二零二五版综合能源服务班组劳务分包协议2篇
- 2025年度城市居民车辆抵押借款合同模板4篇
- 2025新生入学教育法律协议书(国际视野)3篇
- 美容院2025年度美容师客户满意度提升聘用协议4篇
- 2024年公需科目培训考试题及答案
- 2024年江苏鑫财国有资产运营有限公司招聘笔试冲刺题(带答案解析)
- 2024年辽宁石化职业技术学院单招职业适应性测试题库含答案
- 广西桂林市2023-2024学年高二上学期期末考试物理试卷
- 财务指标与财务管理
- 部编版二年级下册道德与法治第三单元《绿色小卫士》全部教案
- 【京东仓库出库作业优化设计13000字(论文)】
- 保安春节安全生产培训
- 初一语文上册基础知识训练及答案(5篇)
- 血液透析水处理系统演示
- GB/T 27030-2006合格评定第三方符合性标志的通用要求
评论
0/150
提交评论