鱼C论坛

 找回密码
 立即注册
查看: 1238|回复: 14

想知道怎么简单的横向输出日历

[复制链接]
发表于 2022-5-3 16:15:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
只运用数组循环选择可以写出吗
下面是我写的 但是只会竖向输出

#include <stdio.h>
int main()
{
        int month, day, year, sum, a, b, c, i;
        sum = 0;
        printf("输入年份:");
        scanf("%d", &year);
        for (i = 1900; i < year; i++)
        {
                if ((i% 4 == 0 && i % 100 != 0) ||i% 400 == 0)
                        sum += 366;
                else sum += 365;
        }sum+=31;
        for (month = 1; month <= 12; month++)
        {
                switch (month)
                {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12: day = 31; break;
                case 4:
                case 6:
                case 9:
                case 11:day = 30; break;
                case 2: if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) day = 29;
                          else day = 28; break;
                default:day = 31; break;
                }
               
       
               
                printf("==============================================%d月================================================\n", month),
                        printf("日\t\t一\t\t二\t\t三\t\t四\t\t五\t\t六\n");
                a = (sum) % 7;
                 for (c = 0; c < a; c++)
                {
                                printf("\t\t");
               



                }
                for (i = 1; i <= day; i++)
                {
                       
                        if ((i+sum)%7 == 0 || i == day)
                                printf("%d\n", i);

                        else printf("%d\t\t", i);
                }sum += day;
        }

        return 0;
        }

想要的效果

想要的效果

我只能写出的效果

我只能写出的效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-3 17:06:53 | 显示全部楼层

回帖奖励 +10 鱼币

代码只能一行行打印下来,做不到竖着打过去
想达到所谓的横向效果,就只能像图片显示的那样,先打印3个月的第一周,然后打印第二周......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-3 17:29:56 | 显示全部楼层
风车呼呼呼 发表于 2022-5-3 17:06
代码只能一行行打印下来,做不到竖着打过去
想达到所谓的横向效果,就只能像图片显示的那样,先打印3个月 ...

可以的吧,这是我们班的作业,我周围的同学都是用不到100行代码,实现了这个效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-3 17:43:55 | 显示全部楼层
addendum777 发表于 2022-5-3 17:29
可以的吧,这是我们班的作业,我周围的同学都是用不到100行代码,实现了这个效果

可以什么?可以实现这个效果吗?当然可以啊
我只是说需要转变思路,代码逻辑上不可能一次性在左边一块打印整个1月份的日历,然后又在它右边打印整个2月份,只能从上到下

另外,你们这个只要求格式吗 目前你实现的具体日期和每周并没有对齐,至少它不是2022的日历
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-4 00:31:58 | 显示全部楼层

回帖奖励 +10 鱼币

6666666666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-4 03:47:13 | 显示全部楼层

回帖奖励 +10 鱼币

3个月3个月地打印咯,先提前把所有月份的天数计算好。
先打印一月 + 二月 + 三月的第一行,当然月与月直接做好间隔,
再打印一月 + 二月 + 三月的第二行...
...
四月 + 五月 + 六月的第一行...
...
以此类推。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-4 09:25:12 | 显示全部楼层

回帖奖励 +10 鱼币

来学习下!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-4 11:41:45 | 显示全部楼层

回帖奖励 +10 鱼币

