c语言课后作业 数组 生命计算器
下面是我写的代码,不知道为什么用vscode运行结果老有问题而且数据还会变,用dec运行就没问题
=============================================================
#include <stdio.h>
int main()
{
int total;
int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int year1, month1, day1, year2, month2, day2;
int d1;
int spy; //闰年储存
int k = 1, i, j=1;
int Y, D1,D2;
first:
printf("请输入你的生日(如1988-05-20):");
scanf("%d-%d-%d", &year1, &month1, &day1);
if(month1>12||day1>days)
{
printf("输入有错,请重新输入!\n");
goto first;
}
printf("请输入今天的日期(如2016-03-28):");
scanf("%d-%d-%d", &year2, &month2, &day2);
if (year2 > year1)
{
Y = year2 - year1 - 1;
if(month2>12||day2>days)
{printf("输入有错,请重新输入!\n");
goto first;
}
}
else if (year1 == year2)
{
Y = 0;
if (month1 > month2||month2>12)
{
printf("输入有错,请重新输入!\n");
goto first;
}
else if (month1 == month2)
{
if (day1 > day2||day2>days)
{
printf("输入有错,请重新输入!\n");
goto first;
}
else if (day1 == day2)
{
goto final;
}
}
}
else
{
printf("输入有错,请重新输入!\n");
goto first;
} //计算中间年
if (year1 % 400 == 0 || year1 % 4 == 0 && year1 % 100 != 0)
{
days = 29;
while (k < month1)
{
D1 = D1 + days;
k++;
}
if (k == month1)
{
D1 = D1 + day1;
}
d1=D1;
D1 = 366 - D1;
} //头年为闰计算天数
else
{
days = 28;
while (k < month1)
{
D1 = D1 + days;
k++;
}
if (k == month1)
{
D1 = D1 + day1;
}
d1=D1;
D1 = 365 - D1;
}//头年为平计算天数
if (year2 % 400 == 0 || year2 % 4 == 0 && year2 % 100 != 0)
{
days = 29;
while (j < month2)
{
D2 = D2 + days;
j++;
}
if (j == month2)
{
D2 = D2 + day2;
}
} //尾年为闰计算天数
else
{
days = 28;
while (j < month2)
{
D2 = D2 + days;
j++;
}
if (j == month2)
{
D2 = D2 + day2;
}
}//尾年为平计算天数
if (Y > 0)
{
for (i = 1; year1 + i < year2; i++)
{
if ((year1 + i) % 400 == 0 || (year1 + i) % 4 == 0 && (year1 + i) % 100 != 0)
{
spy++;
}
}
} //计算中间闰年
total=D1+D2+365*Y+spy;
if(year1==year2)
{
total=total-D1-d1;
}
printf("D1=%d,D2=%d.d1=%d\n",D1,D2,d1);
final:
printf("你在这个世界上总共生存了%d天\n", total);
return 0;
}
======================================================================
dev结果:
请输入你的生日(如1988-05-20):2021-10-7
请输入今天的日期(如2016-03-28):2022-10-7
D1=85,D2=280.d1=280
你在这个世界上总共生存了365天
======================================================================
vscode结果:
请输入你的生日(如1988-05-20):2021-10-7
请输入今天的日期(如2016-03-28):2022-10-7
D1=84,D2=33038.d1=281
你在这个世界上总共生存了33691天
======================================================================
为什么会这样,是编译器的问题吗
本帖最后由 桃花飞舞 于 2022-10-7 22:08 编辑
dev的结果是正确的,你可以自己计算下,vscode的D2=33038的值明显的不对d1=281的值比280多了1也不对不过误差不大,这要看你的D2是干什么的了,暂时没看懂你的D2是什么值? 本帖最后由 jackz007 于 2022-10-8 00:39 编辑
试试这个代码,看看有没有差别
#include <stdio.h>
#include <time.h>
void today(int * year , int * month , int * day)
{
time_t T ;
struct tm * TM ;
time(& T) ;
TM = localtime(& T) ;
* year = TM -> tm_year + 1900 ;
* month= TM -> tm_mon+ 1 ;
* day = TM -> tm_mday ;
}
int leapyear(int y)
{
return ((! (y % 4) && y % 100) || ! (y % 400)) ? 1 : 0 ;
}
int monthdays(int y , int m)
{
int r , md[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} ;
r = 0 ;
if(y >= 1900 && y <= 2999 && m > 0 && m < 13) {
r = md ;
if(leapyear(y) && m == 2) r += 1 ;
}
return r ;
}
int check(int y , int m , int d)
{
int e , r ;
r = 0 ;
if(y >= 1900 && y <= 2999 && m > 0 && m < 13 && d >= 1 && d <= monthdays(y , m)) r = 1 ;
return r ;
}
int days(int y[] , int m[] , int d[])
{
int a , b , ds ;
ds = 0 ;
if(y > y || (y == y && m < m) || (y == y && m == m) && d <= d) {
if(y == y && m == m) {
ds = d - d ;
} else if(y == y) {
ds = monthdays(y , m) - d ;
for(b = m + 1 ; b < m ; b ++) ds += monthdays(y , b) ;
ds += d ;
} else {
ds = monthdays(y , m) - d ;
for(b = m + 1 ; b < 13 ; b ++) ds += monthdays(y , b) ;
for(a = y + 1 ; a < y ; a ++) ds += (leapyear(a)) ? 366 : 365 ;
for(b = 1 ; b < m ; b ++) ds += monthdays(y , b) ;
ds += d ;
}
}
return ds + 1 ;
}
int years(int y[] , int m[] , int d[])
{
int ys , a ;
ys = 0 ;
if(y > y) {
ys = y - y ;
if(m > m || (m == m && d > d)) ys -- ;
}
return ys ;
}
int main(void)
{
int y , m , d ;
today(& y , & m , & d) ;
printf("今天是 : %4d-%02d-%02d\n" , y , m , d) ;
printf("输入您的出生日期 (y-m-d) : ") ;
scanf("%d-%d-%d" , & y , & m , & d) ;
if(check(y , m , d) && (y < y || (y == y && m < m) || (y == y && m == m && d <= d))) {
printf("今天是阁下生命中的第 【%5d】 天!\n" , days(y , m , d)) ;
if(m == m && d == d) {
printf(" 今天是阁下 【%2d】 周岁的生辰!\n" , years(y , m , d)) ;
printf(" 祝阁下生日快乐!\n") ;
} else {
printf(" 阁下已经 【%2d】 周岁了!\n" , years(y , m , d)) ;
}
} else {
printf("日期输入错误!") ;
}
}
页:
[1]