⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 模拟邮箱系统.c

📁 模拟邮箱系统。要输入用户名和密码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*




*/


#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 + -