程序方法学作业总结

本文探讨了一个基于“三天打鱼两天晒网”俗语的算法问题,通过计算从2010年1月1日至指定日期的天数,判断某人在特定日期是在打鱼还是晒网。涉及日期计算、闰年判断及周期性活动判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序方法学作业一
题目:中国有句俗语叫“三天打鱼两天晒网”,某人从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语言书上关于文档的知识。
总的来说,我自己基础比较弱,动手能力不够,作为计算机专业的学生,我理论知识可能比较强一点,但真正动手敲代码还是很弱,这点我确实需要改进,而且对于测试,以后还得多加练习。还有一点需要改正的地方是,在拿到一道题目后,不能直接写程序,而是先要设计思路(画流程图),再写程序,最后还要进行调试和测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值