# [2024/10/15 CPE讀code筆記] 10008 What’s Cryptanalysis?
> 作者: Aria
> Oct. 19, 2024
# 題意
input:
第一行: 代表接下來有n行
n為一個正整數
第$2$~$n+1$行是字串
output:
字元+整數
出現頻率越高的字元排列在最前面
# 自己刷過一遍:
## 原始思路:
先用getchar(), putchar() 收字元後
再用case...switch 逐一將26個字母的數量++
最後用qsort排序
印出
## 遇到的困難
個人希望的排序方法是能將字母跟字母數對照,想過使用num[0]裝A的字母數,輸出方式為
```C=
for(i=0;i<26;i++)
{
printf("%c %d",i+65,num[i]);
}
```
但遇到了困難:
1. qsort要排序的是字母的出現頻率的順序,但不希望影響到字母與其出現頻率之間的連結。
2. 希望用struct做但失敗
## 提醒
1. ascii code A 是65
2. what is qsort?
3. 建struct要更熟悉
# 程式碼:
```c=
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct {
char letter; // The letter (A-Z)
int frequency; // The frequency of the letter
} LetterFreq;
// Compare function for qsort to sort by frequency in descending order
int cmpfunc(const void *a, const void *b) {
LetterFreq *lf1 = (LetterFreq*)a;
LetterFreq *lf2 = (LetterFreq*)b;
return lf2->frequency - lf1->frequency; // Sort by frequency descending
}
int main() {
int n = 0;
char x;
int i;
while(1) {
scanf("%d", &n); // Read number of lines
// Consume the newline character left after scanf
getchar();
// Initialize array to store frequency for each letter
LetterFreq letterFreq[26];
for (i = 0; i < 26; i++) {
letterFreq[i].letter = 'A' + i;
letterFreq[i].frequency = 0;
}
//原本我想怎麼將頻率數都歸0, array的話會用memset, struct不知道怎麼做很苦惱。
// Process n lines of input
for (i = 0; i < n; i++) {
while ((x = getchar()) != '\n' && x != EOF) {
if (x >= 'A' && x <= 'Z') {
letterFreq[x - 'A'].frequency++; // Increment frequency for the letter
}
}
}
//雖然之前就知道有這個做法,但一直沒有記的很清楚,這個做法能取代一個一個字母case...switch的做法
// Sort the array of LetterFreq based on frequency
qsort(letterFreq, 26, sizeof(LetterFreq), cmpfunc);
//仔細觀察qsort的是甚麼? sort之後值怎麼儲存?
// Print the sorted result: only print letters with non-zero frequency
for (i = 0; i < 26; i++) {
if (letterFreq[i].frequency > 0) {
printf("%c %d\n", letterFreq[i].letter, letterFreq[i].frequency);
}
}
// Exit after one loop, or modify to handle continuous input as needed
break;
}
return 0;
}
```
# Reference:
[1] https://cpe.cse.nsysu.edu.tw/cpe/file/attendance/problemPdf/10008.pdf(貢獻題目)
[2] ChatGPT(貢獻程式碼)