/* 活動期間抽出プログラム 2001/10/31 K.Miki usage: kikan 1869 1988 -- 1969--1988年の中に活動期間が含まれる人のみ kikan -- 全員 */ #include #include int days(int y, int m, int d){ int day,uru; day=y*365+(y/4)-(y/100)+(y/400)+d; if ((y%4)==0 && ((y%100)!=0 || (y%400)==0)) uru=1; else uru=0; switch (m) { case 1 : break; case 2 : day+=31;break; case 3 : day+=28+uru+31;break; case 4 : day+=31+28+uru+31;break; case 5 : day+=30+31+28+uru+31;break; case 6 : day+=31+30+31+28+uru+31;break; case 7 : day+=30+31+30+31+28+uru+31;break; case 8 : day+=31+30+31+30+31+28+uru+31;break; case 9 : day+=31+31+30+31+30+31+28+uru+31;break; case 10 : day+=30+31+31+30+31+30+31+28+uru+31;break; case 11 : day+=31+30+31+31+30+31+30+31+28+uru+31;break; case 12 : day+=30+31+30+31+31+30+31+30+31+28+uru+31;break; } return(day); } int day(int y, int m, int d){ return (y*400+m*32+d); } main(int argc, char *argv[]){ char line[1024],name[64],*p,*q; int n,y,m,d,ys,ms,ds,ye,me,de,limits,limite; if (argc!=3) { limits=0; limite=9999; } else { limits=atoi(argv[1]); limite=atoi(argv[2]); } n=0; while (gets(line)!=NULL) if (strncmp(line,"\\bann",5)==0) { /* 人名の処理 \bann{相木昭子}{1} */ if (n>0 && yelimits) printf("%s,%d,%3.2f,%d/%d/%d,%d/%d/%d\n",name,n, (days(ye,me,de)-days(ys,ms,ds))/365.0,ys,ms,ds,ye,me,de); p=strstr(line,"}{"); n=atoi(p+2); *p='\0'; strcpy(name,&line[6]); if ((p=strchr(name,'{'))!=NULL) for (q=strchr(p+1,'}')+1;*p++=*q++;); ys=ms=ds=9999;ye=me=de=0; } else /* 日付の処理 \RR{昭}{37}{6}{24}{65} */ for (p=line;(q=strstr(p,"\\RR"))!=NULL;p=q) { q+=4; if (strncmp(q,"明",2)==0) y=1867; else if (strncmp(q,"大",2)==0) y=1911; else if (strncmp(q,"昭",2)==0) y=1925; else if (strncmp(q,"平",2)==0) y=1988; else y=0; y+=atoi(q+4); q=strchr(q+5,'{'); if (strncmp(++q,"閏",2)==0) q+=2; m=atoi(q); q=strchr(q,'{'); d=atoi(++q); if (day(ys,ms,ds)>day(y,m,d)) { ys=y;ms=m;ds=d; } if (day(ye,me,de)0 && yelimits) printf("%s,%d,%3.2f,%d/%d/%d,%d/%d/%d\n",name,n, (days(ye,me,de)-days(ys,ms,ds))/365.0,ys,ms,ds,ye,me,de); }