1、第一阶段 面向过程程序设计1. 编程序 用迭代法求 a 的立方根,求立方根的迭代公式为 :Xi+1=(2*Xi)/3+a/(3*Xi*Xi) 假定 X 的初值为 a,迭代到|Xi+1-Xi| (1=5, 1=5) : 1 11 6 15 10 2114 9 20 5 1619 2 7 22 118 13 24 17 425 18 3 12 23提示:(1) “棋盘”可用二维数组 B 表示。(2)编制一个具有如下原型的递归函数 solve,用于完成任务:从(i,j)点出发,做第 k至第 n*n(即 n 的平方)次的移动 将 k 直到 n 的平方这些数码按规则分别摆放到棋盘即数组 B 中,若成功则
2、通过引用参数 ok 返回 true,否则返回 false。void solve(int i, int j, int k, bool”来完成所求任务。欲处理的初始问题为:从某点(x1,y1)出发,按所给行走规则,作 24 次移动,遍访棋盘中没被访问过的各点(或发现无路可走) 。可分解化简为如下两个子问题(正是形成递归函数的基础): 由点(x1,y1)出发,按所给行走规则作 1 次移动到达(g,h)(或发现无路可走) ; 从(g,h)点出发,按所给行走规则,作 23 次移动,遍访棋盘中没被访问过的各点(或发现无路可走) 。solve 函数具体实现时,若由(i,j)点出发已“无路可走” ,则将引用参
3、数 ok 置为 false 而递归出口;否则,先“迈一步”到达(g,h)点,而后再进行递归调用: solve(g, h, k+1, ok);以实现从新点(g,h)出发,将 k+1 直到 25 这些“棋子” (数码)分别摆放到棋盘上,若成功则通过引用参数 ok 返回 true(否则返回 false) 。点评:(1)也可编制第二种解法的主函数:将棋盘上的 n 平方个点依次作为巡游起点的初始坐标位置(x1,y1),判断从每一位置出发是否有解或无解(输出 “OK!”或“NO!” ,但并不输出“路线图” ) 。(2)若更改程序中的 n 值(如改为 4 或 6 等) ,便可求解其他阶数的巡游“路线图” 。
4、(3)可改用非递归方法设计并编写 solve 函数,那样的话,通常要增加一个记录摆放“棋子”信息的数组,可记录下是沿着什么方向到达了当前的什么位置(在那儿摆放了“棋子” )等,而且对上述数组可按照栈(stack)的方式来使用(栈总是采用 FILO 即所谓的先进后出使用方式) ,以便在“无路可走”的情况下,回退(回溯)到上一个位置,接着按照另外的方向去寻找其他的“行走”方法。7. 将输入的罗马数据化为 10 进制数。假设罗马数据中只使用如下 7 个“基值”字母:M、D、C 、L、X、V、I,分别用来表示 1000、500、100、50、10、5、1。如,罗马数据 LXXXVII 表示 10 进制
5、的 87。将输入的 10 进制正整数转换为罗马数据。假设罗马数据中只使用“基值”字母:M、D、 C、L 、X、V、I,分别用来表示 1000、500、100、50、10、5、1。 8. 编程序,循环进行如下的处理过程:由计算机生成简单的四则运算题;用户给出答案;计算机判断对错。直到用户回答说不再继续做了时结束程序。提示:可让用户选择指定出加、减、乘、除哪一种运算题,以及出一位数还是两位数的运算题;而后通过使用“rand()%10”或“rand()%100”来获得一个 0 到 9 的一位整数随机值或得到 0 到 99 的两位整数随机值来为用户出题。还可进一步对用户所做算术题的对错次数进行记录,结
6、束程序时给出一个某种形式的成绩。9. 编程序,按如下要求来求解任意阶数满秩矩阵的逆矩阵。(1) 矩阵行数(阶数)n 之值由用户通过键盘输入;(2) 将欲求逆的 “原始矩阵 ”另加一个“单位矩阵” 存放在于数组 A 之中,而 n 行 2n列的 A 存储空间通过 new 来动态分配,且 “原始矩阵”的各元素值也由用户通过键盘输入;(3)利用行初等变换设法将 A 左半的“原始矩阵”化为“单位矩阵” ,此时,右半的原“单位矩阵”则变成了欲求的结果逆矩阵。提示:将整个求解任务(总任务)进行“分解” ,设计出多个各负其责的自定义函数以完成各子任务。求取逆矩阵的主要工作是:利用行初等变换(如将某一行的各数据
7、乘以适当的倍数加到另一行的对应各元素上去) ,设法将 A 左半的“原始矩阵”化为“单位矩阵” (首先将“左半”消为“上三角” ;又将“左半”主对角线消为 1;最后将“左半”消为单位矩阵) ,此时,右半的原“单位矩阵”则变成了欲求的逆矩阵。10. 编写程序对八皇后问题进行求解:在 8 行 8 列的棋盘上放置 8 个皇后,使任一个皇后都不能吃掉其他的 7 个皇后(注:皇后可吃掉与她处于同行或同列或同一对角线上的其他棋子) ,并将结果以某种方式显示出来。例如,当求出下述的一个解时,可输出如下信息来表示该解(输出了表示摆放皇后的坐标位置以及“棋盘状态” 棋盘中有皇后的位置放一个 “Q”字符,其他位置为
8、“+”字符) 。(1,1) (5,2) (8,3) (6,4) (3,5) (7,6) (2,7) (4,8)Q + + + + + + + + + + + + Q + + + + Q + + + + + + + + + Q+ Q + + + + + + + + Q + + + + + + + + Q + + + Q + + + + +提示:(1) 通过“int LineNum9; bool a9, b15, c15;”说明具有全局作用域的 4 个数组。其中的:LineNumi表示第 i 列的皇后要放的行位置(只用其中的列号 1 到 8) ;ai为 true(i =1 ,2, ,8)表示第 i
9、 行上尚未放皇后;bi为 true(i =0,1,2,14)表示第 i 条斜对角线上尚未放皇后(斜对角线指的是“/”状对角线,该对角线上各点的行列号之和 i+j 为一个常数) ;ci为 true(i=0 ,1,2, ,14)表示第 i 条反斜对角线上尚未放皇后(反斜对角线指的是“”状对角线,该对角线上各点的行列号之差 i-j 为一个常数) 。从而当使用语句“if ( aj ”时,可用于判断并实现:如果在第 j 行的第 i 列上放置皇后安全的话,则将一枚皇后放置到那儿。(2)编制一个具有如下原型的递归函数 solve,它负责往第 i 列开始的连续 8-i+1 列上均放上皇后,若成功则通过引用参数
10、 ok 返回 true(否则返回 false) 。void solve(int i, bool摆放皇后之后,若 i=8 即已放满时则递归出口;否则通过 solve(i+1,ok);进行递归调用。(3)编制主函数,首先初始化一个“空棋盘” ,即将 a、b、c 数组的各元素均置为true(表示当前棋盘的 8 个行、15 条斜对角线以及 15 条反斜对角线上都尚未摆放皇后) 。而后执行调用语句“solve(1, ok);”,它负责往第 1 列开始的连续 8 列上均放上皇后,若成功则通过引用参数 ok 返回 true(否则返回 false) 。点评:(1)可改用非递归方法设计并编写 solve 函数,
11、那样的话,通常要设置数组来记录皇后的摆放位置信息,还要记录这些皇后所产生的“影响面” (所建立的“势力范围” ) 使得哪些行列位置不可再摆放皇后。当在新的行列位置摆放了皇后、但此时又无法进一步摆放其他的皇后时,要回退(回溯)到上一个位置接着去考虑另外的“行走”方法(若还有的话)等等。但注意, “回退”一步后,要同时“撤销”由于该步的回退而关联的那些“影响面” (释放“势力范围” ) 。(2)本程序只是找到了某一种“摆放方案”而终止,还可进一步考虑寻找其他各种不同的“摆放方案” (实际上共有 92 种) 。(3)也可用同样的方法去处理其他“阶数”的皇后问题,如求解四皇后问题等。第4题: #inc
12、lude using namespace std; int a8=0,100,50,20,10,5,2,1 int main() int n,i,s=0; cinn; for (i=1;i using namespace std; int a13=0,31,28,31,30,31,30,31,31,30,31,30,31; int main() int i,s=0,year,month,day; puts(“请输入1月1日是星期几“); cinn; puts(“请输入要查找的日期“); cinyearmonthday; if (year%4=0 for (i=1;i#include #incl
13、ude using namespace std;int main()string num;coutnum;int i=num.size();int result=0;int j;for(j=i-1;j=0;j-)result+=(numj+numi-1-j-2*0)*pow(10,j);cout #include int map99;/用来标记的二维数组 int n=5;/实际计算时的棋盘大小,超过5时运算时间过长,小于5时无解 class Knight private: int dirx8;/八个方向可以走,用两个数组分别记录每个方向上 x,y 的坐标位移 int diry8; public: Knight() dirx0=1;diry0=2; dirx1=2;diry1=1; dirx2=1;diry2=-2; dirx3=2;diry3=-1; dirx4=-1;diry4=2; dirx5=-2;diry5=1; dirx6=-1;diry6=-2; dirx7=-2;diry7=-1; private: bool judge(int y,int x) if(x0 delete horse;