《数据结构》课程设计————纸牌游戏姓名:xxx学号:xxxx院系:计算机科学与技术学院专业:计科年级:大三指导老师:xxxx目录1.课程设计的目的……………………………………x2.需求分析……………………………………………x3.课程设计报告内容…………………………………x3.1.概要设计…………………………………x3.2.详细设计…………………………………x3.3.调试分析…………………………………x3.4.用户手册…………………………………x3.5.测试结果…………………………………x3.6.程序清单…………………………………x4.小结……………………………………………x5.参考文献…………………………………x1.课程设计的目的(1)熟练使用C语言编写程序,解决实际问题;(2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;2.需求分析编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;直到以52为基数的翻过,输出:这时输出正面向上的牌有哪些?3.纸牌游戏的设计3.1概要设计建立两个数组,一个存放52张牌的编号,另外一个存放相应编号的纸牌的翻牌记录:data[52],flag[52]定义一个全局变量作为正反面的判断条件:Flag=-1欢迎来到纸牌游戏查看题目查看所有牌的翻牌记录查看翻牌的最后结果查看指定纸牌翻牌记录Case1:输出题目Case2:所有牌翻牌记录Case3:输出记录Case4:显示最后结果一维数组data[52],flag[52];并将flag初始化为0表示正面朝上开始3.2详细设计i=2i=52j=ij=52j%i==0i++翻牌。如果flag[j-1]为0则变为1,否则变为0j++输出正面朝上的卡牌结束NNNYYY//建立两个数组,一个存放52张牌的编号,另外一个存放相应编号的纸牌的翻牌记录。inti,j,data[52],flag[52],choice,num;charm,n;for(i=1;i=52;i++){data[i-1]=i;//录入52张牌的编号。flag[i-1]=0;//将相应编号纸牌的翻牌数初始化为0。}for(i=2;i=52;i++)//外循环,基数循环。{for(j=1;j=52;j++)//内循环,基数倍数条件判断。{if(j%i==0){data[j-1]=data[j-1]*Flag;//将翻转后的结果更新data中的数据。flag[j-1]++;//翻牌一次,即记入flag数组中。}}}case1:{printf(---题目---\n);printf(**************************************************************\n);printf(编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,);printf(直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,);printf(直到最后一张牌;直到以52为基数的翻过,输出:这时输出正面向上的牌有哪些?\n);printf(****************************************************************);printf(\n);printf(\n);printf(是否回到主菜单?(Y/N):);//在每个独立功能后添加了独立的判断语句,从而可以选择性的回到主菜单。n=getchar();n=getchar();if(n=='Y')break;elseif(n=='N')choice=0;//0作为整个界面的循环结束条件,所以直接将choice=0,即可结束循环。elseprintf(**********(提示:输入错误,默认为继续。)***********\n);}break;case2:{printf(以下为翻牌记录:\n);printf(\t----第1张牌翻过0次。----\t);printf(\n);printf(\n);for(i=1;i52;i++){printf(\t----第%d张牌翻过%d次。----\t,i+1,flag[i]);if(i%2==0)printf(\n);}printf(\n);printf(是否回到主菜单?(Y/N):);n=getchar();n=getchar();if(n=='Y')break;elseif(n=='N')choice=0;elseprintf(**********(提示:输入错误,默认为继续。)*************\n);}break;case3:{do{printf(\t请输入您想查询的纸牌编码:);scanf(%d,&num);if(num1&&num52)//纸牌的序号为1-52,所以其他数值都为输入错误。printf(\t输入错误!\n);else{printf(\t纸牌翻转记录如下:\n);printf(\t纸牌翻转次数为%d\n,flag[num-1]);for(j=2;j=52;j++)//内循环,基数倍数条件判断。{if(num%j==0){printf(\t在以编号%d为基数时此纸牌有一次翻转。\n,j);}}}printf(需要继续查询纸牌编码吗?(Y/N):);//独立的判断语句,作为do-while的结束条件,从而可循环的查询纸牌编码。m=getchar();m=getchar();if(m!='Y'&&m!='N')printf(************(提示:输入错误,默认为跳过。)**********\n);}while(m=='Y');printf(是否回到主菜单?(Y/N):);n=getchar();n=getchar();if(n=='Y')break;elseif(n=='N')choice=0;elseprintf(**************(提示:输入错误,默认为继续。)**********\n);}break;case4:{printf(\t最后所有正面向上的牌有:\n);for(i=0;i52;i++){if(data[i]0)//所有大于0的数即为正面向上的纸牌。printf(第%d张牌,i+1);}printf(\n);printf(是否回到主菜单?(Y/N):);n=getchar();n=getchar();if(n=='Y')break;elseif(n=='N')choice=0;elseprintf(***************(提示:输入错误,默认为继续。)**********\n);}break;case0:break;default:printf(\t输入错误,请重新输入!\n);}}while(choice!=0);//0作为整个循环的结束条件。printf(*******************程序结束,谢谢使用********************\n);}3.3调试分析:选择1,显示题目选择2,查看所有翻牌记录选择3,查看指定纸牌记录,如18选择4,显示最后结果4.程序清单:#includestdio.h#includewindows.h#defineFlag-1//定义一个全局变量作为正反面的判断条件。voidmain(){inti,j,data[52],flag[52],choice,num;//建立两个数组,一个存放52张牌的编号,另外一个存放相应编号的纸牌的翻牌记录。charm,n;for(i=1;i=52;i++){data[i-1]=i;//录入52张牌的编号。flag[i-1]=0;//将相应编号纸牌的翻牌数初始化为0。}for(i=2;i=52;i++)//外循环,基数循环。{for(j=1;j=52;j++)//内循环,基数倍数条件判断。{if(j%i==0){data[j-1]=data[j-1]*Flag;//将翻转后的结果更新data中的数据。flag[j-1]++;//翻牌一次,即记入flag数组中。}}}do{printf(\t-----------------------------------------------------------\n);printf(\t-----------------------------------------------------------\n);printf(\t---------欢迎进入纸牌游戏-----------\n);printf(\t---------1.查看题目-----------\n);printf(\t---------2.查看所有纸牌的翻牌次数-----------\n);printf(\t---------3.查看指定编号纸牌翻牌记录-----------\n);printf(\t---------4.查看最终正面向上的纸牌编号-----------\n);printf(\t---------0.按0键结束-----------\n);printf(\t-----------------------------------------------------------\n);printf(\t-----------------------------------------------------------\n);printf(请输入您的选择(数字0-4):);//主界面scanf(%d,&choice);switch(choice)//通过switch语句进行功能的选择{case1:{printf(---题目---\n);printf(**************************************************************\n);printf(编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,);printf(直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,);printf(直到最后一张牌;直到以52为基数的翻过,输出:这时输出正面向上的牌有哪些?\n);printf(****************************************************************);printf(\n);printf(\n);printf(是否回到主菜单?(Y/N):);//在每个独立功能后添加了独立的判断语句,从而可以选择性的回到主菜单。n=getchar();n=getchar();if(n=='Y')break;elseif(n=='N')choice=0;//0作为整个界面的循环结束条件,所以直接将choice=0,即可结束循环。elseprintf(**********(提示:输入错误,默认为继续。)***********\n);}break;case2:{printf(以下为翻牌记录:\n);printf(\t----第1张牌翻过0次。----\t);printf(\n);printf(\n);for(i=1;i52;i++){printf(\t----第%d张牌翻过%d次。----\t,i+1,flag[i]);if(i%2==0)printf(\n);}printf(\n);printf(是否回到主菜单?(Y/N):);n=getchar();n=getchar();if(n=='Y')break;elseif(n=='N')choice=0;elseprintf(**********(提示:输入错误,默认为继续。)*************\n);}break;case3:{do{prin