拖了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发送给消息。
任重而道远,加油啊!!!