📄 模拟邮箱系统.c
字号:
/*
*/
#define GROUND 1
#define COLOR 7
#define HIDDGROUND 0
#define HIDDCOLOR 1
#define COLO ((GROUND>>4)+COLOR)
#define HIDD ((HIDDGROUND>>4)+HIDDCOLOR)
#define NO 2
#define F1 15104
#define F2 15360
#define F3 15616
#define F4 15872
#define F5 16128
#define F6 16384
#define F7 16640
#define F8 16896
#define F9 17152
#define F10 0x4400
#define ESC 0x011b
#define ENTER 7181
#define DEL 0x5300
#define SPACE 14624
#define TAB 0xffe4
#define BACK 3592
#define UP 18432
#define DOWN 20480
#define OK 1
#define ERROR 0
#define DENG -1
/*
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
*/
#include <stdio.h>
#include <dir.h>
#include <string.h>
#include <dos.h>
#include <time.h>
#include <bios.h>
/*
#include <
#include <
#include <
*/
typedef struct {
unsigned int wei;
unsigned int par;
unsigned int l;
unsigned int r;
}HT;
int conkey=NO;
char my[14]="liujie";
char dirr[100];
void itoc(char *q,int n);
int deng();
int new();
int denglu();
int fw();
int fenjie(char *str1,char *str,int *w1,int *n);
int find(int tag);
int ggets(char *str,int tag,int n);
void help();
void select(HT *ht,int n,int *s1);
int hufman(char *HC,int *w,int n);
char *ma(char *hc,char *str1,char *str,int n,char *pp);
int menu();
int ctoi(char *q);
int read(char *filename);
int text_t(char *str1);
int shuju(char *str,int n);
int pinlu(char *str,int *w,int n);
int repass();
int readss();
void eexit();
int hufffffman(HT *ht,int *w,int n);
/****************************************************
main :主循环并恢复初始状态
****************************************************/
main()
{
getcwd(dirr,100);
for(;;)
{ textbackground(1); textcolor(7);
window(1,1,80,25); clrscr();
fflush(stdin);
chdir(dirr);
switch(conkey)
{ case DENG: denglu(); break;
case NO : menu(); break;
case ESC : eexit(); break;
case F1 : help(); break;
case F2 : find(F2); break;
case F3 : fw(); break;
case F4 : find(F4); break;
case F5 : repass();break;
case F9 : readss(); break;
case F10 : zhuxiao(); break;
}
}
}
/****************************************************
deng :输入用户名和密码,直到合格或三次
调用 ggets 可以中途 ESC 退出
返回: 成功:OK; 失败:ERROR.
****************************************************/
deng()
{
FILE *fp;
int i,tag;
char pas[20],pass[20];
struct ffblk fblk;
textbackground(7); textcolor(1);
window(1,1,80,25); clrscr();
gotoxy(40,05); printf(" 用 户 登 录");
gotoxy(22, 8); printf("户名:");
gotoxy(22,10); printf("密码:");
textbackground(14);
for(i=0,tag=1;i<3&&tag;)
{ gotoxy(27, 8); cprintf(" ");
gotoxy(27,10); cprintf(" ");
gotoxy(27, 8); if(ggets(my,0,8) ==ESC)return ERROR;
gotoxy(27,10); if(ggets(pas,1,8)==ESC)return ERROR;
if(findfirst(my,&fblk,FA_DIREC))
{ gotoxy(30,14); printf("用户名不存在! ");
continue;
}
chdir(my);
fp=fopen("pass.pas","r");
if(fp)
{ fgets(pass,20,fp);
fclose(fp);
if(strcmp(pas,pass))
{ gotoxy(30,14); printf("用户名或密码错!");
i++;
continue;
}else
tag=0;
}else
tag=0;
chdir(dirr);
}
if(i<3)return OK;
gotoxy(30,14);
printf("登录失败! ");
exit(0);
}
/****************************************************
new :创建新用户
返回: 成功:OK; 失败:ERROR.
****************************************************/
new()
{char pas[20],pass[20];
int tag=0;
FILE *ffp;
struct ffblk fblk;
textbackground(0); textcolor(7);
window(1,1,80,25); clrscr();
gotoxy(40,05); printf("新 用 户 注 册");
gotoxy(22, 8); printf("机址:");
gotoxy(22,10); printf("密码:");
gotoxy(22,12); printf("确认:");
textbackground(1);
do { gotoxy(27, 8); cprintf(" ");
gotoxy(27,10); cprintf(" ");
gotoxy(27,12); cprintf(" ");
gotoxy(27, 8); if(ggets( my,0,8)==ESC)return ERROR;
gotoxy(27,10); if(ggets(pass,1,8)==ESC)return ERROR;
gotoxy(27,12); if(ggets( pas,1,8)==ESC)return ERROR;
if((!findfirst(my,&fblk,FA_DIREC))||strlen(my)>8||
strlen(pass)>8||strcmp(pass,pas)||mkdir(my) )
{ gotoxy(30,14);
if(!findfirst(my,&fblk,FA_DIREC))
printf("该用户名已经被使用!");
else if(strlen(my)>8)
printf("用户名太长! ");
else if(strlen(pass)>8)
printf("密码太长! ");
else if(strcmp(pass,pas))
printf("两次密码不符! ");
else if(mkdir(my))
printf("新用户注册失败! ");
continue;
}
tag=1;
chdir(my);
ffp=fopen("pass.pas","w");
if(!ffp)
{ gotoxy(30,14); printf("出现意外错! 确定");
getch();
}else
{ fputs(pass,ffp);
fclose(ffp);
}
chdir(dirr);
gotoxy(30,14); printf("用户注册成功! ");
getch();
} while(!tag);
return OK;
}
/************************************************
denglu:登录模块
************************************************/
denglu()
{char kee;
for(;;)
{
textbackground(0); textcolor(7);
window(1,1,80,25); clrscr();
gotoxy(25,05); printf("WELCOME!");
gotoxy(22, 8); printf("----1. 新用户注册-");
gotoxy(22,10); printf("----2. 登陆-------");
gotoxy(22,12); printf("----3. 取消-------");
gotoxy(22,15); printf(" 请选择:");
kee=getch();
switch(kee)
{ case '1': new(); break;
case '2': if(deng()==OK)
{ conkey=NO;
return OK;
}
else break;
case 27: clrscr();
case '3': exit(0);
}
}
}
/*************************************************************
fw :写信模块
you :发送机名
youfile :对应文件
str1 :信件内容
str :单位字符
w :频率
hc :转换编码,由赫夫曼树获得
strwork1:信件前导信息
strwork2:正式编码
返回: 成功:OK; 失败:ERROR.
*************************************************************/
int fw()
{ char you[10],*q,youfile[14],*p,*p1,str[100],str1[300],strwork1[400],strwork2[8000];
int x,y,w[100],n,i,k;
char hc[5000];
FILE *fp;
int j,*r,jimp_tag;
struct time t;
struct date d;
conkey=NO;
printf("\t\t ========== 写信 ==========\n");
printf("\n\n\t 接收机名:");
x=wherex(); y=wherey();
textbackground(1);
i=1;
do {
gotoxy(x,y);
cprintf(" ");
gotoxy(x,y);
if(ggets(you,0,8)==ESC)return OK;
if(chdir(you))
{ gotoxy(5,5);
printf(" 无此地址,无法发送 确定");
if(getch()==27)return OK;
gotoxy(5,5);
printf(" ");
}else i=0;
}while(i);
GO:
textbackground(1); textcolor(7);
window(1,2,80,25); clrscr();
printf("开始写信:");
if(ggets(str1,0,300-1)==ESC)return ERROR;
x=fenjie(str1,str,w,&n);
if(bioskey(1)==ESC)return ERROR;
if(x!=OK)return ERROR;
hufman(hc,w,n);
if(bioskey(1)==ESC)return ERROR;
p1=strwork2;
p1=ma(hc,str1,str,n,p1);
if(bioskey(1)==ESC)return ERROR;
jimp_tag=51;
gotoxy(1,24); printf(" 0.重新编辑 1.打包数据 2.数据编码 3.文本内容 4.发送 6.取消");
for(; jimp_tag;)
{
textbackground(1);textcolor(7);
window(1,5,80,23);clrscr();
switch(jimp_tag)
{ case '1': jimp_tag=shuju(strwork2,p1-strwork2); break;
case '2': jimp_tag=pinlu(str,w,n); break;
case '3': jimp_tag=text_t(str1); break;
/*ESC*/ case 27:
case '6': return ERROR;
case '0': goto GO;
/*CR */ case 13:
case '4':jimp_tag=0; /* 退出循环 */
}
}
p=strwork1;
p+=2;
itoc(p,strlen(str1));
p+=2;
itoc(p,n);
p+=2;
strcpy(p,my);
while(*p++);
j=n; r=w; q=str;
while(j--)
{ *p++=*q++;
itoc(p,*r++);
p+=2;
if((p-strwork1)>398)return ERROR;
}
gettime(&t);
getdate(&d);
p=youfile;
*p++=d.da_year-1937; /* 65-2002 */
*p++=d.da_mon+64; /* 1-65 */
*p++=d.da_day<11?d.da_day+47:d.da_day+54;/* 1~~10 48-1 65-11 */
*p++=t.ti_hour+65;
*p=65;
if(t.ti_min>19) (*p)++;
if(t.ti_min>39) (*p)++;
*++p=(t.ti_min%20)+65;
*++p=65;
if(t.ti_sec>19) (*p)++;
if(t.ti_sec>39) (*p)++;
*++p=(t.ti_sec%20)+65;
*++p='.';
*++p='t';
*++p='t';
*++p='t'; /* *.ttt */
*++p='\0';
fp=fopen(youfile,"wb+");
fwrite(strwork1,400,1,fp);
fwrite(strwork2,(p1-strwork2),1,fp);
k=ftell(fp)-400;
rewind(fp);
itoc(strwork1,k);
fwrite(strwork1,2,1,fp);
fseek(fp,k+400,0); fclose(fp);
printf("\n\r\t文件发送成功\n\t任意键返回\n\r\t");
getch();
return OK;
}
/*****************************************************
fenjie 分解信息 提取频率 str1----> str | w1
str1:信息文本
str :单位字母
w1 :对应频率(权)
n :单位数量
****************************************************/
int fenjie(char *str1,char *str,int *w1,int *n)
{
char *q;
int i,j;
for(i=0;i<100;i++) w1[i]=0;
j=0;
while(*str1)
{ q=strchr(str,*str1);
if(q) i=q-str;
else { i=j++;str[i]=*str1; }
w1[i]++; str1++;
}
w1[j++]++;
*n=j;
return OK;
}
/********************************************************
itoc 将整数变为字符
********************************************************/
void itoc(char *q,int n)
{ union {
int a;
char b[0];
}c;
c.a=n;
*q++=c.b[0];
*q=c.b[1];
}
/************************************************************
find :查信模块
tag=F2 新信; tag=F4 旧信.
新信 "*.ttt"; 旧信"*.tbb".
************************************************************/
int find(int tag) /* F2收信 F4查信 */
{
static int name_top=0,now=0;
int n,i,j,name_total,size,key;
char nam[13],filename[30][13]; /* ?? */
char *p;
char far *vsg=0xb8000000;
char far *vsgg;
FILE *fp;
union {
int a;
char b[2];
}c;
struct ffblk fblk;
struct DATEE {
int year,mon,day,hou,min,sec;
}DATEE;
struct DATEE dt;
vsg+=320;
conkey=NO;
chdir(my); /*??*/
name_total=0;
if(tag==F2)
n=findfirst("*.ttt",&fblk,23);
if(tag==F4)
n=findfirst("*.tbb",&fblk,23);
while(!n)
{ strcpy(filename[name_total++],fblk.ff_name);
n=findnext(&fblk);
}
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");
if(!name_total)
{
gotoxy(30,12);printf("没有信件\n\n\t\t\t 确定");
getch();
conkey=NO;
return OK;
}
/*-------------------------------
以下文件名的排序
-------------------------------*/
for(i=0;i<name_total-1;i++)
for(j=i+1;j<name_total;j++)
if(strcmp(filename[i],filename[j])>0)
{ strcpy(nam,filename[j]);
strcpy(filename[j],filename[i]);
strcpy(filename[i],nam);
}
/*-------------------------------
以下由文件名提取出保存日期
例:2002年4月2日 1:25:46
2002 -2002+'A' ='A';
4 -1+'A' ='D';
24: X>11?(X -11+'A'):(X -1+'0')='1';
/(31-1)='0'~'9' + 'A'~ /
/ 即 1~31=1+ 0~30 =1+ 0~9 + 'A'~ /
1 -1+'A' ='A';
25: 25<(20,39) 1+'A' ='B'; / 0~59=0~19 + 20~39 + 40~59 /
25%20+'A' ='E'; 'A' 'B' 'C'
46: 46<(40,59) 2+'A' ='C';
46%20+'A' ='F';
所得文件名:"AD1ABECF"
充分利用26个字母和10个数字
使文件名暗含当前时间
-------------------------------*/
GOTO_TO:
gotoxy(1,4);
printf("\n ---文件名--- ----来自---- -----日期----- --时间--");
vsgg=vsg+now*160 +1;
for(i=0;i<80;i++,vsgg++) *vsgg++=HIDD;
gotoxy(2,24); printf(" 信件数:%5d",name_total);
filename[name_total][0]='\0';
for(i=0;i<name_total;i++)
{ gotoxy(2,i+5);
p =filename[i];
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;
}
fp=fopen(filename[i],"r");
fseek(fp,6L,0);
fgets(nam,13,fp);
fclose(fp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -