1741: 通讯录编排
生活随笔
收集整理的這篇文章主要介紹了
1741: 通讯录编排
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
描述
ACM集訓隊最近人氣很旺,為了促進隊員之間的交流,我們準備制作一個通訊錄,每個隊友的信息包括: tzojid 電話 籍貫 出生年-月-日 各個字段均用英文字符和數字表示。使用空格分隔各個字段,每個字段不包含空格,如:crq的信息為: crq 660000 huangyan 1979-1-1 等到所有隊員的資料收集完畢,我們想要編排通訊錄以便于隊員的查詢,編排方式如下: 首先根據地名作為第一關鍵字進行字典序排序,由于每年老鄉之間都要為隊友慶祝生日,因此將生日作為第二關鍵字進行遞增排序。也許你在老鄉之間能夠找到一個非常有緣的隊友即你們的生日是同一天,那么就根據tzojid作為第三關鍵字進行字典序排序,由于tzojid是唯一的,因此總能排序。我們確信今后將有大量的新隊友加入,因此為了能一勞永逸,請你幫我們編程完成這個任務。輸入
輸入數據有n+1行,第一行為集訓隊隊員的總數n (n<=100),下面的n行為每個隊員的信息,格式見樣例。輸出
輸出編排后的結果。樣例輸入
5 crq 660000 huangyan 1979-1-1 carter 660000 huangyan 1979-1-1 tzc 668888 linhai 1990-1-11 wk 666666 ningbo 1986-10-1 metoo 665567 jiaojiang 1969-1-13樣例輸出
carter 660000 huangyan 1979-1-1 crq 660000 huangyan 1979-1-1 metoo 665567 jiaojiang 1969-1-13 tzc 668888 linhai 1990-1-11 wk 666666 ningbo 1986-10-1按照題目的描述,可以把我們需要的功能分成幾個部分。
(雖然不用結構體也行,但這道題畢竟是出在結構體專欄里的)
比較麻煩的可能是這個比較字符串的值(因為我們通常比較的是字符的,字符串怎么比啊)
另外結構體里的數組要定義大小,不然會報錯。
題目里提到的字典序排序:
字典排序(lexicographical order)是一種對于隨機變量形成序列的排序方法。其方法是,按照字母順序,或者數字小大順序,由小到大的形成序列。
對于數字,按大小排序
對于字符串,就是先比較第一個字符,再比較第二個…如果一樣就看長度,短的放前面。
剩下的就看代碼吧
#include<stdio.h>// 比較兩個字符串,左邊小返回0,右邊小返回1 int strcmp(char *p1, char *p2) {int i = 0;while (p1[i] != '\0') {if (p2[i] == '\0')return 1;if (p1[i] < p2[i])return 0;if (p2[i] < p1[i])return 1;i++;}if (p2[i] == '\0')return 2;return 0; }int main() {struct tzojInfo {char id[50];int tel;char pos[50];int birthY;int birthM;int birthD;};int n, i, j, flag;scanf("%d\n", &n);struct tzojInfo a[n];struct tzojInfo temp;// 輸入for (i = 0; i < n; i++) {scanf("%s %d %s %d-%d-%d", a[i].id, &a[i].tel, a[i].pos, &a[i].birthY, &a[i].birthM, &a[i].birthD);}// 排序(選擇)for (i = 0; i < n - 1; i++) {for (j = i + 1; j < n; j++) {flag = 0;//比較地名if (strcmp(a[i].pos, a[j].pos) == 1) {flag = 1;} else // 比較生日if (strcmp(a[i].pos, a[j].pos) == 2) {if (a[j].birthM < a[i].birthM || (a[j].birthM == a[i].birthM && a[j].birthD < a[i].birthD)) {flag = 1;} // 比較idif (a[j].birthM == a[i].birthM && a[j].birthD == a[i].birthD && (strcmp(a[i].id, a[j].id))) {flag = 1;}}if (flag) {temp = a[j];a[j] = a[i];a[i] = temp;}}}for (i = 0; i < n; i++) {printf("%s %d %s %d-%d-%d\n", a[i].id, a[i].tel, a[i].pos, a[i].birthY, a[i].birthM, a[i].birthD);} }里面這個一大堆if以前可以只寫成一行,不過為了提高閱讀性
就寫成這樣子了。
總結
以上是生活随笔為你收集整理的1741: 通讯录编排的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java vue 服务端渲染_vue s
- 下一篇: Druid 管理面板执行时间分布规则