第八周项目4-字符串加密

来源:互联网 发布:我的滑板鞋 知乎 编辑:程序博客网 时间:2024/06/18 14:18

/*  
 * Copyright (c) 2016, 烟台大学计算机与控制工程学院  
 * All rights reserved。  
 * 文件名称 :1.cpp  
 * 作    者 :杨俊杰 
 * 完成日期 :2016年 11月3日  
 * 版 本 号 :v1.0  
 * 问题描述 :
 * 输入描述 : lao he jiao shu ju jie gou
 * 输出描述 : enp bt  umnp xby uy umt opy
 */  

 

 

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #define SqString_H_INCLUDED  
  4. #define MaxSize 100             //最多的字符个数  
  5. typedef struct  
  6. {   char data[MaxSize];         //定义可容纳MaxSize个字符的空间  
  7.     int length;                 //标记当前实际串长  
  8. } SqString;  
  9. void StrAssign(SqString &s,char cstr[]);    //字符串常量cstr赋给串s  
  10. void StrCopy(SqString &s,SqString t);   //串t复制给串s  
  11. bool StrEqual(SqString s,SqString t); //判串相等  
  12. int StrLength(SqString s);  //求串长  
  13. SqString Concat(SqString s,SqString t);  //串连接  
  14. SqString SubStr(SqString s,int i,int j); //求子串  
  15. SqString InsStr(SqString s1,int i,SqString s2); //串插入  
  16. SqString DelStr(SqString s,int i,int j) ;   //串删去  
  17. SqString RepStr(SqString s,int i,int j,SqString t);     //串替换  
  18. void DispStr(SqString s);   //输出串  
  19. SqString A,B; //用于存储字符映射表  
  20. void StrAssign(SqString &s,char cstr[]) //s为引用型参数  
  21. {   int i;  
  22.     for (i=0;cstr[i]!='\0';i++)  
  23.         s.data[i]=cstr[i];  
  24.     s.length=i;  
  25. }  
  26. void StrCopy(SqString &s,SqString t)    //s为引用型参数  
  27. {   int i;  
  28.     for (i=0;i<t.length;i++)  
  29.         s.data[i]=t.data[i];  
  30.     s.length=t.length;  
  31. }  
  32. bool StrEqual(SqString s,SqString t)  
  33. {   bool same=true;  
  34.     int i;  
  35.     if (s.length!=t.length)             //长度不相等时返回0  
  36.         same=false;  
  37.     else  
  38.         for (i=0;i<s.length;i++)  
  39.             if (s.data[i]!=t.data[i])   //有一个对应字符不相同时返回0  
  40.             {   same=false;  
  41.                 break;  
  42.             }  
  43.     return same;  
  44. }  
  45. int StrLength(SqString s)  
  46. {  
  47.     return s.length;  
  48. }  
  49. SqString Concat(SqString s,SqString t)  
  50. {   SqString str;  
  51.     int i;  
  52.     str.length=s.length+t.length;  
  53.     for (i=0;i<s.length;i++)    //将s.data[0..s.length-1]复制到str  
  54.         str.data[i]=s.data[i];  
  55.     for (i=0;i<t.length;i++)    //将t.data[0..t.length-1]复制到str  
  56.         str.data[s.length+i]=t.data[i];  
  57.     return str;  
  58. }  
  59. SqString SubStr(SqString s,int i,int j)  
  60. {   SqString str;  
  61.     int k;  
  62.     str.length=0;  
  63.     if (i<=0 || i>s.length || j<0 || i+j-1>s.length)  
  64.         return str;                 //参数不正确时返回空串  
  65.     for (k=i-1;k<i+j-1;k++)         //将s.data[i..i+j]复制到str  
  66.         str.data[k-i+1]=s.data[k];  
  67.     str.length=j;  
  68.     return str;  
  69. }  
  70. SqString InsStr(SqString s1,int i,SqString s2)  
  71. {   int j;  
  72.     SqString str;  
  73.     str.length=0;  
  74.     if (i<=0 || i>s1.length+1)  //参数不正确时返回空串  
  75.         return str;  
  76.     for (j=0;j<i-1;j++)             //将s1.data[0..i-2]复制到str  
  77.         str.data[j]=s1.data[j];  
  78.     for (j=0;j<s2.length;j++)       //将s2.data[0..s2.length-1]复制到str  
  79.         str.data[i+j-1]=s2.data[j];  
  80.     for (j=i-1;j<s1.length;j++)     //将s1.data[i-1..s1.length-1]复制到str  
  81.         str.data[s2.length+j]=s1.data[j];  
  82.     str.length=s1.length+s2.length;  
  83.     return str;  
  84. }  
  85. SqString DelStr(SqString s,int i,int j)  
  86. {   int k;  
  87.     SqString str;  
  88.     str.length=0;  
  89.     if (i<=0 || i>s.length || i+j>s.length+1) //参数不正确时返回空串  
  90.         return str;  
  91.     for (k=0;k<i-1;k++)             //将s.data[0..i-2]复制到str  
  92.         str.data[k]=s.data[k];  
  93.     for (k=i+j-1;k<s.length;k++)    //将s.data[i+j-1..s.length-1]复制到str  
  94.         str.data[k-j]=s.data[k];  
  95.     str.length=s.length-j;  
  96.     return str;  
  97. }  
  98. SqString RepStr(SqString s,int i,int j,SqString t)  
  99. {   int k;  
  100.     SqString str;  
  101.     str.length=0;  
  102.     if (i<=0 || i>s.length || i+j-1>s.length) //参数不正确时返回空串  
  103.         return str;  
  104.     for (k=0;k<i-1;k++)             //将s.data[0..i-2]复制到str  
  105.         str.data[k]=s.data[k];  
  106.     for (k=0;k<t.length;k++)        //将t.data[0..t.length-1]复制到str  
  107.         str.data[i+k-1]=t.data[k];  
  108.     for (k=i+j-1;k<s.length;k++)    //将s.data[i+j-1..s.length-1]复制到str  
  109.         str.data[t.length+k-j]=s.data[k];  
  110.     str.length=s.length-j+t.length;  
  111.     return str;  
  112. }  
  113. void DispStr(SqString s)  
  114. {   int i;  
  115.     if (s.length>0)  
  116.     {   for (i=0;i<s.length;i++)  
  117.             printf("%c",s.data[i]);  
  118.         printf("\n");  
  119.     }  
  120. }  
  121.   
  122. SqString EnCrypt(SqString p)  
  123. {  
  124.     int i=0,j;  
  125.     SqString q;  
  126.     while (i<p.length)  
  127.     {  
  128.         for (j=0; p.data[i]!=A.data[j]; j++);  
  129.         if (j>=p.length)            //在A串中未找到p.data[i]字母  
  130.             q.data[i]=p.data[i];  
  131.         else                        //在A串中找到p.data[i]字母  
  132.             q.data[i]=B.data[j];  
  133.         i++;  
  134.     }  
  135.     q.length=p.length;  
  136.     return q;  
  137. }  
  138.   
  139. SqString UnEncrypt(SqString q)  
  140. {  
  141.     int i=0,j;  
  142.     SqString p;  
  143.     while (i<q.length)  
  144.     {  
  145.         for (j=0; q.data[i]!=B.data[j]; j++);  
  146.         if (j>=q.length)            //在B串中未找到q.data[i]字母  
  147.             p.data[i]=q.data[i];  
  148.         else                    //在B串中找到q.data[i]字母  
  149.             p.data[i]=A.data[j];  
  150.         i++;  
  151.     }  
  152.     p.length=q.length;  
  153.     return p;  
  154. }  
  155.   
  156. int main()  
  157. {  
  158.     SqString p,q;  
  159.     StrAssign(A,"abcdefghijklmnopqrstuvwxyz");  //建立A串  
  160.     StrAssign(B,"ngzqtcobmuhelkpdawxfyivrsj");  //建立B串  
  161.     char str[MaxSize];  
  162.     printf("\n");  
  163.     printf("输入原文串:");  
  164.     gets(str);                                  //获取用户输入的原文串  
  165.     StrAssign(p,str);                           //建立p串  
  166.     printf("加密解密如下:\n");  
  167.     printf("  原文串:");  
  168.     DispStr(p);  
  169.     q=EnCrypt(p);                               //p串加密产生q串  
  170.     printf("  加密串:");  
  171.     DispStr(q);  
  172.     p=UnEncrypt(q);                         //q串解密产生p串  
  173.     printf("  解密串:");  
  174.     DispStr(p);  
  175.     printf("\n");  
  176.     return 0;  
  177. }  


运行结果:

0 0
原创粉丝点击