工大在线

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3008|回复: 20
打印 上一主题 下一主题

[校园新闻] 西工“探索杯”编程大赛比赛样题

[复制链接]

18

主题

0

好友

93

积分

秀才

Rank: 3Rank: 3

该用户从未签到

西工币
2151 枚
好评度
0 点
声望
41 点
注册时间
2007-4-23
帖子
72
积分
93
UID
9687
跳转到指定楼层
#
发表于 2008-4-7 13:42:08 |只看该作者 |正序浏览
中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。

*问题分析与算法设计
根据题意可以将解题过程分为三步:
1)计算从1990年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若 余数为1,2,3,则他是在“打鱼”
否则 是在“晒网”
在这三步中,关键是第一步。求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:
如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽)
则 该年是闰年;
否则 不是闰年。
C语言中判断能否整除可以使用求余运算(即求模)

*程序说明与注释
#include<stdio.h>
int days(struct date day);
struct date{
int year;
int month;
int day;
};

int main()
{
struct date today,term;
int yearday,year,day;
printf("Enter year/month/day:");
scanf("%d%d%d",&today.year,&today.month,&today.day); /*输入日期*/
term.month=12; /*设置变量的初始值:月*/
term.day=31; /*设置变量的初始值:日*/
for(yearday=0,year=1990;year<today.year;year++)
{
term.year=year;
yearday+=days(term); /*计算从1990年至指定年的前一年共有多少天*/
}
yearday+=days(today); /*加上指定年中到指定日期的天数*/
day=yearday%5; /*求余数*/
if(day>0&&day<4) printf("he was fishing at that day.\n"); /*打印结果*/
else printf("He was sleeping at that day.\n");
}

int days(struct date day)
{
static int day_tab[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,},
};
int i,lp;
lp=day.year%4==0&&day.year%100!=0||day.year%400==0;
/*判定year为闰年还是平年,lp=0为平年,非0为闰年*/
for(i=1;i<day.month;i++) /*计算本年中自1月1日起的天数*/
day.day+=day_tab[lp];
return day.day;
}

此题难度同比稍大些[s:30] 计算机学院科协在食堂门口等着大家的到来。[s:19] [s:19]
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏0 顶!~顶!~0 扔鸡蛋~扔鸡蛋~0
我的西安工大~~~~~~

18

主题

0

好友

93

积分

秀才

Rank: 3Rank: 3

该用户从未签到

西工币
2151 枚
好评度
0 点
声望
41 点
注册时间
2007-4-23
帖子
72
积分
93
UID
9687
20#
发表于 2008-5-15 23:38:29 |只看该作者

回复 20楼 的帖子

看来LS真是个强人,那么请您做做决赛题,这个题作为决赛的第一个题,不知道LS几分钟能做完.我等着你的答案.
我的西安工大~~~~~~
回复

使用道具 举报

4

主题

0

好友

18

积分

书生

Rank: 2

该用户从未签到

西工币
1248 枚
好评度
0 点
声望
16 点
注册时间
2007-3-18
帖子
10
积分
18
UID
8703
19#
发表于 2008-5-15 15:21:33 |只看该作者
俄都快受不廖俩!

这算什么题目,学过数学的人做不出来就是脑残!

一群连C语言的关键字的打不熟的人还谈大赛?可笑不自量!
回复

使用道具 举报

18

主题

0

好友

93

积分

秀才

Rank: 3Rank: 3

该用户从未签到

西工币
2151 枚
好评度
0 点
声望
41 点
注册时间
2007-4-23
帖子
72
积分
93
UID
9687
18#
发表于 2008-5-8 21:45:38 |只看该作者

回复 18楼 的帖子

回复 18楼 的帖子
这个我遍了下,不能理解的地方换成了我的思想,当初做答案的时候没有运行,真是疏忽了,希望的家谅解。
下面的程序我运行了下,输入1990,1,1        1990,1,5运行成功要是还有疏漏的地方希望的家提出来.
#include<stdio.h>
typedef struct {
                int year;
                int month;
                int day;
               }Date,*P_date;/*在定义结构体的同时声明了类似"类型"的两个"类型",前一个为定义的该结构体类型;
                    后一个为,该结构体类型的指针类型.在后面可以直接用这两个类型声明变量.*/

int days(Date* day);

int main()
{
   P_date term,today;
   int yearday,year,day;
   printf("Enter year/month/day:");
     scanf("%d%d%d",&today->year,&today->month,&today->day); /*输入日期*/
   term->month=12; /*设置变量的初始值:月*/
   term->day=31; /*设置变量的初始值:日*/
   for(yearday=0,year=1990;year<today->year;year++)
     {
       term->year=year;
       yearday+=days(term); /*计算从1990年至指定年的前一年共有多少天*/
     }
   yearday+=days(today); /*加上指定年中到指定日期的天数*/
   day=yearday%5; /*求余数*/
   if(day>0&&day<4)
      printf("he was fishing at that day.\n"); /*打印结果*/
   else
      printf("He was sleeping at that day.\n");
getch();
}

