Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

โปรแกรม C นับความถี่ของแต่ละตัวอักษรใน String (Character Frequency)

นับจำนวนครั้งที่ตัวอักษรแต่ละตัวปรากฏในสตริง แยกเป็นพิมพ์ใหญ่/เล็ก หรือรวมกัน (Case Insensitive)

อัลกอริทึม

  1. อ่าน String จากผู้ใช้
  2. หาความยาว String
  3. Initialize Frequency Array = 0
  4. วน Loop นับ: ถ้า a-z → `freq[ch-'a']++`, ถ้า A-Z → `freq[ch-'A']++`
  5. แสดงผลเฉพาะตัวที่ freq > 0

ตัวอย่างโปรแกรม (Case Insensitive - รวมพิมพ์ใหญ่เล็ก)

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAX 100

int main() {
    char str[MAX];
    int freq[26] = {0};  // a-z only
    int i, len;
    
    printf("Enter string: ");
    fgets(str, MAX, stdin);
    str[strcspn(str, "\n")] = '\0';
    
    len = strlen(str);
    
    for(i = 0; i < len; i++) {
        if(isalpha(str[i])) {
            char lower = tolower(str[i]);
            freq[lower - 'a']++;
        }
    }
    
    printf("\nFrequency of each letter (case-insensitive):\n");
    for(i = 0; i < 26; i++) {
        if(freq[i] > 0) {
            printf("'%c' = %d\n", 'a' + i, freq[i]);
        }
    }
    
    return 0;
}

ผลลัพธ์

Enter string: Tutorials Point

Frequency of each letter (case-insensitive):
'a' = 1
'i' = 2
'l' = 1
'n' = 1
'o' = 2
'p' = 1
'r' = 1
's' = 1
't' = 3

ตัวอย่างโปรแกรม (Case Sensitive - แยกพิมพ์ใหญ่/เล็ก)

#include <stdio.h>
#include <string.h>

#define MAX 100
#define CHARS 256

int main() {
    char str[MAX];
    int freq[CHARS] = {0};
    
    printf("Enter string: ");
    fgets(str, MAX, stdin);
    str[strcspn(str, "\n")] = '\0';
    
    for(int i = 0; str[i]; i++) {
        unsigned char c = str[i];
        freq[c]++;
    }
    
    printf("\nFrequency (Case Sensitive):\n");
    for(int i = 0; i < CHARS; i++) {
        if(freq[i] > 0) {
            if(i >= 32 && i <= 126)
                printf("'%c' = %d\n", i, freq[i]);
            else
                printf("ASCII %d = %d\n", i, freq[i]);
        }
    }
    
    return 0;
}

ผลลัพธ์ (Case Sensitive)

Enter string: Tutorials Point

Frequency (Case Sensitive):
' ' = 1
'P' = 1
'T' = 1
'i' = 2
'l' = 1
'n' = 1
'o' = 2
'p' = 1
'r' = 1
's' = 1
't' = 2
'u' = 1

การใช้งานจริง

  • Text Analysis - Word Frequency, Letter Frequency
  • Cryptanalysis - Frequency Analysis แบบ Classical Cipher
  • Compression - Huffman Coding ต้องการ Frequency Table
  • Validation - ตรวจสอบ Character Set

ความซับซ้อน

  • Time: O(n) - Single Pass
  • Space: O(1) - Fixed Array (26 หรือ 256)

ขยาย: Unicode/UTF-8 Support

C Standard ไม่รองรับ Unicode โดยตรง ต้องใช้ Library:

  • ICU (International Components for Unicode)
  • libutf8proc
  • Glib (g_utf8_strlen, g_unichar_*)
// Concept สำหรับ UTF-8 (ต้องใช้ Library)
gunichar ch;
const char *p = str;
while(*p) {
    ch = g_utf8_get_char(p);
    freq[ch]++;  // ต้องใช้ Hash Map เพราะ Unicode มี 1M+ Codepoints
    p = g_utf8_next_char(p);
}