#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ã ASCIIcharlowerCase(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 2for(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;}intmain(){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");
* }
*/}