《2022年2022年计算系统与程序设计基础课程设计 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年计算系统与程序设计基础课程设计 .pdf(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 计算机程序设计基础课程设计名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 19 页 - - - - - - - - - 2 目录一:捕鱼问题 . 31、 【设计题目】 . 32、 【设计内容及思路】 . 33、 【算法】 . 34、 【程序清单与运行结果】 . 4二:荷兰国旗问题 . 31、 【设计题目】 . 62、 【设计内容及思路】 . 63、 【算法】 . 64、 【程序清单与运行结果】 . 6三:发纸牌 . 11 1、 【设计题目】 . 11 2、 【设计内容
2、及思路】 . 11 3、 【算法】 . 11 4、 【程序清单与运行结果】 . 12 四:数字旋转方阵 . 15 1、 【设计题目】 . 15 2、 【设计内容及思路】 . 15 3、 【算法】 . 15 4、 【程序清单与运行结果】 . 16 五: 【总结及设计体会】 . 19 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 19 页 - - - - - - - - - 3 一:捕鱼问题1、 【设计题目】A、B、C、D、E五个人合伙夜间捕鱼,上岸时都疲惫不堪,各自在湖边
3、的树丛中找地方睡觉了。清晨,A第一个醒来,将鱼分成5 份,把多余的一条扔回湖中,拿自己的一份回家了;B第二个醒来,也将鱼分成 5 份,扔掉多余的一条鱼,拿自己的一份回家了;接着,C、D、E 依次醒来,也都按同样的办法分鱼。问:5 个人至少共捕到多少条鱼?每个人醒来后看到多少条鱼?2、 【设计内容及思路】根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条鱼后剩下的鱼正好分成五份,然后拿走自己的一份,余下其它的四份。假定鱼的总数为X,则 X 可以按照题目的要求进行五次分配: X-1 后可被 5 整除,余下的鱼为4*(X-1) 、5。3、 【算法】采用正推法, fish
4、0从 1 开始每次增加 5,然后依次考查fish【n】是否满足被 5 证书后余 1,算法描述如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 19 页 - - - - - - - - - 4 Step1:初始化 fish【0】=1;Step2:重复下述操作,直到fish【n】满足被 5 除后余 1;Step2.1:fish【0】=fish【0】+5;Step2.2:循环变量 i 从 1 到 4,重复执行下述操作;Step2.2.1:fish【i】=(fish【i-1】
5、-1)/5*4;Step2.2.2:如果 fish【i】不满足被5 除后余 1,则转step2.1;Step2.2.3:i+ Step3:依次输出数组 fish【n】4、 【程序清单与运行结果】#include int main() char man5 = A,B,C,D,E; int fish5, i; fish0 = 1; do fish0 = fish0 + 5; for (i = 1; i 5; i+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 19 页 -
6、 - - - - - - - - 5 fishi = (fishi - 1 - 1) / 5 * 4; if (fishi % 5 != 1) break; while (i 5); for (i = 0; i 5; i+) printf(%c 看到的鱼数是 %dn, mani, fishi); return 0; 显示结果:A 看到的鱼是 3121 B看到的鱼是 2493 C看到的鱼是 1996 D 看到的鱼是 1596 E看到的鱼是 1276 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
7、- - 第 5 页,共 19 页 - - - - - - - - - 6 二:荷兰国旗问题1、 【设计题目】要求重新排列一个由Red 、White 和 Blue(这是荷兰国旗的颜色)构成的数组,使得所有的Red都排在最前面, White 排在其次, Blue排在最后。2、 【设计内容及思路】荷兰国旗问题其实就是一个排序问题,可以将红, 白,蓝 3 种颜色分别用数字 0,1,2 表示,用一个数组来存储他们。将相同颜色线条归为一类就相等于将数组中的数值按大小进行排序,只不过数组里存储的只有 3 种数值而已。 解题的基本策略是遍历两个颜色区域,如果颜色条不属于所在区域,则交换一个属于该区域的颜色条。
8、这样,每一次都是有必要的交换,从而实现最少交换次数。3、 【算法】输入:数组 Color a n ,有 Red、White、和 Blue 三种元素功能:荷兰国旗输出:有序数组 Color a n4、 【程序清单与运行结果】#include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 19 页 - - - - - - - - - 7 #include #include #define NUM 10 enum Color Red, White, Blue; void A(
9、enum Color a , int n); void B(enum Color a , int n); void C(enum Color a , int n); int main() enum Color a50; A (a, NUM); printf( 初始序列为: ); C(a, NUM); B(a, NUM); printf( 荷兰国旗是: ); C(a, NUM); return 0; void A(enum Color a , int n) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
10、- - - - 第 7 页,共 19 页 - - - - - - - - - 8 int temp, i; srand(time(NULL); for (i = 0; i n; i+) temp = rand( )%3; ai = (enum Color)temp; void B(enum Color a , int n) int i = 0, k = n - 1, j = 0; enum Color temp; while (j k) switch (aj) case Red : temp = ai; ai+ = aj;aj+ = temp; break; case White: j+; b
11、reak; case Blue: temp = aj; aj = ak;ak- = temp; break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 19 页 - - - - - - - - - 9 return ; void C(enum Color a , int n) int i; for(i = 0; i n; i+) switch(ai) case Red : printf(Red ); break; case White : printf(White
12、); break; case Blue : printf(Blue );break; printf(n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 19 页 - - - - - - - - - 10 显示结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 19 页 - - - - - - - - - 11 三:发纸牌1、 【设计题目】假设
13、纸牌的花色有梅花、 方块、红桃和黑桃, 纸牌的点数有 A、2、3、4、5、6、7、8、9、10、J、Q、K,请根据用户输入的纸牌张数n,随机发四手纸牌,每手共有n 张纸牌。(所谓一手纸牌指的是一个玩家手里的纸牌)2、 【设计内容及思路】为避免重复发牌,设二维数组sign【4】 【13】记载是否法国某张牌,其中行下标, 列下标表示点数, 数组元素均为初始化为0.设字符串指针数组 card【n】储存随机发的 n 张纸牌,例如 card【0】=“梅花二”。按以下方法一次发每一张牌: 首先产生一个 03 的随机数 i 表示花色,再产生一个 112 的随机数 j 表示点数,如果这张牌尚未发出,则将sig
14、n【i】 【j】置 1,并将这张牌储存到数组card【n】中。3、 【算法】输入:数组 card13,有 A、2、3、4、5、6、7、8、9、10、J、Q、K十三种元素功能:发纸牌输出:有序数组 card13 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 19 页 - - - - - - - - - 12 4、 【程序清单与运行结果】#include #include #include #include char *str14 = 梅花,黑桃,红桃,方块; / 存储花
15、色char *str213 = A,2,3,4,5,6,7,8,9,10,J,Q,K; char *card13; / 最多发 13 张牌void SendCards(int n); void Printcards(int n); int main( ) int n; printf( 请输入发牌张数: ); scanf(%d, &n); SendCards(n); Printcards(n); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 19 页
16、 - - - - - - - - - 13 void SendCards(int n) int sign413 = 0; int k, i, j ; srand(time(NULL); for (k = 0; k n; ) i = rand( ) % 4 ; j = rand( ) % 13; if (signij = 1) continue; else cardk = (char *)malloc(6); strcpy(cardk, str1i); strcat(cardk, str2j); signij = 1; k+; return; 名师资料总结 - - -精品资料欢迎下载 - - -
17、 - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 19 页 - - - - - - - - - 14 void Printcards(int n) for (int k = 0; k n; k+) printf(%-10s, cardk); printf(n); return; 显示结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 19 页 - - - - - - - - - 15 四:数字旋转
18、方阵1、 【设计题目】给定方阵的阶数,输出如图1 所示 NN(1N10)的顺时针旋转和逆时针旋转两种数字旋转方阵。2、 【设计内容及思路】用二维数组 dataNN储存 N*N 矩形方阵,分别求 N*N 的顺时针旋转逆时针旋转两种数字旋转方阵,观察其旋转方阵特点, 从而得出 i、j、k 之间的关系。3、 【算法】输入:二维数组 dataNN 功能:给定方阵的阶数,输出N*N 的顺时针旋转逆时针旋转两种数字旋转方阵。输出: N*N 的顺时针旋转逆时针旋转两种数字旋转方阵。1 20 19 18 17 16 2 21 32 31 30 15 3 22 33 36 29 14 4 23 34 35 28
19、 13 5 24 25 26 27 12 6 7 8 9 10 11 (a) 逆时针旋转方阵1 2 3 4 5 6 20 21 22 23 24 7 19 32 33 34 25 8 18 31 36 35 26 9 17 30 29 28 27 10 16 15 14 14 12 11 (b) 顺时针旋转方阵图 1 数字旋转方阵示例名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 19 页 - - - - - - - - - 16 4、 【程序清单与运行结果】#incl
20、ude #define N 10 int dataNN = 0; void Full(int number, int begin, int size); voidOutPrint(int size); int main() int n; printf(请输入方阵的阶数 ( 小于 10):); scanf(%d, &n); Full(1, 0, n); OutPrint(n); return 0; void Full(int number, int begin, int size) int i, j, k; if (size = 0) return; 名师资料总结 - - -精品资料欢迎下载 -
21、 - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 19 页 - - - - - - - - - 17 if (size = 1) databeginbegin = number; return; i = begin; j = begin; for (k = 0; k size - 1; k+) dataij = number; number+; i+; for (k = 0; k size - 1; k+) dataij = number; number+; j+; for (k = 0; k size - 1;
22、k+) dataij = number; number+; i-; for (k = 0; k size - 1; k+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 19 页 - - - - - - - - - 18 dataij = number; number+; j-; Full(number, begin + 1, size - 2); return; voidOutPrint(int size) int i, j; for (i = 0; i size;
23、 i+) for (j = 0; j size; j+) printf(%4d, dataij); printf(n); return; 显示结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 19 页 - - - - - - - - - 19 五:【总结及设计体会】这一次的程序设计不仅是一份作业更是我对于一学期来的学习C语言课程的总结,从陌生到熟悉,这无疑是一个艰难的过程,现在我已经能够简单的设计一些小的程序, 这次的设计经历对我的进步起了一个不小的推进作用, 在这次设计中我遇到了不少的问题,同样也总结了不少东西, 比如我认为在做设计之前要有一个清晰的思路,要细心的考虑每个细节, 有的时候一个标点, 一个字母,一个符号都可能导致程序不能运行, 所以更要求我们认真对待, 认真完成, 再设计的过程中有可能需要新知识,这就要求我们在课外去寻找, 去自学,只有这样才能把设计做的完美,不留遗憾。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 19 页 - - - - - - - - -
限制150内