三天打鱼两天晒网C++实现

三天打鱼两天晒网C++实现


问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
问题分析
)计算从2010年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除取余;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若 余数为1,2,3,则他是在“打鱼”
否则 是在“晒网” 。
程序设计
创建一个date类,包含年月日。创建一个distance函数用于计算指定日期到2010年1月1日的天数。创建一个一个方法meath用于判断打鱼或者晒网。创建一个数据读取read函数用于把读取数据存入到磁盘钟,。创建一个文件写入函数write用于把文件数据读入数组中。创建一个text函数用于判断函数英语判断输入数据是否有误,在write函数中调用text函数用于判断输入。主函数调用write函数读数据,read函数写数据,把读取数据一一放入distance函数求天数,其返回值传入meath函数中判断打鱼或者晒网并输出并保存。

程序框架在这里插入图片描述

#include<iostream>
#include<fstream>
using namespace std;
class date {//创建一个日期类
public:
	int year;
	int month;
	int day;
	date(int a, int b, int c) {//构造函数
		year = a;
		month = b;
		day = c;
	}
	date();
};
//定义一个distance函数用于计算从2010年1月1日起至今的天数
int  distance(date d1, date d2) {
	int y = d2.year - d1.year;//从2110年到今年的年数
	int dis = 0;//用于记录天数
	int year = d2.year - 1;
	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} };//二维数组储存闰年和平年每月的天数
	for (int i = 1; i <= y; i++) {//计算2010年1月1日起到今年的前一年天数
		year = year - 1;
		if (((year) % 4 == 0 && (year) % 100 != 0) || year % 400 == 0)//判断是否闰年
			dis = dis + 366;//闰年加366天
		else
			dis = dis + 365;//平年加365天
	}
	//计算截止这个月前的天数总和
	if (d2.year % 4 == 0 && d2.year % 100 != 0 || d2.year % 400 == 0) {//判断是否闰年
		for (int i = 1; i < d2.month; i++) {//闰年二月加29天
			dis = dis + day_tab[1][i];
		}
	}
	else//不是闰年二月加28天
	{
		for (int i = 1; i < d2.month; i++) {//平年二月加28天
			dis = dis + day_tab[0][i];
		}
	}
	dis = dis + d2.day;
	return dis;//返回天数
}
//函数meath用于判断是否打鱼或者晒网
void meath(long int dis) {
	int n = dis % 5;
	if (n == 1 || n == 2 || n == 3)
		cout << "今天在打鱼!" << endl;
	else
		cout << "今天在晒网!" << endl;
}
//测试函数用于判断输入数据的正确性
int  text(int d) {
	int year = d / 10000;
	int month = d % 10000 / 100;
	int day = d % 100;
	if (year < 2010) {
		cout << "数据输入年份出错,请重新输入数据" << endl;
		return 1;
	}
	if (0 > month || month > 12) {//判断月份
		cout << "数据输入月份出错,请重新输入数据" << endl;
		return 1;
	}
	if (month == 2) {//判断是否闰年
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			if (day > 29) {//闰年二月小于29天
				cout << "数据输入天数出错,请重新输入数据" << endl;
				return 1;
			}
			}
		else {//平年二月小于28天
			if (day > 28) {
				cout << "数据输入天数出错,请重新输入数据" << endl;
				return 1;
			}
		}

	}
	if(month == 4 || month == 6 || month == 9 || month == 11){//判断天数
		if (day > 30) {
			cout << "数据输入天数出错,请重新输入数据" << endl;
			return 1;
		}
     }
	else {
		if (day > 31) {//判断天数
			cout << "数据输入天数出错,请重新输入数据" << endl;
			return 1;
		}
	}
		return 0;
}
//创建一个write函数用于文件的写入
void write(int d[], int n) {

	ofstream outfile("D:f2.txt", ios::out);//打开文件流
	if (!outfile) {
		cerr << "open error !" << endl;
		exit(1);
	}
	cout << "请输入要查询的日期,并自动存入磁盘f2中:" << endl;
	for (int i = 0; i < n; i++) {//读取数据并判断
		cin >> d[i];//读取数据
		int f=text(d[i]);
		if (f) {//数据输入错误从新输入
			i--;
			continue;
		}
		outfile << d[i] << " ";//输出磁盘中的数据
	}
	outfile.close();//关闭文件
}
//创建read函数用于读取磁盘中的数据
void read(int d[], int n) {

	int i = 0;
	ifstream infile("D:f2.txt", ios::in);
	if (!infile) {
		cerr << "open error!" << endl;
		exit(1);
	}
	cout << endl;
	cout << "磁盘f2.txt中的数据为:" << endl;
	for (int i = 0; i < n; i++) {
		infile >> d[i];
		cout << d[i] << " ";
	}
	cout << endl;
	cout << endl;
	infile.close();
}
	int  main() {
		 int distance(date, date);
		int i = 0;
		int n;//记录输入输个数
		int dis;//记录天数
		date start(2010, 1, 1);
		cout<<"请输入要保存数据的个数"<<endl;
		cin >> n;
		int *d = new int[n];//创建数组用于存放从磁盘中读取的数据
		date today(2012, 2, 6);
		write(d,n);//储存数据
		read(d,n);//读取数据
		cout << "判断结果为:" << endl;
		for (int i = 0; i < n; i++) {
			today.year = d[i] / 10000;//分割数据year
			today.month = d[i] % 10000 / 100;//分割数据month
			today.day = d[i] % 100;//分割数据day
			cout << d[i]<<" ";
			dis = distance(start, today);//判断是否闰年
			meath(dis);//判断今天是大于或者晒网
		}
		return 0;
	}

调试截图
在这里插入图片描述
测试截图
在这里插入图片描述
心得体会
在计算从开始日期到指定日期的天数时,可以先计算中间间隔多少年,然后在判断每一年是否是闰年,把每年的天数相加,在计算指定天数到1月的月数,如果指定月数等于二月则判断是否闰年,把天数放入二维数组里面,一组下标代表闰年,一组代表平年,循环相加的月份天数,最后再加剩下的天数。步骤:(1)判读是否闰年,(2)计算间隔年数的天数总和,(3)计算今年间隔月数的天数总和,(4)计算间隔天数总和。## 标题

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值