强烈建议在 WinForm 编程,千万不要用 Console 终端编程,否则局限性太大了。
一、基础知识
1.1 Absolute Value at Wiki
In mathematics, the absolute value or modulus of a real number x, denoted |x|, is the non-negative value of x without regard to its sign. Namely, |x|=x if x is a positive number, and |x|=-x if x is negative (in which case negating x makes -x positive), and |0|=0. For example, the absolute value of 3 is 3, and the absolute value of −3 is also 3. The absolute value of a number may be thought of as its distance from zero.
在数学中,实数x的绝对值或模,表示为|x|,是x的非负值,而不考虑其符号。也就是说,如果x是正数,|x|=x,如果x为负数,|x|=-x(在这种情况下,x为负数使-x为正数),|0|=0。例如,3的绝对值为3,−3的绝对值也是3。一个数字的绝对值可以被认为是它离零的距离。
1.2 编程 = 逻辑
绝对值的逻辑是:如果x是正数,|x|=x,如果x为负数,|x|=-x。
二、编程之旅
1.1 搭建合适的编程环境
点击下面的链接学习(动画演示,步步未惊心!):
1.2 基本代码——第一块砖
本段代码实现绝对值计算的逻辑。
private void button1_Click(object sender, EventArgs e)
{
// 给出一个初值
int a = 19;
// 保存绝对值的变量
int b;
// 计算绝对值的逻辑
if (a < 0) b = -a;
else b = a;
// 显示计算结果
string s = "a = " + a + "\n";
s += "|a| = " + b;
MessageBox.Show(s, "绝对值计算");
}
计算结果是:
1.3 灵活代码——机制砖
初始值是一个固定的值。咱们来一个稍微有趣一点的。
private void button1_Click(object sender, EventArgs e)
{
// 定义一个随机发生器(类似于彩票摇奖机)
Random rand = new Random();
// 生成一个随机初值(-50...50之间)
int a = rand.Next(100) - 50;
// 保存绝对值的变量
int b;
// 计算绝对值的逻辑
if (a < 0) b = -a;
else b = a;
// 显示计算结果
string s = "a = " + a + "\n";
s += "|a| = " + b;
MessageBox.Show(s, "绝对值计算");
}
某次(因为每次都可能不同)计算结果:
通过这段代码,咱们还学到了 随机数!
1.4 简约代码——木砖
这么简单的事,有必要写这么多行代码?
private void button1_Click(object sender, EventArgs e)
{
// 定义一个随机发生器(类似于彩票摇奖机)
Random rand = new Random();
// 生成一个随机初值(-50...50之间)
int a = rand.Next(100) - 50;
// 计算绝对值的逻辑
int b = (a < 0) ? -a : a;
// 显示计算结果
string s = "a = " + a + "\n|a| = " + b;
MessageBox.Show(s, "绝对值计算");
}
1.5 函数(方法)来了——预制块
以上的代码只能出现于教室。编程的基本思路之一就是“做同样的事,都写成函数”。
函数(方法)是实现一小部分程序逻辑的功能性代码组。
/// <summary>
/// 生成一个随机数
/// (-n/2...n/2之间)
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
private static int RandNumber(int n)
{
// 定义一个随机发生器(类似于彩票摇奖机)
Random rand = new Random((int)DateTime.Now.Ticks);
// 加一点点延迟,否则两个随机数会一样!
Thread.Sleep(10);
// 生成一个随机初值(-n/2...n/2之间)
return rand.Next(n) - (n / 2);
}
/// <summary>
/// 计算绝对值的函数(方法)
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static int Abs(int a)
{
return (a < 0) ? -a : a;
}
private void button1_Click(object sender, EventArgs e)
{
int a1 = RandNumber(100);
int a2 = RandNumber(100);
string s = "";
s += "a1 = " + a1 + "\n|a1| = " + Abs(a1) + "\n";
s += "a2 = " + a2 + "\n|a2| = " + Abs(a2);
MessageBox.Show(s, "绝对值计算");
}
因为想生成多个随机数,所以需要一个“生成随机数的函数”,RandNumber;
因为需要计算多个数值的绝对值,所以需要一个“计算绝对值的函数” Abs;
希望以上的代码,使得你能学到:
(1)怎么把重要的、重复的是都写成函数!
(2)怎么生成真正的(相对而言)随机数!
1.6 打包的函数——预制件
把一些相关的函数(方法,Method)及其他信息写在一个程序,就是类(class)。多个类可以组成命名空间(namespace),一个或多个命名空间可以组合成一个包,就是函数库(组件)。
namespace Legalsoft.Math
{
public static class EMath
{
/// <summary>
/// 生成一个随机数
/// (-n/2...n/2之间)
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static int RandNumber(int n)
{
// 定义一个随机发生器(类似于彩票摇奖机)
Random rand = new Random((int)DateTime.Now.Ticks);
Thread.Sleep(10);
// 生成一个随机初值(-n/2...n/2之间)
return rand.Next(n) - (n / 2);
}
/// <summary>
/// 计算绝对值的函数(方法)
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static int Abs(int a)
{
return (a < 0) ? -a : a;
}
}
}
button1_Click(...) 就写成:
using Legalsoft.Math;
private void button1_Click(object sender, EventArgs e)
{
int a1 = EMath.RandNumber(100);
int a2 = EMath.RandNumber(100);
string s = "";
s += "a1 = " + a1 + "\n|a1| = " + EMath.Abs(a1) + "\n";
s += "a2 = " + a2 + "\n|a2| = " + EMath.Abs(a2);
MessageBox.Show(s, "绝对值计算");
}
1.7 函数库(组件)来了——预制建筑
如果每个类、函数、命名空间、函数库都这么写,开发效率就太低了。此谓之“重复造车轮”。
C/C++,C#,Java 等编程语言都有极其丰富的“函数库(组件)”供大家使用。
/// <summary>
/// 生成一个随机数
/// (-n/2...n/2之间)
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
private static int RandNumber(int n)
{
// 定义一个随机发生器(类似于彩票摇奖机)
Random rand = new Random((int)DateTime.Now.Ticks);
Thread.Sleep(10);
// 生成一个随机初值(-n/2...n/2之间)
return rand.Next(n) - (n / 2);
}
private void button1_Click(object sender, EventArgs e)
{
int a1 = RandNumber(100);
int a2 = RandNumber(100);
string s = "";
// 实际上,无需自行编写 Abs 函数,Math 函数库就有!
s += "a1 = " + a1 + "\n|a1| = " + Math.Abs(a1) + "\n";
s += "a2 = " + a2 + "\n|a2| = " + Math.Abs(a2);
MessageBox.Show(s, "绝对值计算");
}
上面代码,去掉了 Abs 函数,因为 C# 语言的(内部,听起来很高级!)函数库就有啊。
以后可用从一下几个方面获得函数库:
(1)自己编写的,日积月累的;
(2)小组或团队编写的,月累日积的;
(3)网络开源的;强烈推荐 NuGet !
(4)闭源的,无法看到源代码;
(5)未经允许的反编译获得,小人之为!