程序方法学作业一
题目:中国有句俗语叫“三天打鱼两天晒网”,某人从2010年1月1日开始“三天打鱼两天晒网”,问这个人在以后的某一天中是打鱼还是晒网。
作业思路
*问题分析与算法设计
根据题意可以将解题过程分为三步:
1)计算从2010年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若 余数为1,2,3,则他是在“打鱼”,否则 是在“晒网
- 在这三步中,关键是第一步。求从2010年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:
如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽)
则 该年是闰年;
否则不是闰年。
C语言中判断能否整除可以使用求余运算(即求模)。
程序源代码
在/*中国有句俗语叫“三天打鱼两天晒网”,某人从2010年1月1日开始“三天打鱼两天晒网”,
问这个人在以后的某一天中是打鱼还是晒网*/
#include<stdio.h>
#include<stdlib.h>
void panduan(int year,int month,int day)//该函数用来计算从2010年到指定日期的总天数
{
int i=2010,j=1,sum=0; //i为开始年份,j为月份,sum为间隔总天数
for(i=2010;i<year;i++) //年相加
{
if((i%4==0&&i%100!=0)||i%400==0)//判断是否是闰年
sum+=366;
else
sum+=365;
}
for(j=1;j<month;j++) //月相加
{
if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
sum+=31;
else if(j==4||j==6||j==9||j==11)
sum+=30;
else if(j==2&&((year%4==0&&year%100!=0)||year%400==0))
sum+=29;
else
sum+=28;
}
sum+=day; //日相加
printf("从2010年到指定日期总共%d天\n",sum);
if(sum%5==1||sum%5==2||sum%5==3)
printf("他在打鱼!\n");
else
printf("他在晒网!\n");
}
void main()
{
int year=0,month=0,day=0,a=0,b=0,i=2010;//a为 判断操作
printf("-----------判断---------\n");
printf("1.判断打鱼or晒网\n");
printf("2.文件测试\n");
printf("请输入操作:\n");
scanf("%d",&a);
if(a==1)//判断在打鱼还是在晒网
{
printf("请输入要判断的日期(中间用空格分开):\n");
scanf("%d %d %d",&year,&month,&day);
if(year<i||month>12||day>31)//判断输入日期是否正确
{
printf("输入有误,请重新输入日期!\n");
scanf("%d %d %d",&year,&month,&day);
}
panduan(year,month,day);
}
else if(a==2)//文档测试
{
FILE *fp1;
FILE *fp2;
fp1=fopen("in.txt","r");
fp2=fopen("out.txt","w");
if(fp1==NULL)//判断文件in.txt是否为空
{
printf("无法打开该文件,请按任意键退出!\n");
exit(1);
}
else if(fp2==NULL)//判断文件out.txt是否为空
{
printf("无法打开该文件,请按任意键退出!\n");
exit(1);
}
else
/*用读写函数fscanf()和fprintf()读取文件in.txt和out.txt中的信息*/
fscanf(fp1,"%d%d%d",&year,&month,&day);//
panduan(year,month,day);
fprintf(fp2,"%ld",&b);
fclose(fp1);//关闭文件
fclose(fp2);
}
}这里插入代码片
总结
第一次在博客上发表东西,很不熟练。有很多步骤不会操作,但我相信孰能生巧,以后要多发表。这次的作业因为老师有提示解题思路,所以基本的要求自己还是可以做到,尽管算法不是最精简的,但对于我来说是容易理解的,以后还要多加思考其他的解题思路,对于提高要求中的文档测试,以前写程序时完全没有写过,所以刚开始一头雾水,所以在网上查了些资料,也翻阅了c语言书上关于文档的知识。
总的来说,我自己基础比较弱,动手能力不够,作为计算机专业的学生,我理论知识可能比较强一点,但真正动手敲代码还是很弱,这点我确实需要改进,而且对于测试,以后还得多加练习。还有一点需要改正的地方是,在拿到一道题目后,不能直接写程序,而是先要设计思路(画流程图),再写程序,最后还要进行调试和测试。