You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:24:51