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

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

前言

中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言实现程序解决问题。

任务要求:

基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。

开发环境

Visual Stdio 2019

算法设计

(1)判断输入日期的正确性,注意闰年天数和二月的日期;
(2)计算输入日期到2010年1月1日的天数;
(3)用所得到的天数除以5;
(4)所得到的余数若为1,2,3则这一天在打鱼,若为0,4则这一天在晒网。

代码

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include<iostream>
#include<stdio.h>
#include<fstream>
#define NUM 5
using namespace std;
//将输入的年月日储存在结构体中
struct Date
{
	int year;
	int month;
	int day;
}date;
//判断年份是否为闰年
int Leapyear(int year)
{
	int i, j;
	i = year;
	//如果是闰年就返回1,不是就返回0
	if (i % 4 == 0 && i % 100 != 0)
		j = 1;
	else if (i % 4 == 0)
		j = 1;
	else
		j = 0;
	return j;
}

//计算从2010年1月1日到现在一共多少天
int Time(int year, int month, int day)
{
	int T = 0;//T为距2010年1月1日共有几天
	//闰年每月的天数
	int leapyear[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
	//平年每月的天数
	int commonyear[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

	for (int i = year; i != 2010; i--)
		//如果距2010年中有闰年就增加366天
		if (Leapyear(i) == 1)
			T += 366;
		else //不是闰年就增加365天
			T += 365;

	if (Leapyear(year) == 1)
	{
		for (int j = 0; j < (month - 1); j++)
			T = T + leapyear[j];
	}
	else
		for (int k = 0; k < (month - 1); k++)
			T = T + commonyear[k];
	T = T + day;
	return(T);//返回距初始日期的总天数
}

//判断输入日期是否合法,若合法则返回1,不合法返回值为0
int Legal(int year, int month, int day)
{
	//年份不能小于2010年,月份不能大于12月
	if (year < 2010 || month >12)
		return 0;
	else
		if (month == 2)
		{
			if (Leapyear(year) == 1 && day > 29)//闰年2月天数不能超过29天
				return 0;
			else
				if (Leapyear(year) == 0 && day > 28)//平年2月天数不能超过28天
					return 0;
		}
		else //判断大月和小月的day值,大月不能大于31天,小于不能大于30天
			if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
		{
				if (day > 31 || day < 0)
					return 0;
		}
			else
			{
				if (day > 30 || day < 0)
					return 0;
			}
	return 1;
}
int main()
{
	int w;//总天数

	//读取写入文件操作
	ifstream fver ("input.txt");
	ofstream fver1 ("out.txt");
	ofstream fver2 ("judge.dat");

	//定义数组,将日期存入数组中
	int b[NUM][3];
	for (int i = 0; i < NUM; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			fver >> b[i][j];
		}
	}

	for (int i = 0; i < NUM; i++)
	{
		date.year = b[i][0];
		date.month = b[i][1];
		date.day = b[i][2];
		//判断文件中的日期是否合法
		if (Legal(date.year, date.month, date.day) == 0)
		{
			fver1 << "输入的日期不合法"<<endl;
			fver2 << "输入的日期不合法"<<endl;
		}
		else
		{
			//判断当天是在打鱼还是晒网
			w = Time(date.year, date.month, date.day);
			int a = w % 5;
			if (a == 1 || a == 2 || a == 3)
			{
				fver1 <<date.year<<"年"<<date.month<<"月"<<date.day<<"日"<< "这一天在打鱼"<<endl;
				fver2 << date.year << "年" << date.month << "月" << date.day << "日" << "这一天距2010年1月1日过了" << w - 1 << "天,这一天在打鱼" << endl;
			}
			else
			{
				fver1 << date.year << "年" << date.month << "月" << date.day << "日" << "这一天在晒网"<<endl;
				fver2 << date.year << "年" << date.month << "月" << date.day << "日" << "这一天距2010年1月1日过了" << w - 1 << "天,这一天在晒网" << endl;
			}
		}
	}
	//关闭文件
	fver.close();
	fver1.close();
	fver2.close();

	system("pause");
	return 0;
}



采用调用文件提取数据的方式,将测试日期输入input.txt文件中,运行程序,输出结果就会出现在out.txt文件中,在input.txt文件中最多可以测试5组数据,若要测试更多数据需要将代码中的NUM值进行更改。
在这里插入图片描述
在这里插入图片描述

心得体会

这次的程序编写让我知道了自己的对于语言的掌握还有很大的缺陷,在算法的编写上思考的还不是很到位,此次的作业让我对C++的文件读写和存储功能有了基本的掌握,但是还是存在着较大的问题,比如说此次的程序中,对于数据的提取次数是一个很大的问题,无论输入的日期有多少个,程序都只从input.txt文件中提取NUM次数据,只能手动修改程序中NUM的值,改变要测试的数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值