[C++] Thuật toán mã hóa Caesar – code mẫu

Thuật toán mã hoá Caesar được coi là một trong những thuật toán đơn giản nhất và cổ điển nhất.  Để thực hiện thuật toán caesar c++, chúng ta có thể viết một hàm nhận vào một xâu và một bước dịch chuyển k, sau đó thực hiện phép mã hóa trên xâu để thu được xâu ký tự mới, sử dụng bảng mã ASCII để thực hiện việc thay thế.

Xem thêm:

1. Bài toán thuật toán mã hoá caesar c++

Bài 32 (TH-CSLT-04): Thuật toán mã hóa Caesar được thực hiện bằng cách thay thế một ký tự bằng 1 ký tự khác cách nó k bước trong bảng chữ cái để tạo thành ký tự mới. Hãy viết hàm nhận 1 xâu s và bước dịch chuyển k (k>1), sau đó thực hiện phép mã hóa trên để thu được xâu ký tự mới (trong bảng mã ASCII).Viết hàm gọi hàm mã hóa trên.

2. Ý tưởng thuật toán

  1. Xác định bảng mã ASCII và xác định vị trí của các ký tự cần mã hóa trong bảng.
  2. Thực hiện phép dịch chuyển k bước để mã hóa ký tự.
  3. Trả về xâu ký tự đã được mã hóa.

2.1 Quy luật mã ascii

– Bản chất kiểu dữ liệu ký tự trong c/c++ nó chính là kiểu dữ liệu số nguyên. 26 chữ cái của bảng ký tự từ ‘a’ đến ‘z’ sẽ tương ứng miền giá trị số nguyên là từ 97 đến 122. Với 97 là mã ascii của ký tự ‘a’, 98 là mã ascii của ký tự ‘b’, 99 là mã ascii của ký tự ‘c’ và cứ thế đến 122 là mã ascii của ký tự ‘z’,…

2.2 Thực hiện phép dịch chuyển k bước để mã hóa ký tự

– Quy luật để thực hiện hiện dịch chuyển k bước để mã hoá ký tự là từ vị trí ký tự hiện tại sẽ cộng lên k lần để lấy ra vị trí ký tự để thay thế tương ứng. Bảng mã ascii của các ký tự là từ 97 (ký tự ‘a’) đến 122 (ký tự ‘z’), cứ thế cộng lên k lần nếu k vượt quá 122 thì sẽ bắt đầu lại từ 97.

Công thức tổng quát cho quá trình mã hoá này là:

c[i] = (s[i] - 97 + k) % 26 + 97

Trong đó:

  • s[i] là mã ASCII của ký tự thứ i trong chuỗi ban đầu.
  • k là số nguyên dương thể hiện số bước dịch vị trong quá trình mã hoá.
  • c[i] là mã ASCII của ký tự tương ứng sau khi đã được mã hoá.

Giải thích công thức:

  • (s[i] - 97) là khoảng cách giữa mã ASCII của ký tự thứ i trong chuỗi ban đầu và mã ASCII của ký tự ‘a’ (mã ASCII của ký tự ‘a’ là 97).
  • + k là số bước dịch vị được áp dụng trong quá trình mã hoá.
  • % 26 là toán tử lấy phần dư khi chia cho 26, nghĩa là sau khi cộng với k, nếu kết quả vượt quá giới hạn 26 ký tự (từ ‘a’ đến ‘z’), ta sẽ lấy phần dư để quay lại vị trí đầu tiên của chuỗi.
  • + 97 là để đưa ký tự được mã hoá về mã ASCII tương ứng.

Ví dụ: Giả sử ta muốn mã hoá chuỗi “hello” với k = 3, ta sẽ thực hiện như sau:

  • với ký tự ‘h’, ta có mã ASCII là 104. Áp dụng công thức, ta có: (104 - 97 + 3) % 26 + 97 = 107, nghĩa là ký tự được mã hoá sẽ là ‘k’.
  • tương tự, ký tự ‘e’ sẽ được mã hoá thành ‘h’, ký tự ‘l’ sẽ được mã hoá thành ‘o’.
  • ký tự ‘l’ thứ hai được mã hoá thành ‘o’, và ký tự ‘o’ được mã hoá thành ‘r’.

3. Cài đặt chương trình

#include<iostream>
#include<string>
using namespace std;

string encode(string s, int k){

    string cipher;
    int n = s.length();
    for(int i=0;i<n;i++){
        if(s[i]>=65 && s[i]<=90){
            char new_char = ((s[i] - 65) + k) % 26 + 65;
            cipher +=new_char;
        }else if(s[i]>=97 && s[i]<=122){
            char new_char = ((s[i] - 97) + k) % 26 + 97;
            cipher +=new_char;
        }else{
            cipher+=s[i];
        }

    }


    return cipher;
}

int main(){
    int k;
    string s;
    cout<<" Nhap k(k>1): "; cin>>k;
    cin.ignore();
    cout<<" Nhap xau s: "; getline(cin,s);
    string cipher = encode(s,k);
    cout<<"Chuoi sau khi duoc ma hoa la: "<<cipher;
}

4. Kết quả

Thuật toán Caeser

Trên đây là đoạn mã đơn giản về thuật toán mã hoá caesar c++ . Cảm ơn các bạn đã theo dõi trên ttnguyen.net

Liên quan:

 

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em