生日的陽曆陰曆轉換並總結scanf用法

拖了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發送給消息。

任重而道遠,加油啊!!!

相關文章
相關標籤/搜索