acm(oj)调试技巧(本地调试)从文件中读取输入测试数据_C语言(以计算星期为例)
针对某些机器环境不允许将测试数据粘贴到console中(黑黑的窗口里),为减少重复性输入,而采用从文件中读取输入.(建议在统一目录创建输入文件)
可以编写对应的编译预处理来切换输入模式
/* 帮助小明写一个程序,算出一个人的生日是星期几, 输入 输入多组测试数据,每组数据一行,包括三个整数:年(1个空格)月(1个空格)日。 输入0(1个空格)0(1个空格)0表示结束。 输出 请输出星期几的英文。就用1,2,3,4,5,6,7表示星期几. 2013 12 18 2010 2 1 1999 7 24 2008 1 13 0 0 0 样例输出 3 1 6 7 */ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #define read_from_console 0/*用这个宏作开关,切换模式*/ int is_leap_year(int year); int days_after_0(int year, int month, int day, int(*monthdays)[13]); int main() { int ty, tm, td, tw;/*今天当天的参数*/ int year, month, day;/*以前某天的参数*/ int delta; int sum_pre = 0, sum_now = 0; int year_month[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31},/*平年year_month[0]*/{0,31,29,31,30,31,30,31,31,30,31,30,31}/*闰年year_month[1]*/ }; /*从文件中获取输入(文件名变量)*/ char path[] = "test_data.txt"; FILE* fp=0;/*文件指针,保存文件流地址*/ if (read_from_console){ } else { /*不要反复打开文件,所以没有放在循环里*/ fp = fopen(path, "r"); if (fp == NULL) { printf("读取出错!\n"); exit(1); } /*从文件中读入输入数据:*/ } while (1) {//利用同起点相减法求解 printf("输入想要查询的年/月/日:\n"); if (read_from_console ) { scanf_s("%d %d %d", &year, &month, &day);/*用scanf()也可scanf_s()在从键盘读取输入时可以不用第三个参数*/ } else { fscanf(fp, "%d %d %d", &year, &month, &day); } printf("今天的日期:年/月/日,以及星期几:\n"); //scanf("%d%d%d%d", &ty, &tm, &td, &tw); printf("内部设定为2020 9 7 星期1\n"); ty = 2020; tm = 9; td = 7; tw = 1; /*判断是否离开循环:*/ if (year || month || day) {} else break; sum_pre = days_after_0(year,year, month, day, year_month); sum_now = days_after_0(year,ty, tm, td, year_month); //printf("%d %d %d->sum = %d\n", year, month, day, sum_pre);/*测试用句*/ delta = sum_now - sum_pre; printf("%d %d %d -> sum_now=%d\n%d %d %d -> sum_pre=%d\n", ty, tm, td, sum_now, year, month, day, sum_pre); printf("delta:%d\n", delta); /*打印结果:*/ int result = (tw - delta % 7 + 7) % 7; if (result == 0) { result = 7; } printf("%d\n", result); } /*记得在用完后关闭文件连接*/ if (!read_from_console) { fclose(fp); } } int is_leap_year(int year) { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { return 1; } return 0; } int days_after_0(int year_pre, int year,int month, int day, int(*monthdays)[13]) { int sum = 0; if (year > year_pre) for (int i = year_pre/*从1优化为year*/; i < year; i++) { if (is_leap_year(i))/*小心参数别写作year了(很容易错)*/ { sum += 366; } else { sum += 365; } } /*加上当年的月加天:*/ for (int i = 1; i < month; i++) { if (is_leap_year(year)) { sum += monthdays[1][i]; } else { sum += monthdays[0][i]; } } sum += day; return sum; }
“test_data.txt”
2013 12 18
2010 2 1
1999 7 24
2008 1 13
0 0 0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了