摩斯电码编码器c++实现

大佬来了,靠边站~~~

目录

1,产生历史

2,摩斯电码表

3,代码实现


1,产生历史

https://baike.baidu.com/item/%E6%91%A9%E5%B0%94%E6%96%AF%E7%94%B5%E7%A0%81/1527853

        摩斯电码是一种神奇的密码,它是一种信号的代码而且它时通时断,这样的信号代码经过不同的排列顺序从而表现出不同的英文字母、数字以及标点符号等。它的发明者是美国人艾尔菲德·维尔,那个时候他正在协助 SamuelMorse进行摩尔斯电报机的发明(1835年)。

        然而摩尔斯电码是由美国人摩尔斯在1837年被发明的,它的组成是由点dot(.)划dash(-)这两种符号所组成的。在这当中,一点作为一个基本的信号单位,一划的长度就相当于是3点的时间长度;在一个字母或是数字之内,每个点、划之间的间隔就应该是两点的时间长度;字母(数字)与字母(数字)之间的间隔就是7点的时间长度。摩尔斯码在早期的无线电上作用是非常大的,它是每个无线电通讯者所须必知的。因为通讯技术的不断进步,随后各国就在1999年停止了对摩尔斯码的使用,可是由于它所占的频宽最少,同时又具有一种技术及艺术的特性,所以在实际的生活当中就有着广泛的应用。 

        摩斯电码最早就是用一些表示数字的点和划来进行表示的。其中的数字对应单词,也就是需要查找一本代码表才可以得知每个词所对应的数字。用一个电键就能够敲击出点、划以及中间的停顿。然而电报是由摩斯所发明的,可是他并没有相关的专业技术。所以之后他就与艾尔菲德·维尔签订了一个协议,让他帮助自己制作摩斯电码然后制造出更加实用的设备。于是,艾尔菲德・维尔构思了一个方案,就是通过点、划和中间的停顿,把各个字元以及标点符号彼此独立地发送出去。之后他们就达成了一致,随后这种标识不同符号的方案就被放到摩斯的专利中去。然而这就是现在我们所熟知的美式摩尔斯电码,世界上第一条电报就是通过它来传送的。 

        用一种平稳而又时断时续的无线电信号能够传送这样的代码,一般会被称作是连续波,缩写就是CW。然而它可以是电报电线中的电子脉冲,同时也可以是一种机械的或是视觉的信号(如闪光)。在一般的情况下,随意的任何一种能把书面字元用可变长度的信号表示编码方式,都是能够称之为摩尔斯电码。可是如今这一术语只是用来特指两种表示英语字母以及符号的摩尔斯电码:

这种美式摩斯电码就在线电报通信系统中使用;今天还在使用的国际摩尔斯电码则仅仅是在使用点和划(去掉了停顿)。然而电报公司就会根据要发的信的长度收费。商业代码精心的设计出了五个字元组成一组的代码,把它作为一个单词发送。就比如,BYOXO; LIOUY;AYYU。摩斯电码能够单独发送这些五个字元的简语。人们在网络用语中一般也会说一些常用的摩斯商用代码。现今仍然在业余无线电中使用的就有Q简语以及Z简语:然而他们最初是为报务员之间交流电报编号、通信质量、频率变更等信息服务的。 

        在1838年1月8日,艾菲尔德·维尔曾经展示了一种使用点和划的电报码,其实这就是摩尔斯电码的前身。然而作为一种信息编码标准的摩斯电码,它拥有非常长的生命力,就这一点来说,就是其他编码所无法超越的。 

1848年,摩尔斯电码在 Friedrich Clemens Gerke的演变发明下,成为现代国际摩尔斯电码,并被正式用于德国的汉堡和库克斯哈文之间的电报通信。 

        1865年,摩尔斯电码经少量修改之后被国际电报大会在巴黎标准化。最终,国际电联将其统一定名为“国际摩尔斯电码”。  

        “注意,所有人注意,这是我们在永远沉寂之前最后的一声呐喊!”1997年,随着法国海军发送的最后这则消息,摩尔斯电码正式退出军用历史舞台。1999年,摩尔斯电码又从国际海事通讯系统的航海领域悄然退出。


2,摩斯电码表


3,代码实现

 menu()函数 : https://blog.csdn.net/weixin_45031801/article/details/126820338

 所有宏定义, key()函数 ,colour()函数, cls()函数, go()函数, hide()函数, print()函数 :https://blog.csdn.net/peta/article/details/132111004?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170048768116800188550705%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170048768116800188550705&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-132111004-null-null.nonecase&utm_term=c%2B%2B%E8%87%AA%E5%88%B6%E6%96%B0%E5%A4%B4%E6%96%87%E4%BB%B6&spm=1018.2226.3001.4450

getflag()函数 :https://blog.csdn.net/peta/article/details/132394634

show()函数 :https://blog.csdn.net/2202_76049826/article/details/128668921?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170152206916800186564369%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170152206916800186564369&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~baidu_landing_v2~default-1-128668921-null-null.nonecase&utm_term=c%2B%2B%E6%98%BE%E7%A4%BA%E5%85%89%E6%A0%87&spm=1018.2226.3001.4450

split()函数 :https://blog.csdn.net/u014682691/article/details/51993906?ops_request_misc=&request_id=&biz_id=102&utm_term=c++%E6%8B%86%E5%88%86%E5%87%BD%E6%95%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-9-51993906.142^v96^control&spm=1018.2226.3001.4187

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;

//按键 
#define up VK_UP //上键 
#define down VK_DOWN //下键 
#define return_ VK_RETURN //enter键和return键 

//颜色 
#define black 0 //黑色 
#define light_yellow 14 //淡黄色 
#define bright_white 15 //亮白色 

//字符集 
const string chars="abcdefghijklmnopqrstuvwxyz1234567890.,?:_/\')(;\"@";
const string chars2[48]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","1","2","3","4","5","6","7","8","9","0",".",",","?",":","_","/","\'",")","(",";","\"","@"};
//摩斯电码字符 
const string mosis[48]={
	".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--",//a~m
	"-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",//n~z
	"-----",".----","..---","...--","....-",".....","-....","--...","---..","----.",//1~9
	".-.-.-","--..--","..--..","---...","-....-","-..-.",".----.","-.--.-","-.--.",//·, ? : _ / ' ) (           
	"-.-.-.",".-..-.",".--.-.",//; " @
};
const string wr="........";//错号 
const string bt="-...-";//换行符 
const string ar=".-.-.";//结束 
const string as=".-...";//稍等 
const string sk="...-.-";//结束联络 
const string ka="-.-.-";//开始 
const string vvv="...-...-...-";//准备 
const string iii="......";//停顿号 

//功能函数 
bool Key(int i){
	return GetAsyncKeyState(i)&0x8000;
}
void colour(int in_from_of,int beind) {
	WORD wColor = ((beind & 0x0F) << 4) + (in_from_of & 0x0F);
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
	return;
}
void go(int col,int line){
	COORD p;
	p.X=col;
	p.Y=line;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), p);
	return;
}
void hide(){
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
	return;
}
void show(){
	HANDLE h_GAME =GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cursor_info;
	GetConsoleCursorInfo(h_GAME,&cursor_info);
	cursor_info.bVisible=true;
	SetConsoleCursorInfo(h_GAME,&cursor_info);
	return;
}
void print(string say,int sleeptime){
	int Len=say.length();
	for(int i=0;i<Len;i++){
		cout<<say[i];
		Sleep(sleeptime);
		}
	return;
	}
void split(string s, vector<string>& v, string c){
    string::size_type pos1, pos2;
    pos2 = s.find(c);
    pos1 = 0;
    while(pos2!=s.npos){
		v.push_back(s.substr(pos1, pos2-pos1));
    	pos1 = pos2 + c.size();
    	pos2 = s.find(c, pos1);
    }
	if(pos1 != s.length())
    v.push_back(s.substr(pos1));
	return;
}
void bianma(string&mosi,vector<pair<int,char> >&error,string yuanwen){
	int find;
	for(int i=0;i<yuanwen.size();i++){
		if(yuanwen[i]>'A'&&yuanwen[i]<'Z') yuanwen[i]+=('a'-'A');
		if(yuanwen[i]==' '){
			if(i<3||mosi[i-2]!='/')mosi.append("/");
			continue;
		}
		if(yuanwen[i]=='\n') mosi.append(sk);
		else if(yuanwen[i]=='<'){
			if(yuanwen.substr(i,4)=="<结束>")mosi.append(ar);
			else if(yuanwen.substr(i,4)=="<稍等>")mosi.append(as);
			else if(yuanwen.substr(i,4)=="<开始>")mosi.append(ka);
			else if(yuanwen.substr(i,4)=="<准备>")mosi.append(vvv);
			else if(yuanwen.substr(i,4)=="<停顿>")mosi.append(iii);
			else if(yuanwen.substr(i,6)=="<结束联络>"){
				mosi.append(sk);
				i+=2;
			}
			else {
				error.push_back(make_pair(i,yuanwen[i]));
				continue;
			}
			i+=3;
		}
		else{
			find=chars.find(yuanwen[i]);
			if(find==chars.npos){
				error.push_back(make_pair(i,yuanwen[i]));
				continue;
			}
			else mosi.append(mosis[find]);
		}
		mosi.append("/");
	}
	return;
}
void jiema(string&wen,vector<pair<int,string> >&error,string mosi){
	int len=mosi.find(wr),find;
	while(len!=mosi.npos){
		mosi.erase(len,9);
		if(len!=0){
			if(mosi.rfind("/",len)!=mosi.npos)mosi.erase(mosi.rfind("/",len),len-mosi.rfind("/",len));
			else mosi.erase(0,len);
		}
		len=mosi.find(wr);
	}
	vector<string> v;
	split(mosi,v,"/");
	for(int i=0;i<v.size();i++){
		if(v[i]=="")wen.append(" ");
		else if(v[i]==bt)wen.append("\n");
		else if(v[i]==ar)wen.append("<结束>");
		else if(v[i]==as)wen.append("<稍等>");
		else if(v[i]==sk)wen.append("<结束联络>");
		else if(v[i]==ka)wen.append("<开始>");
		else if(v[i]==vvv)wen.append("<准备>");
		else if(v[i]==iii)wen.append("<停顿>");
		else{
			len=0;
			for(;len<48;len++)
				if(mosis[len]==v[i])break;
			if(len!=48)wen.append(chars2[len]);
			else error.push_back(make_pair(i,v[i]));
		} 
	}
	return;
}
int getflag(){
	int in=1;
	while(1){
		system("cls");
		go(0,0);
		printf("****************************************\n");
		go(14,1);
		printf("摩斯电码编译器");
		if(in==1){
			go(15,5);
			printf(">1.编码<");
			go(16,7);
			printf("2.解码");
			go(16,9);
			printf("3.退出"); 
		}else if(in==2){
			go(16,5);
			printf("1.编码");
			go(15,7);
			printf(">2.解码<");
			go(16,9);
			printf("3.退出"); 
		}else if(in==3){
			go(16,5);
			printf("1.编码");
			go(16,7);
			printf("2.解码");
			go(15,9);
			printf(">3.退出<"); 
		}
		go(0,14);
		printf("↑↓键选择,Enter键确定");
		getch();
		if(Key(up)){
			in--;
			if(in==0){in=1;}
		}else if(Key(down)){
			in++;
			if(in==4){in=3;}
		}else if(Key(return_))
			return in;
		Sleep(100);
	}
	
}
//工作函数 
void MOSI(){
	int flag;
	string wenstring,wen,wenstring2;
	vector<pair<int,char> > error;
	vector<pair<int,string> > error2;
	while(1){
		flag=getflag();
		system("cls");
		error.clear();
		wenstring=wenstring2=wen="";
		go(0,0);
		switch(flag){ 
			case 1:
				print("请输入原文,以新的一行+@键再换行结束:\n",1);
				show();
				colour(light_yellow,black);
				while(1){
					getline(cin,wen);
					if(wen=="@")break;
					wenstring+=(wen+"\n");
				}
				hide();
				colour(bright_white,black);
				bianma(wenstring2,error,wenstring);
				if(!error.empty()){
					cout<<"错误字符:"<<endl;
					for(int i=0;i<error.size();i++)
						cout<<"	第" <<error[i].first<<"个字符: "<<error[i].second<<endl;
				}
				cout<<"结果:  "<<wenstring2<<endl;
				system("pause");
				break;
			
			case 2:
				print("请输入摩斯电码,一行:\n",1);
				show();
				colour(light_yellow,black);
				getline(cin,wenstring);
				hide();
				colour(bright_white,black);
				jiema(wenstring2,error2,wenstring);
				if(!error2.empty()){
					cout<<"错误编码:"<<endl;
					for(int i=0;i<error2.size();i++)
						cout<<"	第" <<error2[i].first<<"段: "<<error2[i].second<<endl;
				}
				cout<<"结果:  "<<wenstring2<<endl;
				system("pause");
				break;
			
			case 3:
				return;
		} 
	}
}
void menu(){
	colour(bright_white,black);
	hide();
	go(35,10);
	print("**********************************************",1);
	go(35,11);
    print("**********************************************",1);
    go(35,12);
    print("**********欢迎来到摩斯电码编码系统************",1);
    go(35,13);
    print("**********************************************",1);
    go(35,14);
	print("**********************************************",1);
    Sleep(1000);
    return;
}
void out(){
	system("cls");
	go(35,10);
    print("**********************************************",1);
    go(35,11);
    print("**********************************************",1);
    go(35,12);
    print("**************欢 迎 再 次 光 临***************",1);
    go(35,13);
    print("**********************************************",1);
    go(35,14);
	print("**********************************************",1);
	go(0,26);
	return;
}
//写这么多会不会卡死啊啊啊啊啊啊

//主函数
int main(){
	menu();
	MOSI();
	out();
	return 0;
}

 

  • 38
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值