2 zhangxi99 zhangxi99 于 2016.09.22 19:15 提问

C语言来写从控制台输入年份,打印改年12个月的日历 用for循环 求大神

C语言来写从控制台输入年份,打印改年12个月的日历 用for循环 求大神

2个回答

qq_29594393
qq_29594393   Ds   Rxr 2016.09.22 20:23

关键点就是获取该年的第一天是星期几,判断是不是润年,其余的就是输出了,用一个标记flag用来换行和输出空格
例如该年第一天是星期一 标记flag就为1,表示输出一个空格,然后循环输出31次 ,循环一次flag +=1,flag =6换行 ,循环结束,就到下一个月,根据flag,填补空格,循环输出当月的天数,后面的就不再赘述

qq423399099
qq423399099   Ds   Rxr 2016.09.23 10:59

参考:

 #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);
}
Csdn user default icon
上传中...
上传图片
插入图片