C语言课程设计
题目名称: 7组
姓 名
学 号 130403100
专 业 自动化专业
班 级 1304031
指导教师 冯兰胜
编写日期 2016.5.16
需求分析
4.19 递归反向输出字符串
题目要求:
编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能。例如输入字符串:ABCD,则输出字符串:DCBA
解决的问题:实现一个任意长度的字符串反向输出
限制条件和要求:要用递归函数实现程序功能
总体设计
题目分析:
应用递归的思想有时可以很轻松地实现一些看似不太容易实现的功能。本题就是利用递归方法解决这类问题的一个代表。要将一个字符串反向地输出,我们一般采用的方法是将该字符串放到一个数组中,然后将数组元素反向地输出。但是这样需要一个存储空间,而且字符串的长度无法自由掌握,因为数组是一种静态数据结构。如果选用动态生成的顺序表或者链表来存放字符串,那么实现起来会比较麻烦,特别是如果把字符串存放到单向链表中反向输出是非常困难的。因此如果要实现输入任意长度的字符串,然后将其反向输出,可以通过一个递归的方法巧妙地实现这个功能。
基本思路:
由于用一般的方法实现任意长度的字符串反向输出比较困难,因此如果要实现输入任意长度的字符串,然后将其反向输出,可以通过一个递归的方法巧妙地实现这个功能。算法描述如下:
Print()
{
输入字符串的一个字符a
If (a!=’#’) then print();
If(a!=’#’ ) then 输出该字符a
}
在该算法中,字符的结束标志位#,并且#不作为字符串中的内容。首先输入字符串一个字符,存放到变量a中;然后递归地调用函数print(),重复上述操作,直到输入字符串结束标志为止,然后输出字符串中的字符。
流程图:
假如从屏幕上输入字符串ABC,并以#作为结束标志,函数print()的递归过程如下图所示:
详细设计
完整的实验程序:
#include
void print()
{
char ch;
if((ch = getchar())!='#')
print();
if(ch!='#')
printf("%c", ch);
}
void main()
{
printf("please input a string ending for'#'\n");
print();
printf("\n");
}
该实验程序分为两个函数,一个是print()还有一个就是主函数main(),其中print()函数是一个递归调用函数(也就是题目要求的),在main函数中调用该函数就能很好地实现题目要求,输入字符串的结束标志是#。在print()函数中还用到了getchar()函数即输入一个字符或者字符串。
程序运行结果测试与分析
运行程序的截图:
由以上运行结果看出,输入字符串“abcdefghij”并以“#”结束,按下回车键,会在屏幕上显示“jihgfedcba”;第二次输入的是qwertyuio,输出的是oiuytrewq如此可以看出该实验程序完成了字符串的反向输出,也就是所编写的程序达到了题目要求。
结论与心得
致谢
需求分析
5.7 填数字游戏求解
题目要求:
有这样一个算式ABCD*E=DCBA,其中ABCDE代表的数字各不相同。编写一个程序,计算出ABCDE各代表什么数字。
解决的问题:计算出算式ABCD*E=DCBA 中ABCDE各代表什么数字
限制和要求:ABCDE为各不相同的数字,对程序没有什么要求,只要能算出就行
总体设计
题目分析:
这道题的实质就是求解这样一个4位数ABCD和一位数E,要求他们的乘积等于DCBA。同时A、B、C、D、E互不相等。也就是在4位的正数集合[1000,9999]和一位数[1,9]中找到符合上述算式条件的四位数和一位数。因此可以应用穷举法很方便地找到答案。算法描述如下:
ABCD=1000
Repeat;
E=1
Repeat;
If ABCD*E==DCBA and A、B、C、D、E互不相等
Then
输出这个答案
E=E+1
Until E>9
ABCD=ABCD+1
Until ABCD>9999
通过上述算法一定可以找到满足题目要求的4位数ABCD和一位数E,因为算法将4位数空间的每一个数与1位数空间的每一个数都进