#include // Nhập, xuất #include // Làm việc với xâu ký tự (string) #include // Làm việc với ký tự (char) #include // Thêm kiểu logic (bool) #include // 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"); * } */ }