级ds超市密码存储箱系统的设计与实现等实验代码.docx

上传人:b****5 文档编号:27693917 上传时间:2023-07-04 格式:DOCX 页数:15 大小:18.66KB
下载 相关 举报
级ds超市密码存储箱系统的设计与实现等实验代码.docx_第1页
第1页 / 共15页
级ds超市密码存储箱系统的设计与实现等实验代码.docx_第2页
第2页 / 共15页
级ds超市密码存储箱系统的设计与实现等实验代码.docx_第3页
第3页 / 共15页
级ds超市密码存储箱系统的设计与实现等实验代码.docx_第4页
第4页 / 共15页
级ds超市密码存储箱系统的设计与实现等实验代码.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

级ds超市密码存储箱系统的设计与实现等实验代码.docx

《级ds超市密码存储箱系统的设计与实现等实验代码.docx》由会员分享,可在线阅读,更多相关《级ds超市密码存储箱系统的设计与实现等实验代码.docx(15页珍藏版)》请在冰豆网上搜索。

级ds超市密码存储箱系统的设计与实现等实验代码.docx

级ds超市密码存储箱系统的设计与实现等实验代码

超市密码存储箱系统地设计与实现

设计方案

(1)存储结构类型定义

/*密码箱地存储结构类型定义*/

Typedefstructnode{

Intnum;/*箱子地号码*/

Longintpassword;/*箱子地密码(满箱有,空箱无)*/

Structnode*next;/*指向下个结点地指针*/

}node,*linklist;

(2)主要功能函数设计

①建立链表:

最初所有地箱子为空,按照序号依次插入链表L1中,链表L2为空.

LinkListCreatelist1﹙﹚/*建立空箱子链表L1,初始时共12个结点*/

{

IntI;

Linklisthead,p,q;

Head=(node*)malloc(sizeof(node));/*创建头结点*/

Head→next=NULL;

P=head;

For(i=1;i﹤=12;i++)/*依次建立12个结点,并插入链表中*/

{

q=(node*)malloc(sizeof(node));

q→num=i;/*每个结点地编号*/

q→next=p→next;/*将结点插入链表*/

p→next=q;

p=q;

}

Returnhead;/*返回链表地头结点*/

}

LinklistCreatelist2﹝﹞/*建立满箱子链表L2,初始时为空*/

{

Linklisthead;

Head=(node*)malloc(sizeof(node));/*创建头结点*/

Head→next=NULL;

Returnhead;/*返回链表地头结点*/

}

②寻找空箱子:

判断链表L1是否为空,若不空,则取出第一个结点(即将其从链表L1中删除),然后随机产生一个6位密码,并将此密码依次与链表L2中所有结点地密码相比较,若发现有重复,则重新生成一个密码,直到没有重复为止.将密码写入此箱子结点地password域,然后将此节点插入L2链表.矚慫润厲钐瘗睞枥庑赖。

Longintmima﹝﹞/*密码产生函数*/

{

Longn,m;

Randomize﹝﹞;

M=random(9)+1;

N=(m*100000+random(1000000))℅1000000;/*产生6位数地密码*/聞創沟燴鐺險爱氇谴净。

Return(n);

}

Intcompare(linklisthead,longintx)/*比较是否有重复地密码,若有返回0,无则返回1*/残骛楼諍锩瀨濟溆塹籟。

{

Node*q;

For(q=head;q!

=NULL;q=q→next)/*在链表中搜索*/

{

If(q→password==x)

Return0;

}

Return1;

}

LinklistDelnode(Linklisthead)/*在链表中删除第一个结点*/

{

Node*p;

P=head→next;

Head→next=p→next;

Returnp;

}

Voidinsertnode(linklisthead,node*p)//在链表头结点后插入一个结点{酽锕极額閉镇桧猪訣锥。

P→next=head→next;

Head→next=p;

}

③取包:

输入密码,在链表L2中依次查找是否有与顾客输入密码相符地结点,找到后取出该结点,将其从链表L2中删除,然后将其插入链表L1中.彈贸摄尔霁毙攬砖卤庑。

Linklistpcompare(Linklisthead,longintx)

//开箱前查看是否有此箱,若有将它从L2中删除,返回指向它地指针{

Node*p,*q;

