边锋密码保护计算器

#include <stdio.h>
#include <conio.h>

 /*本程序是为边锋的密码保护用的计算器,第一行是两步结果,第二行是四步结果*/
 /*程序大部分是土著人(yujiezuo)做的,我只负责小部分程序及修改调试工作*/

 /*程序的精华部分在第二个子程序,就是void cryptogram(int *),这个是yujiezuo做的,
       当时我们分别用自己的算法,自己写程序,结果我的失败了:-(          */
 /*程序中有一个goto语句,是c#的大忌,如果看懂程序的话,很容易去掉的
        在main函数里完全可以去掉,这样程序运行一次只能计算一次
 */

/*这个程序最主要的是程序的健壮性,我们在这上面花了不少心血,程序运行后不管你输入什么非法字符,都会有相应的语句,还支持退格*/
 /*progammed by yujiezuo&GW                                                ----GW*/


void thenumber(int g[])                  /*取20位基数,输入20位后自动弹出,无需敲回车*/
{
       int i,c,lenth,y;
       char pr[30]="/nplease input the number:";
       lenth=strlen(pr);
       for(i=0;i<20;i++)g[i]=0;
       printf(pr);
       for(i=0;i<20;i++)
         {
           c=getche();
    if(c==8)
             {
               i-=2;
               printf(" /b");
               if(i<-1)
                 {
                   printf(":");
                   i++;}
               continue;
             }
     g[i]=(c-48);
            if(g[i]>10 || g[i]<0)
             {
               printf("/a");
               if(g[i]==-35)     /*对回车的抵御*/
                {
                  y=wherey();
                  gotoxy(lenth+i,y);
                }
               else printf("/b /b"); /*其余非法字符*/
              i--;
              continue;
                
                
       
             }
         }
 }
                                         

void cryptogram(int g[])             /*取得密码,密码会被*覆盖,程序的精华呀*/
{                                   
  int i,c,k=0,h[20];                 /*k是计数器,花了好长时间才调试出来的*/
  for(i=0;i<20;i++){g[i]=0;h[i]=0;}
  printf("/nplease input your cryptogram:");
  for(i=0;i<20;i++)
    {
      c=getche();
      k++;
      if(c==8)                       /*对退格键的处理*/
        {
         i-=2;
  printf(" /b");
         if(i<-1)                    /*如果还没敲数字就退格就会发生错误,这是对这种情况的处理*/
           {
            printf(":");
            k++;
            i++;
           }
         k-=2;
         continue;
        }
       if(c==13){k=k-1;break;}      /*回车,输入完毕*/
       if(c>58 || c<48)             /*对非数字的处理*/
         {
          k--;
          i--;
          printf("/b /b");
          continue;
         }  
       g[i]=c-48;
       printf("/b*");             /*这个就是用*覆盖密码*/
     }
  for(i=(20-k);i<20;i++)h[i]=g[i+k-20];
  for(i=0;i<20;i++)g[i]=h[i];                  /*总之程序的健壮性是非常好的*/
}                                          


void twoadd(int g[],int h[])         /*(因为20位数太长了,只能放在数组里了),是两个20位数组相加,结果放在第一个数组里*/
{
  int y[21],i;                        /*y[]是进位存储器*/
  y[20]=0;
  for(i=19;i>=0;i--)
    {
     g[i]=g[i]+h[i]+y[i+1];
     y[i]=g[i]/10;
     g[i]%=10;
    }
}

void tenadd(int g[],int h[])        /*两个10位数组相加*/
{
  int z[11],i;                         /*z[]是进位存储器*/
  z[10]=0;
  for(i=9;i>=0;i--)
    {
     g[i]=g[i]+h[i]+z[i+1];
     z[i]=g[i]/10;
     g[i]%=10;
    }
}

void newone(int g[],int h[])         /*生成新的20位数组*/
{
  int i;
  for(i=0;i<20;i++)
   {
    if(!g[i])
     g[i]=10;
    g[i]=h[g[i]-1];
   }
}


void main()
{
  int i,l,a,b;
  int m[20],n[20],x[10],y[10];
next:
  for(i=0;i<20;i++)
    {
     m[i]=0;
     n[i]=0;
    }
  for(i=0;i<10;i++)
    {
     x[i]=0;
     y[i]=0;
    }
  thenumber(m);
  printf("/n/n");
  cryptogram(n);
  twoadd(m,n);
  for(i=0;i<10;i++)
    {
     x[i]=m[i];
     y[i]=m[i+10];
    }
  tenadd(x,y);
  printf("/n/n/n");
  for(i=0;i<10;i++)
    printf("%d",x[i]);
  printf("/n/n/n");
  newone(m,x);
  for(i=0;i<10;i++)
    {
     x[i]=m[i];
     y[i]=m[i+10];
    }
  tenadd(x,y);
  printf("/n/n");
  for(i=0;i<10;i++)
    printf("%d",x[i]);
  printf("/n/n/n");
  printf("press any two same keys to exit/nor press Esc to exit/npress Enter to continue/n");
  a=getche();
  if(a==27)exit();
  if(a==13)goto next;
  b=getche();
  if(a-b)goto next;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值