求指导,求一个编程。

nimbleChen 2012-04-07 05:09:14
题目:输入年月日,输出该天是该年第几天.
最好用初学者会的语言编写,先感谢各位啦,谢谢!
...全文
279 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
muyi66 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
该条件的放置有什么影响呢?
[/Quote]放在循环体里导致每次循环都会执行一次判断,运行效率低了。
nimbleChen 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:

用不着这么长的switch,利用数组就能大幅度简化它。
C/C++ code
#include<stdio.h>
main()
{
int year,month,days;
int i,d,s;
int monthdays[]={31,28,31,30,31,30,31,31,30,31,30,31};
printf("Please input the……
[/Quote]该条件的放置有什么影响呢?
loongee 2012-04-08
  • 打赏
  • 举报
回复
原理就是将用户输入的日期减去当年1月1日,得到两个时间的差值(单位是秒),最终将秒转换成天即是结果。

[Quote=引用 14 楼 的回复:]

引用 13 楼 的回复:

给个不一样的,不过貌似不太适合初学者

C/C++ code

#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "memory.h"

int main()
{
time_t t1;
time_t t2;
struct tm Time;
memset(……
[/Quote]
忘世麒麟 2012-04-08
  • 打赏
  • 举报
回复
我记得有一本C语言(英文版)教材上就有这道题得题目一模一样,答案也有.就是学校发的教材,没准你的就是.
22too 2012-04-08
  • 打赏
  • 举报
回复
我也是初学者!
ioaq 2012-04-07
  • 打赏
  • 举报
回复

#include<stdio.h>

int main()
{
int y, m, d;
int a[13] = {0,31,0,31,30,31,30,31,31,30,31,30,31};

while( scanf("%d%d%d",&y,&m,&d)==3 )
{
int i, num;

a[2] = y % ( y % 100 ? 4 : 400 ) ? 28 : 29;
if ( d<1 || d>a[m] || m<1 || m>12 )
{
printf("输入错误!\n请重新输入日期:\n\n");
}
else
{
for( i=1, num=0; i<m; i++ )
{
num += a[i];
}
num += d; //这一年的第几天
printf("%d\n",num);
}
}

return 0;
}
ioaq 2012-04-07
  • 打赏
  • 举报
回复
#include<stdio.h>

int main()
{
int y, m, d;
int a[13] = {0,31,0,31,30,31,30,31,31,30,31,30,31};

while( scanf("%d%d%d",&y,&m,&d)==3 )
{
int i, num;

a[2] = y % ( y % 100 ? 4 : 400 ) ? 28 : 29;
if ( d<1 || d>a[m] || m<1 || m>12 )
{
printf("输入错误!\n请重新输入日期:\n\n");
}
else
{
for( i=1, num=0; i<m; i++ )
{
num += a[i];
}
num += d; //这一年的第几天
printf("%d\n",num);
}
}

return 0;
}
ioaq 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

给个不一样的,不过貌似不太适合初学者

C/C++ code

#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "memory.h"

int main()
{
time_t t1;
time_t t2;
struct tm Time;
memset(&Time, 0……
[/Quote]


求详细解释
loongee 2012-04-07
  • 打赏
  • 举报
回复
给个不一样的,不过貌似不太适合初学者


#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "memory.h"

int main()
{
time_t t1;
time_t t2;
struct tm Time;
memset(&Time, 0 , sizeof(Time));

// 输入日期
scanf("%d %d %d", &Time.tm_year, &Time.tm_mon, &Time.tm_mday);
Time.tm_year -= 1900; // 年份减去1900
Time.tm_mon -= 1; // 月份减1

// 略去有效性检查
t1 = mktime(&Time);
Time.tm_mon = Time.tm_mday = 0;
t2 = mktime(&Time);

printf("%d\n", (t1 - t2) / 60 / 60 / 24);

system("pause");
return 0;
}
AnYidan 2012-04-07
  • 打赏
  • 举报
回复

#include <stdlib.h>
#include <stdio.h>
static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
/* day_of_year: set day of year from month & day */
int day_of_year(int year, int month, int day)
{
int i, leap;
leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
for (i = 1; i < month; i++)
day += daytab[leap][i];
return day;
}

/* month_day: set month, day from day of year */
void month_day(int year, int yearday, int *pmonth, int *pday)
{
int i, leap;
leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
for (i = 1; yearday > daytab[leap][i]; i++)
yearday -= daytab[leap][i];
*pmonth = i;
*pday = yearday;
}
int main()
{
int m, d;
month_day(1988, 60, &m, &d);
printf("%d month %d date\n", m, d);
system("pause");
}



the c programming language
muyi66 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

是不是我多虑了,是否需要判断闰年呢?
[/Quote]那么3月1号是第几天?
shyb01 2012-04-07
  • 打赏
  • 举报
回复
是不是我多虑了,是否需要判断闰年呢?
muyi66 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

用不着这么长的switch,利用数组就能大幅度简化它。
C/C++ code
#include<stdio.h>
main()
{
int year,month,days;
int i,d,s;
int monthdays[]={31,28,31,30,31,30,31,31,30,31,30,31};
printf("Please input t……
[/Quote]因为是改别人的程序,我一般认为改动应该尽量少一点。另外一个原因是不想变更数组,因为这个数组有可能被反复使用。如果他的程序改成可以多次计算的形式,那已经变更的数组就是个麻烦了。
icemornings 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

用不着这么长的switch,利用数组就能大幅度简化它。
C/C++ code
#include<stdio.h>
main()
{
int year,month,days;
int i,d,s;
int monthdays[]={31,28,31,30,31,30,31,31,30,31,30,31};
printf("Please input the num……
[/Quote]

不知道你为什么把条件判断放在循环里面
改了一下你的代码:

int main(int argc, char **argv)
{
int year, month, days;
int month_day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int i, sum;

scanf("%d%d%d", &year, &month, &days);

// 略去参数合法性检查

if ((year % 4 == 0) && (year % 100 != 0) ||
(year % 400 == 0))
{
month_day[1] = 29;
}

sum = 0;
for (i = 1; i < month; ++i)
{
sum += month_day[i - 1];
}

sum += days;

printf("%d\n", sum);
return 0;
}
muyi66 2012-04-07
  • 打赏
  • 举报
回复
用不着这么长的switch,利用数组就能大幅度简化它。
#include<stdio.h>
main()
{
int year,month,days;
int i,d,s;
int monthdays[]={31,28,31,30,31,30,31,31,30,31,30,31};
printf("Please input the numbers year,month,day:\n");
scanf("%d%d%d",&year,&month,&days);
s=0;
for(i=1;i<month;i++)
{
s+=monthdays[i-1];
if(i==2&&((year%4==0)&&(year%100!=0)||(year%400==0))) // 这里的条件是百年不润
s++;
}
printf("%d年%d月%d日是这年的%d天\n",year,month,days,s+days);
}
nimbleChen 2012-04-07
  • 打赏
  • 举报
回复
#include<stdio.h>
viod main()
{
int year,month,days;
int i,d,s;
printf("Please input the numbers year,month,day:\n");
scanf("%d%d%d",&year,&month,&days);
s=0;
for(i=1;i<month;i++)
{
switch(i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
d=31;
break;
case 4:
case 6:
case 9:
case 11:
d=30;
break;
case 2:
if((year%4==0)&&(year%100==0)||(year%400==0))
d=29;
else
d=28;
break;
}
s+=d;
}
printf("%d年%d月%d日是这年的%d天\n",year,month,days,s+days);
}
不知道对不对。
muyi66 2012-04-07
  • 打赏
  • 举报
回复
那你先贴出你自己写的,我们看看能不能给你改短。
nimbleChen 2012-04-07
  • 打赏
  • 举报
回复
难倒是不难,但是写出来太长,想让各位写写,看看能否写短一点,借鉴一下。
loongee 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

太难了,不会……
[/Quote]

确实好难啊~~~
baichi4141 2012-04-07
  • 打赏
  • 举报
回复
太难了,不会……
加载更多回复(1)

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