
1.3 程序解析
本章中解析的3个程序的功能分别为:求解数学表达式的值、求解线性方程组以及通过自定义函数的定义和调用来作出合理的判断。阅读和理解这3个程序有助于读者理解C#程序的一般结构,学会编写最常用的具有赋值、输入和输出等功能的C#程序。
程序1-1 计算并联电阻
本程序所完成的任务是:根据物理学中的公式,计算包含了多个并联电阻的电路中的电阻值和电流值。
1. 编程序所依据的算法
本程序按顺序执行以下操作。
(1)输入电阻r1和r2;
(2)求电阻r1和r2的并联电阻:。
(3)如果两端电压为u,求总电流和经过每个电阻的电流。
(4)输出总电阻和电流。
提示:程序中变量r1和r2分别写成r1和r2。求并联电阻的公式写成:r=(r1*r2)/(r1+r2)
2. 程序源代码
本程序运行通过后,文件Program.cs文件中的内容如下。
//程序1-1_计算并联电阻 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 计算并联电阻 { class Program { static void Main(string[] args) { //输入电阻和电压 Console.Write(" 电阻r1= ?"); double r1 = Convert.ToDouble(Console.ReadLine()); Console.Write(" 电阻r2= ?"); double r2 = Convert.ToDouble(Console.ReadLine()); Console.Write(" 电压u=?"); double u = Convert.ToDouble(Console.ReadLine()); //计算电阻和电流 double r = (r1 * r2) / (r1 + r2); // 计算总(并联)电阻 double i = u / r; //计算总电流 double i1 = u / r1; //计算经过电阻 r1的电流 double i2 = u / r2; //计算经过电阻 r2的电流 //输出总电阻和电流 Console.WriteLine("电阻{0} 和{1} 的并联电阻={2}", r1, r2, r); Console.WriteLine("电路中的总电流 i={0}", i); Console.WriteLine("经过电阻 r1的电流 i1={0}", i1); Console.WriteLine("经过电阻 r1的电流 i2={0}", i2); } } }
本程序中的几个输出变量实际上可以不要。例如,如果没有定义表示总电阻的r变量,则可使用语句
Console.WriteLine("电阻{0}和{1}的并联电阻={2}", r1, r2, (r1*r2)/(r1+r2));
代替两个语句
double r = (r1 * r2) / (r1 + r2); //计算总(并联)电阻 Console.WriteLine("电阻{0}和{1}的并联电阻={2}", r1, r2, r);
来计算并输出总电阻的值。当然,此后在计算总电流时,就需要重新计算总电阻的值了。
3. 程序的运行结果
本程序的一次运行结果如图1-17所示。

图1-17 程序1-1的运行窗口
可以看到,当用户按程序的提示输入了3个数239、326和220之后,程序便会根据这3个已知数计算并输出并联电阻、总电流以及流经两个电阻的电流。
程序1-2 求解二元一次方程组
本程序所完成的任务是:求解二元一次方程组。

1. 编程序所依据的算法
假定二元一次方程的一般形式为:
则本程序将按顺序完成以下操作。
(1)输入a1、a2、b1、b2、c1、c2的值。
(2)求三个行列式的值:,

(3)求方程的根:
(4)输出方程的根x和y。
2. 程序源代码
//程序1-2_求解二元一次方程组 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 求解二元一次方程组 { class Program { static void Main(string[] args) { //定义变量:方程 1 系数 a1、b1、c1;方程 2 系数a2、b2、c2 double a1, a2, b1, b2, c1, c2; //输入两个方程的系数 Console.Write(" 方程1 的系数(数与数之间 1 个空格):a1= ?b1= ?c1= ? "); string [] abc = Console.ReadLine().Split(' '); a1 = double.Parse(abc[0]); b1 = double.Parse(abc[1]); c1 = double.Parse(abc[2]); Console.Write("方程2 的系数(数与数之间 1 个空格):a2= ?b2= ?c2= ? "); abc = Console.ReadLine().Split(' '); a2 = double.Parse(abc[0]); b2 = double.Parse(abc[1]); c2 = double.Parse(abc[2]); //计算三个行列式的值 double d = a1 * b2 - a2 * b1; double dx = c1 * b2 - c2 * b1; double dy = a1 * c2 - a2 * c1; //计算并输出方程的根 Console.WriteLine("二元一次方程组的解:x={0}、y={1}。", dx/d, dy/d); } } }
本程序中的语句
string[] abc = Console.ReadLine().Split(' ');
的功能为:定义字符串数组(多个字符串构成的字符串序列)abc,将键入的由3个数字组成的字符串按数与数之间的窗格分离成3个数字型子字符串,分别赋值给数组abc中的3个元素。在这个语句之后,使用语句
a1 = double.Parse(abc[0]); b1 = double.Parse(abc[1]); c1 = double.Parse(abc[2]);
将abc数组中的3个元素abc [0]、abc[1]和abc[2]分别转换成双精度型数并分别赋值给a1、b1和c1 3个变量。
本程序中未定义用于表示计算结果的变量,而是直接在输出语句
Console.WriteLine("二元一次方程组的解:x={0}、y={1}。", dx/d, dy/d);
中计算并输出方程的解(两个自变量的值)。
3. 程序的运行结果
按照给定的二元一次方程组,本程序的运行结果如图1-18所示。

