生日的阳历阴历转换并总结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 } 

问题描述:将班级同学的生日统一转换成阳历,以备通知和后序任务

问题解决:  由于阴历到阳历的转化并没有一个详细的算法,各大日历软件都是通过万年历转化而成。但由于我并不能处理很多数据文档,所以便只转换了一年的生日,期待后序的学习能完善这个程序。

算法描述:先读入XXXX年的年历(程序里用的是2017年的,来自香港天文台),然后读入班级的生日表,并把阴历的生日转化成阳历

问题总结:

1.第一次scanf时,我用了格式化输入加常规字符的方法,企图直接略过'2017年'这几个字,然而因为之前有空格的原因并不能读入。查阅书籍之后发现:scanf在无常规字符时的读取字符是每次读取一个字符,跳过空白字符直到遇到第一个非空白字符,如果格式正确就读入直到遇到下一个空白字符或字段结尾,如果格式不匹配,则scanf会停在那里,并把该字符放回输入,程序下一次读取时还会从该字符开始。而当有常规字符时,程序就会直接去寻找常规字符,如果不匹配,则读取停止。所以最终的解决办法是用*空读2017这几个数,就能完美跳过空格。

2.第二个scanf时,先以%c读取判断阴阳历的字符然后读取日期,但当读取下一行时会出现000,这是因为scanf本身是会跳过空白字符的,但当以%c说明符读入字符时,不会跳过空白字符。所以本例第一行会正确读入数据,而读完之后光标在第一行末尾,还有空格,于是下一组数据的%c会直接读入空格,后面的数据也就不对了。解决办法是在%c之前加一个空格,scanf会跳到第一个非空白字符处。(scanf中的空格不分数量)

后续展望:

1.能批量式的转换

2.能设置定期提醒的服务,并以qq发送给消息。

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

转载于:https://www.cnblogs.com/forty-six/p/6544356.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值