.Net编程技术——实验01

阅读须知:纯粹是本人啊Jun作为初学者的笔记和个人对其中知识的复习,大神请绕道。微笑

大三,必修课,C#

 

       差不多放寒假了,终于有少许时间温故而知新。在C#的课程里,总共有10个实验,每周一个,刚开始的实验一20分钟卓卓有余,心想着这么简单的实验,是在挑战智商吗?这个天真的想法一直延续到期中验收,验收完的下半学期,理想破灭,简直拿生命去编程。闭嘴

 

        好了,总结完毕,那么先来认识一下C#的IDE(微软的Visual Studio),啊Jun用的是2015版本的,接下来的文章都用VS2015表明是Visual Studio 2015。

 

         啊Jun认为老师在第一节课介绍了VS2015一些基本功能,其中最重要的就是Debug(调试)和对象浏览器。

        为什么说这两个很重要呢,因为啊Jun在大一时候学的C语言和C++的老师都没有认真教过同学们如何Debug,每次测试一些函数的功能都是用print( )或者std::cout( )插入到其中,其测试效率非常低下,而且很麻烦,但是如果熟练运用VS中的Debug和断点,简直是快速且无敌。

         嗯,第二个重要的功能就是视图中的对象浏览器,可以浏览所有组件的用法。好了,对象浏览器的功能其实就相当于微软MSDN中的开发指南,就是我们常说的API,那下面给出的是 .NET Framwork的开发指南网址:.NET Framework 开发指南

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
好了,稍微介绍完了VS2015的Debug和对象浏览器的功能了;那么接下来就开始第一个实验了。
先看实验内容:

1、用控制台项目,做一个命令行的计算器,可以完成算术运算、移位运算等操作;

2、用控制台项目,做一个小应用,可以展示类型转换、装箱和拆箱的操作;

3、用控制台项目,做一个自我介绍的应用,可以自动计算年龄和距离过下一个生日还有几天,精确到小时。

 
         首先第(1)题我在前面的文章有提到过,老师也提到过,计算器的动态编译器,但是我们上的课只学了变量和方法啊。。。这个我们完全搞不懂怎么个写法。然而老师跟我们说,不会就百度。
        “不会就百度。。”,听到这句话,我很吃惊,怎么这个老师跟以前的C语言和C++的老师不一样,以前的老师都不允许在网上找答案。反观这位老师,在整个学期下来,给我们的感觉跟以前的编程课老师就是不一样,很新颖,后来打听了这些C#老师只是一名讲师,学历是比在校的其他老师低, 但是毋庸置疑,担任过的项目我想已经可以领先了几条街了。对于我们这些本科生来说,很幸运遇到这一些老师,不断刷新编程价值观。
         好了,bb了这么多,那我们就来百度一下吧,百度到了:c#动态编译计算方法,大家可以参考一下,这边文章用的是窗体项目,啊Jun的是控制台项目,那么也很简单,换了参数就ok。其实对于初学者来说,也不简单的,因为如果以前只是接触C语言或者C++的话,只会控制台项目,完成没有窗体项目的经验,所以也需要摸索一些时间才行。以后的实验很快就会涉及到窗体项目。
         这里算是运用了别人的API吧,我想以后学会引用别人的API是程序员们的一项需要很好掌握的技能,啊Jun也是在不断地学习中,啊Jun之前尝试在Android Studio想着依赖别人在Github开源的项目,但是暂时还没学会。。
