数据结构报告.docx

上传人:b****7 文档编号:15701641 上传时间:2023-07-06 格式:DOCX 页数:49 大小:959.02KB
下载 相关 举报
数据结构报告.docx_第1页
第1页 / 共49页
数据结构报告.docx_第2页
第2页 / 共49页
数据结构报告.docx_第3页
第3页 / 共49页
数据结构报告.docx_第4页
第4页 / 共49页
数据结构报告.docx_第5页
第5页 / 共49页
数据结构报告.docx_第6页
第6页 / 共49页
数据结构报告.docx_第7页
第7页 / 共49页
数据结构报告.docx_第8页
第8页 / 共49页
数据结构报告.docx_第9页
第9页 / 共49页
数据结构报告.docx_第10页
第10页 / 共49页
数据结构报告.docx_第11页
第11页 / 共49页
数据结构报告.docx_第12页
第12页 / 共49页
数据结构报告.docx_第13页
第13页 / 共49页
数据结构报告.docx_第14页
第14页 / 共49页
数据结构报告.docx_第15页
第15页 / 共49页
数据结构报告.docx_第16页
第16页 / 共49页
数据结构报告.docx_第17页
第17页 / 共49页
数据结构报告.docx_第18页
第18页 / 共49页
数据结构报告.docx_第19页
第19页 / 共49页
数据结构报告.docx_第20页
第20页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构报告.docx

《数据结构报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告.docx(49页珍藏版)》请在冰点文库上搜索。

数据结构报告.docx

数据结构报告

(一)用密钥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:

%

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2