acm(oj)调试技巧(本地调试)从文件中读取输入测试数据_C语言(以计算星期为例)

笔记 专栏收录该内容
146 篇文章 0 订阅

针对某些机器环境不允许将测试数据粘贴到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

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值