/* Count syllable in KS C 5601-1987 */ #include #include #define GET_INDEX(c1, c2) ((c1-0xB0)*94 + (c2-0xA1)) void put_syl_normal(unsigned long count[], unsigned long total) { int i, nsyl=0; double percent, accpercent=0.0; printf("À½Àý ÃâÇöȽ¼ö ¹éºÐÀ² ´©Àû¹éºÐÀ²\n"); printf("=====================================\n"); for (i=0; i < 2350; i++) { if (count[i]) { /* 1¹ø ÀÌ»ó ÃâÇöÇÑ °Í¸¸ Ãâ·Â */ percent = (double)count[i] / (double)total * 100.0; accpercent += percent; printf("%c%c %10ld %10.4f %10.4f\n", i/94+0xB0, (i%94)+0xA1, count[i], percent, accpercent); nsyl++; } } printf("=====================================\n"); printf("À½Àý °³¼ö = %ld, ÃÑ À½Àý¼ö = %ld\n", nsyl, total); } /* header ÆÄÀÏÇüÅ·ΠÃâ·Â */ void put_syl_normal_2(unsigned long count[], unsigned long total) { int i, nsyl=0; double percent, accpercent=0.0; printf("#define N_TOTAL\t%ld\n\n", total); printf("unsigned long SYL_FREQ[25][94] = { {\n"); for (i=0; i < 2350; i++) { if (i != 2349) { printf("\t%6ld,\t/*%c%c*/\n", count[i], i/94+0xB0, i%94+0xA1); if (i % 94 == 93) printf("}, {\n"); } else printf("\t%6ld\t/*%c%c*/\n} };\n", count[i], i/94+0xB0, i%94+0xA1); } } double put_one_syllable(unsigned long count[], int i, long total, double accpercent) { double percent; percent = (double)count[i] / (double)total * 100.0; accpercent += percent; printf("%c%c %10ld %10.4f %10.4f\n", i/94+0xB0, (i%94)+0xA1, count[i], percent, accpercent); return accpercent; } void put_syl_sort(unsigned long count[], unsigned long total) { int i, j, temp; int nsyl=0; double accpercent=0.0; int index[2350]; for (i = 0; i < 2350; i++) index[i] = i; for (i = 0; i < 2350-1; i++) { for (j = i+1; j < 2350; j++) { if (count[index[i]] < count[index[j]]) { temp = index[i]; index[i] = index[j]; index[j] = temp; } } } printf("À½Àý ÃâÇöȽ¼ö ¹éºÐÀ² ´©Àû¹éºÐÀ²\n"); printf("=====================================\n"); for (i = 0; i < 2350; i++) { if (count[index[i]]) { /* 1¹ø ÀÌ»ó ÃâÇöÇÑ °Í¸¸ Ãâ·Â */ accpercent = put_one_syllable(count, index[i], total, accpercent); nsyl++; } } printf("=====================================\n"); printf("À½Àý °³¼ö = %ld, ÃÑ À½Àý¼ö = %ld\n", nsyl, total); } /* header ÆÄÀÏÇüÅ·ΠÃâ·Â */ void put_syl_sort_2(unsigned long count[], unsigned long total) { int i, j, temp; int nsyl=0; double accpercent=0.0; int index[2350]; for (i = 0; i < 2350; i++) index[i] = i; for (i = 0; i < 2350-1; i++) { for (j = i+1; j < 2350; j++) { if (count[index[i]] < count[index[j]]) { temp = index[i]; index[i] = index[j]; index[j] = temp; } } } printf("#define N_TOTAL\t%ld\n\n", total); printf("unsigned SYL_FREQ[25][94][2] = { {\n"); for (i=0; i < 2350; i++) { if (i != 2349) { printf("\t{ 0x%x%x, %6ld },\t/*%c%c*/\n", index[i]/94+0xB0, index[i]%94+0xA1, count[index[i]], index[i]/94+0xB0, index[i]%94+0xA1); if (i % 94 == 93) printf("}, {\n"); } else printf("\t{ 0x%x%x, %6ld }\t/*%c%c*/\n} };\n", index[i]/94+0xB0, index[i]%94+0xA1, count[index[i]], index[i]/94+0xB0, index[i]%94+0xA1); } } int main(int argc, char *argv[]) { int i, j; int c1, c2; unsigned short syl; unsigned long total_syllable=0; unsigned long count[2350] = { 0 }; if (argc == 2 && !strcmp(argv[1], "-h")) { puts("C> syl-cnt [-s | -s2 | -n2]"); return 0; } c1 = getchar(); while(c1 != EOF) { if (c1 & 0x80) { c2 = getchar(); if (c1 >= 0xB0 && c1 <= 0xC8 && c2 >= 0xA1 && c2 <= 0xFE) { syl = GET_INDEX(c1, c2); count[syl]++; total_syllable++; } } c1 = getchar(); } if (argc == 2 && !strcmp(argv[1], "-s")) put_syl_sort(count, total_syllable); else if (argc == 2 && !strcmp(argv[1], "-s2")) put_syl_sort_2(count, total_syllable); else if (argc == 2 && !strcmp(argv[1], "-n2")) put_syl_normal_2(count, total_syllable); else put_syl_normal(count, total_syllable); return 0; }