| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3214 人关注过本帖
标题:本周的新作业
只看楼主 加入收藏
badmen
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2004-7-1
收藏
 问题点数:0 回复次数:21 
本周的新作业

这周老师给布置一这么一题:

编一个年历的程序,当给出年的时候,输出整年的日历,要求标明星期一至日;当给出某年某月时,输出某年某月的日历,也要求标明星期一至日。

请问我该如何着手?我们这周学的是if...else...if,while,do...while,for,switch等语法。还没学函数。

搜索更多相关主题的帖子: 作业 日历 switch else 年历 
2004-07-05 00:50
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

#include<iostream> #include<cstdlib> using namespace std;

int main() { int year = 0; bool isLeapYear = false; int daySum = 0; int days = 0;

cout<<"Enter a year\n"; cin>>year; int temp = 0; int weekday = 0; int month = 1; if(year<=2004) { temp = year; while(temp!=2004) { isLeapYear = (temp % 4 == 0) && ((temp % 100 != 0) || (temp % 400) == 0); temp++; if(isLeapYear) daySum += 366; else daySum += 365; } daySum += 186; weekday = (1 - (daySum%7) + 7)%7; } else { temp = 2004; daySum += 180; temp++; while(temp<year) { isLeapYear = (temp % 4 == 0) && ((temp % 100 != 0) || (temp % 400) == 0); temp++; if(isLeapYear) daySum += 366; else daySum += 365; } weekday = 1 + (daySum%7); }

char theweekday[10]; switch(weekday) { case 1: strcpy(theweekday, "Monday"); break; case 2: strcpy(theweekday, "Tuesday"); break; case 3: strcpy(theweekday, "Wednesday"); break; case 4: strcpy(theweekday, "Thursday"); break; case 5: strcpy(theweekday, "Friday"); break; case 6: strcpy(theweekday, "Saturday"); break; case 7: strcpy(theweekday, "Sunday"); break; } for(month = 1; month<=12; month++) { switch(month) { case 1: cout<<"January\n"; break; case 2: cout<<"February\n"; break; case 3: cout<<"March\n"; break; case 4: cout<<"April\n"; break; case 5: cout<<"May\n"; break; case 6: cout<<"June\n"; break; case 7: cout<<"July\n"; break; case 8: cout<<"August\n"; break; case 9: cout<<"September\n"; break; case 10: cout<<"October\n"; break; case 11: cout<<"November\n"; break; case 12: cout<<"December\n"; break; } isLeapYear = (year % 4 == 0) && ((year % 100 != 0) || (year % 400) == 0); if(month == 2 && isLeapYear) days = 29; else if(month == 2) days = 28; else if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) days = 31; else days = 30; cout<<"Mon Tue Wed Thu Fri Sat Sun\n"; if(weekday == 0) weekday = 7; for(int j =0; j<4*(weekday)-2; j++) cout<<' '; weekday = weekday % 7; for(int i = 1; i<=days; i++) { if(weekday == 0) { cout<<i<<endl; if(i<9) cout<<" "; else cout<<" "; } else if(i<9) cout<<i<<" "; else cout<<i<<" "; weekday++; weekday = weekday%7; } cout<<endl; } system("pause"); return 0; }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-07-06 09:06
badmen
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2004-7-1
收藏
得分:0 

thank kai,可你用的头文件,我们还没学到,对于如何判断年月,我已经写出代码了,我现在的难题是关于日历的排序,怎么才能确定最后输入的日历是正确的?你的程序中这部分我没看懂。

2004-07-06 18:11
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

我来说说我的算法,算法是最主要的,有了一个好的算法,接下来的就是把算法落实为代码了。

我写程序的那天是7月5号。星期一。 以这一天为参照日,就可以知道任何一年的第一天为星期几。

我们首先求得那天和7月5号之间的差距,也就是他们之间相差几天,然后%7, 如果正好为0, 那么那一天也是星期一,确定是星期几,用这样一个算式对于年份小于等于2004 来说: (1 - daydistance%7+7)%7

