Chuyển đổi xâu dựa trên mật mã Caesar nhưng bị sai key

Em đang viết thử 1 chương trình chuyển đổi dãy chữ vô nghĩa thành có nghĩa và ngược lại dựa trên mật mã Ceasar.

Em đang viết phần chuyển đổi mà không cần biết khóa, tức là thử từng trường hợp 1 và in ra một loạt kết quả nhưng khi chạy vòng lặp thì dù số vòng lặp đủ tất cả trường hợp nhưng giá trị key trong những phần nhỏ hơn lại không tăng lên. Mọi người xem và giúp em với ạ.

Code của em:

#%%
def pg():
    alp = 'abcdefghijklmnopqrstuvwxyz'
    c = str(input("Nhap ma: "))
    i = 0
    ans = str()
    key = 0
    while key < len(alp):
        while i < len(c):
            if c[i] != ' ':
                k= alp.index(c[i])
                h= k+key
                if h >= len(alp):
                    h = h - len(alp)
                ans = ans + alp[h]
                i = i + 1
            else:
                ans = ans + ' '
                i = i + 1
        key = key + 1
        print(ans)     

Kết quả thực thi

1 Like

Bạn biết chuyện gì không? Kết thúc vòng lặp con, bạn không reset lại i = 0ans = '' nên sau khi chạy lần 1, i luôn không bé hơn len(c)ans sẽ là 1 mớ hỗn độn nữa do không reset (đề nghị bạn dùng list để lưu riêng rồi reset ans)

Góp ý:

  • Tên biến, tên hàm nên đặt rõ ràng, nếu bạn không giỏi tiếng anh thì đặt tiếng Việt vì “pg” là gì? Còn “i”, “c”, “h”, “k”? Chúng nó có nhiệm vụ gì? Khó lòng người khác hiểu code của bạn lắm. Đặt tên ngắn không hay bằng đặt tên dễ hiểu đâu bạn :smiley:
  • Làm sao để debug lỗi run-time? Dễ nhất là đặt các hàm hiển thị các biến, coi nó chứa gì và sau thao tác nào đó (mà mình nghi ngờ) thì nó ra kết quả như thế nào :smiley:
  • Nên dùng for thay cho while trong trường hợp này vì nó dễ sử dụng và tránh gặp trường hợp này, mẫu:
for key in range(len(alp)):
    for i in range(len(c)):
        if c[i] != ' ':
            k= alp.index(c[i])
            h= k+key
            if h >= len(alp):
                h = h - len(alp)
            ans = ans + alp[h]
        else:
            ans = ans + ' '
    print(ans)
    ans = ''
3 Likes

Encode with k

full_ascii_char = ['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']
data = data.upper().split()
data = ''.join(data)
# lượng bỏ những cái space
encoded = []
for i in range(len(data)):
    try:
	    index_append = full_ascii_char.index(data[i])+k
	    if index_append > 25: index_append %= 26
	    encoded.append(full_ascii_char[index_append])
    except ValueError:
	    return 'ValueError. Your data contains invalid alphabet. \'{}\' given'.format(data[i])
return ' '.join(encoded)

Decode for k in 1 to 26

        data = data.upper().split()
		data = ''.join(data)
		decoded = []
		for i in range(1, len(full_ascii_char) + 1):
			decoded.append([])
			for j in range(len(data)):
				try:
					decoded[i-1].append(full_ascii_char[full_ascii_char.index(data[j]) - i])
				except ValueError:
					return 'ValueError. Your data contains invalid alphabet. \'{}\' given'.format(data[j])
		for i in range(len(decoded)):
			k = i + 1
			if k < 10: k = '0' + str(k) # dòng này format cho đẹp thôi 09, 08
			print(' With k = {} your decode data is {}'.format(k, ''.join(decoded[i])))

Mình cũng từng chán chán làm mấy cái này

1 Like

@graktung
Mình mới học Python dạo gần đây thôi nên còn yếu lắm, chỉ có thể dùng những câu lệnh cơ bản :sweat_smile:
Đúng là rảnh rỗi làm thử mấy cái này.
Cái của bạn chắc phải học sâu thêm mình mới hiểu rõ :smile:. Cảm ơn đã chia sẻ!

@aliston
Chân thành cảm ơn bạn rất nhiều. Bạn không chỉ ra mình cũng không biết sai chỗ nào :joy:. Mình sẽ ghi nhớ góp ý của bạn về cách đặt tên. Thật ra cái này rảnh ngồi làm thử nên mới đặt ngắn gọn dễ chạy thử nhưng mà từ giờ sẽ đặt tên rõ ràng để tạo thói quen tốt. Cảm ơn bạn.

cái của mình không có gì đặc biệt ngoài chạy vòng for rồi lấy item từ index ra cả :smile: mình viết cái đó cũng lâu rồi. Hỗi nãy thấy quen quen mới mò lại paste lên chứ giờ đọc lại cũng thấy chuối :smile:

Không sao đâu, mấy cái đó từ từ bạn gặp và sau này dùng rất nhiều, nên làm quen từ bây giờ là vừa rồi :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?