C语言来写从控制台输入年份,打印改年12个月的日历 用for循环 求大神
关键点就是获取该年的第一天是星期几,判断是不是润年,其余的就是输出了,用一个标记flag用来换行和输出空格
例如该年第一天是星期一 标记flag就为1,表示输出一个空格,然后循环输出31次 ,循环一次flag +=1,flag =6换行 ,循环结束,就到下一个月,根据flag,填补空格,循环输出当月的天数,后面的就不再赘述
参考:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int qq(int x, int t)
{
int i = 0, p, s = 365, y, j, b, k = 1, h = 1, u = 0;
int a[13];
FILE *fp;
fp = fopen("tai.txt", "a+");
i = 0; k = 1; h = 1; u = 0;
printf("\t^^^^^^^^^^^^^\t%d年%d月份\t^^^^^^^^^^^^^^^^\n\n", x, t);
fputs("\t^^^^^^^^^^^^^^^^", fp);
fputc(x / 1000 + 48, fp);
fputc(x / 100 % 10 + 48, fp);
fputc(x / 10 % 10 + 48, fp);
fputc(x % 10 + 48, fp);
fputs("年", fp);
fputc(t / 10 + 48, fp);
fputc(t % 10 + 48, fp);
fputs("月份^^^^^^^^^^^^^^^^^^^^^^^", fp);
fputs("\n\n", fp);
{for (p = 1900; p <= x; p++)
if (p % 4 == 0 && p % 100 != 0 || p % 400 == 0) i++;
if (x % 4 == 0 && x % 100 != 0 || x % 400 == 0) s = i * 366 + (x - 1900 - i) * 365;
else s = i * 366 + (x - 1900 - i) * 365 + 1;
printf("\t日\t一\t二\t三\t四\t五\t六\n");
fputs("\t日\t一\t二\t三\t四\t五\t六\n", fp);
for (i = 1; i <= t; i++)
{
if (i == 2 || i == 4 || i == 6 || i == 8 || i == 9 || i == 11) u += 31;
if (i == 5 || i == 7 || i == 10 || i == 12) u += 30;
if (i == 3){
if (x % 4 == 0 && x % 100 != 0 || x % 400 == 0) u += 29;
else u += 28;
};
};
for (i = 1; i <= 12; i++)
{
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) a[i] = 31;
if (i == 4 || i == 6 || i == 9 || i == 11) a[i] = 30;
if (i == 2){
if (x % 4 == 0 && x % 100 != 0 || x % 400 == 0) a[i] = 29;
else a[i] = 28;
};
};
b = a[t];
y = (s % 7 + u) % 7;
for (i = 1; i <= 6; i++)
{
for (j = 1; j <= 7; j++)
{
if (h <= y) { printf("\t"); fputc('\t', fp); };
if (h>y) {
if (k <= b) { printf("\t%d", k); fputc('\t', fp); if (k>9) fputc(k / 10 + 48, fp), fputc(k % 10 + 48, fp); else fputc(k + 48, fp); };
if (k == b + 1) { printf("\n"); fputc('\n', fp); };
k++;
};
h++;
};
printf("\n"); fputs("\n", fp);
};
};
printf("\t***************************************************\n\n");
fputs("\t***************************************************", fp);
fputs("\n\n", fp);
fclose(fp);
return (0);
}
void main()
{
int x, t, q = 0, e, i, c, cc, xx, tt;
float p, pp;
FILE *fp;
if ((fp = fopen("tai.txt", "w")) == NULL)
{
printf("error!");
exit(0);
}
fclose(fp);
do{
printf("请输入你要查询的年份和月份,\n");
printf("输入格式为:“年+空格+月+Enter”。(年份 >=1900)");
printf("(若想显示全年,则输“年+空格+0+Enter”)。比如“2012+空格+0+Enter”)\n");
printf("(若想输出XXXX到xxxx年的全年,则输“年+空格+年+Enter”)。比如“2010+空格+2012+Enter”)\n");
printf("(若想显示xxxx年的前或后x年,则输“年+空格+.x+Enter”)。比如2010的前3年,则输入“2010+空格+“-.3”+Enter”)\n");
printf("(若想显示xxxx年的m月前或后x个月,则输“年+空格+m.x+Enter”)。比如2010的5后3个月,则输入“2010+空格+“+5.3”+Enter”)\n");
scanf("%d%f", &x, &p);
pp = p * 10;
c = (int)pp;
cc = c % 10;
xx = x;
t = abs((int)p);
tt = t;
if (x<1900) { printf("输入不合要求,请重新输入!!"); q = 1; }
else if (x >= 1900 && (t>0 && t <= 12) && cc == 0)//输出指定的年月份。
{
qq(x, t);
}
else if (x >= 1900 && t == 0 && cc == 0)//输出指定的整年。
{
for (t = 1; t <= 12; t++)
qq(x, t);
}
else if (x >= 1900 && t >= 1900)//输出xxxx年到xxxx年的整年。
{
for (i = xx; i <= tt; i++, x++)
for (t = 1; t <= 12; t++)
qq(x, t);
}
else if (x >= 1900 && p<1.0&&tt == 0)//输出xxxx年的前或后x年。
{
if (cc + x<1900 && tt == 0)
printf(" 输入的前年份过多。");
else if (cc>0)
{
for (i = 0; i <= cc; i++, x++)
for (t = 1; t <= 12; t++)
qq(x, t);
}
else {
for (i = cc; i <= 0; i++, x--)
for (t = 1; t <= 12; t++)
qq(x, t);
}
}
else if (x >= 1900 && t <= 12 && t >= 1 && cc != 0)//输出xxxx年的m月前或后x个月。“呵呵 你自己想象“让前或后x个月问任何数””
{
if (cc>0)
{
for (tt = 0; tt <= cc; tt++, t++)
{
if (t>12) qq(x + 1, t - 12);
else qq(x, t);
}
}
else{
for (tt = 0; tt >= cc; tt--, t--)
{
if (t<1) qq(x - 1, t + 12);
else qq(x, t);
}
}
}
} while (q == 1);
scanf("%d", &e);
if (e)exit(0);
}