我试图打印一天中发生一天的日期。为了做到这一点,我需要得到日期的整数值,例如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;
}
答案 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的回答有助于该部分)。如果您专注于组装以创建最终产品的小块,那么您最终会得到更快的工作代码,而不是只是一次性完成整个程序,而不是真正了解它。
希望它有所帮助!