版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、约瑟夫问题一 目的通过课程设计,加深对C语言程序设计课程所学知识的理解,熟练掌握和巩固C语言的基本知识和语法规范,包括:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);库函数应用(时间函数、绘图函数以及文件的读写操作函数等);复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等)。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。二 需求分析1、约瑟夫问题的算法设计使用链表构成一个环形链。结构中有三个成员,其一为指向下
2、一个人的指针,以构成环形的链;其二为该人是否被仍下海的标记,为0表示还在船上。其三为 数字(130)从第一个人开始对尚未仍下海的人进行计数,每数到9时,将结构中的标记改为1,表示该人已被仍下海了。这样循环计数直到15个人被扔下海时为止。数据可以由用户输入。2、功能要求与简要说明使用菜单操作,提示用户相应的操作;有一定的辅助功能,例:注册,密码验证,在屏幕上查看保存到文件中的结果。用户输入的数据及结果保存到outfile.txt文件中(或自建文件)。三 概要设计1、可满足输入与输出的形式与限制本程序现只支持英文,只是字符输入、输出及整数,本程序可以要求第一次使用该程序的用户在开始游戏前必须进行简
3、单的输入信息(姓名字符形式)及由用户自己设定的密码,该信息将保存到名为mima.dat(属于密文)文件中,下次该用户进入游戏时,将可直接输入信息(姓名及对应密码)可进入游戏(约瑟夫问题),游戏中用户输入的有效信息及对应的结果将保存到名为outfile.txt的文件中,用户可查询游戏结果,可在操作界面查看从outfile.txt文件中输出到屏幕的结果。运行时,机器会给用户提示,并输出到屏幕上来提示用户操作,若用户输入格式不正确,程序会做出判断,使用户重新输入,在密码注册与验证部分(要求用户输入字符在010之内),用户输错就会退出;在游戏部分,用户自测时(数字限制在100个数之内),若超出范围,将
4、会提示用户重新输入。其他地方的输入相似,都有此类功能。方便用户。2、所达到的功能及测试计划所实现的功能有用户初次进入要求注册;进入游戏前要密码信息(对使用有了限制);约瑟夫问题游戏由用户自己设定船上人总数(例:30 最优为偶数,若为奇数则扔下船的人数为(n-1)/2,n为总人数),及所数的号码(例:9),用户可直接在操作界面来检查以前游戏的结果(用户未删除的情况);outfile.txt为追加式写入,用户在操作界面可删除文件中的内容,方便使用。1.游戏的辅助功能:用户注册后可通过输入密码进入游戏,用户也可不注册进入游戏,但略有不同的是注册的用户游戏中,游戏结果保存到文件中时会加上用户的注册名,
5、方便了用户的结果查看,但为了满足使用的方便也可直接进入游戏。还有在操作界面查看结果和删除结果的作用。2.约瑟夫游戏中的功能:用户可在操作界面自己创建文件;进入游戏用户可按自己的意愿,确定人数和号码;用户还可自测(输入下海人的号码),程序判断并打分或者直接运行出结果;根据用户自己的要求来结束或继续。3.退出游戏:用户可在菜单处直接来退出游戏,或者在子操作结束后,不回到菜单,直接退出。最后关于程序的测试,可以多次测试,并且根据实际情况和用户使用的方便角度来测试,在运行正常并能一定程度的容错,在进一步优化。3、所用数据类型的定义及含义此程序运用了整形、实型、字符型、指针、数组、结构体。下面是全局(举
6、例):struct man int num; int state; struct man *next; ; /*结构体数据,用来连接链表*/ struct person char name20; char mima5; /*结构体数据,用来信息注册*/FILE *fpfile; /*指向文件的指针*/char tempname20="",tempmima5="" /*数组,用来进入游戏保存用户输入数据的*/下面是局部的(举例):int m,n,i,j,k, l=0; /*整型,用来接受用户数据和函数中使用*/ char c=0,c1,c2; /*字符型字
7、符变量*/ char User100; /*字符型数组,用于保存输入的下海人号码*/4、各模块的划分下面是总体流程(简化图):约瑟夫程序各模块删除 文件直接进入游戏输入密码进入游戏输入名 读结果注册信息outfile.txt文件自建文件用户自测正确结果退出游戏约瑟夫游戏5、各程序模块功能1.注册信息密码模块:用于输入用户自己的名称(字符型),保存到(mima.dat)中。2.输入密码,进入游戏模块:输入密码,程序判断,若在文件(mima.dat属于密文,在输入到文件中的信息经过了程序加密)有记录即可进入游戏(3.中介绍游戏模块)。 3.约瑟夫游戏模块:用户先确定写入的文件;输入人数及号码;若进
8、行自测,用户自行输入下海人的号码,程序会判断对错。若不自测就直接程序算出结果。4.在屏幕上显示结果模块:先确定文件;再把此文件中的结果输出到屏幕上。5.删除文件(默认文件outfile.txt)中的全部内容。6、各函数之间的调用关系主函数中是菜单的打印(myprint()函数)和switch(),各模块套用与调用关系如下:main()函数中调 用myprint();myyuesefu();zhuce(); mima();myread();mydelete();int myopen();mima();中调用myyuesefu();。myyuesefu();中调用int myopen(); int
9、 link(struct man *head,int n);。myread();中调用int myopen();函数。Main()函数把这些函数联系到一起,各函数有自己的局部变量,总的有全局变量,在多个函数调用时则联系到一起,构成完整的程序。四 详细设计1、流程图开始结束菜单输入(05)switch();判断注册zhuce();密码mima()(包含游戏)游戏myyusefu();读文件myread();删除文件内容mydelete();继续(y|n)退出if( )判断sure:(y|n)if( )判断真(y)真(y)假 (n)214503假(n)主结构:2、主要程序的源代码(部分)及注释1、
10、约瑟夫问题代码:(是本程序的主要代码,部分代码)void myyuesefu() int m,n,i,j,k, l=0; FILE *fp1; char c=0,c1,c2 ,User100; struct man *h,*p,*s; /*用于定义结构体类型的指针*/ do clrscr(); /*清除屏幕*/ h=creat(); /*用于返回一个结构体型的指针赋给h*/printf("Open outfile.txt (1)OR zi jian wen jian:(2):nchoose:");c=getche(); if(c='1') /*自动打开默认的
11、outfile.txt文件,在D盘下,可改*/fp1=fopen("D:outfile.txt","a"); /*用于打开文件“a”为追加(直接在上次结果后写入)“w”为写入每次打开上次结果将清空,路径双(注意)*/ else fp1=myopen(); /*用于用户自己建立文件,默认保存到D 盘下*/ /*函数打开文件返回指向文件的指针*/ fprintf(fp1,"%s'Result is:",tempname); printf("nPlease Input the number of people: n&quo
12、t;); scanf("%d",&n); fprintf(fp1,"n003 Please Input the numbe rof people :n%dn",n) ; /*写入文件函数格式(控制写入)*/ if(link(h,n)!=1) /*link(h,n)构造链表*/ printf("Kong jian not enough !n"); /*空间不足的话返回值不为1*/ s=h; p=(struct man*)malloc(sizeof(struct man); p->next=s; /*额外再分配出一个,即n+
13、1个,但这一个不使用*/ printf("input a number,when dao zhe ge shu shi xia hai :n"); scanf("%d",&m); fprintf(fp1,"input a number,when dao zhe ge shu shi xia hai :n%d",m) ;printf("User sure check userself ( User zi ji su ru shu ju pan duan ):nplease choose (Y /N ): n"
14、); c2=getch(); if(c2='y'|c2='Y') printf(" nGAME BEGIN !User input the answer byself Game:n"); fprintf(fp1,"nUser input the answer byself Game:n"); printf("Please input the number (zi ce shu ju de ge shu ):n"); scanf("%d",&k); while(k>=10
15、0|k<=0) printf("WRONG! OVER the (0100),input again:n"); scanf("%d",&k); fprintf(fp1,"Please input the number (zi ce shu ju de ge shu ):%dn",k); printf("Please input xia hai ren number:n"); fprintf(fp1,"Please input xia hai ren number:"); for(i
16、=0;i<k;i+) scanf("%d",&Useri); fprintf(fp1,"%dt",Useri); l=0; for(j=0;j<(n/2);j+) /*解释在下面*/ /*解释在下面*/ for(i=0;i<m;i+) /*解释在下面*/ p=p->next; if(p->state=1) i-; for(i=0;i<k;i+) /*解释在下面*/ if(Useri=p->num) /*用户输入值与答案的比较*/ l+; /*用于记忆相同的个数,即答对个数*/ p->state=1;
17、 printf("nYour right answer number ist%d tyour score is:t%2.1f",l,(l/(double)k)*100); fprintf(fp1,"nYour right answer number ist%d tyour score is:t%2.1fn",l,(l/(double)k)*100); else printf("ttRight answer:nxia mian shi xia hai de ren ( ing gai an pai huai ren ): n"); fp
18、rintf(fp1,"nxia mian shi xia hai de ren ( ing gai an pai huai ren ): n") ; for(j=0;j<(n/2);j+) /*双层for循环,外层用来循环(n/2)次,即仍下(n/2)个人,*/ for(i=0;i<m;i+) /*内层循环是数到指定的号码例:9时来退出循环,从而输出的数据*/ /*是被扔下人的号码*/ p=p->next; if(p->state=1) /*当是p->state=1时为已经扔下的人*/ i-; /*这时就执行 i-;则跳过该人 */ /*当数到
19、m 例:9 为一次循环,且一次指向下一个结点*/ printf("%dt",p->num); /*每数到m例:9时,输出所对数据,则为下海的人,*/ fprintf(fp1,"%dt",p->num) ; /*p->state=1;此句为已丢下海的人标记为1,下次if(p->state=1) 时,i- */ p->state=1; /*则就是不再包含已经丢下海的人*/ getch(); fputs("n",fp1); printf("nwant to continue Game:(y/n):&q
20、uot;); c1=getch(); fclose(fp1); /*用于关闭文件,只有关闭文件后才会对数据保存*/ while(c1='y'|c1='Y'); /*判断是不是继续游戏(循环) */ 下面是上述函数的引用函数:struct man *creat() /*用于返回头指针(结构体指针)*/ struct man *head; head=(struct man*)malloc(sizeof(struct man); /*分配空间*/ head->next=NULL; head->num=1; head->state=0; /*初始化*/
21、 return (head); /*返回此结构体指针值*/ int link(struct man *head,int n) /*用于连接链表的函数结点(n个)的函数,返回值为整型,head为全局变量*/ struct man *p,*s; int i; p=head; for(i=1;i<n;i+) s=(struct man*)malloc(sizeof(struct man); /*分配内存空间*/ p->next=s; p=s; /*依次首尾相连 */ p->num=i+1; /* 赋值,依次加1*/ p->state=0; /*分别记为0 ,变为1时即下海*/
22、 p->next=head; return 1; /*若成功返回1则分配空间成功*/ 2、密码文件的密文操作(以及读取时解码程序) for(i=0;i<strlen(temp.mima);i+) /*用于在储存信息时加密,使信息变为密文*/ j=0; if(j=strlen() j=0; temp.mimai=temp.mimai+j+; for(i=0;i<strlen(temp.mima);i+) /*提取用户的信息后进行解码*/ j=0; if(j=strlen() j=0; temp.mimai=j+;这是防止打开文件就能查看到用户的密码信息,进行了加密,使文件内容成为密文,这个加密安全性并不高,但现在能力有限还不能做的更好,但有一定的加密作用。五 调试分析1、程序问题解决及优化设计该问题的方法是对一系列值进行赋值(1n),再把扔下的人做记号,用到了结构体,另一做记号,此题开始想用数组,但数组分配特定的空间,浪费内存空间,从而使用链表,根据用户需要来分配空间,这样既节省了空间,而且也增大了程序的可行性。对于用户输入的值一开始
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 巢湖市庐江县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 鹤壁市淇县2025-2026学年第二学期三年级语文期中考试卷(部编版含答案)
- 长沙市望城县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 渠道拓展方案
- 深度解析(2026)《CBT 3798-2016船舶钢制舾装件涂装要求》
- 深度解析(2026)《2026年退役光伏组件回收处理企业的商业模式与绿色融资渠道》
- 嫁接理论考试试卷及答案
- 9《端午粽》跨学科公开课一等奖创新教学设计
- 社会学资格考试中等试题及答案
- 非小细胞肺癌绿色治疗指南
- 2025福建省晋华集成电路有限公司校园招聘笔试历年常考点试题专练附带答案详解
- 哔哩哔哩国创线下活动招商方案
- 2026年甘肃甘南碌曲县卫健系统招聘工作人员50人笔试备考题库及答案解析
- 国际税收 课件全套 张伦伦 第1-10章 国际税收概论 -国际税收发展
- 4.1 人要有自信 课件 2025-2026学年统编版道德与法治七年级下册
- 2026年消防设施操作员(中级监控)真题及答案
- 山东电工电气集团招聘笔试题库2026
- 传统医学出师考核和确有专长考核实施方案(试行)
- 2026年大连职业技术学院单招职业技能考试题库及答案详解(名师系列)
- 高级卒中中心建设与管理指南
- 天津市河东区2025-2026学年高三一模检测试题生物试题试卷含解析
评论
0/150
提交评论