Julia凯撒密码实现中未定义变量filtered_characters问题求助
解决凯撒密码代码中的
filtered_characters未定义问题 问题根源
你代码里的filtered_characters变量还没定义就直接拿去用了,这就是Julia报“未定义变量”错误的原因。这个变量本来应该指代你要加密的目标字符集合——也就是从document.txt读取并拆分后的输入字符。
修正步骤
1. 定义filtered_characters
根据需求,有两种常用的定义方式:
方式一:保留所有输入字符
如果你想保留输入里的所有内容(包括大写字母、符号这些不在letters里的字符),直接把拆分后的输入字符赋值给它就行:input_characters = string.(split(user_input, "")) filtered_characters = input_characters # 新增这行定义变量注意:这种情况下,如果输入包含
letters以外的字符,findfirst会返回nothing,后续的determine_new_index函数会报错,需要额外处理(比如跳过这些字符,或者默认映射到某个固定位置)。方式二:只保留有效字符
只保留letters里有的字符(空格+小写字母),先把输入转成小写,再过滤:user_input = lowercase(read(open("document.txt"), String)) # 统一转为小写 input_characters = string.(split(user_input, "")) filtered_characters = filter(c -> c in letters, input_characters) # 过滤出有效字符这种方式能避免后续出现
nothing导致的报错,更适合凯撒密码的基础实现。
2. 简化移位逻辑
原determine_new_index函数可以用模运算简化,不用写多分支判断:
function determine_new_index(x) new_idx = x + offset return mod(new_idx - 1, length(letters)) + 1 end
不管new_idx是超出字符集长度还是小于1,这个写法都能返回有效的索引。
完整修正后的代码
print("What offset would you like to shift by? ") offset = parse(Int64, readline()) # 定义包含空格和小写字母的字符集 letters = [" "] append!(letters, string.(collect('a':'z'))) # 读取输入文件并预处理 user_input = lowercase(read(open("document.txt"), String)) input_characters = string.(split(user_input, "")) # 定义filtered_characters:过滤出有效字符 filtered_characters = filter(c -> c in letters, input_characters) # 获取每个字符在letters中的索引 character_indices = map(x -> findfirst(y -> y == x, letters), filtered_characters) # 简化后的移位函数 function determine_new_index(x) new_idx = x + offset return mod(new_idx - 1, length(letters)) + 1 end # 计算新索引并生成加密字符 new_indices = determine_new_index.(character_indices) new_characters = map(x -> letters[x], new_indices) new_string = join(new_characters, "") # 写入加密文件 open("encrypted_document.txt", "w") do encrypted_file write(encrypted_file, new_string) end
额外思路
你尝试的circshift(letters, offset)是另一种更简洁的实现方式,直接移位字符集就行,不用计算索引:
shifted_letters = circshift(letters, -offset) # 直接映射字符:new_characters = map(c -> shifted_letters[findfirst(==(c), letters)], filtered_characters)
可以替换原有的索引计算逻辑试试。
内容的提问来源于stack exchange,提问作者NetGary0430
相关产品推荐
相关产品推荐

