下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 /root/编程与综合练习题-c指针

/root/编程与综合练习题-c指针.doc

/root/编程与综合练习题-c指针

新风作浪
2011-07-25 0人阅读 举报 0 0 暂无简介

简介:本文档为《/root/编程与综合练习题-c指针doc》,可适用于IT/计算机领域

第五章数组与指针习题二、编程与综合练习题打印杨辉三角形(行)。使用二维数组并利用每个系数等于其肩上两系数之和。解:好的算法无特例二维数组共用列第列全方便计算#include<iostream>usingnamespacestdintmain(){inta={,},i,j初始化时写好第行其余各行全for(i=i<i)为了全部算法无特例共用列第列全方便计算for(j=j<=ij)aij=aijaijfor(i=i<i){for(j=j<=ij)cout<<aij<<'t'cout<<endl}return}将例改用一维数组附加行、列参数实现通用算法。解:用一维数组附加行、列参数实现通用算法难度大。#include<iostream>#include<iomanip>usingnamespacestdvoidinverse(int,int,int,int)注意数组最高维可缺省例因初学未省voidmulti(int,int,int,int,int,int)voidoutput(int,int,int)intmain(){intmiddle*,result*注意写作*等可清楚看出矩阵的行列intmatrix*={,,,,,,,,,,,,,,,,,}intmatrix*={,,,,,,,,,,,}output(matrix,,)inverse(matrix,middle,,)output(middle,,)output(matrix,,)multi(middle,matrix,result,,,)output(result,,)return}voidinverse(intmatrix,intmiddle,inta,intb){inti,jfor(i=i<ai)for(j=j<bj)middleij*a=matrixi*bjreturn}voidmulti(intmiddle,intmatrix,intresult,inta,intb,intc){inti,j,kfor(i=i<ai){for(j=j<cj){resulti*cj=for(k=k<bk)resulti*cj=middlei*bk*matrixk*cj}}return}voidoutput(intmax,inta,intb){for(inti=i<ai){for(intj=j<bj)cout<<setw()<<maxi*bj<<""cout<<'n'}cout<<endlreturn}编写函数intatoi(chars)将字符串s转化为整型数返回。注意负数处理方法。解:用指针处理字符串非常方便。使用符号位来处理负数。#include<iostream>usingnamespacestdintatoi(chars){inttemp=,f=,i=while(si!=''si!=''(si<''||si>''))i去除串前部无效字符if(si==''){读负号f=i}if(si<''||si>'')cout<<"error!"<<endl串非法时输出提示返回while(si>=''si<=''){转换数字串temp=temp*sii}returnf*temp}intmain(){charnumcingetline(num,)cout<<atoi(num)<<'n'return}有如下定义:intival=int*ipdouble*dp下面哪些赋值非法或可能带来错误并加以讨论。ival=*ipival=ip*ip=ivalip=ival*ip=ivalip=ivaldp=ipdp=*ip*dp=*ip解:ival=*ip错未确定指针ip初值用随机内存地址中的数据给ival赋值是危险的。但语法对。ival=ip错赋值类型错指针型不能赋给整型。*ip=ival错未确定指针ip初值用ival给随机内存赋值是危险的。但语法对。ip=ival错赋值类型错整型不能赋给指针型。*ip=ival错赋值类型错地址(指针型)不能赋给整型。ip=ival对地址赋给指针型。dp=ip错整型指针不能赋给双精度指针。dp=*ip错赋值类型错整型不能赋给指针型。*dp=*ip对赋值类型转换编程定义一个整型、一个双精度型、一个字符型的指针并赋初值然后显示各指针所指目标的值与地址各指针的值与指针本身的地址及各指针所占字节数(长度)。*其中地址用十六进制显示。解:注意:字符指针输出是字符串必须强制转换为无类型指针#include<iostream>usingnamespacestdintmain(){int*ip,ival=double*dp,dval=char*cp,cval='A'ip=ivaldp=dvalcp=cvalcout<<*ip<<'t'<<*ip<<'t'<<sizeof(*ip)<<endlcout<<*dp<<'t'<<*dp<<'t'<<sizeof(*dp)<<endlcout<<*cp<<'t'<<(void*)*cp<<'t'<<sizeof(*cp)<<endl字符指针输出是字符串必须强制转换为无类型指针cout<<*cp<<'t'<<*cp<<'t'<<sizeof(*cp)<<endl输出A开头的字符串cout<<ip<<'t'<<ip<<'t'<<sizeof(ip)<<endlcout<<dp<<'t'<<dp<<'t'<<sizeof(dp)<<endlcout<<(void*)cp<<'t'<<cp<<'t'<<sizeof(cp)<<endlreturn}一个典型的运行结果:变量内容首地址长度(字节)cval‘A’xffcpxffxffdvalxffcdpxffcxffivalxffipxffxffc内存分配解释:速度优化时通常以字(字节)为单位(开始地址可被整除)给变量安排内存。cval仅用一个字节也安排了个字节。分别编写下列字符串处理函数()char*strcat(char*s,constchar*ct)将串ct接到串s的后面形成一个长串。【例】以数组为参数现用指针为参数。()intstrlen(constchar*s)求字符串长度的函数返回串长(不包括串结束符)。()char*reverse(char*)反置字符串s即可将“break”成为“kaerb”。()char*strchr(constchar*cs,charc)查找字符c在串cs中第一次出现的位置返回指向该字符的指针若没有出现则返回。()char*strstr(constchar*cs,constchar*cs)返回串cs作为子串在cs中第一次出现的位置若没有出现则返回。解:为了函数的通用性有些可不要返回值的函数也保留返回值。反置字符串函数从串两头的指针同时向中间移动重合或交错时停止。查找子串先找子串的第一个字符再核对子串其他字符。#include<iostream>usingnamespacestdchar*strcat(char*s,constchar*ct){char*st=swhile(*s)s*s作为条件,等效*s!=while(*s=*ct)returnst}intstrlen(constchar*s){inti=while(*s)ireturni}char*reverse(char*s){chartemp,*temp=s,*temp=swhile(*temp)temptemp指针移回串尾while(temptemp>){注意此处,从串两头的指针同时向中间移动,重合或交错时停止temp=*temp*temp=*temp*temp=temptemptemp}returns}char*strchr(constchar*cs,charc){while(*cs!=c*cs)csif(*cs==)cs=未找到返回NALLreturn(char*)cs}char*strstr(constchar*cs,constchar*cs){char*tempchar*temp=(char*)cswhile(*cs){只要主串还有字符未查则继续while(*cs!=*cs*cs)cs找到主串含有子串的第一个字符,或主串查完停止temp=(char*)cstemp=(char*)csif(*cs){核对子串其他字符while(*cs==*temp||*temp)if(*temp==)returntemp找到子串返回}}return未找到返回NAL}intmain(){chara="李明"charb="是东南大学学生"charc="SoutheastUniversity"char*cpcout<<a<<endlcout<<b<<endlstrcat(a,b)cout<<"字符串连接后:"<<endlcout<<a<<endl打印字符数组acout<<"字符串长度为:"<<strlen(a)<<endlcout<<c<<endlcp=strchr(c,'U')if(cp==)cout<<"未找到"<<endlelsecout<<cp<<endl找到输出由该字符开始的剩余串cp=strchr(c,'A')if(cp==)cout<<"未找到"<<endlelsecout<<cp<<endlcout<<reverse(c)<<endlcp=strstr(a,"东南")if(cp!=)cout<<cp<<endl找到输出由该字符串开始的剩余串elsecout<<"未找到"<<endlcp=strstr(a,"西北")if(cp==)cout<<"未找到"<<endlelsecout<<cp<<endlreturn}使用递归和非递归的两种方法编写函数char*itoa(intn,char*string)将整数n转换为十进制表示的字符串。(在非递归方法中可使用reverse()函数。)解:递归方法分析。难度大可用图解法:每次调用除以以去除最后一位以n=为例。由此图可见由string指向应填入的字符数组的相应位置。由调用的最底层开始回归时填入每次回归指针后移一位由此得char*itoal(intn,char*string){if(n)string=itoal(n,string)*string=n字符ASCII码returnstring}考虑数字串结束符和负数得完整的函数。char*itoal(intn,char*string){if(n<){*string=’’n=n}if(n)string=itoal(n,string)*string=n*string=’’returnstring}源代码:#include<iostream>usingnamespacestdchar*reverse(char*s){chartemp,*temp=s,*temp=swhile(*temp)temptemp指针移回串尾while(temptemp>){注意此处,从串两头的指针同时向中间移动,重合或交错时停止temp=*temp*temp=*temp*temp=temptemptemp}returns}char*itoa(intn,char*string){char*temp=stringif(n<){*temp=''n=n}do{注意个位放在前了*temp=n}while(n=n)显式的循环*temp=''if(*string=='')temp=string有负号仅反转数字部分elsetemp=stringreverse(temp)个位放到后面returnstring}char*itoa(intn,char*string){if(n<){*string=''n=n}if(n)string=itoa(n,string)隐式循环*string=n第一次是数字最高位放串的最前面的字符(不含符号)注意指针移动在后*string=''returnstring注意返回的指针已后移一字符}char*itoa(intn,char*string){itoa(n,string)returnstring}intmain(){intnumcharstcin>>numcout<<"输出数字串:"<<itoa(num,st)<<endlcin>>numcout<<"输出数字串:"<<itoa(num,st)<<endlreturn}头文件<ctime>中定义一个日期时间的结构:structtm{inttmsec秒inttmmin分inttmhour时inttmmday日inttmmon月inttmyear年实际放的是与年的差如年为inttmwday星期inttmyday一年中的第几天inttmisdst是否夏时制}函数timettime(timet*tp)是提取当前时间timet即长整型代表从年月日::开始计算的秒数(格林尼治时间)放在首地址为tp的单元内。函数tm*localtime(consttimet*tp)将tp地址单元中的时间转换为日期时间结构的当地时间(函数tm*gmtime(consttimet*tp)转换为日期时间结构的格林尼治时间)函数char*asctime(tm*tb)将tb地址单元中的tm结构的日期时间转换为字符串(供显示)它有固有格式如:SunSep::利用以上资源重新设计一个日期时间类(DataTime)要求定义对象时取当前时间进行初始化显示时重取显示时刻的时间并显示出来。解:#include<iostream>#include<ctime>usingnamespacestdclassdatatime{tm*timedatalongallsecondchar*tmppublic:datatime(){time(allsecond)timedata=localtime(allsecond)tmp=asctime(timedata)cout<<tmp<<endl}voidgettime(){allsecond=time()time有两种用法timedata=localtime(allsecond)tmp=asctime(timedata)cout<<tmp<<endl}}intmain(){charchdatatimedtcout<<"需要知道现在的日期和时间吗?(Y或N)"<<endlcin>>chif(ch=='y'||'Y')dtgettime()return}完善自定义字符串类mystring函数包括:构造函数、拷贝构造函数、析构函数并重载运算符=(分别用mystring和C字符串拷贝)(strcat)=<==(strcmp)。解:此例既是对第章的复习也是一个提高。拷贝构造函数的应用请参阅节末尾两项说明本例形参使用引用仅在返回时调用了拷贝构造函数。运算符的重载请参阅节。#include<iostream>usingnamespacestdconstintn=classmystring{charstrn存放字符串的数组容器intmaxsize最大可用元素数可防止数组出界提高健壮性intlast已用元素最大下标public:mystring(){last=maxsize=nstr=''cout<<"缺省构造函数"<<endl}mystring(char*s){当C字符串过长初始化时采用截尾处理last=maxsize=ndo{laststrlast=slast}while(slast!=''last<maxsize)strlast=''截尾处理时必须加串结束符cout<<"构造函数"<<endl}mystring(mystringms){last=maxsize=ndo{laststrlast=msstrlast}while(last<mslast)cout<<"拷贝构造函数"<<endl}~mystring(){cout<<"析构函数"<<endl}voidshow(){如需重载<<则请参见节暂时未学到替代方法是用show()函数cout<<str<<endl}charoperator(inti){返回引用可读可写if(i>last)last=i下标运算符可添加长度但不查边界returnstri}mystringoperator=(mystring)mystringoperator=(char*ms)这里重载的=是把C风格字符串赋给mystringmystringoperator(mystring)mystringoperator=(mystring)booloperator<(mystring)booloperator==(mystring)}mystringmystring::operator=(mystringms){last=do{laststrlast=msstrlast}while(last<mslast)return*this}mystringmystring::operator=(char*ms){这里返回值为引用不调用拷贝构造函数last=do{laststrlast=mslast}while(mslast!=''last<maxsize)strlast=''截尾处理时必须加串结束符return*this}mystringmystring::operator(mystringms){注意和=的不同mystringtemp(*this)必须在一份拷贝上进行inti=templast串的结尾是结束符连接时要覆盖掉do{templastitempstrtemplast=msstri}while(i<mslasttemplast<maxsize)tempstrtemplast=''截尾处理时必须加串结束符returntemp拷贝的临时变量生命期在调用它的表达式中}mystringmystring::operator=(mystringms){=在对象自身进行inti=last串的结尾是结束符连接时要覆盖掉do{lastistrlast=msstri}while(i<mslastlast<maxsize)strlast=''截尾处理时必须加串结束符return*this}boolmystring::operator<(mystringms){重载<运算符inti=,kdo{k=strimsstrii}while(k==i<lasti<mslast)if(k<)returntrueif(i==lasti!=mslast)returntruereturnfalse}boolmystring::operator==(mystringms){inti=,kif(last!=mslast)returnfalsedo{k=strimsstrii}while(k==i<last)if(k!=)returnfalseelsereturntrue}intmain(){intichar*sp="东南大学",*sp="交通学院",*sp="学生",*sp="教师"mystringms(sp),ms(sp),ms(sp)ms,ms,ms是用构造函数生成mystringms(ms),ms=ms,msms,ms用拷贝构造函数生成ms用缺省构造函数ms=spms赋值是返回引用不用拷贝构造函数msshow()msshow()msshow()msshow()msshow()msshow()ms=msmsms注意temp和临时变量由拷贝构造函数生成msshow()ms=ms=msmsshow()if(ms<ms){msshow()cout<<"应排在"<<endlmsshow()cout<<"之前"<<endl}else{msshow()cout<<"应排在"<<endlmsshow()cout<<"之后"<<endl}ms=msms赋值不是返回引用必须调用拷贝构造函数建立临时对象if(ms==ms)cout<<"串ms与串ms相同"<<endlms="Cprogramminglanguage"i=while(msi!='')cout<<msi读出cout<<endlmsi=''写入msi=''i=msshow()return}将习题中的字符串处理函数移植到mystring类中其中strcat已重载为运算符请将其它个转为成员函数。对比成员函数与独立函数构造上有何不同?解:这四个函数因mystring内部有串长又要求下标索引再加上str字符数组可直接使用构造大不相同。#include<iostream>usingnamespacestdconstintn=classmystring{charstrn存放字符串的数组容器intmaxsize最大可用元素数可防止数组出界提高健壮性intlast已用元素最大下标public:mystring(){last=maxsize=nstr=''cout<<"缺省构造函数"<<endl}mystring(char*s){当C字符串过长初始化时采用截尾处理last=maxsize=ndo{laststrlast=slast}while(slast!=''last<maxsize)strlast=''截尾处理时必须加串结束符cout<<"构造函数"<<endl}mystring(mystringms){last=maxsize=ndo{laststrlast=msstrlast}while(last<mslast)cout<<"拷贝构造函数"<<endl}~mystring(){cout<<"析构函数"<<endl}voidshow(){如需重载<<则参见节暂时未学到替代方法是用show()函数cout<<str<<endl}intstrlen(){returnlast}voidreverse()intstrchr(charc)intstrstr(mystringstr)charoperator(inti){返回引用可读可写if(i>last)last=i下标运算符可添加长度但不查边界returnstri}mystringoperator=(mystring)mystringoperator=(char*ms)这里重载的=是把C风格字符串赋给mystringmystringoperator(mystring)这里返回不能用引用mystringoperator=(mystring)booloperator<(mystring)booloperator==(mystring)}voidmystring::reverse(){inti=,j=lastchartempwhile(j>i){注意此处从串两头同时向中间移动重合或交错时停止temp=stri头尾交换stri=strjstrj=tempij}}intmystring::strchr(charc){intifor(i=i!=lasti)if(stri==c)returnireturn未找到返回}intmystring::strstr(mystringstr){inti=,k=while(stri!=''){只要主串还有字符未查则继续while(stri!=strstri!='')i找到主串含有子串的第一个字符,或主串查完停止if(stri!=''){核对子串其他字符while(strik==strstrkk<strlast)k字符串结束符不比较if(k==strlast)returni找到子串返回k=i}}return未找到返回}mystringmystring::operator=(mystringms){这里返回值改为引用不调用拷贝构造函数last=do{laststrlast=msstrlast}while(last<mslast)return*this}mystringmystring::operator=(char*ms){这里返回值为引用不调用拷贝构造函数last=do{laststrlast=mslast}while(mslast!=''last<maxsize)strlast=''截尾处理时必须加串结束符return*this}mystringmystring::operator(mystringms){注意和=的不同mystringtemp(*this)必须在一份拷贝上进行inti=templast串的结尾是结束符连接时要覆盖掉do{templastitempstrtemplast=msstri}while(i<mslasttemplast<maxsize)tempstrtemplast=''截尾处理时必须加串结束符returntemp拷贝的临时变量生命期在调用它的表达式中}mystringmystring::operator=(mystringms){=在对象自身进行inti=last串的结尾是结束符连接时要覆盖掉do{lastistrlast=msstri}while(i<mslastlast<maxsize)strlast=''截尾处理时必须加串结束符return*this}这里返回值改为引用不调用拷贝构造函数boolmystring::operator<(mystringms){重载<运算符inti=,kdo{k=strimsstrii}while(k==i<lasti<mslast)if(k<)returntrueif(i==lasti!=mslast)returntruereturnfalse}boolmystring::operator==(mystringms){inti=,kif(last!=mslast)returnfalsedo{k=strimsstrii}while(k==i<last)if(k!=)returnfalseelsereturntrue}intmain(){intichar*sp="东南大学",*sp="交通学院",*sp="学生",*sp="教师"mystringms(sp),ms(sp),ms(sp)ms,ms,ms是用构造函数生成mystringms(ms),ms=ms,msms,ms用拷贝构造函数生成ms用缺省构造函数ms=spms赋值是返回引用不用拷贝构造函数msshow()msshow()msshow()msshow()msshow()msshow()ms=msmsms注意中的temp和临时变量由拷贝构造函数生成msshow()ms=ms=ms=返回引用不用拷贝构造函数msshow()if(ms<ms){msshow()cout<<"应排在"<<endlmsshow()cout<<"之前"<<endl}else{msshow()cout<<"应排在"<<endlmsshow()cout<<"之后"<<endl}ms=msms赋值不是返回引用必须调用拷贝构造函数建立临时对象if(ms==ms)cout<<"串ms与串ms相同"<<endlms="Cprogramminglanguage"i=while(msi!='')cout<<msi读出cout<<endlmsi=''写入msi=''i=msshow()cout<<endlcout<<"ms串长:"<<msstrlen()<<endlcout<<"字符l在ms中的下标为:"<<msstrchr('l')<<endlms="ing"cout<<"ms在ms中的起始下标为:"<<msstrstr(ms)<<endlmsreverse()msshow()return}vsdstring��n�string��string��n�string��n�n����������

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/17

/root/编程与综合练习题-c指针

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利