1. 运行时直接显示当前第几周
2. 输入日期后显示该日期是第几周
3. 支持设置开学日期4. 也可以输入周的序号,比如 18,显示是几号到几号
#include#include #include #include int abs(int a, int b); int IsLeap(int year); int Days(int y, int m, int d); int DiffDays(int y1, int m1, int d1, int y2, int m2, int d2);
主函数
int main() {
int start_y, start_m, start_d;
int end_y=-1, end_m=-1, end_d=-1;
int day_dif, delta, weeks;
printf("-------时间格式 yyyy mm dd----------输错重输---------------------n");
printf("输入你的选择n");
printf("1 输入时间,查询周数n");
printf("2 输入周数字,得到时间段n");
printf("3 重新输入开学时间n");
printf("-------时间格式 yyyy mm dd----------输错重输---------------------n");
printf("输入开学时间");
int start_time = scanf("%d %d %d", &start_y, &start_m, &start_d);
while (start_m > 12 || start_d > 31) {
printf("日期格式错误n");
printf("输入开学时间");
int start_time = scanf("%d %d %d", &start_y, &start_m, &start_d);
if (start_m < 12 || start_d <= 31)
break;
}
while (1) {
printf("-------时间格式 yyyy mm dd----------输错重输---------------------n");
printf("输入你的选择n");
printf("1 输入时间,查询周数n");
printf("2 输入周数字,得到时间段n");
printf("3 重新输入开学时间n");
printf("-------时间格式 yyyy mm dd----------输错重输---------------------n");
int val;
scanf("%d", &val);
if (val == 1) {
//输入时间,查询周数
printf("输入查询时间");
int end_time = scanf("%d %d %d", &end_y, &end_m, &end_d);
day_dif = DiffDays(start_y, start_m, start_d, end_y, end_m, end_d);
printf("%d", day_dif);
delta = day_dif % 7;
weeks = day_dif / 7;
if (delta != 0) {
weeks += 1;
}
printf("当前第%d周 n", weeks);
}
else if (val == 2) {
//输入周数字,得到时间段
printf("输入一个数字:");
int week;
int end_days;
int start_days;
scanf("%d", &week);
int de = (abs(DiffDays(2021, 1, 3, start_y, start_m, start_d))) % 7;
if(week==1){
start_days = 0;
end_days = 7-de;
}
else {
start_days = week*7-de+1;
end_days =week*7+de+1;
}
for (int a=start_y;a < 2100;a++) {
for (int b = start_m;b < 12;b++) {
for (int c = 1;c < 31;c++) {
if (DiffDays(start_y, start_m, start_d, a, b, c) == start_days) {
if(Days(a, b, c)>=Days(start_y, start_m, start_d))
printf("%d年 %d月 %d日 至", a,b,c);
break;
}
}
}
}
for (int a1 = start_y;a1 < 2100;a1++) {
for (int b1 = start_m;b1 < 12;b1++) {
for (int c1 =1;c1 < 31;c1++) {
if (DiffDays(start_y, start_m, start_d, a1, b1, c1) == end_days) {
if (Days(a1, b1, c1) >=Days(start_y, start_m, start_d))
printf("%d年 %d月 %d日n", a1, b1, c1);
break;
}
}
}
}
}
else if (val == 3) {
//重新输入开学时间
printf("输入开学时间");
int start_time = scanf("%d %d %d", &start_y, &start_m, &start_d);
while (start_m > 12 || start_d > 31) {
printf("日期格式错误n");
printf("输入开学时间");
int start_time = scanf("%d %d %d", &start_y, &start_m, &start_d);
if (start_m < 12 || start_d <= 31)
break;
}
day_dif = DiffDays(start_y, start_m, start_d, end_y, end_m, end_d);
printf("%d", day_dif);
delta = day_dif % 7;
weeks = day_dif / 7;
if (delta != 0) {
weeks += 1;
}
printf("当前第%d周 n", weeks);
}
}
return 0;
}
一开始写的时候在网上找的算法,用于计算两个日期之间的天数;
int abs(int a, int b)
{
if (a >= b)
return (a - b);
else
return (b - a);
}
int IsLeap(int year)
{
if (((year % 4 == 0) && (year % 100 != 0)) || year % 400 == 0)
return 1;
else
return 0;
}
int Days(int y, int m, int d)
{
int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int i;
int sum = 0;
if (IsLeap(y))
days[2] = 29;
for (i = 0; i < m; i++)
sum = sum + days[i];
sum = sum + d - 1;
return sum;
}
int DiffDays(int y1, int m1, int d1, int y2, int m2, int d2)
{
int s1, s2;
int count;
int sum = 0;
int t, t1, t2;
if (y1 == y2)
{
s1 = Days(y1, m1, d1);
s2 = Days(y2, m2, d2);
return abs(s1, s2);
}
else if (y1 > y2)
{
count = y1 - y2;
if (count == 1)
{
t1 = Days(y1, m1, d1);
t2 = Days(y2, 12, 31) - Days(y2, m2, d2);
return (t1 + t2 + count);
}
else
{
for (t = y2 + 1; t < y1; t++)
sum = sum + Days(t, 12, 31);
cout << sum << endl;
t2 = Days(y2, 12, 31) - Days(y2, m2, d2);
t1 = Days(y1, m1, d1);
return (sum + t1 + t2 + count);
}
}
else
{
count = y2 - y1;
if (count == 1)
{
t2 = Days(y2, m2, d2);
t1 = Days(y1, 12, 31) - Days(y1, m1, d1);
return (t1 + t2 + count);
}
else
{
for (t = y1 + 1; t < y2; t++)
sum = sum + Days(t, 12, 31);
t2 = Days(y2, m2, d2);
t1 = Days(y1, 12, 31) - Days(y1, m1, d1);
return (sum + t1 + t2 + count);
}
}
}
这是运行界面



