|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void coding();//编码函数coding
void decoding();//解码函数decoding
int main()
{
int i,j;
do//循环操作
{
cout<<"请选择操作:\n"<<"1.编码 2.解码\n";
cin>>i;
if(i==1)
{
coding();cout<<"编码完成!\n";
}
else
{
decoding();cout<<"解码完成!\n";
}
cout<<"是否重新操作? 1.是 2.否\n";
cin>>j;
}
while(j!=2);
cout<<"任意键结束....";
getchar();
getchar();
return 0;
}
void coding()//编码函数开始
{
int coding_word_num,codingname_word_num;//编码字符串数目,解码字符串数目
int o1,o2,o3,i1,i2;//o1,o2,o3是存放单个字符的ascii码的变量,i1,i2是计数变量
i1=0;
i2=0;
string coding_word,codingname,codingname_word,temp;//用来存放字符串的对象
string after_c;
getchar();//将上次缓冲区的cr读入
cout<<"编码所用的字符串:\n";
getline(cin,coding_word);
cout<<"请输入编码文件名(例如“1.txt”):\n";
getline(cin,codingname);
ifstream file_to_coding(codingname,ios::in);
while(getline(file_to_coding,temp))//将要编码的源文件读入到codingname_word之中
{
codingname_word+=temp;//temp作为介质把单行字符串加到codingname_word之后从而读出整个文件内容
codingname_word+='\n';
}
file_to_coding.close();//关闭流文件
coding_word_num=coding_word.length();//该处是统计字符串长度的 作为循环处的判断条件
codingname_word_num=codingname_word.length();
cout<<"请命名编码后的文件名如(例如“2.txt”):\n";
getline(cin,after_c);
ofstream Tfile(after_c,ios::app);
while(i2!=codingname_word_num)//最重要的部分开始
{
for(i1;i1<coding_word_num;i1++,i2++)
{
o1=coding_word[i1];//将编码字符串的第i1个字符的ASCII码提出到o1
o2=codingname_word[i2];//将源文件字符串的第i2个字符的ASCII码提出到o2
if(o2==10)//如果地i2个ASCII码为10 即换行符 则原样输出
{
Tfile<<(char)o2;
}
else//****否则根据要求使用数学关系式o3=o1+o2-32进行编码
{
o3=o1+o2-32;
if(o3>126) o3=o3-95;//判断o3是否超过126 超过则-95使之从新回到32~126内
Tfile<<(char)o3;//输出o3(ASCII码)对应的字符
}
}
i1=0;//计数变量i1重置
}
Tfile.close();//关闭流文件
}
void decoding()//解码函数开始
{
int coding_word_num,decodingname_word_num;//编码字符串(也即密匙)的数目,解码源文件字符数目
string after_d;//解码后的文件名
int o1,o2,o3,i1,i2;//同coding函数的意义
i1=0;
i2=0;
string coding_word,decodingname,decodingname_word,temp;
getchar();//将上次缓冲区的cr读入
cout<<"请输入密匙:\n";
getline(cin,coding_word);
cout<<"请输入要解码的文件名(例如“1.txt”):\n";
getline(cin,decodingname);
ifstream file_to_decoding(decodingname,ios::in);
while(getline(file_to_decoding,temp))
{
decodingname_word+=temp;
decodingname_word+='\n';
}
file_to_decoding.close();
coding_word_num=coding_word.length();
decodingname_word_num=decodingname_word.length();
cout<<"请命名解码后的文件名:\n";
getline(cin,after_d);
ofstream Tfile(after_d,ios::app);
while(i2!=decodingname_word_num)
{
for(i1;i1<coding_word_num;i1++,i2++)
{
o1=coding_word[i1];
o3=decodingname_word[i2];
if(o3==10)
{
Tfile<<(char)o3;
}
else
{
o2=o3-o1+32;//该处与coding处不同的是 对于每一对o3和o1一定只能解出一个o2,有一个的值不在32~126范围中,这是因为coding函数中编码过程导致的移位。
if(o2<=126&&o2>=32)
{
Tfile<<(char)o2;
}
else
{
o2=o3-o1+127;
Tfile<<(char)o2;
}
}
}
i1=0;
}
Tfile.close();
}
老师布置的作业,拿出来大家讨论讨论 |
|