int days(P_date day)
{
   int i,lp;
  static int day_tab[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,},
    };

  lp=day->year%4==0&&day->year%100!=0||day->year%400==0;/*判定year为闰年还是平年,lp=0为平年,非0为闰年*/
  for(i=1;i<day->month;i++) /*计算本年中自1月1日起的天数*/
     day->day+=day_tab[lp];
return day->day;
}
我的西安工大~~~~~~
回复

使用道具 举报

2

主题

0

好友

19

积分

书生

Rank: 2

该用户从未签到

西工币
1008 枚
好评度
0 点
声望
3 点
注册时间
2007-9-15
帖子
17
积分
19
UID
12190
17#
发表于 2008-5-8 20:54:17 |只看该作者
样题在TC 下测试 未通过,报告完毕!
回复

使用道具 举报

7

主题

0

好友

254

积分

举人

Rank: 4

该用户从未签到

西工币
759 枚
好评度
0 点
声望
235 点
注册时间
2006-9-12
帖子
136
积分
254
UID
3052
16#
发表于 2008-4-25 20:28:36 |只看该作者
#include "stdafx.h"

看见这个我现在就头大.

我已经不在win32下开发了.

毕业好多年了,也参加不了,估计也不要我..呵呵
回复

使用道具 举报

74

主题

7

好友

2301

积分

荣誉会员

荣誉会员

Rank: 8Rank: 8

该用户从未签到

西工币
8575 枚
好评度
11 点
声望
321 点
注册时间
2007-9-9
帖子
2036
积分
2301
UID
12104

灌水龙王奖 帖子大王 超级清洁员 天蝎座 寅虎

15#
发表于 2008-4-11 22:33:31 |只看该作者
呵呵~这个程序得研究,呵呵~不过有创意~
回复

使用道具 举报

18

主题

0

好友

93

积分

秀才

Rank: 3Rank: 3

该用户从未签到

西工币
2151 枚
好评度
0 点
声望
41 点
注册时间
2007-4-23
帖子
72
积分
93
UID
9687
14#
发表于 2008-4-11 22:24:54 |只看该作者

回复 14楼 的帖子

非常感谢,你是学哥??
爱好星际的……
我的西安工大~~~~~~
回复

使用道具 举报

7

主题

0

好友

199

积分

举人

Rank: 4

该用户从未签到

西工币
7896 枚
好评度
3 点
声望
325 点
注册时间
2006-5-27
帖子
33
积分
199
UID
278
13#
发表于 2008-4-11 21:25:41 |只看该作者
编程大赛   嘿嘿  可惜不在学校了 要不也想试试阿
随便写个  各路高手莫要见笑啊
混乱紧凑版:
#include "stdafx.h"
#include <time.h>
#include <stdlib.h>   
int _tmain(int argc, _TCHAR* argv[])
{
        char *f ="he was fishing at that day";
        char *s ="he was sleeping at that day";        
        char *a[5] = {f,f,f,s,s};
        struct tm t1 = {0};
        struct tm t2 = {0};
        t1.tm_year = 90 , t1.tm_mon =0  , t1.tm_mday = 1;
        printf("Enter year/month/day:\n");
         scanf("%d%d%d",&t2.tm_year,&t2.tm_mon,&t2.tm_mday);
        t2.tm_year = t2.tm_year - 1900 , t2.tm_mon = t2.tm_mon - 1;
        printf("%s\n",a[((int)((difftime(mktime(&t2),mktime(&t1)))/(24*3600)))%5]);        
        system("pause");
        return 0;
}
MM你贵庚 贵姓 贵三围?
回复

使用道具 举报

18

主题

0

好友

93

积分

秀才

Rank: 3Rank: 3

该用户从未签到

西工币
2151 枚
好评度
0 点
声望
41 点
注册时间
2007-4-23
帖子
72
积分
93
UID
9687
12#
发表于 2008-4-11 19:36:02 |只看该作者

回复 12楼 的帖子

是的,谢谢你的建议!![s:19]
我的西安工大~~~~~~
回复

使用道具 举报

3

主题

0

好友

88

积分

秀才

Rank: 3Rank: 3

该用户从未签到

西工币
1717 枚
好评度
4 点
声望
9 点
注册时间
2007-5-22
帖子
79
积分
88
UID
10463
11#
发表于 2008-4-11 16:59:30 |只看该作者
这个大赛不是面向计算机专业的吧~~~~~~     此题起码应该加个运行限定才算难题   (比如多少行代码内解决)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

手机版|xatubbs.com ( 苏ICP备11050183号 )

GMT+8, 2025-7-23 08:34 , Processed in 0.152001 second(s), 27 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部