fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <time.h>
  4.  
  5. const char weekname[7][10] = {"日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"};
  6. const int table_mdays[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
  7. int isleap(int year){
  8. return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
  9. }
  10. int mdays(int year, int month){
  11. return table_mdays[isleap(year)][month-1];
  12. }
  13. int week_name2no(const char *str){
  14. int i;
  15. for(i = 0; i < 7; i++){
  16. if(strcmp(str, weekname[i]) == 0){
  17. break;
  18. }
  19. }
  20. return i;
  21. }
  22.  
  23. int calc_day(int year, int month, int weeknum, int weekno){
  24. struct tm tm_in = {0,0,0,1,month-1,year-1900,0,0,0};
  25. time_t t = mktime(&tm_in);
  26. struct tm *tm_out = localtime(&t);
  27. int firstweekno = tm_out->tm_wday;
  28. int day = (weekno - firstweekno + 7) % 7 + 1;
  29. day += 7 * (weeknum-1);
  30. if(day < 1 || day > mdays(year, month)){
  31. day = -1;
  32. }
  33. return day;
  34. }
  35.  
  36. int main(void){
  37. char buf[128] = {};
  38. int year, month, weeknum, weekno, day;
  39. char weekstr[10];
  40. while(fgets(buf, 127, stdin) != NULL){
  41. if(sscanf(buf, "%d-%d,第%d%[^\n]", &year, &month, &weeknum, weekstr) < 4){
  42. puts("Invalid input.");
  43. continue;
  44. }
  45. weekno = week_name2no(weekstr);
  46. if(weekno >= 7){
  47. puts("Invalid input.");
  48. continue;
  49. }
  50. if(year < 1900 || month < 1 || month > 12){
  51. puts("Invalid date.");
  52. continue;
  53. }
  54. day = calc_day(year, month, weeknum, weekno);
  55. if(day == -1){
  56. puts("Invalid date.");
  57. }else{
  58. printf("%d-%02d-%02d\n", year, month, day);
  59. }
  60. }
  61. return 0;
  62. }
  63.  
Success #stdin #stdout 0s 5660KB
stdin
2021-07,第3月曜日
2021-07,第10月曜日
stdout
2021-07-19
Invalid date.