版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《C++程序设计语言》习题答案PAGEPAGE9第一章练习题1.简述C++语言的特点。答:C++语言的主要特点如下:以C作为其子集,兼取了C语言简洁、相对低级的特性,但摒弃掉了C语言中若干不安全的特性,其语言表现力远远强于C语言;是一种强类型语言;具有较高的可移植性和可维护性;适合于大部分系统程序及应用程序的开发;是一种不限定应用领域的一种通用程序设计语言;是一种能支持面向过程、面向模块、面向对象和类属程序设计范型的混合型程序设计语言。2.C++语言支持哪几种程序设计范型?答:是一种能支持面向过程、面向模块、面向对象和类属程序设计范型的混合型程序设计语言。3.C++中有哪些重要的程序设计理念?《C++程序设计语言》习题答案全文共63页,当前为第1页。答:C++中提供了以下这些重要的程序设计理念:类、派生类、继承、抽象类、接口与实现的分离及模板等重要的面向对象理念。《C++程序设计语言》习题答案全文共63页,当前为第1页。第二章练习题:编写一个输出字符串“WelcometoC++!”的程序(参照2.1.3节程序)。解1:#include<iostream>#include<string>usingnamespacestd;intmain(){stringss;ss=“WelcometoC++!”;cout<<ss<<endl;return0;}解2:#include<iostream>usingnamespacestd;intmain(){cout<<“WelcometoC++!”<<endl;return0;}解3:#include<iostream>usingnamespacestd;intmain(){char*cc;cc=“WelcometoC++!”;cout<<cc<<endl;return0;}什么是程序设计范型?答:所谓程序设计范型(ProgrammingParadigm)是人们在程序设计时所采用的基本方式模型。程序设计范型决定了程序设计时采用的思维方式、使用的工具,同时又有一定的应用范畴(即受一定的应用领域约束)。过程程序设计、模块化程序设计、函数程序设计、逻辑程序设计、面向对象程序设计等,都是我们常见的、不同的程序设计范型。什么是面向过程、面向模块、面向对象及类属程序设计范型?它们各自的特点是什么?答:所谓过程程序设计范型即:确定程序中所需要的过程;采用过程处理中所找到的最好的算法。它的特点是:过程程序设计的核心是确定程序设计时所需的过程(Procedure),其程序的组件粒度是过程,每个过程是语言中的过程(Procedure)或函数(Function)单元,它完成某一个/类特定的任务。该范型的侧重点在于处理过程——执行预期计算所需要的算法。模块化程序设计范型是:确定程序中所需要的模块;将程序划分成模块,使得数据隐藏在程序的各模块之中。它的特点是:程序组件粒度是模块,将相关的数据和过程/函数聚集在某一模块中,模块对外只提供接口/界面,将其实现隐藏起来,其它模块不能随意访问该模块中的内容。《C++程序设计语言》习题答案全文共63页,当前为第2页。面向对象程序设计范型中程序设计的理念是:确定程序中所需要的类;为每一个类提供一组完整的操作集;用继承性将类之间的共性显式地表示出来。它的特点是:同时支持ADT和继承性的程序设计范型,支持软件的快速开发,而且大大提高了软件的重用(Reuse),特别是极大地增强了软件的可扩充性和可维护性。《C++程序设计语言》习题答案全文共63页,当前为第2页。类属/通用程序设计范型的理念是:确定程序中所需要的算法;将它们参数化,使之能适用于各种类型和数据结构。它的特点是:用模板抽象具有共性的类或函数,是代码的重用性更高。C++语言支持哪几种程序设计范型?相应的语言支持机制是什么?答:C++语言是一种支持多种程序设计范型的语言,它支持:面向过程程序设计范型、面向模块程序设计范型;面向对象程序设计范型;类属/通用程序设计范型。C++语言支持过程程序设计范型的主要语言机制有:函数、向函数传递参数及从函数返回值;变量的定义与声明;算术运算与关系运算(符);条件判断语句与循环语句;指针与数组。C++中支持模块化程序设计范型的主要机制有:名字空间(Namespace),一种模块机制(Mechanism)分别编译(SeparateCompilation),模块的接口和实现可分别编译范围解析(::),如Stack::push(charc)和Stack::pop()异常处理(Exceptionhandling)C++中支持面向对象程序设计范型的主要机制有:Classes(一般意义上的类)Concretetypes(有实例的类,即可以产生对象的类)Abstracttypes(抽象类,即无实例的类(只定义了结构和接口的类))Virtualfunctions(虚拟函数)Derivedclasses(派生类)《C++程序设计语言》习题答案全文共63页,当前为第3页。C++中支持类属/通用程序设计范型的主要机制是模板(Template)。《C++程序设计语言》习题答案全文共63页,当前为第3页。第三章练习题:定义声明一个月Month枚举类型。解:enumMonth{Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Dec=11,Mov=12};定义一些基本类型的变量,并打印输出其存储空间大小。解:#include<iostream>usingnamespacestd;intmain(){inti=5;charc=‘A’;floatf=5.21f;doubled=8.23;boolbb=false;cout<<“i=“<<i<<“;”<<”Memoryspace:“<<sizeof(int)<<endl;cout<<“c=“<<c<<“;”<<”Memoryspace:“<<sizeof(char)<<endl;cout<<“f=“<<f<<“;”<<”Memoryspace:“<<sizeof(float)<<endl;cout<<“d=“<<d<<“;”<<”Memoryspace:“<<sizeof(double)<<endl;cout<<“bb=“<<bb<<“;”<<”Memoryspace:“<<sizeof(bool)<<endl;return0;}3.定义各种整数类型的变量并赋初值,然后分别用八进制、十进制和十六进制打印输出其值。解:#include<iostream>usingnamespacestd;intmain(){intii=85;shortintsi=45;longintli=75;unsignedintui=65;unsignedshortus=41;unsignedlongul=456;cout<<"八进制ii="<<oct<<ii<<endl <<"十进制ii="<<dec<<ii<<endl <<"十六进制ii="<<hex<<ii<<endl;cout<<"八进制si="<<oct<<si<<endl <<"十进制si="<<dec<<si<<endl <<"十六进制si="<<hex<<si<<endl;cout<<"八进制li="<<oct<<li<<endl <<"十进制li="<<dec<<li<<endl <<"十六进制li="<<hex<<li<<endl;cout<<"八进制ui="<<oct<<ui<<endl <<"十进制ui="<<dec<<ui<<endl <<"十六进制ui="<<hex<<ui<<endl;cout<<"八进制us="<<oct<<us<<endl <<"十进制us="<<dec<<us<<endl <<"十六进制us="<<hex<<us<<endl;cout<<"八进制ul="<<oct<<ul<<endl《C++程序设计语言》习题答案全文共63页,当前为第4页。cout<<"十进制ul="<<dec<<ul<<endl《C++程序设计语言》习题答案全文共63页,当前为第4页。 cout<<"十六进制ul="<<hex<<ul<<endl; return0;《C++程序设计语言》习题答案全文共63页,当前为第5页。}《C++程序设计语言》习题答案全文共63页,当前为第5页。第四章练习题1.为下面的各表达式加上适当的括号,然后给表达式中各变量赋以相应的初值,判断各表达式的结果,并用程序验证其结果的正确性。a=b+c*d<<2&8a&077!=3a==b||a==c&&c<5c=x!=00<=i<7a=-1++b5a=b==c++x*=*b?c:*d*2a-b,c=d2.编写从键盘输入一个年份,判断其是否为闰年的程序。#include<iostream>usingnamespacestd;boolisleap(int&n){if(n%400==0||(n%4==0)&&(n%100!=0))returntrue;returnfalse;}intmain(){cout<<"请输入一个年份(大于0):\n";inta;cin>>a;if(a<=0){cout<<"inputerror!!\n";return0;}if(isleap(a))cout<<"year:"<<a<<"isleapyear!\n"<<endl;elsecout<<"year:"<<a<<"isnotleapyear!\n";system("pause");return0;}3.编写估算数学常量e的值程序。要求其精度达到小数点后5位。e的计算公式如下:#include<iostream>usingnamespacestd;intmain(){floatsum=0,a=1,i=0;while(a>1e-5){ sum+=a; i+=1; a=a/i;}cout<<sum<<endl;system("pause");《C++程序设计语言》习题答案全文共63页,当前为第6页。}《C++程序设计语言》习题答案全文共63页,当前为第6页。编写统计输出输入字符串中英文字母总数、数字总数和其它字符个数的程序。#include<iostream>#include<string>usingnamespacestd;intmain(){ stringstr; ints[3]={0,0,0}; cout<<"输入一个字符串:"; cin>>str; for(unsignedinti=0;i<str.size();i++){ if(str[i]>='A'&&str[i]<='z') s[0]++; elseif(str[i]>='0'&&str[i]<='9') s[1]++;else s[2]++; } cout<<"统计结果如下:\n" <<"字符串中字母个数:"<<s[0]<<"\n" <<"字符串中数字个数:"<<s[1]<<"\n" <<"其他:"<<s[2]<<endl; system("pause");}编写打印输出2~32767之间的素数。解:#include<iostream>#include<cmath>usingnamespacestd;constintMax=32767;boolissu(intn){ if(n==1)returntrue;for(inti=2;i<=(int)sqrt(n);i++){ if(n%i==0) returnfalse;}returntrue;}intmain(){inti=2,j=1;for(;i<Max;i++){ if(issu(i)){cout<<i<<";"; j++; }if(j%10==0)cout<<'\n';//每10个一行输出}system("pause");return0;}《C++程序设计语言》习题答案全文共63页,当前为第7页。《C++程序设计语言》习题答案全文共63页,当前为第7页。6.打印输出杨辉三角形(x+y)n的展开式的各项系数。系数n(亦即打印的行数)由用户从键盘输入。杨辉三角形前几行的值为:111 2 11 3 3 11 4 6 4 1解:#include<iostream>usingnamespacestd;constintMa=66;voidprint(inta[]){ inti=0; for(;;i++){ if(a[i]==0) break; cout<<a[i]<<''; } cout<<endl;}intmain(){inta1[Ma],a2[Ma];//滚动数组 a1[0]=a2[0]=1; for(inti=1;i<Ma;i++) a1[i]=a2[i]=0; cout<<"请输入打印的行数:"<<endl; cin>>n; intn,flg=0; intj,k; for(j=0;j<n;j++){ if(flg==0){ print(a1); for(k=1;k<n+2;k++) a2[k]=a1[k]+a1[k-1]; flg=1; } else{ print(a2); for(k=1;k<n+2;k++) a1[k]=a2[k]+a2[k-1]; flg=0; } } system("pause"); return0;《C++程序设计语言》习题答案全文共63页,当前为第8页。}《C++程序设计语言》习题答案全文共63页,当前为第8页。第五章练习题1.写出以下定义声明:一个字符指针变量;一个其元素为10个整数的一维数组;一个整型变量的引用;一个字符串指针;一个浮点型常量;一个指向常量字符串的常量指针;一个指向返回类型为int,参数为空的函数指针。并为每个声明做初始化。解:略。2.从输入读入一系列单词,使用quit作为输入的结束单词。按照读入的顺序打印出这些单词,但同一个单词不要打印两次,另外,对单词进行排序后输出。#include<iostream>#include<cstdlib>#include<string>usingnamespacestd;constintMax=100;voidsort(strings[],int&n){//由小到大排序选择排序; intb,c,a; strings1;for(a=0;a<=n-2;a++){ c=a; for(b=c;b<n;b++){ if(s[b]<s[c]) c=b; } s1=s[a]; s[a]=s[c]; s[c]=s1; }}intmain(){strings0="quit";strings[Max],s1; cout<<"inputsomewords:"; inti=0,j; for(;;){ intflag=0;//flag是做标记的 cin>>s1; if(s1==s0) break; for(j=0;j<i;j++){ if(s[j]==s1){ flag=1; break; } } if(flag==0){ s[i]=s1; i++; } } for(intk=0;k<i;k++) cout<<s[k]<<""; cout<<endl; sort(s,i);《C++程序设计语言》习题答案全文共63页,当前为第9页。 for(intk=0;k<i;k++)《C++程序设计语言》习题答案全文共63页,当前为第9页。 cout<<s[k]<<""; cout<<endl; system("pause"); return0;}3.定义一个学生结构数组,输入其值,并以学号从小到大的顺序依次输出各学生的信息。#include<iostream>#include<string>usingnamespacestd;constintM=50;structstu{ stringname; doubleid; intage; charc;};voidsort(stus[],int&n){//由小到大排序选择排序算法; intb,c,a; stus1;for(a=0;a<=n-2;a++){ c=a; for(b=c;b<n;b++){ if(s[b].id<s[c].id) c=b; } s1=s[a]; s[a]=s[c]; s[c]=s1; }}intmain(){ stus[M]; cout<<"您要输入多少个学生的信息:"; intn,i; cin>>n; for(i=0;i<n;i++){ cout<<"输入学生的姓名:";cin>>s[i].name; cout<<"输入学生的学号:";cin>>s[i].id; cout<<"输入学生的性别[F/M]:";cin>>s[i].c; cout<<"输入学生的年龄:";cin>>s[i].age; } cout<<"信息如下:"<<endl; sort(s,n); for(i=0;i<n;i++){ cout<<s[i].id<<""<<s[i].name<<"" <<s[i].c<<""<<s[i].age<<endl; } system("pause"); return0;}将一字符串字面值赋给一个字符数组,用指针操作遍历该字符串,统计输出其中元音及辅音字母的个数。《C++程序设计语言》习题答案全文共63页,当前为第10页。《C++程序设计语言》习题答案全文共63页,当前为第10页。#include<iostream>#include<string>usingnamespacestd;constintMax=100;intmain(){ strings; cout<<"inputastring:"; cin>>s; charc[Max]; unsignedinti; for(i=0;i<Max;i++) c[i]='\0'; for(i=0;i<s.size();i++) c[i]=s[i]; char*p; p=c; intn1=0,n2=0; for(;*p!='\0';p++){ if(*p=='a'||*p=='e'||*p=='i'||*p=='o'||*p=='u') n1++; else n2++; }cout<<"原音字母个数:"<<n1<<"\n辅音字母个数:"<<n2<<endl;cout<<p<<endl;system("pause");return0;}4.用引用实现二字符串的交换程序。#include<iostream>#include<string>usingnamespacestd;voidswap(string&a,string&b){ strings0; s0=a; a=b; b=s0;}intmain(){ strings1="Iloveyou!",s2="metoo."; cout<<s1<<'\n'<<s2<<endl; swap(s1,s2); cout<<s1<<'\n'<<s2<<endl; system("pause"); return0;}6.将键盘输入的若干个单词放入一个指针数组中,对它实现以下操作:a.查找某个单词;b.修改某个单词;《C++程序设计语言》习题答案全文共63页,当前为第11页。c.删除某个单词;《C++程序设计语言》习题答案全文共63页,当前为第11页。d.复制某个单词;e.排序这些单词并打印输出。#include<iostream>#include<string>usingnamespacestd;constintMs=50;//输入字符串的个数的最大值voidsort(string*s[],intn){ inti,j; for(i=0;i<n-1;i++)for(j=i;j<n-1;j++){ if(*(s[j])>*(s[j+1])){ strings1; s1=*(s[j]); *(s[j])=*(s[j+1]); *(s[j+1])=s1; } } for(intk=0;k<n;k++) if(*(s[k])!="") cout<<*(s[k])<<""; cout<<endl;}voidsearch(string*s[],intn){ stringa; cout<<"输入要查询的字符串:"; cin>>a; inti=0,k=0; for(;i<n;i++) if(*(s[i])==a) k=1; if(k==1) cout<<"找到了该字符串!!\n"; else cout<<"没有找到这个字符串!!\n";}voidmodify(string*s[],intn){cout<<"输入要修改的串:"; stringa; cin>>a; inti=0,k=0; for(;i<n;i++) if(*(s[i])==a) k=i; if(k==0) cout<<"没有该字符串,不能修改!!\n"; else{ charc; cout<<"确认要修改吗?[Y/n]"<<endl; cin>>c; if(c=='y'||c=='Y'){ cout<<"输入修改后的字符串:"; cin>>*(s[k]);《C++程序设计语言》习题答案全文共63页,当前为第12页。 }《C++程序设计语言》习题答案全文共63页,当前为第12页。 else cout<<"退出!"<<endl; }}voiddelet(string*s[],intn){ cout<<"输入要删除的字符串:"; stringa; cin>>a; inti=0; for(;i<n;i++) if(*(s[i])==a) *(s[i])="";}intmain(){ string*c[Ms]; string*p; cout<<"要输入的字符串的个数:"; intn,i; cin>>n; for(i=0;i<n&&i<Ms;i++){ p=newstring; cout<<"输入单词:"; cin>>*p; c[i]=p; } cout<<"输入完毕!!\n\n";loop: cout<<"a.查找某个单词\n" <<"b.修该某个单词\n" <<"c.删除某个单词\n" <<"q.退出!!\n" <<"d.排序这些单词并打印输出\n请选择!"<<endl; charc0; cin>>c0; switch(c0){ case'a':search(c,n);break; case'b':modify(c,n);break; case'c':delet(c,n);break; case'd':sort(c,n);break; case'q':exit(0); default:cout<<"输入有误!!!\n";break; } gotoloop; system("pause");《C++程序设计语言》习题答案全文共63页,当前为第13页。}《C++程序设计语言》习题答案全文共63页,当前为第13页。第六章练习题:从键盘输入10个浮点数,编写计算求其和及平均值的函数。#include<iostream>usingnamespacestd;constintsize=10;floatsum(floata[]){ floatsum=0; for(inti=0;i<size;i++) sum+=a[i]; returnsum;}floataverage(floataa[]){ floataverage=sum(aa)/size; returnaverage;}intmain(){ floatnum[size]; cout<<"请输入十个数:"<<endl; for(inti=0;i<size;i++) cin>>num[i]; cout<<"这十个数的和是"<<sum(num)<<endl; cout<<"这十个数的平均值是"<<average(num)<<endl; return0;}采用递归方式,编写将一输入字符串逆序输出的函数。#include<iostream>#include<string>usingnamespacestd;voidff(stringss,inti){ if(i!=0){ cout<<ss[i-1]; i--; ff(ss,i); }}intmain(){ stringss; cout<<"输入一字符串:"<<endl; cin>>ss; inti=ss.size(); ff(ss,i); cout<<endl; system("pause"); return0;}《C++程序设计语言》习题答案全文共63页,当前为第14页。《C++程序设计语言》习题答案全文共63页,当前为第14页。编写一个与C标准库printf函数功能相同的自己的My_printf函数。#include<iostream>#include<cstdlib>#include<cstdarg>#include<cstring>#include<conio.h>usingnamespacestd;intMy_printf(constchar*format,...){ if(format==NULL) return-1; intn=0; va_listmarker; va_start(marker,format); for(inti=0;;i++){ charc=format[i]; if(c=='\0') gotoend; elseif(c=='%'){ i++; c=format[i]; intd,m; char*pc; switch(c){ case's': pc=va_arg(marker,char*); if(pc!=NULL){ for(intj=0;;j++){ c=pc[j]; if(c=='\0') break; putch(c); n++; } } else{//如果对于%s的实参是空串,将打印输出(null) cout<<"(null)"<<endl; n+=6; } break; case'c': c=va_arg(marker,char); putch(c); n++; break; case'd': d=va_arg(marker,int); charbuf[32]; buf[31]='\0'; itoa(d,buf,10); m=(int)strlen(buf); for(intj=0;j<m;j++) putch(buf[j]);《C++程序设计语言》习题答案全文共63页,当前为第15页。 n+=m;《C++程序设计语言》习题答案全文共63页,当前为第15页。 break; default: putch('%'); putch(c); c+=2; break; } } else{ putch(c); n++; } }end: va_end(marker); returnn;}intmain(){ intn; n=My_printf("test"); cout<<"\t"<<n<<endl; n=My_printf("Strin%c",'g'); cout<<"\t"<<n<<endl; n=My_printf("S%s","tudent"); cout<<"\t"<<n<<endl; n=My_printf("%d%c%c%d%s",2,'0','1',2,"year"); cout<<"\t"<<n<<endl; system("pause"); return0;}采用函数过载机制,编写能进行两个整数、浮点数的相加及两个字符串连接的一组过载函数。#include<iostream>#include<string>usingnamespacestd;voidsum(stringss1,stringss2){ stringss3=ss1+ss2; cout<<"字符串"<<ss1<<"和"<<ss2<<"相加得"<<ss3; cout<<endl;}voidsum(floatff1,floatff2){ floatff3=ff1+ff2; cout<<"浮点数"<<ff1<<"和"<<ff2<<"相加得"<<ff3; cout<<endl;}voidsum(intii1,intii2){ intii3=ii1+ii2; cout<<"整数"<<ii1<<"和"<<ii2<<"相加得"<<ii3; cout<<endl;}《C++程序设计语言》习题答案全文共63页,当前为第16页。《C++程序设计语言》习题答案全文共63页,当前为第16页。intmain(){ stringss1,ss2; cout<<"输入两个字符串"<<endl; cin>>ss1>>ss2; intii1,ii2; cout<<"输入两个整数:"<<endl; cin>>ii1>>ii2; floatff1,ff2; cout<<"输入两个浮点数:"<<endl; cin>>ff1>>ff2; sum(ss1,ss2); sum(ff1,ff2); sum(ii1,ii2); system("pause"); return0;}采用函数参数缺省值机制,编写能分别打印输出十进制((默认)、八进制和十六进制数的函数。#include<iostream>usingnamespacestd;voidoutput(intvalue,intbase=10){ switch(base){ case10:cout<<value<<"十进制是:"<<value<<endl;break; case8:cout<<value<<"八进制是:"<<oct<<value<<endl;break; case16:cout<<value<<"十六进制是:"<<hex<<value<<endl;break; default:cout<<"输入错误"<<endl; }}intmain(){ intii; cout<<"输入您想打印的数:"<<endl; cin>>ii; cout<<"您是否采用默认进制(10)?Y/N"<<endl; charj; cin>>j; intjz; if(j=='N'||j=='n'){ cout<<"输入您的进制,10或者16:"<<endl; cin>>jz; output(ii,jz); } else{ output(ii); }system("pause"); return0;《C++程序设计语言》习题答案全文共63页,当前为第17页。}《C++程序设计语言》习题答案全文共63页,当前为第17页。第七章练习题:1.简述Using声明与Using指令的区别。答:Using声明是将某一名字空间中的名字引入(Introduce)到一个局部范围内,使其名字在该范围内无需名字空间的约束便可见、可用。而Using指令是将特定名字空间中的所有名字引入到一作用域内。2.采用模块化及结构化异常处理机制进行小型桌面计算器的设计与实现。#include<iostream>#include<string>#include<map>#include<cctype>usingnamespacestd;map<string,double>table;//符号表namespaceLexer{//词法分析模块enumToken_value{ NAME,NUMBER,END,PLUS='+',MINUS='-',MUL='*',DIV='/', PRINT=';',ASSIGN='=',LP='(',RP=')' };//枚举类型,枚举语言中的终结符Token_valuecurr_tok=PRINT;doublenumber_value;stringstring_value;Token_valueget_token();}namespaceError{//错误处理模块 structZero_divide{}; structSyntax_error{ constchar*p; Syntax_error(constchar*q) {p=q;}};}namespaceParser{//语法分析模块doubleexpr(boolget);doubleterm(boolget);doubleprim(boolget); usingnamespaceLexer; usingnamespaceError;}namespaceDriver{//驱动模块 intno_of_errors; std::istream*input; voidskip();}Lexer::Token_valueLexer::get_token(){//Lexer模块的get_token实现 charch;《C++程序设计语言》习题答案全文共63页,当前为第18页。 cin>>ch;《C++程序设计语言》习题答案全文共63页,当前为第18页。 switch(ch){ case'#': returncurr_tok=END; case';': case'*': case'/': case'+': case'-': case'(': case')': case'=': returncurr_tok=Token_value(ch); case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9': case'.': cin.putback(ch); cin>>number_value; returncurr_tok=NUMBER; default: if(isalpha(ch)){ cin.putback(ch); cin>>string_value; returncurr_tok=NAME; } throwError::Syntax_error("badtoken"); returncurr_tok=PRINT; }}doubleParser::expr(boolget){//Parser模块的expr实现 usingnamespaceLexer; doubleleft=term(get); for(;;) switch(curr_tok){ casePLUS: left+=term(true); break; caseMINUS: left-=term(true); break; default: returnleft; }}doubleParser::term(boolget){//Parser模块的term实现 usingnamespaceLexer; doubleleft=prim(get); for(;;)《C++程序设计语言》习题答案全文共63页,当前为第19页。 switch(curr_tok){《C++程序设计语言》习题答案全文共63页,当前为第19页。 caseMUL: left*=prim(true); break; caseDIV: if(doubled=prim(true)){ left/=d; break; } throwError::Zero_divide(); default: returnleft; }}doubleParser::prim(boolget){//Parser模块的prim实现 usingnamespaceLexer; if(get)get_token(); switch(curr_tok){ caseNUMBER:{ doublev=number_value; get_token(); returnv; } caseNAME:{ double&v=table[string_value]; if(get_token()==ASSIGN)v=expr(true); returnv; } caseMINUS: return-prim(true); caseLP:{ doublee=expr(true); if(curr_tok!=RP)throwError::Syntax_error(")expected"); get_token(); returne; } caseEND: return1; default: throwError::Syntax_error("primaryexpected"); }}voidDriver::skip(){//Driver模块的skip实现 no_of_errors++; while(*input){ charch; input->get(ch); switch(ch){ case'\n': case';': return; } }}intmain(intargc,char*argv[]){《C++程序设计语言》习题答案全文共63页,当前为第20页。 cout<<"欢迎使用桌面计算器"<<endl;《C++程序设计语言》习题答案全文共63页,当前为第20页。 cout<<"注意:1.如果输入了一个以字母开头的标识符";cout<<"请在标识符的后面加上一个空格,否则程序将会出错"<<endl; cout<<"2.若输入了一个表达式,切记在后面加上;号"<<endl; cout<<"3.若想退出程序,请输入#"<<endl; Driver::input=&cin;table["pi"]=3.1415926535897932385;//符号表赋初值table["e"]=2.7182818284590452354; while(*Driver::input){ try{ Lexer::get_token(); if(Lexer::curr_tok==Lexer::END)break; if(Lexer::curr_tok==Lexer::PRINT) continue; cout<<Parser::expr(false)<<endl; } catch(Error::Zero_divide){ cerr<<"attempttodividebyzero"<<endl; if(Lexer::curr_tok!=Lexer::PRINT) Driver::skip(); } catch(Error::Syntax_errore){ cerr<<"syntaxerror:"<<e.p<<endl; if(Lexer::curr_tok!=Lexer::PRINT) Driver::skip(); } } if(Driver::input!=&std::cin)deleteDriver::input;cout<<"谢谢使用!"<<endl; returnDriver::no_of_errors;}3.将堆栈封装成一模块,调试与测试之。#include<iostream>#include<string>usingnamespacestd;namespacestack{ classStack{ public: enum{Max=10}; Stack(){ top=-1; }; voidpush(intn);//压栈操作 intpop();//弹栈操作 boolisEmpty();//判断栈是否为空? boolisFull();//判断栈是否满? voiddump();//自栈顶向下读取堆栈中的元素 ~Stack() {}; private: inttop;《C++程序设计语言》习题答案全文共63页,当前为第21页。 intarray[Max];《C++程序设计语言》习题答案全文共63页,当前为第21页。 };//Stack类的接口}voidstack::Stack::push(intn){ if(isFull()) cout<<"Error,theStackisfull\n"; else{ top++; array[top]=n; }}intstack::Stack::pop(){ if(isEmpty()) cout<<"Error,theStackisempty!\n"; else returnarray[top--];}boolstack::Stack::isFull(){ if(top==Max-1) returntrue; else returnfalse;}boolstack::Stack::isEmpty(){ if(top==-1) returntrue; else returnfalse;}voidstack::Stack::dump(){ for(inti=top;i>=0;i--) cout<<array[i]<<"";}intmain(){//测试模块栈 usingnamespacestack;constintM=10; Stacks1; inta[M]; cout<<"输入十个数字进行类的测试工作:\n"; for(inti=0;i<M;i++) { cin>>a[i]; s1.push(a[i]); } cout<<"再压进一个数看看:"<<endl; intb; cin>>b; s1.push(b); cout<<"以下是你输入的十个数的展示:"<<endl; s1.dump(); cout<<"\n进行弹栈操作,以下是弹出的数字:"<<endl; for(intj=0;j<M;j++)《C++程序设计语言》习题答案全文共63页,当前为第22页。 cout<<s1.pop()<<""《C++程序设计语言》习题答案全文共63页,当前为第22页。 cout<<"\n再进行一次弹栈操作:"<<endl; s1.pop(); cout<<"测试工作结束"<<endl; system("pause"); return0;}将队列封装成一模块,调试与测试之。//该方法使用数组来实现的,当然可以直接实现queue读者自己实现#include<iostream>#include<cstdlib>usingnamespacestd;namespacequeue{classList{//List类的接口protected:enum{LEN=20}; intelemnum;intelems[LEN]; inthead,tial;public: List(); voidaddhead(intx); voidaddtial(int&y); intdelhead(); intdeltial(); intget_num(){returnelemnum;}};List::List(){elemnum=0;head=0;tial=elemnum;}voidList::addhead(intx){inti;if(elemnum>=LEN){cout<<"isfull!!!\n";}elsefor(i=elemnum-1;i>=0;i--) elems[i+1]=elems[i];elems[head]=x;elemnum++;tial=elemnum;}voidList::addtial(int&y){if(elemnum>=LEN){cout<<"isfull!!!\n";}elems[tial]=y;tial++;elemnum++;}intList::delhead(){《C++程序设计语言》习题答案全文共63页,当前为第23页。if(elemnum==0){《C++程序设计语言》习题答案全文共63页,当前为第23页。cout<<"nomemeber"<<endl;return-1;}else{ inti=0,s; s=elems[head]; for(;i<tial;i++) elems[i]=elems[i+1]; elemnum--; tial--; returns;}}intList::deltial(){if(elemnum==0){cout<<"isfall!!!\n";return-1;}else{ints;s=elems[tial-1]; tial--; elemnum--; returns;}}//classstack:publicList{//读者可以参考stack类。该类从List继承//public:// //stack():List(){}// voidpush(intx);// intpop();// intgetdeep();//};//voidstack::push(intx)//{addtial(x);}//intstack::pop()//{returndeltial();}//intstack::getdeep()//{returnget_num();}classQueue:publicList{//queue继承自Listpublic://Queue():List(){}//可要可不要voidenqueue(intx); intdelqueue(); intgetqueuenum();};voidQueue::enqueue(intx){addtial(x);}intQueue::delqueue(){returndelhead();}intQueue::getqueuenum(){returnget_num();}《C++程序设计语言》习题答案全文共63页,当前为第24页。}《C++程序设计语言》习题答案全文共63页,当前为第24页。intmain(){usingnamespacequeue;Listl1;for(inti=12;i<23;i++) l1.addhead(i);cout<<l1.get_num()<<""<<l1.delhead()<<endl;cout<<l1.deltial()<<endl;cout<<l1.get_num()<<endl;Queueq;inth,a;cout<<"thisisaqueue'test:\nit'slengthis:";for(h=45;h<56;h++) q.enqueue(h);a=q.getqueuenum();cout<<a<<endl;for(h=0;h<a;h++) cout<<q.delqueue()<<"";cout<<endl;system("pause");return0;《C++程序设计语言》习题答案全文共63页,当前为第25页。}《C++程序设计语言》习题答案全文共63页,当前为第25页。第八章练习题1.编写程序完成如下功能:1)实现如下函数intatoi(constchar*str)//将参数传入的整数字符串转换成一个整数#include<iostream>#include<cmath>usingnamespacestd;intAtoi(constchar*str){ intresult=0; intsize=0; for(inti=0;str[i]!='\0';i++) size++; for(inti=size-1;i>=0;i--) result+=(str[i]-'0')*static_cast<int>(pow(10,static_cast<double>(size-i-1))); cout<<result<<endl; system("pause"); return0;}2)写一测试程序,将命令行中传入的字符串调用atoi函数将其转换成整数并输出。#include<string>#include"atoi.h"intmain(){stringstr;inti=0;cin>>str;cout<<Atoi(str.c_str())<<endl;return0;}2.将第7章桌面计算器的程序的每一个模块写成一个C++源文件,然后采用分别编译技术和#include指令将其组装起来。《C++程序设计语言》习题答案全文共63页,当前为第26页。请参照第7章桌面计算器程序完成,略。《C++程序设计语言》习题答案全文共63页,当前为第26页。第九章练习题:什么是类(class)?在类的定义中,类由哪两部分组成?每一部分各表示什么?答:一个C++类(class)是一个用户自定义(User-defined)类型。类由数据成员和成员函数组成。其中数据成员即类中各变量/对象的定义部分,它们描述了该类对象所具有的属性,各数据成员值集的笛卡尔积构成了该类型的值集。成员函数即类中所有函数的集合,它描述了对该类对象所能进行的操作,它们构成了该类的操作集。给定以下程序:#include<iostream>usingnamespacestd;voidmain(){ cout<<″Hello,welcomeyoustudyC++!\n″);}在不修改main函数的前提下,修改上述程序使之产生如下输出:InitializeHello,welcomeyoustudyC++!Cleanup解:#include<iostream>usingnamespacestd;classC{public: C(); ~C();private: inta;};C::C(){ cout<<"Initialize\n";}C::~C(){ cout<<"Cleanup"<<endl;}Ca;intmain(){ cout<<"Hello,welcomeyoustudyC++!\n"; return0;}设计并实现一个整型堆栈类(Stack),该类具有以下操作:voidpush(intn);//压栈操作intpop();//弹栈操作boolisEmpty();//判断栈是否为空?boolisFull();//判断栈是否满?voiddump();//自栈顶向下读取堆栈中的元素《C++程序设计语言》习题答案全文共63页,当前为第27页。解:《C++程序设计语言》习题答案全文共63页,当前为第27页。#include<iostream>#include<string>usingnamespacestd;classStack{//类的接口public:enum{Max=10}; Stack() { top=-1; }; voidpush(intn);//压栈操作 intpop();//弹栈操作 boolisEmpty();//判断栈是否为空? boolisFull();//判断栈是否满? voiddump();//自栈顶向下读取堆栈中的元素~Stack(){};private: inttop; intarray[Max];};//类的实现voidStack::push(intn){ if(isFull()) cout<<"Error,theStackisfull\n"; else{ top++; array[top]=n; }}intStack::pop(){ if(isEmpty()) cout<<"Error,theStackisempty!\n"; else returnarray[top--];}boolStack::isFull(){ if(top==Max-1) returntrue; else returnfalse;}boolStack::isEmpty(){ if(top==-1) returntrue; else returnfalse;}voidStack::dump(){ for(inti=top;i>=0;i--) cout<<array[i]<<"";《C++程序设计语言》习题答案全文共63页,当前为第28页。}《C++程序设计语言》习题答案全文共63页,当前为第28页。intmain()//测试栈{constintM=10; Stacks1; inta[M]; cout<<"输入十个数字进行类的测试工作:\n"; for(inti=0;i<M;i++) { cin>>a[i]; s1.push(a[i]); } cout<<"再压进一个数看看:"<<endl; intb; cin>>b; s1.push(b); cout<<"以下是你输入的是个数的展示:"<<endl; s1.dump(); cout<<"\n进行弹栈操作,以下是弹出的数:"<<endl; for(intj=0;j<M;j++) cout<<s1.pop()<<""; cout<<"\n再进行一次弹栈操作:"<<endl; s1.pop(); cout<<"测试工作结束"<<endl; return0;}设计并实现一个和基本类型int功能类似的MyInteger类,该类对外提供如下操作:intadd(intx1,intx2);//加法操作intsub(intx1,intx2);//减法操作intmul(intx1,intx2);//乘法操作intdiv(intx1,intx2);//除法操作intmod(intx1,intx2)
;//求余操作注意:实现类时,对某些操作应做相应的异常处理。解:#include<iostream>usingnamespacestd;constintMax=32767;constintMin=-32768;classMyInteger{public: MyInteger(intx){ result=x; } MyIntegeradd(MyIntegerx);//加法操作 MyIntegersub(MyIntegerx);//减法操作 MyIntegermul(MyIntegerx);//乘法操作 MyIntegerdiv(MyIntegerx);//除法操作 MyIntegermod(MyIntegerx);//求余操作 ~MyInteger(){};private: intresult;《C++程序设计语言》习题答案全文共63页,当前为第29页。};《C++程序设计语言》习题答案全文共63页,当前为第29页。MyIntegerMyInteger::add(MyIntegerx){ inti=result; result+=x.result; cout<<i<<"和"<<x.result<<"这两个数的和是"<<result<<endl; returnresult;}MyIntegerMyInteger::sub(MyIntegerx){ inti=result;if(i>Max||i<Min){cout<<"越界!"<<endl;return0;} result-=x.result; cout<<i<<"和"<<x.result<<"这两个数的差是"<<result<<endl; returnresult;}MyIntegerMyInteger::mul(MyIntegerx){ inti=result;if(i>Max||i<Min){cout<<"越界!"<<endl;return0;} result*=x.result; cout<<i<<"和"<<x.result<<"这两个数的积是"<<result<<endl; returnresult;}MyIntegerMyInteger::div(MyIntegerx){ inti=result; if(i>Max||i<Min){cout<<"越界!"<<endl;return0;} if(x.result==0){ cout<<"Error,除数不能为"<<endl;returnNULL; } else result/=x.result; cout<<i<<"和"<<x.result<<"这两个数的商是"<<result<<endl; returnresult;}MyIntegerMyInteger::mod(MyIntegerx){ inti=result; if(i>Max||i<Min){cout<<"越界!"<<endl;return0;} if(x.result==0){ cout<<"Error,被mod的数不能为"<<endl; returnNULL; }《C++程序设计语言》习题答案全文共63页,当前为第30页。 result%=x.result;《C++程序设计语言》习题答案全文共63页,当前为第30页。 cout<<i<<"和"<<x.result<<"这两个数的余数是"<<result<<endl; returnresult;}intmain(){ MyIntegerm1(12),m2(6); m1.add(m2);MyIntegerm3(45),m4(8);m3.sub(m4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度电梯维护保养服务合同9篇
- 2024年度产品生产加工合同的生产数量与质量标准2篇
- 2024中国移动各省招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国电信湖北财务共享服务中心招聘3人易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国电信四川公司校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024年度救灾物资存放搭棚施工合同
- 2024中国人保财险春季招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024年度物联网应用开发与合作协议3篇
- 2024年度内容创作与传播合作协议
- 2024“才聚齐鲁成就未来”齐鲁(山东)产业投资限公司招聘2人易考易错模拟试题(共500题)试卷后附参考答案
- 第1~4单元期中检测(试题)-2024-2025学年四年级上册数学北师大版
- 《报关单填写规范》课件
- 在线学习管理平台软件开发方案
- 产品研发与创新战略性合作协议书
- 北京邮电大学《计算机网络课程设计》2022-2023学年期末试卷
- 代理记账业务内部规范(三篇)
- 黑龙江大学《应用回归分析》2023-2024学年第一学期期末试卷
- 中层管理干部团队-执行力与领导力提升培训课件
- 2024年保密基础知识竞赛试题库及答案(共350题)
- 招聘笔试题与参考答案(某大型国企)
- 多文本阅读课堂教学实践研究
评论
0/150
提交评论