#include <stdio.h> // Nhập, xuất
#include <string.h> // Làm việc với xâu ký tự (string)
#include <ctype.h> // Làm việc với ký tự (char)
#include <stdbool.h> // Thêm kiểu logic (bool)
#include <stdlib.h> // Cấp phát mảng động
// Hàm biến một ký tự chữ hoa -> chữ thường
// Kỹ thuật: dùng bảng mã ASCII
char lowerCase(char c)
{
return (char)c + 32;
}
// Hàm kiểm tra panagram
/** Các bước thực hiện
* 1. Tạo một mảng kiểm tra xem các chữ cái đã xuất hiện trong câu chưa
* (biết rằng, chỉ số (index) của mảng này tương ứng với các ký tự trong bảng mã ASCII)
* 2. Xét các ký tự trong câu
* - Nếu là chữ hoa, biến thành chữ thường
* - Đánh dấu vào mảng kiểm tra, tại chỉ số tương ứng với ký tự trong câu là true
* (đánh dẫu ký tự này có xuất hiện trong câu)
* 3. Xét lại mảng kiểm tra, tại chỉ số của các chữ cái thường (từ 97 -> 122 theo bảng ASCII)
* - Nếu phát hiện tại chỉ số nào có giá trị là false -> trả về kết quả sai -> kết thúc bài toán
* 4. Sau khi bước 3 diễn ra suôn sẻ và không phải kết thúc giữa chừng khi đang xét
* => Lập tức kết luận kết quả là đúng -> kết thúc bài toán
*/
bool isPanagram(char *str)
{
// Bước 1
bool *checkArray = (bool *)calloc(123, sizeof(bool)); // Cấp phát mảng động kiểu bool
// gồm 123 phần tử
// và mỗi phần tử đều có giá trị mặc định là false
// Bước 2
for (int i = 0; i < strlen(str); i++)
{
if (isupper(str[i])) // Ký tự đang xét có là chữ hoa ??
str[i] = lowerCase(str[i]);
checkArray[str[i]] = true;
}
for (int i = 97; i <= 122; i++)
{
if (!checkArray[i]) // Nếu tại chỉ số nào đó có giá trị là false
// cách viết điều kiện trong if tương đương với: check[i] == false
{
free(checkArray); // Giải phóng bộ nhớ cấp phát từ hàm calloc hoặc malloc ở trên (BẮT BUỘC)
return false;
}
}
free(checkArray);
return true;
}
int main()
{
char sentence[10000];
fgets(sentence, sizeof(sentence), stdin);
printf(isPanagram(sentence) ? "Yes" : "No"); // In ra chữ Yes hoặc No dựa trên
// xâu str có phải là panagram
/**
* Dòng 63 tương đương với:
*
* if(isPanagram(sentence) == true) {
* printf("Yes");
* } else {
* printf("No");
* }
*/
}