




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
珠海学院课 程 设 计 报 告学院、系:吉林大学珠海学院计算机科学与技术系专业名称:计算机科学与技术设计科目:程序设计基础课程设计学生姓名:指导教师:完成时间:2015年5月5日第一章扑克牌洗牌发牌过程模拟编写一个模拟人工洗牌的程序,将洗好的牌分别发给四个人。对每个人的牌要按桥牌的规则输出。即一个人的牌要先按牌的花色(顺序为梅花、方块、红心和黑桃)进行分类,同一类的牌要再按A、K、Q、J、3、2牌的大小顺序排列。另发牌应按四个人的顺序依次分发。1.1 设计任务与目标模拟人工洗牌的题目,用自己所学的C+进行编写,并且完善随机洗牌算法,以及排序算法的优化,学习习课程的学习经验,加强自己的动手实践能力,增加知识,强化学习,是自己获得进步。1.2 方案设计与论证1.2.1 根据题目要求,设置一个结构体card,因为一张牌有花色和数字的不同,所以结构体card包括了flag和value两个成员,其中flag用整型1,2,3,4来分别表示梅花,方块,红心和黑桃四种花色;value用1,2,3,4,5,6,7,8,9,10,11,12,13来表示牌上的数字。因此一张牌可以由flag和value的组合来唯一确定。在ASCFlag和ASCValue分别来表示ASCII码的扑克花印以及扑克符号。1.2.2洗牌(shuffle)。由于洗牌时牌的顺序是随机的,所以用到了voidsrand(unsignedseed)和intrand(void)函数。通过srand函数设置rand函数所用得到随机数产生算法的种子值来不断改变rand函数的随机数的启动种子值,以产生最佳的随机数。又由于相同的种子后面的rand()函数会出现一样的随机数。所以为了防止随机数每次重复常常使用系统时间来初始化,即使用time函数来获得系统的时间,将time_t型数据转化为(unsigned)型再传给srand函数,即srand((unsigned)time(&t);而在这里所用的则是srand(time(NULL),直接传入一个空指针。用0到51的整数分别对应52张牌随机产生0到51之间的一个整数,将该整数所对应的那张牌与0对应的那张牌交换,然后随机产生1到51之间的一个整数,重复该过程,使他们仅交换数组下标,从而不改变扑克符号和花印。1.2.3 排序(sort)。排序包括按花色排序和按大小排序。在按花色排序中,利用sort函数,根据冒泡排序法,从第一张牌开始依次与其后面的牌比较flag的大小,若第一张牌的flag大于后面的,则两者交换,否则继续。同理:在按照大小排序时,按照冒泡排序法,大的值在前,小的在后。而在花色排好之后,只需要在某种花色的内部进行大小排序即可。1.2.4 牌的显示(colour PX)。牌的显示包括花色和数字。用switch函数把原来的flag和value成员赋值给ASCFlag和ASCValue成员,让ASCFlag和ASCValue成员打印出ASCII码花色和符号。1.2.5 设置四个数组Au,Bu,Cu,Du来分别表示四个人的牌。然后模拟出52张牌。(2)洗牌。(3)发牌:发牌时是根据顺序轮流分给四个人(4)排序。将牌发好之后再根据排序函数分别对四个人的牌进行花色和大小的排序。(5)输出。即用print函数将牌输出。结束。1.3 程序框图或流程图,程序清单与调用关系1.4 全部源程序清单/ 扑克3.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include#include#include#includeusing namespace std;typedef class CARDpublic:int flag;/扑克的类型int value;/扑克编号string ASCFlag;/用ASCII码表示扑克花印string ASCValue;/表示扑克符号Card;class pu_kepublic:pu_ke();/初始化扑克void shuffle();/洗牌void deal();/扑克分牌void sort(Card PX);/排序扑克void colour(Card PX);/給扑克印色void print();/扑克输出Card P113,P213,P313,P413;private:Card P52;Card swap;pu_ke:pu_ke()/初始化扑克int Flags4=1, 2, 3,4;int Value13=1,2,3,4,5,6,7,8,9,10,11,12,13;for(int i=0;i13;i+)Pi.flag = Flags0;Pi.value = Valuei;for(int i=13;i26;i+) static int temp0=0;Pi.flag = Flags1;Pi.value = Valuetemp0+;for(int i=26;i39;i+)static int temp1=0;Pi.flag = Flags2;Pi.value = Valuetemp1+;for(int i=39;i52;i+)static int temp2=0;Pi.flag = Flags3;Pi.value = Valuetemp2+;void pu_ke:shuffle()/交换下标数组int index; int value; srand(int)time(0); /* 每次发牌的时候任意分配待交换的数据 */ for(index = 0; index 52; index +) value = rand() % 52; swap = Pindex; Pindex = Pvalue; Pvalue = swap; void pu_ke:deal()/发牌for(int i=0,j=0;i52;i+,j+)P1j = Pi+;P2j = Pi+;P3j = Pi+;P4j = Pi;void pu_ke:colour(Card PX)/扑克印色char a,b,c,d;a=5,b=4,c=3,d=6;for(int i=0;i13;i+)switch(PXi.flag)case 1: PXi.ASCFlag = a;break;case 2: PXi.ASCFlag = b;break;case 3: PXi.ASCFlag = c;break;case 4: PXi.ASCFlag = d;break;switch(PXi.value)case 1: PXi.ASCValue = A;break;case 2: PXi.ASCValue = K;break;case 3: PXi.ASCValue = Q;break;case 4: PXi.ASCValue = J;break;case 5: PXi.ASCValue = 10;break;case 6: PXi.ASCValue = 9;break;case 7:PXi.ASCValue = 8;break;case 8: PXi.ASCValue = 7;break;case 9: PXi.ASCValue = 6;break;case 10: PXi.ASCValue = 5;break;case 11: PXi.ASCValue = 4;break;case 12: PXi.ASCValue = 3;break;case 13: PXi.ASCValue = 2;break;void pu_ke:print()/输出结果cout玩家一:玩家二:玩家三:玩家四:endl;for(int i=0;i13;i+)coutP1i.ASCFlag P1i.ASCValueP2i.ASCFlag P2i.ASCValueP3i.ASCFlag P3i.ASCValueP4i.ASCFlag P4i.ASCValueendl;void pu_ke:sort(Card PX)/用冒泡排序法排序Card temp;for(int pass=1;pass13;pass+)/先排花色for(int i=0;iPXi+1.flag)temp = PXi;PXi = PXi+1;PXi+1 = temp;int temp1;int temp2;int temp3;int temp4;for(int i=0;i13;i+)/分离花色if(PXi.flag=1)temp1 = i;if(PXi.flag = 2)temp2 = i;if(PXi.flag = 3)temp3 = i;if(PXi.flag = 4)temp4 = i;for(int pass=1;passtemp1+1;pass+)/对扑克编号进行排序(冒泡法)for(int j=0;jPXj+1.value)temp = PXj;PXj = PXj+1;PXj+1 = temp;for(int pass=1;passtemp2+1;pass+)for(int j=temp1+1;jPXj+1.value)temp = PXj;PXj = PXj+1;PXj+1 = temp;for(int pass=1;passtemp3+1;pass+)for(int j=temp2+1;jPXj+1.value)temp = PXj;PXj = PXj+1;PXj+1 = temp;for(int pass=1;passtemp4+1;pass+)for(int j=temp3+1;jPXj+1.value)temp = PXj;PXj = PXj+1;PXj+1 = temp;int _tmain(int argc, _TCHAR* argv)pu_ke test; /创建对象test.shuffle();/洗牌test.deal();/分给四个人test.sort(test.P1);/第一份扑克排序test.sort(test.P2);/第二份扑克排序test.sort(test.P3);/第三份扑克排序test.sort(test.P4);/第四份扑克排序test.colour(test.P1);/进行引色test.colour(test.P2);test.colour(test.P3);test.colour(test.P4);test.print();/输出return 0;1.5 程序运行的测试与分析第二章螺旋矩阵题目:输入一个矩阵,按照从外向里以顺时针螺旋的顺序依次打印出每一个数字。例如:如果输入如下矩阵:12345678910111213141516则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。2.1 设计任务与目标我选择的是螺旋矩阵B17题,这题能让我熟练的掌握矩阵螺旋算法,以及for语句对矩阵行列位置的控制,输入和输出 。2.2 方案设计与论证单纯用for语句来打印螺旋矩阵,在用if语句来控制螺旋矩阵的打印方向,比如当第一行打印到最后一个数字的时候用if语句来控制下一列。这种方法与网上不同,也没什么捷径,但是容易想到。2.3 程序框图或流程图,程序清单与调用关系2.4 全部源程序清单/ 螺旋矩阵.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#includeusing namespace std;int _tmain(int argc, _TCHAR* argv)const int Row = 4;const int Col = 4;int aRowCol = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;/输入例题的矩阵cout输入的矩阵为:endl;for(int j=0;j4;j+)for(int i=0;i4;i+)coutaji ;coutendl;int b16;/创建一个数组来存储输出的数字int i=0,j=0;for(int num = 0;num16;num+)/i为行数,j为列数static int temp=1;bnum=aij;if(j=3&j!=0)/当输出到第四列的时候,往下一行j-;temp=0;continue;if(j=3&temp=1)/当行数达到第四行时,列数开始往左输出i+;j=3;continue; /完好代码elseif(i=1&j!=2)/当i不等于1,j不等于2矩阵往上输出j+;continue;if(j=0)i-;continue;if(i=2)j-;continue;if(j=2)i=2;coutendl;cout输出的为: endl;/输出for(int i=0;i16;i+)coutbi ;return 0;2.5 程序运行的测试与分析第三章大数据量整数不包含的整数一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数。3.1 设计任务与目标选择这题能让我入门大数据的算法,并且懂得对运算和时间复杂度度进行优化,减少资源的占用,并且接触位图映射算法。3.2 方案设计与论证3.2.1 输出文件。由于40亿整数太过庞大,所以只列出40000个整数来让程序执行,先利用随机函数以及文件输入输出流创建“file1.dat”文本。3.2.2 利用位图映射算法。这道程序重点是懂得运用位图映射算法,分配1GB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0。基本思想每读入一个数,就把它对应的bit位置为,处理完40G个数后,对1GB的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的。3.2.3 读取文件。利用ifstream OpenFile语句,读取file1.data。用value变量赋值文本的整数。3.2.4 用判断语句当数组的位显示为0时,说明不重复,即可输出未出现的数字。3.3 程序框图或流程图,程序清单与调用关系3.4 全部源程序清单/题目:在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。 #includestdafx.h#include #include #include #include#include #includeusing namespace std;/* 每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义 用char数组存储2-Bitmap,不用考虑大小端内存的问题 映射关系如下: |00 00 00 00| /映射|3 2 1 0| |00 00 00 00| /映射|7 6 5 4| |00 00 00 00| */ unsigned char flags1000; /数组大小自定义,存放各个整数出现的次数1000*4=4000个整数 #define MAX 4000int a50; unsigned get_val(int idx) int i = idx/4; /确定数组位置 int j = idx%4; /确定8bit内位置 unsigned ret = (flagsi&(0x3(2*j); /0x3十六进制表示00 00 00 11可控制某个整数,获取某个整数的出现次数 return ret; /* 已经过位运算测试 */ unsigned set_val(int idx, unsigned int val) int i = idx/4; int j = idx%4; unsigned tmp = (flagsi&(0x3(2*j)&0xff) | (val%4)=2) return 1; else set_val(idx, get_val(idx)+1); return 0; void write()double value;double i;ofstream SaveFile(file1.dat);srand(unsigned)time(NULL);for(i=0;iMAX;i+) value = rand() % MAX; SaveFilevalue ;SaveFile.close();/只测试非负数的情况; /假如考虑负数的话,需增加一个2-Bitmap数组. int main() write();cout原文本数: endl;ifstream OpenFile(file1.dat);char ch;while(!OpenFile.eof()OpenFile.get(ch);coutch;OpenFile.close();coutendlendl;double i;memset(flags, 0, sizeof(flags); ifstream inFile; vector arr; inFile.open(file1.dat); double temp;while(inFiletemp)add_one(temp); inFile.close(); printf(rn); printf(没出现过的数:); coutendl; for(i=0;i MAX; +i) if(get_val(i) = 0) coutipart.elts = ngx_palloc(pool, n * size); if (list-part.elts = NULL) return NGX_ERROR; /已使用个数为0 list-part.nelts = 0; /没有下一个结点,next指为NULL list-part.next = NULL; /最后一个结点也指向刚刚分配的数组 list-last = &list-part; /数组每个元素大小为size list-size = size; /数组能容纳元素个数为n list-nalloc = n; /内存池为pool list-pool = pool; return NGX_OK; 可以看到,ngx_list_init调用成功后,会创建一个数组结点。 4.1.5链表添加元素操作ngx_list_push /链表添加元素,l为链表结构 void *ngx_list_push(ngx_list_t *l) void *elt; ngx_list_part_t *last; /last指向链表最后一个结点 last = l-last; /如果最后一个结点的数组已经满了 if (last-nelts = l-nalloc) /* the last part is full, allocate a new list part */ /从内存池中分配一个ngx_list_part_t数组对象 last = ngx_palloc(l-pool, sizeof(ngx_list_part_t); if (last = NULL) return NULL; /从内存池中给数组对象元素分配空间,每个元素大小为size,元素数目为nalloc last-elts = ngx_palloc(l-pool, l-nalloc * l-size); if (last-elts = NULL) return NULL; /新分配的数组已使用结点个数为0,下一个链表结点为NULL last-nelts = 0; last-next = NULL; /将新分配的数组链到链表,并把链表尾指针指向新分配数组 l-last-next = last; l-last = last; /elts为数组首地址,elts + size * nelts 即位为分配数组元素的位置 elt = (char *) last-elts + l-size * last-nelts; /分配个数+1 last-nelts+; return elt; 可以看到,push的思想很简单,每次都往链表最后一个数组添加,数组满后就再增加一个数组结点,这里push的时间复杂度为O(1),没有任何遍历操作,充分利用了“链表尾插” 和 “数组下标索引”的优势。 4.1.6疑问源代码中只给了链表的插入操作,没有删除操作,看起来不完整,这里猜测这个链表结构应该不会直接使用,而是被再次封装。结论与心得 1、每次做一个课程设计都会让自己受益匪浅,让我
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年哈尔滨市第四十六中学校招聘教师考试笔试试题(含答案)
- 现场救护专业培训课件教学
- 生产线ERP系统集成创新创业项目商业计划书
- 电子商务平台用户增长与留存创新创业项目商业计划书
- 农副产品种植清洁技术集成创新创业项目商业计划书
- 咖啡香薰产品创新创业项目商业计划书
- 移动智能终端软件创新创业项目商业计划书
- 2025年防城港市市级机关公开遴选考试笔试试题(含答案)
- 2025年东莞市市级机关公开遴选考试笔试试题(含答案)
- 现场急救知识培训新闻稿课件
- 小学生无故旷课问题
- 2024年秋季云南高中学业水平合格考历史试卷真题(含答案详解)
- 中国抗癌协会神经内分泌肿瘤诊治指南(2025年版)解读
- T/CSMT-YB 006-2023精密数字温度计性能测试与评价方法
- DB31/ 653-2012通信基站空调能效限定值
- 组建乐团协议书
- 兼职人员聘用协议书
- GB/T 45595-2025离心式制冷剂压缩机
- 2020公路工程质量检验评定标准第二册机电工程
- 金矿居间合同协议书
- 酒店安全考试试题及答案
评论
0/150
提交评论