更多C#基础知识点可查看:C#学习笔记 - C#基础知识 - C#从入门到放弃
if
语句用于条件判断,其中包含一个布尔表达式,后面跟随着若干要执行的代码,当布尔表达式为真时,后面跟随的代码就会执行,if 语句的语法格式如下:
if(布尔表达式){
要执行的代码;
}
if 语句流程图:
【示例】判断一个数是否为偶数
int num = 12;
if (num % 2 == 0)
{
Console.WriteLine("num的值为偶数");
//Console.ReadKey();
}
Console.ReadKey();
执行结果:
num的值为偶数
但是当num的值为奇数时,屏幕不会有任何提示,若想打印提示,可以使用if…else语句。
if else
语句同样用于条件判断,它比 if 语句中多出了一个 else 语句,当布尔表达式为假时,执行 else 语句块中的代码,语法格式如下所示:
if(布尔表达式){
表达式为真时要执行的代码;
}else{
表达式为假时要执行的代码;
}
if else 语句的执行流程如下图所示:
【示例】用户输入一个数,打印出其偶数性。
程序代码:
Console.WriteLine("输入一个整数:");
int num = int.Parse(Console.ReadLine());
if (num % 2 == 0)
{
Console.WriteLine("num的值为{0},它是偶数",num);
}
else
{
Console.WriteLine("num的值为{0},它是奇数",num);
}
Console.ReadKey();
运行程序:
输入一个整数:
45
num的值为45,它是奇数
输入一个整数:
22
num的值为22,它是偶数
if else if
语句其实就是一个 if 语句后面跟随着若干个 else if else 语句,语句中可以包含多个条件表达式,程序会依次判断这些条件表达式,当条件表达式为真时则执行后面语句块中的代码,如果没有为真的条件表达式则执行 else 语句块中的代码,其语法格式如下所示:
if(布尔表达式 1){
布尔表达式 1 为真时要执行的代码;
}else if(布尔表达式 2){
布尔表达式 2 为真时要执行的代码;
}else if(布尔表达式 3){
布尔表达式 3 为真时要执行的代码;
}
...
else{
当所有布尔表达式都为假时要执行的代码;
}
需要注意的是,当布尔表达式为真,且成功执行它后面语句块中的代码后,会跳出 if else if
语句,语句中的其它部分不会再被执行。
if else if
语句的执行流程如下图所示:
【示例】
程序代码:
Console.WriteLine("请输入1-7判断是星期几:");
int week = int.Parse(Console.ReadLine());
//int.Parse用于将屏幕输入的语句转换为整型
if (week == 1)
Console.WriteLine("星期一");
else if (week == 2)
Console.WriteLine("星期二");
else if (week == 3)
Console.WriteLine("星期三");
else if (week == 4)
Console.WriteLine("星期四");
else if (week == 5)
Console.WriteLine("星期五");
else if (week == 6)
Console.WriteLine("星期六");
else if (week == 7)
Console.WriteLine("星期日");
else
Console.WriteLine("输入数值非1-7,重新输入");
Console.ReadKey();
执行程序:
请输入1-7判断是星期几:
5
星期五
请输入1-7判断是星期几:
9
输入数值非1-7,重新输入
switch
语句类似于if else if
语句,都可以根据表达式执行某个的语句块,其语法格式如下:
switch(表达式){
case value1:
//表达式的值为 value1 时,要执行的代码
break;
case value2:
//表达式的值为 value2 时,要执行的代码
break;
case value3:
//表达式的值为 value3 时,要执行的代码
break;
... ...
default:
//没有与表达式相匹配的值时,要执行的代码
break;
}
使用 switch 语句时必须遵守以下规则:
① switch 语句中表达式的值必须是一个整型或者枚举类型;
② 在一个 switch 语句中可以有任意数量的 case 语句,每个case 关键字后面要跟一个与表达式比较的值和一个冒号;
③ case 关键字后面的值必须与 switch中表达式的值具有相同的数据类型,并且必须是一个常量(也可以理解为是一个固定的值,不会随程序的运行发生改变);
④ 当表达式的值等于 case中的值时,就会执行 case 后面的语句,在遇到 break 关键字时停止;
⑤ 当遇到 break 关键字时,switch语句会停止运行,并跳转到 switch 语句以外的下一行代码继续运行;
⑥ 并不是每一个 case 语句后面都需要包含 break关键字,如果 case 语句为空(case 语句后面没有要执行的代码),则可以不包含 break 关键字,这时程序会继续执行后续的 case语句,直至遇到 break 关键字为止;
⑦ C# 不允许从一个 case 语句连续执行到下一个 case 语句,因此如果 case语句中包含要执行的语句,就必须包含 break 关键字或其他跳转语句;
⑧ 一个 switch 语句的末尾可以有一个可选的default(默认选项),当所有 case 语句都不能与表达式相匹配时则会执行 default 部分中的代码,而且 default 中的break 语句可以省略;
switch 语句的执行流程如下图所示:
【示例】根据用户输入的月份,判断2023年这个月份的天数。
程序代码:
//判断2023年每个月份的天数
//31天:1 3 5 7 8 10 12
//30天:4 6 9 11
//28天:2
Console.WriteLine("请输入1-12判断月份天数:");
int month = int.Parse(Console.ReadLine());
//int.Parse用于将屏幕输入的语句转换为整型
switch (month)
{
case 2: Console.WriteLine("本月有28天"); break;
case 4:
case 6:
case 9:
case 11:
Console.WriteLine("本月有30天"); break;
default:
Console.WriteLine("本月有31天"); break;
}
Console.ReadKey();
运行程序:
请输入1-12判断月份天数:
2
本月有28天
请输入1-12判断月份天数:
12
本月有31天
while
循环用于多次迭代一部分程序,特别是在迭代的次数不固定的情况下,建议使用 while
循环而不是 for
循环。while 循环的语法格式如下所示:
while(表达式){
循环主体; // 要执行的代码
}
需要注意的是,如果循环条件一开始就为false,那么循环体中的代码将不会执行,循环会被跳过。使用while循环时,需要注意确保在一定条件下循环终止,以避免无限循环。同时,需要适当地更新循环条件,使循环朝着正确的方向进行。其中,循环主体可以是一个单独的语句,也可以是多条语句组成的代码块,当表达式的为真时,循环会一直执行下去。
while 循环的执行流程如下图所示:
【示例】计算1+2+3+…+99+100的和。
程序代码:
int i = 1;
int sum = 0;
while (i < 101) {
sum += i;
i++;
}
Console.WriteLine("1-100的和是"+sum);
Console.ReadKey();
运行程序:
1-100的和是5050
do-while
循环是一种迭代语句,类似于 while
循环,它在循环体执行后检查条件是否为真。如果条件为真,则重复执行循环体,直到条件为假。
do-while
循环的语法格式如下:
do
{
// 循环体代码
}
while (condition);
语法说明:
① condition 是一个布尔表达式,表示循环继续执行的条件。循环体先执行一次,然后检查条件。如果条件为真,则继续重复执行循环体;如果条件为假,则循环终止。
② 需要注意的是,do-while
循环至少会执行一次循环体代码,即使条件一开始就为假。这与 while 循环的行为有所不同,因为 while 循环会在开始之前检查条件。
③ 在使用 do-while 循环时,要确保能在循环体内改变条件,确保循环有终止的机制,以避免出现无限循环。同时,根据实际情况,可以根据循环体的执行结果来决定是否继续循环。
【示例1】计算1+2+3+…+99+100的和。
程序代码:
int i = 1;
int sum = 0;
do
{
sum += i;
i++;
} while (i < 101);
Console.WriteLine("1-100的和是"+sum);
Console.ReadKey();
运行程序:
1-100的和是5050
【示例2】输入本金、利率和期待收益,计算多少年可以完成期待收益。
程序代码:
//银行存款问题
double Balance = 0;
double Rate = 0;
int Year = 0;
double TargetBalance = 0;
Console.WriteLine("请输入存款本金:");
Balance = double.Parse(Console.ReadLine());
Console.WriteLine("请输入当前利率百分比:");
Rate = double.Parse(Console.ReadLine()) / 100;
Console.WriteLine("请输入目标收益:");
//验证输入有效性
do
{
TargetBalance = double.Parse(Console.ReadLine());
if (TargetBalance <= Balance)
Console.WriteLine("Eorr:目标收益小于等于本金!重新输入目标收益:");
} while (TargetBalance <= Balance);
do
{
Balance *= (Rate + 1);
Year++;
} while (Balance < TargetBalance);
Console.Write("将会在{0}年内,达到收益{1}元。", Year, Balance);
Console.ReadKey();
}
运行程序:
请输入存款本金:
50000
请输入当前利率百分比:
2.5
请输入目标收益:
48000
Eorr:目标收益小于等于本金!重新输目标收益:!
55000
将会在4年内,达到收益55190.64453125元。
for
循环是一种常见的迭代语句,用于在特定的计数器条件下重复执行一段代码。for 循环由三个部分组成:初始化部分、循环条件和迭代部分。
for 循环的语法格式如下:
for (initialization; condition; iteration)
{
// 循环体代码
}
语法说明:
① initialization 是在循环开始之前执行的初始化语句,用于初始化循环计数器或其它变量。
② condition 是一个布尔表达式,表示循环继续执行的条件。只要条件为真,循环体就会继续执行;一旦条件为假,循环终止。
③ iteration 是在每次循环迭代之后执行的语句,用于更新循环计数器或变量。
for
循环的执行流程如下图所示:
【示例1】计算用户输入的数求其阶乘值。
程序代码:
//for循环求阶乘
//1!=1 2!=2*1 3!=3*2*1
Console.WriteLine("输入要求的阶乘数值:");
int a = int.Parse(Console.ReadLine());
int jc = 1;
for (int i = 1; i <= a; i++)
{
jc *= i;
}
Console.WriteLine("{0}!的结果是:{1}", a, jc);
Console.ReadKey();
}
运行程序:
输入要求的阶乘数值:
6
6!的结果是:720
【示例2】打印一个九九乘法表。
程序代码:
Console.WriteLine("=========================九九乘法表==========================");
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
Console.Write("{0}*{1}={2} ", j, i, i * j);
if (i * j < 10)
Console.Write(" ");
}
Console.WriteLine("");
}
Console.WriteLine("==============================================================");
Console.ReadKey();
执行程序:
=========================九九乘法表==========================
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
==============================================================
foreach
循环用于遍历集合或数组中的元素,它可以自动迭代集合中的每个元素,而无需手动控制迭代器或索引。foreach
循环提供了一种简洁和直观的方式来遍历集合。
foreach
循环的语法格式如下:
foreach (var item in collection)
{
// 循环体代码
}
语法说明:
① item 是用于表示集合中当前元素的变量,在每次迭代中被赋值为集合中的下一个元素。
② collection 是要遍历的集合,可以是数组、列表、字典等可枚举的数据结构。在每次迭代中,item 变量被赋值为集合中的下一个元素,直到遍历完所有元素为止。
③ 以下是一个示例,展示了使用 foreach 循环遍历数组中的元素并求和的例子:
④ 要注意foreach 循环只用于遍历集合或数组,不提供对集合中元素的修改操作。如果需要修改集合中的元素,可以使用传统的 for 循环或其他方式进行操作。
【示例】用户输入一个语句,根据空格剪切出单词换行输出。
程序代码:
Console.WriteLine("输入一个语句:");
string str = Console.ReadLine();
foreach (char word in str)
{
if (char.IsWhiteSpace(word))
{
Console.WriteLine(); //仅换行
}
else
{
Console.Write(word); //遇到空格前不换行输出
}
}
Console.ReadKey();
运行程序:
输入一个语句:
my name is flyer.cheng nice to meet you !
my
name
is
flyer.cheng
nice
to
meet
you
!
break
语句在前面switch
语句的时候已经有了简单的了解,它不仅可以用来终止 switch 语句,在循环语句中使用时还可以用来跳出循环,执行循环外的下一条语句。
如果是在嵌套循环中使用,例如在内层的循环中使用 break 语句,那么程序只会跳出内层的循环,并不会影响到外层循环的执行。
break
语句的执行原理如下图所示:
【示例】输出1-100的数字,每行10个,同时为3、4、5的倍数时退出循环并提示。
程序代码:
//输出1-100的数字,每行10个,同时为3、4、5的倍数时退出
Console.WriteLine("输出1-100的数字,每行10个,同时为3、4、5的倍数时退出:");
for (int i = 1; i < 101; i++)
{
if ((i % 3 == 0) && (i % 4 == 0) && (i % 5 == 0))
{
Console.WriteLine( );
Console.WriteLine("3、4、5公倍数倍数是{0},此时跳出循环。",i);
break;
}
if (i % 10 == 0)
Console.WriteLine(i);
else
{
if (i < 10)
Console.Write(" " + i + " ");
else
Console.Write(i + " ");
}
}
Console.ReadKey();
运行程序:
输出1-100的数字,每行10个,同时为3、4、5的倍数时退出:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59
3、4、5公倍数倍数是60,此时跳出循环。
continue
语句的工作原理与 break
语句类似,但是 continue
语句并不会跳出整个循环,而是跳过本次循环继续执行下一次的循环。
continue
的执行原理如下图所示:
【示例】输出1-100的数字,每行10个,同时为3、4的倍数时跳过,用**取代。
程序代码:
//输出1-100的数字,每行10个,同时为3、4的倍数时跳过,用**取代
Console.WriteLine("输出1-100的数字,每行10个,同时为3、4的倍数时跳过:");
for (int i = 1; i < 101; i++)
{
if ((i % 3 == 0) && (i % 4 == 0)) //&&(i % 5 == 0)
{
if (i % 10 == 0)
Console.WriteLine("**" + " ");
else
Console.Write("**" + " ");
continue;
}
if (i % 10 == 0)
Console.WriteLine(i);
else
{
if (i < 10)
Console.Write(" " + i + " ");
else
Console.Write(i + " ");
}
}
Console.ReadKey();
运行程序:
输出1-100的数字,每行10个,同时为3、4的倍数时跳过:
1 2 3 4 5 6 7 8 9 10
11 ** 13 14 15 16 17 18 19 20
21 22 23 ** 25 26 27 28 29 30
31 32 33 34 35 ** 37 38 39 40
41 42 43 44 45 46 47 ** 49 50
51 52 53 54 55 56 57 58 59 **
61 62 63 64 65 66 67 68 69 70
71 ** 73 74 75 76 77 78 79 80
81 82 83 ** 85 86 87 88 89 90
91 92 93 94 95 ** 97 98 99 100
跳转语句 return
用于在方法中提前返回结果并终止方法的执行。当使用 return
语句时,程序会立即退出当前方法,并返回指定的值(如果有)给调用者。
return
语句的用法有3种:返回一个值;无返回值;提前终止方法;
说明:
① return
用法:退出整个main函数
② return
语句只能出现在方法当中,当调用方法时,执行到return
语句时,直接跳转到Main( )
函数。
③ return
语句终止它出现在其中的方法的执行并将控制返回给调用方法。它还可以返回一个可选值。
④ 如果方法为 void 类型,则可以省略 return
语句
【示例】(有返回值)输入三个数,求平均值。
程序代码:
using System;
namespace return语句
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("输入三个数求平均值");
Console.WriteLine("输入第一个数:");
int num1 = int.Parse(Console.ReadLine());
Console.WriteLine("输入第二个数:");
int num2 = int.Parse(Console.ReadLine());
Console.WriteLine("输入第三个数:");
int num3 = int.Parse(Console.ReadLine());
double avg = fun_avg(num1,num2,num3);
Console.WriteLine("三个数的平均值是:" + avg);
Console.ReadKey();
}
//1、return有返回值时
static double fun_avg(int a,int b,int c) {
return (a+b+c) / 3;
}
}
}
运行程序:
输入三个数求平均值
输入第一个数:
37
输入第二个数:
29
输入第三个数:
42
三个数的平均值是:36
【示例】(无返回值)输入三个数,求平均值。
程序代码:
using System;
namespace return语句
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("输入三个数求平均值");
Console.WriteLine("输入第一个数:");
int num1 = int.Parse(Console.ReadLine());
Console.WriteLine("输入第二个数:");
int num2 = int.Parse(Console.ReadLine());
Console.WriteLine("输入第三个数:");
int num3 = int.Parse(Console.ReadLine());
fun_avg(num1,num2,num3);
Console.ReadKey();
}
//2、return不带返回值时
static void fun_avg(int a, int b, int c)
{
Console.WriteLine("三个数的平均值是:{0}", (a + b + c) / 3);
return;
}
}
}
运行程序:
输入三个数求平均值
输入第一个数:
19
输入第二个数:
53
输入第三个数:
48
三个数的平均值是:40
程序说明:
return
语句只能出现在方法当中,当调用方法时,执行到return
语句时,直接跳转到Main( )
函数。
goto
语句是一种跳转语句,用于将程序的控制转移到指定的标签处,从而改变执行流程。虽然 goto
语句在某些情况下可以提供一种跳转的方式,但由于容易造成代码结构混乱和可读性差的问题,一般不建议过多使用。
goto 语句的语法:
goto label;
// ...
label: statement;
语法说明:
label 是一个标签,用于标记代码中的位置。它由一个冒号和标识符组成,标识符可以是任意有效的名称。statement 是要执行的语句。
goto
语句来实现了一个简单的循环。程序使用标签 start 标记循环的入口,在每次迭代后通过 goto start; 语句将控制转移到标签处,从而实现了循环的目的。goto 语句可以实现代码跳转,但过多使用会对代码的可读性和维护性产生负面影响。建议在大多数情况下使用结构化的控制流语句(如 if
、for
、 while
或 do-while
),它们提供了更清晰和易于理解的代码结构。只在极少数情况下,当必要时再使用 goto
语句。为了提高代码的可读性和可维护性,应该遵循一致的代码风格和最佳实践,并避免滥用 goto
语句。
【示例1】打印1-5:
int i = 0;
start:
i++;
Console.WriteLine(i);
if (i < 5)
goto start;
【示例2】模拟一个账号密码登陆场景。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace goto语句
{
class Program
{
static void Main(string[] args)
{
int count = 1;
login:
Console.WriteLine("请输入用户名");
string username = Console.ReadLine();
Console.WriteLine("请输入密码");
string userpwd = Console.ReadLine();
if (username == "flyer" && userpwd == "123123")
{
Console.WriteLine("登录成功");
}
else
{
count++;
if (count > 3)
{
Console.WriteLine("用户名或密码错误次数超过3次!退出程序!");
}
else
{
Console.WriteLine("用户名或密码错误");
goto login;//返回login标签处重新输入用户名密码
}
}
Console.ReadKey();
}
}
}
运行程序(错误输入):
请输入用户名
fly
请输入密码
123123
用户名或密码错误
请输入用户名
flyer
请输入密码
13
用户名或密码错误
请输入用户名
flye
请输入密码
12312
用户名或密码错误次数超过3次!退出程序!
运行程序(正确输入):
请输入用户名
flyer
请输入密码
123123
登录成功