其实不难,只是用 C 语言打印比较麻烦,C 语言不太适合用来打印这种格式输出,用 Python 相对简单多。
代码:
  1. #include <stdio.h>
  2. #define endl printf("\n");
  3. #define space printf("   ");
  4. #define _3dot printf("***");

  5. int isLeapYear(int year) { return (!(year % 4) && (year % 100)) || !(year % 400); }

  6. int firstDay(int year) {
  7.         int days = 0;
  8.         for (int y = 1900; y < year; y++) {
  9.                 days += isLeapYear(y) ? 366 : 365;
  10.         }
  11.         return days + 1;
  12. }

  13. void line1(int year) {
  14.         char* str = "*************";
  15.         printf("%*s%d年日历%s%s%d年日历%s\n\n", 31, str, year, str, str, year, str);
  16. }

  17. void line2() { for (int i = 0; i < 32; ++i) printf("*"); }
  18. void line3(int year, int month) { printf("%*s%d年%d月%*s", 12, "", year, month, month > 9 ? 13 : 14, ""); }
  19. void line4() { printf("%s%6s%6s%6s%6s%6s%6s", "一", "二", "三", "四", "五", "六", "日"); }

  20. void line5(int max, int w, int line) {
  21.         int l = 0, r = 6, i = 0;
  22.         w = w ? w : 7;
  23.         char str[6][33];
  24.         for (int block = 1, day = 1; block <= 42; ++block) {
  25.                 if (block < w) {
  26.                         if (!l) { snprintf(str[i], 3, "%5s", ""); l += 2; }
  27.                         else { snprintf(str[i] + l, r, "%5s", ""); l += (r - 1); }
  28.                 }
  29.                 else if (day <= max) {
  30.                         if (!l) { snprintf(str[i] + l, 3, "%2d", day++); l += 2; }
  31.                         else { snprintf(str[i] + l, r, "%5d", day++); l += (r - 1); }
  32.                         if (!(block % 7)) {
  33.                                 str[i++][32] = '\0';
  34.                                 l = 0;
  35.                         }
  36.                 }
  37.                 else {
  38.                         if (!l) { snprintf(str[i] + l, 3, "%2s", ""); l += 2; }
  39.                         else { snprintf(str[i] + l, r, "%5s", ""); l += (r - 1); }
  40.                         if (!(block % 7)) {
  41.                                 str[i++][32] = '\0';
  42.                                 l = 0;
  43.                         }
  44.                 }
  45.         }
  46.         printf("%s", str[line]);
  47. }

  48. void calendar(int year) {
  49.         int days[12] = { 31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  50.         int week[12], sum = 0;
  51.         for (int m = 0; m < 12; ++m) {
  52.                 week[m] = (firstDay(year) + sum) % 7;
  53.                 sum += days[m];
  54.         }
  55.         line1(year);
  56.         endl
  57.         for (int m = 1; m <= 12; m += 3) {
  58.                 if (!((m - 1) % 3)) {
  59.                         _3dot
  60.                         for (int i = 0; i < 3; ++i) {
  61.                                 line2();
  62.                                 space
  63.                         }
  64.                         endl
  65.                 }
  66.                 space
  67.                 line3(year, m); line3(year, m + 1); line3(year, m + 2);
  68.                 endl
  69.                 space
  70.                 line4(); _3dot
  71.                 line4(); _3dot
  72.                 line4();
  73.                 endl
  74.                 for (int i = 0; i < 6; ++i) {
  75.                         space
  76.                         line5(days[m - 1], week[m - 1], i); space
  77.                         line5(days[m], week[m], i); space
  78.                         line5(days[m + 1], week[m + 1], i); space
  79.                         endl
  80.                 }
  81.         }
  82. }

  83. int main(void) {
  84.         int year = 2022;
  85.         calendar(year);
  86.         return 0;
  87. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-4 13:13:11 From FishC Mobile | 显示全部楼层

回帖奖励 +10 鱼币

让我想起了wttr.in这个页面(浏览器或curl程序都能访问)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-4 13:18:48 | 显示全部楼层

回帖奖励 +10 鱼币

每一行存放在数组里,再集中输出?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-4 14:12:39 | 显示全部楼层

回帖奖励 +10 鱼币

你猜我在干嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-4 17:32:31 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-4 17:58:29 | 显示全部楼层

回帖奖励 +10 鱼币

学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-5 01:24:52 | 显示全部楼层
  1. $ cat screen.h
  2. #ifndef _SCREEN_H_
  3. #define _SCREEN_H_

  4. #include <stdio.h>
  5. #include <stddef.h>

  6. typedef struct {
  7.     size_t width, height;
  8.     char *buff;
  9. } screen_t;

  10. screen_t *screen_init(size_t width, size_t height);
  11. void screen_deinit(screen_t *screen);
  12. void screen_putchar(screen_t *screen, size_t x, size_t y, char ch);
  13. void screen_refresh(screen_t *screen, FILE *fp);
  14. void screen_draw_border(screen_t *screen, char ch);

  15. #endif
  16. $ cat screen.c
  17. #include "screen.h"
  18. #include <stdlib.h>
  19. #include <string.h>

  20. screen_t *screen_init(size_t width, size_t height) {
  21.     screen_t *screen = malloc(sizeof(*screen));
  22.     *screen = (screen_t){width, height, malloc(width * height)};
  23.     memset(screen->buff, ' ', screen->width * screen->height);
  24.     return screen;
  25. }

  26. void screen_deinit(screen_t *screen) {
  27.     free(screen->buff);
  28.     free(screen);
  29. }

  30. void screen_putchar(screen_t *screen, size_t x, size_t y, char ch) {
  31.     if(x < screen->width && y < screen->height)
  32.         screen->buff[y * screen->width + x] = ch;
  33. }

  34. void screen_refresh(screen_t *screen, FILE *fp) {
  35.     for(size_t y = 0; y < screen->height; ++y) {
  36.         for(size_t x = 0; x < screen->width; ++x) {
  37.             fputc(screen->buff[y * screen->width + x], fp);
  38.         }
  39.         fputc('\n', fp);
  40.     }
  41. }

  42. void screen_draw_border(screen_t *screen, char ch) {
  43.     for(size_t y = 0; y < screen->height; ++y) {
  44.         for(size_t x = 0; x < screen->width; ++x) {
  45.             if(y == 0 || x == 0 || y == screen->height - 1 || x == screen->width - 1)
  46.                 screen_putchar(screen, x, y, ch);
  47.         }
  48.     }
  49. }
  50. $ cat main.c
  51. #include "screen.h"

  52. void output_string(screen_t *screen, size_t x, size_t y, const char *str) {
  53.     for(size_t i = 0; str[i]; ++i) {
  54.         screen_putchar(screen, x + i, y, str[i]);
  55.     }
  56. }

  57. int main(void) {
  58.     screen_t *screen = screen_init(130, 41);
  59.     //screen_draw_border(screen, '#');
  60.     output_string(screen, 10, 3, "*********2022年日历**********");
  61.     output_string(screen, 30, 5, "*********2026年日历**********");
  62.     output_string(screen, 50, 12, "*********2029年日历**********");
  63.     screen_refresh(screen, stdout);
  64.     screen_deinit(screen);
  65.     return 0;
  66. }
  67. $ cat Makefile
  68. CFLAGS = -g -Wall -fsanitize=undefined -fsanitize=leak -fsanitize=address -fno-omit-frame-pointer
  69. LDFLAGS = -lasan -lubsan -lm

  70. all: main
  71. main: main.o screen.o

  72. clean:
  73.         rm -f *.o main
  74. $
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 19:59:27 | 显示全部楼层
善用(char)8和(char)13可能会有效。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 16:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表