拖了N久的生日轉化終於被我寫完了orz,期間遇到了很多關於格式化輸入的問題,看完書以後茅塞堵開,先大致總結一下,以備後面學習。算法
先貼源代碼:學習
1 #include<stdio.h> 2 typedef struct calendar 3 { 4 int solar_month; 5 int solar_day; 6 int lunar_month; 7 int lunar_day; 8 }calendar; //2017年年曆 9 typedef struct birthday 10 { 11 char judge; //y爲陽曆n爲陰曆 12 int month; 13 int day; 14 char name[10]; 15 }birthday; 16 int main() 17 { 18 calendar a[366]; 19 birthday b[120]; 20 int i=0,j=0,data_m,data_d,counter_calendar,counter_birthday; 21 FILE *fp_calendar=fopen("2017calendar.txt","r"); 22 if(fp_calendar==NULL) 23 { 24 printf("calendar open error\n"); 25 return 0; 26 } 27 FILE *fp_birthday=fopen("14birthday.txt","r"); 28 if(fp_birthday==NULL) 29 { 30 printf("birthday open error\n"); 31 return 0; 32 } 33 FILE *fp_final=fopen("final.txt","w"); 34 if(fp_final==NULL) 35 { 36 printf("final open file error\n"); 37 return 0; 38 } 39 while(fscanf(fp_calendar,"%*d年%d月%d日%d..%d",&a[i].solar_month,&a[i].solar_day,&a[i].lunar_month,&a[i].lunar_day)!=EOF) 40 { 41 42 i++; 43 } 44 counter_calendar=i; 45 while(fscanf(fp_birthday," %c%d.%d %s",&b[j].judge,&b[j].month,&b[j].day,b[j].name)!=EOF) 46 { 47 if(b[j].judge=='n') 48 { 49 data_m=b[j].month; 50 data_d=b[j].day; 51 for(int i=0;i<counter_calendar;i++) 52 { 53 if(data_m==a[i].lunar_month&&data_d==a[i].lunar_day) 54 { 55 b[j].month=a[i].solar_month; 56 b[j].day=a[i].solar_day; 57 b[j].judge='y'; 58 } 59 60 } 61 } 62 j++; 63 } 64 counter_birthday=j; 65 for(int i=0;i<counter_birthday;i++) 66 { 67 if(b[i].judge=='y') 68 { 69 fprintf(fp_final,"%d.%d %s \n",b[i].month,b[i].day,b[i].name); 70 } 71 } 72 if((fclose(fp_calendar)||fclose(fp_birthday)||fclose(fp_final))!=0) printf("close file error!\n"); 73 }
問題描述:將班級同窗的生日統一轉換成陽曆,以備通知和後序任務spa
問題解決: 因爲陰曆到陽曆的轉化並無一個詳細的算法,各大日曆軟件都是經過萬年曆轉化而成。但因爲我並不能處理不少數據文檔,因此便只轉換了一年的生日,期待後序的學習能完善這個程序。code
算法描述:先讀入XXXX年的年曆(程序裏用的是2017年的,來自香港天文臺),而後讀入班級的生日表,並把陰曆的生日轉化成陽曆blog
問題總結:文檔
1.第一次scanf時,我用了格式化輸入加常規字符的方法,企圖直接略過'2017年'這幾個字,然而由於以前有空格的緣由並不能讀入。查閱書籍以後發現:scanf在無常規字符時的讀取字符是每次讀取一個字符,跳過空白字符直到遇到第一個非空白字符,若是格式正確就讀入直到遇到下一個空白字符或字段結尾,若是格式不匹配,則scanf會停在那裏,並把該字符放回輸入,程序下一次讀取時還會從該字符開始。而當有常規字符時,程序就會直接去尋找常規字符,若是不匹配,則讀取中止。因此最終的解決辦法是用*空讀2017這幾個數,就能完美跳過空格。io
2.第二個scanf時,先以%c讀取判斷陰陽曆的字符而後讀取日期,但當讀取下一行時會出現000,這是由於scanf自己是會跳過空白字符的,但當以%c說明符讀入字符時,不會跳過空白字符。因此本例第一行會正確讀入數據,而讀完以後光標在第一行末尾,還有空格,因而下一組數據的%c會直接讀入空格,後面的數據也就不對了。解決辦法是在%c以前加一個空格,scanf會跳到第一個非空白字符處。(scanf中的空格不分數量)class
後續展望:軟件
1.能批量式的轉換書籍
2.能設置按期提醒的服務,並以qq發送給消息。
任重而道遠,加油啊!!!