C++课后习题答案第五章
C++课后习题答案

-3-
{ a=b=0; cout<<”Default constructor called.\n”;
} A::A(int i,int j) { a=i; b=j; cout<<”Constructor called.\n”; } void A::print() { cout<<”a=”<<a<<”,b=”<<b<<endl; } void main() { A m,n(4,8); m.print(); n.print(); } Default constructor called. Constructor called. A=0,b=0 A=4,b=8 2. #include<iostream.h> class B { public: B(); B(int i,int j); void printb( ); private: int a,b; };
-6-
5. #include<iostream.h> class Set { public:
Set(){PC=0;} Set(Set &s); void Empty() {PC=0;} int IsEmpty() {return PC= =0;} int IsMemberOf(int n); int Add(int n); void Print(); friend void reverse(Set *m); private: int elems[100]; int PC; }; int Set::IsMemberOf(int n) { for (int i=0;i<PC;i++) if(elems[i]= =n)
《C语言程序设计教程》第三版课后习题参考答案

《C语言程序设计教程》第三版课后习题参考答案C语言程序设计教程第三版课后习题参考答案第一章:C语言概述1.1 C语言的特点答案:C语言是一种通用的、面向过程的程序设计语言,具有高效、简洁、灵活等特点。
它提供了丰富的程序设计元素和功能,适用于各种不同的应用领域。
1.2 C语言程序的基本结构答案:C语言程序由预处理指令、函数声明、函数定义、变量声明和语句组成。
其中,预处理指令用来引入头文件或定义宏,函数声明用来声明函数的名称和参数,函数定义用来实现函数的功能,变量声明用来声明变量的类型和名称,语句用来表达具体的计算过程。
1.3 C语言的数据类型答案:C语言提供了多种数据类型,包括基本类型(整型、浮点型、字符型等)和派生类型(数组、指针、结构体等)。
每种数据类型在内存中占据一定的存储空间,并具有特定的取值范围和操作规则。
1.4 C语言的运算符和表达式答案:C语言支持各种运算符和表达式,例如算术运算符(+、-、*、/等)、关系运算符(>、<、==等)、逻辑运算符(&&、||、!等)等。
通过运算符和表达式可以进行各种数值计算和逻辑判断。
第二章:基本数据类型与运算2.1 整型数据类型答案:C语言提供了不同长度的整型数据类型,包括有符号整型(int、long等)和无符号整型(unsigned int、unsigned long等)。
整型数据类型可以表示整数值,并具有不同的取值范围。
2.2 浮点型数据类型答案:C语言提供了浮点型数据类型(float、double等),用来表示带小数部分的实数值。
浮点型数据可以表示较大或较小的数值,并具有一定的精度。
2.3 字符型数据类型答案:C语言提供了字符型数据类型(char),用来表示单个字符。
字符型数据可以用于表示各种字符(包括字母、数字、符号等)。
2.4 布尔型数据类型答案:C语言不直接支持布尔型数据类型,但可以使用整型数据类型来表示布尔值(0表示假、非零表示真)。
C程序设计(第四版)(谭浩强)第五章课后习题答案

C程序设计(第四版)(谭浩强)第五章课后习题答案循环结构程序设计P115 5.1 用while计算1至100的合.#include<stdio.h>int main(){int i=1,sum=0;while(i<=100) //对于需要运算的值,要么在运算前可以赋值,要么一开始要指定.{sum=sum+i;i++;}printf("The sum is %d .\n",sum);return 0;}P117 5.2 用do-while来做1至100的合.#include<stdio.h>int main(){int i=1,sum=0;do// do-while可以做的事,用while都可以做到.{ //do-while先做一次执行,再判断条件,而while却是先做一个条件,再执行.sum=sum+i;i++;}while(i<=100);printf("The sum is %d .\n",sum);return 0;}#include<stdio.h>int main(){int i,sum=0;printf("Please input a number :");scanf("%d",&i); //输入10以内,正常,11的话,则sum仍然是0.while(i<=10){sum=sum+i;i++;}printf("The sum of 1-10 is %d .\n",sum);return 0;}#include<stdio.h>int main(){int i,sum=0;printf("Please input a number :");scanf("%d",&i); //输入10以内,结果一样.输入11的话,先做操作,所以sum=11.do{sum=sum+i;i++;}while(i<=10); //此重点在于理解二者的差别.printf("The sum of 1-10 is %d .\n",sum);return 0;}#include<stdio.h>int main(){int i,b=0,a,c;for(i=0;i<=1000;i++){printf("Please input amount :"); //循环体内套有输出语句以及跳出语句.scanf("%d",&a);b=b+a;if(b>=100){break; //break是用于跳出循环,对if无效,对while for switch 这一类.}}c=b/i;printf("conut is %d , aver is %d ",i+1,c); //注意%号后的形式,否则可能输出错误.return 0;}P127 5.5 continue的例子.#include<stdio.h>int main(){int i;for(i=1;i<20;i++){if(i%3!=0){continue; //跳过本次I,执行下一个i.}printf("%d ",i);}printf("\n");return 0;}P128 5.6 形成一个4*5的矩阵.#include<stdio.h>int main(){int i,j,a=0; //没有给初值,会出现警告: 使用了未初始化的局部变量“a”.for(i=1;i<=4;i++){for(j=1;j<=5;j++,a++) // a用来控制换行.{if(a%5==0){printf("\n");}printf("%d\t",i*j);}}printf("\n");return 0;}P131 5.7 用一个交错的式子求哌的近似值.#include<stdio.h>#include<math.h>int main() //四分之哌等于(1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11).{float s=1,n=1,m,sum=0,t;for(m=1;;m=m+2) //不确定哪项才会小于等于十的负六次方,所以不指定,无限下去.{ //不指定第二项,执行语句中应该有控制跳出的句子,否则死循环.t=(s)*(n/m); //这是第一项,s是符号,if(fabs(t)<=1e-6) //应该写在这里,题目要求这一项不累加进去.{break;}sum=sum+t; //因为累加项在这里,所以,一旦跳出就不会累加进来了.s=s*(-1); //变号一次.}printf("四分之一哌的值是%f.\n",sum);printf("一个完整哌的值是%f.\n",sum*4);return 0;}//下面这段小代码用来验证关于数值型数据类型的关系.去掉注释,可运行.//如果出现类似值为全1或是全零的话,一般可以考虑数据类型赋值或是定义错了的问题.//#include <stdio.h> //这是关于int float double三者关复杂关系的,乱啊,如果看不懂,可以通过实验自己明白来.////int main() //在C语言中,1.0认为是实数,即是double型,所以,如果你把它用float输出的话,会有警告:警告 1 warning C4305: “=”: 从“double”到“float”截断.//{// float m,a,b,c; //一旦定义了是这种类型的话,输出或是赋值的时候只能扩展不能截断,意思就是能变成double型,不能变成int型啦.而且后面的赋值会跟着它变成相应的类型.比如下面的m=1,其实得到的是m=1.0.// int d,e,f;// m=1;// a=1.0/3;// b=1/3;// c=m/3;// d=1.0;// e=1/4;// f=1.0/4;// printf("%lf(float用double的%lf来输出是可以的.)\n%f\n%f\n%f\n",m,a,b,c); //不管上面定义什么,这边写的输出类型是什么,就按相应的类型输出,有可能会出错,所以建议按定义的类型来输出.当然扩展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用%d来输出.// printf("%d\n%d\n%d\n",d,e,f); //但是,不相应的int型不可以用%f来输出的.因为int float就不同种类,一个是整数,一个是小数,float double同样是有小数点的// return 0;//}#include<stdio.h>int main() //这个就是著名的Fibonacci(费波那契数列问题){int f1=1,f2=1,f3,i;printf("%12d\n%12d\n",f1,f2);for(i=1;i<=38;i++) //注意,这是个基础问题,(i=1;i<=5;i++)这里其实进行了次运算,因为有f1,f2,要求有个,所以要有个.要么写<=38,要么写<39,边界问题一定要注意,不可以太随意{f3=f1+f2;printf("%12d\n",f3); //这个问题同样适用于"一对兔子一个月生一对"的问题.,f1=f2; //f1=f1+f2;此时它们各是,所以,现在的f1是.f2=f3; //f2=f2+f1;此时的f1已经是最先二者之和了.可以不用到f3.}return 0;}#include<stdio.h>#include<math.h>int main(){double num;int i;printf("Please input a number :");scanf("%lf",&num); //因为sqrt要求是浮点型,那就给它浮点型,需要时再强制转换.for(i=2;i<=sqrt(num);i++) //这边是<=号没错.{if((int)num%i==0) //如果在这期间有任何一个可以为零的话,则不是素数.{break; //当然跳出.}} //执行到这里的时候,i=5,已经变成了!!if(i<=sqrt(num)){printf("Not %d",(int)num);}else//如上所述,i=5,超出了求根的值,所以是素数.{printf("Yes %d",(int)num);}return 0;}P137 5.10 求100至200间的素数.#include<stdio.h>//不解释,HOHO>>>>...#include<math.h>int main(){double j;int i,k=0;for(j=100;j<=200;j++){for(i=2;i<=sqrt(j);i++){if((int)j%i==0){break;}}k=k+1; //这里是布局的开头.学习一下,有助逻辑.if(i<=sqrt(j)){printf("Not %d ",(int)j);if(k%5==0) //5个换一次行.{printf("\n");}}else{printf("Yes %d ",(int)j);if(k%5==0){printf("\n");}}}return 0;}P139 5.11 密码转换.#include<stdio.h>int main(){char c;c=getchar();while(c!='\n') //这也可以用数组来实现.{if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){if((c>='w'&&c<='z')||(c>='W'&&c<='Z')){c=c-22;}else{c=c+4;}printf("%c",c);c=getchar(); //套在循环里,依次得到字母,而while中判断回车为结束.}}printf("\n"); //这是布局问题.return 0;}P140 0.3 最大公约数和最小公倍数.#include<stdio.h>//最大公约数用累除法,除到无余数时的被除数是最大公约数.main (){int m, n, c, d;int gcd(); //这是最大公约数的缩写,此处调用函数,可以不写里面的实参.int lcm(); //这是最小公倍数的缩写,此处调用函数,可以不写里面的实参.printf("Please input two number :\n");scanf("%d %d",&m,&n);c=gcd(m,n); //c获取最大公约数d=lcm(m,n); //d获取最小公倍数printf("The GCD of %d and %d is : %d !\n", m, n, c);printf("The LCM of %d and %d is : %d !\n", m, n, d);return 0;}int gcd(int x, int y) //最大公约数Greatest Common Divisor{int temp;while(x%y!=0){temp=y; //y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去.y=x%y; //x,y的余数作为下一轮中的Y,由x%y来取得.x=temp; //刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用.}return y; //这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理. }int lcm(int x, int y) //最小公倍数Lowest Common Multiple{int i, temp;if(x<y) //此段代码结果是保证二者大的数在X上,小的数在Y上.即小于号降序.{ //以下为经典三行码,实现两个数的互换.temp=x;x=y;y=temp;}for(i=1; i<=y; i++) //设定一个区间,从1至大的数之间的循环.{if(!((x*i)%y)) //此式子如有余数,加上"!"号,会是假,则不返回,进行下一轮.{ //如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数.return x*i;}}}P140 0.4 判断一串输入的字符.#include<stdio.h>int main(){char ch;int a=0,b=0,c=0,d=0,e=0;printf("Please input the string\n");while((ch=getchar())!='\n') //直到回车.{if(ch<='z'&&ch>='a'){a++;}else if(ch==' '){c++;}else if(ch<58&&ch>47){d++;}else if(ch<='Z'&&ch>='A'){b++;}else{e++;}}printf("大写%d 小写%d 空格%d 数字%d 其它%d\n",a,b,c,d,e); }#include<stdio.h>//不理解时可以百度或是谷歌更多的信息.int main() //想办法既快速做完,又要消化理解{int temp,i,a,n,sum=0; //主逻辑,友好性暂时放松.scanf("%d %d",&a,&n); //a是数字,n是要乘的个数.temp=a; //先把第一阶的值存起来.for(i=0;i<n;i++){sum=sum+a;printf("%d + ",a); //事关布局.a=a*10+temp; //重点是每次乘,然后加上上一个数.}printf("= %d .",sum);return 0;}P140 0.6 1!+2!+3!+4!.....的值.#include<stdio.h>int main() //1!+2!+3!+4!.....{int i,j,k,sum=0,m=1;scanf("%d",&k); //比如设定为,值为.for(i=1;i<=k;i++) //第一层循环,指定到.{for(j=1;j<=i;j++) //第二层循环,指定至当前数.{m=m*j;} //到此是阶乘的结构.sum=sum+m;m=1;}printf("%d",sum); //完全不理解时,搜索并参考.return 0; //尝试自己做,第一次做出来就是自己的东西了.}P140 0.7 1至100,1至50平方,1至10倒数的总和. #include<stdio.h>int main(){int a,b;double c,asum=0,bsum=0,csum=0;for(a=1;a<=100;a++) //三个块分别注释验证结果.{asum=asum+a;}for(b=1;b<=50;b++) //在VS运行中,注意*.cpp为C++语言.{bsum=bsum+b*b; //为了避免语言差别,请注意文件名为*.c.}for(c=1;c<=10;c++) //c作浮点运算,所以定义在double类型中.{csum=csum+1/c;}printf("%lf",asum+bsum+csum);return 0;}PP#include<stdio.h>#include<math.h>int main(){int j,k,s[6],x=100,y,sum=0;for(j=153;j<=154;j++){for(k=2;k>=0;k--){s[k]=j%(int)pow(10,k+1)/(int)pow(10,k);y=pow(s[k],3);sum+=y;printf("%d-%d--%d\t",k,s[k],j);printf("%d\n",sum);}return 0;}P140 0.8 水仙花数.//#include <stdio.h> //一步步的发现问题.////int main() //在%和/号之间,以前pow.以后再做.//{// int i,j,k,a,b,c,sum=0; //这里逻辑对,算出来却错了.// for(i=2;i<=4;i++) //计算机在想什么,看来它的大脑难以模拟.// {// for(j=pow(10,i);j<=pow(10,i+1)-1;j++) //我不完全明白它遵守的逻辑. // {// for(k=0;k<=i;k++)// {// sum+=pow((j%pow(10,i+1)/pow(10,i)),3);// }// if(sum==j)// {// printf("%d 是水仙花数!\n",j);// }// sum=0;// }// }// return 0;//} //为什么还是无法实现?!#include<stdio.h>#include<math.h>int main(){int a,b,c,i,sum=0; //这里只计算三位数的.for(i=100;i<1000;i++){a=i/100;b=i%100/10;c=i%10;sum+=a*a*a+b*b*b+c*c*c;if(sum==i)printf("%d 是水仙花数.\n",i);}sum=0;}return 0;}P141 0.9 完数.#include<stdio.h>int main(){int i,j,r;for(i=1;i<=1000;i++) //零是个临界值,不能包括它.{r=0; //每次清零重来.类似水仙中的sum.for(j=1;j<i;j++){if(i%j==0) //除得尽即是因子.{r=r+j; //然后累加进去.}}if(r==i) //若相等.{printf("%d 是完数.\n",i);}}return 0;}P141 0.10 2/1+3/2+5/3+8/5+13/8…#include<stdio.h>int main() //10.007051{double i,a=2,b=1,c,s=0; //a是分子,b是分母.for(i=0;i<6;i++) //二十可以用户指定.{s+=a/b; //中间储值变量.c=a+b;b=a;a=c;}printf("%lf\n",s);return 0;}#include<stdio.h>int main() //从一百开始,减一半再自加两次,下降一次,反弹一次.{double sum=100,high=100,up,donw,i;for(i=1;i<10;i++) //不管指定到哪个数,都不会超过三百.{up=high/2;donw=up;high=donw; //自咬尾巴问题.sum+=donw*2;}printf("%lf %lf\n",donw,sum);return 0;}P141 0.12 猴子吃桃子.#include<stdio.h>int main() //从一百开始,减一半再自加两次,下降一次,反弹一次.{int i,sum=1;for(i=1;i<=10;i++) //临界要清楚,结果要与手算的前几个实例相匹配.{printf("倒数第%d天还剩有%d个桃子.\n",i,sum);sum=(sum+1)*2;}//printf("%d\n",sum);return 0;}P141 0.16 输出星号棱形图案.#include<stdio.h>#include<conio.h>main() //只关注左半部分.右半部分无视空格.{int i,j,k,m=6; //m可指定,指定中心点位置.可任意奇偶.for(i=1;i<=m;i++) //上半部分.其实也是正三角.{for(j=1;j<=m-i;j++) //一到中心点前i个位置填充空格.printf(" ");for(k=1;k<2*i;k++) //空格后向前填充星号的个数.是奇数.一,三,五... printf("*");printf("\n");}for(i=m-1;i>0;i--) //下半部分.其实也是倒三角.{ //减一是因为行数问题.这是中心行以下的.for(j=m-1;j>=i;j--)printf(" ");for(k=1;k<2*i;k++)printf("*");printf("\n");}getch(); //用户反应后结束.但,没必要.}。
课后习题二(第四章、第五章)

课后习题二(第四章、第五章)课后习题二(第四章、第五章)1、计算机使用总线结构便于增加外设,同时( C )A. 减少了信息传输量B. 提高了信息的传输速度C. 减少了信息传输线的条数D. 以上均不对2、计算机使用总线结构的主要优点是便于实现积木化,缺点是( C )A. 地址信息、数据信息和控制信息不能同时出现B. 地址信息和数据信息不能同时出现C. 两种信息源的代码在总线中不能同时传送D. 数据信息不能双向传送3、总线中地址线的作用是( C )A. 用于选择存储器单元B. 用于选择进行信息传输的设备C. 用于指定存储器单元和I/O设备接口电路的选择地址D. 以上均不对4、微型机读/写控制信号的作用是( D )A. 决定数据总线上的数据流方向B. 控制存储器操作(读/写)的类型C. 控制流入、流出存储器信息的方向D. 以上的任一种作用5、在三种集中式总线控制中,响应时间最快的方式是( C )A. 链式查询B. 计数器定时查询C. 独立请求D. 以上三种均可6、在三种集中式总线控制中独立请求方式响应时间最快,是以( B )为代价的A. 增加处理机的开销B. 增加控制线数C. 增加存储器的容量D. 增加处理机的时钟频率7、同步通讯之所以比异步通讯具有较高的传输频率是因为( E )A. 同步通讯不需要应答信号B. 同步通讯方式的总线长度较短C. 同步通讯用一个公共的时钟信号进行同步D. 同步通讯各部件存取时间比较接近E. 以上各种因素综合的结果8、存储器是计算机系统的记忆设备,它主要用来( D )A. 存放程序B. 存放微程序C. 存放特殊的数据D. 存放数据和指令9、存储字是( A )A. 存放在一个存储单元的二进制代码组合B. 存放在一个存储单元的二进制代码个数C. 存储单元的集合D. 与存储器无关10、存储字长是指( B )A. 存放在一个存储单元的二进制代码组合B. 存放在一个存储单元的二进制代码个数C. 存储单元的集合D. 以上均不对11、存储周期是指( C )A. 存储器的写入时间B. 存储器进行连续写操作所允许的最短时间间隔C. 存储器进行连续读或写操作所允许的最短时间间隔D. 与存储器的具体实现技术无关12、和外存储器相比,内存的特点是( A )A. 容量小、速度快、成本高B. 容量小、速度快、成本低C. 容量大、速度快、成本高D. 容量大、速度慢、成本低13、一个16K×32位的存储器,其地址线和数据线的总和是( B )16214=14+32 = 46KA. 48B. 46C. 36D. 3214、一个512KB的存储器(按字节编址),其地址线根数是( D )512219=KA. 64B. 32C. 20D. 1915、某计算机字长为16位,它的存储容量是64KB,按字编址,则它的寻址范围是(C )216=16+16 = 32K64A. 64KB. 32KBC. 32KD. 无法确定16、某一RAM芯片,其容量为512×8位,如果考虑电源和接地引脚,则该芯片引出的引脚数最少是(A )29=9 + 8 + 4 = 21512A. 21B. 19C. 17D. 1517、若主存每个存储单元为16位,则( B )A. 其地址线也为16位B. 其地址线与16无关C. 其地址线最少为16位D. 其地址线与16有关18、通常计算机的内存可采用( A )A. RAM和ROMB. RAMC. ROMD. 磁盘19、EPROM是指( C )A. 只读存储器B. 可编程的只读存储器C. 可擦除的可编程的只读存储器D. 电可擦除的可编程的只读存储器20、可编程的只读存储器( A )A. 不一定是可改写的B. 一定是可改写的C. 一定是不可改写的D. 以上均不对21、下列说法中( D )是正确的A. 半导体RAM信息可读可写,且断电后仍能保持记忆B. 半导体RAM是易失性RAM,而静态RAM中的存储信息是不易失的C. 半导体RAM是易失性RAM,而动态RAM中的存储信息是不易失的D. 半导体RAM是易失性RAM,而静态RAM只有在电源不掉时,所存信息是不易失的22、下列说法中( B )是正确的A. EPROM是可改写的,但改写一次后不能再次改写B. EPROM是可改写的,且可多次改写C. EPROM是可改写的,是用电信号直接改写D. EPROM是可改写的,是用磁信号直接改写23、和动态MOS存储器相比,双极性半导体存储器的性能是( C )A. 集成度高、存取周期快、位平均功耗少B. 集成度高、存取周期快、位平均功耗大C. 集成度低、存取周期快、位平均功耗大D. 集成度低、存取周期快、位平均功耗少24、在磁盘和磁带两种磁表面存储器中,存取时间与存储单元的物理位置有关,按存储方式分( B )A. 二者都是顺序存取B. 磁盘是随机半顺序存取,磁带是顺序存取C. 磁带是随机半顺序存取,磁盘是顺序存取D. 二者都是随机半顺序存取25、磁盘的记录方式一般采用( A )A. 调频制B. 调相制C. NRZD. NRZ-126、在磁表面存储器的记录方式中( D )A. 不归零制和归零制的记录密度是一样的B. 不归零制的记录方式中不需要同步信号,故记录密度比归零制高C. 归零制的记录方式中需要同步信号,故记录密度高D. 不归零制记录方式由于磁头线圈中始终有电流,因此抗干扰性能好27、磁盘存储器的平均等待时间通常是指( B )A. 磁盘旋转一周所需的时间B. 磁盘旋转半周所需的时间C. 磁盘旋转2/3周所需的时间D. 磁盘旋转1/3周所需的时间28、相联存储器是按( B )进行寻址的存储器A. 地址指定方式B. 内容指定方式C. 堆栈存取方式D. 队列存取方式29、一个四体并行交叉存储器,每个模块的容量是64K×32位,单体的存储周期为200ns,在下述说法中( B )是正确的A. 在200ns内,存储器能向CPU提供256位二进制信息B. 在200ns内,存储器能向CPU提供128位二进制信息C. 在50ns内,存储器能向CPU提供32位二进制信息D. 在50ns内,存储器能向CPU提供128位二进制信息30、主存和CPU之间增加高速缓冲存储器的目的是( A )A. 解决CPU和主存之间的速度匹配问题B. 扩大主存容量C. 即扩大主存容量,又提高了存取速度D. 降低主存价格31、在程序的执行过程中,Cache与主存的地址映射是由( C )A. 操作系统来管理的B. 程序员调度的C. 由相应硬件自动完成的D. 主存自身即可完成32、采用虚拟存储器的目的是( C )A. 提高主存的速度B. 扩大外存的存取空间C. 扩大存储器的寻址空间D. 以上都正确33、常用的虚拟存储器寻址系统由( A )两级存储器组成A. 主存—外存B. Cache—主存C. Cache—外存D. 以上任意组合均可34、在虚拟存储器中,当程序正在执行时,由(C )完成地址映射A. 程序员B. 编译器C. 操作系统D. CPU以下为书上相关例题35、在系统总线的数据线上,不可能传输的是( C )A. 指令B. 操作数C. 握手(应答)信号D. 中断类型号36、假设某系统总线在一个总线周期内并行传送4字节信息,一个总线周期占用2个时钟周期,总线时钟频率为10MHz,则总线带宽是( B )÷)(104=202A. 10MB/sB. 20MB/sC. 40MB/sD. 80MB/s37、某同步总线的时钟频率为100 MHz,宽度为32位,地址/数据总线复用,每传输一个地址或数据占用一个时钟周期。
《编译原理》课后习题答案第5章

《编译原理》课后习题答案第5章《编译原理》课后习题答案第5章.pdf《编译原理》课后习题答案第5章.pdf第5章自顶向下语法分析方法第1题对文法G[S] S→a|∧|(T) T→T,S|S(1) 给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。
(2) 对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3) 经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4) 给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
答案:(1) 对(a,(a,a)的最左推导为:S(T) (T,S) (S,S) (a,S) (a,(T)) (a,(T,S)) (a,(S,S)) (a,(a,S)) (a,(a,a))对(((a,a),∧,(a)),a) 的最左推导为:S(T) (T,S) (S,S) ((T),S) ((T,S),S) ((T,S,S),S) ((S,S,S),S) (((T),S,S),S) (((T,S),S,S),S) (((S,S),S,S),S) (((a,S),S,S),S) (((a,a),S,S),S) (((a,a),∧,S),S) (((a,a),∧,(T)),S)(((a,a),∧,(S)),S)《编译原理》课后习题答案第5章.pdf《编译原理》课后习题答案第5章.pdf(((a,a),∧,(a)),S) (((a,a),∧,(a)),a)(2) 改写文法为:0) S→a 1) S→∧ 2) S→( T ) 3) T→S N 4) N→, S N 5) N→ε非终结符FIRST集FOLLOW集S {a,∧,(} {#,,,)} T {a,∧,(} {)} N {,,ε} {)}对左部为N的产生式可知:FIRST (→, S N)={,} FIRST (→ε)={ε} FOLLOW (N)={)}由于SELECT(N →, S N)∩SELECT(N →ε) ={,}∩ { )}= 所以文法是LL(1)的。
C语言课后习题答案

void main()
{
int i=2,n,c;
c=0;
printf("守形数有:");
while(i<1001)
{
n=i*i;
if(n%10==i)
{
printf("%5d",i);
c++;
}
else if(n%100==i)
{
printf("%5d",i);
c++;
int main()
{
int i=0;
int nums[10];
int sum = 0;
int product = 1;
int sum_of_square = 0;
for( i=0; i<10; ++i )
{
printf( "请输入数据: " );
scanf( "%d", &nums[i] );
sum += nums[i];
#include<stdio.h>
void main()
{
int num1=1,num2=1,i=1;
printf("%3d%3d",num1,num2);
while(i<=20)
{
num1=num1+num2;
num2=num1+num2;
i++;
printf("%3d%3d",num1,num2);
{
n=a%10;
sum+=n;
C语言程序设计教程 第五章 课后习题参考答案

k++;
if(k%5==0)
printf("\n");
f1=f2;
f2=f;
}
printf("\n");
return 0;
}
P124 3统计一个整数的位数
#include<stdio.h>
int main()
{
int n,k=0;
printf("请输入n的值:");
int main()
{
int x,y,z,i=0;
for(x=1;x<=20;x++)
{
for(y=1;y<=33;y++)
{
for(z=3;z<=99;z=z+3)
{
if((5*x+3*y+z/3==100)&&(x+y+z==100))
i++;
}
}
}
printf("共有%d种买法:\n",i);
c语言程序设计教程第五章课后习题参考答案
P1242古典问题:兔子总数(斐波那契数列)
#include<stdio.h>
int main()
{
int f1=1,f2=1,f,i,k=0;
printf("%d\t %d\t",f1,f2);
k=k+2;
for(i=3;i<=20;i++)
{
f=f1+f2;
do
{
printf("请输入第%d个整数x=",i);
C语言第五章习题及答案

第五章习题答案一、选择题1) 有以下程序#include <stdio.h>main(){ int n=2,k=0;while(k++&&n++>2);printf("%d %d\n",k,n);}程序运行后的输出结果是A)0 2 B)1 3 C)5 7 D)1 22)有以下程序:main(){ int k=5;while(--k) printf("%d",k-=3);printf("\n");}执行后的输出结果是()。
A)1 B)2 C)4 D)死循环3)有以下程序#include<stdio.h>main(){int y=10;while(y--);printf(”y=%d\n”,y);}程序执行后的输出结果是A)y=0 B)y= -1 C)y=1 D)while构成无限循环4) 若变量已正确定义,有以下程序段i=0;do printf("%d,",i);while(i++);printf("%d\n",i)其输出结果是A)0,0 B)0,1 C)1,1 D)程序进入无限循环5)有以下程序:main(){ int i;for(i=1;i<=40;i++){ if(i++%5==0)if(++i%8==0) printf("%d",i); }printf("\n");}执行后的输出结果是()。
A)5 B)24 C)32 D)406) 有以下程序#includes <stdio.h>main(){ int a=1,b=2;for(;a<8;a++) {b+=a; a+=2;}printf ("%d,%d\n",a,b);}程序运行后的输出结果是(A)9,18 (B)8,11 (C)7,11 (D)10,147) 有以下程序#include<stdio.h>main(){int y=9;for( ; y>0;y--)if(y%3= =0) printf("%d",--y);}程序的运行结果是A)741 B)963 C)852 D)8754218) 一下程序段中的变量已正确定义for(i=0;i<4;i++,j++)for(k=1;k<3;k++); printf("*");程序段的输出结果是A)******** B)**** C)** D)*9) 有以下程序#iinclude <stdio.h>main(){ int i,j;for(i=3; i>=1; i--){ for (j=1;j<=2;j++) printf(“%d”,i+j);printf(“\n”);}}程序的运行结果是()A) 2 3 4 B) 4 3 2 C) 2 3 D) 4 53 4 5 5 4 3 3 4 3 44 5 2 3 答案:D 10)有以下程序main(){int i,j;for(i=1;i<4;i++){for(j=i;j<4;j++) printf(“%d*%d=%d “,i,j,i*j);printf(“\n”);}}程序运行后的输出结果是A) 1*1=1 1*2=2 1*3=3 B) 1*1=1 1*2=2 1*3=32*1=2 2*2=4 2*2=4 2*3=63*1=3 3*3=9C) 1*1=1 D) 1*1=11*2=2 2*2=4 2*1=2 2*2=41*3=3 2*3=6 3*3=9 3*1=3 3*2=6 3*3=911) 有以下程序#include<stdio.h>main(){int i,j,m=55;for(i=1;i<=3;i++)for(j=3;j<=i;j++) m=m%j;printf("%d\n",m);}程序的运行结果是A)0 B)1 C)2 D)312) 有以下程序#include <stdio.h>main(){ int i=5;do{ if (i%3= =1)if (i%5= =2){printf(“*%d”,i); break; }i++;}while(i!=0);printf(“\n”);}程序的运行结果是A)*7 B)*3*5 C) *5 D)*2*6 答案:A13) 有以下程序#include <stdio.h>main(){ int c=0,k;for(k=1;k<3;k++)switch(k){ default:c+=k;case 2:c++;break;case 4:c+=2;break;}printf("%d\n",c);}程序运行后的输出结果是A)3 B)5 C)7 D)914) 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是A)n=0;while((ch=getchar())!='\n')n++;B)n=0;while(getchar()!='\n')n++;C)for(n=0;getchar()!='\n';n++);D)n=0;for(ch=getchar();ch!='\n';n++);15)有以下程序#includemain(){int a=1,b=2;while(a<6){b+=a;a+=2;b%二10;}printf(”%d,%d\n”,a,b);}程序运行后的输出结果是A)5,11 B)7,1 C)7,11 D)6,116) 要求通过while循环不断读入字符,当读入字母N时结束循环。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
T(T &d)
{cout<<"调用构造函数2."<<endl;
cout<<d.a<<'\t'<<d.b<<endl;
}
~T() {cout<<"调用析构函数."<<endl;}
int add(int x,int y=10){ return x+y;}
private:
int a,b;
};
void main()
}
答案:
Mary
Jack
Jim
Mary
4.#include<iostream.h>
class A
{public:
int f1();
int f2();
void setx(int m){ x=m;cout<<x<<endl;}
void sety(int n){ y=n;cout<<y<<endl;}
int getx(){return x;}
}
答案:
点(3,4)到点(4,5)的距离是:2.82843
8.#include <iostream.h>
class A
{public:
A(){ a=5; }
voidprinta(){ cout<<"A:a="<<a<<endl;}
private:
int a;
friend class B;
};
class B
C++作业答案
C
第
5.1
第7章1.在下列结构变量的定义中,不正确的是(d)。
(a)struct employee
{char name[20];
long code;
}emp;
(b)struct
{char name[20];
longcode;
}emp;
(c)struct employee
{charname[20];
cout<<a.f1()<<'\t'<<a.f2()<<endl;
}
答案:
10
5
10 5
15 5
5.#include <iostream.h>
class T
{ public:
T(int x,int y)
{a=x;b=y;
cout<<"调用构造函数1."<<endl;
cout<<a<<'\t'<<b<<endl;
long code;
};
employee emp;
(d) struct
{char name[20];
long code;
}employee;
employee emp;
2.已知有职工情况结构变量emp定义为:
struct employee
{char name[20];
long code;
struct
{int year;
(a)w.no(b)p->no(c)(*p).no(d)*p.no
6.若有以下声明和定义,则下列引用非法的是(d)。
struct data
{intn;
floatscore;
data*q;
};
data a[3]={1001,87,&a[1],1002,75,&a[2],1003,90,&a[0]};
data*p=a;
(a)p->num(b)(p++).num(c)(p++)->num(d)(*p).num
4.下列四个运算符中,优先级最低的是(a)。
(a)++(b).(c)->(d)()
5.若有以下声明和定义,则下列错误的引用是(d)。
struct worker
{int no;
char name[20];
}w,*p=&w;
node *q;
};
void main()
{node a[]={{"Mary",a+1},{"Jack",a+2},{"Jim",a}};
node *p=a;
cout<<p->s<<endl;
cout<<p->q->s<<endl;
cout<<p->q->q->s<<endl;
cout<<p->q->q->q->s<<endl;
int month;
int day;
}birth;
}emp;
下列对emp的 birth正确赋值方法是(d)。
(a)year=1980;month=5;day=1;
(b)birth.year=1980;birth.month=5;birth.day=1;
(c)emp.year=1980;emp.month=5;emp.day=1;
{T d1(4,8);
T d2(d1);
cout<<d2.add(10)<<endl;
}
答案:
调用构造函数1.
4 8
调用构造函数2.
48
20
调用析构函数.
调用析构函数.
6.#include <iostream.h>
class T
{ public:
T(int x){ a=x; b+=x;};
static void display(T c)
{ cout<<"a="<<c.a<<'\t'<<"b="<<c.b<<endl; }
private:
int a;
static int b;
};
int T::b=5;
void main()
{T A(3),B(5);
T::display(A);
T::display(B);
}
答案:
a=3 b=13
a=5 b=13
(a)成员函数(b)构造函数(c)析构函数(d)复制构造函数
11.下面对构造函数的不正确描述是( b )。
第8章(a)系统可以提供默认的构造函数
(b)构造函数可以有参数,所以也可以有返回值
(c)构造函数可以重载
(d)构造函数可以设置默认参数
12.下面对析构函数的正确描述是( a,c )。
(a)系统可以提供默认的析构函数(b)析构函数必须由用户定义
obj1.printa();
obj2.display1(obj1);
obj2.display2(obj1);
obj1.printa();
}
答案:
A:a = 5
display1:a = 6
display2:a = 4
A:a = 5
5.3
1.使用结构类型表示复数。设计程序输入两个复数,可以选择进行复数的+、-、×或÷运算,并输出结果。
解答:略。
3.使用结构表示X—Y平面直角坐标系上的点,程序顺序读入一个四边形的四个顶点坐标,判别由这四个顶点的连线构成的图形是否正方形、矩形或其它四边形。要求定义求两个点距离的函数使用结构参数。
break;
default: cout << "input error!" << endl;
return;
}
cout << "c=" << c.re;
cout << setiosflags( ios::showpos );
cout << c.im << "i" << endl;
return;
}
2.把一个班的学生姓名和成绩存放到一个结构数组中,寻找和输出最高分者。
struct data
{int n;
float score;
};
void main()
{data a[3]={1001,87,1002,72,1003,90},*p=a;
cout<<(p++)->n<<endl;
cout<<(p++)->n<<endl;
cout<<p->n++<<endl;
cout<<(*p).n++<<endl;
(c)析构函数没有参数(d)析构函数可以设置默认参数
13.对静态成员的不正确描述是( c,d )。
(a)静态成员不属于对象,是类的共享成员
(b)静态数据成员要在类外定义和初始化
(c)调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针
(d)只有静态成员函数可以操作静态数据成员
14.下面选项中,不是类的成员函数为( c )。
{public:
void display1(A t)
{t.a++; cout<<"display1:a="<<t.a<<endl;};