那么,那个计算器,我改了一下别人的源码:如下
 
 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Calculate calculate = new Calculate();
 6             bool flag = true;
 7             while (flag)
 8             {
 9                 Console.WriteLine("计算器能够计算: 1.可以完成算术运算 和 移位运算等操作 \t 2. 退出计算器");
10                 int choose = Int32.Parse(Console.ReadLine());
11                 switch (choose)
12                 {
13                     case 1:
14                         Console.Write("输入你的算术表达式:");
15                         String expression = Console.ReadLine();
16                         object result = calculate.ComplierCode(expression).ToString();
17                         Console.WriteLine("输出的结果:" + result.ToString()+"\n");
18                         
19                         break;
20 
21                     case 2:
22                         flag = false;
23                         break;
24 
25                     default:
26                         break;
27 
28                 }
29             }
30 
31         }
32 
33     }
34 
35     class Calculate
36     {
37 
38         public object ComplierCode(string expression)
39         {
40             string code = WrapExpression(expression);
41 
42             CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider();
43 
44             //编译的参数
45             CompilerParameters compilerParameters = new CompilerParameters();
46             //compilerParameters.ReferencedAssemblies.AddRange();
47             compilerParameters.CompilerOptions = "/t:library";
48             compilerParameters.GenerateInMemory = true;
49             //开始编译
50             CompilerResults compilerResults = csharpCodeProvider.CompileAssemblyFromSource(compilerParameters, code);
51             if (compilerResults.Errors.Count > 0)
52                 throw new Exception("编译出错!");
53 
54             Assembly assembly = compilerResults.CompiledAssembly;
55             Type type = assembly.GetType("ExpressionCalculate");
56             MethodInfo method = type.GetMethod("Calculate");
57             return method.Invoke(null, null);
58         }
59 
60         private string WrapExpression(string expression)
61         {
62             string code = @"
63                 using System;
64 
65                 class ExpressionCalculate
66                 {
67                     public static DateTime start_dt = Convert.ToDateTime(""{start_dt}"");
68                     public static DateTime end_dt = Convert.ToDateTime(""{end_dt}"");
69                     public static DateTime current_dt = DateTime.Now;
70 
71                     public static object Calculate()
72                     {
73                         return {0};
74                     }
75                 }
76             ";
77 
78             return code.Replace("{0}", expression);
79         }
80 
81     }

 

 
       那么,这个是别人的源码就不好解释了,老师告诉我们只需要完成你想要的功能就可以了。
 
       那么到了第(2)题,关于值类型和引用类型;装箱和拆箱的问题。
概念题:补充一下知识:
 
       <1>. 数值转换有一个原则:从低精度类型到高精度类型可进行隐式转换,而 从高精度类型到低精度类型 必须进行显式转换;从精度相同的无符号 数值类型向有符号数值类型的转换也只能显式转换。

       <2>. C#支持两个预定义的引用类型object和string。 
在应用程序执行的过程中,引用类型使用new关键字创建对象实例,并存储在堆中。堆是一种由系统 弹性配置的内存空间,没有特定大小及存活时间,因此可以被弹性地运用于对象的访问。
所有被称为“类”的都是引用类型,
1 例如:Student student1= new Student(); 
2     Student student2= student1; 

 


       <3>. 装箱是将值类型转换为引用类型;拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类 型链接起来。
 
 
到了第(3)题,这道题目可是花的时间就比较多了。
            首先先来认识一下C#中的DateTime这个数据类型。我们可以在对象浏览器或者 MSDN的DateTime结构 查看DateTime的操作,实在太多了,不过没事,用到的只是那么几句。
          <1>.DateTime是C#的一种表示日期和时间的类型,如获取当前的时间: DateTime.Now.ToString(“YYYY-MM-DD-HH-mm-ss”);
          <2>.还有一种类型是:System.TimeSpan,可用于两个DateTime类型的数运算,如: System.TimeSpan s = DateTime d1-DateTime d2;
          <3>. 想要获取当前时间:string nowTime = DateTime.Now.ToString("yyyy-MM-dd-HH"); 这里ToString()就是将时间类型转换成String类型,然后再根据“yyyy-MM-dd-HH”这样的格式将当前时间按照这样的格式输出。这些时间的输出格式有千百种,只要其中英文字母正确就没什么问题了,要注意的是MM:表示的是月份(Month),mm:表示的是分钟(minute),为了区分两者所以都是用大小写来区分。
         <4>.DateTime date = Convert.ToDateTime(string); 将字符串转换为DateTime类型
         <5>.数组的类型转换
