# data[].attributes.body
1. Input

Một chuỗi cần mã hóa/giải mã.

một giá trị số nguyên là số vị trí cần dịch chuyển.

2.Output

Một chuỗi đã được mã hóa/giải mã

3.Mô tả thuật toán

Đi từ phần tử đầu tiên đến phần tử cuối cùng của chuỗi ký tự.

Kiểm tra từng ký tự có phải là chữ cái hay không,nếu là chữ cái thì tiếp tục kiếm tra chữ cái đó là chữ hoa hay chữ thường.

Nếu là chữ thường hoặc chữ hoa thì áp dụng công thức giá trị của vị trí thứ i cộng với giá trị của ký tự 'a' cộng tiếp số vị trí cần dịch chuyển chia lấy dư cho 26 rồi cộng lại giá trị của ký tự 'a'

4.Minh họa thuật toán

4.1 Nhập chuỗi cần mã hóa/giải mã: Hello, World!

4.2 Nhập số lượng dịch chuyển: 3

4.3 Chuỗi đã mã hóa: Khoor, Zruog!

4.4 Chuỗi đã giải mã: Hello, World!

5.Cài đặt thuật toán

#include <stdio.h>

#include <string.h>

#include <ctype.h>

// Caesar

void mahoa(char *input, int shift) {

int len = strlen(input);

for (int i = 0; i < len; i++) {

if (isalpha(input[i])) {

if (islower(input[i])) {

input[i] = 'a' + (input[i] - 'a' + shift) % 26;

}

else if (isupper(input[i])) {

input[i] = 'A' + (input[i] - 'A' + shift) % 26;

}

}

}

}

void giaima(char *input, int shift) {

mahoa(input, 26 - shift);

}

int main() {

char input[100];

int shift;

printf("nhap chuoi can giai ma: ");

fgets(input, sizeof(input), stdin);

fflush(stdin);

printf("nhap so luong dich chuyen");

scanf("%d", &shift);

mahoa(input, shift);

printf("Chuoi da ma hoa: %s\n", input);

giaima(input, shift);

printf("Chuoi da giai ma: %s\n", input);

return 0;

}

# data[].attributes.body
Mô tả thuật toán:

_Thuật toán Brute Force là dạng thuật toán tìm kiếm tuần tự, nó thử kiểm tra tất cả các vị trí trên văn bản từ 1 cho đến n – m + 1. Sau mỗi lần thử, thuật toán Brute Force dịch mẫu sang phải một ký tự cho đến khi kiểm tra hết văn bản. Thuật toán Brute Force không cần công việc chuẩn bị cũng như các mảng phụ cho quá trình tìm kiếm. Độ phức tạp tính toán của thuật toán này là O(n*m). Thuật toán được xây dựng đơn giản, nhưng với văn bản lớn thì thuật toán này tỏ ra không hiệu quả.

_Hàm bruteForce:

Hàm nhận vào bốn đối số:

const char *des: Chuỗi văn bản cần tìm kiếm.

const char *x: Chuỗi mẫu cần đối sánh.

int n: Độ dài của chuỗi des.

int m: Độ dài của chuỗi x.

Khởi tạo biến count để đếm số lần xuất hiện của chuỗi x trong chuỗi des.

Sử dụng hai vòng lặp lồng nhau để duyệt qua từng vị trí trong chuỗi des:

Vòng lặp ngoài (i): Duyệt qua từng vị trí trong chuỗi des để bắt đầu so sánh với chuỗi x.

Vòng lặp trong (j): Duyệt qua từng ký tự của chuỗi x và so sánh với ký tự tương ứng trong chuỗi des.

Nếu tất cả các ký tự khớp nhau, tăng giá trị của j.

Nếu j đạt giá trị m (độ dài của chuỗi x), có nghĩa là tất cả các ký tự của chuỗi x khớp với một phần trong chuỗi des, tăng giá trị của count.

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

#include<string.h>

int bruteForce(const char des,const char x, int n, int m){

int count = 0;

for(int i = 0 ; i <= (n-m);i++){

for(int j = 0 ; j < m && x[j] == des[i+j]; j++)

if(j >= m){

count++;

}

}

return count;

}

