数据结构报告.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;iprintf("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;ischool[i].sum=0;
for(i=0;ifor(j=0;jschool[i].sum+=school[i].score[j];
/*for(i=0;iprintf("The%d'sschool'ssumis:
%d\n",i+1,school[i].sum);*/
}
/******************统计各个学校男生总分的函数***********************/
/******************************************************************/
voidboysum(schoolschool[N])/*统计男子项目总分*/
{
inti,j;/*循环控制变量*/
for(i=0;ischool[i].boysum=0;
for(i=0;ifor(j=0;jschool[i].boysum+=school[i].score[j];
/*for(i=0;iprintf("The%d'sschool'sboysumis:
%d\n",i+1,school[i].boysum);*/
}
/******************统计各个学校女生总分的函数***********************/
/*******************************************************************/
voidgirlsum(schoolschool[N])/*统计女子项目总分*/
{
inti,j;/*循环控制变量*/
for(i=0;ischool[i].girlsum=0;
for(i=0;ifor(j=M;jschool[i].girlsum+=school[i].score[j];
/*for(i=0;iprintf("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;iprintf("The%d'sschool'ssumis:
%