功能描述:密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。接下来,我们要在密码之上再加一套密码,虽然简单但也安全。假设元子原来有一个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类型。
再想想了再发吧。拜拜啦!