main(){

int res;

const char *des = "acbabcbaacabca";

const char *x = "ab";

int lenDes = strlen(des);

int lenX = strlen(x);

res = bruteForce(des,x,lenDes,lenX);

printf("Xau b xuat hien %d lan trong xau a", res);

# data[].attributes.body
Input
- Người dùng được yêu cầu nhập một chuỗi ban đầu (chuoi1) và một chuỗi cần tìm kiếm (chuoi2).

Output
- Nếu chuoi2 được tìm thấy trong chuoi1, chương trình sẽ in ra vị trí đầu tiên của chuoi2 trong chuoi1.
- Nếu chuoi2 không được tìm thấy trong chuoi1, chương trình sẽ thông báo rằng không tìm thấy chuoi2 trong chuoi1.

Mô tả thuật toán
1. Nhập dữ liệu:
- Sử dụng hàm `gets()` để nhập chuỗi ban đầu (chuoi1) từ người dùng.
- Sử dụng hàm `gets()` để nhập chuỗi cần tìm kiếm (chuoi2) từ người dùng.

2. Tìm kiếm chuỗi:
- Sử dụng hai vòng lặp for để duyệt qua từng ký tự của chuoi1 và so sánh với chuoi2.
- Vòng lặp bên trong (j) so sánh từng ký tự tương ứng của chuoi1 và chuoi2.

3. In kết quả:
- Nếu tất cả các ký tự giống nhau, biến `timThay` được đặt thành 1, và chương trình in ra vị trí đầu tiên của chuoi2 trong chuoi1 và kết thúc thuật toán.
- Nếu không tìm thấy chuỗi con sau khi kiểm tra toàn bộ chuỗi gốc, thông báo rằng chuỗi con không tồn tại.

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

#include <string.h>

int timKiemChuoi(char chuoi1[], char chuoi2[]){

int i, j, timThay;

for (i = 0; i <= strlen(chuoi1) - strlen(chuoi2); i++) {

timThay = 1;

for (j = 0; j < strlen(chuoi2); j++) {

if (chuoi1[i + j] != chuoi2[j]) {

timThay = 0;

break;

}

}

if (timThay == 1)

return i + 1;

}

if (timThay == 0)

return -1;

}

main() {

char chuoi1[100], chuoi2[20];

printf("Nhap chuoi ban dau: ");

gets(chuoi1);

printf("Nhap chuoi can tim kiem: ");

gets(chuoi2);

int viTri = timKiemChuoi(chuoi1, chuoi2);

if (viTri != -1)

printf("Chuoi \"%s\" duoc tim thay tai vi tri %d.\n", chuoi2, viTri);

else

printf("Khong tim thay chuoi \"%s\" trong chuoi.\n", chuoi2);

}

# data[].attributes.body
1. Hàm nhapCau(char *cau, int kichThuoc):

Input: Nhận vào một con trỏ đến một mảng ký tự (char *cau) và một số nguyên (kichThuoc) đại diện cho kích thước tối đa của câu cần nhập.

Output: Nhập câu từ bàn phím vào mảng cau.

Thuật toán:

Sử dụng hàm fgets để đọc câu từ bàn phím và lưu vào mảng cau.

Loại bỏ ký tự newline nếu có ở cuối chuỗi.

2. Hàm phanTichCau(char *cau):

Input: Nhận vào một con trỏ đến một mảng ký tự (char *cau) chứa câu cần phân tích.

Output: In ra mỗi từ trong câu.

Thuật toán:

Sử dụng hàm strtok để tách từng từ từ chuỗi cau sử dụng khoảng trắng làm ký tự phân tách.

In ra màn hình từng từ được tìm thấy.

3. Hàm main():

Thuật toán chính:

Khai báo một mảng ký tự cau để chứa câu.

Gọi hàm nhapCau để nhập câu từ bàn phím.

In ra màn hình câu đã nhập.

Gọi hàm phanTichCau để phân tích và in ra mỗi từ trong câu.

Minh Hoạ Thuật Toán:

Ví dụ: Nếu người dùng nhập câu "Chào bạn, hãy phân tích tôi", chương trình sẽ hoạt động như sau:

Phân tách câu:

Tu: Chào

Tu: bạn,

Tu: hãy

Tu: phân

Tu: tích

Tu: tôi

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

#include <string.h>

void phanTichCau(char *cau) {

char *token = strtok(cau, " ");

while (token != NULL) {

printf("Tu: %s\n", token);

token = strtok(NULL, " ");

}

}

void nhapCau(char *cau, int kichThuoc) {

printf("Nhap cau: ");

fgets(cau, kichThuoc, stdin);

if ((strlen(cau) > 0) && (cau[strlen(cau) - 1] == '\n')) {

cau[strlen(cau) - 1] = '\0';

}

}

int main() {

char cau[100];

nhapCau(cau, sizeof(cau));

printf("Cau da nhap: %s\n", cau);

printf("Phan tich cau:\n");

phanTichCau(cau);

return 0;

}