递归实验报告.docx
文本预览下载声明
递归实验报告
篇一:字符串, 宁波工程学院电信学院计算机教研室 实验报告 一、实验目的 1)熟悉串的定义和串的基本操作。 2)加深对串数据结构的理解,逐步培养解决实际问题的编程能力。 3)熟悉递归的定义和递归的算法设计。 4)加深对递归算法的理解,逐步培养解决实际问题的编程能力。 二、实验环境 装有Visual C++6.0的计算机。 三、实验内容 1、凯撒加密算法 凯撒密码(caeser)是罗马扩张时期朱利斯?凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。 他的原理很简单,说到底就是字母与字母之间的替换。每一个字母按字母表顺序向后移3位,如a加密后变成d,b加密后变成e,······x加密后变成a,y加密后变成b,z加密后变成c。 例如:“baidu”用凯撒密码法加密后字符串变为“edlgx”。 试写一个算法,将键盘输入的文本字符串(只包含a~z的字符)进行加密后输出。 另写一个算法,将已加密后的字符串解密后输出。 提示: ? 如果有字符变量c加密后则=’a’+(c-‘a’+3)%26 ? 采用顺序结构存储串,键盘输入字符串后保存到顺序串中;输出用顺序串的输出函数。 程序: #include #define MaxSize 100 typedef struct //串的类型定义 char ch[MaxSize];//存放串字符 int len; //串长 }SqString; void SetString //设置源码 { int i; printf; scanf; for; //计算串的长度 s.len=i; } void TranString//开始加密 { int i; for { if t.ch[i]=a+%26; //将每一个字母按字母表顺序向后移3位 else t.ch[i]=s.ch[i];//如果字符不是字母a~z,则原样保留 } t.len=s.len; } void RecoverString //开始解密 { int i; for { if //防止解密时字母溢出,对a,b,c三个字母另外考虑 t.ch[i]=s.ch[i]-3; else if t.ch[i]=s.ch[i]+23; else t.ch[i]=s.ch[i]; //如果字符不是字母a~z,则原样保留 } t.len=s.len; } void DispString //输出字符串 int i=0; while { printf; //字母的逐个输出 i++; } printf; } int main { SqString s1,s2,s3; //s1是源码,s2是加密后密码,s3是解密后密码 SetString; //输入字符串 DispString; //输出字符串 TranString;//加密 DispString; //加密后输出字符串 RecoverString;//解密 DispString; //解密后输出字符串 return 0; } 按实验要求首先定义顺序串,实验的难点在于密码的加密和解密的实现,特别是再解密时,字母的溢出问题,在参考网上程序后很好地解决了这个问题。在字符串的输入时,%s和%c的用法混淆,导致实验一度无法进行。实验编完后,又发现一个如果输入的是非字母的字符,程序就无法运行,因此添加了非字母字符维持原样的代码,使得程序更加完整。 2、求解n皇后问题 编写一个程序,求解皇后问题:在n×n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同对角线。 要求:使用递归算法求解;皇后的个数n由用户输入,其值不能超过20。 程序: #include #include #include const int N=20; //最多皇后个数 int count=0;//记录解个数 int q[N]; //存放皇后各皇后所在的行号 void print{//输出一个解 int i; count++; printf; for printf; printf; } int find{ //测试第k列的i行上能否摆放皇后 int j; j=1; whil
显示全部