【问题标题】:C: How to find the day name for a given day of the year input by userC:如何查找用户输入的一年中给定日期的日期名称
【发布时间】:2017-11-14 22:07:24
【问题描述】:

用户输入一个月的一天和一个月,然后输出将给用户一年中的一天。例如:

-输入:日=24,月=2

-输出:day=55

所以我的问题是如何为一年中的某一天命名,例如星期三、星期一等?例如:

-输入:日=1,月=1

-输出:day=1,星期日

这是我的代码:

int countDays(int, int, int[]);

int main() {
  int daysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  int day, month;

  printf("enter day: ");
  scanf("%d", &day);

  printf("Enter month: ");
  scanf("%d", &month);

  printf("There are %d days \n", countDays(day, month, daysInMonth));
  return 0;
}

int countDays(int day, int month, int daysInMonth[]) {
  char *c[]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
  int charc[6];
  int k, j, a;
  int b = 0;
  int dayno[31][12];
  for (k = 0; k < 12; k++) {
    for (j = 0; j < daysInMonth[k]; j++) {

      dayno[j][k] = ++b;
    }
    a = dayno[day - 1][month - 1];
  }
  return a;
}

【问题讨论】:

  • 你需要一年才能这样做。如果你有年份,那就有一个公式;谷歌提供的随机链接:blog.artofmemory.com/…
  • 注意:c[], int charc[6] 未使用。
  • 我在上传之前做了一些测试,所以有些部分没有用于测试
  • @Ducuh 你只想找到 2017 年的日子吗?因为您没有包含任何让用户输入年份的代码。
  • @frslm 现在是的

标签: c


【解决方案1】:

由于您目前只对 2017 年感兴趣,因此您可以通过 countDays() 模 7 轻松计算出星期几。您可以在 main() 中扩展您当前打印的内容:

printf("There are %d days \n", countDays(day, month, daysInMonth));

与:

int days = countDays(day, month, daysInMonth);
char *c[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

printf("There are %d days; day of the week: %s \n", days, c[(days - 1) % 7]);

【讨论】:

    【解决方案2】:

    如何查找用户输入的一年中给定日期的日期名称

    使用mktime() 计算给定年、月、日的星期几。

    #include <stdio.h>
    #include <time.h>
    
    const char *day_name(int year, int month, int day) {
      struct tm tm = { .tm_year = year - 1900, .tm_mon = month - 1, .tm_mday = day,
          .tm_isdst = -1 };
      time_t t = mktime(&tm);
      if (t == -1) { 
        return "?";
      }
      static const char *dow[] = { "Sunday", "Monday", "Tuesday", "Wednesday",
          "Thursday", "Friday", "Saturday" };
      return dow[tm.tm_wday];
    }
    
    int main(void) {
      puts(day_name(2017, 1, 1));
      puts(day_name(2017, 2, 24));
      puts(day_name(2017, 11, 14));
    }
    

    输出

    Sunday
    Friday
    Tuesday
    

    对于 OP 的代码,使用 countDays(month, day) 的变体

    #define Jan1_2017DOW (0 /* Sunday */) 
    #define Jan1Number 1
    int dow = (countDays(month, day) - Jan1Number + Jan1_2017DOW) % 7;
    puts(c[dow]);
    

    【讨论】:

      【解决方案3】:

      这是一个简单的解决方案:)

      void countDays(int day, int month, int daysInMonth[])
      {
          char c[][15] =  {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
          int totaldays=0;
          for(int i=0;i<month-1;i++)
          {
              totaldays+= daysInMonth[i];
          }
      
          totaldays += day;
      
          printf("There are %d days \n", totaldays);
      
          printf("\n day : %s",c[(totaldays-1)%7]);
      
          return;
      }
      

      在用你自己的方法对你的代码做一些改动之后:)

      【讨论】:

      • 实际上两者都相同..但令人困惑..感谢您的建议:)
      • @Ducuh ,您不需要在过程中使用二维数组,因此,这将是一个简单的解决方案。试试看:)
      【解决方案4】:
      #include <stdio.h>
      
      char *WEEK[] =  {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
      int DAYS_IN_MONTH[] =  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
      
      int countDays(int day, int month);
      char *dayName(int day);
      
      int main(){
          int day, month;
      
          printf("enter day: ");
          scanf("%d", &day);
      
          printf("Enter month: ");
          scanf("%d", &month);
      
          int days = countDays(day, month);
          if(days != -1){
              printf("There are %i days \n", days);
              printf("The day name is %s\n", dayName(days));
          }else{
              printf("Error\n");
          }
      
          return 0;
      }
      
      int countDays(int day, int month){
          if(day >DAYS_IN_MONTH[month-1])
              return -1;
      
          int num_days = 0;
          for(int i = 0;i < month-1;i++){
              num_days+=DAYS_IN_MONTH[i];
          }
          return num_days+day;
      
      }
      
      char *dayName(int days){
          return WEEK[(days-1) % 7];
      }
      

      【讨论】:

        【解决方案5】:

        取自 Aho、Sethi 和 Ullman 的“编译器:原理、技术和工具”

        day = (1461 * year) / 4 + (153 * month + 2) / 5 + month_day;
        

        (注意/在这里表示整数除法,所有数字都必须是整数)这个公式归因于那里的Tanzen[1963]。如果您将% 7 应用于该公式,则在应用适当的偏移量后,您将获得星期几。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-23
          相关资源
          最近更新 更多