老师问题集锦_第1页
老师问题集锦_第2页
老师问题集锦_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、第一次作业的第二题我没有使用位运算已经做出来了,但是我在尝试位运算时一直得不出结果,您能不能看看怎么回事?#include#includemain()FILE *fp,*fq;unsigned char i,x8,a256;for(i=0;i+)/x0=i%2;x1=(i/2)%2;x2=(i/4)%2;x3=(i/8)%2;x4=(i/16)%2;/x5=(i/32)%2;x6=(i/64)%2;x7=(i/128)%2;/ai=x0*128+x1*64+x2*32+x3*16+x4*8+x5*4+x6*2+x7;ai=(i(unsigned char)1(unsigned char)1)|

2、(i(unsigned char)2(unsigned char)2)|(i(unsigned char)3(unsigned char)3)|(i(unsigned char)7(unsigned char)3)|(i(unsigned char)7(unsigned char)2) |(i(unsigned char)7(unsigned char)7);if(i=255)break;if(fp=fopen(fp.txt,rb)=NULL)printf(cannot open fp.datn);exit(0);if(fq=fopen(fq.txt,ab)=NULL)printf(canno

3、t open fq.datn);exit(0);while(!feof(fp)if(fread(&i,1,1,fp)=0)break;fwrite(&ai,1,1,fq);fclose(fq);fclose(fp);答:循环中加入打印语句跟踪: printf(%0 x %0 x=, i, ai);会发现从0 xc0开始,逆转后都是0 xff,这肯定不对,原因我想还是我课上讲过的,计算过程中自动转化成带符号位的int了。需要多次左右移位的,必须分步移位。看来即使每个数字前加 (unsigned char) 也没用。不能用一个表达式:ai=(i(unsigned char)1(unsigned c

4、har)1) |(i(unsigned char)2(unsigned char)2) |(i(unsigned char)3(unsigned char)3) |(i(unsigned char)7(unsigned char)3) |(i(unsigned char)7(unsigned char)2) |(i(unsigned char)7(unsigned char)7);来实现。=2. 第一次作业第一题老师,按照您上课说的我改了一下程序,发现还是不对(就是文件以空格结束),fscanf没有返回0,读到空格(就是没有内容)返回了-1,这是因为vs2012和vs2008的不同造成的?我查

5、了一下书发现写的是返回数据个数,按理说不该是-1啊。 答:vs2012和vs2008是否不同不是很清楚,那就判断fscanf()=0 终止吧又问: 我就是换成了=0不过EOF的值是不是-1?它能够返回EOF吗? 用F1键查看fscanf的在线帮助Return Value Each of these functions returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned.

6、A return value of 0 indicates that no fields were assigned. If an error occurs, or if the end of the file stream is reached before the first conversion, the return value is EOF for fscanf and fwscanf.不成功确实返回0或者-1(EOF)。=3. 关于第一次作业第二题:今天想起检验一下,可发现程序达不到预期目标.老师,我的程序是这样的。#include#include#includemain()FIL

7、E *fp,*fq;unsigned char c;unsigned char flag=NULL;/NULL的二进制码为00000000int i,sign=1;/sign的二进制码为00000001if( ( fp=fopen(a.txt,r+b) )=NULL )printf(cannot open the file!);exit(0);if( ( fq=fopen(b.txt,w+b) )=NULL )printf(cannot open the file!);exit(0);while(!feof(fp)flag=NULL;c=fgetc(fp); for(i=0;i=7;i+)fl

8、ag+=( ( c&(signi )(7-i);/*算法思想即利用sign(00000001)进行每个字符的操作:比如将第k个转移至第8-k个(第k个记为k)(以第3个为例):(1)首先得到00300000(i=5);(2)然后得到00000003(右移5位);(3)最后得到00000300(左移7-5=2位);即完成倒置,其余类似,最后相加即可。*/fputc(flag,fq);fclose(fp);fclose(fq);我想问下,就是我的这个方法能行么。答:你的程序中,不要写unsigned char flag=NULL;这会有编译警告错误。NULL是 void *类型的,专门给指针赋空值

9、用的,一般的量赋初值,直接给0。我运行测试了你的程序,结果是对的,说明你的逆转算法是正确的。检查方法:由a,txt生成b.txt后,再修改一下程序,读入b.txt生成c.txt,看a.txt和c.txt是否相同。=4. 求教(1) 复制构造函数是怎么构造的啊? 为什么课件上原来那个没有复制构造函数而且是*str的会出错啊?在哪里公用一个地址了?(2) 怎么给两个类设置一个友元?答:(1) 缺省复制构造函数会把一个对象原样复制到新的一个对象上,如果原来的对象里有指针*str,那么也把这个指针的值复制到新的对象中相应的str中,这就导致两个对象的str指针指向了同一块动态内存。因此析构时,析构第一

10、个对象没有问题,析构函数把str所指的动态内存delete释放了,但析构第二个对象时,由于str所指的动态内存已经被析构第一个对象时释放掉了,导致本次delete会出现致命错误。 (2) 给两个类设置同一个友元函数,就是把 friend double TotalWeight(Boat &B, Car &C); 在每个类的public中列一次。 在class Boat 定义前加 class Car; 进行类的向前引用说明。=5. 关于作业中的小问题#include #include using namespace std; class Rectangle public: Rectangle(in

11、t x=0,int y=0,int a=0,int b=0); Rectangle(); void Print(); void Set(); void Area();void Diagonal();private: int x,y,a,b; ;inline Rectangle:Rectangle(int x,int y,int a,int b) this-x=x;this-y=y;this-a=a;this-b=b; cout构造函数被调用! endl; Rectangle:Rectangle() cout析构函数被调用! endl; void Rectangle:Print()cout(x,

12、y)endl(a,b)endl;void Rectangle:Set() x+;y=a+b;a-;b=x-y;coutchange (x,y) (a,b)endl;void Rectangle:Area()int s;s=abs(b-y)*abs(a-x);couts=sendl;void Rectangle:Diagonal()double d;d=sqrt(b-y)*(b-y)+(a-x)*(a-x);coutd=dendl;void main()Rectangle rectangle(2,5,3,6),another();/*another(6);*/another.Print();re

13、ctangle.Print();rectangle.Diagonal();rectangle.Area();rectangle.Set();rectangle.Print();rectangle.Diagonal();rectangle.Area();我不太明白为什么another()中默认值不能变成0,0,0,0,我如果给一个6,他就变成6,0,0,0,了,但如果什么都不写编译说error C2228: “.Print”的左边必须有类/结构/联合;我有点没懂,请老师指点迷津答:出现编译错误:test.cpp(31) : error C2668: “sqrt”: 对重载函数的调用不明确 是因为

14、语句:d=sqrt(b-y)*(b-y)+(a-x)*(a-x); 中,a,b,x,y都是int型,因此sqrt()中的表达式也是int型,造成编译器不知道调用哪个重载的sqrt,应该改为: d=sqrt(double)(b-y)*(b-y)+(a-x)*(a-x); 出现编译错误:test.cpp(35) : error C2228: “.Print”的左边必须有类/结构/联合 是因为前面的语句:Rectangle rectangle(2,5,3,6),another();定义another对象如果不赋初值,就不要带(),写为:Rectangle rectangle(2,5,3,6),ano

15、ther;就没有问题了。 =6. 程设第三次作业选做题老师您看下这次的选做题是不是这个意思,有一处我没懂,每一次调用TotalWeight函数时都会调用构造函数么?#includeusing namespace std;class Car;class Boatpublic: Boat(int w=0); Boat(); friend void TotalWeight(Boat B, Car C); void Set(int w); void Print();private: int weight;class Carpublic: Car(int w=0); Car(); friend void

16、 TotalWeight(Boat B, Car C); void Set(int w); void Print();private: int weight;Boat:Boat(int w):weight(w) coutboat constructor called weightendl;Boat:Boat() coutboat destructor called weightendl; void Boat:Set(int w) weight=w; Print();void Boat:Print() coutboat weight=weightendl;void TotalWeight(Boa

17、t B, Car C) int add; add=B.weight+C.weight; coutadded weight=addendl;Car:Car(int w):weight(w) coutcar constructor called weightendl;Car:Car() coutcar destructor called weightendl; void Car:Set(int w) weight=w; Print();void Car:Print() coutcar weight=weightendl;int main() Boat B(4); Car C(5); B.Print

18、(); C.Print(); TotalWeight(B,C); B.Set(7); C.Set(9); TotalWeight(B,C); return 0;答:运行结果:boat constructor called 4car constructor called 5boat weight=4car weight=5added weight=9boat destructor called 4car destructor called 5boat weight=7car weight=9added weight=16boat destructor called 7car destructor

19、 called 9car destructor called 9boat destructor called 7请按任意键继续. . . 由于TotalWeight函数的形参是Boat B, Car C,每次调用TotalWeight函数时都会调用复制构造函数来复制构造C和B,函数执行完也就调用相应析构函数析构掉这两个对象。因为你没给Boat和Car类写复制构造函数,编译系统会自动各生成一个来完成此事,但不打印信息,你看不到。如果你在Boat和Car类中加入:Boat:Boat(Boat &p):weight(p.weight) coutboat copy constructor called

20、 weightendl;Car:Car(Car &p):weight(p.weight) coutcar copy constructor called weightendl;你就会发现每次调用TotalWeight函数时都会调用这两个复制构造函数来复制构造C和B。构造和析构是一一对应的。 =7. 作业疑问我的程序写好了,但是出现了这样的问题不知道是哪里出现了问题,希望您能点拨一下,可能是我对于类的掌握还不够吧,谢谢老师!#includeusing namespace std;class CIRCLEpublic:int x; /成员数据圆心横坐标int y; /成员数据圆心纵坐标CIRCLE(int x,int y);/设置构造函数CIRCLE(CIRCLE &p);/复制构造函数 CIRCLE()cout析构函数被调用!endl;/析构函数(打印信息表示其被调用)void Set(int r)/新值函数R=r;void Print()/打印成员值函数cout圆心的横坐标为x 圆心

温馨提示

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

评论

0/150

提交评论