# data[].attributes.body
Input: Một chuỗi ký tự (văn bản) cần mã hóa.

Output: Chuỗi đã được mã hóa (hoặc giải mã).

1. Trình bày thuật toán

Mật mã Caesar (mã hóa dịch vòng):

Dịch từng ký tự trong chuỗi theo một số bước nhất định (gọi là khóa).

Ví dụ: Với khóa = 3, chữ cái ‘A’ sẽ thành ‘D’, ‘B’ thành ‘E’, v.v...

Để giải mã, chỉ cần dịch ngược lại.

# data[].attributes.body
Nguyễn Hữu Hiệp

Trường Công Minh Hải

Phạm Bảo Hân

Huỳnh Ngọc Huy

Đặng Thái Nguyên

# data[].attributes.body
I.Tìm kiếm chuỗi ()

II. Đổi sánh mẫu ()

III.Sắp xếp bằng trộn ()

IV.Nén tập tin ()

V.Mật mã ()

# data[].attributes.body
Input: Một mảng chưa sắp xếp

Output: Mảng đã sắp xếp tăng dần

1. Trình bày thuật toán:

Nếu mảng có nhiều hơn 1 phần tử: Chia mảng thành 2 nửa trái và phải cho đến khi 1 mảng có 1 phần tử thì dừng chia.

Gọi đệ quy sắp xếp mỗi nửa.

Trộn hai mảng con đã sắp xếp lại thành một mảng kết quả.

# data[].attributes.body
-        Nhập vào một chuỗi văn bản và một chuỗi mẫu cần tìm.

-        Xét từng vị trí bắt đầu trong chuỗi văn bản (từ trái sang phải) sao cho còn đủ độ dài để chứa mẫu.

-        Tại mỗi vị trí, so sánh từng ký tự của mẫu với phần tương ứng trong văn bản.

-        Nếu toàn bộ ký tự đều trùng khớp → ghi nhận là đã tìm thấy mẫu tại vị trí đó.

-        Nếu có một ký tự không khớp, thì bỏ qua vị trí này và tiếp tục với vị trí tiếp theo.

-        Lặp lại cho đến khi hết các vị trí có thể trong văn bản.

# data[].attributes.body
Day van ban: abcbabc

Mau can tim: abc

Qua trinh so sanh:

i=1: abc → Khớp

i=2: bcb → Không khớp

i=3: cba → Không khớp

i=4: bab → Không khớp

i=5: abc → Khớp

Kết quả:

Tim thay mau tai vi tri: 1

Tim thay mau tai vi tri: 5

# data[].attributes.body
Input:

Một chuỗi văn bản (gọi là chuỗi nguồn).

Một chuỗi nhỏ cần tìm (gọi là chuỗi con).

Output:

Vị trí đầu tiên mà chuỗi con xuất hiện trong chuỗi nguồn (tính từ 0).

Nếu không tìm thấy thì trả về -1.

# data[].attributes.body
Duyệt từng vị trí i trong chuỗi nguồn, từ 0 đến (độ dài chuỗi nguồn - độ dài chuỗi con).

Tại mỗi vị trí i:

So sánh từng ký tự của chuỗi con với các ký tự tương ứng trong chuỗi nguồn (bắt đầu từ vị trí i).

Nếu tất cả ký tự khớp, trả về vị trí i.

Nếu duyệt hết mà không khớp, trả về -1 (không tìm thấy chuỗi con).

# data[].attributes.body
ay van ban: abcbabc

Mau can tim: abc

Qua trinh so sanh:

i=1: abc → Khớp

i=2: bcb → Không khớp

i=3: cba → Không khớp

i=4: bab → Không khớp

i=5: abc → Khớp

Kết quả:

Tim thay mau tai vi tri: 1

# data[].attributes.body
input: nhập dữ liệu nén

output: in ra kết quả dữ liệu đã được nén

# data[].attributes.body
Duyệt qua từng ký tự trong chuỗi đầu vào.

Nếu ký tự hiện tại giống ký tự tiếp theo → tăng biến đếm.

Nếu khác → ghi lại ký tự đó và số lần lặp, sau đó đặt biến đếm về 1.

Tiếp tục cho đến hết chuỗi.

# data[].attributes.body
Ta có dữ liệu ban đầu là:

“aaaaabbbbcccttttrrrree”

Khi có một chữ cái giống nhau lặp lại liên tục, mình chỉ cần ghi chữ đó và số lần nó lặp lại.Như vậy sẽ ngắn hơn và dễ nhớ hơn

Ta sẽ có chuỗi như sau:

"a" xuất hiện 5 lần → ghi thành: “a5”

"b" xuất hiện 4 lần → ghi thành: “b4”

"c" xuất hiện 3 lần → ghi thành: “c3”

"t" xuất hiện 4 lần → ghi thành: “t4”

"r" xuất hiện 4 lần → ghi thành: “r4”

"e" xuất hiện 2 lần → ghi thành: “e2”

Ta có kết quả đã nén là:

“a5b4c3t4r4e2”

# data[].attributes.body
#include <stdio.h>

#include <string.h>

void nenChuoiRLE(char dauVao[], char ketQua[])

{

int doDai = strlen(dauVao);

int dem = 1;

int viTri = 0;

for(int i = 0; i < doDai; i++)

{

if(dauVao[i] == dauVao[i + 1])

{

dem++;

}

else

{

ketQua[viTri++] = dauVao[i];

ketQua[viTri++] = dem + '0';

dem = 1;

}

}

ketQua[viTri] = '\0';

}

int main()

{

char chuoiGoc[100];

char chuoiNen[200];

printf("Nhap chuoi can nen: ");

gets(chuoiGoc);

nenChuoiRLE(chuoiGoc, chuoiNen);

printf("Chuoi sau khi nen: %s\n", chuoiNen);

return 0;

}

# data[].attributes.body
Chuỗi ban đầu: "HELLO"
Khóa mã hóa: 3

# data[].attributes.body
Giải mã (với khóa = 3)