图1-18 程序1-2的运行窗口
程序1-3 3个数排序
本程序所完成的任务是:将用户输入的3个整数排成从小到大的“升序”,并按升序输出这3个数。
1. 编程序所依据的算法
本程序按顺序执行以下操作。
(1)输入3个整数n1、n2、n3。
(2)按以下步骤将3个整数排成升序。
• 判断:n1>n2?是则n1和n2互换其值。
• 判断:n1>n3?是则n1和n3互换其值。
• 判断:n2>n3?是则n2和n3互换其值。
(3)输出3个整数n1、n2、n3。
注意
在第(2)步中,先找出3个数中的最小数放在最前面,再找出剩余两个数中的最小数紧随其后,最后剩余的一个数放在最后面。这样,3个数就排成了升序。如果将这种方法运用到n个数的排序操作,就成为常用的“选择排序法”了。
2. 窗体设计
本程序中,设计图1-19所示的窗体,上面摆放3行控件。

图1-19 程序1-3的运行窗口
(1)窗体Form1的Text属性取值为“3个整数排序”。
(2)第1行放3个标签(Lable),其Text属性分别取值为“第1个数”“第2个数”“第3个数”,以便提示用户第2行中相应文本框的用途。
(3)第2行放3个文本框(TextBox),准备提供给用户分别输入3个整数。
(4)第3行左侧放一个按钮(Button),其Text属性分别取值为“3个数排序”。本程序的主要代码将会放在该按钮的单击事件方法中。
(5)第3行右侧放一个标签,其Text属性取值为“在此显示排成升序的3个数”。
3. 程序源代码
本程序中编写的代码放在按钮的单击事件方法中,其内容如下。
//程序1-3_3个整数排序 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 三个数排序 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void bu tton1_Click(object sender, EventArgs e) { //获取三个文本框的值 string t1 = textBox1.Text; string t2 = textBox2.Text; string t3 = textBox3.Text; //定义三个整型变量 int n1 = 0; int n2 = 0; int n3 = 0; //三个文本框中的数字型字符串转换成整数并分别赋值给三个整型变量 if(int.TryParse(t1, out n1)) //若t1能转换成 int 类型 n1 = int.Parse(t1); //则t1赋值给 n1 else // 否则输出错误信息并退出本事件方法 { MessageBox.Show("左框非整数,修改后再排序!"); return; } if(int.TryParse(t2, out n2)) n2 = int.Parse(t2); else { MessageBox.Show("中框非整数,修改后再排序!"); return; } if(int.TryParse(t3, out n3)) n3 = int.Parse(t3); else { MessageBox.Show("右框非整数,修改后再排序!"); return; } //三个整数排序 if(n1>n2) { int t=n1; n1=n2; n2=t; } if(n1>n3) { int t=n1; n1=n3; n3=t; } if(n2>n3) { int t=n2; n2=n3; n3=t; } //显示排成了升序的三个数 label4.Text =n1.ToString()+ ", " + n2.ToString()+ ", " +n3.ToString(); } } }
4. 程序的运行结果
本程序运行后,分别在3个文本框中输入3个数并单击“三个数排序”按钮,就会在标签上显示排成升序的3个数,如图1-20所示。

图1-20 程序1-3的运行窗口
如果文本框中输入的不是正确的整数,如图1-21(a)所示,就会弹出如图1-21(b)所示的消息框。只有单击其中的“确定”按钮,再更正右框中的错误,才能再次单击按钮执行排序操作。

图1-21 程序1-3又一次运行的窗口