8周字符串加密

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /*  
  2. * Copyright (c)2016,烟台大学计算机与控制工程学院  
  3. * All rights reserved.  
  4. * 文件名称:项目4.cpp  
  5. * 作    者:泮春宇 
  6. * 完成日期:2016年11月10日  
  7. * 版 本 号:v1.0   
  8. *问题描述:一个文本串可用事先编制好的字符映射表进行加密。例如,设字符映射表为:  
  9.             
  10.           abcdefghijklmnopqrstuvwxyz  
  11.           ngzqtcobmuhelkpdawxfyivrsj  
  12.   
  13.    则字符串“lao he jiao shu ju jie gou”被加密为“enp bt umnp xby uy umt opy”。   
  14.    设计一个程序,实现加密、解密算法,将输入的文本进行加密后输出,然后进行解密并输出。  
  15. *输入描述:无  
  16. *程序输出:测试数据  
  17. */  



头文件sqString.h代码:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #define MaxSize 100             //最多的字符个数  
  3. typedef struct  
  4. {   char data[MaxSize];         //定义可容纳MaxSize个字符的空间  
  5.     int length;                 //标记当前实际串长  
  6. } SqString;  
  7.   
  8. void StrAssign(SqString &s,char cstr[]);    //字符串常量cstr赋给串s  
  9. void StrCopy(SqString &s,SqString t);   //串t复制给串s  
  10. bool StrEqual(SqString s,SqString t); //判串相等  
  11. int StrLength(SqString s);  //求串长  
  12. SqString Concat(SqString s,SqString t);  //串连接  
  13. SqString SubStr(SqString s,int i,int j); //求子串  
  14. SqString InsStr(SqString s1,int i,SqString s2); //串插入  
  15. SqString DelStr(SqString s,int i,int j) ;   //串删去  
  16. SqString RepStr(SqString s,int i,int j,SqString t);     //串替换  
  17. void DispStr(SqString s);   //输出串  


 

源文件sqString.cpp代码:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "sqString.h"  
  2. void StrAssign(SqString &s,char cstr[])//字符串常量cstr赋给串s  
  3. {  
  4.     int i;  
  5.     for(i=0;cstr[i]!='\0';i++)  
  6.           s.data[i]=cstr[i];  
  7.     s.length=i;  
  8. }   
  9.   
  10. void StrCopy(SqString &s,SqString t)  //串t复制给串s  
  11. {  
  12.     int i;  
  13.     for(i=0;i<t.length;i++)  
  14.         s.data[i]=t.data[i];  
  15.     s.length=t.length;  
  16. }  
  17. bool StrEqual(SqString s,SqString t) //判串相等  
  18. {  
  19.     bool same=true;  
  20.     int i;  
  21.     if(s.length!=t.length)  
  22.         same=false;  
  23.     else      
  24.         for(i=0;i<s.length;i++)    
  25.             if(s.data[i]!=t.data[i])  
  26.             {  
  27.                 same=false;  
  28.                 break;  
  29.             }  
  30.     return same;  
  31. }  
  32. int StrLength(SqString s) //求串长  
  33. {  
  34.     return (s.length);  
  35. }  
  36. SqString Concat(SqString s,SqString t) //串连接  
  37. {  
  38.     SqString str;  
  39.     int i;  
  40.     for(i=0;i<s.length;i++)  
  41.         str.data[i]=s.data[i];  
  42.     for(i=0;i<t.length;i++)  
  43.         str.data[i+s.length]=t.data[i];  
  44.     str.length=s.length+t.length;  
  45.     return str;  
  46. }  
  47. SqString SubStr(SqString s,int i,int j) //求子串   (1<=i<=StrLength(s))  
  48. {  
  49.     SqString str;  
  50.     int k;  
  51.     str.length=0;  //是为了当参数不合适的话返回空串  
  52.     if(i<=0||i>s.length||j<0||i+j-1>s.length)    
  53.         return str;            //i和j 都不在范围之内,参数不正确时返回空串  
  54.     for(k=i-1;k<i+j-1;k++)  
  55.         str.data[k-i+1]=s.data[k];  
  56.     str.length=j;  
  57.     return str;  
  58. }  
  59. SqString InsStr(SqString s1,int i,SqString s2) //串插入 (1<=i<=StrLength(s1)+1)  
  60. {  
  61.     SqString str;  
  62.     int j;  
  63.     str.length=0; //是为了当参数不合适的话返回空串  
  64.     if(i<=0||i>s1.length+1)  //对比上一个,之所以要加上1,是因为如果只是s1.length是正确的,可以在后面添加s2,但如果是加上1,则超出范围。  
  65.         return str;  
  66.     for(j=0;j<i-1;j++)  
  67.         str.data[j]=s1.data[j];  
  68.     for(j=0;j<s2.length;j++)  
  69.         str.data[i-1+j]=s2.data[j];  
  70.     for(j=i-1;j<s1.length;j++)  
  71.         str.data[j+s2.length]=s1.data [j];  
  72.     str.length=s1.length +s2.length ;//别忘记 串的长度  
  73.     return str;  
  74. }  
  75. SqString DelStr(SqString s,int i,int j)    //串删去  
  76. {  
  77.     SqString str;  
  78.     str.length=0;  
  79.     if(i<=0||i>s.length||i+j>s.length+1)   //参数不正确时返回空串     
  80.         return str;    
  81.     int k;  
  82.     for(k=0;k<i-1;k++)  
  83.         str.data[k]=s.data[k];  
  84.     for(k=i+j-1;k<s.length;k++)  
  85.         str.data[k-j]=s.data[k];  
  86.     str.length=s.length-j;  
  87.     return str;  
  88. }  
  89. SqString RepStr(SqString s,int i,int j,SqString t)     //串替换  
  90. {  
  91.     SqString str;  
  92.     str.length=0;  
  93.     if(i<=0||i>s.length||i+j-1>s.length)   //参数不正确是返回空串  
  94.         return str;    
  95.     int k;  
  96.     for(k=0;k<i-1;k++)  
  97.         str.data[k]=s.data[k];  
  98.     for(k=0;k<t.length;k++)  
  99.         str.data[k+i-1]=t.data[k];  
  100.     for(k=i+j-1;k<s.length;k++)  
  101.         str.data[t.length+k-j]=s.data[k];  
  102.     str.length=s.length+t.length-j;  
  103.     return str;  
  104. }  
  105. void DispStr(SqString s)   //输出串  
  106. {  
  107.     int i;  
  108.     if(s.length>0)  
  109.     {  
  110.         for(i=0;i<s.length;i++)  
  111.             printf("%c",s.data[i]);  
  112.         printf("\n");  
  113.     }  
  114. }  


 

