知道在c中出现一天的一个月中的日期

时间:2017-03-26 14:44:24

标签: c

我试图打印一天中发生一天的日期。为了做到这一点,我需要得到日期的整数值,例如0表示星期日,1表示星期一,2表示星期二等。我怎么用C表示呢?每当我尝试时,我似乎都会遇到错误。

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
int main(){
int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  int year, day, month, date, a, y, m, s, i, b=0;
  char week[7][10] ;

 strcpy(week[0], "Sunday") ;
 strcpy(week[1], "Monday") ;
 strcpy(week[2], "Tuesday") ;
 strcpy(week[3], "Wednesday") ;
 strcpy(week[4], "Thursday") ;
 strcpy(week[5], "Friday") ;
 strcpy(week[6], "Saturday") ; 
 //char *week[]={"Sunday","Monday","Tuesday","Wednesday",
            //"Thrusday","Friday","Saturday"};
  printf("Enter the day:");
  scanf("%s",week[i]);
  printf("Enter the month:");
  scanf("%d",&month);
  printf("Enter the year:");
  scanf("%d",year);
  if(year%4==0&&year%100!=0||year%400==0)
  days[2]==
  29;
  else
  days[2]==28;

  //for(i=1;i<7;i++)
  //week[i]=i;
  //i=i+1;
  week[0]==0;
  week[1]==1;
  week[2]==2;
  week[3]==3;
  week[4]==4;
  week[5]==5;
  week[6]==6;

  //algorithm from http://www.tondering.dk/claus/cal/chrweek.php#calcdow
  a = (14 - month) % 12;
  y = year - a;
  m = month + (12 * a) - 12;

  date = (week[i] + y + (y / 4) - (y / 100) + (y / 400) + ((31 * m) / 12)) % 7 ;
  printf("%d",date);

  for(day=1; day<=days[month] ;day++)
  {
   date=date+7;
   date++;
  }
  return 0;
   }

2 个答案:

答案 0 :(得分:1)

在第一次扫描中,我没有值。周[0],周[1]等等是字符数组。你想通过将它们与int进行比较来做什么? (周[0] == 0 ....)。

  declare a char[10] wordday;
  printf("Enter the day:");
  scanf("%s",wordday);




  for(i=0;i<7;i++)
      if(strcmp(wordday,week[i])==0)
      {
      printf("%d",i);
      break;
      }

答案 1 :(得分:1)

您的代码有迹象表明程序员没有仔细阅读和分析 - 没有违法行为,它只是学习编程过程的一部分。解决方案?复制一下并删除所有对测试程序核心并非绝对关键的代码,然后从那里构建。为您可能无法理解的代码构建测试用例隔离,这样您就可以对您在程序中汇集的代码片段充满信心。阅读错误,谷歌错误,并了解它们。只有当您在学习编程语言的范围内包含对错误的理解时,才能熟练掌握该语言。错误总是意味着什么,他们的信息是具体的和信息性的。

例如,这段代码:

  char week[7][10] ;

 strcpy(week[0], "Sunday") ;
 strcpy(week[1], "Monday") ;
 strcpy(week[2], "Tuesday") ;
 strcpy(week[3], "Wednesday") ;
 strcpy(week[4], "Thursday") ;
 strcpy(week[5], "Friday") ;
 strcpy(week[6], "Saturday") ; 
 //char *week[]={"Sunday","Monday","Tuesday","Wednesday",
            //"Thrusday","Friday","Saturday"};

当我看到有效且更简洁的代码被注释掉并用蛮力方法取代时,我总是持怀疑态度。这通常意味着程序员不会理解他们看到的错误,因此他们会删除他们不完全理解的代码,并用更直接或明确的方法替换,从而错过有效有机会提高他们对语言的理解。

这是我为了向自己(以及读者!)证明注释调用工作正常并且更直接的最小例子:

#include <time.h>
#include <stdio.h>
int main(int argc, char**argv){
  char *week[]={
    "Sunday","Monday","Tuesday","Wednesday",
    "Thrusday","Friday","Saturday"
  };
  for( int i = 0; i < 7; i++)
    printf("%s\n", week[i]);
  return 0;
}

看看我在那里做了什么?我构建了一个测试程序来测试我想要更好理解的代码。在学习一门新语言时,我经常会创建一些只有几行概念的最小证据。

现在让我们谈谈这段代码。

 //for(i=1;i<7;i++)
  //week[i]=i;
  //i=i+1;
  week[0]==0;
  week[1]==1;
  week[2]==2;
  week[3]==3;
  week[4]==4;
  week[5]==5;
  week[6]==6;

请记住,week是一个包含char*或字符串值的7元素数组。如果您在使用for循环版本时遇到有关不兼容类型的编译错误,那么因为您正在尝试将其设置为数字。

我不确定i=i+1应该在那里做什么。编写代码的方式,在for循环之外(没有{}大括号,for循环只与一个行重复代码,记住)。所以你在0到6的范围内迭代i,然后在7的时候停止,在for循环之外将它设置为8.记住,C中的for循环有一个内置的方法您正在使用的递增(i++参数中的for。你不必自己增加。

取消注释版本,您有比较运算符==,而不是赋值运算符=。您的代码没有分配任何值, "Sunday"0"Monday"比较为1,等等。您没有做任何事情结果,即使这些比较 有效,这些行也完全没有效果。

我实际上有点困惑你一般会尝试用week做什么。首先,您将其设置为工作日名称 - 好的,这是有效的。然后尝试将每个值设置为其索引(week[0] = 0等)。这将是一个非常无意义的阵列;你也可以只使用索引并完全跳过数组,如果它只是为了给你索引值。最后,您似乎没有将weeks实际用作代码或算法的一部分,除了以下代码片段只是将值保存到中(错误的是,我可能会添加) ),所以我不确定它为什么会在那里。

printf("Enter the day:");
scanf("%s",week[i]);

最好阅读scanf上的文档。您让他们进入一天,然后您将该字符串存储在指针week[i]的字符串中。等一下,不是week将您的工作日编号作为工作日名称查找表吗?为什么要在用户输入的那天使用它?我想你知道你在尝试在这里做什么,但那不是发生了什么。

我建议您将这些代码简化为最简单且易于验证的内容,确保核心功能正常运行,然后从那里开始增长。在这种情况下,您应该首先删除所有scanf语句,然后对输入的日,月和年进行硬编码。然后通过算法运行那些硬编码输入,看看你是否得到了预期的结果。一旦您获得了经过验证的算法,您就可以添加scanf语句并支持命名日期(@Kristjan Kica的回答有助于该部分)。如果您专注于组装以创建最终产品的小块,那么您最终会得到更快的工作代码,而不是只是一次性完成整个程序,而不是真正了解它。

希望它有所帮助!