第三次作业.docx
- 文档编号:6390256
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:19
- 大小:194.64KB
第三次作业.docx
《第三次作业.docx》由会员分享,可在线阅读,更多相关《第三次作业.docx(19页珍藏版)》请在冰豆网上搜索。
第三次作业
《高级软件编程技术作业》
课程报告
姓名:
文钱坤班号:
193152
学号:
20151004264_组长:
院(系):
计算机学院专业:
网络工程
指导教师:
职称:
2016年5月23日
独立工作成果声明
本人声明所呈交的《高级软件编程技术作业》报告,是我个人在导师指导下进行的程序编制工作及取得的成果。
尽我所知,除文中已经标明的引用内容,和已经标明的他人工作外,本报告未包含任何抄袭自他人的工作成果。
对本报告的工作做出贡献的个人,均已在文中以明确方式标明。
本人完全意识到本声明的法律结果由本人承担。
报告作者签名:
日期:
年月日
题目:
在这项任务,您需要执行一组函数的字符串操作,符合下列要求︰
(1)要超过8个函数(不包括overloaded);
(2)必须尽可能为这些函数的参数添加const
(3)尽可能用到引用与指针;
(4)最少包括一个inline函数;
(5)最少有四个函数被重载;
(6)必须对至少两个函数进行异常处理;
(7)必须使用默认参数;
(8)不能用现有的用于字符串操作的库函数;
(9)得到一个测试应以显示执行的函数的结果;
(10)在测试用例,应处理命令行选择一个实现的功能或提供字符串。
设计思路:
首先,这次的作业是对字符串通过函数的调用来进行一系列的操作,但又没有具体到进行什么操作,所以我们不仅需要学习如何调用函数来对字符串进行处理,更要思考进行什么样的处理。
那么为了实现不同的功能,并调用到总共至少12个函数,就需要定义多个函数,为了保证调用函数时的整洁和清晰,就需要用到switch语句来是的函数的调用更简洁明了,然后用不同的case来对不同的函数进行调用,那么这样的话就更加的有条理一些。
而每次调用一个函数后,这个程序就直接结束了,再不能继续调用下一个函数,使得整个程序的操作就比较麻烦了,特别是一次要用到多个函数功能时,需要输入同一个字符串多遍,使得操作即麻烦,又容易出错。
那么为了解决这个问题,我又在每一个case后面再重新调用main函数,那么这样的话,就能在case完成后,再次回到main函数,而不是直接结束程序了。
因为至少要有8个不重载的函数和4个重载函数,那么就是至少需要12个函数,而且所有的函数都是对字符串进行各种操作,所以用数组来定义字符串,而不是用string来定义字符串。
再就是需要想出对字符串能够进行什么样的不同操作,定义什么函数了。
最先想到的就是计算一串字符串的长度了,因为字符串是用数组定义的,所以这个函数只需要用到一个while循环就可以得出长度了。
第二个函数就是复制输入的字符串,那么这个函数的形参需要用到两个char*,把第一个字符数组复制给第二个字符数组,同样的根据数组,只需要用到一个while循环,然后直接赋值就完成了对字符串的复制。
第三个函数是把两个字符串合并成为一个字符串,那么这个函数需要先将两个输入的数组a、b的长度求出来,然后再用for循环,将a、b的数组中存放的字符串赋给新的数组,然后再将新的数组输出,就是新的字符串了。
第四个函数就是把输入的字符串小写转化成大写,这个就需要用到ascii码,把每个字符的数值直接减去32就是大写的数值了,再输出就是每个字母对应的大写了。
第五个函数就是是大写转小写,其实这个函数与小写转大写函数基本是一样的,本质上都是通过ascii码字母的大小写间相差32来进行转换的。
第六个函数就是字符串的倒序,把输入的字符串从后往前以相反的顺序输出,那么这个函数需要用到数字逻辑里学到的异或符号来是的字符反向输出,需要用a[i]=a[i]^a[j];a[j]=a[i]^a[j];a[i]=a[i]^a[j];这三个语句就可以把输入的字符串从后往前输出了。
当然,这个功能也可以直接在输出时按照数组的从后往前输出来实现,但这样没有用到函数,而且也不属于对字符串的操作了,所以我没有这样来做,而是通过异或符号来处理。
第七个函数就是比较两个字符串的大小,这个函数的意思就是按照字母顺序比较两个字符串的大小,如果两个字符串一样长,那么就按照字母表顺序判断。
如果不一样长,那么字符串长的比较大。
为了实现这个功能,首先需要求出每个字符串的长度来比较,从而看能否一步判断出大小,如果不能,那么就需要通过比较字母在字母表中的位置来判断大小了。
我用if判断和else判断,把返回值设为一个整数值,如果返回1,那么就代表第一个字符串大,如果返回2,那么就是第二个字符串大,如果是0,那么就一样大。
这个函数在main函数中调用后,也需要用到if判断,然后输出到底是哪一个大。
第八个函数是取字符串中的从第i位到第j位的字符,那么这个就不需要返回值了,所以我用的void类型,而且函数的形参需要四个参数,要两个字符串形参用来作为传入字符串和传出字符串,两个整数形参用来确定取字符的范围,进而通过数组的输出来实现这个功能。
第九个函数就是对字符串按照字母表顺序进行排序,这个函数的实现需要比较字符串中字符的相对大小,那么对于字符数组来说,需要用到for循环来一一进行比较,然后用if进行判断,再进行位置的变换。
而且由于定义的这个函数是void类型,那么就没有返回值,那么就需要将取出来的字符存储,然后在main函数中进行调用和输出就可以了。
第十个函数是统计字符串中某一个字符出现了多少次,这个函数因为是统计次数,所以就需要定义这个函数的类型为int,返回值是出现的次数,然后就需要先将传入的字符串长度用第一个函数求出,然后遍历这个字符数组,并且用if判断,如果与相比较的字符一样,那么就需要i加一,最后returni,然后main函数就需要cout<
第十一个函数是判断两个字符串是否相同,对于这个函数,就需要遍历这两个函数,然后一一比较,如果其中有不同的字符,那么c就加一,并且break,那么此时c的值就是1。
如果比较到结束都是相同的,那么c就一直为0,然后返回c的值。
然后在主函数中加上判断。
这样的话这个函数就完成了。
第十二个函数是需要区别大小写的,所以又编写了一个不区分大小写并对两个字符串进行比较的函数,这个函数跟上一个基本差不多,唯一有区别的地方就是由于字符串中既有大写,又有小写,那么就需要加上if判断,我首先把大写都转化为小写,然后小写不变,这样再进行上一个函数的比较,这样的话,就可以得到不考虑两个字符串大小写问题的大小结果了。
由于第四点的要求,需要定义inline函数。
关于inline函数,它可以优化规模较小,流程直接的函数,所以我就定义了两个inline函数:
分别是求字符串长度和求出某个字符第一次出现在字符串中的位置。
接着是第五个要求,需要用到重载函数。
所以我共定义了四个重载函数:
求字符串长度重载与求出某字符第一次出现在字符串中的位置、对前n位小写转大写和对这个字符串小写转大写重载、比较前n个字符和比较整个字符串重载、不分大小写比较前n个字符和比较整个字符串重载。
只需要在main函数中调用这几个被overloaded的函数时将函数的参数设置的不同,那么就能正确使用这些函数了。
然后就是第六个要求:
需要进行异常处理。
那么就需要用到throw和try还有catch这三个模块。
并且在定义的函数中用到if判断和throw模块,抛出问题,比如:
判断某个字符在字符串中出现了多少次,首先就判断这个字符是否出现,如果没有出现就直接输出没有出现,并结束这一功能,返回到主界面,否则就通过输出字符出现的次数来运行。
还有就是throwruntime_error("toolarge");然后在main函数中在try这个函数时catch住这个抛出的问题,输出"重新输入",然后再重新载入main函数,让函数再run一遍,然后输入正确的字符串就可以了。
接着就是第七个要求:
必须使用默认参数。
所以我在排序函数、统计字符数目函数中用到了默认参数。
然后在调用函数的时候根本就不需要对于默认参数进行值传递,直接把没有默认参数的参数传入就可以了。
然后接下来的要求就是不能用到对于字符串进行操作的库函数,以及需要得到结果。
也就是说我不能用到string这个类型。
最后一个要求就是需要用到命令行参数,需要用到argc、argv参数,那么我用这个可以得到我程序所在的地址,也就是可以得到一个字符串。
那么这样的话,我就只需要将argv数组中的字符输出,就可以得到程序所在地址了。
就可以用到for循环,然后将argv顺序输出,就可以得到地址了。
这样的话,这个程序也就设计完成了。
#include
#include
usingnamespacestd;
voidstrcopy(constchar*a,char*b){
inti=0;
while(a[i]!
='\0'){
b[i]=a[i];
i++;
}
}
inlineintlength(char*a1){
inti=0;
while(a1[i]!
='\0'){
++i;
}
returni;
}
inlineintlength(char*a1,chara2){
intc=0,i,b;
for(i=0;a1[i]!
='\0';i++){}
for(b=0;b
if(a1[b]==a2){
c++;break;
}
}
if(c==0)return0;
elsereturnb+1;
}
voidCapslock(char*a){
inti=0;
while(a[i]!
='\0'){
if(a[i]<='z'&&a[i]>='a')
a[i]=a[i]-32;
i++;
}
}
voidstrand(char*a,constchar*b){
intc,d,e,f=0;
for(c=0;a[c]!
='\0';c++){}
for(d=0;b[d]!
='\0';d++){}
if(c>20||d>20){
throwruntime_error("toolarge");
}else{
for(e=c;e a[e]=b[f]; f++; } } a[e]='\0'; } voidCapslock(char*a,intn){ for(intb=0;b if(a[b]<='z'&&a[b]>='a') a[b]=a[b]-32; } } voidcapslock(char*a){ for(intb=0;a[b]! ='\0';b++){ if(a[b]>='A'&&a[b]<='Z'){ a[b]-='A'-'a'; } } } intlarge(constchar*consta,constchar*b){ inti=0; for(i=0;a[i]! ='\0'&&b[i]! ='\0';i++) { if(a[i]==b[i]) { if(a[i+1]=='\0'&&b[i+1]=='\0') return0; else if(a[i+1]! ='\0'&&b[i+1]=='\0') return1; else if(a[i+1]=='\0'&&b[i+1]! ='\0') return2; } elseif(a[i]>b[i]) return1; else return2; } } voidxuanding(constchar*a,constint&b,constint&c,char*d){ inte,f=0; for(e=b-1;e<=c-1;++e){ d[f]=a[e]; ++f; } } voiddaoxu(char*a){ inti,j=i-1; char*b; for(i=0;a[i]! ='\0';i++){}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三次 作业