1、 - 1 - 编号:编号: 数 据 结 构 课 程 设 计 报 告数 据 结 构 课 程 设 计 报 告 班班 级:级: 网路 102 班 学学 号:号: 18 号 姓姓 名:名: 时时 间:间: 2011 年 12 月 25 日 2012 年 1 月 6 日 指导教师:指导教师: 2012 年年 01 月月 - 2 - 课题一 纸牌游戏 1.1.需求分析需求分析 任务: 编号为 1-52 张牌, 正面向上, 从第 2 张开始, 以 2 为基数, 是 2 的倍数的牌翻一次,直到最后一张牌;然后,从第 3 张开始,以 3 为基数,是 3 的倍数的牌翻一次,直到最后一张牌;然后从第 4 张开始,
2、以 4 为基数, 是 4 的倍数的牌翻一次, 直到最后一张牌; . 再依次 5 的倍数的牌翻一次, 6 的, 7 的,直到以 52 为基数的牌翻过, 输出:这时正面向上的牌有哪些? 可以定义一个宏, 如果第 k 张牌除以基数 j 后的余数是否为 0,如 为 0 就是能整除,然后就利用定义的宏进行翻牌操作。设一个一维数 组 card52,并将所有变量赋初值为 0,表示牌正面朝上。首先将 52 张牌初始化成正面朝上,然后用一个 for 循环来控制基数,用另一个 for 循环来控制从第几张牌开始。 最后打印判断出来的正面朝上的牌。 2.2.概要设计概要设计 (1 1)当每个号码每次遇到是某个数的倍数
3、时,都会相应的翻一次, 这样,每张牌会翻的次数就各不一样,可能很多次,也可能只有一两 次,结果就只是要输出在经过各个不同次数的翻牌后,正面向上的牌 都有哪几个。举例说明一下,比如 24,第一次它是 2 的倍数时要从正 - 3 - 面翻到背面,当进行到 3 时,就又要从背面翻回来,而到 4 时还要在 翻,同理呢,到 6.8.12它都要来回的翻。如果它在多次的翻牌后, 正面还向上了,那么它就是要输出的结果之一。 (2 2)用#define OPPOSITE(i) i = i?0:1 这个宏将牌的状态标志求反, 也即为翻牌操作。将所有的牌建立一个数组,运用 for 的循环嵌套执 行以下操作: 把 5
4、2 张牌初始化成正面朝上、控制基数和翻牌次数, 判 断最终的纸牌朝向并打印出结果,具体实现算法参看详细设计。 - 4 - 3.3.详细设计详细设计: : N N Y Y N N Y Y N N Y Y 开始开始 设一个一位数组 card52,并将所有 变量赋初值为 0,表示牌正面朝上 2=j j52 j=k k52 k%j=0 翻牌,如果 cardk-1为 0,则 变为 1;如果为 1,则变为 0 k+ j+ 输出 card 数组中正面朝上的序号 结束结束 - 5 - 4.4.调试分析调试分析: : (1)(1)这题的时间复杂度是 O(52)。 (2)(2)语法错误相对来说要好调试一些的,但有两点需要特别指出:一 是应该用规范化的格式输入源程序,推荐的格式是:函数体内、循环 体内等都应该缩进一个 TAB 位,相应的块语句的两个大括号都应保持 在同一列上,函数体之间、模块之间