一、程序结构
结构化程序设计的原则可表示为:程序=(算法)+(数据结构)。
结构化程序设计的三种基本结构是:顺序结构、选择结构和循环结构。
1.1 顺序结构
顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的。
C#的基本结构就是顺序结构,除非特别指明,否则就都按照先后顺序一句一句执行,它是最简单的算法结构。
语句与语句之间都是按照从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,顺序结构是任何一个算法都离不开的一种基本算法结构。
int a = 10;
int b = 20;
int c = a + b;
Console.WriteLine(c);
这段代码首先定义了两个变量 a 和 b,然后计算它们的和,最后输出结果 c。这就是一个典型的顺序结构。
1.2 分支结构
分支结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行。
1.2.1 if结构
(1)if单选择结构
当我们需要判断一个东西是否可行,如果可行我们就会执行一些语句的时候,我们就会用if单选择语句来表示,语法如下:
if(布尔表达式){
//如果布尔表达式的值为true时将执行的语句
}
int a = 10;
int b = 10;
if (a == b)
{
Console.WriteLine("a 等于 b");
}
(2)if双选择结构
当我们需要判断一个东西是否可行,如果可行我们就需要执行一段语句,如果不可行我们就需要执行另一段语句时,我们就会用if双选择语句来表示,语法如下:
if (布尔表达式)
{
//如果布尔表达式的值为true时将执行的语句
}
else
{
//如果布尔表达式的值为false时将执行的语句
}
int a = 20;
int b = 10;
if (a > b)
{
Console.WriteLine("a 大于 b");
}
else
{
Console.WriteLine("a 小于 b");
}
(2)if多选择结构
当我们需要判断一个东西是否满足多种不同的条件,如果条件一满足我们就需要执行语句一,如果条件二满足我们就需要执行语句二,如果条件三满足我们就需要执行语句三 … 我们就会用if多选择语句来表示,语法如下:
if (布尔表达式1)
{
//如果布尔表达式1的值为true时将执行的语句
}
else if (布尔表达式2)
{
//如果布尔表达式1的值为false时,并且布尔表达式2为true时将执行的语句
}
...
else
{
//如果布尔表达式2的值为false时将执行的语句
}
int score = 61;
//判断成绩
if (score <= 100 && score >= 90)
{
Console.WriteLine("优");
}
else if (score < 90 && score >= 80)
{
Console.WriteLine("良");
}
else if (score < 80 && score >= 60)
{
Console.WriteLine("及格");
}
else if (score < 60 && score >= 0)
{
Console.WriteLine("不及格");
}
else
{
Console.WriteLine("成绩不合法");
}
这里的程序就会根据用户输入的不同数据而执行不同的语句。
if语句是可以嵌套的,嵌套时注意程序的整体结构,{和}需要对应。
1.2.2 switch结构
switch 结构允许你基于不同的条件执行不同的代码块。例如:
switch(表达式){
case value1:
//语句1
break;//可选
case value2:
//语句2
break;//可选
...
case valuen:
//语句n
break;//可选
default: //可选
//语句n+1
}
case语句中的value值应该与对应的switch语句的表达式的值一致,当switch表达式的值“命中”某条case语句的值时,就会执行对应case语句中的代码,然后按照顺序结构来执行,直到break语句出现或者switch语句的结束来结束这个switch语句。
break语句表示结束,中止的意思,它在switch语句中表示结束这个switch语句,它在switch语句中一般都会与case配对,如不配对,就可能会出现case穿透现象。
default语句不需要vaule值,因为它只有它对应的switch的表达式未“命中”case语句。
char grade = 'A';
switch (grade)
{
case 'A': //匹配到A执行
Console.WriteLine("优");
break; //结束switch语句
case 'B': //匹配到B执行
Console.WriteLine("良");
break;
case 'C': //匹配到C执行
Console.WriteLine("及格");
break;
case 'D': //匹配到D执行
Console.WriteLine("不及格");
break;
default: //未匹配到时执行
Console.WriteLine("等级有误!");
break;
}
上述代码会根据grade值的不同执行不同的代码。
case穿透:因为switch表达式命中case语句之后,如果后续并未遇到break语句,它就会按照顺序结构执行下去,这个现象就称作case穿透(上述代码中去掉break就可明显观察到case穿透现象)。
1.3 循环结构
循环结构表示程序反复执行某个或某些操作,直到某条件为真(或为假)时才可终止循环。
在 C# 中,有三种主要的循环结构:while、do-while 和 for。
1.3.1 while循环
while 结构允许你重复执行代码块,直到条件不再满足。
语法为:
while(布尔表达式)
{
//循环内容
}
只要布尔表达式的值为true,这个布尔表达式就是循环条件,只要它一直满足条件,它就会一直循环。
大部分情况下都会让循环结束,我们就需要有一个让表达式为false的时候。
注意,一定要有结束条件,否则就会陷入死循环,可能导致内存溢出。
例如:
int i = 0;
while (i < 5)
{
Console.WriteLine(i);
i++;
}
1.3.2 do while循环
语法为:
do
{
//循环代码
} while(布尔表达式);
do while循环与while循环相似,但唯一不同的是,do while循环至少会执行一次循环代码。
while与do while的区别:
while是先判断,后执行。do while是先执行,再判断。
所以说do while会至少执行一次循环语句。
int i = 0;
while (i < 0)
{
Console.WriteLine(i);
i++;
}
Console.WriteLine("-------------");
do
{
Console.WriteLine(i);
i++;
} while (i < 0);
其执行结果如下:
我们发现,相对于条件不满足的情况,while未执行循环语句,但是do while执行了一次循环语句,这就是这两个循环的唯一区别。
1.3.3 for循环
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。
语法为:
for(初始化语句; 布尔表达式; 更新语句)
{
//循环语句
}
配合上面的流程图,我们就知道for循环的执行流程了,我们这里直接使用例子:
//打印 1~100的整数
for (int i = 1; i <= 100; i++)
{
Console.WriteLine(i);
}
我们可以把这段代码与上述的while循环代码对比,发现我们使用for循环更为简洁。
1.4 三元表达式
三元表达式用于代替简单if-else结构。
格式:
条件表达式1?表达式2:表达式3;
条件表达式1如果为true,则返回表达式2的结果,否则返回表达式为3的结果
int a = 12;
int b = 15;
int c = 0;
//1.if-else写法
//if (a > b)
//{
// c = a;
//}
//else
//{
// c = b;
//}
//2.三元表达式写法
c = a > b ? a : b;
Console.WriteLine(c);