同样的对于年份大于2004 的来说,我们也是求出 那一年的第一天与2004年7月5号之间的差值(daydistance), 将他%7 不过确定星期几的算式是另外一个 :1+daydistance%7

现在你知道了,那一年的第一天是星期几,接下来的依次推了。

关于那个头文件,他只是C++中用于输出输入的一个头文件, 如果我将cin 改为 scanf, 将cout 改为 printf, 那么就可将头文件iostream 改为 stdio.

我这里贴出的那个程序还不是OOP 程序,如果要写OOP程序,就要写一个 Kalender 的class 将相关的计算和打印工作都作为方法写入Kalender这个类中,在主程序中,也就是main 中 建立 类的对象, 以对象调用类中的方法即可,考虑到你的程序为c程序,所以就以过程化来写了。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-07-07 13:16
badmen
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2004-7-1
收藏
得分:0 

哦,我按你的思路分析一下,然后再看看自己还有什么问题需要请教的。

谢谢kai

2004-07-07 13:29
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

// 刚才有一处还是忘了改了,现在完全改过了。

#include<stdlib.h> #include<stdio.h>

int main() { int year = 0; bool isLeapYear = false; int daySum = 0; int days = 0;

printf("Enter a year\n"); scanf("%d", &year); int temp = 0; int weekday = 0; int month = 1; if(year<=2004) { temp = year; while(temp!=2004) { isLeapYear = (temp % 4 == 0) && ((temp % 100 != 0) || (temp % 400) == 0); temp++; if(isLeapYear) daySum += 366; else daySum += 365; } daySum += 186; weekday = (1 - (daySum%7) + 7)%7; } else { temp = 2004; daySum += 180; temp++; while(temp<year) { isLeapYear = (temp % 4 == 0) && ((temp % 100 != 0) || (temp % 400) == 0); temp++; if(isLeapYear) daySum += 366; else daySum += 365; } weekday = 1 + (daySum%7); }

for(month = 1; month<=12; month++) { switch(month) { case 1: printf("January\n"); break; case 2: printf("February\n"); break; case 3: printf("March\n"); break; case 4: printf("April\n"); break; case 5: printf("May\n"); break; case 6: printf("June\n"); break; case 7: printf("July\n"); break; case 8: printf("August\n"); break; case 9: printf("September\n"); break; case 10: printf("October\n"); break; case 11: printf("November\n"); break; case 12: printf("December\n"); break; } isLeapYear = (year % 4 == 0) && ((year % 100 != 0) || (year % 400) == 0); if(month == 2 && isLeapYear) days = 29; else if(month == 2) days = 28; else if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) days = 31; else days = 30; printf("Mon Tue Wed Thu Fri Sat Sun\n"); if(weekday == 0) weekday = 7; for(int j =0; j<4*(weekday)-2; j++) printf(" "); weekday = weekday % 7; for(int i = 1; i<=days; i++) { if(weekday == 0) { printf("%d\n",i); if(i<9) printf(" "); else printf(" "); } else if(i<9) { printf("%d",i); printf(" "); } else { printf("%d",i); printf(" "); } weekday++; weekday = weekday%7; } printf("\n"); } system("pause"); return 0; }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-07-07 13:43
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 

kai 作为斑竹很敬业!

佩服!!


永不放弃!
2004-07-12 22:31
badmen
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2004-7-1
收藏
得分:0 
楼上的各位,我现在还没编出完整的程序代码,主要是在星期的确定上,思路一直捋不顺。我不知怎么去思考这个问题,版主那个思路我看得有些晕,哪位能给我写份伪代码或者流程图,谢谢!
2004-07-20 12:35
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

这道题其实不是很难,当然这也是相对来讲的。如果是初学编程的朋友就会觉得难了。

这样我把问题拆开来,你依次按我的要求把程序写出来。

你先写第一个程序, 题目为,我给你一个年份,要求程序能够判断是闰年还是平年。

你写完这个程序,我再让你做你下一步。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-07-21 01:40
ythome
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2004-7-17
收藏
得分:0 

我实在是佩服斑竹!不愧是高手中的高高手,你的这种算法我根本没想到!

2004-07-22 12:57
快速回复:本周的新作业
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018427 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved