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

📄 模拟邮箱系统.c

📁 模拟邮箱系统。要输入用户名和密码
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -