Matlab 从文件中输出莫尔斯电码
我的程序应该读取一个文本文件并以摩尔斯电码输出Matlab 从文件中输出莫尔斯电码,matlab,Matlab,我的程序应该读取一个文本文件并以摩尔斯电码输出 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function morse(filename) % MORSE converts text morse code and writes it to a file % Defining Characters & Numbers A = ['.-']; B = ['-...']; C = ['-.-.']
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function morse(filename)
% MORSE converts text morse code and writes it to a file
% Defining Characters & Numbers
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 = ['--..'];
period = ['.-.-.-'];
comma = ['--..--'];
question = ['..--..'];
slash_ = ['-..-.'];
n1 = ['.----'];
n2 = ['..---'];
n3 = ['...--'];
n4 = ['....-'];
n5 = ['.....'];
n6 = ['-....'];
n7 = ['--...'];
n8 = ['---..'];
n9 = ['----.'];
n0 = ['-----'];
text = upper(text);
vars ={'period','comma','question','slash_'};
morsecode=[];
for i=1:length(text)
if isvarname(text(i))
morsecode = [morsecode;eval(text(i))];
elseif ismember(text(i),'.,?/')
x = findstr(text(i),'.,?/');
morsecode = [morsecode;eval(vars{x})];
elseif ~isempty(str2num(text(i)))
morsecode = [morsecode;eval(['n' text(i)])];
elseif text(i)==' '
morsecode = [' '];
end
morsecode = [morsecode;eval(text(i))];
end
code = morsecode;
if exist('file','var')
fprintf(code, '%c')
end
您可以使用该函数开始。不过,你最好先做经期检查,否则你最终会替换已经使用摩尔斯电码的部分字母 例如:
testString = sttrep('ABCD','A','.-');
将导致
testString='.-BCD'
尽管有一个可怕的问题,但这是一个很好的项目,让我思考:如何以优雅的方式实现文本到莫尔斯的转换。这不可避免地导致我实现了以下功能(OP:从我的拙劣代码中学习)
imo最有趣的地方是使用and的一行代码(如果要调试每个步骤,请使用中间变量将代码拆分为多行)
text2morsefile.m:
函数text2morsefile(txt,文件名)
fid=fopen(文件名,'w');
fprintf(fid,text2morse(txt));
fclose(fid);
终止
函数m=text2morse(str)
m=cell2mat(arrayfun(@char2morse,str,'uni',false));
终止
函数m=char2morse(ch)
持久性莫尔斯图;
如果是空的(morsemap)
morsemap={'','-.-.-','.-.-.-'',NaN,'.-.-','.-.''.-','.-.'.-.'.-.'.-','.-.'.-.'.-.''.-.'.-.'.-.',。。。
",","男","男","男","男","男","男","男","男,。。。
'-----', '.----', '..---', '...--', '....-', '.....', '-....', '--...',...
"--…","--…","--…",,。。。
'.--.-.', '.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..',...
'.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...',...
“-”、“…-”、“…-”、“.-”、“-…-”、“-…-”、“-…”、“-…”,楠,楠,楠,“…-”;
终止
%为非莫尔斯字符指定字符:
丢失莫尔斯符号=“”;
ch=双(上(ch));
m=NaN;
如果ch>=32&&chOk-那么你的问题是什么?它做了什么你不期望的事情?你的输入文件是什么?这是eval
和isvarname
的一些讨厌的用法,你最好使用ascii值和单元格数组来存储莫尔斯电码或使用a,你的问题是,“你怎么可能写得更差?”开玩笑,但这里完全没有必要使用eval。冈瑟是对的。只是出于好奇:如果你几乎没有Matlab知识,为什么要用它来做这样的项目呢;将点和破折号作为声音播放会有那么困难吗?最初的问题是写一个文本文件(这也是OP的代码试图做到的)。将其作为声音播放只是一个额外选项,可以轻松地添加到char2morse
函数的末尾
function text2morsefile(txt,filename)
fid = fopen(filename,'w');
fprintf(fid,text2morse(txt));
fclose(fid);
end
function m = text2morse(str)
m=cell2mat(arrayfun(@char2morse,str,'uni',false));
end
function m = char2morse(ch)
persistent morsemap;
if isempty(morsemap)
morsemap ={' ','-.-.--', '.-..-.', NaN, '...-..-', NaN, '.-...', '.----.',...
'-.--.', '-.--.-', NaN, '.-.-.', '--..--', '-....-', '.-.-.-', '-..-.',...
'-----', '.----', '..---', '...--', '....-', '.....', '-....', '--...',...
'---..', '----.', '---...', '-.-.-.', NaN, '-...-', NaN, '..--..',...
'.--.-.', '.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..',...
'.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...',...
'-', '..-', '...-', '.--', '-..-', '-.--', '--..', NaN,NaN,NaN,NaN,'..--.-'};
end
% specify char for non-morse character:
missingmorse_symbol = '';
ch = double(upper(ch));
m = NaN;
if ch>=32 && ch<=95
m = morsemap{ch-31};
end
if isnan(m)
m = missingmorse_symbol;
else
% might add extra space between characters?
m = [m ' '];
end
end