1 数组的类型转换
2 
3 public static int StrToInt(string str)
4 {
5      return int.Parse(str);
6 }
7 
8 string[] arrs = new string[] { "100", "300", "200" };
9 int[] arri = Array.ConvertAll(arrs, new Converter<string, int>(StrToInt));

 

 
下面就上代码,好好理解
 1  static void Main(string[] args)
 2         {
 3             Console.WriteLine("你好,我是小Jun机器人,我是一个自我介绍的应用!!!\n");
 4             Console.Write("请输入您的姓名:");
 5             string name = Console.ReadLine();
 6             Console.Write("\n请输入你的性别(男/女):");
 7             string sex = Console.ReadLine();
 8             Console.WriteLine();
 9             if (sex == "")
10                 Console.WriteLine(name + "先生,您好!现在小Jun可以为您计算下一个生日的距离时间!");
11             else if (sex == "")
12                 Console.WriteLine(name + "女士,您好!现在小Jun可以为您计算下一个生日的距离时间!");
13             else
14             {
15                 Console.WriteLine();
16                 System.Environment.Exit(0); //强制退出
17             }
18             Console.Write("请您以(yyyy-mm-dd)的格式输入您的生日:");
19 
20             string birthday = Console.ReadLine();
21             string[] date = birthday.Split('-');
22             int[] date1 = Array.ConvertAll(date, new Converter<string, int>(StrToInt));
23 
24             string nowTime = DateTime.Now.ToString("yyyy-MM-dd-HH");
25             string[] date2 = nowTime.Split('-');
26 
27             int[] date3 = Array.ConvertAll(date2, new Converter<string, int>(StrToInt));
28 
29 
30             //下面是为了区分你是否过了今年的生日。
31             if (date3[1] - date1[1] >= 0)  //是否到了生日的月份
32             {
33                 double day;
34                 day = Convert.ToDouble(date3[0] - date1[0]) + Convert.ToDouble(date3[1] - date1[1]) / 12; //会有小数,没有计算到日
35                 Console.Write("\n您今年已经:{0} 岁了", Math.Round(day, 1));
36                 date1[0] = date3[0] + 1;  //过了今年的生日,所以要计算明年的生日
37 
38                 string s = string.Join("-", date1);
39 
40                 System.TimeSpan disTime = Convert.ToDateTime(s) - Convert.ToDateTime(nowTime);
41                 int hour = 24 - date3[3];
42                 Console.WriteLine(",距离下一次生日还剩"+Convert.ToInt32(disTime.TotalDays)+""+ hour+" 小时 ");
43             }
44             else
45             {
46                 double day;
47                 day = Convert.ToDouble(date3[0] - date1[0] - 1) + Convert.ToDouble(12 - date1[1] + date3[1]) / 12;
48                 Console.Write("\n您今年已经:{0} 岁了", Math.Round(day, 1));
49                 date1[0] = date3[0];  //还没过了今年的生日
50                 string s = string.Join("-", date1);
51 
52                 System.TimeSpan disTime = Convert.ToDateTime(s) - Convert.ToDateTime(nowTime);
53                 int hour = 24 - date3[3];
54                 Console.WriteLine(",距离下一次生日还剩 " + Convert.ToInt32(disTime.TotalDays) + "天," + hour + "小时");
55             }
56            
57             Console.ReadLine();
58 
59         }
60 
61         static int StrToInt(string s)  //将字符串转换为int型
62         {
63             return int.Parse(s);
64         }

 


 
      实验01完成奋斗,如果有疑问或者在哪些地方有错误的,欢迎大家指出,共同学习,共同进步。
 
 
 

转载于:https://www.cnblogs.com/JunStitch/p/8148701.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值