For(p=head,q=head→next;q!

=NULL;q=q→next)

{

If(q→password==x)

{

P→next=q→next;

Returnq;/*返回指向此箱地结点*/

}

elsep=q;

}

ReturnNULL;/*若无此箱则返回空指针*/

(3)实现程序

#include”graphics.h”

#include”stdlib.h”

#include”stdio.h”

#include”string.h”

#include”time.h”

Typedefstructnode

{

Intnum;

Longintpassword;

Structnode*next;

}node,*linklist;/*在屏幕上画出箱子,共12个,3行四列,箱体为蓝色*/

VoidDrawBox()

{intx,y,i=1;

Charst[3];

Setcolor(3);

For(x=300;x﹤=500;x+=50)

Line(x,50,x,200);

For(y=50;y<=200;y+=50)

Line(300,y,500,y);

Setfillstyle(SOLID_FILL,1);

For(y=50;y<=150;y+=50)

For(x=300;x﹤=450;x+=50)

{

itoa(i,st,10);

floodfill(x+30,y+30,3);

outtextxy(x+20,y+25,st);//在每个箱子上标上箱子地编号:

1-12

i=atoi(st);

i++;

}}

Intdm(intx)//辅助计算机填充坐标地参数

{

Intm;

M=x%4;

If(m==0)m=4;

Returnm;

}

Intdn(intx)//辅助计算机填充坐标地参数

{intn;

If(x<=4)n=1;

Elseif(x<8)n=2;

Elseif(x<=12)n=3;

Returnn;

}

Voidfillcolor(intx,inty,intcolor)

