密码加密

功能描述:密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。接下来,我们要在密码之上再加一套密码,虽然简单但也安全。假设元子原来有一个BBS上的密码为zvbo941992,为了方便记忆,他通过一种算法把这个密码变换成YUANzi1992,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。他是这么变换的,大家都知道手机上的字母: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8, wxyz--9, 0--0,就这么简单,元子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,声明:密码中没有空格,而密码中出现的大写字母则变成对应的小写字母之后往后移一位,如:X,先边成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。

程序输入:输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾。

程序输出:正真的密文

先把代码打出来,功能差不多都能实现。

#include<iostream>
#include<string>
#include<fstream>
#include<stdlib.h>
using namespace std;
class password{
	string str;
    int len;
    int i;
    string k;
	public:
		void enter()
		{
		cout<<"请输入明文:"<<endl;
		cin>>str;//str为明文 
		len=str.length();//明文的长度 
		k=str;//把str赋值给k 
	    }
		void big()
		{
		for(i=0;i<len;i++){
	        if(str[i]>='A'&&str[i]<'Z')
		       k[i]+=33;//明文中字符串在A-Y之间的,把k变成小写字母再后移一个 
	        else if(str[i]=='Z')
	           k[i]='a';//如果明文中字符串为Z的话,那么k就变成a 
	        else 
	           continue;//然后继续循环,直到i=len ,退出循环 
        }
		}
        void small()
        { 
               for(i=0;i<len;i++){
               if(str[i]>='a'&&str[i]<='c')
               {
                   k[i]='2';
               }
               else if(str[i]>='d'&&str[i]<='f')
               {
                   k[i]='3';
               }
               else if(str[i]>='g'&&str[i]<='i')
               {
                   k[i]='4';
               }
               else if(str[i]>='j'&&str[i]<='l')
               {
                   k[i]='5';
               }
               else if(str[i]>='m'&&str[i]<='o')
               {
                   k[i]='6';
               }
               else if(str[i]>='p'&&str[i]<='s')
               {
                   k[i]='7';
               }
               else if(str[i]>='t'&&str[i]<='v')
               {
                   k[i]='8';
               }
               else if(str[i]>='w'&&str[i]<='z')
               {
                   k[i]='9';
               }//str--k(abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8, wxyz--9)明文变成密文 
               else
               continue;//然后继续循环,直到i=len ,退出循环  
           }}
        void jiami()
           {
           	if(k.length()!=0) 
           	{
           		small();
           		big();
           		cout<<"加密成功!"<<endl; 
			   }
			else//当k的长度为0时,说明k没有被赋值str,也就说明没有执行enter函数,没有输入明文 
			    cout<<"b:请先输入明文"<<endl; 
		   }
        void out()
           	{	
		    if(k.length()!=0)
			{
			    if(k==str){
			        cout<<"请先选择B进行加密"<<endl;
			    }
			    else{//k!=0时,说明k此时已经变成了密文,那么就可以输出密文k了 
           		    cout<<"输出结果为:"<<endl;
           		    cout<<k<<endl;
			    }}
			else//当k的长度为0时,说明k没有被赋值str,也就说明没有执行enter函数,没有输入明文 
			    cout<<"c:请先输入明文"<<endl; 
		   }   
		   void file()
		   {
		   	ofstream ofile;
		   	ofile.open("outfile.txt",ios::out);//打开文件 
		   	if(!ofile)
		   	{
		   		cerr<<"open file fail"<<endl;//文件打开失败 
		   		exit(1);//退出 
			   }
			else if(k.length()!=0){
				if(k==str){
			        cout<<"请先选择B进行加密"<<endl;
			    }
			    else{//k!=0时,说明k此时已经变成了密文,那么就可以保存密文k了 
				ofile<<k<<"  ";
				cout<<"文件保存成功!"<<endl;
			}
			ofile.close(); //关闭文件 
			}
			else{//当k的长度为0时,说明k没有被赋值str,也就说明没有执行enter函数,没有输入明文
			cout<<"d:请先输入明文"<<endl;
		   }}	   
};
int main()
{
    password a;
    char n;
	cout<<"A:输入明文 B:密码加密 C:输出密文  D:保存 E:退出 "<<endl; //理解当n为A,B,C,D,E时各代表的功能。 
	while(1){
	cout<<"请输入n值:"<<endl;
    cin>>n;// 输入n值 
    switch(n) {
    	case 'A':
		  a.enter();
		  continue;
		case 'B':
		  a.jiami(); 
		  continue;
		case 'C': 
		  a.out();
		  continue;
		case 'D':
		  a.file();
		  continue;
		case 'E':
		  cout<<"退出成功!"<<endl;
		  break; 
		default:
		  cout<<"输入格式错误!"<<endl;//如果输入好几个字符的话就会有好几次重复的话才能退出循坏。 
		  continue;  
}       
    break; //当用户选择退出时最终退出死循环 
}
	return 0;
}

但还是有几个缺点。

1,字符没有规定必须小于100。(不想输入100个字符,但你直接看代码你会发现就是没有设置字符小于100这个要求。)

2,明文加密一次不能再加密第二次,因为只要选择加密那一定会继续加密。如下图。

 3,有时候根本没看什么A,B,C,D,E代表的功能,上来直接就输明文,会发生什么呢?

 

 

 其实我到现在都还不太懂这个到底是怎么搞得。为什么有些是退出,有些却又可以重新输入n值呢?

现在来说一下我从这个课设里面所学到的吧。

1,len长度,char类型是实现不了的,只能用str。如果最开始str是char类型的,可以转化成string类型。

2,如下图所示。string类型在最开始定义过后就是一个空字符串,此时它的长度为0。

3,char类型。

 再想想了再发吧。拜拜啦!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值