数据结构报告.docx
- 文档编号:27980498
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:49
- 大小:959.02KB
数据结构报告.docx
《数据结构报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告.docx(49页珍藏版)》请在冰豆网上搜索。
数据结构报告
(一)用密钥K对明文P加密成为密文C和解密
1.需求分析
设明文P=P0P1P2…Pn和密钥K=K0K1K2…Km(n>=m)中的字符Pi(1<=i<=n)或Kj(1<=j<=m)的ASCII为00~7FH,用密钥K对明文P进行加密得到密文C=C0C1C2…Cn,用密钥K对密文C解密得到明文P。
加密:
Ci=Pi+Kj(j=imod(m+1))(当Ci<=7FH)
Ci=Pi+Kj-80H(j=imod(m+1))(当Ci>7FH)
解密:
Pi=Ci-Kj(j=imod(m+1))(当Ci>=Kj)
Pi=Ci-Kj+80H(j=imod(m+1))(当Ci 按用户需求,设计三个功能: (1)输入明文并加密成文密文 (2)输入密文解密成为明文并输出 (3)直接解密功能 (1)中生成的密文 (4)退出 2.总体设计 用三个数组分别保存明文P,密钥K和密文C。 使用整型变量i和j作为数组P,K和C的下标,并在加密和解密时使用该下标。 明文、密文和密钥通过下标联系起来,即加密解密时使用下标的关系。 明文数组P: …… pi …… …… char …… 密钥数组K: …… kj …… …… char …… 密文数组C: …… ci …… …… char …… 程序中包含两个模块 1.输入明文并加密 2.从密文解密出明文 主程序运用两个模块提供三个功能 1.输入明文并加密 2.输入密文并解密 3.解密内存中已经存在(使用功能1输入)的密文 图2-1程序功能图 3.详细设计 (1)各模块流程图: 图3-1输入加密模块流程图 图3-2解密输出模块流程图 (2)各模块程序源代码 #include"stdio.h" #defineN7 #defineM4 /********************voidencrypt为输入加密模块****************/ /************************************************************/ voidencrypt(char*P,char*K,char*C) { inti,j; inttest; printf("Pleaseinputthestringof%dchars: \n",N); for(i=0;i { printf("P[%d]=: ",i); getchar(); P[i]=getchar(); } printf("Pleaseinputthekeyof%dchars: \n",M+1); for(i=0;i { printf("K[%d]=: ",i); getchar(); K[i]=getchar(); } printf("Thecodeis: \n"); for(i=0;i { j=i%(M+1); test=P[i]+K[j]; if(test<=127) { C[i]=P[i]+K[j]; printf("C[%d]=",i); printf("%c\n",C[i]); } if(test>127) { C[i]=P[i]+K[j]-128; printf("C[%d]=",i); printf("%c\n",C[i]); } } } /********************voiddecrypt为解密输出模块****************/ /************************************************************/ voiddecrypt(char*P,char*K,char*C) { inti,j; printf("Changingthecodetotheoriginalstring......: \n"); for(i=0;i { j=i%(M+1); if(C[i] { P[i]=C[i]-K[j]+128; } else { P[i]=C[i]-K[j]; } } printf("Theoriginalstringis: \n"); for(i=0;i printf("P[%d]=%c\n",i,P[i]); } /*************************以下为主函数***********************/ /************************************************************/ voidmain() { charP[N]={0}; charK[M+1]={0}; charC[N]={0}; intchoose; while (1) { printf("1.Inputonestringandencryptit.\n"); printf("2.Inputonecodeanddecryptit.\n"); printf("3.decryptthecodeinRAMalready.\n"); printf("4.exit.\n"); scanf("%d",&choose); while(choose<1||choose>4) { printf("Thewrongnumber,pleaseinputagain: \n"); scanf("%d",&choose); } switch(choose) { case1: { encrypt(P,K,C); break; } case2: { printf("Pleaseinputthecodeof%dchars: \n",N); for(i=0;i { printf("C[%d]=: ",i); getchar(); C[i]=getchar(); } printf("Pleaseinputthekeyof%dchars: \n",M+1); for(i=0;i { printf("K[%d]=: ",i); getchar(); K[i]=getchar(); } decrypt(P,K,C); break; } case3: { decrypt(P,K,C); break; } case4: return; } } } 4.测试及结果 图4-1程序主界面 1.输入字符串并加密 2.输入密码并解密输出 3.解密内存中已存在的密码 图4-2测试第一个功能 输入字符串renyi26,密钥为12345,屏幕上显示密文数组C。 图4-3测试第三个功能 解密成功,显示原字符串为renyi26 图4-4测试第二个功能 输入密码为renyi26,密钥为12345,成功输出原文。 5.遇到的问题及解决方法 1.用C语言实现连续读取字符功能(比如连续输入P[1],P[2],P[3]的值)时,C语言会把回车当作一个字符读入,即屏幕上提示P[1]=? ,我们输入“r”回车,系统会把回车当作P[2]的值。 而我们往往把回车当作输入一个字符结束的标志。 这种把回车当作字符的方式不是我们所希望见到的。 解决方法是在每一个P[i]=getchar();语句(读入字符到数组语句)前面加一个不给其他项赋值的getchar();语句,用以吸收结束标志的回车符。 2.使用解密模块时,一开始只设定了输入明文加密和解密内存中已存在密码的功能。 后来发现用户使用时可能会出现直接输入密码进行解密的需要。 于是就在功能中添加了用户直接输入密码,程序解密输出的功能。 (二)运动会分数统计程序 1.需求分析 任务: 参加运动会有n个学校,学校编号为1……n。 比赛分成m个男子项目,和w个女子项目。 项目编号为男子1……m,女子m+1……m+w。 不同的项目取前五名或前三名积分;取前五名的积分分别为: 7、5、3、2、1,前三名的积分分别为: 5、3、2;哪些取前五名或前三名由学生自己设定。 (m<=20,n<=20) 功能要求: 1).可以输入各个项目的前三名或前五名的成绩; 2).能统计各学校总分, 3).可以按学校编号、学校总分、男女团体总分排序输出; 4).可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 规定: 输入数据形式和范围: 20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称) 输出形式: 有中文提示,各学校分数为整形 界面要求: 有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构: 学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。 2.总体设计 本程序信息的储存结构使用两种结构体类型: 储存学校详细成绩信息的结构体school和用于保存排序时使用的简明成绩信息的sortused。 结构体设计如下: 1.school结构 结构体名称 School Int类型 Boysum保存男子项目总成绩 Gilrsum保存女子项目总成绩 Sum保存学校各个项目总成绩 Int数组类型 Place[M+W]保存各个项目名次 score[M+W]保存各个项目积分 2.sortused结构 结构体名称 Sortused Int类型 Schoolnum保存学校编号 Score保存学校得分 输入成绩时,学校的各个项目成绩及名次用数组形式保存在place和score数组里,两个数组的第i个成员表示第i个项目的名次和成绩。 Boysum,girlsum和sum用于统计学校的男子项目,女子项目和总项目的总成绩。 排序和查询时,将school对象中所需要的关键字和学校编号复制到sortused对象中,然后通过对sortused数组对象进行排序实现学校成绩各种条件的统计和输出。 程序中设计8个函数模块,功能分别为: 1.输入各个项目的各学校成绩 2.统计各个学校的总分 3.统计男子项目各个学校的总分 4.统计女子项目各个学校的总分 5.按条件排序输出 (1)按学校编号排序输出 (2)按学校总分排序输出 (3)按男子成绩排序输出 (4)按女子成绩排序输出 6.按条件查询 (1)查询某学校某项目的成绩 (2)按项目查询前三名或前五名 7.将成绩信息保存到文件 8.从文件读取成绩信息 图2-1程序功能图 3.详细设计 (1)各模块流程图 图3-1输入各学校成绩的模块 图3-2统计各学校总分模块 图3-3统计各学校男子总分模块 图3-4统计各学校女子总分模块 图3-5 (1)按条件排序输出成绩模块 (1) 图3-5 (2)按条件排序输出成绩模块 图3-5(3)按条件排序输出成绩模块(3) 图3-5(4)按条件排序输出成绩模块(4) 图3-6 (1)按条件查询模块 (1) 图3-6 (2)按条件查询模块 (2) 图3-6(3)按条件查询模块(3) 图3-7将信息保存到文件模块 图3-8从文件读取信息 图3-9主函数流程图 (3)程序源代码 #include"stdio.h" #defineW2 #defineM2 #defineN7 /*******************定义存储学校成绩信息的数组*********************/ /******************************************************************/ typedefstruct { intgirlsum;/*女团体分数*/ intboysum;/*男团体分数*/ intsum;/*学校总分数*/ intplace[M+W];/*各个项目名次*/ intscore[M+W];/*各个项目积分*/ }school;/*保存学校成绩信息*/ /*******************定义排序学校成绩信息的数组*********************/ /******************************************************************/ typedefstruct { intschoolnum; intscore; }sortused;/*排序时使用,保存分数*/ /*******************输入各个项目的名次的函数***********************/ /******************************************************************/ voidinput(schoolschool[N])/*输入各项目的名次*/{ inti;/*循环控制变量*/ ints1,s2,s3,s4,s5;/*保存取得名次的学校编号*/ intchoose; for(i=0;i { printf("pleasechoose: \n"); printf("1.first3pleasechoose1: \n"); printf("2.first5pleasechoose2: \n"); scanf("%d",&choose); while(choose<1||choose>2) { printf("Thewrongnumber.Pleaseinputagain: \n"); scanf("%d",&choose); } if(choose==1) {do { printf("The1stschoolis: "); scanf("%d",&s1); printf("The2ndschoolis: "); scanf("%d",&s2); printf("The3rdschoolis: "); scanf("%d",&s3); if(s1<=0||s1>N||s2<=0||s2>N||s3<=0||s3>N) /*若输入范围出错,提示重新输入*/ printf("Thewrongnumber! ! Pleaseinputthescoreagain! \n"); }while(s1<=0||s1>N||s2<=0||s2>N||s3<=0||s3>N); school[s1-1].score[i]=5; school[s2-1].score[i]=3; school[s3-1].score[i]=2; school[s1-1].place[i]=1; school[s2-1].place[i]=2; school[s3-1].place[i]=3; } if(choose==2) {do { printf("The1stschoolis: "); scanf("%d",&s1); printf("The2ndschoolis: "); scanf("%d",&s2); printf("The3rdschoolis: "); scanf("%d",&s3); printf("The4tdschoolis: "); scanf("%d",&s4); printf("The5tdschoolis: "); scanf("%d",&s5); if(s1<=0||s1>N||s2<=0||s2>N||s3<=0||s3>N||s4<=0||s4>N||s5<=0||s5>N) /*若输入范围出错,提示重新输入*/ printf("Thewrongnumber! ! Pleaseinputthescoreagain! \n"); }while(s1<=0||s1>N||s2<=0||s2>N||s3<=0||s3>N); school[s1-1].score[i]=7; school[s2-1].score[i]=5; school[s3-1].score[i]=3; school[s4-1].score[i]=2; school[s5-1].score[i]=1; school[s1-1].place[i]=1; school[s2-1].place[i]=2; school[s3-1].place[i]=3; school[s4-1].place[i]=4; school[s5-1].place[i]=5; } } } /*********************统计各个学校总分的函数***********************/ /******************************************************************/ voidschoolsum(schoolschool[N])/*统计各学校总分*/ { inti,j;/*循环控制变量*/ for(i=0;i school[i].sum=0; for(i=0;i for(j=0;j school[i].sum+=school[i].score[j]; /*for(i=0;i printf("The%d'sschool'ssumis: %d\n",i+1,school[i].sum);*/ } /******************统计各个学校男生总分的函数***********************/ /******************************************************************/ voidboysum(schoolschool[N])/*统计男子项目总分*/ { inti,j;/*循环控制变量*/ for(i=0;i school[i].boysum=0; for(i=0;i for(j=0;j school[i].boysum+=school[i].score[j]; /*for(i=0;i printf("The%d'sschool'sboysumis: %d\n",i+1,school[i].boysum);*/ } /******************统计各个学校女生总分的函数***********************/ /*******************************************************************/ voidgirlsum(schoolschool[N])/*统计女子项目总分*/ { inti,j;/*循环控制变量*/ for(i=0;i school[i].girlsum=0; for(i=0;i for(j=M;j school[i].girlsum+=school[i].score[j]; /*for(i=0;i printf("The%d'sschool'sgirlsumis: %d\n",i+1,school[i].girlsum);*/ } /******************按条件排序输出成绩的函数************************/ /******************************************************************/ voidschoolsort(schoolschool[N])/*按条件排序输出成绩*/ { sortuseda[N]; inti,j,k; inttemp=0; intchoose; while (1) { printf("1.Sortbythenumberofschool: \n");/*按学校编号输出*/ printf("2.Sortbythesumscoreofschool: \n");/*按学校成绩输出*/ printf("3.Sortbythesumofboys'score: \n");/*按男生成绩输出*/ printf("4.Sortbythesumofgirls'score: \n");/*按女生成绩输出*/ printf("0.return: \n"); printf("Pleasechoose: \n"); scanf("%d",&choose); while(choose<0||choose>4) { printf("Thewrongnumber.Pleaseinputagain: \n"); scanf("%d",&choose); } switch(choose) { case0: return; case1: {for(i=0;i printf("The%d'sschool'ssumis: %
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告