代码直接CSC编译即可。
计算从哪天起应该购买预售火车票.cs
using System;
using System.Diagnostics;
using System.IO; class Program
{
static ConsoleColor DefaultForegroundColor = Console.ForegroundColor; //保留Console前景色 static int Main(params string[] args)
{
int days = ; //预售天数
if (args.Length>)
{
if(!int.TryParse(args[], out days))
{
ShowHelpAndExit(); //第一个参数错误
}
else if(args.Length>)
{
DateTime argsDate; //出行日期
if(args[].Trim().Equals("now",StringComparison.OrdinalIgnoreCase))
{
argsDate = DateTime.Now.AddDays(days - ); //出行日期为now的话,计算出今天可预订的出行日期
}
else if(!DateTime.TryParse(args[], out argsDate))
{
ShowHelpAndExit(); //第二个参数错误
}
Console.WriteLine("\r\n * 火车票预售期为:{0}天\r\n\r\n出行日期:{1}",days, FormatDate(argsDate));
OutputBookingDay(days, argsDate); //输出预售日期
var paused = true;
if(args.Length>)
{
if(args[].Trim().Equals("nopause",StringComparison.OrdinalIgnoreCase))
{
paused = false; //第三个参数为 nopause 则不暂停直接退出,用于配合命令提示符
}
}
if(paused)
{
Console.Write("\r\n按任意键退出...");
Console.ReadKey(true);
}
Environment.Exit(); //正常退出
}
}
else
{
Console.WriteLine("计算从哪天起应该购买预售火车票"); //未带参数,输出标题
Console.WriteLine();
}
if(days <= )
{
Console.Write("火车票预售期(缺省为60天):");
var input=Console.ReadLine().Trim(); //手动输入预售期
inputToExit(input);
if (!int.TryParse(input, out days)||days<=)
{
days = ; //输入错误,预售期设置为60天
ConsoleCursorRelativeLine(-); //光标移动到上一行行首。
var point = ConsoleCursorGetCurrentPosition();
if(point!=null)
{
ConsoleCursorFillLines(point.Value.Top,point.Value.Top, ' '); //清除光标所在行的显示字符(用空格填充)
Console.Write("火车票预售期(缺省为60天):{0}\r\n", days);
}
}
}
Console.WriteLine("\r\n * 火车票预售期为:{0}天",days);
Console.WriteLine(" * 今天可以预定 {0} 的火车票", FormatDate(DateTime.Now.AddDays(days - )));
Console.WriteLine(" * 输入\"exit\"可退出程序,输入\"g\"打开12306订票网站。\r\n");
while(true)
{
Console.Write("出行日期:"); //输入出行日期
var input = Console.ReadLine().Trim();
inputToExit(input); //若输入exit则退出
if(input.Equals("g",StringComparison.OrdinalIgnoreCase))
{
const string web = "http://www.12306.cn";
Process.Start(web); //输入g打开12306网站
Console.WriteLine("正在打开 {0} ", web);
}
else
{
DateTime dest;
if(DateTime.TryParse(input, out dest))
{
ConsoleCursorRelativeLine(-);
var point = ConsoleCursorGetCurrentPosition();
if(point!=null)
{
ConsoleCursorFillLines(point.Value.Top,point.Value.Top, ' '); //清除前一行显示字符
Console.WriteLine("出行日期:{0}",FormatDate(dest)); //更新输出日期
}
OutputBookingDay(days, dest);
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("输入错误"); //显示输出错误
Console.ForegroundColor = DefaultForegroundColor;
ConsoleCursorRelativeLine(-); //光标向上移动3行
var point = ConsoleCursorGetCurrentPosition();
if(point!=null)
{
ConsoleCursorFillLines(point.Value.Top,point.Value.Top+, ' ');
}
}
}
Console.WriteLine();
}
} static void inputToExit(string input)
{
if(input.Equals("exit", StringComparison.OrdinalIgnoreCase))
{
Environment.Exit(); //用户退出
}
} static void ShowHelp()
{
//帮助提示
var appname = Path.GetFileName(Environment.GetCommandLineArgs()[]);
Console.WriteLine(" * 参数格式:");
Console.WriteLine(" {0} <火车票预售期>", appname);
Console.WriteLine(" {0} <火车票预售期> <出行日期> [nopause]", appname);
Console.WriteLine(" {0} <火车票预售期> now [nopause]", appname);
Console.WriteLine("\r\n * 例子:预售期60天,查看今天可以预定哪天火车票");
Console.WriteLine(" {0} 60 now", appname);
Console.WriteLine("\r\n * 批处理:");
Console.WriteLine(" {0} 60 now nopause|Find \"出行日期:\"", appname);
Console.WriteLine();
} static void ShowHelpAndExit(int exitcode)
{
ShowHelp(); //显示帮助提示然后按任意键退出
Console.Write("按任意键退出...");
Console.ReadKey(true);
Environment.Exit(exitcode); //返回错误码(errorlevel)
} static string FormatDate(DateTime date)
{
ConsoleColor? cc;
return FormatDate(date, out cc); //格式化日期
} static string[] dayOfWeek = new []{ "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
static string FormatDate(DateTime date, out ConsoleColor? consoleColor)
{
var d = (date.Date - DateTime.Now.Date).Days;
string tip;
switch (d)
{
case -:
tip = "(前天)";
break;
case -:
tip = "(昨天)";
break;
case :
tip = "(今天)";
break;
case :
tip = "(明天)";
break;
case :
tip = "(后天)";
break;
default:
tip = string.Format("({0})",dayOfWeek[(int)date.DayOfWeek]);
break;
} if (d>=)
{
consoleColor = ConsoleColor.Green; //返回建议颜色,下同
}
else
{
consoleColor = ConsoleColor.Yellow;
} return string.Format("{0:yyyy-M-d}{1}", date, tip);
} static void OutputBookingDay(int days, DateTime destDate)
{
var date = destDate.AddDays(-days + );
ConsoleColor? cc;
var formattedDest = FormatDate(date, out cc);
Console.ForegroundColor = DefaultForegroundColor;
Console.Write("预售日期:"); //用缺省前景色显示“预售日期:”这几个字
if(cc.HasValue)
{
Console.ForegroundColor = cc.Value; //更换前景色
}
Console.WriteLine(formattedDest); //按格式输出预售日期
Console.ForegroundColor = DefaultForegroundColor; //还原缺省前景色
} static bool ConsoleCursorRelativeLine(int rows)
{
//将ConsoleCursor操作封装成方法,加入try语句,防止在非控制台下输出造成异常,下同
try
{
var t = Console.CursorTop + rows; //相对行号
Console.SetCursorPosition(, t); //移动光标到相对行
return true; //成功
}
catch
{
}
return false; //失败
} static bool ConsoleCursorFillLines(int startLine, int endLine, char @char)
{
var d = endLine - startLine + ;
if (d>)
{
try
{
var point = ConsoleCursorGetCurrentPosition().Value;
Console.SetCursorPosition(, startLine); //光标移动到起始行
Console.Write(new string(@char,Console.BufferWidth * d)); //用字符填满指定行数(d)
Console.SetCursorPosition(point.Left, point.Top); //返回光标原来的位置
return true; //成功
}
catch
{
}
}
return false; //失败
} static Point? ConsoleCursorGetCurrentPosition()
{
try
{
return new Point(Console.CursorLeft, Console.CursorTop); //返回光标位置
}
catch
{
}
return null; //失败
} struct Point
{
public int Left;
public int Top; public Point(int left, int top)
{
Left = left;
Top = top;
}
}
}