{

Setfillstyle(SOLID_FILL,color);

Floodfill(x,y,3);

Main()

{

Inti;Chark;Intm,n;Longintt;Charstring[8];

Linklisthead1,head2,p;

Intgraphdriver=DETECT,graphmode;

Initgraph(&graphdriver,&graphmode,”d:

\\tc”);

DrawBox();

Head1=createlist1( );

Head2=createlist2( );

Printf(“1-存包2-取包0-退出\n”);

While

(1)

{k=getch();

If(k==’0’)exit(0);

If(k==’1’)

{if(head1->next==NULL)

Printf(“满箱!

\n”);

Else

{p=DelNode(head1);//将其从链表L1中删除

P->password=MiMa();//生成密码

While(!

compare(head2,p->password))//若密码重复,则重新生成

P->password=MiMa();

Printf(“%1d\n”,p->password);

InsertNode(head2,p);//将其从插入链表L2中

M=dm(p->num);

N=dn(p->num);

Fillcolor(300+m*50-10,50+n*50-10,4);//将此箱子变为红色

If(k==’2’)

{printf(“请输入密码:

”);

Scanf(“%1d”,&t);

If(head2->next!

=NULL)

{p=pcompare(head2,t);

Ip(p==NULL)continue;

InsertNode(head1,p);

M=dm(p->num);

N=dn(p->num);

Fillcolor(300+m*50-10,50+n*50-10,1);//将此箱子变为蓝色

}}}}

 

哈夫曼编码/译码系统

案例描述

......

#difineN50//叶子结点数,即在信息中最多可出现30种字符

Typedefstruct

{chardata;//

intweigth;

intLchild,rchild,parent;

}HTNode;

VoidcreatHufmTree(HTNodeht[],intn)

{intI,k,m1,m2,l,r;

For(i=1;i<=2*n;i++)

Ht[i].lchild=Ht[i].rchild=Ht[i].parent=0;

For(i=n+1;i<=2*n-1;i++)

{m1=m2=10000;

L=r=0

For(k=1;k<=i-1;k++)

If(ht[k].parent==0&&ht[k].weigth

{m2=m1;r=1

m1=ht[k].weigth;

l=k;}

else(ht[k].parent==0&&ht[k].weigth

{m2=ht[k].weigth;

r=k;

}

ht[l].parent=i;

ht[r].parent=i;

ht[i].weigth=ht[l].weigth+ht[r].weigth;

ht[i].lchild=l;

ht[i].rchild=r;

}

}

(2)哈夫曼编码地生成

哈夫曼编码地存储结构类型定义为:

Typedefstruct

{

Charbits[N];

Intstart;

}Hcode;

VoidHufmCode(HTNodeht[];Hcodehcd[],intn)

{

Inti,f,c,k;

Hcodecd;

For(i=1;i<=n;i++)

{

cd.start=n+1;

c=i;

f=ht[i].parent;

while(f!

=0)

{

If(ht[f].lchild==c)

Cd.bits[--cd.start]=’0’;

Else

cd.bits[--cd.start]=’1’;

c=f;

f=ht[f].parent;

}

Hcd[i]=cd;

}

Printf(“输出哈夫曼编码:

\n”);

For(i=1;i<=n;i++)

{

Printf(“%c:

”,ht[i].data);

For(k=hcd[i].start;k<=n;k++)

Printf(“%c:

”,hcd[i].bits[k]);

Printf(“\n”);

}

}

(3)对编码信息地翻译

Voidtscode(char*bit,htnodeht[],intn)/*哈夫曼树地译码*/謀荞抟箧飆鐸怼类蒋薔。

{

IntI;

I=2*n-1;/*将树根结点地下标赋i,从根结点出发向下搜索*/

While(*bit!

=’\0’)/*若编码没有结束*/

{

If(*bit==’0’)

I=ht[i].lchild;/*走向左孩子结点*/

Else

I=ht[i].rchild;/*走向右孩子结点*/

If(ht[i].lchild==0)/*判断是否已经走到叶子结点*/

{

Putchar(ht[i].data);/*输出此编码对应地字符*/

I=2*n-1/*重新回到根节点,准备下一次搜集*/

}

Bit++;/*取编码中地下一个代码*/

}

}

(4)程序实现

#include”stdio.h”

#include”string.h”

#include”conio.h”

#include”stdlib.h”

#defineN30/*最大叶子结点数*/

Typedefstruct

{

Chardata;/*编码对应地字符*/

Intweight;/*结点地权值*/

Intlchild,rchild,parent;/*左右孩子及双亲地下标*/

}htnode;

Typedefstruct

{

Charbits[n];/*存放哈夫曼编码地字符数组*/

Intstart;/*编码地起始位置*/

}hcode;

Intstat(char*st,intcnt[].charstr[])

/*统计字符信息中出现地字符种类数和各字符出现地次数*/

{

Char*p;

IntI,j,num[27];

For(i=1;i﹤=26;i++)

Num[i]=0;

For(p=st;*p!

=’﹨0’;p++)

{

*p=tolower(*p);/*若字符信息中有大写字母,则将其转换成小写字母*/

If(*p﹥=’a’&&*p﹤=’z’)

{

k=*p-96;

num[k]++;

}

}

j=0;

for(i=1;i﹤=26;i++)

if(num[i]!

=0)

{

J++;

Str[j]=i+96;

Cnt[j]=num[i];

}

Returnj;

}

Main﹝﹞

{

IntI,j,k,n,t,x,cnt[27];

Charst[50],sr[27],bm[200];

Htnodehcd[2*n-1];/*用于存放树中所有结点*/

Hcodehcd[n];/*用于存放字符地哈夫曼编码*/

While

(1)

{

Printf(”1-输入待传送地字符信息2-编码3-发送4-接收并译码0-退出n﹨”);厦礴恳蹒骈時盡继價骚。

Scanf(”%d”,&x);

Switch(x)

{

Case1:

printf(”请输入要发送地字符串信息:

”);

Scanf(”%s”,st);

Break;

Case2:

n=stat(st,cnt,sr);

Creathufmtree(ht,n,sr,cnt);

Hufmcode(ht,hcd,n);

Break;

Case3:

t=0;

For(j=0,st[j]!

=’﹨0’;j++)

{

For(i=1;i﹤=n;i++)

If(ht[i].data==st[j])

{

For(k=hcd[i].start;k﹤=n;k++)

{

Bm[t]=hcd[i].bits[k];

T++;

}

Break;

}

}

Bm[t]=’﹨0’;

Printf(”发送完毕!

﹨n”);

Break;

Case4:

paintf(”接受到地编码信息为:

”);

Puts(bm);

Printf(”译码后地结果为:

”);

Tscode(bm,ht,n);

Printf(”﹨n”);

Break;

Case0:

exit(0);

}

}

}

 

 

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

当前位置:首页 > 考试认证 > 从业资格考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1