📄 模拟邮箱系统.c
字号:
if(i>=name_top&&i<name_top+19)
{ gotoxy(2,i-name_top+5);
printf(" %12.12s %8.8 %4d年%2d月%2d日 %2d:%2d:%2d",
filename[i],nam,dt.year,dt.mon,dt.day,dt.hou,dt.min,dt.sec);
}
}
exit(0);
/* textbackground(1); textcolor(7);
window(1,1,80,25); clrscr();
printf("\n\t\t===========\t");
if(tag==F2)printf("收信");
if(tag==F4)printf("查信");
printf( "\t===========\n");
textbackground(GROUND); textcolor(COLOR);
window(1,5,80,23); clrscr();
window(1,1,80,25);
*/
for(;;)
{ while(!bioskey(1));
key=bioskey(0);
vsgg=vsg+now*160+1;
for(i=0;i<79;i++,vsgg++) *vsgg++=COLO;
switch(key)
{
case UP:
if(now) now--;
else if(name_top) {name_top--;goto GOTO_TO;}
break;
case DOWN:
if(name_top+now+1<name_total)
if(now<18)now++;
else { name_top++;goto GOTO_TO;}
break;
case DEL:
unlink(filename[now+name_top]);
for(i=name_top+now;i<name_total;i++)
strcpy(filename[i],filename[i+1]);
name_total--;
if(!name_total)
{ conkey=tag;
return OK;
}
if(now+name_top+1>=name_total)
if(now)now--;
else
if(name_top) name_top--;
goto GOTO_TO;
case BACK:
unlink(filename[name_top+now]);
for(i=name_top+now;i<name_total;i++)
strcpy(filename[i],filename[i+1]);
name_total--;
if(!name_total) {conkey=tag;return OK;}
if(now) now--;
else
if(name_top)name_top--;
goto GOTO_TO;
case ESC:
return ERROR;
case ENTER:
n=name_top+now;
if(read(filename[n])&&tag==F2)
{ strcpy(nam,filename[n]);
p=nam+strlen(nam)-1;
*p--=*p--='b';
rename(filename[n],nam);
}
for(i=n;i<name_total;i++)
strcpy(filename[i],filename[i+1]);
name_total--;
if(!name_total)
{ conkey=tag;
return OK;
}
if(now+name_top+1>=name_total)
if(now) now--;
else
if(name_top)name_top--;
goto GOTO_TO;
}
vsgg=vsg+now*160+1;
for(i=0;i<79;i++,vsgg++) *vsgg++=HIDD;
}
}
/***********************************************************
ggets :读入字符串,允许ESC 中途退出
str :存入字符串;
tag :是否是密码域(若是,显示'*');
n :最多输入字符,不含结尾符;
返回 : ENTER 结束回 OK; ESC 结束回 ERROR.
***********************************************************/
int ggets(char *str,int tag,int n)
{
char *q=str;
int i,d,x=1;
do {
while(!(d=bioskey(0)));
if(d==ESC)
{ return ESC;
}
d&=0xff;
if(d>31&&q-str<n)
{ *q++=(char)d;
if(tag)putch('*');
else putch(d);
}
if((d==8)&&(q>str)) {
q--;
if(wherex()<=1)
{gotoxy(x,wherey()-1);
putch(32);
gotoxy(x,wherey()-1);
}
else
{putch(8);
putch(32);
putch(8);
}
}
if(wherex()>x)x=wherex();
}while(d!='\r');
*q='\0';
return OK;
}
/***************************************************************
help
***************************************************************/
void help()
{
printf("\n help ");
getch();
conkey=NO;
}
/************************************************************
select :用于查找,供hufman()使用
略有改动,一次只查一个
************************************************************/
void select(HT *ht,int n,int *s1)
{ HT *p,*q;
p=ht+1;
while(p->par) p++;
q=p+1;
while(q-ht<=n)
{if(!q->par && q->wei<p->wei)
p=q;
q++;
}
*s1=p-ht;
}
/***********************************************************
hufman :建树并编码
算法来自书本,在此不作介绍
***********************************************************/
int hufman(char *HC,int *w,int n)
{ int m,i,s1,s2,c,j,start,f;
char *hcc,*cd;
HT *ht,*p;
if(n<2) return 0;
m=n*2-1;
ht=(HT *)malloc((m+1)*sizeof(HT));
for(p=ht+1,i=1;i<=n;i++,p++,w++) {p->wei=*w;p->par=p->l=p->r=0;}
for(;i<=m;i++,p++) p->wei=p->par=p->l=p->r=0;
for(i=n+1;i<=m;i++)
{ select(ht,i-1,&s1);
ht[s1].par=i; ht[i].l=s1;
select(ht,i-1,&s2);
ht[s2].par=i; ht[i].r=s2;
ht[i].wei=ht[s1].wei+ht[s2].wei;
}
cd=(char *)malloc((n+1)*sizeof(char));
hcc=HC;
cd[n-1]=0;
for(i=1;i<=n;i++)
{ start=n-1;
for(c=i,f=ht[i].par;f;c=f,f=ht[f].par)
if(ht[f].l==c) cd[--start]='0';
else cd[--start]='1';
strcpy(hcc,&cd[start]);
hcc+=n;
}
free(cd);
free(ht);
}
/********************************************************
ma :二进制编码,正式将信息变为编码
pp :(pp=strwork2)存放编码
********************************************************/
char *ma(char *hc,char *str1,char *str,int n,char *pp)
{ char *a[200],c,*q,*p,*r;
int i,j,size_str1;
a[0]=p=hc;
r=str1; j=8;
size_str1=strlen(str1)+1;
for(i=0;i<n;i++,p+=n) a[i]=p;
for(i=0,c=0;i<=size_str1;i++,r++)
{ p=strchr(str,*r);
for(q=a[p-str];*q;q++)
{ if(!j)
{ *pp++=c;
c=0;
j=8;
}
if(*q=='1') c|=1<<(--j);
else --j;
}
}
return pp;
}
/****************************************************
menu :主菜单
修改 长途变量 conkey 以改变流程
****************************************************/
int menu()
{int k;
printf("\n\n 主菜单\n");
printf("\n *****************");
printf("\n F1 帮助");
printf("\n F2 收信");
printf("\n F3 写信");
printf("\n F4 查信");
printf("\n F5 修改密码");
printf("\n F9 换名登录");
printf("\n F10 注销用户");
printf("\n ESC 退出");
printf("\n *****************");
do {
while(!bioskey(1));
k=bioskey(0);
}while((k!=F1)&&(k!=F2)&&(k!=F3)&&(k!=F4)&&(k!=F5)&&(k!=F9)&&(k!=F10)&&(k!=ESC));
conkey=k;
return OK;
}
/*******************************************************
ctoi
*******************************************************/
int ctoi(char *q)
{ union {
int a;
char b[2];
}c;
c.b[0]=*q++;
c.b[1]=*q;
return c.a;
}
/*******************************************************
read
filename:要读的文件名
*******************************************************/
int read(char *filename)
{
FILE *fp;
char you[13],strwork1[400],strwork2[8000],*p;
char str[100],str1[300],*q1,*q,c,*p1,jimp_tag;
int i,j,m,h,size_txt,n,size_k,w[100],*w1;
HT *ht;
struct DATEE {
int year,mon,day,hou,min,sec;
}DATEE;
struct DATEE dt;
textbackground(7); textcolor(0);
window(1,4,80,24); clrscr();
window(1,1,80,25);
fp=fopen(filename,"rb");
fread(strwork1,400,1,fp);
q1=strwork1; size_k=ctoi(q1);
fread(strwork2,size_k,1,fp);
fclose(fp);
q1+=2; size_txt=ctoi(q1);
q1+=2; n=ctoi(q1);
q1+=2; strcpy(you,q1);
while(*q1++);
q=str; w1=w;
for(i=0;i<n;i++)
{ *q++=*q1++;
*w1++=ctoi(q1);
q1+=2;
}
m=hufffffman(ht,w,n);
h=m; p=strwork2; p1=str1;
for(i=0;i<size_k;i++,p++)
{ c=*p;
for(j=7;j;j--)
{ if(c&(1<<j)) h=ht[h].l;
else h=ht[h].r;
if(!ht[h].r)
*p1++=str[h],h=m;
}
}
free(ht);
if(strlen(str1)!=size_txt)
{ gotoxy(35,14); printf("可能发生错误!!");
gotoxy(38,16); printf("确定");
getch();
textbackground(1); textcolor(7);
window(1,4,80,24); clrscr();
}
p =filename;
dt.year=*p+++1937; /* -65+2002 */
dt.mon =*p++-64; /* -65+1 */
dt.day =*p>57?(*p++-54):(*p++-48); /* -65+11 -48+1 */
dt.hou =*p++-65;
dt.min =dt.sec =0;
switch(*p++)
{ case 'C': dt.min+=20;
case 'B': dt.min+=20;
case 'A': dt.min+=*p++-65;
}
switch(*p++)
{ case 'C': dt.sec+=20;
case 'B': dt.sec+=20;
case 'A': dt.sec+=*p++-65;
}
gotoxy(3,4); printf(" 文件名:%12.12s 来自:%8.8 日期:%4d年%2d月%2d日 %2d:%2d:%2d",
filename,you,dt.year,dt.mon,dt.day,dt.hou,dt.min,dt.sec);
jimp_tag=51;
gotoxy(1,24); printf(" 1.原始数据 2.数据编码 3.文本内容 4.回主菜单 0.永久删除");
for(;;)
{
textbackground(1);textcolor(7);
window(1,5,80,23);clrscr();
switch(jimp_tag)
{ case 49: jimp_tag=shuju(strwork2,size_k); break;
case 50: jimp_tag=pinlu(str,w,n); break;
/*spa*/ case 32:
case 51: jimp_tag=text_t(str1); break;
/*ESC*/ case 27:
case 52: return 1;
/*DEL*/ case 7:
/*BS */ case 8:
case 48:unlink(filename); return 0;
}
if(jimp_tag=='6')jimp_tag='3';
}
}
int text_t(char *str1)
{char c;
gotoxy(30,1); printf("******* 文本内容 *******\n\n");
while(putch(*str1++));
do c=getch();
while(c!='0' && c!='1' && c!='2' && c!='3' && c!='4' && c!='6');
return c;
}
int shuju(char *str,int n)
{int j,i;
char c;
i=n;
gotoxy(30,1); printf("******* 原始数据 *******\n\n");
while(i++<=n)
{ c=*str++;
for(j=7;j>=0;j--)
if((c>>j)&1)putch('1');
else putch('0');
}
do c=getch();
while(c!='0' && c!='1' && c!='2' && c!='3' && c!='4' && c!='6');
return c;
}
int pinlu(char *str,int *w,int n)
{int i,j,k=0;
char c;
gotoxy(30,1); printf("******* 数据编码 *******\n\n");
for(i=1;i<65;i+=15)gotoxy( i, 2), printf("字符 -频率-");
for(i=1;i<65&&k<n-1;i+=15)
for(j=3;j<19&&k<n-1;j++,k++)
gotoxy(i,j), printf(" %c %5d",str[k],w[k]);
do c=getch();
while(c!='0' && c!='1' && c!='2' && c!='3' && c!='4' && c!='6');
return c;
}
/*******************************************************8
repass
********************************************************/
int repass()
{
FILE *fp;
int tag=1;
char pas[20],pass[20],pas1[20],pas2[20];
conkey=NO;
printf("\n\t\t=========== 修改密码 ===========");
gotoxy(40, 4); printf(" 确认修改密码");
gotoxy(25, 8); printf(" -- ENTER.是 --");
gotoxy(25,10); printf(" -- ESC .否 --");
for(;tag;)
{ switch(getch())
{ case 27: return OK; /* CR */
case 13: tag=0; /* ESC */
}
}
gotoxy(40,4); printf(" 请正确输入 ");
chdir(my);
fp=fopen("pass.pas","r");
tag=0;
if(fp)
{ tag=1;
fgets(pass,18,fp);
fclose(fp);
}
if(tag)
gotoxy(25,6),printf(" 旧密码:");
gotoxy(25, 8); printf(" 新密码:");
gotoxy(25,10); printf(" 确认:");
textbackground(14);
if(tag)
gotoxy(33,6),cprintf(" ");
gotoxy(33, 8); cprintf(" ");
gotoxy(33,10); cprintf(" ");
if(tag)
{gotoxy(33,6);if(ggets( pas,1,8)==ESC)return ERROR;}
gotoxy(33, 8); if(ggets(pas1,1,8)==ESC)return ERROR;
gotoxy(33,10); if(ggets(pas2,1,8)==ESC)return ERROR;
if((tag&&strcmp(pass,pas))||strlen(pas1)>8||strcmp(pas1,pas2))
{
gotoxy(28,12);
if(tag && strcmp(pass,pas))printf("旧密码错误!!");
else if(strlen(pas1)>8) printf("密码太长!!");
else if(strcmp(pas1,pas2)) printf("两密码不符!!");
gotoxy(30,14);
printf("确定");
getch();
return ERROR;
}
fp=fopen("pass.pas","w+");
fputs(pas1,fp);
fclose(fp);
gotoxy(28,12);
printf("密码修改成功!!");
gotoxy(30,14);
printf("确定");
getch();
return OK;
}
/*****************************************************
注销
*****************************************************/
zhuxiao()
{ char buf[50];
int k;
char c;
struct ffblk fblk;
printf("\n\t\t========== 注消 ===========");
gotoxy(20, 8); printf("注消将会删除您的全部信息");
gotoxy(24,12); printf("Y确定/N取消 N?");
c=getch();
if(c!='y'&&c!='Y'){conkey=NO; return OK;}
getcwd(buf,50);
chdir(my);
k=findfirst("*.*",&fblk,23);
while(!k)
{ unlink(fblk.ff_name);
k=findnext(&fblk);
}
chdir(buf);
k=rmdir(my);
if(k)
{ printf("\n\t 注销失败! 确定");
getch();
conkey=NO;
}else{
printf("\n\t 用户名已经不存在! 确定");
getch();
conkey=DENG;
}
}
void eexit()
{char c;
conkey=NO;
printf("\n\t\t========= 退出 ===========");
printf("\n\n\n\n\t 您确认退出吗(Y/N) N?");
c=getch();
if(c!='Y'&&c!='y')return;
clrscr();
printf("\n\n\n\n\n\n\n\n\n\t\t谢谢使用! 您已经成功退出");
sleep(1);
textbackground(0);
textcolor(7);
clrscr();
exit(0);
}
int readss()
{char c;
conkey=NO;
printf("\n ========= 换址 ===========");
printf("\n\n\n\n\t 您确认换址吗(Y/N)N?");
c=getch();
if(c!='Y'&&c!='y')return OK;
conkey=DENG;
return OK;
}
int hufffffman(HT *ht,int *w,int n)
{ int m,i,s1,s2,cdlen;
HT *p;
if(n<2) return ERROR;
m=n*2-1;
ht=(HT *)malloc((m+1)*sizeof(HT));
for(p=ht,i=1;i<n;i++,p++,w++) {p->wei=*w;p->par=p->l=p->r=0;}
for(i=n+1;i<=m;i++)
{ select(ht,i-1,&s1);
ht[s1].par=i; ht[i].l=s1;
select(ht,i-1,&s2);
ht[s2].par=i; ht[i].l=s2;
ht[i].wei=ht[s1].wei+ht[s2].wei;
}
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -