C++ 自制 TIME日期运算函数(自带注释以及帮助函数)

#include <iostream>
#include <windows.h>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <conio.h>
using namespace std;

//最大使用数组 天数 
//1095000 3000年 
#define MAX 1095000
#define MAX_ 100
//建立日期结构体 
struct Time {
    int y;     
    int m;
	int n;   
};

Time time_MAX[MAX];
int MN[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int MN_[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

//根据年月输出日 
int  f(int y,int m){
	if((y%4==0&&y%100!=0)||y%400==0){
		return MN_[m];
	}
	return MN[m];
}

//判断日期是否相等
bool Time_XX(Time time_1,Time time_2){
	if(time_1.y==time_2.y&&time_1.m==time_2.m&&time_1.n==time_2.n){
		return 1;
	}
	return 0;
}

//打印日期 
void Time_p(Time time){
	printf("%d %d %d\n",time.y,time.m,time.n);
	return;
}

//遍历Y年到YY年 存入数组 time_MAX[MAX] 
void Time_Y(int Y,int YY,int t=0,Time time[]=time_MAX){
	int ii=1;
	for(int i=Y;i<=YY;i++){
		for(int j=1;j<=12;j++){
			for(int z=1;z<=f(i,j);z++){
				time[ii].y=i;
				time[ii].m=j;
				time[ii].n=z;
				if(t!=0)
					Time_p(time[ii]);
				ii++;
			}
		}
	}
	return;
} 
//搜索食品保质期(算差x天) 
Time Time_X(Time time_x,int x,Time time[]=time_MAX){
	//初始化3000年 
	Time_Y(time_x.y-MAX_,time_x.y+MAX_);
	
	for(int i=1;i<=MAX;i++){
		if(Time_XX(time_x,time_MAX[i])){
			return time_MAX[i+x];
		}
	}
} 

void Time_help(){
	Time time_x;
	int x; 
	
	int y;
	int m;
	Time time_1;
	Time time_2;
	
	int t=-1; 
	for(;;){
		cout<<"功能1:根据年月输出日"<<endl; 
		cout<<"功能2:判断日期是否相等 Time_XX(Time time_1,Time time_2)"<<endl;
		cout<<"功能3:打印日期 Time_p(Time time)"<<endl;
		cout<<"功能4:遍历Y年到YY年 存入数组 time_MAX[MAX] Time_Y(int Y,int YY,int t=0,Time time[]=time_MAX) "<<endl; 
		cout<<"功能5:搜索食品保质期(算差x天) Time_X(Time time_x,int x,Time time[]=time_MAX)"<<endl;
		cout<<endl;
		cout<<"输入序号(输入0关闭):"<<endl;
		cin>>t;
		if(t==1){
			cout<<"输入年和月:"<<endl; 
			cin>>y>>m;
			cout<<y<<"年"<<m<<"月有"<<f(y,m)<<"天"<<endl;
		}else if(t==2){
			string a[2]={"不相等","相等"} ;
			cout<<"输入日期1:"<<endl; 
			cin>>time_1.y>>time_1.m>>time_1.n;
			cout<<"输入日期2:"<<endl;
			cin>>time_2.y>>time_2.m>>time_2.n;
			cout<<a[Time_XX(time_1,time_2)]<<endl;
		}else if(t==3){
			cout<<"输入日期1:"<<endl; 
			cin>>time_1.y>>time_1.m>>time_1.n;
			Time_p(time_1);
		}else if(t==4){
			int Y,YY;
			cout<<"输入Y和YY:"<<endl;
			cin>>Y>>YY; 
			Time_Y(Y,YY,1);
		}else if(t==5){
			cout<<"输入日期:"<<endl; 
			cin>>time_x.y>>time_x.m>>time_x.n;
			cout<<"输入保质期(100年之内 可改)(单位:天):"<<endl;
			cin>>x;
			cout<<"最佳食用期到:"<<endl;
			Time_p(Time_X(time_x,x)); 
		}else if(t==0){
			break;
		} 
		Sleep(1000);
		system("cls");
	}
	return;
} 

int main(){
	cout<<"我能干什么?"<<endl;
	cout<<"打开帮助函数Time_help()"<<endl; 
	cout<<"正在打开!"<<endl;
	Sleep(3000);
	system("cls"); 
	Time_help();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是用C++代码实现扫描线填充算法的函数,并附有注释: ```cpp struct Point { int x, y; Point(int x = 0, int y = 0) : x(x), y(y) {} }; bool operator<(const Point& a, const Point& b) { return a.y < b.y; // 按 y 坐标排序 } void scanLineFill(vector<Point>& points) { sort(points.begin(), points.end()); // 按 y 坐标排序 int ymin = points[0].y, ymax = points.back().y; // 扫描线的起始和结束 y 坐标 vector<vector<int>> edgeTable(ymax - ymin + 1); // 边表 for (int i = 0; i < points.size(); ++i) { // 建立边表 int x1 = points[i].x, y1 = points[i].y; int x2 = points[(i + 1) % points.size()].x, y2 = points[(i + 1) % points.size()].y; if (y1 == y2) continue; // 忽略水平边 if (y1 > y2) swap(x1, x2), swap(y1, y2); // 保证 y1 < y2 double k = double(x2 - x1) / (y2 - y1); // 斜率 for (int y = y1 + 1; y <= y2; ++y) { int x = int(x1 + k * (y - y1) + 0.5); // 计算交点的 x 坐标,四舍五入取整 edgeTable[y - ymin].push_back(x); // 将交点加入边表 } } vector<int> activeEdge; // 活动边表 for (int y = ymin; y <= ymax; ++y) { // 扫描线从上往下扫描 for (int i = 0; i < edgeTable[y - ymin].size(); ++i) { activeEdge.push_back(edgeTable[y - ymin][i]); // 将新边加入活动边表 } sort(activeEdge.begin(), activeEdge.end()); // 活动边表按 x 坐标排序 for (int i = 0; i < activeEdge.size(); i += 2) { // 每对相邻的边构成一个填充区间 int x1 = activeEdge[i], x2 = activeEdge[i + 1]; for (int x = x1 + 1; x < x2; ++x) { // 填充 } } for (int i = 0; i < activeEdge.size(); ++i) { if (edgeTable[y - ymin].size() == 0) break; // 所有边均已加入活动边表 if (activeEdge[i] == edgeTable[y - ymin][0]) { activeEdge.erase(activeEdge.begin() + i); // 边界点,从活动边表中删除 edgeTable[y - ymin].erase(edgeTable[y - ymin].begin()); // 从边表中删除 --i; } } } } ``` 注释中已经对算法的实现进行了说明,以下是简要的算法流程: 1. 将所有顶点按照 y 坐标从小到大排序,得到扫描线的起始和结束 y 坐标; 2. 建立边表,对于每条边,计算其与扫描线的交点,并将交点按照 x 坐标加入边表; 3. 扫描线从上往下扫描,每遇到一个 y 坐标,将其对应的交点加入活动边表,并按照 x 坐标排序; 4. 遍历活动边表,将每对相邻的边构成的区间进行填充; 5. 扫描完该 y 坐标对应的所有交点后,从活动边表中删除已经处理完毕的边,从边表中删除已经处理完毕的边。 注意:在代码中的填充操作并未给出具体实现,需要根据具体需求进行实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

推演者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值