西安交大C程序设计作业.docx
- 文档编号:2185921
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:6
- 大小:35.43KB
西安交大C程序设计作业.docx
《西安交大C程序设计作业.docx》由会员分享,可在线阅读,更多相关《西安交大C程序设计作业.docx(6页珍藏版)》请在冰豆网上搜索。
西安交大C程序设计作业
集团标准化小组:
[VVOPPT-JOPP28-JPPTL98-LOPPNN]
西安交大C程序设计作业
西安交通大学实验报告
课程__计算机程序设计__实验名称__指针与函数__第1页共25页
系别___________实验日期2014年4月18日
专业班级______组别_____________实验报告日期2014年4月19日
姓名__________学号__报告退发(订正、重做)
同组人_________________________________教师审批签字
一、实验目的
学会使用递归函数和函数重载,进一步熟练动态分配等指针使用方法。
二、实验内容
(一)第一题:
1、(必做题)使用递归算法编写如下程序:
对于任意给定的实数X和整数k(k>0),计算Xk。
1.源程序代码:
#include
usingnamespacestd;
doubleyunsuan(doublex,intk);验结果:
(1)输入X正实数:
(2)输入X正整数:
(3)输入x为负数:
(4)输入k为负数:
3.问题分析:
该函数的循环方式是:
x^k=x*x^(k-1).设f(x,k)=x^k,那么就有f(x,k)=f(x,k-1)*x.而其结束递归的条件是k=1,此时有f(x,1)=x,由此给出初值。
(二)第二题:
使用递归算法编写求斐波那契数列的第n项的函数,并编出主函数进行验证。
1.源程序代码:
#include
usingnamespacestd;
intfib(intn)验结果:
(1)输入项数正确(0或正整数):
(2)输入项数有误(负数):
3.问题分析:
该题的递归方式:
第n项为之前两项之和,即:
fib(n)=fib(n-1)+fib(n-2),由此递归至fib
(1)和fib
(2)时结束递归,而fib
(1)和fib
(2)已知。
(三)第三题:
重载判断两个数值大小的函数max,这些数值可能是整型数、实型数和字符型,函数的返回值为两个数值中的最大值。
1.源程序代码:
#include
usingnamespacestd;
doublezhuanhuan(char*c)验结果:
(1)输入整数型:
(2)输入为实数:
(3)输入为字符:
正数:
(带正号):
(不带正号):
整数:
负数:
3.问题分析:
该题的重点在于字符型的处理。
在实验报告中,采取了两个数字逐个分开输入的方法,因而主要只需要判断开头是否为负号、中间是否有小数点并区别小数点前后处理方法的不同这几个问题。
如果能够一次性输入两个数中间用空格隔开的话,就需要判断空格的位置,然后对空格之后的部分再进行与前半部分相同的判断方法,显得更加麻烦。
对字符型的处理思路:
首先判断首字符是不是“-”或者“+”,如果是的话,先跳过从第二个字符开始处理,在最终的结果中再乘以-1即可;然后对于接下来的整数部分进行累加,直到遇见小数点,若没有小数点则一直执行到字符结束;如果有小数点的话,对于小数点后的部分再进行累加得到结果。
四、第四题:
编写一个函数,用于去掉字符串前面的空格,其原型为:
char*myltrim(char*string);
其中参数string为字符串,返回值为指向string的指针。
1.源程序代码:
#include
usingnamespacestd;
char*myltrim(char*string)
{
inti=0,j=0;
while(*(string+i)=='')
i++;
do
{
*(string+j)=*(string+i);
i++;
j++;
}while(*(string+i-1)!
='\0');
returnstring;
}
intmain()
{
charstring[41];
cout<<"请输入字符串:
";
(string,40);
cout<<"去掉开头的空格之后为:
\n"< return0; } 2.实验结果: 为验证处理空格时仅是将开头处理而不处理中间空格: (1)中间无空格: (2)中间有空格: 3.问题分析: 曾经出现的问题: 起初运行时发现,即使没有判断开头空格的程序,输出结果也是没有空格的,后来检查发现是输入语句没有写为导致空格不被录入。 五、第五题: 用牛顿迭代法求任意一元方程: anXn+an-1Xn-1+......+a1X1+a0=0的根。 提示: 迭代公式: Xn+1=Xn+f(Xn)/f'(Xn) 结束迭代过程的条件为(|f(Xn+1)|<ε)与(|Xn+1-Xn|<ε)同时成立,其中ε为预先给定的精度要求。 1.源程序代码: #include usingnamespacestd; doublecf(doublex,intk)验结果: 3.问题分析: 思路分析: 程序中用到的多个函数: 乘方函数、计算f(x)、f_(x)的函数、自定义的求根的主体的函数、主函数。 乘方函数用于计算f(x)、f_(x),f(x)、f_(x)函数的使用简化求根的函数。 六、第六题: 将数字、小数点、正负号组成的字符串转换成相应的实数,例如: ""变成。 函数原型如下: doublemyatof(char*num);要求编写主函数加以测试。 1.源程序代码: #include doublemyatof(char*num); usingnamespacestd; intmain() { charnum[20]; cout<<"请输入数值: "; cin>>num; cout<<"转换结果为: "< cout<<"检验: "< return0; } doublemyatof(char*a) { inti=0; doublex=0; if(*(a+0)=='-'||*(a+0)=='+')验结果: 对整数、负数、小数等均进行检测: (1)小数、负数: (2)整数: (正): (负): (3)0: 3.问题分析: 此题与第二题处理字符类似,需要处理开头正负号、小数点。 (七)第七题: 在字符串T中查找子串S,若找到,返回子串的个数,若找不到返回0。 要求编写主函数加以测试。 1.源程序代码: #include usingnamespacestd; intfind(char*a,char*b) { inti,s=0,x=strlen(a),y=strlen(b); for(i=0;i<=x-y;i++) { if(b[0]==a[i])验结果: [注]: 由于题目中没有说明,所以在这里当做可以共用来数,即: aaaa中查找aa时,第一二个a、第二三个a、第三四个a都认为是满足条件的,因而查出有三个而非两个。 若要求不可重叠,只需循环完毕后从i=i+y+1再判断即可. (1)其他符号: (2)字母: (3)此例说明可重叠: (4)含空格: 3.问题分析: 不足之处: 曾经尝试过让子串也输入“”但发现此时无法实现,当输入第一个字符串并回车后程序会跳过子串输入语句直接输出结果。 不懂为何,如下: 八、第八题: 编写一个程序,当输入一个整型数字以后,可以转换成相应的大写英文单词输出。 如: 123转换成onehundredtwentythree。 验结果: (1)一位数: (2)两位数: (3)带正号: (4)特定位置含0: (5)0: (6)位数为3的倍数: (7)负数、非数字: 3.问题分析: 应该注意以下几点: (1)对于输入负数或者0或者不是整数的处理; (2)每三位为一个环节,末尾输出应该是thousand、million还是billion还是不输出要防止前面没有数字却输出一个单位如: millionthreehundredtwentythree (3)当3i+1位为1时,要考虑到此时不是13——tenthree,而是thirteen,因而需要对此分开处理。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安 交大 程序设计 作业