1. 顺序结构
1.1 赋值语句
赋值语句由一个赋值运算符构成,格式为:
变量 = 表达式;
- 功能:计算赋值号右边的表达式的值,并赋给赋值号左边的变量。
- 示例:
int age = 30;
- 注意:变量必须首先赋值,然后才能引用。赋值号两边的类型必须相同或符合隐式类型转换规则。
1.2 复合赋值语句与连续赋值语句
1.2.1 复合赋值语句
使用+=
、-=
、*=
、/=
等运算符构成的赋值语句。首先完成特定的运算,然后再进行赋值运算操作。
- 示例:
int x = 5; x += 6; string s = "abcd"; s += "efjh";
1.2.2 连续赋值语句
在一条语句中使用多个赋值运算符进行赋值,可以一次为多个变量赋予相同的值。
- 示例:
int x, y, z; x = y = z = 6; string s1, s2, s3; s1 = s2 = s3 = "efjh";
1.3 输入语句
通过计算机的外设把数据送到计算机内存的过程称为输入。C#语言的输入语句常用的有两种形式:
Console.Read();
Console.ReadLine();
- 区别:
ReadLine
在输入数据到各变量之后自动换行。
1.4 输出语句
输出是将内存中的数据送到外设的过程。C#语言的输出语句有两种形式:
Console.Write(输出项);
Console.WriteLine(输出项);
- 区别:
Write
语句输出后不换行,WriteLine
语句按项输出后,自动换行。
1.5 复合语句
复合语句是由若干语句组成的序列,语句之间用分号“;”隔开,并且以{ }
括起来,作为一条语句。
1.6 应用实例
1.6.1 【例4-1】计算圆的周长和面积
using System;
namespace P4_1 {
class Program {
static void Main(string[] args) {
const double PI = 3.141;
double R, L, S;
Console.Write("请输入圆的半径值:");
R = double.Parse(Console.ReadLine());
L = 2 * PI * R;
S = PI * R * R;
Console.WriteLine("圆的周长为:{0}", L);
Console.WriteLine("圆的面积为:{0}", S);
Console.ReadLine();
}
}
}
1.6.2 Parse方法和ToString方法
- Parse方法:将特定格式的字符串转换为数值。
- 示例:
int x = int.Parse("123");
- 示例:
- ToString方法:将其他数据类型的变量值转换为字符串类型。
- 示例:
int x = 123; string s = x.ToString();
- 示例:
1.6.3 【例4-2】实现两数的算术运算:和、差、积、商
using System;
using System.Windows.Forms;
public class SimpleArithmetic : Form
{
private Label resultLabel;
private TextBox textBox1;
private TextBox textBox2;
private Button addButton;
private Button subtractButton;
private Button multiplyButton;
private Button divideButton;
public SimpleArithmetic()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.resultLabel = new Label();
this.textBox1 = new TextBox();
this.textBox2 = new TextBox();
this.addButton = new Button();
this.subtractButton = new Button();
this.multiplyButton = new Button();
this.divideButton = new Button();
// 设置窗体属性
this.Text = "简单计算器";
this.Size = new System.Drawing.Size(300, 200);
// 设置文本框属性
this.textBox1.Location = new System.Drawing.Point(50, 20);
this.textBox2.Location = new System.Drawing.Point(50, 50);
this.textBox1.Size = new System.Drawing.Size(100, 20);
this.textBox2.Size = new System.Drawing.Size(100, 20);
// 设置按钮属性
this.addButton.Location = new System.Drawing.Point(160, 20);
this.addButton.Size = new System.Drawing.Size(50, 20);
this.addButton.Text = "加";
this.addButton.Click += new EventHandler(Add_Click);
this.subtractButton.Location = new System.Drawing.Point(160, 50);
this.subtractButton.Size = new System.Drawing.Size(50, 20);
this.subtractButton.Text = "减";
this.subtractButton.Click += new EventHandler(Subtract_Click);
this.multiplyButton.Location = new System.Drawing.Point(160, 80);
this.multiplyButton.Size = new System.Drawing.Size(50, 20);
this.multiplyButton.Text = "乘";
this.multiplyButton.Click += new EventHandler(Multiply_Click);
this.divideButton.Location = new System.Drawing.Point(160, 110);
this.divideButton.Size = new System.Drawing.Size(50, 20);
this.divideButton.Text = "除";
this.divideButton.Click += new EventHandler(Divide_Click);
// 设置标签属性
this.resultLabel.Location = new System.Drawing.Point(50, 140);
this.resultLabel.Size = new System.Drawing.Size(200, 20);
// 将控件添加到窗体
this.Controls.Add(this.textBox1);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.addButton);
this.Controls.Add(this.subtractButton);
this.Controls.Add(this.multiplyButton);
this.Controls.Add(this.divideButton);
this.Controls.Add(this.resultLabel);
}
private void Add_Click(object sender, EventArgs e)
{
double result = double.Parse(textBox1.Text) + double.Parse(textBox2.Text);
resultLabel.Text = "结果: " + result.ToString();
}
private void Subtract_Click(object sender, EventArgs e)
{
double result = double.Parse(textBox1.Text) - double.Parse(textBox2.Text);
resultLabel.Text = "结果: " + result.ToString();
}
private void Multiply_Click(object sender, EventArgs e)
{
double result = double.Parse(textBox1.Text) * double.Parse(textBox2.Text);
resultLabel.Text = "结果: " + result.ToString();
}
private void Divide_Click(object sender, EventArgs e)
{
try
{
double result = double.Parse(textBox1.Text) / double.Parse(textBox2.Text);
resultLabel.Text = "结果: " + result.ToString();
}
catch (DivideByZeroException)
{
resultLabel.Text = "错误:除数不能为0";
}
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SimpleArithmetic());
}
}
2. 选择结构
2.1 if 条件语句
2.1.1 单分支if语句
格式:
if (布尔条件表达式) {
内嵌语句序列1;
}
2.1.2 双分支if语句
格式:
if (布尔条件表达式) {
内嵌语句序列1;
} else {
内嵌语句序列2;
}
2.1.3 多分支if语句
格式:
if(表达式1) {
内嵌语句序列1;
} else if(表达式2) {
内嵌语句序列2;
} else if(表达式3) {
...
} else {
内嵌语句序列n;
}
2.1.4 【例4-3】商品打折
using System;
class Program
{
static void Main()
{
Console.WriteLine("请输入商品的原价:");
double originalPrice = Convert.ToDouble(Console.ReadLine());
double discountPrice = CalculateDiscountPrice(originalPrice);
Console.WriteLine($"优惠后的价格是:{discountPrice:F2}元");
}
static double CalculateDiscountPrice(double originalPrice)
{
if (originalPrice <= 1000)
{
return originalPrice * 0.9; // 9折优惠
}
else
{
return originalPrice * 0.8; // 8折优惠
}
}
}
2.1.5 【例4-4】学生成绩等级
using System;
class Program
{
static void Main()
{
Console.WriteLine("请输入百分制成绩:");
int score = Convert.ToInt32(Console.ReadLine());
string grade = ConvertScoreToGrade(score);
Console.WriteLine($"对应的五分制成绩是:{grade}");
}
static string ConvertScoreToGrade(int score)
{
if (score >= 90)
{
return "优秀";
}
else if (score >= 80)
{
return "良";
}
else if (score >= 70)
{
return "中";
}
else if (score >= 60)
{
return "及格";
}
else
{
return "不及格";
}
}
}
2.2 switch 语句
格式:
switch(表达式) {
case 常数表达式:
语句块
跳转语句(如break、return、goto)
// 其他的case子句
default:
语句块
}
2.3 应用实例
2.3.1 【例4-5】判断属相
输入0~11的整数,判断其对应的十二生肖。
using System;
class Program
{
static void Main()
{
Console.WriteLine("请输入0~11之间的整数,以确定对应的十二生肖:");
int number = Convert.ToInt32(Console.ReadLine());
string zodiacSign = "";
switch (number)
{
case 0:
zodiacSign = "猴";
break;
case 1:
zodiacSign = "鸡";
break;
case 2:
zodiacSign = "狗";
break;
case 3:
zodiacSign = "猪";
break;
case 4:
zodiacSign = "鼠";
break;
case 5:
zodiacSign = "牛";
break;
case 6:
zodiacSign = "虎";
break;
case 7:
zodiacSign = "兔";
break;
case 8:
zodiacSign = "龙";
break;
case 9:
zodiacSign = "蛇";
break;
case 10:
zodiacSign = "马";
break;
case 11:
zodiacSign = "羊";
break;
default:
Console.WriteLine("输入的数字不在0~11之间,请重新输入。");
return;
}
Console.WriteLine($"对应的十二生肖是:{zodiacSign}");
}
}
2.3.2 【例4-6】学生成绩输入程序
要求两个文本框不能为空且成绩应在0~100之间,单选按钮必须有一个被选择。
using System;
using System.Windows.Forms;
public class Form1 : Form
{
private TextBox textBoxScore1;
private TextBox textBoxScore2;
private RadioButton radioButton1;
private RadioButton radioButton2;
private Button buttonSubmit;
public Form1()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.textBoxScore1 = new TextBox();
this.textBoxScore2 = new TextBox();
this.radioButton1 = new RadioButton();
this.radioButton2 = new RadioButton();
this.buttonSubmit = new Button();
this.buttonSubmit.Text = "Submit";
this.buttonSubmit.Click += new EventHandler(SubmitButton_Click);
this.radioButton1.Text = "Option 1";
this.radioButton2.Text = "Option 2";
this.Controls.Add(this.textBoxScore1);
this.Controls.Add(this.textBoxScore2);
this.Controls.Add(this.radioButton1);
this.Controls.Add(this.radioButton2);
this.Controls.Add(this.buttonSubmit);
this.Load += new EventHandler(Form1_Load);
}
private void Form1_Load(object sender, EventArgs e)
{
this.textBoxScore1.Location = new System.Drawing.Point(50, 50);
this.textBoxScore2.Location = new System.Drawing.Point(50, 100);
this.radioButton1.Location = new System.Drawing.Point(50, 150);
this.radioButton2.Location = new System.Drawing.Point(50, 200);
this.buttonSubmit.Location = new System.Drawing.Point(50, 250);
}
private void SubmitButton_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxScore1.Text) || string.IsNullOrEmpty(textBoxScore2.Text))
{
MessageBox.Show("两个文本框不能为空。", "验证失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (!int.TryParse(textBoxScore1.Text, out int score1) || score1 < 0 || score1 > 100)
{
MessageBox.Show("第一个文本框中的成绩应在0到100之间。", "验证失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (!int.TryParse(textBoxScore2.Text, out int score2) || score2 < 0 || score2 > 100)
{
MessageBox.Show("第二个文本框中的成绩应在0到100之间。", "验证失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (!radioButton1.Checked && !radioButton2.Checked)
{
MessageBox.Show("必须选择一个单选按钮。", "验证失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
MessageBox.Show("验证成功!", "验证成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
2.3.3 【例4-7】航空公司票价优惠
某航空公司规定在旅游的旺季7-9月份,如果订票数超过20张,票价优惠15%,20张以下优惠5%;在旅游的淡季1~5月份、10月份、11月份,如果订票数超过20张,票价优惠30%,20张以下优惠20%;其他情况一律优惠10%。试设计程序,根据月份和订票张数决定票价的优惠率
using System;
class Program
{
static void Main()
{
Console.WriteLine("请输入月份(1-12):");
int month = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入订票张数:");
int tickets = Convert.ToInt32(Console.ReadLine());
double discountRate = CalculateDiscountRate(month, tickets);
Console.WriteLine($"优惠率是:{discountRate * 100:F2}%");
}
static double CalculateDiscountRate(int month, int tickets)
{
// 旺季:7月到9月
// 淡季:1月到5月,10月,11月
// 其他月份:6月,12月
if (month >= 7 && month <= 9)
{
if (tickets > 20)
{
return 0.85; // 旺季超过20张,优惠15%
}
else
{
return 0.95; // 旺季20张以下,优惠5%
}
}
else if (month >= 1 && month <= 5 || month == 10 || month == 11)
{
if (tickets > 20)
{
return 0.70; // 淡季超过20张,优惠30%
}
else
{
return 0.80; // 淡季20张以下,优惠20%
}
}
else
{
return 0.90; // 其他情况,优惠10%
}
}
}
3. 循环结构
3.1 for 循环语句
3.1.1 语法格式
for (表达式1; 表达式2; 表达式3) {
循环语句序列;
}
3.1.2 【例4-8】使用for语句计算1+2+3+…100。
计算1+2+3+…100的值。
int sum = 0;
for(int k = 1; k <= 100; k = k + 1) {
sum = sum + k;
}
Console.WriteLine("从1加到100值为" + sum.ToString());
3.2 while、do…while语句
3.2.1 while语句
语法格式:
while (条件表达式) {
语句序列;
}
3.2.2 do…while语句
语法格式:
do {
语句序列;
} while (布尔条件表达式);
3.2.3 【例4-9】使用do…while语句实现1+2+3+…100。
使用do…while语句实现1+2+3+…100。
int sum = 0;
int k = 1;
do {
sum = sum + k;
k = k + 1;
} while (k <= 100);
Console.WriteLine("从1加到100值为" + sum.ToString());
3.3 循环嵌套
循环嵌套是指在一个循环结构内部再包含另一个循环结构。这种结构在编程中非常常见,尤其是在需要处理多维数据或进行复杂迭代时。下面我将分别解释几种常见的循环嵌套:
3.3.1 for 循环嵌套
for
循环通常用于在已知迭代次数的情况下进行循环。当嵌套时,外层循环每迭代一次,内层循环就会完全执行一次。
for (int i = 0; i < 3; i++) // 外层循环
{
for (int j = 0; j < 2; j++) // 内层循环
{
Console.WriteLine($"外层索引: {i}, 内层索引: {j}");
}
}
输出:
外层索引: 0, 内层索引: 0
外层索引: 0, 内层索引: 1
外层索引: 1, 内层索引: 0
外层索引: 1, 内层索引: 1
外层索引: 2, 内层索引: 0
外层索引: 2, 内层索引: 1
3.3.2 while 循环嵌套
while
循环在条件为真时持续执行。当嵌套时,同样地,外层循环每迭代一次,内层循环就会完全执行一次。
int i = 0;
while (i < 3)
{
int j = 0;
while (j < 2)
{
Console.WriteLine($"外层索引: {i}, 内层索引: {j}");
j++;
}
i++;
}
3.3.3 do-while 循环嵌套
do-while
循环至少执行一次,之后每次迭代都会检查条件。嵌套方式与 while
循环类似。
int i = 0;
do
{
int j = 0;
do
{
Console.WriteLine($"外层索引: {i}, 内层索引: {j}");
j++;
} while (j < 2);
i++;
} while (i < 3);
- 外层循环:控制整体的迭代次数。
- 内层循环:在外层循环的每次迭代中都会完全执行一次。
应用场景
- 多维数组处理:例如,处理一个二维数组时,通常需要使用两层循环。
- 图形打印:例如,打印一个图案,可能需要在行和列上进行迭代。
- 算法实现:例如,在搜索算法中,可能需要在多个维度上进行搜索。
循环嵌套可以提高代码的灵活性和复用性,但同时也可能导致代码难以理解和调试。因此,在设计循环嵌套时,需要仔细考虑逻辑和结构。
3.4 应用实例
3.4.1 【例4-10】使用计数器循环语句(for)要求输出大于5的数 。
using System;
class Program
{
static void Main()
{
for (int i = 1; i <= 10; i++)
{
if (i <= 5)
{
continue; // 如果i小于或等于5,跳过当前循环的剩余部分
}
Console.WriteLine(i); // 输出大于5的数
}
}
}
3.4.2 【例4-11】计算n!,假设n=10。
计算n!,假设n=10。
int sum = 1;
for (int k = 1; k <= 10; k++) {
sum = sum * k;
}
Console.WriteLine(sum.ToString());
3.4.3 【例4-12】求300以内的素数
static private Boolean IsSuShu(int x) {
Boolean Yes = true;
for (int i = 2; i <= Math.Sqrt(x); i++) {
if ((x % i) == 0) {
Yes = false;
}
}
return Yes;
}
for (int i = 2; i < 300; i++) {
if (IsSuShu(i) == true) {
Console.Write(i.ToString());
Console.Write(" ");
}
}
3.4.4 【例4-13】对折纸的厚度—珠穆朗玛峰
对折纸达到珠穆朗玛峰的高度。
int n = 0;
float h;
Console.Write("请输入纸的厚度:\n");
h = float.Parse(Console.ReadLine());
while (h < 8844430) {
n = n + 1;
h = 2 * h;
}
Console.WriteLine(n.ToString());
3.4.5 【例4-14】编程实现九九乘法表。
string s = "";
int sum;
for (int i = 1; i < 10; i = i + 1) {
s = "";
for (int k = 1; k <= i; k = k + 1) {
sum = k * i;
s = s + k.ToString() + "×" + i.ToString() + "=" + sum.ToString() + ";";
}
Console.WriteLine(s);
}
本章小结
C#程序的流程控制是通过顺序结构、选择结构和循环结构以及转移语句实现的。
- if语句
- switch语句
- while语句
- do-while语句