A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 幻想领域 于 2012-10-28 01:51 编辑

前几天亚金发了这么一个帖子(http://bbs.itheima.com/thread-29154-1-1.html),问到把2012年10月10日转换成二零一二年十月十日的其他解法,当时我们把问题都想简单了。
后来罗代势同学提醒了我们,还需要验证平闰年和判断输入的日期是否合理。有问题,还请大家继续提出。

我连夜尝试做了一下,代码如下:
  1. static void Main(string[] args)
  2. { Console.WriteLine("请输入一个日期");
  3. string dateTime = Console.ReadLine();
  4. string[] newDateTime = dateTime.Split(new string[] { "年","月","日" }, StringSplitOptions.RemoveEmptyEntries);
  5. //将输入的字符串按年月日分割,如2011年10月80日,则变成{2011,10,80}
  6. try
  7. {
  8. int year = int.Parse(newDateTime[0]);
  9. int month = int.Parse(newDateTime[1]);
  10. int day = int.Parse(newDateTime[2]);
  11. //声明数组,存放每月的天数,第一行存平年,第二行存闰年
  12. int[,] day_tabnew = new int[2, 13] { { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, }, { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, } };
  13. int lp = year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? 1 : 0;//*判定year为闰年还是平年,lp=0为平年,非0为闰年*/
  14. if (day > day_tabnew[lp, month])//取出对应年月的天数,并与用户输入的天数做对比1
  15. {
  16. Console.WriteLine("不存在该日期");
  17. }
  18. else
  19. {
  20. //这里的可以用其他方法代替,我的写法是错的,求其他同学贴出自己的解法
  21. dateTime = dateTime.Replace("0", "零");
  22. dateTime = dateTime.Replace("1", "一");
  23. dateTime = dateTime.Replace("2", "二");
  24. dateTime = dateTime.Replace("3", "三");
  25. dateTime = dateTime.Replace("4", "四");
  26. dateTime = dateTime.Replace("5", "五");
  27. dateTime = dateTime.Replace("6", "六");
  28. dateTime = dateTime.Replace("7", "七");
  29. dateTime = dateTime.Replace("8", "八");
  30. dateTime = dateTime.Replace("9", "九");
  31. Console.WriteLine(dateTime);
  32. }
  33. }
  34. catch (Exception)
  35. {
  36. Console.WriteLine("请输入正确格式的日期,如2011年6月4日");
  37. }
  38. Console.ReadKey();
  39. }
复制代码
运行效果图:
1、实现了判断日期是否合理

2、实现了判断输入格式是否是日期

3、转换的的时候,出问题了,10应该转换成十,而不是一零(这里留给其他同学补充,我转换日期的写法是错的,应该再加入几个判断,其他转换日期的方法,亚金的帖子有)


看来代码真东西,不细心不行,本来以为很简单的问题,没想到还有隐藏的陷阱。

评分

参与人数 2技术分 +2 收起 理由
郑文 + 1 不错 继续努力
张文 + 1

查看全部评分

8 个回复

倒序浏览
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace test6
{
    class Program
    {
        static void Main(string[] args)
        {  // c#时间格式转换汉字大写 比如: “2011年6月4日” 转换成 “二零一一年六月四日”。

            string[] c = new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "年", "月", "日" };//定义一个字符串数组来存储要替换的字符

            
                string input;
                Console.WriteLine("请输入一个日期");
                input = Console.ReadLine();//接收你输入的日期
                StringBuilder str = new StringBuilder();//定义一个可变字符串
                for (int count = 0; count < input.Length; count++)
                {
                    string temp = input.Substring(count, 1);//依次获得每一个字符
                    switch (temp)//对符合的字符进行替换并赋给新的字符串
                    {
                        case "1": str.Append(c[1]); break;
                        case "2": str.Append(c[2]); break;
                        case "3": str.Append(c[3]); break;
                        case "4": str.Append(c[4]); break;
                        case "5": str.Append(c[5]); break;
                        case "6": str.Append(c[6]); break;
                        case "7": str.Append(c[7]); break;
                        case "8": str.Append(c[8]); break;
                        case "9": str.Append(c[9]); break;
                        case "0": str.Append(c[0]); break;
                        case "年": str.Append(c[10]); break;
                        case "月": str.Append(c[11]); break;
                        case "日": str.Append(c[12]); break;
                        default: break;
                    }
                }
                Console.WriteLine("转化后的字符串为:{0}", str);//输出字符串
            
            
         
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

回复 使用道具 举报
{:soso_e144:}同一个问题的解决办法,不同的人都会想出不同的办法。但是不知道怎么看哪个处理办法比较效率。
哪个同学知道测这个效率问题的?
回复 使用道具 举报
本帖最后由 幻想领域 于 2012-10-28 21:19 编辑
dqzg12300 发表于 2012-10-28 20:57
同一个问题的解决办法,不同的人都会想出不同的办法。但是不知道怎么看哪个处理办法比较效率 ...

大一上数据结构的时候,老师教过这个问题。
思路是在需要测试的代码前,计时器开始
代码结束后,计时器结束,然后根据计时器的相关属性获取运行时间。不过不同电脑的执行效率不一,同一电脑不同时刻执行的也有不同
代码:需引用using System.Diagnostics;
  1. Stopwatch sw = new Stopwatch();
  2.             sw.Start();
  3.             //这里填写要执行的代码
  4.             sw.Stop();
  5.             //Elapsed:获取当前实例测量得出的总运行时间
  6.             //ElapsedMilliseconds:测量实例得出的总运行时间(毫秒为单位)
  7.             //ElapsedTicks:总运行时间(计时器刻度标识)
  8.             Console.WriteLine("总运行时间:" + sw.Elapsed);
  9.             Console.WriteLine("测量实例得出的总运行时间(毫秒为单位):" + sw.ElapsedMilliseconds);
  10.             Console.WriteLine("总运行时间(计时器刻度标识):" + sw.ElapsedTicks);
复制代码
亚金有空测试一下几种算法的效率,再告诉我们
回复 使用道具 举报
好吧。。我看看
回复 使用道具 举报
我测试了下沙发的程序运行速度跟我的写法的运行速度。分别如下
沙发的速度是

我的运行速度是

然后我不甘心。我原来是把算法丢在一个方法里,然后调用方法。我就改了下。
把switch丢到了main入口函数里了。
运行速度如下

这个得出了一个结论。看来方法在入口函数计算方式确实快了不少,直观看上去快了5倍啊。
回复 使用道具 举报
dqzg12300 发表于 2012-10-29 00:33
我测试了下沙发的程序运行速度跟我的写法的运行速度。分别如下
沙发的速度是

今天刚想到,其实判断平闰年,判断输入的日期是否合理,还有更简单的办法。
微软提供了DateTime类,当把string转换为DateTime不成功时,即说明输入的日期不合理
  1. Console.WriteLine("请输入yy年MM月dd日格式时间");
  2. string timestr = Console.ReadLine();//获取用户输入的时间字符串
  3. try
  4. {
  5. DateTime t = DateTime.Parse(timestr);
  6. //这里填写转换的方法,不需要再判断输入平年时,2月不能大于28,每月日期不能大于31
  7. }
  8. catch (Exception)
  9. {
  10. Console.WriteLine("输入的日期错误");
  11. }
复制代码
回复 使用道具 举报
关于10及10以上的月份和日子,貌似我们都没做。明天我做好另外开个帖子吧。写个完整点的。然后再测试个速度。今天在朋友家玩·
回复 使用道具 举报
本帖最后由 幻想领域 于 2012-10-29 21:49 编辑
dqzg12300 发表于 2012-10-29 21:32
关于10及10以上的月份和日子,貌似我们都没做。明天我做好另外开个帖子吧。写个完整点的。然后再测试个速度 ...

http://bbs.itheima.com/thread-29569-1-1.html罗代势在这个帖子写了十以上的,但用的是枚举,枚举到三十一,比较复杂,求更简洁的写法
貌似这题还真复杂,不是一般的基础题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马