源文件main.cpp代码:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include "sqString.h"  
  3. SqString A,B; //用于存储字符映射表  
  4.   
  5. SqString EnCrypt(SqString p)  
  6. {  
  7.     int i=0,j;  
  8.     SqString q;  
  9.     while (i<p.length)  
  10.     {  
  11.         for (j=0; p.data[i]!=A.data[j]&&j<A.length; j++);  
  12.         if (j>=A.length)            //在A串中未找到p.data[i]字母  
  13.             q.data[i]=p.data[i];  
  14.         else                        //在A串中找到p.data[i]字母  
  15.             q.data[i]=B.data[j];  
  16.         i++;  
  17.     }  
  18.     q.length=p.length;  
  19.     return q;  
  20. }  
  21.   
  22. SqString UnEncrypt(SqString q)  
  23. {  
  24.     int i=0,j;  
  25.     SqString p;  
  26.     while (i<q.length)  
  27.     {  
  28.         for (j=0; q.data[i]!=B.data[j]&&j<B.length; j++);  
  29.         if (j>=B.length)            //在B串中未找到q.data[i]字母  
  30.             p.data[i]=q.data[i];  
  31.         else                    //在B串中找到q.data[i]字母  
  32.             p.data[i]=A.data[j];  
  33.         i++;  
  34.     }  
  35.     p.length=q.length;  
  36.     return p;  
  37. }  
  38.   
  39. int main()  
  40. {  
  41.     SqString p,q;  
  42.     StrAssign(A,"abcdefghijklmnopqrstuvwxyz");  //建立A串  
  43.     StrAssign(B,"ngzqtcobmuhelkpdawxfyivrsj");  //建立B串  
  44.     char str[MaxSize];  
  45.     printf("输入原文串:");  
  46.     gets(str);                                  //获取用户输入的原文串  
  47.     StrAssign(p,str);                           //建立p串  
  48.     printf("加密解密如下:\n");  
  49.     printf("  原文串:");  
  50.     DispStr(p);  
  51.     q=EnCrypt(p);                               //p串加密产生q串  
  52.     printf("  加密串:");  
  53.     DispStr(q);  
  54.     p=UnEncrypt(q);                         //q串解密产生p串  
  55.     printf("  解密串:");  
  56.     DispStr(p);  
  57.     printf("\n");  
  58.     return 0;  
  59. }  

运行结果:


知识点总结:运用了串的思想去解决问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值